summaryrefslogtreecommitdiffstats
path: root/drivers/net/tokenring
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tokenring')
-rw-r--r--drivers/net/tokenring/.cvsignore2
-rw-r--r--drivers/net/tokenring/Config.in15
-rw-r--r--drivers/net/tokenring/Makefile51
-rw-r--r--drivers/net/tokenring/ibmtr.c1809
-rw-r--r--drivers/net/tokenring/ibmtr.h449
-rw-r--r--drivers/net/tokenring/olympic.c1667
-rw-r--r--drivers/net/tokenring/olympic.h304
-rw-r--r--drivers/net/tokenring/sktr.c2707
-rw-r--r--drivers/net/tokenring/sktr.h1103
-rw-r--r--drivers/net/tokenring/sktr_firmware.h3616
10 files changed, 11723 insertions, 0 deletions
diff --git a/drivers/net/tokenring/.cvsignore b/drivers/net/tokenring/.cvsignore
new file mode 100644
index 000000000..857dd22e9
--- /dev/null
+++ b/drivers/net/tokenring/.cvsignore
@@ -0,0 +1,2 @@
+.depend
+.*.flags
diff --git a/drivers/net/tokenring/Config.in b/drivers/net/tokenring/Config.in
new file mode 100644
index 000000000..8b3065c8a
--- /dev/null
+++ b/drivers/net/tokenring/Config.in
@@ -0,0 +1,15 @@
+#
+# Token Ring driver configuration
+#
+
+mainmenu_option next_comment
+comment 'Token Ring driver support'
+
+bool 'Token Ring driver support' CONFIG_TR
+if [ "$CONFIG_TR" = "y" ]; then
+ tristate ' IBM Tropic chipset based adapter support' CONFIG_IBMTR
+ tristate ' IBM Olympic chipset PCI adapter support' CONFIG_IBMOL
+ tristate ' SysKonnect adapter support' CONFIG_SKTR
+fi
+
+endmenu
diff --git a/drivers/net/tokenring/Makefile b/drivers/net/tokenring/Makefile
new file mode 100644
index 000000000..038c58b86
--- /dev/null
+++ b/drivers/net/tokenring/Makefile
@@ -0,0 +1,51 @@
+#
+# Makefile for drivers/net/tokenring
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now inherited from the
+# parent makefile.
+#
+
+#
+# Note : at this point, these files are compiled on all systems.
+# In the future, some of these should be built conditionally.
+#
+
+SUB_DIRS :=
+MOD_SUB_DIRS := $(SUB_DIRS)
+ALL_SUB_DIRS := $(SUB_DIRS)
+
+
+L_TARGET := tr.a
+L_OBJS :=
+M_OBJS :=
+
+ifeq ($(CONFIG_IBMTR),y)
+ L_OBJS += ibmtr.o
+else
+ ifeq ($(CONFIG_IBMTR),m)
+ M_OBJS += ibmtr.o
+ endif
+endif
+
+ifeq ($(CONFIG_IBMOL),y)
+ L_OBJS += olympic.o
+else
+ ifeq ($(CONFIG_IBMOL),m)
+ M_OBJS += olympic.o
+ endif
+endif
+
+ifeq ($(CONFIG_SKTR),y)
+ L_OBJS += sktr.o
+else
+ ifeq ($(CONFIG_SKTR),m)
+ M_OBJS += sktr.o
+ endif
+endif
+
+include $(TOPDIR)/Rules.make
+
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c
new file mode 100644
index 000000000..85cdfb774
--- /dev/null
+++ b/drivers/net/tokenring/ibmtr.c
@@ -0,0 +1,1809 @@
+/* ibmtr.c: A shared-memory IBM Token Ring 16/4 driver for linux
+ *
+ * Written 1993 by Mark Swanson and Peter De Schrijver.
+ * This software may be used and distributed according to the terms
+ * of the GNU Public License, incorporated herein by reference.
+ *
+ * This device driver should work with Any IBM Token Ring Card that does
+ * not use DMA.
+ *
+ * I used Donald Becker's (becker@cesdis.gsfc.nasa.gov) device driver work
+ * as a base for most of my initial work.
+ *
+ * Changes by Peter De Schrijver (Peter.Deschrijver@linux.cc.kuleuven.ac.be) :
+ *
+ * + changed name to ibmtr.c in anticipation of other tr boards.
+ * + changed reset code and adapter open code.
+ * + added SAP open code.
+ * + a first attempt to write interrupt, transmit and receive routines.
+ *
+ * Changes by David W. Morris (dwm@shell.portal.com) :
+ * 941003 dwm: - Restructure tok_probe for multiple adapters, devices.
+ * + Add comments, misc reorg for clarity.
+ * + Flatten interrupt handler levels.
+ *
+ * Changes by Farzad Farid (farzy@zen.via.ecp.fr)
+ * and Pascal Andre (andre@chimay.via.ecp.fr) (March 9 1995) :
+ * + multi ring support clean up.
+ * + RFC1042 compliance enhanced.
+ *
+ * Changes by Pascal Andre (andre@chimay.via.ecp.fr) (September 7 1995) :
+ * + bug correction in tr_tx
+ * + removed redundant information display
+ * + some code reworking
+ *
+ * Changes by Michel Lespinasse (walken@via.ecp.fr),
+ * Yann Doussot (doussot@via.ecp.fr) and Pascal Andre (andre@via.ecp.fr)
+ * (February 18, 1996) :
+ * + modified shared memory and mmio access port the driver to
+ * alpha platform (structure access -> readb/writeb)
+ *
+ * Changes by Steve Kipisz (bungy@ibm.net or kipisz@vnet.ibm.com)
+ * (January 18 1996):
+ * + swapped WWOR and WWCR in ibmtr.h
+ * + moved some init code from tok_probe into trdev_init. The
+ * PCMCIA code can call trdev_init to complete initializing
+ * the driver.
+ * + added -DPCMCIA to support PCMCIA
+ * + detecting PCMCIA Card Removal in interrupt handler. If
+ * ISRP is FF, then a PCMCIA card has been removed
+ *
+ * Changes by Paul Norton (pnorton@cts.com) :
+ * + restructured the READ.LOG logic to prevent the transmit SRB
+ * from being rudely overwritten before the transmit cycle is
+ * complete. (August 15 1996)
+ * + completed multiple adapter support. (November 20 1996)
+ * + implemented csum_partial_copy in tr_rx and increased receive
+ * buffer size and count. Minor fixes. (March 15, 1997)
+ *
+ * Changes by Christopher Turcksin <wabbit@rtfc.demon.co.uk>
+ * + Now compiles ok as a module again.
+ *
+ * Changes by Paul Norton (pnorton@ieee.org) :
+ * + moved the header manipulation code in tr_tx and tr_rx to
+ * net/802/tr.c. (July 12 1997)
+ * + add retry and timeout on open if cable disconnected. (May 5 1998)
+ * + lifted 2000 byte mtu limit. now depends on shared-RAM size.
+ * May 25 1998)
+ * + can't allocate 2k recv buff at 8k shared-RAM. (20 October 1998)
+ *
+ * Changes by Joel Sloan (jjs@c-me.com) :
+ * + disable verbose debug messages by default - to enable verbose
+ * debugging, edit the IBMTR_DEBUG_MESSAGES define below
+ *
+ * Changes by Mike Phillips <phillim@amtrak.com> :
+ * + Added extra #ifdef's to work with new PCMCIA Token Ring Code.
+ * The PCMCIA code now just sets up the card so it can be recognized
+ * by ibmtr_probe. Also checks allocated memory vs. on-board memory
+ * for correct figure to use.
+ *
+ * Changes by Tim Hockin (thockin@isunix.it.ilstu.edu) :
+ * + added spinlocks for SMP sanity (10 March 1999)
+ *
+ * Changes by Jochen Friedrich to enable RFC1469 Option 2 multicasting
+ * i.e. using functional address C0 00 00 04 00 00 to transmit and
+ * receive multicast packets.
+ */
+
+/* change the define of IBMTR_DEBUG_MESSAGES to a nonzero value
+in the event that chatty debug messages are desired - jjs 12/30/98 */
+
+#define IBMTR_DEBUG_MESSAGES 0
+
+#ifdef PCMCIA
+#define MODULE
+#endif
+
+#include <linux/module.h>
+
+#ifdef PCMCIA
+#undef MODULE
+#endif
+
+#define NO_AUTODETECT 1
+#undef NO_AUTODETECT
+#undef ENABLE_PAGING
+
+
+#define FALSE 0
+#define TRUE (!FALSE)
+
+/* changes the output format of driver initialisation */
+#define TR_NEWFORMAT 1
+#define TR_VERBOSE 0
+
+/* some 95 OS send many non UI frame; this allow removing the warning */
+#define TR_FILTERNONUI 1
+
+/* version and credits */
+static char *version =
+"ibmtr.c: v1.3.57 8/ 7/94 Peter De Schrijver and Mark Swanson\n"
+" v2.1.125 10/20/98 Paul Norton <pnorton@ieee.org>\n"
+" v2.2.0 12/30/98 Joel Sloan <jjs@c-me.com>\n";
+
+static char pcchannelid[] = {
+ 0x05, 0x00, 0x04, 0x09,
+ 0x04, 0x03, 0x04, 0x0f,
+ 0x03, 0x06, 0x03, 0x01,
+ 0x03, 0x01, 0x03, 0x00,
+ 0x03, 0x09, 0x03, 0x09,
+ 0x03, 0x00, 0x02, 0x00
+};
+
+static char mcchannelid[] = {
+ 0x04, 0x0d, 0x04, 0x01,
+ 0x05, 0x02, 0x05, 0x03,
+ 0x03, 0x06, 0x03, 0x03,
+ 0x05, 0x08, 0x03, 0x04,
+ 0x03, 0x05, 0x03, 0x01,
+ 0x03, 0x08, 0x02, 0x00
+};
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/timer.h>
+#include <linux/in.h>
+#include <linux/ioport.h>
+#include <linux/string.h>
+#include <linux/skbuff.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/trdevice.h>
+#include <linux/stddef.h>
+#include <linux/init.h>
+#include <linux/spinlock.h>
+#include <net/checksum.h>
+
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+
+#include "ibmtr.h"
+
+
+#define DPRINTK(format, args...) printk("%s: " format, dev->name , ## args)
+#define DPRINTD(format, args...) DummyCall("%s: " format, dev->name , ## args)
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
+
+#if TR_NEWFORMAT
+/* this allows displaying full adapter information */
+
+const char *channel_def[] __initdata = {
+ "ISA", "MCA", "ISA P&P"
+};
+
+char __init *adapter_def(char type)
+{
+ switch (type)
+ {
+ case 0xF : return "PC Adapter | PC Adapter II | Adapter/A";
+ case 0xE : return "16/4 Adapter | 16/4 Adapter/A (long)";
+ case 0xD : return "16/4 Adapter/A (short) | 16/4 ISA-16 Adapter";
+ case 0xC : return "Auto 16/4 Adapter";
+ default : return "adapter (unknown type)";
+ };
+};
+#endif
+
+#if !TR_NEWFORMAT
+unsigned char ibmtr_debug_trace=1; /* Patch or otherwise alter to
+ control tokenring tracing. */
+#else
+unsigned char ibmtr_debug_trace=0;
+#endif
+#define TRC_INIT 0x01 /* Trace initialization & PROBEs */
+#define TRC_INITV 0x02 /* verbose init trace points */
+
+int ibmtr_probe(struct net_device *dev);
+static int ibmtr_probe1(struct net_device *dev, int ioaddr);
+static unsigned char get_sram_size(struct tok_info *adapt_info);
+#ifdef PCMCIA
+extern unsigned char pcmcia_reality_check(unsigned char gss);
+#endif
+static int tok_init_card(struct net_device *dev);
+void tok_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static int trdev_init(struct net_device *dev);
+static void initial_tok_int(struct net_device *dev);
+static void open_sap(unsigned char type,struct net_device *dev);
+void tok_open_adapter(unsigned long dev_addr);
+static void tr_rx(struct net_device *dev);
+static void tr_tx(struct net_device *dev);
+static int tok_open(struct net_device *dev);
+static int tok_close(struct net_device *dev);
+static int tok_send_packet(struct sk_buff *skb, struct net_device *dev);
+static struct net_device_stats * tok_get_stats(struct net_device *dev);
+static void tok_set_multicast_list(struct net_device *dev);
+void ibmtr_readlog(struct net_device *dev);
+void ibmtr_reset_timer(struct timer_list *tmr, struct net_device *dev);
+int ibmtr_change_mtu(struct net_device *dev, int mtu);
+
+static unsigned int ibmtr_portlist[] __initdata = {
+ 0xa20, 0xa24, 0
+};
+
+static __u32 ibmtr_mem_base = 0xd0000;
+
+static void __init PrtChanID(char *pcid, short stride)
+{
+ short i, j;
+ for (i=0, j=0; i<24; i++, j+=stride)
+ printk("%1x", ((int) pcid[j]) & 0x0f);
+ printk("\n");
+}
+
+static void __init HWPrtChanID (__u32 pcid, short stride)
+{
+ short i, j;
+ for (i=0, j=0; i<24; i++, j+=stride)
+ printk("%1x", ((int)readb(pcid + j)) & 0x0f);
+ printk("\n");
+}
+
+/*
+ * ibmtr_probe(): Routine specified in the network device structure
+ * to probe for an IBM Token Ring Adapter. Routine outline:
+ * I. Interrogate hardware to determine if an adapter exists
+ * and what the speeds and feeds are
+ * II. Setup data structures to control execution based upon
+ * adapter characteristics.
+ * III. Initialize adapter operation
+ *
+ * We expect ibmtr_probe to be called once for each device entry
+ * which references it.
+ */
+
+int __init ibmtr_probe(struct net_device *dev)
+{
+ int i;
+ int base_addr = dev ? dev->base_addr : 0;
+
+ if (base_addr > 0x1ff)
+ {
+ /*
+ * Check a single specified location.
+ */
+
+ if (ibmtr_probe1(dev, base_addr))
+ {
+#ifndef MODULE
+#ifndef PCMCIA
+ tr_freedev(dev);
+#endif
+#endif
+ return -ENODEV;
+ } else
+ return 0;
+ }
+ else if (base_addr != 0) /* Don't probe at all. */
+ return -ENXIO;
+
+ for (i = 0; ibmtr_portlist[i]; i++)
+ {
+ int ioaddr = ibmtr_portlist[i];
+ if (check_region(ioaddr, IBMTR_IO_EXTENT))
+ continue;
+ if (ibmtr_probe1(dev, ioaddr)) {
+#ifndef MODULE
+#ifndef PCMCIA
+ tr_freedev(dev);
+#endif
+#endif
+ } else
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+static int __init ibmtr_probe1(struct net_device *dev, int PIOaddr)
+{
+ unsigned char segment=0, intr=0, irq=0, i=0, j=0, cardpresent=NOTOK,temp=0;
+ __u32 t_mmio=0;
+ struct tok_info *ti=0;
+ __u32 cd_chanid;
+ unsigned char *tchanid, ctemp;
+ unsigned long timeout;
+
+#ifndef MODULE
+#ifndef PCMCIA
+ dev = init_trdev(dev,0);
+#endif
+#endif
+
+ /* Query the adapter PIO base port which will return
+ * indication of where MMIO was placed. We also have a
+ * coded interrupt number.
+ */
+
+ segment = inb(PIOaddr);
+
+ /*
+ * Out of range values so we'll assume non-existent IO device
+ */
+
+ if (segment < 0x40 || segment > 0xe0)
+ return -ENODEV;
+
+ /*
+ * Compute the linear base address of the MMIO area
+ * as LINUX doesn't care about segments
+ */
+
+ t_mmio=(((__u32)(segment & 0xfc) << 11) + 0x80000);
+ intr = segment & 0x03; /* low bits is coded interrupt # */
+ if (ibmtr_debug_trace & TRC_INIT)
+ DPRINTK("PIOaddr: %4hx seg/intr: %2x mmio base: %08X intr: %d\n",
+ PIOaddr, (int)segment, t_mmio, (int)intr);
+
+ /*
+ * Now we will compare expected 'channelid' strings with
+ * what we is there to learn of ISA/MCA or not TR card
+ */
+
+ cd_chanid = (CHANNEL_ID + t_mmio); /* for efficiency */
+ tchanid=pcchannelid;
+ cardpresent=TR_ISA; /* try ISA */
+
+ /*
+ * Suboptimize knowing first byte different
+ */
+
+ ctemp = readb(cd_chanid) & 0x0f;
+ if (ctemp != *tchanid) { /* NOT ISA card, try MCA */
+ tchanid=mcchannelid;
+ cardpresent=TR_MCA;
+ if (ctemp != *tchanid) /* Neither ISA nor MCA */
+ cardpresent=NOTOK;
+ }
+
+ if (cardpresent != NOTOK)
+ {
+ /*
+ * Know presumed type, try rest of ID
+ */
+ for (i=2,j=1; i<=46; i=i+2,j++)
+ {
+ if ((readb(cd_chanid+i) & 0x0f) != tchanid[j]) {
+ cardpresent=NOTOK; /* match failed, not TR card */
+ break;
+ }
+ }
+ }
+
+ /*
+ * If we have an ISA board check for the ISA P&P version,
+ * as it has different IRQ settings
+ */
+
+ if (cardpresent == TR_ISA && (readb(AIPFID + t_mmio)==0x0e))
+ cardpresent=TR_ISAPNP;
+
+ if (cardpresent == NOTOK) { /* "channel_id" did not match, report */
+ if (ibmtr_debug_trace & TRC_INIT) {
+ DPRINTK("Channel ID string not found for PIOaddr: %4hx\n", PIOaddr);
+ DPRINTK("Expected for ISA: "); PrtChanID(pcchannelid,1);
+ DPRINTK(" found: "); HWPrtChanID(cd_chanid,2);
+ DPRINTK("Expected for MCA: "); PrtChanID(mcchannelid,1);
+ }
+ return -ENODEV;
+ }
+
+ /* Now, allocate some of the pl0 buffers for this driver.. */
+
+ /* If called from PCMCIA, ti is already set up, so no need to
+ waste the memory, just use the existing structure */
+
+#ifndef PCMCIA
+ ti = (struct tok_info *)kmalloc(sizeof(struct tok_info), GFP_KERNEL);
+ if (ti == NULL)
+ return -ENOMEM;
+
+ memset(ti, 0, sizeof(struct tok_info));
+#else
+ ti = dev->priv ;
+#endif
+ ti->mmio= t_mmio;
+ ti->readlog_pending = 0;
+ init_waitqueue_head(&ti->wait_for_tok_int);
+ init_waitqueue_head(&ti->wait_for_reset);
+
+ dev->priv = ti; /* this seems like the logical use of the
+ field ... let's try some empirical tests
+ using the token-info structure -- that
+ should fit with out future hope of multiple
+ adapter support as well /dwm */
+
+ /* if PCMCIA, then the card is recognized as TR_ISAPNP
+ * and there is no need to set up the interrupt, it is already done. */
+
+#ifndef PCMCIA
+ switch (cardpresent)
+ {
+ case TR_ISA:
+ if (intr==0)
+ irq=9; /* irq2 really is irq9 */
+ if (intr==1)
+ irq=3;
+ if (intr==2)
+ irq=6;
+ if (intr==3)
+ irq=7;
+ ti->global_int_enable=GLOBAL_INT_ENABLE+((irq==9) ? 2 : irq);
+ ti->adapter_int_enable=PIOaddr+ADAPTINTREL;
+ ti->sram=0;
+#if !TR_NEWFORMAT
+ DPRINTK("ti->global_int_enable: %04X\n",ti->global_int_enable);
+#endif
+ break;
+ case TR_MCA:
+ if (intr==0)
+ irq=9;
+ if (intr==1)
+ irq=3;
+ if (intr==2)
+ irq=10;
+ if (intr==3)
+ irq=11;
+ ti->global_int_enable=0;
+ ti->adapter_int_enable=0;
+ ti->sram=((__u32)(inb(PIOaddr+ADAPTRESETREL) & 0xfe) << 12);
+ break;
+ case TR_ISAPNP:
+ if (intr==0)
+ irq=9;
+ if (intr==1)
+ irq=3;
+ if (intr==2)
+ irq=10;
+ if (intr==3)
+ irq=11;
+ timeout = jiffies + TR_SPIN_INTERVAL;
+ while(!readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN))
+ if (time_after(jiffies, timeout)) {
+ DPRINTK("Hardware timeout during initialization.\n");
+ kfree_s(ti, sizeof(struct tok_info));
+ return -ENODEV;
+ }
+
+ ti->sram=((__u32)readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN)<<12);
+ ti->global_int_enable=PIOaddr+ADAPTINTREL;
+ ti->adapter_int_enable=PIOaddr+ADAPTINTREL;
+ break;
+ }
+#endif
+
+ if (ibmtr_debug_trace & TRC_INIT) { /* just report int */
+ DPRINTK("irq=%d",irq);
+ if (ibmtr_debug_trace & TRC_INITV) { /* full chat in verbose only */
+ DPRINTK(", ti->mmio=%08X",ti->mmio);
+ printk(", segment=%02X",segment);
+ }
+ printk(".\n");
+ }
+
+ /* Get hw address of token ring card */
+#if !TR_NEWFORMAT
+ DPRINTK("hw address: ");
+#endif
+ j=0;
+ for (i=0; i<0x18; i=i+2)
+ {
+ /* technical reference states to do this */
+ temp = readb(ti->mmio + AIP + i) & 0x0f;
+#if !TR_NEWFORMAT
+ printk("%1X",ti->hw_address[j]=temp);
+#else
+ ti->hw_address[j]=temp;
+#endif
+ if(j&1)
+ dev->dev_addr[(j/2)]=ti->hw_address[j]+(ti->hw_address[j-1]<<4);
+ ++j;
+ }
+#ifndef TR_NEWFORMAT
+ printk("\n");
+#endif
+
+ /* get Adapter type: 'F' = Adapter/A, 'E' = 16/4 Adapter II,...*/
+ ti->adapter_type = readb(ti->mmio + AIPADAPTYPE);
+
+ /* get Data Rate: F=4Mb, E=16Mb, D=4Mb & 16Mb ?? */
+ ti->data_rate = readb(ti->mmio + AIPDATARATE);
+
+ /* Get Early Token Release support?: F=no, E=4Mb, D=16Mb, C=4&16Mb */
+ ti->token_release = readb(ti->mmio + AIPEARLYTOKEN);
+
+ /* How much shared RAM is on adapter ? */
+#ifdef PCMCIA
+ ti->avail_shared_ram = pcmcia_reality_check(get_sram_size(ti));
+ ibmtr_mem_base = ti->sram_base << 12 ;
+#else
+ ti->avail_shared_ram = get_sram_size(ti);
+#endif
+ /* We need to set or do a bunch of work here based on previous results.. */
+ /* Support paging? What sizes?: F=no, E=16k, D=32k, C=16 & 32k */
+ ti->shared_ram_paging = readb(ti->mmio + AIPSHRAMPAGE);
+
+ /* Available DHB 4Mb size: F=2048, E=4096, D=4464 */
+ switch (readb(ti->mmio + AIP4MBDHB)) {
+ case 0xe :
+ ti->dhb_size4mb = 4096;
+ break;
+ case 0xd :
+ ti->dhb_size4mb = 4464;
+ break;
+ default :
+ ti->dhb_size4mb = 2048;
+ break;
+ }
+
+ /* Available DHB 16Mb size: F=2048, E=4096, D=8192, C=16384, B=17960 */
+ switch (readb(ti->mmio + AIP16MBDHB)) {
+ case 0xe :
+ ti->dhb_size16mb = 4096;
+ break;
+ case 0xd :
+ ti->dhb_size16mb = 8192;
+ break;
+ case 0xc :
+ ti->dhb_size16mb = 16384;
+ break;
+ case 0xb :
+ ti->dhb_size16mb = 17960;
+ break;
+ default :
+ ti->dhb_size16mb = 2048;
+ break;
+ }
+
+#if !TR_NEWFORMAT
+ DPRINTK("atype=%x, drate=%x, trel=%x, asram=%dK, srp=%x, "
+ "dhb(4mb=%x, 16mb=%x)\n",ti->adapter_type,
+ ti->data_rate, ti->token_release, ti->avail_shared_ram/2,
+ ti->shared_ram_paging, ti->dhb_size4mb, ti->dhb_size16mb);
+#endif
+
+ /* We must figure out how much shared memory space this adapter
+ * will occupy so that if there are two adapters we can fit both
+ * in. Given a choice, we will limit this adapter to 32K. The
+ * maximum space will will use for two adapters is 64K so if the
+ * adapter we are working on demands 64K (it also doesn't support
+ * paging), then only one adapter can be supported.
+ */
+
+ /*
+ * determine how much of total RAM is mapped into PC space
+ */
+ ti->mapped_ram_size=1<<((((readb(ti->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD)) >>2) & 0x03) + 4);
+ ti->page_mask=0;
+ if (ti->shared_ram_paging == 0xf) { /* No paging in adapter */
+ ti->mapped_ram_size = ti->avail_shared_ram;
+ } else {
+#ifdef ENABLE_PAGING
+ unsigned char pg_size;
+#endif
+
+#if !TR_NEWFORMAT
+ DPRINTK("shared ram page size: %dK\n",ti->mapped_ram_size/2);
+#endif
+#ifdef ENABLE_PAGING
+ switch(ti->shared_ram_paging)
+ {
+ case 0xf:
+ break;
+ case 0xe:
+ ti->page_mask=(ti->mapped_ram_size==32) ? 0xc0 : 0;
+ pg_size=32; /* 16KB page size */
+ break;
+ case 0xd:
+ ti->page_mask=(ti->mapped_ram_size==64) ? 0x80 : 0;
+ pg_size=64; /* 32KB page size */
+ break;
+ case 0xc:
+ ti->page_mask=(ti->mapped_ram_size==32) ? 0xc0 : 0;
+ ti->page_mask=(ti->mapped_ram_size==64) ? 0x80 : 0;
+ DPRINTK("Dual size shared RAM page (code=0xC), don't support it!\n");
+ /* nb/dwm: I did this because RRR (3,2) bits are documented as
+ R/O and I can't find how to select which page size
+ Also, the above conditional statement sequence is invalid
+ as page_mask will always be set by the second stmt */
+ kfree_s(ti, sizeof(struct tok_info));
+ return -ENODEV;
+ break;
+ default:
+ DPRINTK("Unknown shared ram paging info %01X\n",ti->shared_ram_paging);
+ kfree_s(ti, sizeof(struct tok_info));
+ return -ENODEV;
+ break;
+ }
+ if (ti->page_mask) {
+ if (pg_size > ti->mapped_ram_size) {
+ DPRINTK("Page size (%d) > mapped ram window (%d), can't page.\n",
+ pg_size, ti->mapped_ram_size);
+ ti->page_mask = 0; /* reset paging */
+ } else {
+ ti->mapped_ram_size=ti->avail_shared_ram;
+ DPRINTK("Shared RAM paging enabled. Page size : %uK\n",
+ ((ti->page_mask^ 0xff)+1)>>2);
+ }
+#endif
+ }
+ /* finish figuring the shared RAM address */
+ if (cardpresent==TR_ISA) {
+ static __u32 ram_bndry_mask[]={0xffffe000, 0xffffc000, 0xffff8000, 0xffff0000};
+ __u32 new_base, rrr_32, chk_base, rbm;
+
+ rrr_32 = ((readb(ti->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD))>>2) & 0x00000003;
+ rbm = ram_bndry_mask[rrr_32];
+ new_base = (ibmtr_mem_base + (~rbm)) & rbm; /* up to boundary */
+ chk_base = new_base + (ti->mapped_ram_size<<9);
+ if (chk_base > (ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE)) {
+ DPRINTK("Shared RAM for this adapter (%05x) exceeds driver"
+ " limit (%05x), adapter not started.\n",
+ chk_base, ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE);
+ kfree_s(ti, sizeof(struct tok_info));
+ return -ENODEV;
+ } else { /* seems cool, record what we have figured out */
+ ti->sram_base = new_base >> 12;
+ ibmtr_mem_base = chk_base;
+ }
+ }
+
+#if !TR_NEWFORMAT
+ DPRINTK("Using %dK shared RAM\n",ti->mapped_ram_size/2);
+#endif
+
+ /* The PCMCIA has already got the interrupt line and the io port,
+ so no chance of anybody else getting it - MLP */
+
+#ifndef PCMCIA
+ if (request_irq (dev->irq = irq, &tok_interrupt,0,"ibmtr", dev) != 0) {
+ DPRINTK("Could not grab irq %d. Halting Token Ring driver.\n",irq);
+ kfree_s(ti, sizeof(struct tok_info));
+ return -ENODEV;
+ }
+
+ /*?? Now, allocate some of the PIO PORTs for this driver.. */
+ request_region(PIOaddr,IBMTR_IO_EXTENT,"ibmtr"); /* record PIOaddr range as busy */
+#endif
+
+#if !TR_NEWFORMAT
+ DPRINTK("%s",version); /* As we have passed card identification,
+ let the world know we're here! */
+#else
+
+ if (version) {
+ printk("%s",version);
+ version = NULL;
+ }
+ DPRINTK("%s %s found\n",
+ channel_def[cardpresent-1], adapter_def(ti->adapter_type));
+ DPRINTK("using irq %d, PIOaddr %hx, %dK shared RAM.\n",
+ irq, PIOaddr, ti->mapped_ram_size/2);
+ DPRINTK("Hardware address : %02X:%02X:%02X:%02X:%02X:%02X\n",
+ dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+#endif
+ /* Calculate the maximum DHB we can use */
+ switch (ti->mapped_ram_size) {
+ case 16 : /* 8KB shared RAM */
+ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048);
+ ti->rbuf_len4 = 1032;
+ ti->rbuf_cnt4 = 2;
+ ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048);
+ ti->rbuf_len16 = 1032;
+ ti->rbuf_cnt16 = 2;
+ break;
+ case 32 : /* 16KB shared RAM */
+ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464);
+ ti->rbuf_len4 = 520;
+ ti->rbuf_cnt4 = 9;
+ ti->dhb_size16mb = MIN(ti->dhb_size16mb, 4096);
+ ti->rbuf_len16 = 1032; /* 1024 usable */
+ ti->rbuf_cnt16 = 4;
+ break;
+ case 64 : /* 32KB shared RAM */
+ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464);
+ ti->rbuf_len4 = 1032;
+ ti->rbuf_cnt4 = 6;
+ ti->dhb_size16mb = MIN(ti->dhb_size16mb, 10240);
+ ti->rbuf_len16 = 1032;
+ ti->rbuf_cnt16 = 10;
+ break;
+ case 127 : /* 63KB shared RAM */
+ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464);
+ ti->rbuf_len4 = 1032;
+ ti->rbuf_cnt4 = 6;
+ ti->dhb_size16mb = MIN(ti->dhb_size16mb, 16384);
+ ti->rbuf_len16 = 1032;
+ ti->rbuf_cnt16 = 16;
+ break;
+ case 128 : /* 64KB shared RAM */
+ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464);
+ ti->rbuf_len4 = 1032;
+ ti->rbuf_cnt4 = 6;
+ ti->dhb_size16mb = MIN(ti->dhb_size16mb, 17960);
+ ti->rbuf_len16 = 1032;
+ ti->rbuf_cnt16 = 18;
+ break;
+ default :
+ ti->dhb_size4mb = 2048;
+ ti->rbuf_len4 = 1032;
+ ti->rbuf_cnt4 = 2;
+ ti->dhb_size16mb = 2048;
+ ti->rbuf_len16 = 1032;
+ ti->rbuf_cnt16 = 2;
+ break;
+ }
+
+ ti->maxmtu16 = (ti->rbuf_len16*ti->rbuf_cnt16)-((ti->rbuf_cnt16)<<3)-TR_HLEN;
+ ti->maxmtu4 = (ti->rbuf_len4*ti->rbuf_cnt4)-((ti->rbuf_cnt4)<<3)-TR_HLEN;
+ DPRINTK("Maximum MTU 16Mbps: %d, 4Mbps: %d\n",
+ ti->maxmtu16, ti->maxmtu4);
+
+ dev->base_addr=PIOaddr; /* set the value for device */
+
+ trdev_init(dev);
+ tok_init_card(dev);
+
+ return 0; /* Return 0 to indicate we have found a Token Ring card. */
+}
+
+/* query the adapter for the size of shared RAM */
+
+static unsigned char __init get_sram_size(struct tok_info *adapt_info)
+{
+
+ unsigned char avail_sram_code;
+ static unsigned char size_code[]={ 0,16,32,64,127,128 };
+ /* Adapter gives
+ 'F' -- use RRR bits 3,2
+ 'E' -- 8kb 'D' -- 16kb
+ 'C' -- 32kb 'A' -- 64KB
+ 'B' - 64KB less 512 bytes at top
+ (WARNING ... must zero top bytes in INIT */
+
+ avail_sram_code=0xf-readb(adapt_info->mmio + AIPAVAILSHRAM);
+ if (avail_sram_code)
+ return size_code[avail_sram_code];
+ else /* for code 'F', must compute size from RRR(3,2) bits */
+ return 1<<((readb(adapt_info->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD)>>2)+4);
+}
+
+static int __init trdev_init(struct net_device *dev)
+{
+ struct tok_info *ti=(struct tok_info *)dev->priv;
+
+ ti->open_status = CLOSED;
+
+ dev->init = tok_init_card;
+ dev->open = tok_open;
+ dev->stop = tok_close;
+ dev->hard_start_xmit = tok_send_packet;
+ dev->get_stats = tok_get_stats;
+ dev->set_multicast_list = tok_set_multicast_list;
+ dev->change_mtu = ibmtr_change_mtu;
+
+#ifndef MODULE
+#ifndef PCMCIA
+ tr_setup(dev);
+#endif
+#endif
+ return 0;
+}
+
+
+static void tok_set_multicast_list(struct net_device *dev)
+{
+ struct tok_info *ti=(struct tok_info *)dev->priv;
+ struct dev_mc_list *mclist;
+ unsigned char address[4];
+
+ int i;
+
+ address[0] = address[1] = address[2] = address[3] = 0;
+
+ mclist = dev->mc_list;
+ for (i=0; i< dev->mc_count; i++)
+ {
+ address[0] |= mclist->dmi_addr[2];
+ address[1] |= mclist->dmi_addr[3];
+ address[2] |= mclist->dmi_addr[4];
+ address[3] |= mclist->dmi_addr[5];
+ mclist = mclist->next;
+ }
+ SET_PAGE(ti->srb);
+ for (i=0; i<sizeof(struct srb_set_funct_addr); i++)
+ writeb(0, ti->srb+i);
+
+ writeb(DIR_SET_FUNC_ADDR,
+ ti->srb + offsetof(struct srb_set_funct_addr, command));
+
+ DPRINTK("Setting functional address: ");
+
+ for (i=0; i<4; i++)
+ {
+ writeb(address[i],
+ ti->srb + offsetof(struct srb_set_funct_addr, funct_address)+i);
+ printk("%02X ", address[i]);
+ }
+ writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ printk("\n");
+}
+
+static int tok_open(struct net_device *dev)
+{
+ struct tok_info *ti=(struct tok_info *)dev->priv;
+
+ /* init the spinlock */
+ ti->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
+
+ if (ti->open_status==CLOSED) tok_init_card(dev);
+
+ if (ti->open_status==IN_PROGRESS) sleep_on(&ti->wait_for_reset);
+
+ if (ti->open_status==SUCCESS) {
+ dev->tbusy=0;
+ dev->interrupt=0;
+ dev->start=1;
+ /* NEED to see smem size *AND* reset high 512 bytes if needed */
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+ } else return -EAGAIN;
+
+}
+
+static int tok_close(struct net_device *dev)
+{
+
+ struct tok_info *ti=(struct tok_info *) dev->priv;
+
+ writeb(DIR_CLOSE_ADAPTER,
+ ti->srb + offsetof(struct srb_close_adapter, command));
+ writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+ ti->open_status=CLOSED;
+
+ sleep_on(&ti->wait_for_tok_int);
+
+ if (readb(ti->srb + offsetof(struct srb_close_adapter, ret_code)))
+ DPRINTK("close adapter failed: %02X\n",
+ (int)readb(ti->srb + offsetof(struct srb_close_adapter, ret_code)));
+
+ dev->start = 0;
+#ifdef PCMCIA
+ ti->sram = 0 ;
+#endif
+ DPRINTK("Adapter closed.\n");
+ MOD_DEC_USE_COUNT;
+
+ return 0;
+}
+
+void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
+{
+ unsigned char status;
+ struct tok_info *ti;
+ struct net_device *dev;
+
+ dev = dev_id;
+#if TR_VERBOSE
+ DPRINTK("Int from tok_driver, dev : %p\n",dev);
+#endif
+ ti = (struct tok_info *) dev->priv;
+ spin_lock(&(ti->lock));
+
+ /* Disable interrupts till processing is finished */
+ dev->interrupt=1;
+ writeb((~INT_ENABLE), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
+
+ /* Reset interrupt for ISA boards */
+ if (ti->adapter_int_enable)
+ outb(0,ti->adapter_int_enable);
+ else
+ outb(0,ti->global_int_enable);
+
+
+ switch (ti->do_tok_int) {
+
+ case NOT_FIRST:
+
+ /* Begin the regular interrupt handler HERE inline to avoid
+ the extra levels of logic and call depth for the
+ original solution. */
+
+ status=readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_ODD);
+#ifdef PCMCIA
+ /* Check if the PCMCIA card was pulled. */
+ if (status == 0xFF)
+ {
+ DPRINTK("PCMCIA card removed.\n");
+ spin_unlock(&(ti->lock));
+ dev->interrupt = 0;
+ return;
+ }
+
+ /* Check ISRP EVEN too. */
+ if ( readb (ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN) == 0xFF)
+ {
+ DPRINTK("PCMCIA card removed.\n");
+ spin_unlock(&(ti->lock));
+ dev->interrupt = 0;
+ return;
+ }
+#endif
+
+
+ if (status & ADAP_CHK_INT) {
+
+ int i;
+ __u32 check_reason;
+
+ check_reason=ti->mmio + ntohs(readw(ti->sram + ACA_OFFSET + ACA_RW +WWCR_EVEN));
+
+ DPRINTK("Adapter check interrupt\n");
+ DPRINTK("8 reason bytes follow: ");
+ for(i=0; i<8; i++, check_reason++)
+ printk("%02X ", (int)readb(check_reason));
+ printk("\n");
+
+ writeb((~ADAP_CHK_INT), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ dev->interrupt=0;
+
+ } else if (readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN)
+ & (TCR_INT | ERR_INT | ACCESS_INT)) {
+
+ DPRINTK("adapter error: ISRP_EVEN : %02x\n",
+ (int)readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN));
+ writeb(~(TCR_INT | ERR_INT | ACCESS_INT),
+ ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ dev->interrupt=0;
+
+ } else if (status
+ & (SRB_RESP_INT | ASB_FREE_INT | ARB_CMD_INT | SSB_RESP_INT)) {
+ /* SRB, ASB, ARB or SSB response */
+
+ if (status & SRB_RESP_INT) { /* SRB response */
+
+ switch(readb(ti->srb)) { /* SRB command check */
+
+ case XMIT_DIR_FRAME: {
+ unsigned char xmit_ret_code;
+
+ xmit_ret_code=readb(ti->srb + offsetof(struct srb_xmit, ret_code));
+ if (xmit_ret_code != 0xff) {
+ DPRINTK("error on xmit_dir_frame request: %02X\n",
+ xmit_ret_code);
+ if (ti->current_skb) {
+ dev_kfree_skb(ti->current_skb);
+ ti->current_skb=NULL;
+ }
+ dev->tbusy=0;
+ if (ti->readlog_pending) ibmtr_readlog(dev);
+ }
+ }
+ break;
+
+ case XMIT_UI_FRAME: {
+ unsigned char xmit_ret_code;
+
+ xmit_ret_code=readb(ti->srb + offsetof(struct srb_xmit, ret_code));
+ if (xmit_ret_code != 0xff) {
+ DPRINTK("error on xmit_ui_frame request: %02X\n",
+ xmit_ret_code);
+ if (ti->current_skb) {
+ dev_kfree_skb(ti->current_skb);
+ ti->current_skb=NULL;
+ }
+ dev->tbusy=0;
+ if (ti->readlog_pending) ibmtr_readlog(dev);
+ }
+ }
+ break;
+
+ case DIR_OPEN_ADAPTER: {
+ unsigned char open_ret_code;
+ __u16 open_error_code;
+
+ ti->srb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, srb_addr)));
+ ti->ssb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, ssb_addr)));
+ ti->arb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, arb_addr)));
+ ti->asb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, asb_addr)));
+ ti->current_skb=NULL;
+
+ open_ret_code = readb(ti->init_srb +offsetof(struct srb_open_response, ret_code));
+ open_error_code = ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, error_code)));
+
+ if (open_ret_code==7) {
+
+ if (!ti->auto_ringspeedsave && (open_error_code==0x24)) {
+ DPRINTK("Open failed: Adapter speed must match ring "
+ "speed if Automatic Ring Speed Save is disabled.\n");
+ ti->open_status=FAILURE;
+ wake_up(&ti->wait_for_reset);
+ } else if (open_error_code==0x24)
+ DPRINTK("Retrying open to adjust to ring speed.\n");
+ else if ((open_error_code==0x2d) && ti->auto_ringspeedsave)
+ DPRINTK("No signal detected for Auto Speed Detection.\n");
+ else if (open_error_code==0x11)
+ {
+ if (ti->retry_count--)
+ DPRINTK("Ring broken/disconnected, retrying...\n");
+ else {
+ DPRINTK("Ring broken/disconnected, open failed.\n");
+ ti->open_status = FAILURE;
+ }
+ }
+ else DPRINTK("Unrecoverable error: error code = %04x.\n",
+ open_error_code);
+
+ } else if (!open_ret_code) {
+#if !TR_NEWFORMAT
+ DPRINTK("board opened...\n");
+#else
+ DPRINTK("Adapter initialized and opened.\n");
+#endif
+ writeb(~(SRB_RESP_INT),
+ ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+ writeb(~(CMD_IN_SRB),
+ ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD);
+ open_sap(EXTENDED_SAP,dev);
+
+ /* YdW probably hates me */
+ goto skip_reset;
+ } else
+ DPRINTK("open failed: ret_code = %02X, retrying\n",
+ open_ret_code);
+
+ if (ti->open_status != FAILURE) {
+ ibmtr_reset_timer(&(ti->tr_timer), dev);
+ }
+
+ }
+ break;
+
+ case DIR_CLOSE_ADAPTER:
+ wake_up(&ti->wait_for_tok_int);
+ break;
+
+ case DLC_OPEN_SAP:
+ if (readb(ti->srb+offsetof(struct dlc_open_sap, ret_code))) {
+ DPRINTK("open_sap failed: ret_code = %02X,retrying\n",
+ (int)readb(ti->srb+offsetof(struct dlc_open_sap, ret_code)));
+ ibmtr_reset_timer(&(ti->tr_timer), dev);
+ } else {
+ ti->exsap_station_id=
+ readw(ti->srb+offsetof(struct dlc_open_sap, station_id));
+ ti->open_status=SUCCESS; /* TR adapter is now available */
+ wake_up(&ti->wait_for_reset);
+ }
+ break;
+
+ case DIR_INTERRUPT:
+ case DIR_MOD_OPEN_PARAMS:
+ case DIR_SET_GRP_ADDR:
+ case DIR_SET_FUNC_ADDR:
+ case DLC_CLOSE_SAP:
+ if (readb(ti->srb+offsetof(struct srb_interrupt, ret_code)))
+ DPRINTK("error on %02X: %02X\n",
+ (int)readb(ti->srb+offsetof(struct srb_interrupt, command)),
+ (int)readb(ti->srb+offsetof(struct srb_interrupt, ret_code)));
+ break;
+
+ case DIR_READ_LOG:
+ if (readb(ti->srb+offsetof(struct srb_read_log, ret_code)))
+ DPRINTK("error on dir_read_log: %02X\n",
+ (int)readb(ti->srb+offsetof(struct srb_read_log, ret_code)));
+ else
+ if (IBMTR_DEBUG_MESSAGES) {
+ DPRINTK(
+ "Line errors %02X, Internal errors %02X, Burst errors %02X\n"
+ "A/C errors %02X, Abort delimiters %02X, Lost frames %02X\n"
+ "Receive congestion count %02X, Frame copied errors %02X\n"
+ "Frequency errors %02X, Token errors %02X\n",
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ line_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ internal_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ burst_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log, A_C_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ abort_delimiters)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ lost_frames)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ recv_congest_count)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ frame_copied_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ frequency_errors)),
+ (int)readb(ti->srb+offsetof(struct srb_read_log,
+ token_errors)));
+ }
+ dev->tbusy=0;
+ break;
+
+ default:
+ DPRINTK("Unknown command %02X encountered\n",
+ (int)readb(ti->srb));
+
+ } /* SRB command check */
+
+ writeb(~CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD);
+ writeb(~SRB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+
+ skip_reset:
+ } /* SRB response */
+
+ if (status & ASB_FREE_INT) { /* ASB response */
+
+ switch(readb(ti->asb)) { /* ASB command check */
+
+ case REC_DATA:
+ case XMIT_UI_FRAME:
+ case XMIT_DIR_FRAME:
+ break;
+
+ default:
+ DPRINTK("unknown command in asb %02X\n",
+ (int)readb(ti->asb));
+
+ } /* ASB command check */
+
+ if (readb(ti->asb+2)!=0xff) /* checks ret_code */
+ DPRINTK("ASB error %02X in cmd %02X\n",
+ (int)readb(ti->asb+2),(int)readb(ti->asb));
+ writeb(~ASB_FREE_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+
+ } /* ASB response */
+
+ if (status & ARB_CMD_INT) { /* ARB response */
+
+ switch (readb(ti->arb)) { /* ARB command check */
+
+ case DLC_STATUS:
+ DPRINTK("DLC_STATUS new status: %02X on station %02X\n",
+ ntohs(readw(ti->arb + offsetof(struct arb_dlc_status, status))),
+ ntohs(readw(ti->arb
+ +offsetof(struct arb_dlc_status, station_id))));
+ break;
+
+ case REC_DATA:
+ tr_rx(dev);
+ break;
+
+ case RING_STAT_CHANGE: {
+ unsigned short ring_status;
+
+ ring_status=ntohs(readw(ti->arb
+ +offsetof(struct arb_ring_stat_change, ring_status)));
+
+ if (ring_status & (SIGNAL_LOSS | LOBE_FAULT)) {
+
+ DPRINTK("Signal loss/Lobe fault\n");
+ DPRINTK("We try to reopen the adapter.\n");
+ ibmtr_reset_timer(&(ti->tr_timer), dev);
+ } else if (ring_status & (HARD_ERROR | XMIT_BEACON
+ | AUTO_REMOVAL | REMOVE_RECV | RING_RECOVER))
+ DPRINTK("New ring status: %02X\n", ring_status);
+
+ if (ring_status & LOG_OVERFLOW) {
+ if (dev->tbusy)
+ ti->readlog_pending = 1;
+ else
+ ibmtr_readlog(dev);
+ }
+ }
+ break;
+
+ case XMIT_DATA_REQ:
+ tr_tx(dev);
+ break;
+
+ default:
+ DPRINTK("Unknown command %02X in arb\n",
+ (int)readb(ti->arb));
+ break;
+
+ } /* ARB command check */
+
+ writeb(~ARB_CMD_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+ writeb(ARB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+ } /* ARB response */
+
+ if (status & SSB_RESP_INT) { /* SSB response */
+ unsigned char retcode;
+ switch (readb(ti->ssb)) { /* SSB command check */
+
+ case XMIT_DIR_FRAME:
+ case XMIT_UI_FRAME:
+ retcode = readb(ti->ssb+2);
+ if (retcode && (retcode != 0x22)) /* checks ret_code */
+ DPRINTK("xmit ret_code: %02X xmit error code: %02X\n",
+ (int)retcode, (int)readb(ti->ssb+6));
+ else ti->tr_stats.tx_packets++;
+ break;
+
+ case XMIT_XID_CMD:
+ DPRINTK("xmit xid ret_code: %02X\n", (int)readb(ti->ssb+2));
+
+ default:
+ DPRINTK("Unknown command %02X in ssb\n", (int)readb(ti->ssb));
+
+ } /* SSB command check */
+
+ writeb(~SSB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+ writeb(SSB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+ } /* SSB response */
+
+ } /* SRB, ARB, ASB or SSB response */
+
+ dev->interrupt=0;
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ break;
+
+ case FIRST_INT:
+ initial_tok_int(dev);
+ break;
+
+ default:
+ DPRINTK("Unexpected interrupt from tr adapter\n");
+
+ }
+ spin_unlock(&(ti->lock));
+}
+
+static void initial_tok_int(struct net_device *dev)
+{
+
+ __u32 encoded_addr;
+ __u32 hw_encoded_addr;
+ struct tok_info *ti;
+ ti=(struct tok_info *) dev->priv;
+
+ ti->do_tok_int=NOT_FIRST;
+
+#ifndef TR_NEWFORMAT
+ DPRINTK("Initial tok int received\n");
+#endif
+
+ /* we assign the shared-ram address for ISA devices */
+ if(!ti->sram) {
+ writeb(ti->sram_base, ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN);
+ ti->sram=((__u32)ti->sram_base << 12);
+ }
+ ti->init_srb=ti->sram
+ +ntohs((unsigned short)readw(ti->mmio+ ACA_OFFSET + WRBR_EVEN));
+ SET_PAGE(ntohs((unsigned short)readw(ti->mmio+ACA_OFFSET + WRBR_EVEN)));
+
+ dev->mem_start = ti->sram;
+ dev->mem_end = ti->sram + (ti->mapped_ram_size<<9) - 1;
+
+#if TR_VERBOSE
+ {
+ int i;
+ DPRINTK("init_srb(%p):", ti->init_srb);
+ for (i=0;i<17;i++) printk("%02X ", (int)readb(ti->init_srb+i));
+ printk("\n");
+ }
+#endif
+
+ hw_encoded_addr = readw(ti->init_srb
+ + offsetof(struct srb_init_response, encoded_address));
+
+#if !TR_NEWFORMAT
+ DPRINTK("srb_init_response->encoded_address: %04X\n", hw_encoded_addr);
+ DPRINTK("ntohs(srb_init_response->encoded_address): %04X\n",
+ ntohs(hw_encoded_addr));
+#endif
+
+ encoded_addr=(ti->sram + ntohs(hw_encoded_addr));
+ ti->ring_speed = readb(ti->init_srb+offsetof(struct srb_init_response, init_status)) & 0x01 ? 16 : 4;
+#if !TR_NEWFORMAT
+ DPRINTK("encoded addr (%04X,%04X,%08X): ", hw_encoded_addr,
+ ntohs(hw_encoded_addr), encoded_addr);
+#else
+ DPRINTK("Initial interrupt : %d Mbps, shared RAM base %08x.\n",
+ ti->ring_speed, ti->sram);
+#endif
+
+ ti->auto_ringspeedsave=readb(ti->init_srb
+ +offsetof(struct srb_init_response, init_status_2)) & 0x4 ? TRUE : FALSE;
+
+#if !TR_NEWFORMAT
+ for(i=0;i<TR_ALEN;i++) {
+ dev->dev_addr[i]=readb(encoded_addr + i);
+ printk("%02X%s", dev->dev_addr[i], (i==TR_ALEN-1) ? "" : ":" );
+ }
+ printk("\n");
+#endif
+
+ tok_open_adapter((unsigned long)dev);
+}
+
+static int tok_init_card(struct net_device *dev)
+{
+ struct tok_info *ti;
+ short PIOaddr;
+ unsigned long i;
+ PIOaddr = dev->base_addr;
+ ti=(struct tok_info *) dev->priv;
+
+ /* Special processing for first interrupt after reset */
+ ti->do_tok_int=FIRST_INT;
+
+ /* Reset adapter */
+ dev->tbusy=1; /* nothing can be done before reset and open completed */
+
+#ifdef ENABLE_PAGING
+ if(ti->page_mask)
+ writeb(SRPR_ENABLE_PAGING, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
+#endif
+
+ writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
+
+#if !TR_NEWFORMAT
+ DPRINTK("resetting card\n");
+#endif
+
+ outb(0, PIOaddr+ADAPTRESET);
+ for (i=jiffies+TR_RESET_INTERVAL; time_before_eq(jiffies, i);); /* wait 50ms */
+ outb(0,PIOaddr+ADAPTRESETREL);
+
+#if !TR_NEWFORMAT
+ DPRINTK("card reset\n");
+#endif
+
+ ti->open_status=IN_PROGRESS;
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ return 0;
+}
+
+static void open_sap(unsigned char type,struct net_device *dev)
+{
+ int i;
+ struct tok_info *ti=(struct tok_info *) dev->priv;
+
+ SET_PAGE(ti->srb);
+ for (i=0; i<sizeof(struct dlc_open_sap); i++)
+ writeb(0, ti->srb+i);
+
+ writeb(DLC_OPEN_SAP, ti->srb + offsetof(struct dlc_open_sap, command));
+ writew(htons(MAX_I_FIELD),
+ ti->srb + offsetof(struct dlc_open_sap, max_i_field));
+ writeb(SAP_OPEN_IND_SAP | SAP_OPEN_PRIORITY,
+ ti->srb + offsetof(struct dlc_open_sap, sap_options));
+ writeb(SAP_OPEN_STATION_CNT,
+ ti->srb + offsetof(struct dlc_open_sap, station_count));
+ writeb(type, ti->srb + offsetof(struct dlc_open_sap, sap_value));
+
+ writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+}
+
+void tok_open_adapter(unsigned long dev_addr)
+{
+
+ struct net_device *dev=(struct net_device *)dev_addr;
+ struct tok_info *ti;
+ int i;
+
+ ti=(struct tok_info *) dev->priv;
+
+#if !TR_NEWFORMAT
+ DPRINTK("now opening the board...\n");
+#endif
+
+ writeb(~SRB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
+ writeb(~CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD);
+
+ for (i=0; i<sizeof(struct dir_open_adapter); i++)
+ writeb(0, ti->init_srb+i);
+
+ writeb(DIR_OPEN_ADAPTER,
+ ti->init_srb + offsetof(struct dir_open_adapter, command));
+ writew(htons(OPEN_PASS_BCON_MAC),
+ ti->init_srb + offsetof(struct dir_open_adapter, open_options));
+ if (ti->ring_speed == 16) {
+ writew(htons(ti->dhb_size16mb),
+ ti->init_srb + offsetof(struct dir_open_adapter, dhb_length));
+ writew(htons(ti->rbuf_cnt16),
+ ti->init_srb + offsetof(struct dir_open_adapter, num_rcv_buf));
+ writew(htons(ti->rbuf_len16),
+ ti->init_srb + offsetof(struct dir_open_adapter, rcv_buf_len));
+ } else {
+ writew(htons(ti->dhb_size4mb),
+ ti->init_srb + offsetof(struct dir_open_adapter, dhb_length));
+ writew(htons(ti->rbuf_cnt4),
+ ti->init_srb + offsetof(struct dir_open_adapter, num_rcv_buf));
+ writew(htons(ti->rbuf_len4),
+ ti->init_srb + offsetof(struct dir_open_adapter, rcv_buf_len));
+ }
+ writeb(NUM_DHB, /* always 2 */
+ ti->init_srb + offsetof(struct dir_open_adapter, num_dhb));
+ writeb(DLC_MAX_SAP,
+ ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sap));
+ writeb(DLC_MAX_STA,
+ ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sta));
+
+ ti->srb=ti->init_srb; /* We use this one in the interrupt handler */
+
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+}
+
+static void tr_tx(struct net_device *dev)
+{
+ struct tok_info *ti=(struct tok_info *) dev->priv;
+ struct trh_hdr *trhdr=(struct trh_hdr *)ti->current_skb->data;
+ unsigned int hdr_len;
+ __u32 dhb;
+ unsigned char xmit_command;
+ int i;
+ struct trllc *llc;
+
+ if (readb(ti->asb + offsetof(struct asb_xmit_resp, ret_code))!=0xFF)
+ DPRINTK("ASB not free !!!\n");
+
+ /* in providing the transmit interrupts,
+ is telling us it is ready for data and
+ providing a shared memory address for us
+ to stuff with data. Here we compute the
+ effective address where we will place data.*/
+ dhb=ti->sram
+ +ntohs(readw(ti->arb + offsetof(struct arb_xmit_req, dhb_address)));
+
+ /* Figure out the size of the 802.5 header */
+ if (!(trhdr->saddr[0] & 0x80)) /* RIF present? */
+ hdr_len=sizeof(struct trh_hdr)-TR_MAXRIFLEN;
+ else
+ hdr_len=((ntohs(trhdr->rcf) & TR_RCF_LEN_MASK)>>8)
+ +sizeof(struct trh_hdr)-TR_MAXRIFLEN;
+
+ llc = (struct trllc *)(ti->current_skb->data + hdr_len);
+
+ xmit_command = readb(ti->srb + offsetof(struct srb_xmit, command));
+
+ writeb(xmit_command, ti->asb + offsetof(struct asb_xmit_resp, command));
+ writew(readb(ti->srb + offsetof(struct srb_xmit, station_id)),
+ ti->asb + offsetof(struct asb_xmit_resp, station_id));
+ writeb(llc->ssap, ti->asb + offsetof(struct asb_xmit_resp, rsap_value));
+ writeb(readb(ti->srb + offsetof(struct srb_xmit, cmd_corr)),
+ ti->asb + offsetof(struct asb_xmit_resp, cmd_corr));
+ writeb(0, ti->asb + offsetof(struct asb_xmit_resp, ret_code));
+
+ if ((xmit_command==XMIT_XID_CMD) || (xmit_command==XMIT_TEST_CMD)) {
+
+ writew(htons(0x11),
+ ti->asb + offsetof(struct asb_xmit_resp, frame_length));
+ writeb(0x0e, ti->asb + offsetof(struct asb_xmit_resp, hdr_length));
+ writeb(AC, dhb);
+ writeb(LLC_FRAME, dhb+1);
+
+ for (i=0; i<TR_ALEN; i++) writeb((int)0x0FF, dhb+i+2);
+ for (i=0; i<TR_ALEN; i++) writeb(0, dhb+i+TR_ALEN+2);
+
+ writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ return;
+
+ }
+
+ /*
+ * the token ring packet is copied from sk_buff to the adapter
+ * buffer identified in the command data received with the interrupt.
+ */
+ writeb(hdr_len, ti->asb + offsetof(struct asb_xmit_resp, hdr_length));
+ writew(htons(ti->current_skb->len),
+ ti->asb + offsetof(struct asb_xmit_resp, frame_length));
+
+ memcpy_toio(dhb, ti->current_skb->data, ti->current_skb->len);
+
+ writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ ti->tr_stats.tx_bytes+=ti->current_skb->len;
+ dev->tbusy=0;
+ dev_kfree_skb(ti->current_skb);
+ ti->current_skb=NULL;
+ mark_bh(NET_BH);
+ if (ti->readlog_pending) ibmtr_readlog(dev);
+}
+
+static void tr_rx(struct net_device *dev)
+{
+ struct tok_info *ti=(struct tok_info *) dev->priv;
+ __u32 rbuffer, rbufdata;
+ __u32 llc;
+ unsigned char *data;
+ unsigned int rbuffer_len, lan_hdr_len, hdr_len, ip_len, length;
+ struct sk_buff *skb;
+ unsigned int skb_size = 0;
+ int IPv4_p = 0;
+ unsigned int chksum = 0;
+ struct iphdr *iph;
+
+ rbuffer=(ti->sram
+ +ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))))+2;
+
+ if(readb(ti->asb + offsetof(struct asb_rec, ret_code))!=0xFF)
+ DPRINTK("ASB not free !!!\n");
+
+ writeb(REC_DATA,
+ ti->asb + offsetof(struct asb_rec, command));
+ writew(readw(ti->arb + offsetof(struct arb_rec_req, station_id)),
+ ti->asb + offsetof(struct asb_rec, station_id));
+ writew(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr)),
+ ti->asb + offsetof(struct asb_rec, rec_buf_addr));
+
+ lan_hdr_len=readb(ti->arb + offsetof(struct arb_rec_req, lan_hdr_len));
+ hdr_len = lan_hdr_len + sizeof(struct trllc) + sizeof(struct iphdr);
+
+ llc=(rbuffer + offsetof(struct rec_buf, data) + lan_hdr_len);
+
+#if TR_VERBOSE
+ DPRINTK("offsetof data: %02X lan_hdr_len: %02X\n",
+ (unsigned int)offsetof(struct rec_buf,data), (unsigned int)lan_hdr_len);
+ DPRINTK("llc: %08X rec_buf_addr: %04X ti->sram: %p\n", llc,
+ ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))),
+ ti->sram);
+ DPRINTK("dsap: %02X, ssap: %02X, llc: %02X, protid: %02X%02X%02X, "
+ "ethertype: %04X\n",
+ (int)readb(llc + offsetof(struct trllc, dsap)),
+ (int)readb(llc + offsetof(struct trllc, ssap)),
+ (int)readb(llc + offsetof(struct trllc, llc)),
+ (int)readb(llc + offsetof(struct trllc, protid)),
+ (int)readb(llc + offsetof(struct trllc, protid)+1),
+ (int)readb(llc + offsetof(struct trllc, protid)+2),
+ (int)readw(llc + offsetof(struct trllc, ethertype)));
+#endif
+ if (readb(llc + offsetof(struct trllc, llc))!=UI_CMD) {
+ writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code));
+ ti->tr_stats.rx_dropped++;
+ writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ return;
+ }
+
+ length = ntohs(readw(ti->arb+offsetof(struct arb_rec_req, frame_len)));
+ if ((readb(llc + offsetof(struct trllc, dsap))==EXTENDED_SAP) &&
+ (readb(llc + offsetof(struct trllc, ssap))==EXTENDED_SAP) &&
+ (length>=hdr_len)) {
+ IPv4_p = 1;
+ }
+
+#if TR_VERBOSE
+ if (!IPv4_p){
+
+ __u32 trhhdr;
+
+ trhhdr=(rbuffer+offsetof(struct rec_buf,data));
+
+ DPRINTK("Probably non-IP frame received.\n");
+ DPRINTK("ssap: %02X dsap: %02X saddr: %02X:%02X:%02X:%02X:%02X:%02X "
+ "daddr: %02X:%02X:%02X:%02X:%02X:%02X\n",
+ (int)readb(llc + offsetof(struct trllc, ssap)),
+ (int)readb(llc + offsetof(struct trllc, dsap)),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+1),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+2),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+3),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+4),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+5),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+1),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+2),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+3),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+4),
+ (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+5));
+ }
+#endif
+
+ skb_size = length-lan_hdr_len+sizeof(struct trh_hdr)+sizeof(struct trllc);
+
+ if (!(skb=dev_alloc_skb(skb_size))) {
+ DPRINTK("out of memory. frame dropped.\n");
+ ti->tr_stats.rx_dropped++;
+ writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code));
+ writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ return;
+ }
+
+ skb_put(skb, length);
+ skb_reserve(skb, sizeof(struct trh_hdr)-lan_hdr_len+sizeof(struct trllc));
+ skb->dev=dev;
+ data=skb->data;
+ rbuffer_len=ntohs(readw(rbuffer + offsetof(struct rec_buf, buf_len)));
+ rbufdata = rbuffer + offsetof(struct rec_buf,data);
+
+ if (IPv4_p) {
+ /* Copy the headers without checksumming */
+ memcpy_fromio(data, rbufdata, hdr_len);
+
+ /* Watch for padded packets and bogons */
+ iph=(struct iphdr*)(data + lan_hdr_len + sizeof(struct trllc));
+ ip_len = ntohs(iph->tot_len) - sizeof(struct iphdr);
+ length -= hdr_len;
+ if ((ip_len <= length) && (ip_len > 7))
+ length = ip_len;
+ data += hdr_len;
+ rbuffer_len -= hdr_len;
+ rbufdata += hdr_len;
+ }
+
+ /* Copy the payload... */
+ for (;;) {
+ if (IPv4_p)
+ chksum = csum_partial_copy(bus_to_virt(rbufdata), data,
+ length < rbuffer_len ? length : rbuffer_len,
+ chksum);
+ else
+ memcpy_fromio(data, rbufdata, rbuffer_len);
+ rbuffer = ntohs(readw(rbuffer));
+ if (!rbuffer)
+ break;
+ length -= rbuffer_len;
+ data += rbuffer_len;
+ rbuffer += ti->sram;
+ rbuffer_len = ntohs(readw(rbuffer + offsetof(struct rec_buf, buf_len)));
+ rbufdata = rbuffer + offsetof(struct rec_buf, data);
+ }
+
+ writeb(0, ti->asb + offsetof(struct asb_rec, ret_code));
+
+ writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+
+ ti->tr_stats.rx_bytes += skb->len;
+ ti->tr_stats.rx_packets++;
+
+ skb->protocol = tr_type_trans(skb,dev);
+ if (IPv4_p){
+ skb->csum = chksum;
+ skb->ip_summed = 1;
+ }
+ netif_rx(skb);
+}
+
+static int tok_send_packet(struct sk_buff *skb, struct net_device *dev)
+{
+ struct tok_info *ti;
+ ti=(struct tok_info *) dev->priv;
+
+ if (dev->tbusy) {
+ int ticks_waited;
+
+ ticks_waited=jiffies - dev->trans_start;
+ if (ticks_waited<TR_BUSY_INTERVAL) return 1;
+
+ DPRINTK("Arrg. Transmitter busy.\n");
+ dev->trans_start+=5; /* we fake the transmission start time... */
+ return 1;
+ }
+
+ if (test_and_set_bit(0,(void *)&dev->tbusy)!=0)
+ DPRINTK("Transmitter access conflict\n");
+ else {
+ int flags;
+
+ /* lock against other CPUs */
+ spin_lock_irqsave(&(ti->lock), flags);
+
+ /* Save skb; we'll need it when the adapter asks for the data */
+ ti->current_skb=skb;
+ writeb(XMIT_UI_FRAME, ti->srb + offsetof(struct srb_xmit, command));
+ writew(ti->exsap_station_id, ti->srb
+ +offsetof(struct srb_xmit, station_id));
+ writeb(CMD_IN_SRB, (ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD));
+ spin_unlock_irqrestore(&(ti->lock), flags);
+
+ dev->trans_start=jiffies;
+ }
+
+ return 0;
+}
+
+void ibmtr_reset_timer(struct timer_list *tmr, struct net_device *dev) {
+ tmr->expires = jiffies + TR_RETRY_INTERVAL;
+ tmr->data = (unsigned long) dev;
+ tmr->function = tok_open_adapter;
+ init_timer(tmr);
+ add_timer(tmr);
+}
+
+void ibmtr_readlog(struct net_device *dev) {
+ struct tok_info *ti;
+ ti=(struct tok_info *) dev->priv;
+
+ ti->readlog_pending = 0;
+ writeb(DIR_READ_LOG, ti->srb);
+ writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
+ writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
+ dev->tbusy=1; /* really srb busy... */
+}
+
+/* tok_get_stats(): Basically a scaffold routine which will return
+ the address of the tr_statistics structure associated with
+ this device -- the tr.... structure is an ethnet look-alike
+ so at least for this iteration may suffice. */
+
+static struct net_device_stats * tok_get_stats(struct net_device *dev) {
+
+ struct tok_info *toki;
+ toki=(struct tok_info *) dev->priv;
+ return (struct net_device_stats *) &toki->tr_stats;
+}
+
+int ibmtr_change_mtu(struct net_device *dev, int mtu) {
+ struct tok_info *ti = (struct tok_info *) dev->priv;
+
+ if (ti->ring_speed == 16 && mtu > ti->maxmtu16)
+ return -EINVAL;
+ if (ti->ring_speed == 4 && mtu > ti->maxmtu4)
+ return -EINVAL;
+ dev->mtu = mtu;
+ return 0;
+}
+
+#ifdef MODULE
+
+/* 3COM 3C619C supports 8 interrupts, 32 I/O ports */
+static struct net_device* dev_ibmtr[IBMTR_MAX_ADAPTERS];
+static int io[IBMTR_MAX_ADAPTERS] = {0xa20,0xa24};
+static int irq[IBMTR_MAX_ADAPTERS] = {0,0};
+static int mem[IBMTR_MAX_ADAPTERS] = {0,0};
+
+MODULE_PARM(io, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i");
+MODULE_PARM(irq, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i");
+MODULE_PARM(mem, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i");
+
+int init_module(void)
+{
+ int i;
+ for (i = 0; io[i] && (i<IBMTR_MAX_ADAPTERS); i++) {
+ irq[i] = 0;
+ mem[i] = 0;
+ dev_ibmtr[i] = NULL;
+ dev_ibmtr[i] = init_trdev(dev_ibmtr[i], 0);
+ if (dev_ibmtr[i] == NULL)
+ return -ENOMEM;
+
+ dev_ibmtr[i]->base_addr = io[i];
+ dev_ibmtr[i]->irq = irq[i];
+ dev_ibmtr[i]->mem_start = mem[i];
+ dev_ibmtr[i]->init = &ibmtr_probe;
+
+ if (register_trdev(dev_ibmtr[i]) != 0) {
+ kfree_s(dev_ibmtr[i], sizeof(struct net_device));
+ dev_ibmtr[i] = NULL;
+ if (i == 0) {
+ printk("ibmtr: register_trdev() returned non-zero.\n");
+ return -EIO;
+ } else {
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+void cleanup_module(void)
+{
+ int i;
+
+ for (i = 0; i < IBMTR_MAX_ADAPTERS; i++)
+ if (dev_ibmtr[i]) {
+ unregister_trdev(dev_ibmtr[i]);
+ free_irq(dev_ibmtr[i]->irq, dev_ibmtr[i]);
+ release_region(dev_ibmtr[i]->base_addr, IBMTR_IO_EXTENT);
+ kfree_s(dev_ibmtr[i]->priv, sizeof(struct tok_info));
+ kfree_s(dev_ibmtr[i], sizeof(struct net_device));
+ dev_ibmtr[i] = NULL;
+ }
+}
+#endif /* MODULE */
diff --git a/drivers/net/tokenring/ibmtr.h b/drivers/net/tokenring/ibmtr.h
new file mode 100644
index 000000000..3f3fa6aed
--- /dev/null
+++ b/drivers/net/tokenring/ibmtr.h
@@ -0,0 +1,449 @@
+/* Definitions for an IBM Token Ring card. */
+/* This file is distributed under the GNU GPL */
+
+/* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */
+
+#define TR_RETRY_INTERVAL (5*HZ) /* 500 on PC = 5 s */
+#define TR_RESET_INTERVAL (HZ/20) /* 5 on PC = 50 ms */
+#define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */
+#define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */
+#define TR_RETRIES 6 /* number of open retries */
+
+#define TR_ISA 1
+#define TR_MCA 2
+#define TR_ISAPNP 3
+#define NOTOK 0
+#define TOKDEBUG 1
+
+#define IBMTR_SHARED_RAM_SIZE 0x10000
+#define IBMTR_IO_EXTENT 4
+#define IBMTR_MAX_ADAPTERS 2
+
+#define CHANNEL_ID 0X1F30
+#define AIP 0X1F00
+#define AIPCHKSUM1 0X1F60
+#define AIPCHKSUM2 0X1FF0
+#define AIPADAPTYPE 0X1FA0
+#define AIPDATARATE 0X1FA2
+#define AIPEARLYTOKEN 0X1FA4
+#define AIPAVAILSHRAM 0X1FA6
+#define AIPSHRAMPAGE 0X1FA8
+#define AIP4MBDHB 0X1FAA
+#define AIP16MBDHB 0X1FAC
+#define AIPFID 0X1FBA
+
+/* Note, 0xA20 == 0x220 since motherboard decodes 10 bits. I left everything
+ the way my documentation had it, ie: 0x0A20. */
+#define ADAPTINTCNTRL 0x02f0 /* Adapter interrupt control */
+#define ADAPTRESET 0x1 /* Control Adapter reset (add to base) */
+#define ADAPTRESETREL 0x2 /* Release Adapter from reset ( """) */
+#define ADAPTINTREL 0x3 /* Adapter interrupt release */
+
+#define MMIOStartLocP 0x0a20 /* Primary adapter's starting MMIO area */
+#define MMIOStartLocA 0x0a24 /* Alternate adapter's starting MMIO area */
+
+#define GLOBAL_INT_ENABLE 0x02f0
+
+/* MMIO bits 0-4 select register */
+#define RRR_EVEN 0x00 /* Shared RAM relocation registers - even and odd */
+/* Used to set the starting address of shared RAM */
+/* Bits 1 through 7 of this register map to bits 13 through 19 of the shared RAM address.*/
+/* ie: 0x02 sets RAM address to ...ato! issy su wazzoo !! GODZILLA!!! */
+#define RRR_ODD 0x01
+/* Bits 2 and 3 of this register can be read to determine shared RAM size */
+/* 00 for 8k, 01 for 16k, 10 for 32k, 11 for 64k */
+#define WRBR_EVEN 0x02 /* Write region base registers - even and odd */
+#define WRBR_ODD 0x03
+#define WWOR_EVEN 0x04 /* Write window open registers - even and odd */
+#define WWOR_ODD 0x05
+#define WWCR_EVEN 0x06 /* Write window close registers - even and odd */
+#define WWCR_ODD 0x07
+
+/* Interrupt status registers - PC system - even and odd */
+#define ISRP_EVEN 0x08
+
+#define TCR_INT 0x10 /* Bit 4 - Timer interrupt. The TVR_EVEN timer has
+ expired. */
+#define ERR_INT 0x08 /* Bit 3 - Error interrupt. The adapter has had an
+ internal error. */
+#define ACCESS_INT 0x04 /* Bit 2 - Access interrupt. You have attempted to
+ write to an invalid area of shared RAM or an invalid
+ register within the MMIO. */
+/* In addition, the following bits within ISRP_EVEN can be turned on or off by you */
+/* to control the interrupt processing: */
+#define INT_IRQ 0x80 /* Bit 7 - If 0 the adapter will issue a CHCK, if 1 and
+ IRQ. This should normally be set (by you) to 1. */
+#define INT_ENABLE 0x40 /* Bit 6 - Interrupt enable. If 0, no interrupts will
+ occur. If 1, interrupts will occur normally.
+ Normally set to 1. */
+/* Bit 0 - Primary or alternate adapter. Set to zero if this adapter is the primary adapter,*/
+/* 1 if this adapter is the alternate adapter. */
+
+
+#define ISRP_ODD 0x09
+
+#define ADAP_CHK_INT 0x40 /* Bit 6 - Adapter check. the adapter has
+ encountered a serious problem and has closed
+ itself. Whoa. */
+#define SRB_RESP_INT 0x20 /* Bit 5 - SRB response. The adapter has accepted
+ an SRB request and set the return code within
+ the SRB. */
+#define ASB_FREE_INT 0x10 /* Bit 4 - ASB free. The adapter has read the ASB
+ and this area can be safely reused. This interrupt
+ is only used if your application has set the ASB
+ free request bit in ISRA_ODD or if an error was
+ detected in your response. */
+#define ARB_CMD_INT 0x08 /* Bit 3 - ARB command. The adapter has given you a
+ command for action. The command is located in the
+ ARB area of shared memory. */
+#define SSB_RESP_INT 0x04 /* Bit 2 - SSB response. The adapter has posted a
+ response to your SRB (the response is located in
+ the SSB area of shared memory). */
+/* Bit 1 - Bridge frame forward complete. */
+
+
+
+#define ISRA_EVEN 0x0A /* Interrupt status registers - adapter - even and odd */
+/* Bit 7 - Internal parity error (on adapter's internal bus) */
+/* Bit 6 - Timer interrupt pending */
+/* Bit 5 - Access interrupt (attempt by adapter to access illegal address) */
+/* Bit 4 - Adapter microcode problem (microcode dead-man timer expired) */
+/* Bit 3 - Adapter processor check status */
+/* Bit 2 - Reserved */
+/* Bit 1 - Adapter hardware interrupt mask (prevents internal interrupts) */
+/* Bit 0 - Adapter software interrupt mask (prevents internal software interrupts) */
+
+#define ISRA_ODD 0x0B
+#define CMD_IN_SRB 0x20 /* Bit 5 - Indicates that you have placed a new
+ command in the SRB and are ready for the adapter to
+ process the command. */
+#define RESP_IN_ASB 0x10 /* Bit 4 - Indicates that you have placed a response
+ (an ASB) in the shared RAM which is available for
+ the adapter's use. */
+/* Bit 3 - Indicates that you are ready to put an SRB in the shared RAM, but that a previous */
+/* command is still pending. The adapter will then interrupt you when the previous */
+/* command is completed */
+/* Bit 2 - Indicates that you are ready to put an ASB in the shared RAM, but that a previous */
+/* ASB is still pending. The adapter will then interrupt you when the previous ASB */
+/* is copied. */
+#define ARB_FREE 0x2
+#define SSB_FREE 0x1
+
+#define TCR_EVEN 0x0C /* Timer control registers - even and odd */
+#define TCR_ODD 0x0D
+#define TVR_EVEN 0x0E /* Timer value registers - even and odd */
+#define TVR_ODD 0x0F
+#define SRPR_EVEN 0x10 /* Shared RAM paging registers - even and odd */
+#define SRPR_ENABLE_PAGING 0xc0
+#define SRPR_ODD 0x11 /* Not used. */
+#define TOKREAD 0x60
+#define TOKOR 0x40
+#define TOKAND 0x20
+#define TOKWRITE 0x00
+
+/* MMIO bits 5-6 select operation */
+/* 00 is used to write to a register */
+/* 01 is used to bitwise AND a byte with a register */
+/* 10 is used to bitwise OR a byte with a register */
+/* 11 is used to read from a register */
+
+/* MMIO bits 7-8 select area of interest.. see below */
+/* 00 selects attachment control area. */
+/* 01 is reserved. */
+/* 10 selects adapter identification area A containing the adapter encoded address. */
+/* 11 selects the adapter identification area B containing test patterns. */
+
+#define PCCHANNELID 5049434F3631313039393020
+#define MCCHANNELID 4D4152533633583435313820
+
+#define ACA_OFFSET 0x1e00
+#define ACA_SET 0x40
+#define ACA_RESET 0x20
+#define ACA_RW 0x00
+
+#ifdef ENABLE_PAGING
+#define SET_PAGE(x) (writeb(((x>>8)&ti.page_mask), \
+ ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN))
+#else
+#define SET_PAGE(x)
+#endif
+
+typedef enum { IN_PROGRESS, SUCCESS, FAILURE, CLOSED } open_state;
+
+/* do_tok_int possible values */
+#define FIRST_INT 1
+#define NOT_FIRST 2
+
+struct tok_info {
+ unsigned char irq;
+ __u32 mmio;
+ unsigned char hw_address[32];
+ unsigned char adapter_type;
+ unsigned char data_rate;
+ unsigned char token_release;
+ unsigned char avail_shared_ram;
+ unsigned char shared_ram_paging;
+ unsigned short dhb_size4mb;
+ unsigned short rbuf_len4;
+ unsigned short rbuf_cnt4;
+ unsigned short maxmtu4;
+ unsigned short dhb_size16mb;
+ unsigned short rbuf_len16;
+ unsigned short rbuf_cnt16;
+ unsigned short maxmtu16;
+ /* Additions by David Morris */
+ unsigned char do_tok_int;
+ wait_queue_head_t wait_for_tok_int;
+ wait_queue_head_t wait_for_reset;
+ unsigned char sram_base;
+ /* Additions by Peter De Schrijver */
+ unsigned char page_mask; /* mask to select RAM page to Map*/
+ unsigned char mapped_ram_size; /* size of RAM page */
+ __u32 sram; /* Shared memory base address */
+ __u32 init_srb; /* Initial System Request Block address */
+ __u32 srb; /* System Request Block address */
+ __u32 ssb; /* System Status Block address */
+ __u32 arb; /* Adapter Request Block address */
+ __u32 asb; /* Adapter Status Block address */
+ unsigned short exsap_station_id;
+ unsigned short global_int_enable;
+ struct sk_buff *current_skb;
+ struct net_device_stats tr_stats;
+ unsigned char auto_ringspeedsave;
+ open_state open_status;
+ unsigned char readlog_pending;
+ unsigned short adapter_int_enable; /* Adapter-specific int enable */
+ struct timer_list tr_timer;
+ unsigned char ring_speed;
+ __u32 func_addr;
+ unsigned int retry_count;
+ spinlock_t lock; /* SMP protection */
+};
+
+/* token ring adapter commands */
+#define DIR_INTERRUPT 0x00 /* struct srb_interrupt */
+#define DIR_MOD_OPEN_PARAMS 0x01
+#define DIR_OPEN_ADAPTER 0x03 /* struct dir_open_adapter */
+#define DIR_CLOSE_ADAPTER 0x04
+#define DIR_SET_GRP_ADDR 0x06
+#define DIR_SET_FUNC_ADDR 0x07 /* struct srb_set_funct_addr */
+#define DIR_READ_LOG 0x08 /* struct srb_read_log */
+#define DLC_OPEN_SAP 0x15 /* struct dlc_open_sap */
+#define DLC_CLOSE_SAP 0x16
+#define DATA_LOST 0x20 /* struct asb_rec */
+#define REC_DATA 0x81 /* struct arb_rec_req */
+#define XMIT_DATA_REQ 0x82 /* struct arb_xmit_req */
+#define DLC_STATUS 0x83 /* struct arb_dlc_status */
+#define RING_STAT_CHANGE 0x84 /* struct dlc_open_sap ??? */
+
+/* DIR_OPEN_ADAPTER options */
+#define OPEN_PASS_BCON_MAC 0x0100
+#define NUM_RCV_BUF 2
+#define RCV_BUF_LEN 1024
+#define DHB_LENGTH 2048
+#define NUM_DHB 2
+#define DLC_MAX_SAP 2
+#define DLC_MAX_STA 1
+
+/* DLC_OPEN_SAP options */
+#define MAX_I_FIELD 0x0088
+#define SAP_OPEN_IND_SAP 0x04
+#define SAP_OPEN_PRIORITY 0x20
+#define SAP_OPEN_STATION_CNT 0x1
+#define XMIT_DIR_FRAME 0x0A
+#define XMIT_UI_FRAME 0x0d
+#define XMIT_XID_CMD 0x0e
+#define XMIT_TEST_CMD 0x11
+
+/* srb close return code */
+#define SIGNAL_LOSS 0x8000
+#define HARD_ERROR 0x4000
+#define XMIT_BEACON 0x1000
+#define LOBE_FAULT 0x0800
+#define AUTO_REMOVAL 0x0400
+#define REMOVE_RECV 0x0100
+#define LOG_OVERFLOW 0x0080
+#define RING_RECOVER 0x0020
+
+struct srb_init_response {
+ unsigned char command;
+ unsigned char init_status;
+ unsigned char init_status_2;
+ unsigned char reserved[3];
+ __u16 bring_up_code;
+ __u16 encoded_address;
+ __u16 level_address;
+ __u16 adapter_address;
+ __u16 parms_address;
+ __u16 mac_address;
+};
+
+struct dir_open_adapter {
+ unsigned char command;
+ char reserved[7];
+ __u16 open_options;
+ unsigned char node_address[6];
+ unsigned char group_address[4];
+ unsigned char funct_address[4];
+ __u16 num_rcv_buf;
+ __u16 rcv_buf_len;
+ __u16 dhb_length;
+ unsigned char num_dhb;
+ char reserved2;
+ unsigned char dlc_max_sap;
+ unsigned char dlc_max_sta;
+ unsigned char dlc_max_gsap;
+ unsigned char dlc_max_gmem;
+ unsigned char dlc_t1_tick_1;
+ unsigned char dlc_t2_tick_1;
+ unsigned char dlc_ti_tick_1;
+ unsigned char dlc_t1_tick_2;
+ unsigned char dlc_t2_tick_2;
+ unsigned char dlc_ti_tick_2;
+ unsigned char product_id[18];
+};
+
+struct srb_open_response {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+ unsigned char reserved2[3];
+ __u16 error_code;
+ __u16 asb_addr;
+ __u16 srb_addr;
+ __u16 arb_addr;
+ __u16 ssb_addr;
+};
+
+struct dlc_open_sap {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+ unsigned char reserved2;
+ __u16 station_id;
+ unsigned char timer_t1;
+ unsigned char timer_t2;
+ unsigned char timer_ti;
+ unsigned char maxout;
+ unsigned char maxin;
+ unsigned char maxout_incr;
+ unsigned char max_retry_count;
+ unsigned char gsap_max_mem;
+ __u16 max_i_field;
+ unsigned char sap_value;
+ unsigned char sap_options;
+ unsigned char station_count;
+ unsigned char sap_gsap_mem;
+ unsigned char gsap[0];
+};
+
+struct srb_xmit {
+ unsigned char command;
+ unsigned char cmd_corr;
+ unsigned char ret_code;
+ unsigned char reserved1;
+ __u16 station_id;
+};
+
+struct srb_interrupt {
+ unsigned char command;
+ unsigned char cmd_corr;
+ unsigned char ret_code;
+};
+
+struct srb_read_log {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+ unsigned char reserved2;
+ unsigned char line_errors;
+ unsigned char internal_errors;
+ unsigned char burst_errors;
+ unsigned char A_C_errors;
+ unsigned char abort_delimiters;
+ unsigned char reserved3;
+ unsigned char lost_frames;
+ unsigned char recv_congest_count;
+ unsigned char frame_copied_errors;
+ unsigned char frequency_errors;
+ unsigned char token_errors;
+};
+
+struct asb_xmit_resp {
+ unsigned char command;
+ unsigned char cmd_corr;
+ unsigned char ret_code;
+ unsigned char reserved;
+ __u16 station_id;
+ __u16 frame_length;
+ unsigned char hdr_length;
+ unsigned char rsap_value;
+};
+
+struct arb_xmit_req {
+ unsigned char command;
+ unsigned char cmd_corr;
+ unsigned char reserved1[2];
+ __u16 station_id;
+ __u16 dhb_address;
+};
+
+struct arb_rec_req {
+ unsigned char command;
+ unsigned char reserved1[3];
+ __u16 station_id;
+ __u16 rec_buf_addr;
+ unsigned char lan_hdr_len;
+ unsigned char dlc_hdr_len;
+ __u16 frame_len;
+ unsigned char msg_type;
+};
+
+struct asb_rec {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+ unsigned char reserved2;
+ __u16 station_id;
+ __u16 rec_buf_addr;
+};
+
+struct rec_buf {
+ /* unsigned char reserved1[2]; */
+ __u16 buf_ptr;
+ unsigned char reserved2;
+ __u16 buf_len;
+ unsigned char data[0];
+};
+
+struct arb_dlc_status {
+ unsigned char command;
+ unsigned char reserved1[3];
+ __u16 station_id;
+ __u16 status;
+ unsigned char frmr_data[5];
+ unsigned char access_prio;
+ unsigned char rem_addr[TR_ALEN];
+ unsigned char rsap_value;
+};
+
+struct arb_ring_stat_change {
+ unsigned char command;
+ unsigned char reserved1[5];
+ __u16 ring_status;
+};
+
+struct srb_close_adapter {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+};
+
+struct srb_set_funct_addr {
+ unsigned char command;
+ unsigned char reserved1;
+ unsigned char ret_code;
+ unsigned char reserved2[3];
+ unsigned char funct_address[4];
+};
+
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c
new file mode 100644
index 000000000..460480c48
--- /dev/null
+++ b/drivers/net/tokenring/olympic.c
@@ -0,0 +1,1667 @@
+/*
+ * olympic.c (c) 1999 Peter De Schrijver All Rights Reserved
+ * 1999 Mike Phillips (phillim@amtrak.com)
+ *
+ * Linux driver for IBM PCI tokenring cards based on the Pit/Pit-Phy/Olympic
+ * chipset.
+ *
+ * Base Driver Skeleton:
+ * Written 1993-94 by Donald Becker.
+ *
+ * Copyright 1993 United States Government as represented by the
+ * Director, National Security Agency.
+ *
+ * Thanks to Erik De Cock, Adrian Bridgett and Frank Fiene for their
+ * assistance and perserverance with the testing of this driver.
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU Public License, incorporated herein by reference.
+ *
+ * 4/27/99 - Alpha Release 0.1.0
+ * First release to the public
+ *
+ * 6/8/99 - Official Release 0.2.0
+ * Merged into the kernel code
+ * 8/18/99 - Updated driver for 2.3.13 kernel to use new pci
+ * resource. Driver also reports the card name returned by
+ * the pci resource.
+ *
+ * To Do:
+ *
+ * Sanitize for smp
+ *
+ * If Problems do Occur
+ * Most problems can be rectified by either closing and opening the interface
+ * (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
+ * if compiled into the kernel).
+ */
+
+/* Change OLYMPIC_DEBUG to 1 to get verbose, and I mean really verbose, messages */
+
+#define OLYMPIC_DEBUG 0
+
+/* Change OLYMPIC_NETWORK_MONITOR to receive mac frames through the arb channel.
+ * Will also create a /proc/net/olympic_tr entry if proc_fs is compiled into the
+ * kernel.
+ * Intended to be used to create a ring-error reporting network module
+ * i.e. it will give you the source address of beaconers on the ring
+ */
+
+#define OLYMPIC_NETWORK_MONITOR 0
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/timer.h>
+#include <linux/in.h>
+#include <linux/ioport.h>
+#include <linux/string.h>
+#include <linux/proc_fs.h>
+#include <linux/ptrace.h>
+#include <linux/skbuff.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/trdevice.h>
+#include <linux/stddef.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <net/checksum.h>
+
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+
+#include "olympic.h"
+
+/* I've got to put some intelligence into the version number so that Peter and I know
+ * which version of the code somebody has got.
+ * Version Number = a.b.c.d where a.b.c is the level of code and d is the latest author.
+ * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
+ *
+ * Official releases will only have an a.b.c version number format.
+ */
+
+static char *version =
+"Olympic.c v0.3.0 8/18/99 - Peter De Schrijver & Mike Phillips" ;
+
+static char *open_maj_error[] = {"No error", "Lobe Media Test", "Physical Insertion",
+ "Address Verification", "Neighbor Notification (Ring Poll)",
+ "Request Parameters","FDX Registration Request",
+ "FDX Duplicate Address Check", "Station registration Query Wait",
+ "Unknown stage"};
+
+static char *open_min_error[] = {"No error", "Function Failure", "Signal Lost", "Wire Fault",
+ "Ring Speed Mismatch", "Timeout","Ring Failure","Ring Beaconing",
+ "Duplicate Node Address","Request Parameters","Remove Received",
+ "Reserved", "Reserved", "No Monitor Detected for RPL",
+ "Monitor Contention failer for RPL", "FDX Protocol Error"};
+
+/* Module paramters */
+
+/* Ring Speed 0,4,16,100
+ * 0 = Autosense
+ * 4,16 = Selected speed only, no autosense
+ * This allows the card to be the first on the ring
+ * and become the active monitor.
+ * 100 = Nothing at present, 100mbps is autodetected
+ * if FDX is turned on. May be implemented in the future to
+ * fail if 100mpbs is not detected.
+ *
+ * WARNING: Some hubs will allow you to insert
+ * at the wrong speed
+ */
+
+static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ;
+
+MODULE_PARM(ringspeed, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i");
+
+/* Packet buffer size */
+
+static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ;
+
+MODULE_PARM(pkt_buf_sz, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ;
+
+/* Message Level */
+
+static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ;
+
+MODULE_PARM(message_level, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ;
+
+static int olympic_scan(struct net_device *dev);
+static int olympic_init(struct net_device *dev);
+static int olympic_open(struct net_device *dev);
+static int olympic_xmit(struct sk_buff *skb, struct net_device *dev);
+static int olympic_close(struct net_device *dev);
+static void olympic_set_rx_mode(struct net_device *dev);
+static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static struct net_device_stats * olympic_get_stats(struct net_device *dev);
+static int olympic_set_mac_address(struct net_device *dev, void *addr) ;
+static void olympic_arb_cmd(struct net_device *dev);
+static int olympic_change_mtu(struct net_device *dev, int mtu);
+static void olympic_srb_bh(struct net_device *dev) ;
+static void olympic_asb_bh(struct net_device *dev) ;
+#if OLYMPIC_NETWORK_MONITOR
+#ifdef CONFIG_PROC_FS
+static int sprintf_info(char *buffer, struct net_device *dev) ;
+#endif
+#endif
+
+int __init olympic_probe(struct net_device *dev)
+{
+ int cards_found;
+
+ cards_found=olympic_scan(dev);
+ return cards_found ? 0 : -ENODEV;
+}
+
+static int __init olympic_scan(struct net_device *dev)
+{
+ struct pci_dev *pci_device = NULL ;
+ struct olympic_private *olympic_priv;
+ int card_no = 0 ;
+ if (pci_present()) {
+
+ while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) {
+
+ pci_set_master(pci_device);
+
+ /* Check to see if io has been allocated, if so, we've already done this card,
+ so continue on the card discovery loop */
+
+ if (check_region(pci_device->resource[0].start, OLYMPIC_IO_SPACE)) {
+ card_no++ ;
+ continue ;
+ }
+
+ olympic_priv=kmalloc(sizeof (struct olympic_private), GFP_KERNEL);
+ memset(olympic_priv, 0, sizeof(struct olympic_private));
+ init_waitqueue_head(&olympic_priv->srb_wait);
+ init_waitqueue_head(&olympic_priv->trb_wait);
+#ifndef MODULE
+ dev=init_trdev(dev, 0);
+#endif
+ dev->priv=(void *)olympic_priv;
+#if OLYMPIC_DEBUG
+ printk("pci_device: %p, dev:%p, dev->priv: %p\n", pci_device, dev, dev->priv);
+#endif
+ dev->irq=pci_device->irq;
+ dev->base_addr=pci_device->resource[0].start;
+ dev->init=&olympic_init;
+ olympic_priv->olympic_card_name = (char *)pci_device->resource[0].name ;
+ olympic_priv->olympic_mmio=ioremap(pci_device->resource[1].start,256);
+ olympic_priv->olympic_lap=ioremap(pci_device->resource[2].start,2048);
+
+ if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) )
+ olympic_priv->pkt_buf_sz = PKT_BUF_SZ ;
+ else
+ olympic_priv->pkt_buf_sz = pkt_buf_sz[card_no] ;
+
+ olympic_priv->olympic_ring_speed = ringspeed[card_no] ;
+ olympic_priv->olympic_message_level = message_level[card_no] ;
+ olympic_priv->olympic_multicast_set = 0 ;
+
+ if(olympic_init(dev)==-1) {
+ unregister_netdevice(dev);
+ kfree(dev->priv);
+ return 0;
+ }
+
+ dev->open=&olympic_open;
+ dev->hard_start_xmit=&olympic_xmit;
+ dev->change_mtu=&olympic_change_mtu;
+
+ dev->stop=&olympic_close;
+ dev->do_ioctl=NULL;
+ dev->set_multicast_list=&olympic_set_rx_mode;
+ dev->get_stats=&olympic_get_stats ;
+ dev->set_mac_address=&olympic_set_mac_address ;
+ return 1;
+ }
+ }
+ return 0 ;
+}
+
+
+static int __init olympic_init(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv;
+ __u8 *olympic_mmio, *init_srb,*adapter_addr;
+ unsigned long t;
+ unsigned int uaa_addr;
+
+ olympic_priv=(struct olympic_private *)dev->priv;
+ olympic_mmio=olympic_priv->olympic_mmio;
+
+ printk("%s \n", version);
+ printk("%s: %s. I/O at %hx, MMIO at %p, LAP at %p, using irq %d\n",dev->name, olympic_priv->olympic_card_name, (unsigned int) dev->base_addr,olympic_priv->olympic_mmio, olympic_priv->olympic_lap, dev->irq);
+
+ request_region(dev->base_addr, OLYMPIC_IO_SPACE, "olympic");
+ writel(readl(olympic_mmio+BCTL) | BCTL_SOFTRESET,olympic_mmio+BCTL);
+ t=jiffies;
+ while((readl(olympic_priv->olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
+ schedule();
+ if(jiffies-t > 40*HZ) {
+ printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
+ release_region(dev->base_addr, OLYMPIC_IO_SPACE) ;
+ return -1;
+ }
+ }
+
+#if OLYMPIC_DEBUG
+ printk("BCTL: %x\n",readl(olympic_mmio+BCTL));
+ printk("GPR: %x\n",readw(olympic_mmio+GPR));
+ printk("SISRMASK: %x\n",readl(olympic_mmio+SISR_MASK));
+#endif
+ /* Aaaahhh, You have got to be real careful setting GPR, the card
+ holds the previous values from flash memory, including autosense
+ and ring speed */
+
+ writel(readl(olympic_mmio+BCTL)|BCTL_MIMREB,olympic_mmio+BCTL);
+
+ if (olympic_priv->olympic_ring_speed == 0) { /* Autosense */
+ writel(readl(olympic_mmio+GPR)|GPR_AUTOSENSE,olympic_mmio+GPR);
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Ringspeed autosense mode on\n",dev->name);
+ } else if (olympic_priv->olympic_ring_speed == 16) {
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n", dev->name);
+ writel(GPR_16MBPS, olympic_mmio+GPR);
+ } else if (olympic_priv->olympic_ring_speed == 4) {
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n", dev->name) ;
+ writel(0, olympic_mmio+GPR);
+ }
+
+ writel(readl(olympic_mmio+GPR)|GPR_NEPTUNE_BF,olympic_mmio+GPR);
+
+#if OLYMPIC_DEBUG
+ printk("GPR = %x\n",readw(olympic_mmio + GPR) ) ;
+#endif
+ /* start solo init */
+ writel((1<<15),olympic_mmio+SISR_MASK_SUM);
+
+ t=jiffies;
+ while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
+ schedule();
+ if(jiffies-t > 40*HZ) {
+ printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
+ release_region(dev->base_addr, OLYMPIC_IO_SPACE);
+ return -1;
+ }
+ }
+
+ writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
+
+#if OLYMPIC_DEBUG
+ printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
+#endif
+
+ init_srb=olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWO)) & (~0xf800));
+
+#if OLYMPIC_DEBUG
+{
+ int i;
+ printk("init_srb(%p): ",init_srb);
+ for(i=0;i<20;i++)
+ printk("%x ",readb(init_srb+i));
+ printk("\n");
+}
+#endif
+ if(readw(init_srb+6)) {
+ printk(KERN_INFO "tokenring card intialization failed. errorcode : %x\n",readw(init_srb+6));
+ release_region(dev->base_addr, OLYMPIC_IO_SPACE);
+ return -1;
+ }
+
+ uaa_addr=ntohs(readw(init_srb+8));
+
+#if OLYMPIC_DEBUG
+ printk("UAA resides at %x\n",uaa_addr);
+#endif
+
+ writel(uaa_addr,olympic_mmio+LAPA);
+ adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
+
+#if OLYMPIC_DEBUG
+ printk("adapter address: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ readb(adapter_addr), readb(adapter_addr+1),readb(adapter_addr+2),
+ readb(adapter_addr+3),readb(adapter_addr+4),readb(adapter_addr+5));
+#endif
+
+ memcpy_fromio(&dev->dev_addr[0], adapter_addr,6);
+
+ olympic_priv->olympic_addr_table_addr = ntohs(readw(init_srb + 12)) ;
+ olympic_priv->olympic_parms_addr = ntohs(readw(init_srb + 14)) ;
+
+ return 0;
+
+}
+
+static int olympic_open(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio,*init_srb;
+ unsigned long flags;
+ char open_error[255] ;
+ int i, open_finished = 1 ;
+
+#if OLYMPIC_NETWORK_MONITOR
+ __u8 *oat ;
+ __u8 *opt ;
+#endif
+
+ if(request_irq(dev->irq, &olympic_interrupt, SA_SHIRQ , "olympic", dev)) {
+ return -EAGAIN;
+ }
+
+#if OLYMPIC_DEBUG
+ printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
+ printk("pending ints: %x\n",readl(olympic_mmio+SISR_RR));
+#endif
+
+ writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
+
+ writel(SISR_MI | SISR_SRB_REPLY, olympic_mmio+SISR_MASK); /* more ints later, doesn't stop arb cmd interrupt */
+
+ writel(LISR_LIE,olympic_mmio+LISR); /* more ints later */
+
+ /* adapter is closed, so SRB is pointed to by LAPWWO */
+
+ writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
+ init_srb=olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWO)) & (~0xf800));
+
+#if OLYMPIC_DEBUG
+ printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
+ printk("SISR Mask = %04x\n", readl(olympic_mmio+SISR_MASK));
+ printk("Before the open command \n");
+#endif
+ do {
+ int i;
+
+ save_flags(flags);
+ cli();
+ for(i=0;i<SRB_COMMAND_SIZE;i+=4)
+ writel(0,init_srb+i);
+ if(SRB_COMMAND_SIZE & 2)
+ writew(0,init_srb+(SRB_COMMAND_SIZE & ~3));
+ if(SRB_COMMAND_SIZE & 1)
+ writeb(0,init_srb+(SRB_COMMAND_SIZE & ~1));
+
+ writeb(SRB_OPEN_ADAPTER,init_srb) ; /* open */
+ writeb(OLYMPIC_CLEAR_RET_CODE,init_srb+2);
+
+ /* If Network Monitor, instruct card to copy MAC frames through the ARB */
+
+#if OLYMPIC_NETWORK_MONITOR
+ writew(ntohs(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON),init_srb+8);
+#else
+ writew(OPEN_ADAPTER_ENABLE_FDX,init_srb+8);
+#endif
+
+ if (olympic_priv->olympic_laa[0]) {
+ writeb(olympic_priv->olympic_laa[0],init_srb+12);
+ writeb(olympic_priv->olympic_laa[1],init_srb+13);
+ writeb(olympic_priv->olympic_laa[2],init_srb+14);
+ writeb(olympic_priv->olympic_laa[3],init_srb+15);
+ writeb(olympic_priv->olympic_laa[4],init_srb+16);
+ writeb(olympic_priv->olympic_laa[5],init_srb+17);
+ memcpy(dev->dev_addr,olympic_priv->olympic_laa,dev->addr_len) ;
+ }
+ writeb(1,init_srb+30);
+
+ olympic_priv->srb_queued=1;
+
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ while(olympic_priv->srb_queued) {
+ interruptible_sleep_on_timeout(&olympic_priv->srb_wait, 60*HZ);
+ if(signal_pending(current)) {
+ printk(KERN_WARNING "%s: SRB timed out.\n",
+ dev->name);
+ printk(KERN_WARNING "SISR=%x MISR=%x\n",
+ readl(olympic_mmio+SISR),
+ readl(olympic_mmio+LISR));
+ olympic_priv->srb_queued=0;
+ break;
+ }
+ }
+ restore_flags(flags);
+#if OLYMPIC_DEBUG
+ printk("init_srb(%p): ",init_srb);
+ for(i=0;i<20;i++)
+ printk("%x ",readb(init_srb+i));
+ printk("\n");
+#endif
+
+ /* If we get the same return response as we set, the interrupt wasn't raised and the open
+ * timed out.
+ */
+
+ if(readb(init_srb+2)== OLYMPIC_CLEAR_RET_CODE) {
+ printk(KERN_WARNING "%s: Adapter Open time out or error.\n", dev->name) ;
+ return -EIO ;
+ }
+
+ if(readb(init_srb+2)!=0) {
+ if (readb(init_srb+2) == 0x07) {
+ if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */
+ printk(KERN_WARNING "%s: Retrying at different ring speed \n", dev->name);
+ open_finished = 0 ;
+ } else {
+
+ strcpy(open_error, open_maj_error[(readb(init_srb+7) & 0xf0) >> 4]) ;
+ strcat(open_error," - ") ;
+ strcat(open_error, open_min_error[(readb(init_srb+7) & 0x0f)]) ;
+
+ if (!olympic_priv->olympic_ring_speed && ((readb(init_srb+7) & 0x0f) == 0x0d)) {
+ printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name);
+ printk(KERN_WARNING "%s: Please try again with a specified ring speed \n",dev->name);
+ free_irq(dev->irq, dev);
+ return -EIO ;
+ }
+
+ printk(KERN_WARNING "%s: %s\n",dev->name,open_error);
+ free_irq(dev->irq,dev) ;
+ return -EIO ;
+
+ } /* if autosense && open_finished */
+ } else {
+ printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name,init_srb[2]);
+ free_irq(dev->irq, dev);
+ return -EIO;
+ }
+ } else
+ open_finished = 1 ;
+ } while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */
+
+ if (readb(init_srb+18) & (1<<3))
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Opened in FDX Mode\n",dev->name);
+
+ if (readb(init_srb+18) & (1<<1))
+ olympic_priv->olympic_ring_speed = 100 ;
+ else if (readb(init_srb+18) & 1)
+ olympic_priv->olympic_ring_speed = 16 ;
+ else
+ olympic_priv->olympic_ring_speed = 4 ;
+
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed);
+
+ olympic_priv->asb=ntohs(readw(init_srb+8));
+ olympic_priv->srb=ntohs(readw(init_srb+10));
+ olympic_priv->arb=ntohs(readw(init_srb+12));
+ olympic_priv->trb=ntohs(readw(init_srb+16));
+
+ olympic_priv->olympic_receive_options = 0x01 ;
+ olympic_priv->olympic_copy_all_options = 0 ;
+
+ /* setup rx ring */
+
+ writel((3<<16),olympic_mmio+BMCTL_RWM); /* Ensure end of frame generated interrupts */
+
+ writel(BMCTL_RX_DIS|3,olympic_mmio+BMCTL_RWM); /* Yes, this the enables RX channel */
+
+ for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
+
+ struct sk_buff *skb;
+
+ skb=dev_alloc_skb(olympic_priv->pkt_buf_sz);
+ if(skb == NULL)
+ break;
+
+ skb->dev = dev;
+
+ olympic_priv->olympic_rx_ring[i].buffer=virt_to_bus(skb->data);
+ olympic_priv->olympic_rx_ring[i].res_length = olympic_priv->pkt_buf_sz ;
+ olympic_priv->rx_ring_skb[i]=skb;
+ }
+
+ if (i==0) {
+ printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
+ free_irq(dev->irq, dev);
+ return -EIO;
+ }
+
+ writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXDESCQ);
+ writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXCDA);
+ writew(i,olympic_mmio+RXDESCQCNT);
+
+ writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXSTATQ);
+ writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXCSA);
+
+ olympic_priv->rx_ring_last_received=OLYMPIC_RX_RING_SIZE-1; /* last processed rx status */
+ olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE-1;
+
+ writew(i,olympic_mmio+RXSTATQCNT);
+
+#if OLYMPIC_DEBUG
+ printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
+ printk("RXCSA: %x, rx_status_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCSA)),&olympic_priv->olympic_rx_status_ring[0]);
+ printk(" stat_ring[1]: %p, stat_ring[2]: %p, stat_ring[3]: %p\n", &(olympic_priv->olympic_rx_status_ring[1]), &(olympic_priv->olympic_rx_status_ring[2]), &(olympic_priv->olympic_rx_status_ring[3]) );
+ printk(" stat_ring[4]: %p, stat_ring[5]: %p, stat_ring[6]: %p\n", &(olympic_priv->olympic_rx_status_ring[4]), &(olympic_priv->olympic_rx_status_ring[5]), &(olympic_priv->olympic_rx_status_ring[6]) );
+ printk(" stat_ring[7]: %p\n", &(olympic_priv->olympic_rx_status_ring[7]) );
+
+ printk("RXCDA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCDA)),&olympic_priv->olympic_rx_ring[0]);
+#endif
+
+ writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | i,olympic_mmio+RXENQ);
+
+#if OLYMPIC_DEBUG
+ printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
+ printk("RXCSA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCSA)),&olympic_priv->olympic_rx_status_ring[0]);
+ printk("RXCDA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCDA)),&olympic_priv->olympic_rx_ring[0]);
+#endif
+
+ writel(SISR_RX_STATUS | SISR_RX_NOBUF,olympic_mmio+SISR_MASK_SUM);
+
+ /* setup tx ring */
+
+ writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */
+ for(i=0;i<OLYMPIC_TX_RING_SIZE;i++)
+ olympic_priv->olympic_tx_ring[i].buffer=0xdeadbeef;
+
+ olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE;
+ writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXDESCQ_1);
+ writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXCDA_1);
+ writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXDESCQCNT_1);
+
+ writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXSTATQ_1);
+ writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXCSA_1);
+ writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXSTATQCNT_1);
+
+ olympic_priv->tx_ring_free=0; /* next entry in tx ring to use */
+ olympic_priv->tx_ring_last_status=OLYMPIC_TX_RING_SIZE-1; /* last processed tx status */
+
+ writel(SISR_TX1_EOF | SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE,olympic_mmio+SISR_MASK_SUM);
+
+#if OLYMPIC_DEBUG
+ printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
+ printk("SISR MASK: %x\n",readl(olympic_mmio+SISR_MASK));
+#endif
+
+#if OLYMPIC_NETWORK_MONITOR
+ oat = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ;
+ opt = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ;
+
+ printk("%s: Node Address: %02x:%02x:%02x:%02x:%02x:%02x\n",dev->name,
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+1),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+2),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+3),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+4),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+5));
+ printk("%s: Functional Address: %02x:%02x:%02x:%02x\n",dev->name,
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
+
+ printk("%s: NAUN Address: %02x:%02x:%02x:%02x:%02x:%02x\n",dev->name,
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+4),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+5));
+
+
+#endif
+
+ dev->start = 1;
+ dev->interrupt=0;
+ dev->tbusy=0;
+
+ MOD_INC_USE_COUNT ;
+ return 0;
+
+}
+
+/*
+ * When we enter the rx routine we do not know how many frames have been
+ * queued on the rx channel. Therefore we start at the next rx status
+ * position and travel around the receive ring until we have completed
+ * all the frames.
+ *
+ * This means that we may process the frame before we receive the end
+ * of frame interrupt. This is why we always test the status instead
+ * of blindly processing the next frame.
+ *
+ */
+static void olympic_rx(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio;
+ struct olympic_rx_status *rx_status;
+ struct olympic_rx_desc *rx_desc ;
+ int rx_ring_last_received,length, buffer_cnt, cpy_length, frag_len;
+ struct sk_buff *skb, *skb2;
+ int i;
+
+ rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ;
+
+ while (rx_status->status_buffercnt) {
+
+ olympic_priv->rx_status_last_received++ ;
+ olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1);
+#if OLYMPIC_DEBUG
+ printk(" stat_ring addr: %x \n", &(olympic_priv->olympic_rx_status_ring[olympic_priv->rx_status_last_received]) );
+ printk("rx status: %x rx len: %x \n",rx_status->status_buffercnt,rx_status->fragmentcnt_framelen);
+#endif
+ length=rx_status->fragmentcnt_framelen & 0xffff;
+ buffer_cnt = rx_status->status_buffercnt & 0xffff ;
+ i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */
+ frag_len = rx_status->fragmentcnt_framelen >> 16 ;
+
+#if OLYMPIC_DEBUG
+ printk("length: %x, frag_len: %x, buffer_cnt: %x\n",length,frag_len,buffer_cnt);
+#endif
+
+ if(rx_status->status_buffercnt & 0xC0000000) {
+ if (rx_status->status_buffercnt & 0x3B000000) {
+ if (olympic_priv->olympic_message_level) {
+ if (rx_status->status_buffercnt & (1<<29)) /* Rx Frame Truncated */
+ printk(KERN_WARNING "%s: Rx Frame Truncated \n",dev->name);
+ if (rx_status->status_buffercnt & (1<<28)) /*Rx receive overrun */
+ printk(KERN_WARNING "%s: Rx Frame Receive overrun \n",dev->name);
+ if (rx_status->status_buffercnt & (1<<27)) /* No receive buffers */
+ printk(KERN_WARNING "%s: No receive buffers \n",dev->name);
+ if (rx_status->status_buffercnt & (1<<25)) /* Receive frame error detect */
+ printk(KERN_WARNING "%s: Receive frame error detect \n",dev->name);
+ if (rx_status->status_buffercnt & (1<<24)) /* Received Error Detect */
+ printk(KERN_WARNING "%s: Received Error Detect \n",dev->name);
+ }
+ olympic_priv->rx_ring_last_received += i ;
+ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ;
+ olympic_priv->olympic_stats.rx_errors++;
+ } else {
+
+ if (buffer_cnt == 1) {
+ skb = dev_alloc_skb(olympic_priv->pkt_buf_sz) ;
+ } else {
+ skb = dev_alloc_skb(length) ;
+ }
+
+ if (skb == NULL) {
+ printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers. \n",dev->name) ;
+ olympic_priv->olympic_stats.rx_dropped++ ;
+ /* Update counters even though we don't transfer the frame */
+ olympic_priv->rx_ring_last_received += i ;
+ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ;
+ } else {
+ skb->dev = dev ;
+
+ /* Optimise based upon number of buffers used.
+ If only one buffer is used we can simply swap the buffers around.
+ If more than one then we must use the new buffer and copy the information
+ first. Ideally all frames would be in a single buffer, this can be tuned by
+ altering the buffer size. */
+
+ if (buffer_cnt==1) {
+ olympic_priv->rx_ring_last_received++ ;
+ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
+ rx_ring_last_received = olympic_priv->rx_ring_last_received ;
+ skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ;
+ skb_put(skb2,length);
+ skb2->protocol = tr_type_trans(skb2,dev);
+ olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer=virt_to_bus(skb->data);
+ olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = olympic_priv->pkt_buf_sz ;
+ olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ;
+ netif_rx(skb2) ;
+ } else {
+ do { /* Walk the buffers */
+ olympic_priv->rx_ring_last_received++ ;
+ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
+ rx_ring_last_received = olympic_priv->rx_ring_last_received ;
+ rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]);
+ cpy_length = (i == 1 ? frag_len : rx_desc->res_length);
+ memcpy(skb_put(skb, cpy_length), bus_to_virt(rx_desc->buffer), cpy_length) ;
+ } while (--i) ;
+
+ skb->protocol = tr_type_trans(skb,dev);
+ netif_rx(skb) ;
+ }
+ olympic_priv->olympic_stats.rx_packets++ ;
+ olympic_priv->olympic_stats.rx_bytes += length ;
+ } /* if skb == null */
+ } /* If status & 0x3b */
+
+ } else { /*if buffercnt & 0xC */
+ olympic_priv->rx_ring_last_received += i ;
+ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE - 1) ;
+ }
+
+ rx_status->fragmentcnt_framelen = 0 ;
+ rx_status->status_buffercnt = 0 ;
+ rx_status = &(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received+1) & (OLYMPIC_RX_RING_SIZE -1) ]);
+
+ writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | buffer_cnt , olympic_mmio+RXENQ);
+ } /* while */
+
+}
+
+static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ struct net_device *dev= (struct net_device *)dev_id;
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio;
+ __u32 sisr;
+ __u8 *adapter_check_area ;
+
+ sisr=readl(olympic_mmio+SISR_RR) ; /* Reset sisr */
+
+ if (!(sisr & SISR_MI)) /* Interrupt isn't for us */
+ return ;
+
+ if (dev->interrupt)
+ printk(KERN_WARNING "%s: Re-entering interrupt \n",dev->name) ;
+
+ dev->interrupt = 1 ;
+
+ if (sisr & (SISR_SRB_REPLY | SISR_TX1_EOF | SISR_RX_STATUS | SISR_ADAPTER_CHECK |
+ SISR_ASB_FREE | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_RX_NOBUF)) {
+
+ if(sisr & SISR_SRB_REPLY) {
+ if(olympic_priv->srb_queued==1) {
+ wake_up_interruptible(&olympic_priv->srb_wait);
+ } else if (olympic_priv->srb_queued==2) {
+ olympic_srb_bh(dev) ;
+ }
+ olympic_priv->srb_queued=0;
+ } /* SISR_SRB_REPLY */
+
+ if (sisr & SISR_TX1_EOF) {
+ olympic_priv->tx_ring_last_status++;
+ olympic_priv->tx_ring_last_status &= (OLYMPIC_TX_RING_SIZE-1);
+ olympic_priv->free_tx_ring_entries++;
+ olympic_priv->olympic_stats.tx_bytes += olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len;
+ olympic_priv->olympic_stats.tx_packets++ ;
+ dev_kfree_skb(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]);
+ olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=0xdeadbeef;
+ olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0;
+
+ if(dev->tbusy) {
+ dev->tbusy=0;
+ mark_bh(NET_BH);
+ }
+ } /* SISR_TX1_EOF */
+
+ if (sisr & SISR_RX_STATUS) {
+ olympic_rx(dev);
+ } /* SISR_RX_STATUS */
+
+ if (sisr & SISR_ADAPTER_CHECK) {
+ printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name);
+ writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
+ adapter_check_area = (__u8 *)(olympic_mmio+LAPWWO) ;
+ printk(KERN_WARNING "%s: Bytes %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, readb(adapter_check_area+0), readb(adapter_check_area+1), readb(adapter_check_area+2), readb(adapter_check_area+3), readb(adapter_check_area+4), readb(adapter_check_area+5), readb(adapter_check_area+6), readb(adapter_check_area+7)) ;
+ dev->interrupt = 0 ;
+ free_irq(dev->irq, dev) ;
+
+ } /* SISR_ADAPTER_CHECK */
+
+ if (sisr & SISR_ASB_FREE) {
+ /* Wake up anything that is waiting for the asb response */
+ if (olympic_priv->asb_queued) {
+ olympic_asb_bh(dev) ;
+ }
+ } /* SISR_ASB_FREE */
+
+ if (sisr & SISR_ARB_CMD) {
+ olympic_arb_cmd(dev) ;
+ } /* SISR_ARB_CMD */
+
+ if (sisr & SISR_TRB_REPLY) {
+ /* Wake up anything that is waiting for the trb response */
+ if (olympic_priv->trb_queued) {
+ wake_up_interruptible(&olympic_priv->trb_wait);
+ }
+ olympic_priv->trb_queued = 0 ;
+ } /* SISR_TRB_REPLY */
+
+ if (sisr & SISR_RX_NOBUF) {
+ /* According to the documentation, we don't have to do anything, but trapping it keeps it out of
+ /var/log/messages. */
+ } /* SISR_RX_NOBUF */
+ } else {
+ printk(KERN_WARNING "%s: Unexpected interrupt: %x\n",dev->name, sisr);
+ printk(KERN_WARNING "%s: SISR_MASK: %x\n",dev->name, readl(olympic_mmio+SISR_MASK)) ;
+ } /* One if the interrupts we want */
+
+ dev->interrupt = 0 ;
+
+ writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
+
+}
+
+static int olympic_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio;
+
+ if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
+ return 1;
+ }
+
+ if(olympic_priv->free_tx_ring_entries) {
+ olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer=virt_to_bus(skb->data);
+ olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length=skb->len | (0x80000000);
+ olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb;
+ olympic_priv->free_tx_ring_entries--;
+
+ olympic_priv->tx_ring_free++;
+ olympic_priv->tx_ring_free &= (OLYMPIC_TX_RING_SIZE-1);
+
+
+ writew((((readw(olympic_mmio+TXENQ_1)) & 0x8000) ^ 0x8000) | 1,olympic_mmio+TXENQ_1);
+
+ dev->tbusy=0;
+
+ return 0;
+ } else
+ return 1;
+
+}
+
+
+static int olympic_close(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio,*srb;
+ unsigned long flags;
+ int i;
+
+ writel(olympic_priv->srb,olympic_mmio+LAPA);
+ srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
+
+ writeb(SRB_CLOSE_ADAPTER,srb+0);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+
+ save_flags(flags);
+ cli();
+
+ olympic_priv->srb_queued=1;
+
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ while(olympic_priv->srb_queued) {
+ interruptible_sleep_on_timeout(&olympic_priv->srb_wait, jiffies+60*HZ);
+ if(signal_pending(current)) {
+ printk(KERN_WARNING "%s: SRB timed out.\n",
+ dev->name);
+ printk(KERN_WARNING "SISR=%x MISR=%x\n",
+ readl(olympic_mmio+SISR),
+ readl(olympic_mmio+LISR));
+ olympic_priv->srb_queued=0;
+ break;
+ }
+ }
+
+ restore_flags(flags) ;
+ olympic_priv->rx_status_last_received++;
+ olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
+
+ for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
+ dev_kfree_skb(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]);
+ olympic_priv->rx_status_last_received++;
+ olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
+ }
+
+ /* reset tx/rx fifo's and busmaster logic */
+
+ writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
+ udelay(1);
+ writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
+
+#if OLYMPIC_DEBUG
+ printk("srb(%p): ",srb);
+ for(i=0;i<4;i++)
+ printk("%x ",readb(srb+i));
+ printk("\n");
+#endif
+ dev->start = 0;
+ free_irq(dev->irq,dev);
+
+ MOD_DEC_USE_COUNT ;
+ return 0;
+
+}
+
+static void olympic_set_rx_mode(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ;
+ __u8 *olympic_mmio = olympic_priv->olympic_mmio ;
+ __u8 options = 0, set_mc_list = 0 ;
+ __u8 *srb, *ata ;
+ struct dev_mc_list *dmi ;
+
+ writel(olympic_priv->srb,olympic_mmio+LAPA);
+ srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
+ options = olympic_priv->olympic_copy_all_options;
+
+ if (dev->flags&IFF_PROMISC)
+ options |= (3<<5) ; /* All LLC and MAC frames, all through the main rx channel */
+ else
+ options &= ~(3<<5) ;
+
+ if (dev->mc_count) {
+ set_mc_list = 1 ;
+ }
+
+ /* Only issue the srb if there is a change in options */
+
+ if ((options ^ olympic_priv->olympic_copy_all_options)) {
+
+ /* Now to issue the srb command to alter the copy.all.options */
+
+ writeb(SRB_MODIFY_RECEIVE_OPTIONS,srb);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+ writeb(0,srb+3);
+ writeb(olympic_priv->olympic_receive_options,srb+4);
+ writeb(options,srb+5);
+
+ olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
+
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ olympic_priv->olympic_copy_all_options = options ;
+
+ return ;
+ }
+
+ if (set_mc_list ^ olympic_priv->olympic_multicast_set) { /* Multicast options have changed */
+
+ dmi = dev->mc_list ;
+
+ if (set_mc_list) { /* Turn multicast on */
+
+ /* RFC 1469 Says we must support using the functional address C0 00 00 04 00 00
+ * We do this with a set functional address mask.
+ */
+
+ ata=olympic_priv->olympic_lap + (olympic_priv->olympic_addr_table_addr) ;
+ if (!(readb(ata+11) & 0x04)) { /* Hmmm, need to set the functional mask */
+ writeb(SRB_SET_FUNC_ADDRESS,srb+0);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+ writeb(0,srb+3);
+ writeb(0,srb+4);
+ writeb(0,srb+5);
+ writeb(readb(ata+10),srb+6);
+ writeb(readb(ata+11)|4,srb+7);
+ writeb(readb(ata+12),srb+8);
+ writeb(readb(ata+13),srb+9);
+
+ olympic_priv->srb_queued = 2 ;
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ olympic_priv->olympic_multicast_set = 1 ;
+ }
+
+
+ } else { /* Turn multicast off */
+
+ ata=olympic_priv->olympic_lap + (olympic_priv->olympic_addr_table_addr) ;
+ if ((readb(ata+11) & 0x04)) { /* Hmmm, need to reset the functional mask */
+ writeb(SRB_SET_FUNC_ADDRESS,srb+0);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+ writeb(0,srb+3);
+ writeb(0,srb+4);
+ writeb(0,srb+5);
+ writeb(readb(ata+10),srb+6);
+ writeb(readb(ata+11) & ~4,srb+7);
+ writeb(readb(ata+12),srb+8);
+ writeb(readb(ata+13),srb+9);
+
+ olympic_priv->srb_queued = 2 ;
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ olympic_priv->olympic_multicast_set = 0 ;
+ }
+ }
+
+ }
+
+
+}
+
+static void olympic_srb_bh(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ;
+ __u8 *olympic_mmio = olympic_priv->olympic_mmio ;
+ __u8 *srb;
+
+ writel(olympic_priv->srb,olympic_mmio+LAPA);
+ srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
+
+ switch (readb(srb)) {
+
+ /* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous)
+ * At some point we should do something if we get an error, such as
+ * resetting the IFF_PROMISC flag in dev
+ */
+
+ case SRB_MODIFY_RECEIVE_OPTIONS:
+ switch (readb(srb+2)) {
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
+ break ;
+ default:
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",dev->name,olympic_priv->olympic_copy_all_options, olympic_priv->olympic_receive_options) ;
+ break ;
+ } /* switch srb[2] */
+ break ;
+
+ /* SRB_SET_GROUP_ADDRESS - Multicast group setting
+ */
+
+ case SRB_SET_GROUP_ADDRESS:
+ switch (readb(srb+2)) {
+ case 0x00:
+ olympic_priv->olympic_multicast_set = 1 ;
+ break ;
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
+ break ;
+ case 0x3c:
+ printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n",dev->name) ;
+ break ;
+ case 0x3e: /* If we ever implement individual multicast addresses, will need to deal with this */
+ printk(KERN_WARNING "%s: Group address registers full\n",dev->name) ;
+ break ;
+ case 0x55:
+ printk(KERN_INFO "%s: Group Address already set.\n",dev->name) ;
+ break ;
+ default:
+ break ;
+ } /* switch srb[2] */
+ break ;
+
+ /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
+ */
+
+ case SRB_RESET_GROUP_ADDRESS:
+ switch (readb(srb+2)) {
+ case 0x00:
+ olympic_priv->olympic_multicast_set = 0 ;
+ break ;
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
+ break ;
+ case 0x39: /* Must deal with this if individual multicast addresses used */
+ printk(KERN_INFO "%s: Group address not found \n",dev->name);
+ break ;
+ default:
+ break ;
+ } /* switch srb[2] */
+ break ;
+
+
+ /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode
+ */
+
+ case SRB_SET_FUNC_ADDRESS:
+ switch (readb(srb+2)) {
+ case 0x00:
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Functional Address Mask Set \n",dev->name) ;
+ break ;
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
+ break ;
+ default:
+ break ;
+ } /* switch srb[2] */
+ break ;
+
+ /* SRB_READ_LOG - Read and reset the adapter error counters
+ */
+
+ case SRB_READ_LOG:
+ switch (readb(srb+2)) {
+ case 0x00:
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Read Log issued\n",dev->name) ;
+ break ;
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
+ break ;
+
+ } /* switch srb[2] */
+ break ;
+
+ /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
+
+ case SRB_READ_SR_COUNTERS:
+ switch (readb(srb+2)) {
+ case 0x00:
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Read Source Routing Counters issued\n",dev->name) ;
+ break ;
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ;
+ break ;
+ case 0x04:
+ printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
+ break ;
+ default:
+ break ;
+ } /* switch srb[2] */
+ break ;
+
+ default:
+ printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n",dev->name);
+ break ;
+ } /* switch srb[0] */
+
+}
+
+static struct net_device_stats * olympic_get_stats(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv ;
+ olympic_priv=(struct olympic_private *) dev->priv;
+ return (struct net_device_stats *) &olympic_priv->olympic_stats;
+}
+
+static int olympic_set_mac_address (struct net_device *dev, void *addr)
+{
+ struct sockaddr *saddr = addr ;
+ struct olympic_private *olympic_priv = (struct olympic_private *)dev->priv ;
+
+ if (dev->start) {
+ printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ;
+ return -EIO ;
+ }
+
+ memcpy(olympic_priv->olympic_laa, saddr->sa_data,dev->addr_len) ;
+
+ if (olympic_priv->olympic_message_level) {
+ printk(KERN_INFO "%s: MAC/LAA Set to = %x.%x.%x.%x.%x.%x\n",dev->name, olympic_priv->olympic_laa[0],
+ olympic_priv->olympic_laa[1], olympic_priv->olympic_laa[2],
+ olympic_priv->olympic_laa[3], olympic_priv->olympic_laa[4],
+ olympic_priv->olympic_laa[5]);
+ }
+
+ return 0 ;
+}
+
+static void olympic_arb_cmd(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv;
+ __u8 *olympic_mmio=olympic_priv->olympic_mmio;
+ __u8 *arb_block, *asb_block, *srb ;
+ __u8 header_len ;
+ __u16 frame_len, buffer_len ;
+ struct sk_buff *mac_frame ;
+ __u8 *buf_ptr ;
+ __u8 *frame_data ;
+ __u16 buff_off ;
+ __u16 lan_status = 0, lan_status_diff ; /* Initialize to stop compiler warning */
+ __u8 fdx_prot_error ;
+ __u16 next_ptr;
+
+#if OLYMPIC_NETWORK_MONITOR
+ struct trh_hdr *mac_hdr ;
+#endif
+
+ arb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->arb) ;
+ asb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->asb) ;
+ srb = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->srb) ;
+ writel(readl(olympic_mmio+LAPA),olympic_mmio+LAPWWO);
+
+ if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */
+
+ header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */
+ frame_len = ntohs(readw(arb_block + 10)) ;
+
+ buff_off = ntohs(readw(arb_block + 6)) ;
+
+ buf_ptr = olympic_priv->olympic_lap + buff_off ;
+
+#if OLYMPIC_DEBUG
+{
+ int i;
+ frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ;
+
+ for (i=0 ; i < 14 ; i++) {
+ printk("Loc %d = %02x\n",i,readb(frame_data + i));
+ }
+
+ printk("next %04x, fs %02x, len %04x \n",readw(buf_ptr+offsetof(struct mac_receive_buffer,next)), readb(buf_ptr+offsetof(struct mac_receive_buffer,frame_status)), readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length)));
+}
+#endif
+ mac_frame = dev_alloc_skb(frame_len) ;
+
+ /* Walk the buffer chain, creating the frame */
+
+ do {
+ frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ;
+ buffer_len = ntohs(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length)));
+ memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ;
+ next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next));
+
+ } while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + ntohs(next_ptr)));
+
+#if OLYMPIC_NETWORK_MONITOR
+ printk(KERN_WARNING "%s: Received MAC Frame, details: \n",dev->name) ;
+ mac_hdr = (struct trh_hdr *)mac_frame->data ;
+ printk(KERN_WARNING "%s: MAC Frame Dest. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n", dev->name , mac_hdr->daddr[0], mac_hdr->daddr[1], mac_hdr->daddr[2], mac_hdr->daddr[3], mac_hdr->daddr[4], mac_hdr->daddr[5]) ;
+ printk(KERN_WARNING "%s: MAC Frame Srce. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n", dev->name , mac_hdr->saddr[0], mac_hdr->saddr[1], mac_hdr->saddr[2], mac_hdr->saddr[3], mac_hdr->saddr[4], mac_hdr->saddr[5]) ;
+#endif
+ mac_frame->dev = dev ;
+ mac_frame->protocol = tr_type_trans(mac_frame,dev);
+ netif_rx(mac_frame) ;
+
+ /* Now tell the card we have dealt with the received frame */
+
+ /* Set LISR Bit 1 */
+ writel(LISR_ARB_FREE,olympic_priv->olympic_lap + LISR_SUM);
+
+ /* Is the ASB free ? */
+
+ if (!(readl(olympic_priv->olympic_mmio + SISR) & SISR_ASB_FREE)) {
+ olympic_priv->asb_queued = 1 ;
+ writel(LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
+ return ;
+ /* Drop out and wait for the bottom half to be run */
+ }
+
+ writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
+ writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
+ writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
+ writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */
+
+ writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
+
+ olympic_priv->asb_queued = 2 ;
+
+ return ;
+
+ } else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */
+ lan_status = readw(arb_block+6);
+ fdx_prot_error = readb(arb_block+8) ;
+
+ /* Issue ARB Free */
+ writel(LISR_ARB_FREE,olympic_priv->olympic_mmio+LISR_SUM);
+
+ lan_status_diff = olympic_priv->olympic_lan_status ^ lan_status ;
+
+ if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR) ) {
+ if (lan_status_diff & LSC_LWF)
+ printk(KERN_WARNING "%s: Short circuit detected on the lobe\n",dev->name);
+ if (lan_status_diff & LSC_ARW)
+ printk(KERN_WARNING "%s: Auto removal error\n",dev->name);
+ if (lan_status_diff & LSC_FPE)
+ printk(KERN_WARNING "%s: FDX Protocol Error\n",dev->name);
+ if (lan_status_diff & LSC_RR)
+ printk(KERN_WARNING "%s: Force remove MAC frame received\n",dev->name);
+
+ /* Adapter has been closed by the hardware */
+
+ /* reset tx/rx fifo's and busmaster logic */
+
+ writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
+ udelay(1);
+ writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
+ dev->tbusy = 1 ;
+ dev->interrupt = 1 ;
+ dev->start = 0 ;
+ olympic_priv->srb = readw(olympic_priv->olympic_lap + LAPWWO) ;
+ free_irq(dev->irq,dev);
+
+ printk(KERN_WARNING "%s: Adapter has been closed \n", dev->name) ;
+
+ } /* If serious error */
+
+ if (olympic_priv->olympic_message_level) {
+ if (lan_status_diff & LSC_SIG_LOSS)
+ printk(KERN_WARNING "%s: No receive signal detected \n", dev->name) ;
+ if (lan_status_diff & LSC_HARD_ERR)
+ printk(KERN_INFO "%s: Beaconing \n",dev->name);
+ if (lan_status_diff & LSC_SOFT_ERR)
+ printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame \n",dev->name);
+ if (lan_status_diff & LSC_TRAN_BCN)
+ printk(KERN_INFO "%s: We are tranmitting the beacon, aaah\n",dev->name);
+ if (lan_status_diff & LSC_SS)
+ printk(KERN_INFO "%s: Single Station on the ring \n", dev->name);
+ if (lan_status_diff & LSC_RING_REC)
+ printk(KERN_INFO "%s: Ring recovery ongoing\n",dev->name);
+ if (lan_status_diff & LSC_FDX_MODE)
+ printk(KERN_INFO "%s: Operating in FDX mode\n",dev->name);
+ }
+
+ if (lan_status_diff & LSC_CO) {
+
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Counter Overflow \n", dev->name);
+
+ /* Issue READ.LOG command */
+
+ writeb(SRB_READ_LOG, srb);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+ writeb(0,srb+3);
+ writeb(0,srb+4);
+ writeb(0,srb+5);
+
+ olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
+
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ }
+
+ if (lan_status_diff & LSC_SR_CO) {
+
+ if (olympic_priv->olympic_message_level)
+ printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
+
+ /* Issue a READ.SR.COUNTERS */
+
+ writeb(SRB_READ_SR_COUNTERS,srb);
+ writeb(0,srb+1);
+ writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
+ writeb(0,srb+3);
+
+ olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
+
+ writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
+
+ }
+
+ olympic_priv->olympic_lan_status = lan_status ;
+
+ } /* Lan.change.status */
+ else
+ printk(KERN_WARNING "%s: Unknown arb command \n", dev->name);
+}
+
+static void olympic_asb_bh(struct net_device *dev)
+{
+ struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ;
+ __u8 *arb_block, *asb_block ;
+
+ arb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->arb) ;
+ asb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->asb) ;
+
+ if (olympic_priv->asb_queued == 1) { /* Dropped through the first time */
+
+ writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
+ writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
+ writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
+ writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */
+
+ writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
+ olympic_priv->asb_queued = 2 ;
+
+ return ;
+ }
+
+ if (olympic_priv->asb_queued == 2) {
+ switch (readb(asb_block+2)) {
+ case 0x01:
+ printk(KERN_WARNING "%s: Unrecognized command code \n", dev->name);
+ break ;
+ case 0x26:
+ printk(KERN_WARNING "%s: Unrecognized buffer address \n", dev->name);
+ break ;
+ case 0xFF:
+ /* Valid response, everything should be ok again */
+ break ;
+ default:
+ printk(KERN_WARNING "%s: Invalid return code in asb\n",dev->name);
+ break ;
+ }
+ }
+ olympic_priv->asb_queued = 0 ;
+}
+
+static int olympic_change_mtu(struct net_device *dev, int mtu)
+{
+ struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv;
+ __u16 max_mtu ;
+
+ if (olympic_priv->olympic_ring_speed == 4)
+ max_mtu = 4500 ;
+ else
+ max_mtu = 18000 ;
+
+ if (mtu > max_mtu)
+ return -EINVAL ;
+ if (mtu < 100)
+ return -EINVAL ;
+
+ dev->mtu = mtu ;
+ olympic_priv->pkt_buf_sz = mtu + TR_HLEN ;
+
+ return 0 ;
+}
+
+#if OLYMPIC_NETWORK_MONITOR
+#ifdef CONFIG_PROC_FS
+static int olympic_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
+{
+ struct pci_dev *pci_device = NULL ;
+ int len=0;
+ off_t begin=0;
+ off_t pos=0;
+ int size;
+
+ struct net_device *dev;
+
+
+ size = sprintf(buffer,
+ "IBM Pit/Pit-Phy/Olympic Chipset Token Ring Adapters\n");
+
+ pos+=size;
+ len+=size;
+
+
+ while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) {
+
+ for (dev = dev_base; dev != NULL; dev = dev->next)
+ {
+ if (dev->base_addr == pci_device->resource[0].start ) { /* Yep, an Olympic device */
+ size = sprintf_info(buffer+len, dev);
+ len+=size;
+ pos=begin+len;
+
+ if(pos<offset)
+ {
+ len=0;
+ begin=pos;
+ }
+ if(pos>offset+length)
+ break;
+ } /* if */
+ } /* for */
+ } /* While */
+
+ *start=buffer+(offset-begin); /* Start of wanted data */
+ len-=(offset-begin); /* Start slop */
+ if(len>length)
+ len=length; /* Ending slop */
+ return len;
+}
+
+static int sprintf_info(char *buffer, struct net_device *dev)
+{
+ struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
+ __u8 *oat = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ;
+ __u8 *opt = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ;
+ int size = 0 ;
+
+ size = sprintf(buffer, "\n%6s: Adapter Address : Node Address : Functional Addr\n",
+ dev->name);
+
+ size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x\n",
+ dev->name,
+ dev->dev_addr[0],
+ dev->dev_addr[1],
+ dev->dev_addr[2],
+ dev->dev_addr[3],
+ dev->dev_addr[4],
+ dev->dev_addr[5],
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+1),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+2),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+3),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+4),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+5),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
+ readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
+
+ size += sprintf(buffer+size, "\n%6s: Token Ring Parameters Table:\n", dev->name);
+
+ size += sprintf(buffer+size, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n",
+ dev->name) ;
+
+ size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x :\n",
+ dev->name,
+ readb(opt+offsetof(struct olympic_parameters_table, phys_addr)),
+ readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+4),
+ readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+5),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+4),
+ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+5),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
+
+ size += sprintf(buffer+size, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
+ dev->name) ;
+
+ size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x : %04x : %04x : %04x : \n",
+ dev->name,
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)),
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+4),
+ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+5),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, lan_status))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, local_ring))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
+
+ size += sprintf(buffer+size, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n",
+ dev->name) ;
+
+ size += sprintf(buffer+size, "%6s: : %02x : %02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x : \n",
+ dev->name,
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
+ ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+3),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+4),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+5),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+1),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+2),
+ readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+3));
+
+
+ return size;
+}
+#endif
+#endif
+
+#ifdef MODULE
+
+static struct net_device* dev_olympic[OLYMPIC_MAX_ADAPTERS];
+
+int init_module(void)
+{
+ int i;
+
+#if OLYMPIC_NETWORK_MONITOR
+#ifdef CONFIG_PROC_FS
+ struct proc_dir_entry *ent ;
+
+ ent = create_proc_entry("net/olympic_tr",0,0);
+ ent->read_proc = &olympic_proc_info ;
+#endif
+#endif
+ for (i = 0; (i<OLYMPIC_MAX_ADAPTERS); i++) {
+ dev_olympic[i] = NULL;
+ dev_olympic[i] = init_trdev(dev_olympic[i], 0);
+ if (dev_olympic[i] == NULL)
+ return -ENOMEM;
+
+ dev_olympic[i]->init = &olympic_probe;
+
+ if (register_trdev(dev_olympic[i]) != 0) {
+ kfree_s(dev_olympic[i], sizeof(struct net_device));
+ dev_olympic[i] = NULL;
+ if (i == 0) {
+ printk("Olympic: No IBM PCI Token Ring cards found in system.\n");
+ return -EIO;
+ } else {
+ printk("Olympic: %d IBM PCI Token Ring card(s) found in system.\n",i) ;
+ return 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void cleanup_module(void)
+{
+ int i;
+
+ for (i = 0; i < OLYMPIC_MAX_ADAPTERS; i++)
+ if (dev_olympic[i]) {
+ unregister_trdev(dev_olympic[i]);
+ release_region(dev_olympic[i]->base_addr, OLYMPIC_IO_SPACE);
+ kfree_s(dev_olympic[i]->priv, sizeof(struct olympic_private));
+ kfree_s(dev_olympic[i], sizeof(struct net_device));
+ dev_olympic[i] = NULL;
+ }
+
+#if OLYMPIC_NETWORK_MONITOR
+#ifdef CONFIG_PROC_FS
+ remove_proc_entry("net/olympic_tr", NULL) ;
+#endif
+#endif
+}
+#endif /* MODULE */
+
diff --git a/drivers/net/tokenring/olympic.h b/drivers/net/tokenring/olympic.h
new file mode 100644
index 000000000..d5a06423a
--- /dev/null
+++ b/drivers/net/tokenring/olympic.h
@@ -0,0 +1,304 @@
+/*
+ * olympic.h (c) 1999 Peter De Schrijver All Rights Reserved
+ * 1999 Mike Phillips (phillim@amtrak.com)
+ *
+ * Linux driver for IBM PCI tokenring cards based on the olympic and the PIT/PHY chipset.
+ *
+ * Base Driver Skeleton:
+ * Written 1993-94 by Donald Becker.
+ *
+ * Copyright 1993 United States Government as represented by the
+ * Director, National Security Agency.
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU Public License, incorporated herein by reference.
+ */
+
+#define CID 0x4e
+
+#define BCTL 0x70
+#define BCTL_SOFTRESET (1<<15)
+#define BCTL_MIMREB (1<<6)
+
+#define GPR 0x4a
+#define GPR_OPTI_BF (1<<6)
+#define GPR_NEPTUNE_BF (1<<4)
+#define GPR_AUTOSENSE (1<<2)
+#define GPR_16MBPS (1<<3)
+
+#define PAG 0x85
+#define LBC 0x8e
+
+#define LISR 0x10
+#define LISR_SUM 0x14
+#define LISR_RWM 0x18
+
+#define LISR_LIE (1<<15)
+#define LISR_SLIM (1<<13)
+#define LISR_SLI (1<<12)
+#define LISR_PCMSRMASK (1<<11)
+#define LISR_PCMSRINT (1<<10)
+#define LISR_WOLMASK (1<<9)
+#define LISR_WOL (1<<8)
+#define LISR_SRB_CMD (1<<5)
+#define LISR_ASB_REPLY (1<<4)
+#define LISR_ASB_FREE_REQ (1<<2)
+#define LISR_ARB_FREE (1<<1)
+#define LISR_TRB_FRAME (1<<0)
+
+#define SISR 0x20
+#define SISR_SUM 0x24
+#define SISR_RWM 0x28
+#define SISR_RR 0x2C
+#define SISR_RESMASK 0x30
+#define SISR_MASK 0x54
+#define SISR_MASK_SUM 0x58
+#define SISR_MASK_RWM 0x5C
+
+#define SISR_TX2_IDLE (1<<31)
+#define SISR_TX2_HALT (1<<29)
+#define SISR_TX2_EOF (1<<28)
+#define SISR_TX1_IDLE (1<<27)
+#define SISR_TX1_HALT (1<<25)
+#define SISR_TX1_EOF (1<<24)
+#define SISR_TIMEOUT (1<<23)
+#define SISR_RX_NOBUF (1<<22)
+#define SISR_RX_STATUS (1<<21)
+#define SISR_RX_HALT (1<<18)
+#define SISR_RX_EOF_EARLY (1<<16)
+#define SISR_MI (1<<15)
+#define SISR_PI (1<<13)
+#define SISR_ERR (1<<9)
+#define SISR_ADAPTER_CHECK (1<<6)
+#define SISR_SRB_REPLY (1<<5)
+#define SISR_ASB_FREE (1<<4)
+#define SISR_ARB_CMD (1<<3)
+#define SISR_TRB_REPLY (1<<2)
+
+#define EISR 0x34
+#define EISR_RWM 0x38
+#define EISR_MASK 0x3c
+
+#define LAPA 0x60
+#define LAPWWO 0x64
+#define LAPWWC 0x68
+#define LAPCTL 0x6C
+#define LAIPD 0x78
+#define LAIPDDINC 0x7C
+
+#define TIMER 0x50
+
+#define CLKCTL 0x74
+
+#define PM_CON 0x4
+
+#define BMCTL_SUM 0x40
+#define BMCTL_RWM 0x44
+#define BMCTL_TX2_DIS (1<<30)
+#define BMCTL_TX1_DIS (1<<26)
+#define BMCTL_RX_DIS (1<<22)
+
+#define BMASR 0xcc
+
+#define RXDESCQ 0x90
+#define RXDESCQCNT 0x94
+#define RXCDA 0x98
+#define RXENQ 0x9C
+#define RXSTATQ 0xA0
+#define RXSTATQCNT 0xA4
+#define RXCSA 0xA8
+#define RXCLEN 0xAC
+#define RXHLEN 0xAE
+
+#define TXDESCQ_1 0xb0
+#define TXDESCQ_2 0xd0
+#define TXDESCQCNT_1 0xb4
+#define TXDESCQCNT_2 0xd4
+#define TXCDA_1 0xb8
+#define TXCDA_2 0xd8
+#define TXENQ_1 0xbc
+#define TXENQ_2 0xdc
+#define TXSTATQ_1 0xc0
+#define TXSTATQ_2 0xe0
+#define TXSTATQCNT_1 0xc4
+#define TXSTATQCNT_2 0xe4
+#define TXCSA_1 0xc8
+#define TXCSA_2 0xe8
+
+#define OLYMPIC_IO_SPACE 256
+
+#define SRB_COMMAND_SIZE 50
+
+#define OLYMPIC_MAX_ADAPTERS 8 /* 0x08 __MODULE_STRING can't hand 0xnn */
+
+/* Defines for LAN STATUS CHANGE reports */
+#define LSC_SIG_LOSS 0x8000
+#define LSC_HARD_ERR 0x4000
+#define LSC_SOFT_ERR 0x2000
+#define LSC_TRAN_BCN 0x1000
+#define LSC_LWF 0x0800
+#define LSC_ARW 0x0400
+#define LSC_FPE 0x0200
+#define LSC_RR 0x0100
+#define LSC_CO 0x0080
+#define LSC_SS 0x0040
+#define LSC_RING_REC 0x0020
+#define LSC_SR_CO 0x0010
+#define LSC_FDX_MODE 0x0004
+
+/* Defines for OPEN ADAPTER command */
+
+#define OPEN_ADAPTER_EXT_WRAP (1<<15)
+#define OPEN_ADAPTER_DIS_HARDEE (1<<14)
+#define OPEN_ADAPTER_DIS_SOFTERR (1<<13)
+#define OPEN_ADAPTER_PASS_ADC_MAC (1<<12)
+#define OPEN_ADAPTER_PASS_ATT_MAC (1<<11)
+#define OPEN_ADAPTER_ENABLE_EC (1<<10)
+#define OPEN_ADAPTER_CONTENDER (1<<8)
+#define OPEN_ADAPTER_PASS_BEACON (1<<7)
+#define OPEN_ADAPTER_ENABLE_FDX (1<<6)
+#define OPEN_ADAPTER_ENABLE_RPL (1<<5)
+#define OPEN_ADAPTER_INHIBIT_ETR (1<<4)
+#define OPEN_ADAPTER_INTERNAL_WRAP (1<<3)
+#define OPEN_ADAPTER_USE_OPTS2 (1<<0)
+
+#define OPEN_ADAPTER_2_ENABLE_ONNOW (1<<15)
+
+/* Defines for SRB Commands */
+
+#define SRB_ACCESS_REGISTER 0x1f
+#define SRB_CLOSE_ADAPTER 0x04
+#define SRB_CONFIGURE_BRIDGE 0x0c
+#define SRB_CONFIGURE_WAKEUP_EVENT 0x1a
+#define SRB_MODIFY_BRIDGE_PARMS 0x15
+#define SRB_MODIFY_OPEN_OPTIONS 0x01
+#define SRB_MODIFY_RECEIVE_OPTIONS 0x17
+#define SRB_NO_OPERATION 0x00
+#define SRB_OPEN_ADAPTER 0x03
+#define SRB_READ_LOG 0x08
+#define SRB_READ_SR_COUNTERS 0x16
+#define SRB_RESET_GROUP_ADDRESS 0x02
+#define SRB_SAVE_CONFIGURATION 0x1b
+#define SRB_SET_BRIDGE_PARMS 0x09
+#define SRB_SET_BRIDGE_TARGETS 0x10
+#define SRB_SET_FUNC_ADDRESS 0x07
+#define SRB_SET_GROUP_ADDRESS 0x06
+#define SRB_SET_GROUP_ADDR_OPTIONS 0x11
+#define SRB_UPDATE_WAKEUP_PATTERN 0x19
+
+/* Clear return code */
+
+#define OLYMPIC_CLEAR_RET_CODE 0xfe
+
+/* ARB Commands */
+#define ARB_RECEIVE_DATA 0x81
+#define ARB_LAN_CHANGE_STATUS 0x84
+/* ASB Response commands */
+
+#define ASB_RECEIVE_DATA 0x81
+
+
+/* Olympic defaults for buffers */
+
+#define OLYMPIC_RX_RING_SIZE 16 /* should be a power of 2 */
+#define OLYMPIC_TX_RING_SIZE 8 /* should be a power of 2 */
+
+#define PKT_BUF_SZ 4096 /* Default packet size */
+
+/* Olympic data structures */
+
+struct olympic_tx_desc {
+ __u32 buffer;
+ __u32 status_length;
+};
+
+struct olympic_tx_status {
+ __u32 status;
+};
+
+struct olympic_rx_desc {
+ __u32 buffer;
+ __u32 res_length ;
+};
+
+struct olympic_rx_status {
+ __u32 fragmentcnt_framelen;
+ __u32 status_buffercnt;
+};
+
+struct mac_receive_buffer {
+ __u16 next ;
+ __u8 padding ;
+ __u8 frame_status ;
+ __u16 buffer_length ;
+ __u8 frame_data ;
+};
+
+struct olympic_private {
+
+ __u16 srb;
+ __u16 trb;
+ __u16 arb;
+ __u16 asb;
+
+ __u8 *olympic_mmio;
+ __u8 *olympic_lap;
+ char *olympic_card_name ;
+
+ volatile int srb_queued; /* True if an SRB is still posted */
+ wait_queue_head_t srb_wait;
+
+ volatile int asb_queued; /* True if an ASB is posted */
+
+ volatile int trb_queued; /* True if a TRB is posted */
+ wait_queue_head_t trb_wait ;
+
+ struct olympic_rx_desc olympic_rx_ring[OLYMPIC_RX_RING_SIZE];
+ struct olympic_tx_desc olympic_tx_ring[OLYMPIC_TX_RING_SIZE];
+ struct olympic_rx_status olympic_rx_status_ring[OLYMPIC_RX_RING_SIZE];
+ struct olympic_tx_status olympic_tx_status_ring[OLYMPIC_TX_RING_SIZE];
+ struct sk_buff *tx_ring_skb[OLYMPIC_TX_RING_SIZE], *rx_ring_skb[OLYMPIC_RX_RING_SIZE];
+ int tx_ring_free, tx_ring_last_status, rx_ring_last_received,rx_status_last_received, free_tx_ring_entries;
+
+ struct net_device_stats olympic_stats ;
+ __u16 olympic_lan_status ;
+ __u8 olympic_ring_speed ;
+ __u16 pkt_buf_sz ;
+ __u8 olympic_receive_options, olympic_copy_all_options, olympic_message_level;
+ __u8 olympic_multicast_set ;
+ __u16 olympic_addr_table_addr, olympic_parms_addr ;
+ __u8 olympic_laa[6] ;
+};
+
+struct olympic_adapter_addr_table {
+
+ __u8 node_addr[6] ;
+ __u8 reserved[4] ;
+ __u8 func_addr[4] ;
+} ;
+
+struct olympic_parameters_table {
+
+ __u8 phys_addr[4] ;
+ __u8 up_node_addr[6] ;
+ __u8 up_phys_addr[6] ;
+ __u8 poll_addr[6] ;
+ __u16 reserved ;
+ __u16 acc_priority ;
+ __u16 auth_source_class ;
+ __u16 att_code ;
+ __u8 source_addr[6] ;
+ __u16 beacon_type ;
+ __u16 major_vector ;
+ __u16 lan_status ;
+ __u16 soft_error_time ;
+ __u16 reserved1 ;
+ __u16 local_ring ;
+ __u16 mon_error ;
+ __u16 beacon_transmit ;
+ __u16 beacon_receive ;
+ __u16 frame_correl ;
+ __u8 beacon_naun[6] ;
+ __u32 reserved2 ;
+ __u8 beacon_phys[4] ;
+};
diff --git a/drivers/net/tokenring/sktr.c b/drivers/net/tokenring/sktr.c
new file mode 100644
index 000000000..81b2df4bc
--- /dev/null
+++ b/drivers/net/tokenring/sktr.c
@@ -0,0 +1,2707 @@
+/*
+ * sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters.
+ *
+ * Written 1997 by Christoph Goos
+ *
+ * A fine result of the Linux Systems Network Architecture Project.
+ * http://samba.anu.edu.au/linux-sna/
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU Public License, incorporated herein by reference.
+ *
+ * This device driver works with the following SysKonnect adapters:
+ * - SysKonnect TR4/16(+) ISA (SK-4190)
+ * - SysKonnect TR4/16(+) PCI (SK-4590)
+ * - SysKonnect TR4/16 PCI (SK-4591)
+ *
+ * Sources:
+ * - The hardware related parts of this driver are take from
+ * the SysKonnect Token Ring driver for Windows NT.
+ * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this
+ * driver, as well as the 'skeleton.c' driver by Donald Becker.
+ * - Also various other drivers in the linux source tree were taken
+ * as samples for some tasks.
+ *
+ * Maintainer(s):
+ * JS Jay Schulist jschlst@samba.anu.edu.au
+ * CG Christoph Goos cgoos@syskonnect.de
+ * AF Adam Fritzler mid@auk.cx
+ *
+ * Modification History:
+ * 29-Aug-97 CG Created
+ * 04-Apr-98 CG Fixed problems caused by tok_timer_check
+ * 10-Apr-98 CG Fixed lockups at cable disconnection
+ * 27-May-98 JS Formated to Linux Kernel Format
+ * 31-May-98 JS Hacked in PCI support
+ * 16-Jun-98 JS Modulized for multiple cards with one driver
+ * 21-Sep-99 CG Fixed source routing issues for 2.2 kernels
+ * 21-Sep-99 AF Added multicast changes recommended by
+ * Jochen Friedrich <jochen@nwe.de> (untested)
+ * Added detection of compatible Compaq PCI card
+ *
+ * To do:
+ * 1. Selectable 16 Mbps or 4Mbps
+ * 2. Multi/Broadcast packet handling (might be done)
+ *
+ */
+
+static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n";
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/in.h>
+#include <linux/malloc.h>
+#include <linux/string.h>
+#include <linux/time.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/irq.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/trdevice.h>
+
+#include "sktr.h" /* Our Stuff */
+#include "sktr_firmware.h" /* SysKonnect adapter firmware */
+
+/* A zero-terminated list of I/O addresses to be probed. */
+static unsigned int sktr_portlist[] __initdata = {
+ 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900,
+ 0
+};
+
+/* A zero-terminated list of IRQs to be probed.
+ * Used again after initial probe for sktr_chipset_init, called from sktr_open.
+ */
+static unsigned short sktr_irqlist[] = {
+ 3, 5, 9, 10, 11, 12, 15,
+ 0
+};
+
+/* A zero-terminated list of DMAs to be probed. */
+static int sktr_dmalist[] __initdata = {
+ 5, 6, 7,
+ 0
+};
+
+/* Card names */
+static char *pci_cardname = "SK NET TR 4/16 PCI\0";
+static char *isa_cardname = "SK NET TR 4/16 ISA\0";
+static char *AdapterName;
+
+/* Use 0 for production, 1 for verification, 2 for debug, and
+ * 3 for very verbose debug.
+ */
+#ifndef SKTR_DEBUG
+#define SKTR_DEBUG 1
+#endif
+static unsigned int sktr_debug = SKTR_DEBUG;
+
+/* The number of low I/O ports used by the tokencard. */
+#define SKTR_IO_EXTENT 32
+
+/* Index to functions, as function prototypes.
+ * Alphabetical by function name.
+ */
+
+/* "B" */
+static int sktr_bringup_diags(struct net_device *dev);
+/* "C" */
+static void sktr_cancel_tx_queue(struct net_local* tp);
+static int sktr_chipset_init(struct net_device *dev);
+static void sktr_chk_irq(struct net_device *dev);
+static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr);
+static void sktr_chk_outstanding_cmds(struct net_device *dev);
+static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
+static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType);
+static int sktr_close(struct net_device *dev);
+static void sktr_cmd_status_irq(struct net_device *dev);
+/* "D" */
+static void sktr_disable_interrupts(struct net_device *dev);
+static void sktr_dump(unsigned char *Data, int length);
+/* "E" */
+static void sktr_enable_interrupts(struct net_device *dev);
+static void sktr_exec_cmd(struct net_device *dev, unsigned short Command);
+static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue);
+/* "F" */
+/* "G" */
+static struct enet_statistics *sktr_get_stats(struct net_device *dev);
+/* "H" */
+static void sktr_hardware_send_packet(struct net_device *dev,
+ struct net_local* tp);
+/* "I" */
+static int sktr_init_adapter(struct net_device *dev);
+static int sktr_init_card(struct net_device *dev);
+static void sktr_init_ipb(struct net_local *tp);
+static void sktr_init_net_local(struct net_device *dev);
+static void sktr_init_opb(struct net_local *tp);
+static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static int sktr_isa_chk_card(struct net_device *dev, int ioaddr);
+static int sktr_isa_chk_ioaddr(int ioaddr);
+/* "O" */
+static int sktr_open(struct net_device *dev);
+static void sktr_open_adapter(struct net_device *dev);
+/* "P" */
+static int sktr_pci_chk_card(struct net_device *dev);
+int sktr_probe(struct net_device *dev);
+static int sktr_probe1(struct net_device *dev, int ioaddr);
+/* "R" */
+static void sktr_rcv_status_irq(struct net_device *dev);
+static void sktr_read_addr(struct net_device *dev, unsigned char *Address);
+static void sktr_read_ptr(struct net_device *dev);
+static void sktr_read_ram(struct net_device *dev, unsigned char *Data,
+ unsigned short Address, int Length);
+static int sktr_reset_adapter(struct net_device *dev);
+static void sktr_reset_interrupt(struct net_device *dev);
+static void sktr_ring_status_irq(struct net_device *dev);
+/* "S" */
+static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev);
+static void sktr_set_multicast_list(struct net_device *dev);
+/* "T" */
+static void sktr_timer_chk(unsigned long data);
+static void sktr_timer_end_wait(unsigned long data);
+static void sktr_tx_status_irq(struct net_device *dev);
+/* "U" */
+static void sktr_update_rcv_stats(struct net_local *tp,
+ unsigned char DataPtr[], unsigned int Length);
+/* "W" */
+static void sktr_wait(unsigned long time);
+static void sktr_write_rpl_status(RPL *rpl, unsigned int Status);
+static void sktr_write_tpl_status(TPL *tpl, unsigned int Status);
+
+/*
+ * Check for a network adapter of this type, and return '0' if one exists.
+ * If dev->base_addr == 0, probe all likely locations.
+ * If dev->base_addr == 1, always return failure.
+ */
+int __init sktr_probe(struct net_device *dev)
+{
+ int i;
+ int base_addr = dev ? dev->base_addr : 0;
+
+ if(base_addr > 0x1ff) /* Check a single specified location. */
+ return (sktr_probe1(dev, base_addr));
+ else if(base_addr != 0) /* Don't probe at all. */
+ return (-ENXIO);
+
+ for(i = 0; sktr_portlist[i]; i++)
+ {
+ int ioaddr = sktr_portlist[i];
+ if(check_region(ioaddr, SKTR_IO_EXTENT))
+ continue;
+ if(sktr_probe1(dev, ioaddr))
+ {
+#ifndef MODULE
+ tr_freedev(dev);
+#endif
+ }
+ else
+ return (0);
+ }
+
+ return (-ENODEV);
+}
+
+/*
+ * Detect and setup the PCI SysKonnect TR cards in slot order.
+ */
+static int __init sktr_pci_chk_card(struct net_device *dev)
+{
+ static int pci_index = 0;
+ unsigned char pci_bus, pci_device_fn;
+
+ if(!pci_present())
+ return (-1); /* No PCI present. */
+
+ for(; pci_index < 0xff; pci_index++)
+ {
+ unsigned int pci_irq_line;
+ struct pci_dev *pdev;
+ unsigned short pci_command, new_command, vendor, device;
+ unsigned int pci_ioaddr;
+
+ if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8,
+ pci_index, &pci_bus, &pci_device_fn)
+ != PCIBIOS_SUCCESSFUL)
+ {
+ break;
+ }
+
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_VENDOR_ID, &vendor);
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_DEVICE_ID, &device);
+
+ pdev = pci_find_slot(pci_bus, pci_device_fn);
+ pci_irq_line = pdev->irq;
+ pci_ioaddr = pdev->resource[0].start;
+
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, &pci_command);
+
+ /* Remove I/O space marker in bit 0. */
+ pci_ioaddr &= ~3;
+
+ if((vendor != PCI_VENDOR_ID_SK) &&
+ (vendor != PCI_VENDOR_ID_COMPAQ))
+ continue;
+
+ if((vendor == PCI_VENDOR_ID_SK) &&
+ (device != PCI_DEVICE_ID_SK_TR))
+ continue;
+ else if((vendor == PCI_VENDOR_ID_COMPAQ) &&
+ (device != PCI_DEVICE_ID_COMPAQ_TOKENRING))
+ continue;
+
+ if(check_region(pci_ioaddr, SKTR_IO_EXTENT))
+ continue;
+ request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname);
+ if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ,
+ pci_cardname, dev))
+ return (-ENODEV); /* continue; ?? */
+
+ AdapterName = pci_cardname;
+
+ new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO);
+
+ if(pci_command != new_command)
+ {
+ printk("The PCI BIOS has not enabled this"
+ "device! Updating PCI command %4.4x->%4.4x.\n",
+ pci_command, new_command);
+ pcibios_write_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, new_command);
+ }
+
+ /* At this point we have found a valid PCI TR card. */
+ dev->base_addr = pci_ioaddr;
+ dev->irq = pci_irq_line;
+ dev->dma = 0;
+
+ printk("%s: %s found at %#4x, using IRQ %d.\n",
+ dev->name, AdapterName, pci_ioaddr, dev->irq);
+
+ return (0);
+ }
+
+ return (-1);
+}
+
+/*
+ * Detect and setup the ISA SysKonnect TR cards.
+ */
+static int __init sktr_isa_chk_card(struct net_device *dev, int ioaddr)
+{
+ int i, err;
+ unsigned long flags;
+
+ err = sktr_isa_chk_ioaddr(ioaddr);
+ if(err < 0)
+ return (-ENODEV);
+
+ if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local)))
+ > ISA_MAX_ADDRESS)
+ {
+ printk("%s: Memory not accessible for DMA\n", dev->name);
+ kfree(dev->priv);
+ return (-EAGAIN);
+ }
+
+ AdapterName = isa_cardname;
+
+ /* Grab the region so that no one else tries to probe our ioports. */
+ request_region(ioaddr, SKTR_IO_EXTENT, AdapterName);
+ dev->base_addr = ioaddr;
+
+ /* Autoselect IRQ and DMA if dev->irq == 0 */
+ if(dev->irq == 0)
+ {
+ for(i = 0; sktr_irqlist[i] != 0; i++)
+ {
+ dev->irq = sktr_irqlist[i];
+ err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
+ if(!err)
+ break;
+ }
+
+ if(sktr_irqlist[i] == 0)
+ {
+ printk("%s: AutoSelect no IRQ available\n", dev->name);
+ return (-EAGAIN);
+ }
+ }
+ else
+ {
+ err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
+ if(err)
+ {
+ printk("%s: Selected IRQ not available\n", dev->name);
+ return (-EAGAIN);
+ }
+ }
+
+ /* Always allocate the DMA channel after IRQ and clean up on failure */
+ if(dev->dma == 0)
+ {
+ for(i = 0; sktr_dmalist[i] != 0; i++)
+ {
+ dev->dma = sktr_dmalist[i];
+ err = request_dma(dev->dma, AdapterName);
+ if(!err)
+ break;
+ }
+
+ if(dev->dma == 0)
+ {
+ printk("%s: AutoSelect no DMA available\n", dev->name);
+ free_irq(dev->irq, NULL);
+ return (-EAGAIN);
+ }
+ }
+ else
+ {
+ err = request_dma(dev->dma, AdapterName);
+ if(err)
+ {
+ printk("%s: Selected DMA not available\n", dev->name);
+ free_irq(dev->irq, NULL);
+ return (-EAGAIN);
+ }
+ }
+
+ flags=claim_dma_lock();
+ disable_dma(dev->dma);
+ set_dma_mode(dev->dma, DMA_MODE_CASCADE);
+ enable_dma(dev->dma);
+ release_dma_lock(flags);
+
+ printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n",
+ dev->name, AdapterName, ioaddr, dev->irq, dev->dma);
+
+ return (0);
+}
+
+static int __init sktr_probe1(struct net_device *dev, int ioaddr)
+{
+ static unsigned version_printed = 0;
+ struct net_local *tp;
+ int DeviceType = SK_PCI;
+ int err;
+
+ if(sktr_debug && version_printed++ == 0)
+ printk("%s", version);
+
+#ifndef MODULE
+ dev = init_trdev(dev, 0);
+ if(dev == NULL)
+ return (-ENOMEM);
+#endif
+
+ err = sktr_pci_chk_card(dev);
+ if(err < 0)
+ {
+ err = sktr_isa_chk_card(dev, ioaddr);
+ if(err < 0)
+ return (-ENODEV);
+ DeviceType = SK_ISA;
+ }
+
+ /* Setup this devices private information structure */
+ tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
+ if(tp == NULL)
+ return (-ENOMEM);
+ memset(tp, 0, sizeof(struct net_local));
+ tp->DeviceType = DeviceType;
+ init_waitqueue_head(&tp->wait_for_tok_int);
+
+ dev->priv = tp;
+ dev->init = sktr_init_card;
+ dev->open = sktr_open;
+ dev->stop = sktr_close;
+ dev->hard_start_xmit = sktr_send_packet;
+ dev->get_stats = sktr_get_stats;
+ dev->set_multicast_list = &sktr_set_multicast_list;
+
+ return (0);
+}
+
+/* Dummy function */
+static int __init sktr_init_card(struct net_device *dev)
+{
+ if(sktr_debug > 3)
+ printk("%s: sktr_init_card\n", dev->name);
+
+ return (0);
+}
+
+/*
+ * This function tests if an adapter is really installed at the
+ * given I/O address. Return negative if no adapter at IO addr.
+ */
+static int __init sktr_isa_chk_ioaddr(int ioaddr)
+{
+ unsigned char old, chk1, chk2;
+
+ old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */
+
+ chk1 = 0; /* Begin with check value 0 */
+ do {
+ /* Write new SIFADR value */
+ outb(chk1, ioaddr + SIFADR);
+
+ /* Read, invert and write */
+ chk2 = inb(ioaddr + SIFADD);
+ chk2 ^= 0x0FE;
+ outb(chk2, ioaddr + SIFADR);
+
+ /* Read, invert and compare */
+ chk2 = inb(ioaddr + SIFADD);
+ chk2 ^= 0x0FE;
+
+ if(chk1 != chk2)
+ return (-1); /* No adapter */
+
+ chk1 -= 2;
+ } while(chk1 != 0); /* Repeat 128 times (all byte values) */
+
+ /* Restore the SIFADR value */
+ outb(old, ioaddr + SIFADR);
+
+ return (0);
+}
+
+/*
+ * Open/initialize the board. This is called sometime after
+ * booting when the 'ifconfig' program is run.
+ *
+ * This routine should set everything up anew at each open, even
+ * registers that "should" only need to be set once at boot, so that
+ * there is non-reboot way to recover if something goes wrong.
+ */
+static int sktr_open(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ int err;
+
+ /* Reset the hardware here. Don't forget to set the station address. */
+ err = sktr_chipset_init(dev);
+ if(err)
+ {
+ printk(KERN_INFO "%s: Chipset initialization error\n",
+ dev->name);
+ return (-1);
+ }
+
+ dev->addr_len = 6;
+ sktr_read_addr(dev, (unsigned char*)dev->dev_addr);
+
+ init_timer(&tp->timer);
+ tp->timer.expires = jiffies + 30*HZ;
+ tp->timer.function = sktr_timer_end_wait;
+ tp->timer.data = (unsigned long)dev;
+ tp->timer.next = NULL;
+ tp->timer.prev = NULL;
+ add_timer(&tp->timer);
+
+ sktr_read_ptr(dev);
+ sktr_enable_interrupts(dev);
+ sktr_open_adapter(dev);
+
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 0;
+
+ /* Wait for interrupt from hardware. If interrupt does not come,
+ * there will be a timeout from the timer.
+ */
+ tp->Sleeping = 1;
+ interruptible_sleep_on(&tp->wait_for_tok_int);
+ del_timer(&tp->timer);
+
+ /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
+ if(tp->AdapterVirtOpenFlag == 0)
+ {
+ sktr_disable_interrupts(dev);
+ return (-1);
+ }
+
+ dev->start = 1;
+
+ tp->StartTime = jiffies;
+
+ /* Start function control timer */
+ tp->timer.expires = jiffies + 2*HZ;
+ tp->timer.function = sktr_timer_chk;
+ tp->timer.data = (unsigned long)dev;
+ add_timer(&tp->timer);
+
+#ifdef MODULE
+ MOD_INC_USE_COUNT;
+#endif
+
+ return (0);
+}
+
+/*
+ * Timeout function while waiting for event
+ */
+static void sktr_timer_end_wait(unsigned long data)
+{
+ struct net_device *dev = (struct net_device*)data;
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ if(tp->Sleeping)
+ {
+ tp->Sleeping = 0;
+ wake_up_interruptible(&tp->wait_for_tok_int);
+ }
+
+ return;
+}
+
+/*
+ * Initialize the chipset
+ */
+static int sktr_chipset_init(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned char PosReg, Tmp;
+ int i, err;
+
+ sktr_init_ipb(tp);
+ sktr_init_opb(tp);
+ sktr_init_net_local(dev);
+
+ /* Set pos register: selects irq and dma channel.
+ * Only for ISA bus adapters.
+ */
+ if(dev->dma > 0)
+ {
+ PosReg = 0;
+ for(i = 0; sktr_irqlist[i] != 0; i++)
+ {
+ if(sktr_irqlist[i] == dev->irq)
+ break;
+ }
+
+ /* Choose default cycle time, 500 nsec */
+ PosReg |= CYCLE_TIME << 2;
+ PosReg |= i << 4;
+ i = dev->dma - 5;
+ PosReg |= i;
+
+ if(tp->DataRate == SPEED_4)
+ PosReg |= LINE_SPEED_BIT;
+ else
+ PosReg &= ~LINE_SPEED_BIT;
+
+ outb(PosReg, dev->base_addr + POSREG);
+ Tmp = inb(dev->base_addr + POSREG);
+ if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME))
+ printk(KERN_INFO "%s: POSREG error\n", dev->name);
+ }
+
+ err = sktr_reset_adapter(dev);
+ if(err < 0)
+ return (-1);
+
+ err = sktr_bringup_diags(dev);
+ if(err < 0)
+ return (-1);
+
+ err = sktr_init_adapter(dev);
+ if(err < 0)
+ return (-1);
+
+ return (0);
+}
+
+/*
+ * Initializes the net_local structure.
+ */
+static void sktr_init_net_local(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ int i;
+
+ tp->scb.CMD = 0;
+ tp->scb.Parm[0] = 0;
+ tp->scb.Parm[1] = 0;
+
+ tp->ssb.STS = 0;
+ tp->ssb.Parm[0] = 0;
+ tp->ssb.Parm[1] = 0;
+ tp->ssb.Parm[2] = 0;
+
+ tp->CMDqueue = 0;
+
+ tp->AdapterOpenFlag = 0;
+ tp->AdapterVirtOpenFlag = 0;
+ tp->ScbInUse = 0;
+ tp->OpenCommandIssued = 0;
+ tp->ReOpenInProgress = 0;
+ tp->HaltInProgress = 0;
+ tp->TransmitHaltScheduled = 0;
+ tp->LobeWireFaultLogged = 0;
+ tp->LastOpenStatus = 0;
+ tp->MaxPacketSize = DEFAULT_PACKET_SIZE;
+
+ skb_queue_head_init(&tp->SendSkbQueue);
+ tp->QueueSkb = MAX_TX_QUEUE;
+
+ /* Create circular chain of transmit lists */
+ for (i = 0; i < TPL_NUM; i++)
+ {
+ tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM]));
+ tp->Tpl[i].Status = 0;
+ tp->Tpl[i].FrameSize = 0;
+ tp->Tpl[i].FragList[0].DataCount = 0;
+ tp->Tpl[i].FragList[0].DataAddr = 0;
+ tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM];
+ tp->Tpl[i].MData = NULL;
+ tp->Tpl[i].TPLIndex = i;
+ tp->Tpl[i].BusyFlag = 0;
+ }
+
+ tp->TplFree = tp->TplBusy = &tp->Tpl[0];
+
+ /* Create circular chain of receive lists */
+ for (i = 0; i < RPL_NUM; i++)
+ {
+ tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM]));
+ tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+ tp->Rpl[i].FrameSize = 0;
+ tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+
+ /* Alloc skb and point adapter to data area */
+ tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+ /* skb == NULL ? then use local buffer */
+ if(tp->Rpl[i].Skb == NULL)
+ {
+ tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
+ tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+ tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+ }
+ else /* SKB != NULL */
+ {
+ tp->Rpl[i].Skb->dev = dev;
+ skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
+
+ /* data unreachable for DMA ? then use local buffer */
+ if(tp->DeviceType == SK_ISA &&
+ virt_to_bus(tp->Rpl[i].Skb->data) +
+ tp->MaxPacketSize > ISA_MAX_ADDRESS)
+ {
+ tp->Rpl[i].SkbStat = SKB_DATA_COPY;
+ tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+ tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+ }
+ else /* DMA directly in skb->data */
+ {
+ tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
+ tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data));
+ tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
+ }
+ }
+
+ tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
+ tp->Rpl[i].RPLIndex = i;
+ }
+
+ tp->RplHead = &tp->Rpl[0];
+ tp->RplTail = &tp->Rpl[RPL_NUM-1];
+ tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+
+ return;
+}
+
+/*
+ * Initializes the initialisation parameter block.
+ */
+static void sktr_init_ipb(struct net_local *tp)
+{
+ tp->ipb.Init_Options = BURST_MODE;
+ tp->ipb.CMD_Status_IV = 0;
+ tp->ipb.TX_IV = 0;
+ tp->ipb.RX_IV = 0;
+ tp->ipb.Ring_Status_IV = 0;
+ tp->ipb.SCB_Clear_IV = 0;
+ tp->ipb.Adapter_CHK_IV = 0;
+ tp->ipb.RX_Burst_Size = BURST_SIZE;
+ tp->ipb.TX_Burst_Size = BURST_SIZE;
+ tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
+ tp->ipb.SCB_Addr = 0;
+ tp->ipb.SSB_Addr = 0;
+
+ return;
+}
+
+/*
+ * Initializes the open parameter block.
+ */
+static void sktr_init_opb(struct net_local *tp)
+{
+ unsigned long Addr;
+ unsigned short RplSize = RPL_SIZE;
+ unsigned short TplSize = TPL_SIZE;
+ unsigned short BufferSize = BUFFER_SIZE;
+
+ tp->ocpl.OPENOptions = 0;
+ tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION;
+/* tp->ocpl.OPENOptions |= PAD_ROUTING_FIELD; no more needed */
+ tp->ocpl.FullDuplex = 0;
+ tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF;
+
+ /* Fixme: If mac address setable:
+ * for (i=0; i<LENGTH_OF_ADDRESS; i++)
+ * mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i];
+ */
+
+ tp->ocpl.GroupAddr = 0;
+ tp->ocpl.FunctAddr = 0;
+ tp->ocpl.RxListSize = SWAPB(RplSize);
+ tp->ocpl.TxListSize = SWAPB(TplSize);
+ tp->ocpl.BufSize = SWAPB(BufferSize);
+ tp->ocpl.Reserved = 0;
+ tp->ocpl.TXBufMin = TX_BUF_MIN;
+ tp->ocpl.TXBufMax = TX_BUF_MAX;
+
+ Addr = htonl(virt_to_bus(tp->ProductID));
+
+ tp->ocpl.ProdIDAddr[0] = LOWORD(Addr);
+ tp->ocpl.ProdIDAddr[1] = HIWORD(Addr);
+
+ return;
+}
+
+/*
+ * Send OPEN command to adapter
+ */
+static void sktr_open_adapter(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ if(tp->OpenCommandIssued)
+ return;
+
+ tp->OpenCommandIssued = 1;
+ sktr_exec_cmd(dev, OC_OPEN);
+
+ return;
+}
+
+/*
+ * Clear the adapter's interrupt flag. Clear system interrupt enable
+ * (SINTEN): disable adapter to system interrupts.
+ */
+static void sktr_disable_interrupts(struct net_device *dev)
+{
+ outb(0, dev->base_addr + SIFACL);
+
+ return;
+}
+
+/*
+ * Set the adapter's interrupt flag. Set system interrupt enable
+ * (SINTEN): enable adapter to system interrupts.
+ */
+static void sktr_enable_interrupts(struct net_device *dev)
+{
+ outb(ACL_SINTEN, dev->base_addr + SIFACL);
+
+ return;
+}
+
+/*
+ * Put command in command queue, try to execute it.
+ */
+static void sktr_exec_cmd(struct net_device *dev, unsigned short Command)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ tp->CMDqueue |= Command;
+ sktr_chk_outstanding_cmds(dev);
+
+ return;
+}
+
+/*
+ * Gets skb from system, queues it and checks if it can be sent
+ */
+static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ if(dev->tbusy)
+ {
+ /*
+ * If we get here, some higher level has decided we are broken.
+ * There should really be a "kick me" function call instead.
+ *
+ * Resetting the token ring adapter takes a long time so just
+ * fake transmission time and go on trying. Our own timeout
+ * routine is in sktr_timer_chk()
+ */
+ dev->tbusy = 0;
+ dev->trans_start = jiffies;
+ return (1);
+ }
+
+ /*
+ * If some higher layer thinks we've missed an tx-done interrupt we
+ * are passed NULL.
+ */
+ if(skb == NULL)
+ return (0);
+
+ /*
+ * Block a timer-based transmit from overlapping. This could better be
+ * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
+ */
+ if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
+ {
+ printk("%s: Transmitter access conflict.\n", dev->name);
+ return (1);
+ }
+
+ if(tp->QueueSkb == 0)
+ return (1); /* Return with tbusy set: queue full */
+
+ tp->QueueSkb--;
+ skb_queue_tail(&tp->SendSkbQueue, skb);
+ sktr_hardware_send_packet(dev, tp);
+ if(tp->QueueSkb > 0)
+ dev->tbusy = 0;
+
+ return (0);
+}
+
+/*
+ * Move frames from internal skb queue into adapter tx queue
+ */
+static void sktr_hardware_send_packet(struct net_device *dev, struct net_local* tp)
+{
+ TPL *tpl;
+ short length;
+ unsigned char *buf, *newbuf;
+ struct sk_buff *skb;
+ int i;
+
+ for(;;)
+ {
+ /* Try to get a free TPL from the chain.
+ *
+ * NOTE: We *must* always leave one unused TPL in the chain,
+ * because otherwise the adapter might send frames twice.
+ */
+ if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */
+ {
+ printk(KERN_INFO "%s: No free TPL\n", dev->name);
+ return;
+ }
+
+ /* Send first buffer from queue */
+ skb = skb_dequeue(&tp->SendSkbQueue);
+ if(skb == NULL)
+ return;
+
+ tp->QueueSkb++;
+ /* Is buffer reachable for Busmaster-DMA? */
+ if(tp->DeviceType == SK_ISA &&
+ virt_to_bus((void*)(((long) skb->data) + skb->len))
+ > ISA_MAX_ADDRESS)
+ {
+ /* Copy frame to local buffer */
+ i = tp->TplFree->TPLIndex;
+ length = skb->len;
+ buf = tp->LocalTxBuffers[i];
+ memcpy(buf, skb->data, length);
+ newbuf = buf;
+ }
+ else
+ {
+ /* Send direct from skb->data */
+ length = skb->len;
+ newbuf = skb->data;
+ }
+
+ /* Source address in packet? */
+ sktr_chk_src_addr(newbuf, dev->dev_addr);
+
+ tp->LastSendTime = jiffies;
+ tpl = tp->TplFree; /* Get the "free" TPL */
+ tpl->BusyFlag = 1; /* Mark TPL as busy */
+ tp->TplFree = tpl->NextTPLPtr;
+
+ /* Save the skb for delayed return of skb to system */
+ tpl->Skb = skb;
+ tpl->FragList[0].DataCount = (unsigned short) SWAPB(length);
+ tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf));
+
+ /* Write the data length in the transmit list. */
+ tpl->FrameSize = (unsigned short) SWAPB(length);
+ tpl->MData = newbuf;
+
+ /* Transmit the frame and set the status values. */
+ sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
+ | TX_END_FRAME | TX_PASS_SRC_ADDR
+ | TX_FRAME_IRQ);
+
+ /* Let adapter send the frame. */
+ sktr_exec_sifcmd(dev, CMD_TX_VALID);
+ }
+
+ return;
+}
+
+/*
+ * Write the given value to the 'Status' field of the specified TPL.
+ * NOTE: This function should be used whenever the status of any TPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the TPL status may be executed at
+ * an undesireable time. When this function is used, the status is always
+ * written when the function is called.
+ */
+static void sktr_write_tpl_status(TPL *tpl, unsigned int Status)
+{
+ tpl->Status = Status;
+}
+
+static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
+{
+ unsigned char SRBit;
+
+ if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */
+ return;
+ if((unsigned short)frame[12] != 0) /* Compare 2 bytes */
+ return;
+
+ SRBit = frame[8] & 0x80;
+ memcpy(&frame[8], hw_addr, 6);
+ frame[8] |= SRBit;
+
+ return;
+}
+
+/*
+ * The timer routine: Check if adapter still open and working, reopen if not.
+ */
+static void sktr_timer_chk(unsigned long data)
+{
+ struct net_device *dev = (struct net_device*)data;
+ struct net_local *tp = (struct net_local*)dev->priv;
+
+ if(tp->HaltInProgress)
+ return;
+
+ sktr_chk_outstanding_cmds(dev);
+ if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
+ && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
+ {
+ /* Anything to send, but stalled to long */
+ tp->LastSendTime = jiffies;
+ sktr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */
+ }
+
+ tp->timer.expires = jiffies + 2*HZ;
+ add_timer(&tp->timer);
+
+ if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
+ return;
+ tp->ReOpenInProgress = 1;
+ sktr_open_adapter(dev);
+
+ return;
+}
+
+/*
+ * The typical workload of the driver: Handle the network interface interrupts.
+ */
+static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ struct net_device *dev = dev_id;
+ struct net_local *tp;
+ int ioaddr;
+ unsigned short irq_type;
+
+ if(dev == NULL)
+ {
+ printk("%s: irq %d for unknown device.\n", dev->name, irq);
+ return;
+ }
+
+ dev->interrupt = 1;
+
+ ioaddr = dev->base_addr;
+ tp = (struct net_local *)dev->priv;
+
+ irq_type = inw(ioaddr + SIFSTS);
+
+ while(irq_type & STS_SYSTEM_IRQ)
+ {
+ irq_type &= STS_IRQ_MASK;
+
+ if(!sktr_chk_ssb(tp, irq_type))
+ {
+ printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name);
+ break;
+ }
+
+ switch(irq_type)
+ {
+ case STS_IRQ_RECEIVE_STATUS:
+ sktr_reset_interrupt(dev);
+ sktr_rcv_status_irq(dev);
+ break;
+
+ case STS_IRQ_TRANSMIT_STATUS:
+ /* Check if TRANSMIT.HALT command is complete */
+ if(tp->ssb.Parm[0] & COMMAND_COMPLETE)
+ {
+ tp->TransmitCommandActive = 0;
+ tp->TransmitHaltScheduled = 0;
+
+ /* Issue a new transmit command. */
+ sktr_exec_cmd(dev, OC_TRANSMIT);
+ }
+
+ sktr_reset_interrupt(dev);
+ sktr_tx_status_irq(dev);
+ break;
+
+ case STS_IRQ_COMMAND_STATUS:
+ /* The SSB contains status of last command
+ * other than receive/transmit.
+ */
+ sktr_cmd_status_irq(dev);
+ break;
+
+ case STS_IRQ_SCB_CLEAR:
+ /* The SCB is free for another command. */
+ tp->ScbInUse = 0;
+ sktr_chk_outstanding_cmds(dev);
+ break;
+
+ case STS_IRQ_RING_STATUS:
+ sktr_ring_status_irq(dev);
+ break;
+
+ case STS_IRQ_ADAPTER_CHECK:
+ sktr_chk_irq(dev);
+ break;
+
+ default:
+ printk(KERN_INFO "Unknown Token Ring IRQ\n");
+ break;
+ }
+
+ /* Reset system interrupt if not already done. */
+ if(irq_type != STS_IRQ_TRANSMIT_STATUS
+ && irq_type != STS_IRQ_RECEIVE_STATUS)
+ {
+ sktr_reset_interrupt(dev);
+ }
+
+ irq_type = inw(ioaddr + SIFSTS);
+ }
+
+ dev->interrupt = 0;
+
+ return;
+}
+
+/*
+ * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
+ */
+static void sktr_reset_interrupt(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ SSB *ssb = &tp->ssb;
+
+ /*
+ * [Workaround for "Data Late"]
+ * Set all fields of the SSB to well-defined values so we can
+ * check if the adapter has written the SSB.
+ */
+
+ ssb->STS = (unsigned short) -1;
+ ssb->Parm[0] = (unsigned short) -1;
+ ssb->Parm[1] = (unsigned short) -1;
+ ssb->Parm[2] = (unsigned short) -1;
+
+ /* Free SSB by issuing SSB_CLEAR command after reading IRQ code
+ * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
+ */
+ sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
+
+ return;
+}
+
+/*
+ * Check if the SSB has actually been written by the adapter.
+ */
+static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType)
+{
+ SSB *ssb = &tp->ssb; /* The address of the SSB. */
+
+ /* C 0 1 2 INTERRUPT CODE
+ * - - - - --------------
+ * 1 1 1 1 TRANSMIT STATUS
+ * 1 1 1 1 RECEIVE STATUS
+ * 1 ? ? 0 COMMAND STATUS
+ * 0 0 0 0 SCB CLEAR
+ * 1 1 0 0 RING STATUS
+ * 0 0 0 0 ADAPTER CHECK
+ *
+ * 0 = SSB field not affected by interrupt
+ * 1 = SSB field is affected by interrupt
+ *
+ * C = SSB ADDRESS +0: COMMAND
+ * 0 = SSB ADDRESS +2: STATUS 0
+ * 1 = SSB ADDRESS +4: STATUS 1
+ * 2 = SSB ADDRESS +6: STATUS 2
+ */
+
+ /* Check if this interrupt does use the SSB. */
+
+ if(IrqType != STS_IRQ_TRANSMIT_STATUS
+ && IrqType != STS_IRQ_RECEIVE_STATUS
+ && IrqType != STS_IRQ_COMMAND_STATUS
+ && IrqType != STS_IRQ_RING_STATUS)
+ {
+ return (1); /* SSB not involved. */
+ }
+
+ /* Note: All fields of the SSB have been set to all ones (-1) after it
+ * has last been used by the software (see DriverIsr()).
+ *
+ * Check if the affected SSB fields are still unchanged.
+ */
+
+ if(ssb->STS == (unsigned short) -1)
+ return (0); /* Command field not yet available. */
+ if(IrqType == STS_IRQ_COMMAND_STATUS)
+ return (1); /* Status fields not always affected. */
+ if(ssb->Parm[0] == (unsigned short) -1)
+ return (0); /* Status 1 field not yet available. */
+ if(IrqType == STS_IRQ_RING_STATUS)
+ return (1); /* Status 2 & 3 fields not affected. */
+
+ /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
+ if(ssb->Parm[1] == (unsigned short) -1)
+ return (0); /* Status 2 field not yet available. */
+ if(ssb->Parm[2] == (unsigned short) -1)
+ return (0); /* Status 3 field not yet available. */
+
+ return (1); /* All SSB fields have been written by the adapter. */
+}
+
+/*
+ * Evaluates the command results status in the SSB status field.
+ */
+static void sktr_cmd_status_irq(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned short ssb_cmd, ssb_parm_0;
+ unsigned short ssb_parm_1;
+ char *open_err = "Open error -";
+ char *code_err = "Open code -";
+
+ /* Copy the ssb values to local variables */
+ ssb_cmd = tp->ssb.STS;
+ ssb_parm_0 = tp->ssb.Parm[0];
+ ssb_parm_1 = tp->ssb.Parm[1];
+
+ if(ssb_cmd == OPEN)
+ {
+ tp->Sleeping = 0;
+ if(!tp->ReOpenInProgress)
+ wake_up_interruptible(&tp->wait_for_tok_int);
+
+ tp->OpenCommandIssued = 0;
+ tp->ScbInUse = 0;
+
+ if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
+ {
+ /* Success, the adapter is open. */
+ tp->LobeWireFaultLogged = 0;
+ tp->AdapterOpenFlag = 1;
+ tp->AdapterVirtOpenFlag = 1;
+ tp->TransmitCommandActive = 0;
+ sktr_exec_cmd(dev, OC_TRANSMIT);
+ sktr_exec_cmd(dev, OC_RECEIVE);
+
+ if(tp->ReOpenInProgress)
+ tp->ReOpenInProgress = 0;
+
+ return;
+ }
+ else /* The adapter did not open. */
+ {
+ if(ssb_parm_0 & NODE_ADDR_ERROR)
+ printk(KERN_INFO "%s: Node address error\n",
+ dev->name);
+ if(ssb_parm_0 & LIST_SIZE_ERROR)
+ printk(KERN_INFO "%s: List size error\n",
+ dev->name);
+ if(ssb_parm_0 & BUF_SIZE_ERROR)
+ printk(KERN_INFO "%s: Buffer size error\n",
+ dev->name);
+ if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
+ printk(KERN_INFO "%s: Tx buffer count error\n",
+ dev->name);
+ if(ssb_parm_0 & INVALID_OPEN_OPTION)
+ printk(KERN_INFO "%s: Invalid open option\n",
+ dev->name);
+ if(ssb_parm_0 & OPEN_ERROR)
+ {
+ /* Show the open phase. */
+ switch(ssb_parm_0 & OPEN_PHASES_MASK)
+ {
+ case LOBE_MEDIA_TEST:
+ if(!tp->LobeWireFaultLogged)
+ {
+ tp->LobeWireFaultLogged = 1;
+ printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err);
+ }
+ tp->ReOpenInProgress = 1;
+ tp->AdapterOpenFlag = 0;
+ tp->AdapterVirtOpenFlag = 1;
+ sktr_open_adapter(dev);
+ return;
+
+ case PHYSICAL_INSERTION:
+ printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err);
+ break;
+
+ case ADDRESS_VERIFICATION:
+ printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err);
+ break;
+
+ case PARTICIPATION_IN_RING_POLL:
+ printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err);
+ break;
+
+ case REQUEST_INITIALISATION:
+ printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err);
+ break;
+
+ case FULLDUPLEX_CHECK:
+ printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err);
+ break;
+
+ default:
+ printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err);
+ break;
+ }
+
+ /* Show the open errors. */
+ switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
+ {
+ case OPEN_FUNCTION_FAILURE:
+ printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_FUNCTION_FAILURE;
+ break;
+
+ case OPEN_SIGNAL_LOSS:
+ printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_SIGNAL_LOSS;
+ break;
+
+ case OPEN_TIMEOUT:
+ printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_TIMEOUT;
+ break;
+
+ case OPEN_RING_FAILURE:
+ printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_RING_FAILURE;
+ break;
+
+ case OPEN_RING_BEACONING:
+ printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_RING_BEACONING;
+ break;
+
+ case OPEN_DUPLICATE_NODEADDR:
+ printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_DUPLICATE_NODEADDR;
+ break;
+
+ case OPEN_REQUEST_INIT:
+ printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_REQUEST_INIT;
+ break;
+
+ case OPEN_REMOVE_RECEIVED:
+ printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_REMOVE_RECEIVED;
+ break;
+
+ case OPEN_FULLDUPLEX_SET:
+ printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_FULLDUPLEX_SET;
+ break;
+
+ default:
+ printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
+ tp->LastOpenStatus =
+ OPEN_FUNCTION_FAILURE;
+ break;
+ }
+ }
+
+ tp->AdapterOpenFlag = 0;
+ tp->AdapterVirtOpenFlag = 0;
+
+ return;
+ }
+ }
+ else
+ {
+ if(ssb_cmd != READ_ERROR_LOG)
+ return;
+
+ /* Add values from the error log table to the MAC
+ * statistics counters and update the errorlogtable
+ * memory.
+ */
+ tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
+ tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
+ tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
+ tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
+ tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
+ tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
+ tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
+ tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
+ tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
+ tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
+ tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
+ tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
+ tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
+ }
+
+ return;
+}
+
+/*
+ * The inverse routine to sktr_open().
+ */
+static int sktr_close(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ dev->tbusy = 1;
+ dev->start = 0;
+
+ del_timer(&tp->timer);
+
+ /* Flush the Tx and disable Rx here. */
+
+ tp->HaltInProgress = 1;
+ sktr_exec_cmd(dev, OC_CLOSE);
+ tp->timer.expires = jiffies + 1*HZ;
+ tp->timer.function = sktr_timer_end_wait;
+ tp->timer.data = (unsigned long)dev;
+ add_timer(&tp->timer);
+
+ sktr_enable_interrupts(dev);
+
+ tp->Sleeping = 1;
+ interruptible_sleep_on(&tp->wait_for_tok_int);
+ tp->TransmitCommandActive = 0;
+
+ del_timer(&tp->timer);
+ sktr_disable_interrupts(dev);
+
+ if(dev->dma > 0)
+ {
+ unsigned long flags=claim_dma_lock();
+ disable_dma(dev->dma);
+ release_dma_lock(flags);
+ }
+
+ outw(0xFF00, dev->base_addr + SIFCMD);
+ if(dev->dma > 0)
+ outb(0xff, dev->base_addr + POSREG);
+
+#ifdef MODULE
+ MOD_DEC_USE_COUNT;
+#endif
+
+ sktr_cancel_tx_queue(tp);
+
+ return (0);
+}
+
+/*
+ * Get the current statistics. This may be called with the card open
+ * or closed.
+ */
+static struct enet_statistics *sktr_get_stats(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ return ((struct enet_statistics *)&tp->MacStat);
+}
+
+/*
+ * Set or clear the multicast filter for this adapter.
+ */
+static void sktr_set_multicast_list(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned int OpenOptions;
+
+ OpenOptions = tp->ocpl.OPENOptions &
+ ~(PASS_ADAPTER_MAC_FRAMES
+ | PASS_ATTENTION_FRAMES
+ | PASS_BEACON_MAC_FRAMES
+ | COPY_ALL_MAC_FRAMES
+ | COPY_ALL_NON_MAC_FRAMES);
+
+ tp->ocpl.FunctAddr = 0;
+
+ if(dev->flags & IFF_PROMISC)
+ /* Enable promiscuous mode */
+ OpenOptions |= COPY_ALL_NON_MAC_FRAMES |
+ COPY_ALL_MAC_FRAMES;
+ else
+ {
+ if(dev->flags & IFF_ALLMULTI)
+ {
+ /* Disable promiscuous mode, use normal mode. */
+ tp->ocpl.FunctAddr = 0xFFFFFFFF;
+
+ }
+ else
+ {
+ int i;
+ struct dev_mc_list *mclist = dev->mc_list;
+ for (i=0; i< dev->mc_count; i++)
+ {
+ ((char *)(&tp->ocpl.FunctAddr))[0] |=
+ mclist->dmi_addr[2];
+ ((char *)(&tp->ocpl.FunctAddr))[1] |=
+ mclist->dmi_addr[3];
+ ((char *)(&tp->ocpl.FunctAddr))[2] |=
+ mclist->dmi_addr[4];
+ ((char *)(&tp->ocpl.FunctAddr))[3] |=
+ mclist->dmi_addr[5];
+ mclist = mclist->next;
+ }
+ }
+ sktr_exec_cmd(dev, OC_SET_FUNCT_ADDR);
+ }
+
+ tp->ocpl.OPENOptions = OpenOptions;
+ sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
+ return;
+}
+
+/*
+ * Wait for some time (microseconds)
+ *
+ * udelay() is a bit harsh, but using a looser timer causes
+ * the bring-up-diags to stall indefinitly.
+ *
+ */
+
+static void sktr_wait(unsigned long time)
+{
+ udelay(time);
+ return;
+}
+
+/*
+ * Write a command value to the SIFCMD register
+ */
+static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue)
+{
+ int ioaddr = dev->base_addr;
+ unsigned short cmd;
+ unsigned short SifStsValue;
+ unsigned long loop_counter;
+
+ WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
+ cmd = (unsigned short)WriteValue;
+ loop_counter = 0,5 * 800000;
+ do {
+ SifStsValue = inw(ioaddr + SIFSTS);
+ } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
+ outw(cmd, ioaddr + SIFCMD);
+
+ return;
+}
+
+/*
+ * Processes adapter hardware reset, halts adapter and downloads firmware,
+ * clears the halt bit.
+ */
+static int sktr_reset_adapter(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned short *fw_ptr = (unsigned short *)&sktr_code;
+ unsigned short count, c;
+ int ioaddr = dev->base_addr;
+
+ /* Hardware adapter reset */
+ outw(ACL_ARESET, ioaddr + SIFACL);
+ sktr_wait(40);
+
+ c = inw(ioaddr + SIFACL);
+ sktr_wait(20);
+
+ if(dev->dma == 0) /* For PCI adapters */
+ {
+ c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */
+ if(tp->DataRate == SPEED_4)
+ c |= ACL_SPEED4; /* Set 4Mbps */
+ else
+ c |= ACL_SPEED16; /* Set 16Mbps */
+ }
+
+ /* In case a command is pending - forget it */
+ tp->ScbInUse = 0;
+
+ c &= ~ACL_ARESET; /* Clear adapter reset bit */
+ c |= ACL_CPHALT; /* Halt adapter CPU, allow download */
+ c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */
+ outw(c, ioaddr + SIFACL);
+ sktr_wait(40);
+
+ /* Download firmware via DIO interface: */
+ do {
+ /* Download first address part */
+ outw(*fw_ptr, ioaddr + SIFADX);
+ fw_ptr++;
+
+ /* Download second address part */
+ outw(*fw_ptr, ioaddr + SIFADD);
+ fw_ptr++;
+
+ if((count = *fw_ptr) != 0) /* Load loop counter */
+ {
+ fw_ptr++; /* Download block data */
+ for(; count > 0; count--)
+ {
+ outw(*fw_ptr, ioaddr + SIFINC);
+ fw_ptr++;
+ }
+ }
+ else /* Stop, if last block downloaded */
+ {
+ c = inw(ioaddr + SIFACL);
+ c &= (~ACL_CPHALT | ACL_SINTEN);
+
+ /* Clear CPHALT and start BUD */
+ outw(c, ioaddr + SIFACL);
+ return (1);
+ }
+ } while(count == 0);
+
+ return (-1);
+}
+
+/*
+ * Starts bring up diagnostics of token ring adapter and evaluates
+ * diagnostic results.
+ */
+static int sktr_bringup_diags(struct net_device *dev)
+{
+ int loop_cnt, retry_cnt;
+ unsigned short Status;
+ int ioaddr = dev->base_addr;
+
+ sktr_wait(HALF_SECOND);
+ sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+ sktr_wait(HALF_SECOND);
+
+ retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */
+
+ do {
+ retry_cnt--;
+ if(sktr_debug > 3)
+ printk(KERN_INFO "BUD-Status: \n");
+ loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/
+ do { /* Inspect BUD results */
+ loop_cnt--;
+ sktr_wait(HALF_SECOND);
+ Status = inw(ioaddr + SIFSTS);
+ Status &= STS_MASK;
+
+ if(sktr_debug > 3)
+ printk(KERN_INFO " %04X \n", Status);
+ /* BUD successfully completed */
+ if(Status == STS_INITIALIZE)
+ return (1);
+ /* Unrecoverable hardware error, BUD not completed? */
+ } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
+ != (STS_ERROR | STS_TEST)));
+
+ /* Error preventing completion of BUD */
+ if(retry_cnt > 0)
+ {
+ printk(KERN_INFO "%s: Adapter Software Reset.\n",
+ dev->name);
+ sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+ sktr_wait(HALF_SECOND);
+ }
+ } while(retry_cnt > 0);
+
+ Status = inw(ioaddr + SIFSTS);
+ Status &= STS_ERROR_MASK; /* Hardware error occurred! */
+
+ printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n",
+ dev->name, Status);
+
+ return (-1);
+}
+
+/*
+ * Copy initialisation data to adapter memory, beginning at address
+ * 1:0A00; Starting DMA test and evaluating result bits.
+ */
+static int sktr_init_adapter(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
+ const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
+ 0xC5, 0xD9, 0xC3, 0xD4};
+ void *ptr = (void *)&tp->ipb;
+ unsigned short *ipb_ptr = (unsigned short *)ptr;
+ unsigned char *cb_ptr = (unsigned char *) &tp->scb;
+ unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
+ unsigned short Status;
+ int i, loop_cnt, retry_cnt;
+ int ioaddr = dev->base_addr;
+
+ /* Normalize: byte order low/high, word order high/low! (only IPB!) */
+ tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb));
+ tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb));
+
+ /* Maximum: three initialization retries */
+ retry_cnt = INIT_MAX_RETRIES;
+
+ do {
+ retry_cnt--;
+
+ /* Transfer initialization block */
+ outw(0x0001, ioaddr + SIFADX);
+
+ /* To address 0001:0A00 of adapter RAM */
+ outw(0x0A00, ioaddr + SIFADD);
+
+ /* Write 11 words to adapter RAM */
+ for(i = 0; i < 11; i++)
+ outw(ipb_ptr[i], ioaddr + SIFINC);
+
+ /* Execute SCB adapter command */
+ sktr_exec_sifcmd(dev, CMD_EXECUTE);
+
+ loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */
+
+ /* While remaining retries, no error and not completed */
+ do {
+ Status = 0;
+ loop_cnt--;
+ sktr_wait(HALF_SECOND);
+
+ /* Mask interesting status bits */
+ Status = inw(ioaddr + SIFSTS);
+ Status &= STS_MASK;
+ } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0)
+ && ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
+
+ if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
+ {
+ /* Initialization completed without error */
+ i = 0;
+ do { /* Test if contents of SCB is valid */
+ if(SCB_Test[i] != *(cb_ptr + i))
+ /* DMA data error: wrong data in SCB */
+ return (-1);
+ i++;
+ } while(i < 6);
+
+ i = 0;
+ do { /* Test if contents of SSB is valid */
+ if(SSB_Test[i] != *(sb_ptr + i))
+ /* DMA data error: wrong data in SSB */
+ return (-1);
+ i++;
+ } while (i < 8);
+
+ return (1); /* Adapter successfully initialized */
+ }
+ else
+ {
+ if((Status & STS_ERROR) != 0)
+ {
+ /* Initialization error occurred */
+ Status = inw(ioaddr + SIFSTS);
+ Status &= STS_ERROR_MASK;
+ /* ShowInitialisationErrorCode(Status); */
+ return (-1); /* Unrecoverable error */
+ }
+ else
+ {
+ if(retry_cnt > 0)
+ {
+ /* Reset adapter and try init again */
+ sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+ sktr_wait(HALF_SECOND);
+ }
+ }
+ }
+ } while(retry_cnt > 0);
+
+ return (-1);
+}
+
+/*
+ * Check for outstanding commands in command queue and tries to execute
+ * command immediately. Corresponding command flag in command queue is cleared.
+ */
+static void sktr_chk_outstanding_cmds(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned long Addr = 0;
+ unsigned char i = 0;
+
+ if(tp->CMDqueue == 0)
+ return; /* No command execution */
+
+ /* If SCB in use: no command */
+ if(tp->ScbInUse == 1)
+ return;
+
+ /* Check if adapter is opened, avoiding COMMAND_REJECT
+ * interrupt by the adapter!
+ */
+ if(tp->AdapterOpenFlag == 0)
+ {
+ if(tp->CMDqueue & OC_OPEN)
+ {
+ /* Execute OPEN command */
+ tp->CMDqueue ^= OC_OPEN;
+
+ /* Copy the 18 bytes of the product ID */
+ while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE))
+ {
+ tp->ProductID[i] = AdapterName[i];
+ i++;
+ }
+
+ Addr = htonl(virt_to_bus(&tp->ocpl));
+ tp->scb.Parm[0] = LOWORD(Addr);
+ tp->scb.Parm[1] = HIWORD(Addr);
+ tp->scb.CMD = OPEN;
+ }
+ else
+ /* No OPEN command queued, but adapter closed. Note:
+ * We'll try to re-open the adapter in DriverPoll()
+ */
+ return; /* No adapter command issued */
+ }
+ else
+ {
+ /* Adapter is open; evaluate command queue: try to execute
+ * outstanding commands (depending on priority!) CLOSE
+ * command queued
+ */
+ if(tp->CMDqueue & OC_CLOSE)
+ {
+ tp->CMDqueue ^= OC_CLOSE;
+ tp->AdapterOpenFlag = 0;
+ tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
+ tp->scb.Parm[1] = 0; /* but should be set to zero! */
+ tp->scb.CMD = CLOSE;
+ if(!tp->HaltInProgress)
+ tp->CMDqueue |= OC_OPEN; /* re-open adapter */
+ else
+ tp->CMDqueue = 0; /* no more commands */
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_RECEIVE)
+ {
+ tp->CMDqueue ^= OC_RECEIVE;
+ Addr = htonl(virt_to_bus(tp->RplHead));
+ tp->scb.Parm[0] = LOWORD(Addr);
+ tp->scb.Parm[1] = HIWORD(Addr);
+ tp->scb.CMD = RECEIVE;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_TRANSMIT_HALT)
+ {
+ /* NOTE: TRANSMIT.HALT must be checked
+ * before TRANSMIT.
+ */
+ tp->CMDqueue ^= OC_TRANSMIT_HALT;
+ tp->scb.CMD = TRANSMIT_HALT;
+
+ /* Parm[0] and Parm[1] are ignored
+ * but should be set to zero!
+ */
+ tp->scb.Parm[0] = 0;
+ tp->scb.Parm[1] = 0;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_TRANSMIT)
+ {
+ /* NOTE: TRANSMIT must be
+ * checked after TRANSMIT.HALT
+ */
+ if(tp->TransmitCommandActive)
+ {
+ if(!tp->TransmitHaltScheduled)
+ {
+ tp->TransmitHaltScheduled = 1;
+ sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
+ }
+ tp->TransmitCommandActive = 0;
+ return;
+ }
+
+ tp->CMDqueue ^= OC_TRANSMIT;
+ sktr_cancel_tx_queue(tp);
+ Addr = htonl(virt_to_bus(tp->TplBusy));
+ tp->scb.Parm[0] = LOWORD(Addr);
+ tp->scb.Parm[1] = HIWORD(Addr);
+ tp->scb.CMD = TRANSMIT;
+ tp->TransmitCommandActive = 1;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
+ {
+ tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
+ tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
+ tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
+ tp->scb.Parm[1] = 0; /* is ignored but should be zero */
+ tp->scb.CMD = MODIFY_OPEN_PARMS;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
+ {
+ tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
+ tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
+ tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
+ tp->scb.CMD = SET_FUNCT_ADDR;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_SET_GROUP_ADDR)
+ {
+ tp->CMDqueue ^= OC_SET_GROUP_ADDR;
+ tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
+ tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
+ tp->scb.CMD = SET_GROUP_ADDR;
+ }
+ else
+ {
+ if(tp->CMDqueue & OC_READ_ERROR_LOG)
+ {
+ tp->CMDqueue ^= OC_READ_ERROR_LOG;
+ Addr = htonl(virt_to_bus(&tp->errorlogtable));
+ tp->scb.Parm[0] = LOWORD(Addr);
+ tp->scb.Parm[1] = HIWORD(Addr);
+ tp->scb.CMD = READ_ERROR_LOG;
+ }
+ else
+ {
+ printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
+ tp->CMDqueue = 0;
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ tp->ScbInUse = 1; /* Set semaphore: SCB in use. */
+
+ /* Execute SCB and generate IRQ when done. */
+ sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
+
+ return;
+}
+
+/*
+ * IRQ conditions: signal loss on the ring, transmit or receive of beacon
+ * frames (disabled if bit 1 of OPEN option is set); report error MAC
+ * frame transmit (disabled if bit 2 of OPEN option is set); open or short
+ * cirquit fault on the lobe is detected; remove MAC frame received;
+ * error counter overflow (255); opened adapter is the only station in ring.
+ * After some of the IRQs the adapter is closed!
+ */
+static void sktr_ring_status_irq(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]);
+
+ /* First: fill up statistics */
+ if(tp->ssb.Parm[0] & SIGNAL_LOSS)
+ {
+ printk(KERN_INFO "%s: Signal Loss\n", dev->name);
+ tp->MacStat.line_errors++;
+ }
+
+ /* Adapter is closed, but initialized */
+ if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
+ {
+ printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n",
+ dev->name);
+ tp->MacStat.line_errors++;
+ }
+
+ if(tp->ssb.Parm[0] & RING_RECOVERY)
+ printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
+
+ /* Counter overflow: read error log */
+ if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
+ {
+ printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
+ sktr_exec_cmd(dev, OC_READ_ERROR_LOG);
+ }
+
+ /* Adapter is closed, but initialized */
+ if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
+ printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n",
+ dev->name);
+
+ /* Adapter is closed, but initialized */
+ if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
+ printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n",
+ dev->name);
+
+ if(tp->ssb.Parm[0] & HARD_ERROR)
+ printk(KERN_INFO "%s: Hard Error\n", dev->name);
+
+ if(tp->ssb.Parm[0] & SOFT_ERROR)
+ printk(KERN_INFO "%s: Soft Error\n", dev->name);
+
+ if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
+ printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
+
+ if(tp->ssb.Parm[0] & SINGLE_STATION)
+ printk(KERN_INFO "%s: Single Station\n", dev->name);
+
+ /* Check if adapter has been closed */
+ if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
+ {
+ printk(KERN_INFO "%s: Adapter closed (Reopening),"
+ "QueueSkb %d, CurrentRingStat %x\n",
+ dev->name, tp->QueueSkb, tp->CurrentRingStatus);
+ tp->AdapterOpenFlag = 0;
+ sktr_open_adapter(dev);
+ }
+
+ return;
+}
+
+/*
+ * Issued if adapter has encountered an unrecoverable hardware
+ * or software error.
+ */
+static void sktr_chk_irq(struct net_device *dev)
+{
+ int i;
+ unsigned short AdapterCheckBlock[4];
+ unsigned short ioaddr = dev->base_addr;
+ struct net_local *tp = (struct net_local *)dev->priv;
+
+ tp->AdapterOpenFlag = 0; /* Adapter closed now */
+
+ /* Page number of adapter memory */
+ outw(0x0001, ioaddr + SIFADX);
+ /* Address offset */
+ outw(CHECKADDR, ioaddr + SIFADR);
+
+ /* Reading 8 byte adapter check block. */
+ for(i = 0; i < 4; i++)
+ AdapterCheckBlock[i] = inw(ioaddr + SIFINC);
+
+ if(sktr_debug > 3)
+ {
+ printk("%s: AdapterCheckBlock: ", dev->name);
+ for (i = 0; i < 4; i++)
+ printk("%04X", AdapterCheckBlock[i]);
+ printk("\n");
+ }
+
+ switch(AdapterCheckBlock[0])
+ {
+ case DIO_PARITY:
+ printk(KERN_INFO "%s: DIO parity error\n", dev->name);
+ break;
+
+ case DMA_READ_ABORT:
+ printk(KERN_INFO "%s DMA read operation aborted:\n",
+ dev->name);
+ switch (AdapterCheckBlock[1])
+ {
+ case 0:
+ printk(KERN_INFO "Timeout\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ case 1:
+ printk(KERN_INFO "Parity error\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ case 2:
+ printk(KERN_INFO "Bus error\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ default:
+ printk(KERN_INFO "Unknown error.\n");
+ break;
+ }
+ break;
+
+ case DMA_WRITE_ABORT:
+ printk(KERN_INFO "%s: DMA write operation aborted: \n",
+ dev->name);
+ switch (AdapterCheckBlock[1])
+ {
+ case 0:
+ printk(KERN_INFO "Timeout\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ case 1:
+ printk(KERN_INFO "Parity error\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ case 2:
+ printk(KERN_INFO "Bus error\n");
+ printk(KERN_INFO "Address: %04X %04X\n",
+ AdapterCheckBlock[2],
+ AdapterCheckBlock[3]);
+ break;
+
+ default:
+ printk(KERN_INFO "Unknown error.\n");
+ break;
+ }
+ break;
+
+ case ILLEGAL_OP_CODE:
+ printk("%s: Illegal operation code in firmware\n",
+ dev->name);
+ /* Parm[0-3]: adapter internal register R13-R15 */
+ break;
+
+ case PARITY_ERRORS:
+ printk("%s: Adapter internal bus parity error\n",
+ dev->name);
+ /* Parm[0-3]: adapter internal register R13-R15 */
+ break;
+
+ case RAM_DATA_ERROR:
+ printk("%s: RAM data error\n", dev->name);
+ /* Parm[0-1]: MSW/LSW address of RAM location. */
+ break;
+
+ case RAM_PARITY_ERROR:
+ printk("%s: RAM parity error\n", dev->name);
+ /* Parm[0-1]: MSW/LSW address of RAM location. */
+ break;
+
+ case RING_UNDERRUN:
+ printk("%s: Internal DMA underrun detected\n",
+ dev->name);
+ break;
+
+ case INVALID_IRQ:
+ printk("%s: Unrecognized interrupt detected\n",
+ dev->name);
+ /* Parm[0-3]: adapter internal register R13-R15 */
+ break;
+
+ case INVALID_ERROR_IRQ:
+ printk("%s: Unrecognized error interrupt detected\n",
+ dev->name);
+ /* Parm[0-3]: adapter internal register R13-R15 */
+ break;
+
+ case INVALID_XOP:
+ printk("%s: Unrecognized XOP request detected\n",
+ dev->name);
+ /* Parm[0-3]: adapter internal register R13-R15 */
+ break;
+
+ default:
+ printk("%s: Unknown status", dev->name);
+ break;
+ }
+
+ if(sktr_chipset_init(dev) == 1)
+ {
+ /* Restart of firmware successful */
+ tp->AdapterOpenFlag = 1;
+ }
+
+ return;
+}
+
+/*
+ * Internal adapter pointer to RAM data are copied from adapter into
+ * host system.
+ */
+static void sktr_read_ptr(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned short adapterram;
+
+ sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
+ ADAPTER_INT_PTRS, 16);
+ sktr_read_ram(dev, (unsigned char *)&adapterram,
+ (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2);
+
+ printk(KERN_INFO "%s: Adapter RAM size: %d K\n",
+ dev->name, SWAPB(adapterram));
+
+ return;
+}
+
+/*
+ * Reads a number of bytes from adapter to system memory.
+ */
+static void sktr_read_ram(struct net_device *dev, unsigned char *Data,
+ unsigned short Address, int Length)
+{
+ int i;
+ unsigned short old_sifadx, old_sifadr, InWord;
+ unsigned short ioaddr = dev->base_addr;
+
+ /* Save the current values */
+ old_sifadx = inw(ioaddr + SIFADX);
+ old_sifadr = inw(ioaddr + SIFADR);
+
+ /* Page number of adapter memory */
+ outw(0x0001, ioaddr + SIFADX);
+ /* Address offset in adapter RAM */
+ outw(Address, ioaddr + SIFADR);
+
+ /* Copy len byte from adapter memory to system data area. */
+ i = 0;
+ for(;;)
+ {
+ InWord = inw(ioaddr + SIFINC);
+
+ *(Data + i) = HIBYTE(InWord); /* Write first byte */
+ if(++i == Length) /* All is done break */
+ break;
+
+ *(Data + i) = LOBYTE(InWord); /* Write second byte */
+ if (++i == Length) /* All is done break */
+ break;
+ }
+
+ /* Restore original values */
+ outw(old_sifadx, ioaddr + SIFADX);
+ outw(old_sifadr, ioaddr + SIFADR);
+
+ return;
+}
+
+/*
+ * Reads MAC address from adapter ROM.
+ */
+static void sktr_read_addr(struct net_device *dev, unsigned char *Address)
+{
+ int i, In;
+ unsigned short ioaddr = dev->base_addr;
+
+ /* Address: 0000:0000 */
+ outw(0, ioaddr + SIFADX);
+ outw(0, ioaddr + SIFADR);
+
+ /* Read six byte MAC address data */
+ for(i = 0; i < 6; i++)
+ {
+ In = inw(ioaddr + SIFINC);
+ *(Address + i) = (unsigned char)(In >> 8);
+ }
+
+ return;
+}
+
+/*
+ * Cancel all queued packets in the transmission queue.
+ */
+static void sktr_cancel_tx_queue(struct net_local* tp)
+{
+ TPL *tpl;
+ struct sk_buff *skb;
+
+ /*
+ * NOTE: There must not be an active TRANSMIT command pending, when
+ * this function is called.
+ */
+ if(tp->TransmitCommandActive)
+ return;
+
+ for(;;)
+ {
+ tpl = tp->TplBusy;
+ if(!tpl->BusyFlag)
+ break;
+ /* "Remove" TPL from busy list. */
+ tp->TplBusy = tpl->NextTPLPtr;
+ sktr_write_tpl_status(tpl, 0); /* Clear VALID bit */
+ tpl->BusyFlag = 0; /* "free" TPL */
+
+ printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
+
+ dev_kfree_skb(tpl->Skb);
+ }
+
+ for(;;)
+ {
+ skb = skb_dequeue(&tp->SendSkbQueue);
+ if(skb == NULL)
+ break;
+ tp->QueueSkb++;
+ dev_kfree_skb(skb);
+ }
+
+ return;
+}
+
+/*
+ * This function is called whenever a transmit interrupt is generated by the
+ * adapter. For a command complete interrupt, it is checked if we have to
+ * issue a new transmit command or not.
+ */
+static void sktr_tx_status_irq(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned char HighByte, HighAc, LowAc;
+ TPL *tpl;
+
+ /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
+ * available, because the CLEAR SSB command has already been issued.
+ *
+ * Process all complete transmissions.
+ */
+
+ for(;;)
+ {
+ tpl = tp->TplBusy;
+ if(!tpl->BusyFlag || (tpl->Status
+ & (TX_VALID | TX_FRAME_COMPLETE))
+ != TX_FRAME_COMPLETE)
+ {
+ break;
+ }
+
+ /* "Remove" TPL from busy list. */
+ tp->TplBusy = tpl->NextTPLPtr ;
+
+ if(sktr_debug > 3)
+ sktr_dump(tpl->MData, SWAPB(tpl->FrameSize));
+
+ /* Check the transmit status field only for directed frames*/
+ if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
+ {
+ HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
+ HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte);
+ LowAc = GET_FRAME_STATUS_LOW_AC(HighByte);
+
+ if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
+ {
+ printk(KERN_INFO "%s: (DA=%08lX not recognized)",
+ dev->name,
+ *(unsigned long *)&tpl->MData[2+2]);
+ }
+ else
+ {
+ if(sktr_debug > 3)
+ printk("%s: Directed frame tx'd\n",
+ dev->name);
+ }
+ }
+ else
+ {
+ if(!DIRECTED_FRAME(tpl))
+ {
+ if(sktr_debug > 3)
+ printk("%s: Broadcast frame tx'd\n",
+ dev->name);
+ }
+ }
+
+ tp->MacStat.tx_packets++;
+ dev_kfree_skb(tpl->Skb);
+ tpl->BusyFlag = 0; /* "free" TPL */
+ }
+
+ dev->tbusy = 0;
+ if(tp->QueueSkb < MAX_TX_QUEUE)
+ sktr_hardware_send_packet(dev, tp);
+
+ return;
+}
+
+/*
+ * Called if a frame receive interrupt is generated by the adapter.
+ * Check if the frame is valid and indicate it to system.
+ */
+static void sktr_rcv_status_irq(struct net_device *dev)
+{
+ struct net_local *tp = (struct net_local *)dev->priv;
+ unsigned char *ReceiveDataPtr;
+ struct sk_buff *skb;
+ unsigned int Length, Length2;
+ RPL *rpl;
+ RPL *SaveHead;
+
+ /* NOTE: At this point the SSB from RECEIVE STATUS is no longer
+ * available, because the CLEAR SSB command has already been issued.
+ *
+ * Process all complete receives.
+ */
+
+ for(;;)
+ {
+ rpl = tp->RplHead;
+ if(rpl->Status & RX_VALID)
+ break; /* RPL still in use by adapter */
+
+ /* Forward RPLHead pointer to next list. */
+ SaveHead = tp->RplHead;
+ tp->RplHead = rpl->NextRPLPtr;
+
+ /* Get the frame size (Byte swap for Intel).
+ * Do this early (see workaround comment below)
+ */
+ Length = (unsigned short)SWAPB(rpl->FrameSize);
+
+ /* Check if the Frame_Start, Frame_End and
+ * Frame_Complete bits are set.
+ */
+ if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
+ == VALID_SINGLE_BUFFER_FRAME)
+ {
+ ReceiveDataPtr = rpl->MData;
+
+ /* Workaround for delayed write of FrameSize on ISA
+ * (FrameSize is false but valid-bit is reset)
+ * Frame size is set to zero when the RPL is freed.
+ * Length2 is there because there have also been
+ * cases where the FrameSize was partially written
+ */
+ Length2 = (unsigned short)SWAPB(rpl->FrameSize);
+
+ if(Length == 0 || Length != Length2)
+ {
+ tp->RplHead = SaveHead;
+ break; /* Return to sktr_interrupt */
+ }
+
+ /* Drop frames sent by myself */
+ if(sktr_chk_frame(dev, rpl->MData))
+ {
+ if(rpl->Skb != NULL)
+ dev_kfree_skb(rpl->Skb);
+ }
+ else
+ {
+ sktr_update_rcv_stats(tp,ReceiveDataPtr,Length);
+
+ if(sktr_debug > 3)
+ printk("%s: Packet Length %04X (%d)\n",
+ dev->name, Length, Length);
+
+ /* Indicate the received frame to system.
+ * The source routing padding is no more
+ * necessary with 2.2.x kernel.
+ * See: OpenOptions in sktr_init_opb()
+ */
+ skb = rpl->Skb;
+ if(rpl->SkbStat == SKB_UNAVAILABLE)
+ {
+ /* Try again to allocate skb */
+ skb = dev_alloc_skb(tp->MaxPacketSize);
+ if(skb == NULL)
+ {
+ /* Update Stats ?? */
+ }
+ else
+ {
+ skb->dev = dev;
+ skb_put(skb, tp->MaxPacketSize);
+ rpl->SkbStat = SKB_DATA_COPY;
+ ReceiveDataPtr = rpl->MData;
+ }
+ }
+
+ if(rpl->SkbStat == SKB_DATA_COPY
+ || rpl->SkbStat == SKB_DMA_DIRECT)
+ {
+ if(rpl->SkbStat == SKB_DATA_COPY)
+ {
+ memmove(skb->data, ReceiveDataPtr, Length);
+ }
+
+ /* Deliver frame to system */
+ rpl->Skb = NULL;
+ skb_trim(skb,Length);
+ skb->dev = dev;
+ skb->protocol = tr_type_trans(skb,dev);
+ netif_rx(skb);
+ }
+ }
+ }
+ else /* Invalid frame */
+ {
+ if(rpl->Skb != NULL)
+ dev_kfree_skb(rpl->Skb);
+
+ /* Skip list. */
+ if(rpl->Status & RX_START_FRAME)
+ /* Frame start bit is set -> overflow. */
+ tp->MacStat.rx_errors++;
+ }
+
+ /* Allocate new skb for rpl */
+ rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+ /* skb == NULL ? then use local buffer */
+ if(rpl->Skb == NULL)
+ {
+ rpl->SkbStat = SKB_UNAVAILABLE;
+ rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+ rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+ }
+ else /* skb != NULL */
+ {
+ rpl->Skb->dev = dev;
+ skb_put(rpl->Skb, tp->MaxPacketSize);
+
+ /* Data unreachable for DMA ? then use local buffer */
+ if(tp->DeviceType == SK_ISA &&
+ virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize
+ > ISA_MAX_ADDRESS)
+ {
+ rpl->SkbStat = SKB_DATA_COPY;
+ rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+ rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+ }
+ else
+ {
+ /* DMA directly in skb->data */
+ rpl->SkbStat = SKB_DMA_DIRECT;
+ rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data));
+ rpl->MData = rpl->Skb->data;
+ }
+ }
+
+ rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+ rpl->FrameSize = 0;
+
+ /* Pass the last RPL back to the adapter */
+ tp->RplTail->FrameSize = 0;
+
+ /* Reset the CSTAT field in the list. */
+ sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
+
+ /* Current RPL becomes last one in list. */
+ tp->RplTail = tp->RplTail->NextRPLPtr;
+
+ /* Inform adapter about RPL valid. */
+ sktr_exec_sifcmd(dev, CMD_RX_VALID);
+ }
+
+ return;
+}
+
+/*
+ * This function should be used whenever the status of any RPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the RPL status may be executed
+ * at an undesireable time. When this function is used, the status is
+ * always written when the function is called.
+ */
+static void sktr_write_rpl_status(RPL *rpl, unsigned int Status)
+{
+ rpl->Status = Status;
+
+ return;
+}
+
+/*
+ * The function updates the statistic counters in mac->MacStat.
+ * It differtiates between directed and broadcast/multicast ( ==functional)
+ * frames.
+ */
+static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
+ unsigned int Length)
+{
+ tp->MacStat.rx_packets++;
+
+ /* Test functional bit */
+ if(DataPtr[2] & GROUP_BIT)
+ tp->MacStat.multicast++;
+
+ return;
+}
+
+/*
+ * Check if it is a frame of myself. Compare source address with my current
+ * address in reverse direction, and mask out the TR_RII.
+ */
+static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr)
+{
+ int i;
+
+ for(i = 5; i > 0; i--)
+ {
+ if(Addr[8 + i] != dev->dev_addr[i])
+ return (0);
+ }
+
+ /* Mask out RIF bit. */
+ if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0]))
+ return (0);
+
+ return (1); /* It is my frame. */
+}
+
+/*
+ * Dump Packet (data)
+ */
+static void sktr_dump(unsigned char *Data, int length)
+{
+ int i, j;
+
+ for (i = 0, j = 0; i < length / 8; i++, j += 8)
+ {
+ printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n",
+ Data[j+0],Data[j+1],Data[j+2],Data[j+3],
+ Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
+ }
+
+ return;
+}
+
+#ifdef MODULE
+
+static struct net_device* dev_sktr[SKTR_MAX_ADAPTERS];
+static int io[SKTR_MAX_ADAPTERS] = { 0, 0 };
+static int irq[SKTR_MAX_ADAPTERS] = { 0, 0 };
+static int mem[SKTR_MAX_ADAPTERS] = { 0, 0 };
+
+MODULE_PARM(io, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+
+int init_module(void)
+{
+ int i;
+
+ for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
+ {
+ irq[i] = 0;
+ mem[i] = 0;
+ dev_sktr[i] = NULL;
+ dev_sktr[i] = init_trdev(dev_sktr[i], 0);
+ if(dev_sktr[i] == NULL)
+ return (-ENOMEM);
+
+ dev_sktr[i]->base_addr = io[i];
+ dev_sktr[i]->irq = irq[i];
+ dev_sktr[i]->mem_start = mem[i];
+ dev_sktr[i]->init = &sktr_probe;
+
+ if(register_trdev(dev_sktr[i]) != 0)
+ {
+ kfree_s(dev_sktr[i], sizeof(struct net_device));
+ dev_sktr[i] = NULL;
+ if(i == 0)
+ {
+ printk("sktr: register_trdev() returned non-zero.\n");
+ return (-EIO);
+ }
+ else
+ return (0);
+ }
+ }
+
+ return (0);
+}
+
+void cleanup_module(void)
+{
+ int i;
+
+ for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
+ {
+ if(dev_sktr[i])
+ {
+ unregister_trdev(dev_sktr[i]);
+ release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT);
+ if(dev_sktr[i]->irq)
+ free_irq(dev_sktr[i]->irq, dev_sktr[i]);
+ if(dev_sktr[i]->dma > 0)
+ free_dma(dev_sktr[i]->dma);
+ if(dev_sktr[i]->priv)
+ kfree_s(dev_sktr[i]->priv, sizeof(struct net_local));
+ kfree_s(dev_sktr[i], sizeof(struct net_device));
+ dev_sktr[i] = NULL;
+ }
+ }
+}
+#endif /* MODULE */
diff --git a/drivers/net/tokenring/sktr.h b/drivers/net/tokenring/sktr.h
new file mode 100644
index 000000000..90b5c382f
--- /dev/null
+++ b/drivers/net/tokenring/sktr.h
@@ -0,0 +1,1103 @@
+/* sktr.h: SysKonnect TokenRing driver for Linux
+ *
+ * Authors:
+ * - Christoph Goos <cgoos@syskonnect.de>
+ */
+
+#ifndef __LINUX_SKTR_H
+#define __LINUX_SKTR_H
+
+#ifdef __KERNEL__
+
+#define SKTR_MAX_ADAPTERS 7
+
+#define SEND_TIMEOUT 10*HZ
+
+#define TR_RCF_LONGEST_FRAME_MASK 0x0070
+#define TR_RCF_FRAME4K 0x0030
+
+#define SK_ISA 0
+#define SK_PCI 1
+
+/*------------------------------------------------------------------*/
+/* Bit order for adapter communication with DMA */
+/* -------------------------------------------------------------- */
+/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */
+/* -------------------------------------------------------------- */
+/* The bytes in a word must be byte swapped. Also, if a double */
+/* word is used for storage, then the words, as well as the bytes, */
+/* must be swapped. */
+/* Bit order for adapter communication with DIO */
+/* -------------------------------------------------------------- */
+/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */
+/* -------------------------------------------------------------- */
+/*------------------------------------------------------------------*/
+
+/* Swap bytes of a word. */
+#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8)))
+
+/* Swap words of a long. */
+#define SWAPW(x) (((x) << 16) | ((x) >> 16))
+
+/* Get the low byte of a word. */
+#define LOBYTE(w) ((unsigned char)(w))
+
+/* Get the high byte of a word. */
+#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8))
+
+/* Get the low word of a long. */
+#define LOWORD(l) ((unsigned short)(l))
+
+/* Get the high word of a long. */
+#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16))
+
+
+
+/* Token ring adapter I/O addresses for normal mode. */
+#define SIFDAT 0L /* SIF/DMA data. */
+#define SIFINC 2L /* IO Word data with auto increment. */
+#define SIFINH 3L /* IO Byte data with auto increment. */
+#define SIFADR 4L /* SIF/DMA Address. */
+#define SIFCMD 6L /* SIF Command. */
+#define SIFSTS 6L /* SIF Status. */
+#define SIFACL 8L /* SIF Adapter Control Register. */
+#define SIFADD 10L /* SIF/DMA Address. */
+#define SIFADX 12L
+#define DMALEN 14L /* SIF DMA length. */
+#define POSREG 16L /* Adapter Program Option Select (POS)
+ * Register: base IO address + 16 byte.
+ */
+#define POSREG_2 24L /* only for TR4/16+ adapter
+ * base IO address + 24 byte.
+ */
+
+
+/* SIFCMD command codes (high-low) */
+#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */
+#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */
+#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to
+ * system interrupts.
+ */
+#define CMD_EXECUTE 0x1000 /* Execute SCB command */
+#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt
+ * system when SCB is available for
+ * another command.
+ */
+#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer
+ * stop. (odd pointer receive method)
+ */
+#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */
+#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid
+ * bit receive/transmit method)
+ */
+#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system
+ * interrupt is reset.
+ */
+#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit.
+ * (write: 1=ignore, 0=reset)
+ */
+#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart
+ * adapter after hardware reset)
+ */
+
+
+/* ACL commands (high-low) */
+#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */
+#define ACL_SWDDIR 0x0400 /* Data transfer direction. */
+#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */
+#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */
+#define ACL_ARESET 0x0080 /* Adapter hardware reset command.
+ * (held in reset condition as
+ * long as bit is set)
+ */
+#define ACL_CPHALT 0x0040 /* Communication processor halt.
+ * (can only be set while ACL_ARESET
+ * bit is set; prevents adapter
+ * processor from executing code while
+ * downloading firmware)
+ */
+#define ACL_BOOT 0x0020
+#define ACL_SINTEN 0x0008 /* System interrupt enable/disable
+ * (1/0): can be written if ACL_ARESET
+ * is zero.
+ */
+#define ACL_SPEED4 0x0003
+#define ACL_SPEED16 0x0001
+#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN)
+
+
+/* SIFSTS register return codes (high-low) */
+#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system
+ * interrupt is valid.
+ */
+#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to
+ * initialize)
+ */
+#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */
+#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable
+ * HW error occurred)
+ */
+#define STS_MASK 0x00F0 /* Mask interesting status bits. */
+#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the
+ * interrupt code bits.
+ */
+#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal
+ * pointers 01:0a00 (high-low) have to
+ * be read after init and before open.
+ */
+
+
+/* Interrupt Codes (only MAC IRQs) */
+#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or
+ * software error.
+ */
+#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */
+#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an
+ * SCB_REQUEST IRQ.
+ */
+#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command
+ * status.
+ */
+#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive
+ * status.
+ */
+#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit
+ * status
+ */
+#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */
+
+
+/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */
+#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed
+ * (avoid this!) issue another transmit
+ * to send additional frames.
+ */
+#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted;
+ * INTERRUPT_FRAME bit was set in the
+ * CSTAT request; indication of possibly
+ * more than one frame transmissions!
+ * SSB.Parm[0-1]: 32 bit pointer to
+ * TPL of last frame.
+ */
+#define LIST_ERROR 0x0020 /* Error in one of the TPLs that
+ * compose the frame; TRANSMIT
+ * terminated; Parm[1-2]: 32 bit pointer
+ * to TPL which starts the error
+ * frame; error details in bits 8-13.
+ * (14?)
+ */
+#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of
+ * the valid DATA_COUNT fields;
+ * FRAME_SIZE less than header plus
+ * information field. (15 bytes +
+ * routing field) Or if FRAME_SIZE
+ * was specified as zero in one list.
+ */
+#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE
+ * - 9) * TX_BUF_MAX.
+ */
+#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is
+ * read on a list without END_FRAME
+ * indication.
+ */
+#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated,
+ * but (not) set.
+ */
+#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not
+ * been allowed.
+ */
+#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero
+ * or MAC frame PCF ATTN field is
+ * greater than one.
+ */
+#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */
+
+
+/*
+ * Since we need to support some functions even if the adapter is in a
+ * CLOSED state, we have a (pseudo-) command queue which holds commands
+ * that are outstandig to be executed.
+ *
+ * Each time a command completes, an interrupt occurs and the next
+ * command is executed. The command queue is actually a simple word with
+ * a bit for each outstandig command. Therefore the commands will not be
+ * executed in the order they have been queued.
+ *
+ * The following defines the command code bits and the command queue:
+ */
+#define OC_OPEN 0x0001 /* OPEN command */
+#define OC_TRANSMIT 0x0002 /* TRANSMIT command */
+#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */
+#define OC_RECEIVE 0x0008 /* RECEIVE command */
+#define OC_CLOSE 0x0010 /* CLOSE command */
+#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */
+#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */
+#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */
+#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */
+#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */
+#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */
+#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */
+#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */
+#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */
+
+#define OPEN 0x0300 /* C: open command. S: completion. */
+#define TRANSMIT 0x0400 /* C: transmit command. S: completion
+ * status. (reject: COMMAND_REJECT if
+ * adapter not opened, TRANSMIT already
+ * issued or address passed in the SCB
+ * not word aligned)
+ */
+#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no
+ * TRANSMIT command issued, the command
+ * is ignored. (completion with TRANSMIT
+ * status (0x0400)!)
+ */
+#define RECEIVE 0x0600 /* C: receive command. S: completion
+ * status. (reject: COMMAND_REJECT if
+ * adapter not opened, RECEIVE already
+ * issued or address passed in the SCB
+ * not word aligned)
+ */
+#define CLOSE 0x0700 /* C: close adapter. S: completion.
+ * (COMMAND_REJECT if adapter not open)
+ */
+#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after
+ * OPEN. S: completion. (COMMAND_REJECT
+ * if adapter not open)
+ */
+#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address
+ * after OPEN. S: completion.
+ * (COMMAND_REJECT if adapter not open)
+ */
+#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters.
+ * S: completion. (command ignored
+ * if adapter not open!)
+ */
+#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory.
+ * (important: after init and before
+ * open!) S: completion. (ADAPTER_CHECK
+ * interrupt if undefined storage area
+ * read)
+ */
+#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational
+ * parameters. (bit correspondend to
+ * WRAP_INTERFACE is ignored)
+ * S: completion. (reject:
+ * COMMAND_REJECT)
+ */
+#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational
+ * parameters. (bit correspondend
+ * to WRAP_INTERFACE is ignored)
+ * S: completion. (reject:
+ * COMMAND_REJECT)
+ */
+#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in
+ * adapter group address.
+ * S: completion. (reject:
+ * COMMAND_REJECT)
+ */
+#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the
+ * adapter hardware to use when frames
+ * are copied for forwarding.
+ * S: completion. (reject:
+ * COMMAND_REJECT)
+ */
+#define CONFIG_BRIDGE_PARMS 0x1100 /* C: ..
+ * S: completion. (reject:
+ * COMMAND_REJECT)
+ */
+
+#define SPEED_4 4
+#define SPEED_16 16 /* Default transmission speed */
+
+
+/* Initialization Parameter Block (IPB); word alignment necessary! */
+#define BURST_SIZE 0x0018 /* Default burst size */
+#define BURST_MODE 0x9F00 /* Burst mode enable */
+#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */
+
+#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns
+ * (later adapter version: fix cycle time!)
+ */
+#define LINE_SPEED_BIT 0x80
+
+/* Macro definition for the wait function. */
+#define ONE_SECOND_TICKS 1000000
+#define HALF_SECOND (ONE_SECOND_TICKS / 2)
+#define ONE_SECOND (ONE_SECOND_TICKS)
+#define TWO_SECONDS (ONE_SECOND_TICKS * 2)
+#define THREE_SECONDS (ONE_SECOND_TICKS * 3)
+#define FOUR_SECONDS (ONE_SECOND_TICKS * 4)
+#define FIVE_SECONDS (ONE_SECOND_TICKS * 5)
+
+#define BUFFER_SIZE 2048 /* Buffers on Adapter */
+
+#pragma pack(1)
+typedef struct {
+ unsigned short Init_Options; /* Initialize with burst mode;
+ * LLC disabled. (MAC only)
+ */
+
+ /* Interrupt vectors the adapter places on attached system bus. */
+ unsigned char CMD_Status_IV; /* Interrupt vector: command status. */
+ unsigned char TX_IV; /* Interrupt vector: transmit. */
+ unsigned char RX_IV; /* Interrupt vector: receive. */
+ unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */
+ unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */
+ unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */
+
+ unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */
+ unsigned short TX_Burst_Size; /* During DMA burst; even value! */
+ unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */
+
+ unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */
+ unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */
+} IPB, *IPB_Ptr;
+#pragma pack()
+
+/*
+ * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to
+ * be reopened)
+ */
+#define BUFFER_SIZE 2048 /* Buffers on Adapter. */
+#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */
+#define RPL_SIZE 14 /* (with TI firmware v2.26 handling
+ * up to nine fragments possible)
+ */
+#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */
+#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ???
+ */
+#define DISABLE_EARLY_TOKEN_RELEASE 0x1000
+
+/* OPEN Options (high-low) */
+#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test
+ * purposes; transmit data appears
+ * as receive data. (usefull for
+ * testing; change: CLOSE necessary)
+ */
+#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON
+ * no RING.STATUS interrupt.
+ */
+#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS
+ * interrupt.
+ */
+#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames
+ * to system.
+ */
+#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are
+ * passed to the system.
+ */
+#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18
+ * bytes.
+ */
+#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before
+ * initiating DMA transfer; otherwise:
+ * DMA transfer initiation if internal
+ * buffer filled.
+ */
+#define CONTENDER 0x0001 /* Adapter participates in the monitor
+ * contention process.
+ */
+#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames
+ * to the system.
+ */
+#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation;
+ * 0 = ETR. (no effect in 4 Mbps
+ * operation)
+ */
+#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to
+ * the system. (after OPEN: duplicate
+ * address test (DAT) MAC frame is
+ * first received frame copied to the
+ * system)
+ */
+#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to
+ * the system.
+ */
+#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer
+ * of each received frame; FrameSize
+ * of RPLs must contain internal
+ * BUFFER_SIZE bits for promiscous mode.
+ */
+#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex
+ * settings with bits in byte 22 in
+ * ocpl. (new feature in firmware
+ * version 3.09)
+ */
+
+/* Full-duplex settings */
+#define OPEN_FULL_DUPLEX_OFF 0x0000
+#define OPEN_FULL_DUPLEX_ON 0x00c0
+#define OPEN_FULL_DUPLEX_AUTO 0x0080
+
+#define PROD_ID_SIZE 18 /* Length of product ID. */
+
+#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */
+#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more
+ * fragments following.
+ */
+
+#define ISA_MAX_ADDRESS 0x00ffffff
+
+#pragma pack(1)
+typedef struct {
+ unsigned short OPENOptions;
+ unsigned char NodeAddr[6]; /* Adapter node address; use ROM
+ * address
+ */
+ unsigned long GroupAddr; /* Multicast: high order
+ * bytes = 0xC000
+ */
+ unsigned long FunctAddr; /* High order bytes = 0xC000 */
+ unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or
+ * 26 bytes read by the adapter.
+ * (Depending on the number of
+ * fragments/list)
+ */
+ unsigned short TxListSize; /* TPL size */
+ unsigned short BufSize; /* Is automatically rounded up to the
+ * nearest nK boundary.
+ */
+ unsigned short FullDuplex;
+ unsigned short Reserved;
+ unsigned char TXBufMin; /* Number of adapter buffers reserved
+ * for transmission a minimum of 2
+ * buffers must be allocated.
+ */
+ unsigned char TXBufMax; /* Maximum number of adapter buffers
+ * for transmit; a minimum of 2 buffers
+ * must be available for receive.
+ * Default: 6
+ */
+ unsigned short ProdIDAddr[2]; /* Pointer to product ID. */
+} OPB, *OPB_Ptr;
+#pragma pack()
+
+/*
+ * SCB: adapter commands enabled by the host system started by writing
+ * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO
+ * register. (special case: | CMD_SYSTEM_IRQ for initialization)
+ */
+#pragma pack(1)
+typedef struct {
+ unsigned short CMD; /* Command code */
+ unsigned short Parm[2]; /* Pointer to Command Parameter Block */
+} SCB; /* System Command Block (32 bit physical address; big endian)*/
+#pragma pack()
+
+/*
+ * SSB: adapter command return status can be evaluated after COMMAND_STATUS
+ * adapter to system interrupt after reading SSB, the availability of the SSB
+ * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR
+ * in the SIFCMD IO register.
+ */
+#pragma pack(1)
+typedef struct {
+ unsigned short STS; /* Status code */
+ unsigned short Parm[3]; /* Parameter or pointer to Status Parameter
+ * Block.
+ */
+} SSB; /* System Status Block (big endian - physical address) */
+#pragma pack()
+
+typedef struct {
+ unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in
+ * address. (BIA)
+ */
+ unsigned short SoftwareLevelPtr;/* Pointer to software level data. */
+ unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */
+ unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */
+ unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */
+ unsigned short LLCCountersPtr; /* Pointer to LLC counters. */
+ unsigned short SpeedFlagPtr; /* Pointer to data rate flag.
+ * (4/16 Mbps)
+ */
+ unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */
+} INTPTRS; /* Adapter internal pointers */
+
+#pragma pack(1)
+typedef struct {
+ unsigned char Line_Error; /* Line error: code violation in
+ * frame or in a token, or FCS error.
+ */
+ unsigned char Internal_Error; /* IBM specific. (Reserved_1) */
+ unsigned char Burst_Error;
+ unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or
+ * SMP MAC frame.
+ */
+ unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */
+ unsigned char Reserved_3;
+ unsigned char Lost_Frame_Error; /* Receive of end of transmitted
+ * frame failed.
+ */
+ unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not
+ * enough buffer space to copy incoming
+ * frame.
+ */
+ unsigned char Frame_Copied_Error;/* ARI bit not zero in frame
+ * addressed to adapter.
+ */
+ unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */
+ unsigned char Token_Error; /* (active only in monitor station) */
+ unsigned char Reserved_5;
+ unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the
+ * abort thresholds.
+ */
+ unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding
+ * the abort thresholds.
+ */
+} ERRORTAB; /* Adapter error counters */
+#pragma pack()
+
+
+/*--------------------- Send and Receive definitions -------------------*/
+#pragma pack(1)
+typedef struct {
+ unsigned short DataCount; /* Value 0, even and odd values are
+ * permitted; value is unaltered most
+ * significant bit set: following
+ * fragments last fragment: most
+ * significant bit is not evaluated.
+ * (???)
+ */
+ unsigned long DataAddr; /* Pointer to frame data fragment;
+ * even or odd.
+ */
+} Fragment;
+#pragma pack()
+
+#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use
+ * in one RPL/TPL. (depending on TI firmware
+ * version)
+ */
+#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */
+
+/*
+ * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504
+ * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176,
+ * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide
+ * Page 2-27.
+ */
+#define HEADER_SIZE (1 + 1 + 6 + 6)
+#define SRC_SIZE 18
+#define MIN_DATA_SIZE 516
+#define DEFAULT_DATA_SIZE 4472
+#define MAX_DATA_SIZE 17800
+
+#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE)
+#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE)
+#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE)
+
+/*
+ * Macros to deal with the frame status field.
+ */
+#define AC_NOT_RECOGNIZED 0x00
+#define GROUP_BIT 0x80
+#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8))
+#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6))
+#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2))
+#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT))
+
+
+/*--------------------- Send Functions ---------------------------------*/
+/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */
+
+#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt.
+ * C: always reset to zero!
+ */
+#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero.
+ * C: set to one.
+ */
+#define TX_START_FRAME 0x0020 /* R: start of a frame: 1
+ * C: unchanged.
+ */
+#define TX_END_FRAME 0x0010 /* R: end of a frame: 1
+ * C: unchanged.
+ */
+#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation
+ * after transmission.
+ * C: unchanged.
+ */
+#define TX_ERROR 0x0004 /* R: reserved.
+ * C: set to one if Error occurred.
+ */
+#define TX_INTERFRAME_WAIT 0x0004
+#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already
+ * calculated. (valid only in
+ * FRAME_START TPL)
+ * C: unchanged.
+ */
+#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame
+ * source address and does not overwrite
+ * with the adapter node address.
+ * (valid only in FRAME_START TPL)
+ *
+ * C: unchanged.
+ */
+#define TX_STRIP_FS 0xFF00 /* R: reserved.
+ * C: if no Transmission Error,
+ * field contains copy of FS byte after
+ * stripping of frame.
+ */
+
+/*
+ * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL,
+ * but possibly multiple TPLs for one frame) the length of the TPLs has to be
+ * initialized in the OPL. (OPEN parameter list)
+ */
+#define TPL_NUM 9 /* Number of Transmit Parameter Lists.
+ * !! MUST BE >= 3 !!
+ */
+
+#pragma pack(1)
+typedef struct s_TPL TPL;
+
+struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */
+ unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if
+ * pointer is odd: this is the last
+ * TPL. Pointing to itself can cause
+ * problems!
+ */
+ volatile unsigned short Status; /* Initialized by the adapter:
+ * CSTAT_REQUEST important: update least
+ * significant bit first! Set by the
+ * adapter: CSTAT_COMPLETE status.
+ */
+ unsigned short FrameSize; /* Number of bytes to be transmitted
+ * as a frame including AC/FC,
+ * Destination, Source, Routing field
+ * not including CRC, FS, End Delimiter
+ * (valid only if START_FRAME bit in
+ * CSTAT nonzero) must not be zero in
+ * any list; maximum value: (BUFFER_SIZE
+ * - 8) * TX_BUF_MAX sum of DataCount
+ * values in FragmentList must equal
+ * Frame_Size value in START_FRAME TPL!
+ * frame data fragment list.
+ */
+
+ /* TPL/RPL size in OPEN parameter list depending on maximal
+ * numbers of fragments used in one parameter list.
+ */
+ Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one
+ * TPL actual version of firmware: 9
+ * fragments possible.
+ */
+#pragma pack()
+
+ /* Special proprietary data and precalculations */
+
+ TPL *NextTPLPtr; /* Pointer to next TPL in chain. */
+ unsigned char *MData;
+ struct sk_buff *Skb;
+ unsigned char TPLIndex;
+ volatile unsigned char BusyFlag;/* Flag: TPL busy? */
+};
+
+/* ---------------------Receive Functions-------------------------------*
+ * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values.
+ * (high-low)
+ */
+#define RX_VALID 0x0080 /* R: set; tell adapter with
+ * RECEIVE.VALID interrupt.
+ * C: reset to zero.
+ */
+#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero,
+ * C: set to one.
+ */
+#define RX_START_FRAME 0x0020 /* R: must be reset to zero.
+ * C: set to one on the list.
+ */
+#define RX_END_FRAME 0x0010 /* R: must be reset to zero.
+ * C: set to one on the list
+ * that ends the frame.
+ */
+#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation
+ * after receive.
+ * C: unchanged.
+ */
+#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame:
+ * interrupt and wait for a
+ * RECEIVE.CONTINUE.
+ * C: unchanged.
+ */
+#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes
+ * the CRC in data passed. (last four
+ * bytes; valid only if FRAME_START is
+ * set)
+ * C: set, if CRC is included in
+ * received data.
+ */
+#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame
+ * source address and does not
+ * overwrite with the adapter node
+ * address. (valid only if FRAME_START
+ * is set)
+ * C: unchanged.
+ */
+#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero.
+ * C: on lists with START_FRAME, field
+ * contains frame status field from
+ * received frame; otherwise cleared.
+ */
+#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero.
+ * C: address match code mask.
+ */
+#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */
+
+#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */
+#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via
+ * XMATCH/XFAIL interface.
+ */
+#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally
+ * matched.
+ */
+#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */
+
+/* Constants for Command Status Interrupt.
+ * COMMAND_REJECT status field bit functions (SSB.Parm[0])
+ */
+#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command
+ * is issued to the adapter
+ */
+#define ADDRESS_ERROR 0x0040 /* Set if any address field in
+ * the SCB is odd. (not word aligned)
+ */
+#define ADAPTER_OPEN 0x0020 /* Command issued illegal with
+ * open adapter.
+ */
+#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with
+ * closed adapter.
+ */
+#define SAME_COMMAND 0x0008 /* Command issued with same command
+ * already executing.
+ */
+
+/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */
+#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read
+ * zero address.
+ */
+#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0,
+ * 14, 20, 26.
+ */
+#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for
+ * two buffers.
+ */
+#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than
+ * two.
+ */
+#define OPEN_ERROR 0x0002 /* Error during ring insertion; more
+ * information in bits 8-15.
+ */
+
+/* Standard return codes */
+#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */
+#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by
+ * the adapter.
+ */
+
+/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */
+#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */
+#define LOBE_MEDIA_TEST 0x1000
+#define PHYSICAL_INSERTION 0x2000
+#define ADDRESS_VERIFICATION 0x3000
+#define PARTICIPATION_IN_RING_POLL 0x4000
+#define REQUEST_INITIALISATION 0x5000
+#define FULLDUPLEX_CHECK 0x6000
+
+/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */
+#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */
+#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or
+ * frames received before insertion.
+ */
+#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at
+ * receiver.
+ */
+#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before
+ * logical insertion.
+ */
+#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge
+ * MAC frames.
+ */
+#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after
+ * ring insertion.
+ */
+#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found
+ * with the same address.
+ */
+#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */
+#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter
+ * MAC frame.
+ */
+#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when
+ * trying to connect to a normal ring.
+ */
+
+/* SET_BRIDGE_PARMS return codes: */
+#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd,
+ * less than 6 or > 30.
+ */
+#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large
+ * or = TARGET_RING.
+ */
+#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large
+ * or = SOURCE_RING.
+ */
+#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */
+#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */
+#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */
+#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW
+ * configuration.
+ */
+
+/*
+ * Bring Up Diagnostics error codes.
+ */
+#define BUD_INITIAL_ERROR 0x0
+#define BUD_CHECKSUM_ERROR 0x1
+#define BUD_ADAPTER_RAM_ERROR 0x2
+#define BUD_INSTRUCTION_ERROR 0x3
+#define BUD_CONTEXT_ERROR 0x4
+#define BUD_PROTOCOL_ERROR 0x5
+#define BUD_INTERFACE_ERROR 0x6
+
+/* BUD constants */
+#define BUD_MAX_RETRIES 3
+#define BUD_MAX_LOOPCNT 6
+#define BUD_TIMEOUT 3000
+
+/* Initialization constants */
+#define INIT_MAX_RETRIES 3 /* Maximum three retries. */
+#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */
+
+/* RING STATUS field values (high/low) */
+#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring
+ * detected.
+ */
+#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon
+ * frames.
+ */
+#define SOFT_ERROR 0x0020 /* Report error MAC frame
+ * transmitted.
+ */
+#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the
+ * ring.
+ */
+#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the
+ * cable to concentrator; adapter
+ * closed.
+ */
+#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted;
+ * adapter closed.
+ */
+#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC
+ * MAC frame request; adapter closed.
+ */
+#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters
+ * error counters; READ.ERROR.LOG.
+ */
+#define SINGLE_STATION 0x4000 /* Adapter is the only station on the
+ * ring.
+ */
+#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring;
+ * reset after ring purge frame.
+ */
+
+#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\
+ REMOVE_RECEIVED)
+
+/* Adapter_check_block.Status field bit assignments: */
+#define DIO_PARITY 0x8000 /* Adapter detects bad parity
+ * through direct I/O access.
+ */
+#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation
+ * from system Parm[0]: 0=timeout,
+ * 1=parity error, 2=bus error;
+ * Parm[1]: 32 bit pointer to host
+ * system address at failure.
+ */
+#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation
+ * to system. (parameters analogous to
+ * DMA_READ_ABORT)
+ */
+#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the
+ * the adapters firmware Parm[0]-2:
+ * communications processor registers
+ * R13-R15.
+ */
+#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus
+ * parity error.
+ */
+#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing;
+ * RAM data error Parm[0-1]: 32 bit
+ * pointer to RAM location.
+ */
+#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing;
+ * RAM parity error Parm[0-1]: 32 bit
+ * pointer to RAM location.
+ */
+#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when
+ * transmitting onto ring.
+ */
+#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated
+ * internal to adapter Parm[0-2]:
+ * adapter register R13-R15.
+ */
+#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt
+ * generated Parm[0-2]: adapter register
+ * R13-R15.
+ */
+#define INVALID_XOP 0x0002 /* Unrecognized XOP request in
+ * communication processor Parm[0-2]:
+ * adapter register R13-R15.
+ */
+#define CHECKADDR 0x05E0 /* Adapter check status information
+ * address offset.
+ */
+#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */
+
+/*
+ * RECEIVE.STATUS interrupt result SSB values: (high-low)
+ * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0])
+ */
+#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32
+ * bit pointer to last RPL.
+ */
+#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32
+ * bit pointer to RPL with odd
+ * forward pointer.
+ */
+
+/* Valid receive CSTAT: */
+#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \
+ RX_FRAME_COMPLETE)
+#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \
+ RX_FRAME_COMPLETE)
+
+typedef enum SKB_STAT SKB_STAT;
+enum SKB_STAT {
+ SKB_UNAVAILABLE,
+ SKB_DMA_DIRECT,
+ SKB_DATA_COPY
+};
+
+/* Receive Parameter List (RPL) The length of the RPLs has to be initialized
+ * in the OPL. (OPEN parameter list)
+ */
+#define RPL_NUM 3
+
+#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL.
+ * (up to firmware v2.24: 3, now: up to 9)
+ */
+
+#pragma pack(1)
+typedef struct s_RPL RPL;
+struct s_RPL { /* Receive Parameter List */
+ unsigned long NextRPLAddr; /* Pointer to next RPL in chain
+ * (normalized = physical 32 bit
+ * address) if pointer is odd: this
+ * is last RPL. Pointing to itself can
+ * cause problems!
+ */
+ volatile unsigned short Status; /* Set by creation of Receive Parameter
+ * List RECEIVE_CSTAT_COMPLETE set by
+ * adapter in lists that start or end
+ * a frame.
+ */
+ volatile unsigned short FrameSize; /* Number of bytes received as a
+ * frame including AC/FC, Destination,
+ * Source, Routing field not including
+ * CRC, FS (Frame Status), End Delimiter
+ * (valid only if START_FRAME bit in
+ * CSTAT nonzero) must not be zero in
+ * any list; maximum value: (BUFFER_SIZE
+ * - 8) * TX_BUF_MAX sum of DataCount
+ * values in FragmentList must equal
+ * Frame_Size value in START_FRAME TPL!
+ * frame data fragment list
+ */
+
+ /* TPL/RPL size in OPEN parameter list depending on maximal numbers
+ * of fragments used in one parameter list.
+ */
+ Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in
+ * one TPL. Actual version of firmware:
+ * 9 fragments possible.
+ */
+#pragma pack()
+
+ /* Special proprietary data and precalculations. */
+ RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */
+ unsigned char *MData;
+ struct sk_buff *Skb;
+ SKB_STAT SkbStat;
+ int RPLIndex;
+};
+
+/* Information that need to be kept for each board. */
+typedef struct net_local {
+#pragma pack(1)
+ IPB ipb; /* Initialization Parameter Block. */
+ SCB scb; /* System Command Block: system to adapter
+ * communication.
+ */
+ SSB ssb; /* System Status Block: adapter to system
+ * communication.
+ */
+ OPB ocpl; /* Open Options Parameter Block. */
+
+ ERRORTAB errorlogtable; /* Adapter statistic error counters.
+ * (read from adapter memory)
+ */
+ unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */
+#pragma pack()
+
+ TPL Tpl[TPL_NUM];
+ TPL *TplFree;
+ TPL *TplBusy;
+ unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE];
+
+ RPL Rpl[RPL_NUM];
+ RPL *RplHead;
+ RPL *RplTail;
+ unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE];
+
+ int DataRate;
+ unsigned char ScbInUse;
+ unsigned short CMDqueue;
+
+ unsigned int DeviceType;
+
+ unsigned long AdapterOpenFlag:1;
+ unsigned long AdapterVirtOpenFlag:1;
+ unsigned long OpenCommandIssued:1;
+ unsigned long TransmitCommandActive:1;
+ unsigned long TransmitHaltScheduled:1;
+ unsigned long HaltInProgress:1;
+ unsigned long LobeWireFaultLogged:1;
+ unsigned long ReOpenInProgress:1;
+ unsigned long Sleeping:1;
+
+ unsigned long LastOpenStatus;
+ unsigned short CurrentRingStatus;
+ unsigned long MaxPacketSize;
+
+ unsigned long StartTime;
+ unsigned long LastSendTime;
+
+ struct sk_buff_head SendSkbQueue;
+ unsigned short QueueSkb;
+
+ struct tr_statistics MacStat; /* MAC statistics structure */
+
+ struct timer_list timer;
+
+ wait_queue_head_t wait_for_tok_int;
+
+ INTPTRS intptrs; /* Internal adapter pointer. Must be read
+ * before OPEN command.
+ */
+} NET_LOCAL;
+
+#endif /* __KERNEL__ */
+#endif /* __LINUX_SKTR_H */
diff --git a/drivers/net/tokenring/sktr_firmware.h b/drivers/net/tokenring/sktr_firmware.h
new file mode 100644
index 000000000..25dd973d4
--- /dev/null
+++ b/drivers/net/tokenring/sktr_firmware.h
@@ -0,0 +1,3616 @@
+/*
+ * The firmware this driver downloads into the tokenring card is a
+ * separate program and is not GPL'd source code, even though the Linux
+ * side driver and the routine that loads this data into the card are.
+ *
+ * This firmware is licensed to you strictly for use in conjunction
+ * with the use of SysKonnect TokenRing adapters. There is no
+ * waranty expressed or implied about its fitness for any purpose.
+ */
+
+/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux.
+ *
+ * Notes:
+ * - Loaded from sktr_reset_adapter upon adapter reset.
+ *
+ * Authors:
+ * - Christoph Goos <cgoos@syskonnect.de>
+ */
+
+#include <linux/config.h>
+
+#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE)
+
+unsigned char sktr_code[] = {
+ 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54,
+ 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65,
+ 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65,
+ 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64,
+ 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E,
+ 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C,
+ 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67,
+ 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65,
+ 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01,
+ 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04,
+ 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01,
+ 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04,
+ 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01,
+ 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07,
+ 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02,
+ 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D,
+ 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90,
+ 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02,
+ 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00,
+ 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48,
+ 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01,
+ 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01,
+ 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16,
+ 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06,
+ 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00,
+ 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3,
+ 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00,
+ 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16,
+ 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07,
+ 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09,
+ 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06,
+ 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90,
+ 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09,
+ 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC,
+ 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07,
+ 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03,
+ 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10,
+ 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03,
+ 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00,
+ 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02,
+ 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04,
+ 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1,
+ 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04,
+ 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01,
+ 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01,
+ 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F,
+ 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02,
+ 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10,
+ 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04,
+ 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07,
+ 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8,
+ 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06,
+ 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10,
+ 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03,
+ 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80,
+ 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04,
+ 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02,
+ 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1,
+ 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02,
+ 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00,
+ 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07,
+ 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04,
+ 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16,
+ 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8,
+ 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0,
+ 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01,
+ 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13,
+ 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01,
+ 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07,
+ 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07,
+ 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16,
+ 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01,
+ 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02,
+ 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01,
+ 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0,
+ 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02,
+ 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C,
+ 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04,
+ 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8,
+ 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1,
+ 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1,
+ 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16,
+ 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2,
+ 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09,
+ 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90,
+ 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02,
+ 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C,
+ 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05,
+ 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06,
+ 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80,
+ 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82,
+ 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10,
+ 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01,
+ 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08,
+ 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10,
+ 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16,
+ 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01,
+ 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01,
+ 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01,
+ 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80,
+ 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10,
+ 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16,
+ 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16,
+ 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02,
+ 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01,
+ 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01,
+ 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01,
+ 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3,
+ 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07,
+ 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80,
+ 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10,
+ 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07,
+ 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00,
+ 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01,
+ 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE,
+ 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07,
+ 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07,
+ 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13,
+ 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40,
+ 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13,
+ 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01,
+ 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11,
+ 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07,
+ 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8,
+ 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01,
+ 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02,
+ 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8,
+ 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01,
+ 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01,
+ 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0,
+ 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01,
+ 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+ 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2,
+ 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52,
+ 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2,
+ 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01,
+ 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13,
+ 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07,
+ 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+ 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03,
+ 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1,
+ 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04,
+ 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07,
+ 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1,
+ 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5,
+ 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05,
+ 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2,
+ 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01,
+ 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01,
+ 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01,
+ 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2,
+ 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06,
+ 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07,
+ 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05,
+ 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2,
+ 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1,
+ 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00,
+ 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06,
+ 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8,
+ 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04,
+ 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01,
+ 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1,
+ 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8,
+ 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1,
+ 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06,
+ 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9,
+ 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06,
+ 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0,
+ 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09,
+ 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A,
+ 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5,
+ 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03,
+ 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09,
+ 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09,
+ 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8,
+ 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11,
+ 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00,
+ 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01,
+ 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01,
+ 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00,
+ 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC,
+ 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04,
+ 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01,
+ 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02,
+ 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3,
+ 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01,
+ 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01,
+ 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13,
+ 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC,
+ 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3,
+ 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8,
+ 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11,
+ 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3,
+ 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01,
+ 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07,
+ 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10,
+ 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC,
+ 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80,
+ 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C,
+ 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2,
+ 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09,
+ 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00,
+ 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8,
+ 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00,
+ 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01,
+ 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13,
+ 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13,
+ 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01,
+ 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2,
+ 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05,
+ 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80,
+ 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07,
+ 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01,
+ 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01,
+ 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11,
+ 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16,
+ 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16,
+ 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01,
+ 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09,
+ 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1,
+ 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC,
+ 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18,
+ 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16,
+ 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0,
+ 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13,
+ 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2,
+ 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2,
+ 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01,
+ 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13,
+ 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04,
+ 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16,
+ 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01,
+ 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5,
+ 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01,
+ 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00,
+ 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02,
+ 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81,
+ 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16,
+ 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02,
+ 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40,
+ 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13,
+ 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8,
+ 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10,
+ 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00,
+ 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16,
+ 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01,
+ 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09,
+ 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00,
+ 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0,
+ 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01,
+ 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00,
+ 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13,
+ 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10,
+ 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01,
+ 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00,
+ 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16,
+ 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07,
+ 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05,
+ 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC,
+ 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02,
+ 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD,
+ 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8,
+ 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD,
+ 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04,
+ 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81,
+ 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15,
+ 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C,
+ 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC,
+ 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2,
+ 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8,
+ 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06,
+ 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04,
+ 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00,
+ 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00,
+ 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00,
+ 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00,
+ 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00,
+ 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00,
+ 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18,
+ 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16,
+ 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00,
+ 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13,
+ 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC,
+ 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06,
+ 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5,
+ 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16,
+ 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00,
+ 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8,
+ 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01,
+ 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8,
+ 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00,
+ 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01,
+ 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8,
+ 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09,
+ 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01,
+ 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00,
+ 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06,
+ 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01,
+ 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00,
+ 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06,
+ 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00,
+ 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01,
+ 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00,
+ 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3,
+ 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8,
+ 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16,
+ 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2,
+ 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05,
+ 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00,
+ 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01,
+ 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1,
+ 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02,
+ 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13,
+ 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5,
+ 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03,
+ 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01,
+ 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF,
+ 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10,
+ 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00,
+ 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00,
+ 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2,
+ 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3,
+ 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13,
+ 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23,
+ 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0,
+ 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16,
+ 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2,
+ 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01,
+ 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00,
+ 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13,
+ 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0,
+ 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07,
+ 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01,
+ 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8,
+ 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10,
+ 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01,
+ 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC,
+ 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8,
+ 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04,
+ 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04,
+ 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04,
+ 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27,
+ 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5,
+ 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00,
+ 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00,
+ 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06,
+ 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13,
+ 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01,
+ 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03,
+ 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05,
+ 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8,
+ 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00,
+ 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00,
+ 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF,
+ 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04,
+ 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5,
+ 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05,
+ 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03,
+ 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00,
+ 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13,
+ 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00,
+ 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16,
+ 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2,
+ 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01,
+ 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2,
+ 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC,
+ 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07,
+ 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03,
+ 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05,
+ 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03,
+ 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2,
+ 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07,
+ 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00,
+ 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2,
+ 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13,
+ 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03,
+ 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06,
+ 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02,
+ 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1,
+ 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00,
+ 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22,
+ 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22,
+ 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00,
+ 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06,
+ 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04,
+ 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13,
+ 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA,
+ 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06,
+ 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10,
+ 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05,
+ 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05,
+ 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40,
+ 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01,
+ 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01,
+ 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2,
+ 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01,
+ 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2,
+ 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5,
+ 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2,
+ 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09,
+ 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00,
+ 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00,
+ 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3,
+ 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01,
+ 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8,
+ 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC,
+ 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2,
+ 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01,
+ 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0,
+ 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04,
+ 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC,
+ 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC,
+ 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05,
+ 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD,
+ 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02,
+ 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06,
+ 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06,
+ 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06,
+ 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16,
+ 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16,
+ 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2,
+ 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02,
+ 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00,
+ 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09,
+ 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD,
+ 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0,
+ 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13,
+ 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0,
+ 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8,
+ 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14,
+ 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01,
+ 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02,
+ 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC,
+ 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01,
+ 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8,
+ 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02,
+ 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06,
+ 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00,
+ 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02,
+ 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC,
+ 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02,
+ 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01,
+ 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16,
+ 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07,
+ 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10,
+ 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC,
+ 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04,
+ 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF,
+ 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC,
+ 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01,
+ 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02,
+ 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1,
+ 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04,
+ 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01,
+ 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06,
+ 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06,
+ 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40,
+ 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08,
+ 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01,
+ 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8,
+ 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04,
+ 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8,
+ 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80,
+ 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16,
+ 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06,
+ 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10,
+ 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1,
+ 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16,
+ 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13,
+ 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55,
+ 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13,
+ 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2,
+ 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02,
+ 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00,
+ 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01,
+ 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8,
+ 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02,
+ 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02,
+ 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00,
+ 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12,
+ 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01,
+ 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02,
+ 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05,
+ 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00,
+ 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10,
+ 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8,
+ 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC,
+ 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC,
+ 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13,
+ 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13,
+ 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8,
+ 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00,
+ 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42,
+ 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00,
+ 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72,
+ 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72,
+ 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB,
+ 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1,
+ 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2,
+ 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02,
+ 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16,
+ 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB,
+ 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03,
+ 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01,
+ 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6,
+ 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0,
+ 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB,
+ 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00,
+ 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42,
+ 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06,
+ 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06,
+ 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00,
+ 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF,
+ 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72,
+ 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2,
+ 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00,
+ 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48,
+ 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00,
+ 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF,
+ 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6,
+ 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03,
+ 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1,
+ 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10,
+ 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71,
+ 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA,
+ 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02,
+ 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5,
+ 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04,
+ 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2,
+ 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2,
+ 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81,
+ 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2,
+ 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82,
+ 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62,
+ 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00,
+ 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA,
+ 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04,
+ 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61,
+ 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00,
+ 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7,
+ 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00,
+ 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00,
+ 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1,
+ 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2,
+ 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2,
+ 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16,
+ 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB,
+ 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13,
+ 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00,
+ 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00,
+ 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00,
+ 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07,
+ 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2,
+ 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00,
+ 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00,
+ 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13,
+ 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49,
+ 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB,
+ 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00,
+ 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07,
+ 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00,
+ 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1,
+ 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11,
+ 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01,
+ 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01,
+ 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01,
+ 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04,
+ 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00,
+ 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0,
+ 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00,
+ 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8,
+ 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09,
+ 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05,
+ 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07,
+ 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2,
+ 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01,
+ 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01,
+ 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07,
+ 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03,
+ 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01,
+ 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40,
+ 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13,
+ 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16,
+ 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0,
+ 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8,
+ 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8,
+ 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87,
+ 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07,
+ 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8,
+ 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01,
+ 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07,
+ 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07,
+ 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03,
+ 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09,
+ 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8,
+ 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09,
+ 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF,
+ 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80,
+ 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C,
+ 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04,
+ 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11,
+ 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00,
+ 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB,
+ 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0,
+ 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07,
+ 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1,
+ 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02,
+ 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02,
+ 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02,
+ 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C,
+ 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88,
+ 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2,
+ 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05,
+ 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B,
+ 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16,
+ 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8,
+ 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8,
+ 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07,
+ 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC,
+ 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C,
+ 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0,
+ 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04,
+ 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04,
+ 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8,
+ 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13,
+ 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13,
+ 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03,
+ 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC,
+ 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00,
+ 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2,
+ 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6,
+ 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC,
+ 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13,
+ 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01,
+ 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10,
+ 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0,
+ 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07,
+ 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00,
+ 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8,
+ 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC,
+ 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03,
+ 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC,
+ 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC,
+ 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2,
+ 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B,
+ 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B,
+ 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8,
+ 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01,
+ 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC,
+ 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07,
+ 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC,
+ 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13,
+ 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8,
+ 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2,
+ 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13,
+ 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09,
+ 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC,
+ 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2,
+ 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04,
+ 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01,
+ 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01,
+ 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70,
+ 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13,
+ 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02,
+ 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01,
+ 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8,
+ 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C,
+ 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8,
+ 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2,
+ 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04,
+ 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5,
+ 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2,
+ 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09,
+ 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04,
+ 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD,
+ 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8,
+ 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5,
+ 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9,
+ 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2,
+ 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5,
+ 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C,
+ 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01,
+ 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2,
+ 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20,
+ 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8,
+ 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06,
+ 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01,
+ 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8,
+ 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48,
+ 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A,
+ 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00,
+ 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02,
+ 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02,
+ 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59,
+ 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0,
+ 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0,
+ 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16,
+ 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60,
+ 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16,
+ 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01,
+ 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10,
+ 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04,
+ 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20,
+ 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20,
+ 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02,
+ 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16,
+ 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20,
+ 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00,
+ 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1,
+ 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05,
+ 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02,
+ 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13,
+ 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F,
+ 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25,
+ 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26,
+ 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26,
+ 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7,
+ 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07,
+ 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8,
+ 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07,
+ 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8,
+ 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07,
+ 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04,
+ 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF,
+ 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7,
+ 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01,
+ 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8,
+ 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8,
+ 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02,
+ 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90,
+ 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8,
+ 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01,
+ 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09,
+ 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06,
+ 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07,
+ 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07,
+ 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F,
+ 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3,
+ 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83,
+ 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01,
+ 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A,
+ 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF,
+ 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09,
+ 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16,
+ 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01,
+ 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80,
+ 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00,
+ 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16,
+ 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3,
+ 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8,
+ 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2,
+ 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2,
+ 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07,
+ 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF,
+ 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10,
+ 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3,
+ 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8,
+ 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04,
+ 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01,
+ 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A,
+ 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59,
+ 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04,
+ 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2,
+ 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03,
+ 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8,
+ 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00,
+ 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2,
+ 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40,
+ 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3,
+ 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16,
+ 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02,
+ 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07,
+ 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04,
+ 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13,
+ 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C,
+ 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07,
+ 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13,
+ 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1,
+ 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1,
+ 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3,
+ 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2,
+ 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00,
+ 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3,
+ 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01,
+ 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02,
+ 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8,
+ 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04,
+ 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1,
+ 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3,
+ 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0,
+ 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3,
+ 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40,
+ 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01,
+ 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01,
+ 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0,
+ 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8,
+ 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF,
+ 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40,
+ 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3,
+ 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13,
+ 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02,
+ 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0,
+ 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07,
+ 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0,
+ 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27,
+ 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3,
+ 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04,
+ 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07,
+ 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04,
+ 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06,
+ 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07,
+ 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06,
+ 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2,
+ 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07,
+ 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3,
+ 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07,
+ 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07,
+ 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80,
+ 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06,
+ 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3,
+ 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07,
+ 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A,
+ 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF,
+ 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13,
+ 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08,
+ 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8,
+ 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0,
+ 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04,
+ 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0,
+ 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01,
+ 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88,
+ 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0,
+ 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01,
+ 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC,
+ 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8,
+ 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05,
+ 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01,
+ 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05,
+ 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01,
+ 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC,
+ 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07,
+ 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01,
+ 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13,
+ 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02,
+ 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00,
+ 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16,
+ 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3,
+ 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13,
+ 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01,
+ 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3,
+ 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13,
+ 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3,
+ 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0,
+ 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C,
+ 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05,
+ 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2,
+ 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06,
+ 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3,
+ 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09,
+ 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02,
+ 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04,
+ 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01,
+ 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13,
+ 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40,
+ 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2,
+ 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07,
+ 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF,
+ 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09,
+ 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07,
+ 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06,
+ 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04,
+ 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00,
+ 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02,
+ 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13,
+ 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD,
+ 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11,
+ 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3,
+ 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02,
+ 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12,
+ 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF,
+ 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03,
+ 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3,
+ 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16,
+ 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01,
+ 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05,
+ 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10,
+ 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09,
+ 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04,
+ 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8,
+ 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09,
+ 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3,
+ 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16,
+ 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04,
+ 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07,
+ 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3,
+ 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16,
+ 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07,
+ 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13,
+ 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02,
+ 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C,
+ 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16,
+ 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00,
+ 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00,
+ 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00,
+ 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD,
+ 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00,
+ 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD,
+ 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07,
+ 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11,
+ 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2,
+ 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02,
+ 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72,
+ 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B,
+ 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B,
+ 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09,
+ 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0,
+ 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8,
+ 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC,
+ 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02,
+ 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02,
+ 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D,
+ 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04,
+ 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06,
+ 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E,
+ 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00,
+ 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE,
+ 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0,
+ 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09,
+ 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8,
+ 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09,
+ 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48,
+ 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0,
+ 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13,
+ 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D,
+ 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06,
+ 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0,
+ 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16,
+ 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09,
+ 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09,
+ 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD,
+ 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07,
+ 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04,
+ 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E,
+ 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73,
+ 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04,
+ 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07,
+ 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0,
+ 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00,
+ 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C,
+ 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE,
+ 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0,
+ 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10,
+ 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0,
+ 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09,
+ 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01,
+ 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01,
+ 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3,
+ 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF,
+ 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07,
+ 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF,
+ 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13,
+ 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20,
+ 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10,
+ 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01,
+ 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01,
+ 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09,
+ 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3,
+ 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3,
+ 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8,
+ 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8,
+ 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80,
+ 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0,
+ 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04,
+ 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00,
+ 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07,
+ 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16,
+ 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07,
+ 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07,
+ 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08,
+ 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43,
+ 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10,
+ 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06,
+ 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07,
+ 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04,
+ 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44,
+ 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80,
+ 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07,
+ 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07,
+ 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07,
+ 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C,
+ 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10,
+ 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08,
+ 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA,
+ 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0,
+ 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05,
+ 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04,
+ 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0,
+ 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00,
+ 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01,
+ 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02,
+ 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00,
+ 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80,
+ 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3,
+ 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13,
+ 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13,
+ 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09,
+ 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13,
+ 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00,
+ 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8,
+ 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02,
+ 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3,
+ 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2,
+ 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00,
+ 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09,
+ 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13,
+ 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03,
+ 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20,
+ 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10,
+ 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02,
+ 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07,
+ 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04,
+ 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C,
+ 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02,
+ 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00,
+ 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2,
+ 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01,
+ 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00,
+ 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14,
+ 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40,
+ 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8,
+ 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2,
+ 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05,
+ 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09,
+ 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02,
+ 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13,
+ 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30,
+ 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13,
+ 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A,
+ 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09,
+ 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09,
+ 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16,
+ 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09,
+ 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A,
+ 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08,
+ 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16,
+ 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02,
+ 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3,
+ 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01,
+ 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02,
+ 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06,
+ 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06,
+ 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01,
+ 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02,
+ 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02,
+ 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16,
+ 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82,
+ 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01,
+ 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02,
+ 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10,
+ 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07,
+ 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13,
+ 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00,
+ 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0,
+ 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08,
+ 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08,
+ 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02,
+ 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07,
+ 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09,
+ 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08,
+ 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08,
+ 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08,
+ 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07,
+ 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3,
+ 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6,
+ 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40,
+ 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10,
+ 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0,
+ 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01,
+ 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16,
+ 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA,
+ 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04,
+ 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00,
+ 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07,
+ 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2,
+ 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F,
+ 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06,
+ 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16,
+ 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09,
+ 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0,
+ 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF,
+ 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2,
+ 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06,
+ 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07,
+ 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0,
+ 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04,
+ 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0,
+ 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13,
+ 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0,
+ 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03,
+ 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40,
+ 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06,
+ 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04,
+ 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07,
+ 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04,
+ 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23,
+ 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04,
+ 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07,
+ 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00,
+ 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07,
+ 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00,
+ 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00,
+ 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84,
+ 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E,
+ 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00,
+ 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00,
+ 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05,
+ 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07,
+ 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00,
+ 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8,
+ 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00,
+ 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00,
+ 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40,
+ 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1,
+ 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68,
+ 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8,
+ 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC,
+ 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00,
+ 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07,
+ 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00,
+ 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA,
+ 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3,
+ 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1,
+ 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06,
+ 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07,
+ 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3,
+ 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06,
+ 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01,
+ 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08,
+ 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3,
+ 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16,
+ 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA,
+ 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00,
+ 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3,
+ 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3,
+ 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0,
+ 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04,
+ 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13,
+ 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08,
+ 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8,
+ 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01,
+ 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00,
+ 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10,
+ 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08,
+ 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08,
+ 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07,
+ 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11,
+ 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00,
+ 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07,
+ 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08,
+ 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8,
+ 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07,
+ 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01,
+ 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02,
+ 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07,
+ 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00,
+ 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10,
+ 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8,
+ 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01,
+ 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00,
+ 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01,
+ 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC,
+ 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00,
+ 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08,
+ 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8,
+ 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07,
+ 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1,
+ 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1,
+ 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1,
+ 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13,
+ 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16,
+ 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16,
+ 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08,
+ 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10,
+ 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07,
+ 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06,
+ 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10,
+ 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2,
+ 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8,
+ 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC,
+ 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00,
+ 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00,
+ 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08,
+ 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81,
+ 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2,
+ 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01,
+ 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE,
+ 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2,
+ 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01,
+ 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2,
+ 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61,
+ 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05,
+ 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08,
+ 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13,
+ 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4,
+ 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20,
+ 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10,
+ 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07,
+ 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00,
+ 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00,
+ 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2,
+ 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01,
+ 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42,
+ 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13,
+ 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1,
+ 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06,
+ 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01,
+ 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01,
+ 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2,
+ 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09,
+ 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF,
+ 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00,
+ 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02,
+ 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3,
+ 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06,
+ 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00,
+ 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15,
+ 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02,
+ 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02,
+ 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00,
+ 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00,
+ 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11,
+ 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13,
+ 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00,
+ 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3,
+ 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16,
+ 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3,
+ 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02,
+ 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15,
+ 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05,
+ 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04,
+ 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09,
+ 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20,
+ 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10,
+ 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07,
+ 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13,
+ 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00,
+ 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0,
+ 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8,
+ 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8,
+ 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04,
+ 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02,
+ 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07,
+ 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70,
+ 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10,
+ 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0,
+ 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06,
+ 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8,
+ 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA,
+ 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10,
+ 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07,
+ 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04,
+ 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01,
+ 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08,
+ 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07,
+ 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02,
+ 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07,
+ 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0,
+ 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07,
+ 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07,
+ 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8,
+ 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80,
+ 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82,
+ 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08,
+ 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04,
+ 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13,
+ 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC,
+ 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2,
+ 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01,
+ 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E,
+ 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16,
+ 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16,
+ 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09,
+ 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01,
+ 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15,
+ 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8,
+ 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15,
+ 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8,
+ 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08,
+ 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08,
+ 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA,
+ 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82,
+ 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08,
+ 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08,
+ 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08,
+ 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04,
+ 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8,
+ 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08,
+ 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8,
+ 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02,
+ 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07,
+ 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB,
+ 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00,
+ 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1,
+ 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16,
+ 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01,
+ 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01,
+ 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE,
+ 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04,
+ 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8,
+ 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81,
+ 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08,
+ 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17,
+ 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01,
+ 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00,
+ 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A,
+ 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08,
+ 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05,
+ 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01,
+ 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04,
+ 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70,
+ 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07,
+ 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10,
+ 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01,
+ 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06,
+ 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06,
+ 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D,
+ 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16,
+ 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08,
+ 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70,
+ 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88,
+ 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88,
+ 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01,
+ 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07,
+ 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07,
+ 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3,
+ 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17,
+ 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07,
+ 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07,
+ 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08,
+ 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17,
+ 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8,
+ 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08,
+ 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13,
+ 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06,
+ 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10,
+ 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7,
+ 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA,
+ 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07,
+ 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13,
+ 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF,
+ 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0,
+ 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8,
+ 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2,
+ 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC,
+ 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01,
+ 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03,
+ 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC,
+ 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8,
+ 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8,
+ 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06,
+ 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16,
+ 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01,
+ 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13,
+ 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04,
+ 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8,
+ 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08,
+ 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13,
+ 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00,
+ 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13,
+ 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F,
+ 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B,
+ 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2,
+ 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83,
+ 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC,
+ 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04,
+ 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07,
+ 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07,
+ 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06,
+ 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08,
+ 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8,
+ 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04,
+ 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08,
+ 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8,
+ 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04,
+ 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2,
+ 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07,
+ 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08,
+ 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08,
+ 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01,
+ 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2,
+ 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07,
+ 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3,
+ 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01,
+ 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07,
+ 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01,
+ 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0,
+ 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07,
+ 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08,
+ 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08,
+ 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06,
+ 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10,
+ 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00,
+ 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07,
+ 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00,
+ 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3,
+ 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07,
+ 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB,
+ 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03,
+ 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3,
+ 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC,
+ 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13,
+ 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB,
+ 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00,
+ 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF,
+ 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04,
+ 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22,
+ 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07,
+ 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03,
+ 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00,
+ 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF,
+ 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07,
+ 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07,
+ 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07,
+ 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07,
+ 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2,
+ 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01,
+ 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2,
+ 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07,
+ 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05,
+ 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01,
+ 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC,
+ 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE,
+ 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22,
+ 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0,
+ 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00,
+ 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04,
+ 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16,
+ 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5,
+ 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16,
+ 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5,
+ 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10,
+ 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC,
+ 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9,
+ 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD,
+ 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01,
+ 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07,
+ 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09,
+ 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03,
+ 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03,
+ 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93,
+ 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00,
+ 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04,
+ 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2,
+ 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16,
+ 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07,
+ 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2,
+ 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04,
+ 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04,
+ 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01,
+ 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC,
+ 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3,
+ 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3,
+ 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC,
+ 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00,
+ 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13,
+ 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10,
+ 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0,
+ 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13,
+ 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23,
+ 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0,
+ 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01,
+ 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06,
+ 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0,
+ 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16,
+ 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16,
+ 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16,
+ 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00,
+ 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1,
+ 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0,
+ 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01,
+ 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43,
+ 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04,
+ 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0,
+ 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21,
+ 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00,
+ 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00,
+ 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01,
+ 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE,
+ 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00,
+ 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10,
+ 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04,
+ 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8,
+ 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09,
+ 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04,
+ 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10,
+ 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06,
+ 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6,
+ 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3,
+ 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0,
+ 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23,
+ 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83,
+ 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3,
+ 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3,
+ 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71,
+ 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23,
+ 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13,
+ 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07,
+ 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23,
+ 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10,
+ 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00,
+ 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03,
+ 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06,
+ 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03,
+ 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10,
+ 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04,
+ 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05,
+ 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07,
+ 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07,
+ 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1,
+ 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0,
+ 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05,
+ 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3,
+ 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16,
+ 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04,
+ 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07,
+ 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07,
+ 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07,
+ 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88,
+ 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07,
+ 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07,
+ 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06,
+ 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16,
+ 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06,
+ 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10,
+ 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04,
+ 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00,
+ 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8,
+ 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0,
+ 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13,
+ 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8,
+ 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00,
+ 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13,
+ 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02,
+ 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80,
+ 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2,
+ 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81,
+ 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16,
+ 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02,
+ 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80,
+ 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16,
+ 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B,
+ 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13,
+ 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98,
+ 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1,
+ 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2,
+ 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1,
+ 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16,
+ 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6,
+ 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE,
+ 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1,
+ 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02,
+ 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0,
+ 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF,
+ 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13,
+ 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0,
+ 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F,
+ 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03,
+ 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16,
+ 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10,
+ 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16,
+ 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98,
+ 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07,
+ 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20,
+ 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80,
+ 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71,
+ 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80,
+ 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04,
+ 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82,
+ 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16,
+ 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92,
+ 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0,
+ 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05,
+ 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0,
+ 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07,
+ 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8,
+ 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0,
+ 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02,
+ 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01,
+ 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23,
+ 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0,
+ 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23,
+ 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3,
+ 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0,
+ 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10,
+ 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07,
+ 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00,
+ 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE,
+ 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06,
+ 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43,
+ 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01,
+ 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16,
+ 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04,
+ 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13,
+ 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0,
+ 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10,
+ 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00,
+ 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21,
+ 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84,
+ 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0,
+ 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3,
+ 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93,
+ 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0,
+ 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13,
+ 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0,
+ 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE,
+ 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92,
+ 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0,
+ 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06,
+ 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04,
+ 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8,
+ 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0,
+ 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07,
+ 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23,
+ 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07,
+ 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0,
+ 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0,
+ 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16,
+ 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE,
+ 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23,
+ 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00,
+ 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93,
+ 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00,
+ 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0,
+ 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98,
+ 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8,
+ 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1,
+ 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16,
+ 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13,
+ 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02,
+ 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04,
+ 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20,
+ 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13,
+ 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2,
+ 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09,
+ 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00,
+ 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01,
+ 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06,
+ 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10,
+ 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07,
+ 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10,
+ 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13,
+ 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07,
+ 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8,
+ 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8,
+ 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8,
+ 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09,
+ 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01,
+ 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2,
+ 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04,
+ 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04,
+ 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06,
+ 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0,
+ 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04,
+ 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02,
+ 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48,
+ 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09,
+ 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07,
+ 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07,
+ 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04,
+ 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8,
+ 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04,
+ 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01,
+ 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23,
+ 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0,
+ 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16,
+ 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02,
+ 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04,
+ 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11,
+ 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0,
+ 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0,
+ 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C,
+ 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01,
+ 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED,
+ 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06,
+ 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16,
+ 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF,
+ 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06,
+ 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2,
+ 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26,
+ 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05,
+ 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB,
+ 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00,
+ 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0,
+ 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1,
+ 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E,
+ 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06,
+ 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0,
+ 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8,
+ 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06,
+ 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC,
+ 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4,
+ 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00,
+ 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02,
+ 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0,
+ 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16,
+ 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04,
+ 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16,
+ 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07,
+ 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01,
+ 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0,
+ 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23,
+ 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06,
+ 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02,
+ 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00,
+ 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10,
+ 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2,
+ 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02,
+ 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE,
+ 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09,
+ 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0,
+ 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F,
+ 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0,
+ 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F,
+ 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00,
+ 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A,
+ 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04,
+ 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0,
+ 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1,
+ 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02,
+ 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06,
+ 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88,
+ 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06,
+ 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16,
+ 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88,
+ 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1,
+ 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13,
+ 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01,
+ 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23,
+ 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00,
+ 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0,
+ 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09,
+ 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09,
+ 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4,
+ 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07,
+ 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07,
+ 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC,
+ 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5,
+ 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E,
+ 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01,
+ 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8,
+ 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02,
+ 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02,
+ 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2,
+ 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4,
+ 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01,
+ 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48,
+ 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0,
+ 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09,
+ 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02,
+ 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04,
+ 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01,
+ 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8,
+ 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0,
+ 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0,
+ 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3,
+ 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2,
+ 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13,
+ 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00,
+ 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06,
+ 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78,
+ 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13,
+ 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0,
+ 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06,
+ 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06,
+ 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06,
+ 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15,
+ 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13,
+ 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00,
+ 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04,
+ 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1,
+ 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00,
+ 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13,
+ 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5,
+ 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00,
+ 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06,
+ 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06,
+ 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60,
+ 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2,
+ 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A,
+ 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06,
+ 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16,
+ 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40,
+ 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07,
+ 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04,
+ 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1,
+ 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC,
+ 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB,
+ 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03,
+ 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00,
+ 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04,
+ 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10,
+ 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1,
+ 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10,
+ 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43,
+ 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2,
+ 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED,
+ 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED,
+ 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED,
+ 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09,
+ 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5,
+ 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10,
+ 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10,
+ 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2,
+ 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0,
+ 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0,
+ 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16,
+ 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06,
+ 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01,
+ 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0,
+ 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE,
+ 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE,
+ 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06,
+ 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06,
+ 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04,
+ 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16,
+ 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07,
+ 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0,
+ 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13,
+ 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00,
+ 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5,
+ 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF,
+ 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04,
+ 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02,
+ 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06,
+ 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13,
+ 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10,
+ 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06,
+ 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04,
+ 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3,
+ 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE,
+ 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04,
+ 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10,
+ 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09,
+ 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04,
+ 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09,
+ 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8,
+ 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09,
+ 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04,
+ 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06,
+ 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00,
+ 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07,
+ 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61,
+ 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07,
+ 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07,
+ 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07,
+ 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07,
+ 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11,
+ 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06,
+ 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98,
+ 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1,
+ 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3,
+ 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01,
+ 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2,
+ 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8,
+ 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE,
+ 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06,
+ 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8,
+ 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00,
+ 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09,
+ 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01,
+ 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8,
+ 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09,
+ 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06,
+ 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03,
+ 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98,
+ 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01,
+ 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF,
+ 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01,
+ 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF,
+ 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07,
+ 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0,
+ 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80,
+ 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07,
+ 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07,
+ 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8,
+ 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8,
+ 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09,
+ 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13,
+ 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03,
+ 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01,
+ 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02,
+ 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10,
+ 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02,
+ 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07,
+ 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06,
+ 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98,
+ 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06,
+ 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09,
+ 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09,
+ 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09,
+ 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE,
+ 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06,
+ 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16,
+ 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10,
+ 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06,
+ 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13,
+ 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09,
+ 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00,
+ 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07,
+ 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00,
+ 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0,
+ 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01,
+ 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07,
+ 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98,
+ 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88,
+ 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8,
+ 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00,
+ 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06,
+ 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02,
+ 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10,
+ 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07,
+ 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09,
+ 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20,
+ 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02,
+ 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03,
+ 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16,
+ 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06,
+ 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13,
+ 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03,
+ 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB,
+ 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10,
+ 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02,
+ 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3,
+ 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01,
+ 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01,
+ 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09,
+ 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1,
+ 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13,
+ 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8,
+ 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0,
+ 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01,
+ 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3,
+ 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02,
+ 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8,
+ 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09,
+ 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01,
+ 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8,
+ 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80,
+ 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09,
+ 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0,
+ 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06,
+ 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3,
+ 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1,
+ 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25,
+ 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06,
+ 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13,
+ 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03,
+ 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04,
+ 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16,
+ 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16,
+ 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07,
+ 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04,
+ 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13,
+ 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03,
+ 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04,
+ 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02,
+ 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8,
+ 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0,
+ 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04,
+ 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13,
+ 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16,
+ 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06,
+ 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09,
+ 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09,
+ 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09,
+ 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00,
+ 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4,
+ 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4,
+ 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16,
+ 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC,
+ 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04,
+ 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2,
+ 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48,
+ 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00,
+ 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13,
+ 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06,
+ 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04,
+ 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04,
+ 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01,
+ 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0,
+ 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06,
+ 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10,
+ 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09,
+ 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3,
+ 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01,
+ 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC,
+ 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01,
+ 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01,
+ 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09,
+ 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01,
+ 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01,
+ 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09,
+ 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04,
+ 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01,
+ 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01,
+ 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03,
+ 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01,
+ 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01,
+ 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01,
+ 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16,
+ 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04,
+ 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04,
+ 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09,
+ 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0,
+ 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80,
+ 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00,
+ 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4,
+ 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10,
+ 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE,
+ 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13,
+ 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0,
+ 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04,
+ 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13,
+ 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13,
+ 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0,
+ 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04,
+ 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04,
+ 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80,
+ 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10,
+ 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93,
+ 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0,
+ 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13,
+ 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE,
+ 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8,
+ 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8,
+ 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0,
+ 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06,
+ 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80,
+ 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0,
+ 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07,
+ 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07,
+ 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07,
+ 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0,
+ 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16,
+ 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23,
+ 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0,
+ 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04,
+ 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06,
+ 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16,
+ 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16,
+ 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16,
+ 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8,
+ 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0,
+ 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10,
+ 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1,
+ 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13,
+ 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88,
+ 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10,
+ 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09,
+ 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE,
+ 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93,
+ 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3,
+ 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23,
+ 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0,
+ 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8,
+ 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23,
+ 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09,
+ 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06,
+ 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3,
+ 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06,
+ 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21,
+ 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07,
+ 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07,
+ 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07,
+ 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06,
+ 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06,
+ 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2,
+ 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0,
+ 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06,
+ 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04,
+ 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09,
+ 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00,
+ 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88,
+ 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B,
+ 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02,
+ 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3,
+ 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00,
+ 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0,
+ 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00,
+ 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE,
+ 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC,
+ 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80,
+ 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06,
+ 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98,
+ 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8,
+ 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3,
+ 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16,
+ 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3,
+ 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07,
+ 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0,
+ 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0,
+ 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8,
+ 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06,
+ 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8,
+ 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE,
+ 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10,
+ 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07,
+ 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE,
+ 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09,
+ 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23,
+ 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0,
+ 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11,
+ 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4,
+ 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23,
+ 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00,
+ 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07,
+ 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10,
+ 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0,
+ 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3,
+ 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07,
+ 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23,
+ 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0,
+ 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3,
+ 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25,
+ 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00,
+ 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00,
+ 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06,
+ 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10,
+ 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16,
+ 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16,
+ 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13,
+ 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8,
+ 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00,
+ 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23,
+ 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09,
+ 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8,
+ 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0,
+ 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3,
+ 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04,
+ 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10,
+ 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06,
+ 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04,
+ 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0,
+ 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06,
+ 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0,
+ 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10,
+ 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06,
+ 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11,
+ 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00,
+ 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0,
+ 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06,
+ 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06,
+ 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13,
+ 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16,
+ 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE,
+ 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00,
+ 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48,
+ 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00,
+ 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00,
+ 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61,
+ 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1,
+ 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16,
+ 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16,
+ 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15,
+ 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02,
+ 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00,
+ 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16,
+ 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65,
+ 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15,
+ 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8,
+ 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13,
+ 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1,
+ 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC,
+ 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5,
+ 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07,
+ 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00,
+ 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC,
+ 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1,
+ 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8,
+ 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE,
+ 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00,
+ 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07,
+ 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04,
+ 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07,
+ 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00,
+ 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07,
+ 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06,
+ 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06,
+ 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00,
+ 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06,
+ 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02,
+ 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02,
+ 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2,
+ 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04,
+ 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02,
+ 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00,
+ 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00,
+ 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00,
+ 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00,
+ 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00,
+ 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00,
+ 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05,
+ 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00,
+ 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00,
+ 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00,
+ 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8,
+ 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00,
+ 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00,
+ 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8,
+ 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00,
+ 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8,
+ 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6,
+ 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00,
+ 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07,
+ 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01,
+ 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01,
+ 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40,
+ 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06,
+ 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8,
+ 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00,
+ 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20,
+ 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6,
+ 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2,
+ 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00,
+ 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A,
+ 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04,
+ 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15,
+ 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04,
+ 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02,
+ 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00,
+ 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13,
+ 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C,
+ 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01,
+ 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01,
+ 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02,
+ 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10,
+ 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC,
+ 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06,
+ 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02,
+ 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10,
+ 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07,
+ 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1,
+ 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06,
+ 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1,
+ 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00,
+ 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04,
+ 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01,
+ 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1,
+ 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8,
+ 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02,
+ 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04,
+ 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16,
+ 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8,
+ 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00,
+ 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09,
+ 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01,
+ 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A,
+ 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00,
+ 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9,
+ 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9,
+ 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA,
+ 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04,
+ 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16,
+ 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8,
+ 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8,
+ 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00,
+ 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00,
+ 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8,
+ 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00,
+ 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00,
+ 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03,
+ 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04,
+ 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8,
+ 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06,
+ 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2,
+ 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01,
+ 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01,
+ 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07,
+ 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04,
+ 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16,
+ 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0,
+ 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0,
+ 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88,
+ 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1,
+ 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8,
+ 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07,
+ 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01,
+ 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16,
+ 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8,
+ 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01,
+ 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04,
+ 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10,
+ 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01,
+ 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10,
+ 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2,
+ 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06,
+ 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0,
+ 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04,
+ 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05,
+ 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9,
+ 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00,
+ 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16,
+ 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04,
+ 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16,
+ 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07,
+ 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04,
+ 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01,
+ 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1,
+ 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06,
+ 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06,
+ 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02,
+ 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1,
+ 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8,
+ 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09,
+ 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01,
+ 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00,
+ 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7,
+ 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04,
+ 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01,
+ 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0,
+ 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2,
+ 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16,
+ 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10,
+ 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04,
+ 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9,
+ 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2,
+ 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9,
+ 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2,
+ 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9,
+ 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05,
+ 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16,
+ 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA,
+ 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80,
+ 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06,
+ 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6,
+ 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16,
+ 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07,
+ 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07,
+ 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2,
+ 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C,
+ 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00,
+ 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06,
+ 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F,
+ 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC,
+ 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0,
+ 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10,
+ 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05,
+ 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A,
+ 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0,
+ 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07,
+ 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16,
+ 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02,
+ 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07,
+ 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00,
+ 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10,
+ 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02,
+ 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B,
+ 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA,
+ 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02,
+ 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04,
+ 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01,
+ 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01,
+ 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10,
+ 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06,
+ 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10,
+ 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40,
+ 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01,
+ 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC,
+ 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02,
+ 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1,
+ 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02,
+ 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0,
+ 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1,
+ 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2,
+ 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3,
+ 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00,
+ 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05,
+ 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05,
+ 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03,
+ 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4,
+ 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB,
+ 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05,
+ 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05,
+ 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01,
+ 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02,
+ 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01,
+ 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01,
+ 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00,
+ 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1,
+ 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13,
+ 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
+ 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8,
+ 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10,
+ 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02,
+ 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04,
+ 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02,
+ 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16,
+ 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1,
+ 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4,
+ 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02,
+ 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00,
+ 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83,
+ 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13,
+ 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1,
+ 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01,
+ 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01,
+ 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02,
+ 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01,
+ 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80,
+ 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02,
+ 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB,
+ 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05,
+ 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE,
+ 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10,
+ 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0,
+ 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02,
+ 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0,
+ 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06,
+ 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86,
+ 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04,
+ 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33,
+ 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54,
+ 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07,
+ 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6,
+ 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A,
+ 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1,
+ 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03,
+ 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62,
+ 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29,
+ 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16,
+ 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18,
+ 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05,
+ 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06,
+ 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81,
+ 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02,
+ 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00,
+ 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02,
+ 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00,
+ 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02,
+ 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A,
+ 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A,
+ 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B,
+ 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A,
+ 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02,
+ 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02,
+ 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38,
+ 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16,
+ 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02,
+ 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00,
+ 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00,
+ 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0,
+ 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90,
+ 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0,
+ 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5,
+ 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02,
+ 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05,
+ 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07,
+ 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07,
+ 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00,
+ 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F,
+ 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0,
+ 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06,
+ 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
+ 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80,
+ 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08,
+ 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00,
+ 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00,
+ 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF,
+ 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00,
+ 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00,
+ 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1,
+ 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50,
+ 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49,
+ 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C,
+ 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29,
+ 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47,
+ 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39,
+ 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30,
+ 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC,
+ 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00,
+ 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06,
+ 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00,
+ 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07,
+ 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00,
+ 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00,
+ 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00,
+ 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80,
+ 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA,
+ 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80,
+ 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00,
+ 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00,
+ 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00,
+ 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00,
+ 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00,
+ 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00,
+ 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00,
+ 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00,
+ 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00,
+ 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00,
+ 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00,
+ 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00,
+ 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00,
+ 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00,
+ 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00,
+ 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00,
+ 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00,
+ 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00,
+ 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00,
+ 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00,
+ 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00,
+ 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00,
+ 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F,
+ 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00,
+ 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5,
+ 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5,
+ 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08,
+ 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00,
+ 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A,
+ 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07,
+ 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07,
+ 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07,
+ 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07,
+ 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07,
+ 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07,
+ 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07,
+ 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07,
+ 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07,
+ 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1,
+ 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD,
+ 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE,
+ 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF,
+ 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C,
+ 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58,
+ 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70,
+ 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF,
+ 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50,
+ 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00,
+ 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07,
+ 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07,
+ 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A,
+ 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00,
+ 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00,
+ 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1,
+ 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09,
+ 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04,
+ 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08,
+ 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE,
+ 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2,
+ 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE,
+ 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4,
+ 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5,
+ 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA,
+ 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE,
+ 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE,
+ 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF,
+ 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9,
+ 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06,
+ 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2,
+ 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07,
+ 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06,
+ 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE,
+ 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00,
+ 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06,
+ 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00,
+ 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02,
+ 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06,
+ 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3,
+ 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06,
+ 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06,
+ 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA,
+ 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00,
+ 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06,
+ 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4,
+ 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00,
+ 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07,
+ 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06,
+ 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07,
+ 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09,
+ 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84,
+ 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80,
+ 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80,
+ 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB,
+ 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB,
+ 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01,
+ 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00,
+ 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02,
+ 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02,
+ 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02,
+ 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02,
+ 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03,
+ 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03,
+ 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03,
+ 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03,
+ 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C,
+ 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02,
+ 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01,
+ 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00,
+ 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01,
+ 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55,
+ 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A,
+ 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2,
+ 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01,
+ 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00,
+ 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8,
+ 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00,
+ 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50,
+ 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01,
+ 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00,
+ 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8,
+ 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00,
+ 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50,
+ 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01,
+ 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00,
+ 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA,
+ 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01,
+ 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01,
+ 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01,
+ 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01,
+ 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00,
+ 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01,
+ 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8,
+ 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA,
+ 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA,
+ 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA,
+ 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7,
+ 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9,
+ 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8,
+ 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7,
+ 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA,
+ 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA,
+ 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA,
+ 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6,
+ 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8,
+ 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9,
+ 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8,
+ 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7,
+ 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7,
+ 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA,
+ 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55,
+ 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01,
+ 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7,
+ 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7,
+ 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF,
+ 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00,
+ 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01,
+ 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8,
+ 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF,
+ 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00,
+ 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7,
+ 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7,
+ 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7,
+ 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7,
+ 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20,
+ 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00,
+ 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA,
+ 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7,
+ 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07,
+ 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9,
+ 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9,
+ 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9,
+ 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9,
+ 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9,
+ 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9,
+ 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9,
+ 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9,
+ 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9,
+ 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7,
+ 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8,
+ 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA,
+ 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00,
+ 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6,
+ 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7,
+ 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7,
+ 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8,
+ 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7,
+ 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF,
+ 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7,
+ 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7,
+ 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA,
+ 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7,
+ 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8,
+ 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8,
+ 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8,
+ 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0,
+ 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8,
+ 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00,
+ 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8,
+ 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01,
+ 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8,
+ 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0,
+ 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8,
+ 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01,
+ 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8,
+ 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00,
+ 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9,
+ 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9,
+ 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0,
+ 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8,
+ 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7,
+ 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7,
+ 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7,
+ 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0,
+ 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7,
+ 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00,
+ 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40,
+ 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10,
+ 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8,
+ 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7,
+ 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00,
+ 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0,
+ 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90,
+ 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8,
+ 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7,
+ 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7,
+ 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7,
+ 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60,
+ 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9,
+ 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6,
+ 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00,
+ 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00,
+ 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7,
+ 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00,
+ 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7,
+ 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00,
+ 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10,
+ 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7,
+ 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00,
+ 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20,
+ 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7,
+ 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00,
+ 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7,
+ 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01,
+ 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7,
+ 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00,
+ 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60,
+ 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0,
+ 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8,
+ 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00,
+ 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82,
+ 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09,
+ 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00,
+ 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81,
+ 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00,
+ 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16,
+ 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80,
+ 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80,
+ 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC,
+ 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9,
+ 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80,
+ 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A,
+ 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00,
+ 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A,
+ 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A,
+ 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00,
+ 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8,
+ 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08,
+ 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08,
+ 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07,
+ 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB,
+ 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07,
+ 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD,
+ 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE,
+ 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE,
+ 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE,
+ 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08,
+ 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03,
+ 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04,
+ 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00,
+ 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6,
+ 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03,
+ 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF,
+ 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00,
+ 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8,
+ 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8,
+ 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06,
+ 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14,
+ 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D,
+ 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D,
+ 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F,
+ 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00,
+ 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57,
+ 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55,
+ 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02,
+ 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55,
+ 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54,
+ 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83,
+ 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55,
+ 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58,
+ 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87,
+ 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11,
+ 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53,
+ 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57,
+ 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81,
+ 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01,
+ 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52,
+ 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02,
+ 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81,
+ 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D,
+ 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54,
+ 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA,
+ 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00,
+ 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00,
+ 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9,
+ 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00,
+ 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0,
+ 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00,
+ 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD,
+ 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06,
+ 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06,
+ 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00,
+ 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06,
+ 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00,
+ 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04,
+ 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0,
+ 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00,
+ 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00,
+ 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05,
+ 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81,
+ 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00,
+ 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04,
+ 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06,
+ 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED,
+ 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09,
+ 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07,
+ 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04,
+ 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00,
+ 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0,
+ 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40,
+ 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0,
+ 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40,
+ 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00,
+ 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE,
+ 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60,
+ 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81,
+ 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60,
+ 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07,
+ 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06,
+ 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F,
+ 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16,
+ 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83,
+ 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01,
+ 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81,
+ 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0,
+ 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00,
+ 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06,
+ 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06,
+ 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00,
+ 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04,
+ 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02,
+ 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06,
+ 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09,
+ 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00,
+ 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48,
+ 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00,
+ 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33,
+ 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39,
+ 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20,
+ 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65,
+ 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31,
+ 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C,
+ 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F,
+ 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90,
+ 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF,
+ 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00,
+ 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+#endif /* CONFIG_SKTR */