diff -Nru a/CREDITS b/CREDITS --- a/CREDITS Tue Feb 17 20:00:07 2004 +++ b/CREDITS Tue Feb 17 20:00:07 2004 @@ -818,6 +818,11 @@ S: Sunnyvale, CA 94087 S: USA +N: Bruno Ducrot +E: ducrot@poupinou.org +D: CPUFreq and ACPI bugfixes. +S: Mougin, France + N: Don Dugger E: n0ano@valinux.com D: Linux/IA-64 @@ -897,8 +902,8 @@ W: http://www.pi.se/blox/ D: Extended support for loadable modules D: D-Link pocket adapter drivers -S: Grevgatan 11 -S: S-114 53 Stockholm +S: Brevia 1043 +S: S-114 79 Stockholm S: Sweden N: Michael Engel diff -Nru a/Documentation/Changes b/Documentation/Changes --- a/Documentation/Changes Tue Feb 17 20:00:08 2004 +++ b/Documentation/Changes Tue Feb 17 20:00:08 2004 @@ -236,13 +236,15 @@ General changes --------------- -The IP firewalling and NAT code has been replaced again. The new -netfilter software (including ipfwadm and ipchains backwards- -compatible modules) is currently distributed separately. - If you have advanced network configuration needs, you should probably consider using the network tools from ip-route2. +Packet Filter / NAT +------------------- +The packet filtering and NAT code uses the same tools like the previous 2.4.x +kernel series (iptables). It still includes backwards-compatibility modules +for 2.2.x-style ipchains and 2.0.x-style ipfwadm. + PPP --- @@ -399,15 +401,13 @@ --------- o -Netfilter ---------- -o -o -o +Iptables +-------- +o Ip-route2 --------- -o +o OProfile -------- diff -Nru a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt --- a/Documentation/DMA-API.txt Tue Feb 17 20:00:07 2004 +++ b/Documentation/DMA-API.txt Tue Feb 17 20:00:07 2004 @@ -20,6 +20,10 @@ To get the pci_ API, you must #include To get the dma_ API, you must #include + +Part Ia - Using large dma-coherent buffers +------------------------------------------ + void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag) @@ -42,6 +46,7 @@ Note: consistent memory can be expensive on some platforms, and the minimum allocation length may be as big as a page, so you should consolidate your requests for consistent memory as much as possible. +The simplest way to do that is to use the dma_pool calls (see below). The flag parameter (dma_alloc_coherent only) allows the caller to specify the GFP_ flags (see kmalloc) for the allocation (the @@ -61,6 +66,77 @@ consistent allocate. cpu_addr must be the virtual address returned by the consistent allocate + +Part Ib - Using small dma-coherent buffers +------------------------------------------ + +To get this part of the dma_ API, you must #include + +Many drivers need lots of small dma-coherent memory regions for DMA +descriptors or I/O buffers. Rather than allocating in units of a page +or more using dma_alloc_coherent(), you can use DMA pools. These work +much like a kmem_cache_t, except that they use the dma-coherent allocator +not __get_free_pages(). Also, they understand common hardware constraints +for alignment, like queue heads needing to be aligned on N byte boundaries. + + + struct dma_pool * + dma_pool_create(const char *name, struct device *dev, + size_t size, size_t align, size_t alloc); + + struct pci_pool * + pci_pool_create(const char *name, struct pci_device *dev, + size_t size, size_t align, size_t alloc); + +The pool create() routines initialize a pool of dma-coherent buffers +for use with a given device. It must be called in a context which +can sleep. + +The "name" is for diagnostics (like a kmem_cache_t name); dev and size +are like what you'd pass to dma_alloc_coherent(). The device's hardware +alignment requirement for this type of data is "align" (which is expressed +in bytes, and must be a power of two). If your device has no boundary +crossing restrictions, pass 0 for alloc; passing 4096 says memory allocated +from this pool must not cross 4KByte boundaries. + + + void *dma_pool_alloc(struct dma_pool *pool, int gfp_flags, + dma_addr_t *dma_handle); + + void *pci_pool_alloc(struct pci_pool *pool, int gfp_flags, + dma_addr_t *dma_handle); + +This allocates memory from the pool; the returned memory will meet the size +and alignment requirements specified at creation time. Pass GFP_ATOMIC to +prevent blocking, or if it's permitted (not in_interrupt, not holding SMP locks) +pass GFP_KERNEL to allow blocking. Like dma_alloc_coherent(), this returns +two values: an address usable by the cpu, and the dma address usable by the +pool's device. + + + void dma_pool_free(struct dma_pool *pool, void *vaddr, + dma_addr_t addr); + + void pci_pool_free(struct pci_pool *pool, void *vaddr, + dma_addr_t addr); + +This puts memory back into the pool. The pool is what was passed to +the the pool allocation routine; the cpu and dma addresses are what +were returned when that routine allocated the memory being freed. + + + void dma_pool_destroy(struct dma_pool *pool); + + void pci_pool_destroy(struct pci_pool *pool); + +The pool destroy() routines free the resources of the pool. They must be +called in a context which can sleep. Make sure you've freed all allocated +memory back to the pool before you destroy it. + + +Part Ic - DMA addressing limitations +------------------------------------ + int dma_supported(struct device *dev, u64 mask) int @@ -86,6 +162,10 @@ Returns: 1 if successful and 0 if not + +Part Id - Streaming DMA mappings +-------------------------------- + dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction direction) @@ -253,6 +333,7 @@ DMA_BIDIRECTIONAL See also dma_map_single(). + Part II - Advanced dma_ usage ----------------------------- diff -Nru a/Documentation/DocBook/deviceiobook.tmpl b/Documentation/DocBook/deviceiobook.tmpl --- a/Documentation/DocBook/deviceiobook.tmpl Tue Feb 17 20:00:06 2004 +++ b/Documentation/DocBook/deviceiobook.tmpl Tue Feb 17 20:00:06 2004 @@ -126,7 +126,9 @@ The functions are named readb, readw, readl, - readq, writeb, + readq, readb_relaxed, + readw_relaxed, readl_relaxed, + readq_relaxed, writeb, writew, writel and writeq. @@ -158,6 +160,18 @@ device to ensure that writes have occurred in the specific cases the author cares. This kind of property cannot be hidden from driver writers in the API. + + + + PCI ordering rules also guarantee that PIO read responses arrive + after any outstanding DMA writes on that bus, since for some devices + the result of a readb call may signal to the + driver that a DMA transaction is complete. In many cases, however, + the driver may want to indicate that the next + readb call has no relation to any previous DMA + writes performed by the device. The driver can use + readb_relaxed for these cases, although only + some platforms will honor the relaxed semantics. diff -Nru a/Documentation/DocBook/kernel-locking.tmpl b/Documentation/DocBook/kernel-locking.tmpl --- a/Documentation/DocBook/kernel-locking.tmpl Tue Feb 17 20:00:06 2004 +++ b/Documentation/DocBook/kernel-locking.tmpl Tue Feb 17 20:00:06 2004 @@ -1444,27 +1444,6 @@ - - The Fucked Up Sparc - - - Alan Cox says the irq disable/enable is in the register - window on a sparc. Andi Kleen says when you do - restore_flags in a different function you mess up all the - register windows. - - - - So never pass the flags word set by - spin_lock_irqsave() and brethren to another - function (unless it's declared inline). Usually no-one - does this, but now you've been warned. Dave Miller can never do - anything in a straightforward manner (I can say that, because I have - pictures of him and a certain PowerPC maintainer in a compromising - position). - - - diff -Nru a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches --- a/Documentation/SubmittingPatches Tue Feb 17 20:00:05 2004 +++ b/Documentation/SubmittingPatches Tue Feb 17 20:00:05 2004 @@ -241,7 +241,7 @@ Simple example, of poor code: - dev = init_etherdev (NULL, 0); + dev = alloc_etherdev (sizeof(struct funky_private)); if (!dev) return -ENODEV; #ifdef CONFIG_NET_FUNKINESS @@ -256,7 +256,7 @@ #endif (in the code itself) - dev = init_etherdev (NULL, 0); + dev = alloc_etherdev (sizeof(struct funky_private)); if (!dev) return -ENODEV; init_funky_net(dev); diff -Nru a/Documentation/as-iosched.txt b/Documentation/as-iosched.txt --- a/Documentation/as-iosched.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/as-iosched.txt Tue Feb 17 20:00:06 2004 @@ -11,6 +11,15 @@ me. Database users don't bother unless you're willing to test a lot of patches from me ;) its a known issue. +Also, users with hardware RAID controllers, doing striping, may find +highly variable performance results with using the as-iosched. The +as-iosched anticipatory implementation is based on the notion that a disk +device has only one physical seeking head. A striped RAID controller +actually has a head for each physical device in the logical RAID device. + +However, setting the antic_expire (see tunable parameters below) produces +very similar behavior to the deadline IO scheduler. + Selecting IO schedulers ----------------------- @@ -19,6 +28,107 @@ globally at boot time only presently. +Anticipatory IO scheduler Policies +---------------------------------- +The as-iosched implementation implements several layers of policies +to determine when an IO request is dispatched to the disk controller. +Here are the policies outlined, in order of application. + +1. one-way Elevator algorithm. + +The elevator algorithm is similar to that used in deadline scheduler, with +the addition that it allows limited backward movement of the elevator +(i.e. seeks backwards). A seek backwards can occur when choosing between +two IO requests where one is behind the elevator's current position, and +the other is in front of the elevator's position. If the seek distance to +the request in back of the elevator is less than half the seek distance to +the request in front of the elevator, then the request in back can be chosen. +Backward seeks are also limited to a maximum of MAXBACK (1024*1024) sectors. +This favors forward movement of the elevator, while allowing opportunistic +"short" backward seeks. + +2. FIFO expiration times for reads and for writes. + +This is again very similar to the deadline IO scheduler. The expiration +times for requests on these lists is tunable using the parameters read_expire +and write_expire discussed below. When a read or a write expires in this way, +the IO scheduler will interrupt its current elevator sweep or read anticipation +to service the expired request. + +3. Read and write request batching + +A batch is a collection of read requests or a collection of write +requests. The as scheduler alternates dispatching read and write batches +to the driver. In the case a read batch, the scheduler submits read +requests to the driver as long as there are read requests to submit, and +the read batch time limit has not been exceeded (read_batch_expire). +The read batch time limit begins counting down only when there are +competing write requests pending. + +In the case of a write batch, the scheduler submits write requests to +the driver as long as there are write requests available, and the +write batch time limit has not been exceeded (write_batch_expire). +However, the length of write batches will be gradually shortened +when read batches frequently exceed their time limit. + +When changing between batch types, the scheduler waits for all requests +from the previous batch to complete before scheduling requests for the +next batch. + +The read and write fifo expiration times described in policy 2 above +are checked only when in scheduling IO of a batch for the corresponding +(read/write) type. So for example, the read FIFO timeout values are +tested only during read batches. Likewise, the write FIFO timeout +values are tested only during write batches. For this reason, +it is generally not recommended for the read batch time +to be longer than the write expiration time, nor for the write batch +time to exceed the read expiration time (see tunable parameters below). + +When the IO scheduler changes from a read to a write batch, +it begins the elevator from the request that is on the head of the +write expiration FIFO. Likewise, when changing from a write batch to +a read batch, scheduler begins the elevator from the first entry +on the read expiration FIFO. + +4. Read anticipation. + +Read anticipation occurs only when scheduling a read batch. +This implementation of read anticipation allows only one read request +to be dispatched to the disk controller at a time. In +contrast, many write requests may be dispatched to the disk controller +at a time during a write batch. It is this characteristic that can make +the anticipatory scheduler perform anomalously with controllers supporting +TCQ, or with hardware striped RAID devices. Setting the antic_expire +queue paramter (see below) to zero disables this behavior, and the anticipatory +scheduler behaves essentially like the deadline scheduler. + +When read anticipation is enabled (antic_expire is not zero), reads +are dispatched to the disk controller one at a time. +At the end of each read request, the IO scheduler examines its next +candidate read request from its sorted read list. If that next request +is from the same process as the request that just completed, +or if the next request in the queue is "very close" to the +just completed request, it is dispatched immediately. Otherwise, +statistics (average think time, average seek distance) on the process +that submitted the just completed request are examined. If it seems +likely that that process will submit another request soon, and that +request is likely to be near the just completed request, then the IO +scheduler will stop dispatching more read requests for up time (antic_expire) +milliseconds, hoping that process will submit a new request near the one +that just completed. If such a request is made, then it is dispatched +immediately. If the antic_expire wait time expires, then the IO scheduler +will dispatch the next read request from the sorted read queue. + +To decide whether an anticipatory wait is worthwhile, the scheduler +maintains statistics for each process that can be used to compute +mean "think time" (the time between read requests), and mean seek +distance for that process. One observation is that these statistics +are associated with each process, but those statistics are not associated +with a specific IO device. So for example, if a process is doing IO +on several file systems on separate devices, the statistics will be +a combination of IO behavior from all those devices. + + Tuning the anticipatory IO scheduler ------------------------------------ When using 'as', the anticipatory IO scheduler there are 5 parameters under @@ -26,17 +136,18 @@ The parameters are: * read_expire - Controls how long until a request becomes "expired". It also controls the + Controls how long until a read request becomes "expired". It also controls the interval between which expired requests are served, so set to 50, a request might take anywhere < 100ms to be serviced _if_ it is the next on the - expired list. Obviously it won't make the disk go faster. The result - basically equates to the timeslice a single reader gets in the presence of - other IO. 100*((seek time / read_expire) + 1) is very roughly the % - streaming read efficiency your disk should get with multiple readers. - + expired list. Obviously request expiration strategies won't make the disk + go faster. The result basically equates to the timeslice a single reader + gets in the presence of other IO. 100*((seek time / read_expire) + 1) is + very roughly the % streaming read efficiency your disk should get with + multiple readers. + * read_batch_expire Controls how much time a batch of reads is given before pending writes are - served. Higher value is more efficient. This might be set below read_expire + served. A higher value is more efficient. This might be set below read_expire if writes are to be given higher priority than reads, but reads are to be as efficient as possible when there are no writes. Generally though, it should be some multiple of read_expire. @@ -45,7 +156,8 @@ * write_batch_expire are equivalent to the above, for writes. * antic_expire - Controls the maximum amount of time we can anticipate a good read before + Controls the maximum amount of time we can anticipate a good read (one + with a short seek distance from the most recently completed request) before giving up. Many other factors may cause anticipation to be stopped early, or some processes will not be "anticipated" at all. Should be a bit higher for big seek time devices though not a linear correspondence - most diff -Nru a/Documentation/cciss.txt b/Documentation/cciss.txt --- a/Documentation/cciss.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/cciss.txt Tue Feb 17 20:00:06 2004 @@ -13,6 +13,7 @@ * SA 642 * SA 6400 * SA 6400 U320 Expansion Module + * SA 6i If nodes are not already created in the /dev/cciss directory diff -Nru a/Documentation/i386/zero-page.txt b/Documentation/i386/zero-page.txt --- a/Documentation/i386/zero-page.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/i386/zero-page.txt Tue Feb 17 20:00:06 2004 @@ -72,8 +72,10 @@ 0x21c unsigned long INITRD_SIZE, size in bytes of ramdisk image 0x220 4 bytes (setup.S) 0x224 unsigned short setup.S heap end pointer +0x2cc 4 bytes DISK80_SIG_BUFFER (setup.S) 0x2d0 - 0x600 E820MAP -0x600 - 0x7D4 EDDBUF (setup.S) +0x600 - 0x7ff EDDBUF (setup.S) for disk signature read sector +0x600 - 0x7d3 EDDBUF (setup.S) for edd data 0x800 string, 2K max COMMAND_LINE, the kernel commandline as copied using CL_OFFSET. diff -Nru a/Documentation/networking/8139too.txt b/Documentation/networking/8139too.txt --- a/Documentation/networking/8139too.txt Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,449 +0,0 @@ - - "8139too" Fast Ethernet driver for Linux - RTL-8139, -8129, and -8130 10/100 Fast Ethernet adapters - - Copyright 2000,2001 Jeff Garzik - - http://sourceforge.net/projects/gkernel/ - - - Architectures supported (all PCI platforms): - x86, Alpha AXP, PowerPC, Sparc64 - - Kernel versions supported: 2.4.x - - - -Disclaimer ----------- - -DO NOT CONTACT DONALD BECKER FOR SUPPORT OF THIS DRIVER, his driver is -completely different and maintained independently of the 8139too code base. - - - -Requirements ------------- -Kernel 2.4.3 or later. -A Fast Ethernet adapter containing an RTL8139-based chip. - - - -Introduction ------------- - -The "8139too" Fast Ethernet driver for Linux 2.4.0 is a substantial -modification of the experimental rtl8139 driver from Donald Becker, -some versions of which appeared in 2.2.x and 2.3.x kernels. The -RTL-8139 is a very low-cost Fast Ethernet chip, which makes it very -popular. - -The step from 2.2.x to 2.4.x kernels brings many new features to Linux -device drivers. Features for MMIO resources, a standard hot-plug API, -and other interfaces are now becoming requirements, as drivers move -off the x86 platform. With that in mind, I have begun updating the -RTL-8139 driver to current 2.3.x (2.4) kernel standards and APIs, and -fixing the problems that users have been encountering. - - - -Features of 8139too -------------------- -[note - this list intended for people familiar with kernel drivers] - -** 100% MMIO, for full speed operation. All users (so far) have -reported performance increases over their existing RTL drivers. - -** Multi-platform support: x86, Alpha, PPC, ... - -** Use proper SMP spinlocking, fixing SMP interrupt bugs, making the -driver portable to non-x86 SMP platforms in the process. - -** Use new PCI driver API for seamless, low-maintenance hot-plug support - -** Several bugs fixes from original rtl8139 1.08r (October 5, 1999), -including the very common "transmit timeout" problem. - -* Use new resource allocation API, required for hot-plug support -* Use new register read/write macros -* initcall support (module_init/exit) -* vastly improved debug tracing support -* code formatting in many places for readability -* use new init_etherdev() facilities - -...and probably some other less important changes which I forgot. - - - -Installation ------------- - -OPTION 1: Build inside kernel tree (into kernel image, or as module) - - (overwrite 8139too driver in kernel tree with different version) - 1) cp 8139too.c $my_source_tree/drivers/net/8139too.c - -OPTION 2: Build outside kernel tree - - Use the included Makefile. - - - -Tested Adapters ---------------- -AOpen ALN-325C -AT-2500TX 10/100 PCI Fast Ethernet Network Adapter Card -D-Link DFE-530TX -Cnet CNF401 'SinglePoint' 10/100 Base-TX -Genius GF 100TXR4 Fast Ethernet 10/100M PCI Network Card -KTI KF-230TX -KTI KF-230TX/2 -Lantech FastNet TX -Ovislink Fast Ethernet -Planet ENW-9504 (V.4) 10/100 -SDT Jeoun Fast PCI-TX -SMC EZNET 10/100 -UNEX NexNIC ND012C - -(please add your adapter model to this list) - - - -Status of Platform Support --------------------------- - -(see errata below for details) - -x86: tested, stable -Alpha AXP: tested, stable -PowerPC: tested, unstable -Sparc64: not tested - - - -Special Thanks --------------- -The following people contributed invaluable testing time, feedback -and/or patches during the development of this driver. Thanks to all -of them. - -Donald Becker, Alan Cox, Richard Stallman, Linus Torvalds - inspiration - -Alan Cox, Gerard Roudier - insight on posted MMIO writes - -Martin Mares - code review - -Tigran Aivazian - testing, code review, and a bug fix - -Chmouel Boudjnah, Alexander Dietrich, Oleg Drokin, -James Fidell, Taso Hatzi, Peter K - intrepid test team - -And thanks to every supporter free software. - -(see top of 8139too.c for further credits and kudos) - - - -Submitting Bug Reports ----------------------- -Obtain and compile the modified rtl8139-diag source code from the -8139too driver Web site, http://sourceforge.net/projects/gkernel/ -This diagnostics programs, originally from Donald Becker, has been -modified to display all registers on your RTL8139 chip, not just the -first 0x80. - -If possible, send the output of a working and broken driver with - rtl8139-diag -mmaaavvveefN > my-output-file.txt - -Send "lspci -vvv" or "cat /proc/pci" output for PCI information. - - - -Known Bugs / Errata / To-Do ---------------------------- -The following issues are known, and are actively being pursued. Patches -to resolve these issues is welcome. If a problem occurs which is not in -the list, please report it. That's why we do beta releases, after all... - - - -1) Work with Donald to merge fixes and updates into his driver. - -2) ETHTOOL_SSET support - -3) PPC platform has stability problems. (XXX: verify this is still true) - -4) Sparc64 platform not tested at all. - -8) Much improved command line / module parameter setup. (patches and -suggestions welcome) (WIP) - -9) Better documentation. (patches welcome) - -12) 10base-T support flaky or slow (todo: verify this is still true) - - - - -Change History --------------- - -Version 0.9.26 - August 9, 2002 - -* Fix MII ioctl phy id corruption. -* Fix big-endian multicast bug. -* Support register dumps via ethtool. -* Fix several uses of 'len' after potential skb free, in dev->hard_start_xmit -* Replace several "magic numbers" with their proper representation - constants in linux/mii.h. -* Support ethtool media interface via generic kernel MII API -* Export NIC-specific statistics via ethtool. -* Proper support for RTL8139 rev K. (can be disabled via - compile-time conditional) -* Add PCI ids for new 8139 boards. -* Use ethernet crc via generic linux/crc32.h kernel API. -* Better RX reset. Old rx-reset method still available via - a compile-time conditional. -* Only account specific RX errors if rx_status is !OK - - -Version 0.9.22 - November 8, 2001 - -* Additional retries before aborting Tx -* Do not write other TxConfig bits when writing clear-abort bit. -* Ack TxErr intr status after each Tx abort, too. -* Fix oops in interface restart - - -Version 0.9.21 - November 1, 2001 - -* Disable early Rx, it hurts performance and creates races. -* Remove DPRINTK macro function tracing. -* Better interrupt sharing behavior. -* Acknowledge PCI errors. -* Remove early-Rx acknowledgement, unnecessary -* Remove code for uncommon case where Tx packets are - properly aligned, and do not need to be copied. - Tx packets are now always copied into a static DMA buffer, - which is allocated at interface open. -* Fix problems with kernel thread exit. - - -Version 0.9.20 - October 18, 2001 - -* Print out notice when 8139C+ chip is detected -* Add id for D-Link DFE690TXD pcmcia cardbus card (Gert Dewit) - - -Version 0.9.19 - October 9, 2001 - -* Eliminate buffer copy for unaligned Tx's (manfred) -* Better RX error recovery (manfred) -* Wake-On-LAN and ETHTOOL_GSET support (Kalle Niemitalo) -* Fix assertion in PIO mode (various) - - -Version 0.9.18 - July 6, 2001 - -* Fix race leading to crashes on some machines. -* Minimize race leading to low performance. -* Correct interrupt acknowledgement to cover all three - relevant Rx events. -* Add ethtool driver info support. -* Collect additional driver-internal statistics. -* Add descriptions for module parameters. -* Support new SIOCxMIIxxx ioctls added in kernel 2.4.6. -* Multicast filter big endian fix. -* Support new PCI PM API added in kernel 2.4.6. - - -Version 0.9.17 - May 7, 2001 - -* Fix chipset wakeup bug which prevent media connection for 8139B -* Print out "media is unconnected..." instead of - "partner ability 0000" - - -Version 0.9.16 - April 14, 2001 - -* Complete MMIO audit, disable read-after-every-write -* Update Rx interrupt handling -* Enable Early Rx thresholds, highly recommended to reduce - Rx FIFO overflow -* Make 8129 support conditional -* Support for new 2.4.3 kernel APIs -* More correct PIO/MMIO PCI BAR region size checking -* Add check for totally dead/missing hardware -* Disable media timer code to "set full duplex" -* s/spin_lock_irq/spin_lock_irqsave/ -* Only set AcceptMulticast if more than one mc address -* Only set rx_mode if changed, in set_rx_mode -* Only suspend/resume if interface is up -* Always print out version upon module load, even if no devices found - - -Version 0.9.15 - February 20, 2001 - -* Call pci_enable_device to wake up/assign resource to device, - before actually using it. -* Support wacky clone PCI ids (report from Norival Toniato Junior) -* Text spelling corrections -* Make sure tp->phys[] is signed -* Always wake queue after hw restart, in tx_timeout -* Record time of last received packet - - -Version 0.9.14 - January 11, 2001 - -* Merge some changes from Becker version 1.13: - * Add DFE 538TX PCI id - * MII read/write functions updated - * Cfg93[45]6 lock/unlock fix - * RTL-8129 (MII) support -* Clean up spinlocking - - -Version 0.9.13 - December, 2000 - -* Clear blocked signals, avoid buffer overrun setting current->comm -* Remove bogus PCI BAR length assertions -* Remove unused 'debug' module parameter - - -Version 0.9.12 - November 23, 2000 - -* Kill major Tx stop/wake queue race -* Use SET_MODULE_OWNER and fix module unload race -* Fix cable length ("Twister") tuning -* Proper media[] array length checking -* Replace timer with kernel thread for twister tuning state machine - and media checking. Fixes mdio_xxx locking, now mdio_xxx is always - protected by rtnl_lock semaphore. -* Correct some sledgehammer a.k.a. overzealous spin-locks -* Performance: Eliminate atomic_t for Tx counters, we don't need it -* Performance: Don't copy Tx buffer if the rare case occurs where it - is aligned perfectly for us. -* Eliminate needless casting of dev->priv -* PIO mode selection and Twister tuning are now CONFIG_xxx options - (though purposefully not in net/Config.in... yet) - - -Version 0.9.11 - October 28, 2000 - -* Do not fail when PIO and MMIO region lengths do not match. - (They don't on some CardBus models, at least) -* Sanity check Rx packet status and size (Tobias) -* When handling a Tx timeout, disable Tx ASAP if not already. -* Do not inline Tx interrupt handler (better register usage) -* Handle dirty_tx signed integer wrap -* Do not abort Rx processing on lack of memory, keep going - until the current Rx ring is completely handling. (Tobias) -* Clean up rtl8139_close -* Whitespace correction for dev_kfree_skb_irq call - - -Version 0.9.10 - September 12, 2000 - -* Never wrap an Rx packet (faster Rx interrupt handling) -* Clear all TxAborted conditions (bug fix) -* Correct copyright -* More credits -* Update NWay doc URL -* Clean up commonly used ifdef switches -* Reorg info displayed at bootup/modprobe time -* Remove some unneeded spinlocks -* Misc cosmetic code cleanup -* Always print interrupt status for abnormal interrupts -* Use RealTek-recommended FIFO and DMA burst settings (1024 bytes) - - -Version 0.9.9 - September 9, 2000 - -* Fix oops-able bug in Rx ring wrap calculation (David Ford) -* Use PIO instead of MMIO when USE_IO_OPS is defined -* Move Rx error handling out of Rx interrupt handler, resulting in - tighter Rx interrupt processing - - -Version 0.9.8 - September 7, 2000 - -* Propagate request_irq error value (andrew morton) -* Correct potential oops bug in PCI DMA unmap code -* Fix bugs related to counting/discounting of 32-bit CRC in each Rx packet -* Fix 16/32-bit bug in interrupt status check -* Timer cleanups (andrew morton) - - -Version 0.9.7 - June 11, 2000 - -* Fix support for older chips (RTL8139 early chips should now work again) - - -Version 0.9.6 - May 30, 2000 - -* Fix 4-extra-bytes bug - (thanks to Markus Westergren, via Santiago Garcia Mantinan) -* Yet more improved chip recognition - - -Version 0.9.5 - May 17, 2000 - -* Improved chip version recognition -* Continue banging away at receiver hang problem -* Use spin_lock_irq in another spot -* Don't print anything on pci_enable_device, it does so for us -* Disable buggy NWay code -* Define TxConfig bitmasks - - -Version 0.9.4.1 - April 27, 2000 - third public beta release - -* Replace several "magic numbers" with symbolic constants -* Differentiate between board-specific info and chip-specific info - (allows for easier support of specific boards or chips) -* Move some of the transmit side outside of the spinlock - by using atomic variables. Use spin_lock_irq instead of - spin_lock_irq{save,restore} in select places, for better performance. -* New module option "media" for forcing media selection. Functions the - same as "options" in other drivers, and will soon be renamed - 'options' to be homogeneous. -* New power management wake-up code -* Slightly more verbose chip id messages in kernel log -* Add/correct chip register constant list -* New chipset wake up (open) logic -* No longer locks CONFIGx updates -* Do not set Interfame Gap (IFG) bits in TxConfig -* Better Rx reset logic in case of Rx FIFO Overflow -* For chips which support it, enable bit to automatically clear Rx - FIFO overflow -* No longer enable and disable interrupts in interrupt handler - (technique borrowed from BSD driver, appears to have problems - with some chips) -* H/W spinlock now protects ioctl -* Chipset-dependent RxConfig settings - - -Version 0.9.3.3.2 - Feb 22, 2000 - second public beta release - -* Begin integration of Daniel Kobras' MMIO flush patch (disabled for now) -* Softnet logic updates to fix bugs and improve performance -* Dynamic sizing of I/O resources (0x80 for older chips, 0xFF for newer ones) -* Remove bogus SiS entries from PCI probe table -* Add support for cards - "Delta Electronics 8139 10/100BaseTX" - "Addtron Technolgy 8139 10/100BaseTX" -* Fix major bug with rx ring buffer size (also present in rtl8139.c 1.08r) -* PCI DMA mapping by Dave Miller -* Complete rewrite of SMP locking logic -* Hotplug support -* Call rtl8139_hw_start from rtl8139_open, and remove duplicated code - from rtl8139_open -* Reset NWay registers to sane defaults on rtl8139_open/hw_start -* Miscellaneous code cleanup - - -Version 0.7.0 - Feb 7, 2000 - first public beta release -* Initial public version, derived from Donald Becker's rtl8139.c v1.08r - -[EOF] - diff -Nru a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt --- a/Documentation/networking/bonding.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/networking/bonding.txt Tue Feb 17 20:00:06 2004 @@ -21,7 +21,7 @@ Table of Contents ================= - + Installation Bond Configuration Module Parameters @@ -66,7 +66,7 @@ /usr/include/linux. To install ifenslave.c, do: - # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave + # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave # cp ifenslave /sbin/ifenslave @@ -74,10 +74,10 @@ ================== You will need to add at least the following line to /etc/modules.conf -so the bonding driver will automatically load when the bond0 interface is -configured. Refer to the modules.conf manual page for specific modules.conf -syntax details. The Module Parameters section of this document describes each -bonding driver parameter. +so the bonding driver will automatically load when the bond0 interface is +configured. Refer to the modules.conf manual page for specific modules.conf +syntax details. The Module Parameters section of this document describes each +bonding driver parameter. alias bond0 bonding @@ -113,7 +113,7 @@ network interface be a slave of bond1. Restart the networking subsystem or just bring up the bonding device if your -administration tools allow it. Otherwise, reboot. On Red Hat distros you can +administration tools allow it. Otherwise, reboot. On Red Hat distros you can issue `ifup bond0' or `/etc/rc.d/init.d/network restart'. If the administration tools of your distribution do not support @@ -128,30 +128,30 @@ (use appropriate values for your network above) -You can then create a script containing these commands and place it in the +You can then create a script containing these commands and place it in the appropriate rc directory. If you specifically need all network drivers loaded before the bonding driver, -adding the following line to modules.conf will cause the network driver for +adding the following line to modules.conf will cause the network driver for eth0 and eth1 to be loaded before the bonding driver. probeall bond0 eth0 eth1 bonding -Be careful not to reference bond0 itself at the end of the line, or modprobe +Be careful not to reference bond0 itself at the end of the line, or modprobe will die in an endless recursive loop. -To have device characteristics (such as MTU size) propagate to slave devices, -set the bond characteristics before enslaving the device. The characteristics +To have device characteristics (such as MTU size) propagate to slave devices, +set the bond characteristics before enslaving the device. The characteristics are propagated during the enslave process. -If running SNMP agents, the bonding driver should be loaded before any network -drivers participating in a bond. This requirement is due to the the interface -index (ipAdEntIfIndex) being associated to the first interface found with a -given IP address. That is, there is only one ipAdEntIfIndex for each IP -address. For example, if eth0 and eth1 are slaves of bond0 and the driver for -eth0 is loaded before the bonding driver, the interface for the IP address -will be associated with the eth0 interface. This configuration is shown below, -the IP address 192.168.1.1 has an interface index of 2 which indexes to eth0 +If running SNMP agents, the bonding driver should be loaded before any network +drivers participating in a bond. This requirement is due to the the interface +index (ipAdEntIfIndex) being associated to the first interface found with a +given IP address. That is, there is only one ipAdEntIfIndex for each IP +address. For example, if eth0 and eth1 are slaves of bond0 and the driver for +eth0 is loaded before the bonding driver, the interface for the IP address +will be associated with the eth0 interface. This configuration is shown below, +the IP address 192.168.1.1 has an interface index of 2 which indexes to eth0 in the ifDescr table (ifDescr.2). interfaces.ifTable.ifEntry.ifDescr.1 = lo @@ -189,10 +189,10 @@ Module Parameters ================= -Optional parameters for the bonding driver can be supplied as command line -arguments to the insmod command. Typically, these parameters are specified in -the file /etc/modules.conf (see the manual page for modules.conf). The -available bonding driver parameters are listed below. If a parameter is not +Optional parameters for the bonding driver can be supplied as command line +arguments to the insmod command. Typically, these parameters are specified in +the file /etc/modules.conf (see the manual page for modules.conf). The +available bonding driver parameters are listed below. If a parameter is not specified the default value is used. When initially configuring a bond, it is recommended "tail -f /var/log/messages" be run in a separate window to watch for bonding driver error messages. @@ -202,19 +202,19 @@ during link failures. arp_interval - - Specifies the ARP monitoring frequency in milli-seconds. - If ARP monitoring is used in a load-balancing mode (mode 0 or 2), the - switch should be configured in a mode that evenly distributes packets - across all links - such as round-robin. If the switch is configured to - distribute the packets in an XOR fashion, all replies from the ARP - targets will be received on the same link which could cause the other + + Specifies the ARP monitoring frequency in milli-seconds. + If ARP monitoring is used in a load-balancing mode (mode 0 or 2), the + switch should be configured in a mode that evenly distributes packets + across all links - such as round-robin. If the switch is configured to + distribute the packets in an XOR fashion, all replies from the ARP + targets will be received on the same link which could cause the other team members to fail. ARP monitoring should not be used in conjunction - with miimon. A value of 0 disables ARP monitoring. The default value + with miimon. A value of 0 disables ARP monitoring. The default value is 0. - + arp_ip_target - + Specifies the ip addresses to use when arp_interval is > 0. These are the targets of the ARP request sent to determine the health of the link to the targets. Specify these values in ddd.ddd.ddd.ddd @@ -223,8 +223,8 @@ maximum number of targets that can be specified is set at 16. downdelay - - Specifies the delay time in milli-seconds to disable a link after a + + Specifies the delay time in milli-seconds to disable a link after a link failure has been detected. This should be a multiple of miimon value, otherwise the value will be rounded. The default value is 0. @@ -247,7 +247,7 @@ and bond2 will be created. The default value is 1. miimon - + Specifies the frequency in milli-seconds that MII link monitoring will occur. A value of zero disables MII link monitoring. A value of 100 is a good starting point. See High Availability section for @@ -258,7 +258,7 @@ Specifies one of the bonding policies. The default is round-robin (balance-rr). Possible values are (you can use either the text or numeric option): - + balance-rr or 0 Round-robin policy: Transmit in a sequential order @@ -273,7 +273,7 @@ externally visible on only one port (network adapter) to avoid confusing the switch. This mode provides fault tolerance. - + balance-xor or 2 XOR policy: Transmit based on [(source MAC address @@ -293,7 +293,7 @@ groups that share the same speed and duplex settings. Transmits and receives on all slaves in the active aggregator. - + Pre-requisites: 1. Ethtool support in the base drivers for retrieving the @@ -317,7 +317,7 @@ Ethtool support in the base drivers for retrieving the speed of each slave. - balance-alb or 6 + balance-alb or 6 Adaptive load balancing: includes balance-tlb + receive load balancing (rlb) for IPV4 traffic and does not require @@ -327,7 +327,7 @@ overwrites the src hw address with the unique hw address of one of the slaves in the bond such that different clients use different hw addresses for the server. - + Receive traffic from connections created by the server is also balanced. When the server sends an ARP Request the bonding driver copies and saves the client's IP information @@ -363,25 +363,11 @@ 2. Base driver support for setting the hw address of a device also when it is open. This is required so that there will always be one slave in the team using the bond hw - address (the current_slave) while having a unique hw - address for each slave in the bond. If the current_slave - fails it's hw address is swapped with the new current_slave + address (the curr_active_slave) while having a unique hw + address for each slave in the bond. If the curr_active_slave + fails it's hw address is swapped with the new curr_active_slave that was chosen. -multicast - - Option specifying the mode of operation for multicast support. - Possible values are: - - disabled or 0 - Disabled (no multicast support) - - active or 1 - Enabled on active slave only, useful in active-backup mode - - all or 2 - Enabled on all slaves, this is the default - primary A string (eth0, eth2, etc) to equate to a primary device. If this @@ -397,11 +383,11 @@ primary is only valid in active-backup mode. updelay - - Specifies the delay time in milli-seconds to enable a link after a + + Specifies the delay time in milli-seconds to enable a link after a link up status has been detected. This should be a multiple of miimon value, otherwise the value will be rounded. The default value is 0. - + use_carrier Specifies whether or not miimon should use MII or ETHTOOL @@ -529,20 +515,20 @@ ---------------------------- The bonding driver information files reside in the /proc/net/bonding directory. -Sample contents of /proc/net/bonding/bond0 after the driver is loaded with +Sample contents of /proc/net/bonding/bond0 after the driver is loaded with parameters of mode=0 and miimon=1000 is shown below. - + Bonding Mode: load balancing (round-robin) Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 1000 Up Delay (ms): 0 Down Delay (ms): 0 - + Slave Interface: eth1 MII Status: up Link Failure Count: 1 - + Slave Interface: eth0 MII Status: up Link Failure Count: 1 @@ -550,34 +536,34 @@ 2) Network verification ----------------------- The network configuration can be verified using the ifconfig command. In -the example below, the bond0 interface is the master (MASTER) while eth0 and -eth1 are slaves (SLAVE). Notice all slaves of bond0 have the same MAC address +the example below, the bond0 interface is the master (MASTER) while eth0 and +eth1 are slaves (SLAVE). Notice all slaves of bond0 have the same MAC address (HWaddr) as bond0 for all modes except TLB and ALB that require a unique MAC address for each slave. [root]# /sbin/ifconfig -bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 +bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0 TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0 - collisions:0 txqueuelen:0 + collisions:0 txqueuelen:0 -eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 +eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0 TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0 - collisions:0 txqueuelen:100 - Interrupt:10 Base address:0x1080 + collisions:0 txqueuelen:100 + Interrupt:10 Base address:0x1080 -eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 +eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0 TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:100 - Interrupt:9 Base address:0x1400 + collisions:0 txqueuelen:100 + Interrupt:9 Base address:0x1400 Frequently Asked Questions @@ -605,9 +591,9 @@ 5. What happens when a slave link dies? - If your ethernet cards support MII or ETHTOOL link status monitoring - and the MII monitoring has been enabled in the driver (see description - of module parameters), there will be no adverse consequences. This + If your ethernet cards support MII or ETHTOOL link status monitoring + and the MII monitoring has been enabled in the driver (see description + of module parameters), there will be no adverse consequences. This release of the bonding driver knows how to get the MII information and enables or disables its slaves according to their link status. See section on High Availability for additional information. @@ -622,8 +608,8 @@ slave. If neither mii_monitor and arp_interval is configured, the bonding - driver will not handle this situation very well. The driver will - continue to send packets but some packets will be lost. Retransmits + driver will not handle this situation very well. The driver will + continue to send packets but some packets will be lost. Retransmits will cause serious degradation of performance (in the case when one of two slave links fails, 50% packets will be lost, which is a serious problem for both TCP and UDP). @@ -636,9 +622,9 @@ 7. Which switches/systems does it work with? - In round-robin and XOR mode, it works with systems that support + In round-robin and XOR mode, it works with systems that support trunking: - + * Many Cisco switches and routers (look for EtherChannel support). * SunTrunking software. * Alteon AceDirector switches / WebOS (use Trunks). @@ -646,7 +632,7 @@ models (450) can define trunks between ports on different physical units. * Linux bonding, of course ! - + In 802.3ad mode, it works with with systems that support IEEE 802.3ad Dynamic Link Aggregation: @@ -667,21 +653,21 @@ is then passed to all following slaves and remains persistent (even if the the first slave is removed) until the bonding device is brought down or reconfigured. - + If you wish to change the MAC address, you can set it with ifconfig: # ifconfig bond0 hw ether 00:11:22:33:44:55 The MAC address can be also changed by bringing down/up the device and then changing its slaves (or their order): - + # ifconfig bond0 down ; modprobe -r bonding # ifconfig bond0 .... up # ifenslave bond0 eth... This method will automatically take the address from the next slave that will be added. - + To restore your slaves' MAC addresses, you need to detach them from the bond (`ifenslave -d bond0 eth0'), set them down (`ifconfig eth0 down'), unload the drivers (`rmmod 3c59x', for @@ -729,27 +715,27 @@ ================= To implement high availability using the bonding driver, the driver needs to be -compiled as a module, because currently it is the only way to pass parameters +compiled as a module, because currently it is the only way to pass parameters to the driver. This may change in the future. -High availability is achieved by using MII or ETHTOOL status reporting. You -need to verify that all your interfaces support MII or ETHTOOL link status -reporting. On Linux kernel 2.2.17, all the 100 Mbps capable drivers and -yellowfin gigabit driver support MII. To determine if ETHTOOL link reporting -is available for interface eth0, type "ethtool eth0" and the "Link detected:" -line should contain the correct link status. If your system has an interface -that does not support MII or ETHTOOL status reporting, a failure of its link -will not be detected! A message indicating MII and ETHTOOL is not supported by -a network driver is logged when the bonding driver is loaded with a non-zero +High availability is achieved by using MII or ETHTOOL status reporting. You +need to verify that all your interfaces support MII or ETHTOOL link status +reporting. On Linux kernel 2.2.17, all the 100 Mbps capable drivers and +yellowfin gigabit driver support MII. To determine if ETHTOOL link reporting +is available for interface eth0, type "ethtool eth0" and the "Link detected:" +line should contain the correct link status. If your system has an interface +that does not support MII or ETHTOOL status reporting, a failure of its link +will not be detected! A message indicating MII and ETHTOOL is not supported by +a network driver is logged when the bonding driver is loaded with a non-zero miimon value. The bonding driver can regularly check all its slaves links using the ETHTOOL -IOCTL (ETHTOOL_GLINK command) or by checking the MII status registers. The -check interval is specified by the module argument "miimon" (MII monitoring). -It takes an integer that represents the checking time in milliseconds. It -should not come to close to (1000/HZ) (10 milli-seconds on i386) because it -may then reduce the system interactivity. A value of 100 seems to be a good -starting point. It means that a dead link will be detected at most 100 +IOCTL (ETHTOOL_GLINK command) or by checking the MII status registers. The +check interval is specified by the module argument "miimon" (MII monitoring). +It takes an integer that represents the checking time in milliseconds. It +should not come to close to (1000/HZ) (10 milli-seconds on i386) because it +may then reduce the system interactivity. A value of 100 seems to be a good +starting point. It means that a dead link will be detected at most 100 milli-seconds after it goes down. Example: @@ -761,7 +747,7 @@ alias bond0 bonding options bond0 miimon=100 -There are currently two policies for high availability. They are dependent on +There are currently two policies for high availability. They are dependent on whether: a) hosts are connected to a single host or switch that support trunking @@ -811,7 +797,7 @@ # ifenslave bond0 eth0 eth1 -2) High Availability on two or more switches (or a single switch without +2) High Availability on two or more switches (or a single switch without trunking support) --------------------------------------------------------------------------- This mode is more problematic because it relies on the fact that there @@ -870,10 +856,10 @@ connected to one switch and host2's to the other. Such system will survive a failure of a single host, cable, or switch. The worst thing that may happen in the case of a switch failure is that half of the hosts will be temporarily -unreachable until the other switch expires its tables. +unreachable until the other switch expires its tables. Example 2: Using multiple ethernet cards connected to a switch to configure - NIC failover (switch is not required to support trunking). + NIC failover (switch is not required to support trunking). +----------+ +----------+ @@ -957,7 +943,7 @@ servers, but may be useful when the front switches send multicast information on their links (e.g. VRRP), or even health-check the servers. Use the arp_interval/arp_ip_target parameters to count incoming/outgoing - frames. + frames. @@ -973,13 +959,12 @@ You will also find a lot of information regarding Ethernet, NWay, MII, etc. at www.scyld.com. -For new versions of the driver, patches for older kernels and the updated -userspace tools, take a look at Willy Tarreau's site : +Patches for 2.2 kernels are at Willy Tarreau's site : - http://wtarreau.free.fr/pub/bonding/ - - http://www-miaif.lip6.fr/willy/pub/bonding/ + - http://www-miaif.lip6.fr/~tarreau/pub/bonding/ To get latest informations about Linux Kernel development, please consult the Linux Kernel Mailing List Archives at : - http://boudicca.tux.org/hypermail/linux-kernel/latest/ + http://www.ussg.iu.edu/hypermail/linux/kernel/ -- END -- diff -Nru a/Documentation/networking/ethertap.txt b/Documentation/networking/ethertap.txt --- a/Documentation/networking/ethertap.txt Tue Feb 17 20:00:07 2004 +++ b/Documentation/networking/ethertap.txt Tue Feb 17 20:00:07 2004 @@ -47,7 +47,7 @@ are two ways of doing this, the new way works with netlink sockets and I have no experience with that yet. ANK uses it in his excellent iproute2 package, see for example rtmon.c. iproute2 can be found on -ftp://ftp.inr.ac.ru/ip-routing/iproute2* +ftp://ftp.tux.org/pub/net/ip-routing/iproute2* The new way is described, partly in netlink(7), available on http://www.europe.redhat.com/documentation/man-pages/man7/netlink.7.php3 diff -Nru a/Documentation/networking/ifenslave.c b/Documentation/networking/ifenslave.c --- a/Documentation/networking/ifenslave.c Tue Feb 17 20:00:06 2004 +++ b/Documentation/networking/ifenslave.c Tue Feb 17 20:00:06 2004 @@ -4,8 +4,6 @@ * This program controls the Linux implementation of running multiple * network interfaces in parallel. * - * Usage: ifenslave [-v] master-interface < slave-interface [metric ] > ... - * * Author: Donald Becker * Copyright 1994-1996 Donald Becker * @@ -90,24 +88,30 @@ * - For opt_c: slave should not be set to the master's setting * while it is running. It was already set during enslave. To * simplify things, it is now handeled separately. + * + * - 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes + * set version to 1.1.0 */ -#define APP_VERSION "1.0.12" -#define APP_RELDATE "June 30, 2003" +#define APP_VERSION "1.1.0" +#define APP_RELDATE "Septemer 24, 2003" #define APP_NAME "ifenslave" static char *version = -APP_NAME ".c:v" APP_VERSION " (" APP_RELDATE ") " "\nDonald Becker (becker@cesdis.gsfc.nasa.gov).\n" -"detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).\n" -"2.4 kernel support added on 2001/02/16 by Chad N. Tindel (ctindel at ieee dot org.\n"; +APP_NAME ".c:v" APP_VERSION " (" APP_RELDATE ")\n" +"o Donald Becker (becker@cesdis.gsfc.nasa.gov).\n" +"o Detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).\n" +"o 2.4 kernel support added on 2001/02/16 by Chad N. Tindel\n" +" (ctindel at ieee dot org).\n"; static const char *usage_msg = -"Usage: ifenslave [-adfrvVh] < [metric ] > ...\n" -" ifenslave -c master-interface slave-if\n"; +"Usage: ifenslave [-f] [...]\n" +" ifenslave -d [...]\n" +" ifenslave -c \n" +" ifenslave --help\n"; -static const char *howto_msg = -"Usage: ifenslave [-adfrvVh] < [metric ] > ...\n" -" ifenslave -c master-interface slave-if\n" +static const char *help_msg = "\n" " To create a bond device, simply follow these three steps :\n" " - ensure that the required drivers are properly loaded :\n" @@ -115,18 +119,32 @@ " - assign an IP address to the bond device :\n" " # ifconfig bond0 netmask broadcast \n" " - attach all the interfaces you need to the bond device :\n" -" # ifenslave bond0 eth0 eth1 eth2\n" +" # ifenslave [{-f|--force}] bond0 eth0 [eth1 [eth2]...]\n" " If bond0 didn't have a MAC address, it will take eth0's. Then, all\n" " interfaces attached AFTER this assignment will get the same MAC addr.\n" -"\n" -" To detach a dead interface without setting the bond device down :\n" -" # ifenslave -d bond0 eth1\n" +" (except for ALB/TLB modes)\n" "\n" " To set the bond device down and automatically release all the slaves :\n" " # ifconfig bond0 down\n" "\n" +" To detach a dead interface without setting the bond device down :\n" +" # ifenslave {-d|--detach} bond0 eth0 [eth1 [eth2]...]\n" +"\n" " To change active slave :\n" -" # ifenslave -c bond0 eth0\n" +" # ifenslave {-c|--change-active} bond0 eth0\n" +"\n" +" To show master interface info\n" +" # ifenslave bond0\n" +"\n" +" To show all interfaces info\n" +" # ifenslave {-a|--all-interfaces}\n" +"\n" +" To be more verbose\n" +" # ifenslave {-v|--verbose} ...\n" +"\n" +" # ifenslave {-u|--usage} Show usage\n" +" # ifenslave {-V|--version} Show version\n" +" # ifenslave {-h|--help} This message\n" "\n"; #include @@ -153,476 +171,332 @@ #include struct option longopts[] = { - /* { name has_arg *flag val } */ - {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */ - {"force", 0, 0, 'f'}, /* Force the operation. */ - {"help", 0, 0, '?'}, /* Give help */ - {"howto", 0, 0, 'h'}, /* Give some more help */ - {"receive-slave", 0, 0, 'r'}, /* Make a receive-only slave. */ - {"verbose", 0, 0, 'v'}, /* Report each action taken. */ - {"version", 0, 0, 'V'}, /* Emit version information. */ - {"detach", 0, 0, 'd'}, /* Detach a slave interface. */ - {"change-active", 0, 0, 'c'}, /* Change the active slave. */ - { 0, 0, 0, 0 } + /* { name has_arg *flag val } */ + {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */ + {"change-active", 0, 0, 'c'}, /* Change the active slave. */ + {"detach", 0, 0, 'd'}, /* Detach a slave interface. */ + {"force", 0, 0, 'f'}, /* Force the operation. */ + {"help", 0, 0, 'h'}, /* Give help */ + {"usage", 0, 0, 'u'}, /* Give usage */ + {"verbose", 0, 0, 'v'}, /* Report each action taken. */ + {"version", 0, 0, 'V'}, /* Emit version information. */ + { 0, 0, 0, 0} }; /* Command-line flags. */ unsigned int -opt_a = 0, /* Show-all-interfaces flag. */ -opt_f = 0, /* Force the operation. */ -opt_r = 0, /* Set up a Rx-only slave. */ -opt_d = 0, /* detach a slave interface. */ -opt_c = 0, /* change-active-slave flag. */ -verbose = 0, /* Verbose flag. */ -opt_version = 0, -opt_howto = 0; -int skfd = -1; /* AF_INET socket for ioctl() calls. */ +opt_a = 0, /* Show-all-interfaces flag. */ +opt_c = 0, /* Change-active-slave flag. */ +opt_d = 0, /* Detach a slave interface. */ +opt_f = 0, /* Force the operation. */ +opt_h = 0, /* Help */ +opt_u = 0, /* Usage */ +opt_v = 0, /* Verbose flag. */ +opt_V = 0; /* Version */ + +int skfd = -1; /* AF_INET socket for ioctl() calls.*/ +int abi_ver = 0; /* userland - kernel ABI version */ +int hwaddr_set = 0; /* Master's hwaddr is set */ +int saved_errno; + +struct ifreq master_mtu, master_flags, master_hwaddr; +struct ifreq slave_mtu, slave_flags, slave_hwaddr; + +struct dev_ifr { + struct ifreq *req_ifr; + char *req_name; + int req_type; +}; + +struct dev_ifr master_ifra[] = { + {&master_mtu, "SIOCGIFMTU", SIOCGIFMTU}, + {&master_flags, "SIOCGIFFLAGS", SIOCGIFFLAGS}, + {&master_hwaddr, "SIOCGIFHWADDR", SIOCGIFHWADDR}, + {NULL, "", 0} +}; + +struct dev_ifr slave_ifra[] = { + {&slave_mtu, "SIOCGIFMTU", SIOCGIFMTU}, + {&slave_flags, "SIOCGIFFLAGS", SIOCGIFFLAGS}, + {&slave_hwaddr, "SIOCGIFHWADDR", SIOCGIFHWADDR}, + {NULL, "", 0} +}; static void if_print(char *ifname); -static int get_abi_ver(char *master_ifname); +static int get_drv_info(char *master_ifname); +static int get_if_settings(char *ifname, struct dev_ifr ifra[]); +static int get_slave_flags(char *slave_ifname); +static int set_master_hwaddr(char *master_ifname, struct sockaddr *hwaddr); +static int set_slave_hwaddr(char *slave_ifname, struct sockaddr *hwaddr); +static int set_slave_mtu(char *slave_ifname, int mtu); +static int set_if_flags(char *ifname, short flags); +static int set_if_up(char *ifname, short flags); +static int set_if_down(char *ifname, short flags); +static int clear_if_addr(char *ifname); +static int set_if_addr(char *master_ifname, char *slave_ifname); +static int change_active(char *master_ifname, char *slave_ifname); +static int enslave(char *master_ifname, char *slave_ifname); +static int release(char *master_ifname, char *slave_ifname); +#define v_print(fmt, args...) \ + if (opt_v) \ + fprintf(stderr, fmt, ## args ) -int -main(int argc, char **argv) +int main(int argc, char *argv[]) { - struct ifreq ifr2, if_hwaddr, if_ipaddr, if_metric, if_mtu, if_dstaddr; - struct ifreq if_netmask, if_brdaddr, if_flags; - int rv, goterr = 0; - int c, errflag = 0; - sa_family_t master_family; char **spp, *master_ifname, *slave_ifname; - int hwaddr_notset; - int abi_ver = 0; + int c, i, rv; + int res = 0; + int exclusive = 0; - while ((c = getopt_long(argc, argv, "acdfrvV?h", longopts, 0)) != EOF) + while ((c = getopt_long(argc, argv, "acdfhuvV", longopts, 0)) != EOF) { switch (c) { - case 'a': opt_a++; break; - case 'f': opt_f++; break; - case 'r': opt_r++; break; - case 'd': opt_d++; break; - case 'c': opt_c++; break; - case 'v': verbose++; break; - case 'V': opt_version++; break; - case 'h': opt_howto++; break; - case '?': errflag++; - } + case 'a': opt_a++; exclusive++; break; + case 'c': opt_c++; exclusive++; break; + case 'd': opt_d++; exclusive++; break; + case 'f': opt_f++; exclusive++; break; + case 'h': opt_h++; exclusive++; break; + case 'u': opt_u++; exclusive++; break; + case 'v': opt_v++; break; + case 'V': opt_V++; exclusive++; break; - /* option check */ - if (opt_c) - if(opt_a || opt_f || opt_r || opt_d || verbose || opt_version || - opt_howto || errflag ) { + case '?': fprintf(stderr, usage_msg); - return 2; + res = 2; + goto out; } + } - if (errflag) { + /* options check */ + if (exclusive > 1) { fprintf(stderr, usage_msg); - return 2; + res = 2; + goto out; } - if (opt_howto) { - fprintf(stderr, howto_msg); - return 0; + if (opt_v || opt_V) { + printf(version); + if (opt_V) { + res = 0; + goto out; + } } - if (verbose || opt_version) { - printf(version); - if (opt_version) - exit(0); + if (opt_u) { + printf(usage_msg); + res = 0; + goto out; } - /* Open a basic socket. */ - if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { - perror("socket"); - exit(-1); + if (opt_h) { + printf(usage_msg); + printf(help_msg); + res = 0; + goto out; } - if (verbose) - fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.\n", - argc, optind, argv[optind]); + /* Open a basic socket */ + if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("socket"); + res = 1; + goto out; + } - /* No remaining args means show all interfaces. */ - if (optind == argc) { - if_print((char *)NULL); - (void) close(skfd); - exit(0); + if (opt_a) { + if (optind == argc) { + /* No remaining args */ + /* show all interfaces */ + if_print((char *)NULL); + goto out; + } else { + /* Just show usage */ + fprintf(stderr, usage_msg); + res = 2; + goto out; + } } - /* Copy the interface name. */ + /* Copy the interface name */ spp = argv + optind; master_ifname = *spp++; - slave_ifname = *spp++; - /* Check command line. */ - if (opt_c) { - char **tempp = spp; - if ((master_ifname == NULL)||(slave_ifname == NULL)||(*tempp++ != NULL)) { - fprintf(stderr, usage_msg); - (void) close(skfd); - return 2; - } + if (master_ifname == NULL) { + fprintf(stderr, usage_msg); + res = 2; + goto out; } - /* A single args means show the configuration for this interface. */ - if (slave_ifname == NULL) { - if_print(master_ifname); - (void) close(skfd); - exit(0); + /* exchange abi version with bonding module */ + res = get_drv_info(master_ifname); + if (res) { + fprintf(stderr, + "Master '%s': Error: handshake with driver failed. " + "Aborting\n", + master_ifname); + goto out; } - /* exchange abi version with bonding driver */ - abi_ver = get_abi_ver(master_ifname); - if (abi_ver < 0) { - (void) close(skfd); - exit(1); - } - - /* Get the vitals from the master interface. */ - { - struct ifreq *ifra[7] = { &if_ipaddr, &if_mtu, &if_dstaddr, - &if_brdaddr, &if_netmask, &if_flags, - &if_hwaddr }; - const char *req_name[7] = { - "IP address", "MTU", "destination address", - "broadcast address", "netmask", "status flags", - "hardware address" }; - const int ioctl_req_type[7] = { - SIOCGIFADDR, SIOCGIFMTU, SIOCGIFDSTADDR, - SIOCGIFBRDADDR, SIOCGIFNETMASK, SIOCGIFFLAGS, - SIOCGIFHWADDR }; - int i; - - for (i = 0; i < 7; i++) { - strncpy(ifra[i]->ifr_name, master_ifname, IFNAMSIZ); - if (ioctl(skfd, ioctl_req_type[i], ifra[i]) < 0) { - fprintf(stderr, - "Something broke getting the master's %s: %s.\n", - req_name[i], strerror(errno)); - } - } - - /* check if master is up; if not then fail any operation */ - if (!(if_flags.ifr_flags & IFF_UP)) { - fprintf(stderr, "Illegal operation; the specified master interface '%s' is not up.\n", master_ifname); - (void) close(skfd); - exit (1); - } + slave_ifname = *spp++; - hwaddr_notset = 1; /* assume master's address not set yet */ - for (i = 0; hwaddr_notset && (i < 6); i++) { - hwaddr_notset &= ((unsigned char *)if_hwaddr.ifr_hwaddr.sa_data)[i] == 0; + if (slave_ifname == NULL) { + if (opt_d || opt_c) { + fprintf(stderr, usage_msg); + res = 2; + goto out; } - /* The family '1' is ARPHRD_ETHER for ethernet. */ - if (if_hwaddr.ifr_hwaddr.sa_family != 1 && !opt_f) { - fprintf(stderr, "The specified master interface '%s' is not" - " ethernet-like.\n This program is designed to work" - " with ethernet-like network interfaces.\n" - " Use the '-f' option to force the operation.\n", - master_ifname); - (void) close(skfd); - exit (1); - } - master_family = if_hwaddr.ifr_hwaddr.sa_family; - if (verbose) { - unsigned char *hwaddr = (unsigned char *)if_hwaddr.ifr_hwaddr.sa_data; - printf("The current hardware address (SIOCGIFHWADDR) of %s is type %d " - "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", master_ifname, - if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1], - hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); - } + /* A single arg means show the + * configuration for this interface + */ + if_print(master_ifname); + goto out; } + res = get_if_settings(master_ifname, master_ifra); + if (res) { + /* Probably a good reason not to go on */ + fprintf(stderr, + "Master '%s': Error: get settings failed: %s. " + "Aborting\n", + master_ifname, strerror(res)); + goto out; + } - /* do this when enslaving interfaces */ - do { - if (opt_d) { /* detach a slave interface from the master */ - strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ); - strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ); - if ((ioctl(skfd, SIOCBONDRELEASE, &if_flags) < 0) && - (ioctl(skfd, BOND_RELEASE_OLD, &if_flags) < 0)) { - fprintf(stderr, "SIOCBONDRELEASE: cannot detach %s from %s. errno=%s.\n", - slave_ifname, master_ifname, strerror(errno)); - } - else if (abi_ver < 1) { - /* The driver is using an old ABI, so we'll set the interface - * down to avoid any conflicts due to same IP/MAC - */ - strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ); - if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) { - int saved_errno = errno; - fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname, - strerror(saved_errno)); - } - else { - ifr2.ifr_flags &= ~(IFF_UP | IFF_RUNNING); - if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) { - int saved_errno = errno; - fprintf(stderr, "Shutting down interface %s failed: %s\n", - slave_ifname, strerror(saved_errno)); - } - } - } - } else if (opt_c) { /* change primary slave */ - strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ); - strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ); - if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &if_flags) < 0) && - (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &if_flags) < 0)) { - fprintf(stderr, "SIOCBONDCHANGEACTIVE: %s.\n", strerror(errno)); - } - } else { /* attach a slave interface to the master */ - - strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ); - if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) { - int saved_errno = errno; - fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname, - strerror(saved_errno)); - (void) close(skfd); - return 1; - } - - if ((ifr2.ifr_flags & IFF_SLAVE) && !opt_r) { - fprintf(stderr, "%s is already a slave\n", slave_ifname); - (void) close(skfd); - return 1; - } - - /* if hwaddr_notset, assign the slave hw address to the master */ - if (hwaddr_notset) { - /* assign the slave hw address to the - * master since it currently does not - * have one; otherwise, slaves may - * have different hw addresses in - * active-backup mode as seen when enslaving - * using "ifenslave bond0 eth0 eth1" because - * hwaddr_notset is set outside this loop. - * TODO: put this and the "else" portion in - * a function. - */ - /* get the slaves MAC address */ - strncpy(if_hwaddr.ifr_name, slave_ifname, - IFNAMSIZ); - rv = ioctl(skfd, SIOCGIFHWADDR, &if_hwaddr); - if (-1 == rv) { - fprintf(stderr, "Could not get MAC " - "address of %s: %s\n", - slave_ifname, - strerror(errno)); - strncpy(if_hwaddr.ifr_name, - master_ifname, IFNAMSIZ); - goterr = 1; - } - - if (!goterr) { - if (abi_ver < 1) { - /* In ABI versions older than 1, the - * master's set_mac routine couldn't - * work if it was up, because it - * used the default ethernet set_mac - * function. - */ - /* bring master down */ - if_flags.ifr_flags &= ~IFF_UP; - if (ioctl(skfd, SIOCSIFFLAGS, - &if_flags) < 0) { - goterr = 1; - fprintf(stderr, - "Shutting down " - "interface %s failed: " - "%s\n", - master_ifname, - strerror(errno)); - } - } - - strncpy(if_hwaddr.ifr_name, - master_ifname, IFNAMSIZ); - if (ioctl(skfd, SIOCSIFHWADDR, - &if_hwaddr) < 0) { - fprintf(stderr, - "Could not set MAC " - "address of %s: %s\n", - master_ifname, - strerror(errno)); - goterr=1; - } else { - hwaddr_notset = 0; - } - - if (abi_ver < 1) { - /* bring master back up */ - if_flags.ifr_flags |= IFF_UP; - if (ioctl(skfd, SIOCSIFFLAGS, - &if_flags) < 0) { - fprintf(stderr, - "Bringing up interface " - "%s failed: %s\n", - master_ifname, - strerror(errno)); - } - } - } - } else if (abi_ver < 1) { /* if (hwaddr_notset) */ - - /* The driver is using an old ABI, so we'll set the interface - * down and assign the master's hwaddr to it - */ - if (ifr2.ifr_flags & IFF_UP) { - ifr2.ifr_flags &= ~IFF_UP; - if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) { - int saved_errno = errno; - fprintf(stderr, "Shutting down interface %s failed: %s\n", - slave_ifname, strerror(saved_errno)); - } - } - - strncpy(if_hwaddr.ifr_name, slave_ifname, IFNAMSIZ); - if (ioctl(skfd, SIOCSIFHWADDR, &if_hwaddr) < 0) { - int saved_errno = errno; - fprintf(stderr, "SIOCSIFHWADDR on %s failed: %s\n", if_hwaddr.ifr_name, - strerror(saved_errno)); - if (saved_errno == EBUSY) - fprintf(stderr, " The slave device %s is busy: it must be" - " idle before running this command.\n", slave_ifname); - else if (saved_errno == EOPNOTSUPP) - fprintf(stderr, " The slave device you specified does not support" - " setting the MAC address.\n Your kernel likely does not" - " support slave devices.\n"); - else if (saved_errno == EINVAL) - fprintf(stderr, " The slave device's address type does not match" - " the master's address type.\n"); - } else { - if (verbose) { - unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data; - printf("Slave's (%s) hardware address set to " - "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", slave_ifname, - hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); - } - } - } + /* check if master is indeed a master; + * if not then fail any operation + */ + if (!(master_flags.ifr_flags & IFF_MASTER)) { + fprintf(stderr, + "Illegal operation; the specified interface '%s' " + "is not a master. Aborting\n", + master_ifname); + res = 1; + goto out; + } - if (*spp && !strcmp(*spp, "metric")) { - if (*++spp == NULL) { - fprintf(stderr, usage_msg); - (void) close(skfd); - exit(2); - } - if_metric.ifr_metric = atoi(*spp); - strncpy(if_metric.ifr_name, slave_ifname, IFNAMSIZ); - if (ioctl(skfd, SIOCSIFMETRIC, &if_metric) < 0) { - fprintf(stderr, "SIOCSIFMETRIC on %s: %s\n", slave_ifname, - strerror(errno)); - goterr = 1; - } - spp++; - } + /* check if master is up; if not then fail any operation */ + if (!(master_flags.ifr_flags & IFF_UP)) { + fprintf(stderr, + "Illegal operation; the specified master interface " + "'%s' is not up.\n", + master_ifname); + res = 1; + goto out; + } - if (strncpy(if_ipaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFADDR, &if_ipaddr) < 0) { - fprintf(stderr, - "Something broke setting the slave's address: %s.\n", - strerror(errno)); - } else { - if (verbose) { - unsigned char *ipaddr = if_ipaddr.ifr_addr.sa_data; - printf("Set the slave's (%s) IP address to %d.%d.%d.%d.\n", - slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); - } - } + /* Only for enslaving */ + if (!opt_c && !opt_d) { + sa_family_t master_family = master_hwaddr.ifr_hwaddr.sa_family; + unsigned char *hwaddr = + (unsigned char *)master_hwaddr.ifr_hwaddr.sa_data; - if (strncpy(if_mtu.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFMTU, &if_mtu) < 0) { - fprintf(stderr, "Something broke setting the slave MTU: %s.\n", - strerror(errno)); - } else { - if (verbose) - printf("Set the slave's (%s) MTU to %d.\n", slave_ifname, if_mtu.ifr_mtu); - } + /* The family '1' is ARPHRD_ETHER for ethernet. */ + if (master_family != 1 && !opt_f) { + fprintf(stderr, + "Illegal operation: The specified master " + "interface '%s' is not ethernet-like.\n " + "This program is designed to work with " + "ethernet-like network interfaces.\n " + "Use the '-f' option to force the " + "operation.\n", + master_ifname); + res = 1; + goto out; + } - if (strncpy(if_dstaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFDSTADDR, &if_dstaddr) < 0) { - fprintf(stderr, "Error setting the slave (%s) with SIOCSIFDSTADDR: %s.\n", - slave_ifname, strerror(errno)); - } else { - if (verbose) { - unsigned char *ipaddr = if_dstaddr.ifr_dstaddr.sa_data; - printf("Set the slave's (%s) destination address to %d.%d.%d.%d.\n", - slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); - } + /* Check master's hw addr */ + for (i = 0; i < 6; i++) { + if (hwaddr[i] != 0) { + hwaddr_set = 1; + break; } + } - if (strncpy(if_brdaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFBRDADDR, &if_brdaddr) < 0) { - fprintf(stderr, - "Something broke setting the slave (%s) broadcast address: %s.\n", - slave_ifname, strerror(errno)); - } else { - if (verbose) { - unsigned char *ipaddr = if_brdaddr.ifr_broadaddr.sa_data; - printf("Set the slave's (%s) broadcast address to %d.%d.%d.%d.\n", - slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); - } - } + if (hwaddr_set) { + v_print("current hardware address of master '%s' " + "is %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, " + "type %d\n", + master_ifname, + hwaddr[0], hwaddr[1], + hwaddr[2], hwaddr[3], + hwaddr[4], hwaddr[5], + master_family); + } + } - if (strncpy(if_netmask.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFNETMASK, &if_netmask) < 0) { - fprintf(stderr, - "Something broke setting the slave (%s) netmask: %s.\n", - slave_ifname, strerror(errno)); - } else { - if (verbose) { - unsigned char *ipaddr = if_netmask.ifr_netmask.sa_data; - printf("Set the slave's (%s) netmask to %d.%d.%d.%d.\n", - slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); + /* Accepts only one slave */ + if (opt_c) { + /* change active slave */ + res = get_slave_flags(slave_ifname); + if (res) { + fprintf(stderr, + "Slave '%s': Error: get flags failed. " + "Aborting\n", + slave_ifname); + goto out; + } + res = change_active(master_ifname, slave_ifname); + if (res) { + fprintf(stderr, + "Master '%s', Slave '%s': Error: " + "Change active failed\n", + master_ifname, slave_ifname); + } + } else { + /* Accept multiple slaves */ + do { + if (opt_d) { + /* detach a slave interface from the master */ + rv = get_slave_flags(slave_ifname); + if (rv) { + /* Can't work with this slave. */ + /* remember the error and skip it*/ + fprintf(stderr, + "Slave '%s': Error: get flags " + "failed. Skipping\n", + slave_ifname); + res = rv; + continue; } - } - - if (abi_ver < 1) { - - /* The driver is using an old ABI, so we'll set the interface - * up before enslaving it - */ - ifr2.ifr_flags |= IFF_UP; - if ((ifr2.ifr_flags &= ~(IFF_SLAVE | IFF_MASTER)) == 0 - || strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ) <= 0 - || ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) { - fprintf(stderr, - "Something broke setting the slave (%s) flags: %s.\n", - slave_ifname, strerror(errno)); - } else { - if (verbose) - printf("Set the slave's (%s) flags %4.4x.\n", - slave_ifname, if_flags.ifr_flags); + rv = release(master_ifname, slave_ifname); + if (rv) { + fprintf(stderr, + "Master '%s', Slave '%s': Error: " + "Release failed\n", + master_ifname, slave_ifname); + res = rv; } } else { - /* the bonding module takes care of setting the slave's mac address - * and opening its interface - */ - if (ifr2.ifr_flags & IFF_UP) { /* the interface will need to be down */ - ifr2.ifr_flags &= ~IFF_UP; - if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) { - int saved_errno = errno; - fprintf(stderr, "Shutting down interface %s failed: %s\n", - slave_ifname, strerror(saved_errno)); - } + /* attach a slave interface to the master */ + rv = get_if_settings(slave_ifname, slave_ifra); + if (rv) { + /* Can't work with this slave. */ + /* remember the error and skip it*/ + fprintf(stderr, + "Slave '%s': Error: get " + "settings failed: %s. " + "Skipping\n", + slave_ifname, strerror(rv)); + res = rv; + continue; } - } - - /* Do the real thing */ - if (!opt_r) { - strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ); - strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ); - if ((ioctl(skfd, SIOCBONDENSLAVE, &if_flags) < 0) && - (ioctl(skfd, BOND_ENSLAVE_OLD, &if_flags) < 0)) { - fprintf(stderr, "SIOCBONDENSLAVE: %s.\n", strerror(errno)); + rv = enslave(master_ifname, slave_ifname); + if (rv) { + fprintf(stderr, + "Master '%s', Slave '%s': Error: " + "Enslave failed\n", + master_ifname, slave_ifname); + res = rv; } } - } - } while ( (slave_ifname = *spp++) != NULL); + } while ((slave_ifname = *spp++) != NULL); + } - /* Close the socket. */ - (void) close(skfd); +out: + if (skfd >= 0) { + close(skfd); + } - return(goterr); + return res; } static short mif_flags; @@ -631,35 +505,34 @@ static int if_getconfig(char *ifname) { struct ifreq ifr; - int metric, mtu; /* Parameters of the master interface. */ + int metric, mtu; /* Parameters of the master interface. */ struct sockaddr dstaddr, broadaddr, netmask; + unsigned char *hwaddr; strcpy(ifr.ifr_name, ifname); if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) return -1; mif_flags = ifr.ifr_flags; printf("The result of SIOCGIFFLAGS on %s is %x.\n", - ifname, ifr.ifr_flags); + ifname, ifr.ifr_flags); strcpy(ifr.ifr_name, ifname); if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0) return -1; printf("The result of SIOCGIFADDR is %2.2x.%2.2x.%2.2x.%2.2x.\n", - ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1], - ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]); + ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1], + ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]); strcpy(ifr.ifr_name, ifname); if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) return -1; - { - /* Gotta convert from 'char' to unsigned for printf(). */ - unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; - printf("The result of SIOCGIFHWADDR is type %d " - "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", - ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1], - hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); - } + /* Gotta convert from 'char' to unsigned for printf(). */ + hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; + printf("The result of SIOCGIFHWADDR is type %d " + "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", + ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1], + hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); strcpy(ifr.ifr_name, ifname); if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) { @@ -691,7 +564,7 @@ } else netmask = ifr.ifr_netmask; - return(0); + return 0; } static void if_print(char *ifname) @@ -705,15 +578,16 @@ ifc.ifc_len = sizeof(buff); ifc.ifc_buf = buff; if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { - fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno)); + perror("SIOCGIFCONF failed"); return; } ifr = ifc.ifc_req; for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) { if (if_getconfig(ifr->ifr_name) < 0) { - fprintf(stderr, "%s: unknown interface.\n", - ifr->ifr_name); + fprintf(stderr, + "%s: unknown interface.\n", + ifr->ifr_name); continue; } @@ -721,16 +595,18 @@ /*ife_print(&ife);*/ } } else { - if (if_getconfig(ifname) < 0) - fprintf(stderr, "%s: unknown interface.\n", ifname); + if (if_getconfig(ifname) < 0) { + fprintf(stderr, + "%s: unknown interface.\n", ifname); + } } } -static int get_abi_ver(char *master_ifname) +static int get_drv_info(char *master_ifname) { struct ifreq ifr; struct ethtool_drvinfo info; - int abi_ver = 0; + char *endptr; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); @@ -739,24 +615,487 @@ info.cmd = ETHTOOL_GDRVINFO; strncpy(info.driver, "ifenslave", 32); snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION); - if (ioctl(skfd, SIOCETHTOOL, &ifr) >= 0) { - char *endptr; - abi_ver = strtoul(info.fw_version, &endptr, 0); - if (*endptr) { - fprintf(stderr, "Error: got invalid string as an ABI " - "version from the bonding module\n"); - return -1; + if (ioctl(skfd, SIOCETHTOOL, &ifr) < 0) { + if (errno == EOPNOTSUPP) { + goto out; } + + saved_errno = errno; + v_print("Master '%s': Error: get bonding info failed %s\n", + master_ifname, strerror(saved_errno)); + return 1; } - if (verbose) { - printf("ABI ver is %d\n", abi_ver); + abi_ver = strtoul(info.fw_version, &endptr, 0); + if (*endptr) { + v_print("Master '%s': Error: got invalid string as an ABI " + "version from the bonding module\n", + master_ifname); + return 1; } - return abi_ver; + +out: + v_print("ABI ver is %d\n", abi_ver); + + return 0; } +static int change_active(char *master_ifname, char *slave_ifname) +{ + struct ifreq ifr; + int res = 0; + if (!(slave_flags.ifr_flags & IFF_SLAVE)) { + fprintf(stderr, + "Illegal operation: The specified slave interface " + "'%s' is not a slave\n", + slave_ifname); + return 1; + } + + strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); + strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ); + if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &ifr) < 0) && + (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &ifr) < 0)) { + saved_errno = errno; + v_print("Master '%s': Error: SIOCBONDCHANGEACTIVE failed: " + "%s\n", + master_ifname, strerror(saved_errno)); + res = 1; + } + + return res; +} + +static int enslave(char *master_ifname, char *slave_ifname) +{ + struct ifreq ifr; + int res = 0; + + if (slave_flags.ifr_flags & IFF_SLAVE) { + fprintf(stderr, + "Illegal operation: The specified slave interface " + "'%s' is already a slave\n", + slave_ifname); + return 1; + } + + res = set_if_down(slave_ifname, slave_flags.ifr_flags); + if (res) { + fprintf(stderr, + "Slave '%s': Error: bring interface down failed\n", + slave_ifname); + return res; + } + + if (abi_ver < 2) { + /* Older bonding versions would panic if the slave has no IP + * address, so get the IP setting from the master. + */ + res = set_if_addr(master_ifname, slave_ifname); + if (res) { + fprintf(stderr, + "Slave '%s': Error: set address failed\n", + slave_ifname); + return res; + } + } else { + res = clear_if_addr(slave_ifname); + if (res) { + fprintf(stderr, + "Slave '%s': Error: clear address failed\n", + slave_ifname); + return res; + } + } + + if (master_mtu.ifr_mtu != slave_mtu.ifr_mtu) { + res = set_slave_mtu(slave_ifname, master_mtu.ifr_mtu); + if (res) { + fprintf(stderr, + "Slave '%s': Error: set MTU failed\n", + slave_ifname); + return res; + } + } + + if (hwaddr_set) { + /* Master already has an hwaddr + * so set it's hwaddr to the slave + */ + if (abi_ver < 1) { + /* The driver is using an old ABI, so + * the application sets the slave's + * hwaddr + */ + res = set_slave_hwaddr(slave_ifname, + &(master_hwaddr.ifr_hwaddr)); + if (res) { + fprintf(stderr, + "Slave '%s': Error: set hw address " + "failed\n", + slave_ifname); + goto undo_mtu; + } + + /* For old ABI the application needs to bring the + * slave back up + */ + res = set_if_up(slave_ifname, slave_flags.ifr_flags); + if (res) { + fprintf(stderr, + "Slave '%s': Error: bring interface " + "down failed\n", + slave_ifname); + goto undo_slave_mac; + } + } + /* The driver is using a new ABI, + * so the driver takes care of setting + * the slave's hwaddr and bringing + * it up again + */ + } else { + /* No hwaddr for master yet, so + * set the slave's hwaddr to it + */ + if (abi_ver < 1) { + /* For old ABI, the master needs to be + * down before setting it's hwaddr + */ + res = set_if_down(master_ifname, master_flags.ifr_flags); + if (res) { + fprintf(stderr, + "Master '%s': Error: bring interface " + "down failed\n", + master_ifname); + goto undo_mtu; + } + } + + res = set_master_hwaddr(master_ifname, + &(slave_hwaddr.ifr_hwaddr)); + if (res) { + fprintf(stderr, + "Master '%s': Error: set hw address " + "failed\n", + master_ifname); + goto undo_mtu; + } + + if (abi_ver < 1) { + /* For old ABI, bring the master + * back up + */ + res = set_if_up(master_ifname, master_flags.ifr_flags); + if (res) { + fprintf(stderr, + "Master '%s': Error: bring interface " + "up failed\n", + master_ifname); + goto undo_master_mac; + } + } + + hwaddr_set = 1; + } + + /* Do the real thing */ + strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); + strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ); + if ((ioctl(skfd, SIOCBONDENSLAVE, &ifr) < 0) && + (ioctl(skfd, BOND_ENSLAVE_OLD, &ifr) < 0)) { + saved_errno = errno; + v_print("Master '%s': Error: SIOCBONDENSLAVE failed: %s\n", + master_ifname, strerror(saved_errno)); + res = 1; + } + + if (res) { + goto undo_master_mac; + } + + return 0; + +/* rollback (best effort) */ +undo_master_mac: + set_master_hwaddr(master_ifname, &(master_hwaddr.ifr_hwaddr)); + hwaddr_set = 0; + goto undo_mtu; +undo_slave_mac: + set_slave_hwaddr(slave_ifname, &(slave_hwaddr.ifr_hwaddr)); +undo_mtu: + set_slave_mtu(slave_ifname, slave_mtu.ifr_mtu); + return res; +} + +static int release(char *master_ifname, char *slave_ifname) +{ + struct ifreq ifr; + int res = 0; + + if (!(slave_flags.ifr_flags & IFF_SLAVE)) { + fprintf(stderr, + "Illegal operation: The specified slave interface " + "'%s' is not a slave\n", + slave_ifname); + return 1; + } + + strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); + strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ); + if ((ioctl(skfd, SIOCBONDRELEASE, &ifr) < 0) && + (ioctl(skfd, BOND_RELEASE_OLD, &ifr) < 0)) { + saved_errno = errno; + v_print("Master '%s': Error: SIOCBONDRELEASE failed: %s\n", + master_ifname, strerror(saved_errno)); + return 1; + } else if (abi_ver < 1) { + /* The driver is using an old ABI, so we'll set the interface + * down to avoid any conflicts due to same MAC/IP + */ + res = set_if_down(slave_ifname, slave_flags.ifr_flags); + if (res) { + fprintf(stderr, + "Slave '%s': Error: bring interface " + "down failed\n", + slave_ifname); + } + } + + /* set to default mtu */ + set_slave_mtu(slave_ifname, 1500); + + return res; +} + +static int get_if_settings(char *ifname, struct dev_ifr ifra[]) +{ + int i; + int res = 0; + + for (i = 0; ifra[i].req_ifr; i++) { + strncpy(ifra[i].req_ifr->ifr_name, ifname, IFNAMSIZ); + res = ioctl(skfd, ifra[i].req_type, ifra[i].req_ifr); + if (res < 0) { + saved_errno = errno; + v_print("Interface '%s': Error: %s failed: %s\n", + ifname, ifra[i].req_name, + strerror(saved_errno)); + + return saved_errno; + } + } + + return 0; +} + +static int get_slave_flags(char *slave_ifname) +{ + int res = 0; + + strncpy(slave_flags.ifr_name, slave_ifname, IFNAMSIZ); + res = ioctl(skfd, SIOCGIFFLAGS, &slave_flags); + if (res < 0) { + saved_errno = errno; + v_print("Slave '%s': Error: SIOCGIFFLAGS failed: %s\n", + slave_ifname, strerror(saved_errno)); + } else { + v_print("Slave %s: flags %04X.\n", + slave_ifname, slave_flags.ifr_flags); + } + + return res; +} + +static int set_master_hwaddr(char *master_ifname, struct sockaddr *hwaddr) +{ + unsigned char *addr = (unsigned char *)hwaddr->sa_data; + struct ifreq ifr; + int res = 0; + + strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); + memcpy(&(ifr.ifr_hwaddr), hwaddr, sizeof(struct sockaddr)); + res = ioctl(skfd, SIOCSIFHWADDR, &ifr); + if (res < 0) { + saved_errno = errno; + v_print("Master '%s': Error: SIOCSIFHWADDR failed: %s\n", + master_ifname, strerror(saved_errno)); + return res; + } else { + v_print("Master '%s': hardware address set to " + "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", + master_ifname, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5]); + } + + return res; +} + +static int set_slave_hwaddr(char *slave_ifname, struct sockaddr *hwaddr) +{ + unsigned char *addr = (unsigned char *)hwaddr->sa_data; + struct ifreq ifr; + int res = 0; + + strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ); + memcpy(&(ifr.ifr_hwaddr), hwaddr, sizeof(struct sockaddr)); + res = ioctl(skfd, SIOCSIFHWADDR, &ifr); + if (res < 0) { + saved_errno = errno; + + v_print("Slave '%s': Error: SIOCSIFHWADDR failed: %s\n", + slave_ifname, strerror(saved_errno)); + + if (saved_errno == EBUSY) { + v_print(" The device is busy: it must be idle " + "before running this command.\n"); + } else if (saved_errno == EOPNOTSUPP) { + v_print(" The device does not support setting " + "the MAC address.\n" + " Your kernel likely does not support slave " + "devices.\n"); + } else if (saved_errno == EINVAL) { + v_print(" The device's address type does not match " + "the master's address type.\n"); + } + return res; + } else { + v_print("Slave '%s': hardware address set to " + "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", + slave_ifname, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5]); + } + + return res; +} + +static int set_slave_mtu(char *slave_ifname, int mtu) +{ + struct ifreq ifr; + int res = 0; + + ifr.ifr_mtu = mtu; + strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ); + + res = ioctl(skfd, SIOCSIFMTU, &ifr); + if (res < 0) { + saved_errno = errno; + v_print("Slave '%s': Error: SIOCSIFMTU failed: %s\n", + slave_ifname, strerror(saved_errno)); + } else { + v_print("Slave '%s': MTU set to %d.\n", slave_ifname, mtu); + } + + return res; +} + +static int set_if_flags(char *ifname, short flags) +{ + struct ifreq ifr; + int res = 0; + + ifr.ifr_flags = flags; + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + + res = ioctl(skfd, SIOCSIFFLAGS, &ifr); + if (res < 0) { + saved_errno = errno; + v_print("Interface '%s': Error: SIOCSIFFLAGS failed: %s\n", + ifname, strerror(saved_errno)); + } else { + v_print("Interface '%s': flags set to %04X.\n", ifname, flags); + } + + return res; +} + +static int set_if_up(char *ifname, short flags) +{ + return set_if_flags(ifname, flags | IFF_UP); +} + +static int set_if_down(char *ifname, short flags) +{ + return set_if_flags(ifname, flags & ~IFF_UP); +} + +static int clear_if_addr(char *ifname) +{ + struct ifreq ifr; + int res = 0; + + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + ifr.ifr_addr.sa_family = AF_INET; + memset(ifr.ifr_addr.sa_data, 0, sizeof(ifr.ifr_addr.sa_data)); + + res = ioctl(skfd, SIOCSIFADDR, &ifr); + if (res < 0) { + saved_errno = errno; + v_print("Interface '%s': Error: SIOCSIFADDR failed: %s\n", + ifname, strerror(saved_errno)); + } else { + v_print("Interface '%s': address cleared\n", ifname); + } + + return res; +} + +static int set_if_addr(char *master_ifname, char *slave_ifname) +{ + struct ifreq ifr; + int res; + unsigned char *ipaddr; + int i; + struct { + char *req_name; + char *desc; + int g_ioctl; + int s_ioctl; + } ifra[] = { + {"IFADDR", "addr", SIOCGIFADDR, SIOCSIFADDR}, + {"DSTADDR", "destination addr", SIOCGIFDSTADDR, SIOCSIFDSTADDR}, + {"BRDADDR", "broadcast addr", SIOCGIFBRDADDR, SIOCSIFBRDADDR}, + {"NETMASK", "netmask", SIOCGIFNETMASK, SIOCSIFNETMASK}, + {NULL, NULL, 0, 0}, + }; + + for (i = 0; ifra[i].req_name; i++) { + strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ); + res = ioctl(skfd, ifra[i].g_ioctl, &ifr); + if (res < 0) { + int saved_errno = errno; + + v_print("Interface '%s': Error: SIOCG%s failed: %s\n", + master_ifname, ifra[i].req_name, + strerror(saved_errno)); + + ifr.ifr_addr.sa_family = AF_INET; + memset(ifr.ifr_addr.sa_data, 0, + sizeof(ifr.ifr_addr.sa_data)); + } + + strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ); + res = ioctl(skfd, ifra[i].s_ioctl, &ifr); + if (res < 0) { + int saved_errno = errno; + + v_print("Interface '%s': Error: SIOCS%s failed: %s\n", + slave_ifname, ifra[i].req_name, + strerror(saved_errno)); + + return res; + } + + ipaddr = ifr.ifr_addr.sa_data; + v_print("Interface '%s': set IP %s to %d.%d.%d.%d\n", + slave_ifname, ifra[i].desc, + ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); + } + + return 0; +} /* * Local variables: @@ -768,3 +1107,4 @@ * compile-command: "gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave" * End: */ + diff -Nru a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt --- a/Documentation/networking/ip-sysctl.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/networking/ip-sysctl.txt Tue Feb 17 20:00:06 2004 @@ -294,6 +294,19 @@ changed would be a Beowulf compute cluster. Default: 0 +tcp_westwood - BOOLEAN + Enable TCP Westwood+ congestion control algorithm. + TCP Westwood+ is a sender-side only modification of the TCP Reno + protocol stack that optimizes the performance of TCP congestion + control. It is based on end-to-end bandwidth estimation to set + congestion window and slow start threshold after a congestion + episode. Using this estimation, TCP Westwood+ adaptively sets a + slow start threshold and a congestion window which takes into + account the bandwidth used at the time congestion is experienced. + TCP Westwood+ significantly increases fairness wrt TCP Reno in + wired networks and throughput over wireless links. + Default: 0 + ip_local_port_range - 2 INTEGERS Defines the local port range that is used by TCP and UDP to choose the local port. The first number is the first, the diff -Nru a/Documentation/scsi/AM53C974.txt b/Documentation/scsi/AM53C974.txt --- a/Documentation/scsi/AM53C974.txt Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,246 +0,0 @@ -SUBJECT -------- -AM53/79C974 PC-SCSI Driver - - -DISCLAIMER ----------- -*** THIS SHOULD BE CONSIDERED AS BETA SOFTWARE *** -*** USE AT YOUR OWN RISK! *** - - -Copyright ---------- -The architecture and much of the code of this device driver was -originally developed by Drew Eckhardt for the NCR5380. The -following copyrights apply: - -For the architecture and all pieces of code which can also be found -in the NCR5380 device driver: -Copyright 1993, Drew Eckhardt - Visionary Computing - (Unix and Linux consulting and custom programming) - drew@colorado.edu - +1 (303) 666-5836 - -The AM53C974_nobios_detect code was originally developed by -Robin Cutshaw (robin@xfree86.org) and is used here in a -slightly modified form. - -For the remaining code: - Copyright 1994, D. Frieauff - EMail: fri@rsx42sun0.dofn.de - Phone: x49-7545-8-2256 , x49-7541-42305 - - -Version -------- -AM53/79C974 (PC-SCSI) Linux driver ALPHA release 0.5, 19 November 1995 - - -Changelog ---------- -0.1 -> 0.2: - - Extended message handling re-written to eliminate 'invalid message 17' bug - - Parameters of AM53C974_intr adapted - - Debug messages structured - - Spelling improved -0.2 -> 0.3: - - README file updated -- please read this file up to the end! - - Automatic scanning of io_port and irq implemented; no need for BIOS32 - anymore - - Improved configuration (now via LILO parameter string) - - Cleanup of probing and initialization code - - Improved sync. negotiation (can be setup individually for every device) - - Improved/ debugged code for reception of ext. messages -0.3 -> 0.4: - - Improved PCI probing and initialization code - - Compatibility changes for Linux 1.3.x -0.4 -> 0.5: - - Compatibility changes for Linux 1.3.42 - - -Bugs & Todo ------------ - - Add proc info function - - Support SCSI-2 tagged queuing - - Finalize abort code - - -Features --------- -This driver supports asynchronous and synchronous SCSI-I and SCSI-II -devices. It is capable of transfer rate and synchronous negotiation -(see below). The driver supports scatter-gather. Transfers are DMA -based, but do not (yet) make use of the AM53/79C974 MDL mode. -Max. transfer rate is 10MHz (whatever this is in real life). The -transfer rate is negotiated with each device (see dmesg output). The -AM53/79C974 has a 96-byte DMA FIFO to the PCI bus and a 16-byte SCSI -FIFO. It provides active negation and glitch suppression functions. -Burst DMA transfer rate is 132 MBytes/sec. - - -Configuration -------------- - -The following communication characteristics can be set individually -for every SCSI device on the bus: - - - enable/disable sync. negotiation - - transfer rate - - asynchronous or synchronous communication - - in case of sync. communication, the sync. offset - -The sync. offset specifies the number of bytes that can be sent or -received from the SCSI bus without ACK resp. REQ signal. -CAUTION: USING SYNCHRONOUS MODE ON LONG SCSI CABLES MAY CAUSE - COMMUNICATION PROBLEMS LEADING TO LOSS OF DATA. - -The default setting of the SCSI communication parameters is as follows: - - no negotiation - - 5.0 MHz transfer rate - - asynchronous mode - - zero offset - -The parameters can be modified by passing a string with the following -syntax to the kernel: - - AM53C974=host-scsi-id,target-scsi-id,max-rate,max-offset - -The parameters will be used by the driver as negotiation basis. The -range of the rate parameter is 3 to 10 MHz. The range of the -sync. offset parameter is 0 to 15 bytes. A value of 0 denotes -asynchronous comm. mode. If the target cannot cope with the specified -transfer rate, sync. mode or sync. offset, the negotiation result -will differ from the specified values. The negotiation result is -printed out at the end of the negotiation process (to read it, use the -dmesg program or the appropriate syslog). The parameter strings -(blank separated) can be passed to the kernel at the LILO prompt, or -as part of the LILO configuration file. - -For example, the string "AM53C974=7,2,8,15" would be interpreted as -follows: - -For communication between the controller with SCSI-ID 7 and the -device with SCSI-ID 2 a transfer rate of 8MHz in synchronous mode with -max. 15 bytes offset should be negotiated. - -As an example, here my LILO configuration file: - boot = /dev/sda - compact - #prompt - delay = 50 # optional, for systems that boot very quickly - vga = normal # force sane state - ramdisk = 0 # paranoia setting - root = current # use "current" root - image = /usr/src/linux/arch/i386/boot/zImage - label = linux - append = "AM53C974=7,0,10,0 AM53C974=7,1,10,0 AM53C974=7,2,10,15 AM53C974=7,4,10,0 AM53C974=7,5,10,0" - read-only - other = /dev/sda4 - label = os2 - other = /dev/sdb3 - loader = /boot/any_d.b - table = /dev/sdb - label = setup - -The same parameters at the LILO prompt: - - LILO boot: linux AM53C974=7,0,10,0 AM53C974=7,1,10,0 AM53C974=7,2,10,15 AM53C974=7,4,10,0 AM53C974=7,5,10,0 - -You can override parameters specified in the LILO configuration file -by parameters specified on the LILO command line. - - -BIOS usage ----------- -Version 0.4 of the driver will use the BIOS, if available. Otherwise -it will try its internal PCI scan and access routines. The driver -assumes that the controller's SCSI-ID (usually 7) has been correctly -loaded by the BIOS into the controller's register during system -boot. If the driver detects that the controller's SCSI ID is not '7' -it will print out a warning. If this happens to you please correct -setting of the controller's SCSI-ID. If it is wrong, then edit the -AM53C974_SCSI_ID definition in file AM53C974.h accordingly. - - -Test environment ----------------- -This driver was tested on a Compaq XL566 with the following SCSI configuration: -2 x HP C2247 fixed disk (internal, rate=10MHz, async.) -1 x Micropolis 1624 fixed disk (external, rate=8MHz, sync., offset=15 bytes) -1 x Wangtek W5525ES cartridge streamer (internal, rate=5MHz, async.) -1 x Toshiba XM-3301B CD-ROM (external, rate=5MHz, async.) - - -Known problems --------------- - - Compaq/Matsushita CD-ROM: - Use of this device with AM53C974 driver version 0.2 caused the kernel to - hang during Linux boot. If you encounter the problem, don't enable sync. - negotiation with the CD-ROM, i.e. simply don't specify comm. parameters - for this device on the LILO command line or configuration file. - The driver will thus use its default for the CD-ROM, which is 5MHz - transfer rate async and no sync. negotiation. - - Some disks cause problems. - - -What to do if there is a SCSI problem possibly related to the driver --------------------------------------------------------------------- - -Read Klaus Liedl's WWW page (http://www-c724.uibk.ac.at/XL/). In case -this does not help: Send me a complete description of the problem, -including your SCSI configuration plus as much debugging information -as possible. Don't wait until I ask you for this information. To -enable the generation of debugging output, remove the comments from -the following definitions in the AM53C974.h file: - - AM53C974_DEBUG - AM53C974_DEBUG_MSG - AM53C974_DEBUG_KEYWAIT - AM53C974_DEBUG_INFO - AM53C974_DEBUG_INTR - -With these definitions enabled, the driver will enter single-step mode -during Linux boot. Use the spacebar for stepping. Take note of at -least the last 10 printout sections (marked by dashes) before the -crash/hangup or whatever happens and send me all of this information -via email. If the system can boot, use the syslogd daemon to record -the debugging output. Maybe you can use the ramdisk for this purpose -too (if necessary, kindly ask K. Liedl (Klaus.Liedl@uibk.ac.at) for -support, he knows how to do it -- I never tried). Stay in email -contact with me. Be aware that the following weeks/months could be the -worst of your life. Note: If single-stepping takes up too much time, -you can try to let the driver catch the problem by pressing the 'r' -key. The driver will automatically enter single-step mode if it has -detected something weird. - - -Author's Contact Address ------------------------ -Email: fri@rsx42sun0.dofn.de -Phone: x49-7545-2256 (office), x49-7541-42305 (home) -Home address: D. Frieauff, Stockerholzstr. 27, 88048 Friedrichshafen, Germany - - -!!!! Important Notice !!!! ------------------------------ -- Klaus Liedl maintains an excellent WWW page about Linux on Compaq XL. - It includes an FAQ, lots of tips & tricks as well as downloadable - boot disk images. The URL is: http://www-c724.uibk.ac.at/XL/ -- Volunteer wanted for further maintenance of this driver software. I - don't have the time anymore to do serious support as some of you will know. - - -Literature ----------- - - AMD AM53C974 PC-SCSI Technical Manual, publication #18624B - - Amendment to the AMD AM53C974 PC-SCSI Technical Manual - - AMD AM79C974 PC-NET Datasheet, publication #18681 - - Amendment to the AMD AM79C974 PC-NET Datasheet - - -THANKS to ---------- - - Drew Eckhardt, Robin Cutshaw, K. Liedl, Robert J. Pappas, A. Grenier, - Mark Stockton, David C. Niemi, Ben Craft, and many others who have helped diff -Nru a/Documentation/scsi/BusLogic.txt b/Documentation/scsi/BusLogic.txt --- a/Documentation/scsi/BusLogic.txt Tue Feb 17 20:00:06 2004 +++ b/Documentation/scsi/BusLogic.txt Tue Feb 17 20:00:06 2004 @@ -40,10 +40,9 @@ to achieve the full performance that BusLogic SCSI Host Adapters and modern SCSI peripherals are capable of, and to provide a highly robust driver that can be depended upon for high performance mission critical applications. All of -the major performance and error recovery features can be configured from the -Linux kernel command line or at module initialization time, allowing individual -installations to tune driver performance and error recovery to their particular -needs. +the major performance features can be configured from the Linux kernel command +line or at module initialization time, allowing individual installations to +tune driver performance and error recovery to their particular needs. The latest information on Linux support for BusLogic SCSI Host Adapters, as well as the most recent release of this driver and the latest firmware for the @@ -95,10 +94,10 @@ adapter hardware configuration, including the synchronous transfer parameters requested and negotiated with each target device. AutoSCSI settings for Synchronous Negotiation, Wide Negotiation, and Disconnect/Reconnect are - reported for each target device, as well as the status of Tagged Queuing and - Error Recovery. If the same setting is in effect for all target devices, - then a single word or phrase is used; otherwise, a letter is provided for - each target device to indicate the individual status. The following examples + reported for each target device, as well as the status of Tagged Queuing. + If the same setting is in effect for all target devices, then a single word + or phrase is used; otherwise, a letter is provided for each target device to + indicate the individual status. The following examples should clarify this reporting format: Synchronous Negotiation: Ultra @@ -131,9 +130,6 @@ The status of Wide Negotiation, Disconnect/Reconnect, and Tagged Queuing are reported as "Enabled", Disabled", or a sequence of "Y" and "N" letters. - The Error Recovery option is reported as "Default", "Hard Reset", - "Bus Device Reset", "None" or a sequence of "D", "H", "B", and "N" letters. - o Performance Features BusLogic SCSI Host Adapters directly implement SCSI-2 Tagged Queuing, and so @@ -476,48 +472,6 @@ Target Device 1, and so on; if the sequence of "Y", "N", and "X" characters does not cover all the Target Devices, unspecified characters are assumed to be "X". - -The BusLogic Driver Error Recovery Option allows for explicitly specifying -the Error Recovery action to be performed when BusLogic_ResetCommand is -called due to a SCSI Command failing to complete successfully. The following -options are available: - -ErrorRecovery:Default - - The "ErrorRecovery:Default" or "ER:Default" option selects between the Hard - Reset and Bus Device Reset options based on the recommendation of the SCSI - Subsystem. - -ErrorRecovery:HardReset - - The "ErrorRecovery:HardReset" or "ER:HardReset" option will initiate a Host - Adapter Hard Reset which also causes a SCSI Bus Reset. - -ErrorRecovery:BusDeviceReset - - The "ErrorRecovery:BusDeviceReset" or "ER:BusDeviceReset" option will send - a Bus Device Reset message to the individual Target Device causing the - error. If Error Recovery is again initiated for this Target Device and no - SCSI Command to this Target Device has completed successfully since the Bus - Device Reset message was sent, then a Hard Reset will be attempted. - -ErrorRecovery:None - - The "ErrorRecovery:None" or "ER:None" option suppresses Error Recovery. - This option should only be selected if a SCSI Bus Reset or Bus Device Reset - will cause the Target Device or a critical operation to suffer a complete - and unrecoverable failure. - -ErrorRecovery: - - The "ErrorRecovery:" or "ER:" option controls - Error Recovery individually for each Target Device. is a - sequence of "D", "H", "B", and "N" characters. "D" selects Default, "H" - selects Hard Reset, "B" selects Bus Device Reset, and "N" selects None. - The first character refers to Target Device 0, the second to Target Device - 1, and so on; if the sequence of "D", "H", "B", and "N" characters does not - cover all the possible Target Devices, unspecified characters are assumed - to be "D". The BusLogic Driver Miscellaneous Options comprise the following: diff -Nru a/Documentation/scsi/scsi_mid_low_api.txt b/Documentation/scsi/scsi_mid_low_api.txt --- a/Documentation/scsi/scsi_mid_low_api.txt Tue Feb 17 20:00:07 2004 +++ b/Documentation/scsi/scsi_mid_low_api.txt Tue Feb 17 20:00:07 2004 @@ -1091,14 +1091,44 @@ * @scp: pointer to scsi command object * @done: function pointer to be invoked on completion * - * Returns 0 on success and 1 if the LLD or the HBA is busy (i.e. run - * out of resources to queue further commands). Other types of errors - * that are detected immediately are flagged by setting scp->result - * to an appropriate value, invoking the 'done' callback, and then - * returning 0 from this function. If the command is not performed - * immediately (and the LLD is starting (or will start) the given - * command) then this function should place 0 in scp->result and - * return 0. + * Returns 0 on success. + * + * If there's a failure, return either: + * + * SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or + * SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full + * + * On both of these returns, the mid-layer will requeue the I/O + * + * - if the return is SCSI_MLQUEUE_DEVICE_BUSY, only that particular + * device will be paused, and it will be unpaused when a command to + * the device returns (or after a brief delay if there are no more + * outstanding commands to it). Commands to other devices continue + * to be processed normally. + * + * - if the return is SCSI_MLQUEUE_HOST_BUSY, all I/O to the host + * is paused and will be unpaused when any command returns from + * the host (or after a brief delay if there are no outstanding + * commands to the host). + * + * For compatibility with earlier versions of queuecommand, any + * other return value is treated the same as + * SCSI_MLQUEUE_HOST_BUSY. + * + * Other types of errors that are detected immediately may be + * flagged by setting scp->result to an appropriate value, + * invoking the 'done' callback, and then returning 0 from this + * function. If the command is not performed immediately (and the + * LLD is starting (or will start) the given command) then this + * function should place 0 in scp->result and return 0. + * + * Command ownership. If the driver returns zero, it owns the + * command and must take responsibility for ensuring the 'done' + * callback is executed. Note: the driver may call done before + * returning zero, but after it has called done, it may not + * return any value other than zero. If the driver makes a + * non-zero return, it must not execute the command's done + * callback at any time. * * Locks: struct Scsi_Host::host_lock held on entry (with "irqsave") * and is expected to be held on return. diff -Nru a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt --- a/Documentation/sound/alsa/ALSA-Configuration.txt Tue Feb 17 20:00:05 2004 +++ b/Documentation/sound/alsa/ALSA-Configuration.txt Tue Feb 17 20:00:05 2004 @@ -55,9 +55,10 @@ major - major # for sound driver - default is 116 cards_limit - - specifies card limit # (1-8) - - good for kmod support if you do not want to search - for soundcards which are not installed in your system + - specifies card limit # for auto-loading (1-8) + - default is 1 + - for auto-loading more than 1 card, specify this option + together with snd-card-X aliases. device_mode - specifies permission mask for dynamic sound device filesystem (available only when DEVFS is enabled) @@ -173,8 +174,7 @@ Module for soundcards based on Avance Logic ALS4000 PCI chip. joystick_port - port # for legacy joystick support. - default: 0x200 for the 1st card. - 0 = disabled + 0 = disabled (default), 1 = auto-detect Module supports up to 8 cards, autoprobe and PnP. @@ -199,6 +199,17 @@ Module for soundcards based on Aztech AZF3328 PCI chip. + joystick - Enable joystick (default off) + + Module supports up to 8 cards. + + Module snd-bt87x + ---------------- + + Module for video cards based on Bt87x chips. + + digital_rate - Override the default digital rate (Hz) + Module supports up to 8 cards. Module snd-cmi8330 @@ -221,10 +232,11 @@ Module for C-Media CMI8338 and 8738 PCI soundcards. - mpu_port - 0x300 (default),0x310,0x320,0x330, -1 (diable) - fm_port - 0x388 (default), -1 (disable) + mpu_port - 0x300,0x310,0x320,0x330, 0 = disable (default) + fm_port - 0x388 (default), 0 = disable (default) soft_ac3 - Sofware-conversion of raw SPDIF packets (model 033 only) (default = 1) + joystick_port - Joystick port address (0 = disable, 1 = auto-detect) Module supports autoprobe and multiple chips (max 8). @@ -377,6 +389,8 @@ * SoundBlaster PCI 64 * SoundBlaster PCI 128 + joystick - Enable joystick (default off) + Module supports up to 8 cards and autoprobe. Module snd-ens1371 @@ -387,6 +401,9 @@ * SoundBlaster PCI 128 * SoundBlaster Vibra PCI + joystick_port - port # for joystick (0x200,0x208,0x210,0x218), + 0 = disable (default), 1 = auto-detect + Module supports up to 8 cards and autoprobe. Module snd-es968 @@ -451,6 +468,7 @@ use_pm - support the power-management (0 = off, 1 = on, 2 = auto (default)) enable_mpu - enable MPU401 (0 = off, 1 = on, 2 = auto (default)) + joystick - enable joystick (default off) Module supports up to 8 cards and autoprobe. @@ -527,7 +545,7 @@ Module supports up to 8 cards. Note: you need to load the firmware via hdsploader utility included - in alsa-tools package. + in alsa-tools and alsa-firmware packages. Note: snd-page-alloc module does the job which snd-hammerfall-mem module did formerly. It will allocate the buffers in advance @@ -553,6 +571,7 @@ * Hoontech SoundTrack DSP 24 * Hoontech SoundTrack DSP 24 Value * Hoontech SoundTrack DSP 24 Media 7.1 + * Digigram VX442 omni - Omni I/O support for MidiMan M-Audio Delta44/66 @@ -581,10 +600,17 @@ * ALi m5455 ac97_clock - AC'97 codec clock base (0 = auto-detect) - joystick_port - Joystick port # (0 = disabled, 0x200) + joystick - Enable joystick (default off) mpu_port - MPU401 port # (0 = disabled, 0x330,0x300) + ac97_quirk - AC'97 workaround for strange hardware (-1 = default) + -1 = default, don't override + 0 = disable + 1 = use headphone control as master + 2 = swap headphone and master controls + 3 = for AD1985, turn on OMS bit and use headphone Module supports autoprobe and multiple bus-master chips (max 8). + Note: the latest driver supports auto-detection of chip clock. if you still encounter too fast playback, specify the clock explicitly via the module option "ac97_clock=41194". @@ -592,6 +618,13 @@ The joystick and MPU-401 are supported only certain hardwares. MPU401 is experimental, It doesn't work perfectly. + The ac97_quirk option is used to enable/override the workaround + for specific devices. Some hardware have swapped output pins + between Master and Headphone, or Surround. The driver provides + the auto-detection of known problematic devices, but some might + be unknown or wrongly detected. In such a case, pass the proper + value with this option. + The power-management is supported. Module snd-interwave @@ -650,6 +683,7 @@ others) Module supports autoprobe and multiple chips (max 8). + Note: the binding of amplifier is dependent on hardware. If there is no sound even though all channels are unmuted, try to specify other gpio connection via amp_gpio option. @@ -693,6 +727,7 @@ vaio_hack - alias buffer_top=0x25a800 Module supports autoprobe and multiple chips (max 8). + Note: on some notebooks the buffer address cannot be detected automatically, or causes hang-up during initialization. In such a case, specify the buffer top address explicity via @@ -779,6 +814,7 @@ enable_beep - enable beep using PCM (enabled as default) Module supports autoprobe a chip. + Note: the driver may have problems regarding endianess. The power-management is supported. @@ -991,11 +1027,14 @@ mpu_port - 0x300,0x310,0x320,0x330, otherwise obtain BIOS setup [VIA686A/686B only] + joystick - Enable joystick (default off) [VIA686A/686B only] ac97_clock - AC'97 codec clock base (default 48000Hz) dxs_support - support DXS channels, 0 = auto (defalut), 1 = enable, 2 = disable, - 3 = 48k only + 3 = 48k only, 4 = no VRA [VIA8233/C,8235 only] + ac97_quirk - AC'97 workaround for strange hardware + See the description of intel8x0 module for details. Module supports autoprobe and multiple bus-master chips (max 8). @@ -1008,13 +1047,20 @@ Note: VIA8233/5 (not VIA8233A) can support DXS (direct sound) channels as the first PCM. On these channels, up to 4 streams can be played at the same time. - As default (dxs_support = 0), 48k fixed rate is chosen since - the output is often noisy except for 48k on some mother - boards due to the bug of BIOS. + As default (dxs_support = 0), 48k fixed rate is chosen + except for the known devices since the output is often + noisy except for 48k on some mother boards due to the + bug of BIOS. Please try once dxs_support=1 and if it works on other - sample rates, please let us know the PCI subsystem - vendor/device id's (output of "lspci -nv"). - If it doesn't work, use dxs_support=3 or dxs_support=2. + sample rates (e.g. 44.1kHz of mp3 playback), please let us + know the PCI subsystem vendor/device id's (output of + "lspci -nv"). + If it doesn't work, try dxs_support=4. If it still doesn't + work and the default setting is ok, dxs_support=3 is the + right choice. If the default setting doesn't work at all, + try dxs_support=2 to disable the DXS channels. + In any cases, please let us know the result and the + subsystem vendor/device ids. Note: for the MPU401 on VIA823x, use snd-mpu401 driver additonally. The mpu_port option is for VIA686 chips only. @@ -1041,11 +1087,13 @@ Module supports up to 8 cards. For loading the firmware, use vxloader utility in alsa-tools - package. You can load the firmware automatically by adding - the following to /etc/modules.conf + and alsa-firmware packages. You can load the firmware automatically + by adding the following to /etc/modprobe.conf - post-install snd-vx222 "/usr/bin/vxload" + install snd-vx222 /sbin/modprobe --first-time -i snd-vx222 && /usr/bin/vxloader + (for 2.2/2.4 kernels, add "post-install /usr/bin/vxloader" to + /etc/modules.conf, instead.) IBL size defines the interrupts period for PCM. The smaller size gives smaller latency but leads to more CPU consumption, too. The size is usually aligned to 126. As default (=0), the smallest @@ -1060,6 +1108,7 @@ irq_mask - IRQ bitmask, specifies the available IRQs as bits (default = 0xffff, all available) irq_list - List of available interrupts (default = -1, not specified) + 4 numbers must be given (if specified). ibl - Capture IBL size. (default = 0, minimum size) Module supports up to 8 cards. The module is compiled only when @@ -1069,13 +1118,15 @@ up /etc/pcmcia/vxpocket.conf. See the sound/pcmcia/vx/vxpocket.c. For loading the firmware, use vxloader utility in alsa-tools - package. + and alsa-firmware packages. The irq_mask and irq_list are provided to avoid allocation of specific IRQs. Usually you don't need to specify them. About capture IBL, see the description of snd-vx222 module. + Note: the driver is build only when CONFIG_ISA is set. + Module snd-vxp440 ----------------- @@ -1083,6 +1134,7 @@ irq_mask - IRQ bitmask, specifies the available IRQs as bits irq_list - List of available interrupts (default = -1, not specified) + 4 numbers must be given (if specified). ibl - Capture IBL size. (default = 0, minimum size) Module supports up to 8 cards. The module is compiled only when @@ -1092,24 +1144,30 @@ up /etc/pcmcia/vxp440.conf. See the sound/pcmcia/vx/vxp440.c. For loading the firmware, use vxloader utility in alsa-tools - package. + and alsa-firmware packages. The irq_mask and irq_list are provided to avoid allocation of specific IRQs. Usually you don't need to specify them. About capture IBL, see the description of snd-vx222 module. + Note: the driver is build only when CONFIG_ISA is set. + Module snd-ymfpci ----------------- Module for Yamaha PCI chips (YMF72x, YMF74x & YMF75x). - mpu_port - 0x300,0x330,0x332,0x334, -1 (disable) by default - fm_port - 0x388,0x398,0x3a0,0x3a8, -1 (disable) by default - rear_switch - enable shared rear/line-in switch (bool) + mpu_port - 0x300,0x330,0x332,0x334, 0 (disable) by default, + 1 (auto-detect for YMF744/754 only) + fm_port - 0x388,0x398,0x3a0,0x3a8, 0 (disable) by default + 1 (auto-detect for YMF744/754 only) + joystick_port - 0x201,0x202,0x204,0x205, 0 (disable) by default, + 1 (auto-detect) + rear_switch - enable shared rear/line-in switch (bool) Module supports autoprobe and multiple chips (max 8). - + The power-management is supported. @@ -1126,160 +1184,49 @@ will be not built in. -modprobe/kmod support -===================== - -The modprobe program must know which modules are used for the -device major numbers. -Native ALSA devices have got default number 116. Thus a line like -'alias char-major-116 snd' must be added to /etc/modules.conf. If you have -compiled the ALSA driver with the OSS/Free emulation code, then you -will need to add lines as explained below: - -The ALSA driver uses soundcore multiplexer for 2.2+ kernels and OSS compatible -devices. You should add line like 'alias char-major-14 soundcore'. - -Example with OSS/Free emulation turned on: - ------ /etc/modules.conf - -# ALSA portion -alias char-major-116 snd -# OSS/Free portion -alias char-major-14 soundcore - ------ /etc/modules.conf +Module Autoloading Support +========================== -After the main multiplexer is loaded, its code requests top-level soundcard -module. String 'snd-card-%i' is requested for native devices where %i is -soundcard number from zero to seven. String 'sound-slot-%i' is requested -for native devices where %i is slot number (for ALSA owner this means soundcard -number). +The ALSA drivers can be loaded automatically on demand by defining +module aliases. The string 'snd-card-%1' is requested for ALSA native +devices where %i is soundcard number from zero to seven. + +To auto-load an ALSA driver for OSS services, define the string +'sound-slot-%i' where %i means the slot number for OSS, which +corresponds to the card index of ALSA. Usually, define this +as the the same card module. + +An example configuration for a single emu10k1 card is like below: +----- /etc/modprobe.conf +alias snd-card-0 snd-emu10k1 +alias sound-slot-0 snd-emu10k1 +----- /etc/modprobe.conf + +The available number of auto-loaded soundcards depends on the module +option "cards_limit" of snd module. As default it's set to 1. +To enable the auto-loading of multiple cards, specify the number of +soundcards in that option. + +When multiple cards are available, it'd better to specify the index +number for each card via module option, too, so that the order of +cards is kept consistent. ------ /etc/modules.conf +An example configuration for two soundcards is like below: +----- /etc/modprobe.conf # ALSA portion +options snd cards_limit=2 alias snd-card-0 snd-interwave alias snd-card-1 snd-ens1371 +options snd-interwave index=0 +options snd-ens1371 index=1 # OSS/Free portion -alias sound-slot-0 snd-card-0 -alias sound-slot-1 snd-card-1 - ------ /etc/modules.conf - -We are finished at this point with the configuration for ALSA native devices, -but you may also need autoloading for ALSA's add-on OSS/Free emulation -modules. At this time only one module does not depend on any others, thus -must be loaded separately - snd-pcm-oss. String 'sound-service-%i-%i' -is requested for OSS/Free service where first %i means slot number -(e.g. card number) and second %i means service number. - ------ /etc/modules.conf - -# OSS/Free portion - card #1 -alias sound-service-0-0 snd-mixer-oss -alias sound-service-0-1 snd-seq-oss -alias sound-service-0-3 snd-pcm-oss -alias sound-service-0-8 snd-seq-oss -alias sound-service-0-12 snd-pcm-oss -# OSS/Free portion - card #2 -alias sound-service-1-0 snd-mixer-oss -alias sound-service-1-3 snd-pcm-oss -alias sound-service-1-12 snd-pcm-oss - ------ /etc/modules.conf - -A complete example for Gravis UltraSound PnP soundcard: - ------ /etc/modules.conf - -# ISA PnP support (don't use IRQs 9,10,11,12,13) -options isapnp isapnp_reserve_irq=9,10,11,12,13 - -# ALSA native device support -alias char-major-116 snd -options snd major=116 cards_limit=1 -alias snd-card-0 snd-interwave -options snd-interwave index=0 id="GusPnP" - -# OSS/Free setup -alias char-major-14 soundcore -alias sound-slot-0 snd-card-0 -alias sound-service-0-0 snd-mixer-oss -alias sound-service-0-1 snd-seq-oss -alias sound-service-0-3 snd-pcm-oss -alias sound-service-0-8 snd-seq-oss -alias sound-service-0-12 snd-pcm-oss - ------ - -A complete example if you want to use more soundcards in one machine -(the configuration below is for Sound Blaster 16 and Gravis UltraSound Classic): - ------ /etc/modules.conf - -# ISA PnP support (don't use IRQs 9,10,11,12,13) -# it's only an example to reserve some IRQs for another hardware -options isapnp isapnp_reserve_irq=9,10,11,12,13 - -# ALSA native device support -alias char-major-116 snd -options snd major=116 cards_limit=2 -alias snd-card-0 snd-gusclassic -alias snd-card-1 snd-sb16 -options snd-gusclassic index=0 id="Gus" \ - port=0x220 irq=5 dma1=6 dma2=7 -options snd-sb16 index=1 id="SB16" - -# OSS/Free setup -alias char-major-14 soundcore -alias sound-slot-0 snd-card-0 -alias sound-service-0-0 snd-mixer-oss -alias sound-service-0-1 snd-seq-oss -alias sound-service-0-3 snd-pcm-oss -alias sound-service-0-8 snd-seq-oss -alias sound-service-0-12 snd-pcm-oss -alias sound-slot-1 snd-card-1 -alias sound-service-1-0 snd-mixer-oss -alias sound-service-1-3 snd-pcm-oss -alias sound-service-1-12 snd-pcm-oss - ------ - -A complete example, two Gravis UltraSound Classic soundcards are installed -in the system: - ------ /etc/modules.conf - -# ALSA native device support -alias char-major-116 snd -options snd major=116 cards_limit=2 -alias snd-card-0 snd-gusclassic -alias snd-card-1 snd-gusclassic -options snd-gusclassic index=0,1 id="Gus1","Gus2" \ - port=0x220,0x240 irq=5,7 dma1=1,5 dma2=3,6 - -# OSS/Free setup -alias char-major-14 soundcore -alias sound-slot-0 snd-card-0 -alias sound-service-0-0 snd-mixer-oss -alias sound-service-0-1 snd-seq-oss -alias sound-service-0-3 snd-pcm-oss -alias sound-service-0-8 snd-seq-oss -alias sound-service-0-12 snd-pcm-oss -alias sound-slot-1 snd-card-1 -alias sound-service-1-0 snd-mixer-oss -alias sound-service-1-3 snd-pcm-oss -alias sound-service-1-12 snd-pcm-oss - ------ - -If you want to autoclean your modules, you should put below line to your -/etc/crontab: - -*/10 * * * * root /sbin/modprobe -rs snd-card-0 snd-card-1; /sbin/rmmod -as +alias sound-slot-0 snd-interwave +alias sound-slot-1 snd-ens1371 +----- /etc/moprobe.conf -You may also want to extend the soundcard list to follow your requirements. +In this example, the interwave card is always loaded as the first card +(index 0) and ens1371 as the second (index 1). ALSA PCM devices to OSS devices mapping diff -Nru a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl --- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl Tue Feb 17 20:00:06 2004 +++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl Tue Feb 17 20:00:06 2004 @@ -341,10 +341,6 @@ drivers will be on pci directory, because its API is identical with the standard PCI cards. - - - At this moment, only VX-pocket driver exists. -
@@ -500,14 +496,14 @@ } // (4) - // implemented later - - // (5) strcpy(card->driver, "My Chip"); strcpy(card->shortname, "My Own Chip 123"); sprintf(card->longname, "%s at 0x%lx irq %i", card->shortname, chip->ioport, chip->irq); + // (5) + // implemented later + // (6) if ((err = snd_card_register(card)) < 0) { snd_card_free(card); @@ -626,21 +622,8 @@
-
- 4) Create other components, such as mixer, MIDI, etc. - - Here you define the basic components such as - PCM, - mixer (e.g. AC97), - MIDI (e.g. MPU-401), - and other interfaces. - Also, if you want a proc - file, define it here, too. - -
-
- 5) Set the driver ID and name strings. + 4) Set the driver ID and name strings. @@ -667,6 +650,19 @@
+
+ 5) Create other components, such as mixer, MIDI, etc. + + Here you define the basic components such as + PCM, + mixer (e.g. AC97), + MIDI (e.g. MPU-401), + and other interfaces. + Also, if you want a proc + file, define it here, too. + +
+
6) Register the card instance. @@ -1295,11 +1291,11 @@ // check PCI availability (28bit DMA) if ((err = pci_enable_device(pci)) < 0) return err; - if (!pci_dma_supported(pci, 0x0fffffff)) { + if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || + pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { printk(KERN_ERR "error to set 28bit mask DMA\n"); return -ENXIO; } - pci_set_dma_mask(pci, 0x0fffffff); chip = snd_magic_kcalloc(mychip_t, 0, GFP_KERNEL); if (chip == NULL) @@ -1413,11 +1409,12 @@ @@ -1914,8 +1911,27 @@ .periods_max = 1024, }; + /* hardware definition */ + static snd_pcm_hardware_t snd_mychip_capture_hw = { + .info = (SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP_VALID), + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .rates = SNDRV_PCM_RATE_8000_48000, + .rate_min = 8000, + .rate_max = 48000, + .channels_min = 2, + .channels_max = 2, + .buffer_bytes_max = 32768, + .period_bytes_min = 4096, + .period_bytes_max = 32768, + .periods_min = 1, + .periods_max = 1024, + }; + /* open callback */ - static int snd_mychip_pcm_open(snd_pcm_substream_t *substream) + static int snd_mychip_playback_open(snd_pcm_substream_t *substream) { mychip_t *chip = snd_pcm_substream_chip(substream); snd_pcm_runtime_t *runtime = substream->runtime; @@ -1926,7 +1942,27 @@ } /* close callback */ - static int snd_mychip_pcm_close(snd_pcm_substream_t *substream) + static int snd_mychip_playback_close(snd_pcm_substream_t *substream) + { + mychip_t *chip = snd_pcm_substream_chip(substream); + // the hardware-specific codes will be here + return 0; + + } + + /* open callback */ + static int snd_mychip_capture_open(snd_pcm_substream_t *substream) + { + mychip_t *chip = snd_pcm_substream_chip(substream); + snd_pcm_runtime_t *runtime = substream->runtime; + + runtime->hw = snd_mychip_capture_hw; + // more hardware-initialization will be done here + return 0; + } + + /* close callback */ + static int snd_mychip_capture_close(snd_pcm_substream_t *substream) { mychip_t *chip = snd_pcm_substream_chip(substream); // the hardware-specific codes will be here @@ -2005,6 +2041,18 @@ .pointer = snd_mychip_pcm_pointer, }; + /* operators */ + static snd_pcm_ops_t snd_mychip_capture_ops = { + .open = snd_mychip_capture_open, + .close = snd_mychip_capture_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = snd_mychip_pcm_hw_params, + .hw_free = snd_mychip_pcm_hw_free, + .prepare = snd_mychip_pcm_prepare, + .trigger = snd_mychip_pcm_trigger, + .pointer = snd_mychip_pcm_pointer, + }; + /* * definitions of capture are omitted here... */ @@ -3982,13 +4030,18 @@ static int snd_mychip_ac97(mychip_t *chip) { + ac97_bus_t bus, *pbus; ac97_t ac97; + int err; + memset(&bus, 0, sizeof(bus)); + bus.write = snd_mychip_ac97_write; + bus.read = snd_mychip_ac97_read; + if ((err = snd_ac97_bus(chip->card, &bus, &pbus)) < 0) + return err; memset(&ac97, 0, sizeof(ac97)); - ac97.write = snd_mychip_ac97_write; - ac97.read = snd_mychip_ac97_read; ac97.private_data = chip; - return snd_ac97_mixer(card, &ac97, &chip->ac97); + return snd_ac97_mixer(pbus, &ac97, &chip->ac97); } ]]> @@ -4000,9 +4053,29 @@
Constructor - For creating an ac97 instance, call - snd_ac97_mixer() with an ac97_t - record, in which the callbacks and the private_data is set. + For creating an ac97 instance, first call snd_ac97_bus + with ac97_bus_t record including callback functions. + + + + + + + + The bus record is shared among all belonging ac97 instances. + + + + And then call snd_ac97_mixer() with an ac97_t + record together with the bus pointer created above. @@ -4011,16 +4084,16 @@ int err; memset(&ac97, 0, sizeof(ac97)); - ac97.write = snd_mychip_ac97_write; - ac97.read = snd_mychip_ac97_read; ac97.private_data = chip; - snd_ac97_mixer(card, &ac97, &chip->ac97); + snd_ac97_mixer(bus, &ac97, &chip->ac97); ]]> where chip->ac97 is the pointer of a newly created ac97_t instance. + In this case, the chip pointer is set as the private data, so that + the read/write callback functions can refer to this chip instance. This instance is not necessarily stored in the chip record. When you need to change the register values from the driver, or need the suspend/resume of ac97 codecs, keep this @@ -4094,14 +4167,11 @@ The wait callback is used for a certain wait at the standard initialization of the codec. If the chip requires the extra wait-time, define this callback. - This callback is always non-atomic, because it's never called - in the resume mode. The init callback is used for - additional initialization of the codec. This callback is called - after the reset, and should be atomic in the resume mode. + additional initialization of the codec.
@@ -4674,10 +4744,7 @@ - Note that you have to pre-allocate to use this function - (i.e. you cannot use this function for - - a scatter-gather buffer). + Note that you have to pre-allocate to use this function.
@@ -4905,6 +4972,8 @@ When a SG-handler is used, you need to set snd_pcm_sgbuf_ops_page as the page callback. + (See + page callback section.) @@ -4999,13 +5068,14 @@ where the second argument (chip) is the - private data to be used in the callbacks and the third + private data to be used in the callbacks. The third parameter + specifies the read buffer size and the fourth (my_proc_read) is the callback function, which is defined like diff -Nru a/Documentation/sound/alsa/Joystick.txt b/Documentation/sound/alsa/Joystick.txt --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/Documentation/sound/alsa/Joystick.txt Tue Feb 17 20:00:14 2004 @@ -0,0 +1,87 @@ +Analog Joystick Support on ALSA Drivers +======================================= + Oct. 14, 2003 + Takashi Iwai + +General +------- + +First of all, you need to enable GAMEPORT support on Linux kernel for +using a joystick with the ALSA driver. For the details of gameport +support, refer to Documentation/input/joystick.txt. + +The joystick support of ALSA drivers is different between ISA and PCI +cards. In the case of ISA (PnP) cards, it's usually handled by the +independent module (ns558). Meanwhile, the ALSA PCI drivers have the +built-in gameport support. Hence, when the ALSA PCI driver is built +in the kernel, CONFIG_GAMEPORT must be 'y', too. Otherwise, the +gameport support on that card will be (silently) disabled. + +Some adapter modules probe the physical connection of the device at +the load time. It'd be safer to plug in the joystick device before +loading the module. + + +PCI Cards +--------- + +For PCI cards, the joystick is enabled when the appropriate module +option is specified. Some drivers don't need options, and the +joystick support is always enabled. In the former ALSA version, there +was a dynamic control API for the joystick activation. It was +changed, however, to the static module options because of the system +stability and the resource management. + +The following PCI drivers support the joystick natively. + + Driver Module Option Available Values + --------------------------------------------------------------------------- + als4000 joystick_port 0 = disable (default), 1 = auto-detect, + manual: any address (e.g. 0x200) + au88x0 N/A N/A + azf3328 joystick 0 = disable, 1 = enable, -1 = auto (default) + ens1370 joystick 0 = disable (default), 1 = enable + ens1371 joystick_port 0 = disable (default), 1 = auto-detect, + manual: 0x200, 0x208, 0x210, 0x218 + cmipci joystick 0 = disable (default), 1 = enable + cs4281 N/A N/A + cs46xx N/A N/A + es1938 N/A N/A + es1968 joystick 0 = disable (default), 1 = enable + intel8x0(*1)joystick 0 = disable (default), 1 = enable + sonicvibes N/A N/A + trident N/A N/A + via82xx(*2) joystick 0 = disable (default), 1 = enable + ymfpci joystick_port 0 = disable (default), 1 = auto-detect, + manual: 0x201, 0x202, 0x204, 0x205(*3) + --------------------------------------------------------------------------- + + *1) not all chips support joystick + *2) VIA686A/B only + *3) With YMF744/754 chips, the port address can be chosen arbitrarily + +The following drivers don't support gameport natively, but there are +additional modules. Load the corresponding module to add the gameport +support. + + Driver Additional Module + ----------------------------- + emu10k1 emu10k1-gp + fm801 fm801-gp + ----------------------------- + +Note: the "pcigame" and "cs461x" modules are for the OSS drivers only. + These ALSA drivers (cs46xx, trident and au88x0) have the + built-in gameport support. + +As mentioned above, ALSA PCI drivers have the built-in gameport +support, so you don't have to load ns558 module. Just load "joydev" +and the appropriate adapter module (e.g. "analog"). + + +ISA Cards +--------- + +ALSA ISA drivers don't have the built-in gameport support. +Instead, you need to load "ns558" module in addition to "joydev" and +the adapter module (e.g. "analog"). diff -Nru a/Documentation/sound/alsa/OSS-Emulation.txt b/Documentation/sound/alsa/OSS-Emulation.txt --- a/Documentation/sound/alsa/OSS-Emulation.txt Tue Feb 17 20:00:07 2004 +++ b/Documentation/sound/alsa/OSS-Emulation.txt Tue Feb 17 20:00:07 2004 @@ -1,7 +1,7 @@ NOTES ON KERNEL OSS-EMULATION ============================= - Jan. 9, 2003 Takashi Iwai + Jan. 22, 2004 Takashi Iwai Modules @@ -13,32 +13,20 @@ When you need to access the OSS PCM, mixer or sequencer devices, the corresponding module has to be loaded. -For loading these modules automatically, define the aliases in -/etc/modules.conf like below: - - alias sound-service-0-0 snd-mixer-oss - alias sound-service-0-1 snd-seq-oss - alias sound-service-0-3 snd-pcm-oss - alias sound-service-0-8 snd-seq-oss - alias sound-service-0-12 snd-pcm-oss - -Then the access to an OSS device file such as /dev/dsp0 triggers to -load the necessary module via KMOD. - -For auto-loading the secondary card device like /dev/dsp1, the -following aliases are necessary in addition: - - alias sound-service-1-0 snd-mixer-oss - alias sound-service-1-3 snd-pcm-oss - alias sound-service-1-12 snd-pcm-oss - -Here you don't need to define service-1-1 and service-1-8 because -there is only one sequencer device. -Similarly, you can add definitions for the third or later cards as -sound-service-X-Y. - -The OSS-MIDI is emulated directly in the ALSA rawmidi module, -therefore no extra module exists for that purpose. +These modules are loaded automatically when the corresponding service +is called. The alias is defined sound-service-x-y, where x and y are +the card number and the minor unit number. Usually you don't have to +define these aliases by yourself. + +Only necessary step for auto-loading of OSS modules is to define the +card alias in /etc/modprobe.conf, such as + + alias sound-slot-0 snd-emu10k1 + +As the second card, define sound-slot-1 as well. +Note that you can't use the aliased name as the target name (i.e. +"alias sound-slot-0 snd-card-0" doesn't work any more like the old +modutils). The currently available OSS configuration is shown in /proc/asound/oss/sndstat. This shows in the same syntax of @@ -152,8 +140,7 @@ direct don't use plugins block force block open mode non-block force non-block open mode - whole-frag write only whole fragments (optimization affecting - playback only) + partial-frag write also partial fragments (affects playback only) no-silence do not fill silence ahead to avoid clicks The disable option is useful when one stream direction (playback or @@ -188,7 +175,7 @@ options snd-pcm-oss nonblock_open=1 -The whole-frag and no-silence commands have been added recently. +The partial-frag and no-silence commands have been added recently. Both commands are for optimization use only. The former command specifies to invoke the write transfer only when the whole fragment is filled. The latter stops writing the silence data ahead diff -Nru a/Documentation/sound/alsa/SB-Live-mixer.txt b/Documentation/sound/alsa/SB-Live-mixer.txt --- a/Documentation/sound/alsa/SB-Live-mixer.txt Tue Feb 17 20:00:05 2004 +++ b/Documentation/sound/alsa/SB-Live-mixer.txt Tue Feb 17 20:00:05 2004 @@ -101,15 +101,15 @@ The result is forwarded to the ADC capture FIFO (thus to the standard capture PCM device). -name='Surround Digital Playback Volume',index=0 +name='Surround Playback Volume',index=0 This control is used to attenuate samples for left and right rear PCM FX-bus accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples. The result samples are forwarded to the rear I2S DACs. These DACs operate separately (they are not inside the AC97 codec). -name='Surround Digital Capture Volume',index=0 -name='Surround Digital Capture Switch',index=0 +name='Surround Capture Volume',index=0 +name='Surround Capture Switch',index=0 These controls are used to attenuate samples for left and right rear PCM FX-bus accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples. @@ -172,13 +172,13 @@ digital inputs (usually used by a CDROM drive). The result samples are forwarded to the ADC capture FIFO (thus to the standard capture PCM device). -name='IEC958 Optical Playback Volume',index=0 +name='IEC958 LiveDrive Playback Volume',index=0 This control is used to attenuate samples from left and right IEC958 optical digital input. The result samples are forwarded to the front DAC PCM slots of the AC97 codec. -name='IEC958 Optical Capture Volume',index=0 +name='IEC958 LiveDrive Capture Volume',index=0 This control is used to attenuate samples from left and right IEC958 optical digital inputs. The result samples are forwarded to the ADC capture FIFO diff -Nru a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt --- a/Documentation/sysctl/kernel.txt Tue Feb 17 20:00:07 2004 +++ b/Documentation/sysctl/kernel.txt Tue Feb 17 20:00:07 2004 @@ -254,8 +254,8 @@ printk_ratelimit: Some warning messages are rate limited. printk_ratelimit specifies -the minimum length of time between these messages, by default we -allow one every 5 seconds. +the minimum length of time between these messages (in jiffies), by +default we allow one every 5 seconds. A value of 0 will disable rate limiting. diff -Nru a/MAINTAINERS b/MAINTAINERS --- a/MAINTAINERS Tue Feb 17 20:00:07 2004 +++ b/MAINTAINERS Tue Feb 17 20:00:07 2004 @@ -922,15 +922,13 @@ S: Maintained I2C AND SENSORS DRIVERS -P: Frodo Looijaard -M: frodol@dds.nl -P: Philip Edelbrock -M: phil@netroedge.com P: Greg Kroah-Hartman M: greg@kroah.com -L: sensors@stimpy.netroedge.com -W: http://www.lm-sensors.nu/ -S: Maintained +P: Philip Edelbrock +M: phil@netroedge.com +L: sensors@stimpy.netroedge.com +W: http://www.lm-sensors.nu/ +S: Maintained i386 BOOT CODE P: Riley H. Williams @@ -2239,8 +2237,8 @@ S: Supported USB UHCI DRIVER -P: Johannes Erdfelt -M: johannes@erdfelt.com +P: Alan Stern +M: stern@rowland.harvard.edu L: linux-usb-users@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net S: Maintained diff -Nru a/Makefile b/Makefile --- a/Makefile Tue Feb 17 20:00:07 2004 +++ b/Makefile Tue Feb 17 20:00:07 2004 @@ -1,6 +1,6 @@ VERSION = 2 PATCHLEVEL = 6 -SUBLEVEL = 2 +SUBLEVEL = 3 EXTRAVERSION = NAME=Feisty Dunnart @@ -830,7 +830,7 @@ cmd_cscope-file = $(all-sources) > cscope.files quiet_cmd_cscope = MAKE cscope.out - cmd_cscope = cscope -k -b + cmd_cscope = cscope -k -b -q cscope: FORCE $(call cmd,cscope-file) diff -Nru a/arch/alpha/defconfig b/arch/alpha/defconfig --- a/arch/alpha/defconfig Tue Feb 17 20:00:07 2004 +++ b/arch/alpha/defconfig Tue Feb 17 20:00:07 2004 @@ -155,7 +155,6 @@ CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set CONFIG_BLK_DEV_ALI15X3=y diff -Nru a/arch/alpha/kernel/core_apecs.c b/arch/alpha/kernel/core_apecs.c --- a/arch/alpha/kernel/core_apecs.c Tue Feb 17 20:00:06 2004 +++ b/arch/alpha/kernel/core_apecs.c Tue Feb 17 20:00:06 2004 @@ -10,19 +10,17 @@ * Code common to all APECS core logic chips. */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include -#include #include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c --- a/arch/alpha/kernel/core_cia.c Tue Feb 17 20:00:07 2004 +++ b/arch/alpha/kernel/core_cia.c Tue Feb 17 20:00:07 2004 @@ -11,22 +11,18 @@ * Code common to all CIA core logic chips. */ -#include -#include -#include -#include -#include - -#include -#include -#include - #define __EXTERN_INLINE inline #include #include #undef __EXTERN_INLINE +#include +#include +#include +#include #include + +#include #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c --- a/arch/alpha/kernel/core_irongate.c Tue Feb 17 20:00:07 2004 +++ b/arch/alpha/kernel/core_irongate.c Tue Feb 17 20:00:07 2004 @@ -9,26 +9,22 @@ * Code common to all IRONGATE core logic chips. */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include #include +#include #include -#include #include -#include #include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE - -#include #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_lca.c b/arch/alpha/kernel/core_lca.c --- a/arch/alpha/kernel/core_lca.c Tue Feb 17 20:00:08 2004 +++ b/arch/alpha/kernel/core_lca.c Tue Feb 17 20:00:08 2004 @@ -8,20 +8,18 @@ * Code common to all LCA core logic chips. */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include #include -#include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c --- a/arch/alpha/kernel/core_marvel.c Tue Feb 17 20:00:05 2004 +++ b/arch/alpha/kernel/core_marvel.c Tue Feb 17 20:00:05 2004 @@ -4,14 +4,11 @@ * Code common to all Marvel based systems. */ -#include - #define __EXTERN_INLINE inline #include #include #undef __EXTERN_INLINE -#include #include #include #include @@ -20,17 +17,14 @@ #include #include #include +#include #include -#include #include -#include #include #include #include #include - -#include #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_mcpcia.c b/arch/alpha/kernel/core_mcpcia.c --- a/arch/alpha/kernel/core_mcpcia.c Tue Feb 17 20:00:07 2004 +++ b/arch/alpha/kernel/core_mcpcia.c Tue Feb 17 20:00:07 2004 @@ -6,7 +6,11 @@ * Code common to all MCbus-PCI Adaptor core logic chipsets */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include @@ -14,13 +18,6 @@ #include #include -#include -#include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_polaris.c b/arch/alpha/kernel/core_polaris.c --- a/arch/alpha/kernel/core_polaris.c Tue Feb 17 20:00:06 2004 +++ b/arch/alpha/kernel/core_polaris.c Tue Feb 17 20:00:06 2004 @@ -4,19 +4,17 @@ * POLARIS chip-specific code */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include -#include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_t2.c b/arch/alpha/kernel/core_t2.c --- a/arch/alpha/kernel/core_t2.c Tue Feb 17 20:00:05 2004 +++ b/arch/alpha/kernel/core_t2.c Tue Feb 17 20:00:05 2004 @@ -9,20 +9,18 @@ * Code common to all T2 core logic chips. */ -#include +#define __EXTERN_INLINE +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include #include -#include #include - -#define __EXTERN_INLINE -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c --- a/arch/alpha/kernel/core_titan.c Tue Feb 17 20:00:06 2004 +++ b/arch/alpha/kernel/core_titan.c Tue Feb 17 20:00:06 2004 @@ -4,28 +4,23 @@ * Code common to all TITAN core logic chips. */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include -#include #include #include #include #include #include +#include -#include #include -#include #include #include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE - -#include #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c --- a/arch/alpha/kernel/core_tsunami.c Tue Feb 17 20:00:06 2004 +++ b/arch/alpha/kernel/core_tsunami.c Tue Feb 17 20:00:06 2004 @@ -6,22 +6,19 @@ * Code common to all TSUNAMI core logic chips. */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include +#include #include -#include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE - -#include #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/kernel/core_wildfire.c b/arch/alpha/kernel/core_wildfire.c --- a/arch/alpha/kernel/core_wildfire.c Tue Feb 17 20:00:05 2004 +++ b/arch/alpha/kernel/core_wildfire.c Tue Feb 17 20:00:05 2004 @@ -6,20 +6,18 @@ * Copyright (C) 2000 Andrea Arcangeli SuSE */ -#include +#define __EXTERN_INLINE inline +#include +#include +#undef __EXTERN_INLINE + #include #include #include #include #include -#include #include - -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE #include "proto.h" #include "pci_impl.h" diff -Nru a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c --- a/arch/alpha/oprofile/common.c Tue Feb 17 20:00:05 2004 +++ b/arch/alpha/oprofile/common.c Tue Feb 17 20:00:05 2004 @@ -57,7 +57,7 @@ /* Compute the mask of enabled counters. */ for (i = e = 0; i < model->num_counters; ++i) - if (ctr[0].enabled) + if (ctr[i].enabled) e |= 1 << i; reg.enable = e; diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig --- a/arch/arm/Kconfig Tue Feb 17 20:00:07 2004 +++ b/arch/arm/Kconfig Tue Feb 17 20:00:07 2004 @@ -616,6 +616,8 @@ source "drivers/scsi/Kconfig" +source "drivers/message/fusion/Kconfig" + source "drivers/ieee1394/Kconfig" source "drivers/message/i2o/Kconfig" @@ -628,6 +630,10 @@ source "drivers/input/Kconfig" source "drivers/char/Kconfig" + +source "drivers/i2c/Kconfig" + +source "drivers/l3/Kconfig" source "drivers/media/Kconfig" diff -Nru a/arch/arm/common/amba.c b/arch/arm/common/amba.c --- a/arch/arm/common/amba.c Tue Feb 17 20:00:06 2004 +++ b/arch/arm/common/amba.c Tue Feb 17 20:00:06 2004 @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -41,6 +42,23 @@ return amba_lookup(pcdrv->id_table, pcdev) != NULL; } +#ifdef CONFIG_HOTPLUG +static int amba_hotplug(struct device *dev, char **envp, int nr_env, char *buf, int bufsz) +{ + struct amba_device *pcdev = to_amba_device(dev); + + if (nr_env < 2) + return -ENOMEM; + + snprintf(buf, bufsz, "AMBA_ID=%08x", pcdev->periphid); + *envp++ = buf; + *envp++ = NULL; + return 0; +} +#else +#define amba_hotplug NULL +#endif + static int amba_suspend(struct device *dev, u32 state) { struct amba_driver *drv = to_amba_driver(dev->driver); @@ -68,6 +86,7 @@ static struct bus_type amba_bustype = { .name = "amba", .match = amba_match, + .hotplug = amba_hotplug, .suspend = amba_suspend, .resume = amba_resume, }; @@ -149,27 +168,19 @@ kfree(d); } -static ssize_t show_id(struct device *_dev, char *buf) -{ - struct amba_device *dev = to_amba_device(_dev); - return sprintf(buf, "%08x\n", dev->periphid); -} -static DEVICE_ATTR(id, S_IRUGO, show_id, NULL); - -static ssize_t show_irq(struct device *_dev, char *buf) -{ - struct amba_device *dev = to_amba_device(_dev); - return sprintf(buf, "%u\n", dev->irq); -} -static DEVICE_ATTR(irq, S_IRUGO, show_irq, NULL); - -static ssize_t show_res(struct device *_dev, char *buf) -{ - struct amba_device *dev = to_amba_device(_dev); - return sprintf(buf, "\t%08lx\t%08lx\t%08lx\n", - dev->res.start, dev->res.end, dev->res.flags); -} -static DEVICE_ATTR(resource, S_IRUGO, show_res, NULL); +#define amba_attr(name,fmt,arg...) \ +static ssize_t show_##name(struct device *_dev, char *buf) \ +{ \ + struct amba_device *dev = to_amba_device(_dev); \ + return sprintf(buf, fmt, arg); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) + +amba_attr(id, "%08x\n", dev->periphid); +amba_attr(irq0, "%u\n", dev->irq[0]); +amba_attr(irq1, "%u\n", dev->irq[1]); +amba_attr(resource, "\t%08lx\t%08lx\t%08lx\n", + dev->res.start, dev->res.end, dev->res.flags); /** * amba_device_register - register an AMBA device @@ -208,10 +219,17 @@ if (cid == 0xb105f00d) dev->periphid = pid; - ret = device_register(&dev->dev); + if (dev->periphid) + ret = device_register(&dev->dev); + else + ret = -ENODEV; + if (ret == 0) { device_create_file(&dev->dev, &dev_attr_id); - device_create_file(&dev->dev, &dev_attr_irq); + if (dev->irq[0] != NO_IRQ) + device_create_file(&dev->dev, &dev_attr_irq0); + if (dev->irq[1] != NO_IRQ) + device_create_file(&dev->dev, &dev_attr_irq1); device_create_file(&dev->dev, &dev_attr_resource); } else { out: @@ -237,7 +255,85 @@ device_unregister(&dev->dev); } + +struct find_data { + struct amba_device *dev; + struct device *parent; + const char *busid; + unsigned int id; + unsigned int mask; +}; + +static int amba_find_match(struct device *dev, void *data) +{ + struct find_data *d = data; + struct amba_device *pcdev = to_amba_device(dev); + int r; + + r = (pcdev->periphid & d->mask) == d->id; + if (d->parent) + r &= d->parent == dev->parent; + if (d->busid) + r &= strcmp(dev->bus_id, d->busid) == 0; + + if (r) { + get_device(dev); + d->dev = pcdev; + } + + return r; +} + +/** + * amba_find_device - locate an AMBA device given a bus id + * @busid: bus id for device (or NULL) + * @parent: parent device (or NULL) + * @id: peripheral ID (or 0) + * @mask: peripheral ID mask (or 0) + * + * Return the AMBA device corresponding to the supplied parameters. + * If no device matches, returns NULL. + * + * NOTE: When a valid device is found, its refcount is + * incremented, and must be decremented before the returned + * reference. + */ +struct amba_device * +amba_find_device(const char *busid, struct device *parent, unsigned int id, + unsigned int mask) +{ + struct find_data data; + + data.dev = NULL; + data.parent = parent; + data.busid = busid; + data.id = id; + data.mask = mask; + + bus_for_each_dev(&amba_bustype, NULL, &data, amba_find_match); + + return data.dev; +} + +int amba_request_regions(struct amba_device *dev, const char *name) +{ + int ret = 0; + + if (!request_mem_region(dev->res.start, SZ_4K, name)) + ret = -EBUSY; + + return ret; +} + +void amba_release_regions(struct amba_device *dev) +{ + release_mem_region(dev->res.start, SZ_4K); +} + EXPORT_SYMBOL(amba_driver_register); EXPORT_SYMBOL(amba_driver_unregister); EXPORT_SYMBOL(amba_device_register); EXPORT_SYMBOL(amba_device_unregister); +EXPORT_SYMBOL(amba_find_device); +EXPORT_SYMBOL(amba_request_regions); +EXPORT_SYMBOL(amba_release_regions); diff -Nru a/arch/arm/configs/footbridge_defconfig b/arch/arm/configs/footbridge_defconfig --- a/arch/arm/configs/footbridge_defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/arm/configs/footbridge_defconfig Tue Feb 17 20:00:06 2004 @@ -399,7 +399,6 @@ CONFIG_BLK_DEV_OFFBOARD=y CONFIG_IDEDMA_PCI_AUTO=y CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_AEC62XX_TUNING is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/arm/configs/iq80321_defconfig b/arch/arm/configs/iq80321_defconfig --- a/arch/arm/configs/iq80321_defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/arm/configs/iq80321_defconfig Tue Feb 17 20:00:06 2004 @@ -441,7 +441,6 @@ CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/arm/configs/netwinder_defconfig b/arch/arm/configs/netwinder_defconfig --- a/arch/arm/configs/netwinder_defconfig Tue Feb 17 20:00:05 2004 +++ b/arch/arm/configs/netwinder_defconfig Tue Feb 17 20:00:05 2004 @@ -439,7 +439,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S --- a/arch/arm/kernel/calls.S Tue Feb 17 20:00:14 2004 +++ b/arch/arm/kernel/calls.S Tue Feb 17 20:00:14 2004 @@ -285,6 +285,9 @@ .long sys_tgkill .long sys_utimes /* 270 */ .long sys_fadvise64_64 + .long sys_pciconfig_iobase + .long sys_pciconfig_read + .long sys_pciconfig_write __syscall_end: .rept NR_syscalls - (__syscall_end - __syscall_start) / 4 diff -Nru a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c --- a/arch/arm/kernel/process.c Tue Feb 17 20:00:08 2004 +++ b/arch/arm/kernel/process.c Tue Feb 17 20:00:08 2004 @@ -264,7 +264,7 @@ if (!thread) thread = ll_alloc_task_struct(); -#ifdef CONFIG_SYSRQ +#ifdef CONFIG_MAGIC_SYSRQ /* * The stack must be cleared if you want SYSRQ-T to * give sensible stack usage information diff -Nru a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c --- a/arch/arm/kernel/time.c Tue Feb 17 20:00:07 2004 +++ b/arch/arm/kernel/time.c Tue Feb 17 20:00:07 2004 @@ -72,8 +72,10 @@ /* * Scheduler clock - returns current time in nanosec units. + * This is the default implementation. Sub-architecture + * implementations can override this. */ -unsigned long long sched_clock(void) +unsigned long long __attribute__((weak)) sched_clock(void) { return (unsigned long long)jiffies * (1000000000 / HZ); } @@ -114,7 +116,7 @@ return; if (next_rtc_update && - time_before(xtime.tv_sec, next_rtc_update)) + time_before((unsigned long)xtime.tv_sec, next_rtc_update)) return; if (xtime.tv_nsec < 500000000 - ((unsigned) tick_nsec >> 1) && diff -Nru a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S --- a/arch/arm/kernel/vmlinux.lds.S Tue Feb 17 20:00:06 2004 +++ b/arch/arm/kernel/vmlinux.lds.S Tue Feb 17 20:00:06 2004 @@ -102,6 +102,12 @@ */ *(.init.task) + . = ALIGN(4096); + __nosave_begin = .; + *(.data.nosave) + . = ALIGN(4096); + __nosave_end = .; + /* * then the cacheline aligned data */ diff -Nru a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig --- a/arch/arm/mach-integrator/Kconfig Tue Feb 17 20:00:08 2004 +++ b/arch/arm/mach-integrator/Kconfig Tue Feb 17 20:00:08 2004 @@ -7,6 +7,15 @@ Include support for the ARM(R) Integrator/AP and Integrator/PP2 platforms. +config ARCH_INTEGRATOR_CP + bool "Support Integrator/CP platform" + select ARCH_CINTEGRATOR + help + Include support for the ARM(R) Integrator CP platform. + +config ARCH_CINTEGRATOR + bool + config INTEGRATOR_IMPD1 tristate "Include support for Integrator/IM-PD1" depends on ARCH_INTEGRATOR_AP diff -Nru a/arch/arm/mach-integrator/Makefile b/arch/arm/mach-integrator/Makefile --- a/arch/arm/mach-integrator/Makefile Tue Feb 17 20:00:08 2004 +++ b/arch/arm/mach-integrator/Makefile Tue Feb 17 20:00:08 2004 @@ -6,6 +6,7 @@ obj-y := core.o lm.o time.o obj-$(CONFIG_ARCH_INTEGRATOR_AP) += integrator_ap.o +obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o obj-$(CONFIG_LEDS) += leds.o obj-$(CONFIG_PCI) += pci_v3.o pci.o diff -Nru a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c --- a/arch/arm/mach-integrator/core.c Tue Feb 17 20:00:07 2004 +++ b/arch/arm/mach-integrator/core.c Tue Feb 17 20:00:07 2004 @@ -11,10 +11,13 @@ #include #include #include +#include #include #include +#include #include +#include static struct amba_device rtc_device = { .dev = { @@ -25,7 +28,7 @@ .end = INTEGRATOR_RTC_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = IRQ_RTCINT, + .irq = { IRQ_RTCINT, NO_IRQ }, .periphid = 0x00041030, }; @@ -38,7 +41,7 @@ .end = INTEGRATOR_UART0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = IRQ_UARTINT0, + .irq = { IRQ_UARTINT0, NO_IRQ }, .periphid = 0x0041010, }; @@ -51,7 +54,7 @@ .end = INTEGRATOR_UART1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = IRQ_UARTINT1, + .irq = { IRQ_UARTINT1, NO_IRQ }, .periphid = 0x0041010, }; @@ -64,7 +67,7 @@ .end = KMI0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = IRQ_KMIINT0, + .irq = { IRQ_KMIINT0, NO_IRQ }, .periphid = 0x00041050, }; @@ -77,7 +80,7 @@ .end = KMI1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = IRQ_KMIINT1, + .irq = { IRQ_KMIINT1, NO_IRQ }, .periphid = 0x00041050, }; @@ -102,3 +105,25 @@ } arch_initcall(integrator_init); + +#define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET + +static spinlock_t cm_lock; + +/** + * cm_control - update the CM_CTRL register. + * @mask: bits to change + * @set: bits to set + */ +void cm_control(u32 mask, u32 set) +{ + unsigned long flags; + u32 val; + + spin_lock_irqsave(&cm_lock, flags); + val = readl(CM_CTRL) & ~mask; + writel(val | set, CM_CTRL); + spin_unlock_irqrestore(&cm_lock, flags); +} + +EXPORT_SYMBOL(cm_control); diff -Nru a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c --- a/arch/arm/mach-integrator/cpu.c Tue Feb 17 20:00:07 2004 +++ b/arch/arm/mach-integrator/cpu.c Tue Feb 17 20:00:07 2004 @@ -22,6 +22,7 @@ #include #include +#include #include static struct cpufreq_driver integrator_driver; @@ -98,7 +99,12 @@ /* get current setting */ cm_osc = __raw_readl(CM_OSC); - vco.s = (cm_osc >> 8) & 7; + + if (machine_is_integrator()) { + vco.s = (cm_osc >> 8) & 7; + } else if (machine_is_cintegrator()) { + vco.s = 1; + } vco.v = cm_osc & 255; vco.r = 22; freqs.old = icst525_khz(&cclk_params, vco); @@ -107,7 +113,7 @@ * larger freq in case of CPUFREQ_RELATION_L. */ if (relation == CPUFREQ_RELATION_L) - target_freq += 1999; + target_freq += 999; if (target_freq > policy->max) target_freq = policy->max; vco = icst525_khz_to_vco(&cclk_params, target_freq); @@ -123,8 +129,14 @@ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); cm_osc = __raw_readl(CM_OSC); - cm_osc &= 0xfffff800; - cm_osc |= vco.v | vco.s << 8; + + if (machine_is_integrator()) { + cm_osc &= 0xfffff800; + cm_osc |= vco.s << 8; + } else if (machine_is_cintegrator()) { + cm_osc &= 0xffffff00; + } + cm_osc |= vco.v; __raw_writel(0xa05f, CM_LOCK); __raw_writel(cm_osc, CM_OSC); @@ -144,7 +156,7 @@ { unsigned long cpus_allowed; unsigned int cpu = policy->cpu; - u_int cm_osc, cm_stat, mem_freq_khz; + u_int cm_osc; struct icst525_vco vco; cpus_allowed = current->cpus_allowed; @@ -153,18 +165,13 @@ BUG_ON(cpu != smp_processor_id()); /* detect memory etc. */ - cm_stat = __raw_readl(CM_STAT); cm_osc = __raw_readl(CM_OSC); - vco.s = (cm_osc >> 20) & 7; - vco.v = (cm_osc >> 12) & 255; - vco.r = 22; - mem_freq_khz = icst525_khz(&lclk_params, vco) / 2; - printk(KERN_INFO "CPU%d: Module id: %d\n", cpu, cm_stat & 255); - printk(KERN_INFO "CPU%d: Memory clock = %d.%03d MHz\n", - cpu, mem_freq_khz / 1000, mem_freq_khz % 1000); - - vco.s = (cm_osc >> 8) & 7; + if (machine_is_integrator()) { + vco.s = (cm_osc >> 8) & 7; + } else if (machine_is_cintegrator()) { + vco.s = 1; + } vco.v = cm_osc & 255; vco.r = 22; diff -Nru a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c --- a/arch/arm/mach-integrator/impd1.c Tue Feb 17 20:00:06 2004 +++ b/arch/arm/mach-integrator/impd1.c Tue Feb 17 20:00:06 2004 @@ -188,7 +188,8 @@ d->res.start = dev->resource.start + idev->offset; d->res.end = d->res.start + SZ_4K - 1; d->res.flags = IORESOURCE_MEM; - d->irq = dev->irq; + d->irq[0] = dev->irq; + d->irq[1] = dev->irq; d->periphid = idev->id; ret = amba_device_register(d, &dev->resource); diff -Nru a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c --- a/arch/arm/mach-integrator/integrator_ap.c Tue Feb 17 20:00:08 2004 +++ b/arch/arm/mach-integrator/integrator_ap.c Tue Feb 17 20:00:08 2004 @@ -251,7 +251,7 @@ .resource = &cfi_flash_resource, }; -static int __init ap_init(void) +static void __init ap_init(void) { unsigned long sc_dec; int i; @@ -279,16 +279,13 @@ lm_device_register(lmdev); } - - return 0; } -arch_initcall(ap_init); - MACHINE_START(INTEGRATOR, "ARM-Integrator") MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) BOOT_PARAMS(0x00000100) MAPIO(ap_map_io) INITIRQ(ap_init_irq) + INIT_MACHINE(ap_init) MACHINE_END diff -Nru a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/arm/mach-integrator/integrator_cp.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,367 @@ +/* + * linux/arch/arm/mach-integrator/integrator_cp.c + * + * Copyright (C) 2003 Deep Blue Solutions Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#define INTCP_PA_MMC_BASE 0x1c000000 +#define INTCP_PA_AACI_BASE 0x1d000000 + +#define INTCP_PA_FLASH_BASE 0x24000000 +#define INTCP_FLASH_SIZE SZ_32M + +#define INTCP_VA_CIC_BASE 0xf1000040 +#define INTCP_VA_PIC_BASE 0xf1400000 +#define INTCP_VA_SIC_BASE 0xfca00000 + +#define INTCP_PA_ETH_BASE 0xc8000000 +#define INTCP_ETH_SIZE 0x10 + +#define INTCP_VA_CTRL_BASE 0xfcb00000 +#define INTCP_FLASHPROG 0x04 +#define CINTEGRATOR_FLASHPROG_FLVPPEN (1 << 0) +#define CINTEGRATOR_FLASHPROG_FLWREN (1 << 1) + +/* + * Logical Physical + * f1000000 10000000 Core module registers + * f1100000 11000000 System controller registers + * f1200000 12000000 EBI registers + * f1300000 13000000 Counter/Timer + * f1400000 14000000 Interrupt controller + * f1600000 16000000 UART 0 + * f1700000 17000000 UART 1 + * f1a00000 1a000000 Debug LEDs + * f1b00000 1b000000 GPIO + */ + +static struct map_desc intcp_io_desc[] __initdata = { + { IO_ADDRESS(INTEGRATOR_HDR_BASE), INTEGRATOR_HDR_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_SC_BASE), INTEGRATOR_SC_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_EBI_BASE), INTEGRATOR_EBI_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_CT_BASE), INTEGRATOR_CT_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_IC_BASE), INTEGRATOR_IC_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_UART0_BASE), INTEGRATOR_UART0_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_DBG_BASE), INTEGRATOR_DBG_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_GPIO_BASE), INTEGRATOR_GPIO_BASE, SZ_4K, MT_DEVICE }, + { 0xfc900000, 0xc9000000, SZ_4K, MT_DEVICE }, + { 0xfca00000, 0xca000000, SZ_4K, MT_DEVICE }, + { 0xfcb00000, 0xcb000000, SZ_4K, MT_DEVICE }, +}; + +static void __init intcp_map_io(void) +{ + iotable_init(intcp_io_desc, ARRAY_SIZE(intcp_io_desc)); +} + +#define cic_writel __raw_writel +#define cic_readl __raw_readl +#define pic_writel __raw_writel +#define pic_readl __raw_readl +#define sic_writel __raw_writel +#define sic_readl __raw_readl + +static void cic_mask_irq(unsigned int irq) +{ + irq -= IRQ_CIC_START; + cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR); +} + +static void cic_unmask_irq(unsigned int irq) +{ + irq -= IRQ_CIC_START; + cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET); +} + +static struct irqchip cic_chip = { + .ack = cic_mask_irq, + .mask = cic_mask_irq, + .unmask = cic_unmask_irq, +}; + +static void pic_mask_irq(unsigned int irq) +{ + irq -= IRQ_PIC_START; + pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR); +} + +static void pic_unmask_irq(unsigned int irq) +{ + irq -= IRQ_PIC_START; + pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET); +} + +static struct irqchip pic_chip = { + .ack = pic_mask_irq, + .mask = pic_mask_irq, + .unmask = pic_unmask_irq, +}; + +static void sic_mask_irq(unsigned int irq) +{ + irq -= IRQ_SIC_START; + sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR); +} + +static void sic_unmask_irq(unsigned int irq) +{ + irq -= IRQ_SIC_START; + sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET); +} + +static struct irqchip sic_chip = { + .ack = sic_mask_irq, + .mask = sic_mask_irq, + .unmask = sic_unmask_irq, +}; + +static void +sic_handle_irq(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) +{ + unsigned long status = sic_readl(INTCP_VA_SIC_BASE + IRQ_STATUS); + + if (status == 0) { + do_bad_IRQ(irq, desc, regs); + return; + } + + do { + irq = ffs(status) - 1; + status &= ~(1 << irq); + + irq += IRQ_SIC_START; + + desc = irq_desc + irq; + desc->handle(irq, desc, regs); + } while (status); +} + +static void __init intcp_init_irq(void) +{ + unsigned int i; + + /* + * Disable all interrupt sources + */ + pic_writel(0xffffffff, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR); + pic_writel(0xffffffff, INTCP_VA_PIC_BASE + FIQ_ENABLE_CLEAR); + + for (i = IRQ_PIC_START; i <= IRQ_PIC_END; i++) { + if (i == 11) + i = 22; + if (i == IRQ_CP_CPPLDINT) + i++; + if (i == 29) + break; + set_irq_chip(i, &pic_chip); + set_irq_handler(i, do_level_IRQ); + set_irq_flags(i, IRQF_VALID | IRQF_PROBE); + } + + cic_writel(0xffffffff, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR); + cic_writel(0xffffffff, INTCP_VA_CIC_BASE + FIQ_ENABLE_CLEAR); + + for (i = IRQ_CIC_START; i <= IRQ_CIC_END; i++) { + set_irq_chip(i, &cic_chip); + set_irq_handler(i, do_level_IRQ); + set_irq_flags(i, IRQF_VALID); + } + + sic_writel(0x00000fff, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR); + sic_writel(0x00000fff, INTCP_VA_SIC_BASE + FIQ_ENABLE_CLEAR); + + for (i = IRQ_SIC_START; i <= IRQ_SIC_END; i++) { + set_irq_chip(i, &sic_chip); + set_irq_handler(i, do_level_IRQ); + set_irq_flags(i, IRQF_VALID | IRQF_PROBE); + } + + set_irq_handler(IRQ_CP_CPPLDINT, sic_handle_irq); + pic_unmask_irq(IRQ_CP_CPPLDINT); +} + +/* + * Flash handling. + */ +static int intcp_flash_init(void) +{ + u32 val; + + val = readl(INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); + val |= CINTEGRATOR_FLASHPROG_FLWREN; + writel(val, INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); + + return 0; +} + +static void intcp_flash_exit(void) +{ + u32 val; + + val = readl(INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); + val &= ~(CINTEGRATOR_FLASHPROG_FLVPPEN|CINTEGRATOR_FLASHPROG_FLWREN); + writel(val, INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); +} + +static void intcp_flash_set_vpp(int on) +{ + u32 val; + + val = readl(INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); + if (on) + val |= CINTEGRATOR_FLASHPROG_FLVPPEN; + else + val &= ~CINTEGRATOR_FLASHPROG_FLVPPEN; + writel(val, INTCP_VA_CTRL_BASE + INTCP_FLASHPROG); +} + +static struct flash_platform_data intcp_flash_data = { + .map_name = "cfi_probe", + .width = 4, + .init = intcp_flash_init, + .exit = intcp_flash_exit, + .set_vpp = intcp_flash_set_vpp, +}; + +static struct resource intcp_flash_resource = { + .start = INTCP_PA_FLASH_BASE, + .end = INTCP_PA_FLASH_BASE + INTCP_FLASH_SIZE - 1, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device intcp_flash_device = { + .name = "armflash", + .id = 0, + .dev = { + .platform_data = &intcp_flash_data, + }, + .num_resources = 1, + .resource = &intcp_flash_resource, +}; + +static struct resource smc91x_resources[] = { + [0] = { + .start = INTCP_PA_ETH_BASE, + .end = INTCP_PA_ETH_BASE + INTCP_ETH_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_CP_ETHINT, + .end = IRQ_CP_ETHINT, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device smc91x_device = { + .name = "smc91x", + .id = 0, + .num_resources = ARRAY_SIZE(smc91x_resources), + .resource = smc91x_resources, +}; + +static struct platform_device *intcp_devs[] __initdata = { + &intcp_flash_device, + &smc91x_device, +}; + +/* + * It seems that the card insertion interrupt remains active after + * we've acknowledged it. We therefore ignore the interrupt, and + * rely on reading it from the SIC. This also means that we must + * clear the latched interrupt. + */ +static unsigned int mmc_status(struct device *dev) +{ + unsigned int status = readl(0xfca00004); + writel(8, 0xfcb00008); + + return status & 8; +} + +static struct mmc_platform_data mmc_data = { + .mclk = 33000000, + .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, + .status = mmc_status, +}; + +static struct amba_device mmc_device = { + .dev = { + .bus_id = "mb:1c", + .platform_data = &mmc_data, + }, + .res = { + .start = INTCP_PA_MMC_BASE, + .end = INTCP_PA_MMC_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = { IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 }, + .periphid = 0, +}; + +static struct amba_device aaci_device = { + .dev = { + .bus_id = "mb:1d", + }, + .res = { + .start = INTCP_PA_AACI_BASE, + .end = INTCP_PA_AACI_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = { IRQ_CP_AACIINT, NO_IRQ }, + .periphid = 0, +}; + +static struct amba_device *amba_devs[] __initdata = { + &mmc_device, + &aaci_device, +}; + +static void __init intcp_init(void) +{ + int i; + + platform_add_devices(intcp_devs, ARRAY_SIZE(intcp_devs)); + + for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { + struct amba_device *d = amba_devs[i]; + amba_device_register(d, &iomem_resource); + } +} + +MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP") + MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") + BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) + BOOT_PARAMS(0x00000100) + MAPIO(intcp_map_io) + INITIRQ(intcp_init_irq) + INIT_MACHINE(intcp_init) +MACHINE_END diff -Nru a/arch/arm/mach-integrator/leds.c b/arch/arm/mach-integrator/leds.c --- a/arch/arm/mach-integrator/leds.c Tue Feb 17 20:00:06 2004 +++ b/arch/arm/mach-integrator/leds.c Tue Feb 17 20:00:06 2004 @@ -1,7 +1,7 @@ /* * linux/arch/arm/mach-integrator/leds.c * - * Integrator LED control routines + * Integrator/AP and Integrator/CP LED control routines * * Copyright (C) 1999 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd @@ -28,6 +28,7 @@ #include #include #include +#include static int saved_leds; @@ -35,9 +36,6 @@ { unsigned long flags; const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE); - const unsigned int hdr_ctrl = IO_ADDRESS(INTEGRATOR_HDR_BASE) + - INTEGRATOR_HDR_CTRL_OFFSET; - unsigned int ctrl; unsigned int update_alpha_leds; // yup, change the LEDs @@ -46,15 +44,11 @@ switch(ledevt) { case led_idle_start: - ctrl = __raw_readl(hdr_ctrl); - ctrl &= ~INTEGRATOR_HDR_CTRL_LED; - __raw_writel(ctrl, hdr_ctrl); + cm_control(CM_CTRL_LED, 0); break; case led_idle_end: - ctrl = __raw_readl(hdr_ctrl); - ctrl |= INTEGRATOR_HDR_CTRL_LED; - __raw_writel(ctrl, hdr_ctrl); + cm_control(CM_CTRL_LED, CM_CTRL_LED); break; case led_timer: @@ -85,7 +79,7 @@ static int __init leds_init(void) { - if (machine_is_integrator()) + if (machine_is_integrator() || machine_is_cintegrator()) leds_event = integrator_leds_event; return 0; diff -Nru a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c --- a/arch/arm/mach-pxa/lubbock.c Tue Feb 17 20:00:06 2004 +++ b/arch/arm/mach-pxa/lubbock.c Tue Feb 17 20:00:06 2004 @@ -119,8 +119,34 @@ .resource = sa1111_resources, }; +static struct resource smc91x_resources[] = { + [0] = { + .start = 0x0c000000, + .end = 0x0c0fffff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = LUBBOCK_ETH_IRQ, + .end = LUBBOCK_ETH_IRQ, + .flags = IORESOURCE_IRQ, + }, + [2] = { + .start = 0x0e000000, + .end = 0x0e0fffff, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device smc91x_device = { + .name = "smc91x", + .id = 0, + .num_resources = ARRAY_SIZE(smc91x_resources), + .resource = smc91x_resources, +}; + static struct platform_device *devices[] __initdata = { &sa1111_device, + &smc91x_device, }; static void __init lubbock_init(void) diff -Nru a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c --- a/arch/arm/mach-sa1100/assabet.c Tue Feb 17 20:00:05 2004 +++ b/arch/arm/mach-sa1100/assabet.c Tue Feb 17 20:00:05 2004 @@ -92,11 +92,8 @@ ASSABET_BCR_clear(ASSABET_BCR_LCD_ON); } -static int __init assabet_init(void) +static void __init assabet_init(void) { - if (!machine_is_assabet()) - return -EINVAL; - /* * Ensure that the power supply is in "high power" mode. */ @@ -139,13 +136,8 @@ "hasn't been configured in the kernel\n" ); #endif } - - return 0; } -arch_initcall(assabet_init); - - /* * On Assabet, we must probe for the Neponset board _before_ * paging_init() has occurred to actually determine the amount @@ -332,4 +324,5 @@ FIXUP(fixup_assabet) MAPIO(assabet_map_io) INITIRQ(sa1100_init_irq) + INIT_MACHINE(assabet_init) MACHINE_END diff -Nru a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c --- a/arch/arm/mach-sa1100/generic.c Tue Feb 17 20:00:06 2004 +++ b/arch/arm/mach-sa1100/generic.c Tue Feb 17 20:00:06 2004 @@ -159,9 +159,14 @@ }, }; +static u64 sa11x0mcp_dma_mask = 0xffffffffUL; + static struct platform_device sa11x0mcp_device = { .name = "sa11x0-mcp", .id = 0, + .dev = { + .dma_mask = &sa11x0mcp_dma_mask, + }, .num_resources = ARRAY_SIZE(sa11x0mcp_resources), .resource = sa11x0mcp_resources, }; diff -Nru a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c --- a/arch/arm/mach-sa1100/neponset.c Tue Feb 17 20:00:07 2004 +++ b/arch/arm/mach-sa1100/neponset.c Tue Feb 17 20:00:07 2004 @@ -256,9 +256,35 @@ .resource = sa1111_resources, }; +static struct resource smc91x_resources[] = { + [0] = { + .start = SA1100_CS3_PHYS, + .end = SA1100_CS3_PHYS + 0x01ffffff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_NEPONSET_SMC9196, + .end = IRQ_NEPONSET_SMC9196, + .flags = IORESOURCE_IRQ, + }, + [2] = { + .start = SA1100_CS3_PHYS + 0x02000000, + .end = SA1100_CS3_PHYS + 0x03ffffff, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device smc91x_device = { + .name = "smc91x", + .id = 0, + .num_resources = ARRAY_SIZE(smc91x_resources), + .resource = smc91x_resources, +}; + static struct platform_device *devices[] __initdata = { &neponset_device, &sa1111_device, + &smc91x_device, }; static int __init neponset_init(void) diff -Nru a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig --- a/arch/arm/mm/Kconfig Tue Feb 17 20:00:06 2004 +++ b/arch/arm/mm/Kconfig Tue Feb 17 20:00:06 2004 @@ -291,8 +291,8 @@ depends on CPU_ARM720T || CPU_ARM920T || CPU_ARM922T || CPU_ARM926T || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE default y help - Say Y if you want to have kernel support for ARM Thumb instructions, - fault handlers, and system calls. + Say Y if you want to include kernel support for running user space + Thumb binaries. The Thumb instruction set is a compressed form of the standard ARM instruction set resulting in smaller binaries at the expense of diff -Nru a/arch/arm26/kernel/process.c b/arch/arm26/kernel/process.c --- a/arch/arm26/kernel/process.c Tue Feb 17 20:00:08 2004 +++ b/arch/arm26/kernel/process.c Tue Feb 17 20:00:08 2004 @@ -257,7 +257,7 @@ if (!thread) thread = ll_alloc_task_struct(); -#ifdef CONFIG_SYSRQ +#ifdef CONFIG_MAGIC_SYSRQ /* * The stack must be cleared if you want SYSRQ-T to * give sensible stack usage information diff -Nru a/arch/h8300/lib/checksum.c b/arch/h8300/lib/checksum.c --- a/arch/h8300/lib/checksum.c Tue Feb 17 20:00:05 2004 +++ b/arch/h8300/lib/checksum.c Tue Feb 17 20:00:05 2004 @@ -32,7 +32,6 @@ of the assembly has to go. */ #include -#include static inline unsigned short from32to16(unsigned long x) { diff -Nru a/arch/h8300/platform/h8300h/ints.c b/arch/h8300/platform/h8300h/ints.c --- a/arch/h8300/platform/h8300h/ints.c Tue Feb 17 20:00:06 2004 +++ b/arch/h8300/platform/h8300h/ints.c Tue Feb 17 20:00:06 2004 @@ -140,8 +140,9 @@ if (use_kmalloc) irq_handle = (irq_handler_t *)kmalloc(sizeof(irq_handler_t), GFP_ATOMIC); else { - irq_handle = alloc_bootmem(sizeof(irq_handler_t)); - (unsigned long)irq_handle |= 0x80000000; /* bootmem allocater */ + /* use bootmem allocater */ + irq_handle = (irq_handler_t *)alloc_bootmem(sizeof(irq_handler_t)); + irq_handle = (irq_handler_t *)((unsigned long)irq_handle | 0x80000000); } if (irq_handle == NULL) @@ -230,11 +231,9 @@ { int i = *(loff_t *) v; - if (i < NR_IRQS) { - if (irq_list[i]) { - seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); - seq_printf(p, "%s\n", irq_list[i]->devname); - } + if ((i < NR_IRQS) && (irq_list[i]!=NULL)) { + seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); + seq_printf(p, "%s\n", irq_list[i]->devname); } return 0; diff -Nru a/arch/h8300/platform/h8s/ints.c b/arch/h8300/platform/h8s/ints.c --- a/arch/h8300/platform/h8s/ints.c Tue Feb 17 20:00:06 2004 +++ b/arch/h8300/platform/h8s/ints.c Tue Feb 17 20:00:06 2004 @@ -178,8 +178,9 @@ if (use_kmalloc) irq_handle = (irq_handler_t *)kmalloc(sizeof(irq_handler_t), GFP_ATOMIC); else { - irq_handle = alloc_bootmem(sizeof(irq_handler_t)); - (unsigned long)irq_handle |= 0x80000000; /* bootmem allocater */ + /* use bootmem allocater */ + irq_handle = (irq_handler_t *)alloc_bootmem(sizeof(irq_handler_t)); + irq_handle = (irq_handler_t *)((unsigned long)irq_handle | 0x80000000); } if (irq_handle == NULL) @@ -282,11 +283,9 @@ { int i = *(loff_t *) v; - if (i < NR_IRQS) { - if (irq_list[i]) { - seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); - seq_printf(p, "%s\n", irq_list[i]->devname); - } + if ((i < NR_IRQS) && (irq_list[i] !=NULL)) { + seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); + seq_printf(p, "%s\n", irq_list[i]->devname); } return 0; diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig --- a/arch/i386/Kconfig Tue Feb 17 20:00:06 2004 +++ b/arch/i386/Kconfig Tue Feb 17 20:00:06 2004 @@ -701,7 +701,7 @@ # Common NUMA Features config NUMA bool "Numa Memory Allocation Support" - depends on SMP && HIGHMEM64G && (X86_PC || X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI && !ACPI_HT_ONLY)) + depends on SMP && HIGHMEM64G && (X86_PC || X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT) @@ -709,8 +709,8 @@ comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support" depends on X86_NUMAQ && (!HIGHMEM64G || !SMP) -comment "NUMA (Summit) requires SMP, 64GB highmem support, full ACPI" - depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI || ACPI_HT_ONLY) +comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" + depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) config DISCONTIGMEM bool diff -Nru a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c --- a/arch/i386/boot/compressed/misc.c Tue Feb 17 20:00:07 2004 +++ b/arch/i386/boot/compressed/misc.c Tue Feb 17 20:00:07 2004 @@ -104,7 +104,7 @@ static void *malloc(int size); static void free(void *where); -static void puts(const char *); +static void putstr(const char *); extern int end; static long free_mem_ptr = (long)&end; @@ -169,7 +169,7 @@ vidmem[i] = ' '; } -static void puts(const char *s) +static void putstr(const char *s) { int x,y,pos; char c; @@ -287,9 +287,9 @@ static void error(char *x) { - puts("\n\n"); - puts(x); - puts("\n\n -- System halted"); + putstr("\n\n"); + putstr(x); + putstr("\n\n -- System halted"); while(1); /* Halt */ } @@ -373,9 +373,9 @@ else setup_output_buffer_if_we_run_high(mv); makecrc(); - puts("Uncompressing Linux... "); + putstr("Uncompressing Linux... "); gunzip(); - puts("Ok, booting the kernel.\n"); + putstr("Ok, booting the kernel.\n"); if (high_loaded) close_output_buffer_if_we_run_high(mv); return high_loaded; } diff -Nru a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S --- a/arch/i386/boot/setup.S Tue Feb 17 20:00:07 2004 +++ b/arch/i386/boot/setup.S Tue Feb 17 20:00:07 2004 @@ -49,6 +49,8 @@ * by Matt Domsch October 2002 * conformant to T13 Committee www.t13.org * projects 1572D, 1484D, 1386D, 1226DT + * disk signature read by Matt Domsch + * and Andrew Wilks September 2003 */ #include @@ -578,6 +580,25 @@ #endif #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) +# Read the first sector of device 80h and store the 4-byte signature + movl $0xFFFFFFFF, %eax + movl %eax, (DISK80_SIG_BUFFER) # assume failure + movb $READ_SECTORS, %ah + movb $1, %al # read 1 sector + movb $0x80, %dl # from device 80 + movb $0, %dh # at head 0 + movw $1, %cx # cylinder 0, sector 0 + pushw %es + pushw %ds + popw %es + movw $EDDBUF, %bx + int $0x13 + jc disk_sig_done + movl (EDDBUF+MBR_SIG_OFFSET), %eax + movl %eax, (DISK80_SIG_BUFFER) # store success +disk_sig_done: + popw %es + # Do the BIOS Enhanced Disk Drive calls # This consists of two calls: # int 13h ah=41h "Check Extensions Present" diff -Nru a/arch/i386/defconfig b/arch/i386/defconfig --- a/arch/i386/defconfig Tue Feb 17 20:00:07 2004 +++ b/arch/i386/defconfig Tue Feb 17 20:00:07 2004 @@ -274,7 +274,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/kernel/acpi/boot.c Tue Feb 17 20:00:08 2004 @@ -27,10 +27,12 @@ #include #include #include +#include #include #include #include #include +#include #include #if defined (CONFIG_X86_LOCAL_APIC) @@ -44,8 +46,8 @@ int acpi_noirq __initdata = 0; /* skip ACPI IRQ initialization */ int acpi_ht __initdata = 1; /* enable HT */ -int acpi_lapic = 0; -int acpi_ioapic = 0; +int acpi_lapic; +int acpi_ioapic; /* -------------------------------------------------------------------------- Boot-time Configuration @@ -139,6 +141,10 @@ acpi_table_print_madt_entry(header); + /* no utility in registering a disabled processor */ + if (processor->flags.enabled == 0) + return 0; + mp_register_lapic ( processor->id, /* APIC ID */ processor->flags.enabled); /* Enabled? */ @@ -311,7 +317,14 @@ #endif /* CONFIG_ACPI_BUS */ - +#ifdef CONFIG_X86_IO_APIC +int acpi_irq_to_vector(u32 irq) +{ + if (use_pci_vector() && !platform_legacy_irq(irq)) + irq = IO_APIC_VECTOR(irq); + return irq; +} +#endif static unsigned long __init acpi_scan_rsdp ( @@ -463,7 +476,7 @@ * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value). */ - result = acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing LAPIC address override entry\n"); return result; @@ -471,7 +484,8 @@ mp_register_lapic_address(acpi_lapic_addr); - result = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic, + MAX_APICS); if (!result) { printk(KERN_ERR PREFIX "No LAPIC entries present\n"); /* TBD: Cleanup to allow fallback to MPS */ @@ -483,7 +497,7 @@ return result; } - result = acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); /* TBD: Cleanup to allow fallback to MPS */ @@ -520,8 +534,8 @@ return 1; } - result = acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic); - if (!result) { + result = acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic, MAX_IO_APICS); + if (!result) { printk(KERN_ERR PREFIX "No IOAPIC entries present\n"); return -ENODEV; } @@ -533,14 +547,14 @@ /* Build a default routing table for legacy (ISA) interrupts. */ mp_config_acpi_legacy_irqs(); - result = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr); + result = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, NR_IRQ_VECTORS); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); /* TBD: Cleanup to allow fallback to MPS */ return result; } - result = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src); + result = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, NR_IRQ_VECTORS); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); /* TBD: Cleanup to allow fallback to MPS */ diff -Nru a/arch/i386/kernel/cpu/cpufreq/acpi.c b/arch/i386/kernel/cpu/cpufreq/acpi.c --- a/arch/i386/kernel/cpu/cpufreq/acpi.c Tue Feb 17 20:00:05 2004 +++ b/arch/i386/kernel/cpu/cpufreq/acpi.c Tue Feb 17 20:00:05 2004 @@ -1,9 +1,9 @@ /* - * acpi_processor_perf.c - ACPI Processor P-States Driver ($Revision: 1.3 $) + * acpi-cpufreq-io.c - ACPI Processor P-States Driver ($Revision: 1.3 $) * * Copyright (C) 2001, 2002 Andy Grover * Copyright (C) 2001, 2002 Paul Diefenbaugh - * Copyright (C) 2002, 2003 Dominik Brodowski + * Copyright (C) 2002 - 2004 Dominik Brodowski * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -42,7 +42,6 @@ #define ACPI_PROCESSOR_CLASS "processor" #define ACPI_PROCESSOR_DRIVER_NAME "ACPI Processor P-States Driver" #define ACPI_PROCESSOR_DEVICE_NAME "Processor" -#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance" #define _COMPONENT ACPI_PROCESSOR_COMPONENT ACPI_MODULE_NAME ("acpi_processor_perf") @@ -52,184 +51,13 @@ MODULE_LICENSE("GPL"); -static struct acpi_processor_performance *performance; - - -static int -acpi_processor_get_performance_control ( - struct acpi_processor_performance *perf) -{ - int result = 0; - acpi_status status = 0; - struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; - union acpi_object *pct = NULL; - union acpi_object obj = {0}; - struct acpi_pct_register *reg = NULL; - - ACPI_FUNCTION_TRACE("acpi_processor_get_performance_control"); - - status = acpi_evaluate_object(perf->pr->handle, "_PCT", NULL, &buffer); - if(ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PCT\n")); - return_VALUE(-ENODEV); - } - - pct = (union acpi_object *) buffer.pointer; - if (!pct || (pct->type != ACPI_TYPE_PACKAGE) - || (pct->package.count != 2)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PCT data\n")); - result = -EFAULT; - goto end; - } - - /* - * control_register - */ - - obj = pct->package.elements[0]; - - if ((obj.type != ACPI_TYPE_BUFFER) - || (obj.buffer.length < sizeof(struct acpi_pct_register)) - || (obj.buffer.pointer == NULL)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Invalid _PCT data (control_register)\n")); - result = -EFAULT; - goto end; - } - - reg = (struct acpi_pct_register *) (obj.buffer.pointer); - - if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Unsupported address space [%d] (control_register)\n", - (u32) reg->space_id)); - result = -EFAULT; - goto end; - } - - perf->control_register = (u16) reg->address; - perf->control_register_bit_width = reg->bit_width; - /* - * status_register - */ - - obj = pct->package.elements[1]; - - if ((obj.type != ACPI_TYPE_BUFFER) - || (obj.buffer.length < sizeof(struct acpi_pct_register)) - || (obj.buffer.pointer == NULL)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Invalid _PCT data (status_register)\n")); - result = -EFAULT; - goto end; - } - - reg = (struct acpi_pct_register *) (obj.buffer.pointer); - - if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Unsupported address space [%d] (status_register)\n", - (u32) reg->space_id)); - result = -EFAULT; - goto end; - } - - perf->status_register = (u16) reg->address; - perf->status_register_bit_width = reg->bit_width; - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "control_register[0x%04x] status_register[0x%04x]\n", - perf->control_register, - perf->status_register)); - -end: - acpi_os_free(buffer.pointer); - - return_VALUE(result); -} - - -static int -acpi_processor_get_performance_states ( - struct acpi_processor_performance * perf) -{ - int result = 0; - acpi_status status = AE_OK; - struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; - struct acpi_buffer format = {sizeof("NNNNNN"), "NNNNNN"}; - struct acpi_buffer state = {0, NULL}; - union acpi_object *pss = NULL; - int i = 0; - - ACPI_FUNCTION_TRACE("acpi_processor_get_performance_states"); - - status = acpi_evaluate_object(perf->pr->handle, "_PSS", NULL, &buffer); - if(ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PSS\n")); - return_VALUE(-ENODEV); - } - - pss = (union acpi_object *) buffer.pointer; - if (!pss || (pss->type != ACPI_TYPE_PACKAGE)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data\n")); - result = -EFAULT; - goto end; - } - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d performance states\n", - pss->package.count)); - - if (pss->package.count > ACPI_PROCESSOR_MAX_PERFORMANCE) { - perf->state_count = ACPI_PROCESSOR_MAX_PERFORMANCE; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Limiting number of states to max (%d)\n", - ACPI_PROCESSOR_MAX_PERFORMANCE)); - } - else - perf->state_count = pss->package.count; - - if (perf->state_count > 1) - perf->pr->flags.performance = 1; - - for (i = 0; i < perf->state_count; i++) { - - struct acpi_processor_px *px = &(perf->states[i]); - - state.length = sizeof(struct acpi_processor_px); - state.pointer = px; - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Extracting state %d\n", i)); - - status = acpi_extract_package(&(pss->package.elements[i]), - &format, &state); - if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data\n")); - result = -EFAULT; - goto end; - } - - if (!px->core_frequency) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data: freq is zero\n")); - result = -EFAULT; - goto end; - } - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "State [%d]: core_frequency[%d] power[%d] transition_latency[%d] bus_master_latency[%d] control[0x%x] status[0x%x]\n", - i, - (u32) px->core_frequency, - (u32) px->power, - (u32) px->transition_latency, - (u32) px->bus_master_latency, - (u32) px->control, - (u32) px->status)); - } +struct cpufreq_acpi_io { + struct acpi_processor_performance acpi_data; + struct cpufreq_frequency_table *freq_table; +}; -end: - acpi_os_free(buffer.pointer); +static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS]; - return_VALUE(result); -} static int acpi_processor_write_port( @@ -270,7 +98,8 @@ static int acpi_processor_set_performance ( - struct acpi_processor_performance *perf, + struct cpufreq_acpi_io *data, + unsigned int cpu, int state) { u16 port = 0; @@ -282,38 +111,19 @@ ACPI_FUNCTION_TRACE("acpi_processor_set_performance"); - if (!perf || !perf->pr) - return_VALUE(-EINVAL); - - if (!perf->pr->flags.performance) - return_VALUE(-ENODEV); - - if (state >= perf->state_count) { - ACPI_DEBUG_PRINT((ACPI_DB_WARN, - "Invalid target state (P%d)\n", state)); - return_VALUE(-ENODEV); - } - - if (state < perf->pr->performance_platform_limit) { - ACPI_DEBUG_PRINT((ACPI_DB_WARN, - "Platform limit (P%d) overrides target state (P%d)\n", - perf->pr->performance_platform_limit, state)); - return_VALUE(-ENODEV); - } - - if (state == perf->state) { + if (state == data->acpi_data.state) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Already at target state (P%d)\n", state)); return_VALUE(0); } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n", - perf->state, state)); + data->acpi_data.state, state)); /* cpufreq frequency struct */ - cpufreq_freqs.cpu = perf->pr->id; - cpufreq_freqs.old = perf->states[perf->state].core_frequency; - cpufreq_freqs.new = perf->states[state].core_frequency; + cpufreq_freqs.cpu = cpu; + cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency; + cpufreq_freqs.new = data->freq_table[state].frequency; /* notify cpufreq */ cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); @@ -323,9 +133,9 @@ * control_register. */ - port = perf->control_register; - bit_width = perf->control_register_bit_width; - value = (u32) perf->states[state].control; + port = data->acpi_data.control_register.address; + bit_width = data->acpi_data.control_register.bit_width; + value = (u32) data->acpi_data.states[state].control; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Writing 0x%08x to port 0x%04x\n", value, port)); @@ -344,12 +154,12 @@ * giving up. */ - port = perf->status_register; - bit_width = perf->status_register_bit_width; + port = data->acpi_data.status_register.address; + bit_width = data->acpi_data.status_register.bit_width; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Looking for 0x%08x from port 0x%04x\n", - (u32) perf->states[state].status, port)); + (u32) data->acpi_data.states[state].status, port)); for (i=0; i<100; i++) { ret = acpi_processor_read_port(port, bit_width, &value); @@ -358,7 +168,7 @@ "Invalid port width 0x%04x\n", bit_width)); return_VALUE(ret); } - if (value == (u32) perf->states[state].status) + if (value == (u32) data->acpi_data.states[state].status) break; udelay(10); } @@ -366,7 +176,7 @@ /* notify cpufreq */ cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); - if (value != (u32) perf->states[state].status) { + if (value != (u32) data->acpi_data.states[state].status) { unsigned int tmp = cpufreq_freqs.new; cpufreq_freqs.new = cpufreq_freqs.old; cpufreq_freqs.old = tmp; @@ -380,169 +190,33 @@ "Transition successful after %d microseconds\n", i * 10)); - perf->state = state; + data->acpi_data.state = state; return_VALUE(0); } -#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF -/* /proc/acpi/processor/../performance interface (DEPRECATED) */ - -static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file); -static struct file_operations acpi_processor_perf_fops = { - .open = acpi_processor_perf_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int acpi_processor_perf_seq_show(struct seq_file *seq, void *offset) -{ - struct acpi_processor *pr = (struct acpi_processor *)seq->private; - int i = 0; - - ACPI_FUNCTION_TRACE("acpi_processor_perf_seq_show"); - - if (!pr) - goto end; - - if (!pr->flags.performance || !pr->performance) { - seq_puts(seq, "\n"); - goto end; - } - - seq_printf(seq, "state count: %d\n" - "active state: P%d\n", - pr->performance->state_count, - pr->performance->state); - - seq_puts(seq, "states:\n"); - for (i = 0; i < pr->performance->state_count; i++) - seq_printf(seq, " %cP%d: %d MHz, %d mW, %d uS\n", - (i == pr->performance->state?'*':' '), i, - (u32) pr->performance->states[i].core_frequency, - (u32) pr->performance->states[i].power, - (u32) pr->performance->states[i].transition_latency); - -end: - return 0; -} - -static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, acpi_processor_perf_seq_show, - PDE(inode)->data); -} - -static int -acpi_processor_write_performance ( - struct file *file, - const char __user *buffer, - size_t count, - loff_t *data) -{ - int result = 0; - struct acpi_processor *pr = (struct acpi_processor *) data; - char state_string[12] = {'\0'}; - unsigned int new_state = 0; - struct cpufreq_policy policy; - - ACPI_FUNCTION_TRACE("acpi_processor_write_performance"); - - if (!pr || !pr->performance || (count > sizeof(state_string) - 1)) - return_VALUE(-EINVAL); - - if (copy_from_user(state_string, buffer, count)) - return_VALUE(-EFAULT); - - state_string[count] = '\0'; - new_state = simple_strtoul(state_string, NULL, 0); - - cpufreq_get_policy(&policy, pr->id); - - policy.cpu = pr->id; - policy.max = pr->performance->states[new_state].core_frequency * 1000; - - result = cpufreq_set_policy(&policy); - if (result) - return_VALUE(result); - - return_VALUE(count); -} - -static void -acpi_cpufreq_add_file ( - struct acpi_processor *pr) -{ - struct proc_dir_entry *entry = NULL; - struct acpi_device *device = NULL; - - ACPI_FUNCTION_TRACE("acpi_cpufreq_addfile"); - - if (acpi_bus_get_device(pr->handle, &device)) - return_VOID; - - /* add file 'performance' [R/W] */ - entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, - S_IFREG|S_IRUGO|S_IWUSR, acpi_device_dir(device)); - if (!entry) - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Unable to create '%s' fs entry\n", - ACPI_PROCESSOR_FILE_PERFORMANCE)); - else { - entry->proc_fops = &acpi_processor_perf_fops; - entry->proc_fops->write = acpi_processor_write_performance; - entry->data = acpi_driver_data(device); - } - return_VOID; -} - -static void -acpi_cpufreq_remove_file ( - struct acpi_processor *pr) -{ - struct acpi_device *device = NULL; - - ACPI_FUNCTION_TRACE("acpi_cpufreq_addfile"); - - if (acpi_bus_get_device(pr->handle, &device)) - return_VOID; - - /* remove file 'performance' */ - remove_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, - acpi_device_dir(device)); - - return_VOID; -} - -#else -static void acpi_cpufreq_add_file (struct acpi_processor *pr) { return; } -static void acpi_cpufreq_remove_file (struct acpi_processor *pr) { return; } -#endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */ - - static int acpi_cpufreq_target ( struct cpufreq_policy *policy, unsigned int target_freq, unsigned int relation) { - struct acpi_processor_performance *perf = &performance[policy->cpu]; + struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; unsigned int next_state = 0; unsigned int result = 0; ACPI_FUNCTION_TRACE("acpi_cpufreq_setpolicy"); - result = cpufreq_frequency_table_target(policy, - &perf->freq_table[perf->pr->limit.state.px], + result = cpufreq_frequency_table_target(policy, + data->freq_table, target_freq, relation, &next_state); if (result) return_VALUE(result); - result = acpi_processor_set_performance (perf, next_state); + result = acpi_processor_set_performance (data, policy->cpu, next_state); return_VALUE(result); } @@ -553,119 +227,110 @@ struct cpufreq_policy *policy) { unsigned int result = 0; - struct acpi_processor_performance *perf = &performance[policy->cpu]; + struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; ACPI_FUNCTION_TRACE("acpi_cpufreq_verify"); result = cpufreq_frequency_table_verify(policy, - &perf->freq_table[perf->pr->limit.state.px]); - - cpufreq_verify_within_limits( - policy, - perf->states[perf->state_count - 1].core_frequency * 1000, - perf->states[perf->pr->limit.state.px].core_frequency * 1000); + data->freq_table); return_VALUE(result); } static int -acpi_processor_get_performance_info ( - struct acpi_processor_performance *perf) -{ - int result = 0; - acpi_status status = AE_OK; - acpi_handle handle = NULL; - - ACPI_FUNCTION_TRACE("acpi_processor_get_performance_info"); - - if (!perf || !perf->pr || !perf->pr->handle) - return_VALUE(-EINVAL); - - status = acpi_get_handle(perf->pr->handle, "_PCT", &handle); - if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "ACPI-based processor performance control unavailable\n")); - return_VALUE(-ENODEV); - } - - result = acpi_processor_get_performance_control(perf); - if (result) - return_VALUE(result); - - result = acpi_processor_get_performance_states(perf); - if (result) - return_VALUE(result); - - result = acpi_processor_get_platform_limit(perf->pr); - if (result) - return_VALUE(result); - - return_VALUE(0); -} - - -static int acpi_cpufreq_cpu_init ( struct cpufreq_policy *policy) { unsigned int i; unsigned int cpu = policy->cpu; - struct acpi_processor *pr = NULL; - struct acpi_processor_performance *perf = &performance[policy->cpu]; - struct acpi_device *device; + struct cpufreq_acpi_io *data; unsigned int result = 0; ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init"); - acpi_processor_register_performance(perf, &pr, cpu); + data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); + if (!data) + return_VALUE(-ENOMEM); + memset(data, 0, sizeof(struct cpufreq_acpi_io)); - pr = performance[cpu].pr; - if (!pr) - return_VALUE(-ENODEV); + acpi_io_data[cpu] = data; - result = acpi_processor_get_performance_info(perf); + result = acpi_processor_register_performance(&data->acpi_data, cpu); if (result) - return_VALUE(-ENODEV); + goto err_free; /* capability check */ - if (!pr->flags.performance) - return_VALUE(-ENODEV); + if (data->acpi_data.state_count <= 1) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No P-States\n")); + result = -ENODEV; + goto err_unreg; + } + if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) || + (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unsupported address space [%d, %d]\n", + (u32) (data->acpi_data.control_register.space_id), + (u32) (data->acpi_data.status_register.space_id))); + result = -ENODEV; + goto err_unreg; + } + + /* alloc freq_table */ + data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (data->acpi_data.state_count + 1), GFP_KERNEL); + if (!data->freq_table) { + result = -ENOMEM; + goto err_unreg; + } /* detect transition latency */ policy->cpuinfo.transition_latency = 0; - for (i=0;istate_count;i++) { - if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency) - policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000; + for (i=0; iacpi_data.state_count; i++) { + if ((data->acpi_data.states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency) + policy->cpuinfo.transition_latency = data->acpi_data.states[i].transition_latency * 1000; } policy->governor = CPUFREQ_DEFAULT_GOVERNOR; - policy->cur = perf->states[pr->limit.state.px].core_frequency * 1000; + + /* + * The current speed is unknown and not detectable by ACPI... argh! Assume + * it's P0, it will be set to this value later during initialization. + */ + policy->cur = data->acpi_data.states[0].core_frequency * 1000; /* table init */ - for (i=0; i<=perf->state_count; i++) + for (i=0; i<=data->acpi_data.state_count; i++) { - perf->freq_table[i].index = i; - if (istate_count) - perf->freq_table[i].frequency = perf->states[i].core_frequency * 1000; + data->freq_table[i].index = i; + if (iacpi_data.state_count) + data->freq_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; else - perf->freq_table[i].frequency = CPUFREQ_TABLE_END; + data->freq_table[i].frequency = CPUFREQ_TABLE_END; } - result = cpufreq_frequency_table_cpuinfo(policy, &perf->freq_table[0]); - - acpi_cpufreq_add_file(pr); - - if (acpi_bus_get_device(pr->handle, &device)) - device = NULL; + result = cpufreq_frequency_table_cpuinfo(policy, &data->freq_table[0]); + if (result) { + goto err_freqfree; + } - printk(KERN_INFO "cpufreq: %s - ACPI performance management activated.\n", - device ? acpi_device_bid(device) : "CPU??"); - for (i = 0; i < pr->performance->state_count; i++) + + printk(KERN_INFO "cpufreq: CPU%u - ACPI performance management activated.\n", + cpu); + for (i = 0; i < data->acpi_data.state_count; i++) printk(KERN_INFO "cpufreq: %cP%d: %d MHz, %d mW, %d uS\n", - (i == pr->performance->state?'*':' '), i, - (u32) pr->performance->states[i].core_frequency, - (u32) pr->performance->states[i].power, - (u32) pr->performance->states[i].transition_latency); + (i == data->acpi_data.state?'*':' '), i, + (u32) data->acpi_data.states[i].core_frequency, + (u32) data->acpi_data.states[i].power, + (u32) data->acpi_data.states[i].transition_latency); + + return_VALUE(result); + + err_freqfree: + kfree(data->freq_table); + err_unreg: + acpi_processor_unregister_performance(&data->acpi_data, cpu); + err_free: + kfree(data); + acpi_io_data[cpu] = NULL; + return_VALUE(result); } @@ -674,11 +339,16 @@ acpi_cpufreq_cpu_exit ( struct cpufreq_policy *policy) { - struct acpi_processor *pr = performance[policy->cpu].pr; + struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; + ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_exit"); - acpi_cpufreq_remove_file(pr); + if (data) { + acpi_io_data[policy->cpu] = NULL; + acpi_processor_unregister_performance(&data->acpi_data, policy->cpu); + kfree(data); + } return_VALUE(0); } @@ -698,97 +368,11 @@ acpi_cpufreq_init (void) { int result = 0; - int current_state = 0; - int i = 0; - struct acpi_processor *pr = NULL; - struct acpi_processor_performance *perf = NULL; ACPI_FUNCTION_TRACE("acpi_cpufreq_init"); - /* alloc memory */ - if (performance) - return_VALUE(-EBUSY); - - performance = kmalloc(NR_CPUS * sizeof(struct acpi_processor_performance), GFP_KERNEL); - if (!performance) - return_VALUE(-ENOMEM); - memset(performance, 0, NR_CPUS * sizeof(struct acpi_processor_performance)); - - /* register struct acpi_processor_performance performance */ - for (i=0; iflags.performance) - goto found_capable_cpu; - } - result = -ENODEV; - goto err0; - - found_capable_cpu: - result = cpufreq_register_driver(&acpi_cpufreq_driver); - if (result) - goto err0; - perf = pr->performance; - current_state = perf->state; - - if (current_state == pr->limit.state.px) { - result = acpi_processor_set_performance(perf, (perf->state_count - 1)); - if (result) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); - result = -ENODEV; - goto err1; - } - } - - result = acpi_processor_set_performance(perf, pr->limit.state.px); - if (result) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); - result = -ENODEV; - goto err1; - } - - if (current_state != 0) { - result = acpi_processor_set_performance(perf, current_state); - if (result) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); - result = -ENODEV; - goto err1; - } - } - - return_VALUE(0); - - /* error handling */ - err1: - cpufreq_unregister_driver(&acpi_cpufreq_driver); - - err0: - /* unregister struct acpi_processor_performance performance */ - for (i=0; iflags.performance = 0; - performance[i].pr->performance = NULL; - performance[i].pr = NULL; - } - } - kfree(performance); - - printk(KERN_INFO "cpufreq: No CPUs supporting ACPI performance management found.\n"); return_VALUE(result); } @@ -796,27 +380,9 @@ static void __exit acpi_cpufreq_exit (void) { - int i = 0; - ACPI_FUNCTION_TRACE("acpi_cpufreq_exit"); - for (i=0; iflags.performance = 0; - } - - cpufreq_unregister_driver(&acpi_cpufreq_driver); - - /* unregister struct acpi_processor_performance performance */ - for (i=0; iflags.performance = 0; - performance[i].pr->performance = NULL; - performance[i].pr = NULL; - } - } - - kfree(performance); + cpufreq_unregister_driver(&acpi_cpufreq_driver); return_VOID; } diff -Nru a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c --- a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c Tue Feb 17 20:00:07 2004 +++ b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c Tue Feb 17 20:00:07 2004 @@ -28,30 +28,34 @@ * with 'Suspend Modulation OFF Count Register' * and 'Suspend Modulation ON Count Register'. * These registers are 8bit counters that represent the number of - * 32us intervals which the SUSP# pin is asserted/de-asserted to the - * processor. + * 32us intervals which the SUSP# pin is asserted(ON)/de-asserted(OFF) + * to the processor. * * These counters define a ratio which is the effective frequency * of operation of the system. * - * On Count + * OFF Count * F_eff = Fgx * ---------------------- - * On Count + Off Count + * OFF Count + ON Count * * 0 <= On Count, Off Count <= 255 * * From these limits, we can get register values * - * on_duration + off_duration <= MAX_DURATION - * off_duration = on_duration * (stock_freq - freq) / freq + * off_duration + on_duration <= MAX_DURATION + * on_duration = off_duration * (stock_freq - freq) / freq * - * on_duration = (freq * DURATION) / stock_freq - * off_duration = DURATION - on_duration + * off_duration = (freq * DURATION) / stock_freq + * on_duration = DURATION - off_duration * * *--------------------------------------------------------------------------- * * ChangeLog: + * Dec. 12, 2003 Hiroshi Miura + * - fix on/off register mistake + * - fix cpu_khz calc when it stops cpu modulation. + * * Dec. 11, 2002 Hiroshi Miura * - rewrite for Cyrix MediaGX Cx5510/5520 and * NatSemi Geode Cs5530(A). @@ -233,13 +237,13 @@ int old_tmp_freq = stock_freq; int tmp_freq; - *on_duration=1; - *off_duration=0; + *off_duration=1; + *on_duration=0; for (i=max_duration; i>0; i--) { - tmp_on = ((khz * i) / stock_freq) & 0xff; - tmp_off = i - tmp_on; - tmp_freq = (stock_freq * tmp_on) / i; + tmp_off = ((khz * i) / stock_freq) & 0xff; + tmp_on = i - tmp_off; + tmp_freq = (stock_freq * tmp_off) / i; /* if this relation is closer to khz, use this. If it's equal, * prefer it, too - lower latency */ if (abs(tmp_freq - khz) <= abs(old_tmp_freq - khz)) { @@ -273,42 +277,37 @@ freqs.new = new_khz; - if (new_khz == stock_freq) { /* if new khz == 100% of CPU speed, it is special case */ - local_irq_save(flags); - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, (gx_params->pci_suscfg & ~(SUSMOD))); - pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &(gx_params->pci_suscfg)); - local_irq_restore(flags); - dprintk("suspend modulation disabled: cpu runs 100 percent speed.\n"); - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - return; - } - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); - local_irq_save(flags); - switch (gx_params->cs55x0->device) { - case PCI_DEVICE_ID_CYRIX_5530_LEGACY: - pmer1 = gx_params->pci_pmer1 | IRQ_SPDUP | VID_SPDUP; - /* FIXME: need to test other values -- Zwane,Miura */ - pci_write_config_byte(gx_params->cs55x0, PCI_IRQTC, 4); /* typical 2 to 4ms */ - pci_write_config_byte(gx_params->cs55x0, PCI_VIDTC, 100);/* typical 50 to 100ms */ - pci_write_config_byte(gx_params->cs55x0, PCI_PMER1, pmer1); - if (gx_params->pci_rev < 0x10) { /* CS5530(rev 1.2, 1.3) */ + if (new_khz != stock_freq) { /* if new khz == 100% of CPU speed, it is special case */ + switch (gx_params->cs55x0->device) { + case PCI_DEVICE_ID_CYRIX_5530_LEGACY: + pmer1 = gx_params->pci_pmer1 | IRQ_SPDUP | VID_SPDUP; + /* FIXME: need to test other values -- Zwane,Miura */ + pci_write_config_byte(gx_params->cs55x0, PCI_IRQTC, 4); /* typical 2 to 4ms */ + pci_write_config_byte(gx_params->cs55x0, PCI_VIDTC, 100);/* typical 50 to 100ms */ + pci_write_config_byte(gx_params->cs55x0, PCI_PMER1, pmer1); + + if (gx_params->pci_rev < 0x10) { /* CS5530(rev 1.2, 1.3) */ + suscfg = gx_params->pci_suscfg | SUSMOD; + } else { /* CS5530A,B.. */ + suscfg = gx_params->pci_suscfg | SUSMOD | PWRSVE; + } + break; + case PCI_DEVICE_ID_CYRIX_5520: + case PCI_DEVICE_ID_CYRIX_5510: suscfg = gx_params->pci_suscfg | SUSMOD; - } else { /* CS5530A,B.. */ - suscfg = gx_params->pci_suscfg | SUSMOD | PWRSVE; + default: + local_irq_restore(flags); + dprintk("fatal: try to set unknown chipset.\n"); + return; } - break; - case PCI_DEVICE_ID_CYRIX_5520: - case PCI_DEVICE_ID_CYRIX_5510: - suscfg = gx_params->pci_suscfg | SUSMOD; - break; - default: - local_irq_restore(flags); - dprintk("fatal: try to set unknown chipset.\n"); - return; + } else { + suscfg = gx_params->pci_suscfg & ~(SUSMOD); + gx_params->off_duration = 0; + gx_params->on_duration = 0; + dprintk("suspend modulation disabled: cpu runs 100 percent speed.\n"); } pci_write_config_byte(gx_params->cs55x0, PCI_MODOFF, gx_params->off_duration); diff -Nru a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c Tue Feb 17 20:00:05 2004 +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c Tue Feb 17 20:00:05 2004 @@ -63,11 +63,12 @@ static unsigned int calc_speed (int mult, int fsb) { - int mhz; - mhz = (mult/10)*fsb; + int khz; + khz = (mult/10)*fsb; if (mult%10) - mhz += fsb/2; - return mhz; + khz += fsb/2; + khz *= 1000; + return khz; } @@ -253,7 +254,7 @@ highest_speed = calc_speed (maxmult, fsb); lowest_speed = calc_speed (minmult,fsb); dprintk (KERN_INFO PFX "FSB: %dMHz Lowestspeed=%dMHz Highestspeed=%dMHz\n", - fsb, lowest_speed, highest_speed); + fsb, lowest_speed/1000, highest_speed/1000); longhaul_table = kmalloc((numscales + 1) * sizeof(struct cpufreq_frequency_table), GFP_KERNEL); if(!longhaul_table) @@ -267,7 +268,7 @@ if (ratio > maxmult || ratio < minmult) continue; longhaul_table[k].frequency = calc_speed (ratio, fsb); - longhaul_table[k].index = (j << 8); + longhaul_table[k].index = j; k++; } diff -Nru a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c --- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c Tue Feb 17 20:00:08 2004 @@ -246,7 +246,7 @@ static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy) { cpufreq_frequency_table_put_attr(policy->cpu); - return cpufreq_p4_setdc(policy->cpu, DC_DISABLE); + return 0; } static struct freq_attr* p4clockmod_attr[] = { diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c --- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c Tue Feb 17 20:00:05 2004 +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c Tue Feb 17 20:00:05 2004 @@ -91,17 +91,12 @@ struct cpuinfo_x86 *c = cpu_data; unsigned int maxei, eax, ebx, ecx, edx; - if (c->x86_vendor != X86_VENDOR_AMD) { - printk (KERN_INFO PFX "AMD processor not detected.\n"); - return 0; - } - - if (c->x86 !=6) { + if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 !=6)) { +#ifdef MODULE printk (KERN_INFO PFX "This module only works with AMD K7 CPUs\n"); +#endif return 0; } - - printk (KERN_INFO PFX "AMD K7 CPU detected.\n"); if ((c->x86_model == 6) && (c->x86_mask == 0)) { printk (KERN_INFO PFX "K7 660[A0] core detected, enabling errata workarounds\n"); diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c Tue Feb 17 20:00:07 2004 +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c Tue Feb 17 20:00:07 2004 @@ -31,7 +31,7 @@ #define PFX "powernow-k8: " #define BFX PFX "BIOS error: " -#define VERSION "version 1.00.08 - September 26, 2003" +#define VERSION "version 1.00.08a" #include "powernow-k8.h" #ifdef CONFIG_PREEMPT @@ -44,10 +44,11 @@ static u32 rvo; /* ramp voltage offset, from PSB */ static u32 irt; /* isochronous relief time, from PSB */ static u32 vidmvs; /* usable value calculated from mvs, from PSB */ -struct pst_s *ppst; /* array of p states, valid for this part */ static u32 currvid; /* keep track of the current fid / vid */ static u32 currfid; +static struct cpufreq_frequency_table *powernow_table; + /* The PSB table supplied by BIOS allows for the definition of the number of p-states that can be used when running on a/c, and the number of p-states @@ -71,30 +72,12 @@ static u32 batps; /* limit on the number of p states when on battery */ /* - set by BIOS in the PSB/PST */ -static struct cpufreq_driver cpufreq_amd64_driver = { - .verify = powernowk8_verify, - .target = powernowk8_target, - .init = powernowk8_cpu_init, - .name = "cpufreq-amd64", - .owner = THIS_MODULE, -}; - -#define SEARCH_UP 1 -#define SEARCH_DOWN 0 - -/* Return a frequency in MHz, given an input fid */ -u32 -find_freq_from_fid(u32 fid) + /* Return a frequency in MHz, given an input fid */ +static u32 find_freq_from_fid(u32 fid) { - return 800 + (fid * 100); + return 800 + (fid * 100); } -/* Return a fid matching an input frequency in MHz */ -static u32 -find_fid_from_freq(u32 freq) -{ - return (freq - 800) / 100; -} /* Return the vco fid for an input fid */ static u32 @@ -107,56 +90,27 @@ } } -/* Sort the fid/vid frequency table into ascending order by fid. The spec */ -/* implies that it will be sorted by BIOS, but, it only implies it, and I */ -/* prefer not to trust when I can check. */ -/* Yes, it is a simple bubble sort, but the PST is really small, so the */ -/* choice of algorithm is pretty irrelevant. */ -static inline void -sort_pst(struct pst_s *ppst, u32 numpstates) -{ - u32 i; - u8 tempfid; - u8 tempvid; - int swaps = 1; - - while (swaps) { - swaps = 0; - for (i = 0; i < (numpstates - 1); i++) { - if (ppst[i].fid > ppst[i + 1].fid) { - swaps = 1; - tempfid = ppst[i].fid; - tempvid = ppst[i].vid; - ppst[i].fid = ppst[i + 1].fid; - ppst[i].vid = ppst[i + 1].vid; - ppst[i + 1].fid = tempfid; - ppst[i + 1].vid = tempvid; - } - } - } - - return; -} - -/* Return 1 if the pending bit is set. Unless we are actually just told the */ -/* processor to transition a state, seeing this bit set is really bad news. */ +/* + * Return 1 if the pending bit is set. Unless we are actually just told the + * processor to transition a state, seeing this bit set is really bad news. + */ static inline int pending_bit_stuck(void) { - u32 lo; - u32 hi; + u32 lo, hi; rdmsr(MSR_FIDVID_STATUS, lo, hi); return lo & MSR_S_LO_CHANGE_PENDING ? 1 : 0; } -/* Update the global current fid / vid values from the status msr. Returns 1 */ -/* on error. */ +/* + * Update the global current fid / vid values from the status msr. Returns 1 + * on error. + */ static int query_current_values_with_pending_wait(void) { - u32 lo; - u32 hi; + u32 lo, hi; u32 i = 0; lo = MSR_S_LO_CHANGE_PENDING; @@ -271,9 +225,11 @@ return 0; } -/* Reduce the vid by the max of step or reqvid. */ -/* Decreasing vid codes represent increasing voltages : */ -/* vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off. */ +/* + * Reduce the vid by the max of step or reqvid. + * Decreasing vid codes represent increasing voltages: + * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off. + */ static int decrease_vid_code_by_step(u32 reqvid, u32 step) { @@ -316,8 +272,10 @@ return 0; } -/* Phase 1 - core voltage transition ... setup appropriate voltage for the */ -/* fid transition. */ +/* + * Phase 1 - core voltage transition ... setup appropriate voltage for the + * fid transition. + */ static inline int core_voltage_pre_transition(u32 reqvid) { @@ -500,7 +458,9 @@ } if (c->x86_vendor != X86_VENDOR_AMD) { +#ifdef MODULE printk(KERN_INFO PFX "Not an AMD processor\n"); +#endif return 0; } @@ -533,20 +493,59 @@ return 0; } - printk(KERN_INFO PFX "Found AMD Athlon 64 / Opteron processor " - "supporting p-state transitions\n"); - + printk(KERN_INFO PFX "Found AMD64 processor supporting PowerNow (" VERSION ")\n"); return 1; } +static int check_pst_table(struct pst_s *pst, u8 maxvid) +{ + unsigned int j; + u8 lastfid = 0xFF; + + for (j = 0; j < numps; j++) { + if (pst[j].vid > LEAST_VID) { + printk(KERN_ERR PFX "vid %d invalid : 0x%x\n", j, pst[j].vid); + return -EINVAL; + } + if (pst[j].vid < rvo) { /* vid + rvo >= 0 */ + printk(KERN_ERR PFX + "BIOS error - 0 vid exceeded with pstate %d\n", + j); + return -ENODEV; + } + if (pst[j].vid < maxvid + rvo) { /* vid + rvo >= maxvid */ + printk(KERN_ERR PFX + "BIOS error - maxvid exceeded with pstate %d\n", + j); + return -ENODEV; + } + if ((pst[j].fid > MAX_FID) + || (pst[j].fid & 1) + || (pst[j].fid < HI_FID_TABLE_BOTTOM)){ + printk(KERN_ERR PFX "fid %d invalid : 0x%x\n", j, pst[j].fid); + return -EINVAL; + } + if (pst[j].fid < lastfid) + lastfid = pst[j].fid; + } + if (lastfid & 1) { + printk(KERN_ERR PFX "lastfid invalid\n"); + return -EINVAL; + } + if (lastfid > LO_FID_TABLE_TOP) { + printk(KERN_INFO PFX "first fid not from lo freq table\n"); + } + + return 0; +} + /* Find and validate the PSB/PST table in BIOS. */ static inline int find_psb_table(void) { struct psb_s *psb; struct pst_s *pst; - unsigned i, j; - u32 lastfid; + unsigned int i, j; u32 mvs; u8 maxvid; @@ -573,33 +572,19 @@ } vstable = psb->voltagestabilizationtime; - printk(KERN_INFO PFX "voltage stable time: %d (units 20us)\n", - vstable); - dprintk(KERN_DEBUG PFX "flags2: 0x%x\n", psb->flags2); rvo = psb->flags2 & 3; irt = ((psb->flags2) >> 2) & 3; mvs = ((psb->flags2) >> 4) & 3; vidmvs = 1 << mvs; batps = ((psb->flags2) >> 6) & 3; - printk(KERN_INFO PFX "p states on battery: %d ", batps); - switch (batps) { - case 0: - printk("- all available\n"); - break; - case 1: - printk("- only the minimum\n"); - break; - case 2: - printk("- only the 2 lowest\n"); - break; - case 3: - printk("- only the 3 lowest\n"); - break; - } - printk(KERN_INFO PFX "ramp voltage offset: %d\n", rvo); - printk(KERN_INFO PFX "isochronous relief time: %d\n", irt); - printk(KERN_INFO PFX "maximum voltage step: %d\n", mvs); + + printk(KERN_INFO PFX "voltage stable in %d usec", vstable * 20); + if (batps) + printk(", only %d lowest states on battery", batps); + printk(", ramp voltage offset: %d", rvo); + printk(", isochronous relief time: %d", irt); + printk(", maximum voltage step: %d\n", mvs); dprintk(KERN_DEBUG PFX "numpst: 0x%x\n", psb->numpst); if (psb->numpst != 1) { @@ -610,14 +595,13 @@ dprintk(KERN_DEBUG PFX "cpuid: 0x%x\n", psb->cpuid); plllock = psb->plllocktime; - printk(KERN_INFO PFX "pll lock time: 0x%x\n", plllock); + printk(KERN_INFO PFX "pll lock time: 0x%x, ", plllock); maxvid = psb->maxvid; - printk(KERN_INFO PFX "maxfid: 0x%x\n", psb->maxfid); - printk(KERN_INFO PFX "maxvid: 0x%x\n", maxvid); + printk("maxfid 0x%x (%d MHz), maxvid 0x%x\n", + psb->maxfid, find_freq_from_fid(psb->maxfid), maxvid); numps = psb->numpstates; - printk(KERN_INFO PFX "numpstates: 0x%x\n", numps); if (numps < 2) { printk(KERN_ERR BFX "no p states to transition\n"); return -ENODEV; @@ -636,78 +620,41 @@ "%d p-states\n", numps); } - if ((numps <= 1) || (batps <= 1)) { + if (numps <= 1) { printk(KERN_ERR PFX "only 1 p-state to transition\n"); return -ENODEV; } - ppst = kmalloc(sizeof (struct pst_s) * numps, GFP_KERNEL); - if (!ppst) { - printk(KERN_ERR PFX "ppst memory alloc failure\n"); - return -ENOMEM; - } - pst = (struct pst_s *) (psb + 1); - for (j = 0; j < numps; j++) { - ppst[j].fid = pst[j].fid; - ppst[j].vid = pst[j].vid; - printk(KERN_INFO PFX - " %d : fid 0x%x, vid 0x%x\n", j, - ppst[j].fid, ppst[j].vid); - } - sort_pst(ppst, numps); - - lastfid = ppst[0].fid; - if (lastfid > LO_FID_TABLE_TOP) - printk(KERN_INFO BFX "first fid not in lo freq tbl\n"); - - if ((lastfid > MAX_FID) || (lastfid & 1) || (ppst[0].vid > LEAST_VID)) { - printk(KERN_ERR BFX "first fid/vid bad (0x%x - 0x%x)\n", - lastfid, ppst[0].vid); - kfree(ppst); - return -ENODEV; - } + if (check_pst_table(pst, maxvid)) + return -EINVAL; - for (j = 1; j < numps; j++) { - if ((lastfid >= ppst[j].fid) - || (ppst[j].fid & 1) - || (ppst[j].fid < HI_FID_TABLE_BOTTOM) - || (ppst[j].fid > MAX_FID) - || (ppst[j].vid > LEAST_VID)) { - printk(KERN_ERR BFX - "invalid fid/vid in pst(%x %x)\n", - ppst[j].fid, ppst[j].vid); - kfree(ppst); - return -ENODEV; - } - lastfid = ppst[j].fid; + powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) * (numps + 1)), GFP_KERNEL); + if (!powernow_table) { + printk(KERN_ERR PFX "powernow_table memory alloc failure\n"); + return -ENOMEM; } for (j = 0; j < numps; j++) { - if (ppst[j].vid < rvo) { /* vid+rvo >= 0 */ - printk(KERN_ERR BFX - "0 vid exceeded with pstate %d\n", j); - kfree(ppst); - return -ENODEV; - } - if (ppst[j].vid < maxvid+rvo) { /* vid+rvo >= maxvid */ - printk(KERN_ERR BFX - "maxvid exceeded with pstate %d\n", j); - kfree(ppst); - return -ENODEV; - } + printk(KERN_INFO PFX " %d : fid 0x%x (%d MHz), vid 0x%x\n", j, + pst[j].fid, find_freq_from_fid(pst[j].fid), pst[j].vid); + powernow_table[j].index = pst[j].fid; /* lower 8 bits */ + powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */ + powernow_table[j].frequency = find_freq_from_fid(pst[j].fid); } + powernow_table[numps].frequency = CPUFREQ_TABLE_END; + powernow_table[numps].index = 0; if (query_current_values_with_pending_wait()) { - kfree(ppst); + kfree(powernow_table); return -EIO; } - printk(KERN_INFO PFX "currfid 0x%x, currvid 0x%x\n", - currfid, currvid); + printk(KERN_INFO PFX "currfid 0x%x (%d MHz), currvid 0x%x\n", + currfid, find_freq_from_fid(currfid), currvid); for (j = 0; j < numps; j++) - if ((ppst[j].fid==currfid) && (ppst[j].vid==currvid)) + if ((pst[j].fid==currfid) && (pst[j].vid==currvid)) return 0; printk(KERN_ERR BFX "currfid/vid do not match PST, ignoring\n"); @@ -718,112 +665,22 @@ return -ENODEV; } -/* Converts a frequency (that might not necessarily be a multiple of 200) */ -/* to a fid. */ -static u32 -find_closest_fid(u32 freq, int searchup) -{ - if (searchup == SEARCH_UP) - freq += MIN_FREQ_RESOLUTION - 1; - - freq = (freq / MIN_FREQ_RESOLUTION) * MIN_FREQ_RESOLUTION; - - if (freq < MIN_FREQ) - freq = MIN_FREQ; - else if (freq > MAX_FREQ) - freq = MAX_FREQ; - - return find_fid_from_freq(freq); -} - -static int -find_match(u32 * ptargfreq, u32 * pmin, u32 * pmax, int searchup, u32 * pfid, - u32 * pvid) -{ - u32 availpstates = batps; - u32 targfid = find_closest_fid(*ptargfreq, searchup); - u32 minfid = find_closest_fid(*pmin, SEARCH_DOWN); - u32 maxfid = find_closest_fid(*pmax, SEARCH_UP); - u32 minidx = 0; - u32 maxidx = availpstates - 1; - u32 targidx = 0xffffffff; - int i; - - dprintk(KERN_DEBUG PFX "find match: freq %d MHz, min %d, max %d\n", - *ptargfreq, *pmin, *pmax); - - /* Restrict values to the frequency choices in the PST */ - if (minfid < ppst[0].fid) - minfid = ppst[0].fid; - if (maxfid > ppst[maxidx].fid) - maxfid = ppst[maxidx].fid; - - /* Find appropriate PST index for the minimim fid */ - for (i = 0; i < (int) availpstates; i++) { - if (minfid >= ppst[i].fid) - minidx = i; - } - - /* Find appropriate PST index for the maximum fid */ - for (i = availpstates - 1; i >= 0; i--) { - if (maxfid <= ppst[i].fid) - maxidx = i; - } - - if (minidx > maxidx) - maxidx = minidx; - - /* Frequency ids are now constrained by limits matching PST entries */ - minfid = ppst[minidx].fid; - maxfid = ppst[maxidx].fid; - - /* Limit the target frequency to these limits */ - if (targfid < minfid) - targfid = minfid; - else if (targfid > maxfid) - targfid = maxfid; - - /* Find the best target index into the PST, contrained by the range */ - if (searchup == SEARCH_UP) { - for (i = maxidx; i >= (int) minidx; i--) { - if (targfid <= ppst[i].fid) - targidx = i; - } - } else { - for (i = minidx; i <= (int) maxidx; i++) { - if (targfid >= ppst[i].fid) - targidx = i; - } - } - - if (targidx == 0xffffffff) { - printk(KERN_ERR PFX "could not find target\n"); - return 1; - } - - *pmin = find_freq_from_fid(minfid); - *pmax = find_freq_from_fid(maxfid); - *ptargfreq = find_freq_from_fid(ppst[targidx].fid); - - if (pfid) - *pfid = ppst[targidx].fid; - if (pvid) - *pvid = ppst[targidx].vid; - - return 0; -} - /* Take a frequency, and issue the fid/vid transition command */ static inline int -transition_frequency(u32 * preq, u32 * pmin, u32 * pmax, u32 searchup) +transition_frequency(unsigned int index) { u32 fid; u32 vid; int res; struct cpufreq_freqs freqs; - if (find_match(preq, pmin, pmax, searchup, &fid, &vid)) - return 1; + /* fid are the lower 8 bits of the index we stored into + * the cpufreq frequency table in find_psb_table, vid are + * the upper 8 bits. + */ + + fid = powernow_table[index].index & 0xFF; + vid = (powernow_table[index].index & 0xFF00) >> 8; dprintk(KERN_DEBUG PFX "table matched fid 0x%x, giving vid 0x%x\n", fid, vid); @@ -867,14 +724,7 @@ { u32 checkfid = currfid; u32 checkvid = currvid; - u32 reqfreq = targfreq / 1000; - u32 minfreq = pol->min / 1000; - u32 maxfreq = pol->max / 1000; - - if (ppst == 0) { - printk(KERN_ERR PFX "targ: ppst 0\n"); - return -ENODEV; - } + unsigned int newstate; if (pending_bit_stuck()) { printk(KERN_ERR PFX "drv targ fail: change pending bit set\n"); @@ -896,9 +746,10 @@ checkfid, currfid, checkvid, currvid); } - if (transition_frequency(&reqfreq, &minfreq, &maxfreq, - relation == - CPUFREQ_RELATION_H ? SEARCH_UP : SEARCH_DOWN)) + if (cpufreq_frequency_table_target(pol, powernow_table, targfreq, relation, &newstate)) + return -EINVAL; + + if (transition_frequency(newstate)) { printk(KERN_ERR PFX "transition frequency failed\n"); return 1; @@ -913,36 +764,12 @@ static int powernowk8_verify(struct cpufreq_policy *pol) { - u32 min = pol->min / 1000; - u32 max = pol->max / 1000; - u32 targ = min; - int res; - - if (ppst == 0) { - printk(KERN_ERR PFX "verify - ppst 0\n"); - return -ENODEV; - } - if (pending_bit_stuck()) { printk(KERN_ERR PFX "failing verify, change pending bit set\n"); return -EIO; } - dprintk(KERN_DEBUG PFX - "ver: cpu%d, min %d, max %d, cur %d, pol %d\n", pol->cpu, - pol->min, pol->max, pol->cur, pol->policy); - - if (pol->cpu != 0) { - printk(KERN_ERR PFX "verify - cpu not 0\n"); - return -ENODEV; - } - - res = find_match(&targ, &min, &max, SEARCH_DOWN, 0, 0); - if (!res) { - pol->min = min * 1000; - pol->max = max * 1000; - } - return res; + return cpufreq_frequency_table_verify(pol, powernow_table); } /* per CPU init entry point to the driver */ @@ -968,10 +795,11 @@ dprintk(KERN_DEBUG PFX "policy current frequency %d kHz\n", pol->cur); /* min/max the cpu is capable of */ - pol->cpuinfo.min_freq = 1000 * find_freq_from_fid(ppst[0].fid); - pol->cpuinfo.max_freq = 1000 * find_freq_from_fid(ppst[numps-1].fid); - pol->min = 1000 * find_freq_from_fid(ppst[0].fid); - pol->max = 1000 * find_freq_from_fid(ppst[batps - 1].fid); + if (cpufreq_frequency_table_cpuinfo(pol, powernow_table)) { + printk(KERN_ERR PFX "invalid powernow_table\n"); + kfree(powernow_table); + return -EINVAL; + } printk(KERN_INFO PFX "cpu_init done, current fid 0x%x, vid 0x%x\n", currfid, currvid); @@ -979,14 +807,33 @@ return 0; } +static int __exit powernowk8_cpu_exit (struct cpufreq_policy *pol) +{ + if (pol->cpu != 0) + return -EINVAL; + + if (powernow_table) + kfree(powernow_table); + + return 0; +} + +static struct cpufreq_driver cpufreq_amd64_driver = { + .verify = powernowk8_verify, + .target = powernowk8_target, + .init = powernowk8_cpu_init, + .exit = powernowk8_cpu_exit, + .name = "powernow-k8", + .owner = THIS_MODULE, +}; + + /* driver entry point for init */ static int __init powernowk8_init(void) { int rc; - printk(KERN_INFO PFX VERSION "\n"); - if (check_supported_cpu() == 0) return -ENODEV; @@ -996,7 +843,6 @@ if (pending_bit_stuck()) { printk(KERN_ERR PFX "powernowk8_init fail, change pending bit set\n"); - kfree(ppst); return -EIO; } @@ -1010,7 +856,6 @@ dprintk(KERN_INFO PFX "powernowk8_exit\n"); cpufreq_unregister_driver(&cpufreq_amd64_driver); - kfree(ppst); } MODULE_AUTHOR("Paul Devriendt "); diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h Tue Feb 17 20:00:07 2004 +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h Tue Feb 17 20:00:07 2004 @@ -120,7 +120,3 @@ static inline int core_voltage_pre_transition(u32 reqvid); static inline int core_voltage_post_transition(u32 reqvid); static inline int core_frequency_transition(u32 reqfid); -static int powernowk8_verify(struct cpufreq_policy *pol); -static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, - unsigned relation); -static int __init powernowk8_cpu_init(struct cpufreq_policy *pol); diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c Tue Feb 17 20:00:08 2004 @@ -207,17 +207,55 @@ if (c->x86_model != 2) return 0; - if ((c->x86_mask != 4) && /* B-stepping [M-P4-M] */ - (c->x86_mask != 7) && /* C-stepping [M-P4-M] */ - (c->x86_mask != 9)) /* D-stepping [M-P4-M or M-P4/533] */ - return 0; - ebx = cpuid_ebx(0x00000001); ebx &= 0x000000FF; - if ((ebx != 0x0e) && (ebx != 0x0f)) - return 0; - return SPEEDSTEP_PROCESSOR_P4M; + dprintk(KERN_INFO "ebx value is %x, x86_mask is %x\n", ebx, c->86_mask); + + switch (c->x86_mask) { + case 4: + /* + * B-stepping [M-P4-M] + * sample has ebx = 0x0f, production has 0x0e. + */ + if ((ebx == 0x0e) || (ebx == 0x0f)) + return SPEEDSTEP_PROCESSOR_P4M; + break; + case 7: + /* + * C-stepping [M-P4-M] + * needs to have ebx=0x0e, else it's a celeron: + * cf. 25130917.pdf / page 7, footnote 5 even + * though 25072120.pdf / page 7 doesn't say + * samples are only of B-stepping... + */ + if (ebx == 0x0e) + return SPEEDSTEP_PROCESSOR_P4M; + break; + case 9: + /* + * D-stepping [M-P4-M or M-P4/533] + * + * this is totally strange: CPUID 0x0F29 is + * used by M-P4-M, M-P4/533 and(!) Celeron CPUs. + * The latter need to be sorted out as they don't + * support speedstep. + * Celerons with CPUID 0x0F29 may have either + * ebx=0x8 or 0xf -- 25130917.pdf doesn't say anything + * specific. + * M-P4-Ms may have either ebx=0xe or 0xf [see above] + * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] + * So, how to distinguish all those processors with + * ebx=0xf? I don't know. Sort them out, and wait + * for someone to complain. + */ + if (ebx == 0x0e) + return SPEEDSTEP_PROCESSOR_P4M; + break; + default: + break; + } + return 0; } switch (c->x86_model) { diff -Nru a/arch/i386/kernel/cpu/intel.c b/arch/i386/kernel/cpu/intel.c --- a/arch/i386/kernel/cpu/intel.c Tue Feb 17 20:00:06 2004 +++ b/arch/i386/kernel/cpu/intel.c Tue Feb 17 20:00:06 2004 @@ -296,12 +296,8 @@ } else if (smp_num_siblings > 1 ) { index_lsb = 0; index_msb = 31; - /* - * At this point we only support two siblings per - * processor package. - */ -#define NR_SIBLINGS 2 - if (smp_num_siblings != NR_SIBLINGS) { + + if (smp_num_siblings > NR_CPUS) { printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings); smp_num_siblings = 1; goto too_many_siblings; diff -Nru a/arch/i386/kernel/cpuid.c b/arch/i386/kernel/cpuid.c --- a/arch/i386/kernel/cpuid.c Tue Feb 17 20:00:05 2004 +++ b/arch/i386/kernel/cpuid.c Tue Feb 17 20:00:05 2004 @@ -1,4 +1,3 @@ -#ident "$Id$" /* ----------------------------------------------------------------------- * * * Copyright 2000 H. Peter Anvin - All Rights Reserved diff -Nru a/arch/i386/kernel/edd.c b/arch/i386/kernel/edd.c --- a/arch/i386/kernel/edd.c Tue Feb 17 20:00:06 2004 +++ b/arch/i386/kernel/edd.c Tue Feb 17 20:00:06 2004 @@ -2,6 +2,7 @@ * linux/arch/i386/kernel/edd.c * Copyright (C) 2002, 2003 Dell Inc. * by Matt Domsch + * disk80 signature by Matt Domsch, Andrew Wilks, and Sandeep K. Shandilya * * BIOS Enhanced Disk Drive Services (EDD) * conformant to T13 Committee www.t13.org @@ -59,9 +60,9 @@ MODULE_DESCRIPTION("sysfs interface to BIOS EDD information"); MODULE_LICENSE("GPL"); -#define EDD_VERSION "0.10 2003-Oct-11" +#define EDD_VERSION "0.12 2004-Jan-26" #define EDD_DEVICE_NAME_SIZE 16 -#define REPORT_URL "http://domsch.com/linux/edd30/results.html" +#define REPORT_URL "http://linux.dell.com/edd/results.html" #define left (PAGE_SIZE - (p - buf) - 1) @@ -260,6 +261,14 @@ } static ssize_t +edd_show_disk80_sig(struct edd_device *edev, char *buf) +{ + char *p = buf; + p += snprintf(p, left, "0x%08x\n", edd_disk80_sig); + return (p - buf); +} + +static ssize_t edd_show_extensions(struct edd_device *edev, char *buf) { struct edd_info *info = edd_dev_get_info(edev); @@ -429,6 +438,15 @@ return 1; } +static int +edd_has_disk80_sig(struct edd_device *edev) +{ + struct edd_info *info = edd_dev_get_info(edev); + if (!edev || !info) + return 0; + return info->device == 0x80; +} + static EDD_DEVICE_ATTR(raw_data, 0444, edd_show_raw_data, NULL); static EDD_DEVICE_ATTR(version, 0444, edd_show_version, NULL); static EDD_DEVICE_ATTR(extensions, 0444, edd_show_extensions, NULL); @@ -443,6 +461,7 @@ edd_has_default_sectors_per_track); static EDD_DEVICE_ATTR(interface, 0444, edd_show_interface, edd_has_edd30); static EDD_DEVICE_ATTR(host_bus, 0444, edd_show_host_bus, edd_has_edd30); +static EDD_DEVICE_ATTR(mbr_signature, 0444, edd_show_disk80_sig, edd_has_disk80_sig); /* These are default attributes that are added for every edd @@ -464,6 +483,7 @@ &edd_attr_default_sectors_per_track, &edd_attr_interface, &edd_attr_host_bus, + &edd_attr_mbr_signature, NULL, }; diff -Nru a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c --- a/arch/i386/kernel/i386_ksyms.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/kernel/i386_ksyms.c Tue Feb 17 20:00:08 2004 @@ -32,7 +32,6 @@ #include #include #include -#include #include extern void dump_thread(struct pt_regs *, struct user *); @@ -201,11 +200,6 @@ EXPORT_SYMBOL(kmap_atomic); EXPORT_SYMBOL(kunmap_atomic); EXPORT_SYMBOL(kmap_atomic_to_page); -#endif - -#ifdef CONFIG_EDD_MODULE -EXPORT_SYMBOL(edd); -EXPORT_SYMBOL(eddnr); #endif #if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE) diff -Nru a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c --- a/arch/i386/kernel/i387.c Tue Feb 17 20:00:14 2004 +++ b/arch/i386/kernel/i387.c Tue Feb 17 20:00:14 2004 @@ -451,15 +451,18 @@ int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct __user *buf ) { + int ret = 0; + if ( cpu_has_fxsr ) { - __copy_from_user( &tsk->thread.i387.fxsave, buf, - sizeof(struct user_fxsr_struct) ); + if (__copy_from_user( &tsk->thread.i387.fxsave, buf, + sizeof(struct user_fxsr_struct) )) + ret = -EFAULT; /* mxcsr bit 6 and 31-16 must be zero for security reasons */ tsk->thread.i387.fxsave.mxcsr &= 0xffbf; - return 0; } else { - return -EIO; + ret = -EIO; } + return ret; } /* diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c --- a/arch/i386/kernel/mpparse.c Tue Feb 17 20:00:06 2004 +++ b/arch/i386/kernel/mpparse.c Tue Feb 17 20:00:06 2004 @@ -634,7 +634,7 @@ /* * ACPI may be used to obtain the entire SMP configuration or just to - * enumerate/configure processors (CONFIG_ACPI_HT). Note that + * enumerate/configure processors (CONFIG_ACPI_BOOT). Note that * ACPI supports both logical (e.g. Hyper-Threading) and physical * processors, where MPS only supports physical. */ @@ -940,7 +940,7 @@ * erroneously sets the trigger to level, resulting in a HUGE * increase of timer interrupts! */ - if ((bus_irq == 0) && (global_irq == 2) && (trigger == 3)) + if ((bus_irq == 0) && (trigger == 3)) trigger = 1; intsrc.mpc_type = MP_INTSRC; @@ -961,7 +961,7 @@ * Otherwise create a new entry (e.g. global_irq == 2). */ for (i = 0; i < mp_irq_entries; i++) { - if ((mp_irqs[i].mpc_dstapic == intsrc.mpc_dstapic) + if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus) && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) { mp_irqs[i] = intsrc; found = 1; @@ -1008,9 +1008,10 @@ */ for (i = 0; i < 16; i++) { - if (i == 2) continue; /* Don't connect IRQ2 */ + if (i == 2) + continue; /* Don't connect IRQ2 */ - intsrc.mpc_irqtype = i ? mp_INT : mp_ExtINT; /* 8259A to #0 */ + intsrc.mpc_irqtype = mp_INT; intsrc.mpc_srcbusirq = i; /* Identity mapped */ intsrc.mpc_dstirq = i; @@ -1126,7 +1127,8 @@ /* Don't set up the ACPI SCI because it's already set up */ if (acpi_fadt.sci_int == irq) { - entry->irq = irq; /*we still need to set entry's irq*/ + irq = acpi_irq_to_vector(irq); + entry->irq = irq; /* we still need to set entry's irq */ continue; } @@ -1156,18 +1158,14 @@ if ((1<irq = irq; + entry->irq = acpi_irq_to_vector(irq); continue; } mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<irq = irq; + entry->irq = acpi_irq_to_vector(irq); } printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n", entry->id.segment, entry->id.bus, diff -Nru a/arch/i386/kernel/msr.c b/arch/i386/kernel/msr.c --- a/arch/i386/kernel/msr.c Tue Feb 17 20:00:06 2004 +++ b/arch/i386/kernel/msr.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,3 @@ -#ident "$Id$" /* ----------------------------------------------------------------------- * * * Copyright 2000 H. Peter Anvin - All Rights Reserved diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c --- a/arch/i386/kernel/process.c Tue Feb 17 20:00:05 2004 +++ b/arch/i386/kernel/process.c Tue Feb 17 20:00:05 2004 @@ -252,13 +252,15 @@ * the "args". */ extern void kernel_thread_helper(void); -__asm__(".align 4\n" +__asm__(".section .text\n" + ".align 4\n" "kernel_thread_helper:\n\t" "movl %edx,%eax\n\t" "pushl %edx\n\t" "call *%ebx\n\t" "pushl %eax\n\t" - "call do_exit"); + "call do_exit\n" + ".previous"); /* * Create a kernel thread diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/i386/kernel/setup.c Tue Feb 17 20:00:06 2004 @@ -444,6 +444,12 @@ #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) unsigned char eddnr; struct edd_info edd[EDDMAXNR]; +unsigned int edd_disk80_sig; +#ifdef CONFIG_EDD_MODULE +EXPORT_SYMBOL(eddnr); +EXPORT_SYMBOL(edd); +EXPORT_SYMBOL(edd_disk80_sig); +#endif /** * copy_edd() - Copy the BIOS EDD information * from empty_zero_page into a safe place. @@ -453,6 +459,7 @@ { eddnr = EDD_NR; memcpy(edd, EDD_BUF, sizeof(edd)); + edd_disk80_sig = DISK80_SIGNATURE; } #else #define copy_edd() do {} while (0) diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c --- a/arch/i386/kernel/smpboot.c Tue Feb 17 20:00:07 2004 +++ b/arch/i386/kernel/smpboot.c Tue Feb 17 20:00:07 2004 @@ -33,6 +33,7 @@ * Dave Jones : Report invalid combinations of Athlon CPUs. * Rusty Russell : Hacked into shape for new "hotplug" boot process. */ +#include #include #include #include @@ -503,6 +504,7 @@ { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE }; /* which node each logical CPU is on */ int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 }; +EXPORT_SYMBOL(cpu_2_node); /* set up a mapping between cpu and node. */ static inline void map_cpu_to_node(int cpu, int node) diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c --- a/arch/i386/kernel/timers/timer_tsc.c Tue Feb 17 20:00:07 2004 +++ b/arch/i386/kernel/timers/timer_tsc.c Tue Feb 17 20:00:07 2004 @@ -232,9 +232,13 @@ /* sanity check to ensure we're not always losing ticks */ if (lost_count++ > 100) { printk(KERN_WARNING "Losing too many ticks!\n"); - printk(KERN_WARNING "TSC cannot be used as a timesource." - " (Are you running with SpeedStep?)\n"); - printk(KERN_WARNING "Falling back to a sane timesource.\n"); + printk(KERN_WARNING "TSC cannot be used as a timesource. "); + printk(KERN_WARNING "Possible reasons for this are:\n"); + printk(KERN_WARNING " You're running with Speedstep,\n"); + printk(KERN_WARNING " You don't have DMA enabled for your hard disk (see hdparm),\n"); + printk(KERN_WARNING " Incorrect TSC synchronization on an SMP system (see dmesg).\n"); + printk(KERN_WARNING "Falling back to a sane timesource now.\n"); + clock_fallback(); } } else diff -Nru a/arch/i386/mach-default/topology.c b/arch/i386/mach-default/topology.c --- a/arch/i386/mach-default/topology.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/mach-default/topology.c Tue Feb 17 20:00:08 2004 @@ -34,10 +34,8 @@ #ifdef CONFIG_NUMA #include #include -#include struct i386_node node_devices[MAX_NUMNODES]; -struct i386_memblk memblk_devices[MAX_NR_MEMBLKS]; static int __init topology_init(void) { @@ -47,8 +45,6 @@ arch_register_node(i); for (i = 0; i < NR_CPUS; i++) if (cpu_possible(i)) arch_register_cpu(i); - for (i = 0; i < num_online_memblks(); i++) - arch_register_memblk(i); return 0; } diff -Nru a/arch/i386/mach-es7000/topology.c b/arch/i386/mach-es7000/topology.c --- a/arch/i386/mach-es7000/topology.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/mach-es7000/topology.c Tue Feb 17 20:00:08 2004 @@ -34,10 +34,8 @@ #ifdef CONFIG_NUMA #include #include -#include struct i386_node node_devices[MAX_NUMNODES]; -struct i386_memblk memblk_devices[MAX_NR_MEMBLKS]; static int __init topology_init(void) { @@ -47,8 +45,6 @@ arch_register_node(i); for (i = 0; i < NR_CPUS; i++) if (cpu_possible(i)) arch_register_cpu(i); - for (i = 0; i < num_online_memblks(); i++) - arch_register_memblk(i); return 0; } diff -Nru a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c --- a/arch/i386/pci/irq.c Tue Feb 17 20:00:08 2004 +++ b/arch/i386/pci/irq.c Tue Feb 17 20:00:08 2004 @@ -943,12 +943,50 @@ { u8 pin; extern int interrupt_line_quirk; + struct pci_dev *temp_dev; + pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { char *msg; - if (io_apic_assign_pci_irqs) - msg = " Probably buggy MP table."; - else if (pci_probe & PCI_BIOS_IRQ_SCAN) + msg = ""; + if (io_apic_assign_pci_irqs) { + int irq; + + if (pin) { + pin--; /* interrupt pins are numbered starting from 1 */ + irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); + /* + * Busses behind bridges are typically not listed in the MP-table. + * In this case we have to look up the IRQ based on the parent bus, + * parent slot, and pin number. The SMP code detects such bridged + * busses itself so we should get into this branch reliably. + */ + temp_dev = dev; + while (irq < 0 && dev->bus->parent) { /* go back to the bridge */ + struct pci_dev * bridge = dev->bus->self; + + pin = (pin + PCI_SLOT(dev->devfn)) % 4; + irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, + PCI_SLOT(bridge->devfn), pin); + if (irq >= 0) + printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", + bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq); + dev = bridge; + } + dev = temp_dev; + if (irq >= 0) { +#ifdef CONFIG_PCI_USE_VECTOR + if (!platform_legacy_irq(irq)) + irq = IO_APIC_VECTOR(irq); +#endif + printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n", + dev->bus->number, PCI_SLOT(dev->devfn), pin, irq); + dev->irq = irq; + return 0; + } else + msg = " Probably buggy MP table."; + } + } else if (pci_probe & PCI_BIOS_IRQ_SCAN) msg = ""; else msg = " Please try using pci=biosirq."; diff -Nru a/arch/ia64/configs/generic_defconfig b/arch/ia64/configs/generic_defconfig --- a/arch/ia64/configs/generic_defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/configs/generic_defconfig Tue Feb 17 20:00:06 2004 @@ -191,7 +191,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig --- a/arch/ia64/configs/sn2_defconfig Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/configs/sn2_defconfig Tue Feb 17 20:00:05 2004 @@ -170,7 +170,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/ia64/defconfig b/arch/ia64/defconfig --- a/arch/ia64/defconfig Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/defconfig Tue Feb 17 20:00:05 2004 @@ -48,13 +48,14 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_TIME_INTERPOLATION=y +CONFIG_EFI=y # CONFIG_ITANIUM is not set CONFIG_MCKINLEY=y # CONFIG_IA64_GENERIC is not set # CONFIG_IA64_DIG is not set -# CONFIG_IA64_HP_SIM is not set CONFIG_IA64_HP_ZX1=y # CONFIG_IA64_SGI_SN2 is not set +# CONFIG_IA64_HP_SIM is not set # CONFIG_IA64_PAGE_SIZE_4KB is not set # CONFIG_IA64_PAGE_SIZE_8KB is not set CONFIG_IA64_PAGE_SIZE_16KB=y @@ -80,15 +81,14 @@ # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set # CONFIG_IA64_PAL_IDLE is not set CONFIG_SMP=y +CONFIG_NR_CPUS=16 # CONFIG_PREEMPT is not set +CONFIG_HAVE_DEC_LOCK=y CONFIG_IA32_SUPPORT=y CONFIG_COMPAT=y -CONFIG_HAVE_DEC_LOCK=y CONFIG_PERFMON=y CONFIG_IA64_PALINFO=y -CONFIG_EFI=y CONFIG_EFI_VARS=y -CONFIG_NR_CPUS=16 CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y @@ -140,7 +140,6 @@ # # Plug and Play support # -# CONFIG_PNP is not set # # Block devices @@ -179,6 +178,7 @@ # # IDE chipset support/bugfixes # +# CONFIG_IDE_GENERIC is not set CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_OFFBOARD is not set @@ -188,7 +188,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set @@ -224,7 +223,6 @@ # # I2O device support # -# CONFIG_I2O is not set # # Multi-device support (RAID and LVM) @@ -235,6 +233,7 @@ CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID5=m +# CONFIG_MD_RAID6 is not set CONFIG_MD_MULTIPATH=m CONFIG_BLK_DEV_DM=m CONFIG_DM_IOCTL_V4=y @@ -304,9 +303,15 @@ # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set CONFIG_SCSI_QLOGIC_1280=y +CONFIG_SCSI_QLA2XXX=y +# CONFIG_SCSI_QLA21XX is not set +# CONFIG_SCSI_QLA22XX is not set +# CONFIG_SCSI_QLA2300 is not set +# CONFIG_SCSI_QLA2322 is not set +# CONFIG_SCSI_QLA6312 is not set +# CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set -# CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # @@ -415,6 +420,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set # CONFIG_DGRS is not set CONFIG_EEPRO100=y # CONFIG_EEPRO100_PIO is not set @@ -540,8 +546,8 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_ACPI=y CONFIG_SERIAL_8250_HCDP=y +CONFIG_SERIAL_8250_ACPI=y CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set @@ -554,24 +560,6 @@ CONFIG_UNIX98_PTY_COUNT=256 # -# I2C support -# -# CONFIG_I2C is not set - -# -# I2C Algorithms -# - -# -# I2C Hardware Bus support -# - -# -# I2C Hardware Sensors Chip support -# -# CONFIG_I2C_SENSOR is not set - -# # Mice # # CONFIG_BUSMOUSE is not set @@ -611,6 +599,11 @@ # CONFIG_RAW_DRIVER is not set # +# I2C support +# +# CONFIG_I2C is not set + +# # Multimedia devices # # CONFIG_VIDEO_DEV is not set @@ -790,6 +783,7 @@ # CONFIG_FB_ATY is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set @@ -845,6 +839,7 @@ # # CONFIG_SND_ALI5451 is not set # CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_EMU10K1 is not set @@ -928,7 +923,6 @@ # USB Imaging devices # # CONFIG_USB_MDC800 is not set -# CONFIG_USB_SCANNER is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_HPUSBSCSI is not set @@ -962,12 +956,19 @@ # # USB Miscellaneous drivers # +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_BRLVGER is not set # CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set + +# +# USB Gadget Support +# # CONFIG_USB_GADGET is not set # @@ -989,10 +990,6 @@ CONFIG_IA64_PRINT_HAZARDS=y # CONFIG_DISABLE_VHPT is not set CONFIG_MAGIC_SYSRQ=y -CONFIG_IA64_EARLY_PRINTK=y -CONFIG_IA64_EARLY_PRINTK_UART=y -CONFIG_IA64_EARLY_PRINTK_UART_BASE=0xff5e0000 -CONFIG_IA64_EARLY_PRINTK_VGA=y # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set diff -Nru a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c --- a/arch/ia64/hp/common/sba_iommu.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/hp/common/sba_iommu.c Tue Feb 17 20:00:06 2004 @@ -57,11 +57,21 @@ ** There's potentially a conflict in the bio merge code with us ** advertising an iommu, but then bypassing it. Since I/O MMU bypassing ** appears to give more performance than bio-level virtual merging, we'll -** do the former for now. +** do the former for now. NOTE: BYPASS_SG also needs to be undef'd to +** completely restrict DMA to the IOMMU. */ #define ALLOW_IOV_BYPASS /* +** This option specifically allows/disallows bypassing scatterlists with +** multiple entries. Coalescing these entries can allow better DMA streaming +** and in some cases shows better performance than entirely bypassing the +** IOMMU. Performance increase on the order of 1-2% sequential output/input +** using bonnie++ on a RAID0 MD device (sym2 & mpt). +*/ +#undef ALLOW_IOV_BYPASS_SG + +/* ** If a device prefetches beyond the end of a valid pdir entry, it will cause ** a hard failure, ie. MCA. Version 3.0 and later of the zx1 LBA should ** disconnect on 4k boundaries and prevent such issues. If the device is @@ -75,7 +85,10 @@ #define ENABLE_MARK_CLEAN /* -** The number of debug flags is a clue - this code is fragile. +** The number of debug flags is a clue - this code is fragile. NOTE: since +** tightening the use of res_lock the resource bitmap and actual pdir are no +** longer guaranteed to stay in sync. The sanity checking code isn't going to +** like that. */ #undef DEBUG_SBA_INIT #undef DEBUG_SBA_RUN @@ -140,9 +153,7 @@ ** allocated and free'd/purged at a time might make this ** less interesting). */ -#define DELAYED_RESOURCE_CNT 16 - -#define DEFAULT_DMA_HINT_REG 0 +#define DELAYED_RESOURCE_CNT 64 #define ZX1_IOC_ID ((PCI_DEVICE_ID_HP_ZX1_IOC << 16) | PCI_VENDOR_ID_HP) #define REO_IOC_ID ((PCI_DEVICE_ID_HP_REO_IOC << 16) | PCI_VENDOR_ID_HP) @@ -187,14 +198,15 @@ unsigned long imask; /* pdir IOV Space mask */ unsigned long *res_hint; /* next avail IOVP - circular search */ - spinlock_t res_lock; - unsigned long hint_mask_pdir; /* bits used for DMA hints */ + unsigned long dma_mask; + spinlock_t res_lock; /* protects the resource bitmap, but must be held when */ + /* clearing pdir to prevent races with allocations. */ unsigned int res_bitshift; /* from the RIGHT! */ unsigned int res_size; /* size of resource map in bytes */ - unsigned int hint_shift_pdir; - unsigned long dma_mask; #if DELAYED_RESOURCE_CNT > 0 - int saved_cnt; + spinlock_t saved_lock; /* may want to try to get this on a separate cacheline */ + /* than res_lock for bigger systems. */ + int saved_cnt; struct sba_dma_pair { dma_addr_t iova; size_t size; @@ -221,6 +233,9 @@ static struct ioc *ioc_list; static int reserve_sba_gart = 1; +static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t); +static SBA_INLINE void sba_free_range(struct ioc *, dma_addr_t, size_t); + #define sba_sg_address(sg) (page_address((sg)->page) + (sg)->offset) #ifdef FULL_VALID_PDIR @@ -405,7 +420,7 @@ #define PAGES_PER_RANGE 1 /* could increase this to 4 or 8 if needed */ /* Convert from IOVP to IOVA and vice versa. */ -#define SBA_IOVA(ioc,iovp,offset,hint_reg) ((ioc->ibase) | (iovp) | (offset)) +#define SBA_IOVA(ioc,iovp,offset) ((ioc->ibase) | (iovp) | (offset)) #define SBA_IOVP(ioc,iova) ((iova) & ~(ioc->ibase)) #define PDIR_ENTRY_SIZE sizeof(u64) @@ -453,20 +468,25 @@ ASSERT(((unsigned long) ioc->res_hint & (sizeof(unsigned long) - 1UL)) == 0); ASSERT(res_ptr < res_end); - if (bits_wanted > (BITS_PER_LONG/2)) { - /* Search word at a time - no mask needed */ - for(; res_ptr < res_end; ++res_ptr) { - if (*res_ptr == 0) { - *res_ptr = RESMAP_MASK(bits_wanted); + + if (likely(bits_wanted == 1)) { + unsigned int bitshiftcnt; + for(; res_ptr < res_end ; res_ptr++) { + if (likely(*res_ptr != ~0UL)) { + bitshiftcnt = ffz(*res_ptr); + *res_ptr |= (1UL << bitshiftcnt); pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); pide <<= 3; /* convert to bit address */ - break; + pide += bitshiftcnt; + ioc->res_bitshift = bitshiftcnt + bits_wanted; + goto found_it; } } - /* point to the next word on next pass */ - res_ptr++; - ioc->res_bitshift = 0; - } else { + goto not_found; + + } + + if (likely(bits_wanted <= BITS_PER_LONG/2)) { /* ** Search the resource bit map on well-aligned values. ** "o" is the alignment. @@ -475,45 +495,72 @@ */ unsigned long o = 1 << get_iovp_order(bits_wanted << iovp_shift); uint bitshiftcnt = ROUNDUP(ioc->res_bitshift, o); - unsigned long mask; + unsigned long mask, base_mask; - if (bitshiftcnt >= BITS_PER_LONG) { - bitshiftcnt = 0; - res_ptr++; - } - mask = RESMAP_MASK(bits_wanted) << bitshiftcnt; + base_mask = RESMAP_MASK(bits_wanted); + mask = base_mask << bitshiftcnt; DBG_RES("%s() o %ld %p", __FUNCTION__, o, res_ptr); - while(res_ptr < res_end) + for(; res_ptr < res_end ; res_ptr++) { DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr); ASSERT(0 != mask); - if(0 == ((*res_ptr) & mask)) { - *res_ptr |= mask; /* mark resources busy! */ - pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); - pide <<= 3; /* convert to bit address */ - pide += bitshiftcnt; - break; - } - mask <<= o; - bitshiftcnt += o; - if (0 == mask) { - mask = RESMAP_MASK(bits_wanted); - bitshiftcnt=0; - res_ptr++; + for (; mask ; mask <<= o, bitshiftcnt += o) { + if(0 == ((*res_ptr) & mask)) { + *res_ptr |= mask; /* mark resources busy! */ + pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); + pide <<= 3; /* convert to bit address */ + pide += bitshiftcnt; + ioc->res_bitshift = bitshiftcnt + bits_wanted; + goto found_it; + } } + + bitshiftcnt = 0; + mask = base_mask; + } - /* look in the same word on the next pass */ - ioc->res_bitshift = bitshiftcnt + bits_wanted; - } - /* wrapped ? */ - if (res_end <= res_ptr) { - ioc->res_hint = (unsigned long *) ioc->res_map; - ioc->res_bitshift = 0; } else { - ioc->res_hint = res_ptr; + int qwords, bits, i; + unsigned long *end; + + qwords = bits_wanted >> 6; /* /64 */ + bits = bits_wanted - (qwords * BITS_PER_LONG); + + end = res_end - qwords; + + for (; res_ptr < end; res_ptr++) { + for (i = 0 ; i < qwords ; i++) { + if (res_ptr[i] != 0) + goto next_ptr; + } + if (bits && res_ptr[i] && (__ffs(res_ptr[i]) < bits)) + continue; + + /* Found it, mark it */ + for (i = 0 ; i < qwords ; i++) + res_ptr[i] = ~0UL; + res_ptr[i] |= RESMAP_MASK(bits); + + pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); + pide <<= 3; /* convert to bit address */ + res_ptr += qwords; + ioc->res_bitshift = bits; + goto found_it; +next_ptr: + ; + } } + +not_found: + prefetch(ioc->res_map); + ioc->res_hint = (unsigned long *) ioc->res_map; + ioc->res_bitshift = 0; + return (pide); + +found_it: + ioc->res_hint = res_ptr; return (pide); } @@ -531,26 +578,67 @@ { unsigned int pages_needed = size >> iovp_shift; #ifdef PDIR_SEARCH_TIMING - unsigned long itc_start = ia64_get_itc(); + unsigned long itc_start; #endif unsigned long pide; + unsigned long flags; ASSERT(pages_needed); - ASSERT(pages_needed <= BITS_PER_LONG); ASSERT(0 == (size & ~iovp_mask)); + spin_lock_irqsave(&ioc->res_lock, flags); + +#ifdef PDIR_SEARCH_TIMING + itc_start = ia64_get_itc(); +#endif /* ** "seek and ye shall find"...praying never hurts either... */ - pide = sba_search_bitmap(ioc, pages_needed); - if (pide >= (ioc->res_size << 3)) { + if (unlikely(pide >= (ioc->res_size << 3))) { pide = sba_search_bitmap(ioc, pages_needed); - if (pide >= (ioc->res_size << 3)) + if (unlikely(pide >= (ioc->res_size << 3))) { +#if DELAYED_RESOURCE_CNT > 0 + /* + ** With delayed resource freeing, we can give this one more shot. We're + ** getting close to being in trouble here, so do what we can to make this + ** one count. + */ + spin_lock(&ioc->saved_lock); + if (ioc->saved_cnt > 0) { + struct sba_dma_pair *d; + int cnt = ioc->saved_cnt; + + d = &(ioc->saved[ioc->saved_cnt]); + + while (cnt--) { + sba_mark_invalid(ioc, d->iova, d->size); + sba_free_range(ioc, d->iova, d->size); + d--; + } + ioc->saved_cnt = 0; + READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ + } + spin_unlock(&ioc->saved_lock); + + pide = sba_search_bitmap(ioc, pages_needed); + if (unlikely(pide >= (ioc->res_size << 3))) + panic(__FILE__ ": I/O MMU @ %p is out of mapping resources\n", + ioc->ioc_hpa); +#else panic(__FILE__ ": I/O MMU @ %p is out of mapping resources\n", ioc->ioc_hpa); +#endif + } } +#ifdef PDIR_SEARCH_TIMING + ioc->avg_search[ioc->avg_idx++] = (ia64_get_itc() - itc_start) / pages_needed; + ioc->avg_idx &= SBA_SEARCH_SAMPLE - 1; +#endif + + prefetchw(&(ioc->pdir_base[pide])); + #ifdef ASSERT_PDIR_SANITY /* verify the first enable bit is clear */ if(0x00 != ((u8 *) ioc->pdir_base)[pide*PDIR_ENTRY_SIZE + 7]) { @@ -563,10 +651,7 @@ (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map), ioc->res_bitshift ); -#ifdef PDIR_SEARCH_TIMING - ioc->avg_search[ioc->avg_idx++] = ia64_get_itc() - itc_start; - ioc->avg_idx &= SBA_SEARCH_SAMPLE - 1; -#endif + spin_unlock_irqrestore(&ioc->res_lock, flags); return (pide); } @@ -587,22 +672,33 @@ unsigned int pide = PDIR_INDEX(iovp); unsigned int ridx = pide >> 3; /* convert bit to byte address */ unsigned long *res_ptr = (unsigned long *) &((ioc)->res_map[ridx & ~RESMAP_IDX_MASK]); - int bits_not_wanted = size >> iovp_shift; + unsigned long m; - /* 3-bits "bit" address plus 2 (or 3) bits for "byte" == bit in word */ - unsigned long m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1)); + for (; bits_not_wanted > 0 ; res_ptr++) { + + if (unlikely(bits_not_wanted > BITS_PER_LONG)) { + + /* these mappings start 64bit aligned */ + *res_ptr = 0UL; + bits_not_wanted -= BITS_PER_LONG; + pide += BITS_PER_LONG; - DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", - __FUNCTION__, (uint) iova, size, - bits_not_wanted, m, pide, res_ptr, *res_ptr); - - ASSERT(m != 0); - ASSERT(bits_not_wanted); - ASSERT((bits_not_wanted * iovp_size) <= DMA_CHUNK_SIZE); - ASSERT(bits_not_wanted <= BITS_PER_LONG); - ASSERT((*res_ptr & m) == m); /* verify same bits are set */ - *res_ptr &= ~m; + } else { + + /* 3-bits "bit" address plus 2 (or 3) bits for "byte" == bit in word */ + m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1)); + bits_not_wanted = 0; + + DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __FUNCTION__, (uint) iova, size, + bits_not_wanted, m, pide, res_ptr, *res_ptr); + + ASSERT(m != 0); + ASSERT(bits_not_wanted); + ASSERT((*res_ptr & m) == m); /* verify same bits are set */ + *res_ptr &= ~m; + } + } } @@ -612,9 +708,6 @@ * ***************************************************************/ -#define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir) - - /** * sba_io_pdir_entry - fill in one IO PDIR entry * @pdir_ptr: pointer to IO PDIR entry @@ -764,32 +857,36 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir) { struct ioc *ioc; - unsigned long flags; dma_addr_t iovp; dma_addr_t offset; u64 *pdir_start; int pide; +#ifdef ASSERT_PDIR_SANITY + unsigned long flags; +#endif #ifdef ALLOW_IOV_BYPASS unsigned long pci_addr = virt_to_phys(addr); #endif - ioc = GET_IOC(dev); - ASSERT(ioc); - #ifdef ALLOW_IOV_BYPASS + ASSERT(to_pci_dev(dev)->dma_mask); /* ** Check if the PCI device can DMA to ptr... if so, just return ptr */ - if (dev && dev->dma_mask && (pci_addr & ~*dev->dma_mask) == 0) { + if (likely((pci_addr & ~to_pci_dev(dev)->dma_mask) == 0)) { /* ** Device is bit capable of DMA'ing to the buffer... ** just return the PCI address of ptr */ DBG_BYPASS("sba_map_single() bypass mask/addr: 0x%lx/0x%lx\n", - *dev->dma_mask, pci_addr); + to_pci_dev(dev)->dma_mask, pci_addr); return pci_addr; } #endif + ioc = GET_IOC(dev); + ASSERT(ioc); + + prefetch(ioc->res_hint); ASSERT(size > 0); ASSERT(size <= DMA_CHUNK_SIZE); @@ -800,13 +897,15 @@ /* round up to nearest iovp_size */ size = (size + offset + ~iovp_mask) & iovp_mask; - spin_lock_irqsave(&ioc->res_lock, flags); #ifdef ASSERT_PDIR_SANITY + spin_lock_irqsave(&ioc->res_lock, flags); if (sba_check_pdir(ioc,"Check before sba_map_single()")) panic("Sanity check failed"); + spin_unlock_irqrestore(&ioc->res_lock, flags); #endif pide = sba_alloc_range(ioc, size); + iovp = (dma_addr_t) pide << iovp_shift; DBG_RUN("%s() 0x%p -> 0x%lx\n", @@ -829,10 +928,11 @@ /* form complete address */ #ifdef ASSERT_PDIR_SANITY + spin_lock_irqsave(&ioc->res_lock, flags); sba_check_pdir(ioc,"Check after sba_map_single()"); -#endif spin_unlock_irqrestore(&ioc->res_lock, flags); - return SBA_IOVA(ioc, iovp, offset, DEFAULT_DMA_HINT_REG); +#endif + return SBA_IOVA(ioc, iovp, offset); } /** @@ -857,7 +957,7 @@ ASSERT(ioc); #ifdef ALLOW_IOV_BYPASS - if ((iova & ioc->imask) != ioc->ibase) { + if (likely((iova & ioc->imask) != ioc->ibase)) { /* ** Address does not fall w/in IOVA, must be bypassing */ @@ -880,14 +980,15 @@ size += offset; size = ROUNDUP(size, iovp_size); - spin_lock_irqsave(&ioc->res_lock, flags); #if DELAYED_RESOURCE_CNT > 0 + spin_lock_irqsave(&ioc->saved_lock, flags); d = &(ioc->saved[ioc->saved_cnt]); d->iova = iova; d->size = size; - if (++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT) { + if (unlikely(++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT)) { int cnt = ioc->saved_cnt; + spin_lock(&ioc->res_lock); while (cnt--) { sba_mark_invalid(ioc, d->iova, d->size); sba_free_range(ioc, d->iova, d->size); @@ -895,11 +996,15 @@ } ioc->saved_cnt = 0; READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ + spin_unlock(&ioc->res_lock); } + spin_unlock_irqrestore(&ioc->saved_lock, flags); #else /* DELAYED_RESOURCE_CNT == 0 */ + spin_lock_irqsave(&ioc->res_lock, flags); sba_mark_invalid(ioc, iova, size); sba_free_range(ioc, iova, size); READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ + spin_unlock_irqrestore(&ioc->res_lock, flags); #endif /* DELAYED_RESOURCE_CNT == 0 */ #ifdef ENABLE_MARK_CLEAN if (dir == DMA_FROM_DEVICE) { @@ -925,16 +1030,6 @@ } } #endif - spin_unlock_irqrestore(&ioc->res_lock, flags); - - /* XXX REVISIT for 2.5 Linux - need syncdma for zero-copy support. - ** For Astro based systems this isn't a big deal WRT performance. - ** As long as 2.4 kernels copyin/copyout data from/to userspace, - ** we don't need the syncdma. The issue here is I/O MMU cachelines - ** are *not* coherent in all cases. May be hwrev dependent. - ** Need to investigate more. - asm volatile("syncdma"); - */ } @@ -953,18 +1048,33 @@ void *addr; addr = (void *) __get_free_pages(flags, get_order(size)); - if (!addr) + if (unlikely(!addr)) return NULL; + memset(addr, 0, size); + *dma_handle = virt_to_phys(addr); + +#ifdef ALLOW_IOV_BYPASS + ASSERT(to_pci_dev(dev)->consistent_dma_mask); /* - * REVISIT: if sba_map_single starts needing more than dma_mask from the - * device, this needs to be updated. + ** Check if the PCI device can DMA to ptr... if so, just return ptr + */ + if (likely((*dma_handle & ~to_pci_dev(dev)->consistent_dma_mask) == 0)) { + DBG_BYPASS("sba_alloc_coherent() bypass mask/addr: 0x%lx/0x%lx\n", + to_pci_dev(dev)->consistent_dma_mask, *dma_handle); + + return addr; + } +#endif + + /* + * If device can't bypass or bypass is disabled, pass the 32bit fake + * device to map single to get an iova mapping. */ ioc = GET_IOC(dev); ASSERT(ioc); *dma_handle = sba_map_single(&ioc->sac_only_dev->dev, addr, size, 0); - memset(addr, 0, size); return addr; } @@ -1232,8 +1342,10 @@ { struct ioc *ioc; int coalesced, filled = 0; +#ifdef ASSERT_PDIR_SANITY unsigned long flags; -#ifdef ALLOW_IOV_BYPASS +#endif +#ifdef ALLOW_IOV_BYPASS_SG struct scatterlist *sg; #endif @@ -1241,8 +1353,9 @@ ioc = GET_IOC(dev); ASSERT(ioc); -#ifdef ALLOW_IOV_BYPASS - if (dev && dev->dma_mask && (ioc->dma_mask & ~*dev->dma_mask) == 0) { +#ifdef ALLOW_IOV_BYPASS_SG + ASSERT(to_pci_dev(dev)->dma_mask); + if (likely((ioc->dma_mask & ~to_pci_dev(dev)->dma_mask) == 0)) { for (sg = sglist ; filled < nents ; filled++, sg++){ sg->dma_length = sg->length; sg->dma_address = virt_to_phys(sba_sg_address(sg)); @@ -1253,21 +1366,22 @@ /* Fast path single entry scatterlists. */ if (nents == 1) { sglist->dma_length = sglist->length; - sglist->dma_address = sba_map_single(dev, sba_sg_address(sglist), sglist->length, - dir); + sglist->dma_address = sba_map_single(dev, sba_sg_address(sglist), sglist->length, dir); return 1; } - spin_lock_irqsave(&ioc->res_lock, flags); - #ifdef ASSERT_PDIR_SANITY + spin_lock_irqsave(&ioc->res_lock, flags); if (sba_check_pdir(ioc,"Check before sba_map_sg()")) { sba_dump_sg(ioc, sglist, nents); panic("Check before sba_map_sg()"); } + spin_unlock_irqrestore(&ioc->res_lock, flags); #endif + prefetch(ioc->res_hint); + /* ** First coalesce the chunks and allocate I/O pdir space ** @@ -1289,14 +1403,14 @@ filled = sba_fill_pdir(ioc, sglist, nents); #ifdef ASSERT_PDIR_SANITY + spin_lock_irqsave(&ioc->res_lock, flags); if (sba_check_pdir(ioc,"Check after sba_map_sg()")) { sba_dump_sg(ioc, sglist, nents); panic("Check after sba_map_sg()\n"); } -#endif - spin_unlock_irqrestore(&ioc->res_lock, flags); +#endif ASSERT(coalesced == filled); DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled); @@ -1316,18 +1430,18 @@ */ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, int dir) { - struct ioc *ioc; #ifdef ASSERT_PDIR_SANITY + struct ioc *ioc; unsigned long flags; #endif DBG_RUN_SG("%s() START %d entries, %p,%x\n", __FUNCTION__, nents, sba_sg_address(sglist), sglist->length); +#ifdef ASSERT_PDIR_SANITY ioc = GET_IOC(dev); ASSERT(ioc); -#ifdef ASSERT_PDIR_SANITY spin_lock_irqsave(&ioc->res_lock, flags); sba_check_pdir(ioc,"Check before sba_unmap_sg()"); spin_unlock_irqrestore(&ioc->res_lock, flags); @@ -1478,6 +1592,9 @@ ioc_resource_init(struct ioc *ioc) { spin_lock_init(&ioc->res_lock); +#if DELAYED_RESOURCE_CNT > 0 + spin_lock_init(&ioc->saved_lock); +#endif /* resource map size dictated by pdir_size */ ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */ @@ -1689,13 +1806,13 @@ seq_printf(s, "Hewlett Packard %s IOC rev %d.%d\n", ioc->name, ((ioc->rev >> 4) & 0xF), (ioc->rev & 0xF)); - seq_printf(s, "IOVA size : %d MB\n", ioc->iov_size/(1024*1024)); + seq_printf(s, "IOVA size : %ld MB\n", ((ioc->pdir_size >> 3) * iovp_size)/(1024*1024)); seq_printf(s, "IOVA page size : %ld kb\n", iovp_size/1024); for (i = 0; i < (ioc->res_size / sizeof(unsigned long)); ++i, ++res_ptr) used += hweight64(*res_ptr); - seq_printf(s, "PDIR size : %d entries\n", ioc->res_size << 3); + seq_printf(s, "PDIR size : %d entries\n", ioc->pdir_size >> 3); seq_printf(s, "PDIR used : %d entries\n", used); #ifdef PDIR_SEARCH_TIMING @@ -1708,7 +1825,7 @@ if (ioc->avg_search[i] < min) min = ioc->avg_search[i]; } avg /= SBA_SEARCH_SAMPLE; - seq_printf(s, "Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles)\n", + seq_printf(s, "Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles/IOVA page)\n", min, avg, max); } #endif diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c --- a/arch/ia64/kernel/acpi.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/kernel/acpi.c Tue Feb 17 20:00:07 2004 @@ -191,8 +191,6 @@ if (!lsapic->flags.enabled) printk(" disabled"); - else if (available_cpus >= NR_CPUS) - printk(" ignored (increase NR_CPUS)"); else { printk(" enabled"); #ifdef CONFIG_SMP @@ -395,12 +393,6 @@ size = ma->length_hi; size = (size << 32) | ma->length_lo; - if (num_memblks >= NR_MEMBLKS) { - printk(KERN_ERR "Too many mem chunks in SRAT. Ignoring %ld MBytes at %lx\n", - size/(1024*1024), paddr); - return; - } - /* Ignore disabled entries */ if (!ma->flags.enabled) return; @@ -409,7 +401,7 @@ pxm_bit_set(pxm); /* Insertion sort based on base address */ - pend = &node_memblk[num_memblks]; + pend = &node_memblk[num_node_memblks]; for (p = &node_memblk[0]; p < pend; p++) { if (paddr < p->start_paddr) break; @@ -421,7 +413,7 @@ p->start_paddr = paddr; p->size = size; p->nid = pxm; - num_memblks++; + num_node_memblks++; } void __init @@ -448,7 +440,7 @@ } /* set logical node id in memory chunk structure */ - for (i = 0; i < num_memblks; i++) + for (i = 0; i < num_node_memblks; i++) node_memblk[i].nid = pxm_to_nid_map[node_memblk[i].nid]; /* assign memory bank numbers for each chunk on each node */ @@ -456,7 +448,7 @@ int bank; bank = 0; - for (j = 0; j < num_memblks; j++) + for (j = 0; j < num_node_memblks; j++) if (node_memblk[j].nid == i) node_memblk[j].bank = bank++; } @@ -466,7 +458,7 @@ node_cpuid[i].nid = pxm_to_nid_map[node_cpuid[i].nid]; printk(KERN_INFO "Number of logical nodes in system = %d\n", numnodes); - printk(KERN_INFO "Number of memory chunks in system = %d\n", num_memblks); + printk(KERN_INFO "Number of memory chunks in system = %d\n", num_node_memblks); if (!slit_table) return; memset(numa_slit, -1, sizeof(numa_slit)); @@ -552,29 +544,29 @@ /* Local APIC */ - if (acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr) < 0) + if (acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC address override entry\n"); - if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic) < 1) + if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, NR_CPUS) < 1) printk(KERN_ERR PREFIX "Error parsing MADT - no LAPIC entries\n"); - if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi) < 0) + if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); /* I/O APIC */ - if (acpi_table_parse_madt(ACPI_MADT_IOSAPIC, acpi_parse_iosapic) < 1) + if (acpi_table_parse_madt(ACPI_MADT_IOSAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1) printk(KERN_ERR PREFIX "Error parsing MADT - no IOSAPIC entries\n"); /* System-Level Interrupt Routing */ - if (acpi_table_parse_madt(ACPI_MADT_PLAT_INT_SRC, acpi_parse_plat_int_src) < 0) + if (acpi_table_parse_madt(ACPI_MADT_PLAT_INT_SRC, acpi_parse_plat_int_src, ACPI_MAX_PLATFORM_INTERRUPTS) < 0) printk(KERN_ERR PREFIX "Error parsing platform interrupt source entry\n"); - if (acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr) < 0) + if (acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, 0) < 0) printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); - if (acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src) < 0) + if (acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, 0) < 0) printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); skip_madt: @@ -597,7 +589,7 @@ smp_boot_data.cpu_count = available_cpus; smp_build_cpu_map(); -# ifdef CONFIG_NUMA +# ifdef CONFIG_ACPI_NUMA if (srat_num_cpus == 0) { int cpu, i = 1; for (cpu = 0; cpu < smp_boot_data.cpu_count; cpu++) diff -Nru a/arch/ia64/kernel/efivars.c b/arch/ia64/kernel/efivars.c --- a/arch/ia64/kernel/efivars.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/kernel/efivars.c Tue Feb 17 20:00:06 2004 @@ -29,9 +29,12 @@ * * Changelog: * + * 10 Feb 2004 - Stephane Eranian + * Provide FPSWA version number via /proc/efi/fpswa + * * 10 Dec 2002 - Matt Domsch * fix locking per Peter Chubb's findings - * + * * 25 Mar 2002 - Matt Domsch * move uuid_unparse() to include/asm-ia64/efi.h:efi_guid_unparse() * @@ -70,6 +73,7 @@ #include #include +#include #include MODULE_AUTHOR("Matt Domsch "); @@ -407,6 +411,37 @@ .read = efi_systab_read, }; +static ssize_t +efi_fpswa_read (struct file *file, char *buffer, size_t count, loff_t *ppos) +{ + ssize_t size, length; + char str[32]; + void *data; + + snprintf(str, sizeof(str), "revision=%u.%u\n", + fpswa_interface->revision >> 16, fpswa_interface->revision & 0xffff); + + length = strlen(str); + + if (*ppos >= length) + return 0; + + data = str + file->f_pos; + size = length - file->f_pos; + if (size > count) + size = count; + if (copy_to_user(buffer, data, size)) + return -EFAULT; + + *ppos += size; + return size; +} + +static struct proc_dir_entry *efi_fpswa_entry; +static struct file_operations efi_fpswa_fops = { + .read = efi_fpswa_read, +}; + static int __init efivars_init(void) { @@ -428,6 +463,12 @@ efi_systab_entry = create_proc_entry("systab", S_IRUSR | S_IRGRP, efi_dir); if (efi_systab_entry) efi_systab_entry->proc_fops = &efi_systab_fops; + + if (fpswa_interface) { + efi_fpswa_entry = create_proc_entry("fpswa", S_IRUGO, efi_dir); + if (efi_fpswa_entry) + efi_fpswa_entry->proc_fops = &efi_fpswa_fops; + } efi_vars_dir = proc_mkdir("vars", efi_dir); diff -Nru a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c --- a/arch/ia64/kernel/iosapic.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/kernel/iosapic.c Tue Feb 17 20:00:06 2004 @@ -114,7 +114,7 @@ char *addr; /* base address of IOSAPIC */ unsigned int gsi_base; /* first GSI assigned to this IOSAPIC */ unsigned short num_rte; /* number of RTE in this IOSAPIC */ -} iosapic_lists[256]; +} iosapic_lists[NR_IOSAPICS]; static int num_iosapic; diff -Nru a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c --- a/arch/ia64/kernel/irq.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/kernel/irq.c Tue Feb 17 20:00:08 2004 @@ -465,8 +465,6 @@ desc->handler->ack(irq); action_ret = handle_IRQ_event(irq, regs, desc->action); desc->handler->end(irq); - if (!noirqdebug) - note_interrupt(irq, desc, action_ret); } else { spin_lock(&desc->lock); desc->handler->ack(irq); diff -Nru a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c --- a/arch/ia64/kernel/mca.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/kernel/mca.c Tue Feb 17 20:00:06 2004 @@ -18,7 +18,7 @@ * Copyright (C) 2000 Intel * Copyright (C) Chuck Fleckenstein (cfleck@co.intel.com) * - * Copyright (C) 1999 Silicon Graphics, Inc. + * Copyright (C) 1999, 2004 Silicon Graphics, Inc. * Copyright (C) Vijay Chander(vijay@engr.sgi.com) * * 03/04/15 D. Mosberger Added INIT backtrace support. @@ -40,6 +40,14 @@ * 2003-12-08 Keith Owens * smp_call_function() must not be called from interrupt context (can * deadlock on tasklist_lock). Use keventd to call smp_call_function(). + * + * 2004-02-01 Keith Owens + * Avoid deadlock when using printk() for MCA and INIT records. + * Delete all record printing code, moved to salinfo_decode in user space. + * Mark variables and functions static where possible. + * Delete dead variables and functions. + * Reorder to remove the need for forward declarations and to consolidate + * related code. */ #include #include @@ -68,14 +76,18 @@ #include #include -#undef MCA_PRT_XTRA_DATA +#if defined(IA64_MCA_DEBUG_INFO) +# define IA64_MCA_DEBUG(fmt...) printk(fmt) +#else +# define IA64_MCA_DEBUG(fmt...) +#endif typedef struct ia64_fptr { unsigned long fp; unsigned long gp; } ia64_fptr_t; -ia64_mc_info_t ia64_mc_info; +/* Used by mca_asm.S */ ia64_mca_sal_to_os_state_t ia64_sal_to_os_handoff_state; ia64_mca_os_to_sal_state_t ia64_os_to_sal_handoff_state; u64 ia64_mca_proc_state_dump[512]; @@ -83,56 +95,17 @@ u64 ia64_mca_stackframe[32]; u64 ia64_mca_bspstore[1024]; u64 ia64_init_stack[KERNEL_STACK_SIZE/8] __attribute__((aligned(16))); -u64 ia64_os_mca_recovery_successful; u64 ia64_mca_serialize; -static void ia64_mca_wakeup_ipi_wait(void); -static void ia64_mca_wakeup(int cpu); -static void ia64_mca_wakeup_all(void); -static void ia64_log_init(int); + +/* In mca_asm.S */ extern void ia64_monarch_init_handler (void); extern void ia64_slave_init_handler (void); -static u64 ia64_log_get(int sal_info_type, u8 **buffer); -extern struct hw_interrupt_type irq_type_iosapic_level; - -struct ia64_mca_tlb_info ia64_mca_tlb_list[NR_CPUS]; - -static struct irqaction cmci_irqaction = { - .handler = ia64_mca_cmc_int_handler, - .flags = SA_INTERRUPT, - .name = "cmc_hndlr" -}; - -static struct irqaction cmcp_irqaction = { - .handler = ia64_mca_cmc_int_caller, - .flags = SA_INTERRUPT, - .name = "cmc_poll" -}; - -static struct irqaction mca_rdzv_irqaction = { - .handler = ia64_mca_rendez_int_handler, - .flags = SA_INTERRUPT, - .name = "mca_rdzv" -}; -static struct irqaction mca_wkup_irqaction = { - .handler = ia64_mca_wakeup_int_handler, - .flags = SA_INTERRUPT, - .name = "mca_wkup" -}; +static ia64_mc_info_t ia64_mc_info; -#ifdef CONFIG_ACPI -static struct irqaction mca_cpe_irqaction = { - .handler = ia64_mca_cpe_int_handler, - .flags = SA_INTERRUPT, - .name = "cpe_hndlr" -}; +extern struct hw_interrupt_type irq_type_iosapic_level; -static struct irqaction mca_cpep_irqaction = { - .handler = ia64_mca_cpe_int_caller, - .flags = SA_INTERRUPT, - .name = "cpe_poll" -}; -#endif /* CONFIG_ACPI */ +struct ia64_mca_tlb_info ia64_mca_tlb_list[NR_CPUS]; #define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */ #define MIN_CPE_POLL_INTERVAL (2*60*HZ) /* 2 minutes */ @@ -156,65 +129,157 @@ */ static int cpe_poll_enabled = 1; -extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size); +extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe); + +/* + * IA64_MCA log support + */ +#define IA64_MAX_LOGS 2 /* Double-buffering for nested MCAs */ +#define IA64_MAX_LOG_TYPES 4 /* MCA, INIT, CMC, CPE */ + +typedef struct ia64_state_log_s +{ + spinlock_t isl_lock; + int isl_index; + unsigned long isl_count; + ia64_err_rec_t *isl_log[IA64_MAX_LOGS]; /* need space to store header + error log */ +} ia64_state_log_t; + +static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES]; + +#define IA64_LOG_ALLOCATE(it, size) \ + {ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)] = \ + (ia64_err_rec_t *)alloc_bootmem(size); \ + ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)] = \ + (ia64_err_rec_t *)alloc_bootmem(size);} +#define IA64_LOG_LOCK_INIT(it) spin_lock_init(&ia64_state_log[it].isl_lock) +#define IA64_LOG_LOCK(it) spin_lock_irqsave(&ia64_state_log[it].isl_lock, s) +#define IA64_LOG_UNLOCK(it) spin_unlock_irqrestore(&ia64_state_log[it].isl_lock,s) +#define IA64_LOG_NEXT_INDEX(it) ia64_state_log[it].isl_index +#define IA64_LOG_CURR_INDEX(it) 1 - ia64_state_log[it].isl_index +#define IA64_LOG_INDEX_INC(it) \ + {ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index; \ + ia64_state_log[it].isl_count++;} +#define IA64_LOG_INDEX_DEC(it) \ + ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index +#define IA64_LOG_NEXT_BUFFER(it) (void *)((ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)])) +#define IA64_LOG_CURR_BUFFER(it) (void *)((ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)])) +#define IA64_LOG_COUNT(it) ia64_state_log[it].isl_count + +/* + * ia64_log_init + * Reset the OS ia64 log buffer + * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) + * Outputs : None + */ +static void +ia64_log_init(int sal_info_type) +{ + u64 max_size = 0; + + IA64_LOG_NEXT_INDEX(sal_info_type) = 0; + IA64_LOG_LOCK_INIT(sal_info_type); + + // SAL will tell us the maximum size of any error record of this type + max_size = ia64_sal_get_state_info_size(sal_info_type); + if (!max_size) + /* alloc_bootmem() doesn't like zero-sized allocations! */ + return; + + // set up OS data structures to hold error info + IA64_LOG_ALLOCATE(sal_info_type, max_size); + memset(IA64_LOG_CURR_BUFFER(sal_info_type), 0, max_size); + memset(IA64_LOG_NEXT_BUFFER(sal_info_type), 0, max_size); +} + +/* + * ia64_log_get + * + * Get the current MCA log from SAL and copy it into the OS log buffer. + * + * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) + * irq_safe whether you can use printk at this point + * Outputs : size (total record length) + * *buffer (ptr to error record) + * + */ +static u64 +ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe) +{ + sal_log_record_header_t *log_buffer; + u64 total_len = 0; + int s; + + IA64_LOG_LOCK(sal_info_type); + + /* Get the process state information */ + log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type); + + total_len = ia64_sal_get_state_info(sal_info_type, (u64 *)log_buffer); + + if (total_len) { + IA64_LOG_INDEX_INC(sal_info_type); + IA64_LOG_UNLOCK(sal_info_type); + if (irq_safe) { + IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. " + "Record length = %ld\n", __FUNCTION__, sal_info_type, total_len); + } + *buffer = (u8 *) log_buffer; + return total_len; + } else { + IA64_LOG_UNLOCK(sal_info_type); + return 0; + } +} /* * ia64_mca_log_sal_error_record * - * This function retrieves a specified error record type from SAL, - * wakes up any processes waiting for error records, and sends it to - * the system log. + * This function retrieves a specified error record type from SAL + * and wakes up any processes waiting for error records. * * Inputs : sal_info_type (Type of error record MCA/CMC/CPE/INIT) - * Outputs : platform error status */ -int -ia64_mca_log_sal_error_record(int sal_info_type, int called_from_init) +static void +ia64_mca_log_sal_error_record(int sal_info_type) { u8 *buffer; u64 size; - int platform_err; + int irq_safe = sal_info_type != SAL_INFO_TYPE_MCA && sal_info_type != SAL_INFO_TYPE_INIT; + static const char * const rec_name[] = { "MCA", "INIT", "CMC", "CPE" }; - size = ia64_log_get(sal_info_type, &buffer); + size = ia64_log_get(sal_info_type, &buffer, irq_safe); if (!size) - return 0; + return; - /* TODO: - * 1. analyze error logs to determine recoverability - * 2. perform error recovery procedures, if applicable - * 3. set ia64_os_mca_recovery_successful flag, if applicable - */ + salinfo_log_wakeup(sal_info_type, buffer, size, irq_safe); + + if (irq_safe) + printk(KERN_INFO "CPU %d: SAL log contains %s error record\n", + smp_processor_id(), + sal_info_type < ARRAY_SIZE(rec_name) ? rec_name[sal_info_type] : "UNKNOWN"); - salinfo_log_wakeup(sal_info_type, buffer, size); - platform_err = ia64_log_print(sal_info_type, (prfunc_t)printk); /* Clear logs from corrected errors in case there's no user-level logger */ if (sal_info_type == SAL_INFO_TYPE_CPE || sal_info_type == SAL_INFO_TYPE_CMC) ia64_sal_clear_state_info(sal_info_type); - - return platform_err; } /* * platform dependent error handling */ #ifndef PLATFORM_MCA_HANDLERS -void -mca_handler_platform (void) -{ -} - -irqreturn_t +static irqreturn_t ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs) { - IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. CPU:%d vector = %#x\n", - smp_processor_id(), cpe_irq); + IA64_MCA_DEBUG("%s: received interrupt. CPU:%d vector = %#x\n", + __FUNCTION__, smp_processor_id(), cpe_irq); /* SAL spec states this should run w/ interrupts enabled */ local_irq_enable(); /* Get the CMC error record and log it */ - ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE, 0); + ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); return IRQ_HANDLED; } @@ -356,7 +421,7 @@ PUT_NAT_BIT(sw->caller_unat, &pt->r30); PUT_NAT_BIT(sw->caller_unat, &pt->r31); } -void +static void init_handler_platform (pal_min_state_area_t *ms, struct pt_regs *pt, struct switch_stack *sw) { @@ -403,48 +468,6 @@ while (1); /* hang city if no debugger */ } -/* - * ia64_mca_init_platform - * - * External entry for platform specific MCA initialization. - * - * Inputs - * None - * - * Outputs - * None - */ -void -ia64_mca_init_platform (void) -{ - -} - -/* - * ia64_mca_check_errors - * - * External entry to check for error records which may have been posted by SAL - * for a prior failure which resulted in a machine shutdown before an the - * error could be logged. This function must be called after the filesystem - * is initialized. - * - * Inputs : None - * - * Outputs : None - */ -int -ia64_mca_check_errors (void) -{ - /* - * If there is an MCA error record pending, get it and log it. - */ - ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA, 1); - - return 0; -} - -device_initcall(ia64_mca_check_errors); - #ifdef CONFIG_ACPI /* * ia64_mca_register_cpev @@ -465,13 +488,13 @@ isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_CPE_INT, SAL_MC_PARAM_MECHANISM_INT, cpev, 0, 0); if (isrv.status) { - printk(KERN_ERR "ia64_mca_platform_init: failed to register Corrected " - "Platform Error interrupt vector with SAL.\n"); + printk(KERN_ERR "Failed to register Corrected Platform " + "Error interrupt vector with SAL (status %ld)\n", isrv.status); return; } - IA64_MCA_DEBUG("ia64_mca_platform_init: corrected platform error " - "vector %#x setup and enabled\n", cpev); + IA64_MCA_DEBUG("%s: corrected platform error " + "vector %#x setup and enabled\n", __FUNCTION__, cpev); } #endif /* CONFIG_ACPI */ @@ -499,12 +522,12 @@ cmcv.cmcv_vector = IA64_CMC_VECTOR; ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); - IA64_MCA_DEBUG("ia64_mca_platform_init: CPU %d corrected " + IA64_MCA_DEBUG("%s: CPU %d corrected " "machine check vector %#x setup and enabled.\n", - smp_processor_id(), IA64_CMC_VECTOR); + __FUNCTION__, smp_processor_id(), IA64_CMC_VECTOR); - IA64_MCA_DEBUG("ia64_mca_platform_init: CPU %d CMCV = %#016lx\n", - smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV)); + IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n", + __FUNCTION__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV)); } /* @@ -519,7 +542,7 @@ * Outputs * None */ -void +static void ia64_mca_cmc_vector_disable (void *dummy) { cmcv_reg_t cmcv; @@ -529,9 +552,9 @@ cmcv.cmcv_mask = 1; /* Mask/disable interrupt */ ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval) - IA64_MCA_DEBUG("ia64_mca_cmc_vector_disable: CPU %d corrected " + IA64_MCA_DEBUG("%s: CPU %d corrected " "machine check vector %#x disabled.\n", - smp_processor_id(), cmcv.cmcv_vector); + __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector); } /* @@ -546,7 +569,7 @@ * Outputs * None */ -void +static void ia64_mca_cmc_vector_enable (void *dummy) { cmcv_reg_t cmcv; @@ -556,63 +579,9 @@ cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */ ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval) - IA64_MCA_DEBUG("ia64_mca_cmc_vector_enable: CPU %d corrected " + IA64_MCA_DEBUG("%s: CPU %d corrected " "machine check vector %#x enabled.\n", - smp_processor_id(), cmcv.cmcv_vector); -} - - -#if defined(MCA_TEST) - -sal_log_processor_info_t slpi_buf; - -void -mca_test(void) -{ - slpi_buf.valid.psi_static_struct = 1; - slpi_buf.valid.num_cache_check = 1; - slpi_buf.valid.num_tlb_check = 1; - slpi_buf.valid.num_bus_check = 1; - slpi_buf.valid.processor_static_info.minstate = 1; - slpi_buf.valid.processor_static_info.br = 1; - slpi_buf.valid.processor_static_info.cr = 1; - slpi_buf.valid.processor_static_info.ar = 1; - slpi_buf.valid.processor_static_info.rr = 1; - slpi_buf.valid.processor_static_info.fr = 1; - - ia64_os_mca_dispatch(); -} - -#endif /* #if defined(MCA_TEST) */ - - -/* - * verify_guid - * - * Compares a test guid to a target guid and returns result. - * - * Inputs - * test_guid * (ptr to guid to be verified) - * target_guid * (ptr to standard guid to be verified against) - * - * Outputs - * 0 (test verifies against target) - * non-zero (test guid does not verify) - */ -static int -verify_guid (efi_guid_t *test, efi_guid_t *target) -{ - int rc; -#ifdef IA64_MCA_DEBUG_INFO - char out[40]; -#endif - - if ((rc = efi_guidcmp(*test, *target))) { - IA64_MCA_DEBUG(KERN_DEBUG - "verify_guid: invalid GUID = %s\n", - efi_guid_unparse(test, out)); - } - return rc; + __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector); } /* @@ -640,191 +609,6 @@ } /* - * ia64_mca_init - * - * Do all the system level mca specific initialization. - * - * 1. Register spinloop and wakeup request interrupt vectors - * - * 2. Register OS_MCA handler entry point - * - * 3. Register OS_INIT handler entry point - * - * 4. Initialize MCA/CMC/INIT related log buffers maintained by the OS. - * - * Note that this initialization is done very early before some kernel - * services are available. - * - * Inputs : None - * - * Outputs : None - */ -void __init -ia64_mca_init(void) -{ - ia64_fptr_t *mon_init_ptr = (ia64_fptr_t *)ia64_monarch_init_handler; - ia64_fptr_t *slave_init_ptr = (ia64_fptr_t *)ia64_slave_init_handler; - ia64_fptr_t *mca_hldlr_ptr = (ia64_fptr_t *)ia64_os_mca_dispatch; - int i; - s64 rc; - struct ia64_sal_retval isrv; - u64 timeout = IA64_MCA_RENDEZ_TIMEOUT; /* platform specific */ - - IA64_MCA_DEBUG("ia64_mca_init: begin\n"); - - /* initialize recovery success indicator */ - ia64_os_mca_recovery_successful = 0; - - /* Clear the Rendez checkin flag for all cpus */ - for(i = 0 ; i < NR_CPUS; i++) - ia64_mc_info.imi_rendez_checkin[i] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; - - /* - * Register the rendezvous spinloop and wakeup mechanism with SAL - */ - - /* Register the rendezvous interrupt vector with SAL */ - while (1) { - isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT, - SAL_MC_PARAM_MECHANISM_INT, - IA64_MCA_RENDEZ_VECTOR, - timeout, - SAL_MC_PARAM_RZ_ALWAYS); - rc = isrv.status; - if (rc == 0) - break; - if (rc == -2) { - printk(KERN_INFO "ia64_mca_init: increasing MCA rendezvous timeout from " - "%ld to %ld\n", timeout, isrv.v0); - timeout = isrv.v0; - continue; - } - printk(KERN_ERR "ia64_mca_init: Failed to register rendezvous interrupt " - "with SAL. rc = %ld\n", rc); - return; - } - - /* Register the wakeup interrupt vector with SAL */ - isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP, - SAL_MC_PARAM_MECHANISM_INT, - IA64_MCA_WAKEUP_VECTOR, - 0, 0); - rc = isrv.status; - if (rc) { - printk(KERN_ERR "ia64_mca_init: Failed to register wakeup interrupt with SAL. " - "rc = %ld\n", rc); - return; - } - - IA64_MCA_DEBUG("ia64_mca_init: registered mca rendezvous spinloop and wakeup mech.\n"); - - ia64_mc_info.imi_mca_handler = ia64_tpa(mca_hldlr_ptr->fp); - /* - * XXX - disable SAL checksum by setting size to 0; should be - * ia64_tpa(ia64_os_mca_dispatch_end) - ia64_tpa(ia64_os_mca_dispatch); - */ - ia64_mc_info.imi_mca_handler_size = 0; - - /* Register the os mca handler with SAL */ - if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_MCA, - ia64_mc_info.imi_mca_handler, - ia64_tpa(mca_hldlr_ptr->gp), - ia64_mc_info.imi_mca_handler_size, - 0, 0, 0))) - { - printk(KERN_ERR "ia64_mca_init: Failed to register os mca handler with SAL. " - "rc = %ld\n", rc); - return; - } - - IA64_MCA_DEBUG("ia64_mca_init: registered os mca handler with SAL at 0x%lx, gp = 0x%lx\n", - ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp)); - - /* - * XXX - disable SAL checksum by setting size to 0, should be - * IA64_INIT_HANDLER_SIZE - */ - ia64_mc_info.imi_monarch_init_handler = ia64_tpa(mon_init_ptr->fp); - ia64_mc_info.imi_monarch_init_handler_size = 0; - ia64_mc_info.imi_slave_init_handler = ia64_tpa(slave_init_ptr->fp); - ia64_mc_info.imi_slave_init_handler_size = 0; - - IA64_MCA_DEBUG("ia64_mca_init: os init handler at %lx\n", - ia64_mc_info.imi_monarch_init_handler); - - /* Register the os init handler with SAL */ - if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_INIT, - ia64_mc_info.imi_monarch_init_handler, - ia64_tpa(ia64_getreg(_IA64_REG_GP)), - ia64_mc_info.imi_monarch_init_handler_size, - ia64_mc_info.imi_slave_init_handler, - ia64_tpa(ia64_getreg(_IA64_REG_GP)), - ia64_mc_info.imi_slave_init_handler_size))) - { - printk(KERN_ERR "ia64_mca_init: Failed to register m/s init handlers with SAL. " - "rc = %ld\n", rc); - return; - } - - IA64_MCA_DEBUG("ia64_mca_init: registered os init handler with SAL\n"); - - /* - * Configure the CMCI/P vector and handler. Interrupts for CMC are - * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). - */ - register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); - register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); - ia64_mca_cmc_vector_setup(); /* Setup vector on BSP & enable */ - - /* Setup the MCA rendezvous interrupt vector */ - register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); - - /* Setup the MCA wakeup interrupt vector */ - register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); - -#ifdef CONFIG_ACPI - /* Setup the CPE interrupt vector */ - { - irq_desc_t *desc; - unsigned int irq; - int cpev = acpi_request_vector(ACPI_INTERRUPT_CPEI); - - if (cpev >= 0) { - for (irq = 0; irq < NR_IRQS; ++irq) - if (irq_to_vector(irq) == cpev) { - desc = irq_descp(irq); - desc->status |= IRQ_PER_CPU; - desc->handler = &irq_type_iosapic_level; - setup_irq(irq, &mca_cpe_irqaction); - } - ia64_mca_register_cpev(cpev); - } - } -#endif - - /* Initialize the areas set aside by the OS to buffer the - * platform/processor error states for MCA/INIT/CMC - * handling. - */ - ia64_log_init(SAL_INFO_TYPE_MCA); - ia64_log_init(SAL_INFO_TYPE_INIT); - ia64_log_init(SAL_INFO_TYPE_CMC); - ia64_log_init(SAL_INFO_TYPE_CPE); - -#if defined(MCA_TEST) - mca_test(); -#endif /* #if defined(MCA_TEST) */ - - printk(KERN_INFO "Mca related initialization done\n"); - - /* commented out because this is done elsewhere */ -#if 0 - /* Do post-failure MCA error logging */ - ia64_mca_check_errors(); -#endif -} - -/* * ia64_mca_wakeup_ipi_wait * * Wait for the inter-cpu interrupt to be sent by the @@ -834,7 +618,7 @@ * Inputs : None * Outputs : None */ -void +static void ia64_mca_wakeup_ipi_wait(void) { int irr_num = (IA64_MCA_WAKEUP_VECTOR >> 6); @@ -868,7 +652,7 @@ * Inputs : cpuid * Outputs : None */ -void +static void ia64_mca_wakeup(int cpu) { platform_send_ipi(cpu, IA64_MCA_WAKEUP_VECTOR, IA64_IPI_DM_INT, 0); @@ -884,7 +668,7 @@ * Inputs : None * Outputs : None */ -void +static void ia64_mca_wakeup_all(void) { int cpu; @@ -909,7 +693,7 @@ * Inputs : None * Outputs : None */ -irqreturn_t +static irqreturn_t ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs) { unsigned long flags; @@ -935,7 +719,6 @@ return IRQ_HANDLED; } - /* * ia64_mca_wakeup_int_handler * @@ -951,7 +734,7 @@ * Outputs : None * */ -irqreturn_t +static irqreturn_t ia64_mca_wakeup_int_handler(int wakeup_irq, void *arg, struct pt_regs *ptregs) { return IRQ_HANDLED; @@ -971,11 +754,9 @@ * Outputs : None */ -void -ia64_return_to_sal_check(void) +static void +ia64_return_to_sal_check(int recover) { - pal_processor_state_info_t *psp = (pal_processor_state_info_t *) - &ia64_sal_to_os_handoff_state.proc_state_param; /* Copy over some relevant stuff from the sal_to_os_mca_handoff * so that it can be used at the time of os_mca_to_sal_handoff @@ -986,15 +767,10 @@ ia64_os_to_sal_handoff_state.imots_sal_check_ra = ia64_sal_to_os_handoff_state.imsto_sal_check_ra; - /* - * Did we correct the error? At the moment the only error that - * we fix is a TLB error, if any other kind of error occurred - * we must reboot. - */ - if (psp->cc == 1 && psp->bc == 1 && psp->rc == 1 && psp->uc == 1) - ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT; - else + if (recover) ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_CORRECTED; + else + ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT; /* Default = tell SAL to return to same context */ ia64_os_to_sal_handoff_state.imots_context = IA64_MCA_SAME_CONTEXT; @@ -1023,16 +799,12 @@ void ia64_mca_ucmc_handler(void) { - int platform_err = 0; + pal_processor_state_info_t *psp = (pal_processor_state_info_t *) + &ia64_sal_to_os_handoff_state.proc_state_param; + int recover = psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc); /* Get the MCA error record and log it */ - platform_err = ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA, 0); - - /* - * Do Platform-specific mca error handling if required. - */ - if (platform_err) - mca_handler_platform(); + ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA); /* * Wakeup all the processors which are spinning in the rendezvous @@ -1041,7 +813,7 @@ ia64_mca_wakeup_all(); /* Return to SAL */ - ia64_return_to_sal_check(); + ia64_return_to_sal_check(recover); } static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL); @@ -1062,21 +834,21 @@ * Outputs * None */ -irqreturn_t +static irqreturn_t ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs) { static unsigned long cmc_history[CMC_HISTORY_LENGTH]; static int index; static spinlock_t cmc_history_lock = SPIN_LOCK_UNLOCKED; - IA64_MCA_DEBUG("ia64_mca_cmc_int_handler: received interrupt vector = %#x on CPU %d\n", - cmc_irq, smp_processor_id()); + IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n", + __FUNCTION__, cmc_irq, smp_processor_id()); /* SAL spec states this should run w/ interrupts enabled */ local_irq_enable(); /* Get the CMC error record and log it */ - ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC, 0); + ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC); spin_lock(&cmc_history_lock); if (!cmc_polling_enabled) { @@ -1100,7 +872,7 @@ * make sure there's a log somewhere that indicates * something is generating more than we can handle. */ - printk(KERN_WARNING "%s: WARNING: Switching to polling CMC handler, error records may be lost\n", __FUNCTION__); + printk(KERN_WARNING "WARNING: Switching to polling CMC handler; error records may be lost\n"); mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL); @@ -1117,41 +889,6 @@ } /* - * IA64_MCA log support - */ -#define IA64_MAX_LOGS 2 /* Double-buffering for nested MCAs */ -#define IA64_MAX_LOG_TYPES 4 /* MCA, INIT, CMC, CPE */ - -typedef struct ia64_state_log_s -{ - spinlock_t isl_lock; - int isl_index; - unsigned long isl_count; - ia64_err_rec_t *isl_log[IA64_MAX_LOGS]; /* need space to store header + error log */ -} ia64_state_log_t; - -static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES]; - -#define IA64_LOG_ALLOCATE(it, size) \ - {ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)] = \ - (ia64_err_rec_t *)alloc_bootmem(size); \ - ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)] = \ - (ia64_err_rec_t *)alloc_bootmem(size);} -#define IA64_LOG_LOCK_INIT(it) spin_lock_init(&ia64_state_log[it].isl_lock) -#define IA64_LOG_LOCK(it) spin_lock_irqsave(&ia64_state_log[it].isl_lock, s) -#define IA64_LOG_UNLOCK(it) spin_unlock_irqrestore(&ia64_state_log[it].isl_lock,s) -#define IA64_LOG_NEXT_INDEX(it) ia64_state_log[it].isl_index -#define IA64_LOG_CURR_INDEX(it) 1 - ia64_state_log[it].isl_index -#define IA64_LOG_INDEX_INC(it) \ - {ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index; \ - ia64_state_log[it].isl_count++;} -#define IA64_LOG_INDEX_DEC(it) \ - ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index -#define IA64_LOG_NEXT_BUFFER(it) (void *)((ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)])) -#define IA64_LOG_CURR_BUFFER(it) (void *)((ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)])) -#define IA64_LOG_COUNT(it) ia64_state_log[it].isl_count - -/* * ia64_mca_cmc_int_caller * * Triggered by sw interrupt from CMC polling routine. Calls @@ -1165,7 +902,7 @@ * Outputs * handled */ -irqreturn_t +static irqreturn_t ia64_mca_cmc_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) { static int start_count = -1; @@ -1184,10 +921,10 @@ if (cpuid < NR_CPUS) { platform_send_ipi(cpuid, IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0); } else { - /* If no log recored, switch out of polling mode */ + /* If no log record, switch out of polling mode */ if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) { - printk(KERN_WARNING "%s: Returning to interrupt driven CMC handler\n", __FUNCTION__); + printk(KERN_WARNING "Returning to interrupt driven CMC handler\n"); schedule_work(&cmc_enable_work); cmc_polling_enabled = 0; @@ -1232,7 +969,7 @@ * Outputs * handled */ -irqreturn_t +static irqreturn_t ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) { static int start_count = -1; @@ -1286,41 +1023,6 @@ } /* - * ia64_mca_late_init - * - * Opportunity to setup things that require initialization later - * than ia64_mca_init. Setup a timer to poll for CPEs if the - * platform doesn't support an interrupt driven mechanism. - * - * Inputs : None - * Outputs : Status - */ -static int __init -ia64_mca_late_init(void) -{ - init_timer(&cmc_poll_timer); - cmc_poll_timer.function = ia64_mca_cmc_poll; - - /* Reset to the correct state */ - cmc_polling_enabled = 0; - - init_timer(&cpe_poll_timer); - cpe_poll_timer.function = ia64_mca_cpe_poll; - -#ifdef CONFIG_ACPI - /* If platform doesn't support CPEI, get the timer going. */ - if (acpi_request_vector(ACPI_INTERRUPT_CPEI) < 0 && cpe_poll_enabled) { - register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); - ia64_mca_cpe_poll(0UL); - } -#endif - - return 0; -} - -device_initcall(ia64_mca_late_init); - -/* * C portion of the OS INIT handler * * Called from ia64_monarch_init_handler @@ -1337,6 +1039,8 @@ { pal_min_state_area_t *ms; + oops_in_progress = 1; /* avoid deadlock in printk, but it makes recovery dodgy */ + printk(KERN_INFO "Entered OS INIT handler. PSP=%lx\n", ia64_sal_to_os_handoff_state.proc_state_param); @@ -1350,1083 +1054,256 @@ init_handler_platform(ms, pt, sw); /* call platform specific routines */ } -/* - * ia64_log_prt_guid - * - * Print a formatted GUID. - * - * Inputs : p_guid (ptr to the GUID) - * prfunc (print function) - * Outputs : None - * - */ -void -ia64_log_prt_guid (efi_guid_t *p_guid, prfunc_t prfunc) -{ - char out[40]; - printk(KERN_DEBUG "GUID = %s\n", efi_guid_unparse(p_guid, out)); -} - -static void -ia64_log_hexdump(unsigned char *p, unsigned long n_ch, prfunc_t prfunc) +static int __init +ia64_mca_disable_cpe_polling(char *str) { - unsigned long i; - int j; - - if (!p) - return; - - for (i = 0; i < n_ch;) { - prfunc("%p ", (void *)p); - for (j = 0; (j < 16) && (i < n_ch); i++, j++, p++) { - prfunc("%02x ", *p); - } - prfunc("\n"); - } + cpe_poll_enabled = 0; + return 1; } -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL +__setup("disable_cpe_poll", ia64_mca_disable_cpe_polling); -static void -ia64_log_prt_record_header (sal_log_record_header_t *rh, prfunc_t prfunc) -{ - prfunc("SAL RECORD HEADER: Record buffer = %p, header size = %ld\n", - (void *)rh, sizeof(sal_log_record_header_t)); - ia64_log_hexdump((unsigned char *)rh, sizeof(sal_log_record_header_t), - (prfunc_t)prfunc); - prfunc("Total record length = %d\n", rh->len); - ia64_log_prt_guid(&rh->platform_guid, prfunc); - prfunc("End of SAL RECORD HEADER\n"); -} +static struct irqaction cmci_irqaction = { + .handler = ia64_mca_cmc_int_handler, + .flags = SA_INTERRUPT, + .name = "cmc_hndlr" +}; -static void -ia64_log_prt_section_header (sal_log_section_hdr_t *sh, prfunc_t prfunc) -{ - prfunc("SAL SECTION HEADER: Record buffer = %p, header size = %ld\n", - (void *)sh, sizeof(sal_log_section_hdr_t)); - ia64_log_hexdump((unsigned char *)sh, sizeof(sal_log_section_hdr_t), - (prfunc_t)prfunc); - prfunc("Length of section & header = %d\n", sh->len); - ia64_log_prt_guid(&sh->guid, prfunc); - prfunc("End of SAL SECTION HEADER\n"); -} -#endif // MCA_PRT_XTRA_DATA for test only @FVL +static struct irqaction cmcp_irqaction = { + .handler = ia64_mca_cmc_int_caller, + .flags = SA_INTERRUPT, + .name = "cmc_poll" +}; -/* - * ia64_log_init - * Reset the OS ia64 log buffer - * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) - * Outputs : None - */ -void -ia64_log_init(int sal_info_type) -{ - u64 max_size = 0; +static struct irqaction mca_rdzv_irqaction = { + .handler = ia64_mca_rendez_int_handler, + .flags = SA_INTERRUPT, + .name = "mca_rdzv" +}; - IA64_LOG_NEXT_INDEX(sal_info_type) = 0; - IA64_LOG_LOCK_INIT(sal_info_type); +static struct irqaction mca_wkup_irqaction = { + .handler = ia64_mca_wakeup_int_handler, + .flags = SA_INTERRUPT, + .name = "mca_wkup" +}; - // SAL will tell us the maximum size of any error record of this type - max_size = ia64_sal_get_state_info_size(sal_info_type); - if (!max_size) - /* alloc_bootmem() doesn't like zero-sized allocations! */ - return; +#ifdef CONFIG_ACPI +static struct irqaction mca_cpe_irqaction = { + .handler = ia64_mca_cpe_int_handler, + .flags = SA_INTERRUPT, + .name = "cpe_hndlr" +}; - // set up OS data structures to hold error info - IA64_LOG_ALLOCATE(sal_info_type, max_size); - memset(IA64_LOG_CURR_BUFFER(sal_info_type), 0, max_size); - memset(IA64_LOG_NEXT_BUFFER(sal_info_type), 0, max_size); -} +static struct irqaction mca_cpep_irqaction = { + .handler = ia64_mca_cpe_int_caller, + .flags = SA_INTERRUPT, + .name = "cpe_poll" +}; +#endif /* CONFIG_ACPI */ /* - * ia64_log_get + * ia64_mca_init * - * Get the current MCA log from SAL and copy it into the OS log buffer. + * Do all the system level mca specific initialization. * - * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) - * Outputs : size (total record length) - * *buffer (ptr to error record) + * 1. Register spinloop and wakeup request interrupt vectors * - */ -static u64 -ia64_log_get(int sal_info_type, u8 **buffer) -{ - sal_log_record_header_t *log_buffer; - u64 total_len = 0; - int s; - - IA64_LOG_LOCK(sal_info_type); - - /* Get the process state information */ - log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type); - - total_len = ia64_sal_get_state_info(sal_info_type, (u64 *)log_buffer); - - if (total_len) { - IA64_LOG_INDEX_INC(sal_info_type); - IA64_LOG_UNLOCK(sal_info_type); - IA64_MCA_DEBUG("ia64_log_get: SAL error record type %d retrieved. " - "Record length = %ld\n", sal_info_type, total_len); - *buffer = (u8 *) log_buffer; - return total_len; - } else { - IA64_LOG_UNLOCK(sal_info_type); - return 0; - } -} - -/* - * ia64_log_prt_oem_data + * 2. Register OS_MCA handler entry point * - * Print OEM specific data if included. + * 3. Register OS_INIT handler entry point * - * Inputs : header_len (length passed in section header) - * sect_len (default length of section type) - * p_data (ptr to data) - * prfunc (print function) - * Outputs : None + * 4. Initialize MCA/CMC/INIT related log buffers maintained by the OS. * - */ -void -ia64_log_prt_oem_data (int header_len, int sect_len, u8 *p_data, prfunc_t prfunc) -{ - int oem_data_len, i; - - if ((oem_data_len = header_len - sect_len) > 0) { - prfunc(" OEM Specific Data:"); - for (i = 0; i < oem_data_len; i++, p_data++) - prfunc(" %02x", *p_data); - } - prfunc("\n"); -} - -/* - * ia64_log_rec_header_print + * Note that this initialization is done very early before some kernel + * services are available. * - * Log info from the SAL error record header. + * Inputs : None * - * Inputs : lh * (ptr to SAL log error record header) - * prfunc (fn ptr of log output function to use) * Outputs : None */ -void -ia64_log_rec_header_print (sal_log_record_header_t *lh, prfunc_t prfunc) -{ - prfunc("+Err Record ID: %ld SAL Rev: %2x.%02x\n", lh->id, - lh->revision.major, lh->revision.minor); - prfunc("+Time: %02x/%02x/%02x%02x %02x:%02x:%02x Severity %d\n", - lh->timestamp.slh_month, lh->timestamp.slh_day, - lh->timestamp.slh_century, lh->timestamp.slh_year, - lh->timestamp.slh_hour, lh->timestamp.slh_minute, - lh->timestamp.slh_second, lh->severity); -} - -/* - * ia64_log_processor_regs_print - * Print the contents of the saved processor register(s) in the format - * [] - * - * Inputs : regs (Register save buffer) - * reg_num (# of registers) - * reg_class (application/banked/control/bank1_general) - * reg_prefix (ar/br/cr/b1_gr) - * Outputs : None - * - */ -void -ia64_log_processor_regs_print(u64 *regs, - int reg_num, - char *reg_class, - char *reg_prefix, - prfunc_t prfunc) -{ - int i; - - prfunc("+%s Registers\n", reg_class); - for (i = 0; i < reg_num; i++) - prfunc("+ %s[%d] 0x%lx\n", reg_prefix, i, regs[i]); -} - -/* - * ia64_log_processor_fp_regs_print - * Print the contents of the saved floating page register(s) in the format - * [] - * - * Inputs: ia64_fpreg (Register save buffer) - * reg_num (# of registers) - * reg_class (application/banked/control/bank1_general) - * reg_prefix (ar/br/cr/b1_gr) - * Outputs: None - * - */ -void -ia64_log_processor_fp_regs_print (struct ia64_fpreg *regs, - int reg_num, - char *reg_class, - char *reg_prefix, - prfunc_t prfunc) +void __init +ia64_mca_init(void) { + ia64_fptr_t *mon_init_ptr = (ia64_fptr_t *)ia64_monarch_init_handler; + ia64_fptr_t *slave_init_ptr = (ia64_fptr_t *)ia64_slave_init_handler; + ia64_fptr_t *mca_hldlr_ptr = (ia64_fptr_t *)ia64_os_mca_dispatch; int i; + s64 rc; + struct ia64_sal_retval isrv; + u64 timeout = IA64_MCA_RENDEZ_TIMEOUT; /* platform specific */ - prfunc("+%s Registers\n", reg_class); - for (i = 0; i < reg_num; i++) - prfunc("+ %s[%d] 0x%lx%016lx\n", reg_prefix, i, regs[i].u.bits[1], - regs[i].u.bits[0]); -} - -static char *pal_mesi_state[] = { - "Invalid", - "Shared", - "Exclusive", - "Modified", - "Reserved1", - "Reserved2", - "Reserved3", - "Reserved4" -}; - -static char *pal_cache_op[] = { - "Unknown", - "Move in", - "Cast out", - "Coherency check", - "Internal", - "Instruction fetch", - "Implicit Writeback", - "Reserved" -}; - -/* - * ia64_log_cache_check_info_print - * Display the machine check information related to cache error(s). - * Inputs: i (Multiple errors are logged, i - index of logged error) - * cc_info * (Ptr to cache check info logged by the PAL and later - * captured by the SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_cache_check_info_print (int i, - sal_log_mod_error_info_t *cache_check_info, - prfunc_t prfunc) -{ - pal_cache_check_info_t *info; - u64 target_addr; - - if (!cache_check_info->valid.check_info) { - IA64_MCA_DEBUG("ia64_mca_log_print: invalid cache_check_info[%d]\n",i); - return; /* If check info data not valid, skip it */ - } - - info = (pal_cache_check_info_t *)&cache_check_info->check_info; - target_addr = cache_check_info->target_identifier; - - prfunc("+ Cache check info[%d]\n+", i); - prfunc(" Level: L%d,",info->level); - if (info->mv) - prfunc(" Mesi: %s,",pal_mesi_state[info->mesi]); - prfunc(" Index: %d,", info->index); - if (info->ic) - prfunc(" Cache: Instruction,"); - if (info->dc) - prfunc(" Cache: Data,"); - if (info->tl) - prfunc(" Line: Tag,"); - if (info->dl) - prfunc(" Line: Data,"); - prfunc(" Operation: %s,", pal_cache_op[info->op]); - if (info->wiv) - prfunc(" Way: %d,", info->way); - if (cache_check_info->valid.target_identifier) - /* Hope target address is saved in target_identifier */ - if (info->tv) - prfunc(" Target Addr: 0x%lx,", target_addr); - if (info->mcc) - prfunc(" MC: Corrected"); - prfunc("\n"); -} - -/* - * ia64_log_tlb_check_info_print - * Display the machine check information related to tlb error(s). - * Inputs: i (Multiple errors are logged, i - index of logged error) - * tlb_info * (Ptr to machine check info logged by the PAL and later - * captured by the SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_tlb_check_info_print (int i, - sal_log_mod_error_info_t *tlb_check_info, - prfunc_t prfunc) - -{ - pal_tlb_check_info_t *info; - - if (!tlb_check_info->valid.check_info) { - IA64_MCA_DEBUG("ia64_mca_log_print: invalid tlb_check_info[%d]\n", i); - return; /* If check info data not valid, skip it */ - } - - info = (pal_tlb_check_info_t *)&tlb_check_info->check_info; - - prfunc("+ TLB Check Info [%d]\n+", i); - if (info->itc) - prfunc(" Failure: Instruction Translation Cache"); - if (info->dtc) - prfunc(" Failure: Data Translation Cache"); - if (info->itr) { - prfunc(" Failure: Instruction Translation Register"); - prfunc(" ,Slot: %ld", info->tr_slot); - } - if (info->dtr) { - prfunc(" Failure: Data Translation Register"); - prfunc(" ,Slot: %ld", info->tr_slot); - } - if (info->mcc) - prfunc(" ,MC: Corrected"); - prfunc("\n"); -} - -/* - * ia64_log_bus_check_info_print - * Display the machine check information related to bus error(s). - * Inputs: i (Multiple errors are logged, i - index of logged error) - * bus_info * (Ptr to machine check info logged by the PAL and later - * captured by the SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_bus_check_info_print (int i, - sal_log_mod_error_info_t *bus_check_info, - prfunc_t prfunc) -{ - pal_bus_check_info_t *info; - u64 req_addr; /* Address of the requestor of the transaction */ - u64 resp_addr; /* Address of the responder of the transaction */ - u64 targ_addr; /* Address where the data was to be delivered to */ - /* or obtained from */ - - if (!bus_check_info->valid.check_info) { - IA64_MCA_DEBUG("ia64_mca_log_print: invalid bus_check_info[%d]\n", i); - return; /* If check info data not valid, skip it */ - } - - info = (pal_bus_check_info_t *)&bus_check_info->check_info; - req_addr = bus_check_info->requestor_identifier; - resp_addr = bus_check_info->responder_identifier; - targ_addr = bus_check_info->target_identifier; - - prfunc("+ BUS Check Info [%d]\n+", i); - prfunc(" Status Info: %d", info->bsi); - prfunc(" ,Severity: %d", info->sev); - prfunc(" ,Transaction Type: %d", info->type); - prfunc(" ,Transaction Size: %d", info->size); - if (info->cc) - prfunc(" ,Cache-cache-transfer"); - if (info->ib) - prfunc(" ,Error: Internal"); - if (info->eb) - prfunc(" ,Error: External"); - if (info->mcc) - prfunc(" ,MC: Corrected"); - if (info->tv) - prfunc(" ,Target Address: 0x%lx", targ_addr); - if (info->rq) - prfunc(" ,Requestor Address: 0x%lx", req_addr); - if (info->tv) - prfunc(" ,Responder Address: 0x%lx", resp_addr); - prfunc("\n"); -} + IA64_MCA_DEBUG("%s: begin\n", __FUNCTION__); -/* - * ia64_log_mem_dev_err_info_print - * - * Format and log the platform memory device error record section data. - * - * Inputs: mem_dev_err_info * (Ptr to memory device error record section - * returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_mem_dev_err_info_print (sal_log_mem_dev_err_info_t *mdei, - prfunc_t prfunc) -{ - prfunc("+ Mem Error Detail: "); + /* Clear the Rendez checkin flag for all cpus */ + for(i = 0 ; i < NR_CPUS; i++) + ia64_mc_info.imi_rendez_checkin[i] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; - if (mdei->valid.error_status) - prfunc(" Error Status: %#lx,", mdei->error_status); - if (mdei->valid.physical_addr) - prfunc(" Physical Address: %#lx,", mdei->physical_addr); - if (mdei->valid.addr_mask) - prfunc(" Address Mask: %#lx,", mdei->addr_mask); - if (mdei->valid.node) - prfunc(" Node: %d,", mdei->node); - if (mdei->valid.card) - prfunc(" Card: %d,", mdei->card); - if (mdei->valid.module) - prfunc(" Module: %d,", mdei->module); - if (mdei->valid.bank) - prfunc(" Bank: %d,", mdei->bank); - if (mdei->valid.device) - prfunc(" Device: %d,", mdei->device); - if (mdei->valid.row) - prfunc(" Row: %d,", mdei->row); - if (mdei->valid.column) - prfunc(" Column: %d,", mdei->column); - if (mdei->valid.bit_position) - prfunc(" Bit Position: %d,", mdei->bit_position); - if (mdei->valid.target_id) - prfunc(" ,Target Address: %#lx,", mdei->target_id); - if (mdei->valid.requestor_id) - prfunc(" ,Requestor Address: %#lx,", mdei->requestor_id); - if (mdei->valid.responder_id) - prfunc(" ,Responder Address: %#lx,", mdei->responder_id); - if (mdei->valid.bus_spec_data) - prfunc(" Bus Specific Data: %#lx,", mdei->bus_spec_data); - prfunc("\n"); - - if (mdei->valid.oem_id) { - u8 *p_data = &(mdei->oem_id[0]); - int i; - - prfunc(" OEM Memory Controller ID:"); - for (i = 0; i < 16; i++, p_data++) - prfunc(" %02x", *p_data); - prfunc("\n"); - } + /* + * Register the rendezvous spinloop and wakeup mechanism with SAL + */ - if (mdei->valid.oem_data) { - platform_mem_dev_err_print((int)mdei->header.len, - (int)sizeof(sal_log_mem_dev_err_info_t) - 1, - &(mdei->oem_data[0]), prfunc); + /* Register the rendezvous interrupt vector with SAL */ + while (1) { + isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT, + SAL_MC_PARAM_MECHANISM_INT, + IA64_MCA_RENDEZ_VECTOR, + timeout, + SAL_MC_PARAM_RZ_ALWAYS); + rc = isrv.status; + if (rc == 0) + break; + if (rc == -2) { + printk(KERN_INFO "Increasing MCA rendezvous timeout from " + "%ld to %ld milliseconds\n", timeout, isrv.v0); + timeout = isrv.v0; + continue; + } + printk(KERN_ERR "Failed to register rendezvous interrupt " + "with SAL (status %ld)\n", rc); + return; } -} - -/* - * ia64_log_sel_dev_err_info_print - * - * Format and log the platform SEL device error record section data. - * - * Inputs: sel_dev_err_info * (Ptr to the SEL device error record section - * returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_sel_dev_err_info_print (sal_log_sel_dev_err_info_t *sdei, - prfunc_t prfunc) -{ - int i; - - prfunc("+ SEL Device Error Detail: "); - - if (sdei->valid.record_id) - prfunc(" Record ID: %#x", sdei->record_id); - if (sdei->valid.record_type) - prfunc(" Record Type: %#x", sdei->record_type); - prfunc(" Time Stamp: "); - for (i = 0; i < 4; i++) - prfunc("%1d", sdei->timestamp[i]); - if (sdei->valid.generator_id) - prfunc(" Generator ID: %#x", sdei->generator_id); - if (sdei->valid.evm_rev) - prfunc(" Message Format Version: %#x", sdei->evm_rev); - if (sdei->valid.sensor_type) - prfunc(" Sensor Type: %#x", sdei->sensor_type); - if (sdei->valid.sensor_num) - prfunc(" Sensor Number: %#x", sdei->sensor_num); - if (sdei->valid.event_dir) - prfunc(" Event Direction Type: %#x", sdei->event_dir); - if (sdei->valid.event_data1) - prfunc(" Data1: %#x", sdei->event_data1); - if (sdei->valid.event_data2) - prfunc(" Data2: %#x", sdei->event_data2); - if (sdei->valid.event_data3) - prfunc(" Data3: %#x", sdei->event_data3); - prfunc("\n"); - -} - -/* - * ia64_log_pci_bus_err_info_print - * - * Format and log the platform PCI bus error record section data. - * - * Inputs: pci_bus_err_info * (Ptr to the PCI bus error record section - * returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_pci_bus_err_info_print (sal_log_pci_bus_err_info_t *pbei, - prfunc_t prfunc) -{ - prfunc("+ PCI Bus Error Detail: "); - if (pbei->valid.err_status) - prfunc(" Error Status: %#lx", pbei->err_status); - if (pbei->valid.err_type) - prfunc(" Error Type: %#x", pbei->err_type); - if (pbei->valid.bus_id) - prfunc(" Bus ID: %#x", pbei->bus_id); - if (pbei->valid.bus_address) - prfunc(" Bus Address: %#lx", pbei->bus_address); - if (pbei->valid.bus_data) - prfunc(" Bus Data: %#lx", pbei->bus_data); - if (pbei->valid.bus_cmd) - prfunc(" Bus Command: %#lx", pbei->bus_cmd); - if (pbei->valid.requestor_id) - prfunc(" Requestor ID: %#lx", pbei->requestor_id); - if (pbei->valid.responder_id) - prfunc(" Responder ID: %#lx", pbei->responder_id); - if (pbei->valid.target_id) - prfunc(" Target ID: %#lx", pbei->target_id); - if (pbei->valid.oem_data) - prfunc("\n"); - - if (pbei->valid.oem_data) { - platform_pci_bus_err_print((int)pbei->header.len, - (int)sizeof(sal_log_pci_bus_err_info_t) - 1, - &(pbei->oem_data[0]), prfunc); + /* Register the wakeup interrupt vector with SAL */ + isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP, + SAL_MC_PARAM_MECHANISM_INT, + IA64_MCA_WAKEUP_VECTOR, + 0, 0); + rc = isrv.status; + if (rc) { + printk(KERN_ERR "Failed to register wakeup interrupt with SAL " + "(status %ld)\n", rc); + return; } -} - -/* - * ia64_log_smbios_dev_err_info_print - * - * Format and log the platform SMBIOS device error record section data. - * - * Inputs: smbios_dev_err_info * (Ptr to the SMBIOS device error record - * section returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_smbios_dev_err_info_print (sal_log_smbios_dev_err_info_t *sdei, - prfunc_t prfunc) -{ - u8 i; - prfunc("+ SMBIOS Device Error Detail: "); + IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __FUNCTION__); - if (sdei->valid.event_type) - prfunc(" Event Type: %#x", sdei->event_type); - if (sdei->valid.time_stamp) { - prfunc(" Time Stamp: "); - for (i = 0; i < 6; i++) - prfunc("%d", sdei->time_stamp[i]); - } - if ((sdei->valid.data) && (sdei->valid.length)) { - prfunc(" Data: "); - for (i = 0; i < sdei->length; i++) - prfunc(" %02x", sdei->data[i]); - } - prfunc("\n"); -} + ia64_mc_info.imi_mca_handler = ia64_tpa(mca_hldlr_ptr->fp); + /* + * XXX - disable SAL checksum by setting size to 0; should be + * ia64_tpa(ia64_os_mca_dispatch_end) - ia64_tpa(ia64_os_mca_dispatch); + */ + ia64_mc_info.imi_mca_handler_size = 0; -/* - * ia64_log_pci_comp_err_info_print - * - * Format and log the platform PCI component error record section data. - * - * Inputs: pci_comp_err_info * (Ptr to the PCI component error record section - * returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_pci_comp_err_info_print(sal_log_pci_comp_err_info_t *pcei, - prfunc_t prfunc) -{ - u32 n_mem_regs, n_io_regs; - u64 i, n_pci_data; - u64 *p_reg_data; - u8 *p_oem_data; - - prfunc("+ PCI Component Error Detail: "); - - if (pcei->valid.err_status) - prfunc(" Error Status: %#lx\n", pcei->err_status); - if (pcei->valid.comp_info) - prfunc(" Component Info: Vendor Id = %#x, Device Id = %#x," - " Class Code = %#x, Seg/Bus/Dev/Func = %d/%d/%d/%d\n", - pcei->comp_info.vendor_id, pcei->comp_info.device_id, - pcei->comp_info.class_code, pcei->comp_info.seg_num, - pcei->comp_info.bus_num, pcei->comp_info.dev_num, - pcei->comp_info.func_num); - - n_mem_regs = (pcei->valid.num_mem_regs) ? pcei->num_mem_regs : 0; - n_io_regs = (pcei->valid.num_io_regs) ? pcei->num_io_regs : 0; - p_reg_data = &(pcei->reg_data_pairs[0]); - p_oem_data = (u8 *)p_reg_data + - (n_mem_regs + n_io_regs) * 2 * sizeof(u64); - n_pci_data = p_oem_data - (u8 *)pcei; - - if (n_pci_data > pcei->header.len) { - prfunc(" Invalid PCI Component Error Record format: length = %ld, " - " Size PCI Data = %d, Num Mem-Map/IO-Map Regs = %ld/%ld\n", - pcei->header.len, n_pci_data, n_mem_regs, n_io_regs); + /* Register the os mca handler with SAL */ + if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_MCA, + ia64_mc_info.imi_mca_handler, + ia64_tpa(mca_hldlr_ptr->gp), + ia64_mc_info.imi_mca_handler_size, + 0, 0, 0))) + { + printk(KERN_ERR "Failed to register OS MCA handler with SAL " + "(status %ld)\n", rc); return; } - if (n_mem_regs) { - prfunc(" Memory Mapped Registers\n Address \tValue\n"); - for (i = 0; i < pcei->num_mem_regs; i++) { - prfunc(" %#lx %#lx\n", p_reg_data[0], p_reg_data[1]); - p_reg_data += 2; - } - } - if (n_io_regs) { - prfunc(" I/O Mapped Registers\n Address \tValue\n"); - for (i = 0; i < pcei->num_io_regs; i++) { - prfunc(" %#lx %#lx\n", p_reg_data[0], p_reg_data[1]); - p_reg_data += 2; - } - } - if (pcei->valid.oem_data) { - platform_pci_comp_err_print((int)pcei->header.len, n_pci_data, - p_oem_data, prfunc); - prfunc("\n"); - } -} - -/* - * ia64_log_plat_specific_err_info_print - * - * Format and log the platform specifie error record section data. - * - * Inputs: sel_dev_err_info * (Ptr to the platform specific error record - * section returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_plat_specific_err_info_print (sal_log_plat_specific_err_info_t *psei, - prfunc_t prfunc) -{ - prfunc("+ Platform Specific Error Detail: "); + IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __FUNCTION__, + ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp)); - if (psei->valid.err_status) - prfunc(" Error Status: %#lx", psei->err_status); - if (psei->valid.guid) { - prfunc(" GUID: "); - ia64_log_prt_guid(&psei->guid, prfunc); - } - if (psei->valid.oem_data) { - platform_plat_specific_err_print((int) psei->header.len, - (char *) psei->oem_data - (char *) psei, - &psei->oem_data[0], prfunc); - } - prfunc("\n"); -} + /* + * XXX - disable SAL checksum by setting size to 0, should be + * size of the actual init handler in mca_asm.S. + */ + ia64_mc_info.imi_monarch_init_handler = ia64_tpa(mon_init_ptr->fp); + ia64_mc_info.imi_monarch_init_handler_size = 0; + ia64_mc_info.imi_slave_init_handler = ia64_tpa(slave_init_ptr->fp); + ia64_mc_info.imi_slave_init_handler_size = 0; -/* - * ia64_log_host_ctlr_err_info_print - * - * Format and log the platform host controller error record section data. - * - * Inputs: host_ctlr_err_info * (Ptr to the host controller error record - * section returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_host_ctlr_err_info_print (sal_log_host_ctlr_err_info_t *hcei, - prfunc_t prfunc) -{ - prfunc("+ Host Controller Error Detail: "); + IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __FUNCTION__, + ia64_mc_info.imi_monarch_init_handler); - if (hcei->valid.err_status) - prfunc(" Error Status: %#lx", hcei->err_status); - if (hcei->valid.requestor_id) - prfunc(" Requestor ID: %#lx", hcei->requestor_id); - if (hcei->valid.responder_id) - prfunc(" Responder ID: %#lx", hcei->responder_id); - if (hcei->valid.target_id) - prfunc(" Target ID: %#lx", hcei->target_id); - if (hcei->valid.bus_spec_data) - prfunc(" Bus Specific Data: %#lx", hcei->bus_spec_data); - if (hcei->valid.oem_data) { - platform_host_ctlr_err_print((int)hcei->header.len, - (int)sizeof(sal_log_host_ctlr_err_info_t) - 1, - &(hcei->oem_data[0]), prfunc); + /* Register the os init handler with SAL */ + if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_INIT, + ia64_mc_info.imi_monarch_init_handler, + ia64_tpa(ia64_getreg(_IA64_REG_GP)), + ia64_mc_info.imi_monarch_init_handler_size, + ia64_mc_info.imi_slave_init_handler, + ia64_tpa(ia64_getreg(_IA64_REG_GP)), + ia64_mc_info.imi_slave_init_handler_size))) + { + printk(KERN_ERR "Failed to register m/s INIT handlers with SAL " + "(status %ld)\n", rc); + return; } - prfunc("\n"); -} -/* - * ia64_log_plat_bus_err_info_print - * - * Format and log the platform bus error record section data. - * - * Inputs: plat_bus_err_info * (Ptr to the platform bus error record section - * returned by SAL) - * prfunc (fn ptr of print function to be used for output) - * Outputs: None - */ -void -ia64_log_plat_bus_err_info_print (sal_log_plat_bus_err_info_t *pbei, - prfunc_t prfunc) -{ - prfunc("+ Platform Bus Error Detail: "); + IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __FUNCTION__); - if (pbei->valid.err_status) - prfunc(" Error Status: %#lx", pbei->err_status); - if (pbei->valid.requestor_id) - prfunc(" Requestor ID: %#lx", pbei->requestor_id); - if (pbei->valid.responder_id) - prfunc(" Responder ID: %#lx", pbei->responder_id); - if (pbei->valid.target_id) - prfunc(" Target ID: %#lx", pbei->target_id); - if (pbei->valid.bus_spec_data) - prfunc(" Bus Specific Data: %#lx", pbei->bus_spec_data); - if (pbei->valid.oem_data) { - platform_plat_bus_err_print((int)pbei->header.len, - (int)sizeof(sal_log_plat_bus_err_info_t) - 1, - &(pbei->oem_data[0]), prfunc); - } - prfunc("\n"); -} + /* + * Configure the CMCI/P vector and handler. Interrupts for CMC are + * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). + */ + register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); + register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); + ia64_mca_cmc_vector_setup(); /* Setup vector on BSP & enable */ -/* - * ia64_log_proc_dev_err_info_print - * - * Display the processor device error record. - * - * Inputs: sal_log_processor_info_t * (Ptr to processor device error record - * section body). - * prfunc (fn ptr of print function to be used - * for output). - * Outputs: None - */ -void -ia64_log_proc_dev_err_info_print (sal_log_processor_info_t *slpi, - prfunc_t prfunc) -{ -#ifdef MCA_PRT_XTRA_DATA - size_t d_len = slpi->header.len - sizeof(sal_log_section_hdr_t); -#endif - sal_processor_static_info_t *spsi; - int i; - sal_log_mod_error_info_t *p_data; + /* Setup the MCA rendezvous interrupt vector */ + register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); - prfunc("+Processor Device Error Info Section\n"); + /* Setup the MCA wakeup interrupt vector */ + register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL +#ifdef CONFIG_ACPI + /* Setup the CPE interrupt vector */ { - char *p_data = (char *)&slpi->valid; + irq_desc_t *desc; + unsigned int irq; + int cpev = acpi_request_vector(ACPI_INTERRUPT_CPEI); - prfunc("SAL_PROC_DEV_ERR SECTION DATA: Data buffer = %p, " - "Data size = %ld\n", (void *)p_data, d_len); - ia64_log_hexdump(p_data, d_len, prfunc); - prfunc("End of SAL_PROC_DEV_ERR SECTION DATA\n"); + if (cpev >= 0) { + for (irq = 0; irq < NR_IRQS; ++irq) + if (irq_to_vector(irq) == cpev) { + desc = irq_descp(irq); + desc->status |= IRQ_PER_CPU; + desc->handler = &irq_type_iosapic_level; + setup_irq(irq, &mca_cpe_irqaction); + } + ia64_mca_register_cpev(cpev); + } } -#endif // MCA_PRT_XTRA_DATA for test only @FVL - - if (slpi->valid.proc_error_map) - prfunc(" Processor Error Map: %#lx\n", slpi->proc_error_map); - - if (slpi->valid.proc_state_param) - prfunc(" Processor State Param: %#lx\n", slpi->proc_state_parameter); - - if (slpi->valid.proc_cr_lid) - prfunc(" Processor LID: %#lx\n", slpi->proc_cr_lid); +#endif - /* - * Note: March 2001 SAL spec states that if the number of elements in any - * of the MOD_ERROR_INFO_STRUCT arrays is zero, the entire array is - * absent. Also, current implementations only allocate space for number of - * elements used. So we walk the data pointer from here on. + /* Initialize the areas set aside by the OS to buffer the + * platform/processor error states for MCA/INIT/CMC + * handling. */ - p_data = &slpi->info[0]; - - /* Print the cache check information if any*/ - for (i = 0 ; i < slpi->valid.num_cache_check; i++, p_data++) - ia64_log_cache_check_info_print(i, p_data, prfunc); - - /* Print the tlb check information if any*/ - for (i = 0 ; i < slpi->valid.num_tlb_check; i++, p_data++) - ia64_log_tlb_check_info_print(i, p_data, prfunc); - - /* Print the bus check information if any*/ - for (i = 0 ; i < slpi->valid.num_bus_check; i++, p_data++) - ia64_log_bus_check_info_print(i, p_data, prfunc); - - /* Print the reg file check information if any*/ - for (i = 0 ; i < slpi->valid.num_reg_file_check; i++, p_data++) - ia64_log_hexdump((u8 *)p_data, sizeof(sal_log_mod_error_info_t), - prfunc); /* Just hex dump for now */ - - /* Print the ms check information if any*/ - for (i = 0 ; i < slpi->valid.num_ms_check; i++, p_data++) - ia64_log_hexdump((u8 *)p_data, sizeof(sal_log_mod_error_info_t), - prfunc); /* Just hex dump for now */ - - /* Print CPUID registers if any*/ - if (slpi->valid.cpuid_info) { - u64 *p = (u64 *)p_data; - - prfunc(" CPUID Regs: %#lx %#lx %#lx %#lx\n", p[0], p[1], p[2], p[3]); - p_data++; - } + ia64_log_init(SAL_INFO_TYPE_MCA); + ia64_log_init(SAL_INFO_TYPE_INIT); + ia64_log_init(SAL_INFO_TYPE_CMC); + ia64_log_init(SAL_INFO_TYPE_CPE); - /* Print processor static info if any */ - if (slpi->valid.psi_static_struct) { - spsi = (sal_processor_static_info_t *)p_data; - - /* Print branch register contents if valid */ - if (spsi->valid.br) - ia64_log_processor_regs_print(spsi->br, 8, "Branch", "br", - prfunc); - - /* Print control register contents if valid */ - if (spsi->valid.cr) - ia64_log_processor_regs_print(spsi->cr, 128, "Control", "cr", - prfunc); - - /* Print application register contents if valid */ - if (spsi->valid.ar) - ia64_log_processor_regs_print(spsi->ar, 128, "Application", - "ar", prfunc); - - /* Print region register contents if valid */ - if (spsi->valid.rr) - ia64_log_processor_regs_print(spsi->rr, 8, "Region", "rr", - prfunc); - - /* Print floating-point register contents if valid */ - if (spsi->valid.fr) - ia64_log_processor_fp_regs_print(spsi->fr, 128, "Floating-point", "fr", - prfunc); - } + printk(KERN_INFO "MCA related initialization done\n"); } /* - * ia64_log_processor_info_print + * ia64_mca_late_init * - * Display the processor-specific information logged by PAL as a part - * of MCA or INIT or CMC. + * Opportunity to setup things that require initialization later + * than ia64_mca_init. Setup a timer to poll for CPEs if the + * platform doesn't support an interrupt driven mechanism. * - * Inputs : lh (Pointer of the sal log header which specifies the - * format of SAL state info as specified by the SAL spec). - * prfunc (fn ptr of print function to be used for output). - * Outputs : None + * Inputs : None + * Outputs : Status */ -void -ia64_log_processor_info_print(sal_log_record_header_t *lh, prfunc_t prfunc) +static int __init +ia64_mca_late_init(void) { - sal_log_section_hdr_t *slsh; - int n_sects; - u32 ercd_pos; - - if (!lh) - return; - -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL - ia64_log_prt_record_header(lh, prfunc); -#endif // MCA_PRT_XTRA_DATA for test only @FVL - - if ((ercd_pos = sizeof(sal_log_record_header_t)) >= lh->len) { - IA64_MCA_DEBUG("ia64_mca_log_print: " - "truncated SAL CMC error record. len = %d\n", - lh->len); - return; - } - - /* Print record header info */ - ia64_log_rec_header_print(lh, prfunc); - - for (n_sects = 0; (ercd_pos < lh->len); n_sects++, ercd_pos += slsh->len) { - /* point to next section header */ - slsh = (sal_log_section_hdr_t *)((char *)lh + ercd_pos); - -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL - ia64_log_prt_section_header(slsh, prfunc); -#endif // MCA_PRT_XTRA_DATA for test only @FVL - - if (verify_guid(&slsh->guid, &(SAL_PROC_DEV_ERR_SECT_GUID))) { - IA64_MCA_DEBUG("ia64_mca_log_print: unsupported record section\n"); - continue; - } - - /* - * Now process processor device error record section - */ - ia64_log_proc_dev_err_info_print((sal_log_processor_info_t *)slsh, printk); - } - - IA64_MCA_DEBUG("ia64_mca_log_print: " - "found %d sections in SAL CMC error record. len = %d\n", - n_sects, lh->len); - if (!n_sects) { - prfunc("No Processor Device Error Info Section found\n"); - return; - } -} - -/* - * ia64_log_platform_info_print - * - * Format and Log the SAL Platform Error Record. - * - * Inputs : lh (Pointer to the sal error record header with format - * specified by the SAL spec). - * prfunc (fn ptr of log output function to use) - * Outputs : platform error status - */ -int -ia64_log_platform_info_print (sal_log_record_header_t *lh, prfunc_t prfunc) -{ - sal_log_section_hdr_t *slsh; - int n_sects; - u32 ercd_pos; - int platform_err = 0; - - if (!lh) - return platform_err; - -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL - ia64_log_prt_record_header(lh, prfunc); -#endif // MCA_PRT_XTRA_DATA for test only @FVL - - if ((ercd_pos = sizeof(sal_log_record_header_t)) >= lh->len) { - IA64_MCA_DEBUG("ia64_mca_log_print: " - "truncated SAL error record. len = %d\n", - lh->len); - return platform_err; - } - - /* Print record header info */ - ia64_log_rec_header_print(lh, prfunc); - - for (n_sects = 0; (ercd_pos < lh->len); n_sects++, ercd_pos += slsh->len) { - /* point to next section header */ - slsh = (sal_log_section_hdr_t *)((char *)lh + ercd_pos); - -#ifdef MCA_PRT_XTRA_DATA // for test only @FVL - ia64_log_prt_section_header(slsh, prfunc); - - if (efi_guidcmp(slsh->guid, SAL_PROC_DEV_ERR_SECT_GUID) != 0) { - size_t d_len = slsh->len - sizeof(sal_log_section_hdr_t); - char *p_data = (char *)&((sal_log_mem_dev_err_info_t *)slsh)->valid; - - prfunc("Start of Platform Err Data Section: Data buffer = %p, " - "Data size = %ld\n", (void *)p_data, d_len); - ia64_log_hexdump(p_data, d_len, prfunc); - prfunc("End of Platform Err Data Section\n"); - } -#endif // MCA_PRT_XTRA_DATA for test only @FVL + init_timer(&cmc_poll_timer); + cmc_poll_timer.function = ia64_mca_cmc_poll; - /* - * Now process CPE error record section - */ - if (efi_guidcmp(slsh->guid, SAL_PROC_DEV_ERR_SECT_GUID) == 0) { - ia64_log_proc_dev_err_info_print((sal_log_processor_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform Memory Device Error Info Section\n"); - ia64_log_mem_dev_err_info_print((sal_log_mem_dev_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_SEL_DEV_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform SEL Device Error Info Section\n"); - ia64_log_sel_dev_err_info_print((sal_log_sel_dev_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_PCI_BUS_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform PCI Bus Error Info Section\n"); - ia64_log_pci_bus_err_info_print((sal_log_pci_bus_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform SMBIOS Device Error Info Section\n"); - ia64_log_smbios_dev_err_info_print((sal_log_smbios_dev_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_PCI_COMP_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform PCI Component Error Info Section\n"); - ia64_log_pci_comp_err_info_print((sal_log_pci_comp_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform Specific Error Info Section\n"); - ia64_log_plat_specific_err_info_print((sal_log_plat_specific_err_info_t *) - slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_HOST_CTLR_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform Host Controller Error Info Section\n"); - ia64_log_host_ctlr_err_info_print((sal_log_host_ctlr_err_info_t *)slsh, - prfunc); - } else if (efi_guidcmp(slsh->guid, SAL_PLAT_BUS_ERR_SECT_GUID) == 0) { - platform_err = 1; - prfunc("+Platform Bus Error Info Section\n"); - ia64_log_plat_bus_err_info_print((sal_log_plat_bus_err_info_t *)slsh, - prfunc); - } else { - IA64_MCA_DEBUG("ia64_mca_log_print: unsupported record section\n"); - continue; - } - } + /* Reset to the correct state */ + cmc_polling_enabled = 0; - IA64_MCA_DEBUG("ia64_mca_log_print: found %d sections in SAL error record. len = %d\n", - n_sects, lh->len); - if (!n_sects) { - prfunc("No Platform Error Info Sections found\n"); - return platform_err; - } - return platform_err; -} + init_timer(&cpe_poll_timer); + cpe_poll_timer.function = ia64_mca_cpe_poll; -/* - * ia64_log_print - * - * Displays the contents of the OS error log information - * - * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) - * prfunc (fn ptr of log output function to use) - * Outputs : platform error status - */ -int -ia64_log_print(int sal_info_type, prfunc_t prfunc) -{ - int platform_err = 0; - - switch(sal_info_type) { - case SAL_INFO_TYPE_MCA: - prfunc("+CPU %d: SAL log contains MCA error record\n", smp_processor_id()); - ia64_log_rec_header_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc); - break; - case SAL_INFO_TYPE_INIT: - prfunc("+CPU %d: SAL log contains INIT error record\n", smp_processor_id()); - ia64_log_rec_header_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc); - break; - case SAL_INFO_TYPE_CMC: - prfunc("+BEGIN HARDWARE ERROR STATE AT CMC\n"); - ia64_log_processor_info_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc); - prfunc("+END HARDWARE ERROR STATE AT CMC\n"); - break; - case SAL_INFO_TYPE_CPE: - prfunc("+BEGIN HARDWARE ERROR STATE AT CPE\n"); - ia64_log_platform_info_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc); - prfunc("+END HARDWARE ERROR STATE AT CPE\n"); - break; - default: - prfunc("+MCA UNKNOWN ERROR LOG (UNIMPLEMENTED)\n"); - break; +#ifdef CONFIG_ACPI + /* If platform doesn't support CPEI, get the timer going. */ + if (acpi_request_vector(ACPI_INTERRUPT_CPEI) < 0 && cpe_poll_enabled) { + register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); + ia64_mca_cpe_poll(0UL); } - return platform_err; -} +#endif -static int __init -ia64_mca_disable_cpe_polling(char *str) -{ - cpe_poll_enabled = 0; - return 1; + return 0; } -__setup("disable_cpe_poll", ia64_mca_disable_cpe_polling); +device_initcall(ia64_mca_late_init); diff -Nru a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c --- a/arch/ia64/kernel/salinfo.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/kernel/salinfo.c Tue Feb 17 20:00:07 2004 @@ -16,6 +16,9 @@ * Cache the record across multi-block reads from user space. * Support > 64 cpus. * Delete module_exit and MOD_INC/DEC_COUNT, salinfo cannot be a module. + * + * Jan 28 2004 kaos@sgi.com + * Periodically check for outstanding MCA or INIT records. */ #include @@ -23,6 +26,7 @@ #include #include #include +#include #include #include @@ -179,6 +183,8 @@ /* This routine is invoked in interrupt context. Note: mca.c enables * interrupts before calling this code for CMC/CPE. MCA and INIT events are * not irq safe, do not call any routines that use spinlocks, they may deadlock. + * MCA and INIT records are recorded, a timer event will look for any + * outstanding events and wake up the user space code. * * The buffer passed from mca.c points to the output from ia64_log_get. This is * a persistent buffer but its contents can change between the interrupt and @@ -186,12 +192,12 @@ * changes. */ void -salinfo_log_wakeup(int type, u8 *buffer, u64 size) +salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe) { struct salinfo_data *data = salinfo_data + type; struct salinfo_data_saved *data_saved; unsigned long flags = 0; - int i, irqsafe = type != SAL_INFO_TYPE_MCA && type != SAL_INFO_TYPE_INIT; + int i; int saved_size = ARRAY_SIZE(data->data_saved); BUG_ON(type >= ARRAY_SIZE(salinfo_log_name)); @@ -224,6 +230,35 @@ } } +/* Check for outstanding MCA/INIT records every 5 minutes (arbitrary) */ +#define SALINFO_TIMER_DELAY (5*60*HZ) +static struct timer_list salinfo_timer; + +static void +salinfo_timeout_check(struct salinfo_data *data) +{ + int i; + if (!data->open) + return; + for (i = 0; i < NR_CPUS; ++i) { + if (test_bit(i, &data->cpu_event)) { + /* double up() is not a problem, user space will see no + * records for the additional "events". + */ + up(&data->sem); + } + } +} + +static void +salinfo_timeout (unsigned long arg) +{ + salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_MCA); + salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_INIT); + salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY; + add_timer(&salinfo_timer); +} + static int salinfo_event_open(struct inode *inode, struct file *file) { @@ -562,6 +597,11 @@ } *sdir++ = salinfo_dir; + + init_timer(&salinfo_timer); + salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY; + salinfo_timer.function = &salinfo_timeout; + add_timer(&salinfo_timer); return 0; } diff -Nru a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c --- a/arch/ia64/kernel/smp.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/kernel/smp.c Tue Feb 17 20:00:08 2004 @@ -18,10 +18,6 @@ * 10/13/00 Goutham Rao Updated smp_call_function and * smp_call_function_single to resend IPI on timeouts */ -#define __KERNEL_SYSCALLS__ - -#include - #include #include #include diff -Nru a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c --- a/arch/ia64/kernel/smpboot.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/kernel/smpboot.c Tue Feb 17 20:00:06 2004 @@ -10,10 +10,6 @@ * smp_boot_cpus()/smp_commence() is replaced by * smp_prepare_cpus()/__cpu_up()/smp_cpus_done(). */ - - -#define __KERNEL_SYSCALLS__ - #include #include @@ -77,7 +73,6 @@ extern void start_ap (void); extern unsigned long ia64_iobase; -int cpucount; task_t *task_for_booting_cpu; /* Bitmask of currently online CPUs */ @@ -307,7 +302,6 @@ #ifdef CONFIG_IA64_MCA ia64_mca_cmc_vector_setup(); /* Setup vector on AP & enable */ - ia64_mca_check_errors(); /* For post-failure MCA error logging */ #endif #ifdef CONFIG_PERFMON diff -Nru a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c --- a/arch/ia64/kernel/traps.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/kernel/traps.c Tue Feb 17 20:00:08 2004 @@ -46,21 +46,14 @@ extern spinlock_t timerlist_lock; -static fpswa_interface_t *fpswa_interface; +fpswa_interface_t *fpswa_interface; void __init trap_init (void) { - int major = 0, minor = 0; - - if (ia64_boot_param->fpswa) { + if (ia64_boot_param->fpswa) /* FPSWA fixup: make the interface pointer a kernel virtual address: */ fpswa_interface = __va(ia64_boot_param->fpswa); - major = fpswa_interface->revision >> 16; - minor = fpswa_interface->revision & 0xffff; - } - printk(KERN_INFO "fpswa interface at %lx (rev %d.%d)\n", - ia64_boot_param->fpswa, major, minor); } /* diff -Nru a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c --- a/arch/ia64/kernel/unaligned.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/kernel/unaligned.c Tue Feb 17 20:00:08 2004 @@ -740,6 +740,7 @@ emulate_load_int (unsigned long ifa, load_store_t ld, struct pt_regs *regs) { unsigned int len = 1 << ld.x6_sz; + unsigned long val = 0; /* * r0, as target, doesn't need to be checked because Illegal Instruction @@ -750,21 +751,18 @@ */ /* - * ldX.a we don't try to emulate anything but we must invalidate the ALAT entry. + * ldX.a we will emulate load and also invalidate the ALAT entry. * See comment below for explanation on how we handle ldX.a */ - if (ld.x6_op != 0x2) { - unsigned long val = 0; - if (len != 2 && len != 4 && len != 8) { - DPRINT("unknown size: x6=%d\n", ld.x6_sz); - return -1; - } - /* this assumes little-endian byte-order: */ - if (copy_from_user(&val, (void *) ifa, len)) - return -1; - setreg(ld.r1, val, 0, regs); + if (len != 2 && len != 4 && len != 8) { + DPRINT("unknown size: x6=%d\n", ld.x6_sz); + return -1; } + /* this assumes little-endian byte-order: */ + if (copy_from_user(&val, (void *) ifa, len)) + return -1; + setreg(ld.r1, val, 0, regs); /* * check for updates on any kind of loads @@ -817,7 +815,7 @@ * store & shift to temporary; * r1=temporary * - * So int this case, you would get the right value is r1 but the wrong info in + * So in this case, you would get the right value is r1 but the wrong info in * the ALAT. Notice that you could do it in reverse to finish with address 3 * but you would still get the size wrong. To get the size right, one needs to * execute exactly the same kind of load. You could do it from a aligned @@ -826,9 +824,12 @@ * So no matter what, it is not possible to emulate an advanced load * correctly. But is that really critical ? * + * We will always convert ld.a into a normal load with ALAT invalidated. This + * will enable compiler to do optimization where certain code path after ld.a + * is not required to have ld.c/chk.a, e.g., code path with no intervening stores. * - * Now one has to look at how ld.a is used, one must either do a ld.c.* or - * chck.a.* to reuse the value stored in the ALAT. Both can "fail" (meaning no + * If there is a store after the advanced load, one must either do a ld.c.* or + * chk.a.* to reuse the value stored in the ALAT. Both can "fail" (meaning no * entry found in ALAT), and that's perfectly ok because: * * - ld.c.*, if the entry is not present a normal load is executed @@ -836,19 +837,8 @@ * * In either case, the load can be potentially retried in another form. * - * So it's okay NOT to do any actual load on an unaligned ld.a. However the ALAT - * must be invalidated for the register (so that's chck.a.*,ld.c.* don't pick up - * a stale entry later) The register base update MUST also be performed. - * - * Now what is the content of the register and its NaT bit in the case we don't - * do the load ? EAS2.4, says (in case an actual load is needed) - * - * - r1 = [r3], Nat = 0 if succeeds - * - r1 = 0 Nat = 0 if trying to access non-speculative memory - * - * For us, there is nothing to do, because both ld.c.* and chk.a.* are going to - * retry and thus eventually reload the register thereby changing Nat and - * register content. + * ALAT must be invalidated for the register (so that chk.a or ld.c don't pick + * up a stale entry later). The register base update MUST also be performed. */ /* diff -Nru a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c --- a/arch/ia64/kernel/unwind.c Tue Feb 17 20:00:14 2004 +++ b/arch/ia64/kernel/unwind.c Tue Feb 17 20:00:14 2004 @@ -650,7 +650,7 @@ /* Unwind decoder routines */ -static enum unw_register_index __attribute__((const)) +static enum unw_register_index __attribute_const__ decode_abreg (unsigned char abreg, int memory) { switch (abreg) { diff -Nru a/arch/ia64/lib/io.c b/arch/ia64/lib/io.c --- a/arch/ia64/lib/io.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/lib/io.c Tue Feb 17 20:00:05 2004 @@ -9,13 +9,13 @@ * This needs to be optimized. */ void -__ia64_memcpy_fromio (void * to, unsigned long from, long count) +__ia64_memcpy_fromio (void *to, unsigned long from, long count) { + char *dst = to; + while (count) { count--; - *(char *) to = readb(from); - ((char *) to)++; - from++; + *dst++ = readb(from++); } } EXPORT_SYMBOL(__ia64_memcpy_fromio); @@ -25,13 +25,13 @@ * This needs to be optimized. */ void -__ia64_memcpy_toio (unsigned long to, void * from, long count) +__ia64_memcpy_toio (unsigned long to, void *from, long count) { + char *src = from; + while (count) { count--; - writeb(*(char *) from, to); - ((char *) from)++; - to++; + writeb(*src++, to++); } } EXPORT_SYMBOL(__ia64_memcpy_toio); @@ -65,6 +65,10 @@ #undef __ia64_readw #undef __ia64_readl #undef __ia64_readq +#undef __ia64_readb_relaxed +#undef __ia64_readw_relaxed +#undef __ia64_readl_relaxed +#undef __ia64_readq_relaxed #undef __ia64_writeb #undef __ia64_writew #undef __ia64_writel @@ -126,6 +130,30 @@ unsigned long __ia64_readq (void *addr) +{ + return ___ia64_readq (addr); +} + +unsigned char +__ia64_readb_relaxed (void *addr) +{ + return ___ia64_readb (addr); +} + +unsigned short +__ia64_readw_relaxed (void *addr) +{ + return ___ia64_readw (addr); +} + +unsigned int +__ia64_readl_relaxed (void *addr) +{ + return ___ia64_readl (addr); +} + +unsigned long +__ia64_readq_relaxed (void *addr) { return ___ia64_readq (addr); } diff -Nru a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c --- a/arch/ia64/mm/discontig.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/mm/discontig.c Tue Feb 17 20:00:08 2004 @@ -419,14 +419,14 @@ func = arg; - if (!num_memblks) { - /* No SRAT table, to assume one node (node 0) */ + if (!num_node_memblks) { + /* No SRAT table, so assume one node (node 0) */ if (start < end) (*func)(start, len, 0); return; } - for (i = 0; i < num_memblks; i++) { + for (i = 0; i < num_node_memblks; i++) { rs = max(start, node_memblk[i].start_paddr); re = min(end, node_memblk[i].start_paddr + node_memblk[i].size); diff -Nru a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c --- a/arch/ia64/mm/numa.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/mm/numa.c Tue Feb 17 20:00:06 2004 @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -21,7 +20,6 @@ #include #include -static struct memblk *sysfs_memblks; static struct node *sysfs_nodes; static struct cpu *sysfs_cpus; @@ -29,8 +27,8 @@ * The following structures are usually initialized by ACPI or * similar mechanisms and describe the NUMA characteristics of the machine. */ -int num_memblks; -struct node_memblk_s node_memblk[NR_MEMBLKS]; +int num_node_memblks; +struct node_memblk_s node_memblk[NR_NODE_MEMBLKS]; struct node_cpuid_s node_cpuid[NR_CPUS]; /* * This is a matrix with "distances" between nodes, they should be @@ -44,12 +42,12 @@ { int i; - for (i = 0; i < num_memblks; i++) + for (i = 0; i < num_node_memblks; i++) if (paddr >= node_memblk[i].start_paddr && paddr < node_memblk[i].start_paddr + node_memblk[i].size) break; - return (i < num_memblks) ? node_memblk[i].nid : (num_memblks ? -1 : 0); + return (i < num_node_memblks) ? node_memblk[i].nid : (num_node_memblks ? -1 : 0); } static int __init topology_init(void) @@ -63,18 +61,8 @@ } memset(sysfs_nodes, 0, sizeof(struct node) * numnodes); - sysfs_memblks = kmalloc(sizeof(struct memblk) * num_memblks, - GFP_KERNEL); - if (!sysfs_memblks) { - kfree(sysfs_nodes); - err = -ENOMEM; - goto out; - } - memset(sysfs_memblks, 0, sizeof(struct memblk) * num_memblks); - sysfs_cpus = kmalloc(sizeof(struct cpu) * NR_CPUS, GFP_KERNEL); if (!sysfs_cpus) { - kfree(sysfs_memblks); kfree(sysfs_nodes); err = -ENOMEM; goto out; @@ -83,11 +71,6 @@ for (i = 0; i < numnodes; i++) if ((err = register_node(&sysfs_nodes[i], i, 0))) - goto out; - - for (i = 0; i < num_memblks; i++) - if ((err = register_memblk(&sysfs_memblks[i], i, - &sysfs_nodes[memblk_to_node(i)]))) goto out; for (i = 0; i < NR_CPUS; i++) diff -Nru a/arch/ia64/scripts/toolchain-flags b/arch/ia64/scripts/toolchain-flags --- a/arch/ia64/scripts/toolchain-flags Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/scripts/toolchain-flags Tue Feb 17 20:00:08 2004 @@ -5,9 +5,14 @@ CPPFLAGS="" CC=$1 OBJDUMP=$2 +READELF=$3 dir=$(dirname $0) tmp=${TMPDIR:-/tmp} out=$tmp/out$$ + +# Check whether cross-segment segment-relative relocs work fine. We need +# that for building the gate DSO: + $CC -nostdlib -static -Wl,-T$dir/check-segrel.lds $dir/check-segrel.S -o $out res=$($OBJDUMP --full --section .rodata $out | fgrep 000 | cut -f3 -d' ') rm -f $out @@ -18,6 +23,16 @@ please upgrade to a newer version (it is safe to use this linker, but the kernel will be bigger than strictly necessary). EOF +fi + +# Check whether .align inside a function works as expected. + +$CC -c $dir/check-text-align.S -o $out +$READELF -u $out | fgrep -q 'prologue(rlen=12)' +res=$? +rm -f $out +if [ $res -eq 0 ]; then + CPPFLAGS="$CPPFLAGS -DHAVE_WORKING_TEXT_ALIGN" fi if ! $CC -c $dir/check-model.c -o $out 2>&1 | grep __model__ | grep -q attrib diff -Nru a/arch/ia64/sn/io/hwgfs/hcl.c b/arch/ia64/sn/io/hwgfs/hcl.c --- a/arch/ia64/sn/io/hwgfs/hcl.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/hwgfs/hcl.c Tue Feb 17 20:00:07 2004 @@ -645,7 +645,7 @@ void -hwgraph_debug(char *file, char * function, int line, vertex_hdl_t vhdl1, vertex_hdl_t vhdl2, char *format, ...) +hwgraph_debug(char *file, const char * function, int line, vertex_hdl_t vhdl1, vertex_hdl_t vhdl2, char *format, ...) { int pos; diff -Nru a/arch/ia64/sn/io/hwgfs/hcl_util.c b/arch/ia64/sn/io/hwgfs/hcl_util.c --- a/arch/ia64/sn/io/hwgfs/hcl_util.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/hwgfs/hcl_util.c Tue Feb 17 20:00:05 2004 @@ -151,7 +151,7 @@ (void)hwgraph_edge_add( hwgraph_all_cnodes, vhdl, cnodeid_buffer); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hwgraph_all_cnodes, NULL, "Creating path vhdl1\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, hwgraph_all_cnodes, NULL, "Creating path vhdl1\n"); } } diff -Nru a/arch/ia64/sn/io/io.c b/arch/ia64/sn/io/io.c --- a/arch/ia64/sn/io/io.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/io/io.c Tue Feb 17 20:00:06 2004 @@ -6,9 +6,9 @@ * Copyright (C) 1992-1997, 2000-2003 Silicon Graphics, Inc. All Rights Reserved. */ -#include #include #include +#include #include #include #include @@ -123,7 +123,7 @@ /* sanity check */ if (byte_count_max > byte_count) - return(NULL); + return NULL; hubinfo_get(hubv, &hubinfo); @@ -152,7 +152,7 @@ * For now, reject requests that span big windows. */ if ((xtalk_addr % BWIN_SIZE) + byte_count > BWIN_SIZE) - return(NULL); + return NULL; /* Round xtalk address down for big window alignement */ @@ -184,7 +184,7 @@ widget == bw_piomap->hpio_xtalk_info.xp_target) { bw_piomap->hpio_holdcnt++; spin_unlock(&hubinfo->h_bwlock); - return(bw_piomap); + return bw_piomap; } } @@ -264,7 +264,7 @@ done: spin_unlock(&hubinfo->h_bwlock); - return(bw_piomap); + return bw_piomap; } /* @@ -330,18 +330,18 @@ { /* Verify that range can be mapped using the specified piomap */ if (xtalk_addr < hub_piomap->hpio_xtalk_info.xp_xtalk_addr) - return(0); + return 0; if (xtalk_addr + byte_count > ( hub_piomap->hpio_xtalk_info.xp_xtalk_addr + hub_piomap->hpio_xtalk_info.xp_mapsz)) - return(0); + return 0; if (hub_piomap->hpio_flags & HUB_PIOMAP_IS_VALID) - return(hub_piomap->hpio_xtalk_info.xp_kvaddr + - (xtalk_addr % hub_piomap->hpio_xtalk_info.xp_mapsz)); + return hub_piomap->hpio_xtalk_info.xp_kvaddr + + (xtalk_addr % hub_piomap->hpio_xtalk_info.xp_mapsz); else - return(0); + return 0; } @@ -388,9 +388,9 @@ addr = (caddr_t)iaddr; } #endif - return(addr); + return addr; } else - return(0); + return 0; } @@ -425,7 +425,7 @@ if (flags & XTALK_FIXED) dmamap->hdma_flags |= HUB_DMAMAP_IS_FIXED; - return(dmamap); + return dmamap; } /* @@ -467,42 +467,12 @@ } /* There isn't actually any DMA mapping hardware on the hub. */ - return( (PHYS_TO_DMA(paddr)) ); -} - -/* - * Establish a DMA mapping using the resources allocated in a previous dmamap_alloc. - * Return an appropriate crosstalk address list that maps to the specified physical - * address list. - */ -/* ARGSUSED */ -alenlist_t -hub_dmamap_list(hub_dmamap_t hub_dmamap, /* use these mapping resources */ - alenlist_t palenlist, /* map this area of memory */ - unsigned flags) -{ - vertex_hdl_t vhdl; - - ASSERT(hub_dmamap->hdma_flags & HUB_DMAMAP_IS_VALID); - - if (hub_dmamap->hdma_flags & HUB_DMAMAP_USED) { - /* If the map is FIXED, re-use is OK. */ - if (!(hub_dmamap->hdma_flags & HUB_DMAMAP_IS_FIXED)) { - char name[MAXDEVNAME]; - vhdl = hub_dmamap->hdma_xtalk_info.xd_dev; - printk(KERN_WARNING "%s: hub_dmamap_list re-uses dmamap\n", vertex_to_name(vhdl, name, MAXDEVNAME)); - } - } else { - hub_dmamap->hdma_flags |= HUB_DMAMAP_USED; - } - - /* There isn't actually any DMA mapping hardware on the hub. */ - return(palenlist); + return (PHYS_TO_DMA(paddr)); } /* * Driver indicates that it has completed whatever DMA it may have started - * after an earlier dmamap_addr or dmamap_list call. + * after an earlier dmamap_addr call. */ void hub_dmamap_done(hub_dmamap_t hub_dmamap) /* done with these mapping resources */ @@ -532,24 +502,7 @@ size_t byte_count, /* length */ unsigned flags) /* defined in dma.h */ { - return( (PHYS_TO_DMA(paddr)) ); -} - -/* - * Translate a list of IP27 addresses and lengths into a list of crosstalk - * addresses and lengths. No actual hardware mapping takes place; the hub - * has no DMA mapping registers -- crosstalk addresses map directly. - */ -/* ARGSUSED */ -alenlist_t -hub_dmatrans_list( vertex_hdl_t dev, /* translate for this device */ - device_desc_t dev_desc, /* device descriptor */ - alenlist_t palenlist, /* system address/length list */ - unsigned flags) /* defined in dma.h */ -{ - BUG(); - /* no translation needed */ - return(palenlist); + return (PHYS_TO_DMA(paddr)); } /*ARGSUSED*/ @@ -568,15 +521,6 @@ /* XXX- flush caches, if cache coherency WAR is needed */ } -/*ARGSUSED*/ -void -hub_dmalist_drain( vertex_hdl_t vhdl, - alenlist_t list) -{ - /* XXX- flush caches, if cache coherency WAR is needed */ -} - - /* CONFIGURATION MANAGEMENT */ @@ -609,8 +553,8 @@ { nasid_t nasid = NASID_GET(addr); - if (((__psunsigned_t)addr >= RAW_NODE_SWIN_BASE(nasid, 0)) && - ((__psunsigned_t)addr < RAW_NODE_SWIN_BASE(nasid, 1))) + if (((unsigned long)addr >= RAW_NODE_SWIN_BASE(nasid, 0)) && + ((unsigned long)addr < RAW_NODE_SWIN_BASE(nasid, 1))) return 1; return 0; } @@ -626,8 +570,8 @@ return 1; /* XXX - Assume this is really a small window address */ - if (WIDGETID_GET((__psunsigned_t)addra) == - WIDGETID_GET((__psunsigned_t)addrb)) + if (WIDGETID_GET((unsigned long)addra) == + WIDGETID_GET((unsigned long)addrb)) return 1; return 0; @@ -768,28 +712,25 @@ * crosstalk bus provider. */ xtalk_provider_t hub_provider = { - (xtalk_piomap_alloc_f *) hub_piomap_alloc, - (xtalk_piomap_free_f *) hub_piomap_free, - (xtalk_piomap_addr_f *) hub_piomap_addr, - (xtalk_piomap_done_f *) hub_piomap_done, - (xtalk_piotrans_addr_f *) hub_piotrans_addr, - - (xtalk_dmamap_alloc_f *) hub_dmamap_alloc, - (xtalk_dmamap_free_f *) hub_dmamap_free, - (xtalk_dmamap_addr_f *) hub_dmamap_addr, - (xtalk_dmamap_list_f *) hub_dmamap_list, - (xtalk_dmamap_done_f *) hub_dmamap_done, - (xtalk_dmatrans_addr_f *) hub_dmatrans_addr, - (xtalk_dmatrans_list_f *) hub_dmatrans_list, - (xtalk_dmamap_drain_f *) hub_dmamap_drain, - (xtalk_dmaaddr_drain_f *) hub_dmaaddr_drain, - (xtalk_dmalist_drain_f *) hub_dmalist_drain, - - (xtalk_intr_alloc_f *) hub_intr_alloc, - (xtalk_intr_alloc_f *) hub_intr_alloc_nothd, - (xtalk_intr_free_f *) hub_intr_free, - (xtalk_intr_connect_f *) hub_intr_connect, - (xtalk_intr_disconnect_f *) hub_intr_disconnect, - (xtalk_provider_startup_f *) hub_provider_startup, - (xtalk_provider_shutdown_f *) hub_provider_shutdown, + .piomap_alloc = (xtalk_piomap_alloc_f *) hub_piomap_alloc, + .piomap_free = (xtalk_piomap_free_f *) hub_piomap_free, + .piomap_addr = (xtalk_piomap_addr_f *) hub_piomap_addr, + .piomap_done = (xtalk_piomap_done_f *) hub_piomap_done, + .piotrans_addr = (xtalk_piotrans_addr_f *) hub_piotrans_addr, + + .dmamap_alloc = (xtalk_dmamap_alloc_f *) hub_dmamap_alloc, + .dmamap_free = (xtalk_dmamap_free_f *) hub_dmamap_free, + .dmamap_addr = (xtalk_dmamap_addr_f *) hub_dmamap_addr, + .dmamap_done = (xtalk_dmamap_done_f *) hub_dmamap_done, + .dmatrans_addr = (xtalk_dmatrans_addr_f *) hub_dmatrans_addr, + .dmamap_drain = (xtalk_dmamap_drain_f *) hub_dmamap_drain, + .dmaaddr_drain = (xtalk_dmaaddr_drain_f *) hub_dmaaddr_drain, + + .intr_alloc = (xtalk_intr_alloc_f *) hub_intr_alloc, + .intr_alloc_nothd = (xtalk_intr_alloc_f *) hub_intr_alloc_nothd, + .intr_free = (xtalk_intr_free_f *) hub_intr_free, + .intr_connect = (xtalk_intr_connect_f *) hub_intr_connect, + .intr_disconnect = (xtalk_intr_disconnect_f *) hub_intr_disconnect, + .provider_startup = (xtalk_provider_startup_f *) hub_provider_startup, + .provider_shutdown = (xtalk_provider_shutdown_f *) hub_provider_shutdown, }; diff -Nru a/arch/ia64/sn/io/machvec/pci_bus_cvlink.c b/arch/ia64/sn/io/machvec/pci_bus_cvlink.c --- a/arch/ia64/sn/io/machvec/pci_bus_cvlink.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/machvec/pci_bus_cvlink.c Tue Feb 17 20:00:07 2004 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -22,13 +23,20 @@ static int done_probing; extern irqpda_t *irqpdaindr; -static int pci_bus_map_create(vertex_hdl_t xtalk, char * io_moduleid); +static int pci_bus_map_create(struct pcibr_list_s *softlistp, moduleid_t io_moduleid); vertex_hdl_t devfn_to_vertex(unsigned char busnum, unsigned int devfn); extern void register_pcibr_intr(int irq, pcibr_intr_t intr); -void sn_dma_flush_init(unsigned long start, unsigned long end, int idx, int pin, int slot); +static void sn_dma_flush_init(unsigned long start, + unsigned long end, + int idx, int pin, int slot); extern int cbrick_type_get_nasid(nasid_t); +extern void ioconfig_bus_new_entries(void); +extern void ioconfig_get_busnum(char *, int *); +extern int iomoduleid_get(nasid_t); +extern int pcibr_widget_to_bus(vertex_hdl_t); +extern int isIO9(int); #define IS_OPUS(nasid) (cbrick_type_get_nasid(nasid) == MODULE_OPUSBRICK) #define IS_ALTIX(nasid) (cbrick_type_get_nasid(nasid) == MODULE_CBRICK) @@ -37,7 +45,7 @@ * Init the provider asic for a given device */ -static void +static inline void __init set_pci_provider(struct sn_device_sysdata *device_sysdata) { pciio_info_t pciio_info = pciio_info_get(device_sysdata->vhdl); @@ -69,7 +77,7 @@ * pci_bus_to_vertex() - Given a logical Linux Bus Number returns the associated * pci bus vertex from the SGI IO Infrastructure. */ -vertex_hdl_t +static inline vertex_hdl_t pci_bus_to_vertex(unsigned char busnum) { @@ -157,16 +165,15 @@ * on the in use pin. This will prevent the race condition between PIO read responses and * DMA writes. */ -void -sn_dma_flush_init(unsigned long start, unsigned long end, int idx, int pin, int slot) { +static void +sn_dma_flush_init(unsigned long start, unsigned long end, int idx, int pin, int slot) +{ nasid_t nasid; unsigned long dnasid; int wid_num; int bus; struct sn_flush_device_list *p; - bridge_t *b; - bridgereg_t dev_sel; - extern int isIO9(int); + void *b; int bwin; int i; @@ -178,8 +185,8 @@ if (flush_nasid_list[nasid].widget_p == NULL) { flush_nasid_list[nasid].widget_p = (struct sn_flush_device_list **)kmalloc((HUB_WIDGET_ID_MAX+1) * sizeof(struct sn_flush_device_list *), GFP_KERNEL); - if (flush_nasid_list[nasid].widget_p <= 0) { - printk("sn_dma_flush_init: Cannot allocate memory for nasid list\n"); + if (!flush_nasid_list[nasid].widget_p) { + printk(KERN_WARNING "sn_dma_flush_init: Cannot allocate memory for nasid list\n"); return; } memset(flush_nasid_list[nasid].widget_p, 0, (HUB_WIDGET_ID_MAX+1) * sizeof(struct sn_flush_device_list *)); @@ -209,8 +216,8 @@ if (flush_nasid_list[nasid].widget_p[wid_num] == NULL) { flush_nasid_list[nasid].widget_p[wid_num] = (struct sn_flush_device_list *)kmalloc( DEV_PER_WIDGET * sizeof (struct sn_flush_device_list), GFP_KERNEL); - if (flush_nasid_list[nasid].widget_p[wid_num] <= 0) { - printk("sn_dma_flush_init: Cannot allocate memory for nasid sub-list\n"); + if (!flush_nasid_list[nasid].widget_p[wid_num]) { + printk(KERN_WARNING "sn_dma_flush_init: Cannot allocate memory for nasid sub-list\n"); return; } memset(flush_nasid_list[nasid].widget_p[wid_num], 0, @@ -243,7 +250,7 @@ break; } } - b = (bridge_t *)(NODE_SWIN_BASE(nasid, wid_num) | (bus << 23) ); + b = (void *)(NODE_SWIN_BASE(nasid, wid_num) | (bus << 23) ); /* If it's IO9, then slot 2 maps to slot 7 and slot 6 maps to slot 8. * To see this is non-trivial. By drawing pictures and reading manuals and talking @@ -267,39 +274,34 @@ if (isIO9(nasid) && ( (IS_ALTIX(nasid) && wid_num == 0xc) || (IS_OPUS(nasid) && wid_num == 0xf) ) && bus == 0) { - if (slot == 2) { - p->force_int_addr = (unsigned long)&b->b_force_always[6].intr; - dev_sel = b->b_int_device; - dev_sel |= (1<<18); - b->b_int_device = dev_sel; + if (pin == 1) { + p->force_int_addr = (unsigned long)pcireg_bridge_force_always_addr_get(b, 6); + pcireg_bridge_intr_device_bit_set(b, (1<<18)); dnasid = NASID_GET(virt_to_phys(&p->flush_addr)); - b->p_int_addr_64[6] = (virt_to_phys(&p->flush_addr) & 0xfffffffff) | - (dnasid << 36) | (0xfUL << 48); - } else if (slot == 3) { /* 12160 SCSI device in IO9 */ - p->force_int_addr = (unsigned long)&b->b_force_always[4].intr; - dev_sel = b->b_int_device; - dev_sel |= (2<<12); - b->b_int_device = dev_sel; + pcireg_bridge_intr_addr_set(b, 6, ((virt_to_phys(&p->flush_addr) & 0xfffffffff) | + (dnasid << 36) | (0xfUL << 48))); + } else if (pin == 2) { /* 12160 SCSI device in IO9 */ + p->force_int_addr = (unsigned long)pcireg_bridge_force_always_addr_get(b, 4); + pcireg_bridge_intr_device_bit_set(b, (2<<12)); dnasid = NASID_GET(virt_to_phys(&p->flush_addr)); - b->p_int_addr_64[4] = (virt_to_phys(&p->flush_addr) & 0xfffffffff) | - (dnasid << 36) | (0xfUL << 48); + pcireg_bridge_intr_addr_set(b, 4, + ((virt_to_phys(&p->flush_addr) & 0xfffffffff) | + (dnasid << 36) | (0xfUL << 48))); } else { /* slot == 6 */ - p->force_int_addr = (unsigned long)&b->b_force_always[7].intr; - dev_sel = b->b_int_device; - dev_sel |= (5<<21); - b->b_int_device = dev_sel; + p->force_int_addr = (unsigned long)pcireg_bridge_force_always_addr_get(b, 7); + pcireg_bridge_intr_device_bit_set(b, (5<<21)); dnasid = NASID_GET(virt_to_phys(&p->flush_addr)); - b->p_int_addr_64[7] = (virt_to_phys(&p->flush_addr) & 0xfffffffff) | - (dnasid << 36) | (0xfUL << 48); + pcireg_bridge_intr_addr_set(b, 7, + ((virt_to_phys(&p->flush_addr) & 0xfffffffff) | + (dnasid << 36) | (0xfUL << 48))); } } else { - p->force_int_addr = (unsigned long)&b->b_force_always[pin + 2].intr; - dev_sel = b->b_int_device; - dev_sel |= ((slot - 1) << ( pin * 3) ); - b->b_int_device = dev_sel; + p->force_int_addr = (unsigned long)pcireg_bridge_force_always_addr_get(b, (pin +2)); + pcireg_bridge_intr_device_bit_set(b, (pin << (pin * 3))); dnasid = NASID_GET(virt_to_phys(&p->flush_addr)); - b->p_int_addr_64[pin + 2] = (virt_to_phys(&p->flush_addr) & 0xfffffffff) | - (dnasid << 36) | (0xfUL << 48); + pcireg_bridge_intr_addr_set(b, (pin + 2), + ((virt_to_phys(&p->flush_addr) & 0xfffffffff) | + (dnasid << 36) | (0xfUL << 48))); } } @@ -310,7 +312,7 @@ * * Other platform specific fixup can also be done here. */ -void +static void __init sn_pci_fixup(int arg) { struct list_head *ln; @@ -321,7 +323,7 @@ pcibr_intr_t intr_handle; pciio_provider_t *pci_provider; vertex_hdl_t device_vertex; - pciio_intr_line_t lines; + pciio_intr_line_t lines = 0; extern int numnodes; int cnode; @@ -357,6 +359,11 @@ pci_bus = pci_bus_b(ln); widget_sysdata = kmalloc(sizeof(struct sn_widget_sysdata), GFP_KERNEL); + if (!widget_sysdata) { + printk(KERN_WARNING "sn_pci_fixup(): Unable to " + "allocate memory for widget_sysdata\n"); + return; + } widget_sysdata->vhdl = pci_bus_to_vertex(pci_bus->number); pci_bus->sysdata = (void *)widget_sysdata; } @@ -394,13 +401,12 @@ device_sysdata = kmalloc(sizeof(struct sn_device_sysdata), GFP_KERNEL); - if (device_sysdata <= 0) { - printk("sn_pci_fixup: Cannot allocate memory for device sysdata\n"); + if (!device_sysdata) { + printk(KERN_WARNING "sn_pci_fixup: Cannot allocate memory for device sysdata\n"); return; } device_sysdata->vhdl = devfn_to_vertex(device_dev->bus->number, device_dev->devfn); - device_sysdata->isa64 = 0; device_dev->sysdata = (void *) device_sysdata; set_pci_provider(device_sysdata); @@ -486,14 +492,22 @@ device_vertex = device_sysdata->vhdl; pci_provider = device_sysdata->pci_provider; + if (!lines) { + continue; + } + irqpdaindr->curr = device_dev; intr_handle = (pci_provider->intr_alloc)(device_vertex, NULL, lines, device_vertex); + if (intr_handle == NULL) { + printk("sn_pci_fixup: pcibr_intr_alloc() failed\n"); + continue; + } irq = intr_handle->bi_irq; irqpdaindr->device_dev[irq] = device_dev; (pci_provider->intr_connect)(intr_handle, (intr_func_t)0, (intr_arg_t)0); device_dev->irq = irq; - register_pcibr_intr(irq, intr_handle); + register_pcibr_intr(irq, (pcibr_intr_t)intr_handle); for (idx = 0; idx < PCI_ROM_RESOURCE; idx++) { int ibits = intr_handle->bi_ibits; @@ -507,10 +521,10 @@ for (i=0; i<8; i++) { if (ibits & (1 << i) ) { sn_dma_flush_init(device_dev->resource[idx].start, - device_dev->resource[idx].end, - idx, - i, - PCI_SLOT(device_dev->devfn)); + device_dev->resource[idx].end, + idx, + i, + PCIBR_INFO_SLOT_GET_EXT(pcibr_info_get(device_sysdata->vhdl))); } } } @@ -548,238 +562,132 @@ * pci_bus_map_create() - Called by pci_bus_to_hcl_cvlink() to finish the job. * * Linux PCI Bus numbers are assigned from lowest module_id numbers - * (rack/slot etc.) starting from HUB_WIDGET_ID_MAX down to - * HUB_WIDGET_ID_MIN: - * widgetnum 15 gets lower Bus Number than widgetnum 14 etc. - * - * Given 2 modules 001c01 and 001c02 we get the following mappings: - * 001c01, widgetnum 15 = Bus number 0 - * 001c01, widgetnum 14 = Bus number 1 - * 001c02, widgetnum 15 = Bus number 3 - * 001c02, widgetnum 14 = Bus number 4 - * etc. - * - * The rational for starting Bus Number 0 with Widget number 15 is because - * the system boot disks are always connected via Widget 15 Slot 0 of the - * I-brick. Linux creates /dev/sd* devices(naming) strating from Bus Number 0 - * Therefore, /dev/sda1 will be the first disk, on Widget 15 of the lowest - * module id(Master Cnode) of the system. - * + * (rack/slot etc.) */ static int -pci_bus_map_create(vertex_hdl_t xtalk, char * io_moduleid) +pci_bus_map_create(struct pcibr_list_s *softlistp, moduleid_t moduleid) { + + int basebus_num, bus_number; + vertex_hdl_t pci_bus = softlistp->bl_vhdl; + char moduleid_str[16]; - vertex_hdl_t master_node_vertex = NULL; - vertex_hdl_t xwidget = NULL; - vertex_hdl_t pci_bus = NULL; - hubinfo_t hubinfo = NULL; - xwidgetnum_t widgetnum; - char pathname[128]; - graph_error_t rv; - int bus; - int basebus_num; - extern void ioconfig_get_busnum(char *, int *); - - int bus_number; + memset(moduleid_str, 0, 16); + format_module_id(moduleid_str, moduleid, MODULE_FORMAT_BRIEF); + (void) ioconfig_get_busnum((char *)moduleid_str, &basebus_num); /* - * Loop throught this vertex and get the Xwidgets .. + * Assign the correct bus number and also the nasid of this + * pci Xwidget. */ - - - /* PCI devices */ - - for (widgetnum = HUB_WIDGET_ID_MAX; widgetnum >= HUB_WIDGET_ID_MIN; widgetnum--) { - sprintf(pathname, "%d", widgetnum); - xwidget = NULL; - - /* - * Example - /hw/module/001c16/Pbrick/xtalk/8 is the xwidget - * /hw/module/001c16/Pbrick/xtalk/8/pci/1 is device - */ - rv = hwgraph_traverse(xtalk, pathname, &xwidget); - if ( (rv != GRAPH_SUCCESS) ) { - if (!xwidget) { - continue; - } - } - - sprintf(pathname, "%d/"EDGE_LBL_PCI, widgetnum); - pci_bus = NULL; - if (hwgraph_traverse(xtalk, pathname, &pci_bus) != GRAPH_SUCCESS) - if (!pci_bus) { - continue; -} - - /* - * Assign the correct bus number and also the nasid of this - * pci Xwidget. - * - * Should not be any race here ... - */ - num_bridges++; - busnum_to_pcibr_vhdl[num_bridges - 1] = pci_bus; - - /* - * Get the master node and from there get the NASID. - */ - master_node_vertex = device_master_get(xwidget); - if (!master_node_vertex) { - printk("WARNING: pci_bus_map_create: Unable to get .master for vertex 0x%p\n", (void *)xwidget); - } - - hubinfo_get(master_node_vertex, &hubinfo); - if (!hubinfo) { - printk("WARNING: pci_bus_map_create: Unable to get hubinfo for master node vertex 0x%p\n", (void *)master_node_vertex); - return(1); - } else { - busnum_to_nid[num_bridges - 1] = hubinfo->h_nasid; - } - - /* - * Pre assign DMA maps needed for 32 Bits Page Map DMA. - */ - busnum_to_atedmamaps[num_bridges - 1] = (void *) kmalloc( - sizeof(struct pcibr_dmamap_s) * MAX_ATE_MAPS, GFP_KERNEL); - if (!busnum_to_atedmamaps[num_bridges - 1]) - printk("WARNING: pci_bus_map_create: Unable to precreate ATE DMA Maps for busnum %d vertex 0x%p\n", num_bridges - 1, (void *)xwidget); - - memset(busnum_to_atedmamaps[num_bridges - 1], 0x0, - sizeof(struct pcibr_dmamap_s) * MAX_ATE_MAPS); - + bus_number = basebus_num + pcibr_widget_to_bus(pci_bus); +#ifdef DEBUG + { + char hwpath[MAXDEVNAME] = "\0"; + extern int hwgraph_vertex_name_get(vertex_hdl_t, char *, uint); + + pcibr_soft_t pcibr_soft = softlistp->bl_soft; + hwgraph_vertex_name_get(pci_bus, hwpath, MAXDEVNAME); + printk("%s:\n\tbus_num %d, basebus_num %d, brick_bus %d, " + "bus_vhdl 0x%lx, brick_type %d\n", hwpath, bus_number, + basebus_num, pcibr_widget_to_bus(pci_bus), + (uint64_t)pci_bus, pcibr_soft->bs_bricktype); } +#endif + busnum_to_pcibr_vhdl[bus_number] = pci_bus; /* - * PCIX devices - * We number busses differently for PCI-X devices. - * We start from Lowest Widget on up .. + * Pre assign DMA maps needed for 32 Bits Page Map DMA. */ - - (void) ioconfig_get_busnum((char *)io_moduleid, &basebus_num); - - for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX; widgetnum++) { - - /* Do both buses */ - for ( bus = 0; bus < 2; bus++ ) { - sprintf(pathname, "%d", widgetnum); - xwidget = NULL; - - /* - * Example - /hw/module/001c16/Pbrick/xtalk/8 is the xwidget - * /hw/module/001c16/Pbrick/xtalk/8/pci-x/0 is the bus - * /hw/module/001c16/Pbrick/xtalk/8/pci-x/0/1 is device - */ - rv = hwgraph_traverse(xtalk, pathname, &xwidget); - if ( (rv != GRAPH_SUCCESS) ) { - if (!xwidget) { - continue; - } - } - - if ( bus == 0 ) - sprintf(pathname, "%d/"EDGE_LBL_PCIX_0, widgetnum); - else - sprintf(pathname, "%d/"EDGE_LBL_PCIX_1, widgetnum); - pci_bus = NULL; - if (hwgraph_traverse(xtalk, pathname, &pci_bus) != GRAPH_SUCCESS) - if (!pci_bus) { - continue; - } - - /* - * Assign the correct bus number and also the nasid of this - * pci Xwidget. - * - * Should not be any race here ... - */ - bus_number = basebus_num + bus + io_brick_map_widget(MODULE_PXBRICK, widgetnum); -#ifdef DEBUG - printk("bus_number %d basebus_num %d bus %d io %d\n", - bus_number, basebus_num, bus, - io_brick_map_widget(MODULE_PXBRICK, widgetnum)); -#endif - busnum_to_pcibr_vhdl[bus_number] = pci_bus; - - /* - * Pre assign DMA maps needed for 32 Bits Page Map DMA. - */ - busnum_to_atedmamaps[bus_number] = (void *) kmalloc( - sizeof(struct pcibr_dmamap_s) * MAX_ATE_MAPS, GFP_KERNEL); - if (!busnum_to_atedmamaps[bus_number]) - printk("WARNING: pci_bus_map_create: Unable to precreate ATE DMA Maps for busnum %d vertex 0x%p\n", num_bridges - 1, (void *)xwidget); - - memset(busnum_to_atedmamaps[bus_number], 0x0, - sizeof(struct pcibr_dmamap_s) * MAX_ATE_MAPS); - } + busnum_to_atedmamaps[bus_number] = (void *) vmalloc( + sizeof(struct pcibr_dmamap_s)*MAX_ATE_MAPS); + if (busnum_to_atedmamaps[bus_number] <= 0) { + printk("pci_bus_map_create: Cannot allocate memory for ate maps\n"); + return -1; } - - return(0); + memset(busnum_to_atedmamaps[bus_number], 0x0, + sizeof(struct pcibr_dmamap_s) * MAX_ATE_MAPS); + return(0); } /* - * pci_bus_to_hcl_cvlink() - This routine is called after SGI IO Infrastructure - * initialization has completed to set up the mappings between Xbridge - * and logical pci bus numbers. We also set up the NASID for each of these - * xbridges. + * pci_bus_to_hcl_cvlink() - This routine is called after SGI IO Infrastructure + * initialization has completed to set up the mappings between PCI BRIDGE + * ASIC and logical pci bus numbers. * * Must be called before pci_init() is invoked. */ int pci_bus_to_hcl_cvlink(void) { + int i; + extern pcibr_list_p pcibr_list; - vertex_hdl_t devfs_hdl = NULL; - vertex_hdl_t xtalk = NULL; - int rv = 0; - char name[256]; - char tmp_name[256]; - int i, ii, j; - char *brick_name; - extern void ioconfig_bus_new_entries(void); - - /* - * Figure out which IO Brick is connected to the Compute Bricks. - */ for (i = 0; i < nummodules; i++) { - extern int iomoduleid_get(nasid_t); - moduleid_t iobrick_id; - nasid_t nasid = -1; - int nodecnt; - int n = 0; - - nodecnt = modules[i]->nodecnt; - for ( n = 0; n < nodecnt; n++ ) { - nasid = cnodeid_to_nasid(modules[i]->nodes[n]); - iobrick_id = iomoduleid_get(nasid); - if ((int)iobrick_id > 0) { /* Valid module id */ - char name[12]; - memset(name, 0, 12); - format_module_id((char *)&(modules[i]->io[n].moduleid), iobrick_id, MODULE_FORMAT_BRIEF); + struct pcibr_list_s *softlistp = pcibr_list; + struct pcibr_list_s *first_in_list = NULL; + struct pcibr_list_s *last_in_list = NULL; + + /* Walk the list of pcibr_soft structs looking for matches */ + while (softlistp) { + struct pcibr_soft_s *pcibr_soft = softlistp->bl_soft; + moduleid_t moduleid; + + /* Is this PCI bus associated with this moduleid? */ + moduleid = NODE_MODULEID( + NASID_TO_COMPACT_NODEID(pcibr_soft->bs_nasid)); + if (modules[i]->id == moduleid) { + struct pcibr_list_s *new_element; + + new_element = kmalloc(sizeof (struct pcibr_soft_s), GFP_KERNEL); + if (new_element == NULL) { + printk("%s: Couldn't allocate memory\n",__FUNCTION__); + return -ENOMEM; + } + new_element->bl_soft = softlistp->bl_soft; + new_element->bl_vhdl = softlistp->bl_vhdl; + new_element->bl_next = NULL; + + /* list empty so just put it on the list */ + if (first_in_list == NULL) { + first_in_list = new_element; + last_in_list = new_element; + softlistp = softlistp->bl_next; + continue; + } + + /* + * BASEIO IObricks attached to a module have + * a higher priority than non BASEIO IOBricks + * when it comes to persistant pci bus + * numbering, so put them on the front of the + * list. + */ + if (isIO9(pcibr_soft->bs_nasid)) { + new_element->bl_next = first_in_list; + first_in_list = new_element; + } else { + last_in_list->bl_next = new_element; + last_in_list = new_element; + } } + softlistp = softlistp->bl_next; } - } - devfs_hdl = hwgraph_path_to_vertex("hw/module"); - for (i = 0; i < nummodules ; i++) { - for ( j = 0; j < 2; j++ ) { - if ( j == 0 ) - brick_name = EDGE_LBL_PXBRICK; - else - brick_name = EDGE_LBL_IXBRICK; - - for ( ii = 0; ii < 2 ; ii++ ) { - memset(name, 0, 256); - memset(tmp_name, 0, 256); - format_module_id(name, modules[i]->id, MODULE_FORMAT_BRIEF); - sprintf(tmp_name, "/slab/%d/%s/xtalk", geo_slab(modules[i]->geoid[ii]), brick_name); - strcat(name, tmp_name); - xtalk = NULL; - rv = hwgraph_edge_get(devfs_hdl, name, &xtalk); - if ( rv == 0 ) - pci_bus_map_create(xtalk, (char *)&(modules[i]->io[ii].moduleid)); + /* + * We now have a list of all the pci bridges associated with + * the module_id, modules[i]. Call pci_bus_map_create() for + * each pci bridge + */ + softlistp = first_in_list; + while (softlistp) { + moduleid_t iobrick; + struct pcibr_list_s *next = softlistp->bl_next; + iobrick = iomoduleid_get(softlistp->bl_soft->bs_nasid); + pci_bus_map_create(softlistp, iobrick); + kfree(softlistp); + softlistp = next; } - } } /* @@ -804,6 +712,11 @@ if (!ia64_platform_is("sn2") || IS_RUNNING_ON_SIMULATOR()) return 0; + + /* + * This is needed to avoid bounce limit checks in the blk layer + */ + ia64_max_iommu_merge_mask = ~PAGE_MASK; /* * set pci_raw_ops, etc. diff -Nru a/arch/ia64/sn/io/machvec/pci_dma.c b/arch/ia64/sn/io/machvec/pci_dma.c --- a/arch/ia64/sn/io/machvec/pci_dma.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/io/machvec/pci_dma.c Tue Feb 17 20:00:06 2004 @@ -138,6 +138,8 @@ if (!(cpuaddr = (void *)__get_free_pages(GFP_ATOMIC, get_order(size)))) return NULL; + memset(cpuaddr, 0x0, size); + /* physical addr. of the memory we just got */ phys_addr = __pa(cpuaddr); @@ -154,7 +156,8 @@ *dma_handle = pcibr_dmatrans_addr(vhdl, NULL, phys_addr, size, PCIIO_DMA_CMD | PCIIO_DMA_A64); else { - dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_CMD); + dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_CMD | + MINIMAL_ATE_FLAG(phys_addr, size)); if (dma_map) { *dma_handle = (dma_addr_t) pcibr_dmamap_addr(dma_map, phys_addr, size); @@ -248,18 +251,6 @@ phys_addr = __pa((unsigned long)page_address(sg->page) + sg->offset); /* - * Handle the most common case: 64 bit cards. This - * call should always succeed. - */ - if (IS_PCIA64(hwdev)) { - sg->dma_address = pcibr_dmatrans_addr(vhdl, NULL, phys_addr, - sg->length, - PCIIO_DMA_DATA | PCIIO_DMA_A64); - sg->dma_length = sg->length; - continue; - } - - /* * Handle 32-63 bit cards via direct mapping */ if (IS_PCI32G(hwdev)) { @@ -385,13 +376,6 @@ dma_addr = 0; phys_addr = __pa(ptr); - if (IS_PCIA64(hwdev)) { - /* This device supports 64 bit DMA addresses. */ - dma_addr = pcibr_dmatrans_addr(vhdl, NULL, phys_addr, size, - PCIIO_DMA_DATA | PCIIO_DMA_A64); - return dma_addr; - } - /* * Devices that support 32 bit to 63 bit DMA addresses get * 32 bit DMA addresses. @@ -410,7 +394,8 @@ * let's use the PMU instead. */ dma_map = NULL; - dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA); + dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA | + MINIMAL_ATE_FLAG(phys_addr, size)); if (!dma_map) { printk(KERN_ERR "pci_map_single: Unable to allocate anymore " diff -Nru a/arch/ia64/sn/io/platform_init/sgi_io_init.c b/arch/ia64/sn/io/platform_init/sgi_io_init.c --- a/arch/ia64/sn/io/platform_init/sgi_io_init.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/platform_init/sgi_io_init.c Tue Feb 17 20:00:05 2004 @@ -131,7 +131,7 @@ klhwg_add_all_modules(hwgraph_root); klhwg_add_all_nodes(hwgraph_root); - for (cnode = 0; cnode < numnodes; cnode++) { + for (cnode = 0; cnode < numionodes; cnode++) { extern void per_hub_init(cnodeid_t); per_hub_init(cnode); } diff -Nru a/arch/ia64/sn/io/sn2/klconflib.c b/arch/ia64/sn/io/sn2/klconflib.c --- a/arch/ia64/sn/io/sn2/klconflib.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/klconflib.c Tue Feb 17 20:00:05 2004 @@ -31,6 +31,8 @@ #define DBG(x...) #endif /* DEBUG_KLGRAPH */ +extern int numionodes; + lboard_t *root_lboard[MAX_COMPACT_NODES]; static int hasmetarouter; @@ -38,13 +40,13 @@ char brick_types[MAX_BRICK_TYPES + 1] = "crikxdpn%#=vo^34567890123456789..."; lboard_t * -find_lboard(lboard_t *start, unsigned char brd_type) +find_lboard_any(lboard_t *start, unsigned char brd_type) { /* Search all boards stored on this node. */ while (start) { if (start->brd_type == brd_type) return start; - start = KLCF_NEXT(start); + start = KLCF_NEXT_ANY(start); } /* Didn't find it. */ @@ -52,19 +54,59 @@ } lboard_t * -find_lboard_class(lboard_t *start, unsigned char brd_type) +find_lboard_nasid(lboard_t *start, nasid_t nasid, unsigned char brd_type) { - /* Search all boards stored on this node. */ + + while (start) { + if ((start->brd_type == brd_type) && + (start->brd_nasid == nasid)) + return start; + + if (numionodes == numnodes) + start = KLCF_NEXT_ANY(start); + else + start = KLCF_NEXT(start); + } + + /* Didn't find it. */ + return (lboard_t *)NULL; +} + +lboard_t * +find_lboard_class_any(lboard_t *start, unsigned char brd_type) +{ + /* Search all boards stored on this node. */ while (start) { if (KLCLASS(start->brd_type) == KLCLASS(brd_type)) return start; - start = KLCF_NEXT(start); + start = KLCF_NEXT_ANY(start); + } + + /* Didn't find it. */ + return (lboard_t *)NULL; +} + +lboard_t * +find_lboard_class_nasid(lboard_t *start, nasid_t nasid, unsigned char brd_type) +{ + /* Search all boards stored on this node. */ + while (start) { + if (KLCLASS(start->brd_type) == KLCLASS(brd_type) && + (start->brd_nasid == nasid)) + return start; + + if (numionodes == numnodes) + start = KLCF_NEXT_ANY(start); + else + start = KLCF_NEXT(start); } /* Didn't find it. */ return (lboard_t *)NULL; } + + klinfo_t * find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type) { @@ -116,20 +158,6 @@ return (lboard_t *)NULL; } -lboard_t * -find_lboard_module(lboard_t *start, geoid_t geoid) -{ - /* Search all boards stored on this node. */ - while (start) { - if (geo_cmp(start->brd_geoid, geoid)) - return start; - start = KLCF_NEXT(start); - } - - /* Didn't find it. */ - return (lboard_t *)NULL; -} - /* * Convert a NIC name to a name for use in the hardware graph. */ @@ -218,7 +246,7 @@ /* * look for boards that might contain an xbow or xbridge */ - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IOBRICK_XBOW); + brd = find_lboard_nasid((lboard_t *)KL_CONFIG_INFO(nasid), nasid, KLTYPE_IOBRICK_XBOW); if (brd == NULL) return 0; if ((xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW)) @@ -285,40 +313,6 @@ #define MHZ 1000000 - -/* Get the canonical hardware graph name for the given pci component - * on the given io board. - */ -void -device_component_canonical_name_get(lboard_t *brd, - klinfo_t *component, - char *name) -{ - slotid_t slot; - char board_name[20]; - - ASSERT(brd); - - /* Convert the [ CLASS | TYPE ] kind of slotid - * into a string - */ - slot = brd->brd_slot; - - /* Get the io board name */ - if (!brd || (brd->brd_sversion < 2)) { - strcpy(name, EDGE_LBL_XWIDGET); - } else { - nic_name_convert(brd->brd_name, board_name); - } - - /* Give out the canonical name of the pci device*/ - sprintf(name, - "/dev/hw/"EDGE_LBL_MODULE "/%x/"EDGE_LBL_SLAB"/%d/" - EDGE_LBL_SLOT"/%s/"EDGE_LBL_PCI"/%d", - geo_module(brd->brd_geoid), geo_slab(brd->brd_geoid), - board_name, KLCF_BRIDGE_W_ID(component)); -} - /* * Get the serial number of the main component of a board * Returns 0 if a valid serial number is found @@ -506,7 +500,7 @@ format_module_id(char *buffer, moduleid_t m, int fmt) { int rack, position; - char brickchar; + unsigned char brickchar; rack = MODULE_GET_RACK(m); ASSERT(MODULE_GET_BTYPE(m) < MAX_BRICK_TYPES); @@ -560,112 +554,21 @@ } -/* - * Parse a module id, in either brief or long form. - * Returns < 0 on error. - * The long form does not include a brick type, so it defaults to 0 (CBrick) - */ -int -parse_module_id(char *buffer) -{ - unsigned int v, rack, bay, type, form; - moduleid_t m; - char c; - - if (strstr(buffer, EDGE_LBL_RACK "/") == buffer) { - form = MODULE_FORMAT_LONG; - buffer += strlen(EDGE_LBL_RACK "/"); - - /* A long module ID must be exactly 5 non-template chars. */ - if (strlen(buffer) != strlen("/" EDGE_LBL_RPOS "/") + 5) - return -1; - } - else { - form = MODULE_FORMAT_BRIEF; - - /* A brief module id must be exactly 6 characters */ - if (strlen(buffer) != 6) - return -2; - } - - /* The rack number must be exactly 3 digits */ - if (!(isdigit(buffer[0]) && isdigit(buffer[1]) && isdigit(buffer[2]))) - return -3; - - rack = 0; - v = *buffer++ - '0'; - if (v > RACK_CLASS_MASK(rack) >> RACK_CLASS_SHFT(rack)) - return -4; - RACK_ADD_CLASS(rack, v); - - v = *buffer++ - '0'; - if (v > RACK_GROUP_MASK(rack) >> RACK_GROUP_SHFT(rack)) - return -5; - RACK_ADD_GROUP(rack, v); - - v = *buffer++ - '0'; - /* rack numbers are 1-based */ - if (v-1 > RACK_NUM_MASK(rack) >> RACK_NUM_SHFT(rack)) - return -6; - RACK_ADD_NUM(rack, v); - - if (form == MODULE_FORMAT_BRIEF) { - /* Next should be a module type character. Accept ucase or lcase. */ - c = *buffer++; - if (!isalpha(c)) - return -7; - - /* strchr() returns a pointer into brick_types[], or NULL */ - type = (unsigned int)(strchr(brick_types, tolower(c)) - brick_types); - if (type > MODULE_BTYPE_MASK >> MODULE_BTYPE_SHFT) - return -8; - } - else { - /* Hardcode the module type, and skip over the boilerplate */ - type = MODULE_CBRICK; - - if (strstr(buffer, "/" EDGE_LBL_RPOS "/") != buffer) - return -9; - - buffer += strlen("/" EDGE_LBL_RPOS "/"); - } - - /* The bay number is last. Make sure it's exactly two digits */ - - if (!(isdigit(buffer[0]) && isdigit(buffer[1]) && !buffer[2])) - return -10; - - bay = 10 * (buffer[0] - '0') + (buffer[1] - '0'); - - if (bay > MODULE_BPOS_MASK >> MODULE_BPOS_SHFT) - return -11; - - m = RBT_TO_MODULE(rack, bay, type); - - /* avoid sign extending the moduleid_t */ - return (int)(unsigned short)m; -} - int cbrick_type_get_nasid(nasid_t nasid) { - lboard_t *brd; moduleid_t module; - uint type; int t; - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); - module = geo_module(brd->brd_geoid); - type = (module & MODULE_BTYPE_MASK) >> MODULE_BTYPE_SHFT; - /* convert brick_type to lower case */ - if ((type >= 'A') && (type <= 'Z')) - type = type - 'A' + 'a'; - - /* convert to a module.h brick type */ - for( t = 0; t < MAX_BRICK_TYPES; t++ ) { - if( brick_types[t] == type ) { - return t; - } - } + module = iomoduleid_get(nasid); + if (module < 0 ) { + return MODULE_CBRICK; + } + t = MODULE_GET_BTYPE(module); + if ((char)t == 'o') { + return MODULE_OPUSBRICK; + } else { + return MODULE_CBRICK; + } return -1; } diff -Nru a/arch/ia64/sn/io/sn2/klgraph.c b/arch/ia64/sn/io/sn2/klgraph.c --- a/arch/ia64/sn/io/sn2/klgraph.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/sn2/klgraph.c Tue Feb 17 20:00:07 2004 @@ -43,7 +43,7 @@ hwgraph_path_add(node_vertex, EDGE_LBL_HUB, &myhubv); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, myhubv, NULL, "Created path for hub vertex for Shub node.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__,__LINE__, myhubv, NULL, "Created path for hub vertex for Shub node.\n"); rc = device_master_set(myhubv, node_vertex); if (rc) { @@ -71,7 +71,7 @@ snprintf(name, 120, "%s/%s/%c", EDGE_LBL_DISABLED, EDGE_LBL_CPU, 'a' + cpu->cpu_info.physid); (void) hwgraph_path_add(node_vertex, name, &my_cpu); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for disabled cpu slice.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for disabled cpu slice.\n"); mark_cpuvertex_as_cpu(my_cpu, cpu_id); device_master_set(my_cpu, node_vertex); @@ -98,7 +98,7 @@ (void) hwgraph_path_add(node_vertex, name, &my_cpu); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for active cpu slice.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for active cpu slice.\n"); mark_cpuvertex_as_cpu(my_cpu, cpu_id); device_master_set(my_cpu, node_vertex); @@ -107,7 +107,7 @@ if (hwgraph_edge_get(node_vertex, EDGE_LBL_CPU, &cpu_dir) == GRAPH_SUCCESS) { snprintf(name, 120, "%c", 'a' + cpu->cpu_info.physid); (void) hwgraph_edge_add(cpu_dir, my_cpu, name); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, cpu_dir, my_cpu, "Created % from vhdl1 to vhdl2.\n", name)); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__,__LINE__, cpu_dir, my_cpu, "Created % from vhdl1 to vhdl2.\n", name); } } @@ -124,8 +124,9 @@ /*REFERENCED*/ graph_error_t err; - if ((brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IOBRICK_XBOW)) == NULL) - return; + if (!(brd = find_lboard_nasid((lboard_t *)KL_CONFIG_INFO(nasid), + nasid, KLTYPE_IOBRICK_XBOW))) + return; if (KL_CONFIG_DUPLICATE_BOARD(brd)) return; @@ -165,7 +166,7 @@ return; } - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, xbow_v, NULL, "Created path for xtalk.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, xbow_v, NULL, "Created path for xtalk.\n"); xswitch_vertex_init(xbow_v); @@ -200,7 +201,7 @@ vertex_hdl_t cpu_dir; nasid = COMPACT_TO_NASID_NODEID(cnode); - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); + brd = find_lboard_any((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); ASSERT(brd); /* Generate a hardware graph path for this board. */ @@ -211,7 +212,7 @@ return; } - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created path for SHUB node.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created path for SHUB node.\n"); hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB); ASSERT(hub); if(hub->hub_info.flags & KLINFO_ENABLE) @@ -249,7 +250,7 @@ printk("klhwg_add_node: Cannot create CPU directory\n"); return; } - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, cpu_dir, NULL, "Created cpu directiry on SHUB node.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, cpu_dir, NULL, "Created cpu directiry on SHUB node.\n"); } @@ -280,7 +281,7 @@ for (cnode = 0; cnode < numnodes; cnode++) { nasid = COMPACT_TO_NASID_NODEID(cnode); - brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid), + brd = find_lboard_class_any((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_ROUTER); if (!brd) @@ -304,10 +305,10 @@ "failed. Path == %s", path_buffer); return; } - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created router path.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created router path.\n"); /* Find the rest of the routers stored on this node. */ - } while ( (brd = find_lboard_class(KLCF_NEXT(brd), + } while ( (brd = find_lboard_class_any(KLCF_NEXT_ANY(brd), KLTYPE_ROUTER)) ); } @@ -399,7 +400,7 @@ path_buffer, dest_path, (void *)dest_hndl, rc); return; } - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, router_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", dest_path)); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, router_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", dest_path); } } @@ -414,7 +415,7 @@ for (cnode = 0; cnode < numnodes; cnode++) { nasid = COMPACT_TO_NASID_NODEID(cnode); - brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid), + brd = find_lboard_class_any((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_ROUTER); if (!brd) @@ -428,7 +429,7 @@ cnode, nasid); /* Find the rest of the routers stored on this node. */ - } while ( (brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)) ); + } while ( (brd = find_lboard_class_any(KLCF_NEXT_ANY(brd), KLTYPE_ROUTER)) ); } } @@ -452,8 +453,7 @@ for (cnode = 0; cnode < numionodes; cnode++) { nasid = COMPACT_TO_NASID_NODEID(cnode); - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); - ASSERT(brd); + brd = find_lboard_any((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB); ASSERT(hub); @@ -492,14 +492,14 @@ rc = hwgraph_path_add(hub_hndl, EDGE_LBL_INTERCONNECT, &hub_hndl); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hub_hndl, NULL, "Created link path.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, hub_hndl, NULL, "Created link path.\n"); sprintf(buf,"%s/%s",path_buffer,EDGE_LBL_INTERCONNECT); rc = hwgraph_traverse(hwgraph_root, buf, &hub_hndl); sprintf(buf,"%d",port); rc = hwgraph_edge_add(hub_hndl, dest_hndl, buf); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hub_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", buf)); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, hub_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", buf); if (rc != GRAPH_SUCCESS) { printk("Can't create edge: %s/%s to vertex 0x%p, error 0x%x\n", @@ -511,69 +511,6 @@ } } -/* Store the pci/vme disabled board information as extended administrative - * hints which can later be used by the drivers using the device/driver - * admin interface. - */ -static void __init -klhwg_device_disable_hints_add(void) -{ - cnodeid_t cnode; /* node we are looking at */ - nasid_t nasid; /* nasid of the node */ - lboard_t *board; /* board we are looking at */ - int comp_index; /* component index */ - klinfo_t *component; /* component in the board we are - * looking at - */ - char device_name[MAXDEVNAME]; - - for(cnode = 0; cnode < numnodes; cnode++) { - nasid = COMPACT_TO_NASID_NODEID(cnode); - board = (lboard_t *)KL_CONFIG_INFO(nasid); - /* Check out all the board info stored on a node */ - while(board) { - /* No need to look at duplicate boards or non-io - * boards - */ - if (KL_CONFIG_DUPLICATE_BOARD(board) || - KLCLASS(board->brd_type) != KLCLASS_IO) { - board = KLCF_NEXT(board); - continue; - } - /* Check out all the components of a board */ - for (comp_index = 0; - comp_index < KLCF_NUM_COMPS(board); - comp_index++) { - component = KLCF_COMP(board,comp_index); - /* If the component is enabled move on to - * the next component - */ - if (KLCONFIG_INFO_ENABLED(component)) - continue; - /* NOTE : Since the prom only supports - * the disabling of pci devices the following - * piece of code makes sense. - * Make sure that this assumption is valid - */ - /* This component is disabled. Store this - * hint in the extended device admin table - */ - /* Get the canonical name of the pci device */ - device_component_canonical_name_get(board, - component, - device_name); -#ifdef DEBUG - printf("%s DISABLED\n",device_name); -#endif - } - /* go to the next board info stored on this - * node - */ - board = KLCF_NEXT(board); - } - } -} - void __init klhwg_add_all_modules(vertex_hdl_t hwgraph_root) { @@ -596,7 +533,7 @@ rc = hwgraph_path_add(hwgraph_root, name, &module_vhdl); ASSERT(rc == GRAPH_SUCCESS); rc = rc; - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, module_vhdl, NULL, "Created module path.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, module_vhdl, NULL, "Created module path.\n"); hwgraph_fastinfo_set(module_vhdl, (arbitrary_info_t) modules[cm]); @@ -608,7 +545,7 @@ rc = hwgraph_path_add(hwgraph_root, name, &vhdl); ASSERT_ALWAYS(rc == GRAPH_SUCCESS); rc = rc; - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, vhdl, NULL, "Created L1 path.\n")); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, vhdl, NULL, "Created L1 path.\n"); hwgraph_info_add_LBL(vhdl, INFO_LBL_ELSC, (arbitrary_info_t)1); @@ -637,10 +574,4 @@ klhwg_add_all_routers(hwgraph_root); klhwg_connect_routers(hwgraph_root); klhwg_connect_hubs(hwgraph_root); - - /* Go through the entire system's klconfig - * to figure out which pci components have been disabled - */ - klhwg_device_disable_hints_add(); - } diff -Nru a/arch/ia64/sn/io/sn2/ml_iograph.c b/arch/ia64/sn/io/sn2/ml_iograph.c --- a/arch/ia64/sn/io/sn2/ml_iograph.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/ml_iograph.c Tue Feb 17 20:00:05 2004 @@ -46,8 +46,9 @@ int rc; xvolinfo = kmalloc(sizeof(struct xswitch_vol_s), GFP_KERNEL); - if (xvolinfo <= 0 ) { - printk("xswitch_vertex_init: out of memory\n"); + if (!xvolinfo) { + printk(KERN_WARNING "xswitch_vertex_init(): Unable to " + "allocate memory\n"); return; } memset(xvolinfo, 0, sizeof(struct xswitch_vol_s)); @@ -239,30 +240,29 @@ static void early_probe_for_widget(vertex_hdl_t hubv, xwidget_hwid_t hwid) { - hubreg_t llp_csr_reg; nasid_t nasid; hubinfo_t hubinfo; + hubreg_t llp_csr_reg; + widgetreg_t widget_id; + int result = 0; + + hwid->part_num = XWIDGET_PART_NUM_NONE; + hwid->rev_num = XWIDGET_REV_NUM_NONE; + hwid->mfg_num = XWIDGET_MFG_NUM_NONE; hubinfo_get(hubv, &hubinfo); nasid = hubinfo->h_nasid; llp_csr_reg = REMOTE_HUB_L(nasid, IIO_LLP_CSR); - /* - * If link is up, read the widget's part number. - * A direct connect widget must respond to widgetnum=0. - */ - if (llp_csr_reg & IIO_LLP_CSR_IS_UP) { - /* TBD: Put hub into "indirect" mode */ - /* - * We're able to read from a widget because our hub's - * WIDGET_ID was set up earlier. - */ - widgetreg_t widget_id = *(volatile widgetreg_t *) - (RAW_NODE_SWIN_BASE(nasid, 0x0) + WIDGET_ID); + if (!(llp_csr_reg & IIO_LLP_CSR_IS_UP)) + return; - DBG("early_probe_for_widget: Hub Vertex 0x%p is UP widget_id = 0x%x Register 0x%p\n", hubv, widget_id, - (volatile widgetreg_t *)(RAW_NODE_SWIN_BASE(nasid, 0x0) + WIDGET_ID) ); + /* Read the Cross-Talk Widget Id on the other end */ + result = snia_badaddr_val((volatile void *) + (RAW_NODE_SWIN_BASE(nasid, 0x0) + WIDGET_ID), + 4, (void *) &widget_id); + if (result == 0) { /* Found something connected */ hwid->part_num = XWIDGET_PART_NUM(widget_id); hwid->rev_num = XWIDGET_REV_NUM(widget_id); hwid->mfg_num = XWIDGET_MFG_NUM(widget_id); @@ -344,13 +344,12 @@ return; } - board = find_lboard_class( - (lboard_t *)KL_CONFIG_INFO(nasid), - KLCLASS_IOBRICK); + board = find_lboard_class_nasid( (lboard_t *)KL_CONFIG_INFO(nasid), + nasid, KLCLASS_IOBRICK); if (!board && NODEPDA(cnode)->xbow_peer != INVALID_NASID) { - board = find_lboard_class( - (lboard_t *)KL_CONFIG_INFO( NODEPDA(cnode)->xbow_peer), - KLCLASS_IOBRICK); + board = find_lboard_class_nasid( + (lboard_t *)KL_CONFIG_INFO( NODEPDA(cnode)->xbow_peer), + NODEPDA(cnode)->xbow_peer, KLCLASS_IOBRICK); } if (board) { @@ -365,7 +364,7 @@ { lboard_t *brd; - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); + brd = find_lboard_any((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); if ( brd != (lboard_t *)0 ) { board->brd_geoid = brd->brd_geoid; } @@ -584,10 +583,9 @@ } else { void *bridge; - extern uint64_t pcireg_control_get(void *); bridge = (void *)NODE_SWIN_BASE(COMPACT_TO_NASID_NODEID(cnodeid), 0); - npdap->basew_id = pcireg_control_get(bridge) & WIDGET_WIDGET_ID; + npdap->basew_id = pcireg_bridge_control_get(bridge) & WIDGET_WIDGET_ID; printk(" ****io_init_node: Unknown Widget Part Number 0x%x Widget ID 0x%x attached to Hubv 0x%p ****\n", widget_partnum, npdap->basew_id, (void *)hubv); return; @@ -764,7 +762,7 @@ /* Look for brick prefix in table */ for (i = 0; i < num_bricks; i++) { if (brick_type == io_brick_tab[i].ibm_type) - return(io_brick_tab[i].ibm_map_wid[widget_num]); + return io_brick_tab[i].ibm_map_wid[widget_num]; } return 0; diff -Nru a/arch/ia64/sn/io/sn2/module.c b/arch/ia64/sn/io/sn2/module.c --- a/arch/ia64/sn/io/sn2/module.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/module.c Tue Feb 17 20:00:05 2004 @@ -139,7 +139,7 @@ /* * record brick serial number */ - board = find_lboard((lboard_t *) KL_CONFIG_INFO(host_nasid), KLTYPE_SNIA); + board = find_lboard_nasid((lboard_t *) KL_CONFIG_INFO(host_nasid), host_nasid, KLTYPE_SNIA); if (! board || KL_CONFIG_DUPLICATE_BOARD(board)) { @@ -152,8 +152,8 @@ m->snum_valid = 1; } - board = find_lboard((lboard_t *) KL_CONFIG_INFO(nasid), - KLTYPE_IOBRICK_XBOW); + board = find_lboard_nasid((lboard_t *) KL_CONFIG_INFO(nasid), + nasid, KLTYPE_IOBRICK_XBOW); if (! board || KL_CONFIG_DUPLICATE_BOARD(board)) return 0; @@ -185,6 +185,7 @@ nasid_t nasid; int nserial; module_t *m; + extern int numionodes; DPRINTF("*******module_init\n"); @@ -196,14 +197,40 @@ */ for (node = 0; node < numnodes; node++) { nasid = COMPACT_TO_NASID_NODEID(node); - - board = find_lboard((lboard_t *) KL_CONFIG_INFO(nasid), KLTYPE_SNIA); + board = find_lboard_nasid((lboard_t *) KL_CONFIG_INFO(nasid), nasid, KLTYPE_SNIA); ASSERT(board); - HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, NULL, NULL, "Found Shub lboard 0x%lx nasid 0x%x cnode 0x%x \n", (unsigned long)board, (int)nasid, (int)node)); + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, NULL, NULL, "Found Shub lboard 0x%lx nasid 0x%x cnode 0x%x \n", (unsigned long)board, (int)nasid, (int)node); m = module_add_node(board->brd_geoid, node); if (! m->snum_valid && module_probe_snum(m, nasid, nasid)) nserial++; + } + + /* + * Second scan, look for headless/memless board hosted by compute nodes. + */ + for (node = numnodes; node < numionodes; node++) { + nasid_t nasid; + char serial_number[16]; + + nasid = COMPACT_TO_NASID_NODEID(node); + board = find_lboard_nasid((lboard_t *) KL_CONFIG_INFO(nasid), + nasid, KLTYPE_SNIA); + ASSERT(board); + + HWGRAPH_DEBUG(__FILE__, __FUNCTION__, __LINE__, NULL, NULL, "Found headless/memless lboard 0x%lx node %d nasid %d cnode %d\n", (unsigned long)board, node, (int)nasid, (int)node); + + m = module_add_node(board->brd_geoid, node); + + /* + * Get and initialize the serial number. + */ + board_serial_number_get( board, serial_number ); + if( serial_number[0] != '\0' ) { + encode_str_serial( serial_number, m->snum.snum_str ); + m->snum_valid = 1; + nserial++; + } } } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c Tue Feb 17 20:00:05 2004 @@ -17,106 +17,13 @@ /* * functions */ -int pcibr_init_ext_ate_ram(bridge_t *); -int pcibr_ate_alloc(pcibr_soft_t, int); -void pcibr_ate_free(pcibr_soft_t, int, int); -bridge_ate_t pcibr_flags_to_ate(unsigned); -bridge_ate_p pcibr_ate_addr(pcibr_soft_t, int); -unsigned ate_freeze(pcibr_dmamap_t pcibr_dmamap, -#if PCIBR_FREEZE_TIME - unsigned *freeze_time_ptr, -#endif - unsigned *cmd_regs); -void ate_write(pcibr_soft_t pcibr_soft, bridge_ate_p ate_ptr, int ate_count, bridge_ate_t ate); -void ate_thaw(pcibr_dmamap_t pcibr_dmamap, - int ate_index, -#if PCIBR_FREEZE_TIME - bridge_ate_t ate, - int ate_total, - unsigned freeze_time_start, -#endif - unsigned *cmd_regs, - unsigned s); +int pcibr_ate_alloc(pcibr_soft_t, int, struct resource *); +void pcibr_ate_free(pcibr_soft_t, int, int, struct resource *); +bridge_ate_t pcibr_flags_to_ate(pcibr_soft_t, unsigned); +bridge_ate_p pcibr_ate_addr(pcibr_soft_t, int); +void ate_write(pcibr_soft_t, int, int, bridge_ate_t); - -/* Convert from ssram_bits in control register to number of SSRAM entries */ -#define ATE_NUM_ENTRIES(n) _ate_info[n] - -/* Possible choices for number of ATE entries in Bridge's SSRAM */ -static int _ate_info[] = -{ - 0, /* 0 entries */ - 8 * 1024, /* 8K entries */ - 16 * 1024, /* 16K entries */ - 64 * 1024 /* 64K entries */ -}; - -#define ATE_NUM_SIZES (sizeof(_ate_info) / sizeof(int)) -#define ATE_PROBE_VALUE 0x0123456789abcdefULL - -/* - * Determine the size of this bridge's external mapping SSRAM, and set - * the control register appropriately to reflect this size, and initialize - * the external SSRAM. - */ -int -pcibr_init_ext_ate_ram(bridge_t *bridge) -{ - int largest_working_size = 0; - int num_entries, entry; - int i, j; - bridgereg_t old_enable, new_enable; - - /* Probe SSRAM to determine its size. */ - old_enable = bridge->b_int_enable; - new_enable = old_enable & ~BRIDGE_IMR_PCI_MST_TIMEOUT; - bridge->b_int_enable = new_enable; - - for (i = 1; i < ATE_NUM_SIZES; i++) { - /* Try writing a value */ - bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(i) - 1] = ATE_PROBE_VALUE; - - /* Guard against wrap */ - for (j = 1; j < i; j++) - bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(j) - 1] = 0; - - /* See if value was written */ - if (bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(i) - 1] == ATE_PROBE_VALUE) - largest_working_size = i; - } - bridge->b_int_enable = old_enable; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - - /* - * ensure that we write and read without any interruption. - * The read following the write is required for the Bridge war - */ - - bridge->b_wid_control = (bridge->b_wid_control - & ~BRIDGE_CTRL_SSRAM_SIZE_MASK) - | BRIDGE_CTRL_SSRAM_SIZE(largest_working_size); - bridge->b_wid_control; /* inval addr bug war */ - - num_entries = ATE_NUM_ENTRIES(largest_working_size); - - if (pcibr_debug_mask & PCIBR_DEBUG_ATE) { - if (num_entries) { - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATE, NULL, - "bridge at 0x%x: clearing %d external ATEs\n", - bridge, num_entries)); - } else { - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATE, NULL, - "bridge at 0x%x: no external ATE RAM found\n", - bridge)); - } - } - - /* Initialize external mapping entries */ - for (entry = 0; entry < num_entries; entry++) - bridge->b_ext_ate_ram[entry] = 0; - - return (num_entries); -} +int pcibr_invalidate_ate; /* by default don't invalidate ATE on free */ /* * Allocate "count" contiguous Bridge Address Translation Entries @@ -127,56 +34,48 @@ * Return the start index on success, -1 on failure. */ int -pcibr_ate_alloc(pcibr_soft_t pcibr_soft, int count) +pcibr_ate_alloc(pcibr_soft_t pcibr_soft, int count, struct resource *res) { int status = 0; - struct resource *new_res; - struct resource **allocated_res; + unsigned long flag; - new_res = (struct resource *) kmalloc( sizeof(struct resource), GFP_ATOMIC); - memset(new_res, 0, sizeof(*new_res)); - status = allocate_resource( &pcibr_soft->bs_int_ate_resource, new_res, + memset(res, 0, sizeof(struct resource)); + flag = pcibr_lock(pcibr_soft); + status = allocate_resource( &pcibr_soft->bs_int_ate_resource, res, count, pcibr_soft->bs_int_ate_resource.start, pcibr_soft->bs_int_ate_resource.end, 1, NULL, NULL); - - if ( status && (pcibr_soft->bs_ext_ate_resource.end != 0) ) { - status = allocate_resource( &pcibr_soft->bs_ext_ate_resource, new_res, - count, pcibr_soft->bs_ext_ate_resource.start, - pcibr_soft->bs_ext_ate_resource.end, 1, - NULL, NULL); - if (status) { - new_res->start = -1; - } - } - if (status) { /* Failed to allocate */ - kfree(new_res); + pcibr_unlock(pcibr_soft, flag); return -1; } /* Save the resource for freeing */ - allocated_res = (struct resource **)(((unsigned long)pcibr_soft->bs_allocated_ate_res) + new_res->start * sizeof( unsigned long)); - *allocated_res = new_res; + pcibr_unlock(pcibr_soft, flag); - return new_res->start; + return res->start; } void -pcibr_ate_free(pcibr_soft_t pcibr_soft, int index, int count) -/* Who says there's no such thing as a free meal? :-) */ +pcibr_ate_free(pcibr_soft_t pcibr_soft, int index, int count, struct resource *res) { - struct resource **allocated_res; + bridge_ate_t ate; int status = 0; + unsigned long flags; - allocated_res = (struct resource **)(((unsigned long)pcibr_soft->bs_allocated_ate_res) + index * sizeof(unsigned long)); + if (pcibr_invalidate_ate) { + /* For debugging purposes, clear the valid bit in the ATE */ + ate = *pcibr_ate_addr(pcibr_soft, index); + ate_write(pcibr_soft, index, count, (ate & ~ATE_V)); + } - status = release_resource(*allocated_res); + flags = pcibr_lock(pcibr_soft); + status = release_resource(res); + pcibr_unlock(pcibr_soft, flags); if (status) BUG(); /* Ouch .. */ - kfree(*allocated_res); } @@ -185,7 +84,7 @@ * into Bridge-specific Address Translation Entry attribute bits. */ bridge_ate_t -pcibr_flags_to_ate(unsigned flags) +pcibr_flags_to_ate(pcibr_soft_t pcibr_soft, unsigned flags) { bridge_ate_t attributes; @@ -232,6 +131,11 @@ if (flags & PCIBR_NOPRECISE) attributes &= ~ATE_PREC; + /* In PCI-X mode, Prefetch & Precise not supported */ + if (IS_PCIX(pcibr_soft)) { + attributes &= ~(ATE_PREC | ATE_PREF); + } + return (attributes); } @@ -243,189 +147,33 @@ pcibr_ate_addr(pcibr_soft_t pcibr_soft, int ate_index) { - bridge_t *bridge = pcibr_soft->bs_base; - - return (ate_index < pcibr_soft->bs_int_ate_size) - ? &(bridge->b_int_ate_ram[ate_index].wr) - : &(bridge->b_ext_ate_ram[ate_index]); -} - -/* We are starting to get more complexity - * surrounding writing ATEs, so pull - * the writing code into this new function. - */ - -#if PCIBR_FREEZE_TIME -#define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, &freeze_time, cmd_regs) -#else -#define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, cmd_regs) -#endif - -unsigned -ate_freeze(pcibr_dmamap_t pcibr_dmamap, -#if PCIBR_FREEZE_TIME - unsigned *freeze_time_ptr, -#endif - unsigned *cmd_regs) -{ - pcibr_soft_t pcibr_soft = pcibr_dmamap->bd_soft; -#ifdef LATER - int dma_slot = pcibr_dmamap->bd_slot; -#endif - int ext_ates = pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM; - int slot; - - unsigned long s; - unsigned cmd_reg; - volatile unsigned *cmd_lwa; - unsigned cmd_lwd; - - if (!ext_ates) - return 0; - - /* Bridge Hardware Bug WAR #484930: - * Bridge can't handle updating External ATEs - * while DMA is occurring that uses External ATEs, - * even if the particular ATEs involved are disjoint. - */ - - /* need to prevent anyone else from - * unfreezing the grant while we - * are working; also need to prevent - * this thread from being interrupted - * to keep PCI grant freeze time - * at an absolute minimum. - */ - s = pcibr_lock(pcibr_soft); - -#ifdef LATER - /* just in case pcibr_dmamap_done was not called */ - if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_BUSY) { - pcibr_dmamap->bd_flags &= ~PCIBR_DMAMAP_BUSY; - if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM) - atomic_dec(&(pcibr_soft->bs_slot[dma_slot]. bss_ext_ates_active)); - xtalk_dmamap_done(pcibr_dmamap->bd_xtalk); - } -#endif /* LATER */ -#if PCIBR_FREEZE_TIME - *freeze_time_ptr = get_timestamp(); -#endif - - cmd_lwa = 0; - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - if (atomic_read(&pcibr_soft->bs_slot[slot].bss_ext_ates_active)) { - cmd_reg = pcibr_soft-> - bs_slot[slot]. - bss_cmd_shadow; - if (cmd_reg & PCI_CMD_BUS_MASTER) { - cmd_lwa = pcibr_soft-> - bs_slot[slot]. - bss_cmd_pointer; - cmd_lwd = cmd_reg ^ PCI_CMD_BUS_MASTER; - cmd_lwa[0] = cmd_lwd; - } - cmd_regs[slot] = cmd_reg; - } else - cmd_regs[slot] = 0; - - if (cmd_lwa) { - bridge_t *bridge = pcibr_soft->bs_base; - - /* Read the last master bit that has been cleared. This PIO read - * on the PCI bus is to ensure the completion of any DMAs that - * are due to bus requests issued by PCI devices before the - * clearing of master bits. - */ - cmd_lwa[0]; - - /* Flush all the write buffers in the bridge */ - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { - if (atomic_read(&pcibr_soft->bs_slot[slot].bss_ext_ates_active)) { - /* Flush the write buffer associated with this - * PCI device which might be using dma map RAM. - */ - bridge->b_wr_req_buf[slot].reg; - } - } + if (ate_index < pcibr_soft->bs_int_ate_size) { + return (pcireg_int_ate_addr(pcibr_soft, ate_index)); + } else { + printk("pcibr_ate_addr(): INVALID ate_index 0x%x", ate_index); + return (bridge_ate_p)0; } - return s; -} - -void -ate_write(pcibr_soft_t pcibr_soft, - bridge_ate_p ate_ptr, - int ate_count, - bridge_ate_t ate) -{ - while (ate_count-- > 0) { - *ate_ptr++ = ate; - ate += IOPGSIZE; - } } -#if PCIBR_FREEZE_TIME -#define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, ate, ate_total, freeze_time, cmd_regs, s) -#else -#define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, cmd_regs, s) -#endif - +/* + * Write the ATE. + */ void -ate_thaw(pcibr_dmamap_t pcibr_dmamap, - int ate_index, -#if PCIBR_FREEZE_TIME - bridge_ate_t ate, - int ate_total, - unsigned freeze_time_start, -#endif - unsigned *cmd_regs, - unsigned s) +ate_write(pcibr_soft_t pcibr_soft, int ate_index, int count, bridge_ate_t ate) { - pcibr_soft_t pcibr_soft = pcibr_dmamap->bd_soft; - int dma_slot = pcibr_dmamap->bd_slot; - int slot; - bridge_t *bridge = pcibr_soft->bs_base; - int ext_ates = pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM; - - unsigned cmd_reg; - -#if PCIBR_FREEZE_TIME - unsigned freeze_time; - static unsigned max_freeze_time = 0; - static unsigned max_ate_total; -#endif - - if (!ext_ates) - return; - - /* restore cmd regs */ - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { - if ((cmd_reg = cmd_regs[slot]) & PCI_CMD_BUS_MASTER) { - pcibr_slot_config_set(bridge, slot, PCI_CFG_COMMAND/4, cmd_reg); + while (count-- > 0) { + if (ate_index < pcibr_soft->bs_int_ate_size) { + pcireg_int_ate_set(pcibr_soft, ate_index, ate); + PCIBR_DEBUG((PCIBR_DEBUG_DMAMAP, pcibr_soft->bs_vhdl, + "ate_write(): ate_index=0x%x, ate=0x%lx\n", + ate_index, (uint64_t)ate)); + } else { + printk("ate_write(): INVALID ate_index 0x%x", ate_index); + return; } + ate_index++; + ate += IOPGSIZE; } - pcibr_dmamap->bd_flags |= PCIBR_DMAMAP_BUSY; - atomic_inc(&(pcibr_soft->bs_slot[dma_slot]. bss_ext_ates_active)); - -#if PCIBR_FREEZE_TIME - freeze_time = get_timestamp() - freeze_time_start; - if ((max_freeze_time < freeze_time) || - (max_ate_total < ate_total)) { - if (max_freeze_time < freeze_time) - max_freeze_time = freeze_time; - if (max_ate_total < ate_total) - max_ate_total = ate_total; - pcibr_unlock(pcibr_soft, s); - printk( "%s: pci freeze time %d usec for %d ATEs\n" - "\tfirst ate: %R\n", - pcibr_soft->bs_name, - freeze_time * 1000 / 1250, - ate_total, - ate, ate_bits); - } else -#endif - pcibr_unlock(pcibr_soft, s); + pcireg_tflush_get(pcibr_soft); /* wait until Bridge PIO complete */ } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_config.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_config.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_config.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_config.c Tue Feb 17 20:00:07 2004 @@ -34,22 +34,21 @@ * the 32bit word that contains the "offset" byte. */ cfg_p -pcibr_func_config_addr(bridge_t *bridge, pciio_bus_t bus, pciio_slot_t slot, +pcibr_func_config_addr(pcibr_soft_t soft, pciio_bus_t bus, pciio_slot_t slot, pciio_function_t func, int offset) { /* * Type 1 config space */ if (bus > 0) { - bridge->b_pci_cfg = ((bus << 16) | (slot << 11)); - return &bridge->b_type1_cfg.f[func].l[(offset)]; + pcireg_type1_cntr_set(soft, ((bus << 16) | (slot << 11))); + return (pcireg_type1_cfg_addr(soft, func, offset)); } /* * Type 0 config space */ - slot++; - return &bridge->b_type0_cfg_dev[slot].f[func].l[offset]; + return (pcireg_type0_cfg_addr(soft, slot, func, offset)); } /* @@ -58,59 +57,21 @@ * 32bit word that contains the "offset" byte. */ cfg_p -pcibr_slot_config_addr(bridge_t *bridge, pciio_slot_t slot, int offset) +pcibr_slot_config_addr(pcibr_soft_t soft, pciio_slot_t slot, int offset) { - return pcibr_func_config_addr(bridge, 0, slot, 0, offset); -} - -/* - * Return config space data for given slot / offset - */ -unsigned -pcibr_slot_config_get(bridge_t *bridge, pciio_slot_t slot, int offset) -{ - cfg_p cfg_base; - - cfg_base = pcibr_slot_config_addr(bridge, slot, 0); - return (do_pcibr_config_get(cfg_base, offset, sizeof(unsigned))); -} - -/* - * Return config space data for given slot / func / offset - */ -unsigned -pcibr_func_config_get(bridge_t *bridge, pciio_slot_t slot, - pciio_function_t func, int offset) -{ - cfg_p cfg_base; - - cfg_base = pcibr_func_config_addr(bridge, 0, slot, func, 0); - return (do_pcibr_config_get(cfg_base, offset, sizeof(unsigned))); -} - -/* - * Set config space data for given slot / offset - */ -void -pcibr_slot_config_set(bridge_t *bridge, pciio_slot_t slot, - int offset, unsigned val) -{ - cfg_p cfg_base; - - cfg_base = pcibr_slot_config_addr(bridge, slot, 0); - do_pcibr_config_set(cfg_base, offset, sizeof(unsigned), val); + return pcibr_func_config_addr(soft, 0, slot, 0, offset); } /* * Set config space data for given slot / func / offset */ void -pcibr_func_config_set(bridge_t *bridge, pciio_slot_t slot, +pcibr_func_config_set(pcibr_soft_t soft, pciio_slot_t slot, pciio_function_t func, int offset, unsigned val) { cfg_p cfg_base; - cfg_base = pcibr_func_config_addr(bridge, 0, slot, func, 0); + cfg_base = pcibr_func_config_addr(soft, 0, slot, func, 0); do_pcibr_config_set(cfg_base, offset, sizeof(unsigned), val); } @@ -124,8 +85,6 @@ pciio_bus_t pciio_bus; pciio_slot_t pciio_slot; pciio_function_t pciio_func; - pcibr_soft_t pcibr_soft; - bridge_t *bridge; cfg_p cfgbase = (cfg_p)0; pciio_info_t pciio_info; @@ -164,11 +123,7 @@ pciio_func = PCI_TYPE1_FUNC(reg); } - pcibr_soft = (pcibr_soft_t) pcibr_info->f_mfast; - - bridge = pcibr_soft->bs_base; - - cfgbase = pcibr_func_config_addr(bridge, + cfgbase = pcibr_func_config_addr((pcibr_soft_t) pcibr_info->f_mfast, pciio_bus, pciio_slot, pciio_func, 0); return cfgbase; diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c Tue Feb 17 20:00:14 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c Tue Feb 17 20:00:14 2004 @@ -30,68 +30,17 @@ * based bricks use the corelet id. * -pcibr_debug_slot is the pci slot you want to trace. */ -uint32_t pcibr_debug_mask = 0x0; /* 0x00000000 to disable */ +uint32_t pcibr_debug_mask; /* 0x00000000 to disable */ static char *pcibr_debug_module = "all"; /* 'all' for all modules */ static int pcibr_debug_widget = -1; /* '-1' for all widgets */ static int pcibr_debug_slot = -1; /* '-1' for all slots */ -/* kbrick widgetnum-to-bus layout */ -int p_busnum[MAX_PORT_NUM] = { /* widget# */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0 - 0x7 */ - 2, /* 0x8 */ - 1, /* 0x9 */ - 0, 0, /* 0xa - 0xb */ - 5, /* 0xc */ - 6, /* 0xd */ - 4, /* 0xe */ - 3, /* 0xf */ -}; - -char *pci_space[] = {"NONE", - "ROM", - "IO", - "", - "MEM", - "MEM32", - "MEM64", - "CFG", - "WIN0", - "WIN1", - "WIN2", - "WIN3", - "WIN4", - "WIN5", - "", - "BAD"}; - #if PCIBR_SOFT_LIST -pcibr_list_p pcibr_list = 0; +pcibr_list_p pcibr_list; #endif -extern int hwgraph_vertex_name_get(vertex_hdl_t vhdl, char *buf, uint buflen); -extern long atoi(register char *p); -extern cnodeid_t nodevertex_to_cnodeid(vertex_hdl_t vhdl); -extern char *dev_to_name(vertex_hdl_t dev, char *buf, uint buflen); -extern struct map *atemapalloc(uint64_t); -extern void atefree(struct map *, size_t, uint64_t); -extern void atemapfree(struct map *); -extern pciio_dmamap_t get_free_pciio_dmamap(vertex_hdl_t); -extern void free_pciio_dmamap(pcibr_dmamap_t); -extern void xwidget_error_register(vertex_hdl_t, error_handler_f *, error_handler_arg_t); - -#define ATE_WRITE() ate_write(pcibr_soft, ate_ptr, ate_count, ate) -#if PCIBR_FREEZE_TIME -#define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, &freeze_time, cmd_regs) -#else -#define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, cmd_regs) -#endif /* PCIBR_FREEZE_TIME */ - -#if PCIBR_FREEZE_TIME -#define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, ate, ate_total, freeze_time, cmd_regs, s) -#else -#define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, cmd_regs, s) -#endif +extern char *pci_space[]; /* ===================================================================== * Function Table of Contents @@ -102,46 +51,35 @@ * perhaps bust this file into smaller chunks. */ -extern int do_pcibr_rrb_free_all(pcibr_soft_t, bridge_t *, pciio_slot_t); +extern void do_pcibr_rrb_free_all(pcibr_soft_t, pciio_slot_t); extern void do_pcibr_rrb_autoalloc(pcibr_soft_t, int, int, int); +extern void pcibr_rrb_alloc_more(pcibr_soft_t pcibr_soft, int slot, + int vchan, int more_rrbs); extern int pcibr_wrb_flush(vertex_hdl_t); extern int pcibr_rrb_alloc(vertex_hdl_t, int *, int *); -extern void pcibr_rrb_flush(vertex_hdl_t); +void pcibr_rrb_alloc_more(pcibr_soft_t, int, int, int); -static int pcibr_try_set_device(pcibr_soft_t, pciio_slot_t, unsigned, bridgereg_t); -void pcibr_release_device(pcibr_soft_t, pciio_slot_t, bridgereg_t); +extern void pcibr_rrb_flush(vertex_hdl_t); -extern void pcibr_setwidint(xtalk_intr_t); -extern void pcibr_clearwidint(bridge_t *); +static int pcibr_try_set_device(pcibr_soft_t, pciio_slot_t, unsigned, uint64_t); +void pcibr_release_device(pcibr_soft_t, pciio_slot_t, uint64_t); extern iopaddr_t pcibr_bus_addr_alloc(pcibr_soft_t, pciio_win_info_t, pciio_space_t, int, int, int); +extern int hwgraph_vertex_name_get(vertex_hdl_t vhdl, char *buf, + uint buflen); -int pcibr_attach(vertex_hdl_t); -int pcibr_attach2(vertex_hdl_t, bridge_t *, vertex_hdl_t, - int, pcibr_soft_t *); int pcibr_detach(vertex_hdl_t); +void pcibr_directmap_init(pcibr_soft_t); int pcibr_pcix_rbars_calc(pcibr_soft_t); -extern int pcibr_init_ext_ate_ram(bridge_t *); -extern int pcibr_ate_alloc(pcibr_soft_t, int); -extern void pcibr_ate_free(pcibr_soft_t, int, int); +extern int pcibr_ate_alloc(pcibr_soft_t, int, struct resource *); +extern void pcibr_ate_free(pcibr_soft_t, int, int, struct resource *); +extern pciio_dmamap_t get_free_pciio_dmamap(vertex_hdl_t); +extern void free_pciio_dmamap(pcibr_dmamap_t); extern int pcibr_widget_to_bus(vertex_hdl_t pcibr_vhdl); -extern unsigned ate_freeze(pcibr_dmamap_t pcibr_dmamap, -#if PCIBR_FREEZE_TIME - unsigned *freeze_time_ptr, -#endif - unsigned *cmd_regs); -extern void ate_write(pcibr_soft_t pcibr_soft, bridge_ate_p ate_ptr, int ate_count, bridge_ate_t ate); -extern void ate_thaw(pcibr_dmamap_t pcibr_dmamap, int ate_index, -#if PCIBR_FREEZE_TIME - bridge_ate_t ate, - int ate_total, - unsigned freeze_time_start, -#endif - unsigned *cmd_regs, - unsigned s); +extern void ate_write(pcibr_soft_t, int, int, bridge_ate_t); pcibr_info_t pcibr_info_get(vertex_hdl_t); @@ -156,7 +94,7 @@ void pcibr_piospace_free(vertex_hdl_t, pciio_space_t, iopaddr_t, size_t); static iopaddr_t pcibr_flags_to_d64(unsigned, pcibr_soft_t); -extern bridge_ate_t pcibr_flags_to_ate(unsigned); +extern bridge_ate_t pcibr_flags_to_ate(pcibr_soft_t, unsigned); pcibr_dmamap_t pcibr_dmamap_alloc(vertex_hdl_t, device_desc_t, size_t, unsigned); void pcibr_dmamap_free(pcibr_dmamap_t); @@ -168,77 +106,20 @@ iopaddr_t pcibr_dmatrans_addr(vertex_hdl_t, device_desc_t, paddr_t, size_t, unsigned); void pcibr_dmamap_drain(pcibr_dmamap_t); void pcibr_dmaaddr_drain(vertex_hdl_t, paddr_t, size_t); -void pcibr_dmalist_drain(vertex_hdl_t, alenlist_t); iopaddr_t pcibr_dmamap_pciaddr_get(pcibr_dmamap_t); -extern unsigned pcibr_intr_bits(pciio_info_t info, - pciio_intr_line_t lines, int nslots); -extern pcibr_intr_t pcibr_intr_alloc(vertex_hdl_t, device_desc_t, pciio_intr_line_t, vertex_hdl_t); -extern void pcibr_intr_free(pcibr_intr_t); -extern void pcibr_setpciint(xtalk_intr_t); -extern int pcibr_intr_connect(pcibr_intr_t, intr_func_t, intr_arg_t); -extern void pcibr_intr_disconnect(pcibr_intr_t); - -extern vertex_hdl_t pcibr_intr_cpu_get(pcibr_intr_t); -extern void pcibr_intr_func(intr_arg_t); - -extern void print_bridge_errcmd(uint32_t, char *); - -extern void pcibr_error_dump(pcibr_soft_t); -extern uint32_t pcibr_errintr_group(uint32_t); -extern void pcibr_pioerr_check(pcibr_soft_t); -extern void pcibr_error_intr_handler(int, void *, struct pt_regs *); - -extern int pcibr_addr_toslot(pcibr_soft_t, iopaddr_t, pciio_space_t *, iopaddr_t *, pciio_function_t *); -extern void pcibr_error_cleanup(pcibr_soft_t, int); -extern void pcibr_device_disable(pcibr_soft_t, int); -extern int pcibr_pioerror(pcibr_soft_t, int, ioerror_mode_t, ioerror_t *); -extern int pcibr_dmard_error(pcibr_soft_t, int, ioerror_mode_t, ioerror_t *); -extern int pcibr_dmawr_error(pcibr_soft_t, int, ioerror_mode_t, ioerror_t *); -extern int pcibr_error_handler(error_handler_arg_t, int, ioerror_mode_t, ioerror_t *); -extern int pcibr_error_handler_wrapper(error_handler_arg_t, int, ioerror_mode_t, ioerror_t *); void pcibr_provider_startup(vertex_hdl_t); void pcibr_provider_shutdown(vertex_hdl_t); int pcibr_reset(vertex_hdl_t); pciio_endian_t pcibr_endian_set(vertex_hdl_t, pciio_endian_t, pciio_endian_t); -int pcibr_priority_bits_set(pcibr_soft_t, pciio_slot_t, pciio_priority_t); -pciio_priority_t pcibr_priority_set(vertex_hdl_t, pciio_priority_t); int pcibr_device_flags_set(vertex_hdl_t, pcibr_device_flags_t); -extern cfg_p pcibr_config_addr(vertex_hdl_t, unsigned); -extern uint64_t pcibr_config_get(vertex_hdl_t, unsigned, unsigned); -extern void pcibr_config_set(vertex_hdl_t, unsigned, unsigned, uint64_t); - -extern pcibr_hints_t pcibr_hints_get(vertex_hdl_t, int); -extern void pcibr_hints_fix_rrbs(vertex_hdl_t); -extern void pcibr_hints_dualslot(vertex_hdl_t, pciio_slot_t, pciio_slot_t); -extern void pcibr_hints_intr_bits(vertex_hdl_t, pcibr_intr_bits_f *); -extern void pcibr_set_rrb_callback(vertex_hdl_t, rrb_alloc_funct_t); -extern void pcibr_hints_handsoff(vertex_hdl_t); -extern void pcibr_hints_subdevs(vertex_hdl_t, pciio_slot_t, uint64_t); - -extern int pcibr_slot_info_init(vertex_hdl_t,pciio_slot_t); extern int pcibr_slot_info_free(vertex_hdl_t,pciio_slot_t); -extern int pcibr_slot_info_return(pcibr_soft_t, pciio_slot_t, - pcibr_slot_info_resp_t); -extern void pcibr_slot_func_info_return(pcibr_info_h, int, - pcibr_slot_func_info_resp_t); -extern int pcibr_slot_addr_space_init(vertex_hdl_t,pciio_slot_t); -extern int pcibr_slot_pcix_rbar_init(pcibr_soft_t, pciio_slot_t); -extern int pcibr_slot_device_init(vertex_hdl_t, pciio_slot_t); -extern int pcibr_slot_guest_info_init(vertex_hdl_t,pciio_slot_t); -extern int pcibr_slot_call_device_attach(vertex_hdl_t, - pciio_slot_t, int); -extern int pcibr_slot_call_device_detach(vertex_hdl_t, - pciio_slot_t, int); -extern int pcibr_slot_attach(vertex_hdl_t, pciio_slot_t, int, - char *, int *); extern int pcibr_slot_detach(vertex_hdl_t, pciio_slot_t, int, char *, int *); -extern int pcibr_slot_initial_rrb_alloc(vertex_hdl_t, pciio_slot_t); -extern int pcibr_initial_rrb(vertex_hdl_t, pciio_slot_t, pciio_slot_t); +pciio_businfo_t pcibr_businfo_get(vertex_hdl_t); /* ===================================================================== * Device(x) register management @@ -256,33 +137,23 @@ pcibr_try_set_device(pcibr_soft_t pcibr_soft, pciio_slot_t slot, unsigned flags, - bridgereg_t mask) + uint64_t mask) { - bridge_t *bridge; pcibr_soft_slot_t slotp; - bridgereg_t old; - bridgereg_t new; - bridgereg_t chg; - bridgereg_t bad; - bridgereg_t badpmu; - bridgereg_t badd32; - bridgereg_t badd64; - bridgereg_t fix; - unsigned long s; - bridgereg_t xmask; - - xmask = mask; - if (mask == BRIDGE_DEV_PMU_BITS) - xmask = XBRIDGE_DEV_PMU_BITS; - if (mask == BRIDGE_DEV_D64_BITS) - xmask = XBRIDGE_DEV_D64_BITS; + uint64_t old; + uint64_t new; + uint64_t chg; + uint64_t bad; + uint64_t badpmu; + uint64_t badd32; + uint64_t badd64; + uint64_t fix; + unsigned long s; slotp = &pcibr_soft->bs_slot[slot]; s = pcibr_lock(pcibr_soft); - bridge = pcibr_soft->bs_base; - old = slotp->bss_device; /* figure out what the desired @@ -390,21 +261,21 @@ * PIC, can cause problems for 32-bit devices. */ if (mask == BRIDGE_DEV_D64_BITS && - PCIBR_WAR_ENABLED(PV855271, pcibr_soft)) { - if (flags & PCIBR_VCHAN1) { - new |= BRIDGE_DEV_VIRTUAL_EN; - xmask |= BRIDGE_DEV_VIRTUAL_EN; - } + PCIBR_WAR_ENABLED(PV855271, pcibr_soft)) { + if (flags & PCIBR_VCHAN1) { + new |= BRIDGE_DEV_VIRTUAL_EN; + mask |= BRIDGE_DEV_VIRTUAL_EN; + } } /* PIC BRINGUP WAR (PV# 878674): Don't allow 64bit PIO accesses */ - if (IS_PIC_SOFT(pcibr_soft) && (flags & PCIBR_64BIT) && + if ((flags & PCIBR_64BIT) && PCIBR_WAR_ENABLED(PV878674, pcibr_soft)) { new &= ~(1ull << 22); } chg = old ^ new; /* what are we changing, */ - chg &= xmask; /* of the interesting bits */ + chg &= mask; /* of the interesting bits */ if (chg) { @@ -476,9 +347,10 @@ pcibr_unlock(pcibr_soft, s); return 0; } - bridge->b_device[slot].reg = new; + + pcireg_device_set(pcibr_soft, slot, new); slotp->bss_device = new; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + pcireg_tflush_get(pcibr_soft); /* wait until Bridge PIO complete */ pcibr_unlock(pcibr_soft, s); PCIBR_DEBUG((PCIBR_DEBUG_DEVREG, pcibr_soft->bs_vhdl, @@ -489,7 +361,7 @@ void pcibr_release_device(pcibr_soft_t pcibr_soft, pciio_slot_t slot, - bridgereg_t mask) + uint64_t mask) { pcibr_soft_slot_t slotp; unsigned long s; @@ -508,22 +380,6 @@ pcibr_unlock(pcibr_soft, s); } -/* - * flush write gather buffer for slot - */ -static void -pcibr_device_write_gather_flush(pcibr_soft_t pcibr_soft, - pciio_slot_t slot) -{ - bridge_t *bridge; - unsigned long s; - volatile uint32_t wrf; - s = pcibr_lock(pcibr_soft); - bridge = pcibr_soft->bs_base; - - wrf = bridge->b_wr_req_buf[slot].reg; - pcibr_unlock(pcibr_soft, s); -} /* ===================================================================== * Bridge (pcibr) "Device Driver" entry points @@ -535,7 +391,7 @@ { vertex_hdl_t pcibr_vhdl = file->f_dentry->d_fsdata; pcibr_soft_t pcibr_soft; - bridge_t *bridge; + void *bridge; unsigned long phys_addr; int error = 0; @@ -547,7 +403,7 @@ error = io_remap_page_range(vma, phys_addr, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot); - return(error); + return error; } /* @@ -683,7 +539,6 @@ vertex_hdl_t pcibr_vhdl; pciio_slot_t slot; pcibr_soft_t pcibr_soft; - bridge_t *bridge; int count_vchan0, count_vchan1; unsigned long s; int error_call; @@ -695,7 +550,6 @@ slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); pcibr_soft = pcibr_soft_get(pcibr_vhdl); - bridge = pcibr_soft->bs_base; /* Clear all the hardware xtalk resources for this device */ xtalk_widgetdev_shutdown(pcibr_soft->bs_conn, slot); @@ -718,7 +572,7 @@ pcibr_soft->bs_rrb_valid[slot][VCHAN3]; /* Free the rrbs allocated to this slot, both the normal & virtual */ - do_pcibr_rrb_free_all(pcibr_soft, bridge, slot); + do_pcibr_rrb_free_all(pcibr_soft, slot); count_vchan0 = pcibr_soft->bs_rrb_valid_dflt[slot][VCHAN0]; count_vchan1 = pcibr_soft->bs_rrb_valid_dflt[slot][VCHAN1]; @@ -741,7 +595,7 @@ if (error_call) error = error_call; - return(error); + return error; } @@ -823,951 +677,6 @@ } } -/* - * build a convenience link path in the - * form of "...//bus/" - * - * returns 1 on success, 0 otherwise - * - * depends on hwgraph separator == '/' - */ -int -pcibr_bus_cnvlink(vertex_hdl_t f_c) -{ - char dst[MAXDEVNAME]; - char *dp = dst; - char *cp, *xp; - int widgetnum; - char pcibus[8]; - vertex_hdl_t nvtx, svtx; - int rv; - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, f_c, "pcibr_bus_cnvlink\n")); - - if (GRAPH_SUCCESS != hwgraph_vertex_name_get(f_c, dst, MAXDEVNAME)) - return 0; - - /* dst example == /hw/module/001c02/Pbrick/xtalk/8/pci/direct */ - - /* find the widget number */ - xp = strstr(dst, "/"EDGE_LBL_XTALK"/"); - if (xp == NULL) - return 0; - widgetnum = simple_strtoul(xp+7, NULL, 0); - if (widgetnum < XBOW_PORT_8 || widgetnum > XBOW_PORT_F) - return 0; - - /* remove "/pci/direct" from path */ - cp = strstr(dst, "/" EDGE_LBL_PCI "/" EDGE_LBL_DIRECT); - if (cp == NULL) - return 0; - *cp = (char)NULL; - - /* get the vertex for the widget */ - if (GRAPH_SUCCESS != hwgraph_traverse(NULL, dp, &svtx)) - return 0; - - *xp = (char)NULL; /* remove "/xtalk/..." from path */ - - /* dst example now == /hw/module/001c02/Pbrick */ - - /* get the bus number */ - strcat(dst, "/"); - strcat(dst, EDGE_LBL_BUS); - sprintf(pcibus, "%d", p_busnum[widgetnum]); - - /* link to bus to widget */ - rv = hwgraph_path_add(NULL, dp, &nvtx); - if (GRAPH_SUCCESS == rv) - rv = hwgraph_edge_add(nvtx, svtx, pcibus); - - return (rv == GRAPH_SUCCESS); -} - - -/* - * pcibr_attach: called every time the crosstalk - * infrastructure is asked to initialize a widget - * that matches the part number we handed to the - * registration routine above. - */ -/*ARGSUSED */ -int -pcibr_attach(vertex_hdl_t xconn_vhdl) -{ - /* REFERENCED */ - graph_error_t rc; - vertex_hdl_t pcibr_vhdl; - bridge_t *bridge; - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, xconn_vhdl, "pcibr_attach\n")); - - bridge = (bridge_t *) - xtalk_piotrans_addr(xconn_vhdl, NULL, - 0, sizeof(bridge_t), 0); - /* - * Create the vertex for the PCI bus, which we - * will also use to hold the pcibr_soft and - * which will be the "master" vertex for all the - * pciio connection points we will hang off it. - * This needs to happen before we call nic_bridge_vertex_info - * as we are some of the *_vmc functions need access to the edges. - * - * Opening this vertex will provide access to - * the Bridge registers themselves. - */ - rc = hwgraph_path_add(xconn_vhdl, EDGE_LBL_PCI, &pcibr_vhdl); - ASSERT(rc == GRAPH_SUCCESS); - - pciio_provider_register(pcibr_vhdl, &pcibr_provider); - pciio_provider_startup(pcibr_vhdl); - - return pcibr_attach2(xconn_vhdl, bridge, pcibr_vhdl, 0, NULL); -} - - -/*ARGSUSED */ -int -pcibr_attach2(vertex_hdl_t xconn_vhdl, bridge_t *bridge, - vertex_hdl_t pcibr_vhdl, int busnum, pcibr_soft_t *ret_softp) -{ - /* REFERENCED */ - vertex_hdl_t ctlr_vhdl; - bridgereg_t id; - int rev; - pcibr_soft_t pcibr_soft; - pcibr_info_t pcibr_info; - xwidget_info_t info; - xtalk_intr_t xtalk_intr; - int slot; - int ibit; - vertex_hdl_t noslot_conn; - char devnm[MAXDEVNAME], *s; - pcibr_hints_t pcibr_hints; - uint64_t int_enable; - picreg_t int_enable_64; - unsigned rrb_fixed = 0; - -#if PCI_FBBE - int fast_back_to_back_enable; -#endif - nasid_t nasid; - int iobrick_type_get_nasid(nasid_t nasid); - int iomoduleid_get(nasid_t nasid); - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, - "pcibr_attach2: bridge=0x%p, busnum=%d\n", bridge, busnum)); - - ctlr_vhdl = NULL; - ctlr_vhdl = hwgraph_register(pcibr_vhdl, EDGE_LBL_CONTROLLER, 0, - 0, 0, 0, - S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0, - (struct file_operations *)&pcibr_fops, (void *)pcibr_vhdl); - ASSERT(ctlr_vhdl != NULL); - - /* - * Get the hint structure; if some NIC callback - * marked this vertex as "hands-off" then we - * just return here, before doing anything else. - */ - pcibr_hints = pcibr_hints_get(xconn_vhdl, 0); - - if (pcibr_hints && pcibr_hints->ph_hands_off) - return -1; /* generic operations disabled */ - - id = bridge->b_wid_id; - rev = XWIDGET_PART_REV_NUM(id); - - hwgraph_info_add_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, (arbitrary_info_t) rev); - - /* - * allocate soft state structure, fill in some - * fields, and hook it up to our vertex. - */ - pcibr_soft = kmalloc(sizeof(*(pcibr_soft)), GFP_KERNEL); - if (ret_softp) - *ret_softp = pcibr_soft; - if (!pcibr_soft) - return -1; - - memset(pcibr_soft, 0, sizeof *pcibr_soft); - pcibr_soft_set(pcibr_vhdl, pcibr_soft); - pcibr_soft->bs_conn = xconn_vhdl; - pcibr_soft->bs_vhdl = pcibr_vhdl; - pcibr_soft->bs_base = bridge; - pcibr_soft->bs_rev_num = rev; - pcibr_soft->bs_intr_bits = (pcibr_intr_bits_f *)pcibr_intr_bits; - - pcibr_soft->bs_min_slot = 0; /* lowest possible slot# */ - pcibr_soft->bs_max_slot = 7; /* highest possible slot# */ - pcibr_soft->bs_busnum = busnum; - pcibr_soft->bs_bridge_type = PCIBR_BRIDGETYPE_PIC; - switch(pcibr_soft->bs_bridge_type) { - case PCIBR_BRIDGETYPE_BRIDGE: - pcibr_soft->bs_int_ate_size = BRIDGE_INTERNAL_ATES; - pcibr_soft->bs_bridge_mode = 0; /* speed is not available in bridge */ - break; - case PCIBR_BRIDGETYPE_PIC: - pcibr_soft->bs_min_slot = 0; - pcibr_soft->bs_max_slot = 3; - pcibr_soft->bs_int_ate_size = XBRIDGE_INTERNAL_ATES; - pcibr_soft->bs_bridge_mode = - (((bridge->p_wid_stat_64 & PIC_STAT_PCIX_SPEED) >> 33) | - ((bridge->p_wid_stat_64 & PIC_STAT_PCIX_ACTIVE) >> 33)); - - /* We have to clear PIC's write request buffer to avoid parity - * errors. See PV#854845. - */ - { - int i; - - for (i=0; i < PIC_WR_REQ_BUFSIZE; i++) { - bridge->p_wr_req_lower[i] = 0; - bridge->p_wr_req_upper[i] = 0; - bridge->p_wr_req_parity[i] = 0; - } - } - - break; - case PCIBR_BRIDGETYPE_XBRIDGE: - pcibr_soft->bs_int_ate_size = XBRIDGE_INTERNAL_ATES; - pcibr_soft->bs_bridge_mode = - ((bridge->b_wid_control & BRIDGE_CTRL_PCI_SPEED) >> 3); - break; - } - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, - "pcibr_attach2: pcibr_soft=0x%x, mode=0x%x\n", - pcibr_soft, pcibr_soft->bs_bridge_mode)); - pcibr_soft->bsi_err_intr = 0; - - /* Bridges up through REV C - * are unable to set the direct - * byteswappers to BYTE_STREAM. - */ - if (pcibr_soft->bs_rev_num <= BRIDGE_PART_REV_C) { - pcibr_soft->bs_pio_end_io = PCIIO_WORD_VALUES; - pcibr_soft->bs_pio_end_mem = PCIIO_WORD_VALUES; - } -#if PCIBR_SOFT_LIST - /* - * link all the pcibr_soft structs - */ - { - pcibr_list_p self; - - self = kmalloc(sizeof(*(self)), GFP_KERNEL); - if (!self) - return -1; - memset(self, 0, sizeof(*(self))); - self->bl_soft = pcibr_soft; - self->bl_vhdl = pcibr_vhdl; - self->bl_next = pcibr_list; - pcibr_list = self; - } -#endif /* PCIBR_SOFT_LIST */ - - /* - * get the name of this bridge vertex and keep the info. Use this - * only where it is really needed now: like error interrupts. - */ - s = dev_to_name(pcibr_vhdl, devnm, MAXDEVNAME); - pcibr_soft->bs_name = kmalloc(strlen(s) + 1, GFP_KERNEL); - strcpy(pcibr_soft->bs_name, s); - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, - "pcibr_attach2: %s ASIC: rev %s (code=0x%x)\n", - "PIC", - (rev == BRIDGE_PART_REV_A) ? "A" : - (rev == BRIDGE_PART_REV_B) ? "B" : - (rev == BRIDGE_PART_REV_C) ? "C" : - (rev == BRIDGE_PART_REV_D) ? "D" : - (rev == XBRIDGE_PART_REV_A) ? "A" : - (rev == XBRIDGE_PART_REV_B) ? "B" : - (IS_PIC_PART_REV_A(rev)) ? "A" : - "unknown", rev, pcibr_soft->bs_name)); - - info = xwidget_info_get(xconn_vhdl); - pcibr_soft->bs_xid = xwidget_info_id_get(info); - pcibr_soft->bs_master = xwidget_info_master_get(info); - pcibr_soft->bs_mxid = xwidget_info_masterid_get(info); - - pcibr_soft->bs_first_slot = pcibr_soft->bs_min_slot; - pcibr_soft->bs_last_slot = pcibr_soft->bs_max_slot; - /* - * Bridge can only reset slots 0, 1, 2, and 3. Ibrick internal - * slots 4, 5, 6, and 7 must be reset as a group, so do not - * reset them. - */ - pcibr_soft->bs_last_reset = 3; - - nasid = NASID_GET(bridge); - - if ((pcibr_soft->bs_bricktype = iobrick_type_get_nasid(nasid)) < 0) - printk(KERN_WARNING "0x%p: Unknown bricktype : 0x%x\n", (void *)xconn_vhdl, - (unsigned int)pcibr_soft->bs_bricktype); - - pcibr_soft->bs_moduleid = iomoduleid_get(nasid); - - if (pcibr_soft->bs_bricktype > 0) { - switch (pcibr_soft->bs_bricktype) { - case MODULE_PXBRICK: - case MODULE_IXBRICK: - pcibr_soft->bs_first_slot = 0; - pcibr_soft->bs_last_slot = 1; - pcibr_soft->bs_last_reset = 1; - - /* If Bus 1 has IO9 then there are 4 devices in that bus. Note - * we figure this out from klconfig since the kernel has yet to - * probe - */ - if (pcibr_widget_to_bus(pcibr_vhdl) == 1) { - lboard_t *brd = (lboard_t *)KL_CONFIG_INFO(nasid); - - while (brd) { - if (brd->brd_flags & LOCAL_MASTER_IO6) { - pcibr_soft->bs_last_slot = 3; - pcibr_soft->bs_last_reset = 3; - } - brd = KLCF_NEXT(brd); - } - } - break; - case MODULE_PBRICK: - pcibr_soft->bs_first_slot = 1; - pcibr_soft->bs_last_slot = 2; - pcibr_soft->bs_last_reset = 2; - break; - - case MODULE_IBRICK: - /* - * Here's the current baseio layout for SN1 style systems: - * - * 0 1 2 3 4 5 6 7 slot# - * - * x scsi x x ioc3 usb x x O300 Ibrick - * - * x == never occupied - * E == external (add-in) slot - * - */ - pcibr_soft->bs_first_slot = 1; /* Ibrick first slot == 1 */ - if (pcibr_soft->bs_xid == 0xe) { - pcibr_soft->bs_last_slot = 2; - pcibr_soft->bs_last_reset = 2; - } else { - pcibr_soft->bs_last_slot = 6; - } - break; - default: - break; - } - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, - "pcibr_attach2: %cbrick, slots %d-%d\n", - MODULE_GET_BTCHAR(pcibr_soft->bs_moduleid), - pcibr_soft->bs_first_slot, pcibr_soft->bs_last_slot)); - } - - /* - * Initialize bridge and bus locks - */ - spin_lock_init(&pcibr_soft->bs_lock); - /* - * If we have one, process the hints structure. - */ - if (pcibr_hints) { - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_HINTS, pcibr_vhdl, - "pcibr_attach2: pcibr_hints=0x%x\n", pcibr_hints)); - - rrb_fixed = pcibr_hints->ph_rrb_fixed; - - pcibr_soft->bs_rrb_fixed = rrb_fixed; - - if (pcibr_hints->ph_intr_bits) { - pcibr_soft->bs_intr_bits = pcibr_hints->ph_intr_bits; - } - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { - int hslot = pcibr_hints->ph_host_slot[slot] - 1; - - if (hslot < 0) { - pcibr_soft->bs_slot[slot].host_slot = slot; - } else { - pcibr_soft->bs_slot[slot].has_host = 1; - pcibr_soft->bs_slot[slot].host_slot = hslot; - } - } - } - /* - * Set-up initial values for state fields - */ - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { - pcibr_soft->bs_slot[slot].bss_devio.bssd_space = PCIIO_SPACE_NONE; - pcibr_soft->bs_slot[slot].bss_devio.bssd_ref_cnt = 0; - pcibr_soft->bs_slot[slot].bss_d64_base = PCIBR_D64_BASE_UNSET; - pcibr_soft->bs_slot[slot].bss_d32_base = PCIBR_D32_BASE_UNSET; - pcibr_soft->bs_slot[slot].bss_ext_ates_active = ATOMIC_INIT(0); - pcibr_soft->bs_rrb_valid_dflt[slot][VCHAN0] = -1; - } - - for (ibit = 0; ibit < 8; ++ibit) { - pcibr_soft->bs_intr[ibit].bsi_xtalk_intr = 0; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_soft = pcibr_soft; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_list = NULL; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_stat = - &(bridge->b_int_status); - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_ibit = ibit; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_hdlrcnt = 0; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_shared = 0; - pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_connected = 0; - } - - /* - * connect up our error handler. PIC has 2 busses (thus resulting in 2 - * pcibr_soft structs under 1 widget), so only register a xwidget error - * handler for PIC's bus0. NOTE: for PIC pcibr_error_handler_wrapper() - * is a wrapper routine we register that will call the real error handler - * pcibr_error_handler() with the correct pcibr_soft struct. - */ - if (busnum == 0) { - xwidget_error_register(xconn_vhdl, pcibr_error_handler_wrapper, pcibr_soft); - } - - /* - * Initialize various Bridge registers. - */ - - /* - * On pre-Rev.D bridges, set the PCI_RETRY_CNT - * to zero to avoid dropping stores. (#475347) - */ - if (rev < BRIDGE_PART_REV_D) - bridge->b_bus_timeout &= ~BRIDGE_BUS_PCI_RETRY_MASK; - - /* - * Clear all pending interrupts. - */ - bridge->b_int_rst_stat = (BRIDGE_IRR_ALL_CLR); - - /* Initialize some PIC specific registers. */ - { - picreg_t pic_ctrl_reg = bridge->p_wid_control_64; - - /* Bridges Requester ID: bus = busnum, dev = 0, func = 0 */ - pic_ctrl_reg &= ~PIC_CTRL_BUS_NUM_MASK; - pic_ctrl_reg |= PIC_CTRL_BUS_NUM(busnum); - pic_ctrl_reg &= ~PIC_CTRL_DEV_NUM_MASK; - pic_ctrl_reg &= ~PIC_CTRL_FUN_NUM_MASK; - - pic_ctrl_reg &= ~PIC_CTRL_NO_SNOOP; - pic_ctrl_reg &= ~PIC_CTRL_RELAX_ORDER; - - /* enable parity checking on PICs internal RAM */ - pic_ctrl_reg |= PIC_CTRL_PAR_EN_RESP; - pic_ctrl_reg |= PIC_CTRL_PAR_EN_ATE; - /* PIC BRINGUP WAR (PV# 862253): dont enable write request - * parity checking. - */ - if (!PCIBR_WAR_ENABLED(PV862253, pcibr_soft)) { - pic_ctrl_reg |= PIC_CTRL_PAR_EN_REQ; - } - - bridge->p_wid_control_64 = pic_ctrl_reg; - } - bridge->b_int_device = (uint32_t) 0x006db6db; - { - bridgereg_t dirmap; - paddr_t paddr; - iopaddr_t xbase; - xwidgetnum_t xport; - iopaddr_t offset; - int num_entries = 0; - int entry; - cnodeid_t cnodeid; - nasid_t nasid; - - /* Set the Bridge's 32-bit PCI to XTalk - * Direct Map register to the most useful - * value we can determine. Note that we - * must use a single xid for all of: - * direct-mapped 32-bit DMA accesses - * direct-mapped 64-bit DMA accesses - * DMA accesses through the PMU - * interrupts - * This is the only way to guarantee that - * completion interrupts will reach a CPU - * after all DMA data has reached memory. - * (Of course, there may be a few special - * drivers/controlers that explicitly manage - * this ordering problem.) - */ - - cnodeid = 0; /* default node id */ - nasid = COMPACT_TO_NASID_NODEID(cnodeid); - paddr = NODE_OFFSET(nasid) + 0; - - /* currently, we just assume that if we ask - * for a DMA mapping to "zero" the XIO - * host will transmute this into a request - * for the lowest hunk of memory. - */ - xbase = xtalk_dmatrans_addr(xconn_vhdl, 0, - paddr, PAGE_SIZE, 0); - - if (xbase != XIO_NOWHERE) { - if (XIO_PACKED(xbase)) { - xport = XIO_PORT(xbase); - xbase = XIO_ADDR(xbase); - } else - xport = pcibr_soft->bs_mxid; - - offset = xbase & ((1ull << BRIDGE_DIRMAP_OFF_ADDRSHFT) - 1ull); - xbase >>= BRIDGE_DIRMAP_OFF_ADDRSHFT; - - dirmap = xport << BRIDGE_DIRMAP_W_ID_SHFT; - - if (xbase) - dirmap |= BRIDGE_DIRMAP_OFF & xbase; - else if (offset >= (512 << 20)) - dirmap |= BRIDGE_DIRMAP_ADD512; - - bridge->b_dir_map = dirmap; - } - /* - * Set bridge's idea of page size according to the system's - * idea of "IO page size". TBD: The idea of IO page size - * should really go away. - */ - /* - * ensure that we write and read without any interruption. - * The read following the write is required for the Bridge war - */ -#if IOPGSIZE == 4096 - bridge->p_wid_control_64 &= ~BRIDGE_CTRL_PAGE_SIZE; -#elif IOPGSIZE == 16384 - bridge->p_wid_control_64 |= BRIDGE_CTRL_PAGE_SIZE; -#else - <<>>; -#endif - bridge->b_wid_control; /* inval addr bug war */ - - /* Initialize internal mapping entries */ - for (entry = 0; entry < pcibr_soft->bs_int_ate_size; entry++) { - bridge->b_int_ate_ram[entry].wr = 0; - } - - /* - * Determine if there's external mapping SSRAM on this - * bridge. Set up Bridge control register appropriately, - * inititlize SSRAM, and set software up to manage RAM - * entries as an allocatable resource. - * - * Currently, we just use the rm* routines to manage ATE - * allocation. We should probably replace this with a - * Best Fit allocator. - * - * For now, if we have external SSRAM, avoid using - * the internal ssram: we can't turn PREFETCH on - * when we use the internal SSRAM; and besides, - * this also guarantees that no allocation will - * straddle the internal/external line, so we - * can increment ATE write addresses rather than - * recomparing against BRIDGE_INTERNAL_ATES every - * time. - */ - - num_entries = 0; - - /* we always have 128 ATEs (512 for Xbridge) inside the chip - * even if disabled for debugging. - */ - pcibr_soft->bs_int_ate_resource.start = 0; - pcibr_soft->bs_int_ate_resource.end = pcibr_soft->bs_int_ate_size - 1; - - if (num_entries > pcibr_soft->bs_int_ate_size) { -#if PCIBR_ATE_NOTBOTH /* for debug -- forces us to use external ates */ - printk("pcibr_attach: disabling internal ATEs.\n"); - pcibr_ate_alloc(pcibr_soft, pcibr_soft->bs_int_ate_size); -#endif - pcibr_soft->bs_ext_ate_resource.start = pcibr_soft->bs_int_ate_size; - pcibr_soft->bs_ext_ate_resource.end = num_entries; - } - - pcibr_soft->bs_allocated_ate_res = (void *) kmalloc(pcibr_soft->bs_int_ate_size * sizeof(unsigned long), GFP_KERNEL); - memset(pcibr_soft->bs_allocated_ate_res, 0x0, pcibr_soft->bs_int_ate_size * sizeof(unsigned long)); - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATE, pcibr_vhdl, - "pcibr_attach2: %d ATEs, %d internal & %d external\n", - num_entries ? num_entries : pcibr_soft->bs_int_ate_size, - pcibr_soft->bs_int_ate_size, - num_entries ? num_entries-pcibr_soft->bs_int_ate_size : 0)); - } - - { - bridgereg_t dirmap; - iopaddr_t xbase; - - /* - * now figure the *real* xtalk base address - * that dirmap sends us to. - */ - dirmap = bridge->b_dir_map; - if (dirmap & BRIDGE_DIRMAP_OFF) - xbase = (iopaddr_t)(dirmap & BRIDGE_DIRMAP_OFF) - << BRIDGE_DIRMAP_OFF_ADDRSHFT; - else if (dirmap & BRIDGE_DIRMAP_ADD512) - xbase = 512 << 20; - else - xbase = 0; - - pcibr_soft->bs_dir_xbase = xbase; - - /* it is entirely possible that we may, at this - * point, have our dirmap pointing somewhere - * other than our "master" port. - */ - pcibr_soft->bs_dir_xport = - (dirmap & BRIDGE_DIRMAP_W_ID) >> BRIDGE_DIRMAP_W_ID_SHFT; - } - - /* pcibr sources an error interrupt; - * figure out where to send it. - * - * If any interrupts are enabled in bridge, - * then the prom set us up and our interrupt - * has already been reconnected in mlreset - * above. - * - * Need to set the D_INTR_ISERR flag - * in the dev_desc used for allocating the - * error interrupt, so our interrupt will - * be properly routed and prioritized. - * - * If our crosstalk provider wants to - * fix widget error interrupts to specific - * destinations, D_INTR_ISERR is how it - * knows to do this. - */ - - xtalk_intr = xtalk_intr_alloc(xconn_vhdl, (device_desc_t)0, pcibr_vhdl); - { - int irq = ((hub_intr_t)xtalk_intr)->i_bit; - int cpu = ((hub_intr_t)xtalk_intr)->i_cpuid; - - intr_unreserve_level(cpu, irq); - ((hub_intr_t)xtalk_intr)->i_bit = SGI_PCIBR_ERROR; - } - ASSERT(xtalk_intr != NULL); - - pcibr_soft->bsi_err_intr = xtalk_intr; - - /* - * On IP35 with XBridge, we do some extra checks in pcibr_setwidint - * in order to work around some addressing limitations. In order - * for that fire wall to work properly, we need to make sure we - * start from a known clean state. - */ - pcibr_clearwidint(bridge); - - xtalk_intr_connect(xtalk_intr, (intr_func_t) pcibr_error_intr_handler, - (intr_arg_t) pcibr_soft, (xtalk_intr_setfunc_t)pcibr_setwidint, (void *)bridge); - - request_irq(SGI_PCIBR_ERROR, (void *)pcibr_error_intr_handler, SA_SHIRQ, "PCIBR error", - (intr_arg_t) pcibr_soft); - - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pcibr_vhdl, - "pcibr_setwidint: b_wid_int_upper=0x%x, b_wid_int_lower=0x%x\n", - bridge->b_wid_int_upper, bridge->b_wid_int_lower)); - - /* - * now we can start handling error interrupts; - * enable all of them. - * NOTE: some PCI ints may already be enabled. - */ - int_enable_64 = bridge->p_int_enable_64 | BRIDGE_ISR_ERRORS; - int_enable = (uint64_t)int_enable_64; - -#if BRIDGE_ERROR_INTR_WAR - if (pcibr_soft->bs_rev_num == BRIDGE_PART_REV_A) { - /* - * We commonly get master timeouts when talking to ql. - * We also see RESP_XTALK_ERROR and LLP_TX_RETRY interrupts. - * Insure that these are all disabled for now. - */ - int_enable &= ~(BRIDGE_IMR_PCI_MST_TIMEOUT | - BRIDGE_ISR_RESP_XTLK_ERR | - BRIDGE_ISR_LLP_TX_RETRY); - } - if (pcibr_soft->bs_rev_num < BRIDGE_PART_REV_C) { - int_enable &= ~BRIDGE_ISR_BAD_XRESP_PKT; - } -#endif /* BRIDGE_ERROR_INTR_WAR */ - -#ifdef QL_SCSI_CTRL_WAR /* for IP30 only */ - /* Really a QL rev A issue, but all newer hearts have newer QLs. - * Forces all IO6/MSCSI to be new. - */ - if (heart_rev() == HEART_REV_A) - int_enable &= ~BRIDGE_IMR_PCI_MST_TIMEOUT; -#endif - -#ifdef BRIDGE1_TIMEOUT_WAR - if (pcibr_soft->bs_rev_num == BRIDGE_PART_REV_A) { - /* - * Turn off these interrupts. They can't be trusted in bridge 1 - */ - int_enable &= ~(BRIDGE_IMR_XREAD_REQ_TIMEOUT | - BRIDGE_IMR_UNEXP_RESP); - } -#endif - - /* PIC BRINGUP WAR (PV# 856864 & 856865): allow the tnums that are - * locked out to be freed up sooner (by timing out) so that the - * read tnums are never completely used up. - */ - if (PCIBR_WAR_ENABLED(PV856864, pcibr_soft)) { - int_enable &= ~PIC_ISR_PCIX_REQ_TOUT; - int_enable &= ~BRIDGE_ISR_XREAD_REQ_TIMEOUT; - - bridge->b_wid_req_timeout = 0x750; - } - - /* - * PIC BRINGUP WAR (PV# 856866, 859504, 861476, 861478): Don't use - * RRB0, RRB8, RRB1, and RRB9. Assign them to DEVICE[2|3]--VCHAN3 - * so they are not used - */ - if (PCIBR_WAR_ENABLED(PV856866, pcibr_soft)) { - bridge->b_even_resp |= 0x000f000f; - bridge->b_odd_resp |= 0x000f000f; - } - - bridge->p_int_enable_64 = (picreg_t)int_enable; - bridge->b_int_mode = 0; /* do not send "clear interrupt" packets */ - - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - - /* - * Depending on the rev of bridge, disable certain features. - * Easiest way seems to be to force the PCIBR_NOwhatever - * flag to be on for all DMA calls, which overrides any - * PCIBR_whatever flag or even the setting of whatever - * from the PCIIO_DMA_class flags (or even from the other - * PCIBR flags, since NO overrides YES). - */ - pcibr_soft->bs_dma_flags = 0; - - /* PREFETCH: - * Always completely disabled for REV.A; - * at "pcibr_prefetch_enable_rev", anyone - * asking for PCIIO_PREFETCH gets it. - * Between these two points, you have to ask - * for PCIBR_PREFETCH, which promises that - * your driver knows about known Bridge WARs. - */ - if (pcibr_soft->bs_rev_num < BRIDGE_PART_REV_B) - pcibr_soft->bs_dma_flags |= PCIBR_NOPREFETCH; - else if (pcibr_soft->bs_rev_num < - (BRIDGE_WIDGET_PART_NUM << 4)) - pcibr_soft->bs_dma_flags |= PCIIO_NOPREFETCH; - - /* WRITE_GATHER: Disabled */ - if (pcibr_soft->bs_rev_num < - (BRIDGE_WIDGET_PART_NUM << 4)) - pcibr_soft->bs_dma_flags |= PCIBR_NOWRITE_GATHER; - - /* PIC only supports 64-bit direct mapping in PCI-X mode. Since - * all PCI-X devices that initiate memory transactions must be - * capable of generating 64-bit addressed, we force 64-bit DMAs. - */ - if (IS_PCIX(pcibr_soft)) { - pcibr_soft->bs_dma_flags |= PCIIO_DMA_A64; - } - - { - - iopaddr_t prom_base_addr = pcibr_soft->bs_xid << 24; - int prom_base_size = 0x1000000; - int status; - struct resource *res; - - /* Allocate resource maps based on bus page size; for I/O and memory - * space, free all pages except those in the base area and in the - * range set by the PROM. - * - * PROM creates BAR addresses in this format: 0x0ws00000 where w is - * the widget number and s is the device register offset for the slot. - */ - - /* Setup the Bus's PCI IO Root Resource. */ - pcibr_soft->bs_io_win_root_resource.start = PCIBR_BUS_IO_BASE; - pcibr_soft->bs_io_win_root_resource.end = 0xffffffff; - res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); - if (!res) - panic("PCIBR:Unable to allocate resource structure\n"); - - /* Block off the range used by PROM. */ - res->start = prom_base_addr; - res->end = prom_base_addr + (prom_base_size - 1); - status = request_resource(&pcibr_soft->bs_io_win_root_resource, res); - if (status) - panic("PCIBR:Unable to request_resource()\n"); - - /* Setup the Small Window Root Resource */ - pcibr_soft->bs_swin_root_resource.start = PAGE_SIZE; - pcibr_soft->bs_swin_root_resource.end = 0x000FFFFF; - - /* Setup the Bus's PCI Memory Root Resource */ - pcibr_soft->bs_mem_win_root_resource.start = 0x200000; - pcibr_soft->bs_mem_win_root_resource.end = 0xffffffff; - res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); - if (!res) - panic("PCIBR:Unable to allocate resource structure\n"); - - /* Block off the range used by PROM. */ - res->start = prom_base_addr; - res->end = prom_base_addr + (prom_base_size - 1);; - status = request_resource(&pcibr_soft->bs_mem_win_root_resource, res); - if (status) - panic("PCIBR:Unable to request_resource()\n"); - - } - - /* build "no-slot" connection point - */ - pcibr_info = pcibr_device_info_new - (pcibr_soft, PCIIO_SLOT_NONE, PCIIO_FUNC_NONE, - PCIIO_VENDOR_ID_NONE, PCIIO_DEVICE_ID_NONE); - noslot_conn = pciio_device_info_register - (pcibr_vhdl, &pcibr_info->f_c); - - /* Remember the no slot connection point info for tearing it - * down during detach. - */ - pcibr_soft->bs_noslot_conn = noslot_conn; - pcibr_soft->bs_noslot_info = pcibr_info; -#if PCI_FBBE - fast_back_to_back_enable = 1; -#endif - -#if PCI_FBBE - if (fast_back_to_back_enable) { - /* - * All devices on the bus are capable of fast back to back, so - * we need to set the fast back to back bit in all devices on - * the bus that are capable of doing such accesses. - */ - } -#endif - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { - /* Find out what is out there */ - (void)pcibr_slot_info_init(pcibr_vhdl,slot); - } - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - /* Set up the address space for this slot in the PCI land */ - (void)pcibr_slot_addr_space_init(pcibr_vhdl, slot); - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - /* Setup the device register */ - (void)pcibr_slot_device_init(pcibr_vhdl, slot); - - if (IS_PCIX(pcibr_soft)) { - pcibr_soft->bs_pcix_rbar_inuse = 0; - pcibr_soft->bs_pcix_rbar_avail = NUM_RBAR; - pcibr_soft->bs_pcix_rbar_percent_allowed = - pcibr_pcix_rbars_calc(pcibr_soft); - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - /* Setup the PCI-X Read Buffer Attribute Registers (RBARs) */ - (void)pcibr_slot_pcix_rbar_init(pcibr_soft, slot); - } - - /* Set up convenience links */ - pcibr_bus_cnvlink(pcibr_soft->bs_vhdl); - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - /* Setup host/guest relations */ - (void)pcibr_slot_guest_info_init(pcibr_vhdl, slot); - - /* Handle initial RRB management for Bridge and Xbridge */ - pcibr_initial_rrb(pcibr_vhdl, - pcibr_soft->bs_first_slot, pcibr_soft->bs_last_slot); - -{ /* Before any drivers get called that may want to re-allocate - * RRB's, let's get some special cases pre-allocated. Drivers - * may override these pre-allocations, but by doing pre-allocations - * now we're assured not to step all over what the driver intended. - * - * Note: Someday this should probably be moved over to pcibr_rrb.c - */ - /* - * Each Pbrick PCI bus only has slots 1 and 2. Similarly for - * widget 0xe on Ibricks. Allocate RRB's accordingly. - */ - if (pcibr_soft->bs_bricktype > 0) { - switch (pcibr_soft->bs_bricktype) { - case MODULE_PBRICK: - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 8); - do_pcibr_rrb_autoalloc(pcibr_soft, 2, VCHAN0, 8); - break; - case MODULE_IBRICK: - /* port 0xe on the Ibrick only has slots 1 and 2 */ - if (pcibr_soft->bs_xid == 0xe) { - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 8); - do_pcibr_rrb_autoalloc(pcibr_soft, 2, VCHAN0, 8); - } - else { - /* allocate one RRB for the serial port */ - do_pcibr_rrb_autoalloc(pcibr_soft, 0, VCHAN0, 1); - } - break; - case MODULE_PXBRICK: - case MODULE_IXBRICK: - /* - * If the IO9 is in the PXBrick (bus1, slot1) allocate - * RRBs to all the devices - */ - if ((pcibr_widget_to_bus(pcibr_vhdl) == 1) && - (pcibr_soft->bs_slot[0].bss_vendor_id == 0x10A9) && - (pcibr_soft->bs_slot[0].bss_device_id == 0x100A)) { - do_pcibr_rrb_autoalloc(pcibr_soft, 0, VCHAN0, 4); - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 4); - do_pcibr_rrb_autoalloc(pcibr_soft, 2, VCHAN0, 4); - do_pcibr_rrb_autoalloc(pcibr_soft, 3, VCHAN0, 4); - } else { - do_pcibr_rrb_autoalloc(pcibr_soft, 0, VCHAN0, 8); - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 8); - } - break; - } /* switch */ - } - -#ifdef LATER - if (strstr(nicinfo, XTALK_PCI_PART_NUM)) { - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 8); - } -#endif -} /* OK Special RRB allocations are done. */ - - for (slot = pcibr_soft->bs_min_slot; - slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) - /* Call the device attach */ - (void)pcibr_slot_call_device_attach(pcibr_vhdl, slot, 0); - - pciio_device_attach(noslot_conn, (int)0); - - return 0; -} - /* * pcibr_detach: * Detach the bridge device from the hwgraph after cleaning out all the @@ -1777,25 +686,22 @@ int pcibr_detach(vertex_hdl_t xconn) { - pciio_slot_t slot; - vertex_hdl_t pcibr_vhdl; - pcibr_soft_t pcibr_soft; - bridge_t *bridge; - unsigned s; + pciio_slot_t slot; + vertex_hdl_t pcibr_vhdl; + pcibr_soft_t pcibr_soft; + unsigned long s; PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_DETACH, xconn, "pcibr_detach\n")); /* Get the bridge vertex from its xtalk connection point */ if (hwgraph_traverse(xconn, EDGE_LBL_PCI, &pcibr_vhdl) != GRAPH_SUCCESS) - return(1); + return 1; pcibr_soft = pcibr_soft_get(pcibr_vhdl); - bridge = pcibr_soft->bs_base; - - s = pcibr_lock(pcibr_soft); /* Disable the interrupts from the bridge */ - bridge->p_int_enable_64 = 0; + s = pcibr_lock(pcibr_soft); + pcireg_intr_enable_set(pcibr_soft, 0); pcibr_unlock(pcibr_soft, s); /* Detach all the PCI devices talking to this bridge */ @@ -1823,26 +729,64 @@ /* Remove the Bridge revision labelled info */ (void)hwgraph_info_remove_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, NULL); - /* Remove the character device associated with this bridge */ - hwgraph_edge_remove(pcibr_vhdl, EDGE_LBL_CONTROLLER, NULL); - /* Remove the PCI bridge vertex */ - hwgraph_edge_remove(xconn, EDGE_LBL_PCI, NULL); - return(0); + return 0; } + +/* + * Set the Bridge's 32-bit PCI to XTalk Direct Map register to the most useful + * value we can determine. Note that we must use a single xid for all of: + * -direct-mapped 32-bit DMA accesses + * -direct-mapped 64-bit DMA accesses + * -DMA accesses through the PMU + * -interrupts + * This is the only way to guarantee that completion interrupts will reach a + * CPU after all DMA data has reached memory. + */ +void +pcibr_directmap_init(pcibr_soft_t pcibr_soft) +{ + paddr_t paddr; + iopaddr_t xbase; + uint64_t diroff; + cnodeid_t cnodeid = 0; /* We need api for diroff api */ + nasid_t nasid; + + nasid = COMPACT_TO_NASID_NODEID(cnodeid); + paddr = NODE_OFFSET(nasid) + 0; + + /* Assume that if we ask for a DMA mapping to zero the XIO host will + * transmute this into a request for the lowest hunk of memory. + */ + xbase = xtalk_dmatrans_addr(pcibr_soft->bs_conn, 0, paddr, PAGE_SIZE, 0); + + diroff = xbase >> BRIDGE_DIRMAP_OFF_ADDRSHFT; + pcireg_dirmap_diroff_set(pcibr_soft, diroff); + pcireg_dirmap_wid_set(pcibr_soft, pcibr_soft->bs_mxid); + pcibr_soft->bs_dir_xport = pcibr_soft->bs_mxid; + if (xbase == (512 << 20)) { /* 512Meg */ + pcireg_dirmap_add512_set(pcibr_soft); + pcibr_soft->bs_dir_xbase = (512 << 20); + } else { + pcireg_dirmap_add512_clr(pcibr_soft); + pcibr_soft->bs_dir_xbase = diroff << BRIDGE_DIRMAP_OFF_ADDRSHFT; + } +} + + int pcibr_asic_rev(vertex_hdl_t pconn_vhdl) { - vertex_hdl_t pcibr_vhdl; - int tmp_vhdl; + vertex_hdl_t pcibr_vhdl; + int rc; arbitrary_info_t ainfo; if (GRAPH_SUCCESS != hwgraph_traverse(pconn_vhdl, EDGE_LBL_MASTER, &pcibr_vhdl)) return -1; - tmp_vhdl = hwgraph_info_get_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, &ainfo); + rc = hwgraph_info_get_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, &ainfo); /* * Any hwgraph function that returns a vertex handle will implicity @@ -1855,20 +799,10 @@ */ hwgraph_vertex_unref(pcibr_vhdl); - if (tmp_vhdl != GRAPH_SUCCESS) + if (rc != GRAPH_SUCCESS) return -1; - return (int) ainfo; -} -int -pcibr_write_gather_flush(vertex_hdl_t pconn_vhdl) -{ - pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); - pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - pciio_slot_t slot; - slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); - pcibr_device_write_gather_flush(pcibr_soft, slot); - return 0; + return (int) ainfo; } /* ===================================================================== @@ -1884,14 +818,12 @@ unsigned flags) { pcibr_info_t pcibr_info = pcibr_info_get(pconn_vhdl); - pciio_info_t pciio_info = &pcibr_info->f_c; + pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridge_t *bridge = pcibr_soft->bs_base; - unsigned bar; /* which BASE reg on device is decoding */ iopaddr_t xio_addr = XIO_NOWHERE; - iopaddr_t base; /* base of devio(x) mapped area on PCI */ - iopaddr_t limit; /* base of devio(x) mapped area on PCI */ + iopaddr_t base = 0; + iopaddr_t limit = 0; pciio_space_t wspace; /* which space device is decoding */ iopaddr_t wbase; /* base of device decode on PCI */ @@ -2012,7 +944,7 @@ maxtry = PCIBR_NUM_SLOTS(pcibr_soft) * 2; halftry = PCIBR_NUM_SLOTS(pcibr_soft) - 1; for (try = 0; try < maxtry; ++try) { - bridgereg_t devreg; + uint64_t devreg; unsigned offset; /* calculate win based on slot, attempt, and max possible @@ -2080,14 +1012,13 @@ devreg &= ~BRIDGE_DEV_DEV_SWAP; if (pcibr_soft->bs_slot[win].bss_device != devreg) { - bridge->b_device[win].reg = devreg; + pcireg_device_set(pcibr_soft, win, devreg); pcibr_soft->bs_slot[win].bss_device = devreg; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ -#ifdef PCI_LATER + pcireg_tflush_get(pcibr_soft); + PCIBR_DEBUG((PCIBR_DEBUG_DEVREG, pconn_vhdl, "pcibr_addr_pci_to_xio: Device(%d): 0x%x\n", win, devreg)); -#endif } pcibr_soft->bs_slot[win].bss_devio.bssd_space = space; pcibr_soft->bs_slot[win].bss_devio.bssd_base = mbase; @@ -2200,7 +1131,7 @@ if (xio_addr != XIO_NOWHERE) { unsigned bst; /* nonzero to set bytestream */ unsigned *bfp; /* addr of record of how swapper is set */ - unsigned swb; /* which control bit to mung */ + uint64_t swb; /* which control bit to mung */ unsigned bfo; /* current swapper setting */ unsigned bfn; /* desired swapper setting */ @@ -2226,13 +1157,13 @@ bfn & PCIIO_WORD_VALUES ? " WORD_VALUES" : "")); xio_addr = XIO_NOWHERE; } else { /* OK to make the change. */ - picreg_t octl, nctl; - swb = (space == PCIIO_SPACE_IO) ? BRIDGE_CTRL_IO_SWAP : BRIDGE_CTRL_MEM_SWAP; - octl = bridge->p_wid_control_64; - nctl = bst ? octl | (uint64_t)swb : octl & ((uint64_t)~swb); + swb = (space == PCIIO_SPACE_IO) ? 0: BRIDGE_CTRL_MEM_SWAP; + if (bst) { + pcireg_control_bit_set(pcibr_soft, swb); + } else { + pcireg_control_bit_clr(pcibr_soft, swb); + } - if (octl != nctl) /* make the change if any */ - bridge->b_wid_control = nctl; *bfp = bfn; /* record the assignment */ PCIBR_DEBUG((PCIBR_DEBUG_PIOMAP, pconn_vhdl, @@ -2324,7 +1255,7 @@ pcibr_piomap->bp_pciaddr = pci_addr; pcibr_piomap->bp_mapsz = req_size; pcibr_piomap->bp_soft = pcibr_soft; - pcibr_piomap->bp_toc[0] = ATOMIC_INIT(0); + pcibr_piomap->bp_toc = ATOMIC_INIT(0); if (mapptr) { s = pcibr_lock(pcibr_soft); @@ -2383,7 +1314,7 @@ "pcibr_piomap_addr: map=0x%lx, addr=0x%lx\n", pcibr_piomap, addr)); - return(addr); + return addr; } /*ARGSUSED */ @@ -2424,7 +1355,7 @@ PCIBR_DEBUG((PCIBR_DEBUG_PIODIR, pconn_vhdl, "pcibr_piotrans_addr: xio_addr=0x%lx, addr=0x%lx\n", xio_addr, addr)); - return(addr); + return addr; } /* @@ -2546,6 +1477,7 @@ return start_addr; } +#define ERR_MSG "!Device %s freeing size (0x%lx) different than allocated (0x%lx)" /*ARGSUSED */ void pcibr_piospace_free(vertex_hdl_t pconn_vhdl, @@ -2689,7 +1621,7 @@ attributes &= (PCI64_ATTR_BAR | PCI64_ATTR_SWAP); } - return (attributes); + return attributes; } /*ARGSUSED */ @@ -2775,7 +1707,7 @@ else min_rrbs = 1; if (have_rrbs < min_rrbs) - do_pcibr_rrb_autoalloc(pcibr_soft, slot, vchan, + pcibr_rrb_alloc_more(pcibr_soft, slot, vchan, min_rrbs - have_rrbs); } } @@ -2845,7 +1777,7 @@ - 1) + 1; /* round UP */ } - ate_index = pcibr_ate_alloc(pcibr_soft, ate_count); + ate_index = pcibr_ate_alloc(pcibr_soft, ate_count, &pcibr_dmamap->resource); if (ate_index != -1) { if (!pcibr_try_set_device(pcibr_soft, slot, flags, BRIDGE_DEV_PMU_BITS)) { @@ -2857,7 +1789,7 @@ "pcibr_dmamap_alloc: using PMU, ate_index=%d, " "pcibr_dmamap=0x%lx\n", ate_index, pcibr_dmamap)); - ate_proto = pcibr_flags_to_ate(flags); + ate_proto = pcibr_flags_to_ate(pcibr_soft, flags); pcibr_dmamap->bd_flags = flags; pcibr_dmamap->bd_pci_addr = @@ -2890,7 +1822,7 @@ else min_rrbs = 1; if (have_rrbs < min_rrbs) - do_pcibr_rrb_autoalloc(pcibr_soft, slot, vchan, + pcibr_rrb_alloc_more(pcibr_soft, slot, vchan, min_rrbs - have_rrbs); } } @@ -2900,7 +1832,7 @@ "pcibr_dmamap_alloc: PMU use failed, ate_index=%d\n", ate_index)); - pcibr_ate_free(pcibr_soft, ate_index, ate_count); + pcibr_ate_free(pcibr_soft, ate_index, ate_count, &pcibr_dmamap->resource); } /* total failure: sorry, you just can't * get from here to there that way. @@ -2920,16 +1852,6 @@ pciio_slot_t slot = PCIBR_SLOT_TO_DEVICE(pcibr_soft, pcibr_dmamap->bd_slot); - unsigned flags = pcibr_dmamap->bd_flags; - - /* Make sure that bss_ext_ates_active - * is properly kept up to date. - */ - - if (PCIBR_DMAMAP_BUSY & flags) - if (PCIBR_DMAMAP_SSRAM & flags) - atomic_dec(&(pcibr_soft->bs_slot[slot]. bss_ext_ates_active)); - xtalk_dmamap_free(pcibr_dmamap->bd_xtalk); if (pcibr_dmamap->bd_flags & PCIIO_DMA_A64) { @@ -2938,8 +1860,9 @@ if (pcibr_dmamap->bd_ate_count) { pcibr_ate_free(pcibr_dmamap->bd_soft, pcibr_dmamap->bd_ate_index, - pcibr_dmamap->bd_ate_count); - pcibr_release_device(pcibr_soft, slot, BRIDGE_DEV_PMU_BITS); + pcibr_dmamap->bd_ate_count, + &pcibr_dmamap->resource); + pcibr_release_device(pcibr_soft, slot, XBRIDGE_DEV_PMU_BITS); } PCIBR_DEBUG((PCIBR_DEBUG_DMAMAP, pcibr_dmamap->bd_dev, @@ -2992,7 +1915,7 @@ for (slot = soft->bs_min_slot; slot < PCIBR_NUM_SLOTS(soft); ++slot) if ((xio_addr >= PCIBR_BRIDGE_DEVIO(soft, slot)) && (xio_lim < PCIBR_BRIDGE_DEVIO(soft, slot + 1))) { - bridgereg_t dev; + uint64_t dev; dev = soft->bs_slot[slot].bss_device; pci_addr = dev & BRIDGE_DEV_OFF_MASK; @@ -3091,33 +2014,14 @@ paddr, paddr + req_size - 1, xio_port, xio_addr, pci_addr)); } else { - bridge_t *bridge = pcibr_soft->bs_base; iopaddr_t offset = IOPGOFF(xio_addr); bridge_ate_t ate_proto = pcibr_dmamap->bd_ate_proto; int ate_count = IOPG(offset + req_size - 1) + 1; - int ate_index = pcibr_dmamap->bd_ate_index; - unsigned cmd_regs[8]; - unsigned s; - -#if PCIBR_FREEZE_TIME - int ate_total = ate_count; - unsigned freeze_time; -#endif - bridge_ate_p ate_ptr = pcibr_dmamap->bd_ate_ptr; bridge_ate_t ate; - /* Bridge Hardware WAR #482836: - * If the transfer is not cache aligned - * and the Bridge Rev is <= B, force - * prefetch to be off. - */ - if (flags & PCIBR_NOPREFETCH) - ate_proto &= ~ATE_PREF; - - ate = ate_proto - | (xio_port << ATE_TIDSHIFT) - | (xio_addr - offset); + ate = ate_proto | (xio_addr - offset); + ate |= (xio_port << ATE_TIDSHIFT); pci_addr = pcibr_dmamap->bd_pci_addr + offset; @@ -3128,10 +2032,8 @@ ASSERT(ate_count > 0); if (ate_count <= pcibr_dmamap->bd_ate_count) { - ATE_FREEZE(); - ATE_WRITE(); - ATE_THAW(); - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + ate_write(pcibr_soft, ate_index, ate_count, ate); + PCIBR_DEBUG((PCIBR_DEBUG_DMAMAP, pcibr_dmamap->bd_dev, "pcibr_dmamap_addr (PMU) : wanted paddr " "[0x%lx..0x%lx] returning PCI 0x%lx\n", @@ -3163,19 +2065,6 @@ void pcibr_dmamap_done(pcibr_dmamap_t pcibr_dmamap) { - /* - * We could go through and invalidate ATEs here; - * for performance reasons, we don't. - * We also don't enforce the strict alternation - * between _addr/_list and _done, but Hub does. - */ - - if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_BUSY) { - pcibr_dmamap->bd_flags &= ~PCIBR_DMAMAP_BUSY; - - if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM) - atomic_dec(&(pcibr_dmamap->bd_soft->bs_slot[pcibr_dmamap->bd_slot]. bss_ext_ates_active)); - } xtalk_dmamap_done(pcibr_dmamap->bd_xtalk); PCIBR_DEBUG((PCIBR_DEBUG_DMAMAP, pcibr_dmamap->bd_dev, @@ -3198,7 +2087,7 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - return(NASID_TO_COMPACT_NODEID(NASID_GET(pcibr_soft->bs_dir_xbase))); + return NASID_TO_COMPACT_NODEID(NASID_GET(pcibr_soft->bs_dir_xbase)); } /*ARGSUSED */ @@ -3281,17 +2170,13 @@ if ((pci_addr != PCIBR_D64_BASE_UNSET) && (flags == slotp->bss_d64_flags)) { - pci_addr |= xio_addr - | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT); - -#if HWG_PERF_CHECK - if (xio_addr != 0x20000000) -#endif - PCIBR_DEBUG((PCIBR_DEBUG_DMADIR, pconn_vhdl, - "pcibr_dmatrans_addr: wanted paddr [0x%x..0x%x], " - "xio_port=0x%x, direct64: pci_addr=0x%x\n", - paddr, paddr + req_size - 1, xio_addr, pci_addr)); - return (pci_addr); + pci_addr |= xio_addr | + ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT); + PCIBR_DEBUG((PCIBR_DEBUG_DMADIR, pconn_vhdl, + "pcibr_dmatrans_addr: wanted paddr [0x%lx..0x%lx], " + "xio_port=0x%x, direct64: pci_addr=0x%lx\n", + paddr, paddr + req_size - 1, xio_addr, pci_addr)); + return pci_addr; } if (!pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D64_BITS)) { pci_addr = pcibr_flags_to_d64(flags, pcibr_soft); @@ -3313,7 +2198,7 @@ else min_rrbs = 1; if (have_rrbs < min_rrbs) - do_pcibr_rrb_autoalloc(pcibr_soft, pciio_slot, vchan, + pcibr_rrb_alloc_more(pcibr_soft, pciio_slot, vchan, min_rrbs - have_rrbs); } } @@ -3322,7 +2207,7 @@ "xio_port=0x%x, direct64: pci_addr=0x%lx, " "new flags: 0x%x\n", paddr, paddr + req_size - 1, xio_addr, pci_addr, (uint64_t) flags)); - return (pci_addr); + return pci_addr; } PCIBR_DEBUG((PCIBR_DEBUG_DMADIR, pconn_vhdl, @@ -3375,7 +2260,7 @@ " xio_port=0x%x, direct32: pci_addr=0x%lx\n", paddr, paddr + req_size - 1, xio_addr, pci_addr)); - return (pci_addr); + return pci_addr; } if (!pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D32_BITS)) { @@ -3394,7 +2279,7 @@ else min_rrbs = 1; if (have_rrbs < min_rrbs) - do_pcibr_rrb_autoalloc(pcibr_soft, pciio_slot, + pcibr_rrb_alloc_more(pcibr_soft, pciio_slot, vchan, min_rrbs - have_rrbs); } } @@ -3404,7 +2289,7 @@ "new flags: 0x%x\n", paddr, paddr + req_size - 1, xio_addr, pci_addr, (uint64_t) flags)); - return (pci_addr); + return pci_addr; } /* our flags conflict with Device(x). */ @@ -3441,17 +2326,6 @@ xtalk_dmaaddr_drain(xconn_vhdl, paddr, bytes); } -void -pcibr_dmalist_drain(vertex_hdl_t pconn_vhdl, - alenlist_t list) -{ - pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); - pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - vertex_hdl_t xconn_vhdl = pcibr_soft->bs_conn; - - xtalk_dmalist_drain(xconn_vhdl, list); -} - /* * Get the starting PCIbus address out of the given DMA map. * This function is supposed to be used by a close friend of PCI bridge @@ -3461,7 +2335,7 @@ iopaddr_t pcibr_dmamap_pciaddr_get(pcibr_dmamap_t pcibr_dmamap) { - return (pcibr_dmamap->bd_pci_addr); + return pcibr_dmamap->bd_pci_addr; } /* ===================================================================== @@ -3494,8 +2368,8 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridgereg_t devreg; - unsigned long s; + uint64_t devreg; + unsigned long s; /* * Bridge supports hardware swapping; so we can always @@ -3514,102 +2388,17 @@ * have to change the logic here. */ if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) { - bridge_t *bridge = pcibr_soft->bs_base; - - bridge->b_device[pciio_slot].reg = devreg; - pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - } - pcibr_unlock(pcibr_soft, s); - - printk("pcibr_endian_set: Device(%d): %x\n", pciio_slot, devreg); - return desired_end; -} - -/* This (re)sets the GBR and REALTIME bits and also keeps track of how - * many sets are outstanding. Reset succeeds only if the number of outstanding - * sets == 1. - */ -int -pcibr_priority_bits_set(pcibr_soft_t pcibr_soft, - pciio_slot_t pciio_slot, - pciio_priority_t device_prio) -{ - unsigned long s; - int *counter; - bridgereg_t rtbits = 0; - bridgereg_t devreg; - int rc = PRIO_SUCCESS; - - /* in dual-slot configurations, the host and the - * guest have separate DMA resources, so they - * have separate requirements for priority bits. - */ - - counter = &(pcibr_soft->bs_slot[pciio_slot].bss_pri_uctr); - - /* - * Bridge supports PCI notions of LOW and HIGH priority - * arbitration rings via a "REAL_TIME" bit in the per-device - * Bridge register. The "GBR" bit controls access to the GBR - * ring on the xbow. These two bits are (re)set together. - * - * XXX- Bug in Rev B Bridge Si: - * Symptom: Prefetcher starts operating incorrectly. This happens - * due to corruption of the address storage ram in the prefetcher - * when a non-real time PCI request is pulled and a real-time one is - * put in it's place. Workaround: Use only a single arbitration ring - * on PCI bus. GBR and RR can still be uniquely used per - * device. NETLIST MERGE DONE, WILL BE FIXED IN REV C. - */ - - if (pcibr_soft->bs_rev_num != BRIDGE_PART_REV_B) - rtbits |= BRIDGE_DEV_RT; - - /* NOTE- if we ever put DEV_RT or DEV_GBR on - * the disabled list, we will have to take - * it into account here. - */ - - s = pcibr_lock(pcibr_soft); - devreg = pcibr_soft->bs_slot[pciio_slot].bss_device; - if (device_prio == PCI_PRIO_HIGH) { - if ((++*counter == 1)) { - if (rtbits) - devreg |= rtbits; - else - rc = PRIO_FAIL; - } - } else if (device_prio == PCI_PRIO_LOW) { - if (*counter <= 0) - rc = PRIO_FAIL; - else if (--*counter == 0) - if (rtbits) - devreg &= ~rtbits; - } - if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) { - bridge_t *bridge = pcibr_soft->bs_base; - - bridge->b_device[pciio_slot].reg = devreg; + pcireg_device_set(pcibr_soft, pciio_slot, devreg); pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + pcireg_tflush_get(pcibr_soft); } pcibr_unlock(pcibr_soft, s); - return rc; -} - -pciio_priority_t -pcibr_priority_set(vertex_hdl_t pconn_vhdl, - pciio_priority_t device_prio) -{ - pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); - pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); - pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - - (void) pcibr_priority_bits_set(pcibr_soft, pciio_slot, device_prio); + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_DEVREG, pconn_vhdl, + "pcibr_endian_set: Device(%d): 0x%x\n", + pciio_slot, devreg)); - return device_prio; + return desired_end; } /* @@ -3630,8 +2419,8 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridgereg_t set = 0; - bridgereg_t clr = 0; + uint64_t set = 0; + uint64_t clr = 0; ASSERT((flags & PCIBR_DEVICE_FLAGS) == flags); @@ -3640,11 +2429,6 @@ if (flags & PCIBR_NOWRITE_GATHER) clr |= BRIDGE_DEV_PMU_WRGA_EN; - if (flags & PCIBR_WRITE_GATHER) - set |= BRIDGE_DEV_DIR_WRGA_EN; - if (flags & PCIBR_NOWRITE_GATHER) - clr |= BRIDGE_DEV_DIR_WRGA_EN; - if (flags & PCIBR_PREFETCH) set |= BRIDGE_DEV_PREF; if (flags & PCIBR_NOPREFETCH) @@ -3665,19 +2449,22 @@ if (flags & PCIBR_NO64BIT) clr |= BRIDGE_DEV_DEV_SIZE; + /* PIC BRINGUP WAR (PV# 878674): Don't allow 64bit PIO accesses */ + if ((flags & PCIBR_64BIT) && PCIBR_WAR_ENABLED(PV878674, pcibr_soft)) { + set &= ~BRIDGE_DEV_DEV_SIZE; + } + if (set || clr) { - bridgereg_t devreg; - unsigned long s; + uint64_t devreg; + unsigned long s; s = pcibr_lock(pcibr_soft); devreg = pcibr_soft->bs_slot[pciio_slot].bss_device; devreg = (devreg & ~clr) | set; if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) { - bridge_t *bridge = pcibr_soft->bs_base; - - bridge->b_device[pciio_slot].reg = devreg; + pcireg_device_set(pcibr_soft, pciio_slot, devreg); pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + pcireg_tflush_get(pcibr_soft); } pcibr_unlock(pcibr_soft, s); @@ -3685,7 +2472,7 @@ "pcibr_device_flags_set: Device(%d): 0x%x\n", pciio_slot, devreg)); } - return (1); + return 1; } /* @@ -3711,7 +2498,7 @@ printk(KERN_WARNING "%lx: Must oversubscribe Read Buffer Attribute Registers" "(RBAR). Bus has %d RBARs but %d funcs need them.\n", - (unsigned long)pcibr_soft->bs_vhdl, NUM_RBAR, pcibr_soft->bs_pcix_num_funcs); + pcibr_soft->bs_name, NUM_RBAR, pcibr_soft->bs_pcix_num_funcs); percent_allowed = 0; } else { percent_allowed = (((NUM_RBAR-pcibr_soft->bs_pcix_num_funcs)*100) / @@ -3728,51 +2515,12 @@ percent_allowed=(percent_allowed > 100) ? 100 : percent_allowed+1; } } else { - return(ENODEV); + return -ENODEV; } - return(percent_allowed); + return percent_allowed; } -pciio_provider_t pcibr_provider = -{ - (pciio_piomap_alloc_f *) pcibr_piomap_alloc, - (pciio_piomap_free_f *) pcibr_piomap_free, - (pciio_piomap_addr_f *) pcibr_piomap_addr, - (pciio_piomap_done_f *) pcibr_piomap_done, - (pciio_piotrans_addr_f *) pcibr_piotrans_addr, - (pciio_piospace_alloc_f *) pcibr_piospace_alloc, - (pciio_piospace_free_f *) pcibr_piospace_free, - - (pciio_dmamap_alloc_f *) pcibr_dmamap_alloc, - (pciio_dmamap_free_f *) pcibr_dmamap_free, - (pciio_dmamap_addr_f *) pcibr_dmamap_addr, - (pciio_dmamap_done_f *) pcibr_dmamap_done, - (pciio_dmatrans_addr_f *) pcibr_dmatrans_addr, - (pciio_dmamap_drain_f *) pcibr_dmamap_drain, - (pciio_dmaaddr_drain_f *) pcibr_dmaaddr_drain, - (pciio_dmalist_drain_f *) pcibr_dmalist_drain, - - (pciio_intr_alloc_f *) pcibr_intr_alloc, - (pciio_intr_free_f *) pcibr_intr_free, - (pciio_intr_connect_f *) pcibr_intr_connect, - (pciio_intr_disconnect_f *) pcibr_intr_disconnect, - (pciio_intr_cpu_get_f *) pcibr_intr_cpu_get, - - (pciio_provider_startup_f *) pcibr_provider_startup, - (pciio_provider_shutdown_f *) pcibr_provider_shutdown, - (pciio_reset_f *) pcibr_reset, - (pciio_write_gather_flush_f *) pcibr_write_gather_flush, - (pciio_endian_set_f *) pcibr_endian_set, - (pciio_priority_set_f *) pcibr_priority_set, - (pciio_config_get_f *) pcibr_config_get, - (pciio_config_set_f *) pcibr_config_set, - (pciio_error_extract_f *) 0, - (pciio_driver_reg_callback_f *) 0, - (pciio_driver_unreg_callback_f *) 0, - (pciio_device_unregister_f *) pcibr_device_unregister, -}; - /* * pcibr_debug() is used to print pcibr debug messages to the console. A * user enables tracing by setting the following global variables: @@ -3794,6 +2542,7 @@ { char hwpath[MAXDEVNAME] = "\0"; char copy_of_hwpath[MAXDEVNAME]; + char *buffer; char *module = "all"; short widget = -1; short slot = -1; @@ -3836,38 +2585,59 @@ (!strcmp(module, pcibr_debug_module) && (widget == pcibr_debug_widget) && (slot == pcibr_debug_slot))) { -#ifdef LATER - printk("PCIBR_DEBUG<%d>\t: %s :", cpuid(), hwpath); -#else - printk("PCIBR_DEBUG\t: %s :", hwpath); -#endif - /* - * Kernel printk translates to this 3 line sequence. - * Since we have a variable length argument list, we - * need to call printk this way rather than directly - */ - { - char buffer[500]; + buffer = kmalloc(1024, GFP_KERNEL); + if (buffer) { + printk("PCIBR_DEBUG<%d>\t: %s :", smp_processor_id(), hwpath); + /* + * KERN_MSG translates to this 3 line sequence. Since + * we have a variable length argument list, we need to + * call KERN_MSG this way rather than directly + */ va_start(ap, format); - vsnprintf(buffer, 500, format, ap); + memset(buffer, 0, 1024); + vsnprintf(buffer, 1024, format, ap); va_end(ap); - buffer[499] = (char)0; /* just to be safe */ - printk("%s", buffer); + printk("", "%s", buffer); + kfree(buffer); } } } } +/* + * given a xconn_vhdl and a bus number under that widget, return a + * bridge_t pointer. + */ +void * +pcibr_bridge_ptr_get(vertex_hdl_t widget_vhdl, int bus_num) +{ + void *bridge; + + bridge = (void *)xtalk_piotrans_addr(widget_vhdl, 0, 0, + sizeof(bridge), 0); + + /* PIC ASIC has two bridges (ie. two buses) under a single widget */ + if (bus_num == 1) { + bridge = (void *)((char *)bridge + PIC_BUS1_OFFSET); + } + return bridge; +} + + int -isIO9(nasid_t nasid) { +isIO9(nasid_t nasid) +{ lboard_t *brd = (lboard_t *)KL_CONFIG_INFO(nasid); while (brd) { if (brd->brd_flags & LOCAL_MASTER_IO6) { return 1; } - brd = KLCF_NEXT(brd); + if (numionodes == numnodes) + brd = KLCF_NEXT_ANY(brd); + else + brd = KLCF_NEXT(brd); } /* if it's dual ported, check the peer also */ nasid = NODEPDA(NASID_TO_COMPACT_NODEID(nasid))->xbow_peer; @@ -3877,7 +2647,11 @@ if (brd->brd_flags & LOCAL_MASTER_IO6) { return 1; } - brd = KLCF_NEXT(brd); + if (numionodes == numnodes) + brd = KLCF_NEXT_ANY(brd); + else + brd = KLCF_NEXT(brd); + } return 0; } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c Tue Feb 17 20:00:05 2004 @@ -45,7 +45,7 @@ BRIDGE_ISR_PCIBUS_PIOERR; #endif -int pcibr_llp_control_war_cnt; /* PCIBR_LLP_CONTROL_WAR */ +int pcibr_pioerr_dump = 1; /* always dump pio errors */ /* * register values @@ -107,29 +107,22 @@ #define F(s,n) { 1l<<(s),-(s), n } -static struct reg_values space_v[] = -{ - {PCIIO_SPACE_NONE, "none"}, - {PCIIO_SPACE_ROM, "ROM"}, - {PCIIO_SPACE_IO, "I/O"}, - {PCIIO_SPACE_MEM, "MEM"}, - {PCIIO_SPACE_MEM32, "MEM(32)"}, - {PCIIO_SPACE_MEM64, "MEM(64)"}, - {PCIIO_SPACE_CFG, "CFG"}, - {PCIIO_SPACE_WIN(0), "WIN(0)"}, - {PCIIO_SPACE_WIN(1), "WIN(1)"}, - {PCIIO_SPACE_WIN(2), "WIN(2)"}, - {PCIIO_SPACE_WIN(3), "WIN(3)"}, - {PCIIO_SPACE_WIN(4), "WIN(4)"}, - {PCIIO_SPACE_WIN(5), "WIN(5)"}, - {PCIIO_SPACE_BAD, "BAD"}, - {0} -}; -struct reg_desc space_desc[] = -{ - {0xFF, 0, "space", 0, space_v}, - {0} -}; +char *pci_space[] = {"NONE", + "ROM", + "IO", + "", + "MEM", + "MEM32", + "MEM64", + "CFG", + "WIN0", + "WIN1", + "WIN2", + "WIN3", + "WIN4", + "WIN5", + "", + "BAD"}; static char *pcibr_isr_errs[] = { @@ -261,7 +254,7 @@ static void pcibr_show_dir_state(paddr_t paddr, char *prefix) { -#ifdef LATER +#ifdef PCIBR_LATER int state; uint64_t vec_ptr; hubreg_t elo; @@ -270,15 +263,18 @@ get_dir_ent(paddr, &state, &vec_ptr, &elo); - printk("%saddr 0x%lx: state 0x%x owner 0x%lx (%s)\n", - prefix, paddr, state, vec_ptr, dir_state_str[state]); -#endif + printf("%saddr 0x%lx: state 0x%x owner 0x%lx (%s)\n", + prefix, (uint64_t)paddr, state, (uint64_t)vec_ptr, + dir_state_str[state]); +#endif /* PCIBR_LATER */ } -static void -print_bridge_errcmd(uint32_t cmdword, char *errtype) + +void +print_bridge_errcmd(pcibr_soft_t pcibr_soft, uint32_t cmdword, char *errtype) { - printk("\t Bridge %s Error Command Word Register ", errtype); + printk( + "\t Bridge %sError Command Word Register ", errtype); print_register(cmdword, xtalk_cmd_bits); } @@ -290,20 +286,12 @@ void pcibr_error_dump(pcibr_soft_t pcibr_soft) { - bridge_t *bridge = pcibr_soft->bs_base; uint64_t int_status; - picreg_t int_status_64; uint64_t mult_int; - picreg_t mult_int_64; uint64_t bit; - int number_bits; int i; - char *reg_desc; - paddr_t addr = (paddr_t)0; - int_status_64 = (bridge->p_int_status_64 & ~BRIDGE_ISR_INT_MSK); - int_status = (uint64_t)int_status_64; - number_bits = PCIBR_ISR_MAX_ERRS_PIC; + int_status = (pcireg_intr_status_get(pcibr_soft) & ~BRIDGE_ISR_INT_MSK); if (!int_status) { /* No error bits set */ @@ -320,21 +308,11 @@ int_status, pcibr_soft->bs_name, "PIC"); - for (i = PCIBR_ISR_ERR_START; i < number_bits; i++) { + for (i = PCIBR_ISR_ERR_START; i < 64; i++) { bit = 1ull << i; - /* - * A number of int_status bits are only defined for Bridge. - * Ignore them in the case of an XBridge or PIC. - */ - if (((bit == BRIDGE_ISR_MULTI_ERR) || - (bit == BRIDGE_ISR_SSRAM_PERR) || - (bit == BRIDGE_ISR_GIO_B_ENBL_ERR))) { - continue; - } - /* A number of int_status bits are only valid for PIC's bus0 */ - if (((pcibr_soft->bs_busnum != 0)) && + if ((pcibr_soft->bs_busnum != 0) && ((bit == BRIDGE_ISR_UNSUPPORTED_XOP) || (bit == BRIDGE_ISR_LLP_REC_SNERR) || (bit == BRIDGE_ISR_LLP_REC_CBERR) || @@ -351,14 +329,14 @@ case PIC_ISR_INT_RAM_PERR: /* bit41 INT_RAM_PERR */ /* XXX: should breakdown meaning of bits in reg */ - printk( "\t Internal RAM Parity Error: 0x%lx\n", - bridge->p_ate_parity_err_64); + printk("\t Internal RAM Parity Error: 0x%lx\n", + pcireg_parity_err_get(pcibr_soft)); break; case PIC_ISR_PCIX_ARB_ERR: /* bit40 PCI_X_ARB_ERR */ /* XXX: should breakdown meaning of bits in reg */ - printk( "\t Arbitration Reg: 0x%lx\n", - bridge->b_arb); + printk("\t Arbitration Reg: 0x%lx\n", + pcireg_arbitration_get(pcibr_soft)); break; case PIC_ISR_PCIX_REQ_TOUT: /* bit39 PCI_X_REQ_TOUT */ @@ -366,8 +344,8 @@ printk( "\t PCI-X DMA Request Error Address Reg: 0x%lx\n" "\t PCI-X DMA Request Error Attribute Reg: 0x%lx\n", - bridge->p_pcix_dma_req_err_addr_64, - bridge->p_pcix_dma_req_err_attr_64); + pcireg_pcix_req_err_addr_get(pcibr_soft), + pcireg_pcix_req_err_attr_get(pcibr_soft)); break; case PIC_ISR_PCIX_SPLIT_MSG_PE: /* bit45 PCI_X_SPLIT_MES_PE */ @@ -377,8 +355,8 @@ printk( "\t PCI-X Split Request Address Reg: 0x%lx\n" "\t PCI-X Split Request Attribute Reg: 0x%lx\n", - bridge->p_pcix_pio_split_addr_64, - bridge->p_pcix_pio_split_attr_64); + pcireg_pcix_pio_split_addr_get(pcibr_soft), + pcireg_pcix_pio_split_attr_get(pcibr_soft)); /* FALL THRU */ case PIC_ISR_PCIX_UNEX_COMP: /* bit42 PCI_X_UNEX_COMP */ @@ -394,20 +372,19 @@ "\t PCI-X Bus Error Address Reg: 0x%lx\n" "\t PCI-X Bus Error Attribute Reg: 0x%lx\n" "\t PCI-X Bus Error Data Reg: 0x%lx\n", - bridge->p_pcix_bus_err_addr_64, - bridge->p_pcix_bus_err_attr_64, - bridge->p_pcix_bus_err_data_64); + pcireg_pcix_bus_err_addr_get(pcibr_soft), + pcireg_pcix_bus_err_attr_get(pcibr_soft), + pcireg_pcix_bus_err_data_get(pcibr_soft)); break; - case BRIDGE_ISR_PAGE_FAULT: /* bit30 PMU_PAGE_FAULT */ - reg_desc = "Map Fault Address"; - - printk( "\t %s Register: 0x%x\n", reg_desc, - bridge->b_ram_perr_or_map_fault); + case BRIDGE_ISR_PAGE_FAULT: /* bit30 PMU_PAGE_FAULT */ + printk("\t Map Fault Address Reg: 0x%lx\n", + pcireg_map_fault_get(pcibr_soft)); break; - case BRIDGE_ISR_UNEXP_RESP: /* bit29 UNEXPECTED_RESP */ - print_bridge_errcmd(bridge->b_wid_aux_err, "Aux "); + case BRIDGE_ISR_UNEXP_RESP: /* bit29 UNEXPECTED_RESP */ + print_bridge_errcmd(pcibr_soft, + pcireg_linkside_err_get(pcibr_soft), "Aux "); /* PIC in PCI-X mode, dump the PCIX DMA Request registers */ if (IS_PCIX(pcibr_soft)) { @@ -415,96 +392,98 @@ printk( "\t PCI-X DMA Request Error Addr Reg: 0x%lx\n" "\t PCI-X DMA Request Error Attr Reg: 0x%lx\n", - bridge->p_pcix_dma_req_err_addr_64, - bridge->p_pcix_dma_req_err_attr_64); + pcireg_pcix_req_err_addr_get(pcibr_soft), + pcireg_pcix_req_err_attr_get(pcibr_soft)); } break; - case BRIDGE_ISR_BAD_XRESP_PKT: /* bit28 BAD_RESP_PACKET */ - case BRIDGE_ISR_RESP_XTLK_ERR: /* bit26 RESP_XTALK_ERROR */ - print_bridge_errcmd(bridge->b_wid_aux_err, "Aux "); + case BRIDGE_ISR_BAD_XRESP_PKT: /* bit28 BAD_RESP_PACKET */ + case BRIDGE_ISR_RESP_XTLK_ERR: /* bit26 RESP_XTALK_ERROR */ + print_bridge_errcmd(pcibr_soft, + pcireg_linkside_err_get(pcibr_soft), "Aux "); - /* XXX: should breakdown meaning of attribute bit */ - printk( + /* PCI-X mode, DMA Request Error registers are valid. But + * in PCI mode, Response Buffer Address register are valid. + */ + if (IS_PCIX(pcibr_soft)) { + /* XXX: should breakdown meaning of attribute bit */ + printk( "\t PCI-X DMA Request Error Addr Reg: 0x%lx\n" "\t PCI-X DMA Request Error Attribute Reg: 0x%lx\n", - bridge->p_pcix_dma_req_err_addr_64, - bridge->p_pcix_dma_req_err_attr_64); - if (bit == BRIDGE_ISR_RESP_XTLK_ERR) { + pcireg_pcix_req_err_addr_get(pcibr_soft), + pcireg_pcix_req_err_attr_get(pcibr_soft)); + } else { + printk( + "\t Bridge Response Buf Error Addr Reg: 0x%lx\n" + "\t dev-num %d buff-num %d addr 0x%lx\n", + pcireg_resp_err_get(pcibr_soft), + (int)pcireg_resp_err_dev_get(pcibr_soft), + (int)pcireg_resp_err_buf_get(pcibr_soft), + pcireg_resp_err_addr_get(pcibr_soft)); + if (bit == BRIDGE_ISR_RESP_XTLK_ERR) { /* display memory directory associated with cacheline */ - pcibr_show_dir_state(addr, "\t "); + pcibr_show_dir_state( + pcireg_resp_err_get(pcibr_soft), "\t "); + } } break; - case BRIDGE_ISR_BAD_XREQ_PKT: /* bit27 BAD_XREQ_PACKET */ - case BRIDGE_ISR_REQ_XTLK_ERR: /* bit25 REQ_XTALK_ERROR */ - case BRIDGE_ISR_INVLD_ADDR: /* bit24 INVALID_ADDRESS */ - print_bridge_errcmd(bridge->b_wid_err_cmdword, ""); - printk( - "\t Bridge Error Upper Address Register: 0x%lx\n" - "\t Bridge Error Lower Address Register: 0x%lx\n" + case BRIDGE_ISR_BAD_XREQ_PKT: /* bit27 BAD_XREQ_PACKET */ + case BRIDGE_ISR_REQ_XTLK_ERR: /* bit25 REQ_XTALK_ERROR */ + case BRIDGE_ISR_INVLD_ADDR: /* bit24 INVALID_ADDRESS */ + print_bridge_errcmd(pcibr_soft, + pcireg_cmdword_err_get(pcibr_soft), ""); + printk( + "\t Bridge Error Address Register: 0x%lx\n" "\t Bridge Error Address: 0x%lx\n", - (uint64_t) bridge->b_wid_err_upper, - (uint64_t) bridge->b_wid_err_lower, - (((uint64_t) bridge->b_wid_err_upper << 32) | - bridge->b_wid_err_lower)); + pcireg_bus_err_get(pcibr_soft), + pcireg_bus_err_get(pcibr_soft)); break; - case BRIDGE_ISR_UNSUPPORTED_XOP:/* bit23 UNSUPPORTED_XOP */ - print_bridge_errcmd(bridge->b_wid_aux_err, "Aux "); - printk( - "\t Address Holding Link Side Error Reg: 0x%lx\n", - bridge->p_addr_lkerr_64); + case BRIDGE_ISR_UNSUPPORTED_XOP: /* bit23 UNSUPPORTED_XOP */ + print_bridge_errcmd(pcibr_soft, + pcireg_linkside_err_get(pcibr_soft), "Aux "); + printk("\t Address Holding Link Side Error Reg: 0x%lx\n", + pcireg_linkside_err_addr_get(pcibr_soft)); break; - case BRIDGE_ISR_XREQ_FIFO_OFLOW:/* bit22 XREQ_FIFO_OFLOW */ - print_bridge_errcmd(bridge->b_wid_aux_err, "Aux "); - printk( - "\t Address Holding Link Side Error Reg: 0x%lx\n", - bridge->p_addr_lkerr_64); + case BRIDGE_ISR_XREQ_FIFO_OFLOW: /* bit22 XREQ_FIFO_OFLOW */ + print_bridge_errcmd(pcibr_soft, + pcireg_linkside_err_get(pcibr_soft), "Aux "); + printk("\t Address Holding Link Side Error Reg: 0x%lx\n", + pcireg_linkside_err_addr_get(pcibr_soft)); break; - case BRIDGE_ISR_PCI_ABORT: /* bit15 PCI_ABORT */ - case BRIDGE_ISR_PCI_PARITY: /* bit14 PCI_PARITY */ - case BRIDGE_ISR_PCI_SERR: /* bit13 PCI_SERR */ - case BRIDGE_ISR_PCI_PERR: /* bit12 PCI_PERR */ - case BRIDGE_ISR_PCI_MST_TIMEOUT:/* bit11 PCI_MASTER_TOUT */ - case BRIDGE_ISR_PCI_RETRY_CNT: /* bit10 PCI_RETRY_CNT */ - case BRIDGE_ISR_GIO_B_ENBL_ERR: /* bit08 GIO BENABLE_ERR */ - printk( - "\t PCI Error Upper Address Register: 0x%lx\n" - "\t PCI Error Lower Address Register: 0x%lx\n" + case BRIDGE_ISR_PCI_ABORT: /* bit15 PCI_ABORT */ + case BRIDGE_ISR_PCI_PARITY: /* bit14 PCI_PARITY */ + case BRIDGE_ISR_PCI_SERR: /* bit13 PCI_SERR */ + case BRIDGE_ISR_PCI_PERR: /* bit12 PCI_PERR */ + case BRIDGE_ISR_PCI_MST_TIMEOUT: /* bit11 PCI_MASTER_TOUT */ + case BRIDGE_ISR_PCI_RETRY_CNT: /* bit10 PCI_RETRY_CNT */ + printk("\t PCI Error Address Register: 0x%lx\n" "\t PCI Error Address: 0x%lx\n", - (uint64_t) bridge->b_pci_err_upper, - (uint64_t) bridge->b_pci_err_lower, - (((uint64_t) bridge->b_pci_err_upper << 32) | - bridge->b_pci_err_lower)); + pcireg_pci_bus_addr_get(pcibr_soft), + pcireg_pci_bus_addr_addr_get(pcibr_soft)); break; - case BRIDGE_ISR_XREAD_REQ_TIMEOUT: /* bit09 XREAD_REQ_TOUT */ - addr = (((uint64_t)(bridge->b_wid_resp_upper & 0xFFFF) << 32) - | bridge->b_wid_resp_lower); - printk( - "\t Bridge Response Buf Error Upper Addr Reg: 0x%x\n" - "\t Bridge Response Buf Error Lower Addr Reg: 0x%x\n" + case BRIDGE_ISR_XREAD_REQ_TIMEOUT: /* bit09 XREAD_REQ_TOUT */ + printk("\t Bridge Response Buf Error Addr Reg: 0x%lx\n" "\t dev-num %d buff-num %d addr 0x%lx\n", - bridge->b_wid_resp_upper, bridge->b_wid_resp_lower, - ((bridge->b_wid_resp_upper >> 20) & 0x3), - ((bridge->b_wid_resp_upper >> 16) & 0xF), - addr); + pcireg_resp_err_get(pcibr_soft), + (int)pcireg_resp_err_dev_get(pcibr_soft), + (int)pcireg_resp_err_buf_get(pcibr_soft), + pcireg_resp_err_get(pcibr_soft)); break; } } } - mult_int_64 = (bridge->p_mult_int_64 & ~BRIDGE_ISR_INT_MSK); - mult_int = (uint64_t)mult_int_64; - number_bits = PCIBR_ISR_MAX_ERRS_PIC; + mult_int = pcireg_intr_multiple_get(pcibr_soft); if (mult_int & ~BRIDGE_ISR_INT_MSK) { - printk( " %s Multiple Interrupt Register is 0x%lx\n", - "PIC", mult_int); - for (i = PCIBR_ISR_ERR_START; i < number_bits; i++) { + printk(" %s Multiple Interrupt Register is 0x%lx\n", + pcibr_soft->bs_asic_name, mult_int); + for (i = PCIBR_ISR_ERR_START; i < 64; i++) { if (mult_int & (1ull << i)) printk( "\t%s\n", pcibr_isr_errs[i]); } @@ -519,11 +498,7 @@ static void pcibr_pioerr_check(pcibr_soft_t soft) { - bridge_t *bridge; - uint64_t int_status; - picreg_t int_status_64; - bridgereg_t pci_err_lower; - bridgereg_t pci_err_upper; + uint64_t int_status; iopaddr_t pci_addr; pciio_slot_t slot; pcibr_piomap_t map; @@ -532,16 +507,10 @@ unsigned win; int func; - bridge = soft->bs_base; - int_status_64 = (bridge->p_int_status_64 & ~BRIDGE_ISR_INT_MSK); - int_status = (uint64_t)int_status_64; + int_status = pcireg_intr_status_get(soft); if (int_status & BRIDGE_ISR_PCIBUS_PIOERR) { - pci_err_lower = bridge->b_pci_err_lower; - pci_err_upper = bridge->b_pci_err_upper; - - pci_addr = pci_err_upper & BRIDGE_ERRUPPR_ADDRMASK; - pci_addr = (pci_addr << 32) | pci_err_lower; + pci_addr = pcireg_pci_bus_addr_get(soft); slot = PCIBR_NUM_SLOTS(soft); while (slot-- > 0) { @@ -564,7 +533,7 @@ else if (map->bp_space == PCIIO_SPACE_ROM) base += pcibr_info->f_rbase; if ((pci_addr >= base) && (pci_addr < (base + size))) - atomic_inc(&map->bp_toc[0]); + atomic_inc(&map->bp_toc); } } } @@ -595,11 +564,9 @@ pcibr_error_intr_handler(int irq, void *arg, struct pt_regs *ep) { pcibr_soft_t pcibr_soft; - bridge_t *bridge; - uint64_t int_status; - uint64_t err_status; - picreg_t int_status_64; - int number_bits; + void *bridge; + uint64_t int_status; + uint64_t err_status; int i; uint64_t disable_errintr_mask = 0; nasid_t nasid; @@ -662,9 +629,7 @@ return(pcibr_error_intr_handler(irq, arg, ep)); } - int_status_64 = (bridge->p_int_status_64 & ~BRIDGE_ISR_INT_MSK); - int_status = (uint64_t)int_status_64; - number_bits = PCIBR_ISR_MAX_ERRS_PIC; + int_status = pcireg_intr_status_get(pcibr_soft); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ERROR, pcibr_soft->bs_conn, "pcibr_error_intr_handler: int_status=0x%lx\n", int_status)); @@ -672,7 +637,7 @@ /* int_status is which bits we have to clear; * err_status is the bits we haven't handled yet. */ - err_status = int_status & ~BRIDGE_ISR_MULTI_ERR; + err_status = int_status; if (!(int_status & ~BRIDGE_ISR_INT_MSK)) { /* @@ -688,9 +653,10 @@ } if (err_status) { - struct bs_errintr_stat_s *bs_estat = pcibr_soft->bs_errintr_stat; + struct bs_errintr_stat_s *bs_estat ; + bs_estat = &pcibr_soft->bs_errintr_stat[PCIBR_ISR_ERR_START]; - for (i = PCIBR_ISR_ERR_START; i < number_bits; i++, bs_estat++) { + for (i = PCIBR_ISR_ERR_START; i < 64; i++, bs_estat++) { if (err_status & (1ull << i)) { uint32_t errrate = 0; uint32_t errcount = 0; @@ -827,7 +793,7 @@ * could eat up too much cpu time. */ s = pcibr_lock(pcibr_soft); - bridge->p_int_enable_64 &= (picreg_t)(~disable_errintr_mask); + pcireg_intr_enable_bit_clr(pcibr_soft, disable_errintr_mask); pcibr_unlock(pcibr_soft, s); } /* @@ -836,31 +802,22 @@ * which will cause a BRIDGE_ISR_INVLD_ADDR. */ if ((err_status & BRIDGE_ISR_INVLD_ADDR) && - (0x00000000 == bridge->b_wid_err_upper) && - (0x00C00000 == (0xFFC00000 & bridge->b_wid_err_lower)) && - (0x00402000 == (0x00F07F00 & bridge->b_wid_err_cmdword))) { + (0x00C00000 == (pcireg_bus_err_get(pcibr_soft) & 0xFFFFFFFFFFC00000)) && + (0x00402000 == (0x00F07F00 & pcireg_cmdword_err_get(pcibr_soft)))) { err_status &= ~BRIDGE_ISR_INVLD_ADDR; } /* - * The bridge bug (PCIBR_LLP_CONTROL_WAR), where the llp_config or control registers - * need to be read back after being written, affects an MP - * system since there could be small windows between writing - * the register and reading it back on one cpu while another - * cpu is fielding an interrupt. If we run into this scenario, - * workaround the problem by ignoring the error. (bug 454474) - * pcibr_llp_control_war_cnt keeps an approximate number of - * times we saw this problem on a system. - */ - - if ((err_status & BRIDGE_ISR_INVLD_ADDR) && - ((((uint64_t) bridge->b_wid_err_upper << 32) | (bridge->b_wid_err_lower)) - == (BRIDGE_INT_RST_STAT & 0xff0))) { - pcibr_llp_control_war_cnt++; - err_status &= ~BRIDGE_ISR_INVLD_ADDR; + * pcibr_pioerr_dump is a systune that make be used to not + * print bridge registers for interrupts generated by pio-errors. + * Some customers do early probes and expect a lot of failed + * pios. + */ + if (!pcibr_pioerr_dump) { + bridge_errors_to_dump &= ~BRIDGE_ISR_PCIBUS_PIOERR; + } else { + bridge_errors_to_dump |= BRIDGE_ISR_PCIBUS_PIOERR; } - bridge_errors_to_dump |= BRIDGE_ISR_PCIBUS_PIOERR; - /* Dump/Log Bridge error interrupt info */ if (err_status & bridge_errors_to_dump) { printk("BRIDGE ERR_STATUS 0x%lx\n", err_status); @@ -873,10 +830,11 @@ * has only been seen in simulation */ if (PCIBR_WAR_ENABLED(PV867308, pcibr_soft) && - (err_status & (BRIDGE_ISR_LLP_REC_SNERR | BRIDGE_ISR_LLP_REC_CBERR))) { - printk("BRIDGE ERR_STATUS 0x%lx\n", err_status); - pcibr_error_dump(pcibr_soft); - panic("PCI Bridge Error interrupt killed the system"); + (err_status & (BRIDGE_ISR_LLP_REC_SNERR | BRIDGE_ISR_LLP_REC_CBERR))) { + printk("BRIDGE ERR_STATUS 0x%lx\n", err_status); + pcibr_error_dump(pcibr_soft); + /* machine_error_dump(""); */ + panic("PCI Bridge Error interrupt killed the system"); } if (err_status & BRIDGE_ISR_ERROR_FATAL) { @@ -893,7 +851,7 @@ * * PIC doesn't require groups of interrupts to be cleared... */ - bridge->p_int_rst_stat_64 = (picreg_t)(int_status | BRIDGE_IRR_MULTI_CLR); + pcireg_intr_reset_set(pcibr_soft, (int_status | BRIDGE_IRR_MULTI_CLR)); /* PIC BRINGUP WAR (PV# 856155): * On a PCI_X_ARB_ERR error interrupt clear the DEV_BROKE bits from @@ -901,7 +859,7 @@ */ if ((err_status & PIC_ISR_PCIX_ARB_ERR) && PCIBR_WAR_ENABLED(PV856155, pcibr_soft)) { - bridge->b_arb |= (0xf << 20); + pcireg_arbitration_bit_set(pcibr_soft, (0xf << 20)); } /* Zero out bserr_intstat field */ @@ -909,18 +867,196 @@ return IRQ_HANDLED; } +/* + * pcibr_addr_toslot + * Given the 'pciaddr' find out which slot this address is + * allocated to, and return the slot number. + * While we have the info handy, construct the + * function number, space code and offset as well. + * + * NOTE: if this routine is called, we don't know whether + * the address is in CFG, MEM, or I/O space. We have to guess. + * This will be the case on PIO stores, where the only way + * we have of getting the address is to check the Bridge, which + * stores the PCI address but not the space and not the xtalk + * address (from which we could get it). + */ +static int +pcibr_addr_toslot(pcibr_soft_t pcibr_soft, + iopaddr_t pciaddr, + pciio_space_t *spacep, + iopaddr_t *offsetp, + pciio_function_t *funcp) +{ + int s, f = 0, w; + iopaddr_t base; + size_t size; + pciio_piospace_t piosp; + + /* + * Check if the address is in config space + */ + + if ((pciaddr >= BRIDGE_CONFIG_BASE) && (pciaddr < BRIDGE_CONFIG_END)) { + + if (pciaddr >= BRIDGE_CONFIG1_BASE) + pciaddr -= BRIDGE_CONFIG1_BASE; + else + pciaddr -= BRIDGE_CONFIG_BASE; + + s = pciaddr / BRIDGE_CONFIG_SLOT_SIZE; + pciaddr %= BRIDGE_CONFIG_SLOT_SIZE; + + if (funcp) { + f = pciaddr / 0x100; + pciaddr %= 0x100; + } + if (spacep) + *spacep = PCIIO_SPACE_CFG; + if (offsetp) + *offsetp = pciaddr; + if (funcp) + *funcp = f; + + return s; + } + for (s = pcibr_soft->bs_min_slot; s < PCIBR_NUM_SLOTS(pcibr_soft); ++s) { + int nf = pcibr_soft->bs_slot[s].bss_ninfo; + pcibr_info_h pcibr_infoh = pcibr_soft->bs_slot[s].bss_infos; + + for (f = 0; f < nf; f++) { + pcibr_info_t pcibr_info = pcibr_infoh[f]; + + if (!pcibr_info) + continue; + for (w = 0; w < 6; w++) { + if (pcibr_info->f_window[w].w_space + == PCIIO_SPACE_NONE) { + continue; + } + base = pcibr_info->f_window[w].w_base; + size = pcibr_info->f_window[w].w_size; + + if ((pciaddr >= base) && (pciaddr < (base + size))) { + if (spacep) + *spacep = PCIIO_SPACE_WIN(w); + if (offsetp) + *offsetp = pciaddr - base; + if (funcp) + *funcp = f; + return s; + } /* endif match */ + } /* next window */ + } /* next func */ + } /* next slot */ + + /* + * Check if the address was allocated as part of the + * pcibr_piospace_alloc calls. + */ + for (s = pcibr_soft->bs_min_slot; s < PCIBR_NUM_SLOTS(pcibr_soft); ++s) { + int nf = pcibr_soft->bs_slot[s].bss_ninfo; + pcibr_info_h pcibr_infoh = pcibr_soft->bs_slot[s].bss_infos; + + for (f = 0; f < nf; f++) { + pcibr_info_t pcibr_info = pcibr_infoh[f]; + + if (!pcibr_info) + continue; + piosp = pcibr_info->f_piospace; + while (piosp) { + if ((piosp->start <= pciaddr) && + ((piosp->count + piosp->start) > pciaddr)) { + if (spacep) + *spacep = piosp->space; + if (offsetp) + *offsetp = pciaddr - piosp->start; + return s; + } /* endif match */ + piosp = piosp->next; + } /* next piosp */ + } /* next func */ + } /* next slot */ + + /* + * Some other random address on the PCI bus ... + * we have no way of knowing whether this was + * a MEM or I/O access; so, for now, we just + * assume that the low 1G is MEM, the next + * 3G is I/O, and anything above the 4G limit + * is obviously MEM. + */ + + if (spacep) + *spacep = ((pciaddr < (1ul << 30)) ? PCIIO_SPACE_MEM : + (pciaddr < (4ul << 30)) ? PCIIO_SPACE_IO : + PCIIO_SPACE_MEM); + if (offsetp) + *offsetp = pciaddr; + + return PCIIO_SLOT_NONE; + +} + void pcibr_error_cleanup(pcibr_soft_t pcibr_soft, int error_code) { - bridge_t *bridge = pcibr_soft->bs_base; + uint64_t clr_bits = BRIDGE_IRR_ALL_CLR; ASSERT(error_code & IOECODE_PIO); error_code = error_code; - bridge->p_int_rst_stat_64 = BRIDGE_IRR_PCI_GRP_CLR | - PIC_PCIX_GRP_CLR | - BRIDGE_IRR_MULTI_CLR; - (void) bridge->b_wid_tflush; /* flushbus */ + pcireg_intr_reset_set(pcibr_soft, clr_bits); + + pcireg_tflush_get(pcibr_soft); /* flushbus */ +} + + +/* + * pcibr_error_extract + * Given the 'pcibr vertex handle' find out which slot + * the bridge status error address (from pcibr_soft info + * hanging off the vertex) + * allocated to, and return the slot number. + * While we have the info handy, construct the + * space code and offset as well. + * + * NOTE: if this routine is called, we don't know whether + * the address is in CFG, MEM, or I/O space. We have to guess. + * This will be the case on PIO stores, where the only way + * we have of getting the address is to check the Bridge, which + * stores the PCI address but not the space and not the xtalk + * address (from which we could get it). + * + * XXX- this interface has no way to return the function + * number on a multifunction card, even though that data + * is available. + */ + +pciio_slot_t +pcibr_error_extract(vertex_hdl_t pcibr_vhdl, + pciio_space_t *spacep, + iopaddr_t *offsetp) +{ + pcibr_soft_t pcibr_soft = 0; + iopaddr_t bserr_addr; + pciio_slot_t slot = PCIIO_SLOT_NONE; + arbitrary_info_t rev; + + /* Do a sanity check as to whether we really got a + * bridge vertex handle. + */ + if (hwgraph_info_get_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, &rev) != + GRAPH_SUCCESS) + return(slot); + + pcibr_soft = pcibr_soft_get(pcibr_vhdl); + if (pcibr_soft) { + bserr_addr = pcireg_pci_bus_addr_get(pcibr_soft); + slot = pcibr_addr_toslot(pcibr_soft, bserr_addr, + spacep, offsetp, NULL); + } + return slot; } /*ARGSUSED */ @@ -953,6 +1089,28 @@ * to handle the error, it expects the bus-interface to disable that * device, and takes any steps needed here to take away any resources * associated with this device. + * + * A note about slots: + * + * PIC-based bridges use zero-based device numbering when devices to + * internal registers. However, the physical slots are numbered using a + * one-based scheme because in PCI-X, device 0 is reserved (see comments + * in pcibr_private.h for a better description). + * + * When building up the hwgraph, we use the external (one-based) number + * scheme when numbering slot components so that hwgraph more accuratly + * reflects what is silkscreened on the bricks. + * + * Since pciio_error_handler() needs to ultimatly be able to do a hwgraph + * lookup, the ioerror that gets built up in pcibr_pioerror() encodes the + * external (one-based) slot number. However, loops in pcibr_pioerror() + * which attempt to translate the virtual address into the correct + * PCI physical address use the device (zero-based) numbering when + * walking through bridge structures. + * + * To that end, pcibr_pioerror() uses device to denote the + * zero-based device number, and external_slot to denote the corresponding + * one-based slot number. Loop counters (eg. cs) are always device based. */ /* BEM_ADD_IOE doesn't dump the whole ioerror, it just @@ -1017,7 +1175,8 @@ iopaddr_t raw_paddr; /* raw PCI address */ pciio_space_t space; /* final PCI space */ - pciio_slot_t slot; /* final PCI slot, if appropriate */ + pciio_slot_t device; /* final PCI device if appropriate */ + pciio_slot_t external_slot;/* external slot for device */ pciio_function_t func; /* final PCI func, if appropriate */ iopaddr_t offset; /* final PCI offset */ @@ -1039,16 +1198,16 @@ "pcibr_pioerror: pcibr_soft=0x%lx, bad_xaddr=0x%lx\n", pcibr_soft, bad_xaddr)); - slot = PCIIO_SLOT_NONE; + device = PCIIO_SLOT_NONE; func = PCIIO_FUNC_NONE; raw_space = PCIIO_SPACE_NONE; raw_paddr = 0; - if ((bad_xaddr >= PCIBR_BUS_TYPE0_CFG_DEV0(pcibr_soft)) && + if ((bad_xaddr >= PCIBR_BUS_TYPE0_CFG_DEV(pcibr_soft, 0)) && (bad_xaddr < PCIBR_TYPE1_CFG(pcibr_soft))) { - raw_paddr = bad_xaddr - PCIBR_BUS_TYPE0_CFG_DEV0(pcibr_soft); - slot = raw_paddr / BRIDGE_TYPE0_CFG_SLOT_OFF; - raw_paddr = raw_paddr % BRIDGE_TYPE0_CFG_SLOT_OFF; + raw_paddr = bad_xaddr - PCIBR_BUS_TYPE0_CFG_DEV(pcibr_soft, 0); + device = raw_paddr / BRIDGE_CONFIG_SLOT_SIZE; + raw_paddr = raw_paddr % BRIDGE_CONFIG_SLOT_SIZE; raw_space = PCIIO_SPACE_CFG; } if ((bad_xaddr >= PCIBR_TYPE1_CFG(pcibr_soft)) && @@ -1060,11 +1219,11 @@ raw_paddr = bad_xaddr - PCIBR_TYPE1_CFG(pcibr_soft); raw_space = PCIIO_SPACE_CFG; } - if ((bad_xaddr >= PCIBR_BRIDGE_DEVIO0(pcibr_soft)) && + if ((bad_xaddr >= PCIBR_BRIDGE_DEVIO(pcibr_soft, 0)) && (bad_xaddr < PCIBR_BRIDGE_DEVIO(pcibr_soft, BRIDGE_DEV_CNT))) { int x; - raw_paddr = bad_xaddr - PCIBR_BRIDGE_DEVIO0(pcibr_soft); + raw_paddr = bad_xaddr - PCIBR_BRIDGE_DEVIO(pcibr_soft, 0); x = raw_paddr / BRIDGE_DEVIO_OFF; raw_paddr %= BRIDGE_DEVIO_OFF; /* first two devio windows are double-sized */ @@ -1101,25 +1260,37 @@ } else raw_paddr += pcibr_soft->bs_slot[x].bss_devio.bssd_base; } - if ((bad_xaddr >= BRIDGE_PCI_MEM32_BASE) && - (bad_xaddr <= BRIDGE_PCI_MEM32_LIMIT)) { - raw_space = PCIIO_SPACE_MEM32; - raw_paddr = bad_xaddr - BRIDGE_PCI_MEM32_BASE; - } - if ((bad_xaddr >= BRIDGE_PCI_MEM64_BASE) && - (bad_xaddr <= BRIDGE_PCI_MEM64_LIMIT)) { - raw_space = PCIIO_SPACE_MEM64; - raw_paddr = bad_xaddr - BRIDGE_PCI_MEM64_BASE; - } - if ((bad_xaddr >= BRIDGE_PCI_IO_BASE) && - (bad_xaddr <= BRIDGE_PCI_IO_LIMIT)) { - raw_space = PCIIO_SPACE_IO; - raw_paddr = bad_xaddr - BRIDGE_PCI_IO_BASE; + + if (IS_PIC_BUSNUM_SOFT(pcibr_soft, 0)) { + if ((bad_xaddr >= PICBRIDGE0_PCI_MEM32_BASE) && + (bad_xaddr <= PICBRIDGE0_PCI_MEM32_LIMIT)) { + raw_space = PCIIO_SPACE_MEM32; + raw_paddr = bad_xaddr - PICBRIDGE0_PCI_MEM32_BASE; + } + if ((bad_xaddr >= PICBRIDGE0_PCI_MEM64_BASE) && + (bad_xaddr <= PICBRIDGE0_PCI_MEM64_LIMIT)) { + raw_space = PCIIO_SPACE_MEM64; + raw_paddr = bad_xaddr - PICBRIDGE0_PCI_MEM64_BASE; + } + } else if (IS_PIC_BUSNUM_SOFT(pcibr_soft, 1)) { + if ((bad_xaddr >= PICBRIDGE1_PCI_MEM32_BASE) && + (bad_xaddr <= PICBRIDGE1_PCI_MEM32_LIMIT)) { + raw_space = PCIIO_SPACE_MEM32; + raw_paddr = bad_xaddr - PICBRIDGE1_PCI_MEM32_BASE; + } + if ((bad_xaddr >= PICBRIDGE1_PCI_MEM64_BASE) && + (bad_xaddr <= PICBRIDGE1_PCI_MEM64_LIMIT)) { + raw_space = PCIIO_SPACE_MEM64; + raw_paddr = bad_xaddr - PICBRIDGE1_PCI_MEM64_BASE; + } + } else { + printk("pcibr_pioerror(): unknown bridge type"); + return IOERROR_UNHANDLED; } space = raw_space; offset = raw_paddr; - if ((slot == PCIIO_SLOT_NONE) && (space != PCIIO_SPACE_NONE)) { + if ((device == PCIIO_SLOT_NONE) && (space != PCIIO_SPACE_NONE)) { /* we've got a space/offset but not which * PCI slot decodes it. Check through our * notions of which devices decode where. @@ -1133,16 +1304,16 @@ for (cs = pcibr_soft->bs_min_slot; (cs < PCIBR_NUM_SLOTS(pcibr_soft)) && - (slot == PCIIO_SLOT_NONE); cs++) { + (device == PCIIO_SLOT_NONE); cs++) { int nf = pcibr_soft->bs_slot[cs].bss_ninfo; pcibr_info_h pcibr_infoh = pcibr_soft->bs_slot[cs].bss_infos; - for (cf = 0; (cf < nf) && (slot == PCIIO_SLOT_NONE); cf++) { + for (cf = 0; (cf < nf) && (device == PCIIO_SLOT_NONE); cf++) { pcibr_info_t pcibr_info = pcibr_infoh[cf]; if (!pcibr_info) continue; - for (cw = 0; (cw < 6) && (slot == PCIIO_SLOT_NONE); ++cw) { + for (cw = 0; (cw < 6) && (device == PCIIO_SLOT_NONE); ++cw) { if (((wx = pcibr_info->f_window[cw].w_space) != PCIIO_SPACE_NONE) && ((wb = pcibr_info->f_window[cw].w_base) != 0) && ((ws = pcibr_info->f_window[cw].w_size) != 0) && @@ -1158,7 +1329,7 @@ ((space == PCIIO_SPACE_MEM) || (space == PCIIO_SPACE_MEM32) || (space == PCIIO_SPACE_MEM64)))) { - slot = cs; + device = cs; func = cf; space = PCIIO_SPACE_WIN(cw); offset -= wb; @@ -1211,7 +1382,7 @@ wb = map->bp_pciaddr; ws = map->bp_mapsz; cw = wx - PCIIO_SPACE_WIN(0); - if (cw < 6) { + if (cw >= 0 && cw < 6) { wb += pcibr_soft->bs_slot[cs].bss_window[cw].bssw_base; wx = pcibr_soft->bs_slot[cs].bss_window[cw].bssw_space; } @@ -1224,32 +1395,35 @@ wx = PCIIO_SPACE_MEM; wl = wb + ws; if ((wx == raw_space) && (raw_paddr >= wb) && (raw_paddr < wl)) { - atomic_inc(&map->bp_toc[0]); - if (slot == PCIIO_SLOT_NONE) { - slot = cs; + atomic_inc(&map->bp_toc); + if (device == PCIIO_SLOT_NONE) { + device = cs; + func = cf; space = map->bp_space; - if (cw < 6) - offset -= pcibr_soft->bs_slot[cs].bss_window[cw].bssw_base; + if (cw >= 0 && cw < 6) + offset -= pcibr_soft->bs_slot[device].bss_window[cw].bssw_base; } + + break; } } } } PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ERROR_HDLR, pcibr_soft->bs_conn, - "pcibr_pioerror: offset=0x%x, slot=0x%x, func=0x%x\n", - offset, slot, func)); + "pcibr_pioerror: space=%d, offset=0x%lx, dev=0x%x, func=0x%x\n", + space, offset, device, func)); if (space != PCIIO_SPACE_NONE) { - if (slot != PCIIO_SLOT_NONE) { - if (func != PCIIO_FUNC_NONE) { + if (device != PCIIO_SLOT_NONE) { + external_slot = PCIBR_DEVICE_TO_SLOT(pcibr_soft, device); + + if (func != PCIIO_FUNC_NONE) IOERROR_SETVALUE(ioe, widgetdev, - pciio_widgetdev_create(slot,func)); - } - else { + pciio_widgetdev_create(external_slot,func)); + else IOERROR_SETVALUE(ioe, widgetdev, - pciio_widgetdev_create(slot,0)); - } + pciio_widgetdev_create(external_slot,0)); } IOERROR_SETVALUE(ioe, busspace, space); IOERROR_SETVALUE(ioe, busaddr, offset); @@ -1265,7 +1439,7 @@ /* if appropriate, give the error handler for this slot * a shot at this probe access as well. */ - return (slot == PCIIO_SLOT_NONE) ? IOERROR_HANDLED : + return (device == PCIIO_SLOT_NONE) ? IOERROR_HANDLED : pciio_error_handler(pcibr_vhdl, error_code, mode, ioe); } /* @@ -1355,10 +1529,11 @@ * other errors. */ if (IOERROR_FIELDVALID(ioe, widgetdev)) { - short widdev; - IOERROR_GETVALUE(widdev, ioe, widgetdev); - pcibr_device_disable(pcibr_soft, - pciio_widgetdev_slot_get(widdev)); + short widdev; + IOERROR_GETVALUE(widdev, ioe, widgetdev); + external_slot = pciio_widgetdev_slot_get(widdev); + device = PCIBR_SLOT_TO_DEVICE(pcibr_soft, external_slot); + pcibr_device_disable(pcibr_soft, device); } if (mode == MODE_DEVUSERERROR) pcibr_error_cleanup(pcibr_soft, error_code); @@ -1381,10 +1556,8 @@ ioerror_t *ioe) { vertex_hdl_t pcibr_vhdl = pcibr_soft->bs_vhdl; - bridge_t *bridge = pcibr_soft->bs_base; - bridgereg_t bus_lowaddr, bus_uppraddr; int retval = 0; - int bufnum; + int bufnum, device; /* * In case of DMA errors, bridge should have logged the @@ -1401,19 +1574,10 @@ /* * read error log registers */ - bus_lowaddr = bridge->b_wid_resp_lower; - bus_uppraddr = bridge->b_wid_resp_upper; - - bufnum = BRIDGE_RESP_ERRUPPR_BUFNUM(bus_uppraddr); - IOERROR_SETVALUE(ioe, widgetdev, - pciio_widgetdev_create( - BRIDGE_RESP_ERRUPPR_DEVICE(bus_uppraddr), - 0)); - IOERROR_SETVALUE(ioe, busaddr, - (bus_lowaddr | - ((iopaddr_t) - (bus_uppraddr & - BRIDGE_ERRUPPR_ADDRMASK) << 32))); + bufnum = pcireg_resp_err_buf_get(pcibr_soft); + device = pcireg_resp_err_dev_get(pcibr_soft); + IOERROR_SETVALUE(ioe, widgetdev, pciio_widgetdev_create(device, 0)); + IOERROR_SETVALUE(ioe, busaddr, pcireg_resp_err_get(pcibr_soft)); /* * need to ensure that the xtalk address in ioe @@ -1436,7 +1600,7 @@ * not is dependent on INT_ENABLE register. This write just makes sure * that if the interrupt was enabled, we do get the interrupt. */ - bridge->b_int_rst_stat = BRIDGE_IRR_RESP_BUF_GRP_CLR; + pcireg_intr_reset_set(pcibr_soft, BRIDGE_IRR_RESP_BUF_GRP_CLR); /* * Also, release the "bufnum" back to buffer pool that could be re-used. @@ -1445,19 +1609,13 @@ */ { - reg_p regp; - bridgereg_t regv; - bridgereg_t mask; - - regp = (bufnum & 1) - ? &bridge->b_odd_resp - : &bridge->b_even_resp; + uint64_t rrb_reg; + uint64_t mask; + rrb_reg = pcireg_rrb_get(pcibr_soft, (bufnum & 1)); mask = 0xF << ((bufnum >> 1) * 4); - - regv = *regp; - *regp = regv & ~mask; - *regp = regv; + pcireg_rrb_set(pcibr_soft, (bufnum & 1), (rrb_reg & ~mask)); + pcireg_rrb_set(pcibr_soft, (bufnum & 1), rrb_reg); } return retval; @@ -1705,9 +1863,9 @@ */ if ((pio_retval == -1) && (dma_retval == -1)) { return IOERROR_BADERRORCODE; - } else if (dma_retval != IOERROR_HANDLED) { + } else if ((dma_retval != IOERROR_HANDLED) && (dma_retval != -1)) { return dma_retval; - } else if (pio_retval != IOERROR_HANDLED) { + } else if ((pio_retval != IOERROR_HANDLED) && (pio_retval != -1)) { return pio_retval; } else { return IOERROR_HANDLED; diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_hints.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_hints.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_hints.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_hints.c Tue Feb 17 20:00:08 2004 @@ -33,8 +33,11 @@ if (alloc && (rv != GRAPH_SUCCESS)) { hint = kmalloc(sizeof (*(hint)), GFP_KERNEL); - if ( !hint ) + if ( !hint ) { + printk(KERN_WARNING "pcibr_hints_get(): unable to allocate " + "memory\n"); goto abnormal_exit; + } memset(hint, 0, sizeof (*(hint))); hint->rrb_alloc_funct = NULL; @@ -57,7 +60,7 @@ abnormal_exit: kfree(hint); - return(NULL); + return NULL; } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c Tue Feb 17 20:00:07 2004 @@ -25,14 +25,14 @@ /* FIXME - compare_and_swap_ptr NOT ATOMIC */ if (*location == old_ptr) { *location = new_ptr; - return(1); + return 1; } else - return(0); + return 0; } #endif -unsigned pcibr_intr_bits(pciio_info_t info, pciio_intr_line_t lines, int nslots); +unsigned int pcibr_intr_bits(pciio_info_t info, pciio_intr_line_t lines, int nslots); pcibr_intr_t pcibr_intr_alloc(vertex_hdl_t, device_desc_t, pciio_intr_line_t, vertex_hdl_t); void pcibr_intr_free(pcibr_intr_t); void pcibr_setpciint(xtalk_intr_t); @@ -40,8 +40,6 @@ void pcibr_intr_disconnect(pcibr_intr_t); vertex_hdl_t pcibr_intr_cpu_get(pcibr_intr_t); -void pcibr_xintr_preset(void *, int, xwidgetnum_t, iopaddr_t, xtalk_intr_vector_t); -void pcibr_intr_func(intr_arg_t); extern pcibr_info_t pcibr_info_get(vertex_hdl_t); @@ -49,7 +47,7 @@ * INTERRUPT MANAGEMENT */ -unsigned +unsigned int pcibr_intr_bits(pciio_info_t info, pciio_intr_line_t lines, int nslots) { @@ -100,7 +98,8 @@ extern struct sn_flush_nasid_entry flush_nasid_list[MAX_NASIDS]; void -sn_dma_flush(unsigned long addr) { +sn_dma_flush(unsigned long addr) +{ nasid_t nasid; int wid_num; volatile struct sn_flush_device_list *p; @@ -144,7 +143,7 @@ /* force an interrupt. */ - *(bridgereg_t *)(p->force_int_addr) = 1; + *(volatile uint32_t *)(p->force_int_addr) = 1; /* wait for the interrupt to come back. */ @@ -152,8 +151,6 @@ /* okay, everything is synched up. */ spin_unlock_irqrestore(&p->flush_lock, flags); - - return; } EXPORT_SYMBOL(sn_dma_flush); @@ -200,7 +197,6 @@ unsigned bit; unsigned bits; pcibr_soft_t pcibr_soft = intr->bi_soft; - bridge_t *bridge = pcibr_soft->bs_base; bits = intr->bi_ibits; for (bit = 0; bit < 8; bit++) { @@ -209,7 +205,7 @@ PCIBR_DEBUG((PCIBR_DEBUG_INTR, pcibr_soft->bs_vhdl, "pcibr_force_interrupt: bit=0x%x\n", bit)); - bridge->b_force_pin[bit].intr = 1; + pcireg_force_intr_set(pcibr_soft, bit); } } } @@ -225,7 +221,6 @@ pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pcibr_info); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pcibr_info->f_mfast; vertex_hdl_t xconn_vhdl = pcibr_soft->bs_conn; - bridge_t *bridge = pcibr_soft->bs_base; int is_threaded = 0; xtalk_intr_t *xtalk_intr_p; @@ -239,8 +234,6 @@ pcibr_intr_t pcibr_intr; pcibr_intr_list_t intr_entry; pcibr_intr_list_t intr_list; - bridgereg_t int_dev; - PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pconn_vhdl, "pcibr_intr_alloc: %s%s%s%s%s\n", @@ -266,9 +259,9 @@ pcibr_intr->bi_ibuf.ib_in = 0; pcibr_intr->bi_ibuf.ib_out = 0; spin_lock_init(&pcibr_intr->bi_ibuf.ib_lock); - pcibr_int_bits = pcibr_soft->bs_intr_bits((pciio_info_t)pcibr_info, lines, - PCIBR_NUM_SLOTS(pcibr_soft)); + pcibr_int_bits = pcibr_soft->bs_intr_bits((pciio_info_t)pcibr_info, + lines, PCIBR_NUM_SLOTS(pcibr_soft)); /* * For each PCI interrupt line requested, figure @@ -336,10 +329,10 @@ * now tell the bridge which slot is * using this interrupt line. */ - int_dev = bridge->b_int_device; - int_dev &= ~BRIDGE_INT_DEV_MASK(pcibr_int_bit); - int_dev |= pciio_slot << BRIDGE_INT_DEV_SHFT(pcibr_int_bit); - bridge->b_int_device = int_dev; /* XXXMP */ + pcireg_intr_device_bit_clr(pcibr_soft, + BRIDGE_INT_DEV_MASK(pcibr_int_bit)); + pcireg_intr_device_bit_set(pcibr_soft, + (pciio_slot << BRIDGE_INT_DEV_SHFT(pcibr_int_bit))); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pconn_vhdl, "bridge intr bit %d clears my wrb\n", @@ -367,7 +360,8 @@ intr_entry->il_next = NULL; intr_entry->il_intr = pcibr_intr; - intr_entry->il_wrbf = &(bridge->b_wr_req_buf[pciio_slot].reg); + intr_entry->il_soft = pcibr_soft; + intr_entry->il_slot = pciio_slot; intr_list_p = &pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_list; @@ -479,19 +473,14 @@ if ((!intr_shared) && (*xtalk_intrp)) { - bridge_t *bridge = pcibr_soft->bs_base; - bridgereg_t int_dev; - xtalk_intr_free(*xtalk_intrp); *xtalk_intrp = 0; /* Clear the PCI device interrupt to bridge interrupt pin * mapping. */ - int_dev = bridge->b_int_device; - int_dev &= ~BRIDGE_INT_DEV_MASK(pcibr_int_bit); - bridge->b_int_device = int_dev; - + pcireg_intr_device_bit_clr(pcibr_soft, + BRIDGE_INT_DEV_MASK(pcibr_int_bit)); } } } @@ -504,17 +493,21 @@ iopaddr_t addr; xtalk_intr_vector_t vect; vertex_hdl_t vhdl; - bridge_t *bridge; - picreg_t *int_addr; - + int bus_num; + int pcibr_int_bit; + void *bridge; + addr = xtalk_intr_addr_get(xtalk_intr); vect = xtalk_intr_vector_get(xtalk_intr); vhdl = xtalk_intr_dev_get(xtalk_intr); - bridge = (bridge_t *)xtalk_piotrans_addr(vhdl, 0, 0, sizeof(bridge_t), 0); - int_addr = (picreg_t *)xtalk_intr_sfarg_get(xtalk_intr); - *int_addr = ((PIC_INT_ADDR_FLD & ((uint64_t)vect << 48)) | - (PIC_INT_ADDR_HOST & addr)); + /* bus and int_bits are stored in sfarg, bus bit3, int_bits bit2:0 */ + pcibr_int_bit = *((int *)xtalk_intr_sfarg_get(xtalk_intr)) & 0x7; + bus_num = ((*((int *)xtalk_intr_sfarg_get(xtalk_intr)) & 0x8) >> 3); + + bridge = pcibr_bridge_ptr_get(vhdl, bus_num); + pcireg_bridge_intr_addr_vect_set(bridge, pcibr_int_bit, vect); + pcireg_bridge_intr_addr_addr_set(bridge, pcibr_int_bit, addr); } /*ARGSUSED */ @@ -522,11 +515,9 @@ pcibr_intr_connect(pcibr_intr_t pcibr_intr, intr_func_t intr_func, intr_arg_t intr_arg) { pcibr_soft_t pcibr_soft = pcibr_intr->bi_soft; - bridge_t *bridge = pcibr_soft->bs_base; unsigned pcibr_int_bits = pcibr_intr->bi_ibits; unsigned pcibr_int_bit; - uint64_t int_enable; - unsigned long s; + unsigned long s; if (pcibr_intr == NULL) return -1; @@ -566,37 +557,27 @@ * Use the pcibr wrapper function to handle all Bridge interrupts * regardless of whether the interrupt line is shared or not. */ - int_addr = (void *)&(bridge->p_int_addr_64[pcibr_int_bit]); - - xtalk_intr_connect(xtalk_intr, pcibr_intr_func, (intr_arg_t) intr_wrap, - (xtalk_intr_setfunc_t) pcibr_setpciint, - (void *)int_addr); + int_addr = pcireg_intr_addr_addr(pcibr_soft, pcibr_int_bit); + pcibr_soft->bs_intr[pcibr_int_bit].bsi_int_bit = + ((pcibr_soft->bs_busnum << 3) | pcibr_int_bit); + xtalk_intr_connect(xtalk_intr, + NULL, + (intr_arg_t) intr_wrap, + (xtalk_intr_setfunc_t) pcibr_setpciint, + &pcibr_soft->bs_intr[pcibr_int_bit].bsi_int_bit); pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_connected = 1; PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pcibr_intr->bi_dev, - "pcibr_setpciint: int_addr=0x%x, *int_addr=0x%x, " - "pcibr_int_bit=0x%x\n", int_addr, - *(picreg_t *)int_addr, + "pcibr_setpciint: int_addr=0x%lx, *int_addr=0x%lx, " + "pcibr_int_bit=0x%x\n", int_addr, + pcireg_intr_addr_get(pcibr_soft, pcibr_int_bit), pcibr_int_bit)); } - /* PIC WAR. PV# 854697 - * On PIC we must write 64-bit MMRs with 64-bit stores - */ s = pcibr_lock(pcibr_soft); - if (PCIBR_WAR_ENABLED(PV854697, pcibr_soft)) { - int_enable = bridge->p_int_enable_64; - int_enable |= pcibr_int_bits; - bridge->p_int_enable_64 = int_enable; - } else { - bridgereg_t int_enable; - - int_enable = bridge->b_int_enable; - int_enable |= pcibr_int_bits; - bridge->b_int_enable = int_enable; - } - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + pcireg_intr_enable_bit_set(pcibr_soft, pcibr_int_bits); + pcireg_tflush_get(pcibr_soft); pcibr_unlock(pcibr_soft, s); return 0; @@ -607,12 +588,10 @@ pcibr_intr_disconnect(pcibr_intr_t pcibr_intr) { pcibr_soft_t pcibr_soft = pcibr_intr->bi_soft; - bridge_t *bridge = pcibr_soft->bs_base; unsigned pcibr_int_bits = pcibr_intr->bi_ibits; unsigned pcibr_int_bit; - pcibr_intr_wrap_t intr_wrap; - uint64_t int_enable; - unsigned long s; + pcibr_intr_wrap_t intr_wrap; + unsigned long s; /* Stop calling the function. Now. */ @@ -636,16 +615,8 @@ return; s = pcibr_lock(pcibr_soft); - if (PCIBR_WAR_ENABLED(PV854697, pcibr_soft)) { - int_enable = bridge->p_int_enable_64; - int_enable &= ~pcibr_int_bits; - bridge->p_int_enable_64 = int_enable; - } else { - int_enable = (uint64_t)bridge->b_int_enable; - int_enable &= ~pcibr_int_bits; - bridge->b_int_enable = (bridgereg_t)int_enable; - } - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ + pcireg_intr_enable_bit_clr(pcibr_soft, pcibr_int_bits); + pcireg_tflush_get(pcibr_soft); /* wait until Bridge PIO complete */ pcibr_unlock(pcibr_soft, s); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pcibr_intr->bi_dev, @@ -654,7 +625,6 @@ for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++) if (pcibr_int_bits & (1 << pcibr_int_bit)) { - void *int_addr; /* if the interrupt line is now shared, * do not disconnect it. @@ -674,19 +644,18 @@ * where the another pcibr_intr_alloc() * was in progress as we disconnected. */ + intr_wrap = &pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap; if (!pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared) continue; - intr_wrap = &pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap; - if (!pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared) - continue; - - int_addr = (void *)&(bridge->p_int_addr_64[pcibr_int_bit]); - + pcibr_soft->bs_intr[pcibr_int_bit].bsi_int_bit = + ((pcibr_soft->bs_busnum << 3) | pcibr_int_bit); xtalk_intr_connect(pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr, - pcibr_intr_func, (intr_arg_t) intr_wrap, - (xtalk_intr_setfunc_t)pcibr_setpciint, - (void *)(long)pcibr_int_bit); + NULL, + (intr_arg_t) intr_wrap, + (xtalk_intr_setfunc_t) pcibr_setpciint, + &pcibr_soft->bs_intr[pcibr_int_bit].bsi_int_bit); + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pcibr_intr->bi_dev, "pcibr_intr_disconnect: now-sharing int_bits=0x%x\n", pcibr_int_bit)); @@ -711,10 +680,9 @@ * INTERRUPT HANDLING */ void -pcibr_clearwidint(bridge_t *bridge) +pcibr_clearwidint(pcibr_soft_t pcibr_soft) { - bridge->b_wid_int_upper = 0; - bridge->b_wid_int_lower = 0; + pcireg_intr_dst_set(pcibr_soft, 0); } @@ -724,257 +692,10 @@ xwidgetnum_t targ = xtalk_intr_target_get(intr); iopaddr_t addr = xtalk_intr_addr_get(intr); xtalk_intr_vector_t vect = xtalk_intr_vector_get(intr); - widgetreg_t NEW_b_wid_int_upper, NEW_b_wid_int_lower; - widgetreg_t OLD_b_wid_int_upper, OLD_b_wid_int_lower; - - bridge_t *bridge = (bridge_t *)xtalk_intr_sfarg_get(intr); - - NEW_b_wid_int_upper = ( (0x000F0000 & (targ << 16)) | - XTALK_ADDR_TO_UPPER(addr)); - NEW_b_wid_int_lower = XTALK_ADDR_TO_LOWER(addr); - - OLD_b_wid_int_upper = bridge->b_wid_int_upper; - OLD_b_wid_int_lower = bridge->b_wid_int_lower; - - /* Verify that all interrupts from this Bridge are using a single PI */ - if ((OLD_b_wid_int_upper != 0) && (OLD_b_wid_int_lower != 0)) { - /* - * Once set, these registers shouldn't change; they should - * be set multiple times with the same values. - * - * If we're attempting to change these registers, it means - * that our heuristics for allocating interrupts in a way - * appropriate for IP35 have failed, and the admin needs to - * explicitly direct some interrupts (or we need to make the - * heuristics more clever). - * - * In practice, we hope this doesn't happen very often, if - * at all. - */ - if ((OLD_b_wid_int_upper != NEW_b_wid_int_upper) || - (OLD_b_wid_int_lower != NEW_b_wid_int_lower)) { - printk(KERN_WARNING "Interrupt allocation is too complex.\n"); - printk(KERN_WARNING "Use explicit administrative interrupt targetting.\n"); - printk(KERN_WARNING "bridge=0x%lx targ=0x%x\n", (unsigned long)bridge, targ); - printk(KERN_WARNING "NEW=0x%x/0x%x OLD=0x%x/0x%x\n", - NEW_b_wid_int_upper, NEW_b_wid_int_lower, - OLD_b_wid_int_upper, OLD_b_wid_int_lower); - panic("PCI Bridge interrupt targetting error\n"); - } - } - - bridge->b_wid_int_upper = NEW_b_wid_int_upper; - bridge->b_wid_int_lower = NEW_b_wid_int_lower; - bridge->b_int_host_err = vect; - -} - -/* - * pcibr_intr_preset: called during mlreset time - * if the platform specific code needs to route - * one of the Bridge's xtalk interrupts before the - * xtalk infrastructure is available. - */ -void -pcibr_xintr_preset(void *which_widget, - int which_widget_intr, - xwidgetnum_t targ, - iopaddr_t addr, - xtalk_intr_vector_t vect) -{ - bridge_t *bridge = (bridge_t *) which_widget; - - if (which_widget_intr == -1) { - /* bridge widget error interrupt */ - bridge->b_wid_int_upper = ( (0x000F0000 & (targ << 16)) | - XTALK_ADDR_TO_UPPER(addr)); - bridge->b_wid_int_lower = XTALK_ADDR_TO_LOWER(addr); - bridge->b_int_host_err = vect; -printk("pcibr_xintr_preset: b_wid_int_upper 0x%lx b_wid_int_lower 0x%lx b_int_host_err 0x%x\n", - ( (0x000F0000 & (targ << 16)) | XTALK_ADDR_TO_UPPER(addr)), - XTALK_ADDR_TO_LOWER(addr), vect); - - /* turn on all interrupts except - * the PCI interrupt requests, - * at least at heart. - */ - bridge->b_int_enable |= ~BRIDGE_IMR_INT_MSK; - - } else { - /* routing a PCI device interrupt. - * targ and low 38 bits of addr must - * be the same as the already set - * value for the widget error interrupt. - */ - bridge->b_int_addr[which_widget_intr].addr = - ((BRIDGE_INT_ADDR_HOST & (addr >> 30)) | - (BRIDGE_INT_ADDR_FLD & vect)); - /* - * now bridge can let it through; - * NB: still should be blocked at - * xtalk provider end, until the service - * function is set. - */ - bridge->b_int_enable |= 1 << vect; - } - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ -} - -/* - * pcibr_intr_func() - * - * This is the pcibr interrupt "wrapper" function that is called, - * in interrupt context, to initiate the interrupt handler(s) registered - * (via pcibr_intr_alloc/connect) for the occurring interrupt. Non-threaded - * handlers will be called directly, and threaded handlers will have their - * thread woken up. - */ -void -pcibr_intr_func(intr_arg_t arg) -{ - pcibr_intr_wrap_t wrap = (pcibr_intr_wrap_t) arg; - reg_p wrbf; - intr_func_t func; - pcibr_intr_t intr; - pcibr_intr_list_t list; - int clearit; - int do_nonthreaded = 1; - int is_threaded = 0; - int x = 0; - pcibr_soft_t pcibr_soft = wrap->iw_soft; - bridge_t *bridge = pcibr_soft->bs_base; - uint64_t p_enable = pcibr_soft->bs_int_enable; - int bit = wrap->iw_ibit; - - /* - * PIC WAR. PV#855272 - * Early attempt at a workaround for the runaway - * interrupt problem. Briefly disable the enable bit for - * this device. - */ - if (PCIBR_WAR_ENABLED(PV855272, pcibr_soft)) { - unsigned s; - - /* disable-enable interrupts for this bridge pin */ - - p_enable &= ~(1 << bit); - s = pcibr_lock(pcibr_soft); - bridge->p_int_enable_64 = p_enable; - p_enable |= (1 << bit); - bridge->p_int_enable_64 = p_enable; - pcibr_unlock(pcibr_soft, s); - } - - /* - * If any handler is still running from a previous interrupt - * just return. If there's a need to call the handler(s) again, - * another interrupt will be generated either by the device or by - * pcibr_force_interrupt(). - */ - - if (wrap->iw_hdlrcnt) { - return; - } - - /* - * Call all interrupt handlers registered. - * First, the pcibr_intrd threads for any threaded handlers will be - * awoken, then any non-threaded handlers will be called sequentially. - */ - - clearit = 1; - while (do_nonthreaded) { - for (list = wrap->iw_list; list != NULL; list = list->il_next) { - if ((intr = list->il_intr) && (intr->bi_flags & PCIIO_INTR_CONNECTED)) { + pcibr_soft_t bridge = (pcibr_soft_t)xtalk_intr_sfarg_get(intr); - - /* - * This device may have initiated write - * requests since the bridge last saw - * an edge on this interrupt input; flushing - * the buffer prior to invoking the handler - * should help but may not be sufficient if we - * get more requests after the flush, followed - * by the card deciding it wants service, before - * the interrupt handler checks to see if things need - * to be done. - * - * There is a similar race condition if - * an interrupt handler loops around and - * notices further service is requred. - * Perhaps we need to have an explicit - * call that interrupt handlers need to - * do between noticing that DMA to memory - * has completed, but before observing the - * contents of memory? - */ - - if ((do_nonthreaded) && (!is_threaded)) { - /* Non-threaded - Call the interrupt handler at interrupt level */ - /* Only need to flush write buffers if sharing */ - - if ((wrap->iw_shared) && (wrbf = list->il_wrbf)) { - if ((x = *wrbf)) /* write request buffer flush */ -#ifdef SUPPORT_PRINTING_V_FORMAT - printk(KERN_ALERT "pcibr_intr_func %v: \n" - "write buffer flush failed, wrbf=0x%x\n", - list->il_intr->bi_dev, wrbf); -#else - printk(KERN_ALERT "pcibr_intr_func %p: \n" - "write buffer flush failed, wrbf=0x%lx\n", - (void *)list->il_intr->bi_dev, (long) wrbf); -#endif - } - func = intr->bi_func; - if ( func ) - func(intr->bi_arg); - } - clearit = 0; - } - } - do_nonthreaded = 0; - - /* - * If the non-threaded handler was the last to complete, - * (i.e., no threaded handlers still running) force an - * interrupt to avoid a potential deadlock situation. - */ - if (wrap->iw_hdlrcnt == 0) { - pcibr_force_interrupt((pcibr_intr_t) wrap); - } - } - - /* If there were no handlers, - * disable the interrupt and return. - * It will get enabled again after - * a handler is connected. - * If we don't do this, we would - * sit here and spin through the - * list forever. - */ - if (clearit) { - pcibr_soft_t pcibr_soft = wrap->iw_soft; - bridge_t *bridge = pcibr_soft->bs_base; - bridgereg_t int_enable; - bridgereg_t mask = 1 << wrap->iw_ibit; - unsigned long s; - - /* PIC BRINUGP WAR (PV# 854697): - * On PIC we must write 64-bit MMRs with 64-bit stores - */ - s = pcibr_lock(pcibr_soft); - if (PCIBR_WAR_ENABLED(PV854697, pcibr_soft)) { - int_enable = bridge->p_int_enable_64; - int_enable &= ~mask; - bridge->p_int_enable_64 = int_enable; - } else { - int_enable = (uint64_t)bridge->b_int_enable; - int_enable &= ~mask; - bridge->b_int_enable = (bridgereg_t)int_enable; - } - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - pcibr_unlock(pcibr_soft, s); - return; - } + pcireg_intr_dst_target_id_set(bridge, targ); + pcireg_intr_dst_addr_set(bridge, addr); + pcireg_intr_host_err_set(bridge, vect); } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c Tue Feb 17 20:00:08 2004 @@ -14,94 +14,867 @@ #include #include -#define IS_IOADDR(ptr) (!(((uint64_t)(ptr) & CAC_BASE) == CAC_BASE)) /* - * Control Register Access -- Read/Write 0000_0020 + * Identification Register Access -- Read Only 0000_0000 */ +static uint64_t +__pcireg_id_get(pic_t *bridge) +{ + return bridge->p_wid_id; +} uint64_t -pcireg_control_get(void *ptr) +pcireg_bridge_id_get(void *ptr) { - uint64_t ret = 0; - pic_t *bridge; + return __pcireg_id_get((pic_t *)ptr); +} - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; +uint64_t +pcireg_id_get(pcibr_soft_t ptr) +{ + return __pcireg_id_get((pic_t *)ptr->bs_base); +} - ret = ((pic_t *) bridge)->p_wid_control; - return ret; + + +/* + * Address Bus Side Holding Register Access -- Read Only 0000_0010 + */ +uint64_t +pcireg_bus_err_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_err; } + /* - * Interrupt Status Register Access -- Read Only 0000_0100 + * Control Register Access -- Read/Write 0000_0020 */ +static uint64_t +__pcireg_control_get(pic_t *bridge) +{ + return bridge->p_wid_control; +} + +uint64_t +pcireg_bridge_control_get(void *ptr) +{ + return __pcireg_control_get((pic_t *)ptr); +} + uint64_t -pcireg_intr_status_get(void *ptr) +pcireg_control_get(pcibr_soft_t ptr) +{ + return __pcireg_control_get((pic_t *)ptr->bs_base); +} + + +void +pcireg_control_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + /* WAR for PV 439897 & 454474. Add a readback of the control + * register. Lock to protect against MP accesses to this + * register along with other write-only registers (See PVs). + * This register isnt accessed in the "hot path" so the splhi + * shouldn't be a bottleneck + */ + + bridge->p_wid_control = val; + bridge->p_wid_control; /* WAR */ +} + + +void +pcireg_control_bit_clr(pcibr_soft_t ptr, uint64_t bits) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + /* WAR for PV 439897 & 454474. Add a readback of the control + * register. Lock to protect against MP accesses to this + * register along with other write-only registers (See PVs). + * This register isnt accessed in the "hot path" so the splhi + * shouldn't be a bottleneck + */ + + bridge->p_wid_control &= ~bits; + bridge->p_wid_control; /* WAR */ +} + + +void +pcireg_control_bit_set(pcibr_soft_t ptr, uint64_t bits) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + /* WAR for PV 439897 & 454474. Add a readback of the control + * register. Lock to protect against MP accesses to this + * register along with other write-only registers (See PVs). + * This register isnt accessed in the "hot path" so the splhi + * shouldn't be a bottleneck + */ + + bridge->p_wid_control |= bits; + bridge->p_wid_control; /* WAR */ +} + +/* + * Bus Speed (from control register); -- Read Only access 0000_0020 + * 0x00 == 33MHz, 0x01 == 66MHz, 0x10 == 100MHz, 0x11 == 133MHz + */ +uint64_t +pcireg_speed_get(pcibr_soft_t ptr) +{ + uint64_t speedbits; + pic_t *bridge = (pic_t *)ptr->bs_base; + + speedbits = bridge->p_wid_control & PIC_CTRL_PCI_SPEED; + return (speedbits >> 4); +} + +/* + * Bus Mode (ie. PCIX or PCI) (from Status register); 0000_0008 + * 0x0 == PCI, 0x1 == PCI-X + */ +uint64_t +pcireg_mode_get(pcibr_soft_t ptr) +{ + uint64_t pcix_active_bit; + pic_t *bridge = (pic_t *)ptr->bs_base; + + pcix_active_bit = bridge->p_wid_stat & PIC_STAT_PCIX_ACTIVE; + return (pcix_active_bit >> PIC_STAT_PCIX_ACTIVE_SHFT); +} + +void +pcireg_req_timeout_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_wid_req_timeout = val; +} + +/* + * Interrupt Destination Addr Register Access -- Read/Write 0000_0038 + */ + +void +pcireg_intr_dst_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_wid_int = val; +} + +/* + * Intr Destination Addr Reg Access (target_id) -- Read/Write 0000_0038 + */ +uint64_t +pcireg_intr_dst_target_id_get(pcibr_soft_t ptr) +{ + uint64_t tid_bits; + pic_t *bridge = (pic_t *)ptr->bs_base; + + tid_bits = (bridge->p_wid_int & PIC_INTR_DEST_TID); + return (tid_bits >> PIC_INTR_DEST_TID_SHFT); +} + +void +pcireg_intr_dst_target_id_set(pcibr_soft_t ptr, uint64_t target_id) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_wid_int &= ~PIC_INTR_DEST_TID; + bridge->p_wid_int |= + ((target_id << PIC_INTR_DEST_TID_SHFT) & PIC_INTR_DEST_TID); +} + +/* + * Intr Destination Addr Register Access (addr) -- Read/Write 0000_0038 + */ +uint64_t +pcireg_intr_dst_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_int & PIC_XTALK_ADDR_MASK; +} + +void +pcireg_intr_dst_addr_set(pcibr_soft_t ptr, uint64_t addr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_wid_int &= ~PIC_XTALK_ADDR_MASK; + bridge->p_wid_int |= (addr & PIC_XTALK_ADDR_MASK); +} + +/* + * Cmd Word Holding Bus Side Error Register Access -- Read Only 0000_0040 + */ +uint64_t +pcireg_cmdword_err_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_err_cmdword; +} + +/* + * PCI/PCIX Target Flush Register Access -- Read Only 0000_0050 + */ +uint64_t +pcireg_tflush_get(pcibr_soft_t ptr) { - short bridge_type; - pic_t *bridge; uint64_t ret = 0; + pic_t *bridge = (pic_t *)ptr->bs_base; - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; + ret = bridge->p_wid_tflush; - ret = ((pic_t *) bridge)->p_int_status; + /* Read of the Targer Flush should always return zero */ + ASSERT_ALWAYS(ret == 0); return ret; } +/* + * Cmd Word Holding Link Side Error Register Access -- Read Only 0000_0058 + */ +uint64_t +pcireg_linkside_err_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_aux_err; +} + +/* + * PCI Response Buffer Address Holding Register -- Read Only 0000_0068 + */ +uint64_t +pcireg_resp_err_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_resp; +} + +/* + * PCI Resp Buffer Address Holding Reg (Address) -- Read Only 0000_0068 + */ +uint64_t +pcireg_resp_err_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_resp & PIC_RSP_BUF_ADDR; +} + +/* + * PCI Resp Buffer Address Holding Register (Buffer)-- Read Only 0000_0068 + */ +uint64_t +pcireg_resp_err_buf_get(pcibr_soft_t ptr) +{ + uint64_t bufnum_bits; + pic_t *bridge = (pic_t *)ptr->bs_base; + + bufnum_bits = (bridge->p_wid_resp_upper & PIC_RSP_BUF_NUM); + return (bufnum_bits >> PIC_RSP_BUF_NUM_SHFT); +} + +/* + * PCI Resp Buffer Address Holding Register (Device)-- Read Only 0000_0068 + */ +uint64_t +pcireg_resp_err_dev_get(pcibr_soft_t ptr) +{ + uint64_t devnum_bits; + pic_t *bridge = (pic_t *)ptr->bs_base; + + devnum_bits = (bridge->p_wid_resp_upper & PIC_RSP_BUF_DEV_NUM); + return (devnum_bits >> PIC_RSP_BUF_DEV_NUM_SHFT); +} + +/* + * Address Holding Register Link Side Errors -- Read Only 0000_0078 + */ +uint64_t +pcireg_linkside_err_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_wid_addr_lkerr; +} + +void +pcireg_dirmap_wid_set(pcibr_soft_t ptr, uint64_t target) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_dir_map &= ~PIC_DIRMAP_WID; + bridge->p_dir_map |= + ((target << PIC_DIRMAP_WID_SHFT) & PIC_DIRMAP_WID); +} + +void +pcireg_dirmap_diroff_set(pcibr_soft_t ptr, uint64_t dir_off) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_dir_map &= ~PIC_DIRMAP_DIROFF; + bridge->p_dir_map |= (dir_off & PIC_DIRMAP_DIROFF); +} + +void +pcireg_dirmap_add512_set(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_dir_map |= PIC_DIRMAP_ADD512; +} + +void +pcireg_dirmap_add512_clr(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_dir_map &= ~PIC_DIRMAP_ADD512; +} + +/* + * PCI Page Map Fault Address Register Access -- Read Only 0000_0090 + */ +uint64_t +pcireg_map_fault_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_map_fault; +} + +/* + * Arbitration Register Access -- Read/Write 0000_00A0 + */ +uint64_t +pcireg_arbitration_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_arb; +} + +void +pcireg_arbitration_bit_set(pcibr_soft_t ptr, uint64_t bits) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_arb |= bits; +} + +/* + * Internal Ram Parity Error Register Access -- Read Only 0000_00B0 + */ +uint64_t +pcireg_parity_err_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_ate_parity_err; +} + +/* + * Type 1 Configuration Register Access -- Read/Write 0000_00C8 + */ +void +pcireg_type1_cntr_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_pci_cfg = val; +} + +/* + * PCI Bus Error Lower Addr Holding Reg Access -- Read Only 0000_00D8 + */ +uint64_t +pcireg_pci_bus_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pci_err; +} + +/* + * PCI Bus Error Addr Holding Reg Access (Address) -- Read Only 0000_00D8 + */ +uint64_t +pcireg_pci_bus_addr_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pci_err & PIC_XTALK_ADDR_MASK; +} + +/* + * Interrupt Status Register Access -- Read Only 0000_0100 + */ +uint64_t +pcireg_intr_status_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_int_status; +} + +/* + * Interrupt Enable Register Access -- Read/Write 0000_0108 + */ +uint64_t +pcireg_intr_enable_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_int_enable; +} + +void +pcireg_intr_enable_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_int_enable = val; +} + void -pcireg_intr_enable_bit_clr(void *ptr, uint64_t bits) +pcireg_intr_enable_bit_clr(pcibr_soft_t ptr, uint64_t bits) { - pic_t *bridge; + pic_t *bridge = (pic_t *)ptr->bs_base; - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_int_enable &= ~bits; } void -pcireg_intr_enable_bit_set(void *ptr, uint64_t bits) +pcireg_intr_enable_bit_set(pcibr_soft_t ptr, uint64_t bits) { - pic_t *bridge; + pic_t *bridge = (pic_t *)ptr->bs_base; - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_int_enable |= bits; } +/* + * Interrupt Reset Register Access -- Write Only 0000_0110 + */ +void +pcireg_intr_reset_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_int_rst_stat = val; +} + +void +pcireg_intr_mode_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_int_mode = val; +} + void -pcireg_intr_addr_addr_set(void *ptr, int int_n, uint64_t addr) +pcireg_intr_device_set(pcibr_soft_t ptr, uint64_t val) { - pic_t *bridge; + pic_t *bridge = (pic_t *)ptr->bs_base; - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; - bridge->p_int_addr[int_n] &= ~(0x0000FFFFFFFFFFFF); - bridge->p_int_addr[int_n] |= (addr & 0x0000FFFFFFFFFFFF); + bridge->p_int_device = val; +} + +static void +__pcireg_intr_device_bit_set(pic_t *bridge, uint64_t bits) +{ + bridge->p_int_device |= bits; +} + +void +pcireg_bridge_intr_device_bit_set(void *ptr, uint64_t bits) +{ + __pcireg_intr_device_bit_set((pic_t *)ptr, bits); +} + +void +pcireg_intr_device_bit_set(pcibr_soft_t ptr, uint64_t bits) +{ + __pcireg_intr_device_bit_set((pic_t *)ptr->bs_base, bits); +} + +void +pcireg_intr_device_bit_clr(pcibr_soft_t ptr, uint64_t bits) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_int_device &= ~bits; } /* - * Force Interrupt Register Access -- Write Only 0000_01C0 - 0000_01F8 + * Host Error Interrupt Field Register Access -- Read/Write 0000_0128 */ void -pcireg_force_intr_set(void *ptr, int int_n) +pcireg_intr_host_err_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_int_host_err = val; +} + +/* + * Interrupt Host Address Register -- Read/Write 0000_0130 - 0000_0168 + */ +uint64_t +pcireg_intr_addr_get(pcibr_soft_t ptr, int int_n) { - pic_t *bridge; + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_int_addr[int_n]; +} + +static void +__pcireg_intr_addr_set(pic_t *bridge, int int_n, uint64_t val) +{ + bridge->p_int_addr[int_n] = val; +} + +void +pcireg_bridge_intr_addr_set(void *ptr, int int_n, uint64_t val) +{ + __pcireg_intr_addr_set((pic_t *)ptr, int_n, val); +} + +void +pcireg_intr_addr_set(pcibr_soft_t ptr, int int_n, uint64_t val) +{ + __pcireg_intr_addr_set((pic_t *)ptr->bs_base, int_n, val); +} + +void * +pcireg_intr_addr_addr(pcibr_soft_t ptr, int int_n) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return (void *)&(bridge->p_int_addr[int_n]); +} + +static void +__pcireg_intr_addr_vect_set(pic_t *bridge, int int_n, uint64_t vect) +{ + bridge->p_int_addr[int_n] &= ~PIC_HOST_INTR_FLD; + bridge->p_int_addr[int_n] |= + ((vect << PIC_HOST_INTR_FLD_SHFT) & PIC_HOST_INTR_FLD); +} + +void +pcireg_bridge_intr_addr_vect_set(void *ptr, int int_n, uint64_t vect) +{ + __pcireg_intr_addr_vect_set((pic_t *)ptr, int_n, vect); +} + +void +pcireg_intr_addr_vect_set(pcibr_soft_t ptr, int int_n, uint64_t vect) +{ + __pcireg_intr_addr_vect_set((pic_t *)ptr->bs_base, int_n, vect); +} + + + +/* + * Intr Host Address Register (int_addr) -- Read/Write 0000_0130 - 0000_0168 + */ +static void +__pcireg_intr_addr_addr_set(pic_t *bridge, int int_n, uint64_t addr) +{ + bridge->p_int_addr[int_n] &= ~PIC_HOST_INTR_ADDR; + bridge->p_int_addr[int_n] |= (addr & PIC_HOST_INTR_ADDR); +} + +void +pcireg_bridge_intr_addr_addr_set(void *ptr, int int_n, uint64_t addr) +{ + __pcireg_intr_addr_addr_set((pic_t *)ptr, int_n, addr); +} + +void +pcireg_intr_addr_addr_set(pcibr_soft_t ptr, int int_n, uint64_t addr) +{ + __pcireg_intr_addr_addr_set((pic_t *)ptr->bs_base, int_n, addr); +} + +/* + * Multiple Interrupt Register Access -- Read Only 0000_0178 + */ +uint64_t +pcireg_intr_multiple_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_mult_int; +} + +/* + * Force Always Intr Register Access -- Write Only 0000_0180 - 0000_01B8 + */ +static void * +__pcireg_force_always_addr_get(pic_t *bridge, int int_n) +{ + return (void *)&(bridge->p_force_always[int_n]); +} + +void * +pcireg_bridge_force_always_addr_get(void *ptr, int int_n) +{ + return __pcireg_force_always_addr_get((pic_t *)ptr, int_n); +} + +void * +pcireg_force_always_addr_get(pcibr_soft_t ptr, int int_n) +{ + return __pcireg_force_always_addr_get((pic_t *)ptr->bs_base, int_n); +} + +/* + * Force Interrupt Register Access -- Write Only 0000_01C0 - 0000_01F8 + */ +void +pcireg_force_intr_set(pcibr_soft_t ptr, int int_n) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; - if (IS_IOADDR(ptr)) - bridge = (pic_t *) ptr; - else - bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_force_pin[int_n] = 1; +} + +/* + * Device(x) Register Access -- Read/Write 0000_0200 - 0000_0218 + */ +uint64_t +pcireg_device_get(pcibr_soft_t ptr, int device) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + ASSERT_ALWAYS((device >= 0) && (device <= 3)); + return bridge->p_device[device]; +} + +void +pcireg_device_set(pcibr_soft_t ptr, int device, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + ASSERT_ALWAYS((device >= 0) && (device <= 3)); + bridge->p_device[device] = val; +} + +/* + * Device(x) Write Buffer Flush Reg Access -- Read Only 0000_0240 - 0000_0258 + */ +uint64_t +pcireg_wrb_flush_get(pcibr_soft_t ptr, int device) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + uint64_t ret = 0; + + ASSERT_ALWAYS((device >= 0) && (device <= 3)); + ret = bridge->p_wr_req_buf[device]; + + /* Read of the Write Buffer Flush should always return zero */ + ASSERT_ALWAYS(ret == 0); + return ret; +} + +/* + * Even/Odd RRB Register Access -- Read/Write 0000_0280 - 0000_0288 + */ +uint64_t +pcireg_rrb_get(pcibr_soft_t ptr, int even_odd) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_rrb_map[even_odd]; +} + +void +pcireg_rrb_set(pcibr_soft_t ptr, int even_odd, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_rrb_map[even_odd] = val; +} + +void +pcireg_rrb_bit_set(pcibr_soft_t ptr, int even_odd, uint64_t bits) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_rrb_map[even_odd] |= bits; +} + +/* + * RRB Status Register Access -- Read Only 0000_0290 + */ +uint64_t +pcireg_rrb_status_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_resp_status; +} + +/* + * RRB Clear Register Access -- Write Only 0000_0298 + */ +void +pcireg_rrb_clear_set(pcibr_soft_t ptr, uint64_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + bridge->p_resp_clear = val; +} + +/* + * PCIX Bus Error Address Register Access -- Read Only 0000_0600 + */ +uint64_t +pcireg_pcix_bus_err_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_bus_err_addr; +} + +/* + * PCIX Bus Error Attribute Register Access -- Read Only 0000_0608 + */ +uint64_t +pcireg_pcix_bus_err_attr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_bus_err_attr; +} + +/* + * PCIX Bus Error Data Register Access -- Read Only 0000_0610 + */ +uint64_t +pcireg_pcix_bus_err_data_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_bus_err_data; +} + +/* + * PCIX PIO Split Request Address Register Access -- Read Only 0000_0618 + */ +uint64_t +pcireg_pcix_pio_split_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_pio_split_addr; +} + +/* + * PCIX PIO Split Request Attribute Register Access -- Read Only 0000_0620 + */ +uint64_t +pcireg_pcix_pio_split_attr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_pio_split_attr; +} + +/* + * PCIX DMA Request Error Attribute Register Access -- Read Only 0000_0628 + */ +uint64_t +pcireg_pcix_req_err_attr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_dma_req_err_attr; +} + +/* + * PCIX DMA Request Error Address Register Access -- Read Only 0000_0630 + */ +uint64_t +pcireg_pcix_req_err_addr_get(pcibr_soft_t ptr) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + return bridge->p_pcix_dma_req_err_addr; +} + +/* + * Type 0 Configuration Space Access -- Read/Write + */ +cfg_p +pcireg_type0_cfg_addr(pcibr_soft_t ptr, uint8_t slot, uint8_t func, int off) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + /* Type 0 Config space accesses on PIC are 1-4, not 0-3 since + * it is a PCIX Bridge. See sys/PCI/pic.h for explanation. + */ + slot++; + ASSERT_ALWAYS(((int) slot >= 1) && ((int) slot <= 4)); + return &(bridge->p_type0_cfg_dev[slot].f[func].l[(off / 4)]); +} + +/* + * Type 1 Configuration Space Access -- Read/Write + */ +cfg_p +pcireg_type1_cfg_addr(pcibr_soft_t ptr, uint8_t func, int offset) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + /* + * Return a config space address for the given slot/func/offset. + * Note the returned ptr is a 32bit word (ie. cfg_p) aligned ptr + * pointing to the 32bit word that contains the "offset" byte. + */ + return &(bridge->p_type1_cfg.f[func].l[(offset / 4)]); +} + +/* + * Internal ATE SSRAM Access -- Read/Write + */ +bridge_ate_t +pcireg_int_ate_get(pcibr_soft_t ptr, int ate_index) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024)); + return bridge->p_int_ate_ram[ate_index]; +} + +void +pcireg_int_ate_set(pcibr_soft_t ptr, int ate_index, bridge_ate_t val) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024)); + bridge->p_int_ate_ram[ate_index] = (picate_t) val; +} + +bridge_ate_p +pcireg_int_ate_addr(pcibr_soft_t ptr, int ate_index) +{ + pic_t *bridge = (pic_t *)ptr->bs_base; + + ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024)); + return &(bridge->p_int_ate_ram[ate_index]); } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c Tue Feb 17 20:00:08 2004 @@ -14,23 +14,19 @@ #include #include -void do_pcibr_rrb_clear(bridge_t *, int); -void do_pcibr_rrb_flush(bridge_t *, int); -int do_pcibr_rrb_count_valid(bridge_t *, pciio_slot_t, int); -int do_pcibr_rrb_count_avail(bridge_t *, pciio_slot_t); -int do_pcibr_rrb_alloc(bridge_t *, pciio_slot_t, int, int); -int do_pcibr_rrb_free(bridge_t *, pciio_slot_t, int, int); -void do_pcibr_rrb_free_all(pcibr_soft_t, bridge_t *, pciio_slot_t); - -void do_pcibr_rrb_autoalloc(pcibr_soft_t, int, int, int); - -int pcibr_wrb_flush(vertex_hdl_t); -int pcibr_rrb_alloc(vertex_hdl_t, int *, int *); -int pcibr_rrb_check(vertex_hdl_t, int *, int *, int *, int *); -void pcibr_rrb_flush(vertex_hdl_t); -int pcibr_slot_initial_rrb_alloc(vertex_hdl_t,pciio_slot_t); +void pcibr_rrb_alloc_init(pcibr_soft_t, int, int, int); +void pcibr_rrb_alloc_more(pcibr_soft_t, int, int, int); + +int pcibr_wrb_flush(vertex_hdl_t); +int pcibr_rrb_alloc(vertex_hdl_t, int *, int *); +int pcibr_rrb_check(vertex_hdl_t, int *, int *, int *, int *); +int pcibr_alloc_all_rrbs(vertex_hdl_t, int, int, int, int, + int, int, int, int, int); +void pcibr_rrb_flush(vertex_hdl_t); +int pcibr_slot_initial_rrb_alloc(vertex_hdl_t,pciio_slot_t); + +void pcibr_rrb_debug(char *, pcibr_soft_t); -void pcibr_rrb_debug(char *, pcibr_soft_t); /* * RRB Management @@ -52,23 +48,27 @@ #define RRB_MASK (0xf) /* mask a single rrb within reg */ #define RRB_SIZE (4) /* sizeof rrb within reg (bits) */ -#define RRB_ENABLE_BIT(bridge) (0x8) /* [BRIDGE | PIC]_RRB_EN */ -#define NUM_PDEV_BITS(bridge) (1) -#define NUM_VDEV_BITS(bridge) (2) -#define NUMBER_VCHANNELS(bridge) (4) -#define SLOT_2_PDEV(bridge, slot) ((slot) >> 1) -#define SLOT_2_RRB_REG(bridge, slot) ((slot) & 0x1) - -/* validate that the slot and virtual channel are valid for a given bridge */ -#define VALIDATE_SLOT_n_VCHAN(bridge, s, v) \ - (((((s) != PCIIO_SLOT_NONE) && ((s) <= (pciio_slot_t)3)) && (((v) >= 0) && ((v) <= 3))) ? 1 : 0) +#define RRB_ENABLE_BIT (0x8) /* [BRIDGE | PIC]_RRB_EN */ +#define NUM_PDEV_BITS (1) +#define NUMBER_VCHANNELS (4) +#define SLOT_2_PDEV(slot) ((slot) >> 1) +#define SLOT_2_RRB_REG(slot) ((slot) & 0x1) + +#define RRB_VALID(rrb) (0x00010000 << (rrb)) +#define RRB_INUSE(rrb) (0x00000001 << (rrb)) +#define RRB_CLEAR(rrb) (0x00000001 << (rrb)) + +/* validate that the slot and virtual channel are valid */ +#define VALIDATE_SLOT_n_VCHAN(s, v) \ + (((((s) != PCIIO_SLOT_NONE) && ((s) <= (pciio_slot_t)3)) && \ + (((v) >= 0) && ((v) <= 3))) ? 1 : 0) /* * Count how many RRBs are marked valid for the specified PCI slot * and virtual channel. Return the count. */ -int -do_pcibr_rrb_count_valid(bridge_t *bridge, +static int +do_pcibr_rrb_count_valid(pcibr_soft_t pcibr_soft, pciio_slot_t slot, int vchan) { @@ -76,18 +76,18 @@ uint16_t enable_bit, vchan_bits, pdev_bits, rrb_bits; int rrb_index, cnt=0; - if (!VALIDATE_SLOT_n_VCHAN(bridge, slot, vchan)) { + if (!VALIDATE_SLOT_n_VCHAN(slot, vchan)) { printk(KERN_WARNING "do_pcibr_rrb_count_valid() invalid slot/vchan [%d/%d]\n", slot, vchan); return 0; } - enable_bit = RRB_ENABLE_BIT(bridge); - vchan_bits = vchan << NUM_PDEV_BITS(bridge); - pdev_bits = SLOT_2_PDEV(bridge, slot); + enable_bit = RRB_ENABLE_BIT; + vchan_bits = vchan << NUM_PDEV_BITS; + pdev_bits = SLOT_2_PDEV(slot); rrb_bits = enable_bit | vchan_bits | pdev_bits; - tmp = bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg; - + tmp = pcireg_rrb_get(pcibr_soft, SLOT_2_RRB_REG(slot)); + for (rrb_index = 0; rrb_index < 8; rrb_index++) { if ((tmp & RRB_MASK) == rrb_bits) cnt++; @@ -101,23 +101,23 @@ * Count how many RRBs are available to be allocated to the specified * slot. Return the count. */ -int -do_pcibr_rrb_count_avail(bridge_t *bridge, +static int +do_pcibr_rrb_count_avail(pcibr_soft_t pcibr_soft, pciio_slot_t slot) { uint64_t tmp; uint16_t enable_bit; int rrb_index, cnt=0; - if (!VALIDATE_SLOT_n_VCHAN(bridge, slot, 0)) { + if (!VALIDATE_SLOT_n_VCHAN(slot, 0)) { printk(KERN_WARNING "do_pcibr_rrb_count_avail() invalid slot/vchan"); return 0; } - enable_bit = RRB_ENABLE_BIT(bridge); - - tmp = bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg; - + enable_bit = RRB_ENABLE_BIT; + + tmp = pcireg_rrb_get(pcibr_soft, SLOT_2_RRB_REG(slot)); + for (rrb_index = 0; rrb_index < 8; rrb_index++) { if ((tmp & enable_bit) != enable_bit) cnt++; @@ -135,8 +135,8 @@ * Note that if a request can be partially filled, it will be, even if * we return failure. */ -int -do_pcibr_rrb_alloc(bridge_t *bridge, +static int +do_pcibr_rrb_alloc(pcibr_soft_t pcibr_soft, pciio_slot_t slot, int vchan, int more) @@ -145,18 +145,18 @@ uint16_t enable_bit, vchan_bits, pdev_bits, rrb_bits; int rrb_index; - if (!VALIDATE_SLOT_n_VCHAN(bridge, slot, vchan)) { + if (!VALIDATE_SLOT_n_VCHAN(slot, vchan)) { printk(KERN_WARNING "do_pcibr_rrb_alloc() invalid slot/vchan"); return -1; } - enable_bit = RRB_ENABLE_BIT(bridge); - vchan_bits = vchan << NUM_PDEV_BITS(bridge); - pdev_bits = SLOT_2_PDEV(bridge, slot); + enable_bit = RRB_ENABLE_BIT; + vchan_bits = vchan << NUM_PDEV_BITS; + pdev_bits = SLOT_2_PDEV(slot); rrb_bits = enable_bit | vchan_bits | pdev_bits; - - reg = tmp = bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg; - + + reg = tmp = pcireg_rrb_get(pcibr_soft, SLOT_2_RRB_REG(slot)); + for (rrb_index = 0; ((rrb_index < 8) && (more > 0)); rrb_index++) { if ((tmp & enable_bit) != enable_bit) { /* clear the rrb and OR in the new rrb into 'reg' */ @@ -166,11 +166,41 @@ } tmp = (tmp >> RRB_SIZE); } - - bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg = reg; + + pcireg_rrb_set(pcibr_soft, SLOT_2_RRB_REG(slot), reg); return (more ? -1 : 0); } +/* + * Wait for the the specified rrb to have no outstanding XIO pkts + * and for all data to be drained. Mark the rrb as no longer being + * valid. + */ +static void +do_pcibr_rrb_clear(pcibr_soft_t pcibr_soft, int rrb) +{ + uint64_t status; + + /* bridge_lock must be held; this RRB must be disabled. */ + + /* wait until RRB has no outstanduing XIO packets. */ + status = pcireg_rrb_status_get(pcibr_soft); + while (status & RRB_INUSE(rrb)) { + status = pcireg_rrb_status_get(pcibr_soft); + } + + /* if the RRB has data, drain it. */ + if (status & RRB_VALID(rrb)) { + pcireg_rrb_clear_set(pcibr_soft, RRB_CLEAR(rrb)); + + /* wait until RRB is no longer valid. */ + status = pcireg_rrb_status_get(pcibr_soft); + while (status & RRB_VALID(rrb)) { + status = pcireg_rrb_status_get(pcibr_soft); + } + } +} + /* * Release some of the RRBs that have been allocated for the specified @@ -180,8 +210,8 @@ * Note that if a request can be partially fulfilled, it will be, even * if we return failure. */ -int -do_pcibr_rrb_free(bridge_t *bridge, +static int +do_pcibr_rrb_free(pcibr_soft_t pcibr_soft, pciio_slot_t slot, int vchan, int less) @@ -190,18 +220,18 @@ uint16_t enable_bit, vchan_bits, pdev_bits, rrb_bits; int rrb_index; - if (!VALIDATE_SLOT_n_VCHAN(bridge, slot, vchan)) { + if (!VALIDATE_SLOT_n_VCHAN(slot, vchan)) { printk(KERN_WARNING "do_pcibr_rrb_free() invalid slot/vchan"); return -1; } - enable_bit = RRB_ENABLE_BIT(bridge); - vchan_bits = vchan << NUM_PDEV_BITS(bridge); - pdev_bits = SLOT_2_PDEV(bridge, slot); + enable_bit = RRB_ENABLE_BIT; + vchan_bits = vchan << NUM_PDEV_BITS; + pdev_bits = SLOT_2_PDEV(slot); rrb_bits = enable_bit | vchan_bits | pdev_bits; - - reg = tmp = bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg; - + + reg = tmp = pcireg_rrb_get(pcibr_soft, SLOT_2_RRB_REG(slot)); + for (rrb_index = 0; ((rrb_index < 8) && (less > 0)); rrb_index++) { if ((tmp & RRB_MASK) == rrb_bits) { /* @@ -210,132 +240,144 @@ * reg = reg & ~(RRB_MASK << (RRB_SIZE * rrb_index)); * But to be compatible with old code we'll only clear enable. */ - reg = reg & ~(RRB_ENABLE_BIT(bridge) << (RRB_SIZE * rrb_index)); + reg = reg & ~(RRB_ENABLE_BIT << (RRB_SIZE * rrb_index)); clr = clr | (enable_bit << (RRB_SIZE * rrb_index)); less--; } tmp = (tmp >> RRB_SIZE); } - - bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg = reg; - + + pcireg_rrb_set(pcibr_soft, SLOT_2_RRB_REG(slot), reg); + /* call do_pcibr_rrb_clear() for all the rrbs we've freed */ for (rrb_index = 0; rrb_index < 8; rrb_index++) { - int evn_odd = SLOT_2_RRB_REG(bridge, slot); + int evn_odd = SLOT_2_RRB_REG(slot); if (clr & (enable_bit << (RRB_SIZE * rrb_index))) - do_pcibr_rrb_clear(bridge, (2 * rrb_index) + evn_odd); + do_pcibr_rrb_clear(pcibr_soft, (2 * rrb_index) + evn_odd); } return (less ? -1 : 0); } - +/* + * Flush the specified rrb by calling do_pcibr_rrb_clear(). This + * routine is just a wrapper to make sure the rrb is disabled + * before calling do_pcibr_rrb_clear(). + */ +static void +do_pcibr_rrb_flush(pcibr_soft_t pcibr_soft, int rrbn) +{ + uint64_t rrbv; + int shft = (RRB_SIZE * (rrbn >> 1)); + uint64_t ebit = RRB_ENABLE_BIT << shft; + + rrbv = pcireg_rrb_get(pcibr_soft, (rrbn & 1)); + if (rrbv & ebit) { + pcireg_rrb_set(pcibr_soft, (rrbn & 1), (rrbv & ~ebit)); + } + + do_pcibr_rrb_clear(pcibr_soft, rrbn); + + if (rrbv & ebit) { + pcireg_rrb_set(pcibr_soft, (rrbn & 1), rrbv); + } +} + /* * free all the rrbs (both the normal and virtual channels) for the * specified slot. */ void do_pcibr_rrb_free_all(pcibr_soft_t pcibr_soft, - bridge_t *bridge, pciio_slot_t slot) { int vchan; - int vchan_total = NUMBER_VCHANNELS(bridge); + int vchan_total = NUMBER_VCHANNELS; /* pretend we own all 8 rrbs and just ignore the return value */ for (vchan = 0; vchan < vchan_total; vchan++) { - (void)do_pcibr_rrb_free(bridge, slot, vchan, 8); + do_pcibr_rrb_free(pcibr_soft, slot, vchan, 8); pcibr_soft->bs_rrb_valid[slot][vchan] = 0; } } - - + + /* - * Wait for the the specified rrb to have no outstanding XIO pkts - * and for all data to be drained. Mark the rrb as no longer being - * valid. + * Initialize a slot with a given number of RRBs. (this routine + * will also give back RRBs if the slot has more than we want). */ void -do_pcibr_rrb_clear(bridge_t *bridge, int rrb) -{ - uint64_t status; +pcibr_rrb_alloc_init(pcibr_soft_t pcibr_soft, + int slot, + int vchan, + int init_rrbs) +{ + int had = pcibr_soft->bs_rrb_valid[slot][vchan]; + int have = had; + int added = 0; - /* bridge_lock must be held; - * this RRB must be disabled. - */ - - /* wait until RRB has no outstanduing XIO packets. */ - while ((status = bridge->b_resp_status) & BRIDGE_RRB_INUSE(rrb)) { - ; /* XXX- beats on bridge. bad idea? */ - } - - /* if the RRB has data, drain it. */ - if (status & BRIDGE_RRB_VALID(rrb)) { - bridge->b_resp_clear = BRIDGE_RRB_CLEAR(rrb); + for (added = 0; have < init_rrbs; ++added, ++have) { + if (pcibr_soft->bs_rrb_res[slot] > 0) + pcibr_soft->bs_rrb_res[slot]--; + else if (pcibr_soft->bs_rrb_avail[slot & 1] > 0) + pcibr_soft->bs_rrb_avail[slot & 1]--; + else + break; + if (do_pcibr_rrb_alloc(pcibr_soft, slot, vchan, 1) < 0) + break; - /* wait until RRB is no longer valid. */ - while ((status = bridge->b_resp_status) & BRIDGE_RRB_VALID(rrb)) { - ; /* XXX- beats on bridge. bad idea? */ - } + pcibr_soft->bs_rrb_valid[slot][vchan]++; } -} - - -/* - * Flush the specified rrb by calling do_pcibr_rrb_clear(). This - * routine is just a wrapper to make sure the rrb is disabled - * before calling do_pcibr_rrb_clear(). - */ -void -do_pcibr_rrb_flush(bridge_t *bridge, int rrbn) -{ - reg_p rrbp = &bridge->b_rrb_map[rrbn & 1].reg; - bridgereg_t rrbv; - int shft = (RRB_SIZE * (rrbn >> 1)); - unsigned long ebit = RRB_ENABLE_BIT(bridge) << shft; - rrbv = *rrbp; - - if (rrbv & ebit) { - *rrbp = rrbv & ~ebit; + /* Free any extra RRBs that the slot may have allocated to it */ + while (have > init_rrbs) { + pcibr_soft->bs_rrb_avail[slot & 1]++; + pcibr_soft->bs_rrb_valid[slot][vchan]--; + do_pcibr_rrb_free(pcibr_soft, slot, vchan, 1); + added--; + have--; } - do_pcibr_rrb_clear(bridge, rrbn); + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_soft->bs_vhdl, + "pcibr_rrb_alloc_init: had %d, added/removed %d, " + "(of requested %d) RRBs " + "to slot %d, vchan %d\n", had, added, init_rrbs, + PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), vchan)); - if (rrbv & ebit) { - *rrbp = rrbv; - } + pcibr_rrb_debug("pcibr_rrb_alloc_init", pcibr_soft); } +/* + * Allocate more RRBs to a given slot (if the RRBs are available). + */ void -do_pcibr_rrb_autoalloc(pcibr_soft_t pcibr_soft, - int slot, - int vchan, - int more_rrbs) +pcibr_rrb_alloc_more(pcibr_soft_t pcibr_soft, + int slot, + int vchan, + int more_rrbs) { - bridge_t *bridge = pcibr_soft->bs_base; - int got; + int added; - for (got = 0; got < more_rrbs; ++got) { + for (added = 0; added < more_rrbs; ++added) { if (pcibr_soft->bs_rrb_res[slot] > 0) pcibr_soft->bs_rrb_res[slot]--; else if (pcibr_soft->bs_rrb_avail[slot & 1] > 0) pcibr_soft->bs_rrb_avail[slot & 1]--; else break; - if (do_pcibr_rrb_alloc(bridge, slot, vchan, 1) < 0) + if (do_pcibr_rrb_alloc(pcibr_soft, slot, vchan, 1) < 0) break; pcibr_soft->bs_rrb_valid[slot][vchan]++; } PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_soft->bs_vhdl, - "do_pcibr_rrb_autoalloc: added %d (of %d requested) RRBs " - "to slot %d, vchan %d\n", got, more_rrbs, + "pcibr_rrb_alloc_more: added %d (of %d requested) RRBs " + "to slot %d, vchan %d\n", added, more_rrbs, PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), vchan)); - pcibr_rrb_debug("do_pcibr_rrb_autoalloc", pcibr_soft); + pcibr_rrb_debug("pcibr_rrb_alloc_more", pcibr_soft); } @@ -348,25 +390,24 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pcibr_soft_t pcibr_soft = (pcibr_soft_t)pciio_info_mfast_get(pciio_info); pciio_slot_t slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); - bridge_t *bridge = pcibr_soft->bs_base; uint64_t tmp; uint16_t enable_bit, pdev_bits, rrb_bits, rrb_mask; int rrb_index; unsigned long s; - enable_bit = RRB_ENABLE_BIT(bridge); - pdev_bits = SLOT_2_PDEV(bridge, slot); + enable_bit = RRB_ENABLE_BIT; + pdev_bits = SLOT_2_PDEV(slot); rrb_bits = enable_bit | pdev_bits; - rrb_mask = enable_bit | ((NUM_PDEV_BITS(bridge) << 1) - 1); + rrb_mask = enable_bit | ((NUM_PDEV_BITS << 1) - 1); - tmp = bridge->b_rrb_map[SLOT_2_RRB_REG(bridge, slot)].reg; + tmp = pcireg_rrb_get(pcibr_soft, SLOT_2_RRB_REG(slot)); s = pcibr_lock(pcibr_soft); for (rrb_index = 0; rrb_index < 8; rrb_index++) { - int evn_odd = SLOT_2_RRB_REG(bridge, slot); + int evn_odd = SLOT_2_RRB_REG(slot); if ((tmp & rrb_mask) == rrb_bits) - do_pcibr_rrb_flush(bridge, (2 * rrb_index) + evn_odd); + do_pcibr_rrb_flush(pcibr_soft, (2 * rrb_index) + evn_odd); tmp = (tmp >> RRB_SIZE); } pcibr_unlock(pcibr_soft, s); @@ -383,13 +424,10 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridge_t *bridge = pcibr_soft->bs_base; - volatile bridgereg_t *wrb_flush; - wrb_flush = &(bridge->b_wr_req_buf[pciio_slot].reg); - while (*wrb_flush) - ; - return(0); + pcireg_wrb_flush_get(pcibr_soft, pciio_slot); + + return 0; } /* @@ -411,7 +449,6 @@ pciio_info_t pciio_info = pciio_info_get(pconn_vhdl); pciio_slot_t pciio_slot = PCIBR_INFO_SLOT_GET_INT(pciio_info); pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridge_t *bridge = pcibr_soft->bs_base; int desired_vchan0; int desired_vchan1; int orig_vchan0; @@ -441,7 +478,7 @@ s = pcibr_lock(pcibr_soft); - vchan_total = NUMBER_VCHANNELS(bridge); + vchan_total = NUMBER_VCHANNELS; /* Save the boot-time RRB configuration for this slot */ if (pcibr_soft->bs_rrb_valid_dflt[pciio_slot][VCHAN0] < 0) { @@ -507,14 +544,14 @@ /* Commit the allocations: free, then alloc. */ if (delta_vchan0 < 0) - (void) do_pcibr_rrb_free(bridge, pciio_slot, VCHAN0, -delta_vchan0); + do_pcibr_rrb_free(pcibr_soft, pciio_slot, VCHAN0, -delta_vchan0); if (delta_vchan1 < 0) - (void) do_pcibr_rrb_free(bridge, pciio_slot, VCHAN1, -delta_vchan1); + do_pcibr_rrb_free(pcibr_soft, pciio_slot, VCHAN1, -delta_vchan1); if (delta_vchan0 > 0) - (void) do_pcibr_rrb_alloc(bridge, pciio_slot, VCHAN0, delta_vchan0); + do_pcibr_rrb_alloc(pcibr_soft, pciio_slot, VCHAN0, delta_vchan0); if (delta_vchan1 > 0) - (void) do_pcibr_rrb_alloc(bridge, pciio_slot, VCHAN1, delta_vchan1); + do_pcibr_rrb_alloc(pcibr_soft, pciio_slot, VCHAN1, delta_vchan1); /* Return final values to caller. */ @@ -666,7 +703,6 @@ pcibr_soft_t pcibr_soft; pcibr_info_h pcibr_infoh; pcibr_info_t pcibr_info; - bridge_t *bridge; int vchan_total; int vchan; int chan[4]; @@ -674,17 +710,15 @@ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(-EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(-EINVAL); - - bridge = pcibr_soft->bs_base; + return -EINVAL; /* How many RRBs are on this slot? */ - vchan_total = NUMBER_VCHANNELS(bridge); + vchan_total = NUMBER_VCHANNELS; for (vchan = 0; vchan < vchan_total; vchan++) - chan[vchan] = do_pcibr_rrb_count_valid(bridge, slot, vchan); + chan[vchan] = do_pcibr_rrb_count_valid(pcibr_soft, slot, vchan); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_vhdl, "pcibr_slot_initial_rrb_alloc: slot %d started with %d+%d+%d+%d\n", @@ -695,44 +729,44 @@ */ pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos; pcibr_info = pcibr_infoh[0]; + /* + * PIC BRINGUP WAR (PV# 856866, 859504, 861476, 861478): + * Don't free RRBs we allocated to device[2|3]--vchan3 as + * a WAR to those PVs mentioned above. In pcibr_attach2 + * we allocate RRB0,8,1,9 to device[2|3]--vchan3. + */ + if (PCIBR_WAR_ENABLED(PV856866, pcibr_soft) && + (slot == 2 || slot == 3) && + (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) && + !pcibr_soft->bs_slot[slot].has_host) { - if (PCIBR_WAR_ENABLED(PV856866, pcibr_soft) && - (slot == 2 || slot == 3) && - (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) && - !pcibr_soft->bs_slot[slot].has_host) { - - for (vchan = 0; vchan < 2; vchan++) { - do_pcibr_rrb_free(bridge, slot, vchan, 8); - pcibr_soft->bs_rrb_valid[slot][vchan] = 0; - } + for (vchan = 0; vchan < 2; vchan++) { + do_pcibr_rrb_free(pcibr_soft, slot, vchan, 8); + pcibr_soft->bs_rrb_valid[slot][vchan] = 0; + } pcibr_soft->bs_rrb_valid[slot][3] = chan[3]; - return(-ENODEV); + return -ENODEV; } - /* Give back any assigned to empty slots */ - if ((pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) && !pcibr_soft->bs_slot[slot].has_host) { - do_pcibr_rrb_free_all(pcibr_soft, bridge, slot); - return(-ENODEV); + if ((pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) && + !pcibr_soft->bs_slot[slot].has_host) { + do_pcibr_rrb_free_all(pcibr_soft, slot); + + /* Reserve RRBs for this empty slot for hot-plug */ + for (vchan = 0; vchan < vchan_total; vchan++) + pcibr_soft->bs_rrb_valid[slot][vchan] = 0; + + return -ENODEV; } for (vchan = 0; vchan < vchan_total; vchan++) pcibr_soft->bs_rrb_valid[slot][vchan] = chan[vchan]; - return(0); + return 0; } -void -rrb_reserved_free(pcibr_soft_t pcibr_soft, int slot) -{ - int res = pcibr_soft->bs_rrb_res[slot]; - - if (res) { - pcibr_soft->bs_rrb_avail[slot & 1] += res; - pcibr_soft->bs_rrb_res[slot] = 0; - } -} /* * pcibr_initial_rrb @@ -750,7 +784,6 @@ pciio_slot_t first, pciio_slot_t last) { pcibr_soft_t pcibr_soft = pcibr_soft_get(pcibr_vhdl); - bridge_t *bridge = pcibr_soft->bs_base; pciio_slot_t slot; int rrb_total; int vchan_total; @@ -763,12 +796,12 @@ have[1][0] = have[1][1] = have[1][2] = 0; res[0] = res[1] = 0; - vchan_total = NUMBER_VCHANNELS(bridge); + vchan_total = NUMBER_VCHANNELS; for (slot = pcibr_soft->bs_min_slot; slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { /* Initial RRB management; give back RRBs in all non-existent slots */ - (void) pcibr_slot_initial_rrb_alloc(pcibr_vhdl, slot); + pcibr_slot_initial_rrb_alloc(pcibr_vhdl, slot); /* Base calculations only on existing slots */ if ((slot >= first) && (slot <= last)) { @@ -782,8 +815,8 @@ } /* Initialize even/odd slot available RRB counts */ - pcibr_soft->bs_rrb_avail[0] = do_pcibr_rrb_count_avail(bridge, 0); - pcibr_soft->bs_rrb_avail[1] = do_pcibr_rrb_count_avail(bridge, 1); + pcibr_soft->bs_rrb_avail[0] = do_pcibr_rrb_count_avail(pcibr_soft, 0); + pcibr_soft->bs_rrb_avail[1] = do_pcibr_rrb_count_avail(pcibr_soft, 1); /* * Calculate reserved RRBs for slots based on current RRB usage @@ -804,6 +837,9 @@ for (slot = first; slot <= last; ++slot) { int r; + if (pcibr_soft->bs_unused_slot & (1 << slot)) + continue; + rrb_total = 0; for (vchan = 0; vchan < vchan_total; vchan++) rrb_total += pcibr_soft->bs_rrb_valid[slot][vchan]; @@ -829,7 +865,6 @@ pcibr_rrb_debug(char *calling_func, pcibr_soft_t pcibr_soft) { pciio_slot_t slot; - char tmp_str[256]; if (pcibr_debug_mask & PCIBR_DEBUG_RRB) { PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_soft->bs_vhdl, @@ -837,23 +872,17 @@ pcibr_soft->bs_rrb_avail[0], pcibr_soft->bs_rrb_avail[1])); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_soft->bs_vhdl, - "\tslot\tvchan0\tvchan1\tvchan2\tvchan3\treserved\n")); + "\tslot\tvchan0\tvchan1\tvchan2\tvchan3\treserved\n")); for (slot=0; slot < PCIBR_NUM_SLOTS(pcibr_soft); slot++) { - /* - * The kernel only allows functions to have so many variable args, - * attempting to call PCIBR_DEBUG_ALWAYS() with more than 5 printf - * arguments fails so sprintf() it into a temporary string. - */ - sprintf(tmp_str, "\t %d\t %d\t %d\t %d\t %d\t %d\n", - PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), - 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN0], - 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN1], - 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN2], - 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN3], - pcibr_soft->bs_rrb_res[slot]); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RRB, pcibr_soft->bs_vhdl, - "%s", tmp_str)); + "\t %d\t %d\t %d\t %d\t %d\t %d\n", + PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), + 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN0], + 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN1], + 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN2], + 0xFFF & pcibr_soft->bs_rrb_valid[slot][VCHAN3], + pcibr_soft->bs_rrb_res[slot])); } } } diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c Tue Feb 17 20:00:06 2004 @@ -37,11 +37,12 @@ pciio_slot_t slot, int drv_flags); int pcibr_slot_detach(vertex_hdl_t pcibr_vhdl, pciio_slot_t slot, int drv_flags, char *l1_msg, int *sub_errorp); -static int pcibr_probe_slot(bridge_t *, cfg_p, unsigned int *); +static int pcibr_probe_slot(pcibr_soft_t, cfg_p, unsigned int *); +static int pcibr_probe_work(pcibr_soft_t pcibr_soft, void *addr, int len, void *valp); void pcibr_device_info_free(vertex_hdl_t, pciio_slot_t); iopaddr_t pcibr_bus_addr_alloc(pcibr_soft_t, pciio_win_info_t, pciio_space_t, int, int, int); -void pciibr_bus_addr_free(pcibr_soft_t, pciio_win_info_t); +void pcibr_bus_addr_free(pciio_win_info_t); cfg_p pcibr_find_capability(cfg_p, unsigned); extern uint64_t do_pcibr_config_get(cfg_p, unsigned, unsigned); void do_pcibr_config_set(cfg_p, unsigned, unsigned, uint64_t); @@ -57,22 +58,6 @@ int max_splittrans_to_numbuf[MAX_SPLIT_TABLE] = {1, 2, 3, 4, 8, 12, 16, 32}; int max_readcount_to_bufsize[MAX_READCNT_TABLE] = {512, 1024, 2048, 4096 }; -char *pci_space_name[] = {"NONE", - "ROM", - "IO", - "", - "MEM", - "MEM32", - "MEM64", - "CFG", - "WIN0", - "WIN1", - "WIN2", - "WIN3", - "WIN4", - "WIN5", - "", - "BAD"}; /* * pcibr_slot_info_init @@ -87,7 +72,6 @@ pcibr_soft_t pcibr_soft; pcibr_info_h pcibr_infoh; pcibr_info_t pcibr_info; - bridge_t *bridge; cfg_p cfgw; unsigned idword; unsigned pfail; @@ -106,28 +90,28 @@ int func; vertex_hdl_t conn_vhdl; pcibr_soft_slot_t slotp; - + uint64_t device_reg; + /* Get the basic software information required to proceed */ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; - bridge = pcibr_soft->bs_base; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; /* If we have a host slot (eg:- IOC3 has 2 PCI slots and the initialization * is done by the host slot then we are done. */ if (pcibr_soft->bs_slot[slot].has_host) { - return(0); + return 0; } /* Try to read the device-id/vendor-id from the config space */ - cfgw = pcibr_slot_config_addr(bridge, slot, 0); + cfgw = pcibr_slot_config_addr(pcibr_soft, slot, 0); - if (pcibr_probe_slot(bridge, cfgw, &idword)) - return(ENODEV); + if (pcibr_probe_slot(pcibr_soft, cfgw, &idword)) + return -ENODEV; slotp = &pcibr_soft->bs_slot[slot]; slotp->slot_status |= SLOT_POWER_UP; @@ -143,7 +127,7 @@ * and we are done. */ if (vendor == 0xFFFF) - return(ENODEV); + return -ENODEV; htype = do_pcibr_config_get(cfgw, PCI_CFG_HEADER_TYPE, 1); nfunc = 1; @@ -157,8 +141,8 @@ if (htype & 0x80) { /* MULTIFUNCTION */ for (func = 1; func < 8; ++func) { - cfgw = pcibr_func_config_addr(bridge, 0, slot, func, 0); - if (pcibr_probe_slot(bridge, cfgw, &idwords[func])) { + cfgw = pcibr_func_config_addr(pcibr_soft, 0, slot, func, 0); + if (pcibr_probe_slot(pcibr_soft, cfgw, &idwords[func])) { pfail |= 1 << func; continue; } @@ -170,11 +154,11 @@ nfunc = func + 1; rfunc = 0; } - cfgw = pcibr_slot_config_addr(bridge, slot, 0); + cfgw = pcibr_slot_config_addr(pcibr_soft, slot, 0); } pcibr_infoh = kmalloc(nfunc*sizeof (*(pcibr_infoh)), GFP_KERNEL); if ( !pcibr_infoh ) { - return ENOMEM; + return -ENOMEM; } memset(pcibr_infoh, 0, nfunc*sizeof (*(pcibr_infoh))); @@ -189,7 +173,7 @@ continue; idword = idwords[func]; - cfgw = pcibr_func_config_addr(bridge, 0, slot, func, 0); + cfgw = pcibr_func_config_addr(pcibr_soft, 0, slot, func, 0); device = 0xFFFF & (idword >> 16); htype = do_pcibr_config_get(cfgw, PCI_CFG_HEADER_TYPE, 1); @@ -223,9 +207,8 @@ */ lt_time = do_pcibr_config_get(cfgw, PCI_CFG_LATENCY_TIMER, 1); - - if ((lt_time == 0) && !(bridge->b_device[slot].reg & BRIDGE_DEV_RT) && - (device == 0x5 /* RAD_DEV */)) { + device_reg = pcireg_device_get(pcibr_soft, slot); + if ((lt_time == 0) && !(device_reg & BRIDGE_DEV_RT)) { unsigned min_gnt; unsigned min_gnt_mult; @@ -272,12 +255,14 @@ "func=%d, to 0x20\n", PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), func)); } + } - /* Get the PCI-X capability if running in PCI-X mode. If the func - * doesnt have a pcix capability, allocate a PCIIO_VENDOR_ID_NONE - * pcibr_info struct so the device driver for that function is not - * called. - */ + /* Get the PCI-X capability if running in PCI-X mode. If the func + * doesnt have a pcix capability, allocate a PCIIO_VENDOR_ID_NONE + * pcibr_info struct so the device driver for that function is not + * called. + */ + if (IS_PCIX(pcibr_soft)) { if (!(pcix_cap = pcibr_find_capability(cfgw, PCI_CAP_PCIX))) { printk(KERN_WARNING "%s: Bus running in PCI-X mode, But card in slot %d, " @@ -398,7 +383,31 @@ } if (base != 0) { /* estimate size */ + pciio_space_t tmp_space = space; + iopaddr_t tmp_base; + size = base & -base; + + /* + * Reserve this space in the relavent address map. Don't + * care about the return code from pcibr_bus_addr_alloc(). + */ + + if (space == PCIIO_SPACE_MEM && code != PCI_BA_MEM_1MEG) { + tmp_space = PCIIO_SPACE_MEM32; + } + + tmp_base = pcibr_bus_addr_alloc(pcibr_soft, + &pcibr_info->f_window[win], + tmp_space, + base, size, 0); + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_BAR, pcibr_vhdl, + "pcibr_slot_info_init: slot=%d, func=%d win %d " + "reserving space %s [0x%lx..0x%lx], tmp_base 0x%lx\n", + PCIBR_DEVICE_TO_SLOT(pcibr_soft, slot), func, win, + pci_space[tmp_space], (uint64_t)base, + (uint64_t)(base + size - 1), (uint64_t)tmp_base)); } else { /* calculate size */ do_pcibr_config_set(wptr, (win * 4), 4, ~0); /* write 1's */ size = do_pcibr_config_get(wptr, (win * 4), 4); /* read back */ @@ -419,7 +428,7 @@ } /* next win */ } /* next func */ - return(0); + return 0; } /* @@ -438,7 +447,7 @@ /* Check to see if there is a capabilities pointer in the cfg header */ if (!(do_pcibr_config_get(cfgw, PCI_CFG_STATUS, 2) & PCI_STAT_CAP_LIST)) { - return (NULL); + return NULL; } /* @@ -453,13 +462,13 @@ while (cap_nxt && (defend_against_circular_linkedlist <= 48)) { cap_id = do_pcibr_config_get(cfgw, cap_nxt, 1); if (cap_id == capability) { - return ((cfg_p)((char *)cfgw + cap_nxt)); + return (cfg_p)((char *)cfgw + cap_nxt); } cap_nxt = (do_pcibr_config_get(cfgw, cap_nxt+1, 1) & 0xfc); defend_against_circular_linkedlist++; } - return (NULL); + return NULL; } /* @@ -478,10 +487,10 @@ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; nfunc = pcibr_soft->bs_slot[slot].bss_ninfo; @@ -491,7 +500,7 @@ kfree(pcibr_infoh); pcibr_soft->bs_slot[slot].bss_ninfo = 0; - return(0); + return 0; } /* @@ -508,13 +517,13 @@ int func; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; if ((nfunc = pcibr_soft->bs_slot[slot].bss_ninfo) < 1) - return(EINVAL); + return -EINVAL; if (!(pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos)) - return(EINVAL); + return -EINVAL; PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_RBAR, pcibr_soft->bs_vhdl, "pcibr_slot_pcix_rbar_init for slot %d\n", @@ -586,7 +595,7 @@ pcibr_soft->bs_pcix_rbar_inuse, pcibr_soft->bs_pcix_rbar_avail)); } - return(0); + return 0; } int as_debug = 0; @@ -602,41 +611,38 @@ pcibr_soft_t pcibr_soft; pcibr_info_h pcibr_infoh; pcibr_info_t pcibr_info; - bridge_t *bridge; iopaddr_t mask; int nbars; int nfunc; int func; int win; int rc = 0; - int align; + int align = 0; int align_slot; pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); - - bridge = pcibr_soft->bs_base; + return -EINVAL; /* allocate address space, * for windows that have not been * previously assigned. */ if (pcibr_soft->bs_slot[slot].has_host) { - return(0); + return 0; } nfunc = pcibr_soft->bs_slot[slot].bss_ninfo; if (nfunc < 1) - return(EINVAL); + return -EINVAL; pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos; if (!pcibr_infoh) - return(EINVAL); + return -EINVAL; /* * Try to make the DevIO windows not @@ -668,7 +674,7 @@ if (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) continue; - cfgw = pcibr_func_config_addr(bridge, 0, slot, func, 0); + cfgw = pcibr_func_config_addr(pcibr_soft, 0, slot, func, 0); wptr = cfgw + PCI_CFG_BASE_ADDR_0 / 4; if ((do_pcibr_config_get(cfgw, PCI_CFG_HEADER_TYPE, 1) & 0x7f) != 0) @@ -821,7 +827,7 @@ do_pcibr_config_set(cfgw, PCI_CFG_COMMAND, 4, pci_cfg_cmd_reg | pci_cfg_cmd_reg_add); } /* next func */ - return(rc); + return rc; } /* @@ -834,40 +840,45 @@ pciio_slot_t slot) { pcibr_soft_t pcibr_soft; - bridge_t *bridge; - bridgereg_t devreg; + uint64_t devreg; pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); - - bridge = pcibr_soft->bs_base; + return -EINVAL; /* - * Adjustments to Device(x) - * and init of bss_device shadow + * Adjustments to Device(x) and init of bss_device shadow */ - devreg = bridge->b_device[slot].reg; + devreg = pcireg_device_get(pcibr_soft, slot); devreg &= ~BRIDGE_DEV_PAGE_CHK_DIS; /* - * PIC WAR. PV# 855271 - * Don't enable virtual channels in the PIC by default. - * Can cause problems with 32-bit devices. (The bit is only intended - * for 64-bit devices). We set the bit in pcibr_try_set_device() - * if we're 64-bit and requesting virtual channels. + * Enable virtual channels by default (exception: see PIC WAR below) */ - if (PCIBR_WAR_ENABLED(PV855271, pcibr_soft)) - devreg |= BRIDGE_DEV_COH; - else - devreg |= BRIDGE_DEV_COH | BRIDGE_DEV_VIRTUAL_EN; + devreg |= BRIDGE_DEV_VIRTUAL_EN; + + /* + * PIC WAR. PV# 855271: Disable virtual channels in the PIC since + * it can cause problems with 32-bit devices. We'll set the bit in + * pcibr_try_set_device() iff we're 64-bit and requesting virtual + * channels. + */ + if (PCIBR_WAR_ENABLED(PV855271, pcibr_soft)) { + devreg &= ~BRIDGE_DEV_VIRTUAL_EN; + } + devreg |= BRIDGE_DEV_COH; + pcibr_soft->bs_slot[slot].bss_device = devreg; - bridge->b_device[slot].reg = devreg; - return(0); + pcireg_device_set(pcibr_soft, slot, devreg); + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_DEVREG, pcibr_vhdl, + "pcibr_slot_device_init: Device(%d): 0x%x\n", + slot, devreg)); + return 0; } /* @@ -886,10 +897,10 @@ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; slotp = &pcibr_soft->bs_slot[slot]; @@ -901,7 +912,7 @@ if (pcibr_soft->bs_slot[slot].bss_ninfo < 1) { pcibr_infoh = kmalloc(sizeof (*(pcibr_infoh)), GFP_KERNEL); if ( !pcibr_infoh ) { - return ENOMEM; + return -ENOMEM; } memset(pcibr_infoh, 0, sizeof (*(pcibr_infoh))); @@ -939,7 +950,7 @@ EDGE_LBL_GUEST); } - return(0); + return 0; } @@ -966,13 +977,13 @@ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; if (pcibr_soft->bs_slot[slot].has_host) { - return(EPERM); + return -EPERM; } xconn_vhdl = pcibr_soft->bs_conn; @@ -1018,7 +1029,7 @@ pcibr_soft->bs_slot[slot].slot_status |= SLOT_STARTUP_CMPLT; } - return(error); + return error; } /* @@ -1044,13 +1055,13 @@ pcibr_soft = pcibr_soft_get(pcibr_vhdl); if (!pcibr_soft) - return(EINVAL); + return -EINVAL; if (!PCIBR_VALID_SLOT(pcibr_soft, slot)) - return(EINVAL); + return -EINVAL; if (pcibr_soft->bs_slot[slot].has_host) - return(EPERM); + return -EPERM; nfunc = pcibr_soft->bs_slot[slot].bss_ninfo; pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos; @@ -1105,45 +1116,7 @@ pcibr_soft->bs_slot[slot].slot_status |= SLOT_SHUTDOWN_CMPLT; } - return(error); -} - -/* - * pcibr_slot_attach - * This is a place holder routine to keep track of all the - * slot-specific initialization that needs to be done. - * This is usually called when we want to initialize a new - * PCI card on the bus. - */ -int -pcibr_slot_attach(vertex_hdl_t pcibr_vhdl, - pciio_slot_t slot, - int drv_flags, - char *l1_msg, - int *sub_errorp) -{ - pcibr_soft_t pcibr_soft = pcibr_soft_get(pcibr_vhdl); - int error; - - /* Do not allow a multi-function card to be hot-plug inserted */ - if (pcibr_soft->bs_slot[slot].bss_ninfo > 1) { - if (sub_errorp) - *sub_errorp = EPERM; - return(PCI_MULTI_FUNC_ERR); - } - - /* Call the device attach */ - error = pcibr_slot_call_device_attach(pcibr_vhdl, slot, drv_flags); - if (error) { - if (sub_errorp) - *sub_errorp = error; - if (error == EUNATCH) - return(PCI_NO_DRIVER); - else - return(PCI_SLOT_DRV_ATTACH_ERR); - } - - return(0); + return error; } /* @@ -1166,7 +1139,9 @@ if (error) { if (sub_errorp) *sub_errorp = error; - return(PCI_SLOT_DRV_DETACH_ERR); + if (l1_msg) + ; + return PCI_SLOT_DRV_DETACH_ERR; } /* Recalculate the RBARs for all the devices on the bus since we've @@ -1185,7 +1160,7 @@ (void)pcibr_slot_pcix_rbar_init(pcibr_soft, tmp_slot); } - return (0); + return 0; } @@ -1197,33 +1172,35 @@ * through the valp parameter. */ static int -pcibr_probe_slot_pic(bridge_t *bridge, - cfg_p cfg, - unsigned *valp) +pcibr_probe_slot(pcibr_soft_t pcibr_soft, + cfg_p cfg, + unsigned *valp) { - int rv; - picreg_t p_old_enable = (picreg_t)0, p_new_enable; - extern int snia_badaddr_val(volatile void *, int, volatile void *); - - p_old_enable = bridge->p_int_enable_64; - p_new_enable = p_old_enable & ~(BRIDGE_IMR_PCI_MST_TIMEOUT | PIC_ISR_PCIX_MTOUT); - bridge->p_int_enable_64 = p_new_enable; - - if (bridge->p_err_int_view_64 & (BRIDGE_ISR_PCI_MST_TIMEOUT | PIC_ISR_PCIX_MTOUT)) - bridge->p_int_rst_stat_64 = BRIDGE_IRR_MULTI_CLR; - - if (bridge->p_int_status_64 & (BRIDGE_IRR_PCI_GRP | PIC_PCIX_GRP_CLR)) { - bridge->p_int_rst_stat_64 = (BRIDGE_IRR_PCI_GRP_CLR | PIC_PCIX_GRP_CLR); - (void) bridge->b_wid_tflush; /* flushbus */ - } - rv = snia_badaddr_val((void *) cfg, 4, valp); - if (bridge->p_err_int_view_64 & (BRIDGE_ISR_PCI_MST_TIMEOUT | PIC_ISR_PCIX_MTOUT)) { - bridge->p_int_rst_stat_64 = BRIDGE_IRR_MULTI_CLR; - rv = 1; /* unoccupied slot */ + return pcibr_probe_work(pcibr_soft, (void *)cfg, 4, (void *)valp); +} + +/* + * Probe an offset within a piomap with errors disabled. + * len must be 1, 2, 4, or 8. The probed address must be a multiple of + * len. + * + * Returns: 0 if the offset was probed and put valid data in valp + * -1 if there was a usage error such as improper alignment + * or out of bounds offset/len combination. In this + * case, the map was not probed + * 1 if the offset was probed but resulted in an error + * such as device not responding, bus error, etc. + */ + +int +pcibr_piomap_probe(pcibr_piomap_t piomap, off_t offset, int len, void *valp) +{ + if (offset + len > piomap->bp_mapsz) { + return -1; } - bridge->p_int_enable_64 = p_old_enable; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - return(rv); + + return pcibr_probe_work(piomap->bp_soft, + piomap->bp_kvaddr + offset, len, valp); } /* @@ -1234,11 +1211,31 @@ * through the valp parameter. */ static int -pcibr_probe_slot(bridge_t *bridge, - cfg_p cfg, - unsigned *valp) +pcibr_probe_work(pcibr_soft_t pcibr_soft, + void *addr, + int len, + void *valp) { - return(pcibr_probe_slot_pic(bridge, cfg, valp)); + int rv; + + /* + * Sanity checks ... + */ + + if (len != 1 && len != 2 && len != 4 && len != 8) { + return -1; /* invalid len */ + } + + if ((uint64_t)addr & (len-1)) { + return -1; /* invalid alignment */ + } + + rv = snia_badaddr_val((void *)addr, len, valp); + + /* Clear the int_view register incase it was set */ + pcireg_intr_reset_set(pcibr_soft, BRIDGE_IRR_MULTI_CLR); + + return (rv ? 1 : 0); /* return 1 for snia_badaddr_val error, 0 if ok */ } @@ -1249,7 +1246,6 @@ pcibr_info_t pcibr_info; pciio_function_t func; pcibr_soft_slot_t slotp = &pcibr_soft->bs_slot[slot]; - bridge_t *bridge = pcibr_soft->bs_base; cfg_p cfgw; int nfunc = slotp->bss_ninfo; int bar; @@ -1267,7 +1263,7 @@ s = pcibr_lock(pcibr_soft); /* Disable memory and I/O BARs */ - cfgw = pcibr_func_config_addr(bridge, 0, slot, func, 0); + cfgw = pcibr_func_config_addr(pcibr_soft, 0, slot, func, 0); cmd_reg = do_pcibr_config_get(cfgw, PCI_CFG_COMMAND, 4); cmd_reg &= (PCI_CMD_MEM_SPACE | PCI_CMD_IO_SPACE); do_pcibr_config_set(cfgw, PCI_CFG_COMMAND, 4, cmd_reg); @@ -1277,7 +1273,7 @@ continue; /* Free the PCI bus space */ - pciibr_bus_addr_free(pcibr_soft, &pcibr_info->f_window[bar]); + pcibr_bus_addr_free(&pcibr_info->f_window[bar]); /* Get index of the DevIO(x) register used to access this BAR */ devio_index = pcibr_info->f_window[bar].w_devio_index; @@ -1295,7 +1291,7 @@ /* Free the Expansion ROM PCI bus space */ if(pcibr_info->f_rbase && pcibr_info->f_rsize) { - pciibr_bus_addr_free(pcibr_soft, &pcibr_info->f_rwindow); + pcibr_bus_addr_free(&pcibr_info->f_rwindow); } pcibr_unlock(pcibr_soft, s); @@ -1317,12 +1313,6 @@ slotp->bss_d64_flags = 0; slotp->bss_d32_base = PCIBR_D32_BASE_UNSET; slotp->bss_d32_flags = 0; - - /* Clear out shadow info necessary for the external SSRAM workaround */ - slotp->bss_ext_ates_active = ATOMIC_INIT(0); - slotp->bss_cmd_pointer = 0; - slotp->bss_cmd_shadow = 0; - } @@ -1360,12 +1350,12 @@ ? &win_info_p->w_win_alloc : NULL, start, size, align); - return(iopaddr); + return iopaddr; } void -pciibr_bus_addr_free(pcibr_soft_t pcibr_soft, pciio_win_info_t win_info_p) +pcibr_bus_addr_free(pciio_win_info_t win_info_p) { pciio_device_win_free(&win_info_p->w_win_alloc); } @@ -1381,17 +1371,16 @@ pcibr_soft_t pcibr_soft = pcibr_soft_get(pcibr_vhdl); xwidgetnum_t widget = pcibr_soft->bs_xid; int bricktype = pcibr_soft->bs_bricktype; - int bus = pcibr_soft->bs_busnum; + int bus; - /* - * For PIC there are 2 busses per widget and pcibr_soft->bs_busnum - * will be 0 or 1. For [X]BRIDGE there is 1 bus per widget and - * pcibr_soft->bs_busnum will always be zero. So we add bs_busnum - * to what io_brick_map_widget returns to get the bus number. - */ - if ((bus += io_brick_map_widget(bricktype, widget)) > 0) { - return bus; - } else { + if ((bus = io_brick_map_widget(bricktype, widget)) <= 0) { + printk(KERN_WARNING "pcibr_widget_to_bus() bad bricktype %d\n", bricktype); return 0; } + + /* For PIC there are 2 busses per widget and pcibr_soft->bs_busnum + * will be 0 or 1. Add in the correct PIC bus offset. + */ + bus += pcibr_soft->bs_busnum; + return bus; } diff -Nru a/arch/ia64/sn/io/sn2/pciio.c b/arch/ia64/sn/io/sn2/pciio.c --- a/arch/ia64/sn/io/sn2/pciio.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/io/sn2/pciio.c Tue Feb 17 20:00:08 2004 @@ -304,13 +304,6 @@ (dev, addr, size); } -void -pciio_dmalist_drain(vertex_hdl_t dev, alenlist_t list) -{ - DEV_FUNC(dev, dmalist_drain) - (dev, list); -} - /* ===================================================================== * INTERRUPT MANAGEMENT * @@ -703,30 +696,6 @@ return (pciio_info->c_pops); } -int -pciio_businfo_multi_master_get(pciio_businfo_t businfo) -{ - return businfo->bi_multi_master; -} - -pciio_asic_type_t -pciio_businfo_asic_type_get(pciio_businfo_t businfo) -{ - return businfo->bi_asic_type; -} - -pciio_bus_type_t -pciio_businfo_bus_type_get(pciio_businfo_t businfo) -{ - return businfo->bi_bus_type; -} - -pciio_bus_speed_t -pciio_businfo_bus_speed_get(pciio_businfo_t businfo) -{ - return businfo->bi_bus_speed; -} - /* ===================================================================== * GENERIC PCI INITIALIZATION FUNCTIONS */ @@ -792,9 +761,12 @@ pciio_info = kmalloc(sizeof (*(pciio_info)), GFP_KERNEL); if ( pciio_info ) memset(pciio_info, 0, sizeof (*(pciio_info))); + else { + printk(KERN_WARNING "pciio_device_info_new(): Unable to " + "allocate memory\n"); + return NULL; + } } - ASSERT(pciio_info != NULL); - pciio_info->c_slot = slot; pciio_info->c_func = func; pciio_info->c_vendor = vendor_id; @@ -859,13 +831,8 @@ pciio_info->c_slot, pciio_info->c_func); - hwgraph_edge_remove(connectpt,name,&pconn); pciio_info_set(pconn,0); - /* Remove the link to our pci provider */ - hwgraph_edge_remove(pconn, EDGE_LBL_MASTER, NULL); - - hwgraph_vertex_unref(pconn); hwgraph_vertex_destroy(pconn); @@ -1035,13 +1002,4 @@ pciio_info_type1_get(pciio_info_t pci_info) { return (pci_info->c_type1); -} - -pciio_businfo_t -pciio_businfo_get(vertex_hdl_t conn) -{ - pciio_info_t info; - - info = pciio_info_get(conn); - return DEV_FUNC(conn, businfo_get)(conn); } diff -Nru a/arch/ia64/sn/io/sn2/pic.c b/arch/ia64/sn/io/sn2/pic.c --- a/arch/ia64/sn/io/sn2/pic.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/io/sn2/pic.c Tue Feb 17 20:00:07 2004 @@ -17,12 +17,41 @@ #include #include +extern struct file_operations pcibr_fops; +extern pcibr_list_p pcibr_list; -#define PCI_BUS_NO_1 1 +static int pic_attach2(vertex_hdl_t, void *, vertex_hdl_t, + int, pcibr_soft_t *); + +extern int isIO9(nasid_t); +extern char *dev_to_name(vertex_hdl_t dev, char *buf, uint buflen); +extern int pcibr_widget_to_bus(vertex_hdl_t pcibr_vhdl); +extern pcibr_hints_t pcibr_hints_get(vertex_hdl_t, int); +extern unsigned pcibr_intr_bits(pciio_info_t info, + pciio_intr_line_t lines, int nslots); +extern void pcibr_setwidint(xtalk_intr_t); +extern int pcibr_error_handler_wrapper(error_handler_arg_t, int, + ioerror_mode_t, ioerror_t *); +extern void pcibr_error_intr_handler(intr_arg_t); +extern void pcibr_directmap_init(pcibr_soft_t); +extern int pcibr_slot_info_init(vertex_hdl_t,pciio_slot_t); +extern int pcibr_slot_addr_space_init(vertex_hdl_t,pciio_slot_t); +extern int pcibr_slot_device_init(vertex_hdl_t, pciio_slot_t); +extern int pcibr_slot_pcix_rbar_init(pcibr_soft_t, pciio_slot_t); +extern int pcibr_slot_guest_info_init(vertex_hdl_t,pciio_slot_t); +extern int pcibr_slot_call_device_attach(vertex_hdl_t, + pciio_slot_t, int); +extern void pcibr_rrb_alloc_init(pcibr_soft_t, int, int, int); +extern int pcibr_pcix_rbars_calc(pcibr_soft_t); +extern pcibr_info_t pcibr_device_info_new(pcibr_soft_t, pciio_slot_t, + pciio_function_t, pciio_vendor_id_t, + pciio_device_id_t); +extern int pcibr_initial_rrb(vertex_hdl_t, pciio_slot_t, + pciio_slot_t); +extern void xwidget_error_register(vertex_hdl_t, error_handler_f *, + error_handler_arg_t); +extern void pcibr_clearwidint(pcibr_soft_t); -extern int pcibr_attach2(vertex_hdl_t, bridge_t *, vertex_hdl_t, int, pcibr_soft_t *); -extern void pcibr_driver_reg_callback(vertex_hdl_t, int, int, int); -extern void pcibr_driver_unreg_callback(vertex_hdl_t, int, int, int); /* @@ -30,10 +59,9 @@ */ static int pic_bus1_widget_info_dup(vertex_hdl_t conn_v, vertex_hdl_t peer_conn_v, - cnodeid_t xbow_peer) + cnodeid_t xbow_peer, char *peer_path) { xwidget_info_t widget_info, peer_widget_info; - char peer_path[256]; vertex_hdl_t peer_hubv; hubinfo_t peer_hub_info; @@ -48,7 +76,7 @@ (arbitrary_info_t *)&widget_info) == GRAPH_SUCCESS) { peer_widget_info = kmalloc(sizeof (*(peer_widget_info)), GFP_KERNEL); if ( !peer_widget_info ) { - return 0; + return -ENOMEM; } memset(peer_widget_info, 0, sizeof (*(peer_widget_info))); @@ -96,7 +124,7 @@ char pathname[256], peer_path[256], tmpbuf[256]; char *p; int rc; - vertex_hdl_t peer_conn_v; + vertex_hdl_t peer_conn_v, hubv; int pos; slabid_t slab; @@ -141,9 +169,15 @@ * vertex but that should be safe and we don't * really expect the additions to fail anyway. */ - if (!pic_bus1_widget_info_dup(conn_v, peer_conn_v, xbow_peer)) + if (!pic_bus1_widget_info_dup(conn_v, peer_conn_v, + xbow_peer, peer_path)) return 0; + hubv = cnodeid_to_vertex(xbow_peer); + ASSERT(hubv != GRAPH_VERTEX_NONE); + device_master_set(peer_conn_v, hubv); + xtalk_provider_register(hubv, &hub_provider); + xtalk_provider_startup(hubv); return peer_conn_v; } } @@ -151,12 +185,15 @@ return 0; } - +/* + * PIC has two buses under a single widget. pic_attach() calls pic_attach2() + * to attach each of those buses. + */ int pic_attach(vertex_hdl_t conn_v) { int rc; - bridge_t *bridge0, *bridge1 = (bridge_t *)0; + void *bridge0, *bridge1 = (void *)0; vertex_hdl_t pcibr_vhdl0, pcibr_vhdl1 = (vertex_hdl_t)0; pcibr_soft_t bus0_soft, bus1_soft = (pcibr_soft_t)0; vertex_hdl_t conn_v0, conn_v1, peer_conn_v; @@ -165,9 +202,8 @@ PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, conn_v, "pic_attach()\n")); - bridge0 = (bridge_t *) xtalk_piotrans_addr(conn_v, NULL, - 0, sizeof(bridge_t), 0); - bridge1 = (bridge_t *)((char *)bridge0 + PIC_BUS1_OFFSET); + bridge0 = pcibr_bridge_ptr_get(conn_v, 0); + bridge1 = pcibr_bridge_ptr_get(conn_v, 1); PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, conn_v, "pic_attach: bridge0=0x%lx, bridge1=0x%lx\n", @@ -215,8 +251,23 @@ pciio_provider_startup(pcibr_vhdl0); pciio_provider_startup(pcibr_vhdl1); - pcibr_attach2(conn_v0, bridge0, pcibr_vhdl0, 0, &bus0_soft); - pcibr_attach2(conn_v1, bridge1, pcibr_vhdl1, 1, &bus1_soft); + pic_attach2(conn_v0, bridge0, pcibr_vhdl0, 0, &bus0_soft); + pic_attach2(conn_v1, bridge1, pcibr_vhdl1, 1, &bus1_soft); + + { + /* If we're dual-ported finish duplicating the peer info structure. + * The error handler and arg are done in pic_attach2(). + */ + xwidget_info_t info0, info1; + if (conn_v0 != conn_v1) { /* dual ported */ + info0 = xwidget_info_get(conn_v0); + info1 = xwidget_info_get(conn_v1); + if (info1->w_efunc == (error_handler_f *)NULL) + info1->w_efunc = info0->w_efunc; + if (info1->w_einfo == (error_handler_arg_t)0) + info1->w_einfo = bus1_soft; + } + } /* save a pointer to the PIC's other bus's soft struct */ bus0_soft->bs_peers_soft = bus1_soft; @@ -229,6 +280,506 @@ return 0; } + +/* + * PIC has two buses under a single widget. pic_attach() calls pic_attach2() + * to attach each of those buses. + */ +static int +pic_attach2(vertex_hdl_t xconn_vhdl, void *bridge, + vertex_hdl_t pcibr_vhdl, int busnum, pcibr_soft_t *ret_softp) +{ + vertex_hdl_t ctlr_vhdl; + pcibr_soft_t pcibr_soft; + pcibr_info_t pcibr_info; + xwidget_info_t info; + xtalk_intr_t xtalk_intr; + pcibr_list_p self; + int entry, slot, ibit, i; + vertex_hdl_t noslot_conn; + char devnm[MAXDEVNAME], *s; + pcibr_hints_t pcibr_hints; + picreg_t id; + picreg_t int_enable; + picreg_t pic_ctrl_reg; + + int iobrick_type_get_nasid(nasid_t nasid); + int iomoduleid_get(nasid_t nasid); + int irq; + int cpu; + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, + "pic_attach2: bridge=0x%lx, busnum=%d\n", bridge, busnum)); + + ctlr_vhdl = NULL; + ctlr_vhdl = hwgraph_register(pcibr_vhdl, EDGE_LBL_CONTROLLER, 0, + 0, 0, 0, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0, + (struct file_operations *)&pcibr_fops, (void *)pcibr_vhdl); + ASSERT(ctlr_vhdl != NULL); + + id = pcireg_bridge_id_get(bridge); + hwgraph_info_add_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, + (arbitrary_info_t)XWIDGET_PART_REV_NUM(id)); + + /* + * Get the hint structure; if some NIC callback marked this vertex as + * "hands-off" then we just return here, before doing anything else. + */ + pcibr_hints = pcibr_hints_get(xconn_vhdl, 0); + + if (pcibr_hints && pcibr_hints->ph_hands_off) + return -1; + + /* allocate soft structure to hang off the vertex. Link the new soft + * structure to the pcibr_list linked list + */ + pcibr_soft = kmalloc(sizeof (*(pcibr_soft)), GFP_KERNEL); + if ( !pcibr_soft ) + return -ENOMEM; + + self = kmalloc(sizeof (*(self)), GFP_KERNEL); + if ( !self ) { + kfree(pcibr_soft); + return -ENOMEM; + } + memset(pcibr_soft, 0, sizeof (*(pcibr_soft))); + memset(self, 0, sizeof (*(self))); + + self->bl_soft = pcibr_soft; + self->bl_vhdl = pcibr_vhdl; + self->bl_next = pcibr_list; + pcibr_list = self; + + if (ret_softp) + *ret_softp = pcibr_soft; + + memset(pcibr_soft, 0, sizeof *pcibr_soft); + pcibr_soft_set(pcibr_vhdl, pcibr_soft); + + s = dev_to_name(pcibr_vhdl, devnm, MAXDEVNAME); + pcibr_soft->bs_name = kmalloc(strlen(s) + 1, GFP_KERNEL); + strcpy(pcibr_soft->bs_name, s); + + pcibr_soft->bs_conn = xconn_vhdl; + pcibr_soft->bs_vhdl = pcibr_vhdl; + pcibr_soft->bs_base = (void *)bridge; + pcibr_soft->bs_rev_num = XWIDGET_PART_REV_NUM(id); + pcibr_soft->bs_intr_bits = (pcibr_intr_bits_f *)pcibr_intr_bits; + pcibr_soft->bsi_err_intr = 0; + pcibr_soft->bs_min_slot = 0; + pcibr_soft->bs_max_slot = 3; + pcibr_soft->bs_busnum = busnum; + pcibr_soft->bs_bridge_type = PCIBR_BRIDGETYPE_PIC; + pcibr_soft->bs_int_ate_size = PIC_INTERNAL_ATES; + /* Make sure this is called after setting the bs_base and bs_bridge_type */ + pcibr_soft->bs_bridge_mode = (pcireg_speed_get(pcibr_soft) << 1) | + pcireg_mode_get(pcibr_soft); + + info = xwidget_info_get(xconn_vhdl); + pcibr_soft->bs_xid = xwidget_info_id_get(info); + pcibr_soft->bs_master = xwidget_info_master_get(info); + pcibr_soft->bs_mxid = xwidget_info_masterid_get(info); + + strcpy(pcibr_soft->bs_asic_name, "PIC"); + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, + "pic_attach2: pcibr_soft=0x%lx, mode=0x%x\n", + pcibr_soft, pcibr_soft->bs_bridge_mode)); + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, + "pic_attach2: %s ASIC: rev %s (code=0x%x)\n", + pcibr_soft->bs_asic_name, + (IS_PIC_PART_REV_A(pcibr_soft->bs_rev_num)) ? "A" : + (IS_PIC_PART_REV_B(pcibr_soft->bs_rev_num)) ? "B" : + (IS_PIC_PART_REV_C(pcibr_soft->bs_rev_num)) ? "C" : + "unknown", pcibr_soft->bs_rev_num)); + + /* PV854845: Must clear write request buffer to avoid parity errors */ + for (i=0; i < PIC_WR_REQ_BUFSIZE; i++) { + ((pic_t *)bridge)->p_wr_req_lower[i] = 0; + ((pic_t *)bridge)->p_wr_req_upper[i] = 0; + ((pic_t *)bridge)->p_wr_req_parity[i] = 0; + } + + pcibr_soft->bs_nasid = NASID_GET(bridge); + + pcibr_soft->bs_bricktype = iobrick_type_get_nasid(pcibr_soft->bs_nasid); + if (pcibr_soft->bs_bricktype < 0) + printk(KERN_WARNING "%s: bricktype was unknown by L1 (ret val = 0x%x)\n", + pcibr_soft->bs_name, pcibr_soft->bs_bricktype); + + pcibr_soft->bs_moduleid = iomoduleid_get(pcibr_soft->bs_nasid); + + if (pcibr_soft->bs_bricktype > 0) { + switch (pcibr_soft->bs_bricktype) { + case MODULE_PXBRICK: + case MODULE_IXBRICK: + case MODULE_OPUSBRICK: + pcibr_soft->bs_first_slot = 0; + pcibr_soft->bs_last_slot = 1; + pcibr_soft->bs_last_reset = 1; + + /* Bus 1 of IXBrick has a IO9, so there are 4 devices, not 2 */ + if ((pcibr_widget_to_bus(pcibr_vhdl) == 1) + && isIO9(pcibr_soft->bs_nasid)) { + pcibr_soft->bs_last_slot = 3; + pcibr_soft->bs_last_reset = 3; + } + break; + + case MODULE_CGBRICK: + pcibr_soft->bs_first_slot = 0; + pcibr_soft->bs_last_slot = 0; + pcibr_soft->bs_last_reset = 0; + break; + + default: + printk(KERN_WARNING "%s: Unknown bricktype: 0x%x\n", + pcibr_soft->bs_name, pcibr_soft->bs_bricktype); + break; + } + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, pcibr_vhdl, + "pic_attach2: bricktype=%d, brickbus=%d, " + "slots %d-%d\n", pcibr_soft->bs_bricktype, + pcibr_widget_to_bus(pcibr_vhdl), + pcibr_soft->bs_first_slot, pcibr_soft->bs_last_slot)); + } + + /* + * Initialize bridge and bus locks + */ + spin_lock_init(&pcibr_soft->bs_lock); + + /* + * If we have one, process the hints structure. + */ + if (pcibr_hints) { + unsigned rrb_fixed; + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_HINTS, pcibr_vhdl, + "pic_attach2: pcibr_hints=0x%lx\n", pcibr_hints)); + + rrb_fixed = pcibr_hints->ph_rrb_fixed; + + pcibr_soft->bs_rrb_fixed = rrb_fixed; + + if (pcibr_hints->ph_intr_bits) + pcibr_soft->bs_intr_bits = pcibr_hints->ph_intr_bits; + + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + int hslot = pcibr_hints->ph_host_slot[slot] - 1; + + if (hslot < 0) { + pcibr_soft->bs_slot[slot].host_slot = slot; + } else { + pcibr_soft->bs_slot[slot].has_host = 1; + pcibr_soft->bs_slot[slot].host_slot = hslot; + } + } + } + + /* + * Set-up initial values for state fields + */ + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + pcibr_soft->bs_slot[slot].bss_devio.bssd_space = PCIIO_SPACE_NONE; + pcibr_soft->bs_slot[slot].bss_devio.bssd_ref_cnt = 0; + pcibr_soft->bs_slot[slot].bss_d64_base = PCIBR_D64_BASE_UNSET; + pcibr_soft->bs_slot[slot].bss_d32_base = PCIBR_D32_BASE_UNSET; + pcibr_soft->bs_rrb_valid_dflt[slot][VCHAN0] = -1; + } + + for (ibit = 0; ibit < 8; ++ibit) { + pcibr_soft->bs_intr[ibit].bsi_xtalk_intr = 0; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_soft = pcibr_soft; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_list = NULL; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_ibit = ibit; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_hdlrcnt = 0; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_shared = 0; + pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_connected = 0; + } + + + /* + * connect up our error handler. PIC has 2 busses (thus resulting in 2 + * pcibr_soft structs under 1 widget), so only register a xwidget error + * handler for PIC's bus0. NOTE: for PIC pcibr_error_handler_wrapper() + * is a wrapper routine we register that will call the real error handler + * pcibr_error_handler() with the correct pcibr_soft struct. + */ + if (busnum == 0) { + xwidget_error_register(xconn_vhdl, + pcibr_error_handler_wrapper, pcibr_soft); + } + + /* + * Clear all pending interrupts. Assume all interrupts are from slot 3 + * until otherise setup. + */ + pcireg_intr_reset_set(pcibr_soft, PIC_IRR_ALL_CLR); + pcireg_intr_device_set(pcibr_soft, 0x006db6db); + + /* Setup the mapping register used for direct mapping */ + pcibr_directmap_init(pcibr_soft); + + /* + * Initialize the PICs control register. + */ + pic_ctrl_reg = pcireg_control_get(pcibr_soft); + + /* Bridges Requester ID: bus = busnum, dev = 0, func = 0 */ + pic_ctrl_reg &= ~PIC_CTRL_BUS_NUM_MASK; + pic_ctrl_reg |= PIC_CTRL_BUS_NUM(busnum); + pic_ctrl_reg &= ~PIC_CTRL_DEV_NUM_MASK; + pic_ctrl_reg &= ~PIC_CTRL_FUN_NUM_MASK; + + pic_ctrl_reg &= ~PIC_CTRL_NO_SNOOP; + pic_ctrl_reg &= ~PIC_CTRL_RELAX_ORDER; + + /* enable parity checking on PICs internal RAM */ + pic_ctrl_reg |= PIC_CTRL_PAR_EN_RESP; + pic_ctrl_reg |= PIC_CTRL_PAR_EN_ATE; + + /* PIC BRINGUP WAR (PV# 862253): dont enable write request parity */ + if (!PCIBR_WAR_ENABLED(PV862253, pcibr_soft)) { + pic_ctrl_reg |= PIC_CTRL_PAR_EN_REQ; + } + + pic_ctrl_reg |= PIC_CTRL_PAGE_SIZE; + + pcireg_control_set(pcibr_soft, pic_ctrl_reg); + + /* Initialize internal mapping entries (ie. the ATEs) */ + for (entry = 0; entry < pcibr_soft->bs_int_ate_size; entry++) + pcireg_int_ate_set(pcibr_soft, entry, 0); + + pcibr_soft->bs_int_ate_resource.start = 0; + pcibr_soft->bs_int_ate_resource.end = pcibr_soft->bs_int_ate_size - 1; + + /* Setup the PICs error interrupt handler. */ + xtalk_intr = xtalk_intr_alloc(xconn_vhdl, (device_desc_t)0, pcibr_vhdl); + + ASSERT(xtalk_intr != NULL); + + irq = ((hub_intr_t)xtalk_intr)->i_bit; + cpu = ((hub_intr_t)xtalk_intr)->i_cpuid; + + intr_unreserve_level(cpu, irq); + ((hub_intr_t)xtalk_intr)->i_bit = SGI_PCIBR_ERROR; + xtalk_intr->xi_vector = SGI_PCIBR_ERROR; + + pcibr_soft->bsi_err_intr = xtalk_intr; + + /* + * On IP35 with XBridge, we do some extra checks in pcibr_setwidint + * in order to work around some addressing limitations. In order + * for that fire wall to work properly, we need to make sure we + * start from a known clean state. + */ + pcibr_clearwidint(pcibr_soft); + + xtalk_intr_connect(xtalk_intr, + (intr_func_t) pcibr_error_intr_handler, + (intr_arg_t) pcibr_soft, + (xtalk_intr_setfunc_t) pcibr_setwidint, + (void *) pcibr_soft); + + request_irq(SGI_PCIBR_ERROR, (void *)pcibr_error_intr_handler, SA_SHIRQ, + "PCIBR error", (intr_arg_t) pcibr_soft); + + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_INTR_ALLOC, pcibr_vhdl, + "pcibr_setwidint: target_id=0x%lx, int_addr=0x%lx\n", + pcireg_intr_dst_target_id_get(pcibr_soft), + pcireg_intr_dst_addr_get(pcibr_soft))); + + /* now we can start handling error interrupts */ + int_enable = pcireg_intr_enable_get(pcibr_soft); + int_enable |= PIC_ISR_ERRORS; + + /* PIC BRINGUP WAR (PV# 856864 & 856865): allow the tnums that are + * locked out to be freed up sooner (by timing out) so that the + * read tnums are never completely used up. + */ + if (PCIBR_WAR_ENABLED(PV856864, pcibr_soft)) { + int_enable &= ~PIC_ISR_PCIX_REQ_TOUT; + int_enable &= ~PIC_ISR_XREAD_REQ_TIMEOUT; + + pcireg_req_timeout_set(pcibr_soft, 0x750); + } + + pcireg_intr_enable_set(pcibr_soft, int_enable); + pcireg_intr_mode_set(pcibr_soft, 0); /* dont send 'clear interrupt' pkts */ + pcireg_tflush_get(pcibr_soft); /* wait until Bridge PIO complete */ + + /* + * PIC BRINGUP WAR (PV# 856866, 859504, 861476, 861478): Don't use + * RRB0, RRB8, RRB1, and RRB9. Assign them to DEVICE[2|3]--VCHAN3 + * so they are not used. This works since there is currently no + * API to penable VCHAN3. + */ + if (PCIBR_WAR_ENABLED(PV856866, pcibr_soft)) { + pcireg_rrb_bit_set(pcibr_soft, 0, 0x000f000f); /* even rrb reg */ + pcireg_rrb_bit_set(pcibr_soft, 1, 0x000f000f); /* odd rrb reg */ + } + + /* PIC only supports 64-bit direct mapping in PCI-X mode. Since + * all PCI-X devices that initiate memory transactions must be + * capable of generating 64-bit addressed, we force 64-bit DMAs. + */ + pcibr_soft->bs_dma_flags = 0; + if (IS_PCIX(pcibr_soft)) { + pcibr_soft->bs_dma_flags |= PCIIO_DMA_A64; + } + + { + + iopaddr_t prom_base_addr = pcibr_soft->bs_xid << 24; + int prom_base_size = 0x1000000; + int status; + struct resource *res; + + /* Allocate resource maps based on bus page size; for I/O and memory + * space, free all pages except those in the base area and in the + * range set by the PROM. + * + * PROM creates BAR addresses in this format: 0x0ws00000 where w is + * the widget number and s is the device register offset for the slot. + */ + + /* Setup the Bus's PCI IO Root Resource. */ + pcibr_soft->bs_io_win_root_resource.start = PCIBR_BUS_IO_BASE; + pcibr_soft->bs_io_win_root_resource.end = 0xffffffff; + res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); + if (!res) + panic("PCIBR:Unable to allocate resource structure\n"); + + /* Block off the range used by PROM. */ + res->start = prom_base_addr; + res->end = prom_base_addr + (prom_base_size - 1); + status = request_resource(&pcibr_soft->bs_io_win_root_resource, res); + if (status) + panic("PCIBR:Unable to request_resource()\n"); + + /* Setup the Small Window Root Resource */ + pcibr_soft->bs_swin_root_resource.start = PAGE_SIZE; + pcibr_soft->bs_swin_root_resource.end = 0x000FFFFF; + + /* Setup the Bus's PCI Memory Root Resource */ + pcibr_soft->bs_mem_win_root_resource.start = 0x200000; + pcibr_soft->bs_mem_win_root_resource.end = 0xffffffff; + res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); + if (!res) + panic("PCIBR:Unable to allocate resource structure\n"); + + /* Block off the range used by PROM. */ + res->start = prom_base_addr; + res->end = prom_base_addr + (prom_base_size - 1);; + status = request_resource(&pcibr_soft->bs_mem_win_root_resource, res); + if (status) + panic("PCIBR:Unable to request_resource()\n"); + + } + + + /* build "no-slot" connection point */ + pcibr_info = pcibr_device_info_new(pcibr_soft, PCIIO_SLOT_NONE, + PCIIO_FUNC_NONE, PCIIO_VENDOR_ID_NONE, PCIIO_DEVICE_ID_NONE); + noslot_conn = pciio_device_info_register(pcibr_vhdl, &pcibr_info->f_c); + + /* Store no slot connection point info for tearing it down during detach. */ + pcibr_soft->bs_noslot_conn = noslot_conn; + pcibr_soft->bs_noslot_info = pcibr_info; + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Find out what is out there */ + (void)pcibr_slot_info_init(pcibr_vhdl, slot); + } + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Set up the address space for this slot in the PCI land */ + (void)pcibr_slot_addr_space_init(pcibr_vhdl, slot); + } + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Setup the device register */ + (void)pcibr_slot_device_init(pcibr_vhdl, slot); + } + + if (IS_PCIX(pcibr_soft)) { + pcibr_soft->bs_pcix_rbar_inuse = 0; + pcibr_soft->bs_pcix_rbar_avail = NUM_RBAR; + pcibr_soft->bs_pcix_rbar_percent_allowed = + pcibr_pcix_rbars_calc(pcibr_soft); + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Setup the PCI-X Read Buffer Attribute Registers (RBARs) */ + (void)pcibr_slot_pcix_rbar_init(pcibr_soft, slot); + } + } + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Setup host/guest relations */ + (void)pcibr_slot_guest_info_init(pcibr_vhdl, slot); + } + + /* Handle initial RRB management */ + pcibr_initial_rrb(pcibr_vhdl, + pcibr_soft->bs_first_slot, pcibr_soft->bs_last_slot); + + /* Before any drivers get called that may want to re-allocate RRB's, + * let's get some special cases pre-allocated. Drivers may override + * these pre-allocations, but by doing pre-allocations now we're + * assured not to step all over what the driver intended. + */ + if (pcibr_soft->bs_bricktype > 0) { + switch (pcibr_soft->bs_bricktype) { + case MODULE_PXBRICK: + case MODULE_IXBRICK: + case MODULE_OPUSBRICK: + /* + * If IO9 in bus 1, allocate RRBs to all the IO9 devices + */ + if ((pcibr_widget_to_bus(pcibr_vhdl) == 1) && + (pcibr_soft->bs_slot[0].bss_vendor_id == 0x10A9) && + (pcibr_soft->bs_slot[0].bss_device_id == 0x100A)) { + pcibr_rrb_alloc_init(pcibr_soft, 0, VCHAN0, 4); + pcibr_rrb_alloc_init(pcibr_soft, 1, VCHAN0, 4); + pcibr_rrb_alloc_init(pcibr_soft, 2, VCHAN0, 4); + pcibr_rrb_alloc_init(pcibr_soft, 3, VCHAN0, 4); + } else { + pcibr_rrb_alloc_init(pcibr_soft, 0, VCHAN0, 4); + pcibr_rrb_alloc_init(pcibr_soft, 1, VCHAN0, 4); + } + break; + + case MODULE_CGBRICK: + pcibr_rrb_alloc_init(pcibr_soft, 0, VCHAN0, 8); + break; + } /* switch */ + } + + + for (slot = pcibr_soft->bs_min_slot; + slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { + /* Call the device attach */ + (void)pcibr_slot_call_device_attach(pcibr_vhdl, slot, 0); + } + + pciio_device_attach(noslot_conn, 0); + + return 0; +} + + /* * pci provider functions * @@ -237,6 +788,8 @@ */ pciio_provider_t pci_pic_provider = { + PCIIO_ASIC_TYPE_PIC, + (pciio_piomap_alloc_f *) pcibr_piomap_alloc, (pciio_piomap_free_f *) pcibr_piomap_free, (pciio_piomap_addr_f *) pcibr_piomap_addr, @@ -252,7 +805,6 @@ (pciio_dmatrans_addr_f *) pcibr_dmatrans_addr, (pciio_dmamap_drain_f *) pcibr_dmamap_drain, (pciio_dmaaddr_drain_f *) pcibr_dmaaddr_drain, - (pciio_dmalist_drain_f *) pcibr_dmalist_drain, (pciio_intr_alloc_f *) pcibr_intr_alloc, (pciio_intr_free_f *) pcibr_intr_free, @@ -263,12 +815,12 @@ (pciio_provider_startup_f *) pcibr_provider_startup, (pciio_provider_shutdown_f *) pcibr_provider_shutdown, (pciio_reset_f *) pcibr_reset, - (pciio_write_gather_flush_f *) pcibr_write_gather_flush, (pciio_endian_set_f *) pcibr_endian_set, - (pciio_priority_set_f *) pcibr_priority_set, (pciio_config_get_f *) pcibr_config_get, (pciio_config_set_f *) pcibr_config_set, - (pciio_error_extract_f *) 0, + + (pciio_error_extract_f *) pcibr_error_extract, + (pciio_driver_reg_callback_f *) pcibr_driver_reg_callback, (pciio_driver_unreg_callback_f *) pcibr_driver_unreg_callback, (pciio_device_unregister_f *) pcibr_device_unregister, diff -Nru a/arch/ia64/sn/io/sn2/shuberror.c b/arch/ia64/sn/io/sn2/shuberror.c --- a/arch/ia64/sn/io/sn2/shuberror.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/io/sn2/shuberror.c Tue Feb 17 20:00:08 2004 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff -Nru a/arch/ia64/sn/io/sn2/xbow.c b/arch/ia64/sn/io/sn2/xbow.c --- a/arch/ia64/sn/io/sn2/xbow.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/io/sn2/xbow.c Tue Feb 17 20:00:06 2004 @@ -9,11 +9,15 @@ #include #include #include +#include +#include +#include #include #include #include #include #include +#include /* #define DEBUG 1 */ /* #define XBOW_DEBUG 1 */ diff -Nru a/arch/ia64/sn/io/sn2/xtalk.c b/arch/ia64/sn/io/sn2/xtalk.c --- a/arch/ia64/sn/io/sn2/xtalk.c Tue Feb 17 20:00:05 2004 +++ b/arch/ia64/sn/io/sn2/xtalk.c Tue Feb 17 20:00:05 2004 @@ -30,9 +30,6 @@ * completely disappear. */ -#define NEW(ptr) (ptr = kmalloc(sizeof (*(ptr)), GFP_KERNEL)) -#define DEL(ptr) (kfree(ptr)) - char widget_info_fingerprint[] = "widget_info"; /* ===================================================================== @@ -50,13 +47,10 @@ xtalk_dmamap_t xtalk_dmamap_alloc(vertex_hdl_t, device_desc_t, size_t, unsigned); void xtalk_dmamap_free(xtalk_dmamap_t); iopaddr_t xtalk_dmamap_addr(xtalk_dmamap_t, paddr_t, size_t); -alenlist_t xtalk_dmamap_list(xtalk_dmamap_t, alenlist_t, unsigned); void xtalk_dmamap_done(xtalk_dmamap_t); iopaddr_t xtalk_dmatrans_addr(vertex_hdl_t, device_desc_t, paddr_t, size_t, unsigned); -alenlist_t xtalk_dmatrans_list(vertex_hdl_t, device_desc_t, alenlist_t, unsigned); void xtalk_dmamap_drain(xtalk_dmamap_t); void xtalk_dmaaddr_drain(vertex_hdl_t, iopaddr_t, size_t); -void xtalk_dmalist_drain(vertex_hdl_t, alenlist_t); xtalk_intr_t xtalk_intr_alloc(vertex_hdl_t, device_desc_t, vertex_hdl_t); xtalk_intr_t xtalk_intr_alloc_nothd(vertex_hdl_t, device_desc_t, vertex_hdl_t); void xtalk_intr_free(xtalk_intr_t); @@ -355,16 +349,6 @@ } -alenlist_t -xtalk_dmamap_list(xtalk_dmamap_t xtalk_dmamap, /* use these mapping resources */ - alenlist_t alenlist, /* map this Address/Length List */ - unsigned flags) -{ - return DMAMAP_FUNC(xtalk_dmamap, dmamap_list) - (CAST_DMAMAP(xtalk_dmamap), alenlist, flags); -} - - void xtalk_dmamap_done(xtalk_dmamap_t xtalk_dmamap) { @@ -385,16 +369,6 @@ } -alenlist_t -xtalk_dmatrans_list(vertex_hdl_t dev, /* translate for this device */ - device_desc_t dev_desc, /* device descriptor */ - alenlist_t palenlist, /* system address/length list */ - unsigned flags) -{ /* defined in dma.h */ - return DEV_FUNC(dev, dmatrans_list) - (dev, dev_desc, palenlist, flags); -} - void xtalk_dmamap_drain(xtalk_dmamap_t map) { @@ -409,13 +383,6 @@ (dev, addr, size); } -void -xtalk_dmalist_drain(vertex_hdl_t dev, alenlist_t list) -{ - DEV_FUNC(dev, dmalist_drain) - (dev, list); -} - /* ===================================================================== * INTERRUPT MANAGEMENT * @@ -855,7 +822,9 @@ char *s,devnm[MAXDEVNAME]; /* Allocate widget_info and associate it with widget vertex */ - NEW(widget_info); + widget_info = kmalloc(sizeof(*widget_info), GFP_KERNEL); + if (!widget_info) + return - ENOMEM; /* Initialize widget_info */ widget_info->w_vertex = widget; @@ -898,16 +867,13 @@ /* Make sure that we have valid widget information initialized */ if (!(widget_info = xwidget_info_get(widget))) - return(1); + return 1; hwid = &(widget_info->w_hwid); - /* Clean out the xwidget information */ - (void)kfree(widget_info->w_name); - memset((void *)widget_info, 0, sizeof(widget_info)); - DEL(widget_info); - - return(0); + kfree(widget_info->w_name); + kfree(widget_info); + return 0; } void diff -Nru a/arch/ia64/sn/io/xswitch.c b/arch/ia64/sn/io/xswitch.c --- a/arch/ia64/sn/io/xswitch.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/io/xswitch.c Tue Feb 17 20:00:06 2004 @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -18,8 +19,6 @@ #include #include -#define NEW(ptr) (ptr = kmalloc(sizeof (*(ptr)), GFP_KERNEL)) -#define DEL(ptr) (kfree(ptr)) /* * This file provides generic support for Crosstalk @@ -118,7 +117,12 @@ if (xswitch_info == NULL) { int port; - NEW(xswitch_info); + xswitch_info = kmalloc(sizeof(*xswitch_info), GFP_KERNEL); + if (!xswitch_info) { + printk(KERN_WARNING "xswitch_info_new(): Unable to " + "allocate memory\n"); + return NULL; + } xswitch_info->census = 0; for (port = 0; port <= XSWITCH_CENSUS_PORT_MAX; port++) { xswitch_info_vhdl_set(xswitch_info, port, diff -Nru a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c --- a/arch/ia64/sn/kernel/bte.c Tue Feb 17 20:00:07 2004 +++ b/arch/ia64/sn/kernel/bte.c Tue Feb 17 20:00:07 2004 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include #include diff -Nru a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c --- a/arch/ia64/sn/kernel/irq.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/kernel/irq.c Tue Feb 17 20:00:06 2004 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -40,8 +41,12 @@ extern void pcibr_force_interrupt(pcibr_intr_t intr); extern int sn_force_interrupt_flag; -static pcibr_intr_list_t *pcibr_intr_list; +struct sn_intr_list_t { + struct sn_intr_list_t *next; + pcibr_intr_t intr; +}; +static struct sn_intr_list_t *sn_intr_list[NR_IRQS]; static unsigned int @@ -114,30 +119,24 @@ } static void -sn_set_affinity_irq(unsigned int irq, cpumask_t mask) +sn_set_affinity_irq(unsigned int irq, unsigned long cpu) { -#if CONFIG_SMP - int redir = 0; - pcibr_intr_list_t p = pcibr_intr_list[irq]; - pcibr_intr_t intr; - int cpu; - extern void sn_shub_redirect_intr(pcibr_intr_t intr, unsigned long cpu); - extern void sn_tio_redirect_intr(pcibr_intr_t intr, unsigned long cpu); - +#if CONFIG_SMP + int redir = 0; + struct sn_intr_list_t *p = sn_intr_list[irq]; + pcibr_intr_t intr; + extern void sn_shub_redirect_intr(pcibr_intr_t intr, unsigned long cpu); + extern void sn_tio_redirect_intr(pcibr_intr_t intr, unsigned long cpu); + if (p == NULL) return; - intr = p->il_intr; + intr = p->intr; if (intr == NULL) return; - cpu = first_cpu(mask); - if (IS_PIC_SOFT(intr->bi_soft) ) { - sn_shub_redirect_intr(intr, cpu); - } else { - return; - } + sn_shub_redirect_intr(intr, cpu); (void) set_irq_affinity_info(irq, cpu_physical_id(intr->bi_cpu), redir); #endif /* CONFIG_SMP */ } @@ -156,7 +155,8 @@ struct irq_desc * -sn_irq_desc(unsigned int irq) { +sn_irq_desc(unsigned int irq) +{ irq = SN_IVEC_FROM_IRQ(irq); @@ -164,12 +164,14 @@ } u8 -sn_irq_to_vector(u8 irq) { +sn_irq_to_vector(u8 irq) +{ return(irq); } unsigned int -sn_local_vector_to_irq(u8 vector) { +sn_local_vector_to_irq(u8 vector) +{ return (CPU_VECTOR_TO_IRQ(smp_processor_id(), vector)); } @@ -179,7 +181,7 @@ int i; irq_desc_t *base_desc = _irq_desc; - for (i=IA64_FIRST_DEVICE_VECTOR; ibi_cpu; + if (pdacpu(cpu)->sn_last_irq < irq) { pdacpu(cpu)->sn_last_irq = irq; } - if (pdacpu(cpu)->sn_first_irq > irq) pdacpu(cpu)->sn_first_irq = irq; - if (!p) panic("Could not allocate memory for pcibr_intr_list_t\n"); - if ((list = pcibr_intr_list[irq])) { - while (list->il_next) list = list->il_next; - list->il_next = p; - p->il_next = NULL; - p->il_intr = intr; + if (pdacpu(cpu)->sn_first_irq == 0 || pdacpu(cpu)->sn_first_irq > irq) pdacpu(cpu)->sn_first_irq = irq; + if (!p) panic("Could not allocate memory for sn_intr_list_t\n"); + if ((list = sn_intr_list[irq])) { + while (list->next) list = list->next; + list->next = p; + p->next = NULL; + p->intr = intr; } else { - pcibr_intr_list[irq] = p; - p->il_next = NULL; - p->il_intr = intr; + sn_intr_list[irq] = p; + p->next = NULL; + p->intr = intr; } } void -force_polled_int(void) { +force_polled_int(void) +{ int i; - pcibr_intr_list_t p; + struct sn_intr_list_t *p; for (i=0; iil_intr){ - pcibr_force_interrupt(p->il_intr); + if (p->intr){ + pcibr_force_interrupt(p->intr); } - p = p->il_next; + p = p->next; } } } static void -force_interrupt(int irq) { - pcibr_intr_list_t p = pcibr_intr_list[irq]; +force_interrupt(int irq) +{ + struct sn_intr_list_t *p = sn_intr_list[irq]; while (p) { - if (p->il_intr) { - pcibr_force_interrupt(p->il_intr); + if (p->intr) { + pcibr_force_interrupt(p->intr); } - p = p->il_next; + p = p->next; } } @@ -255,14 +253,15 @@ */ static void -sn_check_intr(int irq, pcibr_intr_t intr) { +sn_check_intr(int irq, pcibr_intr_t intr) +{ unsigned long regval; int irr_reg_num; int irr_bit; unsigned long irr_reg; - regval = pcireg_intr_status_get(intr->bi_soft->bs_base); + regval = pcireg_intr_status_get(intr->bi_soft); irr_reg_num = irq_to_vector(irq) / 64; irr_bit = irq_to_vector(irq) % 64; switch (irr_reg_num) { @@ -294,68 +293,20 @@ } void -sn_lb_int_war_check(void) { +sn_lb_int_war_check(void) +{ int i; if (pda->sn_first_irq == 0) return; for (i=pda->sn_first_irq; i <= pda->sn_last_irq; i++) { - pcibr_intr_list_t p = pcibr_intr_list[i]; + struct sn_intr_list_t *p = sn_intr_list[i]; if (p == NULL) { continue; } while (p) { - sn_check_intr(i, p->il_intr); - p = p->il_next; + sn_check_intr(i, p->intr); + p = p->next; } } -} - -static inline int -sn_get_next_bit(void) { - int i; - int bit; - - for (i = 3; i >= 0; i--) { - if (pda->sn_soft_irr[i] != 0) { - bit = (i * 64) + __ffs(pda->sn_soft_irr[i]); - __change_bit(bit, (volatile void *)pda->sn_soft_irr); - return(bit); - } - } - return IA64_SPURIOUS_INT_VECTOR; -} - -void -sn_set_tpr(int vector) { - if (vector > IA64_LAST_DEVICE_VECTOR || vector < IA64_FIRST_DEVICE_VECTOR) { - ia64_setreg(_IA64_REG_CR_TPR, vector); - } else { - ia64_setreg(_IA64_REG_CR_TPR, IA64_LAST_DEVICE_VECTOR); - } -} - -static inline void -sn_get_all_ivr(void) { - int vector; - - vector = ia64_get_ivr(); - while (vector != IA64_SPURIOUS_INT_VECTOR) { - __set_bit(vector, (volatile void *)pda->sn_soft_irr); - ia64_eoi(); - if (vector > IA64_LAST_DEVICE_VECTOR) return; - vector = ia64_get_ivr(); - } -} - -int -sn_get_ivr(void) { - int vector; - - vector = sn_get_next_bit(); - if (vector == IA64_SPURIOUS_INT_VECTOR) { - sn_get_all_ivr(); - vector = sn_get_next_bit(); - } - return vector; } diff -Nru a/arch/ia64/sn/kernel/mca.c b/arch/ia64/sn/kernel/mca.c --- a/arch/ia64/sn/kernel/mca.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/kernel/mca.c Tue Feb 17 20:00:06 2004 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -65,20 +66,6 @@ printk("%s", buf); return len; } - - - -/* - * ia64_sn2_platform_plat_specific_err_print - * - * Called by the MCA handler to log platform-specific errors. - */ -void -ia64_sn2_platform_plat_specific_err_print(int header_len, int sect_len, u8 *p_data, prfunc_t prfunc) -{ - ia64_sn_plat_specific_err_print(print_hook, p_data - sect_len); -} - static void diff -Nru a/arch/ia64/sn/kernel/probe.c b/arch/ia64/sn/kernel/probe.c --- a/arch/ia64/sn/kernel/probe.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/kernel/probe.c Tue Feb 17 20:00:06 2004 @@ -8,6 +8,7 @@ * Copyright (c) 2000-2003 Silicon Graphics, Inc. All rights reserved. */ +#include #include /** diff -Nru a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c --- a/arch/ia64/sn/kernel/setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/kernel/setup.c Tue Feb 17 20:00:06 2004 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -50,8 +51,6 @@ DEFINE_PER_CPU(struct pda_s, pda_percpu); -#define pxm_to_nasid(pxm) ((pxm)<<1) - #define MAX_PHYS_MEMORY (1UL << 49) /* 1 TB */ extern void bte_init_node (nodepda_t *, cnodeid_t); @@ -61,6 +60,8 @@ extern void init_platform_hubinfo(nodepda_t **nodepdaindr); extern void (*ia64_mark_idle)(int); extern void snidle(int); +extern unsigned char acpi_kbd_controller_present; + unsigned long sn_rtc_cycles_per_second; @@ -70,8 +71,9 @@ short physical_node_map[MAX_PHYSNODE_ID]; -int numionodes; +EXPORT_SYMBOL(physical_node_map); +int numionodes; /* * This is the address of the RRegs in the HSpace of the global * master. It is used by a hack in serial.c (serial_[in|out], @@ -120,6 +122,29 @@ char drive_info[4*16]; #endif +/* + * This routine can only be used during init, since + * smp_boot_data is an init data structure. + * We have to use smp_boot_data.cpu_phys_id to find + * the physical id of the processor because the normal + * cpu_physical_id() relies on data structures that + * may not be initialized yet. + */ + +static int +pxm_to_nasid(int pxm) +{ + int i; + int nid; + + nid = pxm_to_nid_map[pxm]; + for (i = 0; i < num_node_memblks; i++) { + if (node_memblk[i].nid == nid) { + return NASID_GET(node_memblk[i].start_paddr); + } + } + return -1; +} /** * early_sn_setup - early setup routine for SN platforms * @@ -223,6 +248,22 @@ extern void sn_cpu_init(void); extern nasid_t snia_get_console_nasid(void); + /* + * If the generic code has enabled vga console support - lets + * get rid of it again. This is a kludge for the fact that ACPI + * currtently has no way of informing us if legacy VGA is available + * or not. + */ +#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) + if (conswitchp == &vga_con) { + printk(KERN_DEBUG "SGI: Disabling VGA console\n"); +#ifdef CONFIG_DUMMY_CONSOLE + conswitchp = &dummy_con; +#else + conswitchp = NULL; +#endif /* CONFIG_DUMMY_CONSOLE */ + } +#endif /* def(CONFIG_VT) && def(CONFIG_VGA_CONSOLE) */ MAX_DMA_ADDRESS = PAGE_OFFSET + MAX_PHYS_MEMORY; @@ -231,6 +272,19 @@ if (pxm_to_nid_map[pxm] != -1) physical_node_map[pxm_to_nasid(pxm)] = pxm_to_nid_map[pxm]; + + /* + * Old PROMs do not provide an ACPI FADT. Disable legacy keyboard + * support here so we don't have to listen to failed keyboard probe + * messages. + */ + if ((major < 2 || (major == 2 && minor <= 9)) && + acpi_kbd_controller_present) { + printk(KERN_INFO "Disabling legacy keyboard support as prom " + "is too old and doesn't provide FADT\n"); + acpi_kbd_controller_present = 0; + } + printk("SGI SAL version %x.%02x\n", major, minor); /* @@ -277,11 +331,6 @@ */ sn_init_pdas(cmdline_p); - /* - * Check for WARs. - */ - sn_check_for_wars(); - ia64_mark_idle = &snidle; /* @@ -340,7 +389,7 @@ /* * Now copy the array of nodepda pointers to each nodepda. */ - for (cnode=0; cnode < numnodes; cnode++) + for (cnode=0; cnode < numionodes; cnode++) memcpy(nodepdaindr[cnode]->pernode_pdaindr, nodepdaindr, sizeof(nodepdaindr)); @@ -371,7 +420,8 @@ int cpuphyid; int nasid; int slice; - int cnode, i; + int cnode; + static int wars_have_been_checked; /* * The boot cpu makes this call again after platform initialization is @@ -393,12 +443,24 @@ pda->hb_count = HZ/2; pda->hb_state = 0; pda->idle_flag = 0; + + if (cpuid != 0){ + memcpy(pda->cnodeid_to_nasid_table, pdacpu(0)->cnodeid_to_nasid_table, + sizeof(pda->cnodeid_to_nasid_table)); + } + + /* + * Check for WARs. + * Only needs to be done once, on BSP. + * Has to be done after loop above, because it uses pda.cnodeid_to_nasid_table[i]. + * Has to be done before assignment below. + */ + if (!wars_have_been_checked) { + sn_check_for_wars(); + wars_have_been_checked = 1; + } pda->shub_1_1_found = shub_1_1_found; - memset(pda->cnodeid_to_nasid_table, -1, sizeof(pda->cnodeid_to_nasid_table)); - for (i=0; icnodeid_to_nasid_table[i] = pxm_to_nasid(nid_to_pxm_map[i]); - if (local_node_data->active_cpu_count == 1) nodepda->node_first_cpu = cpuid; @@ -437,8 +499,10 @@ */ void -scan_for_ionodes(void) { +scan_for_ionodes(void) +{ int nasid = 0; + lboard_t *brd; /* Setup ionodes with memory */ for (nasid = 0; nasid < MAX_PHYSNODE_ID; nasid +=2) { @@ -450,12 +514,40 @@ klgraph_header = cnodeid = -1; klgraph_header = ia64_sn_get_klconfig_addr(nasid); - if (klgraph_header <= 0) + if (klgraph_header <= 0) { + if ( IS_RUNNING_ON_SIMULATOR() ) + continue; BUG(); /* All nodes must have klconfig tables! */ + } cnodeid = nasid_to_cnodeid(nasid); root_lboard[cnodeid] = (lboard_t *) NODE_OFFSET_TO_LBOARD( (nasid), ((kl_config_hdr_t *)(klgraph_header))-> ch_board_info); + } + + /* Scan headless/memless IO Nodes. */ + for (nasid = 0; nasid < MAX_PHYSNODE_ID; nasid +=2) { + /* if there's no nasid, don't try to read the klconfig on the node */ + if (physical_node_map[nasid] == -1) continue; + brd = find_lboard_any((lboard_t *)root_lboard[nasid_to_cnodeid(nasid)], KLTYPE_SNIA); + if (brd) { + brd = KLCF_NEXT_ANY(brd); /* Skip this node's lboard */ + if (!brd) + continue; + } + + brd = find_lboard_any(brd, KLTYPE_SNIA); + while (brd) { + pda->cnodeid_to_nasid_table[numionodes] = brd->brd_nasid; + physical_node_map[brd->brd_nasid] = numionodes; + root_lboard[numionodes] = brd; + numionodes++; + brd = KLCF_NEXT_ANY(brd); + if (!brd) + break; + + brd = find_lboard_any(brd, KLTYPE_SNIA); + } } } diff -Nru a/arch/ia64/sn/kernel/sn2/cache.c b/arch/ia64/sn/kernel/sn2/cache.c --- a/arch/ia64/sn/kernel/sn2/cache.c Tue Feb 17 20:00:14 2004 +++ b/arch/ia64/sn/kernel/sn2/cache.c Tue Feb 17 20:00:14 2004 @@ -6,7 +6,7 @@ * Copyright (C) 2001-2003 Silicon Graphics, Inc. All rights reserved. * */ - +#include #include /** diff -Nru a/arch/ia64/sn/kernel/sn2/io.c b/arch/ia64/sn/kernel/sn2/io.c --- a/arch/ia64/sn/kernel/sn2/io.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/kernel/sn2/io.c Tue Feb 17 20:00:08 2004 @@ -23,6 +23,10 @@ #undef __sn_readw #undef __sn_readl #undef __sn_readq +#undef __sn_readb_relaxed +#undef __sn_readw_relaxed +#undef __sn_readl_relaxed +#undef __sn_readq_relaxed unsigned int __sn_inb (unsigned long port) @@ -82,6 +86,30 @@ __sn_readq (void *addr) { return ___sn_readq (addr); +} + +unsigned char +__sn_readb_relaxed (void *addr) +{ + return ___sn_readb_relaxed (addr); +} + +unsigned short +__sn_readw_relaxed (void *addr) +{ + return ___sn_readw_relaxed (addr); +} + +unsigned int +__sn_readl_relaxed (void *addr) +{ + return ___sn_readl_relaxed (addr); +} + +unsigned long +__sn_readq_relaxed (void *addr) +{ + return ___sn_readq_relaxed (addr); } #endif diff -Nru a/arch/ia64/sn/kernel/sn2/prominfo_proc.c b/arch/ia64/sn/kernel/sn2/prominfo_proc.c --- a/arch/ia64/sn/kernel/sn2/prominfo_proc.c Tue Feb 17 20:00:06 2004 +++ b/arch/ia64/sn/kernel/sn2/prominfo_proc.c Tue Feb 17 20:00:06 2004 @@ -14,6 +14,7 @@ #include #include #include +#include #include /* to lookup nasids */ diff -Nru a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c --- a/arch/ia64/sn/kernel/sn2/sn2_smp.c Tue Feb 17 20:00:08 2004 +++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c Tue Feb 17 20:00:08 2004 @@ -5,7 +5,7 @@ * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 2000-2003 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2000-2004 Silicon Graphics, Inc. All rights reserved. */ #include @@ -21,11 +21,14 @@ #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -66,14 +69,56 @@ * * Purges the translation caches of all processors of the given virtual address * range. + * + * Note: + * - cpu_vm_mask is a bit mask that indicates which cpus have loaded the context. + * - cpu_vm_mask is converted into a nodemask of the nodes containing the + * cpus in cpu_vm_mask. + * - if only one bit is set in cpu_vm_mask & it is the current cpu, + * then only the local TLB needs to be flushed. This flushing can be done + * using ptc.l. This is the common case & avoids the global spinlock. + * - if multiple cpus have loaded the context, then flushing has to be + * done with ptc.g/MMRs under protection of the global ptc_lock. */ void sn2_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits) { - int cnode, mycnode, nasid, flushed=0; + int i, cnode, mynasid, cpu, lcpu=0, nasid, flushed=0; volatile unsigned long *ptc0, *ptc1; unsigned long flags=0, data0, data1; + struct mm_struct *mm=current->active_mm; + short nasids[NR_NODES], nix; + DECLARE_BITMAP(nodes_flushed, NR_NODES); + + CLEAR_BITMAP(nodes_flushed, NR_NODES); + + i = 0; + + for_each_cpu_mask(cpu, mm->cpu_vm_mask) { + cnode = cpu_to_node(cpu); + __set_bit(cnode, nodes_flushed); + lcpu = cpu; + i++; + } + + preempt_disable(); + + if (likely(i == 1 && lcpu == smp_processor_id())) { + do { + ia64_ptcl(start, nbits<<2); + start += (1UL << nbits); + } while (start < end); + ia64_srlz_i(); + preempt_enable(); + return; + } + + nix = 0; + for (cnode=find_first_bit(&nodes_flushed, NR_NODES); cnode < NR_NODES; + cnode=find_next_bit(&nodes_flushed, NR_NODES, ++cnode)) + nasids[nix++] = cnodeid_to_nasid(cnode); + data0 = (1UL< +#include #include diff -Nru a/arch/m68k/Kconfig b/arch/m68k/Kconfig --- a/arch/m68k/Kconfig Tue Feb 17 20:00:07 2004 +++ b/arch/m68k/Kconfig Tue Feb 17 20:00:07 2004 @@ -1012,50 +1012,7 @@ config USERIAL bool "Support for user serial device modules" -config WATCHDOG - bool "Watchdog Timer Support" - ---help--- - If you say Y here (and to one of the following options) and create a - character special file /dev/watchdog with major number 10 and minor - number 130 using mknod ("man mknod"), you will get a watchdog, i.e.: - subsequently opening the file and then failing to write to it for - longer than 1 minute will result in rebooting the machine. This - could be useful for a networked machine that needs to come back - online as fast as possible after a lock-up. There's both a watchdog - implementation entirely in software (which can sometimes fail to - reboot the machine) and a driver for hardware watchdog boards, which - are more robust and can also keep track of the temperature inside - your computer. For details, read - in the kernel source. - - The watchdog is usually used together with the watchdog daemon - which is available from - . This daemon can - also monitor NFS connections and can reboot the machine when the process - table is full. - - If unsure, say N. - -config WATCHDOG_NOWAYOUT - bool "Disable watchdog shutdown on close" - depends on WATCHDOG - help - The default watchdog behaviour (which you get if you say N here) is - to stop the timer if the process managing it closes the file - /dev/watchdog. It's always remotely possible that this process might - get killed. If you say Y here, the watchdog cannot be stopped once - it has been started. - -config SOFT_WATCHDOG - bool "Software watchdog" - depends on WATCHDOG - help - A software monitoring watchdog. This will fail to reboot your system - from some situations that the hardware watchdog will recover - from. Equally it's a lot cheaper to install. - - To compile this driver as a module, choose M here: the - module will be called softdog. +source "drivers/char/watchdog/Kconfig" config GEN_RTC tristate "Generic /dev/rtc emulation" if !SUN3 diff -Nru a/arch/mips/defconfig-lasat200 b/arch/mips/defconfig-lasat200 --- a/arch/mips/defconfig-lasat200 Tue Feb 17 20:00:06 2004 +++ b/arch/mips/defconfig-lasat200 Tue Feb 17 20:00:06 2004 @@ -254,7 +254,6 @@ CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/parisc/configs/a500_defconfig b/arch/parisc/configs/a500_defconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/parisc/configs/a500_defconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,887 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_PARISC=y +CONFIG_MMU=y +CONFIG_STACK_GROWSUP=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +# CONFIG_STANDALONE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Processor type and features +# +# CONFIG_PA7000 is not set +# CONFIG_PA7100LC is not set +# CONFIG_PA7200 is not set +CONFIG_PA8X00=y +CONFIG_PA20=y +CONFIG_PARISC64=y +CONFIG_64BIT=y +# CONFIG_PDC_NARROW is not set +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_COMPAT=y + +# +# Bus options (PCI, PCMCIA, EISA, GSC, ISA) +# +# CONFIG_GSC is not set +CONFIG_PCI=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y +CONFIG_PCI_LBA=y +CONFIG_IOSAPIC=y +CONFIG_IOMMU_SBA=y +# CONFIG_SUPERIO is not set +CONFIG_CHASSIS_LCD_LED=y +# CONFIG_PDC_CHASSIS is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +CONFIG_YENTA=m +CONFIG_CARDBUS=y +# CONFIG_I82092 is not set +# CONFIG_TCIC is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +# CONFIG_FW_LOADER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +# CONFIG_PNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=6144 +CONFIG_BLK_DEV_INITRD=y + +# +# ATA/ATAPI/MFM/RLL support +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=y +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_REPORT_LUNS=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_MEGARAID is not set +# CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +CONFIG_SCSI_SYM53C8XX_IOMAPPED=y +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_QLOGIC is not set + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=y +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_DM is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=y +CONFIG_UNIX=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +# CONFIG_INET_IPCOMP is not set + +# +# IP: Virtual Server Configuration +# +# CONFIG_IP_VS is not set +# CONFIG_IPV6 is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +# CONFIG_IP_NF_NAT_LOCAL is not set +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +CONFIG_LLC=m +CONFIG_LLC2=m +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_DE4X5 is not set +# CONFIG_WINBOND_840 is not set +# CONFIG_DM9102 is not set +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_B44 is not set +# CONFIG_DGRS is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_FEALNX is not set +CONFIG_NATSEMI=m +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +CONFIG_EPIC100=m +# CONFIG_SUNDANCE is not set +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +CONFIG_ACENIC_OMIT_TIGON_I=y +CONFIG_DL2K=m +CONFIG_E1000=m +CONFIG_E1000_NAPI=y +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SK98LIN is not set +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +CONFIG_IXGB_NAPI=y +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +# CONFIG_PPPOE is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +# CONFIG_PCMCIA_RAYCS is not set + +# +# Wireless 802.11b ISA/PCI cards support +# +# CONFIG_AIRO is not set +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +# CONFIG_PCMCIA_ATMEL is not set +# CONFIG_PCMCIA_WL3501 is not set +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +# CONFIG_PCMCIA_FMVJ18X is not set +# CONFIG_PCMCIA_PCNET is not set +# CONFIG_PCMCIA_NMCLAN is not set +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +# CONFIG_PCMCIA_AXNET is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# Bluetooth support +# +# CONFIG_BT is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN_BOOL is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +# CONFIG_SERIO is not set + +# +# Input Device Drivers +# +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=8 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_RSA is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_MUX is not set +CONFIG_PDC_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# I2C Algorithms +# + +# +# I2C Hardware Bus support +# + +# +# I2C Hardware Sensors Chip support +# +# CONFIG_I2C_SENSOR is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_NVRAM is not set +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +# CONFIG_FB is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +# CONFIG_STI_CONSOLE is not set +CONFIG_DUMMY_CONSOLE_COLUMNS=160 +CONFIG_DUMMY_CONSOLE_ROWS=64 +CONFIG_DUMMY_CONSOLE=y + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set +# CONFIG_USB_GADGET is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +# CONFIG_REISERFS_FS is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=m + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +# CONFIG_DEVFS_FS is not set +CONFIG_DEVPTS_FS=y +# CONFIG_DEVPTS_FS_XATTR is not set +# CONFIG_TMPFS is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +# CONFIG_SUNRPC_GSS is not set +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp437" +CONFIG_CIFS=m +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +CONFIG_NLS_CODEPAGE_863=m +# CONFIG_NLS_CODEPAGE_864 is not set +CONFIG_NLS_CODEPAGE_865=m +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=m +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_DEBUG_INFO is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC32=y +CONFIG_ZLIB_INFLATE=m +CONFIG_ZLIB_DEFLATE=m diff -Nru a/arch/parisc/configs/c3000_defconfig b/arch/parisc/configs/c3000_defconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/parisc/configs/c3000_defconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,1057 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_PARISC=y +CONFIG_MMU=y +CONFIG_STACK_GROWSUP=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +# CONFIG_STANDALONE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Processor type and features +# +# CONFIG_PA7000 is not set +# CONFIG_PA7100LC is not set +# CONFIG_PA7200 is not set +CONFIG_PA8X00=y +CONFIG_PA20=y +# CONFIG_PARISC64 is not set +# CONFIG_64BIT is not set +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +# CONFIG_HPUX is not set + +# +# Bus options (PCI, PCMCIA, EISA, GSC, ISA) +# +# CONFIG_GSC is not set +CONFIG_PCI=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y +CONFIG_PCI_LBA=y +CONFIG_IOSAPIC=y +CONFIG_IOMMU_SBA=y +CONFIG_SUPERIO=y +# CONFIG_CHASSIS_LCD_LED is not set +# CONFIG_PDC_CHASSIS is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +CONFIG_YENTA=m +CONFIG_CARDBUS=y +# CONFIG_I82092 is not set +# CONFIG_TCIC is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_FW_LOADER=y + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_IDEDISK_STROKE=y +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +CONFIG_BLK_DEV_IDESCSI=y +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +# CONFIG_IDEDMA_PCI_AUTO is not set +# CONFIG_IDEDMA_PCI_WIP is not set +CONFIG_BLK_DEV_ADMA=y +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=y +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=y +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_REPORT_LUNS=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_MEGARAID is not set +CONFIG_SCSI_SATA=y +# CONFIG_SCSI_SATA_SVW is not set +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_VIA=m +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA2XXX_CONFIG=y +CONFIG_SCSI_QLA2XXX=m +# CONFIG_SCSI_QLA21XX is not set +# CONFIG_SCSI_QLA22XX is not set +CONFIG_SCSI_QLA23XX=m +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_AHA152X is not set +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_NINJA_SCSI is not set +CONFIG_PCMCIA_QLOGIC=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=y +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_RAID6 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_DM is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=y +CONFIG_UNIX=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +# CONFIG_INET_IPCOMP is not set + +# +# IP: Virtual Server Configuration +# +# CONFIG_IP_VS is not set +# CONFIG_IPV6 is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_DEBUG=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +# CONFIG_IP_NF_NAT_LOCAL is not set +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +CONFIG_LLC=m +CONFIG_LLC2=m +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +# CONFIG_DM9102 is not set +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +# CONFIG_HP100 is not set +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +# CONFIG_DGRS is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_FEALNX is not set +CONFIG_NATSEMI=m +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_DL2K is not set +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SK98LIN is not set +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=y +CONFIG_IXGB_NAPI=y +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# Bluetooth support +# +# CONFIG_BT is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN_BOOL is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1600 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_HIL_OLD is not set +# CONFIG_KEYBOARD_HIL is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_HIL is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_RSA is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_MUX is not set +# CONFIG_PDC_CONSOLE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_NVRAM is not set +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FB=y +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_STI=y +# CONFIG_FB_RIVA is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_STI_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=160 +CONFIG_DUMMY_CONSOLE_ROWS=64 +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +# CONFIG_LOGO_LINUX_CLUT224 is not set +CONFIG_LOGO_PARISC_CLUT224=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +# CONFIG_SND is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=y +CONFIG_USB_DEBUG=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_EHCI_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_UHCI_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH_TTY is not set +# CONFIG_USB_MIDI is not set +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +# CONFIG_USB_STORAGE_ISD200 is not set +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_XPAD is not set + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_SCANNER=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_TIGL is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +CONFIG_USB_LEGOTOWER=m +# CONFIG_USB_BRLVGER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_GADGET is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +# CONFIG_DEVFS_FS is not set +CONFIG_DEVPTS_FS=y +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V4 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_GSS is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_DEBUG_INFO is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +# CONFIG_CRYPTO_SHA512 is not set +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC32=y +CONFIG_ZLIB_INFLATE=m +CONFIG_ZLIB_DEFLATE=m diff -Nru a/arch/parisc/hpux/fs.c b/arch/parisc/hpux/fs.c --- a/arch/parisc/hpux/fs.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/hpux/fs.c Tue Feb 17 20:00:06 2004 @@ -1,7 +1,24 @@ /* - * linux/arch/parisc/kernel/sys_hpux.c + * Implements HPUX syscalls. * - * implements HPUX syscalls. + * Copyright (C) 1999 Matthew Wilcox + * Copyright (C) 2000 Michael Ang + * Copyright (C) 2000 John Marvin + * Copyright (C) 2000 Philipp Rumpf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include diff -Nru a/arch/parisc/hpux/ioctl.c b/arch/parisc/hpux/ioctl.c --- a/arch/parisc/hpux/ioctl.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/hpux/ioctl.c Tue Feb 17 20:00:06 2004 @@ -1,7 +1,21 @@ /* - * linux/arch/parisc/hpux/ioctl.c + * Implements some necessary HPUX ioctls. * - * implements some necessary HPUX ioctls. + * Copyright (C) 1999-2002 Matthew Wilcox + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* diff -Nru a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c --- a/arch/parisc/hpux/sys_hpux.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/hpux/sys_hpux.c Tue Feb 17 20:00:07 2004 @@ -1,7 +1,25 @@ /* - * linux/arch/parisc/kernel/sys_hpux.c + * Implements HPUX syscalls. * - * implements HPUX syscalls. + * Copyright (C) 1999 Matthew Wilcox + * Copyright (C) 2000 Philipp Rumpf + * Copyright (C) 2000 John Marvin + * Copyright (C) 2000 Michael Ang + * Copyright (C) 2001 Nathan Neulinger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include diff -Nru a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c --- a/arch/parisc/kernel/asm-offsets.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/asm-offsets.c Tue Feb 17 20:00:06 2004 @@ -2,6 +2,29 @@ * Generate definitions needed by assembly language modules. * This code generates raw asm output which is post-processed to extract * and format the required data. + * + * Copyright (C) 2000-2001 John Marvin + * Copyright (C) 2000 David Huggins-Daines + * Copyright (C) 2000 Sam Creasey + * Copyright (C) 2000 Grant Grundler + * Copyright (C) 2001 Paul Bame + * Copyright (C) 2001 Richard Hirst + * Copyright (C) 2002 Randolph Chung + * Copyright (C) 2003 James Bottomley + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include diff -Nru a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c --- a/arch/parisc/kernel/drivers.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/drivers.c Tue Feb 17 20:00:08 2004 @@ -286,7 +286,7 @@ path->bc[i--] = PCI_SLOT(devfn) | (PCI_FUNC(devfn) << 5); } - padev = HBA_DATA(bus->dev->platform_data)->dev; + padev = HBA_DATA(bus->bridge->platform_data)->dev; while (padev != &root) { path->bc[i--] = padev->hw_path; padev = padev->parent; diff -Nru a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c --- a/arch/parisc/kernel/firmware.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/kernel/firmware.c Tue Feb 17 20:00:05 2004 @@ -1,10 +1,22 @@ -/* arch/parisc/kernel/pdc.c - safe pdc access routines +/* + * arch/parisc/kernel/firmware.c - safe PDC access routines + * + * PDC == Processor Dependent Code + * + * See http://www.parisc-linux.org/documentation/index.html + * for documentation describing the entry points and calling + * conventions defined below. * * Copyright 1999 SuSE GmbH Nuernberg (Philipp Rumpf, prumpf@tux.org) - * portions Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy) + * Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy) + * Copyright 2003 Grant Grundler * - * only these routines should be used out of the real kernel (i.e. everything - * using virtual addresses) for obvious reasons */ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ /* I think it would be in everyone's best interest to follow this * guidelines when writing PDC wrappers: @@ -642,6 +654,49 @@ return retval; } + +#if 0 /* UNTEST CODE - left here in case someone needs it */ + +/** + * pdc_pci_config_read - read PCI config space. + * @hpa token from PDC to indicate which PCI device + * @pci_addr configuration space address to read from + * + * Read PCI Configuration space *before* linux PCI subsystem is running. + */ +unsigned int pdc_pci_config_read(void *hpa, unsigned long cfg_addr) +{ + int retval; + spin_lock_irq(&pdc_lock); + pdc_result[0] = 0; + pdc_result[1] = 0; + retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_READ_CONFIG, + __pa(pdc_result), hpa, cfg_addr&~3UL, 4UL); + spin_unlock_irq(&pdc_lock); + return retval ? ~0 : (unsigned int) pdc_result[0]; +} + + +/** + * pdc_pci_config_write - read PCI config space. + * @hpa token from PDC to indicate which PCI device + * @pci_addr configuration space address to write + * @val value we want in the 32-bit register + * + * Write PCI Configuration space *before* linux PCI subsystem is running. + */ +void pdc_pci_config_write(void *hpa, unsigned long cfg_addr, unsigned int val) +{ + int retval; + spin_lock_irq(&pdc_lock); + pdc_result[0] = 0; + retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_WRITE_CONFIG, + __pa(pdc_result), hpa, + cfg_addr&~3UL, 4UL, (unsigned long) val); + spin_unlock_irq(&pdc_lock); + return retval; +} +#endif /* UNTESTED CODE */ /** * pdc_tod_read - Read the Time-Of-Day clock. diff -Nru a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S --- a/arch/parisc/kernel/head.S Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/kernel/head.S Tue Feb 17 20:00:07 2004 @@ -22,17 +22,6 @@ .level 1.1 - .section .initcall.init - .align 4 - .export __initcall_start -__initcall_start: - .export __initcall_end -__initcall_end: - .export __setup_start -__setup_start: - .export __setup_end -__setup_end: - .data .export boot_args @@ -64,13 +53,13 @@ /* Clear BSS (shouldn't the boot loader do this?) */ - .import _edata,data - .import _end,data + .import __bss_start,data + .import __bss_stop,data - ldil L%PA(_edata),%r3 - ldo R%PA(_edata)(%r3),%r3 - ldil L%PA(_end),%r4 - ldo R%PA(_end)(%r4),%r4 + ldil L%PA(__bss_start),%r3 + ldo R%PA(__bss_start)(%r3),%r3 + ldil L%PA(__bss_stop),%r4 + ldo R%PA(__bss_stop)(%r4),%r4 $bss_loop: cmpb,<<,n %r3,%r4,$bss_loop stw,ma %r0,4(%r3) diff -Nru a/arch/parisc/kernel/head64.S b/arch/parisc/kernel/head64.S --- a/arch/parisc/kernel/head64.S Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/kernel/head64.S Tue Feb 17 20:00:05 2004 @@ -26,17 +26,6 @@ .level 2.0w - .section .initcall.init - .align 4 - .export __initcall_start -__initcall_start: - .export __initcall_end -__initcall_end: - .export __setup_start -__setup_start: - .export __setup_end -__setup_end: - .data .export boot_args @@ -64,13 +53,13 @@ /* Clear BSS (shouldn't the boot loader do this?) */ - .import _edata,data - .import _end,data + .import __bss_start,data + .import __bss_stop,data - ldil L%PA(_edata),%r3 - ldo R%PA(_edata)(%r3),%r3 - ldil L%PA(_end),%r4 - ldo R%PA(_end)(%r4),%r4 + ldil L%PA(__bss_start),%r3 + ldo R%PA(__bss_start)(%r3),%r3 + ldil L%PA(__bss_stop),%r4 + ldo R%PA(__bss_stop)(%r4),%r4 $bss_loop: cmpb,<<,n %r3,%r4,$bss_loop stb,ma %r0,1(%r3) diff -Nru a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S --- a/arch/parisc/kernel/hpmc.S Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/hpmc.S Tue Feb 17 20:00:08 2004 @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ diff -Nru a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c --- a/arch/parisc/kernel/init_task.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/kernel/init_task.c Tue Feb 17 20:00:07 2004 @@ -1,3 +1,27 @@ +/* + * Static declaration of "init" task data structure. + * + * Copyright (C) 2000 Paul Bame + * Copyright (C) 2000-2001 John Marvin + * Copyright (C) 2001 Helge Deller + * Copyright (C) 2002 Matthew Wilcox + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include diff -Nru a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c --- a/arch/parisc/kernel/inventory.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/kernel/inventory.c Tue Feb 17 20:00:05 2004 @@ -526,20 +526,6 @@ int i; long status = PDC_OK; -#if defined(CONFIG_IOMMU_SBA) && defined(CONFIG_SUPERIO) - /* - * Stop the suckyio usb controller on Astro based systems. - * Otherwise the machine might crash during iommu setup. - */ - pdc_io_reset(); - - /* - * Unfortunately if we reset devices here, serial console - * stops working :-( - */ - /* pdc_io_reset_devices(); */ -#endif - for (i = 0; status != PDC_BAD_PROC && status != PDC_NE_MOD; i++) { struct parisc_device *dev; struct pdc_system_map_mod_info module_result; diff -Nru a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S --- a/arch/parisc/kernel/pacache.S Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/pacache.S Tue Feb 17 20:00:06 2004 @@ -1,6 +1,8 @@ /* - * Parisc tlb and cache flushing support - * Copyright (C) 2000 Hewlett-Packard (John Marvin) + * PARISC TLB and cache flushing support + * Copyright (C) 2000-2001 Hewlett-Packard (John Marvin) + * Copyright (C) 2001 Matthew Wilcox (willy at parisc-linux.org) + * Copyright (C) 2002 Richard Hirst (rhirst with parisc-linux.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* diff -Nru a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c --- a/arch/parisc/kernel/parisc_ksyms.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/parisc_ksyms.c Tue Feb 17 20:00:08 2004 @@ -1,5 +1,27 @@ /* - * Architecture-specific kernel symbols + * Architecture-specific kernel symbols + * + * Copyright (C) 2000-2001 Richard Hirst + * Copyright (C) 2001 Dave Kennedy + * Copyright (C) 2001 Paul Bame + * Copyright (C) 2001-2003 Grant Grundler + * Copyright (C) 2002-2003 Matthew Wilcox + * Copyright (C) 2002 Randolph Chung + * Copyright (C) 2002-2003 Helge Deller + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include diff -Nru a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c --- a/arch/parisc/kernel/pci-dma.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/pci-dma.c Tue Feb 17 20:00:08 2004 @@ -261,11 +261,13 @@ } else if(pages_needed <= 32) { PCXL_FIND_FREE_MAPPING(res_idx, mask, 32); } else { - panic(__FILE__ ": pcxl_alloc_range() Too many pages to map.\n"); + panic("%s: pcxl_alloc_range() Too many pages to map.\n", + __FILE__); } dump_resmap(); - panic(__FILE__ ": pcxl_alloc_range() out of dma mapping resources\n"); + panic("%s: pcxl_alloc_range() out of dma mapping resources\n", + __FILE__); resource_found: @@ -319,7 +321,8 @@ } else if(pages_mapped <= 32) { PCXL_FREE_MAPPINGS(res_idx, mask, 32); } else { - panic(__FILE__ ": pcxl_free_range() Too many pages to unmap.\n"); + panic("%s: pcxl_free_range() Too many pages to unmap.\n", + __FILE__); } pcxl_used_pages -= (pages_mapped ? pages_mapped : 1); diff -Nru a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c --- a/arch/parisc/kernel/pci.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/kernel/pci.c Tue Feb 17 20:00:05 2004 @@ -229,7 +229,7 @@ struct pci_bus_region *region, struct resource *res) { struct pci_bus *bus = dev->bus; - struct pci_hba_data *hba = HBA_DATA(bus->dev->platform_data); + struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data); if (res->flags & IORESOURCE_IO) { /* diff -Nru a/arch/parisc/kernel/pdc_chassis.c b/arch/parisc/kernel/pdc_chassis.c --- a/arch/parisc/kernel/pdc_chassis.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/kernel/pdc_chassis.c Tue Feb 17 20:00:07 2004 @@ -1,23 +1,22 @@ -/* - * arch/parisc/kernel/pdc_chassis.c +/* + * interfaces to log Chassis Codes via PDC (firmware) * - * Copyright (C) 2002 Laurent Canet - * Copyright (C) 2002-2003 Thibaut Varene + * Copyright (C) 2002 Laurent Canet + * Copyright (C) 2002-2003 Thibaut Varene * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #undef PDC_CHASSIS_DEBUG diff -Nru a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c --- a/arch/parisc/kernel/pdc_cons.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/pdc_cons.c Tue Feb 17 20:00:06 2004 @@ -1,6 +1,35 @@ -/* - * linux/arch/parisc/kernel/pdc_console.c +/* + * PDC Console support - ie use firmware to dump text via boot console + * + * Copyright (C) 1999-2003 Matthew Wilcox + * Copyright (C) 2000 Martin K Petersen + * Copyright (C) 2000 John Marvin + * Copyright (C) 2000-2003 Paul Bame + * Copyright (C) 2000 Philipp Rumpf + * Copyright (C) 2000 Michael Ang + * Copyright (C) 2000 Grant Grundler + * Copyright (C) 2001-2002 Ryan Bradetich + * Copyright (C) 2001 Helge Deller + * Copyright (C) 2001 Thomas Bogendoerfer + * Copyright (C) 2002 Randolph Chung + * * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* * The PDC console is a simple console, which can be used for debugging * boot related problems on HP PA-RISC machines. * diff -Nru a/arch/parisc/kernel/perf_asm.S b/arch/parisc/kernel/perf_asm.S --- a/arch/parisc/kernel/perf_asm.S Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/kernel/perf_asm.S Tue Feb 17 20:00:07 2004 @@ -1,8 +1,22 @@ -; -; Purpose: -; This file has the overall purpose of suppyling low-level -; assembly to program the intrigue portion of the cpu. -; + +/* low-level asm for "intrigue" (PA8500-8700 CPU perf counters) + * + * Copyright (C) 2001 Randolph Chung + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ #include #include diff -Nru a/arch/parisc/kernel/perf_images.h b/arch/parisc/kernel/perf_images.h --- a/arch/parisc/kernel/perf_images.h Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/perf_images.h Tue Feb 17 20:00:06 2004 @@ -1,11 +1,26 @@ +/* + * Imagine for use with the Onyx (PCX-U) CPU interface + * + * Copyright (C) 2001 Randolph Chung + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ #ifndef PERF_IMAGES_H #define PERF_IMAGES_H /* Magic numbers taken without modification from HPUX stuff */ - -/* - * Imagine for use with the Onyx cpu interface - */ #define PCXU_IMAGE_SIZE 584 diff -Nru a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c --- a/arch/parisc/kernel/process.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/process.c Tue Feb 17 20:00:08 2004 @@ -1,10 +1,35 @@ /* - * linux/arch/parisc/kernel/process.c - * based on the work for i386 - */ - -/* - * This file handles the architecture-dependent parts of process handling.. + * PARISC Architecture-dependent parts of process handling + * based on the work for i386 + * + * Copyright (C) 1999-2003 Matthew Wilcox + * Copyright (C) 2000 Martin K Petersen + * Copyright (C) 2000 John Marvin + * Copyright (C) 2000 David Huggins-Daines + * Copyright (C) 2000-2003 Paul Bame + * Copyright (C) 2000 Philipp Rumpf + * Copyright (C) 2000 David Kennedy + * Copyright (C) 2000 Richard Hirst + * Copyright (C) 2000 Grant Grundler + * Copyright (C) 2001 Alan Modra + * Copyright (C) 2001-2002 Ryan Bradetich + * Copyright (C) 2001-2002 Helge Deller + * Copyright (C) 2002 Randolph Chung + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __KERNEL_SYSCALLS__ diff -Nru a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c --- a/arch/parisc/kernel/ptrace.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/ptrace.c Tue Feb 17 20:00:06 2004 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -36,8 +37,6 @@ #ifdef __LP64__ -#define CHILD_IS_32BIT (child->personality == PER_LINUX_32BIT) - /* This function is needed to translate 32 bit pt_regs offsets in to * 64 bit pt_regs offsets. For example, a 32 bit gdb under a 64 bit kernel * will request offset 12 if it wants gr3, but the lower 32 bits of @@ -130,7 +129,7 @@ int copied; #ifdef __LP64__ - if (CHILD_IS_32BIT) { + if (is_compat_task(child)) { unsigned int tmp; addr &= 0xffffffffL; @@ -162,7 +161,7 @@ case PTRACE_POKEDATA: ret = 0; #ifdef __LP64__ - if (CHILD_IS_32BIT) { + if (is_compat_task(child)) { unsigned int tmp = (unsigned int)data; DBG(("sys_ptrace(POKE%s, %d, %lx, %lx)\n", request == PTRACE_POKETEXT ? "TEXT" : "DATA", @@ -185,7 +184,7 @@ case PTRACE_PEEKUSR: { ret = -EIO; #ifdef __LP64__ - if (CHILD_IS_32BIT) { + if (is_compat_task(child)) { unsigned int tmp; if (addr & (sizeof(int)-1)) @@ -244,7 +243,7 @@ goto out_tsk; } #ifdef __LP64__ - if (CHILD_IS_32BIT) { + if (is_compat_task(child)) { if (addr & (sizeof(int)-1)) goto out_tsk; if ((addr = translate_usr_offset(addr)) < 0) diff -Nru a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c --- a/arch/parisc/kernel/signal32.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/signal32.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,25 @@ -/* mostly borrowed from kernel/signal.c */ +/* Signal support for 32-bit kernel builds + * + * Copyright (C) 2001 Matthew Wilcox + * Code was mostly borrowed from kernel/signal.c. + * See kernel/signal.c for additional Copyrights. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include diff -Nru a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h --- a/arch/parisc/kernel/signal32.h Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/signal32.h Tue Feb 17 20:00:06 2004 @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2001 Matthew Wilcox + * Copyright (C) 2003 Carlos O'Donell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ #ifndef _PARISC64_KERNEL_SIGNAL32_H #define _PARISC64_KERNEL_SIGNAL32_H diff -Nru a/arch/parisc/kernel/sys32.h b/arch/parisc/kernel/sys32.h --- a/arch/parisc/kernel/sys32.h Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/kernel/sys32.h Tue Feb 17 20:00:07 2004 @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2002 Richard Hirst + * Copyright (C) 2003 James Bottomley + * Copyright (C) 2003 Randolph Chung + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ #ifndef _PARISC64_KERNEL_SYS32_H #define _PARISC64_KERNEL_SYS32_H diff -Nru a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c --- a/arch/parisc/kernel/sys_parisc.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/kernel/sys_parisc.c Tue Feb 17 20:00:08 2004 @@ -1,7 +1,25 @@ + /* - * linux/arch/parisc/kernel/sys_parisc.c + * PARISC specific syscalls * - * this implements syscalls which are handled per-arch. + * Copyright (C) 1999-2003 Matthew Wilcox + * Copyright (C) 2000-2003 Paul Bame + * Copyright (C) 2001 Thomas Bogendoerfer + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include diff -Nru a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S --- a/arch/parisc/kernel/syscall_table.S Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/kernel/syscall_table.S Tue Feb 17 20:00:05 2004 @@ -1,3 +1,35 @@ +/* System Call Table + * + * Copyright (C) 1999-2003 Matthew Wilcox + * Copyright (C) 2000-2001 John Marvin + * Copyright (C) 2000 Alan Modra + * Copyright (C) 2000-2003 Paul Bame + * Copyright (C) 2000 Philipp Rumpf + * Copyright (C) 2000 Michael Ang + * Copyright (C) 2000 David Huggins-Daines + * Copyright (C) 2000 Grant Grundler + * Copyright (C) 2001 Richard Hirst + * Copyright (C) 2001-2002 Ryan Bradetich + * Copyright (C) 2001 Helge Deller + * Copyright (C) 2000-2001 Thomas Bogendoerfer + * Copyright (C) 2002 Randolph Chung + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #undef ENTRY_SAME #undef ENTRY_DIFF #undef ENTRY_UHOH diff -Nru a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c --- a/arch/parisc/kernel/unaligned.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/unaligned.c Tue Feb 17 20:00:06 2004 @@ -270,7 +270,7 @@ } #endif - DPRINTF("val = 0xllx\n", val); + DPRINTF("val = 0x%llx\n", val); if (flop) regs->fr[toreg] = val; diff -Nru a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S --- a/arch/parisc/kernel/vmlinux.lds.S Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/kernel/vmlinux.lds.S Tue Feb 17 20:00:06 2004 @@ -1,5 +1,31 @@ +/* Kernel link layout for various "sections" + * + * Copyright (C) 1999-2003 Matthew Wilcox + * Copyright (C) 2000-2003 Paul Bame + * Copyright (C) 2000 John Marvin + * Copyright (C) 2000 Michael Ang + * Copyright (C) 2002 Randolph Chung + * Copyright (C) 2003 James Bottomley + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ #include #include +/* needed for the processor specific cache alignment size */ +#include /* ld script to make hppa Linux kernel */ #ifndef CONFIG_PARISC64 @@ -22,7 +48,7 @@ . = 0x10100000; _text = .; /* Text and read-only data */ - .text BLOCK(16) : { + .text ALIGN(16) : { *(.text*) *(.PARISC.unwind) *(.fixup) @@ -32,18 +58,42 @@ _etext = .; /* End of text section */ + RODATA + + /* writeable */ + data_start = .; + . = ALIGN(16); /* Exception table */ __start___ex_table = .; __ex_table : { *(__ex_table) } __stop___ex_table = .; - RODATA - - .data BLOCK(8192) : { /* Data without special */ - data_start = .; + .data : { /* Data */ *(.data) + CONSTRUCTORS } + . = ALIGN(4096); + /* nosave data is really only used for software suspend...it's here + * just in case we ever implement it */ + __nosave_begin = .; + .data_nosave : { *(.data.nosave) } + . = ALIGN(4096); + __nosave_end = .; + + . = ALIGN(L1_CACHE_BYTES); + .data.cacheline_aligned : { *(.data.cacheline_aligned) } + + _edata = .; /* End of data section */ + + . = ALIGN(16384); /* init_task */ + .data.init_task : { *(.data.init_task) } + + /* The interrupt stack is currently partially coded, but not yet + * implemented */ + . = ALIGN(16384); + init_istack : { *(init_istack) } + #ifdef CONFIG_PARISC64 . = ALIGN(16); /* Linkage tables */ .opd : { *(.opd) } PROVIDE (__gp = .); @@ -63,7 +113,7 @@ __setup_start = .; .init.setup : { *(.init.setup) } __setup_end = .; - __start___param =.; + __start___param = .; __param : { *(__param) } __stop___param = .; __initcall_start = .; @@ -81,6 +131,19 @@ .con_initcall.init : { *(.con_initcall.init) } __con_initcall_end = .; SECURITY_INIT + /* alternate instruction replacement. This is a mechanism x86 uses + * to detect the CPU type and replace generic instruction sequences + * with CPU specific ones. We don't currently do this in PA, but + * it seems like a good idea... */ + . = ALIGN(4); + __alt_instructions = .; + .altinstructions : { *(.altinstructions) } + __alt_instructions_end = .; + .altinstr_replacement : { *(.altinstr_replacement) } + /* .exit.text is discard at runtime, not link time, to deal with references + from .altinstructions and .eh_frame */ + .exit.text : { *(.exit.text) } + .exit.data : { *(.exit.data) } . = ALIGN(4096); __initramfs_start = .; .init.ramfs : { *(.init.ramfs) } @@ -91,17 +154,28 @@ __per_cpu_end = .; . = ALIGN(4096); __init_end = .; - - init_task BLOCK(16384) : { *(init_task) } /* The initial task and kernel stack */ - - _edata = .; /* End of data section */ - - - .bss : { *(.bss) *(COMMON) } /* BSS */ - + /* freed after init ends here */ + + __bss_start = .; /* BSS */ + .bss : { *(.bss) *(COMMON) } + __bss_stop = .; _end = . ; + /* Sections to be discarded */ + /DISCARD/ : { + *(.exitcall.exit) +#ifdef CONFIG_PARISC64 + /* temporary hack until binutils is fixed to not emit these + for static binaries */ + *(.interp) + *(.dynsym) + *(.dynstr) + *(.dynamic) + *(.hash) +#endif + } + /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } @@ -112,14 +186,4 @@ .comment 0 : { *(.comment) } .note 0 : { *(.note) } -#ifdef CONFIG_PARISC64 - /* temporary hack until binutils is fixed to not emit these - for static binaries */ - /DISCARD/ : { - *(.dynsym) - *(.dynstr) - *(.dynamic) - *(.hash) - } -#endif } diff -Nru a/arch/parisc/lib/lusercopy.S b/arch/parisc/lib/lusercopy.S --- a/arch/parisc/lib/lusercopy.S Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/lib/lusercopy.S Tue Feb 17 20:00:05 2004 @@ -1,8 +1,11 @@ /* - * Linux/PA-RISC Project (http://www.parisc-linux.org/) + * User Space Access Routines + * + * Copyright (C) 2000-2002 Hewlett-Packard (John Marvin) + * Copyright (C) 2000 Richard Hirst + * Copyright (C) 2001 Matthieu Delahaye + * Copyright (C) 2003 Randolph Chung * - * Assembly Language User Access Routines - * Copyright (C) 2000 Hewlett-Packard (John Marvin) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +19,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* diff -Nru a/arch/parisc/math-emu/cnv_float.h b/arch/parisc/math-emu/cnv_float.h --- a/arch/parisc/math-emu/cnv_float.h Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/cnv_float.h Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __NO_PA_HDRS diff -Nru a/arch/parisc/math-emu/dbl_float.h b/arch/parisc/math-emu/dbl_float.h --- a/arch/parisc/math-emu/dbl_float.h Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/dbl_float.h Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __NO_PA_HDRS PA header file -- do not include this header file for non-PA builds. diff -Nru a/arch/parisc/math-emu/decode_exc.c b/arch/parisc/math-emu/decode_exc.c --- a/arch/parisc/math-emu/decode_exc.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/decode_exc.c Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC @@ -347,7 +347,7 @@ return SIGNALCODE(SIGFPE, FPE_FLTRES); default: update_trap_counts(Fpu_register, aflags, bflags, trap_counts); - printk(__FILE__ "(%d) Unknown FPU exception 0x%x\n", + printk("%s(%d) Unknown FPU exception 0x%x\n", __FILE__, __LINE__, Excp_type(exception_index)); return SIGNALCODE(SIGILL, ILL_COPROC); case NOEXCEPTION: /* no exception */ diff -Nru a/arch/parisc/math-emu/denormal.c b/arch/parisc/math-emu/denormal.c --- a/arch/parisc/math-emu/denormal.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/denormal.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfadd.c b/arch/parisc/math-emu/dfadd.c --- a/arch/parisc/math-emu/dfadd.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/dfadd.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfcmp.c b/arch/parisc/math-emu/dfcmp.c --- a/arch/parisc/math-emu/dfcmp.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/dfcmp.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfdiv.c b/arch/parisc/math-emu/dfdiv.c --- a/arch/parisc/math-emu/dfdiv.c Tue Feb 17 20:00:14 2004 +++ b/arch/parisc/math-emu/dfdiv.c Tue Feb 17 20:00:14 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfmpy.c b/arch/parisc/math-emu/dfmpy.c --- a/arch/parisc/math-emu/dfmpy.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/dfmpy.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfrem.c b/arch/parisc/math-emu/dfrem.c --- a/arch/parisc/math-emu/dfrem.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/dfrem.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfsqrt.c b/arch/parisc/math-emu/dfsqrt.c --- a/arch/parisc/math-emu/dfsqrt.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/math-emu/dfsqrt.c Tue Feb 17 20:00:05 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/dfsub.c b/arch/parisc/math-emu/dfsub.c --- a/arch/parisc/math-emu/dfsub.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/dfsub.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/driver.c b/arch/parisc/math-emu/driver.c --- a/arch/parisc/math-emu/driver.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/driver.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * linux/arch/math-emu/driver.c.c diff -Nru a/arch/parisc/math-emu/fcnvff.c b/arch/parisc/math-emu/fcnvff.c --- a/arch/parisc/math-emu/fcnvff.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/fcnvff.c Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvfu.c b/arch/parisc/math-emu/fcnvfu.c --- a/arch/parisc/math-emu/fcnvfu.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/fcnvfu.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvfut.c b/arch/parisc/math-emu/fcnvfut.c --- a/arch/parisc/math-emu/fcnvfut.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/fcnvfut.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvfx.c b/arch/parisc/math-emu/fcnvfx.c --- a/arch/parisc/math-emu/fcnvfx.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/fcnvfx.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvfxt.c b/arch/parisc/math-emu/fcnvfxt.c --- a/arch/parisc/math-emu/fcnvfxt.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/math-emu/fcnvfxt.c Tue Feb 17 20:00:05 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvuf.c b/arch/parisc/math-emu/fcnvuf.c --- a/arch/parisc/math-emu/fcnvuf.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/fcnvuf.c Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fcnvxf.c b/arch/parisc/math-emu/fcnvxf.c --- a/arch/parisc/math-emu/fcnvxf.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/fcnvxf.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/float.h b/arch/parisc/math-emu/float.h --- a/arch/parisc/math-emu/float.h Tue Feb 17 20:00:14 2004 +++ b/arch/parisc/math-emu/float.h Tue Feb 17 20:00:14 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fmpyfadd.c b/arch/parisc/math-emu/fmpyfadd.c --- a/arch/parisc/math-emu/fmpyfadd.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/fmpyfadd.c Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fpbits.h b/arch/parisc/math-emu/fpbits.h --- a/arch/parisc/math-emu/fpbits.h Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/fpbits.h Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __NO_PA_HDRS diff -Nru a/arch/parisc/math-emu/fpu.h b/arch/parisc/math-emu/fpu.h --- a/arch/parisc/math-emu/fpu.h Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/fpu.h Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/fpudispatch.c b/arch/parisc/math-emu/fpudispatch.c --- a/arch/parisc/math-emu/fpudispatch.c Tue Feb 17 20:00:05 2004 +++ b/arch/parisc/math-emu/fpudispatch.c Tue Feb 17 20:00:05 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/frnd.c b/arch/parisc/math-emu/frnd.c --- a/arch/parisc/math-emu/frnd.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/frnd.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/hppa.h b/arch/parisc/math-emu/hppa.h --- a/arch/parisc/math-emu/hppa.h Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/hppa.h Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __NO_PA_HDRS diff -Nru a/arch/parisc/math-emu/math-emu.h b/arch/parisc/math-emu/math-emu.h --- a/arch/parisc/math-emu/math-emu.h Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/math-emu.h Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _PARISC_MATH_EMU_H #define _PARISC_MATH_EMU_H diff -Nru a/arch/parisc/math-emu/sfadd.c b/arch/parisc/math-emu/sfadd.c --- a/arch/parisc/math-emu/sfadd.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/sfadd.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfcmp.c b/arch/parisc/math-emu/sfcmp.c --- a/arch/parisc/math-emu/sfcmp.c Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/sfcmp.c Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfdiv.c b/arch/parisc/math-emu/sfdiv.c --- a/arch/parisc/math-emu/sfdiv.c Tue Feb 17 20:00:07 2004 +++ b/arch/parisc/math-emu/sfdiv.c Tue Feb 17 20:00:07 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfmpy.c b/arch/parisc/math-emu/sfmpy.c --- a/arch/parisc/math-emu/sfmpy.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/sfmpy.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfrem.c b/arch/parisc/math-emu/sfrem.c --- a/arch/parisc/math-emu/sfrem.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/sfrem.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfsqrt.c b/arch/parisc/math-emu/sfsqrt.c --- a/arch/parisc/math-emu/sfsqrt.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/sfsqrt.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sfsub.c b/arch/parisc/math-emu/sfsub.c --- a/arch/parisc/math-emu/sfsub.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/math-emu/sfsub.c Tue Feb 17 20:00:06 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * BEGIN_DESC diff -Nru a/arch/parisc/math-emu/sgl_float.h b/arch/parisc/math-emu/sgl_float.h --- a/arch/parisc/math-emu/sgl_float.h Tue Feb 17 20:00:08 2004 +++ b/arch/parisc/math-emu/sgl_float.h Tue Feb 17 20:00:08 2004 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __NO_PA_HDRS diff -Nru a/arch/parisc/mm/kmap.c b/arch/parisc/mm/kmap.c --- a/arch/parisc/mm/kmap.c Tue Feb 17 20:00:06 2004 +++ b/arch/parisc/mm/kmap.c Tue Feb 17 20:00:06 2004 @@ -1,3 +1,26 @@ +/* + * kmap/page table map and unmap support routines + * + * Copyright 1999,2000 Hewlett-Packard Company + * Copyright 2000 John Marvin + * Copyright 2000 Grant Grundler + * Copyright 2000 Philipp Rumpf + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ /* ** Stolen mostly from arch/parisc/kernel/pci-dma.c */ diff -Nru a/arch/ppc/8260_io/uart.c b/arch/ppc/8260_io/uart.c --- a/arch/ppc/8260_io/uart.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc/8260_io/uart.c Tue Feb 17 20:00:05 2004 @@ -5,6 +5,9 @@ * 2.3.99 updates * Copyright (c) 2002 Allen Curtis, Ones and Zeros, Inc. (acurtis@onz.com) * 2.5.50 updates + * Fix the console driver to be registered with initcalls and some minor fixup + * for 2.6.2, by Petter Larsen, moreCom as (petter.larsen@morecom.no) and + * Miguel Valero, AxxessIT ASA (miguel.valero@axxessit.no) * * I used the 8xx uart.c driver as the framework for this driver. * The original code was written for the EST8260 board. I tried to make @@ -75,11 +78,11 @@ static char *serial_version = "0.02"; static struct tty_driver *serial_driver; -static int serial_console_setup(struct console *co, char *options); - +static int __init serial_console_setup( struct console *co, char *options); static void serial_console_write(struct console *c, const char *s, unsigned count); -static kdev_t serial_console_device(struct console *c); + +static struct tty_driver *serial_console_device(struct console *c, int *index); #if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) static unsigned long break_pressed; /* break, really ... */ @@ -533,8 +536,6 @@ *(tty->flip.flag_buf_ptr++) = TTY_BREAK; *(tty->flip.char_buf_ptr++) = 0; tty->flip.count++; - - queue_task(&tty->flip.tqueue, &tq_timer); } @@ -1864,8 +1865,8 @@ { #ifdef DO_THIS_LATER DECLARE_WAITQUEUE(wait, current); -#endif struct serial_state *state = info->state; +#endif int retval; int do_clocal = 0; @@ -2467,12 +2468,14 @@ /* * Register console. */ -long __init console_8xx_init(long kmem_start, long kmem_end) +static int __init console_8xx_init(void) { register_console(&sercons); - return kmem_start; + return 0; } +console_initcall(console_8xx_init); + #endif /* Default console baud rate as determined by the board information @@ -2879,8 +2882,10 @@ volatile smc_t *sp; volatile smc_uart_t *up; #endif +#ifdef SCC_CONSOLE volatile scc_t *scp; volatile scc_uart_t *sup; +#endif volatile iop8260_t *io; bd_t *bd; diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfig --- a/arch/ppc/Kconfig Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/Kconfig Tue Feb 17 20:00:08 2004 @@ -30,6 +30,10 @@ bool default y +# All PPCs use generic nvram driver through ppc_md +config GENERIC_NVRAM + bool + default y source "init/Kconfig" @@ -181,7 +185,7 @@ config PPC601_SYNC_FIX bool "Workarounds for PPC601 bugs" - depends on 6xx + depends on 6xx && (PPC_PREP || PPC_PMAC) help Some versions of the PPC601 (the first PowerPC chip) have bugs which mean that extra synchronization instructions are required near @@ -583,14 +587,14 @@ depends on PPC_MULTIPLATFORM default y -config PPC_GEN550 +config PPC_PMAC bool - depends on SANDPOINT + depends on PPC_MULTIPLATFORM default y -config PPC_PMAC +config PPC_PMAC64 bool - depends on PPC_MULTIPLATFORM + depends on PPC_PMAC && POWER4 default y config PPC_PREP @@ -603,6 +607,11 @@ depends on PPC_PMAC || PPC_CHRP default y +config PPC_GEN550 + bool + depends on SANDPOINT || MCPN765 || SPRUCE + default y + config FORCE bool depends on 6xx && (PCORE || POWERPMC250) @@ -989,8 +998,6 @@ source "drivers/pcmcia/Kconfig" -source "drivers/parport/Kconfig" - endmenu menu "Advanced setup" @@ -1088,179 +1095,10 @@ depends on ADVANCED_OPTIONS && 8xx endmenu -source "drivers/base/Kconfig" - -source "drivers/mtd/Kconfig" - -source "drivers/pnp/Kconfig" - -source "drivers/block/Kconfig" - -source "drivers/md/Kconfig" - -source "drivers/ide/Kconfig" - -source "drivers/scsi/Kconfig" - -source "drivers/message/fusion/Kconfig" - -source "drivers/ieee1394/Kconfig" - -source "drivers/message/i2o/Kconfig" - -source "net/Kconfig" - -source "drivers/isdn/Kconfig" - -source "drivers/video/Kconfig" - -source "drivers/cdrom/Kconfig" - -source "drivers/input/Kconfig" - - -menu "Macintosh device drivers" - -# we want to change this to something like CONFIG_SYSCTRL_CUDA/PMU -config ADB_CUDA - bool "Support for CUDA based PowerMacs" - depends on PPC_PMAC - help - This provides support for CUDA based Power Macintosh systems. This - includes most OldWorld PowerMacs, the first generation iMacs, the - Blue&White G3 and the "Yikes" G4 (PCI Graphics). All later models - should use CONFIG_ADB_PMU instead. It is safe to say Y here even if - your machine doesn't have a CUDA. - - If unsure say Y. - -config ADB_PMU - bool "Support for PMU based PowerMacs" - depends on PPC_PMAC - help - On PowerBooks, iBooks, and recent iMacs and Power Macintoshes, the - PMU is an embedded microprocessor whose primary function is to - control system power, and battery charging on the portable models. - The PMU also controls the ADB (Apple Desktop Bus) which connects to - the keyboard and mouse on some machines, as well as the non-volatile - RAM and the RTC (real time clock) chip. Say Y to enable support for - this device; you should do so if your machine is one of those - mentioned above. - -config PMAC_PBOOK - bool "Power management support for PowerBooks" - depends on ADB_PMU - ---help--- - This provides support for putting a PowerBook to sleep; it also - enables media bay support. Power management works on the - PB2400/3400/3500, Wallstreet, Lombard, and Bronze PowerBook G3 and - the Titanium Powerbook G4, as well as the iBooks. You should get - the power management daemon, pmud, to make it work and you must have - the /dev/pmu device (see the pmud README). - - Get pmud from . - - If you have a PowerBook, you should say Y here. - - You may also want to compile the dma sound driver as a module and - have it autoloaded. The act of removing the module shuts down the - sound hardware for more power savings. - -config PM - bool - depends on PPC_PMAC && ADB_PMU && PMAC_PBOOK - default y - -config PMAC_APM_EMU - tristate "APM emulation" - depends on PMAC_PBOOK - -# made a separate option since backlight may end up beeing used -# on non-powerbook machines (but only on PMU based ones AFAIK) -config PMAC_BACKLIGHT - bool "Backlight control for LCD screens" - depends on ADB_PMU - help - Say Y here to build in code to manage the LCD backlight on a - Macintosh PowerBook. With this code, the backlight will be turned - on and off appropriately on power-management and lid-open/lid-closed - events; also, the PowerBook button device will be enabled so you can - change the screen brightness. - -config MAC_FLOPPY - bool "Support for PowerMac floppy" - depends on PPC_PMAC - help - If you have a SWIM-3 (Super Woz Integrated Machine 3; from Apple) - floppy controller, say Y here. Most commonly found in PowerMacs. - -config MAC_SERIAL - tristate "Support for PowerMac serial ports (OBSOLETE DRIVER)" - depends on PPC_PMAC - help - This driver is obsolete. Use CONFIG_SERIAL_PMACZILOG in - "Character devices --> Serial drivers --> PowerMac z85c30" option. - -config ADB - bool "Apple Desktop Bus (ADB) support" - depends on PPC_PMAC - help - Apple Desktop Bus (ADB) support is for support of devices which - are connected to an ADB port. ADB devices tend to have 4 pins. - If you have an Apple Macintosh prior to the iMac, an iBook or - PowerBook, or a "Blue and White G3", you probably want to say Y - here. Otherwise say N. - -config ADB_MACIO - bool "Include MacIO (CHRP) ADB driver" - depends on ADB - help - Say Y here to include direct support for the ADB controller in the - Hydra chip used on PowerPC Macintoshes of the CHRP type. (The Hydra - also includes a MESH II SCSI controller, DBDMA controller, VIA chip, - OpenPIC controller and two RS422/Geoports.) - -config INPUT_ADBHID - bool "Support for ADB input devices (keyboard, mice, ...)" - depends on ADB && INPUT=y - help - Say Y here if you want to have ADB (Apple Desktop Bus) HID devices - such as keyboards, mice, joysticks, trackpads or graphic tablets - handled by the input layer. If you say Y here, make sure to say Y to - the corresponding drivers "Keyboard support" (CONFIG_INPUT_KEYBDEV), - "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface - support" (CONFIG_INPUT_EVDEV) as well. - - If unsure, say Y. - -config MAC_EMUMOUSEBTN - bool "Support for mouse button 2+3 emulation" - depends on INPUT_ADBHID - help - This provides generic support for emulating the 2nd and 3rd mouse - button with keypresses. If you say Y here, the emulation is still - disabled by default. The emulation is controlled by these sysctl - entries: - /proc/sys/dev/mac_hid/mouse_button_emulation - /proc/sys/dev/mac_hid/mouse_button2_keycode - /proc/sys/dev/mac_hid/mouse_button3_keycode - - If you have an Apple machine with a 1-button mouse, say Y here. - -config ANSLCD - bool "Support for ANS LCD display" - depends on ADB_CUDA - -endmenu - -source "drivers/char/Kconfig" - -source "drivers/media/Kconfig" +source "drivers/Kconfig" source "fs/Kconfig" -source "sound/Kconfig" - source "arch/ppc/8xx_io/Kconfig" source "arch/ppc/8260_io/Kconfig" @@ -1285,8 +1123,6 @@ endmenu -source "drivers/usb/Kconfig" - source "lib/Kconfig" @@ -1404,7 +1240,7 @@ config SERIAL_TEXT_DEBUG bool "Support for early boot texts over serial port" - depends on 4xx || GT64260 || LOPEC || MCPN765 || PPLUS || PRPMC800 || SANDPOINT + depends on 4xx || GT64260 || LOPEC || PPLUS || PRPMC800 || PPC_GEN550 config OCP bool diff -Nru a/arch/ppc/boot/common/bootinfo.c b/arch/ppc/boot/common/bootinfo.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/boot/common/bootinfo.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,70 @@ +/* + * arch/ppc/common/bootinfo.c + * + * General bootinfo record utilities + * Author: Randy Vinson + * + * 2002 (c) MontaVista Software, Inc. This file is licensed under the terms + * of the GNU General Public License version 2. This program is licensed + * "as is" without any warranty of any kind, whether express or implied. + */ + +#include +#include +#include + +#include "nonstdio.h" + +static struct bi_record * birec = NULL; + +static struct bi_record * +__bootinfo_build(struct bi_record *rec, unsigned long tag, unsigned long size, + void *data) +{ + /* set the tag */ + rec->tag = tag; + + /* if the caller has any data, copy it */ + if (size) + memcpy(rec->data, (char *)data, size); + + /* set the record size */ + rec->size = sizeof(struct bi_record) + size; + + /* advance to the next available space */ + rec = (struct bi_record *)((unsigned long)rec + rec->size); + + return rec; +} + +void +bootinfo_init(struct bi_record *rec) +{ + + /* save start of birec area */ + birec = rec; + + /* create an empty list */ + rec = __bootinfo_build(rec, BI_FIRST, 0, NULL); + (void) __bootinfo_build(rec, BI_LAST, 0, NULL); + +} + +void +bootinfo_append(unsigned long tag, unsigned long size, void * data) +{ + + struct bi_record *rec = birec; + + /* paranoia */ + if ((rec == NULL) || (rec->tag != BI_FIRST)) + return; + + /* find the last entry in the list */ + while (rec->tag != BI_LAST) + rec = (struct bi_record *)((ulong)rec + rec->size); + + /* overlay BI_LAST record with new one and tag on a new BI_LAST */ + rec = __bootinfo_build(rec, tag, size, data); + (void) __bootinfo_build(rec, BI_LAST, 0, NULL); +} diff -Nru a/arch/ppc/boot/simple/Makefile b/arch/ppc/boot/simple/Makefile --- a/arch/ppc/boot/simple/Makefile Tue Feb 17 20:00:05 2004 +++ b/arch/ppc/boot/simple/Makefile Tue Feb 17 20:00:05 2004 @@ -30,7 +30,7 @@ # Normally, we use the 'misc.c' file for decompress_kernel and # whatnot. Sometimes we need to override this however. -misc-y := misc.o +misc-y := misc.o ../common/bootinfo.o # Normally, we have our images end in .elf, but something we want to # change this. @@ -103,7 +103,7 @@ zimageinitrd-$(CONFIG_SPRUCE) := zImage.initrd-TREE end-$(CONFIG_SPRUCE) := spruce entrypoint-$(CONFIG_SPRUCE) := 0x00800000 - misc-$(CONFIG_SPRUCE) := misc-spruce.o + misc-$(CONFIG_SPRUCE) += misc-spruce.o # SMP images should have a '.smp' suffix. end-$(CONFIG_SMP) += .smp diff -Nru a/arch/ppc/boot/simple/misc-spruce.c b/arch/ppc/boot/simple/misc-spruce.c --- a/arch/ppc/boot/simple/misc-spruce.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/boot/simple/misc-spruce.c Tue Feb 17 20:00:07 2004 @@ -15,55 +15,19 @@ */ #include -#include #include #include -#include -#include #include -#include "zlib.h" +extern unsigned long decompress_kernel(unsigned long load_addr, int num_words, + unsigned long cksum); /* Define some important locations of the Spruce. */ #define SPRUCE_PCI_CONFIG_ADDR 0xfec00000 #define SPRUCE_PCI_CONFIG_DATA 0xfec00004 #define SPRUCE_ISA_IO_BASE 0xf8000000 -unsigned long com_port; - -char *avail_ram; -char *end_avail; - -/* The linker tells us where the image is. */ -extern char __image_begin, __image_end; -extern char __ramdisk_begin, __ramdisk_end; -extern char _end[]; - -#ifdef CONFIG_CMDLINE -#define CMDLINE CONFIG_CMDLINE -#else -#define CMDLINE "" -#endif -char cmd_preset[] = CMDLINE; -char cmd_buf[256]; -char *cmd_line = cmd_buf; - -unsigned long initrd_size = 0; - -char *zimage_start; -int zimage_size; - -extern void udelay(long); -extern void puts(const char *); -extern void putc(const char c); -extern void puthex(unsigned long val); -extern int getc(void); -extern int tstc(void); -extern void gunzip(void *, int, unsigned char *, int *); - -extern unsigned long serial_init(int chan, void *ignored); - /* PCI configuration space access routines. */ unsigned int *pci_config_address = (unsigned int *)SPRUCE_PCI_CONFIG_ADDR; unsigned char *pci_config_data = (unsigned char *)SPRUCE_PCI_CONFIG_DATA; @@ -146,45 +110,16 @@ #define MEM_B2EA 0x60 unsigned long -load_kernel(unsigned long load_addr, int num_words, unsigned long cksum) +get_mem_size(void) { - int timer = 0; - char *cp, ch; - int loop; - int csr0; - int csr_id; - int *mem_addr = (int *)0xff500008; - int *mem_data = (int *)0xff50000c; - int mem_size = 0; + unsigned long mem_size = 0; unsigned long mem_mben; unsigned long mem_type; unsigned long mem_start; unsigned long mem_end; - int *pif_addr = (int *)0xff500000; - int *pif_data = (int *)0xff500004; - int pci_devfn; - int found_multi = 0; - unsigned short vendor; - unsigned short device; - unsigned short command; - unsigned char header_type; - unsigned int bar0; - -#ifdef CONFIG_SERIAL_8250_CONSOLE - /* Initialize the serial console port */ - com_port = serial_init(0, NULL); -#endif - - /* - * Gah, these firmware guys need to learn that hardware - * byte swapping is evil! Disable all hardware byte - * swapping so it doesn't hurt anyone. - */ - *pif_addr = PLBMIFOPT; - asm("sync"); - *pif_data = 0x00000000; - asm("sync"); + volatile int *mem_addr = (int *)0xff500008; + volatile int *mem_data = (int *)0xff50000c; /* Get the size of memory from the memory controller. */ *mem_addr = MEM_MBEN; @@ -235,6 +170,33 @@ mem_size += mem_end - mem_start + 0x100000; } + return mem_size; +} + +unsigned long +load_kernel(unsigned long load_addr, int num_words, unsigned long cksum) +{ + int csr0; + int csr_id; + int pci_devfn; + int found_multi = 0; + unsigned short vendor; + unsigned short device; + unsigned short command; + unsigned char header_type; + unsigned int bar0; + volatile int *pif_addr = (int *)0xff500000; + volatile int *pif_data = (int *)0xff500004; + + /* + * Gah, these firmware guys need to learn that hardware + * byte swapping is evil! Disable all hardware byte + * swapping so it doesn't hurt anyone. + */ + *pif_addr = PLBMIFOPT; + asm("sync"); + *pif_data = 0x00000000; + asm("sync"); /* Search out and turn off the PcNet ethernet boot device. */ for (pci_devfn = 1; pci_devfn < 0xff; pci_devfn++) { @@ -310,134 +272,5 @@ } } - /* assume the chunk below 8M is free */ - end_avail = (char *)0x00800000; - - /* - * We link ourself to 0x00800000. When we run, we relocate - * ourselves there. So we just need __image_begin for the - * start. -- Tom - */ - zimage_start = (char *)(unsigned long)(&__image_begin); - zimage_size = (unsigned long)(&__image_end) - - (unsigned long)(&__image_begin); - - initrd_size = (unsigned long)(&__ramdisk_end) - - (unsigned long)(&__ramdisk_begin); - - /* - * The zImage and initrd will be between start and _end, so they've - * already been moved once. We're good to go now. -- Tom - */ - avail_ram = (char *)PAGE_ALIGN((unsigned long)_end); - puts("zimage at: "); puthex((unsigned long)zimage_start); - puts(" "); puthex((unsigned long)(zimage_size+zimage_start)); - puts("\n"); - - if ( initrd_size ) { - puts("initrd at: "); - puthex((unsigned long)(&__ramdisk_begin)); - puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n"); - } - - avail_ram = (char *)0x00400000; - end_avail = (char *)0x00800000; - puts("avail ram: "); puthex((unsigned long)avail_ram); puts(" "); - puthex((unsigned long)end_avail); puts("\n"); - - /* Display standard Linux/PPC boot prompt for kernel args */ - puts("\nLinux/PPC load: "); - cp = cmd_line; - memcpy (cmd_line, cmd_preset, sizeof(cmd_preset)); - while ( *cp ) putc(*cp++); - while (timer++ < 5*1000) { - if (tstc()) { - while ((ch = getc()) != '\n' && ch != '\r') { - if (ch == '\b') { - if (cp != cmd_line) { - cp--; - puts("\b \b"); - } - } else { - *cp++ = ch; - putc(ch); - } - } - break; /* Exit 'timer' loop */ - } - udelay(1000); /* 1 msec */ - } - *cp = 0; - puts("\n"); - - puts("Uncompressing Linux..."); - - gunzip(0, 0x400000, zimage_start, &zimage_size); - - puts("done.\n"); - - { - struct bi_record *rec; - unsigned long initrd_loc; - unsigned long rec_loc = _ALIGN((unsigned long)(zimage_size) + - (1 << 20) - 1, (1 << 20)); - rec = (struct bi_record *)rec_loc; - - /* We need to make sure that the initrd and bi_recs do not - * overlap. */ - if ( initrd_size ) { - initrd_loc = (unsigned long)(&__ramdisk_begin); - /* If the bi_recs are in the middle of the current - * initrd, move the initrd to the next MB - * boundary. */ - if ((rec_loc > initrd_loc) && - ((initrd_loc + initrd_size) - > rec_loc)) { - initrd_loc = _ALIGN((unsigned long)(zimage_size) - + (2 << 20) - 1, (2 << 20)); - memmove((void *)initrd_loc, &__ramdisk_begin, - initrd_size); - puts("initrd moved: "); puthex(initrd_loc); - puts(" "); puthex(initrd_loc + initrd_size); - puts("\n"); - } - } - - rec->tag = BI_FIRST; - rec->size = sizeof(struct bi_record); - rec = (struct bi_record *)((unsigned long)rec + rec->size); - - rec->tag = BI_BOOTLOADER_ID; - memcpy( (void *)rec->data, "spruceboot", 11); - rec->size = sizeof(struct bi_record) + 10 + 1; - rec = (struct bi_record *)((unsigned long)rec + rec->size); - - rec->tag = BI_MEMSIZE; - rec->data[0] = mem_size; - rec->size = sizeof(struct bi_record) + sizeof(unsigned long); - rec = (struct bi_record *)((unsigned long)rec + rec->size); - - rec->tag = BI_CMD_LINE; - memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1); - rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1; - rec = (struct bi_record *)((ulong)rec + rec->size); - - if ( initrd_size ) { - rec->tag = BI_INITRD; - rec->data[0] = initrd_loc; - rec->data[1] = initrd_size; - rec->size = sizeof(struct bi_record) + 2 * - sizeof(unsigned long); - rec = (struct bi_record *)((unsigned long)rec + - rec->size); - } - - rec->tag = BI_LAST; - rec->size = sizeof(struct bi_record); - rec = (struct bi_record *)((unsigned long)rec + rec->size); - } - - puts("Now booting the kernel\n"); - - return 0; + return decompress_kernel(load_addr, num_words, cksum); } diff -Nru a/arch/ppc/boot/simple/misc.c b/arch/ppc/boot/simple/misc.c --- a/arch/ppc/boot/simple/misc.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/boot/simple/misc.c Tue Feb 17 20:00:07 2004 @@ -1,5 +1,5 @@ /* - * arch/ppc/common/misc-simple.c + * arch/ppc/simple/misc.c * * Misc. bootloader code for many machines. This assumes you have are using * a 6xx/7xx/74xx CPU in your machine. This assumes the chunk of memory @@ -46,6 +46,15 @@ #define HAS_KEYB 0 #endif +/* Will / Can the user give input? + * Val Henson has requested that Gemini doesn't wait for the + * user to edit the cmdline or not. + */ +#if (defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_VGA_CONSOLE)) \ + && !defined(CONFIG_GEMINI) +#define INTERACTIVE_CONSOLE 1 +#endif + char *avail_ram; char *end_avail; char *zimage_start; @@ -66,19 +75,28 @@ extern unsigned long start; extern int CRT_tstc(void); -extern unsigned long get_mem_size(void); extern unsigned long serial_init(int chan, void *ignored); extern void serial_close(unsigned long com_port); extern void gunzip(void *, int, unsigned char *, int *); extern void serial_fixups(void); +/* Allow get_mem_size to be hooked into. This is the default. */ +unsigned long __attribute__ ((weak)) +get_mem_size(void) +{ + return 0; +} + struct bi_record * decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum) { +#ifdef INTERACTIVE_CONSOLE int timer = 0; - char *cp, ch; + char ch; +#endif + char *cp; struct bi_record *rec; - unsigned long TotalMemory = 0, rec_loc, initrd_loc; + unsigned long initrd_loc, TotalMemory = 0; serial_fixups(); com_port = serial_init(0, NULL); @@ -93,13 +111,11 @@ __asm__ __volatile__("eieio"); #endif -#if defined(CONFIG_LOPEC) || defined(CONFIG_PAL4) /* * Call get_mem_size(), which is memory controller dependent, * and we must have the correct file linked in here. */ TotalMemory = get_mem_size(); -#endif /* assume the chunk below 8M is free */ end_avail = (char *)0x00800000; @@ -170,9 +186,11 @@ memcpy (cmd_line, cmd_preset, sizeof(cmd_preset)); while ( *cp ) putc(*cp++); -#ifndef CONFIG_GEMINI - /* Val Henson has requested that Gemini doesn't wait for the - * user to edit the cmdline or not. */ +#ifdef INTERACTIVE_CONSOLE + /* + * If they have a console, allow them to edit the command line. + * Otherwise, don't bother wasting the five seconds. + */ while (timer++ < 5*1000) { if (tstc()) { while ((ch = getc()) != '\n' && ch != '\r') { @@ -205,16 +223,13 @@ gunzip(0, 0x400000, zimage_start, &zimage_size); puts("done.\n"); - /* - * Create bi_recs for cmd_line and initrds - */ - rec_loc = _ALIGN((unsigned long)(zimage_size) + - (1 << 20) - 1, (1 << 20)); - rec = (struct bi_record *)rec_loc; + /* get the bi_rec address */ + rec = bootinfo_addr(zimage_size); /* We need to make sure that the initrd and bi_recs do not * overlap. */ if ( initrd_size ) { + unsigned long rec_loc = (unsigned long) rec; initrd_loc = (unsigned long)(&__ramdisk_begin); /* If the bi_recs are in the middle of the current * initrd, move the initrd to the next MB @@ -231,39 +246,25 @@ } } - rec->tag = BI_FIRST; - rec->size = sizeof(struct bi_record); - rec = (struct bi_record *)((unsigned long)rec + rec->size); - - if ( TotalMemory ) { - rec->tag = BI_MEMSIZE; - rec->data[0] = TotalMemory; - rec->size = sizeof(struct bi_record) + sizeof(unsigned long); - rec = (struct bi_record *)((unsigned long)rec + rec->size); - } + bootinfo_init(rec); + if ( TotalMemory ) + bootinfo_append(BI_MEMSIZE, sizeof(int), (void*)&TotalMemory); - rec->tag = BI_CMD_LINE; - memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1); - rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1; - rec = (struct bi_record *)((unsigned long)rec + rec->size); + bootinfo_append(BI_CMD_LINE, strlen(cmd_line)+1, (void*)cmd_line); - if ( initrd_size ) { - rec->tag = BI_INITRD; - rec->data[0] = initrd_loc; - rec->data[1] = initrd_size; - rec->size = sizeof(struct bi_record) + 2 * - sizeof(unsigned long); - rec = (struct bi_record *)((unsigned long)rec + - rec->size); - } + /* add a bi_rec for the initrd if it exists */ + if (initrd_size) { + unsigned long initrd[2]; - rec->tag = BI_LAST; - rec->size = sizeof(struct bi_record); - rec = (struct bi_record *)((unsigned long)rec + rec->size); + initrd[0] = initrd_loc; + initrd[1] = initrd_size; + + bootinfo_append(BI_INITRD, sizeof(initrd), &initrd); + } puts("Now booting the kernel\n"); serial_close(com_port); - return (struct bi_record *)rec_loc; + return rec; } /* Allow decompress_kernel to be hooked into. This is the default. */ diff -Nru a/arch/ppc/configs/common_defconfig b/arch/ppc/configs/common_defconfig --- a/arch/ppc/configs/common_defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/configs/common_defconfig Tue Feb 17 20:00:06 2004 @@ -210,7 +210,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/ppc/configs/pmac_defconfig b/arch/ppc/configs/pmac_defconfig --- a/arch/ppc/configs/pmac_defconfig Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/configs/pmac_defconfig Tue Feb 17 20:00:08 2004 @@ -217,7 +217,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/ppc/configs/spruce_defconfig b/arch/ppc/configs/spruce_defconfig --- a/arch/ppc/configs/spruce_defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/configs/spruce_defconfig Tue Feb 17 20:00:06 2004 @@ -4,11 +4,17 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +24,15 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_EMBEDDED is not set +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y CONFIG_FUTEX=y CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # # Loadable module support @@ -33,24 +45,25 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y CONFIG_6xx=y # CONFIG_40x is not set +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_ALTIVEC is not set +# CONFIG_TAU is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -# CONFIG_8260 is not set -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC_STD_MMU=y # CONFIG_PPC_MULTIPLATFORM is not set # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -66,36 +79,32 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set -# CONFIG_SPRUCE_BAUD_33M is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set +CONFIG_PPC_GEN550=y +CONFIG_SPRUCE_BAUD_33M=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_ALTIVEC is not set -# CONFIG_TAU is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="ip=on" # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set # -# Parallel port support -# -# CONFIG_PARPORT is not set -# CONFIG_PPC601_SYNC_FIX is not set -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="ip=on" - -# # Advanced setup # # CONFIG_ADVANCED_OPTIONS is not set @@ -110,14 +119,26 @@ CONFIG_BOOT_LOAD=0x00800000 # +# Device Drivers +# + +# +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set # +# Parallel port support +# +# CONFIG_PARPORT is not set + +# # Plug and Play support # -# CONFIG_PNP is not set # # Block devices @@ -131,21 +152,22 @@ # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_INITRD is not set +# CONFIG_LBD is not set # -# Multi-device support (RAID and LVM) +# ATA/ATAPI/MFM/RLL support # -# CONFIG_MD is not set +# CONFIG_IDE is not set # -# ATA/IDE/MFM/RLL support +# SCSI device support # -# CONFIG_IDE is not set +# CONFIG_SCSI is not set # -# SCSI support +# Multi-device support (RAID and LVM) # -# CONFIG_SCSI is not set +# CONFIG_MD is not set # # Fusion MPT device support @@ -162,6 +184,10 @@ # CONFIG_I2O is not set # +# Macintosh device drivers +# + +# # Networking support # CONFIG_NET=y @@ -172,7 +198,6 @@ CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -191,7 +216,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -200,9 +227,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -230,13 +257,13 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=y +CONFIG_CRC32=y # CONFIG_OAKNET is not set # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set @@ -252,6 +279,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set @@ -276,6 +304,7 @@ # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set @@ -294,8 +323,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -315,19 +345,19 @@ # CONFIG_IRDA is not set # -# ISDN subsystem +# Bluetooth support # -# CONFIG_ISDN_BOOL is not set +# CONFIG_BT is not set # -# Graphics support +# ISDN subsystem # -# CONFIG_FB is not set +# CONFIG_ISDN_BOOL is not set # -# Old CD-ROM drivers (not SCSI, not IDE) +# Telephony Support # -# CONFIG_CD_NO_IDESCSI is not set +# CONFIG_PHONE is not set # # Input device support @@ -347,18 +377,16 @@ CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set +CONFIG_SERIO_PCIPS2=y # # Input Device Drivers # # -# Macintosh device drivers -# - -# # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -366,6 +394,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=2 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -377,20 +406,6 @@ CONFIG_UNIX98_PTY_COUNT=256 # -# I2C support -# -# CONFIG_I2C is not set - -# -# I2C Hardware Sensors Mainboard support -# - -# -# I2C Hardware Sensors Chip support -# -# CONFIG_I2C_SENSOR is not set - -# # Mice # # CONFIG_BUSMOUSE is not set @@ -419,7 +434,11 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set + +# +# I2C support +# +# CONFIG_I2C is not set # # Multimedia devices @@ -432,6 +451,26 @@ # CONFIG_DVB is not set # +# Graphics support +# +# CONFIG_FB is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# # File systems # CONFIG_EXT2_FS=y @@ -470,10 +509,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set -# CONFIG_TMPFS is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -498,6 +539,7 @@ CONFIG_NFS_FS=y # CONFIG_NFS_V3 is not set # CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set # CONFIG_NFSD is not set CONFIG_ROOT_NFS=y CONFIG_LOCKD=y @@ -518,31 +560,19 @@ CONFIG_MSDOS_PARTITION=y # -# Sound -# -# CONFIG_SOUND is not set - -# -# USB support +# Native Language Support # -# CONFIG_USB is not set -# CONFIG_USB_GADGET is not set - -# -# Bluetooth support -# -# CONFIG_BT is not set +# CONFIG_NLS is not set # # Library routines # -# CONFIG_CRC32 is not set # # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set +# CONFIG_SERIAL_TEXT_DEBUG is not set # # Security options diff -Nru a/arch/ppc/defconfig b/arch/ppc/defconfig --- a/arch/ppc/defconfig Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/defconfig Tue Feb 17 20:00:07 2004 @@ -218,7 +218,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/ppc/kernel/Makefile b/arch/ppc/kernel/Makefile --- a/arch/ppc/kernel/Makefile Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/Makefile Tue Feb 17 20:00:08 2004 @@ -22,11 +22,12 @@ semaphore.o syscalls.o setup.o \ cputable.o ppc_htab.o obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o +obj-$(CONFIG_POWER4) += cpu_setup_power4.o obj-$(CONFIG_MODULES) += module.o ppc_ksyms.o obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_PCI) += pci-dma.o obj-$(CONFIG_KGDB) += ppc-stub.o -obj-$(CONFIG_SMP) += smp.o +obj-$(CONFIG_SMP) += smp.o smp-tbsync.o obj-$(CONFIG_TAU) += temp.o ifdef CONFIG_MATH_EMULATION diff -Nru a/arch/ppc/kernel/cpu_setup_6xx.S b/arch/ppc/kernel/cpu_setup_6xx.S --- a/arch/ppc/kernel/cpu_setup_6xx.S Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/kernel/cpu_setup_6xx.S Tue Feb 17 20:00:06 2004 @@ -142,7 +142,7 @@ sync isync blr - + /* 740/750/7400/7410 * Enable Store Gathering (SGE), Address Brodcast (ABE), * Branch History Table (BHTE), Branch Target ICache (BTIC) @@ -213,7 +213,7 @@ li r7,CPU_FTR_CAN_NAP andc r6,r6,r7 stw r6,CPU_SPEC_FEATURES(r5) -1: +1: mfspr r11,HID0 /* All of the bits we have to set..... @@ -248,20 +248,21 @@ /* Definitions for the table use to save CPU states */ #define CS_HID0 0 #define CS_HID1 4 -#define CS_MSSCR0 8 -#define CS_MSSSR0 12 -#define CS_ICTRL 16 -#define CS_LDSTCR 20 -#define CS_LDSTDB 24 -#define CS_SIZE 28 +#define CS_HID2 8 +#define CS_MSSCR0 12 +#define CS_MSSSR0 16 +#define CS_ICTRL 20 +#define CS_LDSTCR 24 +#define CS_LDSTDB 28 +#define CS_SIZE 32 .data .balign L1_CACHE_LINE_SIZE -cpu_state_storage: +cpu_state_storage: .space CS_SIZE .balign L1_CACHE_LINE_SIZE,0 .text - + /* Called in normal context to backup CPU 0 state. This * does not include cache settings. This function is also * called for machine sleep. This does not include the MMU @@ -311,11 +312,18 @@ stw r4,CS_LDSTCR(r5) mfspr r4,SPRN_LDSTDB stw r4,CS_LDSTDB(r5) -1: +1: bne cr5,1f /* Backup 750FX specific registers */ mfspr r4,SPRN_HID1 stw r4,CS_HID1(r5) + /* If rev 2.x, backup HID2 */ + mfspr r3,PVR + andi. r3,r3,0xff00 + cmpi cr0,r3,0x0200 + bne 1f + mfspr r4,SPRN_HID2 + stw r4,CS_HID2(r5) 1: mtcr r7 blr @@ -395,9 +403,19 @@ sync 2: bne cr5,1f /* Restore 750FX specific registers - * that is restore PLL config & switch - * to PLL 0 + * that is restore HID2 on rev 2.x and PLL config & switch + * to PLL 0 on all */ + /* If rev 2.x, restore HID2 with low voltage bit cleared */ + mfspr r3,PVR + andi. r3,r3,0xff00 + cmpi cr0,r3,0x0200 + bne 4f + lwz r4,CS_HID2(r5) + rlwinm r4,r4,0,19,17 + mtspr SPRN_HID2,r4 + sync +4: lwz r4,CS_HID1(r5) rlwinm r5,r4,0,16,14 mtspr SPRN_HID1,r5 diff -Nru a/arch/ppc/kernel/cpu_setup_power4.S b/arch/ppc/kernel/cpu_setup_power4.S --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/kernel/cpu_setup_power4.S Tue Feb 17 20:00:14 2004 @@ -0,0 +1,182 @@ +/* + * This file contains low level CPU setup functions. + * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +_GLOBAL(__power4_cpu_preinit) + /* + * On the PPC970, we have to turn off real-mode cache inhibit + * early, before we first turn the MMU off. + */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bnelr + + li r0,0 + sync + mtspr SPRN_HID4,r0 + isync + sync + mtspr SPRN_HID5,r0 + isync + + mfspr r0,SPRN_HID1 + li r11,0x1200 /* enable i-fetch cacheability */ + sldi r11,r11,44 /* and prefetch */ + or r0,r0,r11 + mtspr SPRN_HID1,r0 + mtspr SPRN_HID1,r0 + isync + li r0,0 + sync + mtspr SPRN_HIOR,0 /* Clear interrupt prefix */ + isync + blr + +_GLOBAL(__setup_cpu_power4) + blr +_GLOBAL(__setup_cpu_ppc970) + mfspr r0,SPRN_HID0 + li r11,5 /* clear DOZE and SLEEP */ + rldimi r0,r11,52,8 /* set NAP and DPM */ + mtspr SPRN_HID0,r0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + sync + isync + blr + +/* Definitions for the table use to save CPU states */ +#define CS_HID0 0 +#define CS_HID1 8 +#define CS_HID4 16 +#define CS_HID5 24 +#define CS_SIZE 32 + + .data + .balign L1_CACHE_LINE_SIZE +cpu_state_storage: + .space CS_SIZE + .balign L1_CACHE_LINE_SIZE,0 + .text + +/* Called in normal context to backup CPU 0 state. This + * does not include cache settings. This function is also + * called for machine sleep. This does not include the MMU + * setup, BATs, etc... but rather the "special" registers + * like HID0, HID1, HID4, etc... + */ +_GLOBAL(__save_cpu_setup) + /* Some CR fields are volatile, we back it up all */ + mfcr r7 + + /* Get storage ptr */ + lis r5,cpu_state_storage@h + ori r5,r5,cpu_state_storage@l + + /* We only deal with 970 for now */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bne 1f + + /* Save HID0,1,4 and 5 */ + mfspr r3,SPRN_HID0 + std r3,CS_HID0(r5) + mfspr r3,SPRN_HID1 + std r3,CS_HID1(r5) + mfspr r3,SPRN_HID4 + std r3,CS_HID4(r5) + mfspr r3,SPRN_HID5 + std r3,CS_HID5(r5) + +1: + mtcr r7 + blr + +/* Called with no MMU context (typically MSR:IR/DR off) to + * restore CPU state as backed up by the previous + * function. This does not include cache setting + */ +_GLOBAL(__restore_cpu_setup) + /* Some CR fields are volatile, we back it up all */ + mfcr r7 + + /* Get storage ptr */ + lis r5,(cpu_state_storage-KERNELBASE)@h + ori r5,r5,cpu_state_storage@l + + /* We only deal with 970 for now */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bne 1f + + /* Clear interrupt prefix */ + li r0,0 + sync + mtspr SPRN_HIOR,0 + isync + + /* Restore HID0 */ + ld r3,CS_HID0(r5) + sync + isync + mtspr SPRN_HID0,r3 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + sync + isync + + /* Restore HID1 */ + ld r3,CS_HID1(r5) + sync + isync + mtspr SPRN_HID1,r3 + mtspr SPRN_HID1,r3 + sync + isync + + /* Restore HID4 */ + ld r3,CS_HID4(r5) + sync + isync + mtspr SPRN_HID4,r3 + sync + isync + + /* Restore HID5 */ + ld r3,CS_HID5(r5) + sync + isync + mtspr SPRN_HID5,r3 + sync + isync +1: + mtcr r7 + blr + diff -Nru a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S --- a/arch/ppc/kernel/entry.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/entry.S Tue Feb 17 20:00:08 2004 @@ -689,8 +689,8 @@ mtspr SPRN_ESR,r10 lwz r11,_NIP(r1) lwz r12,_MSR(r1) - mtspr SRR2,r11 - mtspr SRR3,r12 + mtspr CSRR0,r11 + mtspr CSRR1,r12 lwz r9,GPR9(r1) lwz r12,GPR12(r1) lwz r10,crit_sprg0@l(0) diff -Nru a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S --- a/arch/ppc/kernel/head.S Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/kernel/head.S Tue Feb 17 20:00:07 2004 @@ -141,17 +141,6 @@ mr r27,r7 li r24,0 /* cpu # */ -#ifdef CONFIG_POWER4 -/* - * On the PPC970, we have to turn off real-mode cache inhibit - * early, before we first turn the MMU off. - */ - mfspr r0,SPRN_PVR - srwi r0,r0,16 - cmpwi r0,0x39 - beql ppc970_setup_hid -#endif /* CONFIG_POWER4 */ - /* * early_init() does the early machine identification and does * the necessary low-level setup and clears the BSS @@ -159,6 +148,14 @@ */ bl early_init +/* + * On POWER4, we first need to tweak some CPU configuration registers + * like real mode cache inhibit or exception base + */ +#ifdef CONFIG_POWER4 + bl __power4_cpu_preinit +#endif /* CONFIG_POWER4 */ + #ifdef CONFIG_APUS /* On APUS the __va/__pa constants need to be set to the correct * values before continuing. @@ -1216,7 +1213,7 @@ __secondary_start: #ifdef CONFIG_PPC64BRIDGE mfmsr r0 - clrldi r0,r0,1 /* make sure it's in 32-bit mode */ + clrldi r0,r0,1 /* make sure it's in 32-bit mode */ SYNC MTMSRD(r0) isync @@ -1278,26 +1275,15 @@ */ _GLOBAL(__setup_cpu_power3) blr -_GLOBAL(__setup_cpu_power4) - blr -_GLOBAL(__setup_cpu_ppc970) - blr _GLOBAL(__setup_cpu_generic) blr -#ifndef CONFIG_6xx +#if !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) _GLOBAL(__save_cpu_setup) blr _GLOBAL(__restore_cpu_setup) -#ifdef CONFIG_POWER4 - /* turn off real-mode cache inhibit on the PPC970 */ - mfspr r0,SPRN_PVR - srwi r0,r0,16 - cmpwi r0,0x39 - beq ppc970_setup_hid -#endif blr -#endif /* CONFIG_6xx */ +#endif /* !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) */ /* @@ -1633,10 +1619,14 @@ lis r4,0x2000 /* set pseudo-segment reg 12 */ ori r5,r4,0x0ccc mtsr 12,r5 +#if 0 ori r5,r4,0x0888 /* set pseudo-segment reg 8 */ mtsr 8,r5 /* (for access to serial port) */ - ori r5,r4,0x0999 /* set pseudo-segment reg 8 */ +#endif +#ifdef CONFIG_BOOTX_TEXT + ori r5,r4,0x0999 /* set pseudo-segment reg 9 */ mtsr 9,r5 /* (for access to screen) */ +#endif mfmsr r0 clrldi r0,r0,1 sync @@ -1644,43 +1634,8 @@ isync blr -/* - * On 970 (G5), we pre-set a few bits in HID0 & HID1 - */ -ppc970_setup_hid: - li r0,0 - sync - mtspr 0x3f4,r0 - isync - sync - mtspr 0x3f6,r0 - isync - mfspr r0,SPRN_HID0 - li r11,1 /* clear DOZE, NAP and SLEEP */ - rldimi r0,r11,52,8 /* set DPM */ - mtspr SPRN_HID0,r0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - sync - isync - mfspr r0,SPRN_HID1 - li r11,0x1200 /* enable i-fetch cacheability */ - sldi r11,r11,44 /* and prefetch */ - or r0,r0,r11 - mtspr SPRN_HID1,r0 - mtspr SPRN_HID1,r0 - isync - li r0,0 - sync - mtspr 0x137,0 - isync - blr #endif /* CONFIG_POWER4 */ - + #ifdef CONFIG_8260 /* Jump into the system reset for the rom. * We first disable the MMU, and then jump to the ROM reset address. @@ -1702,7 +1657,7 @@ andc r11, r11, r10 mtspr HID0, r11 isync - li r5, MSR_ + li r5, MSR_ME|MSR_RI lis r6,2f@h addis r6,r6,-KERNELBASE@h ori r6,r6,2f@l diff -Nru a/arch/ppc/kernel/head_44x.S b/arch/ppc/kernel/head_44x.S --- a/arch/ppc/kernel/head_44x.S Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/kernel/head_44x.S Tue Feb 17 20:00:06 2004 @@ -90,14 +90,9 @@ * Invalidate all entries but the one we are using. */ /* Load our current PID->MMUCR TID and MSR IS->MMUCR STS */ - mfspr r3,SPRN_MMUCR /* Get MMUCR */ - lis r4,PPC44x_MMUCR_STS@h - ori r4,r4,PPC44x_MMUCR_TID@l /* Create mask */ - andc r3,r3,r4 /* Clear out TID/STS bits */ - mfspr r4,SPRN_PID /* Get PID */ - or r3,r3,r4 /* Set TID bits */ - mfmsr r5 /* Get MSR */ - andi. r5,r5,MSR_IS@l /* TS=1? */ + mfspr r3,SPRN_PID /* Get PID */ + mfmsr r4 /* Get MSR */ + andi. r4,r4,MSR_IS@l /* TS=1? */ beq wmmucr /* If not, leave STS=0 */ oris r3,r3,PPC44x_MMUCR_STS@h /* Set STS=1 */ wmmucr: mtspr SPRN_MMUCR,r3 /* Put MMUCR */ @@ -117,7 +112,7 @@ isync /* If so, context change */ /* - * Configure and load pinned entries into TLB slots 62 and 63. + * Configure and load pinned entry into TLB slot 63. */ lis r3,KERNELBASE@h /* Load the kernel virtual address */ @@ -131,17 +126,14 @@ mtspr SPRN_PID,r0 sync - /* Load the kernel TID = 0 */ - mfspr r5,SPRN_MMUCR - lis r6, PPC44x_MMUCR_TID@h - ori r6,r6,PPC44x_MMUCR_TID@l - andc r5,r5,r6 + /* Initialize MMUCR */ + li r5,0 mtspr SPRN_MMUCR,r5 sync /* pageid fields */ clrrwi r3,r3,10 /* Mask off the effective page number */ - ori r3,r3,(PPC44x_TLB_VALID | PPC44x_TLB_PAGESZ(PPC44x_PAGESZ_256M)) + ori r3,r3,PPC44x_TLB_VALID | PPC44x_TLB_256M /* xlat fields */ clrrwi r4,r4,10 /* Mask off the real page number */ @@ -152,7 +144,7 @@ li r5,0 ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G) - li r0,62 /* TLB slot 62 */ + li r0,63 /* TLB slot 63 */ tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */ tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */ @@ -174,14 +166,7 @@ tlbwe r6,r23,PPC44x_TLB_PAGEID sync -4: ori r3,r3,PPC44x_TLB_TS /* TS = 1 */ - - li r0,63 /* TLB slot 63 */ - - tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */ - tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */ - tlbwe r5,r0,PPC44x_TLB_ATTRIB /* Load the attrib/access fields */ - +4: #ifdef CONFIG_SERIAL_TEXT_DEBUG /* * Add temporary UART mapping for early debug. This @@ -191,7 +176,7 @@ */ /* pageid fields */ lis r3,0xe000 - ori r3,r3,(PPC44x_TLB_VALID | PPC44x_TLB_PAGESZ(PPC44x_PAGESZ_256M)) + ori r3,r3,PPC44x_TLB_VALID | PPC44x_TLB_256M /* xlat fields */ lis r4,0x4000 /* RPN is 0x40000000 */ @@ -201,7 +186,7 @@ li r5,0 ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G) - li r0,60 /* TLB slot 60 */ + li r0,1 /* TLB slot 1 */ tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */ tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */ @@ -209,15 +194,15 @@ ori r3,r3,PPC44x_TLB_TS /* Translation state 1 */ - li r0,61 /* TLB slot 61 */ + li r0,1 /* TLB slot 1 */ tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */ tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */ tlbwe r5,r0,PPC44x_TLB_ATTRIB /* Load the attrib/access fields */ -#endif /* CONFIG_SERIAL_TEXT_DEBUG */ /* Force context change */ isync +#endif /* CONFIG_SERIAL_TEXT_DEBUG */ /* Establish the interrupt vector offsets */ SET_IVOR(0, CriticalInput); @@ -493,10 +478,8 @@ lis r11, swapper_pg_dir@h ori r11, r11, swapper_pg_dir@l - mfspr r12,SPRN_MMUCR /* Set TID to 0 */ - li r13,PPC44x_MMUCR_TID@l - andc r12,r12,r13 - mtspr SPRN_MMUCR,r12 + mfspr r12,SPRN_MMUCR + rlwinm r12,r12,0,0,23 /* Clear TID */ b 4f @@ -505,19 +488,14 @@ mfspr r11,SPRG3 lwz r11,PGDIR(r11) - /* Load MMUCR with our PID and STS= */ - mfspr r12,SPRN_MMUCR /* Get MMUCR */ - lis r13,PPC44x_MMUCR_STS@h - ori r13,r13,PPC44x_MMUCR_TID@l /* Create mask */ - andc r12,r12,r13 /* Clear out TID/STS bits */ - mfspr r13,SPRN_PID /* Get PID */ - or r12,r12,r13 /* Set TID bits */ - mfspr r14,SPRN_SRR1 /* Get SRR1 */ - andi. r14,r14,MSR_IS@l /* TS=1? */ - beq 4f /* If not, leave STS=0 */ - oris r12,r12,PPC44x_MMUCR_STS@h /* Set STS=1 */ - mtspr SPRN_MMUCR,r12 + /* Load PID into MMUCR TID */ + mfspr r12,SPRN_MMUCR /* Get MMUCR */ + mfspr r13,SPRN_PID /* Get PID */ + rlwimi r12,r13,0,24,31 /* Set TID */ + 4: + mtspr SPRN_MMUCR,r12 + rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ lwzx r11, r12, r11 /* Get pgd/pmd entry */ rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ @@ -534,22 +512,24 @@ ori r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE stw r11, 4(r12) /* Update Linux page table */ - /* FIXME: Staticly setting some permissions */ - li r13, 0x003f /* Set UX,UW,UR,SX,SW,SR */ - andi. r11,r11,0xffff /* Clear MS 16 bits */ - /* FIXME: Force attributes */ - ori r11,r11, 0x0100 /* Set G */ - /* FIXME: Already set in PTE */ + li r13, PPC44x_TLB_SR@l /* Set SR */ + rlwimi r13, r11, 29, 29, 29 /* SX = _PAGE_HWEXEC */ + rlwimi r13, r11, 0, 30, 30 /* SW = _PAGE_RW */ + rlwimi r13, r11, 29, 28, 28 /* UR = _PAGE_USER */ + rlwimi r12, r11, 31, 26, 26 /* (_PAGE_USER>>1)->r12 */ + rlwimi r12, r11, 29, 30, 30 /* (_PAGE_USER>>3)->r12 */ + and r12, r12, r11 /* HWEXEC/RW & USER */ + rlwimi r13, r12, 0, 26, 26 /* UX = HWEXEC & USER */ + rlwimi r13, r12, 3, 27, 27 /* UW = RW & USER */ + rlwimi r11,r13,0,26,31 /* Insert static perms */ - lis r13,0xffff - ori r13,r13,0x0fff /* Set U0-U3 mask */ - and r11,r11,r13 /* Clear U0-U3 */ + rlwinm r11,r11,0,20,15 /* Clear U0-U3 */ /* find the TLB index that caused the fault. It has to be here. */ tlbsx r14, 0, r10 - tlbwe r11, r14, PPC44x_TLB_ATTRIB /* Write ATTRIB */ + tlbwe r11, r14, PPC44x_TLB_ATTRIB /* Write ATTRIB */ /* Done...restore registers and get out of here. */ @@ -651,10 +631,8 @@ lis r11, swapper_pg_dir@h ori r11, r11, swapper_pg_dir@l - mfspr r12,SPRN_MMUCR /* Set TID to 0 */ - li r13,PPC44x_MMUCR_TID@l - andc r12,r12,r13 - mtspr SPRN_MMUCR,r12 + mfspr r12,SPRN_MMUCR + rlwinm r12,r12,0,0,23 /* Clear TID */ b 4f @@ -664,12 +642,13 @@ lwz r11,PGDIR(r11) /* Load PID into MMUCR TID */ - li r13,PPC44x_MMUCR_TID@l /* Create mask */ - andc r12,r12,r13 /* Clear out TID/STS bits */ - mfspr r13,SPRN_PID /* Get PID */ - or r12,r12,r13 - mtspr SPRN_MMUCR,r12 + mfspr r12,SPRN_MMUCR + mfspr r13,SPRN_PID /* Get PID */ + rlwimi r12,r13,0,24,31 /* Set TID */ + 4: + mtspr SPRN_MMUCR,r12 + rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ lwzx r11, r12, r11 /* Get pgd/pmd entry */ rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ @@ -723,10 +702,8 @@ lis r11, swapper_pg_dir@h ori r11, r11, swapper_pg_dir@l - mfspr r12,SPRN_MMUCR /* Set TID to 0 */ - li r13,PPC44x_MMUCR_TID@l - andc r12,r12,r13 - mtspr SPRN_MMUCR,r12 + mfspr r12,SPRN_MMUCR + rlwinm r12,r12,0,0,23 /* Clear TID */ b 4f @@ -736,13 +713,13 @@ lwz r11,PGDIR(r11) /* Load PID into MMUCR TID */ - li r13,PPC44x_MMUCR_TID@l /* Create mask */ - andc r12,r13,r13 /* Clear out TID/STS bits */ - mfspr r13,SPRN_PID /* Get PID */ - or r12,r12,r13 - mtspr SPRN_MMUCR,r12 + mfspr r12,SPRN_MMUCR + mfspr r13,SPRN_PID /* Get PID */ + rlwimi r12,r13,0,24,31 /* Set TID */ 4: + mtspr SPRN_MMUCR,r12 + rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ lwzx r11, r12, r11 /* Get pgd/pmd entry */ rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ @@ -880,60 +857,43 @@ */ /* Load the next available TLB index */ - lis r13, tlb_44x_index@h - ori r13, r13, tlb_44x_index@l - lwz r14, 0(r13) + lis r13, tlb_44x_index@ha + lwz r14, tlb_44x_index@l(r13) /* Load the TLB high watermark */ - lis r13, tlb_44x_hwater@h - ori r13, r13, tlb_44x_hwater@l - lwz r11, 0(r13) - + lwz r11, tlb_44x_hwater@l(r13) /* Increment, rollover, and store TLB index */ addi r14, r14, 1 - cmpw 0, r14, r11 /* reserve entries 62-63 for kernel */ + cmpw 0, r14, r11 /* reserve entries */ ble 7f li r14, 0 7: - /* Load the next available TLB index */ - lis r13, tlb_44x_index@h - ori r13, r13, tlb_44x_index@l - stw r14, 0(r13) + /* Store the next available TLB index */ + stw r14, tlb_44x_index@l(r13) -6: lwz r13, 0(r12) /* Get MS word of PTE */ lwz r11, 4(r12) /* Get LS word of PTE */ rlwimi r13, r11, 0, 0 , 19 /* Insert RPN */ tlbwe r13, r14, PPC44x_TLB_XLAT /* Write XLAT */ /* - * Create PAGEID. This is the faulting address plus - * a set of static bits. The static bits are page - * size and valid. Bits 20 and 21 should be zero - * for a page size of 4KB. - */ - li r12, 0x0210 /* Set size and valid */ - mfspr r13, SPRN_SRR1 /* Get SRR1 */ - andi. r13, r13, MSR_IS@l - beq 7f - ori r12, r12, PPC44x_TLB_TS@l /* Set TS=1 */ -7: rlwimi r10, r12, 0, 20, 31 /* Insert statics */ + * Create PAGEID. This is the faulting address, + * page size, and valid flag. + */ + li r12, PPC44x_TLB_VALID | PPC44x_TLB_4K + rlwimi r10, r12, 0, 20, 31 /* Insert valid and page size */ tlbwe r10, r14, PPC44x_TLB_PAGEID /* Write PAGEID */ - /* FIXME: Staticly setting some permissions */ - li r13, 0x002d /* Set UX,UR,SX,SR */ - andi. r11, r11, 0xffff /* Clear MS 16 bits */ - andi. r12, r11, 0x0002 /* _PAGE_HWWRITE? */ - beq 8f - ori r13, r13, 0x0002 /* Set SW */ - /* FIXME: Force attributes */ -8: ori r11, r11, 0x0100 /* Set G */ - /* FIXME: Already set in PTE */ - rlwimi r11, r13, 0, 26, 31 /* Insert static perms */ + li r13, PPC44x_TLB_SR@l /* Set SR */ + rlwimi r13, r11, 0, 30, 30 /* Set SW = _PAGE_RW */ + rlwimi r13, r11, 29, 29, 29 /* SX = _PAGE_HWEXEC */ + rlwimi r13, r11, 29, 28, 28 /* UR = _PAGE_USER */ + rlwimi r12, r11, 31, 26, 26 /* (_PAGE_USER>>1)->r12 */ + and r12, r12, r11 /* HWEXEC & USER */ + rlwimi r13, r12, 0, 26, 26 /* UX = HWEXEC & USER */ - lis r13,0xffff - ori r13,r13,0x0fff /* Set U0-U3 mask */ - and r11,r11,r13 /* Clear U0-U3 */ + rlwimi r11, r13, 0, 26, 31 /* Insert static perms */ + rlwinm r11, r11, 0, 20, 15 /* Clear U0-U3 */ tlbwe r11, r14, PPC44x_TLB_ATTRIB /* Write ATTRIB */ /* Done...restore registers and get out of here. diff -Nru a/arch/ppc/kernel/idle_power4.S b/arch/ppc/kernel/idle_power4.S --- a/arch/ppc/kernel/idle_power4.S Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/kernel/idle_power4.S Tue Feb 17 20:00:06 2004 @@ -28,17 +28,11 @@ /* * Init idle, called at early CPU setup time from head.S for each CPU - * Make sure no rest of NAP mode remains in HID0, save default - * values for some CPU specific registers. Called with r24 - * containing CPU number and r3 reloc offset + * So nothing for now. Called with r24 containing CPU number and r3 + * reloc offset */ .globl init_idle_power4 init_idle_power4: -BEGIN_FTR_SECTION - mfspr r4,SPRN_HID0 - rlwinm r4,r4,0,10,8 /* Clear NAP */ - mtspr SPRN_HID0, r4 -END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) blr /* @@ -48,10 +42,9 @@ */ .globl power4_idle power4_idle: - /* Check if we can nap or doze, put HID0 mask in r3 - */ - lis r3, 0 BEGIN_FTR_SECTION + blr +END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) /* We must dynamically check for the NAP feature as it * can be cleared by CPU init after the fixups are done */ @@ -59,16 +52,11 @@ lwz r4,cur_cpu_spec@l(r4) lwz r4,CPU_SPEC_FEATURES(r4) andi. r0,r4,CPU_FTR_CAN_NAP - beq 1f + beqlr /* Now check if user or arch enabled NAP mode */ lis r4,powersave_nap@ha lwz r4,powersave_nap@l(r4) cmpi 0,r4,0 - beq 1f - lis r3,HID0_NAP@h -1: -END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) - cmpi 0,r3,0 beqlr /* Clear MSR:EE */ @@ -85,18 +73,6 @@ blr 1: /* Go to NAP now */ - mfspr r4,SPRN_HID0 - lis r5,(HID0_NAP|HID0_SLEEP)@h - andc r4,r4,r5 - or r4,r4,r3 - oris r4,r4,HID0_DPM@h /* that should be done once for all */ - mtspr SPRN_HID0,r4 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 - mfspr r0,SPRN_HID0 BEGIN_FTR_SECTION DSSALL sync diff -Nru a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S --- a/arch/ppc/kernel/misc.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/misc.S Tue Feb 17 20:00:08 2004 @@ -201,7 +201,7 @@ mr r4,r24 bctr -#ifdef CONFIG_CPU_FREQ_PMAC +#if defined(CONFIG_CPU_FREQ_PMAC) && defined(CONFIG_6xx) /* This gets called by via-pmu.c to switch the PLL selection * on 750fx CPU. This function should really be moved to some @@ -253,7 +253,7 @@ mtmsr r7 blr -#endif /* CONFIG_CPU_FREQ_PMAC */ +#endif /* CONFIG_CPU_FREQ_PMAC && CONFIG_6xx */ /* void local_save_flags_ptr(unsigned long *flags) */ _GLOBAL(local_save_flags_ptr) @@ -406,17 +406,18 @@ tlbia isync /* Flush shadow TLB */ #elif defined(CONFIG_44x) - lis r3,0 + li r3,0 sync -1: - tlbwe r3,r3,PPC44x_TLB_PAGEID - addi r3,r3,1 + /* Load high watermark */ - lis r4,tlb_44x_hwater@h - ori r4,r4,tlb_44x_hwater@l - lwz r5,0(r4) + lis r4,tlb_44x_hwater@ha + lwz r5,tlb_44x_hwater@l(r4) + +1: tlbwe r3,r3,PPC44x_TLB_PAGEID + addi r3,r3,1 cmpw 0,r3,r5 ble 1b + isync #else /* !(CONFIG_40x || CONFIG_44x) */ #if defined(CONFIG_SMP) @@ -470,17 +471,10 @@ isync 10: #elif defined(CONFIG_44x) - mfspr r4,SPRN_MMUCR /* Get MMUCR */ - lis r5,PPC44x_MMUCR_STS@h - ori r5,r5,PPC44x_MMUCR_TID@l /* Create mask */ - andc r4,r4,r5 /* Clear out TID/STS bits */ + mfspr r4,SPRN_MMUCR mfspr r5,SPRN_PID /* Get PID */ - or r4,r4,r5 /* Set TID bits */ - mfmsr r6 /* Get MSR */ - andi. r6,r6,MSR_IS@l /* TS=1? */ - beq 11f /* If not, leave STS=0 */ - oris r4,r4,PPC44x_MMUCR_STS@h /* Set STS=1 */ -11: mtspr SPRN_MMUCR, r4 /* Put MMUCR */ + rlwimi r4,r5,0,24,31 /* Set TID */ + mtspr SPRN_MMUCR,r4 tlbsx. r3, 0, r3 bne 10f diff -Nru a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c --- a/arch/ppc/kernel/pci.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/kernel/pci.c Tue Feb 17 20:00:06 2004 @@ -46,7 +46,9 @@ static void fixup_rev1_53c810(struct pci_dev* dev); static void fixup_cpc710_pci64(struct pci_dev* dev); #ifdef CONFIG_PPC_PMAC -static void pcibios_fixup_cardbus(struct pci_dev* dev); +extern void pmac_pci_fixup_cardbus(struct pci_dev* dev); +extern void pmac_pci_fixup_pciata(struct pci_dev* dev); +extern void pmac_pci_fixup_k2_sata(struct pci_dev* dev); #endif #ifdef CONFIG_PPC_OF static u8* pci_to_OF_bus_map; @@ -69,7 +71,9 @@ { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources }, #ifdef CONFIG_PPC_PMAC /* We should add per-machine fixup support in xxx_setup.c or xxx_pci.c */ - { PCI_FIXUP_FINAL, PCI_VENDOR_ID_TI, PCI_ANY_ID, pcibios_fixup_cardbus }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_TI, PCI_ANY_ID, pmac_pci_fixup_cardbus }, + { PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_SERVERWORKS, 0x0240, pmac_pci_fixup_k2_sata }, #endif /* CONFIG_PPC_PMAC */ { 0 } }; @@ -155,42 +159,6 @@ ppc_md.pcibios_fixup_resources(dev); } -#ifdef CONFIG_PPC_PMAC -static void -pcibios_fixup_cardbus(struct pci_dev* dev) -{ - if (_machine != _MACH_Pmac) - return; - /* - * Fix the interrupt routing on the various cardbus bridges - * used on powerbooks - */ - if (dev->vendor != PCI_VENDOR_ID_TI) - return; - if (dev->device == PCI_DEVICE_ID_TI_1130 || - dev->device == PCI_DEVICE_ID_TI_1131) { - u8 val; - /* Enable PCI interrupt */ - if (pci_read_config_byte(dev, 0x91, &val) == 0) - pci_write_config_byte(dev, 0x91, val | 0x30); - /* Disable ISA interrupt mode */ - if (pci_read_config_byte(dev, 0x92, &val) == 0) - pci_write_config_byte(dev, 0x92, val & ~0x06); - } - if (dev->device == PCI_DEVICE_ID_TI_1210 || - dev->device == PCI_DEVICE_ID_TI_1211 || - dev->device == PCI_DEVICE_ID_TI_1410) { - u8 val; - /* 0x8c == TI122X_IRQMUX, 2 says to route the INTA - signal out the MFUNC0 pin */ - if (pci_read_config_byte(dev, 0x8c, &val) == 0) - pci_write_config_byte(dev, 0x8c, (val & ~0x0f) | 2); - /* Disable ISA interrupt mode */ - if (pci_read_config_byte(dev, 0x92, &val) == 0) - pci_write_config_byte(dev, 0x92, val & ~0x06); - } -} -#endif /* CONFIG_PPC_PMAC */ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, @@ -832,6 +800,17 @@ return NULL; /* Fixup bus number according to what OF think it is. */ +#ifdef CONFIG_PPC_PMAC + /* The G5 need a special case here. Basically, we don't remap all + * busses on it so we don't create the pci-OF-map. However, we do + * remap the AGP bus and so have to deal with it. A future better + * fix has to be done by making the remapping per-host and always + * filling the pci_to_OF map. --BenH + */ + if (_machine == _MACH_Pmac && busnr >= 0xf0) + busnr -= 0xf0; + else +#endif if (pci_to_OF_bus_map) busnr = pci_to_OF_bus_map[busnr]; if (busnr == 0xff) @@ -922,9 +901,10 @@ pci_process_bridge_OF_ranges(struct pci_controller *hose, struct device_node *dev, int primary) { - unsigned int *ranges, *prev; + static unsigned int static_lc_ranges[256] __initdata; + unsigned int *dt_ranges, *lc_ranges, *ranges, *prev; unsigned int size; - int rlen = 0; + int rlen = 0, orig_rlen; int memno = 0; struct resource *res; int np, na = prom_n_addr_cells(dev); @@ -934,7 +914,22 @@ * that can have more than 3 ranges, fortunately using contiguous * addresses -- BenH */ - ranges = (unsigned int *) get_property(dev, "ranges", &rlen); + dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen); + if (!dt_ranges) + return; + /* Sanity check, though hopefully that never happens */ + if (rlen > sizeof(static_lc_ranges)) { + printk(KERN_WARNING "OF ranges property too large !\n"); + rlen = sizeof(static_lc_ranges); + } + lc_ranges = static_lc_ranges; + memcpy(lc_ranges, dt_ranges, rlen); + orig_rlen = rlen; + + /* Let's work on a copy of the "ranges" property instead of damaging + * the device-tree image in memory + */ + ranges = lc_ranges; prev = NULL; while ((rlen -= np * sizeof(unsigned int)) >= 0) { if (prev) { @@ -959,10 +954,9 @@ * (size depending on dev->n_addr_cells) * cells 4+5 or 5+6: the size of the range */ - rlen = 0; - hose->io_base_phys = 0; - ranges = (unsigned int *) get_property(dev, "ranges", &rlen); - while ((rlen -= np * sizeof(unsigned int)) >= 0) { + ranges = lc_ranges; + rlen = orig_rlen; + while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) { res = NULL; size = ranges[na+4]; switch (ranges[0] >> 24) { @@ -1028,8 +1022,31 @@ prom_add_property(find_path_device("/"), of_prop); } } + +static ssize_t pci_show_devspec(struct device *dev, char *buf) +{ + struct pci_dev *pdev; + struct device_node *np; + + pdev = to_pci_dev (dev); + np = pci_device_to_OF_node(pdev); + if (np == NULL || np->full_name == NULL) + return 0; + return sprintf(buf, "%s", np->full_name); +} +static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); + #endif /* CONFIG_PPC_OF */ +/* Add sysfs properties */ +void pcibios_add_platform_entries(struct pci_dev *pdev) +{ +#ifdef CONFIG_PPC_OF + device_create_file(&pdev->dev, &dev_attr_devspec); +#endif /* CONFIG_PPC_OF */ +} + + #ifdef CONFIG_PPC_PMAC /* * This set of routines checks for PCI<->PCI bridges that have closed @@ -1059,7 +1076,7 @@ res = *(bus->resource[0]); - DBG("Remapping Bus %d, bridge: %s\n", bus->number, bridge->name); + DBG("Remapping Bus %d, bridge: %s\n", bus->number, bridge->slot_name); res.start -= ((unsigned long) hose->io_base_virt - isa_io_base); res.end -= ((unsigned long) hose->io_base_virt - isa_io_base); DBG(" IO window: %08lx-%08lx\n", res.start, res.end); @@ -1662,12 +1679,23 @@ * Note that the returned IO or memory base is a physical address */ -long -sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) +long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) { - struct pci_controller* hose = pci_bus_to_hose(bus); + struct pci_controller* hose; long result = -EOPNOTSUPP; + /* Argh ! Please forgive me for that hack, but that's the + * simplest way to get existing XFree to not lockup on some + * G5 machines... So when something asks for bus 0 io base + * (bus 0 is HT root), we return the AGP one instead. + */ +#ifdef CONFIG_PPC_PMAC + if (_machine == _MACH_Pmac && machine_is_compatible("MacRISC4")) + if (bus == 0) + bus = 0xf0; +#endif /* CONFIG_PPC_PMAC */ + + hose = pci_bus_to_hose(bus); if (!hose) return -ENODEV; diff -Nru a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c --- a/arch/ppc/kernel/ppc_ksyms.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/ppc_ksyms.c Tue Feb 17 20:00:08 2004 @@ -75,6 +75,7 @@ extern unsigned long mm_ptov (unsigned long paddr); EXPORT_SYMBOL(clear_page); +EXPORT_SYMBOL(clear_user_page); EXPORT_SYMBOL(do_signal); EXPORT_SYMBOL(do_syscall_trace); EXPORT_SYMBOL(transfer_to_handler); @@ -236,12 +237,6 @@ EXPORT_SYMBOL(cuda_request); EXPORT_SYMBOL(cuda_poll); #endif /* CONFIG_ADB_CUDA */ -#ifdef CONFIG_PMAC_BACKLIGHT -EXPORT_SYMBOL(get_backlight_level); -EXPORT_SYMBOL(set_backlight_level); -EXPORT_SYMBOL(set_backlight_enable); -EXPORT_SYMBOL(register_backlight_controller); -#endif /* CONFIG_PMAC_BACKLIGHT */ #ifdef CONFIG_PPC_MULTIPLATFORM EXPORT_SYMBOL(_machine); #endif @@ -282,14 +277,6 @@ #ifdef CONFIG_VT EXPORT_SYMBOL(kd_mksound); #endif -#ifdef CONFIG_NVRAM -EXPORT_SYMBOL(nvram_read_byte); -EXPORT_SYMBOL(nvram_write_byte); -#ifdef CONFIG_PPC_PMAC -EXPORT_SYMBOL(pmac_xpram_read); -EXPORT_SYMBOL(pmac_xpram_write); -#endif -#endif /* CONFIG_NVRAM */ EXPORT_SYMBOL(to_tm); EXPORT_SYMBOL(pm_power_off); diff -Nru a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c --- a/arch/ppc/kernel/setup.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/setup.c Tue Feb 17 20:00:08 2004 @@ -35,6 +35,7 @@ #include #include #include +#include #include #if defined CONFIG_KGDB @@ -48,11 +49,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset); extern void reloc_got2(unsigned long offset); - -#ifdef CONFIG_KGDB -extern void kgdb_map_scc(void); -#endif - extern void ppc6xx_idle(void); extern void power4_idle(void); @@ -116,6 +112,9 @@ void machine_restart(char *cmd) { +#ifdef CONFIG_NVRAM + nvram_sync(); +#endif ppc_md.restart(cmd); } @@ -123,6 +122,9 @@ void machine_power_off(void) { +#ifdef CONFIG_NVRAM + nvram_sync(); +#endif ppc_md.power_off(); } @@ -130,6 +132,9 @@ void machine_halt(void) { +#ifdef CONFIG_NVRAM + nvram_sync(); +#endif ppc_md.halt(); } @@ -563,24 +568,30 @@ __setup("l2cr=", ppc_setup_l2cr); #ifdef CONFIG_NVRAM -/* Generic nvram hooks we now look into ppc_md.nvram_read_val - * on pmac too ;) - * //XX Those 2 could be moved to headers - */ -unsigned char -nvram_read_byte(int addr) + +/* Generic nvram hooks used by drivers/char/gen_nvram.c */ +unsigned char nvram_read_byte(int addr) { if (ppc_md.nvram_read_val) return ppc_md.nvram_read_val(addr); return 0xff; } +EXPORT_SYMBOL(nvram_read_byte); -void -nvram_write_byte(unsigned char val, int addr) +void nvram_write_byte(unsigned char val, int addr) { if (ppc_md.nvram_write_val) - ppc_md.nvram_write_val(val, addr); + ppc_md.nvram_write_val(addr, val); } +EXPORT_SYMBOL(nvram_write_byte); + +void nvram_sync(void) +{ + if (ppc_md.nvram_sync) + ppc_md.nvram_sync(); +} +EXPORT_SYMBOL(nvram_sync); + #endif /* CONFIG_NVRAM */ static struct cpu cpu_devices[NR_CPUS]; @@ -632,7 +643,8 @@ if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab); #if defined(CONFIG_KGDB) - kgdb_map_scc(); + if (ppc_md.kgdb_map_scc) + ppc_md.kgdb_map_scc(); set_debug_traps(); if (strstr(cmd_line, "gdb")) { if (ppc_md.progress) diff -Nru a/arch/ppc/kernel/smp-tbsync.c b/arch/ppc/kernel/smp-tbsync.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/kernel/smp-tbsync.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,181 @@ +/* + * Smp timebase synchronization for ppc. + * + * Copyright (C) 2003 Samuel Rydh (samuel@ibrium.se) + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUM_ITER 300 + +enum { + kExit=0, kSetAndTest, kTest +}; + +static struct { + volatile int tbu; + volatile int tbl; + volatile int mark; + volatile int cmd; + volatile int handshake; + int filler[3]; + + volatile int ack; + int filler2[7]; + + volatile int race_result; +} *tbsync; + +static volatile int running; + +static void __devinit +enter_contest( int mark, int add ) +{ + while( (int)(get_tbl() - mark) < 0 ) + tbsync->race_result = add; +} + +void __devinit +smp_generic_take_timebase( void ) +{ + int cmd, tbl, tbu; + + local_irq_disable(); + while( !running ) + ; + rmb(); + + for( ;; ) { + tbsync->ack = 1; + while( !tbsync->handshake ) + ; + rmb(); + + cmd = tbsync->cmd; + tbl = tbsync->tbl; + tbu = tbsync->tbu; + tbsync->ack = 0; + if( cmd == kExit ) + return; + + if( cmd == kSetAndTest ) { + while( tbsync->handshake ) + ; + asm volatile ("mttbl %0" :: "r" (tbl) ); + asm volatile ("mttbu %0" :: "r" (tbu) ); + } else { + while( tbsync->handshake ) + ; + } + enter_contest( tbsync->mark, -1 ); + } + local_irq_enable(); +} + +static int __devinit +start_contest( int cmd, int offset, int num ) +{ + int i, tbu, tbl, mark, score=0; + + tbsync->cmd = cmd; + + local_irq_disable(); + for( i=-3; itbu = tbu = get_tbu(); + tbsync->tbl = tbl + offset; + tbsync->mark = mark = tbl + 400; + + wmb(); + + tbsync->handshake = 1; + while( tbsync->ack ) + ; + + while( (int)(get_tbl() - tbl) <= 0 ) + ; + tbsync->handshake = 0; + enter_contest( mark, 1 ); + + while( !tbsync->ack ) + ; + + if( tbsync->tbu != get_tbu() || ((tbsync->tbl ^ get_tbl()) & 0x80000000) ) + continue; + if( i++ > 0 ) + score += tbsync->race_result; + } + local_irq_enable(); + return score; +} + +void __devinit +smp_generic_give_timebase( void ) +{ + int i, score, score2, old, min=0, max=5000, offset=1000; + + printk("Synchronizing timebase\n"); + + /* if this fails then this kernel won't work anyway... */ + tbsync = kmalloc( sizeof(*tbsync), GFP_KERNEL ); + memset( tbsync, 0, sizeof(*tbsync) ); + mb(); + running = 1; + + while( !tbsync->ack ) + ; + + /* binary search */ + for( old=-1 ; old != offset ; offset=(min+max)/2 ) { + score = start_contest( kSetAndTest, offset, NUM_ITER ); + + printk("score %d, offset %d\n", score, offset ); + + if( score > 0 ) + max = offset; + else + min = offset; + old = offset; + } + score = start_contest( kSetAndTest, min, NUM_ITER ); + score2 = start_contest( kSetAndTest, max, NUM_ITER ); + + printk( "Min %d (score %d), Max %d (score %d)\n", min, score, max, score2 ); + score = abs( score ); + score2 = abs( score2 ); + offset = (score < score2) ? min : max; + + /* guard against inaccurate mttb */ + for( i=0; i<10; i++ ) { + start_contest( kSetAndTest, offset, NUM_ITER/10 ); + + if( (score2=start_contest(kTest, offset, NUM_ITER)) < 0 ) + score2 = -score2; + if( score2 <= score || score2 < 20 ) + break; + } + printk("Final offset: %d (%d/%d)\n", offset, score2, NUM_ITER ); + + /* exiting */ + tbsync->cmd = kExit; + wmb(); + tbsync->handshake = 1; + while( tbsync->ack ) + ; + tbsync->handshake = 0; + kfree( tbsync ); + tbsync = NULL; + running = 0; + + /* all done */ + smp_tb_synchronized = 1; +} diff -Nru a/arch/ppc/kernel/smp.c b/arch/ppc/kernel/smp.c --- a/arch/ppc/kernel/smp.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/kernel/smp.c Tue Feb 17 20:00:08 2004 @@ -61,10 +61,6 @@ /* all cpu mappings are 1-1 -- Cort */ volatile unsigned long cpu_callin_map[NR_CPUS]; -#define TB_SYNC_PASSES 4 -volatile unsigned long __initdata tb_sync_flag = 0; -volatile unsigned long __initdata tb_offset = 0; - int start_secondary(void *); extern int cpu_idle(void *unused); void smp_call_function_interrupt(void); @@ -83,11 +79,14 @@ #define PPC_MSG_INVALIDATE_TLB 2 #define PPC_MSG_XMON_BREAK 3 -#define smp_message_pass(t,m,d,w) \ - do { if (smp_ops) \ - atomic_inc(&ipi_sent); \ - smp_ops->message_pass((t),(m),(d),(w)); \ - } while(0) +static inline void +smp_message_pass(int target, int msg, unsigned long data, int wait) +{ + if (smp_ops){ + atomic_inc(&ipi_sent); + smp_ops->message_pass(target,msg,data,wait); + } +} /* * Common functions @@ -289,41 +288,6 @@ (*func)(info); if (wait) atomic_inc(&call_data->finished); -} - -/* FIXME: Do this properly for all archs --RR */ -static spinlock_t timebase_lock = SPIN_LOCK_UNLOCKED; -static unsigned int timebase_upper = 0, timebase_lower = 0; - -void __devinit -smp_generic_give_timebase(void) -{ - spin_lock(&timebase_lock); - do { - timebase_upper = get_tbu(); - timebase_lower = get_tbl(); - } while (timebase_upper != get_tbu()); - spin_unlock(&timebase_lock); - - while (timebase_upper || timebase_lower) - rmb(); -} - -void __devinit -smp_generic_take_timebase(void) -{ - int done = 0; - - while (!done) { - spin_lock(&timebase_lock); - if (timebase_upper || timebase_lower) { - set_tb(timebase_upper, timebase_lower); - timebase_upper = 0; - timebase_lower = 0; - done = 1; - } - spin_unlock(&timebase_lock); - } } static void __devinit smp_store_cpu_info(int id) diff -Nru a/arch/ppc/mm/44x_mmu.c b/arch/ppc/mm/44x_mmu.c --- a/arch/ppc/mm/44x_mmu.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/mm/44x_mmu.c Tue Feb 17 20:00:07 2004 @@ -64,7 +64,7 @@ * Just needed it declared someplace. */ unsigned int tlb_44x_index = 0; -unsigned int tlb_44x_hwater = 61; +unsigned int tlb_44x_hwater = 62; /* * "Pins" a 256MB TLB entry in AS0 for kernel lowmem @@ -85,7 +85,7 @@ tlbwe %0,%3,%8" : : "r" (attrib), "r" (phys), "r" (virt), "r" (slot), - "i" (PPC44x_TLB_VALID | PPC44x_TLB_PAGESZ(PPC44x_PAGESZ_256M)), + "i" (PPC44x_TLB_VALID | PPC44x_TLB_256M), "i" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G), "i" (PPC44x_TLB_PAGEID), "i" (PPC44x_TLB_XLAT), diff -Nru a/arch/ppc/mm/hashtable.S b/arch/ppc/mm/hashtable.S --- a/arch/ppc/mm/hashtable.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/mm/hashtable.S Tue Feb 17 20:00:08 2004 @@ -37,6 +37,32 @@ #endif /* CONFIG_SMP */ /* + * Sync CPUs with hash_page taking & releasing the hash + * table lock + */ +#ifdef CONFIG_SMP + .text +_GLOBAL(hash_page_sync) + lis r8,mmu_hash_lock@h + ori r8,r8,mmu_hash_lock@l + lis r0,0x0fff + b 10f +11: lwz r6,0(r8) + cmpwi 0,r6,0 + bne 11b +10: lwarx r6,0,r8 + cmpwi 0,r6,0 + bne- 11b + stwcx. r0,0,r8 + bne- 10b + isync + eieio + li r0,0 + stw r0,0(r8) + blr +#endif + +/* * Load a PTE into the hash table, if possible. * The address is in r4, and r3 contains an access flag: * _PAGE_RW (0x400) if a write. @@ -417,21 +443,6 @@ lwz r6,next_slot@l(r4) addi r6,r6,PTE_SIZE andi. r6,r6,7*PTE_SIZE -#ifdef CONFIG_POWER4 - /* - * Since we don't have BATs on POWER4, we rely on always having - * PTEs in the hash table to map the hash table and the code - * that manipulates it in virtual mode, namely flush_hash_page and - * flush_hash_segments. Otherwise we can get a DSI inside those - * routines which leads to a deadlock on the hash_table_lock on - * SMP machines. We avoid this by never overwriting the first - * PTE of each PTEG if it is already valid. - * -- paulus. - */ - bne 102f - li r6,PTE_SIZE -102: -#endif /* CONFIG_POWER4 */ stw r6,next_slot@l(r4) add r4,r3,r6 diff -Nru a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c --- a/arch/ppc/mm/init.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/mm/init.c Tue Feb 17 20:00:06 2004 @@ -291,6 +291,8 @@ ppc_md.progress("MMU:exit", 0x211); #ifdef CONFIG_BOOTX_TEXT + /* By default, we are no longer mapped */ + boot_text_mapped = 0; /* Must be done last, or ppc_md.progress will die. */ map_boot_text(); #endif diff -Nru a/arch/ppc/mm/pgtable.c b/arch/ppc/mm/pgtable.c --- a/arch/ppc/mm/pgtable.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/mm/pgtable.c Tue Feb 17 20:00:06 2004 @@ -44,6 +44,10 @@ extern char etext[], _stext[]; +#ifdef CONFIG_SMP +extern void hash_page_sync(void); +#endif + #ifdef HAVE_BATS extern unsigned long v_mapped_by_bats(unsigned long va); extern unsigned long p_mapped_by_bats(unsigned long pa); @@ -109,11 +113,17 @@ void pte_free_kernel(pte_t *pte) { +#ifdef CONFIG_SMP + hash_page_sync(); +#endif free_page((unsigned long)pte); } void pte_free(struct page *pte) { +#ifdef CONFIG_SMP + hash_page_sync(); +#endif __free_page(pte); } diff -Nru a/arch/ppc/mm/ppc_mmu.c b/arch/ppc/mm/ppc_mmu.c --- a/arch/ppc/mm/ppc_mmu.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/mm/ppc_mmu.c Tue Feb 17 20:00:06 2004 @@ -83,6 +83,9 @@ unsigned long __init mmu_mapin_ram(void) { +#ifdef CONFIG_POWER4 + return 0; +#else unsigned long tot, bl, done; unsigned long max_size = (256<<20); unsigned long align; @@ -119,6 +122,7 @@ } return done; +#endif } /* @@ -244,8 +248,9 @@ Hash = mem_pieces_find(Hash_size, Hash_size); cacheable_memzero(Hash, Hash_size); _SDR1 = __pa(Hash) | SDR1_LOW_BITS; - Hash_end = (PTE *) ((unsigned long)Hash + Hash_size); #endif /* CONFIG_POWER4 */ + + Hash_end = (PTE *) ((unsigned long)Hash + Hash_size); printk("Total memory = %ldMB; using %ldkB for hash table (at %p)\n", total_memory >> 20, Hash_size >> 10, Hash); diff -Nru a/arch/ppc/mm/tlb.c b/arch/ppc/mm/tlb.c --- a/arch/ppc/mm/tlb.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/mm/tlb.c Tue Feb 17 20:00:07 2004 @@ -47,6 +47,26 @@ } /* + * Called by ptep_test_and_clear_young() + */ +void flush_hash_one_pte(pte_t *ptep) +{ + struct page *ptepage; + struct mm_struct *mm; + unsigned long ptephys; + unsigned long addr; + + if (Hash == 0) + return; + + ptepage = virt_to_page(ptep); + mm = (struct mm_struct *) ptepage->mapping; + ptephys = __pa(ptep) & PAGE_MASK; + addr = ptepage->index + (((unsigned long)ptep & ~PAGE_MASK) << 9); + flush_hash_pages(mm->context, addr, ptephys, 1); +} + +/* * Called at the end of a mmu_gather operation to make sure the * TLB flush is completely done. */ diff -Nru a/arch/ppc/platforms/4xx/Kconfig b/arch/ppc/platforms/4xx/Kconfig --- a/arch/ppc/platforms/4xx/Kconfig Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/platforms/4xx/Kconfig Tue Feb 17 20:00:06 2004 @@ -13,48 +13,43 @@ config ASH bool "Ash" - -config BEECH - bool "Beech" - -config CEDAR - bool "Cedar" + help + This option enables support for the IBM NP405H evaluation board. config CPCI405 bool "CPCI405" + help + This option enables support for the CPCI405 board. config EP405 bool "EP405/EP405PC" + help + This option enables support for the EP405/EP405PC boards. config OAK bool "Oak" help - Select Oak if you have an IBM 403GCX "Oak" Evaluation Board. - - Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board. - - More information on these boards is available at: - . - -config REDWOOD_4 - bool "Redwood-4" + This option enables support for the IBM 403GCX evaluation board. config REDWOOD_5 bool "Redwood-5" + help + This option enables support for the IBM STB04 evaluation board. config REDWOOD_6 bool "Redwood-6" + help + This option enables support for the IBM STBx25xx evaluation board. config SYCAMORE bool "Sycamore" - -config TIVO - bool "Tivo" + help + This option enables support for the IBM PPC405GPr evaluation board. config WALNUT bool "Walnut" help - Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board. + This option enables support for the IBM PPC405GP evaluation board. endchoice @@ -120,12 +115,6 @@ depends on 40x && !405GPR default y - -config PIN_TLB - bool - depends on 44x - default y - config BOOKE bool depends on 44x @@ -133,7 +122,7 @@ config IBM_OCP bool - depends on ASH || BEECH || CEDAR || CPCI405 || EBONY || EP405 || OCOTEA || REDWOOD_4 || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT + depends on ASH || CPCI405 || EBONY || EP405 || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT default y config IBM_EMAC4 @@ -141,19 +130,14 @@ depends on 440GX default y -config NP405L - bool - depends on CEDAR - default y - config BIOS_FIXUP bool - depends on CEDAR || EP405 || SYCAMORE || WALNUT + depends on EP405 || SYCAMORE || WALNUT default y config 403GCX bool - depends OAK || TIVO + depends OAK default y config 405GP @@ -165,13 +149,9 @@ bool depends on SYCAMORE -config 405LP - bool - depends on CEDAR - config STB03xxx bool - depends on REDWOOD_5 || REDWOOD_4 || REDWOOD_6 + depends on REDWOOD_5 || REDWOOD_6 default y config EMBEDDEDBOOT @@ -181,12 +161,8 @@ config IBM_OPENBIOS bool - depends on ASH || BEECH || CEDAR || REDWOOD_4 || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT + depends on ASH || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT default y - -config 405_DMA - bool "Blue Logic DMA" - depends on 40x config PM bool "Power Management support (EXPERIMENTAL)" diff -Nru a/arch/ppc/platforms/4xx/Makefile b/arch/ppc/platforms/4xx/Makefile --- a/arch/ppc/platforms/4xx/Makefile Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/4xx/Makefile Tue Feb 17 20:00:08 2004 @@ -2,27 +2,20 @@ # Makefile for the PowerPC 4xx linux kernel. obj-$(CONFIG_ASH) += ash.o -obj-$(CONFIG_BEECH) += beech.o -obj-$(CONFIG_CEDAR) += cedar.o obj-$(CONFIG_CPCI405) += cpci405.o obj-$(CONFIG_EBONY) += ebony.o obj-$(CONFIG_EP405) += ep405.o obj-$(CONFIG_OAK) += oak.o obj-$(CONFIG_OCOTEA) += ocotea.o -obj-$(CONFIG_REDWOOD_4) += redwood.o obj-$(CONFIG_REDWOOD_5) += redwood5.o obj-$(CONFIG_REDWOOD_6) += redwood6.o obj-$(CONFIG_SYCAMORE) += sycamore.o obj-$(CONFIG_WALNUT) += walnut.o -obj-$(CONFIG_NP405L) += ibmnp405l.o obj-$(CONFIG_405GP) += ibm405gp.o -obj-$(CONFIG_REDWOOD_4) += ibmstb3.o obj-$(CONFIG_REDWOOD_5) += ibmstb4.o obj-$(CONFIG_NP405H) += ibmnp405h.o obj-$(CONFIG_REDWOOD_6) += ibmstbx25.o -obj-$(CONFIG_NP4GS3) += ibmnp4gs.o -obj-$(CONFIG_405LP) += ibm405lp.o obj-$(CONFIG_EBONY) += ibm440gp.o obj-$(CONFIG_OCOTEA) += ibm440gx.o obj-$(CONFIG_405GPR) += ibm405gpr.o diff -Nru a/arch/ppc/platforms/4xx/beech.c b/arch/ppc/platforms/4xx/beech.c --- a/arch/ppc/platforms/4xx/beech.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,251 +0,0 @@ -/* - * arch/ppc/platforms/beech.c Platform setup for the IBM Beech board - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Copyright (C) 2002, International Business Machines Corporation - * All Rights Reserved - * - * Bishop Brock - * IBM Research, Austin Center for Low-Power Computing - * bcbrock@us.ibm.com - * March, 2002 - * - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -static void beech_ebc_setup(void); -static void beech_fpga_setup(void); - -/* - Beech board physical memory map: - - Main Memory (Initialized by the BIOS) - ======================================================================= - - SDRAM (64 MB) 0x00000000 - 0x04000000 - - OPB Space: (Mapped virtual = physical in ppc4xx_setup.c) - ======================================================================= - - UART0 0xEF600300 - UART1 0xEF600400 - IIC 0xEF600500 - OPB Arbiter 0xEF600600 - GPIO Controller 0xEF600700 - CODEC Interface 0xEF600900 - Touch Panel Controller 0xEF600A00 - DES Controller 0xEF600B00 - - - EBC Space: (Mapped virtual = physical in ppc4xx_map_io(); EBC setup - for PCMCIA left to 4xx_pccf) - Space EBC Bank Physical Addresses EBC Base Address - ========================================================================= - - PCMCIA (32 MB) x F0000000 - F1FFFFFF F0000000 - - Expansion 2 F8000000 - F8FFFFFF F8000000 - Linux Flash (16 MB) F9000000 - F9FFFFFF - - NVRAM (32 KB) 1 FFE00000 - FFE07FFF FFE00000 - - - Ethernet(I/O) 1 FFE20300 - FFE2030F FFE00000 - (MEM) FFE40000 - FFE40FFF - - FPGA_REG_4 1 FFE60000 - FFE60000 FFE00000 - FPGA_REG_0 1 FFE80000 - FFE80000 FFE00000 - FPGA_REG_1 1 FFEA0000 - FFEA0000 FFE00000 - FPGA_REG_2 1 FFEC0000 - FFEC0000 FFE00000 - FPGA_REG_3 1 FFEE0000 - FFEE0000 FFE00000 - - SRAM (512 KB) 0 FFF00000 - FFF7FFFF FFF00000 - - Boot Flash (512 KB) 0 FFF80000 - FFFFFFFF FFF00000 - - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - NB: On Beech 1, address ranges for Bank 2 were reversed - -*/ - -void __init -beech_setup_arch(void) -{ - ppc4xx_setup_arch(); - - TODC_INIT(TODC_TYPE_DCR146818, NULL, NULL, NULL, 8); - - /* Set up Beech FPGA. */ - - beech_fpga_setup(); -} - -void __init -platform_init(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7) -{ - ppc4xx_init(r3, r4, r5, r6, r7); - - ppc_md.setup_arch = beech_setup_arch; - -#ifdef CONFIG_PPC_RTC - ppc_md.time_init = todc_time_init; - ppc_md.set_rtc_time = todc_set_rtc_time; - ppc_md.get_rtc_time = todc_get_rtc_time; - ppc_md.nvram_read_val = todc_dcr146818_read_val; - ppc_md.nvram_write_val = todc_dcr146818_write_val; -#endif - /* Disable the LCD controller, which may have been left on by the - BIOS. Then do initialization of the EBC. */ - - mtdcri(DCRN_LCD0, DER, 0); - beech_ebc_setup(); -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - + Non-standard board support follows - +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - -/**************************************************************************** - * EBC Setup - ****************************************************************************/ - -/* The EBC is set up for Beech. This may simply replicate the setup already - done by the IBM BIOS for Beech (possibly with some address map changes), or - may be the first initialization if the board is booting from another BIOS. - Virtually all that is required to boot Linux on Beech is that the BIOS - enable the memory controller, load a Linux image from flash, and run it. - - For optimal dynamic frequency scaling the EBC settings will also vary as the - frequency varies. -*/ - -static void __init -beech_ebc_setup(void) -{ - ebc0_bnap_t ap; - ebc0_bncr_t cr; - - /* Set EBC bank 0 for the SRAM and boot flash. - - Access parameters assume 120ns AMD flash @ 66.66 MHz maximum bus - speed = 8 cycle access with 2 turnaround cycles (30 ns). - - These parameters will work for the SRAM as well, which is a 70 ns - part. - - NB: IBM BIOS sets this bank to burst, however bursting will never - happen in Linux because this region is mapped non-cacheable and - guarded, so it is set non-burst here. */ - - cr.reg = (BEECH_BANK0_PADDR & 0xfff00000) | - (mfdcri(DCRN_EBC0, BnCR(0)) & EBC0_BnCR_MASK); - cr.fields.bs = BEECH_BANK0_EBC_SIZE; - cr.fields.bu = EBC0_BnCR_BU_RW; - cr.fields.bw = EBC0_BnCR_BW_16; - mtdcri(DCRN_EBC0, BnCR(0), cr.reg); - - ap.reg = mfdcri(DCRN_EBC0, BnAP(0)) & EBC0_BnAP_MASK; - ap.fields.twt = 8; - ap.fields.th = 2; - mtdcri(DCRN_EBC0, BnAP(0), ap.reg); - - /* EBC bank 1 is used for many purposes: NVRAM, Ethernet, and FPGA - registers. This is a 1 MB, 16-bit bank. The access parameters must - handle the worst case of all of the devices. - - The Ethernet chip needs 20 ns setup of the addresses to the I/O - write signal (generated from the chip select), a minimum 150 ns - cycle, and 30 ns of turnaround. These settings will work for the - other devices as well. - */ - - cr.reg = (BEECH_BANK1_PADDR & 0xfff00000) | - (mfdcri(DCRN_EBC0, BnCR(1)) & EBC0_BnCR_MASK); - cr.fields.bs = BEECH_BANK1_EBC_SIZE; - cr.fields.bu = EBC0_BnCR_BU_RW; - cr.fields.bw = EBC0_BnCR_BW_16; - mtdcri(DCRN_EBC0, BnCR(1), cr.reg); - - ap.reg = mfdcri(DCRN_EBC0, BnAP(1)) & EBC0_BnAP_MASK; - ap.fields.twt = 10; - ap.fields.csn = 2; - ap.fields.th = 2; - mtdcri(DCRN_EBC0, BnAP(1), ap.reg); - - /* Set EBC bank 2 for the big (Linux) flash. There is 16 MB of flash, - but the CPLD decodes a 32 MB region. - - Access parameters assume 90ns AMD flash @ 66.66 MHz maximum bus - speed = 6 cycle access with 2 turnaround cycles (30 ns). - - NB: IBM BIOS sets this bank to burst, however bursting will never - happen in Linux because this region is mapped non-cacheable and - guarded, so it is set non-burst here. */ - - cr.reg = (BEECH_BANK2_PADDR & 0xfff00000) | - (mfdcri(DCRN_EBC0, BnCR(2)) & EBC0_BnCR_MASK); - cr.fields.bs = BEECH_BANK2_EBC_SIZE; - cr.fields.bu = EBC0_BnCR_BU_RW; - cr.fields.bw = EBC0_BnCR_BW_8; - mtdcri(DCRN_EBC0, BnCR(2), cr.reg); - - ap.reg = mfdcri(DCRN_EBC0, BnAP(2)) & EBC0_BnAP_MASK; - ap.fields.twt = 6; - ap.fields.th = 2; - mtdcri(DCRN_EBC0, BnAP(2), ap.reg); -} - -/**************************************************************************** - * FPGA Setup - ****************************************************************************/ - -/* The Beech FPGA is set up for Linux. */ - -static void __init -beech_fpga_setup(void) -{ - volatile u8 *fpga_reg_2; - - fpga_reg_2 = (volatile u8 *) - ioremap(BEECH_FPGA_REG_2_PADDR, BEECH_FPGA_REG_2_SIZE); - - /* Set RTS/CTS mode for UART 1 */ - - *fpga_reg_2 |= FPGA_REG_2_DEFAULT_UART1_N; -} - -/* - * Local variables: - * c-basic-offset: 8 - * End: - */ diff -Nru a/arch/ppc/platforms/4xx/beech.h b/arch/ppc/platforms/4xx/beech.h --- a/arch/ppc/platforms/4xx/beech.h Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,202 +0,0 @@ -/* - * include/asm-ppc/platforms/beech.h Platform definitions for the IBM Beech - * board - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Copyright (C) 2002, International Business Machines Corporation - * All Rights Reserved. - * - * Bishop Brock - * IBM Research, Austin Center for Low-Power Computing - * bcbrock@us.ibm.com - * March, 2002 - * - */ - -#ifdef __KERNEL__ -#ifndef __ASM_BEECH_H__ -#define __ASM_BEECH_H__ - -#include - -#ifndef __ASSEMBLY__ - -/* - * Data structure defining board information maintained by the standard boot - * ROM on the IBM Beech board. An effort has been made to - * keep the field names consistent with the 8xx 'bd_t' board info - * structures. - */ - -typedef struct board_info { - unsigned char bi_s_version[4]; /* Version of this structure */ - unsigned long bi_tbfreq; /* Frequency of SysTmrClk */ - unsigned char bi_r_version[30]; /* Version of the IBM ROM */ - unsigned int bi_memsize; /* DRAM installed, in bytes */ - unsigned long sysclock_period; /* SysClk period in ns */ - unsigned long sys_speed; /* SysCLk frequency in Hz */ - unsigned long bi_intfreq; /* Processor speed, in Hz */ - unsigned long vco_speed; /* PLL VCO speed, in Hz */ - unsigned long bi_busfreq; /* PLB Bus speed, in Hz */ - unsigned long opb_speed; /* OPB Bus speed, in Hz */ - unsigned long ebc_speed; /* EBC Bus speed, in Hz */ -} bd_t; - -/* See beech.c for a concise diagram of the Beech physical memory map. */ - -#define PPC4xx_ONB_IO_PADDR ((uint)0xef600000) -#define PPC4xx_ONB_IO_VADDR PPC4xx_ONB_IO_PADDR -#define PPC4xx_ONB_IO_SIZE ((uint)4*1024) - -/* EBC Bank 0 controls the boot flash and SRAM */ - -#define BEECH_BANK0_PADDR ((uint)0xfff00000) -#define BEECH_BANK0_EBC_SIZE EBC0_BnCR_BS_1MB - -#define BEECH_SRAM_PADDR BEECH_BANK0_PADDR -#define BEECH_SRAM_SIZE ((uint)(512 * 1024)) - -#define BEECH_BOOTFLASH_PADDR (BEECH_BANK0_PADDR + (512 * 1024)) -#define BEECH_BOOTFLASH_SIZE ((uint)(512 * 1024)) - -/* EBC bank 1 controls the NVRAM, Ethernet and CPLD registers. The different - areas are mapped in as small an area as possible to help catch any kernel - addressing errors. - - NVRAM is improperly connected on Beech Pass 1. Only every other location is - accessible. This is a 32 KB NVRAM. - - The Ethernet chip maps 13 address lines. We only map the "I/O" space used by - the current driver. - - The FPGA "registers" are decoded on 128 KB boundarys. Each is mapped in a - separate page. */ - -#define BEECH_BANK1_PADDR ((uint)0xffe00000) -#define BEECH_BANK1_EBC_SIZE EBC0_BnCR_BS_1MB - -#define BEECH_NVRAM_PADDR BEECH_BANK1_PADDR -#define BEECH_NVRAM_SIZE ((uint) (32 * 1024)) - -#define BEECH_ETHERNET_PADDR (BEECH_BANK1_PADDR + 0x00020000) -#define BEECH_ETHERNET_SIZE ((uint) (8 * 1024)) - -#define BEECH_FPGA_REG_0_PADDR (BEECH_BANK1_PADDR + 0x00080000) -#define BEECH_FPGA_REG_0_SIZE PAGE_SIZE - -#define BEECH_FPGA_REG_1_PADDR (BEECH_BANK1_PADDR + 0x000A0000) -#define BEECH_FPGA_REG_1_SIZE PAGE_SIZE - -#define BEECH_FPGA_REG_2_PADDR (BEECH_BANK1_PADDR + 0x000C0000) -#define BEECH_FPGA_REG_2_SIZE PAGE_SIZE - -#define BEECH_FPGA_REG_3_PADDR (BEECH_BANK1_PADDR + 0x000E0000) -#define BEECH_FPGA_REG_3_SIZE PAGE_SIZE - -#define BEECH_FPGA_REG_4_PADDR (BEECH_BANK1_PADDR + 0x00060000) -#define BEECH_FPGA_REG_4_SIZE PAGE_SIZE - -/* FPGA Register Bits (From IBM BIOS) [ May not be valid for Beech Pass 1 ]*/ - -#define FPGA_REG_0_FLASH_N 0x01 -#define FPGA_REG_0_FLASH_ONBD_N 0x02 -#define FPGA_REG_0_HITA_TOSH_N 0x04 /* New in Pass 2 */ -#define FPGA_REG_0_STAT_OC 0x20 -#define FPGA_REG_0_AC_SOURCE_SEL_N 0x40 -#define FPGA_REG_0_AC_ACTIVE_N 0x80 - -#define FPGA_REG_1_USB_ACTIVE 0x01 /* New in Pass 2 */ -#define FPGA_REG_1_CLK_VARIABLE 0x02 -#define FPGA_REG_1_CLK_TEST 0x04 -#define FPGA_REG_1_CLK_SS 0x08 -#define FPGA_REG_1_EXT_IRQ_N 0x10 -#define FPGA_REG_1_SMI_MODE_N 0x20 -#define FPGA_REG_1_BATT_LOW_N 0x40 -#define FPGA_REG_1_PCMCIA_PWR_FAULT_N 0x80 - -#define FPGA_REG_2_DEFAULT_UART1_N 0x01 -#define FPGA_REG_2_EN_1_8V_PLL_N 0x02 -#define FPGA_REG_2_PC_BUF_EN_N 0x08 -#define FPGA_REG_2_CODEC_RESET_N 0x10 /* New in Pass 2 */ -#define FPGA_REG_2_TP_JSTICK_N 0x20 /* New in Pass 2 */ - -#define FPGA_REG_3_GAS_GAUGE_IO 0x01 - -#define FPGA_REG_4_SDRAM_CLK3_ENAB 0x01 -#define FPGA_REG_4_SDRAM_CLK2_ENAB 0x02 -#define FPGA_REG_4_SDRAM_CLK1_ENAB 0x04 -#define FPGA_REG_4_SDRAM_CLK0_ENAB 0x08 -#define FPGA_REG_4_PCMCIA_5V 0x10 /* New in Pass 2 */ -#define FPGA_REG_4_IRQ3 0x20 /* New in Pass 2 */ - -/* EBC Bank 2 contains the 16 MB "Linux" flash. The FPGA decodes a 32 MB - bank. The lower 16 MB are available for expansion devices. The upper 16 MB - are used for the "Linux" flash. - - Partitioning information is for the benefit of the MTD driver. See - drivers/mtd/maps/ibm4xx.c. We currently allocate the lower 1 MB for a - kernel, and the other 15 MB for a filesystem. - -*/ - -/* Bank 2 mappings changed between Beech Pass 1 and Pass 2 */ - -#ifdef CONFIG_BEECH_PASS1 -#define BEECH_BIGFLASH_OFFSET 0 -#else -#define BEECH_BIGFLASH_OFFSET (16 * 1024 * 1024) -#endif - -#define BEECH_BANK2_PADDR ((uint)0xf8000000) -#define BEECH_BANK2_EBC_SIZE EBC0_BnCR_BS_32MB - -#define BEECH_BIGFLASH_PADDR (BEECH_BANK2_PADDR + BEECH_BIGFLASH_OFFSET) -#define BEECH_BIGFLASH_SIZE (16 * 1024 * 1024) - -#define BEECH_KERNEL_OFFSET 0 -#define BEECH_KERNEL_SIZE (1 * 1024 * 1024) - -#define BEECH_FREE_AREA_OFFSET BEECH_KERNEL_SIZE -#define BEECH_FREE_AREA_SIZE (BEECH_BIGFLASH_SIZE - BEECH_KERNEL_SIZE) - -/* The PCMCIA controller driver 4xx_pccf.c is responsible for the EBC setup of - PCMCIA. Externally, EBC bank selects 3..7 take on PCMCIA functions when - PCMCIA is enabled. */ - -#define BEECH_PCMCIA_PADDR ((uint)0xf0000000) -#define BEECH_PCMCIA_SIZE ((uint)(32 * 1024 * 1024)) - -/* We do not currently support the internal clock mode for the UART. This - limits the minimum OPB frequency to just over 2X the UART oscillator - frequency. At OPB frequencies less than this the serial port will not - function due to the way that SerClk is sampled. */ - -#define PPC4xx_SERCLK_FREQ 11059200 -#define BASE_BAUD (PPC4xx_SERCLK_FREQ / 16) - -#define PPC4xx_MACHINE_NAME "IBM 405LP Beech" - -/**************************************************************************** - * Non-standard board support follows - ****************************************************************************/ - -extern int beech_sram_free(void *p); -extern int ibm405lp_set_pixclk(unsigned pixclk_low, unsigned pixclk_high); -extern void *beech_sram_alloc(size_t size); - -#endif /* !__ASSEMBLY__ */ -#endif /* __ASM_BEECH_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/cedar.c b/arch/ppc/platforms/4xx/cedar.c --- a/arch/ppc/platforms/4xx/cedar.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,90 +0,0 @@ -/* - * arch/ppc/platforms/4xx/cedar.c - * - * Support for the IBM NP405L ceder eval board - * - * Author: Armin Kuster - * - * 2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ -#include -#include -#include -#include - -#include -#include - -void *cedar_rtc_base; - -void __init -cedar_setup_arch(void) -{ - bd_t *bip = &__res; - - /* RTC step for the walnut */ - cedar_rtc_base = (void *) CEDAR_RTC_VADDR; - TODC_INIT(TODC_TYPE_DS1743, cedar_rtc_base, cedar_rtc_base, - cedar_rtc_base, 8); - -#ifdef CONFIG_DEBUG_BRINGUP - printk("\n"); - printk("machine\t: %s\n", PPC4xx_MACHINE_NAME); - printk("\n"); - printk("bi_s_version\t %s\n", bip->bi_s_version); - printk("bi_r_version\t %s\n", bip->bi_r_version); - printk("bi_memsize\t 0x%8.8x\t %dMBytes\n", bip->bi_memsize, - bip->bi_memsize / (1024 * 1000)); - printk("bi_enetaddr %d\t %2.2x%2.2x%2.2x-%2.2x%2.2x%2.2x\n", 0, - bip->bi_enetaddr[0][0], bip->bi_enetaddr[0][1], - bip->bi_enetaddr[0][2], bip->bi_enetaddr[0][3], - bip->bi_enetaddr[0][4], bip->bi_enetaddr[0][5]); - - printk("bi_enetaddr %d\t %2.2x%2.2x%2.2x-%2.2x%2.2x%2.2x\n", 1, - bip->bi_enetaddr[1][0], bip->bi_enetaddr[1][1], - bip->bi_enetaddr[1][2], bip->bi_enetaddr[1][3], - bip->bi_enetaddr[1][4], bip->bi_enetaddr[1][5]); - - printk("bi_intfreq\t 0x%8.8x\t clock:\t %dMhz\n", - bip->bi_intfreq, bip->bi_intfreq / 1000000); - - printk("bi_busfreq\t 0x%8.8x\t plb bus clock:\t %dMHz\n", - bip->bi_busfreq, bip->bi_busfreq / 1000000); - printk("bi_pci_busfreq\t 0x%8.8x\t pci bus clock:\t %dMHz\n", - bip->bi_pci_busfreq, bip->bi_pci_busfreq / 1000000); - - printk("\n"); -#endif - - /* Identify the system */ - printk - ("IBM Cedar port (C) 2002 MontaVista Software, Inc. (source@mvista.com)\n"); - -} - -void __init -cedar_map_io(void) -{ - ppc4xx_map_io(); - io_block_mapping(CEDAR_RTC_VADDR, - CEDAR_RTC_PADDR, CEDAR_RTC_SIZE, _PAGE_IO); -} - -void __init -platform_init(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7) -{ - ppc4xx_init(r3, r4, r5, r6, r7); - - ppc_md.setup_arch = cedar_setup_arch; - ppc_md.setup_io_mappings = cedar_map_io; - - ppc_md.time_init = todc_time_init; - ppc_md.set_rtc_time = todc_set_rtc_time; - ppc_md.get_rtc_time = todc_get_rtc_time; - ppc_md.nvram_read_val = todc_direct_read_val; - ppc_md.nvram_write_val = todc_direct_write_val; -} diff -Nru a/arch/ppc/platforms/4xx/cedar.h b/arch/ppc/platforms/4xx/cedar.h --- a/arch/ppc/platforms/4xx/cedar.h Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,68 +0,0 @@ -/* - * arch/ppc/platforms/4xx/cedar.h - * - * Macros, definitions, and data structures specific to the IBM PowerPC - * Cedar eval board. - * - * Author: Armin Kuster - * - * 2000 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifdef __KERNEL__ -#ifndef __ASM_CEDAR_H__ -#define __ASM_CEDAR_H__ -#include - -#ifndef __ASSEMBLY__ -/* - * Data structure defining board information maintained by the boot - * ROM on IBM's "Cedar" evaluation board. An effort has been made to - * keep the field names consistent with the 8xx 'bd_t' board info - * structures. - */ - -typedef struct board_info { - unsigned char bi_s_version[4]; /* Version of this structure */ - unsigned char bi_r_version[30]; /* Version of the IBM ROM */ - unsigned int bi_memsize; /* DRAM installed, in bytes */ - unsigned char bi_enetaddr[2][6]; /* Local Ethernet MAC address */ - unsigned char bi_pci_mac[6]; - unsigned int bi_intfreq; /* Processor speed, in Hz */ - unsigned int bi_busfreq; /* PLB Bus speed, in Hz */ - unsigned int bi_pci_busfreq; /* PCI speed in Hz */ -} bd_t; - -/* Some 4xx parts use a different timebase frequency from the internal clock. -*/ -#define bi_tbfreq bi_intfreq - -/* Memory map for the IBM "Cedar" NP405 evaluation board. - */ - -extern void *cedar_rtc_base; -#define CEDAR_RTC_PADDR ((uint)0xf0000000) -#define CEDAR_RTC_VADDR CEDAR_RTC_PADDR -#define CEDAR_RTC_SIZE ((uint)8*1024) - -/* Early initialization address mapping for block_io. - * Standard 405GP map. - */ -#define PPC4xx_ONB_IO_PADDR ((uint)0xef600000) -#define PPC4xx_ONB_IO_VADDR PPC4xx_ONB_IO_PADDR -#define PPC4xx_ONB_IO_SIZE ((uint)4*1024) - -#ifdef CONFIG_PPC405GP_INTERNAL_CLOCK -#define BASE_BAUD 201600 -#else -#define BASE_BAUD 691200 -#endif - -#define PPC4xx_MACHINE_NAME "IBM NP405L Cedar" - -#endif /* !__ASSEMBLY__ */ -#endif /* __ASM_CEDAR_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/ibm405lp.c b/arch/ppc/platforms/4xx/ibm405lp.c --- a/arch/ppc/platforms/4xx/ibm405lp.c Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,266 +0,0 @@ -/* - * arch/ppc/platforms/ibm405lp.c 405LP-specific code - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Copyright (C) 2002, International Business Machines Corporation - * All Rights Reserved. - * - * Bishop Brock - * IBM Research, Austin Center for Low-Power Computing - * bcbrock@us.ibm.com - * March, 2002 - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct ocp_def core_ocp[] __initdata = { - {OCP_VENDOR_IBM, OCP_FUNC_OPB, OPB0_BASE, OCP_IRQ_NA, OCP_CPM_NA}, - {OCP_VENDOR_IBM, OCP_FUNC_16550, UART0_IO_BASE, UART0_INT,IBM_CPM_UART0}, - {OCP_VENDOR_IBM, OCP_FUNC_16550, UART1_IO_BASE, UART1_INT, IBM_CPM_UART1}, - {OCP_VENDOR_IBM, OCP_FUNC_IIC, IIC0_BASE, IIC0_IRQ, IBM_CPM_IIC0}, - {OCP_VENDOR_IBM, OCP_FUNC_GPIO, GPIO0_BASE, OCP_IRQ_NA, IBM_CPM_GPIO0}, - {OCP_VENDOR_INVALID, OCP_FUNC_INVALID, 0x0, OCP_IRQ_NA, OCP_CPM_NA}, -}; - -#ifdef CONFIG_PM -/* Set up the 405LP clock and power management unit for aggressive power - management. - - Briefly, there are 3 CPM "classes": - - Class 1 - Either completely asleep or awake. The "force" state is - equivalent to the "enabled" state. Many Class 1 units are - critical system components and are never power managed. - - Class 2 - Can be enabled for power management, where sleep requests are - made by the peripheral, typically after an inactivity timeout. - When sleeping, critical interfaces remain active, and - awaken the unit whenever it is targeted with a transaction. - - Class 3 - Can be enabled for power management, where sleep requests are - made by the CPM. Power management for these units typically - will require intelligence in a device driver. - - In the current implementation, the "force" bits are only used on Class 1 - devices, and only when the associated driver has the intelligence necessary - to "unforce" the power management state. A previous scheme, which tried to - enable power management based on whether a particular driver was compiled - with the kernel, caused many problems and is never used here. - - Class 2 devices with timeouts are normally initialized for the most - aggressive values. There is no power management benefit of "forcing" Class - 2 devices over letting their inactivity timeouts take effect. Therefore, - after being set up here, Class 2 device drivers don't need to worry about - CPM. - - No Class 3 devices are handled yet. */ - -void __init -ibm405lp_setup_cpm(void) -{ - u32 force = 0; - u32 enable = 0; - dma0_slp_t dma0_slp; - dcp0_cfg_t dcp0_cfg; - ebc0_cfg_t ebc0_cfg; - sdram0_cfg_t sdram0_cfg; - sdram0_pmit_t sdram0_pmit; - sla0_slpmd_t sla0_slpmd; - - /* Initialize the CPM state */ - - mtdcr(DCRN_CPMFR, force); - mtdcr(DCRN_CPMER, enable); - - /* IIC - Class 3 - Not handled yet. The driver should at least be able - to force/unforce itself. */ - - /* CPU - class 2 - There doesn't appear to be a timeout associated with - this, and the exact function is not documented anywhere. It saves a - lot of power, though. I assume this gates core clocks when the CPU - core is asleep, and probably adds a couple of cycles of latency when - the CPU core wakes up. */ - - enable |= IBM_CPM_CPU; - - /* DMA - class 2. Set for the minimum timeout, which is 32 cycles. */ - - dma0_slp.reg = mfdcr(DCRN_SLP); - dma0_slp.fields.sme = 1; - dma0_slp.fields.idu = 0; - mtdcr(DCRN_SLP, dma0_slp.reg); - enable |= IBM_CPM_DMA; - - /* BRG - Class 2. Seems to crash the system when enabled in 405LP Pass - 1 - - DCP (CodePack) - Class 2. The semantics of the sleep delay are not - documented. We'll use 32 (what the heck). */ - - dcp0_cfg.reg = mfdcri(DCRN_DCP0, CFG); - dcp0_cfg.fields.slen = 1; - dcp0_cfg.fields.sldy = 32; - mtdcri(DCRN_DCP0, CFG, dcp0_cfg.reg); - enable |= IBM_CPM_DCP; - - /* EBC - Class 2. Set for minimum timeout, which is 32 cycles. [ I - think this is 32. It may be 64. I don't trust the documentation. ] - */ - - ebc0_cfg.reg = mfdcri(DCRN_EBC0, CFG); - ebc0_cfg.fields.pme = 1; - ebc0_cfg.fields.pmt = 1; - mtdcri(DCRN_EBC0, CFG, ebc0_cfg.reg); - enable |= IBM_CPM_EBC; - - /* SDRAM - Class 2. Set for the minimum 32-cycle timeout. - - The documentation on this core is clear - waking a sleeping SDRAM - controller takes 2 PLB cycles, which is added to the latency of the - memory operation. If someone can prove that this is affecting - performance we can easily back this off. */ - - sdram0_cfg.reg = mfdcri(DCRN_SDRAM0, CFG); - sdram0_cfg.fields.pme = 1; - mtdcri(DCRN_SDRAM0, CFG, sdram0_cfg.reg); - - sdram0_pmit.reg = mfdcri(DCRN_SDRAM0, PMIT); - sdram0_pmit.fields.cnt = 0; - mtdcri(DCRN_SDRAM0, PMIT, sdram0_pmit.reg); - - enable |= IBM_CPM_SDRAM0; - - /* PLB - Class 2. Seems to crash the system when enabled in 405LP Pass - 1. - - GPIO - Class 1. This unit is used for many things, and no single - driver controls all GPIO. It's best left unmanaged (it doesn't use - much power anyway). NB: 405LP Pass 1 erratum - forcing PM on GPIO - kills the TPC. - - UART0 - Class 1 - UART1 - Class 1 - - Someone should work on the serial port drivers to enable PM support - for them. Any takers? - - UIC - Class 1 - CPU_TMRCLK - Class 1 - - These system resources are never power managed. */ - - /* SLA - Class 2. Set for the minimum 32-cycle timeout. */ - - sla0_slpmd.reg = mfdcri(DCRN_SLA0, SLPMD); - sla0_slpmd.fields.slen = 1; - sla0_slpmd.fields.slcr = 0; - mtdcri(DCRN_SLA0, SLPMD, sla0_slpmd.reg); - enable |= IBM_CPM_SLA; - - /* CSI - Class 1. - TPC - Class 1. - TDES - Class 1. - - The drivers for these units are power-aware, and manage the device - properly. By default these units are forced off at boot. */ - - force |= IBM_CPM_CSI; - force |= IBM_CPM_TPC; - force |= IBM_CPM_TDES; - - /* Set the CPM state */ - - mtdcr(DCRN_CPMFR, force); - mtdcr(DCRN_CPMER, enable); -} -#endif - -/* This routine is included here because the framebuffer driver needs a way to - tell the system the Pixel clock frequency it needs, regardless of whether - run-time frequency scaling is configured. A hook and a couple of global - variables are always present and will be used by the RTVFS driver if it is - loaded. - - Pixel clock setting is kind of a hack, as the frequency steps available from - the PLB/PixClk divider may be too large to guarantee that we'll hit within - the given limits. We never set the frequency above the upper bound, but due - to quantization may need to set the frequency below the lower bound. So far - it works OK for the panels we've tried. - - In general, the choice of a system clock frequency should be made with - consideration of the LCD panel to be attached, to guarantee a good clock - divider for the Pixel clock regardless of frequency scaling. - - Clock frequencies are in KHz. If pixclk_min or pixclk_max are zero, we set - the lowest possible frequency to conserve energy. */ - -int (*set_pixclk_hook) (unsigned pixclk_min, unsigned pixclk_max) = NULL; -unsigned last_pixclk_min = 0; -unsigned last_pixclk_max = 0; - -EXPORT_SYMBOL(set_pixclk_hook); -EXPORT_SYMBOL(last_pixclk_min); -EXPORT_SYMBOL(last_pixclk_max); - -int -ibm405lp_set_pixclk(unsigned pixclk_min, unsigned pixclk_max) -{ - unsigned divider; - bd_t *bip = (bd_t *) __res; - unsigned plb_khz = bip->bi_busfreq / 1000; - cpc0_cgcr1_t cgcr1; - - if (set_pixclk_hook) { - return (set_pixclk_hook) (pixclk_min, pixclk_max); - } else { - if ((pixclk_min == 0) || (pixclk_max == 0)) - divider = CPC0_DIV_MAX; - else { - divider = plb_khz / pixclk_min; - if (divider == 0) - divider = 1; - if ((divider < CPC0_DIV_MAX) && - ((plb_khz / divider) > pixclk_max)) - divider++; - } - - cgcr1.reg = mfdcr(DCRN_CPC0_CGCR1); - cgcr1.fields.ppxl = CPC0_DIV_ENCODE(divider); - mtdcr(DCRN_CPC0_CGCR1, cgcr1.reg); - - last_pixclk_min = pixclk_min; - last_pixclk_max = pixclk_max; - return 0; - } -} diff -Nru a/arch/ppc/platforms/4xx/ibm405lp.h b/arch/ppc/platforms/4xx/ibm405lp.h --- a/arch/ppc/platforms/4xx/ibm405lp.h Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,900 +0,0 @@ -/* - * include/asm-ppc/platforms/ibm405lp.h 405LP-specific definitions - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Copyright (C) 2002, International Business Machines Corporation - * All Rights Reserved. - * - * Bishop Brock - * IBM Research, Austin Center for Low-Power Computing - * bcbrock@us.ibm.com - * March, 2002 - * - */ - -#ifdef __KERNEL__ -#ifndef __ASM_IBM405LP_H__ -#define __ASM_IBM405LP_H__ - -#include -#include - -/* Machine-specific register naming for the 4xx processors is a mess. It seems - that everyone had a different idea on how to prefix/abbreviate/configure the - DCR numbers and MMIO addresses. I'm no different! For the 405LP we have - defined all of the DCRs and MMIO address consistently with their names as - documented in the official IBM hardware manual for the processor. - - DCRs are all given a DCRN_ prefix, which seems to be the most - common consistent naming scheme in old code (although the official IBM DCR - names are so unique that there's really little need for the DCRN_). - - At the end of the DCR defines several synonyms are defined for backwards - compatibility, but all new code specific to the 405LP uses the consistent - names. - - Version 07/24/02 1.1 - Armin - added default pm define -*/ - -/***************************************************************************** - * Directly accessed DCRs - *****************************************************************************/ - -/* DCRs used for Indirect Access */ - -#define DCRN_SDRAM0_CFGADDR 0x010 /* Memory Ctlr. DCR Address Register */ -#define DCRN_SDRAM0_CFGDATA 0x011 /* Memory Ctlr. DCR Data Register */ -#define DCRN_EBC0_CFGADDR 0x012 /* Peripheral Ctlr. DCR Address Register */ -#define DCRN_EBC0_CFGDATA 0x013 /* Peripheral Ctlr. DCR Data Register */ -#define DCRN_SLA0_CFGADDR 0x0e0 /* Speech Label Accel. DCR Address Reg. */ -#define DCRN_SLA0_CFGDATA 0x0e1 /* Speech Label Accel. DCR Data Reg. */ -#define DCRN_LCD0_CFGADDR 0x3c8 /* LCD Ctlr. DCR Address Reg. */ -#define DCRN_LCD0_CFGDATA 0x3c9 /* LCD Ctlr. DCR Data Reg. */ - -/* On-chip Buses */ - -#define DCRN_PLB0_BESR 0x084 /* PLB Bus Error Status Register */ -#define DCRN_PLB0_BEAR 0x086 /* PLB Bus Error Address Register */ -#define DCRN_PLB0_ACR 0x087 /* PLB Arbiter Control Register */ -#define DCRN_POB0_BESR0 0x0a0 /* PLB to OPB Bus Error Status Register 0 */ -#define DCRN_POB0_BEAR 0x0a2 /* PLB to OPB Bus Error Address Register */ -#define DCRN_POB0_BESR1 0x0a4 /* PLB to OPB Bus Error Status Register 1 */ - -/* Clocking and Chip Control */ - -#define DCRN_CPC0_PLLMR 0x0b0 /* PLL Mode Register */ -#define DCRN_CPC0_CGCR0 0x0b1 /* Clock Generation Control Register 0 */ -#define DCRN_CPC0_CGCR1 0x0b2 /* Clock Generation Control Register 1 */ -#define DCRN_CPC0_CR0 0x0b5 /* Chip Control Register 0 */ -#define DCRN_CHCR0 DCRN_CPC0_CR0 -#define DCRN_CPC0_CR1 0x0b4 /* Chip Control Register 1 */ -#define DCRN_CPC0_PLBAPR 0x0b6 /* PLB Arbiter Priority Register */ -#define DCRN_CPC0_JTAGID 0x0b7 /* JTAG ID Register */ - -/* Clock and Power Management */ - -#define DCRN_CPMSR_BASE 0x0b8 /* CPM Status Register */ -#define DCRN_CPMFR_BASE 0x0ba /* CPM Force Register */ - -/* Universal Interrupt Controller */ - -#define DCRN_UIC0_SR 0x0c0 /* UIC Status Register */ -#define DCRN_UIC0_ER 0x0c2 /* UIC Enable Register */ -#define DCRN_UIC0_CR 0x0c3 /* UIC Critical Register */ -#define DCRN_UIC0_PR 0x0c4 /* UIC Polarity Register */ -#define DCRN_UIC0_TR 0x0c5 /* UIC Triggering Register */ -#define DCRN_UIC0_MSR 0x0c6 /* UIC Masked Status Register */ -#define DCRN_UIC0_VR 0x0c7 /* UIC Vector Register */ -#define DCRN_UIC0_VCR 0x0c8 /* UIC Vector Configuration Register */ - -/* Real-time Clock */ - -#define DCRN_RTC0_SEC 0x140 /* RTC Seconds Register */ -#define DCRN_RTC0_SECAL 0x141 /* RTC Seconds Alarm Register */ -#define DCRN_RTC0_MIN 0x142 /* RTC Minutes Register */ -#define DCRN_RTC0_MINAL 0x143 /* RTC Minutes Alarm Register */ -#define DCRN_RTC0_HR 0x144 /* RTC Hours Register */ -#define DCRN_RTC0_HRAL 0x145 /* RTC Hours Alarm Register */ -#define DCRN_RTC0_DOW 0x146 /* RTC Day of Week Register */ -#define DCRN_RTC0_DOM 0x147 /* RTC Date of Month Register */ -#define DCRN_RTC0_MONTH 0x148 /* RTC Month Register */ -#define DCRN_RTC0_YEAR 0x149 /* RTC Year Register */ -#define DCRN_RTC0_CR0 0x14a /* RTC "A" Register */ -#define DCRN_RTC0_CR1 0x14b /* RTC "B" Register */ -#define DCRN_RTC0_CR2 0x14c /* RTC "C" Register */ -#define DCRN_RTC0_CR3 0x14d /* RTC "D" Register */ -#define DCRN_RTC0_CEN 0x14e /* RTC Century Register */ -#define DCRN_RTC0_WRAP 0x150 /* RTC Wrapper */ - -/* Advanced Power Management Controller */ - -#define DCRN_APM0_ISR 0x160 /* APM Interrupt Status Register */ -#define DCRN_APM0_IER 0x162 /* APM Interrupt Enable Register */ -#define DCRN_APM0_IPR 0x163 /* APM Interrupt Polarity Register */ -#define DCRN_APM0_ITR 0x164 /* APM Interrupt Trigger Register */ -#define DCRN_APM0_CFG 0x165 /* APM Configuration Register */ -#define DCRN_APM0_SR 0x166 /* APM Status Register */ -#define DCRN_APM0_ID 0x167 /* APM Revision ID Register */ - -/* Triple DES Controller */ - -#define DCRN_TDES0_ADDR 0x180 /* TDES OPB Slave Base Address */ -#define DCRN_TDES0_CFG 0x181 /* TDES OPB Slave Configuration */ -#define DCRN_TDES0_STAT 0x182 /* TDES Status */ -#define DCRN_TDES0_ID 0x183 /* TDES Core ID */ - -/* LCD Controller */ - -#define DCRN_LCD0_CFG 0x3c0 /* LCD Configuration Register */ -#define DCRN_LCD0_ICR 0x3c1 /* LCD Interrupt Control Register */ -#define DCRN_LCD0_ISR 0x3c2 /* LCD Interrupt Status Register */ -#define DCRN_LCD0_IMR 0x3c3 /* LCD Interrupt Mask Register */ - -/***************************************************************************** - * Indirectly accessed DCRs. Note that unlike direct-access DCRs whose numbers - * must be hard-coded into the instruction, indirect-access DCR numbers can be - * computed. - *****************************************************************************/ - -/* Offsets for SDRAM Controler Registers */ - -#define DCRN_SDRAM0_BESR0 0x00 /* Bus Error Syndrome Register 0 */ -#define DCRN_SDRAM0_BESR1 0x08 /* Bus Error Syndrome Register 1 */ -#define DCRN_SDRAM0_BEAR 0x10 /* Bus Error Address Register */ -#define DCRN_SDRAM0_CFG 0x20 /* Memory Controller Options 1 */ -#define DCRN_SDRAM0_STATUS 0x24 /* SDRAM controller status */ -#define DCRN_SDRAM0_RTR 0x30 /* Refresh Timer Register */ -#define DCRN_SDRAM0_PMIT 0x34 /* Power Management Idle Timer */ -#define DCRN_SDRAM0_B0CR 0x40 /* Memory Bank 0 Configuration */ -#define DCRN_SDRAM0_B1CR 0x44 /* Memory Bank 1 Configuration */ -#define DCRN_SDRAM0_B2CR 0x48 /* Memory Bank 2 Configuration */ -#define DCRN_SDRAM0_B3CR 0x4c /* Memory Bank 3 Configuration */ -#define DCRN_SDRAM0_TR 0x80 /* Sdram Timing Register 1 */ -#define DCRN_SDRAM0_ECCCFG 0x94 /* ECC Configuration */ -#define DCRN_SDRAM0_ECCESR 0x98 /* ECC Error Status Register */ - -#define SDRAM0_BANKS 4 -#define DCRN_SDRAM0_BnCR(bank) (0x40 + (4 * (bank))) - -/* Offsets for External Bus Controller Registers */ - -#define DCRN_EBC0_B0CR 0x00 /* Peripheral Bank 0 Configuration Register */ -#define DCRN_EBC0_B1CR 0x01 /* Peripheral Bank 1 Configuration Register */ -#define DCRN_EBC0_B2CR 0x02 /* Peripheral Bank 2 Configuration Register */ -#define DCRN_EBC0_B3CR 0x03 /* Peripheral Bank 3 Configuration Register */ -#define DCRN_EBC0_B4CR 0x04 /* Peripheral Bank 4 Configuration Register */ -#define DCRN_EBC0_B5CR 0x05 /* Peripheral Bank 5 Configuration Register */ -#define DCRN_EBC0_B6CR 0x06 /* Peripheral Bank 6 Configuration Register */ -#define DCRN_EBC0_B7CR 0x07 /* Peripheral Bank 7 Configuration Register */ -#define DCRN_EBC0_B0AP 0x10 /* Peripheral Bank 0 Access Parameters */ -#define DCRN_EBC0_B1AP 0x11 /* Peripheral Bank 1 Access Parameters */ -#define DCRN_EBC0_B2AP 0x12 /* Peripheral Bank 2 Access Parameters */ -#define DCRN_EBC0_B3AP 0x13 /* Peripheral Bank 3 Access Parameters */ -#define DCRN_EBC0_B4AP 0x14 /* Peripheral Bank 4 Access Parameters */ -#define DCRN_EBC0_B5AP 0x15 /* Peripheral Bank 5 Access Parameters */ -#define DCRN_EBC0_B6AP 0x16 /* Peripheral Bank 6 Access Parameters */ -#define DCRN_EBC0_B7AP 0x17 /* Peripheral Bank 7 Access Parameters */ -#define DCRN_EBC0_BEAR 0x20 /* Periperal Bus Error Address Register */ -#define DCRN_EBC0_BESR0 0x21 /* Peripheral Bus Error Status Register 0 */ -#define DCRN_EBC0_BESR1 0x22 /* Peripheral Bus Error Status Register 0 */ -#define DCRN_EBC0_CFG 0x23 /* External Peripheral Control Register */ - -#define EBC0_BANKS 8 -#define DCRN_EBC0_BnCR(bank) (bank) -#define DCRN_EBC0_BnAP(bank) (0x10 + (bank)) - -/* Offsets for LCD Controller DCRs */ - -#define DCRN_LCD0_DER 0x80010000 /* Display Enable Regsiter */ -#define DCRN_LCD0_DCFG 0x80010010 /* Display Configuration Register */ -#define DCRN_LCD0_DSR 0x80010040 /* Display Status Register */ -#define DCRN_LCD0_FRDR 0x80010080 /* Dither and Frame Rate Modulation Reg. */ -#define DCRN_LCD0_SDR 0x800100c0 /* Signal Delay Register */ -#define DCRN_LCD0_ADSR 0x80010100 /* Active Display Size Register */ -#define DCRN_LCD0_TDSR 0x80010104 /* Total Display Size Register */ -#define DCRN_LCD0_FPLCR 0x80010140 /* FPLINE Control Register */ -#define DCRN_LCD0_FPLOR 0x80010144 /* FPLINE Offset Register */ -#define DCRN_LCD0_FPFCR 0x80010148 /* FPFRAME Control Register */ -#define DCRN_LCD0_FPFOR 0x8001014c /* FPFRAME Control Register */ -#define DCRN_LCD0_FPSCR 0x80010150 /* FPSHIFT Control Register */ -#define DCRN_LCD0_FPDRR 0x80010158 /* FPDRDY Control Register */ -#define DCRN_LCD0_FPDCR 0x80010160 /* FPDATA Control Register */ -#define DCRN_LCD0_PFBFR 0x80010800 /* Pixel and Frame Buffer Format Reg. */ -#define DCRN_LCD0_PFR 0x80011000 /* Pixel Format Register */ -#define DCRN_LCD0_FBBAR 0x80011008 /* Frame Buffer Base Address Register */ -#define DCRN_LCD0_STRIDE 0x8001100c /* Stride Register */ -#define DCRN_LCD0_PAR 0x80011800 /* Palette Access Registers Base */ -#define DCRN_LCD0_CER 0x80012000 /* Cursor Enable Register */ -#define DCRN_LCD0_CBAR 0x80012008 /* Cursor Base Address Register */ -#define DCRN_LCD0_CLR 0x8001200c /* Cursor Location Register */ -#define DCRN_LCD0_CC0R 0x80012010 /* Cursor Color 0 */ -#define DCRN_LCD0_CC1R 0x80012014 /* Cursor Color 1 */ - -#define LCD0_PAR_REGS 256 -#define DCRN_LCD0_PARn(n) (DCRN_LCD0_PAR + (4 * (n))) - -/* Offsets for Decompression Controller DCRs */ - -#define DCRN_DCP0_ITOR0 0x00 /* Index Table Origin Register 0 */ -#define DCRN_DCP0_ITOR1 0x01 /* Index Table Origin Register 1 */ -#define DCRN_DCP0_ITOR2 0x02 /* Index Table Origin Register 2 */ -#define DCRN_DCP0_ITOR3 0x03 /* Index Table Origin Register 3 */ -#define DCRN_DCP0_ADDR0 0x04 /* Address Decode Definition Register 0 */ -#define DCRN_DCP0_ADDR1 0x05 /* Address Decode Definition Register 1 */ -#define DCRN_DCP0_CFG 0x40 /* Decompression Controller Cfg. Register */ -#define DCRN_DCP0_ID 0x41 /* Decompression Controller ID Register */ -#define DCRN_DCP0_VER 0x42 /* Decompression Controller Version Register */ -#define DCRN_DCP0_PLBBEAR 0x50 /* Bus Error Address Register (PLB) */ -#define DCRN_DCP0_MEMBEAR 0x51 /* Bus Error Address Register (EBC/SDRAM) */ -#define DCRN_DCP0_ESR 0x52 /* Bus Error Status Register 0 (Masters 0-3) */ - -#define DCRN_DCP0_RAMn(n) (0x400 + (n)) /* Decompression Decode Table Entries - 0x400-0x5FF Low 16-bit decode table - 0x600-0x7FF High 16-bit decode table - */ - -/* Offsets for Speech Label Accelerator DCRs */ - -#define DCRN_SLA0_CR 0x00 /* SLA Control Register */ -#define DCRN_SLA0_SR 0x01 /* SLA Status Register */ -#define DCRN_SLA0_BESR 0x02 /* SLA Bus Error Status Register */ -#define DCRN_SLA0_BEAR 0x03 /* SLA Bus Error Address Register */ -#define DCRN_SLA0_UADDR 0x04 /* SLA PLB Upper Address Register */ -#define DCRN_SLA0_GMBA 0x05 /* SLA General Indirect Memory Base Address */ -#define DCRN_SLA0_GMLL 0x06 /* SLA General Indirect Memory Link List */ -#define DCRN_SLA0_AMBA 0x07 /* SLA Atom Memory Base Address Register */ -#define DCRN_SLA0_ACBA 0x08 /* SLA Accumulator Base Address Register */ -#define DCRN_SLA0_DIBA 0x09 /* SLA Done Indication Base Address Register */ -#define DCRN_SLA0_GPOFF 0x0A /* SLA General Indirect Pass Offset Register */ -#define DCRN_SLA0_SLPMD 0x0B /* SLA Sleep Mode Control Register */ -#define DCRN_SLA0_ID 0x0C /* SLA ID Register */ -#define DCRN_SLA0_GMLLR 0x0D /* SLA General Indirect Memory Link List Reset */ - -#define DCRN_DMA0_BASE 0x100 -#define DCRN_DMA1_BASE 0x108 -#define DCRN_DMA2_BASE 0x110 -#define DCRN_DMA3_BASE 0x118 -#define DCRNCAP_DMA_SG 1 /* have DMA scatter/gather capability */ -#define DCRN_DMASR_BASE 0x120 -#define DCRN_EBC_BASE 0x012 -#define DCRN_DCP0_BASE 0x014 -#define DCRN_UIC0_BASE 0x0C0 - -#define UIC0 DCRN_UIC0_BASE - -#undef NR_UICS -#define NR_UICS 1 - -/* More memory-mapped I/O bases, etc., esp. for OCP, that should be moved - elsewhere. */ - -#define IIC0_BASE 0xEF600500 -#define OPB0_BASE 0xEF600600 -#define GPIO0_BASE 0xEF600700 - -#define IIC0_IRQ 2 - -/**************************************************************************** - * MMIO Addresses - ***************************************************************************/ - -/* Touch Panel/PWM Controller */ - -#define TPC0_IO_BASE 0xef600a00 - -#define TPC_CR 0x00 /* TPC Command Register */ -#define TPC_PCRX 0x04 /* TPC Precharge Count Register X1 */ -#define TPC_DCRX 0x08 /* TPC Discharge Count Register X1 */ -#define TPC_PCRY 0x0c /* TPC Precharge Count Register Y1 */ -#define TPC_DCRY 0x10 /* TPC Discharge Count Register Y1 */ -#define TPC_RRX 0x14 /* TPC Read Register X1 */ -#define TPC_RRY 0x18 /* TPC Read Register Y1 */ -#define TPC_SRX 0x1c /* TPC Status Register X1 */ -#define TPC_SRY 0x20 /* TPC Status Register Y1 */ - -/* Triple-DES Controller */ - -#define TDES0_IO_BASE 0xef600b00 - -/***************************************************************************** - * CPM bits for the 405LP. - *****************************************************************************/ - -#define CPM_BITMASK(i) (((unsigned)0x80000000) >> i) - -#define IBM_CPM_IIC0 CPM_BITMASK(0) /* IIC Interface */ -#define IBM_CPM_CPU CPM_BITMASK(1) /* Processor Core */ -#define IBM_CPM_DMA CPM_BITMASK(3) /* DMA Controller */ -#define IBM_CPM_OPB CPM_BITMASK(4) /* PLB to OPB Bridge */ -#define IBM_CPM_DCP CPM_BITMASK(5) /* CodePack */ -#define IBM_CPM_EBC CPM_BITMASK(6) /* ROM/SRAM Peripheral Controller */ -#define IBM_CPM_SDRAM0 CPM_BITMASK(7) /* SDRAM memory controller */ -#define IBM_CPM_PLB CPM_BITMASK(8) /* PLB bus arbiter */ -#define IBM_CPM_GPIO0 CPM_BITMASK(9) /* General Purpose IO (??) */ -#define IBM_CPM_UART0 CPM_BITMASK(10) /* Serial Port 0 */ -#define IBM_CPM_UART1 CPM_BITMASK(11) /* Serial Port 1 */ -#define IBM_CPM_UIC CPM_BITMASK(12) /* Universal Interrupt Controller */ -#define IBM_CPM_TMRCLK CPM_BITMASK(13) /* CPU Timers */ -#define IBM_CPM_SLA CPM_BITMASK(14) /* Speech Label Accelerator */ -#define IBM_CPM_CSI CPM_BITMASK(15) /* CODEC Serial Interface */ -#define IBM_CPM_TPC CPM_BITMASK(16) /* Touch Panel Controller */ -#define IBM_CPM_TDES CPM_BITMASK(18) /* Triple DES */ - -#define DFLT_IBM4xx_PM 0 /* for now until we get a better hable on this one - armin */ - -/***************************************************************************** - * UIC IRQ ordinals for the 405LP. IRQ bit names are as documented in the - * 405LP manual (except for reserved fields). Backwards-compatible synonyms - * appear at the end. - *****************************************************************************/ - -#define UIC_IRQ_U0 0 /* UART0 */ -#define UIC_IRQ_U1 1 /* UART1 */ -#define UIC_IRQ_IIC 2 /* IIC */ -#define UIC_IRQ_EM 3 /* EBC ??? */ -#define UIC_IRQ_IRQ4 4 /* Reserved */ -#define UIC_IRQ_D0 5 /* DMA Channel 0 */ -#define UIC_IRQ_D1 6 /* DMA Channel 1 */ -#define UIC_IRQ_D2 7 /* DMA Channel 2 */ -#define UIC_IRQ_D3 8 /* DMA Channel 3 */ -#define UIC_IRQ_IRQ9 9 /* Reserved */ -#define UIC_IRQ_IRQ10 10 /* Reserved */ -#define UIC_IRQ_IRQ11 11 /* Reserved */ -#define UIC_IRQ_IRQ12 12 /* Reserved */ -#define UIC_IRQ_IRQ13 13 /* Reserved */ -#define UIC_IRQ_IRQ14 14 /* Reserved */ -#define UIC_IRQ_IRQ15 15 /* Reserved */ -#define UIC_IRQ_IRQ16 16 /* Reserved */ -#define UIC_IRQ_EC 17 /* ECC Correctable Error ??? */ -#define UIC_IRQ_TPX 18 /* Touch Panel X */ -#define UIC_IRQ_TPY 19 /* Touch Panel Y */ -#define UIC_IRQ_SLA 20 /* SLA Interrupt */ -#define UIC_IRQ_CSI 21 /* CSI Interrupt */ -#define UIC_IRQ_LCD 22 /* LCD Interrupt */ -#define UIC_IRQ_RTC 23 /* RTC Interrupt */ -#define UIC_IRQ_APM 24 /* APM Interrupt */ -#define UIC_IRQ_EIR0 25 /* External IRQ 0 */ -#define UIC_IRQ_EIR1 26 /* External IRQ 1 */ -#define UIC_IRQ_EIR2 27 /* External IRQ 2 */ -#define UIC_IRQ_EIR3 28 /* External IRQ 3 */ -#define UIC_IRQ_EIR4 29 /* External IRQ 4 */ -#define UIC_IRQ_EIR5 30 /* External IRQ 5 */ -#define UIC_IRQ_EIR6 31 /* External IRQ 6 */ - -/***************************************************************************** - * Serial port definitions - *****************************************************************************/ - -#ifdef CONFIG_SERIAL_MANY_PORTS -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE 4 -#endif - -#define UART0_INT UIC_IRQ_U0 -#define UART1_INT UIC_IRQ_U1 -#define UART0_IO_BASE 0xEF600300 -#define UART1_IO_BASE 0xEF600400 - -#define STD_UART_OP(num) \ - { 0, BASE_BAUD, 0, UART##num##_INT, \ - (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ - iomem_base:(u8 *) UART##num##_IO_BASE, \ - io_type: SERIAL_IO_MEM}, - -#if defined(CONFIG_UART0_TTYS0) -#define SERIAL_DEBUG_IO_BASE UART0_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(0) \ - STD_UART_OP(1) -#endif - -#if defined(CONFIG_UART0_TTYS1) -#define SERIAL_DEBUG_IO_BASE UART1_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(1) \ - STD_UART_OP(0) -#endif - -#ifndef __ASSEMBLY__ - -#include -#include - -/**************************************************************************** - * DCR type structures and field definitions for DCRs manipulated by the 405LP - * Linux port - ****************************************************************************/ - -/* APM0_CFG - APM Configuration Register */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd:17; - unsigned int isp:1; /* Initiate Sleep */ - unsigned int ewt:1; /* Enable Watchdog Timer */ - unsigned int sm:2; /* Sleep Mode */ - unsigned int iica:3; /* I2C Address (low-order 3 bits) */ - unsigned int psc:1; /* Power Select Control */ - unsigned int cdiv:6; /* IIC Clock Divider */ - unsigned int v:1; /* Valid bit */ - } fields; -} apm0_cfg_t; - -#define APM0_CFG_MASK 0xffff8000 /* AND to clear all non-reserved fields */ - -/* APM0_SR - APM Status Register */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd:17; - unsigned int cdet:1; /* Clock Detect */ - unsigned int en:1; /* APM Enable Indicator */ - unsigned int rset:1; /* Processor Reset by APM? */ - unsigned int pfr:1; /* Power Fail Reset? */ - unsigned int rsrt:1; /* Restart Successful? */ - unsigned int sdwn:1; /* Shutdown Complete */ - unsigned int errc:8; /* Error Code */ - unsigned int v:1; /* Valid Bit */ - } fields; -} apm0_sr_t; - -#define APM0_SR_MASK 0xffff8000 /* AND to clear all non-reserved fields */ - -/* APM0_IER -- APM Interrupt Enable Register - APM0_IPR -- APM Interrupt Polarity Register - APM0_ISR -- APM Interrupt Status Register - APM0_ITR -- APM Interrupt Trigger Register - - The interrupts are also accessed via standard interrupt numbers: - - 59 : Wake-up Input 0 - 60 : Wake-up Input 1 - 61 : Wake-up Input 2 - 62 : Real-Time Clock Interrupt -*/ - -typedef union { - u32 reg; - struct { - unsigned int rsvd:27; - unsigned int wi0e:1; - unsigned int wi1e:1; - unsigned int wi2e:1; - unsigned int cie:1; - unsigned int v:1; - } fields; -} apm0_ier_t; - -typedef union { - u32 reg; - struct { - unsigned int rsvd:27; - unsigned int wi0p:1; - unsigned int wi1p:1; - unsigned int wi2p:1; - unsigned int cip:1; - unsigned int v:1; - } fields; -} apm0_ipr_t; - -typedef union { - u32 reg; - struct { - unsigned int rsvd:27; - unsigned int wi0s:1; - unsigned int wi1s:1; - unsigned int wi2s:1; - unsigned int cis:1; - unsigned int v:1; - } fields; -} apm0_isr_t; - -typedef union { - u32 reg; - struct { - unsigned int rsvd:27; - unsigned int wi0t:1; - unsigned int wi1t:1; - unsigned int wi2t:1; - unsigned int cit:1; - unsigned int v:1; - } fields; -} apm0_itr_t; - -#define APM0_IER_MASK 0xffffffe0 /* AND to clear all non-reserved fields */ -#define APM0_IPR_MASK 0xffffffe0 /* AND to clear all non-reserved fields */ -#define APM0_ISR_MASK 0xffffffe0 /* AND to clear all non-reserved fields */ -#define APM0_ITR_MASK 0xffffffe0 /* AND to clear all non-reserved fields */ - -/* CPC0_PLLMR - PLL Mode Register */ - -typedef union { - u32 reg; - struct { - unsigned int pmul:5; /* PLL Multiplier */ - unsigned int pdiv:5; /* PLL Divider */ - unsigned int tun:10; /* PLL Tuning Control */ - unsigned int db2:1; /* Divide VCO by 2 Select */ - unsigned int csel:2; /* PLL Clock Output Select */ - unsigned int rsvd:8; /* Reserved */ - unsigned int v:1; /* Valid bit */ - } fields; -} cpc0_pllmr_t; - -#define CPC0_PLLMR_MASK 0x000001fe /* AND to clear all non-reserved fields */ -#define CPC0_PLLMR_RTVFS_MASK CPC0_PLLMR_MASK /* All bits controlled by RTVFS */ - -/* The PLL multiplier/divider are always multiples of 4. */ - -#define CPC0_PLLMR_MULDIV_ENCODE(n) ((((unsigned)(n)) / 4) - 1) -#define CPC0_PLLMR_MULDIV_DECODE(n) (((n) + 1) * 4) -#define CPC0_PLLMR_MULDIV_MAX 128 - -#define CPC0_PLLMR_TUN_HIGH 0x200 /* High-band tuning */ -#define CPC0_PLLMR_TUN_LOW 0x000 /* Low-band tuning */ - -#define CPC0_PLLMR_CSEL_REFCLK 0 /* System Reference Clock */ -#define CPC0_PLLMR_CSEL_PLLVCO 1 /* PLL VCO */ -#define CPC0_PLLMR_CSEL_RTC 2 /* RTC */ -#define CPC0_PLLMR_CSEL_EBCPLB5 3 /* EBC-PLB divisor is 5 ??? */ - -/* CPC0_CGCR0 - Clock Generation and Control Register 0 */ - -typedef union { - u32 reg; - struct { - unsigned int pcp:5; /* Proc. Core/PLB Clock Divisor */ - unsigned int pcsc:5; /* Proc. Core/SysClkOut Divisor */ - unsigned int pcu:5; /* Proc. Core/UARTSerClk Clock Div. */ - unsigned int u0cs:1; /* UART0 Clock Select */ - unsigned int u1cs:1; /* UART1 Clock Select */ - unsigned int scsel:2; /* SysClkOut Select */ - unsigned int rsvd:13; /* Reserved */ - } fields; -} cpc0_cgcr0_t; - -#define CPC0_CGCR0_MASK 0x00001fff /* AND to clear all non-reserved fields */ -#define CPC0_CGCR0_RTVFS_MASK 0x0001ffff /* AND to clear all rtvfs-modified - fields */ - -#define CPC0_CGCR0_SCSEL_OFF 0 /* SysClkOut driven low (low power) */ -#define CPC0_CGCR0_SCSEL_CPU 1 /* Select CPU clock as SysClkOut */ -#define CPC0_CGCR0_SCSEL_PLB 2 /* SysClkOut is PLB Sample Cycle */ -#define CPC0_CGCR0_SCSEL_OPB 3 /* SysClkOut is OPB Sample Cycle */ - -/* CPC0_CGCR1 - Clock Generation and Control Register 1 */ - -typedef union { - u32 reg; - struct { - unsigned int po:5; /* PLB/OPB Clock Divisor */ - unsigned int pext:5; /* PLB/External Clock Divisor */ - unsigned int ppxl:5; /* PLB/LCD Pixel Clock Divisor */ - unsigned int csel:2; /* PerClk Select */ - unsigned int rsvd:15; /* Reserved */ - } fields; -} cpc0_cgcr1_t; - -#define CPC0_CGCR1_MASK 0x00007fff /* AND to clear all non-reserved fields */ -#define CPC0_CGCR1_RTVFS_MASK 0x0001ffff /* AND to clear all rtvfs-modified - fields */ - -/* 5-bit clock dividers are directly encoded, except that an encoding of 0 - indicates divide-by-32. */ - -#define CPC0_DIV_MAX 32 -#define CPC0_DIV_VALID(n) (((n) > 0) && ((n) <= CPC0_DIV_MAX)) -#define CPC0_DIV_ENCODE(n) (((unsigned)(n) >= CPC0_DIV_MAX) ? 0 : (unsigned)(n)) -#define CPC0_DIV_DECODE(n) (((n) == 0) ? CPC0_DIV_MAX : (n)) - -#define CPC0_CGCR1_CSEL_OFF 0 /* PerClk driven low (low power) */ -#define CPC0_CGCR1_CSEL_PERCLK 1 /* Select PerClk */ -#define CPC0_CGCR1_CSEL_PLBCLK 2 /* Select PLB clock */ -#define CPC0_CGCR1_CSEL_OPBCLK 3 /* Select OPB clock */ - -/* CPC0_CR0 - Chip Control Register 0 */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd0:7; /* Reserved */ - unsigned int ssr:1; /* SDRAM Self-Refresh on Sleep Req. */ - unsigned int gpms:2; /* GPIO Pin Muxing Select */ - unsigned int u0pms:2; /* UART0 Pin Muxing Select */ - unsigned int u1pms:2; /* UART1 Pin Muxing Select */ - unsigned int ipms:2; /* IIC Pin Muxing Select */ - unsigned int cpms:2; /* CSI Pin Muxing Select */ - unsigned int tpms:2; /* TPC Pin Muxing Select */ - unsigned int irpms:2; /* IRQ Pin Muxing Select */ - unsigned int pcmd:1; /* PCMCIA Mode Disable */ - unsigned int u0dte:1; /* UART0 DMA Transmit Channel Enable */ - unsigned int u0rde:1; /* UART0 DMA Receive Channel Enable */ - unsigned int u0dce:1; /* UART0 DMA CLear on Enable */ - unsigned int rsvd1:6; /* Reserved */ - } fields; -} cpc0_cr0_t; - -#define CPC0_CR0_MASK 0xfe00003f /* AND to clear all non-reserved fields */ - -/* CPC0_CR1 - Chip Control Register 1 */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd0:28; /* Reserved */ - unsigned int tbsed:1; /* TB. Src. in Edge Detect Mode */ - unsigned int edmd:1; /* TB. Src. Edge Detect Mode Disable */ - unsigned int rsvd1:2; /* Reserved */ - } fields; -} cpc0_cr1_t; - -#define CPC0_CR1_MASK 0xfffffff3 /* AND to clear all non-reserved fields */ - -/* DCP0_CFG - DCP Configuration Register */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd0:18; - unsigned int sldy:10; /* Sleep Delay */ - unsigned int slen:1; /* Sleep Enable */ - unsigned int cdb:1; /* Clear Decompression Buffer */ - unsigned int rsvd1:1; - unsigned int ikb:1; /* Enable Decompression */ - } fields; -} dcp0_cfg_t; - -#define DCP0_CFG_MASK 0xffffc002 /* AND to clear all non-reserved fields */ - -/* DMA0_SLP - DMA Sleep Mode Register */ - -typedef union { - u32 reg; - struct { - unsigned idu:5; /* Idle Timer Upper */ - unsigned rsvd0:5; - unsigned sme:1; /* Sleep Mode Enable */ - unsigned rsvd1:21; - } fields; -} dma0_slp_t; - -#define DMA0_SLP_MASK 0x07dfffff /* AND to clear all non-reserved fields */ - -/* EBC0_BnAP - EBC Bank Access Parameters */ - -typedef union { - u32 reg; - struct { - unsigned bme:1; /* Burst Mode Enable */ - unsigned twt:8; /* Transfer Wait (non-burst) */ - unsigned rsvd0:3; - unsigned csn:2; /* Chip Select On Timing */ - unsigned oen:2; /* Output Enable On Timing */ - unsigned wbn:2; /* Write Byte Enable On Timing */ - unsigned wbf:2; /* Write Byte Enable Off Timing */ - unsigned th:3; /* Transfer Hold */ - unsigned re:1; /* Ready Enable */ - unsigned sor:1; /* Sample On Ready */ - unsigned bem:1; /* Byte Enable Mode */ - unsigned pen:1; /* Parity Enable */ - unsigned rsvd1:5; - } fields; -} ebc0_bnap_t; - -#define EBC0_BnAP_MASK 0x0070001f /* AND to clear all non-reserved fields */ - -/* EBC0_BnCR - EBC Bank Configuration Registers */ - -typedef union { - u32 reg; - struct { - unsigned bas:12; /* Base Address */ - unsigned bs:3; /* Bank Size */ - unsigned bu:2; /* Bank Usage */ - unsigned bw:2; /* Bank Width */ - unsigned rsvd:13; - } fields; -} ebc0_bncr_t; - -#define EBC0_BnCR_MASK 0x00001fff /* AND to clear all non-reserved fields */ - -#define EBC0_BnCR_BS_1MB 0 -#define EBC0_BnCR_BS_2MB 1 -#define EBC0_BnCR_BS_4MB 2 -#define EBC0_BnCR_BS_8MB 3 -#define EBC0_BnCR_BS_16MB 4 -#define EBC0_BnCR_BS_32MB 5 -#define EBC0_BnCR_BS_64MB 6 -#define EBC0_BnCR_BS_128MB 7 - -#define EBC0_BnCR_BU_R 1 -#define EBC0_BnCR_BU_W 2 -#define EBC0_BnCR_BU_RW 3 - -#define EBC0_BnCR_BW_8 0 -#define EBC0_BnCR_BW_16 1 -#define EBC0_BnCR_BW_32 2 - -/* EBC0_CFG -EBC Configuration Register */ - -typedef union { - u32 reg; - struct { - unsigned ebtc:1; /* External Bus Three State Control */ - unsigned ptd:1; /* Device-paced Time-out Disable */ - unsigned rtc:3; /* Ready Timeout Count */ - unsigned rsvd0:4; - unsigned cstc:1; /* Chip Select Three State Control */ - unsigned bpf:2; /* Burst Prefetch */ - unsigned rsvd1:2; - unsigned pme:1; /* Power Management Enable */ - unsigned pmt:5; /* Power Management Timer */ - unsigned rsvd2:12; - } fields; -} ebc0_cfg_t; - -#define EBC0_CFG_MASK 0x078c0fff /* AND to clear all non-reserved fields */ - -#define EBC0_CFG_RTC_16 0 -#define EBC0_CFG_RTC_32 1 -#define EBC0_CFG_RTC_64 2 -#define EBC0_CFG_RTC_128 3 -#define EBC0_CFG_RTC_256 4 -#define EBC0_CFG_RTC_512 5 -#define EBC0_CFG_RTC_1024 6 -#define EBC0_CFG_RTC_2048 7 - -/* SDRAM0_CFG - SDRAM Controller Configuration Register */ - -typedef union { - u32 reg; - struct { - unsigned int dce:1; /* SDRAM Controller Enable */ - unsigned int sre:1; /* Self-Refresh Enable */ - unsigned int pme:1; /* Power Management Enable */ - unsigned int rsvd0:1; - unsigned int regen:1; /* Registered Memory Enable */ - unsigned int drw:2; /* SDRAM Width */ - unsigned int brpf:2; /* Burst Read Prefetch Granularity */ - unsigned int rsvd1:1; - unsigned int emdulr:1; /* Enable Memory Data Unless Read */ - unsigned int rsvd2:21; - } fields; -} sdram0_cfg_t; - -#define SDRAM0_CFG_MASK 0x106fffff /* AND to clear all non-reserved fields */ - -#define SDRAM0_CFG_BRPF_16 1 -#define SDRAM0_CFG_BRPF_32 2 - -/* SDRAM0_PMIT - SDRAM Power Management Idle Timer */ - -typedef union { - u32 reg; - struct { - unsigned int cnt:5; /* Cycle Count Before Sleep Request */ - unsigned int rsvd:27; - } fields; -} sdram0_pmit_t; - -#define SDRAM0_PMIT_MASK 0x07ffffff /* AND to clear all non-reserved fields */ - -/* SDRAM0_RTR - Refresh timer register */ - -typedef union { - u32 reg; - struct { - unsigned rsvd0:2; - unsigned iv:11; - unsigned rsvd1:19; - } fields; -} sdram0_rtr_t; - -#define SDRAM0_RTR_MASK 0xc007ffff /* AND to clear non-reserved fields */ -#define SDRAM0_RTR_RTVFS_MASK SDRAM0_RTR_MASK - -#define SDRAM0_RTR_IV(n) (((n) & 0x3ff8) >> 2) - -/* SDRAM0_TR - SDRAM Timing Register */ - -typedef union { - u32 reg; - struct { - unsigned int rsvd0:7; - unsigned int casl:2; /* CAS Latency */ - unsigned int rsvd1:3; - unsigned int pta:2; /* Precharge-to-activate */ - unsigned int ctp:2; /* Read/Write to Precharge */ - unsigned int ldf:2; /* Command Leadoff */ - unsigned int rsvd2:9; - unsigned int rfta:3; /* Refresh-to-Activate */ - unsigned int rcd:2; /* RAS-CAS Delay */ - } fields; -} sdram0_tr_t; - -#define SDRAM0_TR_MASK 0xfe703fe0 /* AND to clear non-reserved fields */ -#define SDRAM0_TR_RTVFS_MASK SDRAM0_TR_MASK - -#define SDRAM0_TR_ENCODE(n) ((n) - 1) -#define SDRAM0_TR_ENCODE_RFTA(n) ((n) - 4) - -/* SLA0_SLPMD - SLA Sleep Mode Control Register */ - -typedef union { - u32 reg; - struct { - unsigned slcr:5; /* Sleep Counter */ - unsigned rsvd0:5; - unsigned slen:1; /* Sleep Mode Enable */ - unsigned rsvd1:21; - } fields; -} sla0_slpmd_t; - -#define SLA0_SLPMD_MASK 0x07dfffff /* AND to clear all non-reserved fields */ - -/* Several direct-write DCRs on the 405LP have an interlock requirement, - implemented by a "valid" bit in the low-order bit. This routine handles the - handshaking for these registers, by - - 1) Rewriting the current value with the valid bit clear; - 2) Rewriting the new value with the valid bit clear; - 3) Rewriting the new value with the valid bit set. - - The mask is a mask with 1s in every reserved bit position. - - NB: This routine always writes the register with the valid bit set, - regardless of the valid bit setting in the 'new' parameter. - - Unfortunately this must be a macro to work (due to mtdcr()). - - Note that for APM registers, it takes multiple RTC clock cycles for the DCR - writes to take effect. Any time delays after writes to APM are the - resonsibility of the caller. -*/ - -#define mtdcr_interlock(dcrn, new, mask) \ -do { \ - u32 __old, __new; \ - \ - __old = mfdcr(dcrn); \ - mtdcr(dcrn, __old & 0xfffffffe); \ - __new = ((__old & (mask)) | ((new) & ~(mask))) & 0xfffffffe; \ - mtdcr(dcrn, __new); \ - mtdcr(dcrn, __new | 1); \ -} while (0) - -/**************************************************************************** - * Power Managament Routines - ****************************************************************************/ - -int ibm405lp_set_pixclk(unsigned pixclk_min, unsigned pixclk_max); - -void ibm405lp_reset_sdram(u32 new_rtr, u32 new_tr); - -extern int (*set_pixclk_hook) (unsigned pixclk_min, unsigned pixclk_max); -extern unsigned last_pixclk_min; -extern unsigned last_pixclk_max; - -#endif /* __ASSEMBLY__ */ - -#include - -#endif /* __ASM_IBM405LP_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/ibmnp405l.c b/arch/ppc/platforms/4xx/ibmnp405l.c --- a/arch/ppc/platforms/4xx/ibmnp405l.c Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,31 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmnp405l.c - * - * Author: Armin Kuster - * - * 2000-2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#include -#include -#include -#include -#include -#include -#include - -struct ocp_def core_ocp[] = { - {UART, UART0_IO_BASE, UART0_INT, IBM_CPM_UART0}, - {UART, UART1_IO_BASE, UART1_INT, IBM_CPM_UART1}, - {IIC, IIC0_BASE, IIC0_IRQ, IBM_CPM_IIC0}, - {GPIO, GPIO0_BASE, OCP_IRQ_NA, IBM_CPM_GPIO0}, - {OPB, OPB0_BASE, OCP_IRQ_NA, IBM_CPM_OPB}, - {EMAC, EMAC0_BASE, BL_MAC_ETH0, IBM_CPM_EMAC0}, - {EMAC, EMAC1_BASE, BL_MAC_ETH1, IBM_CPM_EMAC1}, - {ZMII, ZMII0_BASE, OCP_IRQ_NA, OCP_CPM_NA}, - {OCP_NULL_TYPE, 0x0, OCP_IRQ_NA, OCP_CPM_NA}, - -}; diff -Nru a/arch/ppc/platforms/4xx/ibmnp405l.h b/arch/ppc/platforms/4xx/ibmnp405l.h --- a/arch/ppc/platforms/4xx/ibmnp405l.h Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,133 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmnp405l.h - * - * Author: Armin Kuster - * - * 2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifdef __KERNEL__ -#ifndef __ASM_IBMNP405L_H__ -#define __ASM_IBMNP405L_H__ - -#include - -/* serial port defines */ -#define RS_TABLE_SIZE 2 - -#define UART0_INT 0 -#define UART1_INT 1 - -#define UART0_IO_BASE 0xEF600300 -#define UART1_IO_BASE 0xEF600400 -#define IIC0_BASE 0xEF600500 -#define OPB0_BASE 0xEF600600 -#define GPIO0_BASE 0xEF600700 -#define EMAC0_BASE 0xEF600800 -#define EMAC1_BASE 0xEF600900 -#define ZMII0_BASE 0xEF600C10 -#define BL_MAC_WOL 41 /* WOL */ -#define BL_MAL_SERR 45 /* MAL SERR */ -#define BL_MAL_TXDE 46 /* MAL TXDE */ -#define BL_MAL_RXDE 47 /* MAL RXDE */ -#define BL_MAL_TXEOB 17 /* MAL TX EOB */ -#define BL_MAL_RXEOB 18 /* MAL RX EOB */ -#define BL_MAC_ETH0 37 /* MAC */ -#define BL_MAC_ETH1 38 /* MAC */ - -#define EMAC_NUMS 2 - -#define IIC0_IRQ 2 - -#undef NR_UICS -#define NR_UICS 2 -#define UIC_CASCADE_MASK 0x0003 /* bits 30 & 31 */ - -#define BD_EMAC_ADDR(e,i) bi_enetaddr[e][i] - -#define STD_UART_OP(num) \ - { 0, BASE_BAUD, 0, UART##num##_INT, \ - (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ - iomem_base:(u8 *) UART##num##_IO_BASE, \ - io_type: SERIAL_IO_MEM}, - -#if defined(CONFIG_UART0_TTYS0) -#define SERIAL_DEBUG_IO_BASE UART0_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(0) \ - STD_UART_OP(1) -#endif - -#if defined(CONFIG_UART0_TTYS1) -#define SERIAL_DEBUG_IO_BASE UART1_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(1) \ - STD_UART_OP(0) -#endif - -/* DCR defines */ -/* ------------------------------------------------------------------------- */ - -#define DCRN_CHCR_BASE 0x0F1 -#define DCRN_CHPSR_BASE 0x0B4 -#define DCRN_CPMSR_BASE 0x0BA -#define DCRN_CPMFR_BASE 0x0B9 -#define DCRN_CPMER_BASE 0x0B8 - -#define IBM_CPM_EMAC0 0x00800000 /* on-chip ethernet MM unit */ -#define IBM_CPM_EMAC1 0x00100000 /* EMAC 1 MII */ -#define IBM_CPM_UIC1 0x00020000 /* Universal Interrupt Controller */ -#define IBM_CPM_UIC0 0x00010000 /* Universal Interrupt Controller */ -#define IBM_CPM_CPU 0x00008000 /* processor core */ -#define IBM_CPM_EBC 0x00004000 /* ROM/SRAM peripheral controller */ -#define IBM_CPM_SDRAM0 0x00002000 /* SDRAM memory controller */ -#define IBM_CPM_GPIO0 0x00001000 /* General Purpose IO (??) */ -#define IBM_CPM_HDLC 0x00000800 /* HDCL */ -#define IBM_CPM_TMRCLK 0x00000400 /* CPU timers */ -#define IBM_CPM_PLB 0x00000100 /* PLB bus arbiter */ -#define IBM_CPM_OPB 0x00000080 /* PLB to OPB bridge */ -#define IBM_CPM_DMA 0x00000040 /* DMA controller */ -#define IBM_CPM_IIC0 0x00000010 /* IIC interface */ -#define IBM_CPM_UART0 0x00000002 /* serial port 0 */ -#define IBM_CPM_UART1 0x00000001 /* serial port 1 */ -#define DFLT_IBM4xx_PM ~(IBM_CPM_UIC0 | IBM_CPM_UIC1 | IBM_CPM_CPU \ - | IBM_CPM_EBC | IBM_CPM_SDRAM0 | IBM_CPM_PLB \ - | IBM_CPM_OPB | IBM_CPM_TMRCLK | IBM_CPM_DMA \ - | IBM_CPM_EMAC0 | IBM_CPM_EMAC1) - -#define DCRN_DMA0_BASE 0x100 -#define DCRN_DMA1_BASE 0x108 -#define DCRN_DMA2_BASE 0x110 -#define DCRN_DMA3_BASE 0x118 -#define DCRNCAP_DMA_SG 1 /* have DMA scatter/gather capability */ -#define DCRN_DMASR_BASE 0x120 -#define DCRN_EBC_BASE 0x012 -#define DCRN_DCP0_BASE 0x014 -#define DCRN_MAL_BASE 0x180 -#define DCRN_MAL1_BASE 0x200 -#define DCRN_OCM0_BASE 0x018 -#define DCRN_PLB0_BASE 0x084 -#define DCRN_PLLMR_BASE 0x0F0 -#define DCRN_POB0_BASE 0x0A0 -#define DCRN_SDRAM0_BASE 0x010 -#define DCRN_UIC0_BASE 0x0C0 -#define DCRN_UIC1_BASE 0x0D0 -#define DCRN_CPC0_EPRCSR 0x0F3 - -#define UIC0_UIC1NC 30 /* UIC1 non-critical interrupt */ -#define UIC0_UIC1CR 31 /* UIC1 critical interrupt */ - -#define CHR1_CETE 0x00000004 /* CPU external timer enable */ -#define UIC0 DCRN_UIC0_BASE -#define UIC1 DCRN_UIC1_BASE - -#define SDRAM_CFG 0x20 -#define SDRAM0_ECCCFG 0x94 -#define SDRAM_NO_ECC 0x10000000 -#include - -#endif /* __ASM_IBMNP405L_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/ibmnp4gs.c b/arch/ppc/platforms/4xx/ibmnp4gs.c --- a/arch/ppc/platforms/4xx/ibmnp4gs.c Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,21 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmnp4gs.c - * - * Author: Armin Kuster - * - * 2000-2002 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#include -#include "ibmnp4gs.h" -#include - -struct ocp_def core_ocp[] = { - {UART, UART0_IO_BASE, UART0_INT, IBM_CPM_UART0}, - {PCI, PCIL0_BASE, OCP_IRQ_NA, IBM_CPM_PCI}, - {OCP_NULL_TYPE, 0x0, OCP_IRQ_NA, OCP_CPM_NA}, - -}; diff -Nru a/arch/ppc/platforms/4xx/ibmnp4gs.h b/arch/ppc/platforms/4xx/ibmnp4gs.h --- a/arch/ppc/platforms/4xx/ibmnp4gs.h Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,149 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmnp4gs.h - * - * Author: Armin Kuster - * - * 2002 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifdef __KERNEL__ -#ifndef __ASM_IBMNP4GS_H__ -#define __ASM_IBMNP4GS_H__ - -#include -#include - -/* ibm405.h at bottom of this file */ - -/* PCI - * PCI Bridge config reg definitions - * see 17-19 of manual - */ - -#define PPC405_PCI_CONFIG_ADDR 0xeec00000 -#define PPC405_PCI_CONFIG_DATA 0xeec00004 - -#define PPC405_PCI_PHY_MEM_BASE 0x80000000 /* hose_a->pci_mem_offset */ - /* setbat */ -#define PPC405_PCI_MEM_BASE PPC405_PCI_PHY_MEM_BASE /* setbat */ -#define PPC405_PCI_PHY_IO_BASE 0xe8000000 /* setbat */ -#define PPC405_PCI_IO_BASE PPC405_PCI_PHY_IO_BASE /* setbat */ - -#define PPC405_PCI_LOWER_MEM 0x80000000 /* hose_a->mem_space.start */ -#define PPC405_PCI_UPPER_MEM 0xBfffffff /* hose_a->mem_space.end */ -#define PPC405_PCI_LOWER_IO 0x00000000 /* hose_a->io_space.start */ -#define PPC405_PCI_UPPER_IO 0x0000ffff /* hose_a->io_space.end */ - -#define PPC405_ISA_IO_BASE PPC405_PCI_IO_BASE - -#define PPC4xx_PCI_IO_PADDR ((uint)PPC405_PCI_PHY_IO_BASE) -#define PPC4xx_PCI_IO_VADDR PPC4xx_PCI_IO_PADDR -#define PPC4xx_PCI_IO_SIZE ((uint)64*1024) -#define PPC4xx_PCI_CFG_PADDR ((uint)PPC405_PCI_CONFIG_ADDR) -#define PPC4xx_PCI_CFG_VADDR PPC4xx_PCI_CFG_PADDR -#define PPC4xx_PCI_CFG_SIZE ((uint)4*1024) -#define PPC4xx_PCI_LCFG_PADDR ((uint)0xef400000) -#define PPC4xx_PCI_LCFG_VADDR PPC4xx_PCI_LCFG_PADDR -#define PPC4xx_PCI_LCFG_SIZE ((uint)4*1024) -#define PPC4xx_ONB_IO_PADDR ((uint)0xef600000) -#define PPC4xx_ONB_IO_VADDR PPC4xx_ONB_IO_PADDR -#define PPC4xx_ONB_IO_SIZE ((uint)4*1024) - -#define PCI_CONFIG_ADDR_MASK 0x7F000000 -#define PCI_CONFIG_CYCLE_ENABLE 0x80000000 -#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ -#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 -#define PCI_CONFIG_ADDR_MASK 0x7F000000 -#define PCI_CONFIG_CYCLE_ENABLE 0x80000000 -#define PCI_BASE_ADDRESS_MEM_CARD1 0x80000000 -#define PCI_BASE_ADDRESS_MEM_CARD2 0x90000000 -#define PPC405_UART0_INT 1 -#define PPC_405RAINIER2_IO_PAGE ((void*)0xe8001000) -#define PPC_405RAINIER1_IO_PAGE ((void*)0xe8002000) -#define PPC405_UART0_IO_BASE 0x300 /* mostly use (rainier_io_page+0x300) */ -#define RAINIER_IO_PAGE_INTERPOSER_PADDR 0xe8000000 -#define RAINIER_IO_PAGE_INTERPOSER_VADDR RAINIER_IO_PAGE_INTERPOSER_PADDR -#define RAINIER_IO_PAGE_PCI_PADDR 0xeec00000 -#define RAINIER_IO_PAGE_PCI_VADDR RAINIER_IO_PAGE_PCI_PADDR - -/* serial port defines */ -#define RS_TABLE_SIZE 1 - -#define UART0_INT 1 - -#define PCIL0_BASE 0xEF400000 -#define UART0_IO_BASE PPC_405RAINIER1_IO_PAGE + PPC405_UART0_IO_BASE - -#define UART_NUMS 1 -#define BD_EMAC_ADDR(e,i) bi_enetaddr[i] - -#define STD_UART_OP(num) \ - { 0, BASE_BAUD, 0, UART##num##_INT, \ - (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ - iomem_base: (u8 *)UART##num##_IO_BASE, \ - io_type: SERIAL_IO_MEM}, - -#if defined(CONFIG_UART0_TTYS0) -#define SERIAL_PORT_DFNS \ - STD_UART_OP(0) -#endif - -/* DCR defines */ -#define DCRN_CHCR_BASE 0x0B1 -#define DCRN_CHPSR_BASE 0x0B4 -#define DCRN_CPMSR_BASE 0x0B8 -#define DCRN_CPMFR_BASE 0x0BA - -#define PSR_PLL_FWD_MASK 0xC0000000 -#define PSR_PLL_FDBACK_MASK 0x30000000 -#define PSR_PLL_TUNING_MASK 0x0E000000 -#define PSR_PLB_CPU_MASK 0x01800000 -#define PSR_OPB_PLB_MASK 0x00600000 -#define PSR_PCI_PLB_MASK 0x00180000 -#define PSR_EB_PLB_MASK 0x00060000 -#define PSR_ROM_WIDTH_MASK 0x00018000 -#define PSR_ROM_LOC 0x00004000 -#define PSR_PCI_ASYNC_EN 0x00001000 -#define PSR_PCI_ARBIT_EN 0x00000400 - -#define IBM_CPM_IIC0 0x80000000 /* IIC interface */ -#define IBM_CPM_PCI 0x40000000 /* PCI bridge */ -#define IBM_CPM_CPU 0x20000000 /* processor core */ -#define IBM_CPM_DMA 0x10000000 /* DMA controller */ -#define IBM_CPM_BRG 0x08000000 /* PLB to OPB bridge */ -#define IBM_CPM_DCP 0x04000000 /* CodePack */ -#define IBM_CPM_EBC 0x02000000 /* ROM/SRAM peripheral controller */ -#define IBM_CPM_SDRAM0 0x01000000 /* SDRAM memory controller */ -#define IBM_CPM_PLB 0x00800000 /* PLB bus arbiter */ -#define IBM_CPM_GPIO0 0x00400000 /* General Purpose IO (??) */ -#define IBM_CPM_UART0 0x00200000 /* serial port 0 */ -#define IBM_CPM_UART1 0x00100000 /* serial port 1 */ -#define IBM_CPM_UIC 0x00080000 /* Universal Interrupt Controller */ -#define IBM_CPM_TMRCLK 0x00040000 /* CPU timers */ - -#define DFLT_IBM4xx_PM 0 - -#define DCRN_DMA0_BASE 0x100 -#define DCRN_DMA1_BASE 0x108 -#define DCRN_DMA2_BASE 0x110 -#define DCRN_DMA3_BASE 0x118 -#define DCRNCAP_DMA_SG 1 /* have DMA scatter/gather capability */ -#define DCRN_DMASR_BASE 0x120 -#define DCRN_EBC_BASE 0x012 -#define DCRN_DCP0_BASE 0x014 -#define DCRN_MAL_BASE 0x180 -#define DCRN_OCM0_BASE 0x018 -#define DCRN_PLB0_BASE 0x084 -#define DCRN_PLLMR_BASE 0x0B0 -#define DCRN_POB0_BASE 0x0A0 -#define DCRN_SDRAM0_BASE 0x010 -#define DCRN_UIC0_BASE 0x0C0 -#define UIC0 DCRN_UIC0_BASE - -#include - -#endif /* __ASM_IBMNP4GS_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/ibmstb3.c b/arch/ppc/platforms/4xx/ibmstb3.c --- a/arch/ppc/platforms/4xx/ibmstb3.c Tue Feb 17 20:00:05 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,24 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmstb3.c - * - * Author: Armin Kuster - * - * 2000-2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#include -#include "ibmstb3.h" -#include - -struct ocp_def core_ocp[] = { - {UART, UART0_IO_BASE, UART0_INT, IBM_CPM_UART0}, - {IIC, IIC0_BASE, IIC0_IRQ, IBM_CPM_IIC0}, - {IIC, IIC1_BASE, IIC1_IRQ, IBM_CPM_IIC1}, - {GPIO, GPIO0_BASE, OCP_IRQ_NA, IBM_CPM_GPIO0}, - {OPB, OPB0_BASE, OCP_IRQ_NA, OCP_CPM_NA}, - {OCP_NULL_TYPE, 0x0, OCP_IRQ_NA, OCP_CPM_NA}, - -}; diff -Nru a/arch/ppc/platforms/4xx/ibmstb3.h b/arch/ppc/platforms/4xx/ibmstb3.h --- a/arch/ppc/platforms/4xx/ibmstb3.h Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,231 +0,0 @@ -/* - * arch/ppc/platforms/4xx/ibmstb3.h - * - * Authors: Armin Kuster , Tom Rini - * - * 2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifdef __KERNEL__ -#ifndef __ASM_IBMSTBX_H__ -#define __ASM_IBMSTBX_H__ - -#include -#include - -/* ibm405.h at bottom of this file */ - -/* - * Memory map for the IBM "Redwood-4" STB03xxx evaluation board. - * - * The STB03xxx internal i/o addresses don't work for us 1:1, - * so we need to map them at a well know virtual address. - * - * 4000 000x uart1 -> 0xe000 000x - * 4001 00xx ppu - * 4002 00xx smart card - * 4003 000x iic - * 4004 000x uart0 - * 4005 0xxx timer - * 4006 00xx gpio - * 4007 00xx smart card - * 400b 000x iic - * 400c 000x scp - * 400d 000x modem - */ - -#define STB03xxx_IO_BASE ((uint)0xe0000000) -#define PPC4xx_ONB_IO_PADDR ((uint)0x40000000) -#define PPC4xx_ONB_IO_VADDR STB03xxx_IO_BASE -#define PPC4xx_ONB_IO_SIZE ((uint)14*64*1024) - -/* Since we're into address mapping hacks, at least try to hide - * it under a macro..... - */ -#define STB03xxx_MAP_IO_ADDR(a) (((uint)(a) & 0x000fffff) + PPC4xx_ONB_IO_VADDR) - -#define RS_TABLE_SIZE 1 -#define UART0_INT 20 -#ifdef __BOOTER__ -#define UART0_IO_BASE 0x40040000 -#else -#define UART0_IO_BASE 0xe0040000 -#endif - - /* UART 0 is duped here so when the SICC is the default console - * then ttys1 is configured properly - armin - */ - -#define UART1_INT 20 -#ifdef __BOOTER__ -#define UART1_IO_BASE 0x40040000 -#else -#define UART1_IO_BASE 0xe0040000 -#endif - -/* need to make this work in scheme - armin */ - -#define SICC0_INTRX 21 -#define SICC0_INTTX 22 -#define SICC0_IO_BASE ((uint* )0x40000000) - -#define IDE0_BASE 0xf2100000 -#define REDWOOD_IDE_CTRL 0xf4100000 - -#define IIC0_BASE 0x40030000 -#define IIC1_BASE 0x400b0000 -#define OPB0_BASE 0x40010000 -#define GPIO0_BASE 0x40060000 -#define IIC0_IRQ 9 -#define IIC1_IRQ 10 -#define IIC_OWN 0x55 -#define IIC_CLOCK 50 -#define IDE0_IRQ 25 - -#define BD_EMAC_ADDR(e,i) bi_enetaddr[i] - -#define STD_UART_OP(num) \ - { 0, BASE_BAUD, 0, UART##num##_INT, \ - (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ - iomem_base: (u8 *)UART##num##_IO_BASE, \ - io_type: SERIAL_IO_MEM}, - -#if defined(CONFIG_UART0_TTYS0) -#define SERIAL_DEBUG_IO_BASE UART0_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(0) -#endif - -#if defined(CONFIG_UART0_TTYS1) -#define SERIAL_DEBUG_IO_BASE UART1_IO_BASE -#define SERIAL_PORT_DFNS \ - STD_UART_OP(1) -#endif - -/* ------------------------------------------------------------------------- */ - -#define DCRN_DCRX_BASE 0x020 -#define DCRN_CIC_BASE 0x030 -#define DCRN_UIC0_BASE 0x040 -#define DCRN_PLB0_BASE 0x054 -#define DCRN_PLB1_BASE 0x064 -#define DCRN_EBIMC_BASE 0x070 -#define DCRN_POB0_BASE 0x0B0 - -#define DCRN_BE_BASE 0x090 -#define DCRN_DMA0_BASE 0x0C0 -#define DCRN_DMA1_BASE 0x0C8 -#define DCRN_DMA2_BASE 0x0D0 -#define DCRN_DMA3_BASE 0x0D8 -#define DCRNCAP_DMA_CC 1 /* have DMA chained count capability */ -#define DCRN_DMASR_BASE 0x0E0 - -#define DCRN_CPMFR_BASE 0x102 -#define DCRN_SCCR_BASE 0x120 -#define UIC0 DCRN_UIC0_BASE - -#define IBM_CPM_IIC0 0x80000000 /* IIC 0 interface */ -#define IBM_CPM_I1284 0x40000000 /* IEEE-1284 */ -#define IBM_CPM_IIC1 0x20000000 /* IIC 1 interface */ -#define IBM_CPM_CPU 0x10000000 /* PPC405B3 clock control */ -#define IBM_CPM_AUD 0x08000000 /* Audio Decoder */ -#define IBM_CPM_EBIU 0x04000000 /* External Bus Interface Unit */ -#define IBM_CPM_SDRAM1 0x02000000 /* SDRAM 1 memory controller */ -#define IBM_CPM_DMA 0x01000000 /* DMA controller */ -#define IBM_CPM_UART1 0x00100000 /* Serial 1 / Infrared */ -#define IBM_CPM_UART0 0x00080000 /* Serial 0 / 16550 */ -#define IBM_CPM_DCRX 0x00040000 /* DCR Extension */ -#define IBM_CPM_SC0 0x00020000 /* Smart Card 0 */ -#define IBM_CPM_SC1 0x00008000 /* Smart Card 1 */ -#define IBM_CPM_SDRAM0 0x00004000 /* SDRAM 0 memory controller */ -#define IBM_CPM_XPT54 0x00002000 /* Transport - 54 Mhz */ -#define IBM_CPM_CBS 0x00001000 /* Cross Bar Switch */ -#define IBM_CPM_GPT 0x00000800 /* GPTPWM */ -#define IBM_CPM_GPIO0 0x00000400 /* General Purpose IO 0 */ -#define IBM_CPM_DENC 0x00000200 /* Digital video Encoder */ -#define IBM_CPM_TMRCLK 0x00000100 /* CPU timers */ -#define IBM_CPM_XPT27 0x00000080 /* Transport - 27 Mhz */ -#define IBM_CPM_UIC 0x00000040 /* Universal Interrupt Controller */ -#define IBM_CPM_MSI 0x00000010 /* Modem Serial Interface (SSP) */ -#define IBM_CPM_UART2 0x00000008 /* Serial Control Port */ -#define IBM_CPM_DSCR 0x00000004 /* Descrambler */ -#define IBM_CPM_VID2 0x00000002 /* Video Decoder clock domain 2 */ - -#define DFLT_IBM4xx_PM ~(IBM_CPM_CPU | IBM_CPM_EBIU | IBM_CPM_SDRAM1 \ - | IBM_CPM_DMA | IBM_CPM_CBS | IBM_CPM_SDRAM0 \ - | IBM_CPM_XPT54 | IBM_CPM_TMRCLK | IBM_CPM_XPT27 \ - | IBM_CPM_UIC) - -#ifdef DCRN_CIC_BASE -#define DCRN_CICCR (DCRN_CIC_BASE + 0x0) /* CIC Control Register */ -#define DCRN_DMAS1 (DCRN_CIC_BASE + 0x1) /* DMA Select1 Register */ -#define DCRN_DMAS2 (DCRN_CIC_BASE + 0x2) /* DMA Select2 Register */ -#define DCRN_CICVCR (DCRN_CIC_BASE + 0x3) /* CIC Video COntro Register */ -#define DCRN_CICSEL3 (DCRN_CIC_BASE + 0x5) /* CIC Select 3 Register */ -#define DCRN_SGPO (DCRN_CIC_BASE + 0x6) /* CIC GPIO Output Register */ -#define DCRN_SGPOD (DCRN_CIC_BASE + 0x7) /* CIC GPIO OD Register */ -#define DCRN_SGPTC (DCRN_CIC_BASE + 0x8) /* CIC GPIO Tristate Ctrl Reg */ -#define DCRN_SGPI (DCRN_CIC_BASE + 0x9) /* CIC GPIO Input Reg */ -#endif - -#ifdef DCRN_DCRX_BASE -#define DCRN_DCRXICR (DCRN_DCRX_BASE + 0x0) /* Internal Control Register */ -#define DCRN_DCRXISR (DCRN_DCRX_BASE + 0x1) /* Internal Status Register */ -#define DCRN_DCRXECR (DCRN_DCRX_BASE + 0x2) /* External Control Register */ -#define DCRN_DCRXESR (DCRN_DCRX_BASE + 0x3) /* External Status Register */ -#define DCRN_DCRXTAR (DCRN_DCRX_BASE + 0x4) /* Target Address Register */ -#define DCRN_DCRXTDR (DCRN_DCRX_BASE + 0x5) /* Target Data Register */ -#define DCRN_DCRXIGR (DCRN_DCRX_BASE + 0x6) /* Interrupt Generation Register */ -#define DCRN_DCRXBCR (DCRN_DCRX_BASE + 0x7) /* Line Buffer Control Register */ -#endif - -#ifdef DCRN_EBC_BASE -#define DCRN_EBCCFGADR (DCRN_EBC_BASE + 0x0) /* Peripheral Controller Address */ -#define DCRN_EBCCFGDATA (DCRN_EBC_BASE + 0x1) /* Peripheral Controller Data */ -#endif - -#ifdef DCRN_EBIMC_BASE -#define DCRN_BRCRH0 (DCRN_EBIMC_BASE + 0x0) /* Bus Region Config High 0 */ -#define DCRN_BRCRH1 (DCRN_EBIMC_BASE + 0x1) /* Bus Region Config High 1 */ -#define DCRN_BRCRH2 (DCRN_EBIMC_BASE + 0x2) /* Bus Region Config High 2 */ -#define DCRN_BRCRH3 (DCRN_EBIMC_BASE + 0x3) /* Bus Region Config High 3 */ -#define DCRN_BRCRH4 (DCRN_EBIMC_BASE + 0x4) /* Bus Region Config High 4 */ -#define DCRN_BRCRH5 (DCRN_EBIMC_BASE + 0x5) /* Bus Region Config High 5 */ -#define DCRN_BRCRH6 (DCRN_EBIMC_BASE + 0x6) /* Bus Region Config High 6 */ -#define DCRN_BRCRH7 (DCRN_EBIMC_BASE + 0x7) /* Bus Region Config High 7 */ -#define DCRN_BRCR0 (DCRN_EBIMC_BASE + 0x10) /* BRC 0 */ -#define DCRN_BRCR1 (DCRN_EBIMC_BASE + 0x11) /* BRC 1 */ -#define DCRN_BRCR2 (DCRN_EBIMC_BASE + 0x12) /* BRC 2 */ -#define DCRN_BRCR3 (DCRN_EBIMC_BASE + 0x13) /* BRC 3 */ -#define DCRN_BRCR4 (DCRN_EBIMC_BASE + 0x14) /* BRC 4 */ -#define DCRN_BRCR5 (DCRN_EBIMC_BASE + 0x15) /* BRC 5 */ -#define DCRN_BRCR6 (DCRN_EBIMC_BASE + 0x16) /* BRC 6 */ -#define DCRN_BRCR7 (DCRN_EBIMC_BASE + 0x17) /* BRC 7 */ -#define DCRN_BEAR0 (DCRN_EBIMC_BASE + 0x20) /* Bus Error Address Register */ -#define DCRN_BESR0 (DCRN_EBIMC_BASE + 0x21) /* Bus Error Status Register */ -#define DCRN_BIUCR (DCRN_EBIMC_BASE + 0x2A) /* Bus Interfac Unit Ctrl Reg */ -#endif - -#ifdef DCRN_SCCR_BASE -#define DCRN_SCCR (DCRN_SCCR_BASE + 0x0) -#endif - -#ifdef DCRN_SDRAM0_BASE -#define DCRN_SDRAM0_CFGADDR (DCRN_SDRAM0_BASE + 0x0) /* Memory Controller Address */ -#define DCRN_SDRAM0_CFGDATA (DCRN_SDRAM0_BASE + 0x1) /* Memory Controller Data */ -#endif - -#ifdef DCRN_OCM0_BASE -#define DCRN_OCMISARC (DCRN_OCM0_BASE + 0x0) /* OCM Instr Side Addr Range Compare */ -#define DCRN_OCMISCR (DCRN_OCM0_BASE + 0x1) /* OCM Instr Side Control */ -#define DCRN_OCMDSARC (DCRN_OCM0_BASE + 0x2) /* OCM Data Side Addr Range Compare */ -#define DCRN_OCMDSCR (DCRN_OCM0_BASE + 0x3) /* OCM Data Side Control */ -#endif - -#include - -#endif /* __ASM_IBMSTBX_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/4xx/oak.c b/arch/ppc/platforms/4xx/oak.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/platforms/4xx/oak.c Tue Feb 17 20:00:07 2004 @@ -0,0 +1,281 @@ +/* + * + * Copyright (c) 1999-2000 Grant Erickson + * + * Module name: oak.c + * + * Description: + * Architecture- / platform-specific boot-time initialization code for + * the IBM PowerPC 403GCX "Oak" evaluation board. Adapted from original + * code by Gary Thomas, Cort Dougan , and Dan Malek + * . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "oak.h" + +/* Function Prototypes */ + +extern void abort(void); + +/* Global Variables */ + +unsigned char __res[sizeof(bd_t)]; + + +/* + * void __init oak_init() + * + * Description: + * This routine... + * + * Input(s): + * r3 - Optional pointer to a board information structure. + * r4 - Optional pointer to the physical starting address of the init RAM + * disk. + * r5 - Optional pointer to the physical ending address of the init RAM + * disk. + * r6 - Optional pointer to the physical starting address of any kernel + * command-line parameters. + * r7 - Optional pointer to the physical ending address of any kernel + * command-line parameters. + * + * Output(s): + * N/A + * + * Returns: + * N/A + * + */ +void __init +platform_init(unsigned long r3, unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7) +{ + parse_bootinfo(find_bootinfo()); + + /* + * If we were passed in a board information, copy it into the + * residual data area. + */ + if (r3) { + memcpy((void *)__res, (void *)(r3 + KERNELBASE), sizeof(bd_t)); + } + +#if defined(CONFIG_BLK_DEV_INITRD) + /* + * If the init RAM disk has been configured in, and there's a valid + * starting address for it, set it up. + */ + if (r4) { + initrd_start = r4 + KERNELBASE; + initrd_end = r5 + KERNELBASE; + } +#endif /* CONFIG_BLK_DEV_INITRD */ + + /* Copy the kernel command line arguments to a safe place. */ + + if (r6) { + *(char *)(r7 + KERNELBASE) = 0; + strcpy(cmd_line, (char *)(r6 + KERNELBASE)); + } + + /* Initialize machine-dependency vectors */ + + ppc_md.setup_arch = oak_setup_arch; + ppc_md.show_percpuinfo = oak_show_percpuinfo; + ppc_md.irq_canonicalize = NULL; + ppc_md.init_IRQ = oak_init_IRQ; + ppc_md.get_irq = oak_get_irq; + ppc_md.init = NULL; + + ppc_md.restart = oak_restart; + ppc_md.power_off = oak_power_off; + ppc_md.halt = oak_halt; + + ppc_md.time_init = oak_time_init; + ppc_md.set_rtc_time = oak_set_rtc_time; + ppc_md.get_rtc_time = oak_get_rtc_time; + ppc_md.calibrate_decr = oak_calibrate_decr; +} + +/* + * Document me. + */ +void __init +oak_setup_arch(void) +{ + /* XXX - Implement me */ +} + +/* + * int oak_show_percpuinfo() + * + * Description: + * This routine pretty-prints the platform's internal CPU and bus clock + * frequencies into the buffer for usage in /proc/cpuinfo. + * + * Input(s): + * *buffer - Buffer into which CPU and bus clock frequencies are to be + * printed. + * + * Output(s): + * *buffer - Buffer with the CPU and bus clock frequencies. + * + * Returns: + * The number of bytes copied into 'buffer' if OK, otherwise zero or less + * on error. + */ +int +oak_show_percpuinfo(struct seq_file *m, int i) +{ + bd_t *bp = (bd_t *)__res; + + seq_printf(m, "clock\t\t: %dMHz\n" + "bus clock\t\t: %dMHz\n", + bp->bi_intfreq / 1000000, + bp->bi_busfreq / 1000000); + + return 0; +} + +/* + * Document me. + */ +void __init +oak_init_IRQ(void) +{ + int i; + + ppc4xx_pic_init(); + + for (i = 0; i < NR_IRQS; i++) { + irq_desc[i].handler = ppc4xx_pic; + } + + return; +} + +/* + * Document me. + */ +int +oak_get_irq(struct pt_regs *regs) +{ + return (ppc4xx_pic_get_irq(regs)); +} + +/* + * Document me. + */ +void +oak_restart(char *cmd) +{ + abort(); +} + +/* + * Document me. + */ +void +oak_power_off(void) +{ + oak_restart(NULL); +} + +/* + * Document me. + */ +void +oak_halt(void) +{ + oak_restart(NULL); +} + +/* + * Document me. + */ +long __init +oak_time_init(void) +{ + /* XXX - Implement me */ + return 0; +} + +/* + * Document me. + */ +int __init +oak_set_rtc_time(unsigned long time) +{ + /* XXX - Implement me */ + + return (0); +} + +/* + * Document me. + */ +unsigned long __init +oak_get_rtc_time(void) +{ + /* XXX - Implement me */ + + return (0); +} + +/* + * void __init oak_calibrate_decr() + * + * Description: + * This routine retrieves the internal processor frequency from the board + * information structure, sets up the kernel timer decrementer based on + * that value, enables the 403 programmable interval timer (PIT) and sets + * it up for auto-reload. + * + * Input(s): + * N/A + * + * Output(s): + * N/A + * + * Returns: + * N/A + * + */ +void __init +oak_calibrate_decr(void) +{ + unsigned int freq; + bd_t *bip = (bd_t *)__res; + + freq = bip->bi_intfreq; + + decrementer_count = freq / HZ; + count_period_num = 1; + count_period_den = freq; + + /* Enable the PIT and set auto-reload of its value */ + + mtspr(SPRN_TCR, TCR_PIE | TCR_ARE); + + /* Clear any pending timer interrupts */ + + mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_PIS | TSR_FIS); +} diff -Nru a/arch/ppc/platforms/4xx/oak.h b/arch/ppc/platforms/4xx/oak.h --- a/arch/ppc/platforms/4xx/oak.h Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/4xx/oak.h Tue Feb 17 20:00:07 2004 @@ -60,6 +60,31 @@ unsigned int bi_busfreq; /* Bus speed, in Hz */ } bd_t; +#ifdef __cplusplus +extern "C" { +#endif + +extern void oak_init(unsigned long r3, + unsigned long ird_start, + unsigned long ird_end, + unsigned long cline_start, + unsigned long cline_end); +extern void oak_setup_arch(void); +extern int oak_setup_residual(char *buffer); +extern void oak_init_IRQ(void); +extern int oak_get_irq(struct pt_regs *regs); +extern void oak_restart(char *cmd); +extern void oak_power_off(void); +extern void oak_halt(void); +extern void oak_time_init(void); +extern int oak_set_rtc_time(unsigned long now); +extern unsigned long oak_get_rtc_time(void); +extern void oak_calibrate_decr(void); + +#ifdef __cplusplus +} +#endif + /* Some 4xx parts use a different timebase frequency from the internal clock. */ #define bi_tbfreq bi_intfreq diff -Nru a/arch/ppc/platforms/4xx/oak_setup.c b/arch/ppc/platforms/4xx/oak_setup.c --- a/arch/ppc/platforms/4xx/oak_setup.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,281 +0,0 @@ -/* - * - * Copyright (c) 1999-2000 Grant Erickson - * - * Module name: oak_setup.c - * - * Description: - * Architecture- / platform-specific boot-time initialization code for - * the IBM PowerPC 403GCX "Oak" evaluation board. Adapted from original - * code by Gary Thomas, Cort Dougan , and Dan Malek - * . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "oak_setup.h" - -/* Function Prototypes */ - -extern void abort(void); - -/* Global Variables */ - -unsigned char __res[sizeof(bd_t)]; - - -/* - * void __init oak_init() - * - * Description: - * This routine... - * - * Input(s): - * r3 - Optional pointer to a board information structure. - * r4 - Optional pointer to the physical starting address of the init RAM - * disk. - * r5 - Optional pointer to the physical ending address of the init RAM - * disk. - * r6 - Optional pointer to the physical starting address of any kernel - * command-line parameters. - * r7 - Optional pointer to the physical ending address of any kernel - * command-line parameters. - * - * Output(s): - * N/A - * - * Returns: - * N/A - * - */ -void __init -platform_init(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7) -{ - parse_bootinfo(find_bootinfo()); - - /* - * If we were passed in a board information, copy it into the - * residual data area. - */ - if (r3) { - memcpy((void *)__res, (void *)(r3 + KERNELBASE), sizeof(bd_t)); - } - -#if defined(CONFIG_BLK_DEV_INITRD) - /* - * If the init RAM disk has been configured in, and there's a valid - * starting address for it, set it up. - */ - if (r4) { - initrd_start = r4 + KERNELBASE; - initrd_end = r5 + KERNELBASE; - } -#endif /* CONFIG_BLK_DEV_INITRD */ - - /* Copy the kernel command line arguments to a safe place. */ - - if (r6) { - *(char *)(r7 + KERNELBASE) = 0; - strcpy(cmd_line, (char *)(r6 + KERNELBASE)); - } - - /* Initialize machine-dependency vectors */ - - ppc_md.setup_arch = oak_setup_arch; - ppc_md.show_percpuinfo = oak_show_percpuinfo; - ppc_md.irq_canonicalize = NULL; - ppc_md.init_IRQ = oak_init_IRQ; - ppc_md.get_irq = oak_get_irq; - ppc_md.init = NULL; - - ppc_md.restart = oak_restart; - ppc_md.power_off = oak_power_off; - ppc_md.halt = oak_halt; - - ppc_md.time_init = oak_time_init; - ppc_md.set_rtc_time = oak_set_rtc_time; - ppc_md.get_rtc_time = oak_get_rtc_time; - ppc_md.calibrate_decr = oak_calibrate_decr; -} - -/* - * Document me. - */ -void __init -oak_setup_arch(void) -{ - /* XXX - Implement me */ -} - -/* - * int oak_show_percpuinfo() - * - * Description: - * This routine pretty-prints the platform's internal CPU and bus clock - * frequencies into the buffer for usage in /proc/cpuinfo. - * - * Input(s): - * *buffer - Buffer into which CPU and bus clock frequencies are to be - * printed. - * - * Output(s): - * *buffer - Buffer with the CPU and bus clock frequencies. - * - * Returns: - * The number of bytes copied into 'buffer' if OK, otherwise zero or less - * on error. - */ -int -oak_show_percpuinfo(struct seq_file *m, int i) -{ - bd_t *bp = (bd_t *)__res; - - seq_printf(m, "clock\t\t: %dMHz\n" - "bus clock\t\t: %dMHz\n", - bp->bi_intfreq / 1000000, - bp->bi_busfreq / 1000000); - - return 0; -} - -/* - * Document me. - */ -void __init -oak_init_IRQ(void) -{ - int i; - - ppc4xx_pic_init(); - - for (i = 0; i < NR_IRQS; i++) { - irq_desc[i].handler = ppc4xx_pic; - } - - return; -} - -/* - * Document me. - */ -int -oak_get_irq(struct pt_regs *regs) -{ - return (ppc4xx_pic_get_irq(regs)); -} - -/* - * Document me. - */ -void -oak_restart(char *cmd) -{ - abort(); -} - -/* - * Document me. - */ -void -oak_power_off(void) -{ - oak_restart(NULL); -} - -/* - * Document me. - */ -void -oak_halt(void) -{ - oak_restart(NULL); -} - -/* - * Document me. - */ -long __init -oak_time_init(void) -{ - /* XXX - Implement me */ - return 0; -} - -/* - * Document me. - */ -int __init -oak_set_rtc_time(unsigned long time) -{ - /* XXX - Implement me */ - - return (0); -} - -/* - * Document me. - */ -unsigned long __init -oak_get_rtc_time(void) -{ - /* XXX - Implement me */ - - return (0); -} - -/* - * void __init oak_calibrate_decr() - * - * Description: - * This routine retrieves the internal processor frequency from the board - * information structure, sets up the kernel timer decrementer based on - * that value, enables the 403 programmable interval timer (PIT) and sets - * it up for auto-reload. - * - * Input(s): - * N/A - * - * Output(s): - * N/A - * - * Returns: - * N/A - * - */ -void __init -oak_calibrate_decr(void) -{ - unsigned int freq; - bd_t *bip = (bd_t *)__res; - - freq = bip->bi_intfreq; - - decrementer_count = freq / HZ; - count_period_num = 1; - count_period_den = freq; - - /* Enable the PIT and set auto-reload of its value */ - - mtspr(SPRN_TCR, TCR_PIE | TCR_ARE); - - /* Clear any pending timer interrupts */ - - mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_PIS | TSR_FIS); -} diff -Nru a/arch/ppc/platforms/4xx/redwood.c b/arch/ppc/platforms/4xx/redwood.c --- a/arch/ppc/platforms/4xx/redwood.c Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,74 +0,0 @@ -/* - * arch/ppc/platforms/4xx/redwood.c - * - * Author: Frank Rowand , or source@mvista.com - * - * 2000-2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#include -#include -#include -#include -#include -#include - -void __init -redwood_setup_arch(void) -{ - ppc4xx_setup_arch(); - -#ifdef CONFIG_IDE - void *xilinx, *xilinx_1, *xilinx_2; - unsigned short reg5; - - xilinx = ioremap(IDE_XLINUX_MUX_BASE, 0x10); - - /* init xilinx control registers - enable ide mux, clear reset bit */ - if (!xilinx) { - printk(KERN_CRIT - "redwood4_setup_arch() xilinx ioremap failed\n"); - return; - } - xilinx_1 = xilinx; - xilinx_2 = xilinx + 0xe; - - reg5 = readw(xilinx_1); - writeb(reg5 |= ~(0x8001), xilinx_1); - writeb(0, xilinx_2); - - udelay(10 * 1000); - - writeb(reg5 & 0x8001, xilinx_1); - writeb(0, xilinx_2); - - /* add RE & OEN to value set by boot rom */ - mtdcr(DCRN_BRCR3, 0x407cfffe); - -#endif - -} - -void __init -redwood_map_io(void) -{ - int i; - - ppc4xx_map_io(); - io_block_mapping(OAKNET_IO_VADDR, - OAKNET_IO_PADDR, OAKNET_IO_SIZE, _PAGE_IO); - -} - -void __init -platform_init(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7) -{ - ppc4xx_init(r3, r4, r5, r6, r7); - - ppc_md.setup_arch = redwood_setup_arch; - ppc_md.setup_io_mappings = redwood_map_io; -} diff -Nru a/arch/ppc/platforms/4xx/redwood.h b/arch/ppc/platforms/4xx/redwood.h --- a/arch/ppc/platforms/4xx/redwood.h Tue Feb 17 20:00:14 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,57 +0,0 @@ -/* - * arch/ppc/platforms/4xx/redwood.h - * - * Macros, definitions, and data structures specific to the IBM PowerPC - * STB03xxx "Redwood" evaluation board. - * - * Author: Frank Rowand , or source@mvista.com - * - * 2001 (c) MontaVista, Software, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifdef __KERNEL__ -#ifndef __ASM_REDWOOD_H__ -#define __ASM_REDWOOD_H__ - -/* Redwoods have an STB03xxx or STB04xxx core */ -#include - -#ifndef __ASSEMBLY__ -typedef struct board_info { - unsigned char bi_s_version[4]; /* Version of this structure */ - unsigned char bi_r_version[30]; /* Version of the IBM ROM */ - unsigned int bi_memsize; /* DRAM installed, in bytes */ - unsigned int bi_dummy; /* field shouldn't exist */ - unsigned char bi_enetaddr[6]; /* Ethernet MAC address */ - unsigned int bi_intfreq; /* Processor speed, in Hz */ - unsigned int bi_busfreq; /* Bus speed, in Hz */ -} bd_t; -#define bi_tbfreq bi_intfreq - -#endif /* !__ASSEMBLY__ */ - -#define bi_tbfreq bi_intfreq -#define OAKNET_IO_PADDR ((uint)0xf2000000) -#define OAKNET_IO_VADDR OAKNET_IO_PADDR -#define OAKNET_IO_BASE OAKNET_IO_VADDR - -/* ftr revisit- io size was 0xffff in old-line, is 0x40 in oak.h */ -#define OAKNET_IO_SIZE 0xffff -#define OAKNET_INT 26 /* EXTINT1 */ - -#define IDE_XLINUX_MUX_BASE 0xf2040000 -#define IDE_DMA_ADDR 0xfce00000 - -#define _IO_BASE 0 -#define _ISA_MEM_BASE 0 -#define PCI_DRAM_OFFSET 0 - -#define BASE_BAUD (378000000 / 18 / 16) - -#define PPC4xx_MACHINE_NAME "IBM Redwood" - -#endif /* __ASM_REDWOOD_H__ */ -#endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/Makefile b/arch/ppc/platforms/Makefile --- a/arch/ppc/platforms/Makefile Tue Feb 17 20:00:14 2004 +++ b/arch/ppc/platforms/Makefile Tue Feb 17 20:00:14 2004 @@ -17,9 +17,10 @@ obj-$(CONFIG_PCI) += apus_pci.o endif obj-$(CONFIG_PPC_PMAC) += pmac_pic.o pmac_setup.o pmac_time.o \ - pmac_feature.o pmac_pci.o pmac_sleep.o + pmac_feature.o pmac_pci.o pmac_sleep.o \ + pmac_low_i2c.o obj-$(CONFIG_PPC_CHRP) += chrp_setup.o chrp_time.o chrp_pci.o -obj-$(CONFIG_PPC_PREP) += prep_pci.o prep_time.o prep_setup.o +obj-$(CONFIG_PPC_PREP) += prep_pci.o prep_setup.o ifeq ($(CONFIG_PPC_PMAC),y) obj-$(CONFIG_NVRAM) += pmac_nvram.o obj-$(CONFIG_CPU_FREQ_PMAC) += pmac_cpufreq.o diff -Nru a/arch/ppc/platforms/mcpn765_setup.c b/arch/ppc/platforms/mcpn765_setup.c --- a/arch/ppc/platforms/mcpn765_setup.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/mcpn765_setup.c Tue Feb 17 20:00:07 2004 @@ -50,6 +50,7 @@ #include #include #include +#include #include "mcpn765.h" #include "mcpn765_serial.h" @@ -78,9 +79,6 @@ extern u_int openpic_irq(void); extern char cmd_line[]; -extern void gen550_progress(char *, unsigned short); -extern void gen550_init(int, struct uart_port *); - int use_of_interrupt_tree = 0; static void mcpn765_halt(void); @@ -472,6 +470,9 @@ #if defined(CONFIG_SERIAL_8250) && \ (defined(CONFIG_KGDB) || defined(CONFIG_SERIAL_TEXT_DEBUG)) mcpn765_early_serial_map(); +#ifdef CONFIG_KGDB + ppc_md.kgdb_map_scc = gen550_kgdb_map_scc; +#endif #ifdef CONFIG_SERIAL_TEXT_DEBUG ppc_md.progress = gen550_progress; #endif diff -Nru a/arch/ppc/platforms/pmac_backlight.c b/arch/ppc/platforms/pmac_backlight.c --- a/arch/ppc/platforms/pmac_backlight.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/pmac_backlight.c Tue Feb 17 20:00:08 2004 @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,10 @@ char *prop; int valid = 0; + /* There's already a matching controller, bail out */ + if (backlighter != NULL) + return; + bk_node = find_devices("backlight"); #ifdef CONFIG_ADB_PMU @@ -84,6 +89,7 @@ printk(KERN_INFO "Registered \"%s\" backlight controller, level: %d/15\n", type, backlight_level); } +EXPORT_SYMBOL(register_backlight_controller); void __pmac unregister_backlight_controller(struct backlight_controller *ctrler, void *data) @@ -92,6 +98,7 @@ if (ctrler == backlighter && data == backlighter_data) backlighter = NULL; } +EXPORT_SYMBOL(unregister_backlight_controller); int __pmac set_backlight_enable(int enable) @@ -105,6 +112,7 @@ backlight_enabled = enable; return rc; } +EXPORT_SYMBOL(set_backlight_enable); int __pmac get_backlight_enable(void) @@ -113,6 +121,7 @@ return -ENODEV; return backlight_enabled; } +EXPORT_SYMBOL(get_backlight_enable); int __pmac set_backlight_level(int level) @@ -137,6 +146,7 @@ } return rc; } +EXPORT_SYMBOL(set_backlight_level); int __pmac get_backlight_level(void) @@ -145,3 +155,4 @@ return -ENODEV; return backlight_level; } +EXPORT_SYMBOL(get_backlight_level); diff -Nru a/arch/ppc/platforms/pmac_cpufreq.c b/arch/ppc/platforms/pmac_cpufreq.c --- a/arch/ppc/platforms/pmac_cpufreq.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/pmac_cpufreq.c Tue Feb 17 20:00:07 2004 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,14 @@ */ #undef DEBUG_FREQ +/* + * There is a problem with the core cpufreq code on SMP kernels, + * it won't recalculate the Bogomips properly + */ +#ifdef CONFIG_SMP +#warning "WARNING, CPUFREQ not recommended on SMP kernels" +#endif + extern void low_choose_750fx_pll(int pll); extern void low_sleep_handler(void); extern void openpic_suspend(struct sys_device *sysdev, u32 state); @@ -48,7 +57,14 @@ static unsigned int low_freq; static unsigned int hi_freq; static unsigned int cur_freq; + +/* Clean that up some day ... use a func ptr or at least an enum... */ static int cpufreq_uses_pmu; +static int cpufreq_uses_gpios; + +static u32 voltage_gpio; +static u32 frequency_gpio; +static u32 slew_done_gpio; #define PMAC_CPU_LOW_SPEED 1 #define PMAC_CPU_HIGH_SPEED 0 @@ -65,8 +81,7 @@ {0, CPUFREQ_TABLE_END}, }; -static inline void -wakeup_decrementer(void) +static inline void wakeup_decrementer(void) { set_dec(tb_ticks_per_jiffy); /* No currently-supported powerbook has a 601, @@ -76,8 +91,7 @@ } #ifdef DEBUG_FREQ -static inline void -debug_calc_bogomips(void) +static inline void debug_calc_bogomips(void) { /* This will cause a recalc of bogomips and display the * result. We backup/restore the value to avoid affecting the @@ -89,17 +103,18 @@ calibrate_delay(); loops_per_jiffy = save_lpj; } -#endif +#endif /* DEBUG_FREQ */ /* Switch CPU speed under 750FX CPU control */ -static int __pmac -cpu_750fx_cpu_speed(int low_speed) +static int __pmac cpu_750fx_cpu_speed(int low_speed) { #ifdef DEBUG_FREQ printk(KERN_DEBUG "HID1, before: %x\n", mfspr(SPRN_HID1)); #endif +#ifdef CONFIG_6xx low_choose_750fx_pll(low_speed); +#endif #ifdef DEBUG_FREQ printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1)); debug_calc_bogomips(); @@ -108,15 +123,54 @@ return 0; } +/* Switch CPU speed using slewing GPIOs + */ +static int __pmac gpios_set_cpu_speed(unsigned int low_speed) +{ + int gpio; + + /* If ramping up, set voltage first */ + if (low_speed == 0) { + pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, voltage_gpio, 0x05); + /* Delay is way too big but it's ok, we schedule */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); + } + + /* Set frequency */ + pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, frequency_gpio, low_speed ? 0x04 : 0x05); + udelay(200); + do { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + gpio = pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, slew_done_gpio, 0); + } while((gpio & 0x02) == 0); + + /* If ramping down, set voltage last */ + if (low_speed == 1) { + pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, voltage_gpio, 0x04); + /* Delay is way too big but it's ok, we schedule */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); + } + +#ifdef DEBUG_FREQ + debug_calc_bogomips(); +#endif + + return 0; +} + /* Switch CPU speed under PMU control */ -static int __pmac -pmu_set_cpu_speed(unsigned int low_speed) +static int __pmac pmu_set_cpu_speed(unsigned int low_speed) { struct adb_request req; unsigned long save_l2cr; unsigned long save_l3cr; + preempt_disable(); + #ifdef DEBUG_FREQ printk(KERN_DEBUG "HID1, before: %x\n", mfspr(SPRN_HID1)); #endif @@ -197,11 +251,12 @@ debug_calc_bogomips(); #endif + preempt_enable(); + return 0; } -static int __pmac -do_set_cpu_speed(int speed_mode) +static int __pmac do_set_cpu_speed(int speed_mode) { struct cpufreq_freqs freqs; int rc; @@ -216,6 +271,8 @@ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); if (cpufreq_uses_pmu) rc = pmu_set_cpu_speed(speed_mode); + else if (cpufreq_uses_gpios) + rc = gpios_set_cpu_speed(speed_mode); else rc = cpu_750fx_cpu_speed(speed_mode); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); @@ -224,16 +281,14 @@ return rc; } -static int __pmac -pmac_cpufreq_verify(struct cpufreq_policy *policy) +static int __pmac pmac_cpufreq_verify(struct cpufreq_policy *policy) { return cpufreq_frequency_table_verify(policy, pmac_cpu_freqs); } -static int __pmac -pmac_cpufreq_target( struct cpufreq_policy *policy, - unsigned int target_freq, - unsigned int relation) +static int __pmac pmac_cpufreq_target( struct cpufreq_policy *policy, + unsigned int target_freq, + unsigned int relation) { unsigned int newstate = 0; @@ -244,15 +299,13 @@ return do_set_cpu_speed(newstate); } -unsigned int __pmac -pmac_get_one_cpufreq(int i) +unsigned int __pmac pmac_get_one_cpufreq(int i) { /* Supports only one CPU for now */ return (i == 0) ? cur_freq : 0; } -static int __pmac -pmac_cpufreq_cpu_init(struct cpufreq_policy *policy) +static int __pmac pmac_cpufreq_cpu_init(struct cpufreq_policy *policy) { if (policy->cpu != 0) return -ENODEV; @@ -264,6 +317,18 @@ return cpufreq_frequency_table_cpuinfo(policy, &pmac_cpu_freqs[0]); } +static u32 __pmac read_gpio(struct device_node *np) +{ + u32 *reg = (u32 *)get_property(np, "reg", NULL); + + if (reg == NULL) + return 0; + /* That works for all keylargos but shall be fixed properly + * some day... + */ + return 0x50 + (*reg); +} + static struct cpufreq_driver pmac_cpufreq_driver = { .verify = pmac_cpufreq_verify, .target = pmac_cpufreq_target, @@ -272,15 +337,17 @@ .owner = THIS_MODULE, }; + /* Currently, we support the following machines: * + * - Titanium PowerBook 1Ghz (PMU based, 667Mhz & 1Ghz) * - Titanium PowerBook 800 (PMU based, 667Mhz & 800Mhz) * - Titanium PowerBook 500 (PMU based, 300Mhz & 500Mhz) * - iBook2 500 (PMU based, 400Mhz & 500Mhz) * - iBook2 700 (CPU based, 400Mhz & 700Mhz, support low voltage) + * - Recent MacRISC3 machines */ -static int __init -pmac_cpufreq_setup(void) +static int __init pmac_cpufreq_setup(void) { struct device_node *cpunode; u32 *value; @@ -304,6 +371,74 @@ if (machine_is_compatible("PowerBook3,4") || machine_is_compatible("PowerBook3,5") || machine_is_compatible("MacRISC3")) { + struct device_node *volt_gpio_np = of_find_node_by_name(NULL, "voltage-gpio"); + struct device_node *freq_gpio_np = of_find_node_by_name(NULL, "frequency-gpio"); + struct device_node *slew_done_gpio_np = of_find_node_by_name(NULL, "slewing-done"); + + /* + * Check to see if it's GPIO driven or PMU only + * + * The way we extract the GPIO address is slightly hackish, but it + * works well enough for now. We need to abstract the whole GPIO + * stuff sooner or later anyway + */ + + if (volt_gpio_np) + voltage_gpio = read_gpio(volt_gpio_np); + if (freq_gpio_np) + frequency_gpio = read_gpio(freq_gpio_np); + if (slew_done_gpio_np) + slew_done_gpio = read_gpio(slew_done_gpio_np); + + /* If we use the frequency GPIOs, calculate the min/max speeds based + * on the bus frequencies + */ + if (frequency_gpio && slew_done_gpio) { + int lenp, rc; + u32 *freqs, *ratio; + + freqs = (u32 *)get_property(cpunode, "bus-frequencies", &lenp); + lenp /= sizeof(u32); + if (freqs == NULL || lenp != 2) { + printk(KERN_ERR "cpufreq: bus-frequencies incorrect or missing\n"); + goto out; + } + ratio = (u32 *)get_property(cpunode, "processor-to-bus-ratio*2", NULL); + if (ratio == NULL) { + printk(KERN_ERR "cpufreq: processor-to-bus-ratio*2 missing\n"); + goto out; + } + + /* Get the min/max bus frequencies */ + low_freq = min(freqs[0], freqs[1]); + hi_freq = max(freqs[0], freqs[1]); + + /* Grrrr.. It _seems_ that the device-tree is lying on the low bus + * frequency, it claims it to be around 84Mhz on some models while + * it appears to be approx. 101Mhz on all. Let's hack around here... + * fortunately, we don't need to be too precise + */ + if (low_freq < 98000000) + low_freq = 101000000; + + /* Convert those to CPU core clocks */ + low_freq = (low_freq * (*ratio)) / 2000; + hi_freq = (hi_freq * (*ratio)) / 2000; + + /* Now we get the frequencies, we read the GPIO to see what is out current + * speed + */ + rc = pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, frequency_gpio, 0); + cur_freq = (rc & 0x01) ? hi_freq : low_freq; + + has_freq_ctl = 1; + cpufreq_uses_gpios = 1; + goto out; + } + + /* If we use the PMU, look for the min & max frequencies in the + * device-tree + */ value = (u32 *)get_property(cpunode, "min-clock-frequency", NULL); if (!value) goto out; @@ -358,6 +493,11 @@ pmac_cpu_freqs[CPUFREQ_LOW].frequency = low_freq; pmac_cpu_freqs[CPUFREQ_HIGH].frequency = hi_freq; + + printk(KERN_INFO "Registering PowerMac CPU frequency driver\n"); + printk(KERN_INFO "Low: %d Mhz, High: %d Mhz, Boot: %d Mhz, switch method: %s\n", + low_freq/1000, hi_freq/1000, cur_freq/1000, + cpufreq_uses_pmu ? "PMU" : (cpufreq_uses_gpios ? "GPIOs" : "CPU")); return cpufreq_register_driver(&pmac_cpufreq_driver); } diff -Nru a/arch/ppc/platforms/pmac_feature.c b/arch/ppc/platforms/pmac_feature.c --- a/arch/ppc/platforms/pmac_feature.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/pmac_feature.c Tue Feb 17 20:00:08 2004 @@ -41,6 +41,7 @@ #include #include #include +#include #undef DEBUG_FEATURE @@ -50,9 +51,13 @@ #define DBG(fmt,...) #endif -/* Exported from arch/ppc/kernel/idle.c */ +#ifdef CONFIG_6xx extern int powersave_lowspeed; +#endif + extern int powersave_nap; +extern struct pci_dev *k2_skiplist[2]; + /* * We use a single global lock to protect accesses. Each driver has @@ -95,7 +100,8 @@ "Paddington", "Keylargo", "Pangea", - "Intrepid" + "Intrepid", + "K2" }; @@ -113,14 +119,15 @@ static struct device_node* uninorth_node __pmacdata; static u32* uninorth_base __pmacdata; static u32 uninorth_rev __pmacdata; - +static int uninorth_u3 __pmacdata; +static void *u3_ht; /* * For each motherboard family, we have a table of functions pointers * that handle the various features. */ -typedef int (*feature_call)(struct device_node* node, int param, int value); +typedef long (*feature_call)(struct device_node* node, long param, long value); struct feature_table_entry { unsigned int selector; @@ -161,8 +168,10 @@ return 0; } -static int __pmac -ohare_htw_scc_enable(struct device_node* node, int param, int value) +#ifndef CONFIG_POWER4 + +static long __pmac +ohare_htw_scc_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long chan_mask; @@ -254,22 +263,22 @@ return 0; } -static int __pmac -ohare_floppy_enable(struct device_node* node, int param, int value) +static long __pmac +ohare_floppy_enable(struct device_node* node, long param, long value) { return simple_feature_tweak(node, macio_ohare, OHARE_FCR, OH_FLOPPY_ENABLE, value); } -static int __pmac -ohare_mesh_enable(struct device_node* node, int param, int value) +static long __pmac +ohare_mesh_enable(struct device_node* node, long param, long value) { return simple_feature_tweak(node, macio_ohare, OHARE_FCR, OH_MESH_ENABLE, value); } -static int __pmac -ohare_ide_enable(struct device_node* node, int param, int value) +static long __pmac +ohare_ide_enable(struct device_node* node, long param, long value) { switch(param) { case 0: @@ -289,8 +298,8 @@ } } -static int __pmac -ohare_ide_reset(struct device_node* node, int param, int value) +static long __pmac +ohare_ide_reset(struct device_node* node, long param, long value) { switch(param) { case 0: @@ -304,8 +313,8 @@ } } -static int __pmac -ohare_sleep_state(struct device_node* node, int param, int value) +static long __pmac +ohare_sleep_state(struct device_node* node, long param, long value) { struct macio_chip* macio = &macio_chips[0]; @@ -320,8 +329,8 @@ return 0; } -static int __pmac -heathrow_modem_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_modem_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; u8 gpio; @@ -364,8 +373,8 @@ return 0; } -static int __pmac -heathrow_floppy_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_floppy_enable(struct device_node* node, long param, long value) { return simple_feature_tweak(node, macio_unknown, HEATHROW_FCR, @@ -373,8 +382,8 @@ value); } -static int __pmac -heathrow_mesh_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_mesh_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -390,22 +399,11 @@ MACIO_BIC(HEATHROW_FCR, HRW_MESH_ENABLE); (void)MACIO_IN32(HEATHROW_FCR); udelay(10); - /* Set/Clear termination power (todo: test ! the bit value - * used by Darwin doesn't seem to match what we used so - * far. If you experience problems, turn #if 1 into #if 0 - * and tell me about it --BenH. - */ -#if 1 + /* Set/Clear termination power */ if (value) - MACIO_BIC(HEATHROW_MBCR, 0x00000004); + MACIO_BIC(HEATHROW_MBCR, 0x04000000); else - MACIO_BIS(HEATHROW_MBCR, 0x00000004); -#else - if (value) - MACIO_BIC(HEATHROW_MBCR, 0x00040000); - else - MACIO_BIS(HEATHROW_MBCR, 0x00040000); -#endif + MACIO_BIS(HEATHROW_MBCR, 0x04000000); (void)MACIO_IN32(HEATHROW_MBCR); udelay(10); UNLOCK(flags); @@ -413,8 +411,8 @@ return 0; } -static int __pmac -heathrow_ide_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_ide_enable(struct device_node* node, long param, long value) { switch(param) { case 0: @@ -428,8 +426,8 @@ } } -static int __pmac -heathrow_ide_reset(struct device_node* node, int param, int value) +static long __pmac +heathrow_ide_reset(struct device_node* node, long param, long value) { switch(param) { case 0: @@ -443,8 +441,8 @@ } } -static int __pmac -heathrow_bmac_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_bmac_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -472,8 +470,8 @@ return 0; } -static int __pmac -heathrow_sound_enable(struct device_node* node, int param, int value) +static long __pmac +heathrow_sound_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -608,8 +606,8 @@ } } -static int __pmac -heathrow_sleep_state(struct device_node* node, int param, int value) +static long __pmac +heathrow_sleep_state(struct device_node* node, long param, long value) { if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0) return -EPERM; @@ -625,8 +623,8 @@ return 0; } -static int __pmac -core99_scc_enable(struct device_node* node, int param, int value) +static long __pmac +core99_scc_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -726,8 +724,8 @@ return 0; } -static int __pmac -core99_modem_enable(struct device_node* node, int param, int value) +static long __pmac +core99_modem_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; u8 gpio; @@ -778,8 +776,8 @@ return 0; } -static int __pmac -pangea_modem_enable(struct device_node* node, int param, int value) +static long __pmac +pangea_modem_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; u8 gpio; @@ -833,8 +831,8 @@ return 0; } -static int __pmac -core99_ata100_enable(struct device_node* node, int value) +static long __pmac +core99_ata100_enable(struct device_node* node, long value) { unsigned long flags; struct pci_dev *pdev = NULL; @@ -863,8 +861,8 @@ return 0; } -static int __pmac -core99_ide_enable(struct device_node* node, int param, int value) +static long __pmac +core99_ide_enable(struct device_node* node, long param, long value) { /* Bus ID 0 to 2 are KeyLargo based IDE, busID 3 is U2 * based ata-100 @@ -886,8 +884,8 @@ } } -static int __pmac -core99_ide_reset(struct device_node* node, int param, int value) +static long __pmac +core99_ide_reset(struct device_node* node, long param, long value) { switch(param) { case 0: @@ -904,8 +902,8 @@ } } -static int __pmac -core99_gmac_enable(struct device_node* node, int param, int value) +static long __pmac +core99_gmac_enable(struct device_node* node, long param, long value) { unsigned long flags; @@ -921,8 +919,8 @@ return 0; } -static int __pmac -core99_gmac_phy_reset(struct device_node* node, int param, int value) +static long __pmac +core99_gmac_phy_reset(struct device_node* node, long param, long value) { unsigned long flags; struct macio_chip* macio; @@ -938,16 +936,16 @@ UNLOCK(flags); mdelay(10); LOCK(flags); - MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE - | KEYLARGO_GPIO_OUTOUT_DATA); + MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */ + KEYLARGO_GPIO_OUTOUT_DATA); UNLOCK(flags); mdelay(10); return 0; } -static int __pmac -core99_sound_chip_enable(struct device_node* node, int param, int value) +static long __pmac +core99_sound_chip_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -976,8 +974,8 @@ return 0; } -static int __pmac -core99_airport_enable(struct device_node* node, int param, int value) +static long __pmac +core99_airport_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -1063,8 +1061,8 @@ } #ifdef CONFIG_SMP -static int __pmac -core99_reset_cpu(struct device_node* node, int param, int value) +static long __pmac +core99_reset_cpu(struct device_node* node, long param, long value) { unsigned int reset_io = 0; unsigned long flags; @@ -1099,7 +1097,7 @@ MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE); (void)MACIO_IN8(reset_io); udelay(1); - MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTOUT_DATA | KEYLARGO_GPIO_OUTPUT_ENABLE); + MACIO_OUT8(reset_io, 0); (void)MACIO_IN8(reset_io); UNLOCK(flags); @@ -1107,8 +1105,8 @@ } #endif /* CONFIG_SMP */ -static int __pmac -core99_usb_enable(struct device_node* node, int param, int value) +static long __pmac +core99_usb_enable(struct device_node* node, long param, long value) { struct macio_chip* macio; unsigned long flags; @@ -1121,9 +1119,6 @@ macio->type != macio_intrepid) return -ENODEV; - /* XXX Fix handling of 3rd USB controller in Intrepid, move the - * port connect stuff (KL4_*) to the sleep code eventually - */ prop = (char *)get_property(node, "AAPL,clock-id", NULL); if (!prop) return -ENODEV; @@ -1131,6 +1126,8 @@ number = 0; else if (strncmp(prop, "usb1u148", 8) == 0) number = 2; + else if (strncmp(prop, "usb2u248", 8) == 0) + number = 4; else return -ENODEV; @@ -1147,44 +1144,79 @@ mdelay(1); LOCK(flags); MACIO_BIS(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE); - } else { + } else if (number == 2) { MACIO_BIC(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1)); UNLOCK(flags); (void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1); LOCK(flags); MACIO_BIS(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE); + } else if (number == 4) { + MACIO_BIC(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1)); + UNLOCK(flags); + (void)MACIO_IN32(KEYLARGO_FCR1); + mdelay(1); + LOCK(flags); + MACIO_BIS(KEYLARGO_FCR0, KL1_USB2_CELL_ENABLE); + } + if (number < 4) { + reg = MACIO_IN32(KEYLARGO_FCR4); + reg &= ~(KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) | + KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number)); + reg &= ~(KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) | + KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1)); + MACIO_OUT32(KEYLARGO_FCR4, reg); + (void)MACIO_IN32(KEYLARGO_FCR4); + udelay(10); + } else { + reg = MACIO_IN32(KEYLARGO_FCR3); + reg &= ~(KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) | + KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0)); + reg &= ~(KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) | + KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1)); + MACIO_OUT32(KEYLARGO_FCR3, reg); + (void)MACIO_IN32(KEYLARGO_FCR3); + udelay(10); } - reg = MACIO_IN32(KEYLARGO_FCR4); - reg &= ~(KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) | - KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number)); - reg &= ~(KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) | - KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1)); - MACIO_OUT32(KEYLARGO_FCR4, reg); - (void)MACIO_IN32(KEYLARGO_FCR4); - udelay(10); } else { /* Turn OFF */ - reg = MACIO_IN32(KEYLARGO_FCR4); - reg |= KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) | - KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number); - reg |= KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) | - KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1); - MACIO_OUT32(KEYLARGO_FCR4, reg); - (void)MACIO_IN32(KEYLARGO_FCR4); - udelay(1); + if (number < 4) { + reg = MACIO_IN32(KEYLARGO_FCR4); + reg |= KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) | + KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number); + reg |= KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) | + KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1); + MACIO_OUT32(KEYLARGO_FCR4, reg); + (void)MACIO_IN32(KEYLARGO_FCR4); + udelay(1); + } else { + reg = MACIO_IN32(KEYLARGO_FCR3); + reg |= KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) | + KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0); + reg |= KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) | + KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1); + MACIO_OUT32(KEYLARGO_FCR3, reg); + (void)MACIO_IN32(KEYLARGO_FCR3); + udelay(1); + } if (number == 0) { MACIO_BIC(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE); (void)MACIO_IN32(KEYLARGO_FCR0); udelay(1); MACIO_BIS(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1)); (void)MACIO_IN32(KEYLARGO_FCR0); - } else { + } else if (number == 2) { MACIO_BIC(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE); (void)MACIO_IN32(KEYLARGO_FCR0); udelay(1); MACIO_BIS(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1)); (void)MACIO_IN32(KEYLARGO_FCR0); + } else if (number == 4) { + MACIO_BIC(KEYLARGO_FCR1, KL1_USB2_CELL_ENABLE); + (void)MACIO_IN32(KEYLARGO_FCR1); + udelay(1); + MACIO_BIS(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1)); + (void)MACIO_IN32(KEYLARGO_FCR1); } udelay(1); } @@ -1193,8 +1225,8 @@ return 0; } -static int __pmac -core99_firewire_enable(struct device_node* node, int param, int value) +static long __pmac +core99_firewire_enable(struct device_node* node, long param, long value) { unsigned long flags; struct macio_chip* macio; @@ -1220,8 +1252,8 @@ return 0; } -static int __pmac -core99_firewire_cable_power(struct device_node* node, int param, int value) +static long __pmac +core99_firewire_cable_power(struct device_node* node, long param, long value) { unsigned long flags; struct macio_chip* macio; @@ -1251,8 +1283,10 @@ return 0; } -static int __pmac -core99_read_gpio(struct device_node* node, int param, int value) +#endif /* CONFIG_POWER4 */ + +static long __pmac +core99_read_gpio(struct device_node* node, long param, long value) { struct macio_chip* macio = &macio_chips[0]; @@ -1260,8 +1294,8 @@ } -static int __pmac -core99_write_gpio(struct device_node* node, int param, int value) +static long __pmac +core99_write_gpio(struct device_node* node, long param, long value) { struct macio_chip* macio = &macio_chips[0]; @@ -1269,6 +1303,145 @@ return 0; } +#ifdef CONFIG_POWER4 + +static long __pmac +g5_gmac_enable(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + unsigned long flags; + struct pci_dev *pdev; + u8 pbus, pid; + + /* XXX FIXME: We should fix pci_device_from_OF_node here, and + * get to a real pci_dev or we'll get into trouble with PCI + * domains the day we get overlapping numbers (like if we ever + * decide to show the HT root + */ + if (pci_device_from_OF_node(node, &pbus, &pid) == 0) + pdev = pci_find_slot(pbus, pid); + + LOCK(flags); + if (value) { + MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE); + mb(); + k2_skiplist[0] = NULL; + } else { + k2_skiplist[0] = pdev; + mb(); + MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE); + } + + UNLOCK(flags); + mdelay(1); + + return 0; +} + +static long __pmac +g5_fw_enable(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + unsigned long flags; + struct pci_dev *pdev; + u8 pbus, pid; + + /* XXX FIXME: We should fix pci_device_from_OF_node here, and + * get to a real pci_dev or we'll get into trouble with PCI + * domains the day we get overlapping numbers (like if we ever + * decide to show the HT root + */ + if (pci_device_from_OF_node(node, &pbus, &pid) == 0) + pdev = pci_find_slot(pbus, pid); + + LOCK(flags); + if (value) { + MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE); + mb(); + k2_skiplist[1] = NULL; + } else { + k2_skiplist[0] = pdev; + mb(); + MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE); + } + + UNLOCK(flags); + mdelay(1); + + return 0; +} + +static long __pmac +g5_mpic_enable(struct device_node* node, long param, long value) +{ + unsigned long flags; + + if (node->parent == NULL || strcmp(node->parent->name, "u3")) + return 0; + + LOCK(flags); + UN_BIS(U3_TOGGLE_REG, U3_MPIC_RESET | U3_MPIC_OUTPUT_ENABLE); + UNLOCK(flags); + + return 0; +} + +#ifdef CONFIG_SMP +static long __pmac +g5_reset_cpu(struct device_node* node, long param, long value) +{ + unsigned int reset_io = 0; + unsigned long flags; + struct macio_chip* macio; + struct device_node* np; + + macio = &macio_chips[0]; + if (macio->type != macio_keylargo2) + return -ENODEV; + + np = find_path_device("/cpus"); + if (np == NULL) + return -ENODEV; + for (np = np->child; np != NULL; np = np->sibling) { + u32* num = (u32 *)get_property(np, "reg", NULL); + u32* rst = (u32 *)get_property(np, "soft-reset", NULL); + if (num == NULL || rst == NULL) + continue; + if (param == *num) { + reset_io = *rst; + break; + } + } + if (np == NULL || reset_io == 0) + return -ENODEV; + + LOCK(flags); + MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE); + (void)MACIO_IN8(reset_io); + udelay(1); + MACIO_OUT8(reset_io, 0); + (void)MACIO_IN8(reset_io); + UNLOCK(flags); + + return 0; +} +#endif /* CONFIG_SMP */ + +/* + * This can be called from pmac_smp so isn't static + * + * This takes the second CPU off the bus on dual CPU machines + * running UP + */ +void __pmac g5_phy_disable_cpu1(void) +{ + UN_OUT(U3_API_PHY_CONFIG_1, 0); +} + +#endif /* CONFIG_POWER4 */ + +#ifndef CONFIG_POWER4 + static void __pmac keylargo_shutdown(struct macio_chip* macio, int sleep_mode) { @@ -1541,8 +1714,8 @@ return 0; } -static int __pmac -core99_sleep_state(struct device_node* node, int param, int value) +static long __pmac +core99_sleep_state(struct device_node* node, long param, long value) { /* Param == 1 means to enter the "fake sleep" mode that is * used for CPU speed switch @@ -1568,8 +1741,10 @@ return 0; } -static int __pmac -generic_get_mb_info(struct device_node* node, int param, int value) +#endif /* CONFIG_POWER4 */ + +static long __pmac +generic_get_mb_info(struct device_node* node, long param, long value) { switch(param) { case PMAC_MB_INFO_MODEL: @@ -1579,9 +1754,9 @@ case PMAC_MB_INFO_NAME: /* hack hack hack... but should work */ *((const char **)value) = pmac_mb.model_name; - break; + return 0; } - return 0; + return -EINVAL; } @@ -1596,6 +1771,8 @@ { 0, NULL } }; +#ifndef CONFIG_POWER4 + /* OHare based motherboards. Currently, we only use these on the * 2400,3400 and 3500 series powerbooks. Some older desktops seem * to have issues with turning on/off those asic cells @@ -1741,10 +1918,29 @@ { 0, NULL } }; +#else /* CONFIG_POWER4 */ + +/* G5 features + */ +static struct feature_table_entry g5_features[] __pmacdata = { + { PMAC_FTR_GMAC_ENABLE, g5_gmac_enable }, + { PMAC_FTR_1394_ENABLE, g5_fw_enable }, + { PMAC_FTR_ENABLE_MPIC, g5_mpic_enable }, +#ifdef CONFIG_SMP + { PMAC_FTR_RESET_CPU, g5_reset_cpu }, +#endif /* CONFIG_SMP */ + { PMAC_FTR_READ_GPIO, core99_read_gpio }, + { PMAC_FTR_WRITE_GPIO, core99_write_gpio }, + { 0, NULL } +}; + +#endif /* CONFIG_POWER4 */ + static struct pmac_mb_def pmac_mb_defs[] __pmacdata = { /* Warning: ordering is important as some models may claim * beeing compatible with several types */ +#ifndef CONFIG_POWER4 { "AAPL,8500", "PowerMac 8500/8600", PMAC_TYPE_PSURGE, NULL, 0 @@ -1753,6 +1949,14 @@ PMAC_TYPE_PSURGE, NULL, 0 }, + { "AAPL,7200", "PowerMac 7200", + PMAC_TYPE_PSURGE, NULL, + 0 + }, + { "AAPL,7300", "PowerMac 7200/7300", + PMAC_TYPE_PSURGE, NULL, + 0 + }, { "AAPL,7500", "PowerMac 7500", PMAC_TYPE_PSURGE, NULL, 0 @@ -1905,20 +2109,43 @@ PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, }, + { "PowerBook5,2", "PowerBook G4 15\"", + PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, + PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, + }, + { "PowerBook5,3", "PowerBook G4 17\"", + PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, + PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, + }, { "PowerBook6,1", "PowerBook G4 12\"", PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, }, + { "PowerBook6,2", "PowerBook G4", + PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, + PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, + }, + { "PowerBook6,3", "iBook G4", + PMAC_TYPE_UNKNOWN_INTREPID, intrepid_features, + PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE, + }, +#else /* CONFIG_POWER4 */ + { "PowerMac7,2", "PowerMac G5", + PMAC_TYPE_POWERMAC_G5, g5_features, + 0, + }, +#endif /* CONFIG_POWER4 */ }; /* * The toplevel feature_call callback */ -int __pmac +long __pmac pmac_do_feature_call(unsigned int selector, ...) { struct device_node* node; - int param, value, i; + long param, value; + int i; feature_call func = NULL; va_list args; @@ -1939,8 +2166,8 @@ va_start(args, selector); node = (struct device_node*)va_arg(args, void*); - param = va_arg(args, int); - value = va_arg(args, int); + param = va_arg(args, long); + value = va_arg(args, long); va_end(args); return func(node, param, value); @@ -1976,6 +2203,7 @@ /* Fallback to selection depending on mac-io chip type */ switch(macio->type) { +#ifndef CONFIG_POWER4 case macio_grand_central: pmac_mb.model_id = PMAC_TYPE_PSURGE; pmac_mb.model_name = "Unknown PowerSurge"; @@ -2009,10 +2237,18 @@ pmac_mb.model_name = "Unknown Intrepid-based"; pmac_mb.features = intrepid_features; break; +#else /* CONFIG_POWER4 */ + case macio_keylargo2: + pmac_mb.model_id = PMAC_TYPE_UNKNOWN_K2; + pmac_mb.model_name = "Unknown G5"; + pmac_mb.features = g5_features; + break; +#endif /* CONFIG_POWER4 */ default: return -ENODEV; } found: +#ifndef CONFIG_POWER4 /* Fixup Hooper vs. Comet */ if (pmac_mb.model_id == PMAC_TYPE_HOOPER) { u32* mach_id_ptr = (u32*)ioremap(0xf3000034, 4); @@ -2026,6 +2262,7 @@ pmac_mb.model_id = PMAC_TYPE_COMET; iounmap(mach_id_ptr); } +#endif /* CONFIG_POWER4 */ #ifdef CONFIG_6xx /* Set default value of powersave_nap on machines that support it. @@ -2057,7 +2294,9 @@ */ powersave_lowspeed = 1; #endif /* CONFIG_6xx */ - +#ifdef CONFIG_POWER4 + powersave_nap = 1; +#endif /* Check for "mobile" machine */ if (model && (strncmp(model, "PowerBook", 9) == 0 || strncmp(model, "iBook", 5) == 0)) @@ -2076,18 +2315,26 @@ unsigned long actrl; /* Locate core99 Uni-N */ - uninorth_node = find_devices("uni-n"); + uninorth_node = of_find_node_by_name(NULL, "uni-n"); + /* Locate G5 u3 */ + if (uninorth_node == NULL) { + uninorth_node = of_find_node_by_name(NULL, "u3"); + uninorth_u3 = 1; + } if (uninorth_node && uninorth_node->n_addrs > 0) { - uninorth_base = ioremap(uninorth_node->addrs[0].address, 0x4000); + unsigned long address = uninorth_node->addrs[0].address; + uninorth_base = ioremap(address, 0x40000); uninorth_rev = in_be32(UN_REG(UNI_N_VERSION)); + if (uninorth_u3) + u3_ht = ioremap(address + U3_HT_CONFIG_BASE, 0x1000); } else uninorth_node = NULL; if (!uninorth_node) return; - printk(KERN_INFO "Found Uninorth memory controller & host bridge, revision: %d\n", - uninorth_rev); + printk(KERN_INFO "Found %s memory controller & host bridge, revision: %d\n", + uninorth_u3 ? "U3" : "UniNorth", uninorth_rev); printk(KERN_INFO "Mapped at 0x%08lx\n", (unsigned long)uninorth_base); /* Set the arbitrer QAck delay according to what Apple does @@ -2172,6 +2419,7 @@ probe_one_macio("mac-io", "paddington", macio_paddington); probe_one_macio("mac-io", "gatwick", macio_gatwick); probe_one_macio("mac-io", "heathrow", macio_heathrow); + probe_one_macio("mac-io", "K2-Keylargo", macio_keylargo2); /* Make sure the "main" macio chip appear first */ if (macio_chips[0].type == macio_gatwick @@ -2244,19 +2492,60 @@ MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE); } +#ifdef CONFIG_POWER4 + if (macio_chips[0].type == macio_keylargo2) { +#ifndef CONFIG_SMP + /* On SMP machines running UP, we have the second CPU eating + * bus cycles. We need to take it off the bus. This is done + * from pmac_smp for SMP kernels running on one CPU + */ + np = of_find_node_by_type(NULL, "cpu"); + if (np != NULL) + np = of_find_node_by_type(np, "cpu"); + if (np != NULL) { + g5_phy_disable_cpu1(); + of_node_put(np); + } +#endif /* CONFIG_SMP */ + /* Enable GMAC for now for PCI probing. It will be disabled + * later on after PCI probe + */ + np = of_find_node_by_name(NULL, "ethernet"); + while(np) { + if (device_is_compatible(np, "K2-GMAC")) + g5_gmac_enable(np, 0, 1); + np = of_find_node_by_name(np, "ethernet"); + } + + /* Enable FW before PCI probe. Will be disabled later on + * Note: We should have a batter way to check that we are + * dealing with uninorth internal cell and not a PCI cell + * on the external PCI. The code below works though. + */ + np = of_find_node_by_name(NULL, "firewire"); + while(np) { + if (device_is_compatible(np, "pci106b,5811")) { + macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED; + g5_fw_enable(np, 0, 1); + } + np = of_find_node_by_name(np, "firewire"); + } + } +#else /* CONFIG_POWER4 */ + if (macio_chips[0].type == macio_keylargo || macio_chips[0].type == macio_pangea || macio_chips[0].type == macio_intrepid) { /* Enable GMAC for now for PCI probing. It will be disabled * later on after PCI probe */ - np = find_devices("ethernet"); + np = of_find_node_by_name(NULL, "ethernet"); while(np) { if (np->parent && device_is_compatible(np->parent, "uni-north") && device_is_compatible(np, "gmac")) core99_gmac_enable(np, 0, 1); - np = np->next; + np = of_find_node_by_name(np, "ethernet"); } /* Enable FW before PCI probe. Will be disabled later on @@ -2264,7 +2553,7 @@ * dealing with uninorth internal cell and not a PCI cell * on the external PCI. The code below works though. */ - np = find_devices("firewire"); + np = of_find_node_by_name(NULL, "firewire"); while(np) { if (np->parent && device_is_compatible(np->parent, "uni-north") @@ -2274,18 +2563,18 @@ macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED; core99_firewire_enable(np, 0, 1); } - np = np->next; + np = of_find_node_by_name(np, "firewire"); } /* Enable ATA-100 before PCI probe. */ - np = find_devices("ata-6"); + np = of_find_node_by_name(NULL, "ata-6"); while(np) { if (np->parent && device_is_compatible(np->parent, "uni-north") && device_is_compatible(np, "kauai-ata")) { core99_ata100_enable(np, 1); } - np = np->next; + np = of_find_node_by_name(np, "ata-6"); } /* Switch airport off */ @@ -2313,6 +2602,99 @@ MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N); } + /* Hack for bumping clock speed on the new PowerBooks and the + * iBook G4. This implements the "platform-do-clockspreading" OF + * property. For safety, we also check the product ID in the + * device-tree to make reasonably sure we won't set wrong values + * in the clock chip. + * + * Of course, ultimately, we have to implement a real parser for + * the platform-do-* stuff... + */ + while (machine_is_compatible("PowerBook5,2") || + machine_is_compatible("PowerBook5,3") || + machine_is_compatible("PowerBook6,2") || + machine_is_compatible("PowerBook6,3")) { + struct device_node *ui2c = of_find_node_by_type(NULL, "i2c"); + struct device_node *dt = of_find_node_by_name(NULL, "device-tree"); + u8 buffer[9]; + u32 *productID; + int i, rc, changed = 0; + + if (dt == NULL) + break; + productID = (u32 *)get_property(dt, "pid#", NULL); + if (productID == NULL) + break; + while(ui2c) { + struct device_node *p = of_get_parent(ui2c); + if (p && !strcmp(p->name, "uni-n")) + break; + ui2c = of_find_node_by_type(np, "i2c"); + } + if (ui2c == NULL) + break; + DBG("Trying to bump clock speed for PID: %08x...\n", *productID); + rc = pmac_low_i2c_open(ui2c, 1); + if (rc != 0) + break; + pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined); + rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9); + DBG("read result: %d,", rc); + if (rc != 0) { + pmac_low_i2c_close(ui2c); + break; + } + for (i=0; i<9; i++) + DBG(" %02x", buffer[i]); + DBG("\n"); + + switch(*productID) { + case 0x1182: /* AlBook 12" rev 2 */ + case 0x1183: /* iBook G4 12" */ + buffer[0] = (buffer[0] & 0x8f) | 0x70; + buffer[2] = (buffer[2] & 0x7f) | 0x00; + buffer[5] = (buffer[5] & 0x80) | 0x31; + buffer[6] = (buffer[6] & 0x40) | 0xb0; + buffer[7] = (buffer[7] & 0x00) | 0xc0; + buffer[8] = (buffer[8] & 0x00) | 0x30; + changed = 1; + break; + case 0x3142: /* AlBook 15" (ATI M10) */ + case 0x3143: /* AlBook 17" (ATI M10) */ + buffer[0] = (buffer[0] & 0xaf) | 0x50; + buffer[2] = (buffer[2] & 0x7f) | 0x00; + buffer[5] = (buffer[5] & 0x80) | 0x31; + buffer[6] = (buffer[6] & 0x40) | 0xb0; + buffer[7] = (buffer[7] & 0x00) | 0xd0; + buffer[8] = (buffer[8] & 0x00) | 0x30; + changed = 1; + break; + default: + DBG("i2c-hwclock: Machine model not handled\n"); + break; + } + if (!changed) { + pmac_low_i2c_close(ui2c); + break; + } + pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_stdsub); + rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_write, 0x80, buffer, 9); + DBG("write result: %d,", rc); + pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined); + rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9); + DBG("read result: %d,", rc); + if (rc != 0) { + pmac_low_i2c_close(ui2c); + break; + } + for (i=0; i<9; i++) + DBG(" %02x", buffer[i]); + pmac_low_i2c_close(ui2c); + break; + } + +#endif /* CONFIG_POWER4 */ /* On all machines, switch modem & serial ports off */ np = find_devices("ch-a"); @@ -2339,6 +2721,9 @@ return; } + /* Setup low-level i2c stuffs */ + pmac_init_low_i2c(); + /* Probe machine type */ if (probe_motherboard()) printk(KERN_WARNING "Unknown PowerMac !\n"); @@ -2367,3 +2752,55 @@ } device_initcall(pmac_feature_late_init); + +#ifdef CONFIG_POWER4 + +static void dump_HT_speeds(char *name, u32 cfg, u32 frq) +{ + int freqs[16] = { 200,300,400,500,600,800,1000,0,0,0,0,0,0,0,0,0 }; + int bits[8] = { 8,16,0,32,2,4,0,0 }; + int freq = (frq >> 8) & 0xf; + + if (freqs[freq] == 0) + printk("%s: Unknown HT link frequency %x\n", name, freq); + else + printk("%s: %d MHz on main link, (%d in / %d out) bits width\n", + name, freqs[freq], + bits[(cfg >> 28) & 0x7], bits[(cfg >> 24) & 0x7]); +} + +void __init pmac_check_ht_link(void) +{ + u32 ufreq, freq, ucfg, cfg; + struct device_node *pcix_node; + u8 px_bus, px_devfn; + struct pci_controller *px_hose; + + (void)in_be32(u3_ht + U3_HT_LINK_COMMAND); + ucfg = cfg = in_be32(u3_ht + U3_HT_LINK_CONFIG); + ufreq = freq = in_be32(u3_ht + U3_HT_LINK_FREQ); + dump_HT_speeds("U3 HyperTransport", cfg, freq); + + pcix_node = of_find_compatible_node(NULL, "pci", "pci-x"); + if (pcix_node == NULL) { + printk("No PCI-X bridge found\n"); + return; + } + if (pci_device_from_OF_node(pcix_node, &px_bus, &px_devfn) != 0) { + printk("PCI-X bridge found but not matched to pci\n"); + return; + } + px_hose = pci_find_hose_for_OF_device(pcix_node); + if (px_hose == NULL) { + printk("PCI-X bridge found but not matched to host\n"); + return; + } + early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq); + dump_HT_speeds("PCI-X HT Uplink", cfg, freq); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xc8, &cfg); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xd0, &freq); + dump_HT_speeds("PCI-X HT Downlink", cfg, freq); +} + +#endif /* CONFIG_POWER4 */ diff -Nru a/arch/ppc/platforms/pmac_low_i2c.c b/arch/ppc/platforms/pmac_low_i2c.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/platforms/pmac_low_i2c.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,513 @@ +/* + * arch/ppc/platforms/pmac_low_i2c.c + * + * Copyright (C) 2003 Ben. Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * This file contains some low-level i2c access routines that + * need to be used by various bits of the PowerMac platform code + * at times where the real asynchronous & interrupt driven driver + * cannot be used. The API borrows some semantics from the darwin + * driver in order to ease the implementation of the platform + * properties parser + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_LOW_I2C_HOST 4 + +#if 1 +#define DBG(x...) do {\ + printk(KERN_DEBUG "KW:" x); \ + } while(0) +#else +#define DBGG(x...) +#endif + +struct low_i2c_host; + +typedef int (*low_i2c_func_t)(struct low_i2c_host *host, u8 addr, u8 sub, u8 *data, int len); + +struct low_i2c_host +{ + struct device_node *np; /* OF device node */ + struct semaphore mutex; /* Access mutex for use by i2c-keywest */ + low_i2c_func_t func; /* Access function */ + int is_open : 1; /* Poor man's access control */ + int mode; /* Current mode */ + int channel; /* Current channel */ + int num_channels; /* Number of channels */ + unsigned long base; /* For keywest-i2c, base address */ + int bsteps; /* And register stepping */ + int speed; /* And speed */ +}; + +static struct low_i2c_host low_i2c_hosts[MAX_LOW_I2C_HOST]; + +/* No locking is necessary on allocation, we are running way before + * anything can race with us + */ +static struct low_i2c_host *find_low_i2c_host(struct device_node *np) +{ + int i; + + for (i = 0; i < MAX_LOW_I2C_HOST; i++) + if (low_i2c_hosts[i].np == np) + return &low_i2c_hosts[i]; + return NULL; +} + +/* + * + * i2c-keywest implementation (UniNorth, U2, U3, Keylargo's) + * + */ + +/* + * Keywest i2c definitions borrowed from drivers/i2c/i2c-keywest.h, + * should be moved somewhere in include/asm-ppc/ + */ +/* Register indices */ +typedef enum { + reg_mode = 0, + reg_control, + reg_status, + reg_isr, + reg_ier, + reg_addr, + reg_subaddr, + reg_data +} reg_t; + + +/* Mode register */ +#define KW_I2C_MODE_100KHZ 0x00 +#define KW_I2C_MODE_50KHZ 0x01 +#define KW_I2C_MODE_25KHZ 0x02 +#define KW_I2C_MODE_DUMB 0x00 +#define KW_I2C_MODE_STANDARD 0x04 +#define KW_I2C_MODE_STANDARDSUB 0x08 +#define KW_I2C_MODE_COMBINED 0x0C +#define KW_I2C_MODE_MODE_MASK 0x0C +#define KW_I2C_MODE_CHAN_MASK 0xF0 + +/* Control register */ +#define KW_I2C_CTL_AAK 0x01 +#define KW_I2C_CTL_XADDR 0x02 +#define KW_I2C_CTL_STOP 0x04 +#define KW_I2C_CTL_START 0x08 + +/* Status register */ +#define KW_I2C_STAT_BUSY 0x01 +#define KW_I2C_STAT_LAST_AAK 0x02 +#define KW_I2C_STAT_LAST_RW 0x04 +#define KW_I2C_STAT_SDA 0x08 +#define KW_I2C_STAT_SCL 0x10 + +/* IER & ISR registers */ +#define KW_I2C_IRQ_DATA 0x01 +#define KW_I2C_IRQ_ADDR 0x02 +#define KW_I2C_IRQ_STOP 0x04 +#define KW_I2C_IRQ_START 0x08 +#define KW_I2C_IRQ_MASK 0x0F + +/* State machine states */ +enum { + state_idle, + state_addr, + state_read, + state_write, + state_stop, + state_dead +}; + +#define WRONG_STATE(name) do {\ + printk(KERN_DEBUG "KW: wrong state. Got %s, state: %s (isr: %02x)\n", \ + name, __kw_state_names[state], isr); \ + } while(0) + +static const char *__kw_state_names[] = { + "state_idle", + "state_addr", + "state_read", + "state_write", + "state_stop", + "state_dead" +}; + +static inline u8 __kw_read_reg(struct low_i2c_host *host, reg_t reg) +{ + return in_8(((volatile u8 *)host->base) + + (((unsigned)reg) << host->bsteps)); +} + +static inline void __kw_write_reg(struct low_i2c_host *host, reg_t reg, u8 val) +{ + out_8(((volatile u8 *)host->base) + + (((unsigned)reg) << host->bsteps), val); + (void)__kw_read_reg(host, reg_subaddr); +} + +#define kw_write_reg(reg, val) __kw_write_reg(host, reg, val) +#define kw_read_reg(reg) __kw_read_reg(host, reg) + + +/* Don't schedule, the g5 fan controller is too + * timing sensitive + */ +static u8 kw_wait_interrupt(struct low_i2c_host* host) +{ + int i; + u8 isr; + + for (i = 0; i < 200000; i++) { + isr = kw_read_reg(reg_isr) & KW_I2C_IRQ_MASK; + if (isr != 0) + return isr; + udelay(1); + } + return isr; +} + +static int kw_handle_interrupt(struct low_i2c_host *host, int state, int rw, int *rc, u8 **data, int *len, u8 isr) +{ + u8 ack; + + if (isr == 0) { + if (state != state_stop) { + DBG("KW: Timeout !\n"); + *rc = -EIO; + goto stop; + } + if (state == state_stop) { + ack = kw_read_reg(reg_status); + if (!(ack & KW_I2C_STAT_BUSY)) { + state = state_idle; + kw_write_reg(reg_ier, 0x00); + } + } + return state; + } + + if (isr & KW_I2C_IRQ_ADDR) { + ack = kw_read_reg(reg_status); + if (state != state_addr) { + kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR); + WRONG_STATE("KW_I2C_IRQ_ADDR"); + *rc = -EIO; + goto stop; + } + if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { + *rc = -ENODEV; + DBG("KW: NAK on address\n"); + return state_stop; + } else { + if (rw) { + state = state_read; + if (*len > 1) + kw_write_reg(reg_control, KW_I2C_CTL_AAK); + } else { + state = state_write; + kw_write_reg(reg_data, **data); + (*data)++; (*len)--; + } + } + kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR); + } + + if (isr & KW_I2C_IRQ_DATA) { + if (state == state_read) { + **data = kw_read_reg(reg_data); + (*data)++; (*len)--; + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + if ((*len) == 0) + state = state_stop; + else if ((*len) == 1) + kw_write_reg(reg_control, 0); + } else if (state == state_write) { + ack = kw_read_reg(reg_status); + if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { + DBG("KW: nack on data write\n"); + *rc = -EIO; + goto stop; + } else if (*len) { + kw_write_reg(reg_data, **data); + (*data)++; (*len)--; + } else { + kw_write_reg(reg_control, KW_I2C_CTL_STOP); + state = state_stop; + *rc = 0; + } + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + } else { + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + WRONG_STATE("KW_I2C_IRQ_DATA"); + if (state != state_stop) { + *rc = -EIO; + goto stop; + } + } + } + + if (isr & KW_I2C_IRQ_STOP) { + kw_write_reg(reg_isr, KW_I2C_IRQ_STOP); + if (state != state_stop) { + WRONG_STATE("KW_I2C_IRQ_STOP"); + *rc = -EIO; + } + return state_idle; + } + + if (isr & KW_I2C_IRQ_START) + kw_write_reg(reg_isr, KW_I2C_IRQ_START); + + return state; + + stop: + kw_write_reg(reg_control, KW_I2C_CTL_STOP); + return state_stop; +} + +static int keywest_low_i2c_func(struct low_i2c_host *host, u8 addr, u8 subaddr, u8 *data, int len) +{ + u8 mode_reg = host->speed; + int state = state_addr; + int rc = 0; + + /* Setup mode & subaddress if any */ + switch(host->mode) { + case pmac_low_i2c_mode_dumb: + printk(KERN_ERR "low_i2c: Dumb mode not supported !\n"); + return -EINVAL; + case pmac_low_i2c_mode_std: + mode_reg |= KW_I2C_MODE_STANDARD; + break; + case pmac_low_i2c_mode_stdsub: + mode_reg |= KW_I2C_MODE_STANDARDSUB; + kw_write_reg(reg_subaddr, subaddr); + break; + case pmac_low_i2c_mode_combined: + mode_reg |= KW_I2C_MODE_COMBINED; + kw_write_reg(reg_subaddr, subaddr); + break; + } + + /* Setup channel & clear pending irqs */ + kw_write_reg(reg_isr, kw_read_reg(reg_isr)); + kw_write_reg(reg_mode, mode_reg | (host->channel << 4)); + kw_write_reg(reg_status, 0); + + /* Set up address and r/w bit */ + kw_write_reg(reg_addr, addr); + + /* Start sending address & disable interrupt*/ + kw_write_reg(reg_ier, 0 /*KW_I2C_IRQ_MASK*/); + kw_write_reg(reg_control, KW_I2C_CTL_XADDR); + + /* State machine, to turn into an interrupt handler */ + while(state != state_idle) { + u8 isr = kw_wait_interrupt(host); + state = kw_handle_interrupt(host, state, addr & 1, &rc, &data, &len, isr); + } + + return rc; +} + +static void keywest_low_i2c_add(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(NULL); + unsigned long *psteps, *prate, steps, aoffset = 0; + struct device_node *parent; + + if (host == NULL) { + printk(KERN_ERR "low_i2c: Can't allocate host for %s\n", + np->full_name); + return; + } + memset(host, 0, sizeof(*host)); + + init_MUTEX(&host->mutex); + host->np = of_node_get(np); + psteps = (unsigned long *)get_property(np, "AAPL,address-step", NULL); + steps = psteps ? (*psteps) : 0x10; + for (host->bsteps = 0; (steps & 0x01) == 0; host->bsteps++) + steps >>= 1; + parent = of_get_parent(np); + host->num_channels = 1; + if (parent && parent->name[0] == 'u') { + host->num_channels = 2; + aoffset = 3; + } + /* Select interface rate */ + host->speed = KW_I2C_MODE_100KHZ; + prate = (unsigned long *)get_property(np, "AAPL,i2c-rate", NULL); + if (prate) switch(*prate) { + case 100: + host->speed = KW_I2C_MODE_100KHZ; + break; + case 50: + host->speed = KW_I2C_MODE_50KHZ; + break; + case 25: + host->speed = KW_I2C_MODE_25KHZ; + break; + } + host->mode = pmac_low_i2c_mode_std; + host->base = (unsigned long)ioremap(np->addrs[0].address + aoffset, + np->addrs[0].size); + host->func = keywest_low_i2c_func; +} + +/* + * + * PMU implementation + * + */ + + +#ifdef CONFIG_ADB_PMU + +static int pmu_low_i2c_func(struct low_i2c_host *host, u8 addr, u8 sub, u8 *data, int len) +{ + // TODO + return -ENODEV; +} + +static void pmu_low_i2c_add(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(NULL); + + if (host == NULL) { + printk(KERN_ERR "low_i2c: Can't allocate host for %s\n", + np->full_name); + return; + } + memset(host, 0, sizeof(*host)); + + init_MUTEX(&host->mutex); + host->np = of_node_get(np); + host->num_channels = 3; + host->mode = pmac_low_i2c_mode_std; + host->func = pmu_low_i2c_func; +} + +#endif /* CONFIG_ADB_PMU */ + +void __init pmac_init_low_i2c(void) +{ + struct device_node *np; + + /* Probe keywest-i2c busses */ + np = of_find_compatible_node(NULL, "i2c", "keywest-i2c"); + while(np) { + keywest_low_i2c_add(np); + np = of_find_compatible_node(np, "i2c", "keywest-i2c"); + } + +#ifdef CONFIG_ADB_PMU + /* Probe PMU busses */ + np = of_find_node_by_name(NULL, "via-pmu"); + if (np) + pmu_low_i2c_add(np); +#endif /* CONFIG_ADB_PMU */ + + /* TODO: Add CUDA support as well */ +} + +int pmac_low_i2c_lock(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + down(&host->mutex); + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_lock); + +int pmac_low_i2c_unlock(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + up(&host->mutex); + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_unlock); + + +int pmac_low_i2c_open(struct device_node *np, int channel) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + + if (channel >= host->num_channels) + return -EINVAL; + + down(&host->mutex); + host->is_open = 1; + host->channel = channel; + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_open); + +int pmac_low_i2c_close(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + + host->is_open = 0; + up(&host->mutex); + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_close); + +int pmac_low_i2c_setmode(struct device_node *np, int mode) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + WARN_ON(!host->is_open); + host->mode = mode; + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_setmode); + +int pmac_low_i2c_xfer(struct device_node *np, u8 addrdir, u8 subaddr, u8 *data, int len) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + WARN_ON(!host->is_open); + + return host->func(host, addrdir, subaddr, data, len); +} +EXPORT_SYMBOL(pmac_low_i2c_xfer); + diff -Nru a/arch/ppc/platforms/pmac_nvram.c b/arch/ppc/platforms/pmac_nvram.c --- a/arch/ppc/platforms/pmac_nvram.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/platforms/pmac_nvram.c Tue Feb 17 20:00:06 2004 @@ -8,8 +8,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Todo: - cleanup some coding horrors in the flash code - * - add support for the OF persistent properties + * Todo: - add support for the OF persistent properties */ #include #include @@ -21,29 +20,40 @@ #include #include #include +#include +#include +#include +#include +#include #include #include #include #include #include #include -#include -#include -#undef DEBUG +#define DEBUG + +#ifdef DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif #define NVRAM_SIZE 0x2000 /* 8kB of non-volatile RAM */ #define CORE99_SIGNATURE 0x5a #define CORE99_ADLER_START 0x14 -/* Core99 nvram is a flash */ -#define CORE99_FLASH_STATUS_DONE 0x80 -#define CORE99_FLASH_STATUS_ERR 0x38 -#define CORE99_FLASH_CMD_ERASE_CONFIRM 0xd0 -#define CORE99_FLASH_CMD_ERASE_SETUP 0x20 -#define CORE99_FLASH_CMD_RESET 0xff -#define CORE99_FLASH_CMD_WRITE_SETUP 0x40 +/* On Core99, nvram is either a sharp, a micron or an AMD flash */ +#define SM_FLASH_STATUS_DONE 0x80 +#define SM_FLASH_STATUS_ERR 0x38 +#define SM_FLASH_CMD_ERASE_CONFIRM 0xd0 +#define SM_FLASH_CMD_ERASE_SETUP 0x20 +#define SM_FLASH_CMD_RESET 0xff +#define SM_FLASH_CMD_WRITE_SETUP 0x40 +#define SM_FLASH_CMD_CLEAR_STATUS 0x50 +#define SM_FLASH_CMD_READ_STATUS 0x70 /* CHRP NVRAM header */ struct chrp_header { @@ -70,21 +80,110 @@ static int nvram_mult, is_core_99; static int core99_bank = 0; static int nvram_partitions[3]; - -/* FIXME: kmalloc fails to allocate the image now that I had to move it - * before time_init(). For now, I allocate a static buffer here - * but it's a waste of space on all but core99 machines - */ -#if 0 -static char* nvram_image; -#else -static char nvram_image[NVRAM_SIZE] __pmacdata; -#endif +static spinlock_t nv_lock = SPIN_LOCK_UNLOCKED; extern int pmac_newworld; +extern int system_running; + +static int (*core99_write_bank)(int bank, u8* datas); +static int (*core99_erase_bank)(int bank); + +static char *nvram_image __pmacdata; + + +static unsigned char __pmac core99_nvram_read_byte(int addr) +{ + if (nvram_image == NULL) + return 0xff; + return nvram_image[addr]; +} + +static void __pmac core99_nvram_write_byte(int addr, unsigned char val) +{ + if (nvram_image == NULL) + return; + nvram_image[addr] = val; +} + + +static unsigned char __openfirmware direct_nvram_read_byte(int addr) +{ + return in_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult]); +} + +static void __openfirmware direct_nvram_write_byte(int addr, unsigned char val) +{ + out_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult], val); +} + + +static unsigned char __pmac indirect_nvram_read_byte(int addr) +{ + unsigned char val; + unsigned long flags; + + spin_lock_irqsave(&nv_lock, flags); + out_8(nvram_addr, addr >> 5); + val = in_8(&nvram_data[(addr & 0x1f) << 4]); + spin_unlock_irqrestore(&nv_lock, flags); + + return val; +} + +static void __pmac indirect_nvram_write_byte(int addr, unsigned char val) +{ + unsigned long flags; + + spin_lock_irqsave(&nv_lock, flags); + out_8(nvram_addr, addr >> 5); + out_8(&nvram_data[(addr & 0x1f) << 4], val); + spin_unlock_irqrestore(&nv_lock, flags); +} + + +#ifdef CONFIG_ADB_PMU + +static void __pmac pmu_nvram_complete(struct adb_request *req) +{ + if (req->arg) + complete((struct completion *)req->arg); +} -static u8 __pmac -chrp_checksum(struct chrp_header* hdr) +static unsigned char __pmac pmu_nvram_read_byte(int addr) +{ + struct adb_request req; + DECLARE_COMPLETION(req_complete); + + req.arg = system_running ? &req_complete : NULL; + if (pmu_request(&req, pmu_nvram_complete, 3, PMU_READ_NVRAM, + (addr >> 8) & 0xff, addr & 0xff)) + return 0xff; + if (system_running) + wait_for_completion(&req_complete); + while (!req.complete) + pmu_poll(); + return req.reply[0]; +} + +static void __pmac pmu_nvram_write_byte(int addr, unsigned char val) +{ + struct adb_request req; + DECLARE_COMPLETION(req_complete); + + req.arg = system_running ? &req_complete : NULL; + if (pmu_request(&req, pmu_nvram_complete, 4, PMU_WRITE_NVRAM, + (addr >> 8) & 0xff, addr & 0xff, val)) + return; + if (system_running) + wait_for_completion(&req_complete); + while (!req.complete) + pmu_poll(); +} + +#endif /* CONFIG_ADB_PMU */ + + +static u8 __pmac chrp_checksum(struct chrp_header* hdr) { u8 *ptr; u16 sum = hdr->signature; @@ -95,8 +194,7 @@ return sum; } -static u32 __pmac -core99_calc_adler(u8 *buffer) +static u32 __pmac core99_calc_adler(u8 *buffer) { int cnt; u32 low, high; @@ -118,86 +216,186 @@ return (high << 16) | low; } -static u32 __pmac -core99_check(u8* datas) +static u32 __pmac core99_check(u8* datas) { struct core99_header* hdr99 = (struct core99_header*)datas; if (hdr99->hdr.signature != CORE99_SIGNATURE) { -#ifdef DEBUG - printk("Invalid signature\n"); -#endif + DBG("Invalid signature\n"); return 0; } if (hdr99->hdr.cksum != chrp_checksum(&hdr99->hdr)) { -#ifdef DEBUG - printk("Invalid checksum\n"); -#endif + DBG("Invalid checksum\n"); return 0; } if (hdr99->adler != core99_calc_adler(datas)) { -#ifdef DEBUG - printk("Invalid adler\n"); -#endif + DBG("Invalid adler\n"); return 0; } return hdr99->generation; } -static int __pmac -core99_erase_bank(int bank) +static int __pmac sm_erase_bank(int bank) { int stat, i; + unsigned long timeout; u8* base = (u8 *)nvram_data + core99_bank*NVRAM_SIZE; - out_8(base, CORE99_FLASH_CMD_ERASE_SETUP); - out_8(base, CORE99_FLASH_CMD_ERASE_CONFIRM); - do { stat = in_8(base); } - while(!(stat & CORE99_FLASH_STATUS_DONE)); - out_8(base, CORE99_FLASH_CMD_RESET); - if (stat & CORE99_FLASH_STATUS_ERR) { - printk("nvram: flash error 0x%02x on erase !\n", stat); - return -ENXIO; - } + DBG("nvram: Sharp/Micron Erasing bank %d...\n", bank); + + out_8(base, SM_FLASH_CMD_ERASE_SETUP); + out_8(base, SM_FLASH_CMD_ERASE_CONFIRM); + timeout = 0; + do { + if (++timeout > 1000000) { + printk(KERN_ERR "nvram: Sharp/Miron flash erase timeout !\n"); + break; + } + out_8(base, SM_FLASH_CMD_READ_STATUS); + stat = in_8(base); + } while (!(stat & SM_FLASH_STATUS_DONE)); + + out_8(base, SM_FLASH_CMD_CLEAR_STATUS); + out_8(base, SM_FLASH_CMD_RESET); + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: Sharp/Micron flash write timeout !\n"); + break; + } + out_8(base, SM_FLASH_CMD_READ_STATUS); + stat = in_8(base); + } while (!(stat & SM_FLASH_STATUS_DONE)); + if (!(stat & SM_FLASH_STATUS_DONE)) break; } - out_8(base, CORE99_FLASH_CMD_RESET); - if (stat & CORE99_FLASH_STATUS_ERR) { - printk("nvram: flash error 0x%02x on write !\n", stat); - return -ENXIO; + out_8(base, SM_FLASH_CMD_CLEAR_STATUS); + out_8(base, SM_FLASH_CMD_RESET); + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: AMD flash erase timeout !\n"); + break; + } + stat = in_8(base) ^ in_8(base); + } while (stat != 0); + + /* Reset */ + out_8(base, 0xf0); + udelay(1); + + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: AMD flash write timeout !\n"); + break; + } + stat = in_8(base) ^ in_8(base); + } while (stat != 0); + if (stat != 0) + break; } + + /* Reset */ + out_8(base, 0xf0); + udelay(1); + for (i=0; igeneration++; + hdr99->hdr.signature = CORE99_SIGNATURE; + hdr99->hdr.cksum = chrp_checksum(&hdr99->hdr); + hdr99->adler = core99_calc_adler(nvram_image); + core99_bank = core99_bank ? 0 : 1; + if (core99_erase_bank) + if (core99_erase_bank(core99_bank)) { + printk("nvram: Error erasing bank %d\n", core99_bank); + goto bail; + } + if (core99_write_bank) + if (core99_write_bank(core99_bank, nvram_image)) + printk("nvram: Error writing bank %d\n", core99_bank); + bail: + spin_unlock_irqrestore(&nv_lock, flags); + #ifdef DEBUG - printk("nvram: OF partition at 0x%x\n", nvram_partitions[pmac_nvram_OF]); - printk("nvram: XP partition at 0x%x\n", nvram_partitions[pmac_nvram_XPRAM]); - printk("nvram: NR partition at 0x%x\n", nvram_partitions[pmac_nvram_NR]); + mdelay(2000); #endif } -void __init -pmac_nvram_init(void) +void __init pmac_nvram_init(void) { struct device_node *dp; @@ -256,38 +488,65 @@ printk(KERN_ERR "nvram: no address\n"); return; } -#if 0 - nvram_image = kmalloc(NVRAM_SIZE, GFP_KERNEL); - if (!nvram_image) { - printk(KERN_ERR "nvram: can't allocate image\n"); + nvram_image = alloc_bootmem(NVRAM_SIZE); + if (nvram_image == NULL) { + printk(KERN_ERR "nvram: can't allocate ram image\n"); return; } -#endif nvram_data = ioremap(dp->addrs[0].address, NVRAM_SIZE*2); -#ifdef DEBUG - printk("nvram: Checking bank 0...\n"); -#endif + nvram_naddrs = 1; /* Make sure we get the correct case */ + + DBG("nvram: Checking bank 0...\n"); + gen_bank0 = core99_check((u8 *)nvram_data); gen_bank1 = core99_check((u8 *)nvram_data + NVRAM_SIZE); core99_bank = (gen_bank0 < gen_bank1) ? 1 : 0; -#ifdef DEBUG - printk("nvram: gen0=%d, gen1=%d\n", gen_bank0, gen_bank1); - printk("nvram: Active bank is: %d\n", core99_bank); -#endif + + DBG("nvram: gen0=%d, gen1=%d\n", gen_bank0, gen_bank1); + DBG("nvram: Active bank is: %d\n", core99_bank); + for (i=0; iaddrs[0].address + isa_mem_base, dp->addrs[0].size); nvram_mult = 1; + ppc_md.nvram_read_val = direct_nvram_read_byte; + ppc_md.nvram_write_val = direct_nvram_write_byte; } else if (nvram_naddrs == 1) { nvram_data = ioremap(dp->addrs[0].address, dp->addrs[0].size); nvram_mult = (dp->addrs[0].size + NVRAM_SIZE - 1) / NVRAM_SIZE; + ppc_md.nvram_read_val = direct_nvram_read_byte; + ppc_md.nvram_write_val = direct_nvram_write_byte; } else if (nvram_naddrs == 2) { nvram_addr = ioremap(dp->addrs[0].address, dp->addrs[0].size); nvram_data = ioremap(dp->addrs[1].address, dp->addrs[1].size); + ppc_md.nvram_read_val = indirect_nvram_read_byte; + ppc_md.nvram_write_val = indirect_nvram_write_byte; } else if (nvram_naddrs == 0 && sys_ctrler == SYS_CTRLER_PMU) { +#ifdef CONFIG_ADB_PMU nvram_naddrs = -1; + ppc_md.nvram_read_val = pmu_nvram_read_byte; + ppc_md.nvram_write_val = pmu_nvram_write_byte; +#endif /* CONFIG_ADB_PMU */ } else { printk(KERN_ERR "Don't know how to access NVRAM with %d addresses\n", nvram_naddrs); @@ -295,117 +554,31 @@ lookup_partitions(); } -void __pmac -pmac_nvram_update(void) -{ - struct core99_header* hdr99; - - if (!is_core_99 || !nvram_data || !nvram_image) - return; - if (!memcmp(nvram_image, (u8*)nvram_data + core99_bank*NVRAM_SIZE, - NVRAM_SIZE)) - return; -#ifdef DEBUG - printk("Updating nvram...\n"); -#endif - hdr99 = (struct core99_header*)nvram_image; - hdr99->generation++; - hdr99->hdr.signature = CORE99_SIGNATURE; - hdr99->hdr.cksum = chrp_checksum(&hdr99->hdr); - hdr99->adler = core99_calc_adler(nvram_image); - core99_bank = core99_bank ? 0 : 1; - if (core99_erase_bank(core99_bank)) { - printk("nvram: Error erasing bank %d\n", core99_bank); - return; - } - if (core99_write_bank(core99_bank, nvram_image)) - printk("nvram: Error writing bank %d\n", core99_bank); -} - -unsigned char __pmac -pmac_nvram_read_byte(int addr) -{ - switch (nvram_naddrs) { -#ifdef CONFIG_ADB_PMU - case -1: { - struct adb_request req; - - if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM, - (addr >> 8) & 0xff, addr & 0xff)) - break; - while (!req.complete) - pmu_poll(); - return req.reply[0]; - } -#endif - case 1: - if (is_core_99) - return nvram_image[addr]; - return nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult]; - case 2: - *nvram_addr = addr >> 5; - eieio(); - return nvram_data[(addr & 0x1f) << 4]; - } - return 0; -} - -void __pmac -pmac_nvram_write_byte(int addr, unsigned char val) -{ - switch (nvram_naddrs) { -#ifdef CONFIG_ADB_PMU - case -1: { - struct adb_request req; - - if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM, - (addr >> 8) & 0xff, addr & 0xff, val)) - break; - while (!req.complete) - pmu_poll(); - break; - } -#endif - case 1: - if (is_core_99) { - nvram_image[addr] = val; - break; - } - nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult] = val; - break; - case 2: - *nvram_addr = addr >> 5; - eieio(); - nvram_data[(addr & 0x1f) << 4] = val; - break; - } - eieio(); -} - -int __pmac -pmac_get_partition(int partition) +int __pmac pmac_get_partition(int partition) { return nvram_partitions[partition]; } -u8 __pmac -pmac_xpram_read(int xpaddr) +u8 __pmac pmac_xpram_read(int xpaddr) { int offset = nvram_partitions[pmac_nvram_XPRAM]; if (offset < 0) - return 0; + return 0xff; - return pmac_nvram_read_byte(xpaddr + offset); + return ppc_md.nvram_read_val(xpaddr + offset); } -void __pmac -pmac_xpram_write(int xpaddr, u8 data) +void __pmac pmac_xpram_write(int xpaddr, u8 data) { int offset = nvram_partitions[pmac_nvram_XPRAM]; if (offset < 0) return; - pmac_nvram_write_byte(data, xpaddr + offset); + ppc_md.nvram_write_val(xpaddr + offset, data); } + +EXPORT_SYMBOL(pmac_get_partition); +EXPORT_SYMBOL(pmac_xpram_read); +EXPORT_SYMBOL(pmac_xpram_write); diff -Nru a/arch/ppc/platforms/pmac_pci.c b/arch/ppc/platforms/pmac_pci.c --- a/arch/ppc/platforms/pmac_pci.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/pmac_pci.c Tue Feb 17 20:00:07 2004 @@ -1,13 +1,11 @@ /* * Support for PCI bridges found on Power Macintoshes. - * - * This includes support for bandit, chaos, grackle (motorola - * MPC106), and uninorth + * At present the "bandit" and "chaos" bridges are supported. + * Fortunately you access configuration space in the same + * way with either bridge. * * Copyright (C) 1997 Paul Mackerras (paulus@cs.anu.edu.au) * - * Maintained by Benjamin Herrenschmidt (benh@kernel.crashing.org) - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version @@ -30,11 +28,30 @@ #undef DEBUG -static void add_bridges(struct device_node *dev); +#ifdef DEBUG +#ifdef CONFIG_XMON +extern void xmon_printf(const char *fmt, ...); +#define DBG(x...) xmon_printf(x) +#else +#define DBG(x...) printk(x) +#endif +#else +#define DBG(x...) +#endif + +static int add_bridge(struct device_node *dev); +extern void pmac_check_ht_link(void); /* XXX Could be per-controller, but I don't think we risk anything by * assuming we won't have both UniNorth and Bandit */ static int has_uninorth; +#ifdef CONFIG_POWER4 +static struct pci_controller *u3_agp; +#endif /* CONFIG_POWER4 */ + +extern u8 pci_cache_line_size; + +struct pci_dev *k2_skiplist[2]; /* * Magic constants for enabling cache coherency in the bandit/PSX bridge. @@ -51,7 +68,7 @@ { for (; node != 0;node = node->sibling) { int * bus_range; - unsigned int *class_code; + unsigned int *class_code; int len; /* For PCI<->PCI bridges or CardBus bridges, we go down */ @@ -81,7 +98,7 @@ int * bus_range; int len; - /* Lookup the "bus-range" property for the hose */ + /* Lookup the "bus-range" property for the hose */ bus_range = (int *) get_property(bridge, "bus-range", &len); if (bus_range == NULL || len < 2 * sizeof(int)) { printk(KERN_WARNING "Can't get bus-range for %s\n", @@ -92,7 +109,7 @@ } /* - * Apple MacRISC (UniNorth, Bandit, Chaos) PCI controllers. + * Apple MacRISC (U3, UniNorth, Bandit, Chaos) PCI controllers. * * The "Bandit" version is present in all early PCI PowerMacs, * and up to the first ones using Grackle. Some machines may @@ -106,6 +123,11 @@ * The "UniNorth" version is present in all Core99 machines * (iBook, G4, new IMacs, and all the recent Apple machines). * It contains 3 controllers in one ASIC. + * + * The U3 is the bridge used on G5 machines. It contains on + * AGP bus which is dealt with the old UniNorth access routines + * and an HyperTransport bus which uses its own set of access + * functions. */ #define MACRISC_CFA0(devfn, off) \ @@ -211,12 +233,22 @@ static int __pmac chaos_validate_dev(struct pci_bus *bus, int devfn, int offset) { - if (pci_busdev_to_OF_node(bus, devfn) == 0) + struct device_node *np; + u32 *vendor, *device; + + np = pci_busdev_to_OF_node(bus, devfn); + if (np == NULL) return PCIBIOS_DEVICE_NOT_FOUND; - if (/*(dev->vendor == 0x106b) && (dev->device == 3) &&*/ (offset >= 0x10) - && (offset != 0x14) && (offset != 0x18) && (offset <= 0x24)) { + + vendor = (u32 *)get_property(np, "vendor-id", NULL); + device = (u32 *)get_property(np, "device-id", NULL); + if (vendor == NULL || device == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + + if ((*vendor == 0x106b) && (*device == 3) && (offset >= 0x10) + && (offset != 0x14) && (offset != 0x18) && (offset <= 0x24)) return PCIBIOS_BAD_REGISTER_NUMBER; - } + return PCIBIOS_SUCCESSFUL; } @@ -248,6 +280,128 @@ chaos_write_config }; +#ifdef CONFIG_POWER4 + +/* + * These versions of U3 HyperTransport config space access ops do not + * implement self-view of the HT host yet + */ + +#define U3_HT_CFA0(devfn, off) \ + ((((unsigned long)devfn) << 8) | offset) +#define U3_HT_CFA1(bus, devfn, off) \ + (U3_HT_CFA0(devfn, off) \ + + (((unsigned long)bus) << 16) \ + + 0x01000000UL) + +static unsigned long __pmac +u3_ht_cfg_access(struct pci_controller* hose, u8 bus, u8 devfn, u8 offset) +{ + if (bus == hose->first_busno) { + /* For now, we don't self probe U3 HT bridge */ + if (PCI_FUNC(devfn) != 0 || PCI_SLOT(devfn) > 7 || + PCI_SLOT(devfn) < 1) + return 0; + return ((unsigned long)hose->cfg_data) + U3_HT_CFA0(devfn, offset); + } else + return ((unsigned long)hose->cfg_data) + U3_HT_CFA1(bus, devfn, offset); +} + +static int __pmac +u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, int offset, + int len, u32 *val) +{ + struct pci_controller *hose = bus->sysdata; + unsigned int addr; + int i; + + /* + * When a device in K2 is powered down, we die on config + * cycle accesses. Fix that here. + */ + for (i=0; i<2; i++) + if (k2_skiplist[i] && k2_skiplist[i]->bus == bus && + k2_skiplist[i]->devfn == devfn) { + switch (len) { + case 1: + *val = 0xff; break; + case 2: + *val = 0xffff; break; + default: + *val = 0xfffffffful; break; + } + return PCIBIOS_SUCCESSFUL; + } + + addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + *val = in_8((u8 *)addr); + break; + case 2: + *val = in_le16((u16 *)addr); + break; + default: + *val = in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static int __pmac +u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, int offset, + int len, u32 val) +{ + struct pci_controller *hose = bus->sysdata; + unsigned int addr; + int i; + + /* + * When a device in K2 is powered down, we die on config + * cycle accesses. Fix that here. + */ + for (i=0; i<2; i++) + if (k2_skiplist[i] && k2_skiplist[i]->bus == bus && + k2_skiplist[i]->devfn == devfn) + return PCIBIOS_SUCCESSFUL; + + addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + out_8((u8 *)addr, val); + (void) in_8((u8 *)addr); + break; + case 2: + out_le16((u16 *)addr, val); + (void) in_le16((u16 *)addr); + break; + default: + out_le32((u32 *)addr, val); + (void) in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static struct pci_ops u3_ht_pci_ops = +{ + u3_ht_read_config, + u3_ht_write_config +}; + +#endif /* CONFIG_POWER4 */ /* * For a bandit bridge, turn on cache coherency if necessary. @@ -309,9 +463,7 @@ || strcmp(p2pbridge->parent->name, "pci") != 0) return; if (pci_device_from_OF_node(p2pbridge, &bus, &devfn) < 0) { -#ifdef DEBUG - printk("Can't find PCI infos for PCI<->PCI bridge\n"); -#endif + DBG("Can't find PCI infos for PCI<->PCI bridge\n"); return; } /* Warning: At this point, we have not yet renumbered all busses. @@ -319,9 +471,7 @@ */ hose = pci_find_hose_for_OF_device(p2pbridge); if (!hose) { -#ifdef DEBUG - printk("Can't find hose for PCI<->PCI bridge\n"); -#endif + DBG("Can't find hose for PCI<->PCI bridge\n"); return; } if (early_read_config_word(hose, bus, devfn, @@ -333,13 +483,114 @@ early_write_config_word(hose, bus, devfn, PCI_BRIDGE_CONTROL, val); } +/* + * Some Apple desktop machines have a NEC PD720100A USB2 controller + * on the motherboard. Open Firmware, on these, will disable the + * EHCI part of it so it behaves like a pair of OHCI's. This fixup + * code re-enables it ;) + */ +static void __init +fixup_nec_usb2(void) +{ + struct device_node *nec; + + for (nec = NULL; (nec = of_find_node_by_name(nec, "usb")) != NULL;) { + struct pci_controller *hose; + u32 data, *prop; + u8 bus, devfn; + + prop = (u32 *)get_property(nec, "vendor-id", NULL); + if (prop == NULL) + continue; + if (0x1033 != *prop) + continue; + prop = (u32 *)get_property(nec, "device-id", NULL); + if (prop == NULL) + continue; + if (0x0035 != *prop) + continue; + prop = (u32 *)get_property(nec, "reg", 0); + if (prop == NULL) + continue; + devfn = (prop[0] >> 8) & 0xff; + bus = (prop[0] >> 16) & 0xff; + if (PCI_FUNC(devfn) != 0) + continue; + hose = pci_find_hose_for_OF_device(nec); + if (!hose) + continue; + early_read_config_dword(hose, bus, devfn, 0xe4, &data); + if (data & 1UL) { + printk("Found NEC PD720100A USB2 chip with disabled EHCI, fixing up...\n"); + data &= ~1UL; + early_write_config_dword(hose, bus, devfn, 0xe4, data); + early_write_config_byte(hose, bus, devfn | 2, PCI_INTERRUPT_LINE, + nec->intrs[0].line); + } + } +} + void __init pmac_find_bridges(void) { - add_bridges(find_devices("bandit")); - add_bridges(find_devices("chaos")); - add_bridges(find_devices("pci")); + struct device_node *np, *root; + struct device_node *ht = NULL; + + root = of_find_node_by_path("/"); + if (root == NULL) { + printk(KERN_CRIT "pmac_find_bridges: can't find root of device tree\n"); + return; + } + for (np = NULL; (np = of_get_next_child(root, np)) != NULL;) { + if (np->name == NULL) + continue; + if (strcmp(np->name, "bandit") == 0 + || strcmp(np->name, "chaos") == 0 + || strcmp(np->name, "pci") == 0) { + if (add_bridge(np) == 0) + of_node_get(np); + } + if (strcmp(np->name, "ht") == 0) { + of_node_get(np); + ht = np; + } + } + of_node_put(root); + + /* Probe HT last as it relies on the agp resources to be already + * setup + */ + if (ht && add_bridge(ht) != 0) + of_node_put(ht); + init_p2pbridge(); + fixup_nec_usb2(); +#ifdef CONFIG_POWER4 + /* There is something wrong with DMA on U3/HT. I haven't figured out + * the details yet, but if I set the cache line size to 128 bytes like + * it should, I'm getting memory corruption caused by devices like + * sungem (even without the MWI bit set, but maybe sungem doesn't + * care). Right now, it appears that setting up a 64 bytes line size + * works properly, 64 bytes beeing the max transfer size of HT, I + * suppose this is related the way HT/PCI are hooked together. I still + * need to dive into more specs though to be really sure of what's + * going on. --BenH. + * + * Ok, apparently, it's just that HT can't do more than 64 bytes + * transactions. MWI seem to be meaningless there as well, it may + * be worth nop'ing out pci_set_mwi too though I haven't done that + * yet. + * + * Note that it's a bit different for whatever is in the AGP slot. + * For now, I don't care, but this can become a real issue, we + * should probably hook pci_set_mwi anyway to make sure it sets + * the real cache line size in there. + */ + if (machine_is_compatible("MacRISC4")) + pci_cache_line_size = 16; /* 64 bytes */ + + pmac_check_ht_link(); +#endif /* CONFIG_POWER4 */ } #define GRACKLE_CFA(b, d, o) (0x80 | ((b) << 8) | ((d) << 16) \ @@ -410,6 +661,118 @@ ioremap(addr->address + 0xc00000, 0x1000); } +#ifdef CONFIG_POWER4 + +static void __init +setup_u3_agp(struct pci_controller* hose, struct reg_property* addr) +{ + /* On G5, we move AGP up to high bus number so we don't need + * to reassign bus numbers for HT. If we ever have P2P bridges + * on AGP, we'll have to move pci_assign_all_busses to the + * pci_controller structure so we enable it for AGP and not for + * HT childs. + * We hard code the address because of the different size of + * the reg address cell, we shall fix that by killing struct + * reg_property and using some accessor functions instead + */ + hose->first_busno = 0xf0; + hose->last_busno = 0xff; + has_uninorth = 1; + hose->ops = ¯isc_pci_ops; + hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000); + hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000); + + u3_agp = hose; +} + +static void __init +setup_u3_ht(struct pci_controller* hose, struct reg_property *addr) +{ + struct device_node *np = (struct device_node *)hose->arch_data; + int i, cur; + + hose->ops = &u3_ht_pci_ops; + + /* We hard code the address because of the different size of + * the reg address cell, we shall fix that by killing struct + * reg_property and using some accessor functions instead + */ + hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000, 0x02000000); + + /* + * /ht node doesn't expose a "ranges" property, so we "remove" regions that + * have been allocated to AGP. So far, this version of the code doesn't assign + * any of the 0xfxxxxxxx "fine" memory regions to /ht. + * We need to fix that sooner or later by either parsing all child "ranges" + * properties or figuring out the U3 address space decoding logic and + * then read it's configuration register (if any). + */ + hose->io_base_phys = 0xf4000000 + 0x00400000; + hose->io_base_virt = ioremap(hose->io_base_phys, 0x00400000); + isa_io_base = (unsigned long) hose->io_base_virt; + hose->io_resource.name = np->full_name; + hose->io_resource.start = 0; + hose->io_resource.end = 0x003fffff; + hose->io_resource.flags = IORESOURCE_IO; + hose->pci_mem_offset = 0; + hose->first_busno = 0; + hose->last_busno = 0xef; + hose->mem_resources[0].name = np->full_name; + hose->mem_resources[0].start = 0x80000000; + hose->mem_resources[0].end = 0xefffffff; + hose->mem_resources[0].flags = IORESOURCE_MEM; + + if (u3_agp == NULL) { + DBG("U3 has no AGP, using full resource range\n"); + return; + } + + /* We "remove" the AGP resources from the resources allocated to HT, that + * is we create "holes". However, that code does assumptions that so far + * happen to be true (cross fingers...), typically that resources in the + * AGP node are properly ordered + */ + cur = 0; + for (i=0; i<3; i++) { + struct resource *res = &u3_agp->mem_resources[i]; + if (res->flags != IORESOURCE_MEM) + continue; + /* We don't care about "fine" resources */ + if (res->start >= 0xf0000000) + continue; + /* Check if it's just a matter of "shrinking" us in one direction */ + if (hose->mem_resources[cur].start == res->start) { + DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n", + cur, hose->mem_resources[cur].start, res->end + 1); + hose->mem_resources[cur].start = res->end + 1; + continue; + } + if (hose->mem_resources[cur].end == res->end) { + DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n", + cur, hose->mem_resources[cur].end, res->start - 1); + hose->mem_resources[cur].end = res->start - 1; + continue; + } + /* No, it's not the case, we need a hole */ + if (cur == 2) { + /* not enough resources to make a hole, we drop part of the range */ + printk(KERN_WARNING "Running out of resources for /ht host !\n"); + hose->mem_resources[cur].end = res->start - 1; + continue; + } + cur++; + DBG("U3/HT: hole, %d end at %08lx, %d start at %08lx\n", + cur-1, res->start - 1, cur, res->end + 1); + hose->mem_resources[cur].name = np->full_name; + hose->mem_resources[cur].flags = IORESOURCE_MEM; + hose->mem_resources[cur].start = res->end + 1; + hose->mem_resources[cur].end = hose->mem_resources[cur-1].end; + hose->mem_resources[cur-1].end = res->start - 1; + } +} + +#endif /* CONFIG_POWER4 */ + void __init setup_grackle(struct pci_controller *hose) { @@ -426,69 +789,77 @@ * "pci" (a MPC106) and no bandit or chaos bridges, and contrariwise, * if we have one or more bandit or chaos bridges, we don't have a MPC106. */ -static void __init -add_bridges(struct device_node *dev) +static int __init +add_bridge(struct device_node *dev) { int len; struct pci_controller *hose; struct reg_property *addr; char* disp_name; int *bus_range; - int first = 1, primary; + int primary = 1; - for (; dev != NULL; dev = dev->next) { - addr = (struct reg_property *) get_property(dev, "reg", &len); - if (addr == NULL || len < sizeof(*addr)) { - printk(KERN_WARNING "Can't use %s: no address\n", - dev->full_name); - continue; - } - bus_range = (int *) get_property(dev, "bus-range", &len); - if (bus_range == NULL || len < 2 * sizeof(int)) { - printk(KERN_WARNING "Can't get bus-range for %s, assume bus 0\n", - dev->full_name); - } - - hose = pcibios_alloc_controller(); - if (!hose) - continue; - hose->arch_data = dev; - hose->first_busno = bus_range ? bus_range[0] : 0; - hose->last_busno = bus_range ? bus_range[1] : 0xff; - - disp_name = NULL; - primary = first; - if (device_is_compatible(dev, "uni-north")) { - primary = setup_uninorth(hose, addr); - disp_name = "UniNorth"; - } else if (strcmp(dev->name, "pci") == 0) { - /* XXX assume this is a mpc106 (grackle) */ - setup_grackle(hose); - disp_name = "Grackle (MPC106)"; - } else if (strcmp(dev->name, "bandit") == 0) { - setup_bandit(hose, addr); - disp_name = "Bandit"; - } else if (strcmp(dev->name, "chaos") == 0) { - setup_chaos(hose, addr); - disp_name = "Chaos"; - primary = 0; - } - printk(KERN_INFO "Found %s PCI host bridge at 0x%08x. Firmware bus number: %d->%d\n", - disp_name, addr->address, hose->first_busno, hose->last_busno); -#ifdef DEBUG - printk(" ->Hose at 0x%08lx, cfg_addr=0x%08lx,cfg_data=0x%08lx\n", - hose, hose->cfg_addr, hose->cfg_data); -#endif - - /* Interpret the "ranges" property */ - /* This also maps the I/O region and sets isa_io/mem_base */ - pci_process_bridge_OF_ranges(hose, dev, primary); + DBG("Adding PCI host bridge %s\n", dev->full_name); - /* Fixup "bus-range" OF property */ - fixup_bus_range(dev); + addr = (struct reg_property *) get_property(dev, "reg", &len); + if (addr == NULL || len < sizeof(*addr)) { + printk(KERN_WARNING "Can't use %s: no address\n", + dev->full_name); + return -ENODEV; + } + bus_range = (int *) get_property(dev, "bus-range", &len); + if (bus_range == NULL || len < 2 * sizeof(int)) { + printk(KERN_WARNING "Can't get bus-range for %s, assume bus 0\n", + dev->full_name); + } + + hose = pcibios_alloc_controller(); + if (!hose) + return -ENOMEM; + hose->arch_data = dev; + hose->first_busno = bus_range ? bus_range[0] : 0; + hose->last_busno = bus_range ? bus_range[1] : 0xff; + + disp_name = NULL; +#ifdef CONFIG_POWER4 + if (device_is_compatible(dev, "u3-agp")) { + setup_u3_agp(hose, addr); + disp_name = "U3-AGP"; + primary = 0; + } else if (device_is_compatible(dev, "u3-ht")) { + setup_u3_ht(hose, addr); + disp_name = "U3-HT"; + primary = 1; + } else +#endif /* CONFIG_POWER4 */ + if (device_is_compatible(dev, "uni-north")) { + primary = setup_uninorth(hose, addr); + disp_name = "UniNorth"; + } else if (strcmp(dev->name, "pci") == 0) { + /* XXX assume this is a mpc106 (grackle) */ + setup_grackle(hose); + disp_name = "Grackle (MPC106)"; + } else if (strcmp(dev->name, "bandit") == 0) { + setup_bandit(hose, addr); + disp_name = "Bandit"; + } else if (strcmp(dev->name, "chaos") == 0) { + setup_chaos(hose, addr); + disp_name = "Chaos"; + primary = 0; + } + printk(KERN_INFO "Found %s PCI host bridge at 0x%08x. Firmware bus number: %d->%d\n", + disp_name, addr->address, hose->first_busno, hose->last_busno); + DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", + hose, hose->cfg_addr, hose->cfg_data); + + /* Interpret the "ranges" property */ + /* This also maps the I/O region and sets isa_io/mem_base */ + pci_process_bridge_OF_ranges(hose, dev, primary); - first &= !primary; - } + /* Fixup "bus-range" OF property */ + fixup_bus_range(dev); + + return 0; } static void __init @@ -575,7 +946,7 @@ cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE; pci_write_config_word(dev, PCI_COMMAND, cmd); pci_write_config_byte(dev, PCI_LATENCY_TIMER, 16); - pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8); + pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, pci_cache_line_size); } return 0; @@ -628,3 +999,108 @@ } } +void pmac_pci_fixup_cardbus(struct pci_dev* dev) +{ + if (_machine != _MACH_Pmac) + return; + /* + * Fix the interrupt routing on the various cardbus bridges + * used on powerbooks + */ + if (dev->vendor != PCI_VENDOR_ID_TI) + return; + if (dev->device == PCI_DEVICE_ID_TI_1130 || + dev->device == PCI_DEVICE_ID_TI_1131) { + u8 val; + /* Enable PCI interrupt */ + if (pci_read_config_byte(dev, 0x91, &val) == 0) + pci_write_config_byte(dev, 0x91, val | 0x30); + /* Disable ISA interrupt mode */ + if (pci_read_config_byte(dev, 0x92, &val) == 0) + pci_write_config_byte(dev, 0x92, val & ~0x06); + } + if (dev->device == PCI_DEVICE_ID_TI_1210 || + dev->device == PCI_DEVICE_ID_TI_1211 || + dev->device == PCI_DEVICE_ID_TI_1410 || + dev->device == PCI_DEVICE_ID_TI_1510) { + u8 val; + /* 0x8c == TI122X_IRQMUX, 2 says to route the INTA + signal out the MFUNC0 pin */ + if (pci_read_config_byte(dev, 0x8c, &val) == 0) + pci_write_config_byte(dev, 0x8c, (val & ~0x0f) | 2); + /* Disable ISA interrupt mode */ + if (pci_read_config_byte(dev, 0x92, &val) == 0) + pci_write_config_byte(dev, 0x92, val & ~0x06); + } +} + +void pmac_pci_fixup_pciata(struct pci_dev* dev) +{ + u8 progif = 0; + + /* + * On PowerMacs, we try to switch any PCI ATA controller to + * fully native mode + */ + if (_machine != _MACH_Pmac) + return; + /* Some controllers don't have the class IDE */ + if (dev->vendor == PCI_VENDOR_ID_PROMISE) + switch(dev->device) { + case PCI_DEVICE_ID_PROMISE_20246: + case PCI_DEVICE_ID_PROMISE_20262: + case PCI_DEVICE_ID_PROMISE_20263: + case PCI_DEVICE_ID_PROMISE_20265: + case PCI_DEVICE_ID_PROMISE_20267: + case PCI_DEVICE_ID_PROMISE_20268: + case PCI_DEVICE_ID_PROMISE_20269: + case PCI_DEVICE_ID_PROMISE_20270: + case PCI_DEVICE_ID_PROMISE_20271: + case PCI_DEVICE_ID_PROMISE_20275: + case PCI_DEVICE_ID_PROMISE_20276: + case PCI_DEVICE_ID_PROMISE_20277: + goto good; + } + /* Others, check PCI class */ + if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) + return; + good: + pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); + if ((progif & 5) != 5) { + printk(KERN_INFO "Forcing PCI IDE into native mode: %s\n", pci_name(dev)); + (void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5); + if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || + (progif & 5) != 5) + printk(KERN_ERR "Rewrite of PROGIF failed !\n"); + } +} + +/* + * Disable second function on K2-SATA, it's broken + * and disable IO BARs on first one + */ +void __pmac pmac_pci_fixup_k2_sata(struct pci_dev* dev) +{ + int i; + u16 cmd; + + if (PCI_FUNC(dev->devfn) > 0) { + pci_read_config_word(dev, PCI_COMMAND, &cmd); + cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY); + pci_write_config_word(dev, PCI_COMMAND, cmd); + for (i = 0; i < 6; i++) { + dev->resource[i].start = dev->resource[i].end = 0; + dev->resource[i].flags = 0; + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); + } + } else { + pci_read_config_word(dev, PCI_COMMAND, &cmd); + cmd &= ~PCI_COMMAND_IO; + pci_write_config_word(dev, PCI_COMMAND, cmd); + for (i = 0; i < 5; i++) { + dev->resource[i].start = dev->resource[i].end = 0; + dev->resource[i].flags = 0; + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); + } + } +} diff -Nru a/arch/ppc/platforms/pmac_pic.c b/arch/ppc/platforms/pmac_pic.c --- a/arch/ppc/platforms/pmac_pic.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/pmac_pic.c Tue Feb 17 20:00:08 2004 @@ -34,6 +34,7 @@ #include #include #include +#include #include "pmac_pic.h" @@ -363,32 +364,76 @@ return irqctrler->intrs[0].line; } -void __init -pmac_pic_init(void) +#ifdef CONFIG_POWER4 +static irqreturn_t k2u3_action(int cpl, void *dev_id, struct pt_regs *regs) +{ + int irq; + + irq = openpic2_get_irq(regs); + if (irq != -1) + ppc_irq_dispatch_handler(regs, irq); + return IRQ_HANDLED; +} +#endif /* CONFIG_POWER4 */ + +void __init pmac_pic_init(void) { int i; - struct device_node *irqctrler; + struct device_node *irqctrler = NULL; + struct device_node *irqctrler2 = NULL; + struct device_node *np; unsigned long addr; int irq_cascade = -1; /* We first try to detect Apple's new Core99 chipset, since mac-io * is quite different on those machines and contains an IBM MPIC2. */ - irqctrler = find_type_devices("open-pic"); + np = find_type_devices("open-pic"); + while(np) { + if (np->parent && !strcmp(np->parent->name, "u3")) + irqctrler2 = np; + else + irqctrler = np; + np = np->next; + } if (irqctrler != NULL) { - printk("PowerMac using OpenPIC irq controller\n"); if (irqctrler->n_addrs > 0) { - unsigned char senses[NR_IRQS]; + unsigned char senses[128]; + + printk(KERN_INFO "PowerMac using OpenPIC irq controller at 0x%08x\n", + irqctrler->addrs[0].address); - prom_get_irq_senses(senses, 0, NR_IRQS); + prom_get_irq_senses(senses, 0, 128); OpenPIC_InitSenses = senses; - OpenPIC_NumInitSenses = NR_IRQS; + OpenPIC_NumInitSenses = 128; ppc_md.get_irq = openpic_get_irq; + pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler, 0, 0); OpenPIC_Addr = ioremap(irqctrler->addrs[0].address, irqctrler->addrs[0].size); openpic_init(0); + +#ifdef CONFIG_POWER4 + if (irqctrler2 != NULL && irqctrler2->n_intrs > 0 && + irqctrler2->n_addrs > 0) { + printk(KERN_INFO "Slave OpenPIC at 0x%08x hooked on IRQ %d\n", + irqctrler2->addrs[0].address, + irqctrler2->intrs[0].line); + pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler2, 0, 0); + OpenPIC2_Addr = ioremap(irqctrler2->addrs[0].address, + irqctrler2->addrs[0].size); + prom_get_irq_senses(senses, PMAC_OPENPIC2_OFFSET, + PMAC_OPENPIC2_OFFSET+128); + OpenPIC_InitSenses = senses; + OpenPIC_NumInitSenses = 128; + openpic2_init(PMAC_OPENPIC2_OFFSET); + if (request_irq(irqctrler2->intrs[0].line, k2u3_action, 0, + "U3->K2 Cascade", NULL)) + printk("Unable to get OpenPIC IRQ for cascade\n"); + } +#endif /* CONFIG_POWER4 */ + #ifdef CONFIG_XMON { struct device_node* pswitch; diff -Nru a/arch/ppc/platforms/pmac_setup.c b/arch/ppc/platforms/pmac_setup.c --- a/arch/ppc/platforms/pmac_setup.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/pmac_setup.c Tue Feb 17 20:00:07 2004 @@ -332,7 +332,7 @@ #ifdef CONFIG_SMP /* Check for Core99 */ - if (find_devices("uni-n")) + if (find_devices("uni-n") || find_devices("u3")) ppc_md.smp_ops = &core99_smp_ops; else ppc_md.smp_ops = &psurge_smp_ops; @@ -469,10 +469,6 @@ struct adb_request req; #endif /* CONFIG_ADB_CUDA */ -#ifdef CONFIG_NVRAM - pmac_nvram_update(); -#endif - switch (sys_ctrler) { #ifdef CONFIG_ADB_CUDA case SYS_CTRLER_CUDA: @@ -498,10 +494,6 @@ struct adb_request req; #endif /* CONFIG_ADB_CUDA */ -#ifdef CONFIG_NVRAM - pmac_nvram_update(); -#endif - switch (sys_ctrler) { #ifdef CONFIG_ADB_CUDA case SYS_CTRLER_CUDA: @@ -637,11 +629,6 @@ ppc_md.get_rtc_time = pmac_get_rtc_time; ppc_md.calibrate_decr = pmac_calibrate_decr; -#ifdef CONFIG_NVRAM - ppc_md.nvram_read_val = pmac_nvram_read_byte; - ppc_md.nvram_write_val = pmac_nvram_write_byte; -#endif - ppc_md.find_end_of_memory = pmac_find_end_of_memory; ppc_md.feature_call = pmac_do_feature_call; @@ -682,6 +669,14 @@ for (np = np->child; np != NULL; np = np->sibling) if (strncmp(np->name, "i2c", 3) == 0) { of_platform_device_create(np, "uni-n-i2c"); + break; + } + } + np = find_devices("u3"); + if (np) { + for (np = np->child; np != NULL; np = np->sibling) + if (strncmp(np->name, "i2c", 3) == 0) { + of_platform_device_create(np, "u3-i2c"); break; } } diff -Nru a/arch/ppc/platforms/pmac_smp.c b/arch/ppc/platforms/pmac_smp.c --- a/arch/ppc/platforms/pmac_smp.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/pmac_smp.c Tue Feb 17 20:00:07 2004 @@ -119,8 +119,7 @@ /* Sync flag for HW tb sync */ static volatile int sec_tb_reset = 0; -static void __init -core99_init_caches(int cpu) +static void __init core99_init_caches(int cpu) { if (!(cur_cpu_spec[0]->cpu_features & CPU_FTR_L2CR)) return; @@ -188,8 +187,7 @@ */ static unsigned long psurge_smp_message[NR_CPUS]; -void __pmac -psurge_smp_message_recv(struct pt_regs *regs) +void __pmac psurge_smp_message_recv(struct pt_regs *regs) { int cpu = smp_processor_id(); int msg; @@ -206,15 +204,14 @@ smp_message_recv(msg, regs); } -irqreturn_t __pmac -psurge_primary_intr(int irq, void *d, struct pt_regs *regs) +irqreturn_t __pmac psurge_primary_intr(int irq, void *d, struct pt_regs *regs) { psurge_smp_message_recv(regs); return IRQ_HANDLED; } -static void __pmac -smp_psurge_message_pass(int target, int msg, unsigned long data, int wait) +static void __pmac smp_psurge_message_pass(int target, int msg, unsigned long data, + int wait) { int i; @@ -410,8 +407,7 @@ smp_tb_synchronized = 1; } -static void __init -smp_psurge_setup_cpu(int cpu_nr) +static void __init smp_psurge_setup_cpu(int cpu_nr) { if (cpu_nr == 0) { @@ -435,41 +431,54 @@ psurge_dual_sync_tb(cpu_nr); } -void __init -smp_psurge_take_timebase(void) +void __init smp_psurge_take_timebase(void) { /* Dummy implementation */ } -void __init -smp_psurge_give_timebase(void) +void __init smp_psurge_give_timebase(void) { /* Dummy implementation */ } -static int __init -smp_core99_probe(void) +static int __init smp_core99_probe(void) { +#ifdef CONFIG_6xx extern int powersave_nap; - struct device_node *cpus; - int i, ncpus = 1; +#endif + struct device_node *cpus, *firstcpu; + int i, ncpus = 0, boot_cpu = -1; u32 *tbprop; if (ppc_md.progress) ppc_md.progress("smp_core99_probe", 0x345); - cpus = find_type_devices("cpu"); - if (cpus == NULL) - return 0; - - tbprop = (u32 *)get_property(cpus, "timebase-enable", NULL); - if (tbprop) - core99_tb_gpio = *tbprop; - else - core99_tb_gpio = KL_GPIO_TB_ENABLE; + cpus = firstcpu = find_type_devices("cpu"); + while(cpus != NULL) { + u32 *regprop = (u32 *)get_property(cpus, "reg", NULL); + char *stateprop = (char *)get_property(cpus, "state", NULL); + if (regprop != NULL && stateprop != NULL && + !strncmp(stateprop, "running", 7)) + boot_cpu = *regprop; + ++ncpus; + cpus = cpus->next; + } + if (boot_cpu == -1) + printk(KERN_WARNING "Couldn't detect boot CPU !\n"); + if (boot_cpu != 0) + printk(KERN_WARNING "Boot CPU is %d, unsupported setup !\n", boot_cpu); - while ((cpus = cpus->next) != NULL) - ++ncpus; + if (machine_is_compatible("MacRISC4")) { + extern struct smp_ops_t core99_smp_ops; - printk("smp_core99_probe: found %d cpus\n", ncpus); + core99_smp_ops.take_timebase = smp_generic_take_timebase; + core99_smp_ops.give_timebase = smp_generic_give_timebase; + } else { + if (firstcpu != NULL) + tbprop = (u32 *)get_property(firstcpu, "timebase-enable", NULL); + if (tbprop) + core99_tb_gpio = *tbprop; + else + core99_tb_gpio = KL_GPIO_TB_ENABLE; + } if (ncpus > 1) { openpic_request_IPIs(); @@ -484,8 +493,7 @@ return ncpus; } -static void __init -smp_core99_kick_cpu(int nr) +static void __init smp_core99_kick_cpu(int nr) { unsigned long save_vector, new_vector; unsigned long flags; @@ -539,23 +547,31 @@ if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu done", 0x347); } -static void __init -smp_core99_setup_cpu(int cpu_nr) +static void __init smp_core99_setup_cpu(int cpu_nr) { - /* Setup some registers */ + /* Setup L2/L3 */ if (cpu_nr != 0) core99_init_caches(cpu_nr); /* Setup openpic */ do_openpic_setup_cpu(); - /* Setup L2/L3 */ - if (cpu_nr == 0) + if (cpu_nr == 0) { +#ifdef CONFIG_POWER4 + extern void g5_phy_disable_cpu1(void); + + /* If we didn't start the second CPU, we must take + * it off the bus + */ + if (machine_is_compatible("MacRISC4") && + num_online_cpus() < 2) + g5_phy_disable_cpu1(); +#endif /* CONFIG_POWER4 */ if (ppc_md.progress) ppc_md.progress("core99_setup_cpu 0 done", 0x349); + } } -void __init -smp_core99_take_timebase(void) +void __init smp_core99_take_timebase(void) { /* Secondary processor "takes" the timebase by freezing * it, resetting its local TB and telling CPU 0 to go on @@ -572,8 +588,7 @@ sec_tb_reset = 1; } -void __init -smp_core99_give_timebase(void) +void __init smp_core99_give_timebase(void) { unsigned int t; diff -Nru a/arch/ppc/platforms/pmac_time.c b/arch/ppc/platforms/pmac_time.c --- a/arch/ppc/platforms/pmac_time.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/platforms/pmac_time.c Tue Feb 17 20:00:06 2004 @@ -266,6 +266,14 @@ if (via_calibrate_decr()) return; + /* Special case: QuickSilver G4s seem to have a badly calibrated + * timebase-frequency in OF, VIA is much better on these. We should + * probably implement calibration based on the KL timer on these + * machines anyway... -BenH + */ + if (machine_is_compatible("PowerMac3,5")) + if (via_calibrate_decr()) + return; /* * The cpu node should have a timebase-frequency property * to tell us the rate at which the decrementer counts. diff -Nru a/arch/ppc/platforms/prep_pci.c b/arch/ppc/platforms/prep_pci.c --- a/arch/ppc/platforms/prep_pci.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/prep_pci.c Tue Feb 17 20:00:08 2004 @@ -1171,8 +1171,6 @@ prep_pcibios_fixup(void) { struct pci_dev *dev = NULL; - extern unsigned char *Motherboard_map; - extern unsigned char *Motherboard_routes; prep_route_pci_interrupts(); diff -Nru a/arch/ppc/platforms/prep_setup.c b/arch/ppc/platforms/prep_setup.c --- a/arch/ppc/platforms/prep_setup.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/prep_setup.c Tue Feb 17 20:00:08 2004 @@ -58,16 +58,14 @@ #include #include #include +#include + +TODC_ALLOC(); unsigned char ucSystemType; unsigned char ucBoardRev; unsigned char ucBoardRevMaj, ucBoardRevMin; -extern unsigned long mc146818_get_rtc_time(void); -extern int mc146818_set_rtc_time(unsigned long nowtime); -extern unsigned long mk48t59_get_rtc_time(void); -extern int mk48t59_set_rtc_time(unsigned long nowtime); - extern unsigned char prep_nvram_read_val(int addr); extern void prep_nvram_write_val(int addr, unsigned char val); @@ -814,12 +812,12 @@ } /* - * Determine the decrementer frequency from the residual data - * This allows for a faster boot as we do not need to calibrate the - * decrementer against another clock. This is important for embedded systems. + * First, see if we can get this information from the residual data. + * This is important on some IBM PReP systems. If we cannot, we let the + * TODC code handle doing this. */ -static int __init -prep_res_calibrate_decr(void) +static void __init +prep_calibrate_decr(void) { #ifdef CONFIG_PREP_RESIDUAL unsigned long freq, divisor = 4; @@ -831,149 +829,9 @@ (freq/divisor)%1000000); tb_to_us = mulhwu_scale_factor(freq/divisor, 1000000); tb_ticks_per_jiffy = freq / HZ / divisor; - return 0; } else #endif - return 1; -} - -/* - * Uses the on-board timer to calibrate the on-chip decrementer register - * for prep systems. On the pmac the OF tells us what the frequency is - * but on prep we have to figure it out. - * -- Cort - */ -/* Done with 3 interrupts: the first one primes the cache and the - * 2 following ones measure the interval. The precision of the method - * is still doubtful due to the short interval sampled. - */ -static volatile int calibrate_steps __initdata = 3; -static unsigned tbstamp __initdata = 0; - -static irqreturn_t __init -prep_calibrate_decr_handler(int irq, void *dev, struct pt_regs *regs) -{ - unsigned long t, freq; - int step=--calibrate_steps; - - t = get_tbl(); - if (step > 0) { - tbstamp = t; - } else { - freq = (t - tbstamp)*HZ; - printk("time_init: decrementer frequency = %lu.%.6lu MHz\n", - freq/1000000, freq%1000000); - tb_ticks_per_jiffy = freq / HZ; - tb_to_us = mulhwu_scale_factor(freq, 1000000); - } - return IRQ_HANDLED; -} - -static void __init -prep_calibrate_decr(void) -{ - int res; - - /* Try and get this from the residual data. */ - res = prep_res_calibrate_decr(); - - /* If we didn't get it from the residual data, try this. */ - if ( res ) { -#define TIMER0_COUNT 0x40 -#define TIMER_CONTROL 0x43 - /* set timer to periodic mode */ - outb_p(0x34,TIMER_CONTROL);/* binary, mode 2, LSB/MSB, ch 0 */ - /* set the clock to ~100 Hz */ - outb_p(LATCH & 0xff , TIMER0_COUNT); /* LSB */ - outb(LATCH >> 8 , TIMER0_COUNT); /* MSB */ - - if (request_irq(0, prep_calibrate_decr_handler, 0, "timer", NULL) != 0) - panic("Could not allocate timer IRQ!"); - local_irq_enable(); - /* wait for calibrate */ - while ( calibrate_steps ) - ; - local_irq_disable(); - free_irq( 0, NULL); - } -} - -static long __init -mk48t59_init(void) { - unsigned char tmp; - - tmp = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLB); - if (tmp & MK48T59_RTC_CB_STOP) { - printk("Warning: RTC was stopped, date will be wrong.\n"); - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLB, - tmp & ~MK48T59_RTC_CB_STOP); - /* Low frequency crystal oscillators may take a very long - * time to startup and stabilize. For now just ignore the - * the issue, but attempting to calibrate the decrementer - * from the RTC just after this wakeup is likely to be very - * inaccurate. Firmware should not allow to load - * the OS with the clock stopped anyway... - */ - } - /* Ensure that the clock registers are updated */ - tmp = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLA); - tmp &= ~(MK48T59_RTC_CA_READ | MK48T59_RTC_CA_WRITE); - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, tmp); - return 0; -} - -/* We use the NVRAM RTC to time a second to calibrate the decrementer, - * the RTC registers have just been set up in the right state by the - * preceding routine. - */ -static void __init -mk48t59_calibrate_decr(void) -{ - unsigned long freq; - unsigned long t1; - unsigned char save_control; - long i; - unsigned char sec; - - - /* Make sure the time is not stopped. */ - save_control = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLB); - - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, - (save_control & (~MK48T59_RTC_CB_STOP))); - - /* Now make sure the read bit is off so the value will change. */ - save_control = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLA); - save_control &= ~MK48T59_RTC_CA_READ; - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, save_control); - - - /* Read the seconds value to see when it changes. */ - sec = ppc_md.nvram_read_val(MK48T59_RTC_SECONDS); - /* Actually this is bad for precision, we should have a loop in - * which we only read the seconds counter. nvram_read_val writes - * the address bytes on every call and this takes a lot of time. - * Perhaps an nvram_wait_change method returning a time - * stamp with a loop count as parameter would be the solution. - */ - for (i = 0 ; i < 1000000 ; i++) { /* may take up to 1 second... */ - t1 = get_tbl(); - if (ppc_md.nvram_read_val(MK48T59_RTC_SECONDS) != sec) { - break; - } - } - - sec = ppc_md.nvram_read_val(MK48T59_RTC_SECONDS); - for (i = 0 ; i < 1000000 ; i++) { /* Should take up 1 second... */ - freq = get_tbl()-t1; - if (ppc_md.nvram_read_val(MK48T59_RTC_SECONDS) != sec) - break; - } - - printk("time_init: decrementer frequency = %lu.%.6lu MHz\n", - freq/1000000, freq%1000000); - tb_ticks_per_jiffy = freq / HZ; - tb_to_us = mulhwu_scale_factor(freq, 1000000); + todc_calibrate_decr(); } static unsigned int __prep @@ -1163,17 +1021,18 @@ ppc_md.nvram_read_val = prep_nvram_read_val; ppc_md.nvram_write_val = prep_nvram_write_val; - ppc_md.time_init = NULL; + ppc_md.time_init = todc_time_init; if (_prep_type == _PREP_IBM) { - ppc_md.set_rtc_time = mc146818_set_rtc_time; - ppc_md.get_rtc_time = mc146818_get_rtc_time; - ppc_md.calibrate_decr = prep_calibrate_decr; + TODC_INIT(TODC_TYPE_MC146818, PREP_NVRAM_AS0, PREP_NVRAM_AS1, + PREP_NVRAM_DATA, 8); } else { - ppc_md.set_rtc_time = mk48t59_set_rtc_time; - ppc_md.get_rtc_time = mk48t59_get_rtc_time; - ppc_md.calibrate_decr = mk48t59_calibrate_decr; - ppc_md.time_init = mk48t59_init; + TODC_INIT(TODC_TYPE_MK48T59, PREP_NVRAM_AS0, PREP_NVRAM_AS1, + PREP_NVRAM_DATA, 8); } + + ppc_md.calibrate_decr = prep_calibrate_decr; + ppc_md.set_rtc_time = todc_set_rtc_time; + ppc_md.get_rtc_time = todc_get_rtc_time; ppc_md.setup_io_mappings = prep_map_io; diff -Nru a/arch/ppc/platforms/prep_time.c b/arch/ppc/platforms/prep_time.c --- a/arch/ppc/platforms/prep_time.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,225 +0,0 @@ -/* - * arch/ppc/platforms/prep_time.c - * - * Copyright (C) 1991, 1992, 1995 Linus Torvalds - * - * Adapted for PowerPC (PReP) by Gary Thomas - * Modified by Cort Dougan (cort@cs.nmt.edu). - * Copied and modified from arch/i386/kernel/time.c - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -extern spinlock_t rtc_lock; - -/* - * The motorola uses the m48t18 rtc (includes DS1643) whose registers - * are at a higher end of nvram (1ff8-1fff) than the ibm mc146818 - * rtc (ds1386) which has regs at addr 0-d). The intel gets - * past this because the bios emulates the mc146818. - * - * Why in the world did they have to use different clocks? - * - * Right now things are hacked to check which machine we're on then - * use the appropriate macro. This is very very ugly and I should - * probably have a function that checks which machine we're on then - * does things correctly transparently or a function pointer which - * is setup at boot time to use the correct addresses. - * -- Cort - */ - -/* - * Set the hardware clock. -- Cort - */ -__prep -int mc146818_set_rtc_time(unsigned long nowtime) -{ - unsigned char save_control, save_freq_select; - struct rtc_time tm; - - spin_lock(&rtc_lock); - to_tm(nowtime, &tm); - - /* tell the clock it's being set */ - save_control = CMOS_READ(RTC_CONTROL); - - CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); - - /* stop and reset prescaler */ - save_freq_select = CMOS_READ(RTC_FREQ_SELECT); - - CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); - - tm.tm_year = (tm.tm_year - 1900) % 100; - if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { - BIN_TO_BCD(tm.tm_sec); - BIN_TO_BCD(tm.tm_min); - BIN_TO_BCD(tm.tm_hour); - BIN_TO_BCD(tm.tm_mon); - BIN_TO_BCD(tm.tm_mday); - BIN_TO_BCD(tm.tm_year); - } - CMOS_WRITE(tm.tm_sec, RTC_SECONDS); - CMOS_WRITE(tm.tm_min, RTC_MINUTES); - CMOS_WRITE(tm.tm_hour, RTC_HOURS); - CMOS_WRITE(tm.tm_mon, RTC_MONTH); - CMOS_WRITE(tm.tm_mday, RTC_DAY_OF_MONTH); - CMOS_WRITE(tm.tm_year, RTC_YEAR); - - /* The following flags have to be released exactly in this order, - * otherwise the DS12887 (popular MC146818A clone with integrated - * battery and quartz) will not reset the oscillator and will not - * update precisely 500 ms later. You won't find this mentioned in - * the Dallas Semiconductor data sheets, but who believes data - * sheets anyway ... -- Markus Kuhn - */ - CMOS_WRITE(save_control, RTC_CONTROL); - CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); - spin_unlock(&rtc_lock); - - return 0; -} - -__prep -unsigned long mc146818_get_rtc_time(void) -{ - unsigned int year, mon, day, hour, min, sec; - int uip, i; - - /* The Linux interpretation of the CMOS clock register contents: - * When the Update-In-Progress (UIP) flag goes from 1 to 0, the - * RTC registers show the second which has precisely just started. - * Let's hope other operating systems interpret the RTC the same way. - */ - - /* Since the UIP flag is set for about 2.2 ms and the clock - * is typically written with a precision of 1 jiffy, trying - * to obtain a precision better than a few milliseconds is - * an illusion. Only consistency is interesting, this also - * allows to use the routine for /dev/rtc without a potential - * 1 second kernel busy loop triggered by any reader of /dev/rtc. - */ - - for ( i = 0; i<1000000; i++) { - uip = CMOS_READ(RTC_FREQ_SELECT); - sec = CMOS_READ(RTC_SECONDS); - min = CMOS_READ(RTC_MINUTES); - hour = CMOS_READ(RTC_HOURS); - day = CMOS_READ(RTC_DAY_OF_MONTH); - mon = CMOS_READ(RTC_MONTH); - year = CMOS_READ(RTC_YEAR); - uip |= CMOS_READ(RTC_FREQ_SELECT); - if ((uip & RTC_UIP)==0) break; - } - - if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) - || RTC_ALWAYS_BCD) - { - BCD_TO_BIN(sec); - BCD_TO_BIN(min); - BCD_TO_BIN(hour); - BCD_TO_BIN(day); - BCD_TO_BIN(mon); - BCD_TO_BIN(year); - } - if ((year += 1900) < 1970) - year += 100; - return mktime(year, mon, day, hour, min, sec); -} - -__prep -int mk48t59_set_rtc_time(unsigned long nowtime) -{ - unsigned char save_control; - struct rtc_time tm; - - spin_lock(&rtc_lock); - to_tm(nowtime, &tm); - - /* tell the clock it's being written */ - save_control = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLA); - - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, - (save_control | MK48T59_RTC_CA_WRITE)); - - tm.tm_year = (tm.tm_year - 1900) % 100; - BIN_TO_BCD(tm.tm_sec); - BIN_TO_BCD(tm.tm_min); - BIN_TO_BCD(tm.tm_hour); - BIN_TO_BCD(tm.tm_mon); - BIN_TO_BCD(tm.tm_mday); - BIN_TO_BCD(tm.tm_year); - - ppc_md.nvram_write_val(MK48T59_RTC_SECONDS, tm.tm_sec); - ppc_md.nvram_write_val(MK48T59_RTC_MINUTES, tm.tm_min); - ppc_md.nvram_write_val(MK48T59_RTC_HOURS, tm.tm_hour); - ppc_md.nvram_write_val(MK48T59_RTC_MONTH, tm.tm_mon); - ppc_md.nvram_write_val(MK48T59_RTC_DAY_OF_MONTH, tm.tm_mday); - ppc_md.nvram_write_val(MK48T59_RTC_YEAR, tm.tm_year); - - /* Turn off the write bit. */ - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, save_control); - spin_unlock(&rtc_lock); - - return 0; -} - -__prep -unsigned long mk48t59_get_rtc_time(void) -{ - unsigned char save_control; - unsigned int year, mon, day, hour, min, sec; - - /* Simple: freeze the clock, read it and allow updates again */ - save_control = ppc_md.nvram_read_val(MK48T59_RTC_CONTROLA); - save_control &= ~MK48T59_RTC_CA_READ; - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, save_control); - - /* Set the register to read the value. */ - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, - (save_control | MK48T59_RTC_CA_READ)); - - sec = ppc_md.nvram_read_val(MK48T59_RTC_SECONDS); - min = ppc_md.nvram_read_val(MK48T59_RTC_MINUTES); - hour = ppc_md.nvram_read_val(MK48T59_RTC_HOURS); - day = ppc_md.nvram_read_val(MK48T59_RTC_DAY_OF_MONTH); - mon = ppc_md.nvram_read_val(MK48T59_RTC_MONTH); - year = ppc_md.nvram_read_val(MK48T59_RTC_YEAR); - - /* Let the time values change again. */ - ppc_md.nvram_write_val(MK48T59_RTC_CONTROLA, save_control); - - BCD_TO_BIN(sec); - BCD_TO_BIN(min); - BCD_TO_BIN(hour); - BCD_TO_BIN(day); - BCD_TO_BIN(mon); - BCD_TO_BIN(year); - - year = year + 1900; - if (year < 1970) { - year += 100; - } - - return mktime(year, mon, day, hour, min, sec); -} diff -Nru a/arch/ppc/platforms/sandpoint.c b/arch/ppc/platforms/sandpoint.c --- a/arch/ppc/platforms/sandpoint.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/platforms/sandpoint.c Tue Feb 17 20:00:08 2004 @@ -103,12 +103,10 @@ #include #include #include +#include #include "sandpoint.h" -extern void gen550_progress(char *, unsigned short); -extern void gen550_init(int, struct uart_port *); - unsigned char __res[sizeof(bd_t)]; static void sandpoint_halt(void); @@ -706,6 +704,9 @@ #if defined(CONFIG_SERIAL_8250) && \ (defined(CONFIG_KGDB) || defined(CONFIG_SERIAL_TEXT_DEBUG)) sandpoint_early_serial_map(); +#ifdef CONFIG_KGDB + ppc_md.kgdb_map_scc = gen550_kgdb_map_scc; +#endif #ifdef CONFIG_SERIAL_TEXT_DEBUG ppc_md.progress = gen550_progress; #endif diff -Nru a/arch/ppc/platforms/spruce.h b/arch/ppc/platforms/spruce.h --- a/arch/ppc/platforms/spruce.h Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/platforms/spruce.h Tue Feb 17 20:00:07 2004 @@ -35,11 +35,37 @@ #define SPRUCE_MEM_SIZE 0x04000000 #define SPRUCE_BUS_SPEED 66666667 -#define SPRUCE_SERIAL_1_ADDR 0xff600300 -#define SPRUCE_SERIAL_2_ADDR 0xff600400 - #define SPRUCE_NVRAM_BASE_ADDR 0xff800000 #define SPRUCE_RTC_BASE_ADDR SPRUCE_NVRAM_BASE_ADDR + +/* + * Serial port defines + */ +#define SPRUCE_FPGA_REG_A 0xff820000 +#define SPRUCE_UARTCLK_33M 0x02 +#define SPRUCE_UARTCLK_IS_33M(reg) (reg & SPRUCE_UARTCLK_33M) + +#define UART0_IO_BASE 0xff600300 +#define UART1_IO_BASE 0xff600400 + +#define RS_TABLE_SIZE 2 + +#define SPRUCE_BAUD_33M (33000000/64) +#define SPRUCE_BAUD_30M (30000000/64) +#define BASE_BAUD SPRUCE_BAUD_33M + +#define UART0_INT 3 +#define UART1_INT 4 + +#define STD_UART_OP(num) \ + { 0, BASE_BAUD, 0, UART##num##_INT, \ + ASYNC_BOOT_AUTOCONF, \ + iomem_base: UART##num##_IO_BASE, \ + io_type: SERIAL_IO_MEM}, + +#define SERIAL_PORT_DFNS \ + STD_UART_OP(0) \ + STD_UART_OP(1) #endif /* __ASM_SPRUCE_H__ */ #endif /* __KERNEL__ */ diff -Nru a/arch/ppc/platforms/spruce_setup.c b/arch/ppc/platforms/spruce_setup.c --- a/arch/ppc/platforms/spruce_setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/platforms/spruce_setup.c Tue Feb 17 20:00:06 2004 @@ -28,6 +28,9 @@ #include #include #include +#include +#include +#include #include #include @@ -39,6 +42,7 @@ #include #include #include +#include #include @@ -103,6 +107,48 @@ return 0; } +static void __init +spruce_early_serial_map(void) +{ + u32 uart_clk; + struct uart_port serial_req; + + if (SPRUCE_UARTCLK_IS_33M(readb(SPRUCE_FPGA_REG_A))) + uart_clk = SPRUCE_BAUD_33M * 16; + else + uart_clk = SPRUCE_BAUD_30M * 16; + + /* Setup serial port access */ + memset(&serial_req, 0, sizeof(serial_req)); + serial_req.uartclk = uart_clk; + serial_req.irq = UART0_INT; + serial_req.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; + serial_req.iotype = SERIAL_IO_MEM; + serial_req.membase = (u_char *)UART0_IO_BASE; + serial_req.regshift = 0; + +#if defined(CONFIG_KGDB) || defined(CONFIG_SERIAL_TEXT_DEBUG) + gen550_init(0, &serial_req); +#endif +#ifdef CONFIG_SERIAL_8250 + if (early_serial_setup(&serial_req) != 0) + printk("Early serial init of port 0 failed\n"); +#endif + + /* Assume early_serial_setup() doesn't modify serial_req */ + serial_req.line = 1; + serial_req.irq = UART1_INT; + serial_req.membase = (u_char *)UART1_IO_BASE; + +#if defined(CONFIG_KGDB) || defined(CONFIG_SERIAL_TEXT_DEBUG) + gen550_init(1, &serial_req); +#endif +#ifdef CONFIG_SERIAL_8250 + if (early_serial_setup(&serial_req) != 0) + printk("Early serial init of port 1 failed\n"); +#endif +} + TODC_ALLOC(); static void __init @@ -128,10 +174,11 @@ ROOT_DEV = Root_SDA1; #endif -#ifdef CONFIG_DUMMY_CONSOLE +#ifdef CONFIG_VT conswitchp = &dummy_con; #endif + /* Identify the system */ printk(KERN_INFO "System Identification: IBM Spruce\n"); printk(KERN_INFO "Port by MontaVista Software, Inc. (source@mvista.com)\n"); @@ -146,12 +193,12 @@ /* rfi restores MSR from SRR1 and sets the PC to the SRR0 value */ __asm__ __volatile__ ("\n\ - lis 3,0xfff0 - ori 3,3,0x0100 - mtspr 26,3 - li 3,0 - mtspr 27,3 - rfi + lis 3,0xfff0 \n\ + ori 3,3,0x0100 \n\ + mtspr 26,3 \n\ + li 3,0 \n\ + mtspr 27,3 \n\ + rfi \n\ "); for(;;); } @@ -175,12 +222,27 @@ 0x08000000, _PAGE_IO); } +/* + * Set BAT 3 to map 0xf8000000 to end of physical memory space 1-to-1. + */ +static __inline__ void +spruce_set_bat(void) +{ + mb(); + mtspr(DBAT1U, 0xf8000ffe); + mtspr(DBAT1L, 0xf800002a); + mb(); +} + void __init platform_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7) { parse_bootinfo(find_bootinfo()); + /* Map in board regs, etc. */ + spruce_set_bat(); + isa_io_base = SPRUCE_ISA_IO_BASE; pci_dram_offset = SPRUCE_PCI_SYS_MEM_BASE; @@ -202,4 +264,13 @@ ppc_md.nvram_read_val = todc_direct_read_val; ppc_md.nvram_write_val = todc_direct_write_val; + + spruce_early_serial_map(); + +#ifdef CONFIG_SERIAL_TEXT_DEBUG + ppc_md.progress = gen550_progress; +#endif /* CONFIG_SERIAL_TEXT_DEBUG */ +#ifdef CONFIG_KGDB + ppc_md.kgdb_map_scc = gen550_kgdb_map_scc; +#endif } diff -Nru a/arch/ppc/syslib/Makefile b/arch/ppc/syslib/Makefile --- a/arch/ppc/syslib/Makefile Tue Feb 17 20:00:05 2004 +++ b/arch/ppc/syslib/Makefile Tue Feb 17 20:00:05 2004 @@ -31,8 +31,9 @@ endif obj-$(CONFIG_PPC_OF) += prom_init.o prom.o of_device.o obj-$(CONFIG_PPC_PMAC) += open_pic.o indirect_pci.o +obj-$(CONFIG_POWER4) += open_pic2.o obj-$(CONFIG_PPC_CHRP) += open_pic.o indirect_pci.o i8259.o -obj-$(CONFIG_PPC_PREP) += open_pic.o indirect_pci.o i8259.o +obj-$(CONFIG_PPC_PREP) += open_pic.o indirect_pci.o i8259.o todc_time.o obj-$(CONFIG_ADIR) += i8259.o indirect_pci.o pci_auto.o \ todc_time.o obj-$(CONFIG_EBONY) += indirect_pci.o pci_auto.o todc_time.o @@ -66,7 +67,7 @@ obj-$(CONFIG_SPRUCE) += cpc700_pic.o indirect_pci.o pci_auto.o \ todc_time.o obj-$(CONFIG_8260) += m8260_setup.o ppc8260_pic.o -ifeq ($(CONFIG_SERIAL_8250)$(CONFIG_PPC_GEN550),yy) +ifeq ($(CONFIG_PPC_GEN550),y) obj-$(CONFIG_KGDB) += gen550_kgdb.o gen550_dbg.o obj-$(CONFIG_SERIAL_TEXT_DEBUG) += gen550_dbg.o endif diff -Nru a/arch/ppc/syslib/gen550_dbg.c b/arch/ppc/syslib/gen550_dbg.c --- a/arch/ppc/syslib/gen550_dbg.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/syslib/gen550_dbg.c Tue Feb 17 20:00:06 2004 @@ -17,6 +17,8 @@ */ #include +#include +#include #include /* For linux/serial_core.h */ #include #include diff -Nru a/arch/ppc/syslib/gen550_kgdb.c b/arch/ppc/syslib/gen550_kgdb.c --- a/arch/ppc/syslib/gen550_kgdb.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc/syslib/gen550_kgdb.c Tue Feb 17 20:00:06 2004 @@ -77,7 +77,7 @@ * to use. */ void -kgdb_map_scc(void) +gen550_kgdb_map_scc(void) { printk(KERN_DEBUG "kgdb init\n"); kgdb_debugport = serial_init(KGDB_PORT, NULL); diff -Nru a/arch/ppc/syslib/of_device.c b/arch/ppc/syslib/of_device.c --- a/arch/ppc/syslib/of_device.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/syslib/of_device.c Tue Feb 17 20:00:08 2004 @@ -183,6 +183,7 @@ struct of_device *ofdev; ofdev = to_of_device(dev); + of_node_put(ofdev->node); kfree(ofdev); } @@ -242,7 +243,7 @@ return NULL; memset(dev, 0, sizeof(*dev)); - dev->node = np; + dev->node = of_node_get(np); dev->dma_mask = 0xffffffffUL; dev->dev.dma_mask = &dev->dma_mask; dev->dev.parent = NULL; diff -Nru a/arch/ppc/syslib/open_pic.c b/arch/ppc/syslib/open_pic.c --- a/arch/ppc/syslib/open_pic.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc/syslib/open_pic.c Tue Feb 17 20:00:07 2004 @@ -610,12 +610,15 @@ void __devinit do_openpic_setup_cpu(void) { +#ifdef CONFIG_IRQ_ALL_CPUS int i; - u32 msk = 1 << smp_hw_index[smp_processor_id()]; - + u32 msk; +#endif spin_lock(&openpic_setup_lock); #ifdef CONFIG_IRQ_ALL_CPUS + msk = 1 << smp_hw_index[smp_processor_id()]; + /* let the openpic know we want intrs. default affinity * is 0xffffffff until changed via /proc * That's how it's done on x86. If we want it differently, then @@ -788,15 +791,25 @@ */ static void openpic_ack_irq(unsigned int irq_nr) { +#ifdef __SLOW_VERSION__ openpic_disable_irq(irq_nr); openpic_eoi(); +#else + if ((irq_desc[irq_nr].status & IRQ_LEVEL) == 0) + openpic_eoi(); +#endif } static void openpic_end_irq(unsigned int irq_nr) { +#ifdef __SLOW_VERSION__ if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS)) && irq_desc[irq_nr].action) openpic_enable_irq(irq_nr); +#else + if ((irq_desc[irq_nr].status & IRQ_LEVEL) != 0) + openpic_eoi(); +#endif } static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask) diff -Nru a/arch/ppc/syslib/open_pic2.c b/arch/ppc/syslib/open_pic2.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc/syslib/open_pic2.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,716 @@ +/* + * arch/ppc/kernel/open_pic.c -- OpenPIC Interrupt Handling + * + * Copyright (C) 1997 Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + * + * This is a duplicate of open_pic.c that deals with U3s MPIC on + * G5 PowerMacs. It's the same file except it's using big endian + * register accesses + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "open_pic_defs.h" + +void *OpenPIC2_Addr; +static volatile struct OpenPIC *OpenPIC2 = NULL; +/* + * We define OpenPIC_InitSenses table thusly: + * bit 0x1: sense, 0 for edge and 1 for level. + * bit 0x2: polarity, 0 for negative, 1 for positive. + */ +extern u_int OpenPIC_NumInitSenses; +extern u_char *OpenPIC_InitSenses; +extern int use_of_interrupt_tree; + +static u_int NumProcessors; +static u_int NumSources; +static int open_pic2_irq_offset; +static volatile OpenPIC_Source *ISR[NR_IRQS]; + +/* Global Operations */ +static void openpic2_disable_8259_pass_through(void); +static void openpic2_set_priority(u_int pri); +static void openpic2_set_spurious(u_int vector); + +/* Timer Interrupts */ +static void openpic2_inittimer(u_int timer, u_int pri, u_int vector); +static void openpic2_maptimer(u_int timer, u_int cpumask); + +/* Interrupt Sources */ +static void openpic2_enable_irq(u_int irq); +static void openpic2_disable_irq(u_int irq); +static void openpic2_initirq(u_int irq, u_int pri, u_int vector, int polarity, + int is_level); +static void openpic2_mapirq(u_int irq, u_int cpumask, u_int keepmask); + +/* + * These functions are not used but the code is kept here + * for completeness and future reference. + */ +static void openpic2_reset(void); +#ifdef notused +static void openpic2_enable_8259_pass_through(void); +static u_int openpic2_get_priority(void); +static u_int openpic2_get_spurious(void); +static void openpic2_set_sense(u_int irq, int sense); +#endif /* notused */ + +/* + * Description of the openpic for the higher-level irq code + */ +static void openpic2_end_irq(unsigned int irq_nr); +static void openpic2_ack_irq(unsigned int irq_nr); + +struct hw_interrupt_type open_pic2 = { + " OpenPIC2 ", + NULL, + NULL, + openpic2_enable_irq, + openpic2_disable_irq, + openpic2_ack_irq, + openpic2_end_irq, +}; + +/* + * Accesses to the current processor's openpic registers + * On cascaded controller, this is only CPU 0 + */ +#define THIS_CPU Processor[0] +#define DECL_THIS_CPU +#define CHECK_THIS_CPU + +#if 1 +#define check_arg_ipi(ipi) \ + if (ipi < 0 || ipi >= OPENPIC_NUM_IPI) \ + printk("open_pic.c:%d: illegal ipi %d\n", __LINE__, ipi); +#define check_arg_timer(timer) \ + if (timer < 0 || timer >= OPENPIC_NUM_TIMERS) \ + printk("open_pic.c:%d: illegal timer %d\n", __LINE__, timer); +#define check_arg_vec(vec) \ + if (vec < 0 || vec >= OPENPIC_NUM_VECTORS) \ + printk("open_pic.c:%d: illegal vector %d\n", __LINE__, vec); +#define check_arg_pri(pri) \ + if (pri < 0 || pri >= OPENPIC_NUM_PRI) \ + printk("open_pic.c:%d: illegal priority %d\n", __LINE__, pri); +/* + * Print out a backtrace if it's out of range, since if it's larger than NR_IRQ's + * data has probably been corrupted and we're going to panic or deadlock later + * anyway --Troy + */ +extern unsigned long* _get_SP(void); +#define check_arg_irq(irq) \ + if (irq < open_pic2_irq_offset || irq >= NumSources+open_pic2_irq_offset \ + || ISR[irq - open_pic2_irq_offset] == 0) { \ + printk("open_pic.c:%d: illegal irq %d\n", __LINE__, irq); \ + /*print_backtrace(_get_SP());*/ } +#define check_arg_cpu(cpu) \ + if (cpu < 0 || cpu >= NumProcessors){ \ + printk("open_pic2.c:%d: illegal cpu %d\n", __LINE__, cpu); \ + /*print_backtrace(_get_SP());*/ } +#else +#define check_arg_ipi(ipi) do {} while (0) +#define check_arg_timer(timer) do {} while (0) +#define check_arg_vec(vec) do {} while (0) +#define check_arg_pri(pri) do {} while (0) +#define check_arg_irq(irq) do {} while (0) +#define check_arg_cpu(cpu) do {} while (0) +#endif + +static u_int openpic2_read(volatile u_int *addr) +{ + u_int val; + + val = in_be32(addr); + return val; +} + +static inline void openpic2_write(volatile u_int *addr, u_int val) +{ + out_be32(addr, val); +} + +static inline u_int openpic2_readfield(volatile u_int *addr, u_int mask) +{ + u_int val = openpic2_read(addr); + return val & mask; +} + +inline void openpic2_writefield(volatile u_int *addr, u_int mask, + u_int field) +{ + u_int val = openpic2_read(addr); + openpic2_write(addr, (val & ~mask) | (field & mask)); +} + +static inline void openpic2_clearfield(volatile u_int *addr, u_int mask) +{ + openpic2_writefield(addr, mask, 0); +} + +static inline void openpic2_setfield(volatile u_int *addr, u_int mask) +{ + openpic2_writefield(addr, mask, mask); +} + +static void openpic2_safe_writefield(volatile u_int *addr, u_int mask, + u_int field) +{ + openpic2_setfield(addr, OPENPIC_MASK); + while (openpic2_read(addr) & OPENPIC_ACTIVITY); + openpic2_writefield(addr, mask | OPENPIC_MASK, field | OPENPIC_MASK); +} + +static void openpic2_reset(void) +{ + openpic2_setfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_RESET); + while (openpic2_readfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_RESET)) + mb(); +} + +void __init openpic2_set_sources(int first_irq, int num_irqs, void *first_ISR) +{ + volatile OpenPIC_Source *src = first_ISR; + int i, last_irq; + + last_irq = first_irq + num_irqs; + if (last_irq > NumSources) + NumSources = last_irq; + if (src == 0) + src = &((struct OpenPIC *)OpenPIC2_Addr)->Source[first_irq]; + for (i = first_irq; i < last_irq; ++i, ++src) + ISR[i] = src; +} + +/* + * The `offset' parameter defines where the interrupts handled by the + * OpenPIC start in the space of interrupt numbers that the kernel knows + * about. In other words, the OpenPIC's IRQ0 is numbered `offset' in the + * kernel's interrupt numbering scheme. + * We assume there is only one OpenPIC. + */ +void __init openpic2_init(int offset) +{ + u_int t, i; + u_int timerfreq; + const char *version; + + if (!OpenPIC2_Addr) { + printk("No OpenPIC2 found !\n"); + return; + } + OpenPIC2 = (volatile struct OpenPIC *)OpenPIC2_Addr; + + if (ppc_md.progress) ppc_md.progress("openpic: enter", 0x122); + + t = openpic2_read(&OpenPIC2->Global.Feature_Reporting0); + switch (t & OPENPIC_FEATURE_VERSION_MASK) { + case 1: + version = "1.0"; + break; + case 2: + version = "1.2"; + break; + case 3: + version = "1.3"; + break; + default: + version = "?"; + break; + } + NumProcessors = ((t & OPENPIC_FEATURE_LAST_PROCESSOR_MASK) >> + OPENPIC_FEATURE_LAST_PROCESSOR_SHIFT) + 1; + if (NumSources == 0) + openpic2_set_sources(0, + ((t & OPENPIC_FEATURE_LAST_SOURCE_MASK) >> + OPENPIC_FEATURE_LAST_SOURCE_SHIFT) + 1, + NULL); + printk("OpenPIC (2) Version %s (%d CPUs and %d IRQ sources) at %p\n", + version, NumProcessors, NumSources, OpenPIC2); + timerfreq = openpic2_read(&OpenPIC2->Global.Timer_Frequency); + if (timerfreq) + printk("OpenPIC timer frequency is %d.%06d MHz\n", + timerfreq / 1000000, timerfreq % 1000000); + + open_pic2_irq_offset = offset; + + /* Initialize timer interrupts */ + if ( ppc_md.progress ) ppc_md.progress("openpic2: timer",0x3ba); + for (i = 0; i < OPENPIC_NUM_TIMERS; i++) { + /* Disabled, Priority 0 */ + openpic2_inittimer(i, 0, OPENPIC2_VEC_TIMER+i+offset); + /* No processor */ + openpic2_maptimer(i, 0); + } + + /* Initialize external interrupts */ + if (ppc_md.progress) ppc_md.progress("openpic2: external",0x3bc); + + openpic2_set_priority(0xf); + + /* Init all external sources, including possibly the cascade. */ + for (i = 0; i < NumSources; i++) { + int sense; + + if (ISR[i] == 0) + continue; + + /* the bootloader may have left it enabled (bad !) */ + openpic2_disable_irq(i+offset); + + sense = (i < OpenPIC_NumInitSenses)? OpenPIC_InitSenses[i]: \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE); + + if (sense & IRQ_SENSE_MASK) + irq_desc[i+offset].status = IRQ_LEVEL; + + /* Enabled, Priority 8 */ + openpic2_initirq(i, 8, i+offset, (sense & IRQ_POLARITY_MASK), + (sense & IRQ_SENSE_MASK)); + /* Processor 0 */ + openpic2_mapirq(i, 1<<0, 0); + } + + /* Init descriptors */ + for (i = offset; i < NumSources + offset; i++) + irq_desc[i].handler = &open_pic2; + + /* Initialize the spurious interrupt */ + if (ppc_md.progress) ppc_md.progress("openpic2: spurious",0x3bd); + openpic2_set_spurious(OPENPIC2_VEC_SPURIOUS+offset); + + openpic2_disable_8259_pass_through(); + openpic2_set_priority(0); + + if (ppc_md.progress) ppc_md.progress("openpic2: exit",0x222); +} + +#ifdef notused +static void openpic2_enable_8259_pass_through(void) +{ + openpic2_clearfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_8259_PASSTHROUGH_DISABLE); +} +#endif /* notused */ + +/* This can't be __init, it is used in openpic_sleep_restore_intrs */ +static void openpic2_disable_8259_pass_through(void) +{ + openpic2_setfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_8259_PASSTHROUGH_DISABLE); +} + +/* + * Find out the current interrupt + */ +u_int openpic2_irq(void) +{ + u_int vec; + DECL_THIS_CPU; + + CHECK_THIS_CPU; + vec = openpic2_readfield(&OpenPIC2->THIS_CPU.Interrupt_Acknowledge, + OPENPIC_VECTOR_MASK); + return vec; +} + +void openpic2_eoi(void) +{ + DECL_THIS_CPU; + + CHECK_THIS_CPU; + openpic2_write(&OpenPIC2->THIS_CPU.EOI, 0); + /* Handle PCI write posting */ + (void)openpic2_read(&OpenPIC2->THIS_CPU.EOI); +} + +#ifdef notused +static u_int openpic2_get_priority(void) +{ + DECL_THIS_CPU; + + CHECK_THIS_CPU; + return openpic2_readfield(&OpenPIC2->THIS_CPU.Current_Task_Priority, + OPENPIC_CURRENT_TASK_PRIORITY_MASK); +} +#endif /* notused */ + +static void __init openpic2_set_priority(u_int pri) +{ + DECL_THIS_CPU; + + CHECK_THIS_CPU; + check_arg_pri(pri); + openpic2_writefield(&OpenPIC2->THIS_CPU.Current_Task_Priority, + OPENPIC_CURRENT_TASK_PRIORITY_MASK, pri); +} + +/* + * Get/set the spurious vector + */ +#ifdef notused +static u_int openpic2_get_spurious(void) +{ + return openpic2_readfield(&OpenPIC2->Global.Spurious_Vector, + OPENPIC_VECTOR_MASK); +} +#endif /* notused */ + +/* This can't be __init, it is used in openpic_sleep_restore_intrs */ +static void openpic2_set_spurious(u_int vec) +{ + check_arg_vec(vec); + openpic2_writefield(&OpenPIC2->Global.Spurious_Vector, OPENPIC_VECTOR_MASK, + vec); +} + +static spinlock_t openpic2_setup_lock = SPIN_LOCK_UNLOCKED; + +/* + * Initialize a timer interrupt (and disable it) + * + * timer: OpenPIC timer number + * pri: interrupt source priority + * vec: the vector it will produce + */ +static void __init openpic2_inittimer(u_int timer, u_int pri, u_int vec) +{ + check_arg_timer(timer); + check_arg_pri(pri); + check_arg_vec(vec); + openpic2_safe_writefield(&OpenPIC2->Global.Timer[timer].Vector_Priority, + OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK, + (pri << OPENPIC_PRIORITY_SHIFT) | vec); +} + +/* + * Map a timer interrupt to one or more CPUs + */ +static void __init openpic2_maptimer(u_int timer, u_int cpumask) +{ + check_arg_timer(timer); + openpic2_write(&OpenPIC2->Global.Timer[timer].Destination, + cpumask); +} + +/* + * Initalize the interrupt source which will generate an NMI. + * This raises the interrupt's priority from 8 to 9. + * + * irq: The logical IRQ which generates an NMI. + */ +void __init +openpic2_init_nmi_irq(u_int irq) +{ + check_arg_irq(irq); + openpic2_safe_writefield(&ISR[irq - open_pic2_irq_offset]->Vector_Priority, + OPENPIC_PRIORITY_MASK, + 9 << OPENPIC_PRIORITY_SHIFT); +} + +/* + * + * All functions below take an offset'ed irq argument + * + */ + + +/* + * Enable/disable an external interrupt source + * + * Externally called, irq is an offseted system-wide interrupt number + */ +static void openpic2_enable_irq(u_int irq) +{ + volatile u_int *vpp; + + check_arg_irq(irq); + vpp = &ISR[irq - open_pic2_irq_offset]->Vector_Priority; + openpic2_clearfield(vpp, OPENPIC_MASK); + /* make sure mask gets to controller before we return to user */ + do { + mb(); /* sync is probably useless here */ + } while (openpic2_readfield(vpp, OPENPIC_MASK)); +} + +static void openpic2_disable_irq(u_int irq) +{ + volatile u_int *vpp; + u32 vp; + + check_arg_irq(irq); + vpp = &ISR[irq - open_pic2_irq_offset]->Vector_Priority; + openpic2_setfield(vpp, OPENPIC_MASK); + /* make sure mask gets to controller before we return to user */ + do { + mb(); /* sync is probably useless here */ + vp = openpic2_readfield(vpp, OPENPIC_MASK | OPENPIC_ACTIVITY); + } while((vp & OPENPIC_ACTIVITY) && !(vp & OPENPIC_MASK)); +} + + +/* + * Initialize an interrupt source (and disable it!) + * + * irq: OpenPIC interrupt number + * pri: interrupt source priority + * vec: the vector it will produce + * pol: polarity (1 for positive, 0 for negative) + * sense: 1 for level, 0 for edge + */ +static void __init +openpic2_initirq(u_int irq, u_int pri, u_int vec, int pol, int sense) +{ + openpic2_safe_writefield(&ISR[irq]->Vector_Priority, + OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK | + OPENPIC_SENSE_MASK | OPENPIC_POLARITY_MASK, + (pri << OPENPIC_PRIORITY_SHIFT) | vec | + (pol ? OPENPIC_POLARITY_POSITIVE : + OPENPIC_POLARITY_NEGATIVE) | + (sense ? OPENPIC_SENSE_LEVEL : OPENPIC_SENSE_EDGE)); +} + +/* + * Map an interrupt source to one or more CPUs + */ +static void openpic2_mapirq(u_int irq, u_int physmask, u_int keepmask) +{ + if (ISR[irq] == 0) + return; + if (keepmask != 0) + physmask |= openpic2_read(&ISR[irq]->Destination) & keepmask; + openpic2_write(&ISR[irq]->Destination, physmask); +} + +#ifdef notused +/* + * Set the sense for an interrupt source (and disable it!) + * + * sense: 1 for level, 0 for edge + */ +static void openpic2_set_sense(u_int irq, int sense) +{ + if (ISR[irq] != 0) + openpic2_safe_writefield(&ISR[irq]->Vector_Priority, + OPENPIC_SENSE_LEVEL, + (sense ? OPENPIC_SENSE_LEVEL : 0)); +} +#endif /* notused */ + +/* No spinlocks, should not be necessary with the OpenPIC + * (1 register = 1 interrupt and we have the desc lock). + */ +static void openpic2_ack_irq(unsigned int irq_nr) +{ + openpic2_disable_irq(irq_nr); + openpic2_eoi(); +} + +static void openpic2_end_irq(unsigned int irq_nr) +{ + if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))) + openpic2_enable_irq(irq_nr); +} + +int +openpic2_get_irq(struct pt_regs *regs) +{ + int irq = openpic2_irq(); + + if (irq == (OPENPIC2_VEC_SPURIOUS + open_pic2_irq_offset)) + irq = -1; + return irq; +} + +#ifdef CONFIG_PM + +/* + * We implement the IRQ controller as a sysdev and put it + * to sleep at powerdown stage (the callback is named suspend, + * but it's old semantics, for the Device Model, it's really + * powerdown). The possible problem is that another sysdev that + * happens to be suspend after this one will have interrupts off, + * that may be an issue... For now, this isn't an issue on pmac + * though... + */ + +static u32 save_ipi_vp[OPENPIC_NUM_IPI]; +static u32 save_irq_src_vp[OPENPIC_MAX_SOURCES]; +static u32 save_irq_src_dest[OPENPIC_MAX_SOURCES]; +static u32 save_cpu_task_pri[OPENPIC_MAX_PROCESSORS]; +static int openpic_suspend_count; + +static void openpic2_cached_enable_irq(u_int irq) +{ + check_arg_irq(irq); + save_irq_src_vp[irq - open_pic2_irq_offset] &= ~OPENPIC_MASK; +} + +static void openpic2_cached_disable_irq(u_int irq) +{ + check_arg_irq(irq); + save_irq_src_vp[irq - open_pic2_irq_offset] |= OPENPIC_MASK; +} + +/* WARNING: Can be called directly by the cpufreq code with NULL parameter, + * we need something better to deal with that... Maybe switch to S1 for + * cpufreq changes + */ +int openpic2_suspend(struct sys_device *sysdev, u32 state) +{ + int i; + unsigned long flags; + + spin_lock_irqsave(&openpic2_setup_lock, flags); + + if (openpic_suspend_count++ > 0) { + spin_unlock_irqrestore(&openpic2_setup_lock, flags); + return 0; + } + + open_pic2.enable = openpic2_cached_enable_irq; + open_pic2.disable = openpic2_cached_disable_irq; + + for (i=0; iProcessor[i].Current_Task_Priority); + openpic2_writefield(&OpenPIC2->Processor[i].Current_Task_Priority, + OPENPIC_CURRENT_TASK_PRIORITY_MASK, 0xf); + } + + for (i=0; iGlobal.IPI_Vector_Priority(i)); + for (i=0; iVector_Priority) & ~OPENPIC_ACTIVITY; + save_irq_src_dest[i] = openpic2_read(&ISR[i]->Destination); + } + + spin_unlock_irqrestore(&openpic2_setup_lock, flags); + + return 0; +} + +/* WARNING: Can be called directly by the cpufreq code with NULL parameter, + * we need something better to deal with that... Maybe switch to S1 for + * cpufreq changes + */ +int openpic2_resume(struct sys_device *sysdev) +{ + int i; + unsigned long flags; + u32 vppmask = OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK | + OPENPIC_SENSE_MASK | OPENPIC_POLARITY_MASK | + OPENPIC_MASK; + + spin_lock_irqsave(&openpic2_setup_lock, flags); + + if ((--openpic_suspend_count) > 0) { + spin_unlock_irqrestore(&openpic2_setup_lock, flags); + return 0; + } + + openpic2_reset(); + + /* OpenPIC sometimes seem to need some time to be fully back up... */ + do { + openpic2_set_spurious(OPENPIC2_VEC_SPURIOUS+open_pic2_irq_offset); + } while(openpic2_readfield(&OpenPIC2->Global.Spurious_Vector, OPENPIC_VECTOR_MASK) + != (OPENPIC2_VEC_SPURIOUS + open_pic2_irq_offset)); + + openpic2_disable_8259_pass_through(); + + for (i=0; iGlobal.IPI_Vector_Priority(i), + save_ipi_vp[i]); + for (i=0; iDestination, save_irq_src_dest[i]); + openpic2_write(&ISR[i]->Vector_Priority, save_irq_src_vp[i]); + /* make sure mask gets to controller before we return to user */ + do { + openpic2_write(&ISR[i]->Vector_Priority, save_irq_src_vp[i]); + } while (openpic2_readfield(&ISR[i]->Vector_Priority, vppmask) + != (save_irq_src_vp[i] & vppmask)); + } + for (i=0; iProcessor[i].Current_Task_Priority, + save_cpu_task_pri[i]); + + open_pic2.enable = openpic2_enable_irq; + open_pic2.disable = openpic2_disable_irq; + + spin_unlock_irqrestore(&openpic2_setup_lock, flags); + + return 0; +} + +#endif /* CONFIG_PM */ + +/* HACK ALERT */ +static struct sysdev_class openpic2_sysclass = { + set_kset_name("openpic2"), +}; + +static struct sys_device device_openpic2 = { + .id = 0, + .cls = &openpic2_sysclass, +}; + +static struct sysdev_driver driver_openpic2 = { +#ifdef CONFIG_PM + .suspend = &openpic2_suspend, + .resume = &openpic2_resume, +#endif /* CONFIG_PM */ +}; + +static int __init init_openpic2_sysfs(void) +{ + int rc; + + if (!OpenPIC2_Addr) + return -ENODEV; + printk(KERN_DEBUG "Registering openpic2 with sysfs...\n"); + rc = sysdev_class_register(&openpic2_sysclass); + if (rc) { + printk(KERN_ERR "Failed registering openpic sys class\n"); + return -ENODEV; + } + rc = sys_device_register(&device_openpic2); + if (rc) { + printk(KERN_ERR "Failed registering openpic sys device\n"); + return -ENODEV; + } + rc = sysdev_driver_register(&openpic2_sysclass, &driver_openpic2); + if (rc) { + printk(KERN_ERR "Failed registering openpic sys driver\n"); + return -ENODEV; + } + return 0; +} + +subsys_initcall(init_openpic2_sysfs); + diff -Nru a/arch/ppc/syslib/ppc4xx_setup.c b/arch/ppc/syslib/ppc4xx_setup.c --- a/arch/ppc/syslib/ppc4xx_setup.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc/syslib/ppc4xx_setup.c Tue Feb 17 20:00:05 2004 @@ -170,7 +170,7 @@ unsigned int freq; bd_t *bip = &__res; -#if defined(CONFIG_WALNUT) || defined(CONFIG_CEDER)|| defined(CONFIG_ASH) || defined(CONFIG_SYCAMORE) +#if defined(CONFIG_WALNUT) || defined(CONFIG_ASH) || defined(CONFIG_SYCAMORE) /* Walnut boot rom sets DCR CHCR1 (aka CPC0_CR1) bit CETE to 1 */ mtdcr(DCRN_CHCR1, mfdcr(DCRN_CHCR1) & ~CHR1_CETE); #endif diff -Nru a/arch/ppc/syslib/prom.c b/arch/ppc/syslib/prom.c --- a/arch/ppc/syslib/prom.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc/syslib/prom.c Tue Feb 17 20:00:05 2004 @@ -160,7 +160,7 @@ match on /chosen.interrupt_controller */ if ((name != NULL && strcmp(name, "interrupt-controller") == 0) - || (ic != NULL && iclen == 0)) { + || (ic != NULL && iclen == 0 && strcmp(name, "AppleKiwi"))) { if (n == 0) dflt_interrupt_controller = np; ++n; @@ -217,7 +217,7 @@ ifunc = interpret_macio_props; else if (!strcmp(np->type, "isa")) ifunc = interpret_isa_props; - else if (!strcmp(np->name, "uni-n")) + else if (!strcmp(np->name, "uni-n") || !strcmp(np->name, "u3")) ifunc = interpret_root_props; else if (!((ifunc == interpret_dbdma_props || ifunc == interpret_macio_props) @@ -431,10 +431,21 @@ * This doesn't cope with the general case of multiple * cascaded interrupt controllers, but then neither will * irq.c at the moment either. -- paulus + * The G5 triggers that code, I add a machine test. On + * those machines, we want to offset interrupts from the + * second openpic by 128 -- BenH */ - if (num_interrupt_controllers > 1 && ic != NULL + if (_machine != _MACH_Pmac && num_interrupt_controllers > 1 + && ic != NULL && get_property(ic, "interrupt-parent", NULL) == NULL) offset = 16; + else if (_machine == _MACH_Pmac && num_interrupt_controllers > 1 + && ic != NULL && ic->parent != NULL) { + char *name = get_property(ic->parent, "name", NULL); + if (name && !strcmp(name, "u3")) + offset = 128; + } + np->intrs[i].line = irq[0] + offset; if (n > 1) np->intrs[i].sense = irq[1]; @@ -1212,8 +1223,6 @@ * Request an OF device resource. Currently handles child of PCI devices, * or other nodes attached to the root node. Ultimately, put some * link to resources in the OF node. - * WARNING: out_resource->name should be initialized before calling this - * function. */ struct resource* __openfirmware request_OF_resource(struct device_node* node, int index, const char* name_postfix) @@ -1276,7 +1285,7 @@ { struct pci_dev* pcidev; u8 pci_bus, pci_devfn; - unsigned long iomask; + unsigned long iomask, start, end; struct device_node* nd; struct resource* parent; struct resource *res = NULL; @@ -1305,18 +1314,23 @@ if (pcidev) parent = find_parent_pci_resource(pcidev, &node->addrs[index]); if (!parent) { - printk(KERN_WARNING "request_OF_resource(%s), parent not found\n", + printk(KERN_WARNING "release_OF_resource(%s), parent not found\n", node->name); return -ENODEV; } - /* Find us in the parent */ + /* Find us in the parent and its childs */ res = parent->child; + start = node->addrs[index].address; + end = start + node->addrs[index].size - 1; while (res) { - if (res->start == node->addrs[index].address && - res->end == (res->start + node->addrs[index].size - 1)) + if (res->start == start && res->end == end && + (res->flags & IORESOURCE_BUSY)) break; - res = res->sibling; + if (res->start <= start && res->end >= end) + res = res->child; + else + res = res->sibling; } if (!res) return -ENODEV; diff -Nru a/arch/ppc/syslib/prom_init.c b/arch/ppc/syslib/prom_init.c --- a/arch/ppc/syslib/prom_init.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc/syslib/prom_init.c Tue Feb 17 20:00:08 2004 @@ -260,6 +260,74 @@ } } +#ifdef CONFIG_POWER4 +/* + * Set up a hash table with a set of entries in it to map the + * first 64MB of RAM. This is used on 64-bit machines since + * some of them don't have BATs. + */ + +static inline void make_pte(unsigned long htab, unsigned int hsize, + unsigned int va, unsigned int pa, int mode) +{ + unsigned int *pteg; + unsigned int hash, i, vsid; + + vsid = ((va >> 28) * 0x111) << 12; + hash = ((va ^ vsid) >> 5) & 0x7fff80; + pteg = (unsigned int *)(htab + (hash & (hsize - 1))); + for (i = 0; i < 8; ++i, pteg += 4) { + if ((pteg[1] & 1) == 0) { + pteg[1] = vsid | ((va >> 16) & 0xf80) | 1; + pteg[3] = pa | mode; + break; + } + } +} + +extern unsigned long _SDR1; +extern PTE *Hash; +extern unsigned long Hash_size; + +static void __init +prom_alloc_htab(void) +{ + unsigned int hsize; + unsigned long htab; + unsigned int addr; + + /* + * Because of OF bugs we can't use the "claim" client + * interface to allocate memory for the hash table. + * This code is only used on 64-bit PPCs, and the only + * 64-bit PPCs at the moment are RS/6000s, and their + * OF is based at 0xc00000 (the 12M point), so we just + * arbitrarily use the 0x800000 - 0xc00000 region for the + * hash table. + * -- paulus. + */ + hsize = 4 << 20; /* POWER4 has no BATs */ + htab = (8 << 20); + call_prom("claim", 3, 1, htab, hsize, 0); + Hash = (void *)(htab + KERNELBASE); + Hash_size = hsize; + _SDR1 = htab + __ilog2(hsize) - 18; + + /* + * Put in PTEs for the first 64MB of RAM + */ + memset((void *)htab, 0, hsize); + for (addr = 0; addr < 0x4000000; addr += 0x1000) + make_pte(htab, hsize, addr + KERNELBASE, addr, + _PAGE_ACCESSED | _PAGE_COHERENT | PP_RWXX); +#if 0 /* DEBUG stuff mapping the SCC */ + make_pte(htab, hsize, 0x80013000, 0x80013000, + _PAGE_ACCESSED | _PAGE_NO_CACHE | _PAGE_GUARDED | PP_RWXX); +#endif +} +#endif /* CONFIG_POWER4 */ + + /* * If we have a display that we don't know how to drive, * we will want to try to execute OF's open method for it @@ -434,13 +502,30 @@ address += 0x1000; #ifdef CONFIG_POWER4 - extern int boot_text_mapped; - btext_setup_display(width, height, depth, pitch, address); - boot_text_mapped = 0; -#else +#if CONFIG_TASK_SIZE > 0x80000000 +#error CONFIG_TASK_SIZE cannot be above 0x80000000 with BOOTX_TEXT on G5 +#endif + { + extern boot_infos_t disp_bi; + unsigned long va, pa, i, offset; + va = 0x90000000; + pa = address & 0xfffff000ul; + offset = address & 0x00000fff; + + for (i=0; i<0x4000; i++) { + make_pte((unsigned long)Hash - KERNELBASE, Hash_size, va, pa, + _PAGE_ACCESSED | _PAGE_NO_CACHE | + _PAGE_GUARDED | PP_RWXX); + va += 0x1000; + pa += 0x1000; + } + btext_setup_display(width, height, depth, pitch, 0x90000000 | offset); + disp_bi.dispDeviceBase = (u8 *)address; + } +#else /* CONFIG_POWER4 */ btext_setup_display(width, height, depth, pitch, address); btext_prepare_BAT(); -#endif +#endif /* CONFIG_POWER4 */ #endif /* CONFIG_BOOTX_TEXT */ } @@ -648,72 +733,6 @@ } } -#ifdef CONFIG_POWER4 -/* - * Set up a hash table with a set of entries in it to map the - * first 64MB of RAM. This is used on 64-bit machines since - * some of them don't have BATs. - * We assume the PTE will fit in the primary PTEG. - */ - -static inline void make_pte(unsigned long htab, unsigned int hsize, - unsigned int va, unsigned int pa, int mode) -{ - unsigned int *pteg; - unsigned int hash, i, vsid; - - vsid = ((va >> 28) * 0x111) << 12; - hash = ((va ^ vsid) >> 5) & 0x7fff80; - pteg = (unsigned int *)(htab + (hash & (hsize - 1))); - for (i = 0; i < 8; ++i, pteg += 4) { - if ((pteg[1] & 1) == 0) { - pteg[1] = vsid | ((va >> 16) & 0xf80) | 1; - pteg[3] = pa | mode; - break; - } - } -} - -extern unsigned long _SDR1; -extern PTE *Hash; -extern unsigned long Hash_size; - -static void __init -prom_alloc_htab(void) -{ - unsigned int hsize; - unsigned long htab; - unsigned int addr; - - /* - * Because of OF bugs we can't use the "claim" client - * interface to allocate memory for the hash table. - * This code is only used on 64-bit PPCs, and the only - * 64-bit PPCs at the moment are RS/6000s, and their - * OF is based at 0xc00000 (the 12M point), so we just - * arbitrarily use the 0x800000 - 0xc00000 region for the - * hash table. - * -- paulus. - */ - hsize = 4 << 20; /* POWER4 has no BATs */ - htab = (8 << 20); - call_prom("claim", 3, 1, htab, hsize, 0); - Hash = (void *)(htab + KERNELBASE); - Hash_size = hsize; - _SDR1 = htab + __ilog2(hsize) - 18; - - /* - * Put in PTEs for the first 64MB of RAM - */ - cacheable_memzero((void *)htab, hsize); - for (addr = 0; addr < 0x4000000; addr += 0x1000) - make_pte(htab, hsize, addr + KERNELBASE, addr, - _PAGE_ACCESSED | _PAGE_COHERENT | PP_RWXX); - make_pte(htab, hsize, 0x80013000, 0x80013000, - _PAGE_ACCESSED | _PAGE_NO_CACHE | _PAGE_GUARDED | PP_RWXX); -} -#endif /* CONFIG_POWER4 */ - static void __init prom_instantiate_rtas(void) { @@ -836,9 +855,10 @@ * loaded by an OF bootloader which did set a BAT for us. * This breaks OF translate so we force phys to be 0. */ - if (offset == 0) + if (offset == 0) { + prom_print("(already at 0xc0000000) phys=0\n"); phys = 0; - else if ((int) call_prom("getprop", 4, 1, prom_chosen, "mmu", + } else if ((int) call_prom("getprop", 4, 1, prom_chosen, "mmu", &prom_mmu, sizeof(prom_mmu)) <= 0) { prom_print(" no MMU found\n"); } else if ((int)call_prom_ret("call-method", 4, 4, result, "translate", diff -Nru a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig --- a/arch/ppc64/Kconfig Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/Kconfig Tue Feb 17 20:00:07 2004 @@ -60,7 +60,7 @@ bool "iSeries" config PPC_PSERIES - bool "pSeries" + bool "pSeries / PowerMac G5" endchoice @@ -72,6 +72,11 @@ bool default y +config PPC_OF + depends on PPC_PSERIES + bool + default y + # VMX is pSeries only for now until somebody writes the iSeries # exception vectors for it config ALTIVEC @@ -79,6 +84,23 @@ depends on PPC_PSERIES default y +config PPC_PMAC + depends on PPC_PSERIES + bool "Apple PowerMac G5 support" + select ADB_PMU + +config PPC_PMAC64 + bool + depends on PPC_PMAC + default y + +config BOOTX_TEXT + bool "Support for early boot text console" + depends PPC_OF + help + Say Y here to see progress messages from the boot firmware in text + mode. Requires an Open Firmware compatible video card. + config POWER4_ONLY bool "Optimize for POWER4" default n @@ -251,54 +273,10 @@ endmenu -source "drivers/base/Kconfig" - -source "drivers/mtd/Kconfig" - -source "drivers/parport/Kconfig" - -source "drivers/pnp/Kconfig" - -source "drivers/block/Kconfig" - -source "drivers/ide/Kconfig" - -source "drivers/scsi/Kconfig" - -source "drivers/md/Kconfig" - -source "drivers/message/fusion/Kconfig" - -source "drivers/ieee1394/Kconfig" - -source "drivers/message/i2o/Kconfig" - -source "net/Kconfig" - -source "drivers/isdn/Kconfig" - -source "drivers/telephony/Kconfig" - -# -# input before char - char/joystick depends on it. As does USB. -# -source "drivers/input/Kconfig" - -source "drivers/char/Kconfig" - -source "drivers/i2c/Kconfig" - -source "drivers/media/Kconfig" +source "drivers/Kconfig" source "fs/Kconfig" -source "drivers/video/Kconfig" - -source "sound/Kconfig" - -source "drivers/usb/Kconfig" - - menu "iSeries device drivers" depends on PPC_ISERIES @@ -378,9 +356,16 @@ keys are documented in . Don't say Y unless you really know what this hack does. +config DEBUGGER + bool "Enable debugger hooks" + depends on DEBUG_KERNEL + help + Include in-kernel hooks for kernel debuggers. Unless you are + intending to debug the kernel, say N here. + config XMON bool "Include xmon kernel debugger" - depends on DEBUG_KERNEL + depends on DEBUGGER help Include in-kernel hooks for the xmon kernel monitor/debugger. Unless you are intending to debug the kernel, say N here. diff -Nru a/arch/ppc64/boot/prom.c b/arch/ppc64/boot/prom.c --- a/arch/ppc64/boot/prom.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/boot/prom.c Tue Feb 17 20:00:08 2004 @@ -11,9 +11,6 @@ #include #include -#define BITS_PER_LONG 32 -#include - int (*prom)(void *); void *chosen_handle; @@ -28,6 +25,9 @@ void printk(char *fmt, ...); +/* there is no convenient header to get this from... -- paulus */ +extern unsigned long strlen(const char *); + int write(void *handle, void *ptr, int nb) { @@ -352,7 +352,7 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ -static char * number(char * str, long long num, int base, int size, int precision, int type) +static char * number(char * str, long num, int base, int size, int precision, int type) { char c,sign,tmp[66]; const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; @@ -388,8 +388,10 @@ i = 0; if (num == 0) tmp[i++]='0'; - else while (num != 0) - tmp[i++] = digits[do_div(num,base)]; + else while (num != 0) { + tmp[i++] = digits[num % base]; + num /= base; + } if (i > precision) precision = i; size -= precision; @@ -424,7 +426,7 @@ int vsprintf(char *buf, const char *fmt, va_list args) { int len; - unsigned long long num; + unsigned long num; int i, base; char * str; const char *s; @@ -575,9 +577,7 @@ --fmt; continue; } - if (qualifier == 'L') - num = va_arg(args, long long); - else if (qualifier == 'l') { + if (qualifier == 'l') { num = va_arg(args, unsigned long); if (flags & SIGN) num = (signed long) num; diff -Nru a/arch/ppc64/boot/zlib.c b/arch/ppc64/boot/zlib.c --- a/arch/ppc64/boot/zlib.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/boot/zlib.c Tue Feb 17 20:00:06 2004 @@ -102,9 +102,8 @@ /* functions */ -#include +extern void *memcpy(void *, const void *, unsigned long); #define zmemcpy memcpy -#define zmemzero(dest, len) memset(dest, 0, len) /* Diagnostic functions */ #ifdef DEBUG_ZLIB diff -Nru a/arch/ppc64/configs/g5_defconfig b/arch/ppc64/configs/g5_defconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/configs/g5_defconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,1077 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_EARLY_PRINTK=y +CONFIG_COMPAT=y +CONFIG_FRAME_POINTER=y +CONFIG_FORCE_MAX_ZONEORDER=13 + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_LOG_BUF_SHIFT=17 +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# Platform support +# +# CONFIG_PPC_ISERIES is not set +CONFIG_PPC_PSERIES=y +CONFIG_PPC=y +CONFIG_PPC64=y +CONFIG_PPC_OF=y +CONFIG_ALTIVEC=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PMAC64=y +CONFIG_BOOTX_TEXT=y +CONFIG_POWER4_ONLY=y +CONFIG_SMP=y +CONFIG_IRQ_ALL_CPUS=y +CONFIG_NR_CPUS=2 +# CONFIG_HMT is not set +CONFIG_DISCONTIGMEM=y +# CONFIG_NUMA is not set +# CONFIG_PPC_RTAS is not set +# CONFIG_LPARCFG is not set + +# +# General setup +# +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +# CONFIG_PCMCIA is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set +CONFIG_PROC_DEVICETREE=y +# CONFIG_CMDLINE_BOOL is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_FW_LOADER=y + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_IDEDISK_STROKE is not set +CONFIG_BLK_DEV_IDECD=y +CONFIG_BLK_DEV_IDETAPE=y +CONFIG_BLK_DEV_IDEFLOPPY=y +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_SL82C105 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=y +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_REPORT_LUNS=y +CONFIG_SCSI_CONSTANTS=y +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_MEGARAID is not set +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=y +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_PROMISE is not set +# CONFIG_SCSI_SATA_VIA is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +CONFIG_SCSI_QLA2XXX=y +# CONFIG_SCSI_QLA21XX is not set +# CONFIG_SCSI_QLA22XX is not set +# CONFIG_SCSI_QLA2300 is not set +# CONFIG_SCSI_QLA2322 is not set +# CONFIG_SCSI_QLA6312 is not set +# CONFIG_SCSI_QLA6322 is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_MESH is not set +# CONFIG_SCSI_MAC53C94 is not set + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=y +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +CONFIG_MD_RAID5=y +# CONFIG_MD_RAID6 is not set +# CONFIG_MD_MULTIPATH is not set +CONFIG_BLK_DEV_DM=y +CONFIG_DM_IOCTL_V4=y + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +CONFIG_IEEE1394=y + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y + +# +# Device Drivers +# +# CONFIG_IEEE1394_PCILYNX is not set +CONFIG_IEEE1394_OHCI1394=y + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=y +# CONFIG_IEEE1394_CMP is not set + +# +# I2O device support +# + +# +# Macintosh device drivers +# +CONFIG_ADB_PMU=y +# CONFIG_PMAC_PBOOK is not set +# CONFIG_PMAC_BACKLIGHT is not set +# CONFIG_MAC_SERIAL is not set +CONFIG_ADB=y +# CONFIG_INPUT_ADBHID is not set +CONFIG_THERM_PM72=y + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +CONFIG_UNIX=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=y +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +CONFIG_INET_ECN=y +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +# CONFIG_IPV6 is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_MACE is not set +# CONFIG_BMAC is not set +# CONFIG_OAKNET is not set +# CONFIG_HAPPYMEAL is not set +CONFIG_SUNGEM=y +# CONFIG_NET_VENDOR_3COM is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +# CONFIG_NET_PCI is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=y +CONFIG_ACENIC_OMIT_TIGON_I=y +# CONFIG_DL2K is not set +CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SK98LIN is not set +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +# CONFIG_IXGB is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=y +# CONFIG_IBMLS is not set +# CONFIG_3C359 is not set +# CONFIG_TMS380TR is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# Bluetooth support +# +# CONFIG_BT is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN_BOOL is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_PMACZILOG is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 +CONFIG_HVC_CONSOLE=y + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_AGP is not set +# CONFIG_DRM is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=y + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_ALGOPCF is not set + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_ELV is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +# CONFIG_I2C_ISA is not set +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PROSAVAGE is not set +# CONFIG_I2C_SAVAGE4 is not set +# CONFIG_SCx200_ACB is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VELLEMAN is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_VOODOO3 is not set + +# +# I2C Hardware Sensors Chip support +# +# CONFIG_I2C_SENSOR is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_FSCHER is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FB=y +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +# CONFIG_FB_CONTROL is not set +# CONFIG_FB_PLATINUM is not set +# CONFIG_FB_VALKYRIE is not set +# CONFIG_FB_CT65550 is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S3TRIO is not set +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=y +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_UHCI_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_BLUETOOTH_TTY is not set +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +CONFIG_USB_STORAGE_DEBUG=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_XPAD is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# +# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_TIGL is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_BRLVGER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_TEST is not set + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +# CONFIG_EXT2_FS_SECURITY is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_AUTOFS_FS=m +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=m + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +# CONFIG_DEVFS_FS is not set +CONFIG_DEVPTS_FS=y +CONFIG_DEVPTS_FS_XATTR=y +# CONFIG_DEVPTS_FS_SECURITY is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +# CONFIG_MSDOS_PARTITION is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_NEC98_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_XMON is not set +# CONFIG_PPCDBG is not set +# CONFIG_DEBUG_INFO is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC32=y +CONFIG_ZLIB_INFLATE=m +CONFIG_ZLIB_DEFLATE=m diff -Nru a/arch/ppc64/configs/pSeries_defconfig b/arch/ppc64/configs/pSeries_defconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/configs/pSeries_defconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,783 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_EARLY_PRINTK=y +CONFIG_COMPAT=y +CONFIG_FRAME_POINTER=y +CONFIG_FORCE_MAX_ZONEORDER=13 + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# Platform support +# +# CONFIG_PPC_ISERIES is not set +CONFIG_PPC_PSERIES=y +CONFIG_PPC=y +CONFIG_PPC64=y +CONFIG_PPC_OF=y +CONFIG_ALTIVEC=y +# CONFIG_PPC_PMAC is not set +# CONFIG_BOOTX_TEXT is not set +# CONFIG_POWER4_ONLY is not set +CONFIG_SMP=y +CONFIG_IRQ_ALL_CPUS=y +CONFIG_NR_CPUS=32 +# CONFIG_HMT is not set +# CONFIG_DISCONTIGMEM is not set +CONFIG_PPC_RTAS=y +CONFIG_RTAS_FLASH=m +CONFIG_SCANLOG=m +CONFIG_LPARCFG=y + +# +# General setup +# +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y +# CONFIG_HOTPLUG is not set +CONFIG_PROC_DEVICETREE=y +# CONFIG_CMDLINE_BOOL is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y + +# +# ATA/ATAPI/MFM/RLL support +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=y +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_REPORT_LUNS=y +CONFIG_SCSI_CONSTANTS=y +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_MEGARAID is not set +# CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +CONFIG_SCSI_QLA2XXX=y +CONFIG_SCSI_QLA21XX=y +CONFIG_SCSI_QLA22XX=y +# CONFIG_SCSI_QLA2300 is not set +# CONFIG_SCSI_QLA2322 is not set +# CONFIG_SCSI_QLA6312 is not set +# CONFIG_SCSI_QLA6322 is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=y +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +CONFIG_MD_RAID5=y +# CONFIG_MD_RAID6 is not set +# CONFIG_MD_MULTIPATH is not set +CONFIG_BLK_DEV_DM=y +CONFIG_DM_IOCTL_V4=y + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# + +# +# Macintosh device drivers +# + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +CONFIG_UNIX=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=y +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +CONFIG_INET_ECN=y +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +# CONFIG_IPV6 is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_OAKNET is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=y +# CONFIG_TYPHOON is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +CONFIG_NET_PCI=y +CONFIG_PCNET32=y +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=y +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_VIA_RHINE is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=y +CONFIG_ACENIC_OMIT_TIGON_I=y +# CONFIG_DL2K is not set +CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_IXGB is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# Bluetooth support +# +# CONFIG_BT is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN_BOOL is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=y +# CONFIG_INPUT_UINPUT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_PMACZILOG is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 +CONFIG_HVC_CONSOLE=y + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_AGP is not set +# CONFIG_DRM is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FB=y +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +# CONFIG_FB_CT65550 is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S3TRIO is not set +# CONFIG_FB_VGA16 is not set +# CONFIG_FB_RIVA is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +# CONFIG_EXT2_FS_SECURITY is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=y +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_JFS_FS=y +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_AUTOFS_FS=m +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=m + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +# CONFIG_DEVFS_FS is not set +CONFIG_DEVPTS_FS=y +CONFIG_DEVPTS_FS_XATTR=y +# CONFIG_DEVPTS_FS_SECURITY is not set +CONFIG_TMPFS=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_XMON=y +CONFIG_XMON_DEFAULT=y +# CONFIG_PPCDBG is not set +# CONFIG_DEBUG_INFO is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC32=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m diff -Nru a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile --- a/arch/ppc64/kernel/Makefile Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/Makefile Tue Feb 17 20:00:08 2004 @@ -10,9 +10,11 @@ align.o semaphore.o bitops.o stab.o pacaData.o \ udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o \ ptrace32.o signal32.o pmc.o rtc.o init_task.o \ - lmb.o cputable.o + lmb.o cputable.o cpu_setup_power4.o idle_power4.o -obj-$(CONFIG_PCI) += pci.o pci_dn.o pci_dma.o +obj-$(CONFIG_PPC_OF) += of_device.o + +obj-$(CONFIG_PCI) += pci.o pci_dn.o pci_dma.o pci_dma_direct.o ifdef CONFIG_PPC_ISERIES obj-$(CONFIG_PCI) += iSeries_pci.o iSeries_pci_reset.o \ @@ -27,7 +29,7 @@ proc_pmc.o obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \ - eeh.o nvram.o rtasd.o ras.o \ + eeh.o nvram.o pSeries_nvram.o rtasd.o ras.o \ open_pic.o xics.o pSeries_htab.o rtas.o \ chrp_setup.o i8259.o prom.o vio.o @@ -39,6 +41,14 @@ obj-$(CONFIG_SCANLOG) += scanlog.o obj-$(CONFIG_VIOPATH) += viopath.o obj-$(CONFIG_LPARCFG) += lparcfg.o +obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o +obj-$(CONFIG_BOOTX_TEXT) += btext.o +obj-$(CONFIG_PPC_PMAC) += pmac_setup.o pmac_feature.o pmac_pci.o \ + pmac_time.o pmac_nvram.o pmac_low_i2c.o \ + open_pic_u3.o +ifdef CONFIG_SMP +obj-$(CONFIG_PPC_PMAC) += pmac_smp.o smp-tbsync.o +endif CFLAGS_ioctl32.o += -Ifs/ diff -Nru a/arch/ppc64/kernel/btext.c b/arch/ppc64/kernel/btext.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/btext.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,748 @@ +/* + * Procedures for drawing on the screen early on in the boot process. + * + * Benjamin Herrenschmidt + */ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef NO_SCROLL + +#ifndef NO_SCROLL +static void scrollscreen(void); +#endif + +static void draw_byte(unsigned char c, long locX, long locY); +static void draw_byte_32(unsigned char *bits, unsigned int *base, int rb); +static void draw_byte_16(unsigned char *bits, unsigned int *base, int rb); +static void draw_byte_8(unsigned char *bits, unsigned int *base, int rb); + +static int g_loc_X; +static int g_loc_Y; +static int g_max_loc_X; +static int g_max_loc_Y; + +unsigned long disp_BAT[2] __initdata = {0, 0}; + +#define cmapsz (16*256) + +static unsigned char vga_font[cmapsz]; + +int boot_text_mapped; +int force_printk_to_btext = 0; + +boot_infos_t disp_bi; + +extern char *klimit; + +/* This function will enable the early boot text when doing OF booting. This + * way, xmon output should work too + */ +void __init btext_setup_display(int width, int height, int depth, int pitch, + unsigned long address) +{ + unsigned long offset = reloc_offset(); + boot_infos_t* bi = PTRRELOC(&disp_bi); + + RELOC(g_loc_X) = 0; + RELOC(g_loc_Y) = 0; + RELOC(g_max_loc_X) = width / 8; + RELOC(g_max_loc_Y) = height / 16; + bi->logicalDisplayBase = (unsigned char *)address; + bi->dispDeviceBase = (unsigned char *)address; + bi->dispDeviceRowBytes = pitch; + bi->dispDeviceDepth = depth; + bi->dispDeviceRect[0] = bi->dispDeviceRect[1] = 0; + bi->dispDeviceRect[2] = width; + bi->dispDeviceRect[3] = height; + RELOC(boot_text_mapped) = 1; +} + +/* Here's a small text engine to use during early boot + * or for debugging purposes + * + * todo: + * + * - build some kind of vgacon with it to enable early printk + * - move to a separate file + * - add a few video driver hooks to keep in sync with display + * changes. + */ + +void map_boot_text(void) +{ + unsigned long base, offset, size; + boot_infos_t *bi = &disp_bi; + unsigned char *vbase; + + /* By default, we are no longer mapped */ + boot_text_mapped = 0; + if (bi->dispDeviceBase == 0) + return; + base = ((unsigned long) bi->dispDeviceBase) & 0xFFFFF000UL; + offset = ((unsigned long) bi->dispDeviceBase) - base; + size = bi->dispDeviceRowBytes * bi->dispDeviceRect[3] + offset + + bi->dispDeviceRect[0]; + vbase = __ioremap(base, size, _PAGE_NO_CACHE); + if (vbase == 0) + return; + bi->logicalDisplayBase = vbase + offset; + boot_text_mapped = 1; +} + +/* Calc the base address of a given point (x,y) */ +static unsigned char * calc_base(boot_infos_t *bi, int x, int y) +{ + unsigned char *base; + + base = bi->logicalDisplayBase; + if (base == 0) + base = bi->dispDeviceBase; + base += (x + bi->dispDeviceRect[0]) * (bi->dispDeviceDepth >> 3); + base += (y + bi->dispDeviceRect[1]) * bi->dispDeviceRowBytes; + return base; +} + +/* Adjust the display to a new resolution */ +void btext_update_display(unsigned long phys, int width, int height, + int depth, int pitch) +{ + boot_infos_t *bi = &disp_bi; + + if (bi->dispDeviceBase == 0) + return; + + /* check it's the same frame buffer (within 256MB) */ + if ((phys ^ (unsigned long)bi->dispDeviceBase) & 0xf0000000) + return; + + bi->dispDeviceBase = (__u8 *) phys; + bi->dispDeviceRect[0] = 0; + bi->dispDeviceRect[1] = 0; + bi->dispDeviceRect[2] = width; + bi->dispDeviceRect[3] = height; + bi->dispDeviceDepth = depth; + bi->dispDeviceRowBytes = pitch; + if (boot_text_mapped) { + iounmap(bi->logicalDisplayBase); + boot_text_mapped = 0; + } + map_boot_text(); + g_loc_X = 0; + g_loc_Y = 0; + g_max_loc_X = width / 8; + g_max_loc_Y = height / 16; +} + +void btext_clearscreen(void) +{ + unsigned long offset = reloc_offset(); + boot_infos_t* bi = PTRRELOC(&disp_bi); + unsigned long *base = (unsigned long *)calc_base(bi, 0, 0); + unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) * + (bi->dispDeviceDepth >> 3)) >> 3; + int i,j; + + for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++) + { + unsigned long *ptr = base; + for(j=width; j; --j) + *(ptr++) = 0; + base += (bi->dispDeviceRowBytes >> 3); + } +} + +#ifndef NO_SCROLL +static void scrollscreen(void) +{ + unsigned long offset = reloc_offset(); + boot_infos_t* bi = PTRRELOC(&disp_bi); + unsigned long *src = (unsigned long *)calc_base(bi,0,16); + unsigned long *dst = (unsigned long *)calc_base(bi,0,0); + unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) * + (bi->dispDeviceDepth >> 3)) >> 3; + int i,j; + + for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1] - 16); i++) + { + unsigned long *src_ptr = src; + unsigned long *dst_ptr = dst; + for(j=width; j; --j) + *(dst_ptr++) = *(src_ptr++); + src += (bi->dispDeviceRowBytes >> 3); + dst += (bi->dispDeviceRowBytes >> 3); + } + for (i=0; i<16; i++) + { + unsigned long *dst_ptr = dst; + for(j=width; j; --j) + *(dst_ptr++) = 0; + dst += (bi->dispDeviceRowBytes >> 3); + } +} +#endif /* ndef NO_SCROLL */ + +void btext_drawchar(char c) +{ + unsigned long offset = reloc_offset(); + int cline = 0; +#ifdef NO_SCROLL + int x; +#endif + if (!RELOC(boot_text_mapped)) + return; + + switch (c) { + case '\b': + if (RELOC(g_loc_X) > 0) + --RELOC(g_loc_X); + break; + case '\t': + RELOC(g_loc_X) = (RELOC(g_loc_X) & -8) + 8; + break; + case '\r': + RELOC(g_loc_X) = 0; + break; + case '\n': + RELOC(g_loc_X) = 0; + RELOC(g_loc_Y)++; + cline = 1; + break; + default: + draw_byte(c, RELOC(g_loc_X)++, RELOC(g_loc_Y)); + } + if (RELOC(g_loc_X) >= RELOC(g_max_loc_X)) { + RELOC(g_loc_X) = 0; + RELOC(g_loc_Y)++; + cline = 1; + } +#ifndef NO_SCROLL + while (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) { + scrollscreen(); + RELOC(g_loc_Y)--; + } +#else + /* wrap around from bottom to top of screen so we don't + waste time scrolling each line. -- paulus. */ + if (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) + RELOC(g_loc_Y) = 0; + if (cline) { + for (x = 0; x < RELOC(g_max_loc_X); ++x) + draw_byte(' ', x, RELOC(g_loc_Y)); + } +#endif +} + +void btext_drawstring(const char *c) +{ + unsigned long offset = reloc_offset(); + + if (!RELOC(boot_text_mapped)) + return; + while (*c) + btext_drawchar(*c++); +} + +void btext_drawhex(unsigned long v) +{ + unsigned long offset = reloc_offset(); + char *hex_table = RELOC("0123456789abcdef"); + + if (!RELOC(boot_text_mapped)) + return; + btext_drawchar(hex_table[(v >> 60) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 56) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 52) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 48) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 44) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 40) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 36) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 32) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 28) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 24) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 20) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 16) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 12) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 8) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 4) & 0x0000000FUL]); + btext_drawchar(hex_table[(v >> 0) & 0x0000000FUL]); + btext_drawchar(' '); +} + +static void draw_byte(unsigned char c, long locX, long locY) +{ + unsigned long offset = reloc_offset(); + boot_infos_t* bi = PTRRELOC(&disp_bi); + unsigned char *base = calc_base(bi, locX << 3, locY << 4); + unsigned char *font = PTRRELOC(&vga_font[((unsigned int)c) * 16]); + int rb = bi->dispDeviceRowBytes; + +#if 0 + switch(bi->dispDeviceDepth) { + case 24: + case 32: + draw_byte_32(font, (unsigned int *)base, rb); + break; + case 15: + case 16: + draw_byte_16(font, (unsigned int *)base, rb); + break; + case 8: + draw_byte_8(font, (unsigned int *)base, rb); + break; + } +#else + if(bi->dispDeviceDepth == 24 || + bi->dispDeviceDepth == 32) { + draw_byte_32(font, (unsigned int *)base, rb); + } else if(bi->dispDeviceDepth == 15 || + bi->dispDeviceDepth == 16) { + draw_byte_16(font, (unsigned int *)base, rb); + } else if(bi->dispDeviceDepth == 8) { + draw_byte_8(font, (unsigned int *)base, rb); + } +#endif +} + +static unsigned int expand_bits_8[16] = { + 0x00000000, + 0x000000ff, + 0x0000ff00, + 0x0000ffff, + 0x00ff0000, + 0x00ff00ff, + 0x00ffff00, + 0x00ffffff, + 0xff000000, + 0xff0000ff, + 0xff00ff00, + 0xff00ffff, + 0xffff0000, + 0xffff00ff, + 0xffffff00, + 0xffffffff +}; + +static unsigned int expand_bits_16[4] = { + 0x00000000, + 0x0000ffff, + 0xffff0000, + 0xffffffff +}; + + +static void draw_byte_32(unsigned char *font, unsigned int *base, int rb) +{ + int l, bits; + int fg = 0xFFFFFFFFUL; + int bg = 0x00000000UL; + + for (l = 0; l < 16; ++l) + { + bits = *font++; + base[0] = (-(bits >> 7) & fg) ^ bg; + base[1] = (-((bits >> 6) & 1) & fg) ^ bg; + base[2] = (-((bits >> 5) & 1) & fg) ^ bg; + base[3] = (-((bits >> 4) & 1) & fg) ^ bg; + base[4] = (-((bits >> 3) & 1) & fg) ^ bg; + base[5] = (-((bits >> 2) & 1) & fg) ^ bg; + base[6] = (-((bits >> 1) & 1) & fg) ^ bg; + base[7] = (-(bits & 1) & fg) ^ bg; + base = (unsigned int *) ((char *)base + rb); + } +} + +static void draw_byte_16(unsigned char *font, unsigned int *base, int rb) +{ + int l, bits; + int fg = 0xFFFFFFFFUL; + int bg = 0x00000000UL; + unsigned long offset = reloc_offset(); + unsigned int *eb = PTRRELOC((int *)expand_bits_16); + + for (l = 0; l < 16; ++l) + { + bits = *font++; + base[0] = (eb[bits >> 6] & fg) ^ bg; + base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg; + base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg; + base[3] = (eb[bits & 3] & fg) ^ bg; + base = (unsigned int *) ((char *)base + rb); + } +} + +static void draw_byte_8(unsigned char *font, unsigned int *base, int rb) +{ + int l, bits; + int fg = 0x0F0F0F0FUL; + int bg = 0x00000000UL; + unsigned long offset = reloc_offset(); + unsigned int *eb = PTRRELOC((int *)expand_bits_8); + + for (l = 0; l < 16; ++l) + { + bits = *font++; + base[0] = (eb[bits >> 4] & fg) ^ bg; + base[1] = (eb[bits & 0xf] & fg) ^ bg; + base = (unsigned int *) ((char *)base + rb); + } +} + +static unsigned char vga_font[cmapsz] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, +0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, +0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, +0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, +0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, +0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, +0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e, +0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, +0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, +0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, +0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e, +0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, +0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, +0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, +0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, +0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, +0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, +0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, +0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, +0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, +0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, +0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, +0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, +0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, +0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, +0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, +0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, +0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, +0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, +0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, +0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, +0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, +0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, +0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde, +0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, +0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, +0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c, +0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, +0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, +0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, +0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, +0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7, +0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, +0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, +0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, +0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, +0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, +0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, +0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, +0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, +0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, +0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, +0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, +0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60, +0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, +0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60, +0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb, +0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, +0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, +0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, +0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, +0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, +0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, +0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18, +0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, +0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, +0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, +0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, +0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, +0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, +0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, +0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, +0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, +0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, +0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, +0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, +0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, +0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, +0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, +0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, +0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b, +0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, +0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, +0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, +0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, +0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, +0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, +0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, +0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18, +0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, +0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, +0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, +0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, +0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, +0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, +0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, +0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, +0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06, +0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, +0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, +0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, +0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44, +0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, +0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, +0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, +0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, +0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, +0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, +0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, +0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, +0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, +0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, +0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, +0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, +0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, +0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, +0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, +0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, +0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, +0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, +0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, +0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, +0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +}; diff -Nru a/arch/ppc64/kernel/chrp_setup.c b/arch/ppc64/kernel/chrp_setup.c --- a/arch/ppc64/kernel/chrp_setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/chrp_setup.c Tue Feb 17 20:00:06 2004 @@ -67,9 +67,10 @@ void chrp_progress(char *, unsigned short); -extern void openpic_init_IRQ(void); +extern void pSeries_init_openpic(void); extern void find_and_init_phbs(void); +extern void pSeries_final_fixup(void); extern void pSeries_get_boot_time(struct rtc_time *rtc_time); extern void pSeries_get_rtc_time(struct rtc_time *rtc_time); @@ -178,6 +179,10 @@ #ifdef CONFIG_DUMMY_CONSOLE conswitchp = &dummy_con; #endif + +#ifdef CONFIG_PPC_PSERIES + pSeries_nvram_init(); +#endif } void __init @@ -252,7 +257,7 @@ ppc_md.setup_residual = NULL; ppc_md.get_cpuinfo = chrp_get_cpuinfo; if(naca->interrupt_controller == IC_OPEN_PIC) { - ppc_md.init_IRQ = openpic_init_IRQ; + ppc_md.init_IRQ = pSeries_init_openpic; ppc_md.get_irq = openpic_get_irq; } else { ppc_md.init_IRQ = xics_init_IRQ; @@ -261,6 +266,8 @@ ppc_md.init = chrp_init2; + ppc_md.pcibios_fixup = pSeries_final_fixup; + ppc_md.restart = rtas_restart; ppc_md.power_off = rtas_power_off; ppc_md.halt = rtas_halt; @@ -271,9 +278,6 @@ ppc_md.calibrate_decr = pSeries_calibrate_decr; ppc_md.progress = chrp_progress; - - ppc_md.nvram_read = pSeries_nvram_read; - ppc_md.nvram_write = pSeries_nvram_write; /* Build up the firmware_features bitmask field * using contents of device-tree/ibm,hypertas-functions. diff -Nru a/arch/ppc64/kernel/cpu_setup_power4.S b/arch/ppc64/kernel/cpu_setup_power4.S --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/cpu_setup_power4.S Tue Feb 17 20:00:14 2004 @@ -0,0 +1,179 @@ +/* + * This file contains low level CPU setup functions. + * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +_GLOBAL(__power4_cpu_preinit) + /* + * On the PPC970, we have to turn off real-mode cache inhibit + * early, before we first turn the MMU off. + */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bnelr + + li r0,0 + sync + mtspr SPRN_HID4,r0 + isync + sync + mtspr SPRN_HID5,r0 + isync + + mfspr r0,SPRN_HID1 + li r11,0x1200 /* enable i-fetch cacheability */ + sldi r11,r11,44 /* and prefetch */ + or r0,r0,r11 + mtspr SPRN_HID1,r0 + mtspr SPRN_HID1,r0 + isync + li r0,0 + sync + mtspr SPRN_HIOR,0 /* Clear interrupt prefix */ + isync + blr + +_GLOBAL(__setup_cpu_power4) + blr + +_GLOBAL(__setup_cpu_ppc970) + mfspr r0,SPRN_HID0 + li r11,5 /* clear DOZE and SLEEP */ + rldimi r0,r11,52,8 /* set NAP and DPM */ + mtspr SPRN_HID0,r0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + mfspr r0,SPRN_HID0 + sync + isync + blr + +/* Definitions for the table use to save CPU states */ +#define CS_HID0 0 +#define CS_HID1 8 +#define CS_HID4 16 +#define CS_HID5 24 +#define CS_SIZE 32 + + .data + .balign L1_CACHE_BYTES,0 +cpu_state_storage: + .space CS_SIZE + .balign L1_CACHE_BYTES,0 + .text + +/* Called in normal context to backup CPU 0 state. This + * does not include cache settings. This function is also + * called for machine sleep. This does not include the MMU + * setup, BATs, etc... but rather the "special" registers + * like HID0, HID1, HID4, etc... + */ +_GLOBAL(__save_cpu_setup) + /* Some CR fields are volatile, we back it up all */ + mfcr r7 + + /* Get storage ptr */ + LOADADDR(r5,cpu_state_storage) + + /* We only deal with 970 for now */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bne 1f + + /* Save HID0,1,4 and 5 */ + mfspr r3,SPRN_HID0 + std r3,CS_HID0(r5) + mfspr r3,SPRN_HID1 + std r3,CS_HID1(r5) + mfspr r3,SPRN_HID4 + std r3,CS_HID4(r5) + mfspr r3,SPRN_HID5 + std r3,CS_HID5(r5) + +1: + mtcr r7 + blr + +/* Called with no MMU context (typically MSR:IR/DR off) to + * restore CPU state as backed up by the previous + * function. This does not include cache setting + */ +_GLOBAL(__restore_cpu_setup) + /* Get storage ptr (FIXME when using anton reloc as we + * are running with translation disabled here + */ + LOADADDR(r5,cpu_state_storage) + + /* We only deal with 970 for now */ + mfspr r0,SPRN_PVR + srwi r0,r0,16 + cmpwi r0,0x39 + bne 1f + + /* Clear interrupt prefix */ + li r0,0 + sync + mtspr SPRN_HIOR,0 + isync + + /* Restore HID0 */ + ld r3,CS_HID0(r5) + sync + isync + mtspr SPRN_HID0,r3 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + mfspr r3,SPRN_HID0 + sync + isync + + /* Restore HID1 */ + ld r3,CS_HID1(r5) + sync + isync + mtspr SPRN_HID1,r3 + mtspr SPRN_HID1,r3 + sync + isync + + /* Restore HID4 */ + ld r3,CS_HID4(r5) + sync + isync + mtspr SPRN_HID4,r3 + sync + isync + + /* Restore HID5 */ + ld r3,CS_HID5(r5) + sync + isync + mtspr SPRN_HID5,r3 + sync + isync +1: + blr + diff -Nru a/arch/ppc64/kernel/cputable.c b/arch/ppc64/kernel/cputable.c --- a/arch/ppc64/kernel/cputable.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc64/kernel/cputable.c Tue Feb 17 20:00:05 2004 @@ -30,6 +30,7 @@ */ extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec); +extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); /* We only set the altivec features if the kernel was compiled with altivec @@ -119,10 +120,10 @@ { /* PPC970 */ 0xffff0000, 0x00390000, "PPC970", CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | - CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP, + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP, COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP, 128, 128, - __setup_cpu_power4, + __setup_cpu_ppc970, COMMON_PPC64_FW }, { /* Power5 */ diff -Nru a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S --- a/arch/ppc64/kernel/head.S Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/head.S Tue Feb 17 20:00:07 2004 @@ -52,7 +52,7 @@ /* * hcall interface to pSeries LPAR */ -#define HSC .long 0x44000022 +#define HVSC .long 0x44000022 #define H_SET_ASR 0x30 /* @@ -1320,6 +1320,16 @@ #endif #ifdef CONFIG_PPC_PSERIES + +_STATIC(mmu_off) + mfmsr r3 + andi. r0,r3,MSR_IR|MSR_DR + beqlr + andc r3,r3,r0 + mtspr SRR0,r4 + mtspr SRR1,r3 + sync + rfid _GLOBAL(__start_initialization_pSeries) mr r31,r3 /* save parameters */ mr r30,r4 @@ -1339,33 +1349,27 @@ /* Relocate the TOC from a virt addr to a real addr */ sub r2,r2,r3 - /* DRENG / PPPBBB Fix the following comment!!! -Peter */ - /* The following copies the first 0x100 bytes of code from the */ - /* load addr to physical addr 0x0. This code causes secondary */ - /* processors to spin until a flag in the PACA is set. This */ - /* is done at this time rather than with the entire kernel */ - /* relocation which is done below because we need to cause the */ - /* processors to spin on code that is not going to move while OF */ - /* is still alive. Although the spin code is not actually run on */ - /* a uniprocessor, we always do this copy. */ - SET_REG_TO_CONST(r4, KERNELBASE)/* Src addr */ - sub r4,r4,r3 /* current address of __start */ - /* the source addr */ - li r3,0 /* Dest addr */ - li r5,0x100 /* # bytes of memory to copy */ - li r6,0 /* Destination offset */ - bl .copy_and_flush /* copy the first 0x100 bytes */ - + /* Save parameters */ mr r3,r31 mr r4,r30 mr r5,r29 mr r6,r28 mr r7,r27 + /* Do all of the interaction with OF client interface */ bl .prom_init + mr r23,r3 /* Save phys address we are running at */ + + /* Setup some critical 970 SPRs before switching MMU off */ + bl .__power4_cpu_preinit li r24,0 /* cpu # */ + /* Switch off MMU if not already */ + LOADADDR(r4, .__after_prom_start - KERNELBASE) + add r4,r4,r23 + bl .mmu_off + /* * At this point, r3 contains the physical address we are running at, * returned by prom_init() @@ -1390,6 +1394,7 @@ li r3,0 /* target addr */ + // XXX FIXME: Use phys returned by OF (r23) sub r4,r27,r26 /* source addr */ /* current address of _start */ /* i.e. where we are running */ @@ -1425,7 +1430,7 @@ * * Note: this routine *only* clobbers r0, r6 and lr */ -_STATIC(copy_and_flush) +_GLOBAL(copy_and_flush) addi r5,r5,-8 addi r6,r6,-8 4: li r0,16 /* Use the least common */ @@ -1675,6 +1680,58 @@ #endif /* CONFIG_ALTIVEC */ #ifdef CONFIG_SMP +#ifdef CONFIG_PPC_PMAC +/* + * On PowerMac, secondary processors starts from the reset vector, which + * is temporarily turned into a call to one of the functions below. + */ + .section ".text"; + .align 2 ; + + .globl pmac_secondary_start_1 +pmac_secondary_start_1: + li r24, 1 + b .pmac_secondary_start + + .globl pmac_secondary_start_2 +pmac_secondary_start_2: + li r24, 2 + b .pmac_secondary_start + + .globl pmac_secondary_start_3 +pmac_secondary_start_3: + li r24, 3 + b .pmac_secondary_start + +_GLOBAL(pmac_secondary_start) + /* turn on 64-bit mode */ + bl .enable_64b_mode + isync + + /* Copy some CPU settings from CPU 0 */ + bl .__restore_cpu_setup + + /* pSeries do that early though I don't think we really need it */ + mfmsr r3 + ori r3,r3,MSR_RI + mtmsrd r3 /* RI on */ + + /* Set up a paca value for this processor. */ + LOADADDR(r4, paca) /* Get base vaddr of paca array */ + mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ + add r13,r13,r4 /* for this processor. */ + mtspr SPRG3,r13 /* Save vaddr of paca in SPRG3 */ + + /* Create a temp kernel stack for use before relocation is on. */ + mr r1,r13 + addi r1,r1,PACAGUARD + addi r1,r1,0x1000 + subi r1,r1,STACK_FRAME_OVERHEAD + + b .__secondary_start + +#endif /* CONFIG_PPC_PMAC */ + /* * This function is called after the master CPU has released the * secondary processors. The execution environment is relocation off. @@ -1743,7 +1800,7 @@ cmpwi r3,0x34 /* Pulsar */ bne 98f 97: li r3,H_SET_ASR /* hcall = H_SET_ASR */ - HSC /* Invoking hcall */ + HVSC /* Invoking hcall */ b 99f 98: /* !(rpa hypervisor) || !(star) */ mtasr r4 /* set the stab location */ @@ -1870,6 +1927,12 @@ li r0,0 stdu r0,-STACK_FRAME_OVERHEAD(r1) + /* set up the TOC (physical address) */ + LOADADDR(r2,__toc_start) + addi r2,r2,0x4000 + addi r2,r2,0x4000 + sub r2,r2,r26 + LOADADDR(r3,cpu_specs) sub r3,r3,r26 LOADADDR(r4,cur_cpu_spec) @@ -1877,12 +1940,6 @@ mr r5,r26 bl .identify_cpu - /* set up the TOC (physical address) */ - LOADADDR(r2,__toc_start) - addi r2,r2,0x4000 - addi r2,r2,0x4000 - sub r2,r2,r26 - /* Get the pointer to the segment table which is used by */ /* stab_initialize */ LOADADDR(r27, boot_cpuid) @@ -1912,7 +1969,7 @@ cmpwi r3,0x34 /* Pulsar */ bne 98f 97: li r3,H_SET_ASR /* hcall = H_SET_ASR */ - HSC /* Invoking hcall */ + HVSC /* Invoking hcall */ b 99f 98: /* !(rpa hypervisor) || !(star) */ mtasr r4 /* set the stab location */ @@ -1926,7 +1983,8 @@ li r3,SYSTEMCFG_PHYS_ADDR /* r3 = ptr to systemcfg */ lwz r3,PLATFORM(r3) /* r3 = platform flags */ - cmpldi r3,PLATFORM_PSERIES + /* Test if bit 0 is set (LPAR bit) */ + andi. r3,r3,0x1 bne 98f LOADADDR(r6,_SDR1) /* Only if NOT LPAR */ sub r6,r6,r26 @@ -1938,11 +1996,12 @@ mtspr SRR0,r3 mtspr SRR1,r4 rfid -#endif /* CONFIG_PPC_PSERIES */ - +#endif /* CONFIG_PPC_PSERIES */ + /* This is where all platforms converge execution */ _STATIC(start_here_common) - + /* relocation is on at this point */ + /* The following code sets up the SP and TOC now that we are */ /* running with translation enabled. */ @@ -2012,8 +2071,6 @@ bl .start_kernel _GLOBAL(__setup_cpu_power3) - blr -_GLOBAL(__setup_cpu_power4) blr _GLOBAL(hmt_init) diff -Nru a/arch/ppc64/kernel/hvconsole.c b/arch/ppc64/kernel/hvconsole.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/hvconsole.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,88 @@ +/* + * hvconsole.c + * Copyright (C) 2004 Hollis Blanchard, IBM Corporation + * + * LPAR console support. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include + +int hvc_get_chars(int index, char *buf, int count) +{ + unsigned long got; + + if (plpar_hcall(H_GET_TERM_CHAR, index, 0, 0, 0, &got, + (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) { + /* + * Work around a HV bug where it gives us a null + * after every \r. -- paulus + */ + if (got > 0) { + int i; + for (i = 1; i < got; ++i) { + if (buf[i] == 0 && buf[i-1] == '\r') { + --got; + if (i < got) + memmove(&buf[i], &buf[i+1], + got - i); + } + } + } + return got; + } + return 0; +} + +int hvc_put_chars(int index, const char *buf, int count) +{ + unsigned long *lbuf = (unsigned long *) buf; + long ret; + + ret = plpar_hcall_norets(H_PUT_TERM_CHAR, index, count, lbuf[0], + lbuf[1]); + if (ret == H_Success) + return count; + if (ret == H_Busy) + return 0; + return -1; +} + +/* return the number of client vterms present */ +/* XXX this requires an interface change to handle multiple discontiguous + * vterms */ +int hvc_count(int *start_termno) +{ + struct device_node *vty; + int num_found = 0; + + /* consider only the first vty node. + * we should _always_ be able to find one. */ + vty = of_find_node_by_name(NULL, "vty"); + if (vty && device_is_compatible(vty, "hvterm1")) { + u32 *termno = (u32 *)get_property(vty, "reg", 0); + + if (termno && start_termno) + *start_termno = *termno; + num_found = 1; + of_node_put(vty); + } + + return num_found; +} diff -Nru a/arch/ppc64/kernel/iSeries_htab.c b/arch/ppc64/kernel/iSeries_htab.c --- a/arch/ppc64/kernel/iSeries_htab.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/iSeries_htab.c Tue Feb 17 20:00:06 2004 @@ -109,6 +109,12 @@ return -1; } +/* + * The HyperVisor expects the "flags" argument in this form: + * bits 0..59 : reserved + * bit 60 : N + * bits 61..63 : PP2,PP1,PP0 + */ static long iSeries_hpte_updatepp(unsigned long slot, unsigned long newpp, unsigned long va, int large, int local) { @@ -117,7 +123,7 @@ HvCallHpt_get(&hpte, slot); if ((hpte.dw0.dw0.avpn == avpn) && (hpte.dw0.dw0.v)) { - HvCallHpt_setPp(slot, newpp); + HvCallHpt_setPp(slot, (newpp & 0x3) | ((newpp & 0x4) << 1)); return 0; } return -1; diff -Nru a/arch/ppc64/kernel/iSeries_pci.c b/arch/ppc64/kernel/iSeries_pci.c --- a/arch/ppc64/kernel/iSeries_pci.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/iSeries_pci.c Tue Feb 17 20:00:08 2004 @@ -241,9 +241,9 @@ } /* - * pcibios_final_fixup(void) + * iSeries_pci_final_fixup(void) */ -void __init pcibios_final_fixup(void) +void __init iSeries_pci_final_fixup(void) { struct pci_dev *pdev = NULL; struct iSeries_Device_Node *node; diff -Nru a/arch/ppc64/kernel/iSeries_setup.c b/arch/ppc64/kernel/iSeries_setup.c --- a/arch/ppc64/kernel/iSeries_setup.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/iSeries_setup.c Tue Feb 17 20:00:07 2004 @@ -63,10 +63,11 @@ static void build_iSeries_Memory_Map(void); static void setup_iSeries_cache_sizes(void); static void iSeries_bolt_kernel(unsigned long saddr, unsigned long eaddr); -void build_valid_hpte(unsigned long vsid, unsigned long ea, unsigned long pa, - pte_t *ptep, unsigned hpteflags, unsigned bolted); +extern void build_valid_hpte(unsigned long vsid, unsigned long ea, unsigned long pa, + pte_t *ptep, unsigned hpteflags, unsigned bolted); static void iSeries_setup_dprofile(void); -void iSeries_setup_arch(void); +extern void iSeries_setup_arch(void); +extern void iSeries_pci_final_fixup(void); /* Global Variables */ static unsigned long procFreqHz; @@ -317,6 +318,8 @@ ppc_md.init_irq_desc = iSeries_init_irq_desc; ppc_md.get_irq = iSeries_get_irq; ppc_md.init = NULL; + + ppc_md.pcibios_fixup = iSeries_pci_final_fixup; ppc_md.restart = iSeries_restart; ppc_md.power_off = iSeries_power_off; diff -Nru a/arch/ppc64/kernel/idle.c b/arch/ppc64/kernel/idle.c --- a/arch/ppc64/kernel/idle.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/idle.c Tue Feb 17 20:00:07 2004 @@ -42,6 +42,7 @@ extern long cede_processor(void); extern long poll_pending(void); +extern void power4_idle(void); int (*idle_loop)(void); @@ -161,7 +162,7 @@ struct paca_struct *lpaca = get_paca(), *ppaca; unsigned long start_snooze; - ppaca = &paca[(lpaca->xPacaIndex) ^ 1]; + ppaca = &paca[smp_processor_id() ^ 1]; while (1) { /* Indicate to the HV that we are idle. Now would be @@ -279,6 +280,17 @@ return 0; } +int native_idle(void) +{ + while(1) { + if (!need_resched()) + power4_idle(); + if (need_resched()) + schedule(); + } + return 0; +} + int idle_setup(void) { #ifdef CONFIG_PPC_ISERIES @@ -297,6 +309,9 @@ printk("idle = default_idle\n"); idle_loop = default_idle; } + } else if (systemcfg->platform == PLATFORM_POWERMAC) { + printk("idle = native_idle\n"); + idle_loop = native_idle; } else { printk("idle_setup: unknown platform, use default_idle\n"); idle_loop = default_idle; diff -Nru a/arch/ppc64/kernel/idle_power4.S b/arch/ppc64/kernel/idle_power4.S --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/idle_power4.S Tue Feb 17 20:00:14 2004 @@ -0,0 +1,79 @@ +/* + * This file contains the power_save function for 6xx & 7xxx CPUs + * rewritten in assembler + * + * Warning ! This code assumes that if your machine has a 750fx + * it will have PLL 1 set to low speed mode (used during NAP/DOZE). + * if this is not the case some additional changes will have to + * be done to check a runtime var (a bit like powersave-nap) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#undef DEBUG + + .text + +/* + * Here is the power_save_6xx function. This could eventually be + * split into several functions & changing the function pointer + * depending on the various features. + */ +_GLOBAL(power4_idle) +BEGIN_FTR_SECTION + blr +END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) + /* We must dynamically check for the NAP feature as it + * can be cleared by CPU init after the fixups are done + */ + LOADBASE(r3,cur_cpu_spec) + ld r4,cur_cpu_spec@l(r3) + ld r4,CPU_SPEC_FEATURES(r4) + andi. r0,r4,CPU_FTR_CAN_NAP + beqlr + /* Now check if user or arch enabled NAP mode */ + LOADBASE(r3,powersave_nap) + lwz r4,powersave_nap@l(r3) + cmpi 0,r4,0 + beqlr + + /* Clear MSR:EE */ + mfmsr r7 + li r4,0 + ori r4,r4,MSR_EE + andc r0,r7,r4 + mtmsrd r0 + + /* Check current_thread_info()->flags */ + clrrdi r4,r1,THREAD_SHIFT + ld r4,TI_FLAGS(r4) + andi. r0,r4,_TIF_NEED_RESCHED + beq 1f + mtmsrd r7 /* out of line this ? */ + blr +1: + /* Go to NAP now */ +BEGIN_FTR_SECTION + DSSALL + sync +END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) + oris r7,r7,MSR_POW@h + sync + isync + mtmsrd r7 + isync + sync + blr + diff -Nru a/arch/ppc64/kernel/lparcfg.c b/arch/ppc64/kernel/lparcfg.c --- a/arch/ppc64/kernel/lparcfg.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/lparcfg.c Tue Feb 17 20:00:06 2004 @@ -331,7 +331,7 @@ if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) { system_potential_processors = get_splpar_potential_characteristics(); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, - "system_active_processors=%d\n", + "system_active_processors=%ld\n", (h_resource >> 2*8) & 0xffff); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, "system_potential_processors=%d\n", @@ -373,16 +373,16 @@ if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) { n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, - "pool=%d\n", (h_aggregation >> 0*8)&0xffff); + "pool=%ld\n", (h_aggregation >> 0*8)&0xffff); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, - "pool_capacity=%d\n", (h_resource >> 3*8) &0xffff); + "pool_capacity=%ld\n", (h_resource >> 3*8) &0xffff); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, - "group=%d\n", (h_aggregation >> 2*8)&0xffff); + "group=%ld\n", (h_aggregation >> 2*8)&0xffff); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, - "capped=%d\n", (h_resource >> 6*8)&0x40); + "capped=%ld\n", (h_resource >> 6*8)&0x40); n += snprintf(buf+n, LPARCFG_BUFF_SIZE - n, "capacity_weight=%d\n", (int)(h_resource>>5*8)&0xFF); diff -Nru a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S --- a/arch/ppc64/kernel/misc.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/misc.S Tue Feb 17 20:00:08 2004 @@ -763,7 +763,7 @@ .llong .sys_fstat64 .llong .sys32_pciconfig_read .llong .sys32_pciconfig_write - .llong .sys_ni_syscall /* 200 - old pciconfig_iobase */ + .llong .sys32_pciconfig_iobase /* 200 - pciconfig_iobase */ .llong .sys_ni_syscall /* reserved for MacOnLinux */ .llong .sys_getdents64 .llong .sys_pivot_root @@ -1022,7 +1022,7 @@ .llong .sys_ni_syscall /* 32bit only fstat64 */ .llong .sys_ni_syscall /* 32bit only pciconfig_read */ .llong .sys_ni_syscall /* 32bit only pciconfig_write */ - .llong .sys_ni_syscall /* 200 - old pciconfig_iobase */ + .llong .sys_ni_syscall /* 32bit only pciconfig_iobase */ .llong .sys_ni_syscall /* reserved for MacOnLinux */ .llong .sys_getdents64 .llong .sys_pivot_root diff -Nru a/arch/ppc64/kernel/nvram.c b/arch/ppc64/kernel/nvram.c --- a/arch/ppc64/kernel/nvram.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc64/kernel/nvram.c Tue Feb 17 20:00:05 2004 @@ -9,6 +9,10 @@ * /dev/nvram driver for PPC64 * * This perhaps should live in drivers/char + * + * TODO: Split the /dev/nvram part (that one can use + * drivers/char/generic_nvram.c) from the arch & partition + * parsing code. */ #include @@ -34,16 +38,10 @@ static int nvram_setup_partition(void); static int nvram_create_os_partition(void); static int nvram_remove_os_partition(void); -static unsigned char nvram_checksum(struct nvram_header *p); -static int nvram_write_header(struct nvram_partition * part); -static unsigned int nvram_size; -static unsigned int nvram_fetch, nvram_store; -static char nvram_buf[NVRW_CNT]; /* assume this is in the first 4GB */ static struct nvram_partition * nvram_part; static long nvram_error_log_index = -1; static long nvram_error_log_size = 0; -static spinlock_t nvram_lock = SPIN_LOCK_UNLOCKED; volatile int no_more_logging = 1; /* Until we initialize everything, * make sure we don't try logging @@ -58,12 +56,18 @@ static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin) { + int size; + + if (ppc_md.nvram_size == NULL) + return -ENODEV; + size = ppc_md.nvram_size(); + switch (origin) { case 1: offset += file->f_pos; break; case 2: - offset += nvram_size; + offset += size; break; } if (offset < 0) @@ -78,13 +82,18 @@ { ssize_t len; char *tmp_buffer; + int size; + + if (ppc_md.nvram_size == NULL) + return -ENODEV; + size = ppc_md.nvram_size(); if (verify_area(VERIFY_WRITE, buf, count)) return -EFAULT; - if (*ppos >= nvram_size) + if (*ppos >= size) return 0; - if (count > nvram_size) - count = nvram_size; + if (count > size) + count = size; tmp_buffer = (char *) kmalloc(count, GFP_KERNEL); if (!tmp_buffer) { @@ -113,13 +122,18 @@ { ssize_t len; char * tmp_buffer; + int size; + + if (ppc_md.nvram_size == NULL) + return -ENODEV; + size = ppc_md.nvram_size(); if (verify_area(VERIFY_READ, buf, count)) return -EFAULT; - if (*ppos >= nvram_size) + if (*ppos >= size) return 0; - if (count > nvram_size) - count = nvram_size; + if (count > size) + count = size; tmp_buffer = (char *) kmalloc(count, GFP_KERNEL); if (!tmp_buffer) { @@ -145,6 +159,28 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + switch(cmd) { +#ifdef CONFIG_PPC_PMAC + case OBSOLETE_PMAC_NVRAM_GET_OFFSET: + printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n"); + case IOC_NVRAM_GET_OFFSET: { + int part, offset; + + if (systemcfg->platform != PLATFORM_POWERMAC) + return -EINVAL; + if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0) + return -EFAULT; + if (part < pmac_nvram_OF || part > pmac_nvram_NR) + return -EINVAL; + offset = pmac_get_partition(part); + if (offset < 0) + return offset; + if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0) + return -EFAULT; + return 0; + } +#endif /* CONFIG_PPC_PMAC */ + } return -EINVAL; } @@ -162,259 +198,75 @@ &nvram_fops }; -ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index) -{ - unsigned int i; - unsigned long len, done; - unsigned long flags; - char *p = buf; - - if (*index >= nvram_size) - return 0; - - i = *index; - if (i + count > nvram_size) - count = nvram_size - i; - - spin_lock_irqsave(&nvram_lock, flags); - - for (; count != 0; count -= len) { - len = count; - if (len > NVRW_CNT) - len = NVRW_CNT; - - if ((rtas_call(nvram_fetch, 3, 2, &done, i, __pa(nvram_buf), - len) != 0) || len != done) { - spin_unlock_irqrestore(&nvram_lock, flags); - return -EIO; - } - - memcpy(p, nvram_buf, len); - p += len; - i += len; - } - spin_unlock_irqrestore(&nvram_lock, flags); +static void nvram_print_partitions(char * label) +{ + struct list_head * p; + struct nvram_partition * tmp_part; - *index = i; - return p - buf; + printk(KERN_WARNING "--------%s---------\n", label); + printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); + list_for_each(p, &nvram_part->partition) { + tmp_part = list_entry(p, struct nvram_partition, partition); + printk(KERN_WARNING "%d \t%02x\t%02x\t%d\t%s\n", + tmp_part->index, tmp_part->header.signature, + tmp_part->header.checksum, tmp_part->header.length, + tmp_part->header.name); + } } -ssize_t pSeries_nvram_write(char *buf, size_t count, loff_t *index) -{ - unsigned int i; - unsigned long len, done; - unsigned long flags; - const char *p = buf; - - if (*index >= nvram_size) - return 0; - i = *index; - if (i + count > nvram_size) - count = nvram_size - i; - - spin_lock_irqsave(&nvram_lock, flags); - - for (; count != 0; count -= len) { - len = count; - if (len > NVRW_CNT) - len = NVRW_CNT; - - memcpy(nvram_buf, p, len); - - if ((rtas_call(nvram_store, 3, 2, &done, i, __pa(nvram_buf), - len) != 0) || len != done) { - spin_unlock_irqrestore(&nvram_lock, flags); - return -EIO; - } - - p += len; - i += len; - } - spin_unlock_irqrestore(&nvram_lock, flags); - - *index = i; - return p - buf; -} - -int __init nvram_init(void) +static int nvram_write_header(struct nvram_partition * part) { - struct device_node *nvram; - unsigned int *nbytes_p, proplen; - int error; + loff_t tmp_index; int rc; - if ((nvram = of_find_node_by_type(NULL, "nvram")) != NULL) { - nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen); - if (nbytes_p && proplen == sizeof(unsigned int)) { - nvram_size = *nbytes_p; - } else { - return -EIO; - } - } - nvram_fetch = rtas_token("nvram-fetch"); - nvram_store = rtas_token("nvram-store"); - printk(KERN_INFO "PPC64 nvram contains %d bytes\n", nvram_size); - of_node_put(nvram); - - rc = misc_register(&nvram_dev); - - /* If we don't know how big NVRAM is then we shouldn't touch - the nvram partitions */ - if (nvram == NULL) { - return rc; - } - - /* initialize our anchor for the nvram partition list */ - nvram_part = (struct nvram_partition *) kmalloc(sizeof(struct nvram_partition), GFP_KERNEL); - if (!nvram_part) { - printk(KERN_ERR "nvram_init: Failed kmalloc\n"); - return -ENOMEM; - } - INIT_LIST_HEAD(&nvram_part->partition); - - /* Get all the NVRAM partitions */ - error = nvram_scan_partitions(); - if (error) { - printk(KERN_ERR "nvram_init: Failed nvram_scan_partitions\n"); - return error; - } - - if(nvram_setup_partition()) - printk(KERN_WARNING "nvram_init: Could not find nvram partition" - " for nvram buffered error logging.\n"); - -#ifdef DEBUG_NVRAM - nvram_print_partitions("NVRAM Partitions"); -#endif + tmp_index = part->index; + rc = ppc_md.nvram_write((char *)&part->header, NVRAM_HEADER_LEN, &tmp_index); - return rc; + return rc; } -void __exit nvram_cleanup(void) -{ - misc_deregister( &nvram_dev ); -} -static int nvram_scan_partitions(void) +static unsigned char nvram_checksum(struct nvram_header *p) { - loff_t cur_index = 0; - struct nvram_header phead; - struct nvram_partition * tmp_part; - unsigned char c_sum; - char * header; - long size; - - header = (char *) kmalloc(NVRAM_HEADER_LEN, GFP_KERNEL); - if (!header) { - printk(KERN_ERR "nvram_scan_partitions: Failed kmalloc\n"); - return -ENOMEM; - } - - while (cur_index < nvram_size) { - - size = ppc_md.nvram_read(header, NVRAM_HEADER_LEN, &cur_index); - if (size != NVRAM_HEADER_LEN) { - printk(KERN_ERR "nvram_scan_partitions: Error parsing " - "nvram partitions\n"); - kfree(header); - return size; - } - - cur_index -= NVRAM_HEADER_LEN; /* nvram_read will advance us */ - - memcpy(&phead, header, NVRAM_HEADER_LEN); - - c_sum = nvram_checksum(&phead); - if (c_sum != phead.checksum) - printk(KERN_WARNING "WARNING: nvram partition checksum " - "was %02x, should be %02x!\n", phead.checksum, c_sum); - - tmp_part = (struct nvram_partition *) - kmalloc(sizeof(struct nvram_partition), GFP_KERNEL); - if (!tmp_part) { - printk(KERN_ERR "nvram_scan_partitions: kmalloc failed\n"); - kfree(header); - return -ENOMEM; - } - - memcpy(&tmp_part->header, &phead, NVRAM_HEADER_LEN); - tmp_part->index = cur_index; - list_add_tail(&tmp_part->partition, &nvram_part->partition); - - cur_index += phead.length * NVRAM_BLOCK_LEN; - } + unsigned int c_sum, c_sum2; + unsigned short *sp = (unsigned short *)p->name; /* assume 6 shorts */ + c_sum = p->signature + p->length + sp[0] + sp[1] + sp[2] + sp[3] + sp[4] + sp[5]; - kfree(header); - return 0; + /* The sum may have spilled into the 3rd byte. Fold it back. */ + c_sum = ((c_sum & 0xffff) + (c_sum >> 16)) & 0xffff; + /* The sum cannot exceed 2 bytes. Fold it into a checksum */ + c_sum2 = (c_sum >> 8) + (c_sum << 8); + c_sum = ((c_sum + c_sum2) >> 8) & 0xff; + return c_sum; } -/* nvram_setup_partition - * - * This will setup the partition we need for buffering the - * error logs and cleanup partitions if needed. - * - * The general strategy is the following: - * 1.) If there is ppc64,linux partition large enough then use it. - * 2.) If there is not a ppc64,linux partition large enough, search - * for a free partition that is large enough. - * 3.) If there is not a free partition large enough remove - * _all_ OS partitions and consolidate the space. - * 4.) Will first try getting a chunk that will satisfy the maximum - * error log size (NVRAM_MAX_REQ). - * 5.) If the max chunk cannot be allocated then try finding a chunk - * that will satisfy the minum needed (NVRAM_MIN_REQ). + +/* + * Find an nvram partition, sig can be 0 for any + * partition or name can be NULL for any name, else + * tries to match both */ -static int nvram_setup_partition(void) +struct nvram_partition *nvram_find_partition(int sig, const char *name) { - struct list_head * p; struct nvram_partition * part; - int rc; + struct list_head * p; - /* see if we have an OS partition that meets our needs. - will try getting the max we need. If not we'll delete - partitions and try again. */ list_for_each(p, &nvram_part->partition) { part = list_entry(p, struct nvram_partition, partition); - if (part->header.signature != NVRAM_SIG_OS) - continue; - if (strcmp(part->header.name, "ppc64,linux")) + if (sig && part->header.signature != sig) continue; - - if (part->header.length >= NVRAM_MIN_REQ) { - /* found our partition */ - nvram_error_log_index = part->index + NVRAM_HEADER_LEN; - nvram_error_log_size = ((part->header.length - 1) * - NVRAM_BLOCK_LEN) - sizeof(struct err_log_info); - return 0; - } - } - - /* try creating a partition with the free space we have */ - rc = nvram_create_os_partition(); - if (!rc) { - return 0; - } - - /* need to free up some space */ - rc = nvram_remove_os_partition(); - if (rc) { - return rc; - } - - /* create a partition in this new space */ - rc = nvram_create_os_partition(); - if (rc) { - printk(KERN_ERR "nvram_create_os_partition: Could not find a " - "NVRAM partition large enough\n"); - return rc; + if (name && 0 != strncmp(name, part->header.name, 12)) + continue; + return part; } - - return 0; + return NULL; } +EXPORT_SYMBOL(nvram_find_partition); + static int nvram_remove_os_partition(void) { @@ -572,22 +424,185 @@ } -void nvram_print_partitions(char * label) +/* nvram_setup_partition + * + * This will setup the partition we need for buffering the + * error logs and cleanup partitions if needed. + * + * The general strategy is the following: + * 1.) If there is ppc64,linux partition large enough then use it. + * 2.) If there is not a ppc64,linux partition large enough, search + * for a free partition that is large enough. + * 3.) If there is not a free partition large enough remove + * _all_ OS partitions and consolidate the space. + * 4.) Will first try getting a chunk that will satisfy the maximum + * error log size (NVRAM_MAX_REQ). + * 5.) If the max chunk cannot be allocated then try finding a chunk + * that will satisfy the minum needed (NVRAM_MIN_REQ). + */ +static int nvram_setup_partition(void) { struct list_head * p; + struct nvram_partition * part; + int rc; + + /* For now, we don't do any of this on pmac, until I + * have figured out if it's worth killing some unused stuffs + * in our nvram, as Apple defined partitions use pretty much + * all of the space + */ + if (systemcfg->platform == PLATFORM_POWERMAC) + return -ENOSPC; + + /* see if we have an OS partition that meets our needs. + will try getting the max we need. If not we'll delete + partitions and try again. */ + list_for_each(p, &nvram_part->partition) { + part = list_entry(p, struct nvram_partition, partition); + if (part->header.signature != NVRAM_SIG_OS) + continue; + + if (strcmp(part->header.name, "ppc64,linux")) + continue; + + if (part->header.length >= NVRAM_MIN_REQ) { + /* found our partition */ + nvram_error_log_index = part->index + NVRAM_HEADER_LEN; + nvram_error_log_size = ((part->header.length - 1) * + NVRAM_BLOCK_LEN) - sizeof(struct err_log_info); + return 0; + } + } + + /* try creating a partition with the free space we have */ + rc = nvram_create_os_partition(); + if (!rc) { + return 0; + } + + /* need to free up some space */ + rc = nvram_remove_os_partition(); + if (rc) { + return rc; + } + + /* create a partition in this new space */ + rc = nvram_create_os_partition(); + if (rc) { + printk(KERN_ERR "nvram_create_os_partition: Could not find a " + "NVRAM partition large enough\n"); + return rc; + } + + return 0; +} + + +static int nvram_scan_partitions(void) +{ + loff_t cur_index = 0; + struct nvram_header phead; struct nvram_partition * tmp_part; + unsigned char c_sum; + char * header; + long size; + int total_size; + + if (ppc_md.nvram_size == NULL) + return -ENODEV; + total_size = ppc_md.nvram_size(); - printk(KERN_WARNING "--------%s---------\n", label); - printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); - list_for_each(p, &nvram_part->partition) { - tmp_part = list_entry(p, struct nvram_partition, partition); - printk(KERN_WARNING "%d \t%02x\t%02x\t%d\t%s\n", - tmp_part->index, tmp_part->header.signature, - tmp_part->header.checksum, tmp_part->header.length, - tmp_part->header.name); + header = (char *) kmalloc(NVRAM_HEADER_LEN, GFP_KERNEL); + if (!header) { + printk(KERN_ERR "nvram_scan_partitions: Failed kmalloc\n"); + return -ENOMEM; + } + + while (cur_index < total_size) { + + size = ppc_md.nvram_read(header, NVRAM_HEADER_LEN, &cur_index); + if (size != NVRAM_HEADER_LEN) { + printk(KERN_ERR "nvram_scan_partitions: Error parsing " + "nvram partitions\n"); + kfree(header); + return size; + } + + cur_index -= NVRAM_HEADER_LEN; /* nvram_read will advance us */ + + memcpy(&phead, header, NVRAM_HEADER_LEN); + + c_sum = nvram_checksum(&phead); + if (c_sum != phead.checksum) + printk(KERN_WARNING "WARNING: nvram partition checksum " + "was %02x, should be %02x!\n", phead.checksum, c_sum); + + tmp_part = (struct nvram_partition *) + kmalloc(sizeof(struct nvram_partition), GFP_KERNEL); + if (!tmp_part) { + printk(KERN_ERR "nvram_scan_partitions: kmalloc failed\n"); + kfree(header); + return -ENOMEM; + } + + memcpy(&tmp_part->header, &phead, NVRAM_HEADER_LEN); + tmp_part->index = cur_index; + list_add_tail(&tmp_part->partition, &nvram_part->partition); + + cur_index += phead.length * NVRAM_BLOCK_LEN; } + + kfree(header); + return 0; } +static int __init nvram_init(void) +{ + int error; + int rc; + + if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() <= 0) + return -ENODEV; + + rc = misc_register(&nvram_dev); + if (rc != 0) { + printk(KERN_ERR "nvram_init: failed to register device\n"); + return rc; + } + + /* initialize our anchor for the nvram partition list */ + nvram_part = (struct nvram_partition *) kmalloc(sizeof(struct nvram_partition), GFP_KERNEL); + if (!nvram_part) { + printk(KERN_ERR "nvram_init: Failed kmalloc\n"); + return -ENOMEM; + } + INIT_LIST_HEAD(&nvram_part->partition); + + /* Get all the NVRAM partitions */ + error = nvram_scan_partitions(); + if (error) { + printk(KERN_ERR "nvram_init: Failed nvram_scan_partitions\n"); + return error; + } + + if(nvram_setup_partition()) + printk(KERN_WARNING "nvram_init: Could not find nvram partition" + " for nvram buffered error logging.\n"); + +#ifdef DEBUG_NVRAM + nvram_print_partitions("NVRAM Partitions"); +#endif + + return rc; +} + +void __exit nvram_cleanup(void) +{ + misc_deregister( &nvram_dev ); +} + + + /* nvram_write_error_log * * We need to buffer the error logs into nvram to ensure that we have @@ -711,30 +726,6 @@ return 0; } -static int nvram_write_header(struct nvram_partition * part) -{ - loff_t tmp_index; - int rc; - - tmp_index = part->index; - rc = ppc_md.nvram_write((char *)&part->header, NVRAM_HEADER_LEN, &tmp_index); - - return rc; -} - -static unsigned char nvram_checksum(struct nvram_header *p) -{ - unsigned int c_sum, c_sum2; - unsigned short *sp = (unsigned short *)p->name; /* assume 6 shorts */ - c_sum = p->signature + p->length + sp[0] + sp[1] + sp[2] + sp[3] + sp[4] + sp[5]; - - /* The sum may have spilled into the 3rd byte. Fold it back. */ - c_sum = ((c_sum & 0xffff) + (c_sum >> 16)) & 0xffff; - /* The sum cannot exceed 2 bytes. Fold it into a checksum */ - c_sum2 = (c_sum >> 8) + (c_sum << 8); - c_sum = ((c_sum + c_sum2) >> 8) & 0xff; - return c_sum; -} module_init(nvram_init); module_exit(nvram_cleanup); diff -Nru a/arch/ppc64/kernel/of_device.c b/arch/ppc64/kernel/of_device.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/of_device.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include +#include +#include + +/** + * of_match_device - Tell if an of_device structure has a matching + * of_match structure + * @ids: array of of device match structures to search in + * @dev: the of device structure to match against + * + * Used by a driver to check whether an of_device present in the + * system is in its list of supported devices. + */ +const struct of_match * of_match_device(const struct of_match *matches, + const struct of_device *dev) +{ + if (!dev->node) + return NULL; + while (matches->name || matches->type || matches->compatible) { + int match = 1; + if (matches->name && matches->name != OF_ANY_MATCH) + match &= dev->node->name + && !strcmp(matches->name, dev->node->name); + if (matches->type && matches->type != OF_ANY_MATCH) + match &= dev->node->type + && !strcmp(matches->type, dev->node->type); + if (matches->compatible && matches->compatible != OF_ANY_MATCH) + match &= device_is_compatible(dev->node, + matches->compatible); + if (match) + return matches; + matches++; + } + return NULL; +} + +static int of_platform_bus_match(struct device *dev, struct device_driver *drv) +{ + struct of_device * of_dev = to_of_device(dev); + struct of_platform_driver * of_drv = to_of_platform_driver(drv); + const struct of_match * matches = of_drv->match_table; + + if (!matches) + return 0; + + return of_match_device(matches, of_dev) != NULL; +} + +struct of_device *of_dev_get(struct of_device *dev) +{ + struct device *tmp; + + if (!dev) + return NULL; + tmp = get_device(&dev->dev); + if (tmp) + return to_of_device(tmp); + else + return NULL; +} + +void of_dev_put(struct of_device *dev) +{ + if (dev) + put_device(&dev->dev); +} + + +static int of_device_probe(struct device *dev) +{ + int error = -ENODEV; + struct of_platform_driver *drv; + struct of_device *of_dev; + const struct of_match *match; + + drv = to_of_platform_driver(dev->driver); + of_dev = to_of_device(dev); + + if (!drv->probe) + return error; + + of_dev_get(of_dev); + + match = of_match_device(drv->match_table, of_dev); + if (match) + error = drv->probe(of_dev, match); + if (error) + of_dev_put(of_dev); + + return error; +} + +static int of_device_remove(struct device *dev) +{ + struct of_device * of_dev = to_of_device(dev); + struct of_platform_driver * drv = to_of_platform_driver(dev->driver); + + if (dev->driver && drv->remove) + drv->remove(of_dev); + return 0; +} + +static int of_device_suspend(struct device *dev, u32 state) +{ + struct of_device * of_dev = to_of_device(dev); + struct of_platform_driver * drv = to_of_platform_driver(dev->driver); + int error = 0; + + if (dev->driver && drv->suspend) + error = drv->suspend(of_dev, state); + return error; +} + +static int of_device_resume(struct device * dev) +{ + struct of_device * of_dev = to_of_device(dev); + struct of_platform_driver * drv = to_of_platform_driver(dev->driver); + int error = 0; + + if (dev->driver && drv->resume) + error = drv->resume(of_dev); + return error; +} + +struct bus_type of_platform_bus_type = { + .name = "of_platform", + .match = of_platform_bus_match, + .suspend = of_device_suspend, + .resume = of_device_resume, +}; + +static int __init of_bus_driver_init(void) +{ + return bus_register(&of_platform_bus_type); +} + +postcore_initcall(of_bus_driver_init); + +int of_register_driver(struct of_platform_driver *drv) +{ + int count = 0; + + /* initialize common driver fields */ + drv->driver.name = drv->name; + drv->driver.bus = &of_platform_bus_type; + drv->driver.probe = of_device_probe; + drv->driver.remove = of_device_remove; + + /* register with core */ + count = driver_register(&drv->driver); + return count ? count : 1; +} + +void of_unregister_driver(struct of_platform_driver *drv) +{ + driver_unregister(&drv->driver); +} + + +static ssize_t dev_show_devspec(struct device *dev, char *buf) +{ + struct of_device *ofdev; + + ofdev = to_of_device(dev); + return sprintf(buf, "%s", ofdev->node->full_name); +} + +static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL); + +/** + * of_release_dev - free an of device structure when all users of it are finished. + * @dev: device that's been disconnected + * + * Will be called only by the device core when all users of this of device are + * done. + */ +void of_release_dev(struct device *dev) +{ + struct of_device *ofdev; + + ofdev = to_of_device(dev); + kfree(ofdev); +} + +int of_device_register(struct of_device *ofdev) +{ + int rc; + struct of_device **odprop; + + BUG_ON(ofdev->node == NULL); + + odprop = (struct of_device **)get_property(ofdev->node, "linux,device", NULL); + if (!odprop) { + struct property *new_prop; + + new_prop = kmalloc(sizeof(struct property) + sizeof(struct of_device *), + GFP_KERNEL); + if (new_prop == NULL) + return -ENOMEM; + new_prop->name = "linux,device"; + new_prop->length = sizeof(sizeof(struct of_device *)); + new_prop->value = (unsigned char *)&new_prop[1]; + odprop = (struct of_device **)new_prop->value; + *odprop = NULL; + prom_add_property(ofdev->node, new_prop); + } + *odprop = ofdev; + + rc = device_register(&ofdev->dev); + if (rc) + return rc; + + device_create_file(&ofdev->dev, &dev_attr_devspec); + + return 0; +} + +void of_device_unregister(struct of_device *ofdev) +{ + struct of_device **odprop; + + device_remove_file(&ofdev->dev, &dev_attr_devspec); + + odprop = (struct of_device **)get_property(ofdev->node, "linux,device", NULL); + if (odprop) + *odprop = NULL; + + device_unregister(&ofdev->dev); +} + +struct of_device* of_platform_device_create(struct device_node *np, const char *bus_id) +{ + struct of_device *dev; + u32 *reg; + + dev = kmalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return NULL; + memset(dev, 0, sizeof(*dev)); + + dev->node = np; + dev->dma_mask = 0xffffffffUL; + dev->dev.dma_mask = &dev->dma_mask; + dev->dev.parent = NULL; + dev->dev.bus = &of_platform_bus_type; + dev->dev.release = of_release_dev; + + reg = (u32 *)get_property(np, "reg", NULL); + strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE); + + if (of_device_register(dev) != 0) { + kfree(dev); + return NULL; + } + + return dev; +} + +EXPORT_SYMBOL(of_match_device); +EXPORT_SYMBOL(of_platform_bus_type); +EXPORT_SYMBOL(of_register_driver); +EXPORT_SYMBOL(of_unregister_driver); +EXPORT_SYMBOL(of_device_register); +EXPORT_SYMBOL(of_device_unregister); +EXPORT_SYMBOL(of_dev_get); +EXPORT_SYMBOL(of_dev_put); +EXPORT_SYMBOL(of_platform_device_create); +EXPORT_SYMBOL(of_release_dev); diff -Nru a/arch/ppc64/kernel/open_pic.c b/arch/ppc64/kernel/open_pic.c --- a/arch/ppc64/kernel/open_pic.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/open_pic.c Tue Feb 17 20:00:07 2004 @@ -34,7 +34,42 @@ u_int OpenPIC_NumInitSenses __initdata = 0; u_char *OpenPIC_InitSenses __initdata = NULL; -void find_ISUs(void); +/* + * Local (static) OpenPIC Operations + */ + + +/* Global Operations */ +static void openpic_reset(void); +static void openpic_enable_8259_pass_through(void); +static void openpic_disable_8259_pass_through(void); +static u_int openpic_irq(void); +static void openpic_eoi(void); +static u_int openpic_get_priority(void); +static void openpic_set_priority(u_int pri); +static u_int openpic_get_spurious(void); +static void openpic_set_spurious(u_int vector); + +#ifdef CONFIG_SMP +/* Interprocessor Interrupts */ +static void openpic_initipi(u_int ipi, u_int pri, u_int vector); +static irqreturn_t openpic_ipi_action(int cpl, void *dev_id, + struct pt_regs *regs); +#endif + +/* Timer Interrupts */ +static void openpic_inittimer(u_int timer, u_int pri, u_int vector); +static void openpic_maptimer(u_int timer, u_int cpumask); + +/* Interrupt Sources */ +static void openpic_enable_irq(u_int irq); +static void openpic_disable_irq(u_int irq); +static void openpic_initirq(u_int irq, u_int pri, u_int vector, int polarity, + int is_level); +static void openpic_mapirq(u_int irq, u_int cpumask); +static void openpic_set_sense(u_int irq, int sense); + +static void find_ISUs(void); static u_int NumProcessors; static u_int NumSources; @@ -130,7 +165,7 @@ #define GET_ISU(source) ISU[(source) >> 4][(source) & 0xf] -void __init openpic_init_IRQ(void) +void __init pSeries_init_openpic(void) { struct device_node *np; int i; @@ -359,9 +394,12 @@ } /* Init all external sources */ - for (i = 1; i < NumSources; i++) { + for (i = 0; i < NumSources; i++) { int pri, sense; + /* skip cascade if any */ + if (offset && i == 0) + continue; /* the bootloader may have left it enabled (bad !) */ openpic_disable_irq(i+offset); @@ -396,6 +434,9 @@ */ static int __init openpic_setup_i8259(void) { + if (systemcfg->platform == PLATFORM_POWERMAC) + return 0; + if (naca->interrupt_controller == IC_OPEN_PIC) { /* Initialize the cascade */ if (request_irq(NUM_8259_INTERRUPTS, no_action, SA_INTERRUPT, @@ -419,6 +460,14 @@ void find_ISUs(void) { + /* For PowerMac, setup ISUs on base openpic */ + if (systemcfg->platform == PLATFORM_POWERMAC) { + int i; + for (i=0; i<128; i+=0x10) { + ISU[i>>4] = &((struct OpenPIC *)OpenPIC_Addr)->Source[i]; + NumISUs++; + } + } /* Use /interrupt-controller/reg and * /interrupt-controller/interrupt-ranges from OF device tree * the ISU array is setup in chrp_pci.c in ibm_add_bridges @@ -429,11 +478,22 @@ /* basically each ISU is a bus, and this assumes that * open_pic_isu_count interrupts per bus are possible * ISU == Interrupt Source + * + * On G5, we keep the original NumSources provided by the controller, + * it's below 128, so we have room to stuff the IPIs and timers like darwin + * does. We put the spurrious vector up at 0xff though. */ - NumSources = NumISUs * 0x10; - openpic_vec_ipi = NumSources + open_pic_irq_offset; - openpic_vec_timer = openpic_vec_ipi + OPENPIC_NUM_IPI; - openpic_vec_spurious = openpic_vec_timer + OPENPIC_NUM_TIMERS; + if (systemcfg->platform == PLATFORM_POWERMAC) { + openpic_vec_ipi = NumSources; + openpic_vec_timer = openpic_vec_ipi + 4; + openpic_vec_spurious = 0xff; + } else { + NumSources = NumISUs * 0x10; + + openpic_vec_ipi = NumSources + open_pic_irq_offset; + openpic_vec_timer = openpic_vec_ipi + OPENPIC_NUM_IPI; + openpic_vec_spurious = openpic_vec_timer + OPENPIC_NUM_TIMERS; + } } static inline void openpic_reset(void) @@ -585,9 +645,9 @@ request_irq(openpic_vec_ipi+1, openpic_ipi_action, SA_INTERRUPT, "IPI1 (reschedule)", 0); request_irq(openpic_vec_ipi+2, openpic_ipi_action, SA_INTERRUPT, - "IPI2 (invalidate tlb)", 0); + "IPI2 (unused)", 0); request_irq(openpic_vec_ipi+3, openpic_ipi_action, SA_INTERRUPT, - "IPI3 (xmon break)", 0); + "IPI3 (debugger break)", 0); for ( i = 0; i < OPENPIC_NUM_IPI ; i++ ) openpic_enable_ipi(openpic_vec_ipi+i); @@ -767,8 +827,7 @@ static void openpic_end_irq(unsigned int irq_nr) { - if ((irq_desc[irq_nr].status & IRQ_LEVEL) != 0) - openpic_eoi(); + openpic_eoi(); } static void openpic_set_affinity(unsigned int irq_nr, cpumask_t cpumask) @@ -807,9 +866,7 @@ int irq = openpic_irq(); - /* Management of the cascade should be moved out of here */ - if (open_pic_irq_offset && irq == open_pic_irq_offset) - { + if (open_pic_irq_offset && irq == open_pic_irq_offset) { /* * This magic address generates a PCI IACK cycle. */ diff -Nru a/arch/ppc64/kernel/open_pic.h b/arch/ppc64/kernel/open_pic.h --- a/arch/ppc64/kernel/open_pic.h Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/open_pic.h Tue Feb 17 20:00:06 2004 @@ -40,6 +40,8 @@ extern inline int openpic_to_irq(int irq) { + if (systemcfg->platform == PLATFORM_POWERMAC) + return irq; return irq += NUM_8259_INTERRUPTS; } /*extern int open_pic_irq_offset;*/ diff -Nru a/arch/ppc64/kernel/open_pic_defs.h b/arch/ppc64/kernel/open_pic_defs.h --- a/arch/ppc64/kernel/open_pic_defs.h Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/open_pic_defs.h Tue Feb 17 20:00:07 2004 @@ -279,40 +279,6 @@ #define Vector_Priority _Vector_Priority.Reg #define Destination _Destination.Reg -/* - * Local (static) OpenPIC Operations - */ - - -/* Global Operations */ -static void openpic_reset(void); -static void openpic_enable_8259_pass_through(void); -static void openpic_disable_8259_pass_through(void); -static u_int openpic_irq(void); -static void openpic_eoi(void); -static u_int openpic_get_priority(void); -static void openpic_set_priority(u_int pri); -static u_int openpic_get_spurious(void); -static void openpic_set_spurious(u_int vector); - -#ifdef CONFIG_SMP -/* Interprocessor Interrupts */ -static void openpic_initipi(u_int ipi, u_int pri, u_int vector); -static irqreturn_t openpic_ipi_action(int cpl, void *dev_id, - struct pt_regs *regs); -#endif - -/* Timer Interrupts */ -static void openpic_inittimer(u_int timer, u_int pri, u_int vector); -static void openpic_maptimer(u_int timer, u_int cpumask); - -/* Interrupt Sources */ -static void openpic_enable_irq(u_int irq); -static void openpic_disable_irq(u_int irq); -static void openpic_initirq(u_int irq, u_int pri, u_int vector, int polarity, - int is_level); -static void openpic_mapirq(u_int irq, u_int cpumask); -static void openpic_set_sense(u_int irq, int sense); #endif /* __KERNEL__ */ diff -Nru a/arch/ppc64/kernel/open_pic_u3.c b/arch/ppc64/kernel/open_pic_u3.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/open_pic_u3.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,348 @@ +/* + * arch/ppc/kernel/open_pic.c -- OpenPIC Interrupt Handling + * + * Copyright (C) 1997 Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "open_pic.h" +#include "open_pic_defs.h" + +void* OpenPIC2_Addr; +static volatile struct OpenPIC *OpenPIC2 = NULL; + +extern u_int OpenPIC_NumInitSenses; +extern u_char *OpenPIC_InitSenses; + +static u_int NumSources; +static int NumISUs; +static int open_pic2_irq_offset; + +static OpenPIC_SourcePtr ISU2[OPENPIC_MAX_ISU]; + +unsigned int openpic2_vec_spurious; + +/* + * Accesses to the current processor's openpic registers + * U3 secondary openpic has only one output + */ +#define THIS_CPU Processor[0] +#define DECL_THIS_CPU +#define CHECK_THIS_CPU + +#define GET_ISU(source) ISU2[(source) >> 4][(source) & 0xf] + +static inline u_int openpic2_read(volatile u_int *addr) +{ + u_int val; + + val = in_be32(addr); + return val; +} + +static inline void openpic2_write(volatile u_int *addr, u_int val) +{ + out_be32(addr, val); +} + +static inline u_int openpic2_readfield(volatile u_int *addr, u_int mask) +{ + u_int val = openpic2_read(addr); + return val & mask; +} + +static inline void openpic2_writefield(volatile u_int *addr, u_int mask, + u_int field) +{ + u_int val = openpic2_read(addr); + openpic2_write(addr, (val & ~mask) | (field & mask)); +} + +static inline void openpic2_clearfield(volatile u_int *addr, u_int mask) +{ + openpic2_writefield(addr, mask, 0); +} + +static inline void openpic2_setfield(volatile u_int *addr, u_int mask) +{ + openpic2_writefield(addr, mask, mask); +} + +static void openpic2_safe_writefield(volatile u_int *addr, u_int mask, + u_int field) +{ + unsigned int loops = 100000; + + openpic2_setfield(addr, OPENPIC_MASK); + while (openpic2_read(addr) & OPENPIC_ACTIVITY) { + if (!loops--) { + printk(KERN_ERR "openpic2_safe_writefield timeout\n"); + break; + } + } + openpic2_writefield(addr, mask | OPENPIC_MASK, field | OPENPIC_MASK); +} + + +static inline void openpic2_reset(void) +{ + openpic2_setfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_RESET); +} + +static void openpic2_disable_8259_pass_through(void) +{ + openpic2_setfield(&OpenPIC2->Global.Global_Configuration0, + OPENPIC_CONFIG_8259_PASSTHROUGH_DISABLE); +} + +/* + * Find out the current interrupt + */ +static u_int openpic2_irq(void) +{ + u_int vec; + DECL_THIS_CPU; + CHECK_THIS_CPU; + vec = openpic2_readfield(&OpenPIC2->THIS_CPU.Interrupt_Acknowledge, + OPENPIC_VECTOR_MASK); + return vec; +} + +static void openpic2_eoi(void) +{ + DECL_THIS_CPU; + CHECK_THIS_CPU; + openpic2_write(&OpenPIC2->THIS_CPU.EOI, 0); + /* Handle PCI write posting */ + (void)openpic2_read(&OpenPIC2->THIS_CPU.EOI); +} + + +static inline u_int openpic2_get_priority(void) +{ + DECL_THIS_CPU; + CHECK_THIS_CPU; + return openpic2_readfield(&OpenPIC2->THIS_CPU.Current_Task_Priority, + OPENPIC_CURRENT_TASK_PRIORITY_MASK); +} + +static void openpic2_set_priority(u_int pri) +{ + DECL_THIS_CPU; + CHECK_THIS_CPU; + openpic2_writefield(&OpenPIC2->THIS_CPU.Current_Task_Priority, + OPENPIC_CURRENT_TASK_PRIORITY_MASK, pri); +} + +/* + * Get/set the spurious vector + */ +static inline u_int openpic2_get_spurious(void) +{ + return openpic2_readfield(&OpenPIC2->Global.Spurious_Vector, + OPENPIC_VECTOR_MASK); +} + +static void openpic2_set_spurious(u_int vec) +{ + openpic2_writefield(&OpenPIC2->Global.Spurious_Vector, OPENPIC_VECTOR_MASK, + vec); +} + +/* + * Enable/disable an external interrupt source + * + * Externally called, irq is an offseted system-wide interrupt number + */ +static void openpic2_enable_irq(u_int irq) +{ + unsigned int loops = 100000; + + openpic2_clearfield(&GET_ISU(irq - open_pic2_irq_offset).Vector_Priority, OPENPIC_MASK); + /* make sure mask gets to controller before we return to user */ + do { + if (!loops--) { + printk(KERN_ERR "openpic_enable_irq timeout\n"); + break; + } + + mb(); /* sync is probably useless here */ + } while(openpic2_readfield(&GET_ISU(irq - open_pic2_irq_offset).Vector_Priority, + OPENPIC_MASK)); +} + +static void openpic2_disable_irq(u_int irq) +{ + u32 vp; + unsigned int loops = 100000; + + openpic2_setfield(&GET_ISU(irq - open_pic2_irq_offset).Vector_Priority, + OPENPIC_MASK); + /* make sure mask gets to controller before we return to user */ + do { + if (!loops--) { + printk(KERN_ERR "openpic_disable_irq timeout\n"); + break; + } + + mb(); /* sync is probably useless here */ + vp = openpic2_readfield(&GET_ISU(irq - open_pic2_irq_offset).Vector_Priority, + OPENPIC_MASK | OPENPIC_ACTIVITY); + } while((vp & OPENPIC_ACTIVITY) && !(vp & OPENPIC_MASK)); +} + +/* + * Initialize an interrupt source (and disable it!) + * + * irq: OpenPIC interrupt number + * pri: interrupt source priority + * vec: the vector it will produce + * pol: polarity (1 for positive, 0 for negative) + * sense: 1 for level, 0 for edge + */ +static void openpic2_initirq(u_int irq, u_int pri, u_int vec, int pol, int sense) +{ + openpic2_safe_writefield(&GET_ISU(irq).Vector_Priority, + OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK | + OPENPIC_SENSE_MASK | OPENPIC_POLARITY_MASK, + (pri << OPENPIC_PRIORITY_SHIFT) | vec | + (pol ? OPENPIC_POLARITY_POSITIVE : + OPENPIC_POLARITY_NEGATIVE) | + (sense ? OPENPIC_SENSE_LEVEL : OPENPIC_SENSE_EDGE)); +} + +/* + * Map an interrupt source to one or more CPUs + */ +static void openpic2_mapirq(u_int irq, u_int physmask) +{ + openpic2_write(&GET_ISU(irq).Destination, physmask); +} + +/* + * Set the sense for an interrupt source (and disable it!) + * + * sense: 1 for level, 0 for edge + */ +static inline void openpic2_set_sense(u_int irq, int sense) +{ + openpic2_safe_writefield(&GET_ISU(irq).Vector_Priority, + OPENPIC_SENSE_LEVEL, + (sense ? OPENPIC_SENSE_LEVEL : 0)); +} + +static void openpic2_end_irq(unsigned int irq_nr) +{ + openpic2_eoi(); +} + +int openpic2_get_irq(struct pt_regs *regs) +{ + int irq = openpic2_irq(); + + if (irq == openpic2_vec_spurious) + return -1; + return irq + open_pic2_irq_offset; +} + +struct hw_interrupt_type open_pic2 = { + " OpenPIC2 ", + NULL, + NULL, + openpic2_enable_irq, + openpic2_disable_irq, + NULL, + openpic2_end_irq, +}; + +void __init openpic2_init(int offset) +{ + u_int t, i; + const char *version; + + if (!OpenPIC2_Addr) { + printk(KERN_INFO "No OpenPIC2 found !\n"); + return; + } + OpenPIC2 = (volatile struct OpenPIC *)OpenPIC2_Addr; + + ppc64_boot_msg(0x20, "OpenPic U3 Init"); + + t = openpic2_read(&OpenPIC2->Global.Feature_Reporting0); + switch (t & OPENPIC_FEATURE_VERSION_MASK) { + case 1: + version = "1.0"; + break; + case 2: + version = "1.2"; + break; + case 3: + version = "1.3"; + break; + default: + version = "?"; + break; + } + printk(KERN_INFO "OpenPIC (U3) Version %s\n", version); + + open_pic2_irq_offset = offset; + + for (i=0; i<128; i+=0x10) { + ISU2[i>>4] = &((struct OpenPIC *)OpenPIC2_Addr)->Source[i]; + NumISUs++; + } + NumSources = NumISUs * 0x10; + openpic2_vec_spurious = NumSources; + + openpic2_set_priority(0xf); + + /* Init all external sources */ + for (i = 0; i < NumSources; i++) { + int pri, sense; + + /* the bootloader may have left it enabled (bad !) */ + openpic2_disable_irq(i+offset); + + pri = 8; + sense = (i < OpenPIC_NumInitSenses) ? OpenPIC_InitSenses[i]: 1; + if (sense) + irq_desc[i+offset].status = IRQ_LEVEL; + + /* Enabled, Priority 8 or 9 */ + openpic2_initirq(i, pri, i, !sense, sense); + /* Processor 0 */ + openpic2_mapirq(i, 0x1); + } + + /* Init descriptors */ + for (i = offset; i < NumSources + offset; i++) + irq_desc[i].handler = &open_pic2; + + /* Initialize the spurious interrupt */ + openpic2_set_spurious(openpic2_vec_spurious); + + openpic2_set_priority(0); + openpic2_disable_8259_pass_through(); + + ppc64_boot_msg(0x25, "OpenPic2 Done"); +} diff -Nru a/arch/ppc64/kernel/pSeries_hvCall.S b/arch/ppc64/kernel/pSeries_hvCall.S --- a/arch/ppc64/kernel/pSeries_hvCall.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/pSeries_hvCall.S Tue Feb 17 20:00:08 2004 @@ -22,7 +22,7 @@ /* * hcall interface to pSeries LPAR */ -#define HSC .long 0x44000022 +#define HVSC .long 0x44000022 /* long plpar_hcall(unsigned long opcode, R3 unsigned long arg1, R4 @@ -44,7 +44,7 @@ std r9,-16(r1) std r10,-24(r1) - HSC /* invoke the hypervisor */ + HVSC /* invoke the hypervisor */ ld r10,-8(r1) /* Fetch r4-r7 ret args. */ std r4,0(r10) @@ -63,7 +63,7 @@ _GLOBAL(plpar_hcall_norets) mfcr r0 std r0,-8(r1) - HSC /* invoke the hypervisor */ + HVSC /* invoke the hypervisor */ ld r0,-8(r1) mtcrf 0xff,r0 blr /* return r3 = status */ @@ -94,7 +94,7 @@ std r12,-8(r1) /* Save out ptr */ - HSC /* invoke the hypervisor */ + HVSC /* invoke the hypervisor */ ld r10,-8(r1) /* Fetch r4 ret arg */ std r4,0(r10) @@ -126,7 +126,7 @@ std r10,16(r1) std r14,8(r1) - HSC /* invoke the hypervisor */ + HVSC /* invoke the hypervisor */ ld r14,32(r1) /* Fetch r4-r7 ret args. */ std r4,0(r14) diff -Nru a/arch/ppc64/kernel/pSeries_lpar.c b/arch/ppc64/kernel/pSeries_lpar.c --- a/arch/ppc64/kernel/pSeries_lpar.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/pSeries_lpar.c Tue Feb 17 20:00:08 2004 @@ -296,6 +296,8 @@ { pSeries_lpar_mm_init(); + tce_init_pSeries(); + ppc_md.tce_build = tce_build_pSeriesLP; ppc_md.tce_free_one = tce_free_one_pSeriesLP; @@ -311,69 +313,6 @@ printk(KERN_WARNING "can't use stdout; can't print early debug messages.\n"); } -} - -int hvc_get_chars(int index, char *buf, int count) -{ - unsigned long got; - - if (plpar_hcall(H_GET_TERM_CHAR, index, 0, 0, 0, &got, - (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) { - /* - * Work around a HV bug where it gives us a null - * after every \r. -- paulus - */ - if (got > 0) { - int i; - for (i = 1; i < got; ++i) { - if (buf[i] == 0 && buf[i-1] == '\r') { - --got; - if (i < got) - memmove(&buf[i], &buf[i+1], - got - i); - } - } - } - return got; - } - return 0; -} - -int hvc_put_chars(int index, const char *buf, int count) -{ - unsigned long *lbuf = (unsigned long *) buf; - long ret; - - ret = plpar_hcall_norets(H_PUT_TERM_CHAR, index, count, lbuf[0], - lbuf[1]); - if (ret == H_Success) - return count; - if (ret == H_Busy) - return 0; - return -1; -} - -/* return the number of client vterms present */ -/* XXX this requires an interface change to handle multiple discontiguous - * vterms */ -int hvc_count(int *start_termno) -{ - struct device_node *vty; - int num_found = 0; - - /* consider only the first vty node. - * we should _always_ be able to find one. */ - vty = of_find_node_by_name(NULL, "vty"); - if (vty && device_is_compatible(vty, "hvterm1")) { - u32 *termno = (u32 *)get_property(vty, "reg", 0); - - if (termno && start_termno) - *start_termno = *termno; - num_found = 1; - of_node_put(vty); - } - - return num_found; } long pSeries_lpar_hpte_insert(unsigned long hpte_group, diff -Nru a/arch/ppc64/kernel/pSeries_nvram.c b/arch/ppc64/kernel/pSeries_nvram.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pSeries_nvram.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,150 @@ +/* + * c 2001 PPC 64 Team, IBM Corp + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * /dev/nvram driver for PPC64 + * + * This perhaps should live in drivers/char + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static unsigned int nvram_size; +static unsigned int nvram_fetch, nvram_store; +static char nvram_buf[NVRW_CNT]; /* assume this is in the first 4GB */ +static spinlock_t nvram_lock = SPIN_LOCK_UNLOCKED; + + +static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index) +{ + unsigned int i; + unsigned long len, done; + unsigned long flags; + char *p = buf; + + if (nvram_size == 0 || nvram_fetch) + return -ENODEV; + + if (*index >= nvram_size) + return 0; + + i = *index; + if (i + count > nvram_size) + count = nvram_size - i; + + spin_lock_irqsave(&nvram_lock, flags); + + for (; count != 0; count -= len) { + len = count; + if (len > NVRW_CNT) + len = NVRW_CNT; + + if ((rtas_call(nvram_fetch, 3, 2, &done, i, __pa(nvram_buf), + len) != 0) || len != done) { + spin_unlock_irqrestore(&nvram_lock, flags); + return -EIO; + } + + memcpy(p, nvram_buf, len); + + p += len; + i += len; + } + + spin_unlock_irqrestore(&nvram_lock, flags); + + *index = i; + return p - buf; +} + +static ssize_t pSeries_nvram_write(char *buf, size_t count, loff_t *index) +{ + unsigned int i; + unsigned long len, done; + unsigned long flags; + const char *p = buf; + + if (nvram_size == 0 || nvram_store) + return -ENODEV; + + if (*index >= nvram_size) + return 0; + + i = *index; + if (i + count > nvram_size) + count = nvram_size - i; + + spin_lock_irqsave(&nvram_lock, flags); + + for (; count != 0; count -= len) { + len = count; + if (len > NVRW_CNT) + len = NVRW_CNT; + + memcpy(nvram_buf, p, len); + + if ((rtas_call(nvram_store, 3, 2, &done, i, __pa(nvram_buf), + len) != 0) || len != done) { + spin_unlock_irqrestore(&nvram_lock, flags); + return -EIO; + } + + p += len; + i += len; + } + spin_unlock_irqrestore(&nvram_lock, flags); + + *index = i; + return p - buf; +} + +static ssize_t pSeries_nvram_get_size(void) +{ + return nvram_size ? nvram_size : -ENODEV; +} + +int __init pSeries_nvram_init(void) +{ + struct device_node *nvram; + unsigned int *nbytes_p, proplen; + + nvram = of_find_node_by_type(NULL, "nvram"); + if (nvram == NULL) + return -ENODEV; + + nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen); + if (nbytes_p == NULL || proplen != sizeof(unsigned int)) + return -EIO; + + nvram_size = *nbytes_p; + + nvram_fetch = rtas_token("nvram-fetch"); + nvram_store = rtas_token("nvram-store"); + printk(KERN_INFO "PPC64 nvram contains %d bytes\n", nvram_size); + of_node_put(nvram); + + ppc_md.nvram_read = pSeries_nvram_read; + ppc_md.nvram_write = pSeries_nvram_write; + ppc_md.nvram_size = pSeries_nvram_get_size; + + return 0; +} diff -Nru a/arch/ppc64/kernel/pSeries_pci.c b/arch/ppc64/kernel/pSeries_pci.c --- a/arch/ppc64/kernel/pSeries_pci.c Tue Feb 17 20:00:14 2004 +++ b/arch/ppc64/kernel/pSeries_pci.c Tue Feb 17 20:00:14 2004 @@ -687,7 +687,7 @@ extern void chrp_request_regions(void); -void __init pcibios_final_fixup(void) +void __init pSeries_final_fixup(void) { struct pci_dev *dev = NULL; @@ -720,4 +720,30 @@ node=node->parent; } return NULL; +} + +/* + * ppc64 can have multifunction devices that do not respond to function 0. + * In this case we must scan all functions. + */ +int +pcibios_scan_all_fns(struct pci_bus *bus, int devfn) +{ + struct device_node *busdn, *dn; + + if (bus->self) + busdn = pci_device_to_OF_node(bus->self); + else + busdn = bus->sysdata; /* must be a phb */ + + /* + * Check to see if there is any of the 8 functions are in the + * device tree. If they are then we need to scan all the + * functions of this slot. + */ + for (dn = busdn->child; dn; dn = dn->sibling) + if ((dn->devfn >> 3) == (devfn >> 3)) + return 1; + + return 0; } diff -Nru a/arch/ppc64/kernel/pci.c b/arch/ppc64/kernel/pci.c --- a/arch/ppc64/kernel/pci.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/pci.c Tue Feb 17 20:00:08 2004 @@ -34,6 +34,7 @@ #include #include #include +#include #include "pci.h" @@ -58,21 +59,32 @@ void pcibios_final_fixup(void); static void fixup_broken_pcnet32(struct pci_dev* dev); static void fixup_windbond_82c105(struct pci_dev* dev); +extern void fixup_k2_sata(struct pci_dev* dev); void iSeries_pcibios_init(void); struct pci_controller *hose_head; struct pci_controller **hose_tail = &hose_head; +struct pci_dma_ops pci_dma_ops; +EXPORT_SYMBOL(pci_dma_ops); + int global_phb_number; /* Global phb counter */ /* Cached ISA bridge dev. */ struct pci_dev *ppc64_isabridge_dev = NULL; struct pci_fixup pcibios_fixups[] = { - { PCI_FIXUP_HEADER, PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32 }, - { PCI_FIXUP_HEADER, PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, fixup_windbond_82c105 }, - { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pcibios_name_device }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, + fixup_broken_pcnet32 }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, + fixup_windbond_82c105 }, + { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, + pcibios_name_device }, +#ifdef CONFIG_PPC_PMAC + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_SERVERWORKS, 0x0240, + fixup_k2_sata }, +#endif { 0 } }; @@ -250,6 +262,9 @@ case phb_type_winnipeg: model = "PHB WP"; break; + case phb_type_apple: + model = "PHB APPLE"; + break; default: model = "PHB UK"; break; @@ -332,8 +347,9 @@ pci_assign_unassigned_resources(); #endif - /* Call machine dependent fixup */ - pcibios_final_fixup(); + /* Call machine dependent final fixup */ + if (ppc_md.pcibios_fixup) + ppc_md.pcibios_fixup(); /* Cache the location of the ISA bridge (if we have one) */ ppc64_isabridge_dev = pci_find_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); @@ -539,4 +555,26 @@ vma->vm_end - vma->vm_start, vma->vm_page_prot); return ret; +} + +#ifdef CONFIG_PPC_PSERIES +static ssize_t pci_show_devspec(struct device *dev, char *buf) +{ + struct pci_dev *pdev; + struct device_node *np; + + pdev = to_pci_dev (dev); + np = pci_device_to_OF_node(pdev); + if (np == NULL || np->full_name == NULL) + return 0; + return sprintf(buf, "%s", np->full_name); +} +static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); +#endif /* CONFIG_PPC_PSERIES */ + +void pcibios_add_platform_entries(struct pci_dev *pdev) +{ +#ifdef CONFIG_PPC_PSERIES + device_create_file(&pdev->dev, &dev_attr_devspec); +#endif /* CONFIG_PPC_PSERIES */ } diff -Nru a/arch/ppc64/kernel/pci_dma.c b/arch/ppc64/kernel/pci_dma.c --- a/arch/ppc64/kernel/pci_dma.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/pci_dma.c Tue Feb 17 20:00:07 2004 @@ -1002,7 +1002,7 @@ * Returns the virtual address of the buffer and sets dma_handle * to the dma address (tce) of the first page. */ -void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, +static void *tce_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) { struct TceTable * tbl; @@ -1055,7 +1055,7 @@ return ret; } -void pci_free_consistent(struct pci_dev *hwdev, size_t size, +static void tce_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) { struct TceTable * tbl; @@ -1089,7 +1089,7 @@ * need not be page aligned, the dma_addr_t returned will point to the same * byte within the page as vaddr. */ -dma_addr_t pci_map_single(struct pci_dev *hwdev, void *vaddr, +static dma_addr_t tce_map_single(struct pci_dev *hwdev, void *vaddr, size_t size, int direction ) { struct TceTable * tbl; @@ -1124,7 +1124,7 @@ return dma_handle; } -void pci_unmap_single( struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction ) +static void tce_unmap_single( struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction ) { struct TceTable * tbl; unsigned order, nPages; @@ -1354,7 +1354,7 @@ return dmaAddr; } -int pci_map_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction ) +static int tce_map_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction ) { struct TceTable * tbl; unsigned numTces; @@ -1389,7 +1389,7 @@ return num_dma; } -void pci_unmap_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nelms, int direction ) +static void tce_unmap_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nelms, int direction ) { struct TceTable * tbl; unsigned order, numTces, i; @@ -1430,7 +1430,7 @@ } #else -int pci_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, +static int tce_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) { int i; @@ -1448,7 +1448,7 @@ return nelems; } -void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, +static void tce_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction) { while (nelems--) { @@ -1465,7 +1465,15 @@ { ppc_md.tce_build = tce_build_pSeries; ppc_md.tce_free_one = tce_free_one_pSeries; + + pci_dma_ops.pci_alloc_consistent = tce_alloc_consistent; + pci_dma_ops.pci_free_consistent = tce_free_consistent; + pci_dma_ops.pci_map_single = tce_map_single; + pci_dma_ops.pci_unmap_single = tce_unmap_single; + pci_dma_ops.pci_map_sg = tce_map_sg; + pci_dma_ops.pci_unmap_sg = tce_unmap_sg; } + #endif #ifdef CONFIG_PPC_ISERIES @@ -1473,5 +1481,12 @@ { ppc_md.tce_build = tce_build_iSeries; ppc_md.tce_free_one = tce_free_one_iSeries; + + pci_dma_ops.pci_alloc_consistent = tce_alloc_consistent; + pci_dma_ops.pci_free_consistent = tce_free_consistent; + pci_dma_ops.pci_map_single = tce_map_single; + pci_dma_ops.pci_unmap_single = tce_unmap_single; + pci_dma_ops.pci_map_sg = tce_map_sg; + pci_dma_ops.pci_unmap_sg = tce_unmap_sg; } #endif diff -Nru a/arch/ppc64/kernel/pci_dma_direct.c b/arch/ppc64/kernel/pci_dma_direct.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pci_dma_direct.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,88 @@ +/* + * Support for DMA from PCI devices to main memory on + * machines without an iommu or with directly addressable + * RAM (typically a pmac with 2Gb of RAM or less) + * + * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "pci.h" + +static void *pci_direct_alloc_consistent(struct pci_dev *hwdev, size_t size, + dma_addr_t *dma_handle) +{ + void *ret; + + ret = (void *)__get_free_pages(GFP_ATOMIC, get_order(size)); + if (ret != NULL) { + memset(ret, 0, size); + *dma_handle = virt_to_absolute((unsigned long)ret); + } + return ret; +} + +static void pci_direct_free_consistent(struct pci_dev *hwdev, size_t size, + void *vaddr, dma_addr_t dma_handle) +{ + free_pages((unsigned long)vaddr, get_order(size)); +} + +static dma_addr_t pci_direct_map_single(struct pci_dev *hwdev, void *ptr, + size_t size, int direction) +{ + return virt_to_absolute((unsigned long)ptr); +} + +static void pci_direct_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, + size_t size, int direction) +{ +} + +static int pci_direct_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, + int nents, int direction) +{ + int i; + + for (i = 0; i < nents; i++, sg++) { + sg->dma_address = page_to_phys(sg->page) + sg->offset; + sg->dma_length = sg->length; + } + + return nents; +} + +static void pci_direct_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, + int nents, int direction) +{ +} + +void __init pci_dma_init_direct(void) +{ + pci_dma_ops.pci_alloc_consistent = pci_direct_alloc_consistent; + pci_dma_ops.pci_free_consistent = pci_direct_free_consistent; + pci_dma_ops.pci_map_single = pci_direct_map_single; + pci_dma_ops.pci_unmap_single = pci_direct_unmap_single; + pci_dma_ops.pci_map_sg = pci_direct_map_sg; + pci_dma_ops.pci_unmap_sg = pci_direct_unmap_sg; +} diff -Nru a/arch/ppc64/kernel/pci_dn.c b/arch/ppc64/kernel/pci_dn.c --- a/arch/ppc64/kernel/pci_dn.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/pci_dn.c Tue Feb 17 20:00:08 2004 @@ -181,6 +181,7 @@ } return dn; } +EXPORT_SYMBOL(fetch_dev_dn); /****************************************************************** diff -Nru a/arch/ppc64/kernel/pmac.h b/arch/ppc64/kernel/pmac.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac.h Tue Feb 17 20:00:14 2004 @@ -0,0 +1,32 @@ +#ifndef __PMAC_H__ +#define __PMAC_H__ + +#include +#include + +/* + * Declaration for the various functions exported by the + * pmac_* files. Mostly for use by pmac_setup + */ + +extern void pmac_get_boot_time(struct rtc_time *tm); +extern void pmac_get_rtc_time(struct rtc_time *tm); +extern int pmac_set_rtc_time(struct rtc_time *tm); +extern void pmac_read_rtc_time(void); +extern void pmac_calibrate_decr(void); + +extern void pmac_pcibios_fixup(void); +extern void pmac_pci_init(void); +extern void pmac_setup_pci_dma(void); +extern void fixup_k2_sata(struct pci_dev* dev); +extern void pmac_check_ht_link(void); + +extern void pmac_setup_smp(void); + +extern unsigned long pmac_ide_get_base(int index); +extern void pmac_ide_init_hwif_ports(hw_regs_t *hw, + unsigned long data_port, unsigned long ctrl_port, int *irq); + +extern void pmac_nvram_init(void); + +#endif /* __PMAC_H__ */ diff -Nru a/arch/ppc64/kernel/pmac_feature.c b/arch/ppc64/kernel/pmac_feature.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_feature.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,654 @@ +/* + * arch/ppc/platforms/pmac_feature.c + * + * Copyright (C) 1996-2001 Paul Mackerras (paulus@cs.anu.edu.au) + * Ben. Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * TODO: + * + * - Replace mdelay with some schedule loop if possible + * - Shorten some obfuscated delays on some routines (like modem + * power) + * - Refcount some clocks (see darwin) + * - Split split split... + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef DEBUG_FEATURE + +#ifdef DEBUG_FEATURE +#define DBG(fmt,...) printk(KERN_DEBUG fmt) +#else +#define DBG(fmt,...) +#endif + +/* + * We use a single global lock to protect accesses. Each driver has + * to take care of its own locking + */ +static spinlock_t feature_lock __pmacdata = SPIN_LOCK_UNLOCKED; + +#define LOCK(flags) spin_lock_irqsave(&feature_lock, flags); +#define UNLOCK(flags) spin_unlock_irqrestore(&feature_lock, flags); + + +/* + * Instance of some macio stuffs + */ +struct macio_chip macio_chips[MAX_MACIO_CHIPS] __pmacdata; + +struct macio_chip* __pmac +macio_find(struct device_node* child, int type) +{ + while(child) { + int i; + + for (i=0; i < MAX_MACIO_CHIPS && macio_chips[i].of_node; i++) + if (child == macio_chips[i].of_node && + (!type || macio_chips[i].type == type)) + return &macio_chips[i]; + child = child->parent; + } + return NULL; +} + +static const char* macio_names[] __pmacdata = +{ + "Unknown", + "Grand Central", + "OHare", + "OHareII", + "Heathrow", + "Gatwick", + "Paddington", + "Keylargo", + "Pangea", + "Intrepid", + "K2" +}; + + + +/* + * Uninorth reg. access. Note that Uni-N regs are big endian + */ + +#define UN_REG(r) (uninorth_base + ((r) >> 2)) +#define UN_IN(r) (in_be32(UN_REG(r))) +#define UN_OUT(r,v) (out_be32(UN_REG(r), (v))) +#define UN_BIS(r,v) (UN_OUT((r), UN_IN(r) | (v))) +#define UN_BIC(r,v) (UN_OUT((r), UN_IN(r) & ~(v))) + +static struct device_node* uninorth_node __pmacdata; +static u32* uninorth_base __pmacdata; +static u32 uninorth_rev __pmacdata; +static void *u3_ht; + +extern struct pci_dev *k2_skiplist[2]; + +/* + * For each motherboard family, we have a table of functions pointers + * that handle the various features. + */ + +typedef long (*feature_call)(struct device_node* node, long param, long value); + +struct feature_table_entry { + unsigned int selector; + feature_call function; +}; + +struct pmac_mb_def +{ + const char* model_string; + const char* model_name; + int model_id; + struct feature_table_entry* features; + unsigned long board_flags; +}; +static struct pmac_mb_def pmac_mb __pmacdata; + +/* + * Here are the chip specific feature functions + */ + + +static long __pmac g5_read_gpio(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + + return MACIO_IN8(param); +} + + +static long __pmac g5_write_gpio(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + + MACIO_OUT8(param, (u8)(value & 0xff)); + return 0; +} + +static long __pmac g5_gmac_enable(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + unsigned long flags; + struct pci_dev *pdev = NULL; + + if (node == NULL) + return -ENODEV; + + /* XXX FIXME: We should fix pci_device_from_OF_node here, and + * get to a real pci_dev or we'll get into trouble with PCI + * domains the day we get overlapping numbers (like if we ever + * decide to show the HT root. + * Note that we only get the slot when value is 0. This is called + * early during boot with value 1 to enable all devices, at which + * point, we don't yet have probed pci_find_slot, so it would fail + * to look for the slot at this point. + */ + if (!value) + pdev = pci_find_slot(node->busno, node->devfn); + + LOCK(flags); + if (value) { + MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE); + mb(); + k2_skiplist[0] = NULL; + } else { + k2_skiplist[0] = pdev; + mb(); + MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE); + } + + UNLOCK(flags); + mdelay(1); + + return 0; +} + +static long __pmac g5_fw_enable(struct device_node* node, long param, long value) +{ + struct macio_chip* macio = &macio_chips[0]; + unsigned long flags; + struct pci_dev *pdev = NULL; + + /* XXX FIXME: We should fix pci_device_from_OF_node here, and + * get to a real pci_dev or we'll get into trouble with PCI + * domains the day we get overlapping numbers (like if we ever + * decide to show the HT root + * Note that we only get the slot when value is 0. This is called + * early during boot with value 1 to enable all devices, at which + * point, we don't yet have probed pci_find_slot, so it would fail + * to look for the slot at this point. + */ + if (node == NULL) + return -ENODEV; + + if (!value) + pdev = pci_find_slot(node->busno, node->devfn); + + LOCK(flags); + if (value) { + MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE); + mb(); + k2_skiplist[1] = NULL; + } else { + k2_skiplist[0] = pdev; + mb(); + MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE); + } + + UNLOCK(flags); + mdelay(1); + + return 0; +} + +static long __pmac g5_mpic_enable(struct device_node* node, long param, long value) +{ + unsigned long flags; + + if (node->parent == NULL || strcmp(node->parent->name, "u3")) + return 0; + + LOCK(flags); + UN_BIS(U3_TOGGLE_REG, U3_MPIC_RESET | U3_MPIC_OUTPUT_ENABLE); + UNLOCK(flags); + + return 0; +} + +#ifdef CONFIG_SMP +static long __pmac g5_reset_cpu(struct device_node* node, long param, long value) +{ + unsigned int reset_io = 0; + unsigned long flags; + struct macio_chip* macio; + struct device_node* np; + + macio = &macio_chips[0]; + if (macio->type != macio_keylargo2) + return -ENODEV; + + np = find_path_device("/cpus"); + if (np == NULL) + return -ENODEV; + for (np = np->child; np != NULL; np = np->sibling) { + u32* num = (u32 *)get_property(np, "reg", NULL); + u32* rst = (u32 *)get_property(np, "soft-reset", NULL); + if (num == NULL || rst == NULL) + continue; + if (param == *num) { + reset_io = *rst; + break; + } + } + if (np == NULL || reset_io == 0) + return -ENODEV; + + LOCK(flags); + MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE); + (void)MACIO_IN8(reset_io); + udelay(1); + MACIO_OUT8(reset_io, 0); + (void)MACIO_IN8(reset_io); + UNLOCK(flags); + + return 0; +} +#endif /* CONFIG_SMP */ + +/* + * This can be called from pmac_smp so isn't static + * + * This takes the second CPU off the bus on dual CPU machines + * running UP + */ +void __pmac g5_phy_disable_cpu1(void) +{ + UN_OUT(U3_API_PHY_CONFIG_1, 0); +} + +static long __pmac generic_get_mb_info(struct device_node* node, long param, long value) +{ + switch(param) { + case PMAC_MB_INFO_MODEL: + return pmac_mb.model_id; + case PMAC_MB_INFO_FLAGS: + return pmac_mb.board_flags; + case PMAC_MB_INFO_NAME: + /* hack hack hack... but should work */ + *((const char **)value) = pmac_mb.model_name; + return 0; + } + return -EINVAL; +} + + +/* + * Table definitions + */ + +/* Used on any machine + */ +static struct feature_table_entry any_features[] __pmacdata = { + { PMAC_FTR_GET_MB_INFO, generic_get_mb_info }, + { 0, NULL } +}; + +/* G5 features + */ +static struct feature_table_entry g5_features[] __pmacdata = { + { PMAC_FTR_GMAC_ENABLE, g5_gmac_enable }, + { PMAC_FTR_1394_ENABLE, g5_fw_enable }, + { PMAC_FTR_ENABLE_MPIC, g5_mpic_enable }, + { PMAC_FTR_READ_GPIO, g5_read_gpio }, + { PMAC_FTR_WRITE_GPIO, g5_write_gpio }, +#ifdef CONFIG_SMP + { PMAC_FTR_RESET_CPU, g5_reset_cpu }, +#endif /* CONFIG_SMP */ + { 0, NULL } +}; + +static struct pmac_mb_def pmac_mb_defs[] __pmacdata = { + { "PowerMac7,2", "PowerMac G5", + PMAC_TYPE_POWERMAC_G5, g5_features, + 0, + }, +}; + +/* + * The toplevel feature_call callback + */ +long __pmac pmac_do_feature_call(unsigned int selector, ...) +{ + struct device_node* node; + long param, value; + int i; + feature_call func = NULL; + va_list args; + + if (pmac_mb.features) + for (i=0; pmac_mb.features[i].function; i++) + if (pmac_mb.features[i].selector == selector) { + func = pmac_mb.features[i].function; + break; + } + if (!func) + for (i=0; any_features[i].function; i++) + if (any_features[i].selector == selector) { + func = any_features[i].function; + break; + } + if (!func) + return -ENODEV; + + va_start(args, selector); + node = (struct device_node*)va_arg(args, void*); + param = va_arg(args, long); + value = va_arg(args, long); + va_end(args); + + return func(node, param, value); +} + +static int __init probe_motherboard(void) +{ + int i; + struct macio_chip* macio = &macio_chips[0]; + const char* model = NULL; + struct device_node *dt; + + /* Lookup known motherboard type in device-tree. First try an + * exact match on the "model" property, then try a "compatible" + * match is none is found. + */ + dt = find_devices("device-tree"); + if (dt != NULL) + model = (const char *) get_property(dt, "model", NULL); + for(i=0; model && i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) { + if (strcmp(model, pmac_mb_defs[i].model_string) == 0) { + pmac_mb = pmac_mb_defs[i]; + goto found; + } + } + for(i=0; i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) { + if (machine_is_compatible(pmac_mb_defs[i].model_string)) { + pmac_mb = pmac_mb_defs[i]; + goto found; + } + } + + /* Fallback to selection depending on mac-io chip type */ + switch(macio->type) { + case macio_keylargo2: + pmac_mb.model_id = PMAC_TYPE_UNKNOWN_K2; + pmac_mb.model_name = "Unknown K2-based"; + pmac_mb.features = g5_features; + + default: + return -ENODEV; + } +found: + /* Check for "mobile" machine */ + if (model && (strncmp(model, "PowerBook", 9) == 0 + || strncmp(model, "iBook", 5) == 0)) + pmac_mb.board_flags |= PMAC_MB_MOBILE; + + + printk(KERN_INFO "PowerMac motherboard: %s\n", pmac_mb.model_name); + return 0; +} + +/* Initialize the Core99 UniNorth host bridge and memory controller + */ +static void __init probe_uninorth(void) +{ + uninorth_node = of_find_node_by_name(NULL, "u3"); + if (uninorth_node && uninorth_node->n_addrs > 0) { + /* Small hack until I figure out if parsing in prom.c is correct. I should + * get rid of those pre-parsed junk anyway + */ + unsigned long address = uninorth_node->addrs[0].address; + uninorth_base = ioremap(address, 0x40000); + uninorth_rev = in_be32(UN_REG(UNI_N_VERSION)); + u3_ht = ioremap(address + U3_HT_CONFIG_BASE, 0x1000); + } else + uninorth_node = NULL; + + if (!uninorth_node) + return; + + printk(KERN_INFO "Found U3 memory controller & host bridge, revision: %d\n", + uninorth_rev); + printk(KERN_INFO "Mapped at 0x%08lx\n", (unsigned long)uninorth_base); + +} + +static void __init probe_one_macio(const char* name, const char* compat, int type) +{ + struct device_node* node; + int i; + volatile u32* base; + u32* revp; + + node = find_devices(name); + if (!node || !node->n_addrs) + return; + if (compat) + do { + if (device_is_compatible(node, compat)) + break; + node = node->next; + } while (node); + if (!node) + return; + for(i=0; i= MAX_MACIO_CHIPS) { + printk(KERN_ERR "pmac_feature: Please increase MAX_MACIO_CHIPS !\n"); + printk(KERN_ERR "pmac_feature: %s skipped\n", node->full_name); + return; + } + base = (volatile u32*)ioremap(node->addrs[0].address, node->addrs[0].size); + if (!base) { + printk(KERN_ERR "pmac_feature: Can't map mac-io chip !\n"); + return; + } + if (type == macio_keylargo) { + u32* did = (u32 *)get_property(node, "device-id", NULL); + if (*did == 0x00000025) + type = macio_pangea; + if (*did == 0x0000003e) + type = macio_intrepid; + } + macio_chips[i].of_node = node; + macio_chips[i].type = type; + macio_chips[i].base = base; + macio_chips[i].flags = MACIO_FLAG_SCCB_ON | MACIO_FLAG_SCCB_ON; + macio_chips[i].name = macio_names[type]; + revp = (u32 *)get_property(node, "revision-id", NULL); + if (revp) + macio_chips[i].rev = *revp; + printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n", + macio_names[type], macio_chips[i].rev, macio_chips[i].base); +} + +static int __init +probe_macios(void) +{ + probe_one_macio("mac-io", "K2-Keylargo", macio_keylargo2); + + macio_chips[0].lbus.index = 0; + macio_chips[1].lbus.index = 1; + + return (macio_chips[0].of_node == NULL) ? -ENODEV : 0; +} + +static void __init +set_initial_features(void) +{ + struct device_node *np; + + if (macio_chips[0].type == macio_keylargo2) { +#ifndef CONFIG_SMP + /* On SMP machines running UP, we have the second CPU eating + * bus cycles. We need to take it off the bus. This is done + * from pmac_smp for SMP kernels running on one CPU + */ + np = of_find_node_by_type(NULL, "cpu"); + if (np != NULL) + np = of_find_node_by_type(np, "cpu"); + if (np != NULL) { + g5_phy_disable_cpu1(); + of_node_put(np); + } +#endif /* CONFIG_SMP */ + /* Enable GMAC for now for PCI probing. It will be disabled + * later on after PCI probe + */ + np = of_find_node_by_name(NULL, "ethernet"); + while(np) { + if (device_is_compatible(np, "K2-GMAC")) + g5_gmac_enable(np, 0, 1); + np = of_find_node_by_name(np, "ethernet"); + } + + /* Enable FW before PCI probe. Will be disabled later on + * Note: We should have a batter way to check that we are + * dealing with uninorth internal cell and not a PCI cell + * on the external PCI. The code below works though. + */ + np = of_find_node_by_name(NULL, "firewire"); + while(np) { + if (device_is_compatible(np, "pci106b,5811")) { + macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED; + g5_fw_enable(np, 0, 1); + } + np = of_find_node_by_name(np, "firewire"); + } + } +} + +void __init +pmac_feature_init(void) +{ + /* Detect the UniNorth memory controller */ + probe_uninorth(); + + /* Probe mac-io controllers */ + if (probe_macios()) { + printk(KERN_WARNING "No mac-io chip found\n"); + return; + } + + /* Setup low-level i2c stuffs */ + pmac_init_low_i2c(); + + /* Probe machine type */ + if (probe_motherboard()) + printk(KERN_WARNING "Unknown PowerMac !\n"); + + /* Set some initial features (turn off some chips that will + * be later turned on) + */ + set_initial_features(); +} + +int __init pmac_feature_late_init(void) +{ +#if 0 + struct device_node* np; + + /* Request some resources late */ + if (uninorth_node) + request_OF_resource(uninorth_node, 0, NULL); + np = find_devices("hammerhead"); + if (np) + request_OF_resource(np, 0, NULL); + np = find_devices("interrupt-controller"); + if (np) + request_OF_resource(np, 0, NULL); +#endif + return 0; +} + +device_initcall(pmac_feature_late_init); + + +static void dump_HT_speeds(char *name, u32 cfg, u32 frq) +{ + int freqs[16] = { 200,300,400,500,600,800,1000,0,0,0,0,0,0,0,0,0 }; + int bits[8] = { 8,16,0,32,2,4,0,0 }; + int freq = (frq >> 8) & 0xf; + + if (freqs[freq] == 0) + printk("%s: Unknown HT link frequency %x\n", name, freq); + else + printk("%s: %d MHz on main link, (%d in / %d out) bits width\n", + name, freqs[freq], + bits[(cfg >> 28) & 0x7], bits[(cfg >> 24) & 0x7]); +} + +void __init pmac_check_ht_link(void) +{ +#if 0 /* Disabled for now */ + u32 ufreq, freq, ucfg, cfg; + struct device_node *pcix_node; + u8 px_bus, px_devfn; + struct pci_controller *px_hose; + + (void)in_be32(u3_ht + U3_HT_LINK_COMMAND); + ucfg = cfg = in_be32(u3_ht + U3_HT_LINK_CONFIG); + ufreq = freq = in_be32(u3_ht + U3_HT_LINK_FREQ); + dump_HT_speeds("U3 HyperTransport", cfg, freq); + + pcix_node = of_find_compatible_node(NULL, "pci", "pci-x"); + if (pcix_node == NULL) { + printk("No PCI-X bridge found\n"); + return; + } + px_hose = pcix_node->phb; + px_bus = pcix_node->busno; + px_devfn = pcix_node->devfn; + + early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq); + dump_HT_speeds("PCI-X HT Uplink", cfg, freq); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xc8, &cfg); + early_read_config_dword(px_hose, px_bus, px_devfn, 0xd0, &freq); + dump_HT_speeds("PCI-X HT Downlink", cfg, freq); +#endif +} diff -Nru a/arch/ppc64/kernel/pmac_low_i2c.c b/arch/ppc64/kernel/pmac_low_i2c.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_low_i2c.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,513 @@ +/* + * arch/ppc/platforms/pmac_low_i2c.c + * + * Copyright (C) 2003 Ben. Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * This file contains some low-level i2c access routines that + * need to be used by various bits of the PowerMac platform code + * at times where the real asynchronous & interrupt driven driver + * cannot be used. The API borrows some semantics from the darwin + * driver in order to ease the implementation of the platform + * properties parser + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_LOW_I2C_HOST 4 + +#if 1 +#define DBG(x...) do {\ + printk(KERN_DEBUG "KW:" x); \ + } while(0) +#else +#define DBGG(x...) +#endif + +struct low_i2c_host; + +typedef int (*low_i2c_func_t)(struct low_i2c_host *host, u8 addr, u8 sub, u8 *data, int len); + +struct low_i2c_host +{ + struct device_node *np; /* OF device node */ + struct semaphore mutex; /* Access mutex for use by i2c-keywest */ + low_i2c_func_t func; /* Access function */ + int is_open : 1; /* Poor man's access control */ + int mode; /* Current mode */ + int channel; /* Current channel */ + int num_channels; /* Number of channels */ + unsigned long base; /* For keywest-i2c, base address */ + int bsteps; /* And register stepping */ + int speed; /* And speed */ +}; + +static struct low_i2c_host low_i2c_hosts[MAX_LOW_I2C_HOST]; + +/* No locking is necessary on allocation, we are running way before + * anything can race with us + */ +static struct low_i2c_host *find_low_i2c_host(struct device_node *np) +{ + int i; + + for (i = 0; i < MAX_LOW_I2C_HOST; i++) + if (low_i2c_hosts[i].np == np) + return &low_i2c_hosts[i]; + return NULL; +} + +/* + * + * i2c-keywest implementation (UniNorth, U2, U3, Keylargo's) + * + */ + +/* + * Keywest i2c definitions borrowed from drivers/i2c/i2c-keywest.h, + * should be moved somewhere in include/asm-ppc/ + */ +/* Register indices */ +typedef enum { + reg_mode = 0, + reg_control, + reg_status, + reg_isr, + reg_ier, + reg_addr, + reg_subaddr, + reg_data +} reg_t; + + +/* Mode register */ +#define KW_I2C_MODE_100KHZ 0x00 +#define KW_I2C_MODE_50KHZ 0x01 +#define KW_I2C_MODE_25KHZ 0x02 +#define KW_I2C_MODE_DUMB 0x00 +#define KW_I2C_MODE_STANDARD 0x04 +#define KW_I2C_MODE_STANDARDSUB 0x08 +#define KW_I2C_MODE_COMBINED 0x0C +#define KW_I2C_MODE_MODE_MASK 0x0C +#define KW_I2C_MODE_CHAN_MASK 0xF0 + +/* Control register */ +#define KW_I2C_CTL_AAK 0x01 +#define KW_I2C_CTL_XADDR 0x02 +#define KW_I2C_CTL_STOP 0x04 +#define KW_I2C_CTL_START 0x08 + +/* Status register */ +#define KW_I2C_STAT_BUSY 0x01 +#define KW_I2C_STAT_LAST_AAK 0x02 +#define KW_I2C_STAT_LAST_RW 0x04 +#define KW_I2C_STAT_SDA 0x08 +#define KW_I2C_STAT_SCL 0x10 + +/* IER & ISR registers */ +#define KW_I2C_IRQ_DATA 0x01 +#define KW_I2C_IRQ_ADDR 0x02 +#define KW_I2C_IRQ_STOP 0x04 +#define KW_I2C_IRQ_START 0x08 +#define KW_I2C_IRQ_MASK 0x0F + +/* State machine states */ +enum { + state_idle, + state_addr, + state_read, + state_write, + state_stop, + state_dead +}; + +#define WRONG_STATE(name) do {\ + printk(KERN_DEBUG "KW: wrong state. Got %s, state: %s (isr: %02x)\n", \ + name, __kw_state_names[state], isr); \ + } while(0) + +static const char *__kw_state_names[] = { + "state_idle", + "state_addr", + "state_read", + "state_write", + "state_stop", + "state_dead" +}; + +static inline u8 __kw_read_reg(struct low_i2c_host *host, reg_t reg) +{ + return in_8(((volatile u8 *)host->base) + + (((unsigned)reg) << host->bsteps)); +} + +static inline void __kw_write_reg(struct low_i2c_host *host, reg_t reg, u8 val) +{ + out_8(((volatile u8 *)host->base) + + (((unsigned)reg) << host->bsteps), val); + (void)__kw_read_reg(host, reg_subaddr); +} + +#define kw_write_reg(reg, val) __kw_write_reg(host, reg, val) +#define kw_read_reg(reg) __kw_read_reg(host, reg) + + +/* Don't schedule, the g5 fan controller is too + * timing sensitive + */ +static u8 kw_wait_interrupt(struct low_i2c_host* host) +{ + int i; + u8 isr; + + for (i = 0; i < 200000; i++) { + isr = kw_read_reg(reg_isr) & KW_I2C_IRQ_MASK; + if (isr != 0) + return isr; + udelay(1); + } + return isr; +} + +static int kw_handle_interrupt(struct low_i2c_host *host, int state, int rw, int *rc, u8 **data, int *len, u8 isr) +{ + u8 ack; + + if (isr == 0) { + if (state != state_stop) { + DBG("KW: Timeout !\n"); + *rc = -EIO; + goto stop; + } + if (state == state_stop) { + ack = kw_read_reg(reg_status); + if (!(ack & KW_I2C_STAT_BUSY)) { + state = state_idle; + kw_write_reg(reg_ier, 0x00); + } + } + return state; + } + + if (isr & KW_I2C_IRQ_ADDR) { + ack = kw_read_reg(reg_status); + if (state != state_addr) { + kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR); + WRONG_STATE("KW_I2C_IRQ_ADDR"); + *rc = -EIO; + goto stop; + } + if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { + *rc = -ENODEV; + DBG("KW: NAK on address\n"); + return state_stop; + } else { + if (rw) { + state = state_read; + if (*len > 1) + kw_write_reg(reg_control, KW_I2C_CTL_AAK); + } else { + state = state_write; + kw_write_reg(reg_data, **data); + (*data)++; (*len)--; + } + } + kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR); + } + + if (isr & KW_I2C_IRQ_DATA) { + if (state == state_read) { + **data = kw_read_reg(reg_data); + (*data)++; (*len)--; + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + if ((*len) == 0) + state = state_stop; + else if ((*len) == 1) + kw_write_reg(reg_control, 0); + } else if (state == state_write) { + ack = kw_read_reg(reg_status); + if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { + DBG("KW: nack on data write\n"); + *rc = -EIO; + goto stop; + } else if (*len) { + kw_write_reg(reg_data, **data); + (*data)++; (*len)--; + } else { + kw_write_reg(reg_control, KW_I2C_CTL_STOP); + state = state_stop; + *rc = 0; + } + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + } else { + kw_write_reg(reg_isr, KW_I2C_IRQ_DATA); + WRONG_STATE("KW_I2C_IRQ_DATA"); + if (state != state_stop) { + *rc = -EIO; + goto stop; + } + } + } + + if (isr & KW_I2C_IRQ_STOP) { + kw_write_reg(reg_isr, KW_I2C_IRQ_STOP); + if (state != state_stop) { + WRONG_STATE("KW_I2C_IRQ_STOP"); + *rc = -EIO; + } + return state_idle; + } + + if (isr & KW_I2C_IRQ_START) + kw_write_reg(reg_isr, KW_I2C_IRQ_START); + + return state; + + stop: + kw_write_reg(reg_control, KW_I2C_CTL_STOP); + return state_stop; +} + +static int keywest_low_i2c_func(struct low_i2c_host *host, u8 addr, u8 subaddr, u8 *data, int len) +{ + u8 mode_reg = host->speed; + int state = state_addr; + int rc = 0; + + /* Setup mode & subaddress if any */ + switch(host->mode) { + case pmac_low_i2c_mode_dumb: + printk(KERN_ERR "low_i2c: Dumb mode not supported !\n"); + return -EINVAL; + case pmac_low_i2c_mode_std: + mode_reg |= KW_I2C_MODE_STANDARD; + break; + case pmac_low_i2c_mode_stdsub: + mode_reg |= KW_I2C_MODE_STANDARDSUB; + kw_write_reg(reg_subaddr, subaddr); + break; + case pmac_low_i2c_mode_combined: + mode_reg |= KW_I2C_MODE_COMBINED; + kw_write_reg(reg_subaddr, subaddr); + break; + } + + /* Setup channel & clear pending irqs */ + kw_write_reg(reg_isr, kw_read_reg(reg_isr)); + kw_write_reg(reg_mode, mode_reg | (host->channel << 4)); + kw_write_reg(reg_status, 0); + + /* Set up address and r/w bit */ + kw_write_reg(reg_addr, addr); + + /* Start sending address & disable interrupt*/ + kw_write_reg(reg_ier, 0 /*KW_I2C_IRQ_MASK*/); + kw_write_reg(reg_control, KW_I2C_CTL_XADDR); + + /* State machine, to turn into an interrupt handler */ + while(state != state_idle) { + u8 isr = kw_wait_interrupt(host); + state = kw_handle_interrupt(host, state, addr & 1, &rc, &data, &len, isr); + } + + return rc; +} + +static void keywest_low_i2c_add(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(NULL); + unsigned long *psteps, *prate, steps, aoffset = 0; + struct device_node *parent; + + if (host == NULL) { + printk(KERN_ERR "low_i2c: Can't allocate host for %s\n", + np->full_name); + return; + } + memset(host, 0, sizeof(*host)); + + init_MUTEX(&host->mutex); + host->np = of_node_get(np); + psteps = (unsigned long *)get_property(np, "AAPL,address-step", NULL); + steps = psteps ? (*psteps) : 0x10; + for (host->bsteps = 0; (steps & 0x01) == 0; host->bsteps++) + steps >>= 1; + parent = of_get_parent(np); + host->num_channels = 1; + if (parent && parent->name[0] == 'u') { + host->num_channels = 2; + aoffset = 3; + } + /* Select interface rate */ + host->speed = KW_I2C_MODE_100KHZ; + prate = (unsigned long *)get_property(np, "AAPL,i2c-rate", NULL); + if (prate) switch(*prate) { + case 100: + host->speed = KW_I2C_MODE_100KHZ; + break; + case 50: + host->speed = KW_I2C_MODE_50KHZ; + break; + case 25: + host->speed = KW_I2C_MODE_25KHZ; + break; + } + host->mode = pmac_low_i2c_mode_std; + host->base = (unsigned long)ioremap(np->addrs[0].address + aoffset, + np->addrs[0].size); + host->func = keywest_low_i2c_func; +} + +/* + * + * PMU implementation + * + */ + + +#ifdef CONFIG_ADB_PMU + +static int pmu_low_i2c_func(struct low_i2c_host *host, u8 addr, u8 sub, u8 *data, int len) +{ + // TODO + return -ENODEV; +} + +static void pmu_low_i2c_add(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(NULL); + + if (host == NULL) { + printk(KERN_ERR "low_i2c: Can't allocate host for %s\n", + np->full_name); + return; + } + memset(host, 0, sizeof(*host)); + + init_MUTEX(&host->mutex); + host->np = of_node_get(np); + host->num_channels = 3; + host->mode = pmac_low_i2c_mode_std; + host->func = pmu_low_i2c_func; +} + +#endif /* CONFIG_ADB_PMU */ + +void __init pmac_init_low_i2c(void) +{ + struct device_node *np; + + /* Probe keywest-i2c busses */ + np = of_find_compatible_node(NULL, "i2c", "keywest-i2c"); + while(np) { + keywest_low_i2c_add(np); + np = of_find_compatible_node(np, "i2c", "keywest-i2c"); + } + +#ifdef CONFIG_ADB_PMU + /* Probe PMU busses */ + np = of_find_node_by_name(NULL, "via-pmu"); + if (np) + pmu_low_i2c_add(np); +#endif /* CONFIG_ADB_PMU */ + + /* TODO: Add CUDA support as well */ +} + +int pmac_low_i2c_lock(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + down(&host->mutex); + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_lock); + +int pmac_low_i2c_unlock(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + up(&host->mutex); + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_unlock); + + +int pmac_low_i2c_open(struct device_node *np, int channel) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + + if (channel >= host->num_channels) + return -EINVAL; + + down(&host->mutex); + host->is_open = 1; + host->channel = channel; + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_open); + +int pmac_low_i2c_close(struct device_node *np) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + + host->is_open = 0; + up(&host->mutex); + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_close); + +int pmac_low_i2c_setmode(struct device_node *np, int mode) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + WARN_ON(!host->is_open); + host->mode = mode; + + return 0; +} +EXPORT_SYMBOL(pmac_low_i2c_setmode); + +int pmac_low_i2c_xfer(struct device_node *np, u8 addrdir, u8 subaddr, u8 *data, int len) +{ + struct low_i2c_host *host = find_low_i2c_host(np); + + if (!host) + return -ENODEV; + WARN_ON(!host->is_open); + + return host->func(host, addrdir, subaddr, data, len); +} +EXPORT_SYMBOL(pmac_low_i2c_xfer); + diff -Nru a/arch/ppc64/kernel/pmac_nvram.c b/arch/ppc64/kernel/pmac_nvram.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_nvram.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,495 @@ +/* + * arch/ppc/platforms/pmac_nvram.c + * + * Copyright (C) 2002 Benjamin Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Todo: - add support for the OF persistent properties + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEBUG + +#ifdef DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif + +#define NVRAM_SIZE 0x2000 /* 8kB of non-volatile RAM */ + +#define CORE99_SIGNATURE 0x5a +#define CORE99_ADLER_START 0x14 + +/* On Core99, nvram is either a sharp, a micron or an AMD flash */ +#define SM_FLASH_STATUS_DONE 0x80 +#define SM_FLASH_STATUS_ERR 0x38 + +#define SM_FLASH_CMD_ERASE_CONFIRM 0xd0 +#define SM_FLASH_CMD_ERASE_SETUP 0x20 +#define SM_FLASH_CMD_RESET 0xff +#define SM_FLASH_CMD_WRITE_SETUP 0x40 +#define SM_FLASH_CMD_CLEAR_STATUS 0x50 +#define SM_FLASH_CMD_READ_STATUS 0x70 + +/* CHRP NVRAM header */ +struct chrp_header { + u8 signature; + u8 cksum; + u16 len; + char name[12]; + u8 data[0]; +}; + +struct core99_header { + struct chrp_header hdr; + u32 adler; + u32 generation; + u32 reserved[2]; +}; + +/* + * Read and write the non-volatile RAM on PowerMacs and CHRP machines. + */ +static volatile unsigned char *nvram_data; +static int core99_bank = 0; +// XXX Turn that into a sem +static spinlock_t nv_lock = SPIN_LOCK_UNLOCKED; + +extern int system_running; + +static int (*core99_write_bank)(int bank, u8* datas); +static int (*core99_erase_bank)(int bank); + +static char *nvram_image __pmacdata; + + +static ssize_t __pmac core99_nvram_read(char *buf, size_t count, loff_t *index) +{ + int i; + + if (nvram_image == NULL) + return -ENODEV; + if (*index > NVRAM_SIZE) + return 0; + + i = *index; + if (i + count > NVRAM_SIZE) + count = NVRAM_SIZE - i; + + memcpy(buf, &nvram_image[i], count); + *index = i + count; + return count; +} + +static ssize_t __pmac core99_nvram_write(char *buf, size_t count, loff_t *index) +{ + int i; + + if (nvram_image == NULL) + return -ENODEV; + if (*index > NVRAM_SIZE) + return 0; + + i = *index; + if (i + count > NVRAM_SIZE) + count = NVRAM_SIZE - i; + + memcpy(&nvram_image[i], buf, count); + *index = i + count; + return count; +} + +static ssize_t __pmac core99_nvram_size(void) +{ + if (nvram_image == NULL) + return -ENODEV; + return NVRAM_SIZE; +} + +static u8 __pmac chrp_checksum(struct chrp_header* hdr) +{ + u8 *ptr; + u16 sum = hdr->signature; + for (ptr = (u8 *)&hdr->len; ptr < hdr->data; ptr++) + sum += *ptr; + while (sum > 0xFF) + sum = (sum & 0xFF) + (sum>>8); + return sum; +} + +static u32 __pmac core99_calc_adler(u8 *buffer) +{ + int cnt; + u32 low, high; + + buffer += CORE99_ADLER_START; + low = 1; + high = 0; + for (cnt=0; cnt<(NVRAM_SIZE-CORE99_ADLER_START); cnt++) { + if ((cnt % 5000) == 0) { + high %= 65521UL; + high %= 65521UL; + } + low += buffer[cnt]; + high += low; + } + low %= 65521UL; + high %= 65521UL; + + return (high << 16) | low; +} + +static u32 __pmac core99_check(u8* datas) +{ + struct core99_header* hdr99 = (struct core99_header*)datas; + + if (hdr99->hdr.signature != CORE99_SIGNATURE) { + DBG("Invalid signature\n"); + return 0; + } + if (hdr99->hdr.cksum != chrp_checksum(&hdr99->hdr)) { + DBG("Invalid checksum\n"); + return 0; + } + if (hdr99->adler != core99_calc_adler(datas)) { + DBG("Invalid adler\n"); + return 0; + } + return hdr99->generation; +} + +static int __pmac sm_erase_bank(int bank) +{ + int stat, i; + unsigned long timeout; + + u8* base = (u8 *)nvram_data + core99_bank*NVRAM_SIZE; + + DBG("nvram: Sharp/Micron Erasing bank %d...\n", bank); + + out_8(base, SM_FLASH_CMD_ERASE_SETUP); + out_8(base, SM_FLASH_CMD_ERASE_CONFIRM); + timeout = 0; + do { + if (++timeout > 1000000) { + printk(KERN_ERR "nvram: Sharp/Miron flash erase timeout !\n"); + break; + } + out_8(base, SM_FLASH_CMD_READ_STATUS); + stat = in_8(base); + } while (!(stat & SM_FLASH_STATUS_DONE)); + + out_8(base, SM_FLASH_CMD_CLEAR_STATUS); + out_8(base, SM_FLASH_CMD_RESET); + + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: Sharp/Micron flash write timeout !\n"); + break; + } + out_8(base, SM_FLASH_CMD_READ_STATUS); + stat = in_8(base); + } while (!(stat & SM_FLASH_STATUS_DONE)); + if (!(stat & SM_FLASH_STATUS_DONE)) + break; + } + out_8(base, SM_FLASH_CMD_CLEAR_STATUS); + out_8(base, SM_FLASH_CMD_RESET); + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: AMD flash erase timeout !\n"); + break; + } + stat = in_8(base) ^ in_8(base); + } while (stat != 0); + + /* Reset */ + out_8(base, 0xf0); + udelay(1); + + for (i=0; i 1000000) { + printk(KERN_ERR "nvram: AMD flash write timeout !\n"); + break; + } + stat = in_8(base) ^ in_8(base); + } while (stat != 0); + if (stat != 0) + break; + } + + /* Reset */ + out_8(base, 0xf0); + udelay(1); + + for (i=0; igeneration++; + hdr99->hdr.signature = CORE99_SIGNATURE; + hdr99->hdr.cksum = chrp_checksum(&hdr99->hdr); + hdr99->adler = core99_calc_adler(nvram_image); + core99_bank = core99_bank ? 0 : 1; + if (core99_erase_bank) + if (core99_erase_bank(core99_bank)) { + printk("nvram: Error erasing bank %d\n", core99_bank); + goto bail; + } + if (core99_write_bank) + if (core99_write_bank(core99_bank, nvram_image)) + printk("nvram: Error writing bank %d\n", core99_bank); + bail: + spin_unlock_irqrestore(&nv_lock, flags); + + return 0; +} + +int __init pmac_nvram_init(void) +{ + struct device_node *dp; + u32 gen_bank0, gen_bank1; + int i; + + dp = find_devices("nvram"); + if (dp == NULL) { + printk(KERN_ERR "Can't find NVRAM device\n"); + return -ENODEV; + } + if (!device_is_compatible(dp, "nvram,flash")) { + printk(KERN_ERR "Incompatible type of NVRAM\n"); + return -ENXIO; + } + + nvram_image = alloc_bootmem(NVRAM_SIZE); + if (nvram_image == NULL) { + printk(KERN_ERR "nvram: can't allocate ram image\n"); + return -ENOMEM; + } + nvram_data = ioremap(dp->addrs[0].address, NVRAM_SIZE*2); + + DBG("nvram: Checking bank 0...\n"); + + gen_bank0 = core99_check((u8 *)nvram_data); + gen_bank1 = core99_check((u8 *)nvram_data + NVRAM_SIZE); + core99_bank = (gen_bank0 < gen_bank1) ? 1 : 0; + + DBG("nvram: gen0=%d, gen1=%d\n", gen_bank0, gen_bank1); + DBG("nvram: Active bank is: %d\n", core99_bank); + + for (i=0; iindex; +} + +u8 __pmac pmac_xpram_read(int xpaddr) +{ + int offset = pmac_get_partition(pmac_nvram_XPRAM); + loff_t index; + u8 buf; + ssize_t count; + + if (offset < 0 || xpaddr < 0 || xpaddr > 0x100) + return 0xff; + index = offset + xpaddr; + + count = ppc_md.nvram_read(&buf, 1, &index); + if (count != 1) + return 0xff; + return buf; +} + +void __pmac pmac_xpram_write(int xpaddr, u8 data) +{ + int offset = pmac_get_partition(pmac_nvram_XPRAM); + loff_t index; + u8 buf; + + if (offset < 0 || xpaddr < 0 || xpaddr > 0x100) + return; + index = offset + xpaddr; + buf = data; + + ppc_md.nvram_write(&buf, 1, &index); +} + +EXPORT_SYMBOL(pmac_get_partition); +EXPORT_SYMBOL(pmac_xpram_read); +EXPORT_SYMBOL(pmac_xpram_write); diff -Nru a/arch/ppc64/kernel/pmac_pci.c b/arch/ppc64/kernel/pmac_pci.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_pci.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,755 @@ +/* + * Support for PCI bridges found on Power Macintoshes. + * At present the "bandit" and "chaos" bridges are supported. + * Fortunately you access configuration space in the same + * way with either bridge. + * + * Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org) + * Copyright (C) 1997 Paul Mackerras (paulus@samba.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "pci.h" +#include "pmac.h" + +#define DEBUG + +#ifdef DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif + +extern int pci_probe_only; +extern int pci_read_irq_line(struct pci_dev *pci_dev); + +/* XXX Could be per-controller, but I don't think we risk anything by + * assuming we won't have both UniNorth and Bandit */ +static int has_uninorth; +static struct pci_controller *u3_agp; +u8 pci_cache_line_size; +struct pci_dev *k2_skiplist[2]; + +static int __init fixup_one_level_bus_range(struct device_node *node, int higher) +{ + for (; node != 0;node = node->sibling) { + int * bus_range; + unsigned int *class_code; + int len; + + /* For PCI<->PCI bridges or CardBus bridges, we go down */ + class_code = (unsigned int *) get_property(node, "class-code", 0); + if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && + (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) + continue; + bus_range = (int *) get_property(node, "bus-range", &len); + if (bus_range != NULL && len > 2 * sizeof(int)) { + if (bus_range[1] > higher) + higher = bus_range[1]; + } + higher = fixup_one_level_bus_range(node->child, higher); + } + return higher; +} + +/* This routine fixes the "bus-range" property of all bridges in the + * system since they tend to have their "last" member wrong on macs + * + * Note that the bus numbers manipulated here are OF bus numbers, they + * are not Linux bus numbers. + */ +static void __init fixup_bus_range(struct device_node *bridge) +{ + int * bus_range; + int len; + + /* Lookup the "bus-range" property for the hose */ + bus_range = (int *) get_property(bridge, "bus-range", &len); + if (bus_range == NULL || len < 2 * sizeof(int)) { + printk(KERN_WARNING "Can't get bus-range for %s\n", + bridge->full_name); + return; + } + bus_range[1] = fixup_one_level_bus_range(bridge->child, bus_range[1]); +} + +/* + * Apple MacRISC (U3, UniNorth, Bandit, Chaos) PCI controllers. + * + * The "Bandit" version is present in all early PCI PowerMacs, + * and up to the first ones using Grackle. Some machines may + * have 2 bandit controllers (2 PCI busses). + * + * "Chaos" is used in some "Bandit"-type machines as a bridge + * for the separate display bus. It is accessed the same + * way as bandit, but cannot be probed for devices. It therefore + * has its own config access functions. + * + * The "UniNorth" version is present in all Core99 machines + * (iBook, G4, new IMacs, and all the recent Apple machines). + * It contains 3 controllers in one ASIC. + * + * The U3 is the bridge used on G5 machines. It contains on + * AGP bus which is dealt with the old UniNorth access routines + * and an HyperTransport bus which uses its own set of access + * functions. + */ + +#define MACRISC_CFA0(devfn, off) \ + ((1 << (unsigned long)PCI_SLOT(dev_fn)) \ + | (((unsigned long)PCI_FUNC(dev_fn)) << 8) \ + | (((unsigned long)(off)) & 0xFCUL)) + +#define MACRISC_CFA1(bus, devfn, off) \ + ((((unsigned long)(bus)) << 16) \ + |(((unsigned long)(devfn)) << 8) \ + |(((unsigned long)(off)) & 0xFCUL) \ + |1UL) + +static unsigned long __pmac macrisc_cfg_access(struct pci_controller* hose, + u8 bus, u8 dev_fn, u8 offset) +{ + unsigned int caddr; + + if (bus == hose->first_busno) { + if (dev_fn < (11 << 3)) + return 0; + caddr = MACRISC_CFA0(dev_fn, offset); + } else + caddr = MACRISC_CFA1(bus, dev_fn, offset); + + /* Uninorth will return garbage if we don't read back the value ! */ + do { + out_le32(hose->cfg_addr, caddr); + } while (in_le32(hose->cfg_addr) != caddr); + + offset &= has_uninorth ? 0x07 : 0x03; + return ((unsigned long)hose->cfg_data) + offset; +} + +static int __pmac macrisc_read_config(struct pci_bus *bus, unsigned int devfn, + int offset, int len, u32 *val) +{ + struct pci_controller *hose; + struct device_node *busdn; + unsigned long addr; + int i; + + if (bus->self) + busdn = pci_device_to_OF_node(bus->self); + else + busdn = bus->sysdata; /* must be a phb */ + if (busdn == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + hose = busdn->phb; + if (hose == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + + /* + * When a device in K2 is powered down, we die on config + * cycle accesses. Fix that here. + */ + for (i=0; i<2; i++) + if (k2_skiplist[i] && k2_skiplist[i]->bus == bus && + k2_skiplist[i]->devfn == devfn) { + switch (len) { + case 1: + *val = 0xff; break; + case 2: + *val = 0xffff; break; + default: + *val = 0xfffffffful; break; + } + return PCIBIOS_SUCCESSFUL; + } + + addr = macrisc_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + *val = in_8((u8 *)addr); + break; + case 2: + *val = in_le16((u16 *)addr); + break; + default: + *val = in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static int __pmac macrisc_write_config(struct pci_bus *bus, unsigned int devfn, + int offset, int len, u32 val) +{ + struct pci_controller *hose; + struct device_node *busdn; + unsigned long addr; + int i; + + if (bus->self) + busdn = pci_device_to_OF_node(bus->self); + else + busdn = bus->sysdata; /* must be a phb */ + if (busdn == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + hose = busdn->phb; + if (hose == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + + /* + * When a device in K2 is powered down, we die on config + * cycle accesses. Fix that here. + */ + for (i=0; i<2; i++) + if (k2_skiplist[i] && k2_skiplist[i]->bus == bus && + k2_skiplist[i]->devfn == devfn) + return PCIBIOS_SUCCESSFUL; + + addr = macrisc_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + out_8((u8 *)addr, val); + (void) in_8((u8 *)addr); + break; + case 2: + out_le16((u16 *)addr, val); + (void) in_le16((u16 *)addr); + break; + default: + out_le32((u32 *)addr, val); + (void) in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static struct pci_ops macrisc_pci_ops = +{ + macrisc_read_config, + macrisc_write_config +}; + +/* + * These versions of U3 HyperTransport config space access ops do not + * implement self-view of the HT host yet + */ + +#define U3_HT_CFA0(devfn, off) \ + ((((unsigned long)devfn) << 8) | offset) +#define U3_HT_CFA1(bus, devfn, off) \ + (U3_HT_CFA0(devfn, off) \ + + (((unsigned long)bus) << 16) \ + + 0x01000000UL) + +static unsigned long __pmac u3_ht_cfg_access(struct pci_controller* hose, + u8 bus, u8 devfn, u8 offset) +{ + if (bus == hose->first_busno) { + /* For now, we don't self probe U3 HT bridge */ + if (PCI_FUNC(devfn) != 0 || PCI_SLOT(devfn) > 7 || + PCI_SLOT(devfn) < 1) + return 0; + return ((unsigned long)hose->cfg_data) + U3_HT_CFA0(devfn, offset); + } else + return ((unsigned long)hose->cfg_data) + U3_HT_CFA1(bus, devfn, offset); +} + +static int __pmac u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, + int offset, int len, u32 *val) +{ + struct pci_controller *hose; + struct device_node *busdn; + unsigned long addr; + + if (bus->self) + busdn = pci_device_to_OF_node(bus->self); + else + busdn = bus->sysdata; /* must be a phb */ + if (busdn == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + hose = busdn->phb; + if (hose == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + + addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + *val = in_8((u8 *)addr); + break; + case 2: + *val = in_le16((u16 *)addr); + break; + default: + *val = in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static int __pmac u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, + int offset, int len, u32 val) +{ + struct pci_controller *hose; + struct device_node *busdn; + unsigned long addr; + + if (bus->self) + busdn = pci_device_to_OF_node(bus->self); + else + busdn = bus->sysdata; /* must be a phb */ + if (busdn == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + hose = busdn->phb; + if (hose == NULL) + return PCIBIOS_DEVICE_NOT_FOUND; + + addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); + if (!addr) + return PCIBIOS_DEVICE_NOT_FOUND; + /* + * Note: the caller has already checked that offset is + * suitably aligned and that len is 1, 2 or 4. + */ + switch (len) { + case 1: + out_8((u8 *)addr, val); + (void) in_8((u8 *)addr); + break; + case 2: + out_le16((u16 *)addr, val); + (void) in_le16((u16 *)addr); + break; + default: + out_le32((u32 *)addr, val); + (void) in_le32((u32 *)addr); + break; + } + return PCIBIOS_SUCCESSFUL; +} + +static struct pci_ops u3_ht_pci_ops = +{ + u3_ht_read_config, + u3_ht_write_config +}; + +static void __init setup_u3_agp(struct pci_controller* hose) +{ + /* On G5, we move AGP up to high bus number so we don't need + * to reassign bus numbers for HT. If we ever have P2P bridges + * on AGP, we'll have to move pci_assign_all_busses to the + * pci_controller structure so we enable it for AGP and not for + * HT childs. + * We hard code the address because of the different size of + * the reg address cell, we shall fix that by killing struct + * reg_property and using some accessor functions instead + */ + hose->first_busno = 0xf0; + hose->last_busno = 0xff; + has_uninorth = 1; + hose->ops = ¯isc_pci_ops; + hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000); + hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000); + + u3_agp = hose; +} + +static void __init setup_u3_ht(struct pci_controller* hose) +{ + struct device_node *np = (struct device_node *)hose->arch_data; + int i, cur; + + hose->ops = &u3_ht_pci_ops; + + /* We hard code the address because of the different size of + * the reg address cell, we shall fix that by killing struct + * reg_property and using some accessor functions instead + */ + hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000, 0x02000000); + + /* + * /ht node doesn't expose a "ranges" property, so we "remove" regions that + * have been allocated to AGP. So far, this version of the code doesn't assign + * any of the 0xfxxxxxxx "fine" memory regions to /ht. + * We need to fix that sooner or later by either parsing all child "ranges" + * properties or figuring out the U3 address space decoding logic and + * then read it's configuration register (if any). + */ + hose->io_base_phys = 0xf4000000 + 0x00400000; + hose->io_base_virt = ioremap(hose->io_base_phys, 0x00400000); + isa_io_base = pci_io_base = (unsigned long) hose->io_base_virt; + hose->io_resource.name = np->full_name; + hose->io_resource.start = 0; + hose->io_resource.end = 0x003fffff; + hose->io_resource.flags = IORESOURCE_IO; + hose->pci_mem_offset = 0; + hose->first_busno = 0; + hose->last_busno = 0xef; + hose->mem_resources[0].name = np->full_name; + hose->mem_resources[0].start = 0x80000000; + hose->mem_resources[0].end = 0xefffffff; + hose->mem_resources[0].flags = IORESOURCE_MEM; + + if (u3_agp == NULL) { + DBG("U3 has no AGP, using full resource range\n"); + return; + } + + /* We "remove" the AGP resources from the resources allocated to HT, that + * is we create "holes". However, that code does assumptions that so far + * happen to be true (cross fingers...), typically that resources in the + * AGP node are properly ordered + */ + cur = 0; + for (i=0; i<3; i++) { + struct resource *res = &u3_agp->mem_resources[i]; + if (res->flags != IORESOURCE_MEM) + continue; + /* We don't care about "fine" resources */ + if (res->start >= 0xf0000000) + continue; + /* Check if it's just a matter of "shrinking" us in one direction */ + if (hose->mem_resources[cur].start == res->start) { + DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n", + cur, hose->mem_resources[cur].start, res->end + 1); + hose->mem_resources[cur].start = res->end + 1; + continue; + } + if (hose->mem_resources[cur].end == res->end) { + DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n", + cur, hose->mem_resources[cur].end, res->start - 1); + hose->mem_resources[cur].end = res->start - 1; + continue; + } + /* No, it's not the case, we need a hole */ + if (cur == 2) { + /* not enough resources for a hole, we drop part of the range */ + printk(KERN_WARNING "Running out of resources for /ht host !\n"); + hose->mem_resources[cur].end = res->start - 1; + continue; + } + cur++; + DBG("U3/HT: hole, %d end at %08lx, %d start at %08lx\n", + cur-1, res->start - 1, cur, res->end + 1); + hose->mem_resources[cur].name = np->full_name; + hose->mem_resources[cur].flags = IORESOURCE_MEM; + hose->mem_resources[cur].start = res->end + 1; + hose->mem_resources[cur].end = hose->mem_resources[cur-1].end; + hose->mem_resources[cur-1].end = res->start - 1; + } +} + +static void __init pmac_process_bridge_OF_ranges(struct pci_controller *hose, + struct device_node *dev, int primary) +{ + static unsigned int static_lc_ranges[2024]; + unsigned int *dt_ranges, *lc_ranges, *ranges, *prev; + unsigned int size; + int rlen = 0, orig_rlen; + int memno = 0; + struct resource *res; + int np, na = prom_n_addr_cells(dev); + + np = na + 5; + + /* First we try to merge ranges to fix a problem with some pmacs + * that can have more than 3 ranges, fortunately using contiguous + * addresses -- BenH + */ + dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen); + if (!dt_ranges) + return; + /* lc_ranges = (unsigned int *) alloc_bootmem(rlen);*/ + lc_ranges = static_lc_ranges; + if (!lc_ranges) + return; /* what can we do here ? */ + memcpy(lc_ranges, dt_ranges, rlen); + orig_rlen = rlen; + + /* Let's work on a copy of the "ranges" property instead of damaging + * the device-tree image in memory + */ + ranges = lc_ranges; + prev = NULL; + while ((rlen -= np * sizeof(unsigned int)) >= 0) { + if (prev) { + if (prev[0] == ranges[0] && prev[1] == ranges[1] && + (prev[2] + prev[na+4]) == ranges[2] && + (prev[na+2] + prev[na+4]) == ranges[na+2]) { + prev[na+4] += ranges[na+4]; + ranges[0] = 0; + ranges += np; + continue; + } + } + prev = ranges; + ranges += np; + } + + /* + * The ranges property is laid out as an array of elements, + * each of which comprises: + * cells 0 - 2: a PCI address + * cells 3 or 3+4: a CPU physical address + * (size depending on dev->n_addr_cells) + * cells 4+5 or 5+6: the size of the range + */ + ranges = lc_ranges; + rlen = orig_rlen; + while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) { + res = NULL; + size = ranges[na+4]; + switch (ranges[0] >> 24) { + case 1: /* I/O space */ + if (ranges[2] != 0) + break; + hose->io_base_phys = ranges[na+2]; + /* limit I/O space to 16MB */ + if (size > 0x01000000) + size = 0x01000000; + hose->io_base_virt = ioremap(ranges[na+2], size); + if (primary) + isa_io_base = (unsigned long) hose->io_base_virt; + res = &hose->io_resource; + res->flags = IORESOURCE_IO; + res->start = ranges[2]; + break; + case 2: /* memory space */ + memno = 0; + if (ranges[1] == 0 && ranges[2] == 0 + && ranges[na+4] <= (16 << 20)) { + /* 1st 16MB, i.e. ISA memory area */ +#if 0 + if (primary) + isa_mem_base = ranges[na+2]; +#endif + memno = 1; + } + while (memno < 3 && hose->mem_resources[memno].flags) + ++memno; + if (memno == 0) + hose->pci_mem_offset = ranges[na+2] - ranges[2]; + if (memno < 3) { + res = &hose->mem_resources[memno]; + res->flags = IORESOURCE_MEM; + res->start = ranges[na+2]; + } + break; + } + if (res != NULL) { + res->name = dev->full_name; + res->end = res->start + size - 1; + res->parent = NULL; + res->sibling = NULL; + res->child = NULL; + } + ranges += np; + } +} + +/* + * We assume that if we have a G3 powermac, we have one bridge called + * "pci" (a MPC106) and no bandit or chaos bridges, and contrariwise, + * if we have one or more bandit or chaos bridges, we don't have a MPC106. + */ +static int __init add_bridge(struct device_node *dev) +{ + int len; + struct pci_controller *hose; + char* disp_name; + int *bus_range; + int primary = 1; + struct property *of_prop; + + DBG("Adding PCI host bridge %s\n", dev->full_name); + + bus_range = (int *) get_property(dev, "bus-range", &len); + if (bus_range == NULL || len < 2 * sizeof(int)) { + printk(KERN_WARNING "Can't get bus-range for %s, assume bus 0\n", + dev->full_name); + } + + hose = pci_alloc_pci_controller(phb_type_apple); + if (!hose) + return -ENOMEM; + hose->arch_data = dev; + hose->first_busno = bus_range ? bus_range[0] : 0; + hose->last_busno = bus_range ? bus_range[1] : 0xff; + + of_prop = (struct property *)alloc_bootmem(sizeof(struct property) + + sizeof(hose->global_number)); + if (of_prop) { + memset(of_prop, 0, sizeof(struct property)); + of_prop->name = "linux,pci-domain"; + of_prop->length = sizeof(hose->global_number); + of_prop->value = (unsigned char *)&of_prop[1]; + memcpy(of_prop->value, &hose->global_number, sizeof(hose->global_number)); + prom_add_property(dev, of_prop); + } + + disp_name = NULL; + if (device_is_compatible(dev, "u3-agp")) { + setup_u3_agp(hose); + disp_name = "U3-AGP"; + primary = 0; + } else if (device_is_compatible(dev, "u3-ht")) { + setup_u3_ht(hose); + disp_name = "U3-HT"; + primary = 1; + } + printk(KERN_INFO "Found %s PCI host bridge. Firmware bus number: %d->%d\n", + disp_name, hose->first_busno, hose->last_busno); + + /* Interpret the "ranges" property */ + /* This also maps the I/O region and sets isa_io/mem_base */ + pmac_process_bridge_OF_ranges(hose, dev, primary); + + /* Fixup "bus-range" OF property */ + fixup_bus_range(dev); + + return 0; +} + + +void __init pmac_pcibios_fixup(void) +{ + struct pci_dev *dev = NULL; + + while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) + pci_read_irq_line(dev); + + pci_fix_bus_sysdata(); +} + +static void __init pmac_fixup_phb_resources(void) +{ + struct pci_controller *hose; + + for (hose = hose_head; hose; hose = hose->next) { + unsigned long offset = (unsigned long)hose->io_base_virt - pci_io_base; + hose->io_resource.start += offset; + hose->io_resource.end += offset; + printk(KERN_INFO "PCI Host %d, io start: %lx; io end: %lx\n", + hose->global_number, + hose->io_resource.start, hose->io_resource.end); + } +} + +void __init pmac_pci_init(void) +{ + struct device_node *np, *root; + struct device_node *ht = NULL; + + /* Probe root PCI hosts, that is on U3 the AGP host and the + * HyperTransport host. That one is actually "kept" around + * and actually added last as it's resource management relies + * on the AGP resources to have been setup first + */ + root = of_find_node_by_path("/"); + if (root == NULL) { + printk(KERN_CRIT "pmac_find_bridges: can't find root of device tree\n"); + return; + } + for (np = NULL; (np = of_get_next_child(root, np)) != NULL;) { + if (np->name == NULL) + continue; + if (strcmp(np->name, "pci") == 0) { + if (add_bridge(np) == 0) + of_node_get(np); + } + if (strcmp(np->name, "ht") == 0) { + of_node_get(np); + ht = np; + } + } + of_node_put(root); + + /* Now setup the HyperTransport host if we found any + */ + if (ht && add_bridge(ht) != 0) + of_node_put(ht); + + /* Fixup the IO resources on our host bridges as the common code + * does it only for childs of the host bridges + */ + pmac_fixup_phb_resources(); + + /* Setup the linkage between OF nodes and PHBs */ + pci_devs_phb_init(); + + pmac_check_ht_link(); + + /* Tell pci.c to use the common resource allocation mecanism */ + pci_probe_only = 0; + + /* HT don't do more than 64 bytes transfers. FIXME: Deal with + * the exception of U3/AGP (hook into pci_set_mwi) + */ + pci_cache_line_size = 16; /* 64 bytes */ +} + +/* + * Disable second function on K2-SATA, it's broken + * and disable IO BARs on first one + */ +void fixup_k2_sata(struct pci_dev* dev) +{ + int i; + u16 cmd; + + if (PCI_FUNC(dev->devfn) > 0) { + pci_read_config_word(dev, PCI_COMMAND, &cmd); + cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY); + pci_write_config_word(dev, PCI_COMMAND, cmd); + for (i = 0; i < 6; i++) { + dev->resource[i].start = dev->resource[i].end = 0; + dev->resource[i].flags = 0; + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); + } + } else { + pci_read_config_word(dev, PCI_COMMAND, &cmd); + cmd &= ~PCI_COMMAND_IO; + pci_write_config_word(dev, PCI_COMMAND, cmd); + for (i = 0; i < 5; i++) { + dev->resource[i].start = dev->resource[i].end = 0; + dev->resource[i].flags = 0; + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); + } + } +} diff -Nru a/arch/ppc64/kernel/pmac_setup.c b/arch/ppc64/kernel/pmac_setup.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_setup.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,504 @@ +/* + * arch/ppc/platforms/setup.c + * + * PowerPC version + * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) + * + * Adapted for Power Macintosh by Paul Mackerras + * Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au) + * + * Derived from "arch/alpha/kernel/setup.c" + * Copyright (C) 1995 Linus Torvalds + * + * Maintained by Benjamin Herrenschmidt (benh@kernel.crashing.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +/* + * bootup setup stuff.. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmac.h" + +extern char saved_command_line[]; +static int current_root_goodness = -1; +#define DEFAULT_ROOT_DEVICE Root_SDA1 /* sda1 - slightly silly choice */ + +extern int powersave_nap; +int sccdbg; + +extern void udbg_init_scc(struct device_node *np); + +#ifdef CONFIG_BOOTX_TEXT +void pmac_progress(char *s, unsigned short hex); +#endif + +void __pmac pmac_show_cpuinfo(struct seq_file *m) +{ + struct device_node *np; + char *pp; + int plen; + char* mbname; + int mbmodel = pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL, + PMAC_MB_INFO_MODEL, 0); + unsigned int mbflags = pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL, + PMAC_MB_INFO_FLAGS, 0); + + if (pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL, PMAC_MB_INFO_NAME, + (long)&mbname) != 0) + mbname = "Unknown"; + + /* find motherboard type */ + seq_printf(m, "machine\t\t: "); + np = find_devices("device-tree"); + if (np != NULL) { + pp = (char *) get_property(np, "model", NULL); + if (pp != NULL) + seq_printf(m, "%s\n", pp); + else + seq_printf(m, "PowerMac\n"); + pp = (char *) get_property(np, "compatible", &plen); + if (pp != NULL) { + seq_printf(m, "motherboard\t:"); + while (plen > 0) { + int l = strlen(pp) + 1; + seq_printf(m, " %s", pp); + plen -= l; + pp += l; + } + seq_printf(m, "\n"); + } + } else + seq_printf(m, "PowerMac\n"); + + /* print parsed model */ + seq_printf(m, "detected as\t: %d (%s)\n", mbmodel, mbname); + seq_printf(m, "pmac flags\t: %08x\n", mbflags); + seq_printf(m, "memory\t\t: %luMB\n", lmb_phys_mem_size() >> 20); + + /* Checks "l2cr-value" property in the registry */ + np = find_devices("cpus"); + if (np == 0) + np = find_type_devices("cpu"); + if (np != 0) { + unsigned int *l2cr = (unsigned int *) + get_property(np, "l2cr-value", NULL); + if (l2cr != 0) { + seq_printf(m, "l2cr override\t: 0x%x\n", *l2cr); + } + } + + /* Indicate newworld */ + seq_printf(m, "pmac-generation\t: NewWorld\n"); +} + + +void __init pmac_setup_arch(void) +{ + struct device_node *cpu; + int *fp; + unsigned long pvr; + + pvr = PVR_VER(mfspr(PVR)); + + /* Set loops_per_jiffy to a half-way reasonable value, + for use until calibrate_delay gets called. */ + cpu = find_type_devices("cpu"); + if (cpu != 0) { + fp = (int *) get_property(cpu, "clock-frequency", NULL); + if (fp != 0) { + if (pvr == 4 || pvr >= 8) + /* 604, G3, G4 etc. */ + loops_per_jiffy = *fp / HZ; + else + /* 601, 603, etc. */ + loops_per_jiffy = *fp / (2*HZ); + } else + loops_per_jiffy = 50000000 / HZ; + } + + /* We can NAP */ + powersave_nap = 1; + + /* Initialize the PMU */ + find_via_pmu(); + + /* Init NVRAM access */ + pmac_nvram_init(); + + /* Setup SMP callback */ +#ifdef CONFIG_SMP + pmac_setup_smp(); +#endif + /* Setup the PCI DMA to "direct" for now, until we have proper + * DART support and can deal with more than 2Gb of RAM + */ + pci_dma_init_direct(); + + /* Lookup PCI hosts */ + pmac_pci_init(); + +#ifdef CONFIG_DUMMY_CONSOLE + conswitchp = &dummy_con; +#endif +} + +extern char *bootpath; +extern char *bootdevice; +void *boot_host; +int boot_target; +int boot_part; +extern dev_t boot_dev; + +#ifdef CONFIG_SCSI +void __init note_scsi_host(struct device_node *node, void *host) +{ + int l; + char *p; + + l = strlen(node->full_name); + if (bootpath != NULL && bootdevice != NULL + && strncmp(node->full_name, bootdevice, l) == 0 + && (bootdevice[l] == '/' || bootdevice[l] == 0)) { + boot_host = host; + /* + * There's a bug in OF 1.0.5. (Why am I not surprised.) + * If you pass a path like scsi/sd@1:0 to canon, it returns + * something like /bandit@F2000000/gc@10/53c94@10000/sd@0,0 + * That is, the scsi target number doesn't get preserved. + * So we pick the target number out of bootpath and use that. + */ + p = strstr(bootpath, "/sd@"); + if (p != NULL) { + p += 4; + boot_target = simple_strtoul(p, NULL, 10); + p = strchr(p, ':'); + if (p != NULL) + boot_part = simple_strtoul(p + 1, NULL, 10); + } + } +} +#endif + +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) +static dev_t __init find_ide_boot(void) +{ + char *p; + int n; + dev_t __init pmac_find_ide_boot(char *bootdevice, int n); + + if (bootdevice == NULL) + return 0; + p = strrchr(bootdevice, '/'); + if (p == NULL) + return 0; + n = p - bootdevice; + + return pmac_find_ide_boot(bootdevice, n); +} +#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */ + +void __init find_boot_device(void) +{ +#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) + boot_dev = find_ide_boot(); +#endif +} + +static int initializing = 1; + +static int pmac_late_init(void) +{ + initializing = 0; + return 0; +} + +late_initcall(pmac_late_init); + +/* can't be __init - can be called whenever a disk is first accessed */ +void __pmac note_bootable_part(dev_t dev, int part, int goodness) +{ + static int found_boot = 0; + char *p; + + if (!initializing) + return; + if ((goodness <= current_root_goodness) && + ROOT_DEV != DEFAULT_ROOT_DEVICE) + return; + p = strstr(saved_command_line, "root="); + if (p != NULL && (p == saved_command_line || p[-1] == ' ')) + return; + + if (!found_boot) { + find_boot_device(); + found_boot = 1; + } + if (!boot_dev || dev == boot_dev) { + ROOT_DEV = dev + part; + boot_dev = 0; + current_root_goodness = goodness; + } +} + +void __pmac pmac_restart(char *cmd) +{ + pmu_restart(); +} + +void __pmac pmac_power_off(void) +{ + pmu_shutdown(); +} + +void __pmac pmac_halt(void) +{ + pmac_power_off(); +} + +#ifdef CONFIG_BOOTX_TEXT +static int dummy_getc_poll(void) +{ + return -1; +} + +static unsigned char dummy_getc(void) +{ + return 0; +} + +static void btext_putc(unsigned char c) +{ + btext_drawchar(c); +} +#endif /* CONFIG_BOOTX_TEXT */ + +/* + * Early initialization. + * Relocation is on but do not reference unbolted pages + * Also, device-tree hasn't been "finished", so don't muck with + * it too much + */ +void __init pmac_init_early(void) +{ + hpte_init_pSeries(); + +#ifdef CONFIG_BOOTX_TEXT + ppc_md.udbg_putc = btext_putc; + ppc_md.udbg_getc = dummy_getc; + ppc_md.udbg_getc_poll = dummy_getc_poll; +#endif /* CONFIG_BOOTX_TEXT */ +} + +extern void* OpenPIC_Addr; +extern void* OpenPIC2_Addr; +extern u_int OpenPIC_NumInitSenses; +extern u_char *OpenPIC_InitSenses; +extern void openpic_init(int main_pic, int offset, unsigned char* chrp_ack, + int programmer_switch_irq); +extern void openpic2_init(int offset); +extern int openpic_get_irq(struct pt_regs *regs); +extern int openpic2_get_irq(struct pt_regs *regs); + +static int pmac_cascade_irq = -1; + +static irqreturn_t pmac_u3_do_cascade(int cpl, void *dev_id, struct pt_regs *regs) +{ + int irq; + + for (;;) { + irq = openpic2_get_irq(regs); + if (irq == -1) + break; + ppc_irq_dispatch_handler(regs, irq); + } + return IRQ_HANDLED; +} + +static __init void pmac_init_IRQ(void) +{ + struct device_node *irqctrler = NULL; + struct device_node *irqctrler2 = NULL; + struct device_node *np = NULL; + + /* We first try to detect Apple's new Core99 chipset, since mac-io + * is quite different on those machines and contains an IBM MPIC2. + */ + while ((np = of_find_node_by_type(np, "open-pic")) != NULL) { + struct device_node *parent = of_get_parent(np); + if (parent && !strcmp(parent->name, "u3")) + irqctrler2 = of_node_get(np); + else + irqctrler = of_node_get(np); + of_node_put(parent); + } + if (irqctrler != NULL && irqctrler->n_addrs > 0) { + unsigned char senses[128]; + + printk(KERN_INFO "PowerMac using OpenPIC irq controller at 0x%08x\n", + (unsigned int)irqctrler->addrs[0].address); + + prom_get_irq_senses(senses, 0, 128); + OpenPIC_InitSenses = senses; + OpenPIC_NumInitSenses = 128; + OpenPIC_Addr = ioremap(irqctrler->addrs[0].address, + irqctrler->addrs[0].size); + openpic_init(1, 0, NULL, -1); + + if (irqctrler2 != NULL && irqctrler2->n_intrs > 0 && + irqctrler2->n_addrs > 0) { + printk(KERN_INFO "Slave OpenPIC at 0x%08x hooked on IRQ %d\n", + (u32)irqctrler2->addrs[0].address, + irqctrler2->intrs[0].line); + pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler2, 0, 0); + OpenPIC2_Addr = ioremap(irqctrler2->addrs[0].address, + irqctrler2->addrs[0].size); + prom_get_irq_senses(senses, 128, 128 + 128); + OpenPIC_InitSenses = senses; + OpenPIC_NumInitSenses = 128; + openpic2_init(128); + pmac_cascade_irq = irqctrler2->intrs[0].line; + } + } + of_node_put(irqctrler); + of_node_put(irqctrler2); +} + +/* We cannot do request_irq too early ... Right now, we get the + * cascade as a core_initcall, which should be fine for our needs + */ +static int __init pmac_irq_cascade_init(void) +{ + if (request_irq(pmac_cascade_irq, pmac_u3_do_cascade, 0, + "U3->K2 Cascade", NULL)) + printk(KERN_ERR "Unable to get OpenPIC IRQ for cascade\n"); + return 0; +} + +core_initcall(pmac_irq_cascade_init); + +void __init pmac_init(unsigned long r3, unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7) +{ + /* Probe motherboard chipset */ + pmac_feature_init(); + + /* Init SCC */ + if (strstr(cmd_line, "sccdbg")) { + sccdbg = 1; + udbg_init_scc(NULL); + } + + /* Fill up the machine description */ + ppc_md.setup_arch = pmac_setup_arch; + ppc_md.get_cpuinfo = pmac_show_cpuinfo; + + ppc_md.init_IRQ = pmac_init_IRQ; + ppc_md.get_irq = openpic_get_irq; + + ppc_md.pcibios_fixup = pmac_pcibios_fixup; + + ppc_md.restart = pmac_restart; + ppc_md.power_off = pmac_power_off; + ppc_md.halt = pmac_halt; + + ppc_md.get_boot_time = pmac_get_boot_time; + ppc_md.set_rtc_time = pmac_set_rtc_time; + ppc_md.get_rtc_time = pmac_get_rtc_time; + ppc_md.calibrate_decr = pmac_calibrate_decr; + + ppc_md.feature_call = pmac_do_feature_call; + + +#ifdef CONFIG_BOOTX_TEXT + ppc_md.progress = pmac_progress; +#endif /* CONFIG_BOOTX_TEXT */ + + if (ppc_md.progress) ppc_md.progress("pmac_init(): exit", 0); + +} + +#ifdef CONFIG_BOOTX_TEXT +void __init pmac_progress(char *s, unsigned short hex) +{ + if (sccdbg) { + udbg_puts(s); + udbg_putc('\n'); + } + else if (boot_text_mapped) { + btext_drawstring(s); + btext_drawchar('\n'); + } +} +#endif /* CONFIG_BOOTX_TEXT */ + +static int __init pmac_declare_of_platform_devices(void) +{ + struct device_node *np; + + np = find_devices("u3"); + if (np) { + for (np = np->child; np != NULL; np = np->sibling) + if (strncmp(np->name, "i2c", 3) == 0) { + of_platform_device_create(np, "u3-i2c"); + break; + } + } + + return 0; +} + +device_initcall(pmac_declare_of_platform_devices); diff -Nru a/arch/ppc64/kernel/pmac_smp.c b/arch/ppc64/kernel/pmac_smp.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_smp.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,174 @@ +/* + * SMP support for power macintosh. + * + * We support both the old "powersurge" SMP architecture + * and the current Core99 (G4 PowerMac) machines. + * + * Note that we don't support the very first rev. of + * Apple/DayStar 2 CPUs board, the one with the funky + * watchdog. Hopefully, none of these should be there except + * maybe internally to Apple. I should probably still add some + * code to detect this card though and disable SMP. --BenH. + * + * Support Macintosh G4 SMP by Troy Benjegerdes (hozer@drgw.net) + * and Ben Herrenschmidt . + * + * Support for DayStar quad CPU cards + * Copyright (C) XLR8, Inc. 1994-2000 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#define __KERNEL_SYSCALLS__ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "open_pic.h" + +extern void pmac_secondary_start_1(void); +extern void pmac_secondary_start_2(void); +extern void pmac_secondary_start_3(void); + +extern void smp_openpic_message_pass(int target, int msg, unsigned long data, int wait); + +extern struct smp_ops_t *smp_ops; + +static int __init smp_core99_probe(void) +{ + struct device_node *cpus; + int ncpus = 1; + + /* Maybe use systemconfiguration here ? */ + if (ppc_md.progress) ppc_md.progress("smp_core99_probe", 0x345); + cpus = find_type_devices("cpu"); + if (cpus == NULL) + return 0; + + while ((cpus = cpus->next) != NULL) + ++ncpus; + + printk(KERN_INFO "PowerMac SMP probe found %d cpus\n", ncpus); + + if (ncpus > 1) + openpic_request_IPIs(); + + return ncpus; +} + +static void __init smp_core99_kick_cpu(int nr) +{ + int save_vector; + unsigned long new_vector; + unsigned long flags; + volatile unsigned int *vector + = ((volatile unsigned int *)(KERNELBASE+0x100)); + + if (nr < 1 || nr > 3) + return; + if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu", 0x346); + + local_irq_save(flags); + local_irq_disable(); + + /* Save reset vector */ + save_vector = *vector; + + /* Setup fake reset vector that does + * b .pmac_secondary_start - KERNELBASE + */ + switch(nr) { + case 1: + new_vector = (unsigned long)pmac_secondary_start_1; + break; + case 2: + new_vector = (unsigned long)pmac_secondary_start_2; + break; + case 3: + new_vector = (unsigned long)pmac_secondary_start_3; + break; + } + *vector = 0x48000002 + (new_vector - KERNELBASE); + + /* flush data cache and inval instruction cache */ + flush_icache_range((unsigned long) vector, (unsigned long) vector + 4); + + /* Put some life in our friend */ + pmac_call_feature(PMAC_FTR_RESET_CPU, NULL, nr, 0); + paca[nr].xProcStart = 1; + + /* FIXME: We wait a bit for the CPU to take the exception, I should + * instead wait for the entry code to set something for me. Well, + * ideally, all that crap will be done in prom.c and the CPU left + * in a RAM-based wait loop like CHRP. + */ + mdelay(1); + + /* Restore our exception vector */ + *vector = save_vector; + flush_icache_range((unsigned long) vector, (unsigned long) vector + 4); + + local_irq_restore(flags); + if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu done", 0x347); +} + +static void __init smp_core99_setup_cpu(int cpu_nr) +{ + /* Setup openpic */ + do_openpic_setup_cpu(); + + if (cpu_nr == 0) { + extern void g5_phy_disable_cpu1(void); + + /* If we didn't start the second CPU, we must take + * it off the bus + */ + if (num_online_cpus() < 2) + g5_phy_disable_cpu1(); + if (ppc_md.progress) ppc_md.progress("core99_setup_cpu 0 done", 0x349); + } +} + +extern void smp_generic_give_timebase(void); +extern void smp_generic_take_timebase(void); + +struct smp_ops_t core99_smp_ops __pmacdata = { + .message_pass = smp_openpic_message_pass, + .probe = smp_core99_probe, + .kick_cpu = smp_core99_kick_cpu, + .setup_cpu = smp_core99_setup_cpu, + .give_timebase = smp_generic_give_timebase, + .take_timebase = smp_generic_take_timebase, +}; + +void __init pmac_setup_smp(void) +{ + smp_ops = &core99_smp_ops; +} diff -Nru a/arch/ppc64/kernel/pmac_time.c b/arch/ppc64/kernel/pmac_time.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/pmac_time.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,157 @@ +/* + * Support for periodic interrupts (100 per second) and for getting + * the current time from the RTC on Power Macintoshes. + * + * We use the decrementer register for our periodic interrupts. + * + * Paul Mackerras August 1996. + * Copyright (C) 1996 Paul Mackerras. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef DEBUG + +#ifdef DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif + +extern void setup_default_decr(void); + +/* Apparently the RTC stores seconds since 1 Jan 1904 */ +#define RTC_OFFSET 2082844800 + +/* + * Calibrate the decrementer frequency with the VIA timer 1. + */ +#define VIA_TIMER_FREQ_6 4700000 /* time 1 frequency * 6 */ + +extern struct timezone sys_tz; +extern void to_tm(int tim, struct rtc_time * tm); + +void __pmac pmac_get_rtc_time(struct rtc_time *tm) +{ + struct adb_request req; + unsigned int now; + + /* Get the time from the RTC */ + if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0) + return; + while (!req.complete) + pmu_poll(); + if (req.reply_len != 4) + printk(KERN_ERR "pmac_get_rtc_time: got %d byte reply\n", + req.reply_len); + now = (req.reply[0] << 24) + (req.reply[1] << 16) + + (req.reply[2] << 8) + req.reply[3]; + DBG("get: %u -> %u\n", (int)now, (int)(now - RTC_OFFSET)); + now -= RTC_OFFSET; + + to_tm(now, tm); + tm->tm_year -= 1900; + tm->tm_mon -= 1; + + DBG("-> tm_mday: %d, tm_mon: %d, tm_year: %d, %d:%02d:%02d\n", + tm->tm_mday, tm->tm_mon, tm->tm_year, + tm->tm_hour, tm->tm_min, tm->tm_sec); +} + +int __pmac pmac_set_rtc_time(struct rtc_time *tm) +{ + struct adb_request req; + unsigned int nowtime; + + DBG("set: tm_mday: %d, tm_mon: %d, tm_year: %d, %d:%02d:%02d\n", + tm->tm_mday, tm->tm_mon, tm->tm_year, + tm->tm_hour, tm->tm_min, tm->tm_sec); + + nowtime = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + DBG("-> %u -> %u\n", (int)nowtime, (int)(nowtime + RTC_OFFSET)); + nowtime += RTC_OFFSET; + + if (pmu_request(&req, NULL, 5, PMU_SET_RTC, + nowtime >> 24, nowtime >> 16, nowtime >> 8, nowtime) < 0) + return 0; + while (!req.complete) + pmu_poll(); + if (req.reply_len != 0) + printk(KERN_ERR "pmac_set_rtc_time: got %d byte reply\n", + req.reply_len); + return 1; +} + +void __init pmac_get_boot_time(struct rtc_time *tm) +{ + pmac_get_rtc_time(tm); + +#ifdef disabled__CONFIG_NVRAM + s32 delta = 0; + int dst; + + delta = ((s32)pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0x9)) << 16; + delta |= ((s32)pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0xa)) << 8; + delta |= pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0xb); + if (delta & 0x00800000UL) + delta |= 0xFF000000UL; + dst = ((pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0x8) & 0x80) != 0); + printk("GMT Delta read from XPRAM: %d minutes, DST: %s\n", delta/60, + dst ? "on" : "off"); +#endif +} + +/* + * Query the OF and get the decr frequency. + * This was taken from the pmac time_init() when merging the prep/pmac + * time functions. + */ +void __init pmac_calibrate_decr(void) +{ + struct device_node *cpu; + unsigned int freq, *fp; + struct div_result divres; + + /* + * The cpu node should have a timebase-frequency property + * to tell us the rate at which the decrementer counts. + */ + cpu = find_type_devices("cpu"); + if (cpu == 0) + panic("can't find cpu node in time_init"); + fp = (unsigned int *) get_property(cpu, "timebase-frequency", NULL); + if (fp == 0) + panic("can't get cpu timebase frequency"); + freq = *fp; + printk("time_init: decrementer frequency = %u.%.6u MHz\n", + freq/1000000, freq%1000000); + tb_ticks_per_jiffy = freq / HZ; + tb_ticks_per_sec = tb_ticks_per_jiffy * HZ; + tb_ticks_per_usec = freq / 1000000; + tb_to_us = mulhwu_scale_factor(freq, 1000000); + div128_by_32( 1024*1024, 0, tb_ticks_per_sec, &divres ); + tb_to_xs = divres.result_low; + + setup_default_decr(); +} + diff -Nru a/arch/ppc64/kernel/ppc_ksyms.c b/arch/ppc64/kernel/ppc_ksyms.c --- a/arch/ppc64/kernel/ppc_ksyms.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/ppc_ksyms.c Tue Feb 17 20:00:06 2004 @@ -93,6 +93,8 @@ EXPORT_SYMBOL(__strncpy_from_user); EXPORT_SYMBOL(__strnlen_user); +EXPORT_SYMBOL(clear_user_page); + #ifdef CONFIG_MSCHUNKS EXPORT_SYMBOL(msChunks); #endif @@ -204,25 +206,6 @@ EXPORT_SYMBOL(irq_desc); EXPORT_SYMBOL(get_wchan); EXPORT_SYMBOL(console_drivers); -#ifdef CONFIG_XMON -EXPORT_SYMBOL(xmon); -#endif - -#ifdef CONFIG_DEBUG_KERNEL -extern void (*debugger)(struct pt_regs *regs); -extern int (*debugger_bpt)(struct pt_regs *regs); -extern int (*debugger_sstep)(struct pt_regs *regs); -extern int (*debugger_iabr_match)(struct pt_regs *regs); -extern int (*debugger_dabr_match)(struct pt_regs *regs); -extern void (*debugger_fault_handler)(struct pt_regs *regs); - -EXPORT_SYMBOL(debugger); -EXPORT_SYMBOL(debugger_bpt); -EXPORT_SYMBOL(debugger_sstep); -EXPORT_SYMBOL(debugger_iabr_match); -EXPORT_SYMBOL(debugger_dabr_match); -EXPORT_SYMBOL(debugger_fault_handler); -#endif EXPORT_SYMBOL(tb_ticks_per_usec); EXPORT_SYMBOL(paca); diff -Nru a/arch/ppc64/kernel/proc_ppc64.c b/arch/ppc64/kernel/proc_ppc64.c --- a/arch/ppc64/kernel/proc_ppc64.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/proc_ppc64.c Tue Feb 17 20:00:07 2004 @@ -268,12 +268,10 @@ static int do_remove_node(char *buf) { struct device_node *node; - int rv = 0; + int rv = -ENODEV; if ((node = of_find_node_by_path(buf))) - of_remove_node(node); - else - rv = -ENODEV; + rv = of_remove_node(node); of_node_put(node); return rv; diff -Nru a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c --- a/arch/ppc64/kernel/process.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/process.c Tue Feb 17 20:00:07 2004 @@ -194,8 +194,8 @@ regs->msr&MSR_DR ? 1 : 0); if (regs->trap == 0x300 || regs->trap == 0x380 || regs->trap == 0x600) printk("DAR: %016lx, DSISR: %016lx\n", regs->dar, regs->dsisr); - printk("TASK = %p[%d] '%s' ", - current, current->pid, current->comm); + printk("TASK: %p[%d] '%s' THREAD: %p", + current, current->pid, current->comm, current->thread_info); #ifdef CONFIG_SMP printk(" CPU: %d", smp_processor_id()); @@ -217,6 +217,8 @@ */ printk("NIP [%016lx] ", regs->nip); print_symbol("%s\n", regs->nip); + printk("LR [%016lx] ", regs->link); + print_symbol("%s\n", regs->link); show_stack(current, (unsigned long *)regs->gpr[1]); } diff -Nru a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c --- a/arch/ppc64/kernel/prom.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/prom.c Tue Feb 17 20:00:07 2004 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include #include #include +#include #include #include "open_pic.h" @@ -115,24 +117,15 @@ static interpret_func interpret_pci_props; static interpret_func interpret_isa_props; static interpret_func interpret_root_props; +static interpret_func interpret_dbdma_props; +static interpret_func interpret_macio_props; #ifndef FB_MAX /* avoid pulling in all of the fb stuff */ #define FB_MAX 8 #endif - -struct prom_t prom = { - 0, /* entry */ - 0, /* chosen */ - 0, /* cpu */ - 0, /* stdout */ - 0, /* disp_node */ - {0,0,0,{0},NULL}, /* args */ - 0, /* version */ - 32, /* encode_phys_size */ - 0 /* bi_rec pointer */ -}; - +/* prom structure */ +struct prom_t prom; char *prom_display_paths[FB_MAX] __initdata = { 0, }; unsigned int prom_num_displays = 0; @@ -140,7 +133,6 @@ extern struct rtas_t rtas; extern unsigned long klimit; -extern unsigned long embedded_sysmap_end; extern struct lmb lmb; #define MAX_PHB 16 * 3 // 16 Towers * 3 PHBs/tower @@ -189,6 +181,8 @@ extern unsigned long reloc_offset(void); extern void enter_prom(void *dummy,...); +extern void copy_and_flush(unsigned long dest, unsigned long src, + unsigned long size, unsigned long offset); extern char cmd_line[512]; /* XXX */ unsigned long dev_tree_size; @@ -341,9 +335,14 @@ RELOC("d-cache-size"), &size, sizeof(size)); - call_prom(RELOC("getprop"), 4, 1, node, - RELOC("d-cache-line-size"), - &lsize, sizeof(lsize)); + if (_systemcfg->platform == PLATFORM_POWERMAC) + call_prom(RELOC("getprop"), 4, 1, node, + RELOC("d-cache-block-size"), + &lsize, sizeof(lsize)); + else + call_prom(RELOC("getprop"), 4, 1, node, + RELOC("d-cache-line-size"), + &lsize, sizeof(lsize)); _systemcfg->dCacheL1Size = size; _systemcfg->dCacheL1LineSize = lsize; @@ -354,9 +353,14 @@ RELOC("i-cache-size"), &size, sizeof(size)); - call_prom(RELOC("getprop"), 4, 1, node, - RELOC("i-cache-line-size"), - &lsize, sizeof(lsize)); + if (_systemcfg->platform == PLATFORM_POWERMAC) + call_prom(RELOC("getprop"), 4, 1, node, + RELOC("i-cache-block-size"), + &lsize, sizeof(lsize)); + else + call_prom(RELOC("getprop"), 4, 1, node, + RELOC("i-cache-line-size"), + &lsize, sizeof(lsize)); _systemcfg->iCacheL1Size = size; _systemcfg->iCacheL1LineSize = lsize; @@ -377,6 +381,8 @@ struct isa_reg_property reg; union pci_range ranges; + if (_systemcfg->platform == PLATFORM_POWERMAC) + continue; type[0] = 0; call_prom(RELOC("getprop"), 4, 1, node, RELOC("ibm,aix-loc"), type, sizeof(type)); @@ -407,24 +413,27 @@ } } - _naca->interrupt_controller = IC_INVALID; - for (node = 0; prom_next_node(&node); ) { - type[0] = 0; - call_prom(RELOC("getprop"), 4, 1, node, RELOC("name"), - type, sizeof(type)); - if (strcmp(type, RELOC("interrupt-controller"))) { - continue; - } - call_prom(RELOC("getprop"), 4, 1, node, RELOC("compatible"), - type, sizeof(type)); - if (strstr(type, RELOC("open-pic"))) { - _naca->interrupt_controller = IC_OPEN_PIC; - } else if (strstr(type, RELOC("ppc-xicp"))) { - _naca->interrupt_controller = IC_PPC_XIC; - } else { - prom_print(RELOC("prom: failed to recognize interrupt-controller\n")); + if (_systemcfg->platform == PLATFORM_POWERMAC) + _naca->interrupt_controller = IC_OPEN_PIC; + else { + _naca->interrupt_controller = IC_INVALID; + for (node = 0; prom_next_node(&node); ) { + type[0] = 0; + call_prom(RELOC("getprop"), 4, 1, node, RELOC("name"), + type, sizeof(type)); + if (strcmp(type, RELOC("interrupt-controller"))) + continue; + call_prom(RELOC("getprop"), 4, 1, node, RELOC("compatible"), + type, sizeof(type)); + if (strstr(type, RELOC("open-pic"))) + _naca->interrupt_controller = IC_OPEN_PIC; + else if (strstr(type, RELOC("ppc-xicp"))) + _naca->interrupt_controller = IC_PPC_XIC; + else + prom_print(RELOC("prom: failed to recognize" + " interrupt-controller\n")); + break; } - break; } if (_naca->interrupt_controller == IC_INVALID) { @@ -438,7 +447,8 @@ _systemcfg->physicalMemorySize = lmb_phys_mem_size(); - if (_systemcfg->platform == PLATFORM_PSERIES) { + if (_systemcfg->platform == PLATFORM_PSERIES || + _systemcfg->platform == PLATFORM_POWERMAC) { unsigned long rnd_mem_size, pteg_count; /* round mem_size up to next power of 2 */ @@ -517,12 +527,19 @@ char type[64]; unsigned long i, offset = reloc_offset(); struct prom_t *_prom = PTRRELOC(&prom); + struct systemcfg *_systemcfg = RELOC(systemcfg); union lmb_reg_property reg; unsigned long lmb_base, lmb_size; unsigned long num_regs, bytes_per_reg = (_prom->encode_phys_size*2)/8; lmb_init(); + /* XXX Quick HACK. Proper fix is to drop those structures and properly use + * #address-cells. PowerMac has #size-cell set to 1 and #address-cells to 2 + */ + if (_systemcfg->platform == PLATFORM_POWERMAC) + bytes_per_reg = 12; + for (node = 0; prom_next_node(&node); ) { type[0] = 0; call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"), @@ -535,7 +552,15 @@ ®, sizeof(reg)) / bytes_per_reg; for (i=0; i < num_regs ;i++) { - if (_prom->encode_phys_size == 32) { + if (_systemcfg->platform == PLATFORM_POWERMAC) { + lmb_base = ((unsigned long)reg.addrPM[i].address_hi) << 32; + lmb_base |= (unsigned long)reg.addrPM[i].address_lo; + lmb_size = reg.addrPM[i].size; + if (lmb_base > 0x80000000ull) { + prom_print(RELOC("Skipping memory above 2Gb for now, not yet supported\n")); + continue; + } + } else if (_prom->encode_phys_size == 32) { lmb_base = reg.addr32[i].address; lmb_size = reg.addr32[i].size; } else { @@ -920,19 +945,47 @@ struct paca_struct *_xPaca = PTRRELOC(&paca[0]); struct prom_t *_prom = PTRRELOC(&prom); + /* On pmac, we just fill out the various global bitmasks and + * arrays indicating our CPUs are here, they are actually started + * later on from pmac_smp + */ + if (_systemcfg->platform == PLATFORM_POWERMAC) { + for (node = 0; prom_next_node(&node); ) { + type[0] = 0; + call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"), + type, sizeof(type)); + if (strcmp(type, RELOC("cpu")) != 0) + continue; + reg = -1; + call_prom(RELOC("getprop"), 4, 1, node, RELOC("reg"), + ®, sizeof(reg)); + _xPaca[cpuid].xHwProcNum = reg; + +#ifdef CONFIG_SMP + cpu_set(cpuid, RELOC(cpu_available_map)); + cpu_set(cpuid, RELOC(cpu_possible_map)); + cpu_set(cpuid, RELOC(cpu_present_at_boot)); + if (reg == 0) + cpu_set(cpuid, RELOC(cpu_online_map)); +#endif /* CONFIG_SMP */ + cpuid++; + } + return; + } + /* Initially, we must have one active CPU. */ _systemcfg->processorCount = 1; #ifdef DEBUG_PROM prom_print(RELOC("prom_hold_cpus: start...\n")); prom_print(RELOC(" 1) spinloop = 0x")); - prom_print_hex(spinloop); + prom_print_hex((unsigned long)spinloop); prom_print_nl(); prom_print(RELOC(" 1) *spinloop = 0x")); prom_print_hex(*spinloop); prom_print_nl(); prom_print(RELOC(" 1) acknowledge = 0x")); - prom_print_hex(acknowledge); + prom_print_hex((unsigned long)acknowledge); prom_print_nl(); prom_print(RELOC(" 1) *acknowledge = 0x")); prom_print_hex(*acknowledge); @@ -1210,6 +1263,144 @@ _naca->smt_state = my_smt_enabled; } + +#ifdef CONFIG_BOOTX_TEXT + +/* This function will enable the early boot text when doing OF booting. This + * way, xmon output should work too + */ +static void __init setup_disp_fake_bi(ihandle dp) +{ + int width = 640, height = 480, depth = 8, pitch; + unsigned address; + struct pci_reg_property addrs[8]; + int i, naddrs; + char name[64]; + unsigned long offset = reloc_offset(); + char *getprop = RELOC("getprop"); + + prom_print(RELOC("Initializing fake screen: ")); + + memset(name, 0, sizeof(name)); + call_prom(getprop, 4, 1, dp, RELOC("name"), name, sizeof(name)); + name[sizeof(name)-1] = 0; + prom_print(name); + prom_print(RELOC("\n")); + call_prom(getprop, 4, 1, dp, RELOC("width"), &width, sizeof(width)); + call_prom(getprop, 4, 1, dp, RELOC("height"), &height, sizeof(height)); + call_prom(getprop, 4, 1, dp, RELOC("depth"), &depth, sizeof(depth)); + pitch = width * ((depth + 7) / 8); + call_prom(getprop, 4, 1, dp, RELOC("linebytes"), + &pitch, sizeof(pitch)); + if (pitch == 1) + pitch = 0x1000; /* for strange IBM display */ + address = 0; + + prom_print(RELOC("width ")); + prom_print_hex(width); + prom_print(RELOC(" height ")); + prom_print_hex(height); + prom_print(RELOC(" depth ")); + prom_print_hex(depth); + prom_print(RELOC(" linebytes ")); + prom_print_hex(pitch); + prom_print(RELOC("\n")); + + + call_prom(getprop, 4, 1, dp, RELOC("address"), + &address, sizeof(address)); + if (address == 0) { + /* look for an assigned address with a size of >= 1MB */ + naddrs = (int) call_prom(getprop, 4, 1, dp, + RELOC("assigned-addresses"), + addrs, sizeof(addrs)); + naddrs /= sizeof(struct pci_reg_property); + for (i = 0; i < naddrs; ++i) { + if (addrs[i].size_lo >= (1 << 20)) { + address = addrs[i].addr.a_lo; + /* use the BE aperture if possible */ + if (addrs[i].size_lo >= (16 << 20)) + address += (8 << 20); + break; + } + } + if (address == 0) { + prom_print(RELOC("Failed to get address of frame buffer\n")); + return; + } + } + btext_setup_display(width, height, depth, pitch, address); + prom_print(RELOC("Addr of fb: ")); + prom_print_hex(address); + prom_print_nl(); + RELOC(boot_text_mapped) = 0; +} +#endif /* CONFIG_BOOTX_TEXT */ + +static void __init prom_init_client_services(unsigned long pp) +{ + unsigned long offset = reloc_offset(); + struct prom_t *_prom = PTRRELOC(&prom); + + /* Get a handle to the prom entry point before anything else */ + _prom->entry = pp; + + /* Init default value for phys size */ + _prom->encode_phys_size = 32; + + /* get a handle for the stdout device */ + _prom->chosen = (ihandle)call_prom(RELOC("finddevice"), 1, 1, + RELOC("/chosen")); + if ((long)_prom->chosen <= 0) + prom_panic(RELOC("cannot find chosen")); /* msg won't be printed :( */ + + /* get device tree root */ + _prom->root = (ihandle)call_prom(RELOC("finddevice"), 1, 1, RELOC("/")); + if ((long)_prom->root <= 0) + prom_panic(RELOC("cannot find device tree root")); /* msg won't be printed :( */ +} + +static void __init prom_init_stdout(void) +{ + unsigned long offset = reloc_offset(); + struct prom_t *_prom = PTRRELOC(&prom); + u32 val; + + if ((long)call_prom(RELOC("getprop"), 4, 1, _prom->chosen, + RELOC("stdout"), &val, + sizeof(val)) <= 0) + prom_panic(RELOC("cannot find stdout")); + + _prom->stdout = (ihandle)(unsigned long)val; +} + +static int __init prom_find_machine_type(void) +{ + unsigned long offset = reloc_offset(); + struct prom_t *_prom = PTRRELOC(&prom); + char compat[256]; + int len, i = 0; + + len = (int)(long)call_prom(RELOC("getprop"), 4, 1, _prom->root, + RELOC("compatible"), + compat, sizeof(compat)-1); + if (len > 0) { + compat[len] = 0; + while (i < len) { + char *p = &compat[i]; + int sl = strlen(p); + if (sl == 0) + break; + if (strstr(p, RELOC("Power Macintosh")) || + strstr(p, RELOC("MacRISC4"))) + return PLATFORM_POWERMAC; + i += sl + 1; + } + } + /* Default to pSeries */ + return PLATFORM_PSERIES; +} + /* * We enter here early on, when the Open Firmware prom is still * handling exceptions and the MMU hash table for us. @@ -1220,7 +1411,7 @@ unsigned long r6, unsigned long r7) { unsigned long mem; - ihandle prom_root, prom_cpu; + ihandle prom_cpu; phandle cpu_pkg; unsigned long offset = reloc_offset(); long l; @@ -1239,36 +1430,27 @@ RELOC(systemcfg) = _systemcfg = (struct systemcfg *)(SYSTEMCFG_VIRT_ADDR - offset); RELOC(naca) = (struct naca_struct *)(NACA_VIRT_ADDR - offset); - /* Default machine type. */ - _systemcfg->platform = PLATFORM_PSERIES; + /* Init interface to Open Firmware and pickup bi-recs */ + prom_init_client_services(pp); -#if 0 - /* Reset klimit to take into account the embedded system map */ - if (RELOC(embedded_sysmap_end)) - RELOC(klimit) = __va(PAGE_ALIGN(RELOC(embedded_sysmap_end))); -#endif + /* Init prom stdout device */ + prom_init_stdout(); - /* Get a handle to the prom entry point before anything else */ - _prom->entry = pp; + /* check out if we have bi_recs */ _prom->bi_recs = prom_bi_rec_verify((struct bi_record *)r6); - if ( _prom->bi_recs != NULL ) { - RELOC(klimit) = PTRUNRELOC((unsigned long)_prom->bi_recs + _prom->bi_recs->data[1]); - } - - /* First get a handle for the stdout device */ - _prom->chosen = (ihandle)call_prom(RELOC("finddevice"), 1, 1, - RELOC("/chosen")); + if ( _prom->bi_recs != NULL ) + RELOC(klimit) = PTRUNRELOC((unsigned long)_prom->bi_recs + + _prom->bi_recs->data[1]); - if ((long)_prom->chosen <= 0) - prom_panic(RELOC("cannot find chosen")); /* msg won't be printed :( */ + /* Default machine type. */ + _systemcfg->platform = prom_find_machine_type(); - if ((long)call_prom(RELOC("getprop"), 4, 1, _prom->chosen, - RELOC("stdout"), &getprop_rval, - sizeof(getprop_rval)) <= 0) - prom_panic(RELOC("cannot find stdout")); - _prom->stdout = (ihandle)(unsigned long)getprop_rval; + /* On pSeries, copy the CPU hold code */ + if (_systemcfg->platform == PLATFORM_PSERIES) + copy_and_flush(0, KERNELBASE - offset, 0x100, 0); + /* Start storing things at klimit */ mem = RELOC(klimit) - offset; /* Get the full OF pathname of the stdout device */ @@ -1279,13 +1461,10 @@ mem += strlen(p) + 1; getprop_rval = 1; - prom_root = (ihandle)call_prom(RELOC("finddevice"), 1, 1, RELOC("/")); - if (prom_root != (ihandle)-1) { - call_prom(RELOC("getprop"), 4, 1, - prom_root, RELOC("#size-cells"), - &getprop_rval, sizeof(getprop_rval)); - } - _prom->encode_phys_size = (getprop_rval==1) ? 32 : 64; + call_prom(RELOC("getprop"), 4, 1, + _prom->root, RELOC("#size-cells"), + &getprop_rval, sizeof(getprop_rval)); + _prom->encode_phys_size = (getprop_rval == 1) ? 32 : 64; /* Determine which cpu is actually running right _now_ */ if ((long)call_prom(RELOC("getprop"), 4, 1, _prom->chosen, @@ -1324,13 +1503,24 @@ mem = DOUBLEWORD_ALIGN(mem + strlen(d) + 1); } + RELOC(cmd_line[0]) = 0; + if ((long)_prom->chosen > 0) { + call_prom(RELOC("getprop"), 4, 1, _prom->chosen, + RELOC("bootargs"), p, sizeof(cmd_line)); + if (p != NULL && p[0] != 0) + strncpy(RELOC(cmd_line), p, sizeof(cmd_line)); + } + RELOC(cmd_line[sizeof(cmd_line) - 1]) = 0; + + mem = prom_initialize_lmb(mem); mem = prom_bi_rec_reserve(mem); mem = check_display(mem); - prom_instantiate_rtas(); + if (_systemcfg->platform != PLATFORM_POWERMAC) + prom_instantiate_rtas(); /* Initialize some system info into the Naca early... */ mem = prom_initialize_naca(mem); @@ -1341,7 +1531,7 @@ * following, regardless of whether we have an SMP * kernel or not. */ - prom_hold_cpus(mem); + prom_hold_cpus(mem); #ifdef DEBUG_PROM prom_print(RELOC("copying OF device tree...\n")); @@ -1355,6 +1545,13 @@ if (_systemcfg->platform == PLATFORM_PSERIES) prom_initialize_tce_table(); +#ifdef CONFIG_BOOTX_TEXT + if(_prom->disp_node) { + prom_print(RELOC("Setting up bi display...\n")); + setup_disp_fake_bi(_prom->disp_node); + } +#endif /* CONFIG_BOOTX_TEXT */ + prom_print(RELOC("Calling quiesce ...\n")); call_prom(RELOC("quiesce"), 0, 0); phys = KERNELBASE - offset; @@ -1471,6 +1668,10 @@ RELOC(prom_display_paths[i]) = PTRUNRELOC(path); if (RELOC(prom_num_displays) >= FB_MAX) break; + /* XXX Temporary workaround: only open the first display so we don't + * lose debug output + */ + break; } return DOUBLEWORD_ALIGN(mem); } @@ -1684,9 +1885,9 @@ np->type = get_property(np, "device_type", 0); /* get the device addresses and interrupts */ - if (ifunc != NULL) { - mem_start = ifunc(np, mem_start, naddrc, nsizec); - } + if (ifunc != NULL) + mem_start = ifunc(np, mem_start, naddrc, nsizec); + mem_start = finish_node_interrupts(np, mem_start); /* Look for #address-cells and #size-cells properties. */ @@ -1700,7 +1901,6 @@ /* the f50 sets the name to 'display' and 'compatible' to what we * expect for the name -- Cort */ - ifunc = NULL; if (!strcmp(np->name, "display")) np->name = get_property(np, "compatible", 0); @@ -1710,8 +1910,19 @@ ifunc = NULL; else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci")) ifunc = interpret_pci_props; + else if (!strcmp(np->type, "dbdma")) + ifunc = interpret_dbdma_props; + else if (!strcmp(np->type, "mac-io") || ifunc == interpret_macio_props) + ifunc = interpret_macio_props; else if (!strcmp(np->type, "isa")) ifunc = interpret_isa_props; + else if (!strcmp(np->name, "uni-n") || !strcmp(np->name, "u3")) + ifunc = interpret_root_props; + else if (!((ifunc == interpret_dbdma_props + || ifunc == interpret_macio_props) + && (!strcmp(np->type, "escc") + || !strcmp(np->type, "media-bay")))) + ifunc = NULL; for (child = np->child; child != NULL; child = child->sibling) mem_start = finish_node(child, mem_start, ifunc, @@ -1888,6 +2099,12 @@ if (n <= 0) continue; np->intrs[i].line = openpic_to_irq(virt_irq_create_mapping(irq[0])); + /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ + if (systemcfg->platform == PLATFORM_POWERMAC && ic && ic->parent) { + char *name = get_property(ic->parent, "name", NULL); + if (name && !strcmp(name, "u3")) + np->intrs[i].line += 128; + } if (n > 1) np->intrs[i].sense = irq[1]; if (n > 2) { @@ -1960,6 +2177,78 @@ } static unsigned long __init +interpret_dbdma_props(struct device_node *np, unsigned long mem_start, + int naddrc, int nsizec) +{ + struct reg_property32 *rp; + struct address_range *adr; + unsigned long base_address; + int i, l; + struct device_node *db; + + base_address = 0; + for (db = np->parent; db != NULL; db = db->parent) { + if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) { + base_address = db->addrs[0].address; + break; + } + } + + rp = (struct reg_property32 *) get_property(np, "reg", &l); + if (rp != 0 && l >= sizeof(struct reg_property32)) { + i = 0; + adr = (struct address_range *) mem_start; + while ((l -= sizeof(struct reg_property32)) >= 0) { + adr[i].space = 2; + adr[i].address = rp[i].address + base_address; + adr[i].size = rp[i].size; + ++i; + } + np->addrs = adr; + np->n_addrs = i; + mem_start += i * sizeof(struct address_range); + } + + return mem_start; +} + +static unsigned long __init +interpret_macio_props(struct device_node *np, unsigned long mem_start, + int naddrc, int nsizec) +{ + struct reg_property32 *rp; + struct address_range *adr; + unsigned long base_address; + int i, l; + struct device_node *db; + + base_address = 0; + for (db = np->parent; db != NULL; db = db->parent) { + if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) { + base_address = db->addrs[0].address; + break; + } + } + + rp = (struct reg_property32 *) get_property(np, "reg", &l); + if (rp != 0 && l >= sizeof(struct reg_property32)) { + i = 0; + adr = (struct address_range *) mem_start; + while ((l -= sizeof(struct reg_property32)) >= 0) { + adr[i].space = 2; + adr[i].address = rp[i].address + base_address; + adr[i].size = rp[i].size; + ++i; + } + np->addrs = adr; + np->n_addrs = i; + mem_start += i * sizeof(struct address_range); + } + + return mem_start; +} + +static unsigned long __init interpret_isa_props(struct device_node *np, unsigned long mem_start, int naddrc, int nsizec) { @@ -2207,6 +2496,7 @@ read_unlock(&devtree_lock); return np; } +EXPORT_SYMBOL(of_find_node_by_name); /** * of_find_node_by_type - Find a node by its "device_type" property @@ -2270,6 +2560,7 @@ read_unlock(&devtree_lock); return np; } +EXPORT_SYMBOL(of_find_compatible_node); /** * of_find_node_by_path - Find a node matching a full OF path @@ -2290,6 +2581,7 @@ read_unlock(&devtree_lock); return np; } +EXPORT_SYMBOL(of_find_node_by_path); /** * of_find_all_nodes - Get next node in global list @@ -2313,6 +2605,7 @@ read_unlock(&devtree_lock); return np; } +EXPORT_SYMBOL(of_find_all_nodes); /** * of_get_parent - Get a node's parent if any @@ -2333,6 +2626,7 @@ read_unlock(&devtree_lock); return np; } +EXPORT_SYMBOL(of_get_parent); /** * of_get_next_child - Iterate a node childs @@ -2357,6 +2651,7 @@ read_unlock(&devtree_lock); return next; } +EXPORT_SYMBOL(of_get_next_child); /** * of_node_get - Increment refcount of a node @@ -2373,6 +2668,7 @@ } return NULL; } +EXPORT_SYMBOL(of_node_get); /** * of_node_put - Decrement refcount of a node @@ -2396,6 +2692,7 @@ else atomic_dec(&node->_users); } +EXPORT_SYMBOL(of_node_put); /** * of_node_cleanup - release a dynamically allocated node @@ -2507,29 +2804,48 @@ /* * Remove an OF device node from the system. + * Caller should have already "gotten" np. */ int of_remove_node(struct device_node *np) { struct device_node *parent, *child; parent = of_get_parent(np); - child = of_get_next_child(np, NULL); - if (child && !child->child && !child->sibling) { - /* For now, we will allow removal of a - * node with one and only one child, so - * that we can support removing a slot with - * an IOA in it. More general support for - * subtree removal to be implemented later, if - * necessary. - */ - of_remove_node(child); - } - else if (child) { - of_node_put(child); - of_node_put(parent); + + if (!parent) return -EINVAL; + + /* Make sure we are not recursively removing + * more than one level of nodes. We need to + * allow this so we can remove a slot containing + * an IOA. + */ + for (child = of_get_next_child(np, NULL); + child != NULL; + child = of_get_next_child(np, child)) { + struct device_node *grandchild; + + if ((grandchild = of_get_next_child(child, NULL))) { + /* Too deep */ + of_node_put(grandchild); + of_node_put(child); + return -EBUSY; + } + } + + /* Now that we're reasonably sure that we won't + * overflow our stack, remove any children of np. + */ + for (child = of_get_next_child(np, NULL); + child != NULL; + child = of_get_next_child(np, child)) { + int rc; + + if ((rc = of_remove_node(child))) { + of_node_put(child); + return rc; + } } - of_node_put(child); write_lock(&devtree_lock); OF_MARK_STALE(np); @@ -2545,8 +2861,8 @@ prev->allnext = np->allnext; } - if (np->parent->child == np) - np->parent->child = np->sibling; + if (parent->child == np) + parent->child = np->sibling; else { struct device_node *prevsib; for (prevsib = np->parent->child; @@ -2633,6 +2949,12 @@ err = -ENODEV; goto out; } + + /* We don't support that function on PowerMac, at least + * not yet + */ + if (systemcfg->platform == PLATFORM_POWERMAC) + return -ENODEV; /* do the work of interpret_pci_props */ if (parent->type && !strcmp(parent->type, "pci")) { diff -Nru a/arch/ppc64/kernel/rtas-proc.c b/arch/ppc64/kernel/rtas-proc.c --- a/arch/ppc64/kernel/rtas-proc.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/rtas-proc.c Tue Feb 17 20:00:06 2004 @@ -285,13 +285,13 @@ size_t count, loff_t *ppos) { char stkbuf[40]; /* its small, its on stack */ - int n; + int n, sn; if (power_on_time == 0) n = snprintf(stkbuf, 40, "Power on time not set\n"); else n = snprintf(stkbuf, 40, "%lu\n", power_on_time); - int sn = strlen (stkbuf) +1; + sn = strlen (stkbuf) +1; if (*ppos >= sn) return 0; if (n > sn - *ppos) @@ -331,18 +331,19 @@ static ssize_t ppc_rtas_progress_read(struct file * file, char * buf, size_t count, loff_t *ppos) { - int n = 0; + int sn, n = 0; + char *tmpbuf; if (progress_led == NULL) return 0; - char * tmpbuf = kmalloc (MAX_LINELENGTH, GFP_KERNEL); + tmpbuf = kmalloc (MAX_LINELENGTH, GFP_KERNEL); if (!tmpbuf) { printk(KERN_ERR "error: kmalloc failed\n"); return -ENOMEM; } n = sprintf (tmpbuf, "%s\n", progress_led); - int sn = strlen (tmpbuf) +1; + sn = strlen (tmpbuf) +1; if (*ppos >= sn) { kfree (tmpbuf); return 0; @@ -398,15 +399,14 @@ { unsigned int year, mon, day, hour, min, sec; unsigned long *ret = kmalloc(4*8, GFP_KERNEL); - int n, error; + int n, sn, error; + char stkbuf[40]; /* its small, its on stack */ error = rtas_call(rtas_token("get-time-of-day"), 0, 8, ret); year = ret[0]; mon = ret[1]; day = ret[2]; hour = ret[3]; min = ret[4]; sec = ret[5]; - char stkbuf[40]; /* its small, its on stack */ - if (error != 0){ printk(KERN_WARNING "error: reading the clock returned: %s\n", ppc_rtas_process_error(error)); @@ -416,7 +416,7 @@ } kfree(ret); - int sn = strlen (stkbuf) +1; + sn = strlen (stkbuf) +1; if (*ppos >= sn) return 0; if (n > sn - *ppos) @@ -860,11 +860,12 @@ static ssize_t ppc_rtas_tone_freq_read(struct file * file, char * buf, size_t count, loff_t *ppos) { - int n; + int n, sn; char stkbuf[40]; /* its small, its on stack */ + n = snprintf(stkbuf, 40, "%lu\n", rtas_tone_frequency); - int sn = strlen (stkbuf) +1; + sn = strlen (stkbuf) +1; if (*ppos >= sn) return 0; if (n > sn - *ppos) @@ -913,11 +914,12 @@ static ssize_t ppc_rtas_tone_volume_read(struct file * file, char * buf, size_t count, loff_t *ppos) { - int n; + int n, sn; char stkbuf[40]; /* its small, its on stack */ + n = snprintf(stkbuf, 40, "%lu\n", rtas_tone_volume); - int sn = strlen (stkbuf) +1; + sn = strlen (stkbuf) +1; if (*ppos >= sn) return 0; if (n > sn - *ppos) diff -Nru a/arch/ppc64/kernel/rtasd.c b/arch/ppc64/kernel/rtasd.c --- a/arch/ppc64/kernel/rtasd.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/rtasd.c Tue Feb 17 20:00:06 2004 @@ -347,6 +347,8 @@ int event_scan = rtas_token("event-scan"); int rc; + daemonize("rtasd"); + if (event_scan == RTAS_UNKNOWN_SERVICE || get_eventscan_parms() == -1) goto error; @@ -359,15 +361,9 @@ /* We can use rtas_log_buf now */ no_more_logging = 0; - DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2); - - daemonize("rtasd"); + printk(KERN_ERR "RTAS daemon started\n"); -#if 0 - /* Rusty unreal time task */ - current->policy = SCHED_FIFO; - current->nice = sys_sched_get_priority_max(SCHED_FIFO) + 1; -#endif + DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2); /* See if we have any error stored in NVRAM */ memset(logdata, 0, rtas_error_log_max); @@ -423,7 +419,9 @@ goto repeat; error_vfree: - vfree(rtas_log_buf); + if (rtas_log_buf) + vfree(rtas_log_buf); + rtas_log_buf = NULL; error: /* Should delete proc entries */ return -EINVAL; @@ -450,8 +448,6 @@ if (kernel_thread(rtasd, 0, CLONE_FS) < 0) printk(KERN_ERR "Failed to start RTAS daemon\n"); - - printk(KERN_ERR "RTAS daemon started\n"); /* Make room for the sequence number */ rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int); diff -Nru a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c --- a/arch/ppc64/kernel/setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/setup.c Tue Feb 17 20:00:06 2004 @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include extern unsigned long klimit; /* extern void *stab; */ @@ -54,10 +57,17 @@ unsigned long r6, unsigned long r7); +extern void pmac_init(unsigned long r3, + unsigned long r4, + unsigned long r5, + unsigned long r6, + unsigned long r7); + extern void iSeries_init( void ); extern void iSeries_init_early( void ); extern void pSeries_init_early( void ); extern void pSeriesLP_init_early(void); +extern void pmac_init_early(void); extern void mm_init_ppc64( void ); extern void pseries_secondary_smp_init(unsigned long); extern int idle_setup(void); @@ -68,9 +78,7 @@ unsigned long decr_overclock_set = 0; unsigned long decr_overclock_proc0_set = 0; -#ifdef CONFIG_XMON -extern void xmon_map_scc(void); -#endif +int powersave_nap; char saved_command_line[256]; unsigned char aux_device_present; @@ -148,15 +156,11 @@ unsigned long r6, unsigned long r7) { #ifdef CONFIG_PPC_PSERIES - unsigned int ret, i; + unsigned int ret, i; #endif #ifdef CONFIG_XMON_DEFAULT - debugger = xmon; - debugger_bpt = xmon_bpt; - debugger_sstep = xmon_sstep; - debugger_iabr_match = xmon_iabr_match; - debugger_dabr_match = xmon_dabr_match; + xmon_init(); #endif #ifdef CONFIG_PPC_ISERIES @@ -188,8 +192,24 @@ #endif parse_bootinfo(); break; +#endif /* CONFIG_PPC_PSERIES */ +#ifdef CONFIG_PPC_PMAC + case PLATFORM_POWERMAC: + pmac_init_early(); +#ifdef CONFIG_BLK_DEV_INITRD + initrd_start = initrd_end = 0; #endif + parse_bootinfo(); +#endif /* CONFIG_PPC_PMAC */ + } + +#ifdef CONFIG_BOOTX_TEXT + map_boot_text(); + if (systemcfg->platform == PLATFORM_POWERMAC) { + early_console_initialized = 1; + register_console(&udbg_console); } +#endif /* CONFIG_BOOTX_TEXT */ #ifdef CONFIG_PPC_PSERIES if (systemcfg->platform & PLATFORM_PSERIES) { @@ -206,14 +226,23 @@ rtas_call(rtas_token("start-cpu"), 3, 1, (void *)&ret, get_hard_smp_processor_id(i), - *((unsigned long *)pseries_secondary_smp_init), i); + *((unsigned long *)pseries_secondary_smp_init), + i); cpu_set(i, cpu_possible_map); systemcfg->processorCount++; } } -#endif } -#endif +#endif /* CONFIG_SMP */ +#endif /* CONFIG_PPC_PSERIES */ + +#ifdef CONFIG_PPC_PMAC + if (systemcfg->platform == PLATFORM_POWERMAC) { + finish_device_tree(); + pmac_init(r3, r4, r5, r6, r7); + } +#endif /* CONFIG_PPC_PMAC */ + /* Finish initializing the hash table (do the dynamic * patching for the fast-path hashtable.S code) */ @@ -226,7 +255,7 @@ printk("naca->pftSize = 0x%lx\n", naca->pftSize); printk("naca->debug_switch = 0x%lx\n", naca->debug_switch); printk("naca->interrupt_controller = 0x%ld\n", naca->interrupt_controller); - printk("systemcfg = 0x%p\n", systemcfg); + printk("systemcfg = 0x%p\n", systemcfg); printk("systemcfg->processorCount = 0x%lx\n", systemcfg->processorCount); printk("systemcfg->physicalMemorySize = 0x%lx\n", systemcfg->physicalMemorySize); printk("systemcfg->dCacheL1LineSize = 0x%x\n", systemcfg->dCacheL1LineSize); @@ -261,6 +290,8 @@ void machine_restart(char *cmd) { + if (ppc_md.nvram_sync) + ppc_md.nvram_sync(); ppc_md.restart(cmd); } @@ -268,6 +299,8 @@ void machine_power_off(void) { + if (ppc_md.nvram_sync) + ppc_md.nvram_sync(); ppc_md.power_off(); } @@ -275,6 +308,8 @@ void machine_halt(void) { + if (ppc_md.nvram_sync) + ppc_md.nvram_sync(); ppc_md.halt(); } @@ -283,6 +318,10 @@ unsigned long ppc_proc_freq; unsigned long ppc_tb_freq; +#ifdef CONFIG_SMP +DEFINE_PER_CPU(unsigned int, pvr); +#endif + static int show_cpuinfo(struct seq_file *m, void *v) { unsigned long cpu_id = (unsigned long)v - 1; @@ -302,7 +341,7 @@ return 0; #ifdef CONFIG_SMP - pvr = paca[cpu_id].pvr; + pvr = per_cpu(pvr, cpu_id); #else pvr = _get_PVR(); #endif @@ -555,12 +594,14 @@ calibrate_delay = ppc64_calibrate_delay; ppc64_boot_msg(0x12, "Setup Arch"); + #ifdef CONFIG_XMON - xmon_map_scc(); - if (strstr(cmd_line, "xmon")) - xmon(0); + if (strstr(cmd_line, "xmon")) { + /* ensure xmon is enabled */ + xmon_init(); + debugger(0); + } #endif /* CONFIG_XMON */ - /* * Set cache line size based on type of cpu as a default. diff -Nru a/arch/ppc64/kernel/smp-tbsync.c b/arch/ppc64/kernel/smp-tbsync.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ppc64/kernel/smp-tbsync.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,179 @@ +/* + * Smp timebase synchronization for ppc. + * + * Copyright (C) 2003 Samuel Rydh (samuel@ibrium.se) + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUM_ITER 300 + +enum { + kExit=0, kSetAndTest, kTest +}; + +static struct { + volatile long tb; + volatile long mark; + volatile int cmd; + volatile int handshake; + int filler[3]; + + volatile int ack; + int filler2[7]; + + volatile int race_result; +} *tbsync; + +static volatile int running; + +static void __devinit +enter_contest( long mark, long add ) +{ + while( (long)(mftb() - mark) < 0 ) + tbsync->race_result = add; +} + +void __devinit +smp_generic_take_timebase( void ) +{ + int cmd; + long tb; + + local_irq_disable(); + while( !running ) + ; + rmb(); + + for( ;; ) { + tbsync->ack = 1; + while( !tbsync->handshake ) + ; + rmb(); + + cmd = tbsync->cmd; + tb = tbsync->tb; + tbsync->ack = 0; + if( cmd == kExit ) + return; + + if( cmd == kSetAndTest ) { + while( tbsync->handshake ) + ; + asm volatile ("mttbl %0" :: "r" (tb & 0xfffffffful) ); + asm volatile ("mttbu %0" :: "r" (tb >> 32) ); + } else { + while( tbsync->handshake ) + ; + } + enter_contest( tbsync->mark, -1 ); + } + local_irq_enable(); +} + +static int __devinit +start_contest( int cmd, long offset, long num ) +{ + int i, score=0; + long tb, mark; + + tbsync->cmd = cmd; + + local_irq_disable(); + for( i=-3; itb = tb + offset; + tbsync->mark = mark = tb + 400; + + wmb(); + + tbsync->handshake = 1; + while( tbsync->ack ) + ; + + while( (long)(mftb() - tb) <= 0 ) + ; + tbsync->handshake = 0; + enter_contest( mark, 1 ); + + while( !tbsync->ack ) + ; + + if ((tbsync->tb ^ (long)mftb()) & 0x8000000000000000ul) + continue; + if( i++ > 0 ) + score += tbsync->race_result; + } + local_irq_enable(); + return score; +} + +void __devinit +smp_generic_give_timebase( void ) +{ + int i, score, score2, old, min=0, max=5000, offset=1000; + + printk("Synchronizing timebase\n"); + + /* if this fails then this kernel won't work anyway... */ + tbsync = kmalloc( sizeof(*tbsync), GFP_KERNEL ); + memset( tbsync, 0, sizeof(*tbsync) ); + mb(); + running = 1; + + while( !tbsync->ack ) + ; + + printk("Got ack\n"); + + /* binary search */ + for( old=-1 ; old != offset ; offset=(min+max)/2 ) { + score = start_contest( kSetAndTest, offset, NUM_ITER ); + + printk("score %d, offset %d\n", score, offset ); + + if( score > 0 ) + max = offset; + else + min = offset; + old = offset; + } + score = start_contest( kSetAndTest, min, NUM_ITER ); + score2 = start_contest( kSetAndTest, max, NUM_ITER ); + + printk( "Min %d (score %d), Max %d (score %d)\n", min, score, max, score2 ); + score = abs( score ); + score2 = abs( score2 ); + offset = (score < score2) ? min : max; + + /* guard against inaccurate mttb */ + for( i=0; i<10; i++ ) { + start_contest( kSetAndTest, offset, NUM_ITER/10 ); + + if( (score2=start_contest(kTest, offset, NUM_ITER)) < 0 ) + score2 = -score2; + if( score2 <= score || score2 < 20 ) + break; + } + printk("Final offset: %d (%d/%d)\n", offset, score2, NUM_ITER ); + + /* exiting */ + tbsync->cmd = kExit; + wmb(); + tbsync->handshake = 1; + while( tbsync->ack ) + ; + tbsync->handshake = 0; + kfree( tbsync ); + tbsync = NULL; + running = 0; +} diff -Nru a/arch/ppc64/kernel/smp.c b/arch/ppc64/kernel/smp.c --- a/arch/ppc64/kernel/smp.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/smp.c Tue Feb 17 20:00:07 2004 @@ -49,6 +49,7 @@ #include #include #include +#include int smp_threads_ready; unsigned long cache_decay_ticks; @@ -62,7 +63,7 @@ EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_possible_map); -static struct smp_ops_t *smp_ops; +struct smp_ops_t *smp_ops; static volatile unsigned int cpu_callin_map[NR_CPUS]; @@ -76,13 +77,8 @@ #define smp_message_pass(t,m,d,w) smp_ops->message_pass((t),(m),(d),(w)) -static inline void set_tb(unsigned int upper, unsigned int lower) -{ - mttbl(0); - mttbu(upper); - mttbl(lower); -} - +/* Low level assembly function used to backup CPU 0 state */ +extern void __save_cpu_setup(void); #ifdef CONFIG_PPC_ISERIES static unsigned long iSeries_smp_message[NR_CPUS]; @@ -182,21 +178,23 @@ { } +static struct smp_ops_t iSeries_smp_ops = { + .message_pass = smp_iSeries_message_pass, + .probe = smp_iSeries_probe, + .kick_cpu = smp_iSeries_kick_cpu, + .setup_cpu = smp_iSeries_setup_cpu, +}; + /* This is called very early. */ void __init smp_init_iSeries(void) { - smp_ops = &ppc_md.smp_ops; - smp_ops->message_pass = smp_iSeries_message_pass; - smp_ops->probe = smp_iSeries_probe; - smp_ops->kick_cpu = smp_iSeries_kick_cpu; - smp_ops->setup_cpu = smp_iSeries_setup_cpu; + smp_ops = &iSeries_smp_ops; systemcfg->processorCount = smp_iSeries_numProcs(); } #endif #ifdef CONFIG_PPC_PSERIES -static void -smp_openpic_message_pass(int target, int msg, unsigned long data, int wait) +void smp_openpic_message_pass(int target, int msg, unsigned long data, int wait) { /* make sure we're sending something that translates to an IPI */ if ( msg > 0x3 ){ @@ -240,8 +238,7 @@ do_openpic_setup_cpu(); } -static void -smp_kick_cpu(int nr) +static void smp_pSeries_kick_cpu(int nr) { /* Verify we have a Paca for processor nr */ if ( ( nr <= 0 ) || @@ -290,8 +287,7 @@ register_vpa(flags, cpu, __pa((unsigned long)&(paca[cpu].xLpPaca))); } -static void -smp_xics_message_pass(int target, int msg, unsigned long data, int wait) +static void smp_xics_message_pass(int target, int msg, unsigned long data, int wait) { int i; @@ -358,27 +354,34 @@ spin_unlock(&timebase_lock); } +static struct smp_ops_t pSeries_openpic_smp_ops = { + .message_pass = smp_openpic_message_pass, + .probe = smp_openpic_probe, + .kick_cpu = smp_pSeries_kick_cpu, + .setup_cpu = smp_openpic_setup_cpu, +}; + +static struct smp_ops_t pSeries_xics_smp_ops = { + .message_pass = smp_xics_message_pass, + .probe = smp_xics_probe, + .kick_cpu = smp_pSeries_kick_cpu, + .setup_cpu = smp_xics_setup_cpu, +}; + /* This is called very early */ void __init smp_init_pSeries(void) { - smp_ops = &ppc_md.smp_ops; - if (naca->interrupt_controller == IC_OPEN_PIC) { - smp_ops->message_pass = smp_openpic_message_pass; - smp_ops->probe = smp_openpic_probe; - smp_ops->setup_cpu = smp_openpic_setup_cpu; - } else { - smp_ops->message_pass = smp_xics_message_pass; - smp_ops->probe = smp_xics_probe; - smp_ops->setup_cpu = smp_xics_setup_cpu; - } + if (naca->interrupt_controller == IC_OPEN_PIC) + smp_ops = &pSeries_openpic_smp_ops; + else + smp_ops = &pSeries_xics_smp_ops; + /* Non-lpar has additional take/give timebase */ if (systemcfg->platform == PLATFORM_PSERIES) { smp_ops->give_timebase = pSeries_give_timebase; smp_ops->take_timebase = pSeries_take_timebase; } - - smp_ops->kick_cpu = smp_kick_cpu; } #endif @@ -392,7 +395,7 @@ void smp_message_recv(int msg, struct pt_regs *regs) { - switch( msg ) { + switch(msg) { case PPC_MSG_CALL_FUNCTION: smp_call_function_interrupt(); break; @@ -405,11 +408,11 @@ /* spare */ break; #endif -#ifdef CONFIG_XMON - case PPC_MSG_XMON_BREAK: - xmon(regs); +#ifdef CONFIG_DEBUGGER + case PPC_MSG_DEBUGGER_BREAK: + debugger(regs); break; -#endif /* CONFIG_XMON */ +#endif default: printk("SMP %d: smp_message_recv(): unknown msg %d\n", smp_processor_id(), msg); @@ -422,12 +425,12 @@ smp_message_pass(cpu, PPC_MSG_RESCHEDULE, 0, 0); } -#ifdef CONFIG_XMON -void smp_send_xmon_break(int cpu) +#ifdef CONFIG_DEBUGGER +void smp_send_debugger_break(int cpu) { - smp_message_pass(cpu, PPC_MSG_XMON_BREAK, 0, 0); + smp_message_pass(cpu, PPC_MSG_DEBUGGER_BREAK, 0, 0); } -#endif /* CONFIG_XMON */ +#endif static void stop_this_cpu(void *dummy) { @@ -505,10 +508,7 @@ printk("smp_call_function on cpu %d: other cpus not " "responding (%d)\n", smp_processor_id(), atomic_read(&data.started)); -#ifdef CONFIG_DEBUG_KERNEL - if (debugger) - debugger(0); -#endif + debugger(0); goto out; } } @@ -523,10 +523,7 @@ smp_processor_id(), atomic_read(&data.finished), atomic_read(&data.started)); -#ifdef CONFIG_DEBUG_KERNEL - if (debugger) - debugger(0); -#endif + debugger(0); goto out; } } @@ -575,9 +572,11 @@ struct thread_info *current_set[NR_CPUS]; +DECLARE_PER_CPU(unsigned int, pvr); + static void __devinit smp_store_cpu_info(int id) { - paca[id].pvr = _get_PVR(); + per_cpu(pvr, id) = _get_PVR(); } void __init smp_prepare_cpus(unsigned int max_cpus) @@ -611,6 +610,10 @@ #endif max_cpus = smp_ops->probe(); + + /* Backup CPU 0 state if necessary */ + __save_cpu_setup(); + smp_space_timers(max_cpus); } diff -Nru a/arch/ppc64/kernel/stab.c b/arch/ppc64/kernel/stab.c --- a/arch/ppc64/kernel/stab.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/stab.c Tue Feb 17 20:00:07 2004 @@ -141,8 +141,7 @@ return (global_entry | (castout_entry & 0x7)); } -static inline void __ste_allocate(unsigned long esid, unsigned long vsid, - mm_context_t context) +static inline void __ste_allocate(unsigned long esid, unsigned long vsid) { unsigned char stab_entry; unsigned long *offset; @@ -185,7 +184,7 @@ } esid = GET_ESID(ea); - __ste_allocate(esid, vsid, context); + __ste_allocate(esid, vsid); /* Order update */ asm volatile("sync":::"memory"); @@ -215,7 +214,7 @@ if (!IS_VALID_EA(pc) || (REGION_ID(pc) >= KERNEL_REGION_ID)) return; vsid = get_vsid(mm->context, pc); - __ste_allocate(pc_esid, vsid, mm->context); + __ste_allocate(pc_esid, vsid); if (pc_esid == stack_esid) return; @@ -223,7 +222,7 @@ if (!IS_VALID_EA(stack) || (REGION_ID(stack) >= KERNEL_REGION_ID)) return; vsid = get_vsid(mm->context, stack); - __ste_allocate(stack_esid, vsid, mm->context); + __ste_allocate(stack_esid, vsid); if (pc_esid == unmapped_base_esid || stack_esid == unmapped_base_esid) return; @@ -232,7 +231,7 @@ (REGION_ID(unmapped_base) >= KERNEL_REGION_ID)) return; vsid = get_vsid(mm->context, unmapped_base); - __ste_allocate(unmapped_base_esid, vsid, mm->context); + __ste_allocate(unmapped_base_esid, vsid); /* Order update */ asm volatile("sync" : : : "memory"); diff -Nru a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c --- a/arch/ppc64/kernel/sys_ppc32.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/sys_ppc32.c Tue Feb 17 20:00:07 2004 @@ -76,6 +76,8 @@ #include #include +#include "pci.h" + typedef ssize_t (*io_fn_t)(struct file *, char *, size_t, loff_t *); typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *); @@ -2210,7 +2212,7 @@ extern asmlinkage int sys_pciconfig_write(unsigned long bus, unsigned long dfn, unsigned long off, - unsigned long len, unsigned char *buf); + unsigned long len, unsigned char *buf); asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubuf) { @@ -2220,6 +2222,64 @@ (unsigned long) len, (unsigned char *)AA(ubuf)); } + +#define IOBASE_BRIDGE_NUMBER 0 +#define IOBASE_MEMORY 1 +#define IOBASE_IO 2 +#define IOBASE_ISA_IO 3 +#define IOBASE_ISA_MEM 4 + +asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) +{ + struct pci_controller* hose; + struct list_head *ln; + struct pci_bus *bus = NULL; + struct device_node *hose_node; + + /* Argh ! Please forgive me for that hack, but that's the + * simplest way to get existing XFree to not lockup on some + * G5 machines... So when something asks for bus 0 io base + * (bus 0 is HT root), we return the AGP one instead. + */ +#ifdef CONFIG_PPC_PMAC + if (systemcfg->platform == PLATFORM_POWERMAC && + machine_is_compatible("MacRISC4")) + if (in_bus == 0) + in_bus = 0xf0; +#endif /* CONFIG_PPC_PMAC */ + + /* That syscall isn't quite compatible with PCI domains, but it's + * used on pre-domains setup. We return the first match + */ + + for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) { + bus = pci_bus_b(ln); + if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate)) + break; + bus = NULL; + } + if (bus == NULL || bus->sysdata == NULL) + return -ENODEV; + + hose_node = (struct device_node *)bus->sysdata; + hose = hose_node->phb; + + switch (which) { + case IOBASE_BRIDGE_NUMBER: + return (long)hose->first_busno; + case IOBASE_MEMORY: + return (long)hose->pci_mem_offset; + case IOBASE_IO: + return (long)hose->io_base_phys; + case IOBASE_ISA_IO: + return (long)isa_io_base; + case IOBASE_ISA_MEM: + return -EINVAL; + } + + return -EOPNOTSUPP; +} + extern asmlinkage int sys_newuname(struct new_utsname * name); diff -Nru a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c --- a/arch/ppc64/kernel/time.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/kernel/time.c Tue Feb 17 20:00:08 2004 @@ -267,7 +267,7 @@ int next_dec; unsigned long cur_tb; struct paca_struct *lpaca = get_paca(); - unsigned long cpu = lpaca->xPacaIndex; + unsigned long cpu = smp_processor_id(); irq_enter(); diff -Nru a/arch/ppc64/kernel/traps.c b/arch/ppc64/kernel/traps.c --- a/arch/ppc64/kernel/traps.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/traps.c Tue Feb 17 20:00:07 2004 @@ -45,13 +45,20 @@ extern int fwnmi_active; #endif -#ifdef CONFIG_DEBUG_KERNEL -void (*debugger)(struct pt_regs *regs); -int (*debugger_bpt)(struct pt_regs *regs); -int (*debugger_sstep)(struct pt_regs *regs); -int (*debugger_iabr_match)(struct pt_regs *regs); -int (*debugger_dabr_match)(struct pt_regs *regs); -void (*debugger_fault_handler)(struct pt_regs *regs); +#ifdef CONFIG_DEBUGGER +int (*__debugger)(struct pt_regs *regs); +int (*__debugger_bpt)(struct pt_regs *regs); +int (*__debugger_sstep)(struct pt_regs *regs); +int (*__debugger_iabr_match)(struct pt_regs *regs); +int (*__debugger_dabr_match)(struct pt_regs *regs); +int (*__debugger_fault_handler)(struct pt_regs *regs); + +EXPORT_SYMBOL(__debugger); +EXPORT_SYMBOL(__debugger_bpt); +EXPORT_SYMBOL(__debugger_sstep); +EXPORT_SYMBOL(__debugger_iabr_match); +EXPORT_SYMBOL(__debugger_dabr_match); +EXPORT_SYMBOL(__debugger_fault_handler); #endif /* @@ -88,10 +95,8 @@ _exception(int signr, siginfo_t *info, struct pt_regs *regs) { if (!user_mode(regs)) { -#ifdef CONFIG_DEBUG_KERNEL - if (debugger) - debugger(regs); -#endif + if (debugger(regs)) + return; die("Exception in kernel mode\n", regs, signr); } @@ -146,12 +151,8 @@ } #endif -#ifdef CONFIG_DEBUG_KERNEL - if (debugger) - debugger(regs); - else -#endif - panic("System Reset"); + if (!debugger(regs)) + die("System Reset", regs, 0); /* Must die if the interrupt is not recoverable */ if (!(regs->msr & MSR_RI)) @@ -228,23 +229,12 @@ } #endif -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_fault_handler) { - debugger_fault_handler(regs); + if (debugger_fault_handler(regs)) return; - } - if (debugger) - debugger(regs); -#endif - console_verbose(); - spin_lock_irq(&die_lock); - bust_spinlocks(1); - printk("Machine check in kernel mode.\n"); - printk("Caused by (from SRR1=%lx): ", regs->msr); - show_regs(regs); - bust_spinlocks(0); - spin_unlock_irq(&die_lock); - panic("Unrecoverable Machine Check"); + if (debugger(regs)) + return; + + die("Machine check in kernel mode", regs, 0); } void @@ -267,10 +257,8 @@ { siginfo_t info; -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_iabr_match && debugger_iabr_match(regs)) + if (debugger_iabr_match(regs)) return; -#endif info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_BRKPT; @@ -372,6 +360,9 @@ { siginfo_t info; + if (debugger_fault_handler(regs)) + return; + if (regs->msr & 0x100000) { /* IEEE FP exception */ @@ -387,10 +378,9 @@ } else if (regs->msr & 0x20000) { /* trap exception */ -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_bpt && debugger_bpt(regs)) + if (debugger_bpt(regs)) return; -#endif + if (check_bug_trap(regs)) { regs->nip += 4; return; @@ -414,17 +404,13 @@ void KernelFPUnavailableException(struct pt_regs *regs) { - printk("Illegal floating point used in kernel (task=0x%p, " - "pc=0x%016lx, trap=0x%lx)\n", current, regs->nip, regs->trap); - panic("Unrecoverable FP Unavailable Exception in Kernel"); + die("Unrecoverable FP Unavailable Exception in Kernel", regs, 0); } void KernelAltivecUnavailableException(struct pt_regs *regs) { - printk("Illegal VMX/Altivec used in kernel (task=0x%p, " - "pc=0x%016lx, trap=0x%lx)\n", current, regs->nip, regs->trap); - panic("Unrecoverable VMX/Altivec Unavailable Exception in Kernel"); + die("Unrecoverable VMX/Altivec Unavailable Exception in Kernel", regs, 0); } void @@ -434,10 +420,9 @@ regs->msr &= ~MSR_SE; /* Turn off 'trace' bit */ -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_sstep && debugger_sstep(regs)) + if (debugger_sstep(regs)) return; -#endif + info.si_signo = SIGTRAP; info.si_errno = 0; info.si_code = TRAP_TRACE; diff -Nru a/arch/ppc64/kernel/udbg.c b/arch/ppc64/kernel/udbg.c --- a/arch/ppc64/kernel/udbg.c Tue Feb 17 20:00:05 2004 +++ b/arch/ppc64/kernel/udbg.c Tue Feb 17 20:00:05 2004 @@ -22,6 +22,9 @@ #include #include #include +#include +#include +#include struct NS16550 { /* this struct must be packed */ @@ -69,6 +72,61 @@ } } +#ifdef CONFIG_PPC_PMAC + +#define SCC_TXRDY 4 +#define SCC_RXRDY 1 + +static volatile u8 *sccc, *sccd; + +static unsigned char scc_inittab[] = { + 13, 0, /* set baud rate divisor */ + 12, 0, + 14, 1, /* baud rate gen enable, src=rtxc */ + 11, 0x50, /* clocks = br gen */ + 5, 0xea, /* tx 8 bits, assert DTR & RTS */ + 4, 0x46, /* x16 clock, 1 stop */ + 3, 0xc1, /* rx enable, 8 bits */ +}; + +void +udbg_init_scc(struct device_node *np) +{ + unsigned long addr; + int i, x; + + if (np == NULL) + np = of_find_node_by_name(NULL, "escc"); + if (np == NULL) + return; + + /* Lock-enable the SCC channel */ + pmac_call_feature(PMAC_FTR_SCC_ENABLE, np, PMAC_SCC_ASYNC | PMAC_SCC_FLAG_XMON, 1); + + /* Setup for 57600 8N1 */ + addr = np->addrs[0].address + 0x20; + sccc = (volatile u8 *) ioremap(addr & PAGE_MASK, PAGE_SIZE) ; + sccc += addr & ~PAGE_MASK; + sccd = sccc + 0x10; + + for (i = 20000; i != 0; --i) + x = *sccc; eieio(); + *sccc = 9; eieio(); /* reset A or B side */ + *sccc = 0xc0; eieio(); + for (i = 0; i < sizeof(scc_inittab); ++i) { + *sccc = scc_inittab[i]; + eieio(); + } + + ppc_md.udbg_putc = udbg_putc; + ppc_md.udbg_getc = udbg_getc; + ppc_md.udbg_getc_poll = udbg_getc_poll; + + udbg_puts("Hello World !\n"); +} + +#endif /* CONFIG_PPC_PMAC */ + void udbg_putc(unsigned char c) { @@ -83,6 +141,16 @@ udbg_comport->thr = '\r'; eieio(); } } +#ifdef CONFIG_PPC_PMAC + else if (sccc) { + while ((*sccc & SCC_TXRDY) == 0) + eieio(); + *sccd = c; + eieio(); + if (c == '\n') + udbg_putc('\r'); + } +#endif /* CONFIG_PPC_PMAC */ } int udbg_getc_poll(void) @@ -93,6 +161,15 @@ else return -1; } +#ifdef CONFIG_PPC_PMAC + else if (sccc) { + eieio(); + if ((*sccc & SCC_RXRDY) != 0) + return *sccd; + else + return -1; + } +#endif /* CONFIG_PPC_PMAC */ return -1; } @@ -104,6 +181,14 @@ /* wait for char */; return udbg_comport->rbr; } +#ifdef CONFIG_PPC_PMAC + else if (sccc) { + eieio(); + while ((*sccc & SCC_RXRDY) == 0) + eieio(); + return *sccd; + } +#endif /* CONFIG_PPC_PMAC */ return 0; } @@ -149,6 +234,8 @@ do { c = ppc_md.udbg_getc(); } while (c == 0x11 || c == 0x13); + if (c == 0) + break; *p++ = c; } return i; diff -Nru a/arch/ppc64/kernel/vio.c b/arch/ppc64/kernel/vio.c --- a/arch/ppc64/kernel/vio.c Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/kernel/vio.c Tue Feb 17 20:00:06 2004 @@ -4,6 +4,7 @@ * Copyright (c) 2003 IBM Corp. * Dave Engebretsen engebret@us.ibm.com * Santiago Leon santil@us.ibm.com + * Hollis Blanchard * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -16,14 +17,17 @@ #include #include #include +#include +#include #include #include #include #include #include #include -#include -#include "open_pic.h" /* temporary, until we merge large irq support */ +#include "open_pic.h" + +#define DBGENTER() pr_debug("%s entered\n", __FUNCTION__) extern struct TceTable *build_tce_table(struct TceTable *tbl); @@ -32,83 +36,74 @@ extern void tce_free(struct TceTable *tbl, dma_addr_t dma_addr, unsigned order, unsigned num_pages); +static int vio_num_address_cells; +static struct vio_dev *vio_bus_device; /* fake "parent" device */ -static struct vio_bus vio_bus; -static LIST_HEAD(registered_vio_drivers); -int vio_num_address_cells; -EXPORT_SYMBOL(vio_num_address_cells); - -/* TODO: - * really fit into driver model (see include/linux/device.h) - * locking around list accesses - */ +/* convert from struct device to struct vio_dev and pass to driver. + * dev->driver has already been set by generic code because vio_bus_match + * succeeded. */ +static int vio_bus_probe(struct device *dev) +{ + struct vio_dev *viodev = to_vio_dev(dev); + struct vio_driver *viodrv = to_vio_driver(dev->driver); + const struct vio_device_id *id; + int error = -ENODEV; + + DBGENTER(); + + if (!viodrv->probe) + return error; + + id = vio_match_device(viodrv->id_table, viodev); + if (id) { + error = viodrv->probe(viodev, id); + } + + return error; +} + +/* convert from struct device to struct vio_dev and pass to driver. */ +static int vio_bus_remove(struct device *dev) +{ + struct vio_dev *viodev = to_vio_dev(dev); + struct vio_driver *viodrv = to_vio_driver(dev->driver); + + DBGENTER(); + + if (viodrv->remove) { + return viodrv->remove(viodev); + } + + /* driver can't remove */ + return 1; +} /** * vio_register_driver: - Register a new vio driver * @drv: The vio_driver structure to be registered. - * - * Adds the driver structure to the list of registered drivers - * Returns the number of vio devices which were claimed by the driver - * during registration. The driver remains registered even if the - * return value is zero. */ -int vio_register_driver(struct vio_driver *drv) +int vio_register_driver(struct vio_driver *viodrv) { - int count = 0; - struct vio_dev *dev; - - printk(KERN_DEBUG "%s: driver %s/%s registering\n", __FUNCTION__, - drv->id_table[0].type, drv->id_table[0].type); - - /* find matching devices not already claimed by other drivers and pass - * them to probe() */ - list_for_each_entry(dev, &vio_bus.devices, devices_list) { - const struct vio_device_id* id; - - if (dev->driver) - continue; /* this device is already owned */ - - id = vio_match_device(drv->id_table, dev); - if (drv && id) { - if (0 == drv->probe(dev, id)) { - printk(KERN_DEBUG " took device %p\n", dev); - dev->driver = drv; - count++; - } - } - } + printk(KERN_DEBUG "%s: driver %s registering\n", __FUNCTION__, + viodrv->name); - list_add_tail(&drv->node, ®istered_vio_drivers); + /* fill in 'struct driver' fields */ + viodrv->driver.name = viodrv->name; + viodrv->driver.bus = &vio_bus_type; + viodrv->driver.probe = vio_bus_probe; + viodrv->driver.remove = vio_bus_remove; - return count; + return driver_register(&viodrv->driver); } EXPORT_SYMBOL(vio_register_driver); /** * vio_unregister_driver - Remove registration of vio driver. * @driver: The vio_driver struct to be removed form registration - * - * Searches for devices that are assigned to the driver and calls - * driver->remove() for each one. Removes the driver from the list - * of registered drivers. Returns the number of devices that were - * assigned to that driver. */ -int vio_unregister_driver(struct vio_driver *driver) +void vio_unregister_driver(struct vio_driver *viodrv) { - struct vio_dev *dev; - int devices_found = 0; - - list_for_each_entry(dev, &vio_bus.devices, devices_list) { - if (dev->driver == driver) { - driver->remove(dev); - dev->driver = NULL; - devices_found++; - } - } - - list_del(&driver->node); - - return devices_found; + driver_unregister(&viodrv->driver); } EXPORT_SYMBOL(vio_unregister_driver); @@ -121,9 +116,11 @@ * system is in its list of supported devices. Returns the matching * vio_device_id structure or NULL if there is no match. */ -const struct vio_device_id * -vio_match_device(const struct vio_device_id *ids, const struct vio_dev *dev) +const struct vio_device_id * vio_match_device(const struct vio_device_id *ids, + const struct vio_dev *dev) { + DBGENTER(); + while (ids->type) { if ((strncmp(dev->archdata->type, ids->type, strlen(ids->type)) == 0) && device_is_compatible((struct device_node*)dev->archdata, ids->compat)) @@ -136,18 +133,33 @@ /** * vio_bus_init: - Initialize the virtual IO bus */ -int __init -vio_bus_init(void) +static int __init vio_bus_init(void) { - struct device_node *node_vroot, *node_vdev; + struct device_node *node_vroot, *of_node; + int err; - INIT_LIST_HEAD(&vio_bus.devices); + err = bus_register(&vio_bus_type); + if (err) { + printk(KERN_ERR "failed to register VIO bus\n"); + return err; + } + + /* the fake parent of all vio devices, just to give us a nice directory */ + vio_bus_device = kmalloc(sizeof(struct vio_dev), GFP_KERNEL); + if (!vio_bus_device) { + return 1; + } + memset(vio_bus_device, 0, sizeof(struct vio_dev)); + strcpy(vio_bus_device->dev.bus_id, "vdevice"); + + err = device_register(&vio_bus_device->dev); + if (err) { + printk(KERN_WARNING "%s: device_register returned %i\n", __FUNCTION__, + err); + kfree(vio_bus_device); + return err; + } - /* - * Create device node entries for each virtual device - * identified in the device tree. - * Functionally takes the place of pci_scan_bus - */ node_vroot = find_devices("vdevice"); if ((node_vroot == NULL) || (node_vroot->child == NULL)) { printk(KERN_INFO "VIO: missing or empty /vdevice node; no virtual IO" @@ -157,12 +169,16 @@ vio_num_address_cells = prom_n_addr_cells(node_vroot->child); - for (node_vdev = node_vroot->child; - node_vdev != NULL; - node_vdev = node_vdev->sibling) { - printk(KERN_DEBUG "%s: processing %p\n", __FUNCTION__, node_vdev); + /* + * Create struct vio_devices for each virtual device in the device tree. + * Drivers will associate with them later. + */ + for (of_node = node_vroot->child; + of_node != NULL; + of_node = of_node->sibling) { + printk(KERN_DEBUG "%s: processing %p\n", __FUNCTION__, of_node); - vio_register_device(node_vdev); + vio_register_device(of_node); } return 0; @@ -171,98 +187,91 @@ __initcall(vio_bus_init); -/** - * vio_probe_device - attach dev to appropriate driver - * @dev: device to find a driver for - * - * Walks the list of registered VIO drivers looking for one to take this - * device. - * - * Returns a pointer to the matched driver or NULL if driver is not - * found. - */ -struct vio_driver * __devinit vio_probe_device(struct vio_dev* dev) +/* vio_dev refcount hit 0 */ +static void __devinit vio_dev_release(struct device *dev) { - struct vio_driver *driver; - - list_for_each_entry(driver, ®istered_vio_drivers, node) { - const struct vio_device_id* id; + struct vio_dev *viodev = to_vio_dev(dev); - id = vio_match_device(driver->id_table, dev); - if (id && (0 < driver->probe(dev, id))) { - printk(KERN_DEBUG "%s: driver %s/%s took device %p\n", - __FUNCTION__, id->type, id->compat, dev); - dev->driver = driver; - return driver; - } - } + DBGENTER(); - printk(KERN_DEBUG "%s: device %p found no driver\n", __FUNCTION__, dev); - return NULL; + /* XXX free TCE table */ + of_node_put(viodev->archdata); + kfree(viodev); } /** * vio_register_device: - Register a new vio device. - * @archdata: The OF node for this device. + * @of_node: The OF node for this device. * * Creates and initializes a vio_dev structure from the data in - * node_vdev (archdata) and adds it to the list of virtual devices. + * of_node (archdata) and adds it to the list of virtual devices. * Returns a pointer to the created vio_dev or NULL if node has * NULL device_type or compatible fields. */ -struct vio_dev * __devinit vio_register_device(struct device_node *node_vdev) +struct vio_dev * __devinit vio_register_device(struct device_node *of_node) { - struct vio_dev *dev; + struct vio_dev *viodev; unsigned int *unit_address; unsigned int *irq_p; - /* guarantee all vio_devs have 'device_type' field*/ - if ((NULL == node_vdev->type)) { + DBGENTER(); + + /* we need the 'device_type' property, in order to match with drivers */ + if ((NULL == of_node->type)) { printk(KERN_WARNING "%s: node %s missing 'device_type'\n", __FUNCTION__, - node_vdev->name ? node_vdev->name : ""); + of_node->name ? of_node->name : ""); return NULL; } - unit_address = (unsigned int *)get_property(node_vdev, "reg", NULL); + unit_address = (unsigned int *)get_property(of_node, "reg", NULL); if (!unit_address) { printk(KERN_WARNING "%s: node %s missing 'reg'\n", __FUNCTION__, - node_vdev->name ? node_vdev->name : ""); + of_node->name ? of_node->name : ""); return NULL; } /* allocate a vio_dev for this node */ - dev = kmalloc(sizeof(*dev), GFP_KERNEL); - if (!dev) + viodev = kmalloc(sizeof(struct vio_dev), GFP_KERNEL); + if (!viodev) { return NULL; - memset(dev, 0, sizeof(*dev)); - - dev->archdata = (void*)of_node_get(node_vdev); - dev->bus = &vio_bus; - dev->unit_address = *unit_address; - dev->tce_table = vio_build_tce_table(dev); - - irq_p = (unsigned int *) get_property(node_vdev, "interrupts", 0); - if(irq_p) { - dev->irq = openpic_to_irq(virt_irq_create_mapping(*irq_p)); - } else { - dev->irq = (unsigned int) -1; } + memset(viodev, 0, sizeof(struct vio_dev)); - list_add_tail(&dev->devices_list, &vio_bus.devices); - - vio_probe_device(dev); /* finally, assign it to a driver */ + viodev->archdata = (void *)of_node_get(of_node); + viodev->unit_address = *unit_address; + viodev->tce_table = vio_build_tce_table(viodev); + + viodev->irq = (unsigned int) -1; + irq_p = (unsigned int *)get_property(of_node, "interrupts", 0); + if (irq_p) { + viodev->irq = openpic_to_irq(virt_irq_create_mapping(*irq_p)); + } + + /* init generic 'struct device' fields: */ + viodev->dev.parent = &vio_bus_device->dev; + viodev->dev.bus = &vio_bus_type; + snprintf(viodev->dev.bus_id, BUS_ID_SIZE, "%s@%lx", + of_node->name, viodev->unit_address); + viodev->dev.release = vio_dev_release; + + /* register with generic device framework */ + if (device_register(&viodev->dev)) { + printk(KERN_ERR "%s: failed to register device %s\n", __FUNCTION__, + viodev->dev.bus_id); + /* XXX free TCE table */ + kfree(viodev); + return NULL; + } - return dev; + return viodev; } EXPORT_SYMBOL(vio_register_device); -int __devinit vio_unregister_device(struct vio_dev *dev) +void __devinit vio_unregister_device(struct vio_dev *viodev) { - list_del(&dev->devices_list); - of_node_put(dev->archdata); - - return 0; + DBGENTER(); + device_unregister(&viodev->dev); } EXPORT_SYMBOL(vio_unregister_device); @@ -531,6 +540,30 @@ } } EXPORT_SYMBOL(vio_free_consistent); + +static int vio_bus_match(struct device *dev, struct device_driver *drv) +{ + const struct vio_dev *vio_dev = to_vio_dev(dev); + struct vio_driver *vio_drv = to_vio_driver(drv); + const struct vio_device_id *ids = vio_drv->id_table; + const struct vio_device_id *found_id; + + DBGENTER(); + + if (!ids) + return 0; + + found_id = vio_match_device(ids, vio_dev); + if (found_id) + return 1; + + return 0; +} + +struct bus_type vio_bus_type = { + .name = "vio", + .match = vio_bus_match, +}; EXPORT_SYMBOL(plpar_hcall_norets); EXPORT_SYMBOL(plpar_hcall_8arg_2ret); diff -Nru a/arch/ppc64/kernel/xics.c b/arch/ppc64/kernel/xics.c --- a/arch/ppc64/kernel/xics.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/kernel/xics.c Tue Feb 17 20:00:07 2004 @@ -353,11 +353,11 @@ smp_message_recv(PPC_MSG_MIGRATE_TASK, regs); } #endif -#ifdef CONFIG_XMON - if (test_and_clear_bit(PPC_MSG_XMON_BREAK, +#ifdef CONFIG_DEBUGGER + if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, &xics_ipi_message[cpu].value)) { mb(); - smp_message_recv(PPC_MSG_XMON_BREAK, regs); + smp_message_recv(PPC_MSG_DEBUGGER_BREAK, regs); } #endif } diff -Nru a/arch/ppc64/mm/fault.c b/arch/ppc64/mm/fault.c --- a/arch/ppc64/mm/fault.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/mm/fault.c Tue Feb 17 20:00:07 2004 @@ -37,12 +37,6 @@ #include #include -#include - -#ifdef CONFIG_DEBUG_KERNEL -int debugger_kernel_faults = 1; -#endif - void bad_page_fault(struct pt_regs *, unsigned long, int); /* @@ -60,13 +54,10 @@ unsigned long code = SEGV_MAPERR; unsigned long is_write = error_code & 0x02000000; -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_fault_handler && (regs->trap == 0x300 || - regs->trap == 0x380)) { - debugger_fault_handler(regs); - return; + if (regs->trap == 0x300 || regs->trap == 0x380) { + if (debugger_fault_handler(regs)) + return; } -#endif /* On a kernel SLB miss we can only check for a valid exception entry */ if (!user_mode(regs) && (regs->trap == 0x380)) { @@ -74,13 +65,10 @@ return; } -#ifdef CONFIG_DEBUG_KERNEL if (error_code & 0x00400000) { - /* DABR match */ if (debugger_dabr_match(regs)) return; } -#endif if (in_atomic() || mm == NULL) { bad_page_fault(regs, address, SIGSEGV); @@ -149,11 +137,6 @@ info.si_errno = 0; info.si_code = code; info.si_addr = (void *) address; -#ifdef CONFIG_XMON - ifppcdebug(PPCDBG_SIGNALXMON) - PPCDBG_ENTER_DEBUGGER_REGS(regs); -#endif - force_sig_info(SIGSEGV, &info, current); return; } @@ -207,9 +190,7 @@ } /* kernel has accessed a bad area */ -#ifdef CONFIG_DEBUG_KERNEL - if (debugger_kernel_faults) - debugger(regs); -#endif + if (debugger(regs)) + return; die("Kernel access of bad area", regs, sig); } diff -Nru a/arch/ppc64/mm/hash_low.S b/arch/ppc64/mm/hash_low.S --- a/arch/ppc64/mm/hash_low.S Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/mm/hash_low.S Tue Feb 17 20:00:08 2004 @@ -95,7 +95,7 @@ /* Write the linux PTE atomically (setting busy) */ stdcx. r30,0,r6 bne- 1b - + isync /* Step 2: * diff -Nru a/arch/ppc64/mm/hash_utils.c b/arch/ppc64/mm/hash_utils.c --- a/arch/ppc64/mm/hash_utils.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/mm/hash_utils.c Tue Feb 17 20:00:07 2004 @@ -140,7 +140,8 @@ htab_data.htab_num_ptegs = pteg_count; htab_data.htab_hash_mask = pteg_count - 1; - if (systemcfg->platform == PLATFORM_PSERIES) { + if (systemcfg->platform == PLATFORM_PSERIES || + systemcfg->platform == PLATFORM_POWERMAC) { /* Find storage for the HPT. Must be contiguous in * the absolute address space. */ diff -Nru a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c --- a/arch/ppc64/mm/init.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/mm/init.c Tue Feb 17 20:00:07 2004 @@ -59,6 +59,7 @@ #include #include #include +#include #ifdef CONFIG_PPC_ISERIES #include @@ -691,11 +692,7 @@ bootmap_pages = bootmem_bootmap_pages(total_pages); start = (unsigned long)__a2p(lmb_alloc(bootmap_pages<> PAGE_SHIFT, total_pages); diff -Nru a/arch/ppc64/mm/numa.c b/arch/ppc64/mm/numa.c --- a/arch/ppc64/mm/numa.c Tue Feb 17 20:00:07 2004 +++ b/arch/ppc64/mm/numa.c Tue Feb 17 20:00:07 2004 @@ -273,8 +273,8 @@ physbase = start_paddr; } - if (size > end_paddr - start_paddr) - size = end_paddr - start_paddr; + if (size > end_paddr - physbase) + size = end_paddr - physbase; dbg("free_bootmem %lx %lx\n", physbase, size); free_bootmem_node(NODE_DATA(nid), physbase, @@ -294,8 +294,8 @@ physbase = start_paddr; } - if (size > end_paddr - start_paddr) - size = end_paddr - start_paddr; + if (size > end_paddr - physbase) + size = end_paddr - physbase; dbg("reserve_bootmem %lx %lx\n", physbase, size); diff -Nru a/arch/ppc64/xmon/privinst.h b/arch/ppc64/xmon/privinst.h --- a/arch/ppc64/xmon/privinst.h Tue Feb 17 20:00:06 2004 +++ b/arch/ppc64/xmon/privinst.h Tue Feb 17 20:00:06 2004 @@ -43,39 +43,12 @@ GSETSPR(275, sprg3) GSETSPR(282, ear) GSETSPR(287, pvr) -GSETSPR(528, bat0u) -GSETSPR(529, bat0l) -GSETSPR(530, bat1u) -GSETSPR(531, bat1l) -GSETSPR(532, bat2u) -GSETSPR(533, bat2l) -GSETSPR(534, bat3u) -GSETSPR(535, bat3l) GSETSPR(1008, hid0) GSETSPR(1009, hid1) GSETSPR(1010, iabr) GSETSPR(1013, dabr) GSETSPR(1023, pir) -static inline int get_sr(int n) -{ - int ret; - -#if 0 - // DRENG does not assemble - asm (" mfsrin %0,%1" : "=r" (ret) : "r" (n << 28)); -#endif - return ret; -} - -static inline void set_sr(int n, int val) -{ -#if 0 - // DRENG does not assemble - asm ("mtsrin %0,%1" : : "r" (val), "r" (n << 28)); -#endif -} - static inline void store_inst(void *p) { asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p)); @@ -90,4 +63,3 @@ { asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p)); } - diff -Nru a/arch/ppc64/xmon/start.c b/arch/ppc64/xmon/start.c --- a/arch/ppc64/xmon/start.c Tue Feb 17 20:00:14 2004 +++ b/arch/ppc64/xmon/start.c Tue Feb 17 20:00:14 2004 @@ -11,50 +11,39 @@ #include #include #include +#include #include #include #include #include #include #include - -extern void xmon_printf(const char *fmt, ...); - -#define TB_SPEED 25000000 - -static inline unsigned int readtb(void) -{ - unsigned int ret; - - asm volatile("mftb %0" : "=r" (ret) :); - return ret; -} +#include #ifdef CONFIG_MAGIC_SYSRQ static void sysrq_handle_xmon(int key, struct pt_regs *pt_regs, struct tty_struct *tty) { - xmon(pt_regs); + /* ensure xmon is enabled */ + xmon_init(); + debugger(pt_regs); } static struct sysrq_key_op sysrq_xmon_op = { .handler = sysrq_handle_xmon, - .help_msg = "xmon", + .help_msg = "Xmon", .action_msg = "Entering xmon\n", }; -#endif /* CONFIG_MAGIC_SYSRQ */ - -void -xmon_map_scc(void) +static int __init setup_xmon_sysrq(void) { -#ifdef CONFIG_MAGIC_SYSRQ - /* This maybe isn't the best place to register sysrq 'x' */ __sysrq_put_key_op('x', &sysrq_xmon_op); -#endif /* CONFIG_MAGIC_SYSRQ */ + return 0; } +__initcall(setup_xmon_sysrq); +#endif /* CONFIG_MAGIC_SYSRQ */ int xmon_write(void *handle, void *ptr, int nb) @@ -62,8 +51,6 @@ return udbg_write(ptr, nb); } -int xmon_wants_key; - int xmon_read(void *handle, void *ptr, int nb) { @@ -79,11 +66,6 @@ void *xmon_stdin; void *xmon_stdout; void *xmon_stderr; - -void -xmon_init(void) -{ -} int xmon_putc(int c, void *f) diff -Nru a/arch/ppc64/xmon/xmon.c b/arch/ppc64/xmon/xmon.c --- a/arch/ppc64/xmon/xmon.c Tue Feb 17 20:00:08 2004 +++ b/arch/ppc64/xmon/xmon.c Tue Feb 17 20:00:08 2004 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -37,7 +38,7 @@ #define skipbl xmon_skipbl #ifdef CONFIG_SMP -volatile unsigned long cpus_in_xmon = 0; +volatile cpumask_t cpus_in_xmon = CPU_MASK_NONE; static unsigned long got_xmon = 0; static volatile int take_xmon = -1; static volatile int leaving_xmon = 0; @@ -72,11 +73,10 @@ static unsigned bpinstr = 0x7fe00008; /* trap */ /* Prototypes */ -extern void (*debugger_fault_handler)(struct pt_regs *); static int cmds(struct pt_regs *); static int mread(unsigned long, void *, int); static int mwrite(unsigned long, void *, int); -static void handle_fault(struct pt_regs *); +static int handle_fault(struct pt_regs *); static void byterev(unsigned char *, int); static void memex(void); static int bsesc(void); @@ -114,10 +114,7 @@ #endif /* CONFIG_SMP */ static void csum(void); static void bootcmds(void); -static void mem_translate(void); -static void mem_check(void); -static void mem_find_real(void); -static void mem_find_vsid(void); +void dump_segments(void); static void debug_trace(void); @@ -148,7 +145,15 @@ b show breakpoints\n\ bd set data breakpoint\n\ bi set instruction breakpoint\n\ - bc clear breakpoint\n\ + bc clear breakpoint\n" +#ifdef CONFIG_SMP + "\ + c print cpus stopped in xmon\n\ + ci send xmon interrupt to all other cpus\n\ + c# try to switch to cpu number h (in hex)\n" +#endif + "\ + C checksum\n\ d dump bytes\n\ di dump instructions\n\ df dump float values\n\ @@ -161,7 +166,6 @@ md compare two blocks of memory\n\ ml locate a block of memory\n\ mz zero a block of memory\n\ - mx translation information for an effective address\n\ mi show information about memory allocation\n\ p show the task list\n\ r print registers\n\ @@ -170,7 +174,14 @@ t print backtrace\n\ T Enable/Disable PPCDBG flags\n\ x exit monitor\n\ -"; + u dump segment table or SLB\n\ + ? help\n" +#ifndef CONFIG_PPC_ISERIES + "\ + zr reboot\n\ + zh halt\n" +#endif +; static int xmon_trace[NR_CPUS]; #define SSTEP 1 /* stepping because of 's' command */ @@ -223,7 +234,7 @@ #endif } -void +int xmon(struct pt_regs *excp) { struct pt_regs regs; @@ -288,17 +299,18 @@ leaving_xmon = 0; /* possible race condition here if a CPU is held up and gets * here while we are exiting */ - if (test_and_set_bit(smp_processor_id(), &cpus_in_xmon)) { + if (cpu_test_and_set(smp_processor_id(), cpus_in_xmon)) { /* xmon probably caused an exception itself */ printf("We are already in xmon\n"); for (;;) - ; + cpu_relax(); } while (test_and_set_bit(0, &got_xmon)) { if (take_xmon == smp_processor_id()) { take_xmon = -1; break; } + cpu_relax(); } /* * XXX: breakpoints are removed while any cpu is in xmon @@ -306,6 +318,7 @@ #endif /* CONFIG_SMP */ remove_bpts(); disable_surveillance(); + printf("press ? for help "); cmd = cmds(excp); if (cmd == 's') { xmon_trace[smp_processor_id()] = SSTEP; @@ -325,20 +338,11 @@ leaving_xmon = 1; if (cmd != 's') clear_bit(0, &got_xmon); - clear_bit(smp_processor_id(), &cpus_in_xmon); + cpu_clear(smp_processor_id(), cpus_in_xmon); #endif /* CONFIG_SMP */ set_msrd(msr); /* restore interrupt enable */ -} -void -xmon_irq(int irq, void *d, struct pt_regs *regs) -{ - unsigned long flags; - local_save_flags(flags); - local_irq_disable(); - printf("Keyboard interrupt\n"); - xmon(regs); - local_irq_restore(flags); + return 0; } int @@ -522,18 +526,6 @@ case 'z': memzcan(); break; - case 'x': - mem_translate(); - break; - case 'c': - mem_check(); - break; - case 'f': - mem_find_real(); - break; - case 'e': - mem_find_vsid(); - break; case 'i': show_mem(); break; @@ -585,11 +577,16 @@ cpu_cmd(); break; #endif /* CONFIG_SMP */ +#ifndef CONFIG_PPC_ISERIES case 'z': bootcmds(); +#endif case 'T': debug_trace(); break; + case 'u': + dump_segments(); + break; default: printf("Unrecognized command: "); do { @@ -602,6 +599,7 @@ printf(" (type ? for help)\n"); break; } + cpu_relax(); } } @@ -630,7 +628,7 @@ printf("stopping all cpus\n"); /* interrupt other cpu(s) */ cpu = MSG_ALL_BUT_SELF; - smp_send_xmon_break(cpu); + smp_send_debugger_break(cpu); return; } termch = cmd; @@ -638,7 +636,7 @@ /* print cpus waiting or in xmon */ printf("cpus stopped:"); for (cpu = 0; cpu < NR_CPUS; ++cpu) { - if (test_bit(cpu, &cpus_in_xmon)) { + if (cpu_isset(cpu, cpus_in_xmon)) { printf(" %x", cpu); if (cpu == smp_processor_id()) printf("*", cpu); @@ -664,6 +662,7 @@ take_xmon = -1; break; } + cpu_relax(); } } #endif /* CONFIG_SMP */ @@ -843,7 +842,8 @@ break; } - if (!(systemcfg->platform & PLATFORM_PSERIES)) { + if (systemcfg->platform != PLATFORM_POWERMAC && + !(systemcfg->platform & PLATFORM_PSERIES)) { printf("Not supported for this platform\n"); break; } @@ -1052,14 +1052,23 @@ termch = 0; nflush = 1; scanhex(&nflush); - nflush = (nflush + 31) / 32; - if (cmd != 'i') { - for (; nflush > 0; --nflush, adrs += 0x20) - cflush((void *) adrs); - } else { - for (; nflush > 0; --nflush, adrs += 0x20) - cinval((void *) adrs); + nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES; + if (setjmp(bus_error_jmp) == 0) { + __debugger_fault_handler = handle_fault; + sync(); + + if (cmd != 'i') { + for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES) + cflush((void *) adrs); + } else { + for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES) + cinval((void *) adrs); + } + sync(); + /* wait a little while to see if we get a machine check */ + __delay(200); } + __debugger_fault_handler = 0; } unsigned long @@ -1068,6 +1077,7 @@ unsigned int instrs[2]; unsigned long (*code)(void); unsigned long opd[3]; + unsigned long ret = -1UL; instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6); instrs[1] = 0x4e800020; @@ -1078,7 +1088,22 @@ store_inst(instrs+1); code = (unsigned long (*)(void)) opd; - return code(); + if (setjmp(bus_error_jmp) == 0) { + __debugger_fault_handler = handle_fault; + sync(); + + ret = code(); + + sync(); + /* wait a little while to see if we get a machine check */ + __delay(200); + } else { + printf("*** Error reading spr %x\n", n); + } + + __debugger_fault_handler = 0; + + return ret; } void @@ -1097,7 +1122,20 @@ store_inst(instrs+1); code = (unsigned long (*)(unsigned long)) opd; - code(val); + if (setjmp(bus_error_jmp) == 0) { + __debugger_fault_handler = handle_fault; + sync(); + + code(val); + + sync(); + /* wait a little while to see if we get a machine check */ + __delay(200); + } else { + printf("*** Error writing spr %x\n", n); + } + + __debugger_fault_handler = 0; } static unsigned long regno; @@ -1107,11 +1145,14 @@ void super_regs() { - int i, cmd; + int cmd; unsigned long val; - struct paca_struct* ptrPaca = NULL; - struct ItLpPaca* ptrLpPaca = NULL; - struct ItLpRegSave* ptrLpRegSave = NULL; +#ifdef CONFIG_PPC_ISERIES + int i; + struct paca_struct *ptrPaca = NULL; + struct ItLpPaca *ptrLpPaca = NULL; + struct ItLpRegSave *ptrLpRegSave = NULL; +#endif cmd = skipbl(); if (cmd == '\n') { @@ -1125,10 +1166,7 @@ printf("sp = %.16lx sprg3= %.16lx\n", sp, get_sprg3()); printf("toc = %.16lx dar = %.16lx\n", toc, get_dar()); printf("srr0 = %.16lx srr1 = %.16lx\n", get_srr0(), get_srr1()); - printf("asr = %.16lx\n", mfasr()); - for (i = 0; i < 8; ++i) - printf("sr%.2ld = %.16lx sr%.2ld = %.16lx\n", i, get_sr(i), i+8, get_sr(i+8)); - +#ifdef CONFIG_PPC_ISERIES // Dump out relevant Paca data areas. printf("Paca: \n"); ptrPaca = get_paca(); @@ -1144,7 +1182,8 @@ printf(" Saved Sprg0=%.16lx Saved Sprg1=%.16lx \n", ptrLpRegSave->xSPRG0, ptrLpRegSave->xSPRG0); printf(" Saved Sprg2=%.16lx Saved Sprg3=%.16lx \n", ptrLpRegSave->xSPRG2, ptrLpRegSave->xSPRG3); printf(" Saved Msr =%.16lx Saved Nia =%.16lx \n", ptrLpRegSave->xMSR, ptrLpRegSave->xNIA); - +#endif + return; } @@ -1158,11 +1197,6 @@ case 'r': printf("spr %lx = %lx\n", regno, read_spr(regno)); break; - case 's': - val = get_sr(regno); - scanhex(&val); - set_sr(regno, val); - break; case 'm': val = get_msr(); scanhex(&val); @@ -1180,7 +1214,7 @@ n = 0; if (setjmp(bus_error_jmp) == 0) { - debugger_fault_handler = handle_fault; + __debugger_fault_handler = handle_fault; sync(); p = (char *)adrs; q = (char *)buf; @@ -1205,7 +1239,7 @@ __delay(200); n = size; } - debugger_fault_handler = 0; + __debugger_fault_handler = 0; return n; } @@ -1217,7 +1251,7 @@ n = 0; if (setjmp(bus_error_jmp) == 0) { - debugger_fault_handler = handle_fault; + __debugger_fault_handler = handle_fault; sync(); p = (char *) adrs; q = (char *) buf; @@ -1244,14 +1278,14 @@ } else { printf("*** Error writing address %x\n", adrs + n); } - debugger_fault_handler = 0; + __debugger_fault_handler = 0; return n; } static int fault_type; static char *fault_chars[] = { "--", "**", "##" }; -static void +static int handle_fault(struct pt_regs *regs) { switch (regs->trap) { @@ -1267,6 +1301,8 @@ } longjmp(bus_error_jmp, 1); + + return 0; } #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) @@ -1880,7 +1916,7 @@ char namebuf[128]; if (setjmp(bus_error_jmp) == 0) { - debugger_fault_handler = handle_fault; + __debugger_fault_handler = handle_fault; sync(); name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); @@ -1891,7 +1927,7 @@ name = "symbol lookup failed"; } - debugger_fault_handler = 0; + __debugger_fault_handler = 0; if (!name) { char addrstr[sizeof("0x%lx") + (BITS_PER_LONG*3/10)]; @@ -1919,240 +1955,8 @@ } } -void -mem_translate() +static void debug_trace(void) { - int c; - unsigned long ea, va, vsid, vpn, page, hpteg_slot_primary, hpteg_slot_secondary, primary_hash, i, *steg, esid, stabl; - HPTE * hpte; - struct mm_struct * mm; - pte_t *ptep = NULL; - void * pgdir; - - c = inchar(); - if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n') - termch = c; - scanhex((void *)&ea); - - if ((ea >= KRANGE_START) && (ea <= (KRANGE_START + (1UL<<60)))) { - ptep = 0; - vsid = get_kernel_vsid(ea); - va = ( vsid << 28 ) | ( ea & 0x0fffffff ); - } else { - // if in vmalloc range, use the vmalloc page directory - if ( ( ea >= VMALLOC_START ) && ( ea <= VMALLOC_END ) ) { - mm = &init_mm; - vsid = get_kernel_vsid( ea ); - } - // if in ioremap range, use the ioremap page directory - else if ( ( ea >= IMALLOC_START ) && ( ea <= IMALLOC_END ) ) { - mm = &ioremap_mm; - vsid = get_kernel_vsid( ea ); - } - // if in user range, use the current task's page directory - else if ( ( ea >= USER_START ) && ( ea <= USER_END ) ) { - mm = current->mm; - vsid = get_vsid(mm->context, ea ); - } - pgdir = mm->pgd; - va = ( vsid << 28 ) | ( ea & 0x0fffffff ); - ptep = find_linux_pte( pgdir, ea ); - } - - vpn = ((vsid << 28) | (((ea) & 0xFFFF000))) >> 12; - page = vpn & 0xffff; - esid = (ea >> 28) & 0xFFFFFFFFF; - - // Search the primary group for an available slot - primary_hash = ( vsid & 0x7fffffffff ) ^ page; - hpteg_slot_primary = ( primary_hash & htab_data.htab_hash_mask ) * HPTES_PER_GROUP; - hpteg_slot_secondary = ( ~primary_hash & htab_data.htab_hash_mask ) * HPTES_PER_GROUP; - - printf("ea : %.16lx\n", ea); - printf("esid : %.16lx\n", esid); - printf("vsid : %.16lx\n", vsid); - - printf("\nSoftware Page Table\n-------------------\n"); - printf("ptep : %.16lx\n", ((unsigned long *)ptep)); - if(ptep) { - printf("*ptep : %.16lx\n", *((unsigned long *)ptep)); - } - - hpte = htab_data.htab + hpteg_slot_primary; - printf("\nHardware Page Table\n-------------------\n"); - printf("htab base : %.16lx\n", htab_data.htab); - printf("slot primary : %.16lx\n", hpteg_slot_primary); - printf("slot secondary : %.16lx\n", hpteg_slot_secondary); - printf("\nPrimary Group\n"); - for (i=0; i<8; ++i) { - if ( hpte->dw0.dw0.v != 0 ) { - printf("%d: (hpte)%.16lx %.16lx\n", i, hpte->dw0.dword0, hpte->dw1.dword1); - printf(" vsid: %.13lx api: %.2lx hash: %.1lx\n", - (hpte->dw0.dw0.avpn)>>5, - (hpte->dw0.dw0.avpn) & 0x1f, - (hpte->dw0.dw0.h)); - printf(" rpn: %.13lx \n", (hpte->dw1.dw1.rpn)); - printf(" pp: %.1lx \n", - ((hpte->dw1.dw1.pp0)<<2)|(hpte->dw1.dw1.pp)); - printf(" wimgn: %.2lx reference: %.1lx change: %.1lx\n", - ((hpte->dw1.dw1.w)<<4)| - ((hpte->dw1.dw1.i)<<3)| - ((hpte->dw1.dw1.m)<<2)| - ((hpte->dw1.dw1.g)<<1)| - ((hpte->dw1.dw1.n)<<0), - hpte->dw1.dw1.r, hpte->dw1.dw1.c); - } - hpte++; - } - - printf("\nSecondary Group\n"); - // Search the secondary group - hpte = htab_data.htab + hpteg_slot_secondary; - for (i=0; i<8; ++i) { - if(hpte->dw0.dw0.v) { - printf("%d: (hpte)%.16lx %.16lx\n", i, hpte->dw0.dword0, hpte->dw1.dword1); - printf(" vsid: %.13lx api: %.2lx hash: %.1lx\n", - (hpte->dw0.dw0.avpn)>>5, - (hpte->dw0.dw0.avpn) & 0x1f, - (hpte->dw0.dw0.h)); - printf(" rpn: %.13lx \n", (hpte->dw1.dw1.rpn)); - printf(" pp: %.1lx \n", - ((hpte->dw1.dw1.pp0)<<2)|(hpte->dw1.dw1.pp)); - printf(" wimgn: %.2lx reference: %.1lx change: %.1lx\n", - ((hpte->dw1.dw1.w)<<4)| - ((hpte->dw1.dw1.i)<<3)| - ((hpte->dw1.dw1.m)<<2)| - ((hpte->dw1.dw1.g)<<1)| - ((hpte->dw1.dw1.n)<<0), - hpte->dw1.dw1.r, hpte->dw1.dw1.c); - } - hpte++; - } - - printf("\nHardware Segment Table\n-----------------------\n"); - stabl = (unsigned long)(KERNELBASE+(_ASR&0xFFFFFFFFFFFFFFFE)); - steg = (unsigned long *)((stabl) | ((esid & 0x1f) << 7)); - - printf("stab base : %.16lx\n", stabl); - printf("slot : %.16lx\n", steg); - - for (i=0; i<8; ++i) { - printf("%d: (ste) %.16lx %.16lx\n", i, - *((unsigned long *)(steg+i*2)),*((unsigned long *)(steg+i*2+1)) ); - } -} - -void mem_check() -{ - unsigned long htab_size_bytes; - unsigned long htab_end; - unsigned long last_rpn; - HPTE *hpte1, *hpte2; - - htab_size_bytes = htab_data.htab_num_ptegs * 128; // 128B / PTEG - htab_end = (unsigned long)htab_data.htab + htab_size_bytes; - // last_rpn = (naca->physicalMemorySize-1) >> PAGE_SHIFT; - last_rpn = 0xfffff; - - printf("\nHardware Page Table Check\n-------------------\n"); - printf("htab base : %.16lx\n", htab_data.htab); - printf("htab size : %.16lx\n", htab_size_bytes); - -#if 1 - for(hpte1 = htab_data.htab; hpte1 < (HPTE *)htab_end; hpte1++) { - if ( hpte1->dw0.dw0.v != 0 ) { - if ( hpte1->dw1.dw1.rpn <= last_rpn ) { - for(hpte2 = hpte1+1; hpte2 < (HPTE *)htab_end; hpte2++) { - if ( hpte2->dw0.dw0.v != 0 ) { - if(hpte1->dw1.dw1.rpn == hpte2->dw1.dw1.rpn) { - printf(" Duplicate rpn: %.13lx \n", (hpte1->dw1.dw1.rpn)); - printf(" hpte1: %16.16lx *hpte1: %16.16lx %16.16lx\n", - hpte1, hpte1->dw0.dword0, hpte1->dw1.dword1); - printf(" hpte2: %16.16lx *hpte2: %16.16lx %16.16lx\n", - hpte2, hpte2->dw0.dword0, hpte2->dw1.dword1); - } - } - } - } else { - printf(" Bogus rpn: %.13lx \n", (hpte1->dw1.dw1.rpn)); - printf(" hpte: %16.16lx *hpte: %16.16lx %16.16lx\n", - hpte1, hpte1->dw0.dword0, hpte1->dw1.dword1); - } - } - } -#endif - printf("\nDone -------------------\n"); -} - -void mem_find_real() -{ - unsigned long htab_size_bytes; - unsigned long htab_end; - unsigned long last_rpn; - HPTE *hpte1; - unsigned long pa, rpn; - int c; - - c = inchar(); - if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n') - termch = c; - scanhex((void *)&pa); - rpn = pa >> 12; - - htab_size_bytes = htab_data.htab_num_ptegs * 128; // 128B / PTEG - htab_end = (unsigned long)htab_data.htab + htab_size_bytes; - // last_rpn = (naca->physicalMemorySize-1) >> PAGE_SHIFT; - last_rpn = 0xfffff; - - printf("\nMem Find RPN\n-------------------\n"); - printf("htab base : %.16lx\n", htab_data.htab); - printf("htab size : %.16lx\n", htab_size_bytes); - - for(hpte1 = htab_data.htab; hpte1 < (HPTE *)htab_end; hpte1++) { - if ( hpte1->dw0.dw0.v != 0 ) { - if ( hpte1->dw1.dw1.rpn == rpn ) { - printf(" Found rpn: %.13lx \n", (hpte1->dw1.dw1.rpn)); - printf(" hpte: %16.16lx *hpte1: %16.16lx %16.16lx\n", - hpte1, hpte1->dw0.dword0, hpte1->dw1.dword1); - } - } - } - printf("\nDone -------------------\n"); -} - -void mem_find_vsid() -{ - unsigned long htab_size_bytes; - unsigned long htab_end; - HPTE *hpte1; - unsigned long vsid; - int c; - - c = inchar(); - if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n') - termch = c; - scanhex((void *)&vsid); - - htab_size_bytes = htab_data.htab_num_ptegs * 128; // 128B / PTEG - htab_end = (unsigned long)htab_data.htab + htab_size_bytes; - - printf("\nMem Find VSID\n-------------------\n"); - printf("htab base : %.16lx\n", htab_data.htab); - printf("htab size : %.16lx\n", htab_size_bytes); - - for(hpte1 = htab_data.htab; hpte1 < (HPTE *)htab_end; hpte1++) { - if ( hpte1->dw0.dw0.v != 0 ) { - if ( ((hpte1->dw0.dw0.avpn)>>5) == vsid ) { - printf(" Found vsid: %.16lx \n", ((hpte1->dw0.dw0.avpn) >> 5)); - printf(" hpte: %16.16lx *hpte1: %16.16lx %16.16lx\n", - hpte1, hpte1->dw0.dword0, hpte1->dw1.dword1); - } - } - } - printf("\nDone -------------------\n"); -} - -static void debug_trace(void) { unsigned long val, cmd, on; cmd = skipbl(); @@ -2198,4 +2002,57 @@ } cmd = skipbl(); } +} + +static void dump_slb(void) +{ + int i; + unsigned long tmp; + + printf("SLB contents of cpu %d\n", smp_processor_id()); + + for (i = 0; i < naca->slb_size; i++) { + asm volatile("slbmfee %0,%1" : "=r" (tmp) : "r" (i)); + printf("%02d %016lx ", i, tmp); + + asm volatile("slbmfev %0,%1" : "=r" (tmp) : "r" (i)); + printf("%016lx\n", tmp); + } +} + +static void dump_stab(void) +{ + int i; + unsigned long *tmp = (unsigned long *)get_paca()->xStab_data.virt; + + printf("Segment table contents of cpu %d\n", smp_processor_id()); + + for (i = 0; i < PAGE_SIZE/16; i++) { + unsigned long a, b; + + a = *tmp++; + b = *tmp++; + + if (a || b) { + printf("%03d %016lx ", i, a); + printf("%016lx\n", b); + } + } +} + +void xmon_init(void) +{ + __debugger = xmon; + __debugger_bpt = xmon_bpt; + __debugger_sstep = xmon_sstep; + __debugger_iabr_match = xmon_iabr_match; + __debugger_dabr_match = xmon_dabr_match; +} + +void dump_segments(void) +{ + if (cur_cpu_spec->cpu_features & CPU_FTR_SLB) + dump_slb(); + else + dump_stab(); } diff -Nru a/arch/sh/Kconfig b/arch/sh/Kconfig --- a/arch/sh/Kconfig Tue Feb 17 20:00:08 2004 +++ b/arch/sh/Kconfig Tue Feb 17 20:00:08 2004 @@ -940,61 +940,7 @@ ) solves this problem, or you can get the "mconv2" utility from . - -menu "Watchdog Cards" - -config WATCHDOG - bool "Watchdog Timer Support" - ---help--- - If you say Y here (and to one of the following options) and create a - character special file /dev/watchdog with major number 10 and minor - number 130 using mknod ("man mknod"), you will get a watchdog, i.e.: - subsequently opening the file and then failing to write to it for - longer than 1 minute will result in rebooting the machine. This - could be useful for a networked machine that needs to come back - online as fast as possible after a lock-up. There's both a watchdog - implementation entirely in software (which can sometimes fail to - reboot the machine) and a driver for hardware watchdog boards, which - are more robust and can also keep track of the temperature inside - your computer. For details, read - in the kernel source. - - The watchdog is usually used together with the watchdog daemon - which is available from - . This daemon can - also monitor NFS connections and can reboot the machine when the process - table is full. - - If unsure, say N. - -config WATCHDOG_NOWAYOUT - bool "Disable watchdog shutdown on close" - depends on WATCHDOG - help - The default watchdog behaviour (which you get if you say N here) is - to stop the timer if the process managing it closes the file - /dev/watchdog. It's always remotely possible that this process might - get killed. If you say Y here, the watchdog cannot be stopped once - it has been started. - -config SH_WDT - tristate "SuperH Watchdog" - depends on WATCHDOG - help - This driver adds watchdog support for the integrated watchdog in the - SuperH processors. If you have one of these processors and wish - to have watchdog support enabled, say Y, otherwise say N. - - As a side note, saying Y here will automatically boost HZ to 1000 - so that the timer has a chance to clear the overflow counter. On - slower systems (such as the SH-2 and SH-3) this will likely yield - some performance issues. As such, the WDT should be avoided here - unless it is absolutely necessary. - - To compile this driver as a module, choose M here: the - module will be called shwdt. - -endmenu +source "drivers/char/watchdog/Kconfig" config RTC tristate "Enhanced Real Time Clock Support" diff -Nru a/arch/sh/boards/hp6xx/hp680/Makefile b/arch/sh/boards/hp6xx/hp680/Makefile --- a/arch/sh/boards/hp6xx/hp680/Makefile Tue Feb 17 20:00:07 2004 +++ b/arch/sh/boards/hp6xx/hp680/Makefile Tue Feb 17 20:00:07 2004 @@ -6,5 +6,5 @@ # unless it's something special (ie not a .c file). # -obj-y := mach.o +obj-y := mach.o setup.o diff -Nru a/arch/sh/boards/hp6xx/hp680/mach.c b/arch/sh/boards/hp6xx/hp680/mach.c --- a/arch/sh/boards/hp6xx/hp680/mach.c Tue Feb 17 20:00:08 2004 +++ b/arch/sh/boards/hp6xx/hp680/mach.c Tue Feb 17 20:00:08 2004 @@ -17,6 +17,7 @@ #include #include +#include #include struct sh_machine_vector mv_hp680 __initmv = { diff -Nru a/arch/sh/boards/hp6xx/hp680/setup.c b/arch/sh/boards/hp6xx/hp680/setup.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/sh/boards/hp6xx/hp680/setup.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,27 @@ +/* + * linux/arch/sh/boards/hp6xx/hp680/setup.c + * + * Copyright (C) 2002 Andriy Skulysh + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + * + * Setup code for an HP680 (internal peripherials only) + */ + +#include +#include +#include + +const char *get_system_type(void) +{ + return "HP680"; +} + +int __init platform_setup(void) +{ + __set_io_port_base(CONFIG_HD64461_IOBASE - HD64461_STBCR); + + return 0; +} + diff -Nru a/arch/sh/cchips/hd6446x/hd64461/io.c b/arch/sh/cchips/hd6446x/hd64461/io.c --- a/arch/sh/cchips/hd6446x/hd64461/io.c Tue Feb 17 20:00:07 2004 +++ b/arch/sh/cchips/hd6446x/hd64461/io.c Tue Feb 17 20:00:07 2004 @@ -1,5 +1,5 @@ /* - * $Id: io.c,v 1.4 2003/08/03 03:05:10 lethal Exp $ + * $Id: io.c,v 1.5 2004/02/01 19:46:04 lethal Exp $ * Copyright (C) 2000 YAEGASHI Takeshi * Typical I/O routines for HD64461 system. */ @@ -99,3 +99,44 @@ *(volatile unsigned long*)PORT2ADDR(port) = b; } +void hd64461_insb(unsigned long port, void *buffer, unsigned long count) +{ + volatile unsigned char* addr=(volatile unsigned char*)PORT2ADDR(port); + unsigned char *buf=buffer; + while(count--) *buf++=*addr; +} + +void hd64461_insw(unsigned long port, void *buffer, unsigned long count) +{ + volatile unsigned short* addr=(volatile unsigned short*)PORT2ADDR(port); + unsigned short *buf=buffer; + while(count--) *buf++=*addr; +} + +void hd64461_insl(unsigned long port, void *buffer, unsigned long count) +{ + volatile unsigned long* addr=(volatile unsigned long*)PORT2ADDR(port); + unsigned long *buf=buffer; + while(count--) *buf++=*addr; +} + +void hd64461_outsb(unsigned long port, const void *buffer, unsigned long count) +{ + volatile unsigned char* addr=(volatile unsigned char*)PORT2ADDR(port); + const unsigned char *buf=buffer; + while(count--) *addr=*buf++; +} + +void hd64461_outsw(unsigned long port, const void *buffer, unsigned long count) +{ + volatile unsigned short* addr=(volatile unsigned short*)PORT2ADDR(port); + const unsigned short *buf=buffer; + while(count--) *addr=*buf++; +} + +void hd64461_outsl(unsigned long port, const void *buffer, unsigned long count) +{ + volatile unsigned long* addr=(volatile unsigned long*)PORT2ADDR(port); + const unsigned long *buf=buffer; + while(count--) *addr=*buf++; +} diff -Nru a/arch/sh/configs/defconfig-hp680 b/arch/sh/configs/defconfig-hp680 --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/sh/configs/defconfig-hp680 Tue Feb 17 20:00:14 2004 @@ -0,0 +1,428 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_SUPERH=y +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +# CONFIG_STANDALONE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +# CONFIG_SYSVIPC is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_SYSCTL is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +# CONFIG_MODULES is not set + +# +# System type +# +# CONFIG_SH_SOLUTION_ENGINE is not set +# CONFIG_SH_7751_SOLUTION_ENGINE is not set +# CONFIG_SH_7751_SYSTEMH is not set +# CONFIG_SH_STB1_HARP is not set +# CONFIG_SH_STB1_OVERDRIVE is not set +# CONFIG_SH_HP620 is not set +CONFIG_SH_HP680=y +# CONFIG_SH_HP690 is not set +# CONFIG_SH_CQREEK is not set +# CONFIG_SH_DMIDA is not set +# CONFIG_SH_EC3104 is not set +# CONFIG_SH_SATURN is not set +# CONFIG_SH_DREAMCAST is not set +# CONFIG_SH_CAT68701 is not set +# CONFIG_SH_BIGSUR is not set +# CONFIG_SH_SH2000 is not set +# CONFIG_SH_ADX is not set +# CONFIG_SH_MPC1211 is not set +# CONFIG_SH_SECUREEDGE5410 is not set +# CONFIG_SH_UNKNOWN is not set +# CONFIG_CPU_SH2 is not set +CONFIG_CPU_SH3=y +# CONFIG_CPU_SH4 is not set +# CONFIG_CPU_SUBTYPE_SH7604 is not set +# CONFIG_CPU_SUBTYPE_SH7300 is not set +# CONFIG_CPU_SUBTYPE_SH7707 is not set +# CONFIG_CPU_SUBTYPE_SH7708 is not set +CONFIG_CPU_SUBTYPE_SH7709=y +# CONFIG_CPU_SUBTYPE_SH7750 is not set +# CONFIG_CPU_SUBTYPE_SH7751 is not set +# CONFIG_CPU_SUBTYPE_SH7760 is not set +# CONFIG_CPU_SUBTYPE_ST40STB1 is not set +CONFIG_MMU=y +# CONFIG_CMDLINE_BOOL is not set +CONFIG_MEMORY_START=0x0c000000 +CONFIG_MEMORY_SIZE=0x00400000 +CONFIG_MEMORY_SET=y +# CONFIG_MEMORY_OVERRIDE is not set +CONFIG_SH_RTC=y +# CONFIG_SH_DSP is not set +CONFIG_SH_HP600=y +CONFIG_ZERO_PAGE_OFFSET=0x00001000 +CONFIG_BOOT_LINK_OFFSET=0x00800000 +CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_PREEMPT is not set +# CONFIG_UBC_WAKEUP is not set +# CONFIG_SH_WRITETHROUGH is not set +# CONFIG_SH_OCRAM is not set +# CONFIG_SMP is not set +CONFIG_SH_PCLK_FREQ=1193182 +# CONFIG_CPU_FREQ is not set +# CONFIG_SH_DMA is not set +CONFIG_HD64461=y +# CONFIG_HD64465 is not set +CONFIG_HD64461_IRQ=36 +CONFIG_HD64461_ENABLER=y + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +# CONFIG_PCI is not set +# CONFIG_HOTPLUG is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_FLAT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Generic Driver Options +# + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_LOOP is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_IDEDISK_STROKE is not set +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_IDEDMA is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_SCSI is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# Networking support +# +# CONFIG_NET is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# ISDN subsystem +# + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set + +# +# Input Device Drivers +# +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL is not set +CONFIG_SH_SCI=y +# CONFIG_SERIAL_CONSOLE is not set + +# +# Unix 98 PTY support +# +# CONFIG_UNIX98_PTYS is not set +# CONFIG_PSMOUSE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_RTC is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_SH_SCI is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# I2C Algorithms +# + +# +# I2C Hardware Bus support +# + +# +# I2C Hardware Sensors Chip support +# +# CONFIG_I2C_SENSOR is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_FAT_FS is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_DEVFS_FS=y +CONFIG_DEVFS_MOUNT=y +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_TMPFS is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +# CONFIG_NLS is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# + +# +# Graphics support +# +CONFIG_FB=y +# CONFIG_FB_E1355 is not set +CONFIG_FB_HIT=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_6x11 is not set +CONFIG_FONT_PEARL_8x8=y +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB_GADGET is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_SH_STANDARD_BIOS is not set +# CONFIG_KGDB is not set +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC32 is not set diff -Nru a/arch/sh/defconfig b/arch/sh/defconfig --- a/arch/sh/defconfig Tue Feb 17 20:00:07 2004 +++ b/arch/sh/defconfig Tue Feb 17 20:00:07 2004 @@ -3,11 +3,33 @@ # CONFIG_SUPERH=y CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y # # Code maturity level options # # CONFIG_EXPERIMENTAL is not set +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +# CONFIG_SYSVIPC is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_SYSCTL is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # # Loadable module support @@ -15,44 +37,78 @@ # CONFIG_MODULES is not set # -# Processor type and features +# System type # # CONFIG_SH_SOLUTION_ENGINE is not set -# CONFIG_SH_OVERDRIVE is not set -# CONFIG_SH_HP600 is not set -# CONFIG_SH_UNKNOWN is not set +# CONFIG_SH_7751_SOLUTION_ENGINE is not set +# CONFIG_SH_7751_SYSTEMH is not set +# CONFIG_SH_STB1_HARP is not set +# CONFIG_SH_STB1_OVERDRIVE is not set +# CONFIG_SH_HP620 is not set +# CONFIG_SH_HP680 is not set +# CONFIG_SH_HP690 is not set +# CONFIG_SH_CQREEK is not set +# CONFIG_SH_DMIDA is not set +# CONFIG_SH_EC3104 is not set +# CONFIG_SH_SATURN is not set +# CONFIG_SH_DREAMCAST is not set +# CONFIG_SH_CAT68701 is not set +# CONFIG_SH_BIGSUR is not set +# CONFIG_SH_SH2000 is not set +# CONFIG_SH_ADX is not set +# CONFIG_SH_MPC1211 is not set +# CONFIG_SH_SECUREEDGE5410 is not set +CONFIG_SH_UNKNOWN=y +# CONFIG_CPU_SH2 is not set +CONFIG_CPU_SH3=y +# CONFIG_CPU_SH4 is not set +# CONFIG_CPU_SUBTYPE_SH7604 is not set +# CONFIG_CPU_SUBTYPE_SH7300 is not set # CONFIG_CPU_SUBTYPE_SH7707 is not set CONFIG_CPU_SUBTYPE_SH7708=y # CONFIG_CPU_SUBTYPE_SH7709 is not set # CONFIG_CPU_SUBTYPE_SH7750 is not set -CONFIG_CPU_SH3=y -# CONFIG_CPU_SH4 is not set +# CONFIG_CPU_SUBTYPE_SH7751 is not set +# CONFIG_CPU_SUBTYPE_SH7760 is not set +# CONFIG_CPU_SUBTYPE_ST40STB1 is not set +CONFIG_MMU=y +# CONFIG_CMDLINE_BOOL is not set +CONFIG_MEMORY_START=0x0c000000 +CONFIG_MEMORY_SIZE=0x00400000 +# CONFIG_MEMORY_OVERRIDE is not set +CONFIG_CF_ENABLER=y +# CONFIG_CF_AREA5 is not set +CONFIG_CF_AREA6=y +CONFIG_CF_BASE_ADDR=0xb8000000 +CONFIG_SH_RTC=y +CONFIG_SH_DSP=y +CONFIG_ZERO_PAGE_OFFSET=0x00001000 +CONFIG_BOOT_LINK_OFFSET=0x00800000 CONFIG_CPU_LITTLE_ENDIAN=y -CONFIG_MEMORY_START=0c000000 +# CONFIG_UBC_WAKEUP is not set +# CONFIG_SH_WRITETHROUGH is not set +# CONFIG_SH_OCRAM is not set +# CONFIG_SMP is not set +CONFIG_SH_PCLK_FREQ=1193182 +# CONFIG_CPU_FREQ is not set +# CONFIG_SH_DMA is not set # -# General setup +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) # -# CONFIG_ISA is not set -# CONFIG_SBUS is not set -# CONFIG_NET is not set -CONFIG_CF_ENABLER=y -# CONFIG_HD64461 is not set # CONFIG_PCI is not set # CONFIG_HOTPLUG is not set -# CONFIG_PCMCIA is not set -# CONFIG_SYSVIPC is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_SYSCTL is not set -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set + +# +# Executable file formats +# CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_FLAT is not set # CONFIG_BINFMT_MISC is not set # -# Parallel port support +# Generic Driver Options # -# CONFIG_PARPORT is not set # # Memory Technology Devices (MTD) @@ -60,63 +116,117 @@ # CONFIG_MTD is not set # +# Parallel port support +# +# CONFIG_PARPORT is not set + +# # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_CPQ_DA is not set -# CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_LVM is not set -# CONFIG_BLK_DEV_MD is not set -# CONFIG_MD_LINEAR is not set -# CONFIG_MD_RAID0 is not set -# CONFIG_MD_RAID1 is not set -# CONFIG_MD_RAID5 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # -# CONFIG_BLK_DEV_HD_IDE is not set -# CONFIG_BLK_DEV_HD is not set CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set -# CONFIG_BLK_DEV_IDECS is not set +# CONFIG_IDEDISK_STROKE is not set # CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes # -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -# CONFIG_BLK_DEV_ISAPNP is not set -# CONFIG_IDE_CHIPSETS is not set +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_IDEDMA is not set # CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set # +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Networking support +# +# CONFIG_NET is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# ISDN subsystem +# + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# # Character devices # # CONFIG_VT is not set @@ -125,69 +235,139 @@ CONFIG_SERIAL_CONSOLE=y # -# Unix 98 PTY support +# Unix98 PTY support # # CONFIG_UNIX98_PTYS is not set -# CONFIG_HEARTBEAT is not set +# CONFIG_PSMOUSE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_RTC is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_SH_SCI is not set + +# +# I2C support +# +# CONFIG_I2C is not set # # File systems # +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set # CONFIG_QUOTA is not set # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_ADFS_FS_RW is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_FAT_FS is not set -# CONFIG_MSDOS_FS is not set -# CONFIG_UMSDOS_FS is not set -# CONFIG_VFAT_FS is not set -# CONFIG_EFS_FS is not set -# CONFIG_JFFS_FS is not set -# CONFIG_CRAMFS is not set -# CONFIG_RAMFS is not set + +# +# CD-ROM/DVD Filesystems +# # CONFIG_ISO9660_FS is not set -# CONFIG_JOLIET is not set -# CONFIG_MINIX_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_FAT_FS is not set # CONFIG_NTFS_FS is not set -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_RW is not set -# CONFIG_HPFS_FS is not set + +# +# Pseudo filesystems +# CONFIG_PROC_FS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set -# CONFIG_DEVPTS_FS is not set +CONFIG_PROC_KCORE=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set -# CONFIG_QNX4FS_RW is not set -# CONFIG_ROMFS_FS is not set -CONFIG_EXT2_FS=y # CONFIG_SYSV_FS is not set -# CONFIG_SYSV_FS_WRITE is not set -# CONFIG_UDF_FS is not set -# CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set -# CONFIG_UFS_FS_WRITE is not set -# CONFIG_NCPFS_NLS is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# # CONFIG_NLS is not set # +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# + +# +# Graphics support +# +# CONFIG_FB is not set + +# # Sound # # CONFIG_SOUND is not set # +# USB support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# # Kernel hacking # # CONFIG_MAGIC_SYSRQ is not set +# CONFIG_DEBUG_SPINLOCK is not set CONFIG_SH_STANDARD_BIOS=y CONFIG_SH_EARLY_PRINTK=y +# CONFIG_KGDB is not set +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC32 is not set diff -Nru a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c --- a/arch/sh/kernel/cpu/init.c Tue Feb 17 20:00:14 2004 +++ b/arch/sh/kernel/cpu/init.c Tue Feb 17 20:00:14 2004 @@ -180,7 +180,7 @@ if (fpu_disabled) { printk("FPU Disabled\n"); cpu_data->flags &= ~CPU_HAS_FPU; - release_fpu(); + disable_fpu(); } /* FPU initialization */ diff -Nru a/arch/sh/kernel/cpu/rtc.c b/arch/sh/kernel/cpu/rtc.c --- a/arch/sh/kernel/cpu/rtc.c Tue Feb 17 20:00:07 2004 +++ b/arch/sh/kernel/cpu/rtc.c Tue Feb 17 20:00:07 2004 @@ -23,10 +23,12 @@ void sh_rtc_gettimeofday(struct timespec *ts) { - unsigned int sec128, sec, min, hr, wk, day, mon, yr, yr100; + unsigned int sec128, sec, sec2, min, hr, wk, day, mon, yr, yr100, cf_bit; + unsigned long flags; again: do { + local_irq_save(flags); ctrl_outb(0, RCR1); /* Clear CF-bit */ sec128 = ctrl_inb(R64CNT); sec = ctrl_inb(RSECCNT); @@ -43,15 +45,10 @@ yr = ctrl_inb(RYRCNT); yr100 = (yr == 0x99) ? 0x19 : 0x20; #endif - } while ((ctrl_inb(RCR1) & RCR1_CF) != 0); - -#if RTC_BIT_INVERTED != 0 - /* Work around to avoid reading incorrect value. */ - if (sec128 == RTC_BIT_INVERTED) { - schedule_timeout(1); - goto again; - } -#endif + sec2 = ctrl_inb(R64CNT); + cf_bit = ctrl_inb(RCR1) & RCR1_CF; + local_irq_restore(flags); + } while (cf_bit != 0 || ((sec128 ^ sec2) & RTC_BIT_INVERTED) != 0); BCD_TO_BIN(yr100); BCD_TO_BIN(yr); @@ -65,6 +62,7 @@ hr > 23 || min > 59 || sec > 59) { printk(KERN_ERR "SH RTC: invalid value, resetting to 1 Jan 2000\n"); + local_irq_save(flags); ctrl_outb(RCR2_RESET, RCR2); /* Reset & Stop */ ctrl_outb(0, RSECCNT); ctrl_outb(0, RMINCNT); @@ -99,7 +97,9 @@ { int retval = 0; int real_seconds, real_minutes, cmos_minutes; + unsigned long flags; + local_irq_save(flags); ctrl_outb(RCR2_RESET, RCR2); /* Reset pre-scaler & stop RTC */ cmos_minutes = ctrl_inb(RMINCNT); @@ -130,6 +130,7 @@ } ctrl_outb(RCR2_RTCEN|RCR2_START, RCR2); /* Start RTC */ + local_irq_restore(flags); return retval; } diff -Nru a/arch/sh/kernel/cpu/sh4/fpu.c b/arch/sh/kernel/cpu/sh4/fpu.c --- a/arch/sh/kernel/cpu/sh4/fpu.c Tue Feb 17 20:00:06 2004 +++ b/arch/sh/kernel/cpu/sh4/fpu.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,4 @@ -/* $Id: fpu.c,v 1.3 2003/09/23 23:15:44 lethal Exp $ +/* $Id: fpu.c,v 1.4 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/kernel/fpu.c * @@ -31,11 +31,15 @@ * Assume called with FPU enabled (SR.FD=0). */ void -save_fpu(struct task_struct *tsk) +save_fpu(struct task_struct *tsk, struct pt_regs *regs) { + unsigned long dummy; + + clear_tsk_thread_flag(tsk, TIF_USEDFPU); + enable_fpu(); asm volatile("sts.l fpul, @-%0\n\t" "sts.l fpscr, @-%0\n\t" - "lds %1, fpscr\n\t" + "lds %2, fpscr\n\t" "frchg\n\t" "fmov.s fr15, @-%0\n\t" "fmov.s fr14, @-%0\n\t" @@ -70,21 +74,24 @@ "fmov.s fr2, @-%0\n\t" "fmov.s fr1, @-%0\n\t" "fmov.s fr0, @-%0\n\t" - "lds %2, fpscr\n\t" - : /* no output */ - : "r" ((char *)(&tsk->thread.fpu.hard.status)), + "lds %3, fpscr\n\t" + : "=r" (dummy) + : "0" ((char *)(&tsk->thread.fpu.hard.status)), "r" (FPSCR_RCHG), "r" (FPSCR_INIT) : "memory"); - clear_tsk_thread_flag(tsk, TIF_USEDFPU); - release_fpu(); + disable_fpu(); + release_fpu(regs); } static void restore_fpu(struct task_struct *tsk) { - asm volatile("lds %1, fpscr\n\t" + unsigned long dummy; + + enable_fpu(); + asm volatile("lds %2, fpscr\n\t" "fmov.s @%0+, fr0\n\t" "fmov.s @%0+, fr1\n\t" "fmov.s @%0+, fr2\n\t" @@ -121,9 +128,10 @@ "frchg\n\t" "lds.l @%0+, fpscr\n\t" "lds.l @%0+, fpul\n\t" - : /* no output */ - : "r" (&tsk->thread.fpu), "r" (FPSCR_RCHG) + : "=r" (dummy) + : "0" (&tsk->thread.fpu), "r" (FPSCR_RCHG) : "memory"); + disable_fpu(); } /* @@ -135,6 +143,7 @@ static void fpu_init(void) { + enable_fpu(); asm volatile("lds %0, fpul\n\t" "lds %1, fpscr\n\t" "fsts fpul, fr0\n\t" @@ -174,6 +183,7 @@ "lds %2, fpscr\n\t" : /* no output */ : "r" (0), "r" (FPSCR_RCHG), "r" (FPSCR_INIT)); + disable_fpu(); } /** @@ -262,14 +272,14 @@ if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ struct task_struct *tsk = current; - save_fpu(tsk); + save_fpu(tsk, regs); if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) { /* FPU error */ denormal_to_double (&tsk->thread.fpu.hard, (finsn >> 8) & 0xf); tsk->thread.fpu.hard.fpscr &= ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); - grab_fpu(); + grab_fpu(regs); restore_fpu(tsk); set_tsk_thread_flag(tsk, TIF_USEDFPU); } else { @@ -295,7 +305,7 @@ return; regs.pc += 2; - save_fpu(tsk); + save_fpu(tsk, ®s); tsk->thread.trap_no = 11; tsk->thread.error_code = 0; force_sig(SIGFPE, tsk); @@ -307,7 +317,7 @@ { struct task_struct *tsk = current; - grab_fpu(); + grab_fpu(®s); if (!user_mode(®s)) { printk(KERN_ERR "BUG: FPU is used in kernel mode.\n"); return; diff -Nru a/arch/sh/kernel/entry.S b/arch/sh/kernel/entry.S --- a/arch/sh/kernel/entry.S Tue Feb 17 20:00:06 2004 +++ b/arch/sh/kernel/entry.S Tue Feb 17 20:00:06 2004 @@ -1,4 +1,4 @@ -/* $Id: entry.S,v 1.33 2003/11/22 15:39:51 lethal Exp $ +/* $Id: entry.S,v 1.34 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/entry.S * @@ -351,18 +351,22 @@ GET_THREAD_INFO(r8) #ifdef CONFIG_PREEMPT + bra resume_userspace + nop ENTRY(resume_kernel) mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count tst r0, r0 - bf restore_all + bf noresched need_resched: mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags tst #_TIF_NEED_RESCHED, r0 ! need_resched set? - bt restore_all + bt noresched - stc sr, r0 ! interrupts disabled? - tst #0xf0, r0 - bf restore_all + mov #OFF_SR, r0 + mov.l @(r0,r15), r0 ! get status register + and #0xf0, r0 ! interrupts off (exception path)? + cmp/eq #0xf0, r0 + bt noresched mov.l 1f, r0 mov.l r0, @(TI_PRE_COUNT,r8) @@ -375,7 +379,10 @@ mov.l r0, @(TI_PRE_COUNT,r8) CLI() - bra need_resched + bra need_resched + nop +noresched: + bra restore_all nop .align 2 @@ -525,7 +532,7 @@ ! Is the trap argument >= 0x20? (TRA will be >= 0x80) mov #0x7f, r9 cmp/hi r9, r8 - bt/s debug_trap + bt/s 0f mov #OFF_TRA, r9 add r15, r9 ! @@ -543,6 +550,10 @@ bra resume_userspace mov.l r0, @(OFF_R0,r15) ! Return value ! +0: + bra debug_trap + nop + ! good_system_call: ! Good syscall number mov.l @(TI_FLAGS,r8), r8 mov #_TIF_SYSCALL_TRACE, r10 @@ -632,12 +643,8 @@ ! ! Calculate new SR value mov k3, k2 ! original SR value - mov.l 8f, k1 - stc sr, k0 - and k1, k0 ! Get current FD-bit mov.l 9f, k1 and k1, k2 ! Mask orignal SR value - or k0, k2 ! Inherit current FD-bit ! mov k3, k0 ! Calculate IMASK-bits shlr2 k0 @@ -668,8 +675,7 @@ 4: .long do_syscall_trace 5: .long 0x00001000 ! DSP 7: .long 0x30000000 -8: .long 0x00008000 ! FD -9: .long 0xffff7f0f ! ~(IMASK+FD) +9: __INV_IMASK: .long 0xffffff0f ! ~(IMASK) @@ -838,7 +844,7 @@ .align 2 1: .long 0x00001000 ! DSP=1 -2: .long 0x000000f0 ! FD=0, IMASK=15 +2: .long 0x000080f0 ! FD=1, IMASK=15 3: .long 0xcfffffff ! RB=0, BL=0 4: .long exception_handling_table diff -Nru a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c --- a/arch/sh/kernel/irq.c Tue Feb 17 20:00:06 2004 +++ b/arch/sh/kernel/irq.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,4 @@ -/* $Id: irq.c,v 1.19 2004/01/10 01:25:32 lethal Exp $ +/* $Id: irq.c,v 1.20 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/kernel/irq.c * @@ -318,6 +318,16 @@ irq_enter(); +#ifdef CONFIG_PREEMPT + /* + * At this point we're now about to actually call handlers, + * and interrupts might get reenabled during them... bump + * preempt_count to prevent any preemption while the handler + * called here is pending... + */ + preempt_disable(); +#endif + /* Get IRQ number */ asm volatile("stc r2_bank, %0\n\t" "shlr2 %0\n\t" @@ -392,6 +402,15 @@ spin_unlock(&desc->lock); irq_exit(); + +#ifdef CONFIG_PREEMPT + /* + * We're done with the handlers, interrupts should be + * currently disabled; decrement preempt_count now so + * as we return preemption may be allowed... + */ + preempt_enable_no_resched(); +#endif return 1; } diff -Nru a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c --- a/arch/sh/kernel/process.c Tue Feb 17 20:00:07 2004 +++ b/arch/sh/kernel/process.c Tue Feb 17 20:00:07 2004 @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.24 2003/11/28 23:05:43 kkojima Exp $ +/* $Id: process.c,v 1.25 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/kernel/process.c * @@ -174,9 +174,13 @@ { #if defined(CONFIG_CPU_SH4) struct task_struct *tsk = current; + struct pt_regs *regs = (struct pt_regs *) + ((unsigned long)tsk->thread_info + + THREAD_SIZE - sizeof(struct pt_regs) + - sizeof(unsigned long)); /* Forget lazy FPU state */ - clear_fpu(tsk); + clear_fpu(tsk, regs); tsk->used_math = 0; #endif } @@ -196,7 +200,7 @@ fpvalid = tsk->used_math; if (fpvalid) { - unlazy_fpu(tsk); + unlazy_fpu(tsk, regs); memcpy(fpu, &tsk->thread.fpu.hard, sizeof(*fpu)); } #endif @@ -212,7 +216,8 @@ struct pt_regs ptregs; ptregs = *(struct pt_regs *) - ((unsigned long)tsk->thread_info+THREAD_SIZE - sizeof(ptregs) + ((unsigned long)tsk->thread_info + THREAD_SIZE + - sizeof(struct pt_regs) #ifdef CONFIG_SH_DSP - sizeof(struct pt_dspregs) #endif @@ -230,7 +235,11 @@ #if defined(CONFIG_CPU_SH4) fpvalid = tsk->used_math; if (fpvalid) { - unlazy_fpu(tsk); + struct pt_regs *regs = (struct pt_regs *) + ((unsigned long)tsk->thread_info + + THREAD_SIZE - sizeof(struct pt_regs) + - sizeof(unsigned long)); + unlazy_fpu(tsk, regs); memcpy(fpu, &tsk->thread.fpu.hard, sizeof(*fpu)); } #endif @@ -257,13 +266,12 @@ if (user_mode(regs)) { childregs->regs[15] = usp; } else { - childregs->regs[15] = (unsigned long)p->thread_info+THREAD_SIZE; + childregs->regs[15] = (unsigned long)p->thread_info + THREAD_SIZE; } if (clone_flags & CLONE_SETTLS) { childregs->gbr = childregs->regs[0]; } childregs->regs[0] = 0; /* Set return value for child */ - childregs->sr |= SR_FD; /* Invalidate FPU flag */ p->set_child_tid = p->clear_child_tid = NULL; p->thread.sp = (unsigned long) childregs; @@ -275,7 +283,7 @@ { struct task_struct *tsk = current; - unlazy_fpu(tsk); + unlazy_fpu(tsk, regs); p->thread.fpu = tsk->thread.fpu; p->used_math = tsk->used_math; clear_ti_thread_flag(p->thread_info, TIF_USEDFPU); @@ -332,8 +340,39 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *next) { #if defined(CONFIG_CPU_SH4) - unlazy_fpu(prev); + struct pt_regs *regs = (struct pt_regs *) + ((unsigned long)prev->thread_info + + THREAD_SIZE - sizeof(struct pt_regs) + - sizeof(unsigned long)); + unlazy_fpu(prev, regs); #endif + +#ifdef CONFIG_PREEMPT + { + unsigned long flags; + struct pt_regs *regs; + + local_irq_save(flags); + regs = (struct pt_regs *) + ((unsigned long)prev->thread_info + + THREAD_SIZE - sizeof(struct pt_regs) +#ifdef CONFIG_SH_DSP + - sizeof(struct pt_dspregs) +#endif + - sizeof(unsigned long)); + if (user_mode(regs) && regs->regs[15] >= 0xc0000000) { + int offset = (int)regs->regs[15]; + + /* Reset stack pointer: clear critical region mark */ + regs->regs[15] = regs->regs[1]; + if (regs->pc < regs->regs[0]) + /* Go to rewind point */ + regs->pc = regs->regs[0] + offset; + } + local_irq_restore(flags); + } +#endif + /* * Restore the kernel mode register * k7 (r7_bank1) diff -Nru a/arch/sh/kernel/signal.c b/arch/sh/kernel/signal.c --- a/arch/sh/kernel/signal.c Tue Feb 17 20:00:14 2004 +++ b/arch/sh/kernel/signal.c Tue Feb 17 20:00:14 2004 @@ -1,4 +1,4 @@ -/* $Id: signal.c,v 1.19 2003/10/13 07:21:19 lethal Exp $ +/* $Id: signal.c,v 1.20 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/kernel/signal.c * @@ -168,7 +168,8 @@ sizeof(long)*(16*2+2)); } -static inline int save_sigcontext_fpu(struct sigcontext __user *sc) +static inline int save_sigcontext_fpu(struct sigcontext __user *sc, + struct pt_regs *regs) { struct task_struct *tsk = current; @@ -187,7 +188,7 @@ */ tsk->used_math = 0; - unlazy_fpu(tsk); + unlazy_fpu(tsk, regs); return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.fpu.hard, sizeof(long)*(16*2+2)); } @@ -218,7 +219,7 @@ struct task_struct *tsk = current; regs->sr |= SR_FD; /* Release FPU */ - clear_fpu(tsk); + clear_fpu(tsk, regs); tsk->used_math = 0; __get_user (owned_fp, &sc->sc_ownedfp); if (owned_fp) @@ -326,7 +327,7 @@ #undef COPY #ifdef CONFIG_CPU_SH4 - err |= save_sigcontext_fpu(sc); + err |= save_sigcontext_fpu(sc, regs); #endif /* non-iBCS2 extensions.. */ @@ -521,9 +522,13 @@ case -ERESTARTNOINTR: regs->pc -= 2; } -#ifndef CONFIG_PREEMPT } else { /* gUSA handling */ +#ifdef CONFIG_PREEMPT + unsigned long flags; + + local_irq_save(flags); +#endif if (regs->regs[15] >= 0xc0000000) { int offset = (int)regs->regs[15]; @@ -533,6 +538,8 @@ /* Go to rewind point #1 */ regs->pc = regs->regs[0] + offset - 2; } +#ifdef CONFIG_PREEMPT + local_irq_restore(flags); #endif } diff -Nru a/arch/sh/mm/cache-sh3.c b/arch/sh/mm/cache-sh3.c --- a/arch/sh/mm/cache-sh3.c Tue Feb 17 20:00:05 2004 +++ b/arch/sh/mm/cache-sh3.c Tue Feb 17 20:00:05 2004 @@ -1,4 +1,4 @@ -/* $Id: cache-sh3.c,v 1.7 2003/08/28 16:16:09 lethal Exp $ +/* $Id: cache-sh3.c,v 1.8 2004/02/01 16:26:27 lethal Exp $ * * linux/arch/sh/mm/cache-sh3.c * @@ -21,8 +21,7 @@ #include #include -static int __init -detect_cpu_and_cache_system(void) +int __init detect_cpu_and_cache_system(void) { unsigned long addr0, addr1, data0, data1, data2, data3; diff -Nru a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c --- a/arch/sh/mm/fault.c Tue Feb 17 20:00:06 2004 +++ b/arch/sh/mm/fault.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,4 @@ -/* $Id: fault.c,v 1.13 2003/08/11 11:44:50 lethal Exp $ +/* $Id: fault.c,v 1.14 2004/01/13 05:52:11 kkojima Exp $ * * linux/arch/sh/mm/fault.c * Copyright (C) 1999 Niibe Yutaka @@ -242,7 +242,12 @@ * So, we need to flush the entry by ourselves. */ - __flush_tlb_page(get_asid(), address&PAGE_MASK); + { + unsigned long flags; + local_irq_save(flags); + __flush_tlb_page(get_asid(), address&PAGE_MASK); + local_irq_restore(flags); + } #endif set_pte(pte, entry); diff -Nru a/arch/sparc/Kconfig b/arch/sparc/Kconfig --- a/arch/sparc/Kconfig Tue Feb 17 20:00:05 2004 +++ b/arch/sparc/Kconfig Tue Feb 17 20:00:05 2004 @@ -376,20 +376,7 @@ source "drivers/usb/Kconfig" -menu "Watchdog" - -config SOFT_WATCHDOG - tristate "Software watchdog" - help - A software monitoring watchdog. This will fail to reboot your system - from some situations that the hardware watchdog will recover - from. Equally it's a lot cheaper to install. - - To compile this driver as a module, choose M here: the - module will be called softdog. - -endmenu - +source "drivers/char/watchdog/Kconfig" menu "Kernel hacking" diff -Nru a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile --- a/arch/sparc/kernel/Makefile Tue Feb 17 20:00:08 2004 +++ b/arch/sparc/kernel/Makefile Tue Feb 17 20:00:08 2004 @@ -12,7 +12,7 @@ sys_sparc.o sunos_asm.o systbls.o \ time.o windows.o cpu.o devices.o sclow.o \ tadpole.o tick14.o ptrace.o sys_solaris.o \ - unaligned.o muldiv.o semaphore.o sparc_ksyms.o + unaligned.o muldiv.o semaphore.o obj-$(CONFIG_PCI) += pcic.o obj-$(CONFIG_SUN4) += sun4setup.o @@ -20,7 +20,7 @@ obj-$(CONFIG_SUN_AUXIO) += auxio.o obj-$(CONFIG_PCI) += ebus.o obj-$(CONFIG_SUN_PM) += apc.o pmc.o -obj-$(CONFIG_MODULES) += module.o +obj-$(CONFIG_MODULES) += module.o sparc_ksyms.o ifdef CONFIG_SUNOS_EMUL obj-y += sys_sunos.o sunos_ioctl.o diff -Nru a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c --- a/arch/sparc/kernel/irq.c Tue Feb 17 20:00:05 2004 +++ b/arch/sparc/kernel/irq.c Tue Feb 17 20:00:05 2004 @@ -52,6 +52,66 @@ /* Used to protect the IRQ action lists */ spinlock_t irq_action_lock = SPIN_LOCK_UNLOCKED; +#ifdef CONFIG_SMP +#define SMP_NOP2 "nop; nop;\n\t" +#define SMP_NOP3 "nop; nop; nop;\n\t" +#else +#define SMP_NOP2 +#define SMP_NOP3 +#endif /* SMP */ +unsigned long __local_irq_save(void) +{ + unsigned long retval; + unsigned long tmp; + + __asm__ __volatile__( + "rd %%psr, %0\n\t" + SMP_NOP3 /* Sun4m + Cypress + SMP bug */ + "or %0, %2, %1\n\t" + "wr %1, 0, %%psr\n\t" + "nop; nop; nop\n" + : "=&r" (retval), "=r" (tmp) + : "i" (PSR_PIL) + : "memory"); + + return retval; +} + +void local_irq_enable(void) +{ + unsigned long tmp; + + __asm__ __volatile__( + "rd %%psr, %0\n\t" + SMP_NOP3 /* Sun4m + Cypress + SMP bug */ + "andn %0, %1, %0\n\t" + "wr %0, 0, %%psr\n\t" + "nop; nop; nop\n" + : "=&r" (tmp) + : "i" (PSR_PIL) + : "memory"); +} + +void local_irq_restore(unsigned long old_psr) +{ + unsigned long tmp; + + __asm__ __volatile__( + "rd %%psr, %0\n\t" + "and %2, %1, %2\n\t" + SMP_NOP2 /* Sun4m + Cypress + SMP bug */ + "andn %0, %1, %0\n\t" + "wr %0, %2, %%psr\n\t" + "nop; nop; nop\n" + : "=&r" (tmp) + : "i" (PSR_PIL), "r" (old_psr) + : "memory"); +} + +EXPORT_SYMBOL(__local_irq_save); +EXPORT_SYMBOL(local_irq_enable); +EXPORT_SYMBOL(local_irq_restore); + /* * Dave Redman (djhr@tadpole.co.uk) * diff -Nru a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c --- a/arch/sparc/kernel/process.c Tue Feb 17 20:00:06 2004 +++ b/arch/sparc/kernel/process.c Tue Feb 17 20:00:06 2004 @@ -148,11 +148,12 @@ extern void (*prom_palette)(int); +/* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */ void machine_halt(void) { - sti(); + local_irq_enable(); mdelay(8); - cli(); + local_irq_disable(); if (!serial_console && prom_palette) prom_palette (1); prom_halt(); @@ -165,9 +166,9 @@ { char *p; - sti(); + local_irq_enable(); mdelay(8); - cli(); + local_irq_disable(); p = strchr (reboot_command, '\n'); if (p) *p = 0; diff -Nru a/arch/sparc/kernel/semaphore.c b/arch/sparc/kernel/semaphore.c --- a/arch/sparc/kernel/semaphore.c Tue Feb 17 20:00:08 2004 +++ b/arch/sparc/kernel/semaphore.c Tue Feb 17 20:00:08 2004 @@ -61,7 +61,7 @@ * Add "everybody else" into it. They aren't * playing, because we own the spinlock. */ - if (!atomic_add_negative(sleepers - 1, &sem->count)) { + if (!atomic24_add_negative(sleepers - 1, &sem->count)) { sem->sleepers = 0; break; } @@ -101,7 +101,7 @@ if (signal_pending(current)) { retval = -EINTR; sem->sleepers = 0; - atomic_add(sleepers, &sem->count); + atomic24_add(sleepers, &sem->count); break; } @@ -111,7 +111,7 @@ * "-1" is because we're still hoping to get * the lock. */ - if (!atomic_add_negative(sleepers - 1, &sem->count)) { + if (!atomic24_add_negative(sleepers - 1, &sem->count)) { sem->sleepers = 0; break; } @@ -146,7 +146,7 @@ * Add "everybody else" and us into it. They aren't * playing, because we own the spinlock. */ - if (!atomic_add_negative(sleepers, &sem->count)) + if (!atomic24_add_negative(sleepers, &sem->count)) wake_up(&sem->wait); spin_unlock_irqrestore(&semaphore_lock, flags); diff -Nru a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c --- a/arch/sparc/kernel/smp.c Tue Feb 17 20:00:06 2004 +++ b/arch/sparc/kernel/smp.c Tue Feb 17 20:00:06 2004 @@ -56,6 +56,9 @@ volatile int __cpu_number_map[NR_CPUS]; volatile int __cpu_logical_map[NR_CPUS]; cycles_t cacheflush_time = 0; /* XXX */ +spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] = { + [0 ... (ATOMIC_HASH_SIZE-1)] = SPIN_LOCK_UNLOCKED +}; /* The only guaranteed locking primitive available on all Sparc * processors is 'ldstub [%reg + immediate], %dest_reg' which atomically diff -Nru a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c --- a/arch/sparc/kernel/sparc_ksyms.c Tue Feb 17 20:00:05 2004 +++ b/arch/sparc/kernel/sparc_ksyms.c Tue Feb 17 20:00:05 2004 @@ -85,22 +85,38 @@ extern void dump_thread(struct pt_regs *, struct user *); +/* Private functions with odd calling conventions. */ +extern void ___atomic24_add(void); +extern void ___atomic24_sub(void); +extern void ___set_bit(void); +extern void ___clear_bit(void); +extern void ___change_bit(void); + /* One thing to note is that the way the symbols of the mul/div * support routines are named is a mess, they all start with * a '.' which makes it a bitch to export, here is the trick: */ -#define EXPORT_SYMBOL_DOT(sym) \ -extern int __sparc_dot_ ## sym (int) __asm__("." #sym); \ -const struct kernel_symbol __ksymtab___sparc_dot_##sym \ -__attribute__((section("__ksymtab"))) \ -= { (unsigned long)&__sparc_dot_##sym , "." #sym } - -#define EXPORT_SYMBOL_PRIVATE(sym) \ -extern int __sparc_priv_ ## sym (int) __asm__("__" #sym); \ -const struct kernel_symbol __export_priv_##sym \ -__attribute__((section("__ksymtab"))) = \ -{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym } +/* If the interface of any of these special functions does ever + * change in an incompatible way, you must modify this. + */ +#define DOT_PROTO(sym) extern int __dot_##sym(int, int) + +#ifdef __GENKSYMS__ +#define EXPORT_SYMBOL_DOT(sym) \ + DOT_PROTO(sym); \ + EXPORT_SYMBOL(__dot_ ## sym) +#else /* !__GENKSYMS__ */ +#define EXPORT_SYMBOL_DOT(sym) \ + DOT_PROTO(sym) __asm__("." # sym); \ + __CRC_SYMBOL(__dot_##sym, "") \ + static const char __kstrtab___dot_##sym[] \ + __attribute__((section("__ksymtab_strings"))) \ + = "." #sym; \ + static const struct kernel_symbol __ksymtab___dot_##sym \ + __attribute__((section("__ksymtab"))) \ + = { (unsigned long)&__dot_##sym, __kstrtab___dot_##sym } +#endif /* used by various drivers */ EXPORT_SYMBOL(sparc_cpu_model); @@ -131,22 +147,18 @@ EXPORT_SYMBOL(phys_base); /* Atomic operations. */ -EXPORT_SYMBOL_PRIVATE(_atomic_add); -EXPORT_SYMBOL_PRIVATE(_atomic_sub); +EXPORT_SYMBOL(___atomic24_add); +EXPORT_SYMBOL(___atomic24_sub); /* Bit operations. */ -EXPORT_SYMBOL_PRIVATE(_set_bit); -EXPORT_SYMBOL_PRIVATE(_clear_bit); -EXPORT_SYMBOL_PRIVATE(_change_bit); +EXPORT_SYMBOL(___set_bit); +EXPORT_SYMBOL(___clear_bit); +EXPORT_SYMBOL(___change_bit); #ifdef CONFIG_SMP /* IRQ implementation. */ EXPORT_SYMBOL(global_irq_holder); EXPORT_SYMBOL(synchronize_irq); -EXPORT_SYMBOL(__global_cli); -EXPORT_SYMBOL(__global_sti); -EXPORT_SYMBOL(__global_save_flags); -EXPORT_SYMBOL(__global_restore_flags); /* Misc SMP information */ EXPORT_SYMBOL(__cpu_number_map); diff -Nru a/arch/sparc/lib/atomic.S b/arch/sparc/lib/atomic.S --- a/arch/sparc/lib/atomic.S Tue Feb 17 20:00:07 2004 +++ b/arch/sparc/lib/atomic.S Tue Feb 17 20:00:07 2004 @@ -45,8 +45,8 @@ /* Read asm-sparc/atomic.h carefully to understand how this works for SMP. * Really, some things here for SMP are overly clever, go read the header. */ - .globl ___atomic_add -___atomic_add: + .globl ___atomic24_add +___atomic24_add: rd %psr, %g3 ! Keep the code small, old way was stupid nop; nop; nop; ! Let the bits set or %g3, PSR_PIL, %g7 ! Disable interrupts @@ -56,13 +56,13 @@ 1: ldstub [%g1 + 3], %g7 ! Spin on the byte lock for SMP. orcc %g7, 0x0, %g0 ! Did we get it? bne 1b ! Nope... - ld [%g1], %g7 ! Load locked atomic_t + ld [%g1], %g7 ! Load locked atomic24_t sra %g7, 8, %g7 ! Get signed 24-bit integer add %g7, %g2, %g2 ! Add in argument - sll %g2, 8, %g7 ! Transpose back to atomic_t + sll %g2, 8, %g7 ! Transpose back to atomic24_t st %g7, [%g1] ! Clever: This releases the lock as well. #else - ld [%g1], %g7 ! Load locked atomic_t + ld [%g1], %g7 ! Load locked atomic24_t add %g7, %g2, %g2 ! Add in argument st %g2, [%g1] ! Store it back #endif @@ -71,8 +71,8 @@ jmpl %o7, %g0 ! NOTE: not + 8, see callers in atomic.h mov %g4, %o7 ! Restore %o7 - .globl ___atomic_sub -___atomic_sub: + .globl ___atomic24_sub +___atomic24_sub: rd %psr, %g3 ! Keep the code small, old way was stupid nop; nop; nop; ! Let the bits set or %g3, PSR_PIL, %g7 ! Disable interrupts @@ -82,13 +82,13 @@ 1: ldstub [%g1 + 3], %g7 ! Spin on the byte lock for SMP. orcc %g7, 0x0, %g0 ! Did we get it? bne 1b ! Nope... - ld [%g1], %g7 ! Load locked atomic_t + ld [%g1], %g7 ! Load locked atomic24_t sra %g7, 8, %g7 ! Get signed 24-bit integer sub %g7, %g2, %g2 ! Subtract argument - sll %g2, 8, %g7 ! Transpose back to atomic_t + sll %g2, 8, %g7 ! Transpose back to atomic24_t st %g7, [%g1] ! Clever: This releases the lock as well #else - ld [%g1], %g7 ! Load locked atomic_t + ld [%g1], %g7 ! Load locked atomic24_t sub %g7, %g2, %g2 ! Subtract argument st %g2, [%g1] ! Store it back #endif diff -Nru a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig --- a/arch/sparc64/Kconfig Tue Feb 17 20:00:08 2004 +++ b/arch/sparc64/Kconfig Tue Feb 17 20:00:08 2004 @@ -639,20 +639,7 @@ source "drivers/usb/Kconfig" - -menu "Watchdog" - -config SOFT_WATCHDOG - tristate "Software watchdog" - help - A software monitoring watchdog. This will fail to reboot your system - from some situations that the hardware watchdog will recover - from. Equally it's a lot cheaper to install. - - To compile this driver as a module, choose M here: the - module will be called softdog. - -endmenu +source "drivers/char/watchdog/Kconfig" source "arch/sparc64/oprofile/Kconfig" diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig --- a/arch/sparc64/defconfig Tue Feb 17 20:00:06 2004 +++ b/arch/sparc64/defconfig Tue Feb 17 20:00:06 2004 @@ -242,7 +242,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y CONFIG_IDEDMA_ONLYDISK=y -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set CONFIG_BLK_DEV_ALI15X3=y diff -Nru a/arch/sparc64/kernel/head.S b/arch/sparc64/kernel/head.S --- a/arch/sparc64/kernel/head.S Tue Feb 17 20:00:06 2004 +++ b/arch/sparc64/kernel/head.S Tue Feb 17 20:00:06 2004 @@ -61,7 +61,7 @@ * 0x0202 : Supports kernel params string * 0x0201 : Supports reboot_command */ - .half 0x0300 /* HdrS version */ + .half 0x0300 /* HdrS version */ root_flags: .half 1 @@ -159,6 +159,21 @@ blu,pt %xcc, 1b add %l0, (1 << 3), %l0 + /* Search the small TLB. OBP never maps us like that but + * newer SILO can. + */ + clr %l0 + +1: ldxa [%l0] ASI_ITLB_TAG_READ, %g1 + membar #Sync + andn %g1, %l2, %g1 + cmp %g1, %g2 + be,pn %xcc, cheetah_got_tlbentry + nop + cmp %l0, (15 << 3) + blu,pt %xcc, 1b + add %l0, (1 << 3), %l0 + /* BUG() if we get here... */ ta 0x5 @@ -167,7 +182,8 @@ ldxa [%l0] ASI_ITLB_DATA_ACCESS, %g1 membar #Sync and %g1, %g3, %g1 - sub %g1, %g2, %g1 + set 0x5fff, %l0 + andn %g1, %l0, %g1 or %g5, %g1, %g5 /* Clear out any KERNBASE area entries. */ diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c --- a/arch/sparc64/kernel/sys_sparc32.c Tue Feb 17 20:00:07 2004 +++ b/arch/sparc64/kernel/sys_sparc32.c Tue Feb 17 20:00:07 2004 @@ -2713,6 +2713,9 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 *args) { +#ifndef CONFIG_SYSCTL + return -ENOSYS; +#else struct __sysctl_args32 tmp; int error; size_t oldlen, *oldlenp = NULL; @@ -2747,6 +2750,7 @@ copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); } return error; +#endif } extern long sys_lookup_dcookie(u64 cookie64, char *buf, size_t len); diff -Nru a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c --- a/arch/sparc64/kernel/traps.c Tue Feb 17 20:00:08 2004 +++ b/arch/sparc64/kernel/traps.c Tue Feb 17 20:00:08 2004 @@ -1739,6 +1739,11 @@ fp = ksp + STACK_BIAS; thread_base = (unsigned long) tp; + + printk("Call Trace:"); +#ifdef CONFIG_KALLSYMS + printk("\n"); +#endif do { /* Bogus frame pointer? */ if (fp < (thread_base + sizeof(struct thread_info)) || @@ -1746,10 +1751,13 @@ break; rw = (struct reg_window *)fp; pc = rw->ins[7]; - printk("[%016lx] ", pc); + printk(" [%016lx] ", pc); + print_symbol("%s\n", pc); fp = rw->ins[6] + STACK_BIAS; } while (++count < 16); +#ifndef CONFIG_KALLSYMS printk("\n"); +#endif } void show_trace_task(struct task_struct *tsk) @@ -1776,7 +1784,6 @@ extern void __show_regs(struct pt_regs * regs); extern void smp_report_regs(void); int count = 0; - struct reg_window *lastrw; /* Amuse the user. */ printk( @@ -1795,17 +1802,15 @@ /* Stop the back trace when we hit userland or we * find some badly aligned kernel stack. */ - lastrw = (struct reg_window *)current; while (rw && count++ < 30 && - rw >= lastrw && + (((unsigned long) rw) >= PAGE_OFFSET) && (char *) rw < ((char *) current) + sizeof (union thread_union) && !(((unsigned long) rw) & 0x7)) { printk("Caller[%016lx]", rw->ins[7]); - print_symbol(": %s\n", rw->ins[7]); + print_symbol(": %s", rw->ins[7]); printk("\n"); - lastrw = rw; rw = (struct reg_window *) (rw->ins[6] + STACK_BIAS); } diff -Nru a/arch/sparc64/lib/VIScopy.S b/arch/sparc64/lib/VIScopy.S --- a/arch/sparc64/lib/VIScopy.S Tue Feb 17 20:00:06 2004 +++ b/arch/sparc64/lib/VIScopy.S Tue Feb 17 20:00:06 2004 @@ -120,7 +120,6 @@ #define EXVIS2(x,y) EXVISN(x,y,2) #define EXVIS3(x,y) EXVISN(x,y,3) #define EXVIS4(x,y) EXVISN(x,y,4) -#define EXVIS5(x,y) EXVISN(x,y,5) #define FREG_FROB(f1, f2, f3, f4, f5, f6, f7, f8, f9) \ faligndata %f1, %f2, %f48; \ @@ -135,7 +134,7 @@ #define MAIN_LOOP_CHUNK(src, dest, fdest, fsrc, len, jmptgt) \ EXVIS(LDBLK [%src] ASIBLK, %fdest); \ ASI_SETDST_BLK \ - EXVIS2(STBLK %fsrc, [%dest] ASIBLK); \ + EXVIS(STBLK %fsrc, [%dest] ASIBLK); \ add %src, 0x40, %src; \ subcc %len, 0x40, %len; \ be,pn %xcc, jmptgt; \ @@ -156,14 +155,14 @@ #ifdef __KERNEL__ #define STORE_JUMP(dest, fsrc, target) \ srl asi_dest, 3, %g5; \ - EXVIS3(STBLK %fsrc, [%dest] ASIBLK); \ + EXVIS2(STBLK %fsrc, [%dest] ASIBLK); \ xor asi_dest, ASI_BLK_XOR1, asi_dest;\ add %dest, 0x40, %dest; \ xor asi_dest, %g5, asi_dest; \ ba,pt %xcc, target; #else #define STORE_JUMP(dest, fsrc, target) \ - EXVIS3(STBLK %fsrc, [%dest] ASIBLK); \ + EXVIS2(STBLK %fsrc, [%dest] ASIBLK); \ add %dest, 0x40, %dest; \ ba,pt %xcc, target; #endif @@ -182,7 +181,7 @@ subcc %left, 8, %left; \ bl,pn %xcc, vis_out; \ faligndata %f0, %f1, %f48; \ - EXVIS4(STDF %f48, [%dest] ASINORMAL); \ + EXVIS3(STDF %f48, [%dest] ASINORMAL); \ add %dest, 8, %dest; #define UNEVEN_VISCHUNK_LAST(dest, f0, f1, left) \ @@ -675,21 +674,21 @@ xor asi_src, %g5, asi_src ! IEU0 Group #endif vis_slk:ASI_SETSRC_NOBLK ! LSU Group - EXVIS4(LDDF [%o1] ASINORMAL, %f2) ! Load Group + EXVIS3(LDDF [%o1] ASINORMAL, %f2) ! Load Group add %o1, 8, %o1 ! IEU0 subcc %g3, 8, %g3 ! IEU1 ASI_SETDST_NOBLK ! LSU Group faligndata %f0, %f2, %f8 ! GRU Group - EXVIS5(STDF %f8, [%o0] ASINORMAL) ! Store + EXVIS4(STDF %f8, [%o0] ASINORMAL) ! Store bl,pn %xcc, vis_out_slp ! CTI add %o0, 8, %o0 ! IEU0 Group ASI_SETSRC_NOBLK ! LSU Group - EXVIS4(LDDF [%o1] ASINORMAL, %f0) ! Load Group + EXVIS3(LDDF [%o1] ASINORMAL, %f0) ! Load Group add %o1, 8, %o1 ! IEU0 subcc %g3, 8, %g3 ! IEU1 ASI_SETDST_NOBLK ! LSU Group faligndata %f2, %f0, %f8 ! GRU Group - EXVIS5(STDF %f8, [%o0] ASINORMAL) ! Store + EXVIS4(STDF %f8, [%o0] ASINORMAL) ! Store bge,pt %xcc, vis_slk ! CTI add %o0, 8, %o0 ! IEU0 Group vis_out_slp: @@ -1138,19 +1137,17 @@ sub %g7, %g2, %g7 ba,pt %xcc, VIScopyfixup_ret add %g7, %o2, %o1 -VIScopyfixup_vis3: - sub %o2, 0x80, %o2 VIScopyfixup_vis2: - add %o2, 0x40, %o2 + sub %o2, 0x40, %o2 VIScopyfixup_vis0: add %o2, 0x80, %o2 VIScopyfixup_vis1: add %g7, %g3, %g7 ba,pt %xcc, VIScopyfixup_ret add %o2, %g7, %o1 -VIScopyfixup_vis5: - add %g3, 8, %g3 VIScopyfixup_vis4: + add %g3, 8, %g3 +VIScopyfixup_vis3: add %g3, 8, %g3 ba,pt %xcc, VIScopyfixup_ret add %o2, %g3, %o1 diff -Nru a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c --- a/arch/um/kernel/um_arch.c Tue Feb 17 20:00:07 2004 +++ b/arch/um/kernel/um_arch.c Tue Feb 17 20:00:07 2004 @@ -376,7 +376,7 @@ static int panic_exit(struct notifier_block *self, unsigned long unused1, void *unused2) { -#ifdef CONFIG_SYSRQ +#ifdef CONFIG_MAGIC_SYSRQ handle_sysrq('p', ¤t->thread.regs, NULL, NULL); #endif machine_halt(); diff -Nru a/arch/v850/kernel/bug.c b/arch/v850/kernel/bug.c --- a/arch/v850/kernel/bug.c Tue Feb 17 20:00:07 2004 +++ b/arch/v850/kernel/bug.c Tue Feb 17 20:00:07 2004 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include diff -Nru a/arch/v850/kernel/setup.c b/arch/v850/kernel/setup.c --- a/arch/v850/kernel/setup.c Tue Feb 17 20:00:06 2004 +++ b/arch/v850/kernel/setup.c Tue Feb 17 20:00:06 2004 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/setup.c -- Arch-dependent initialization functions * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -13,6 +13,7 @@ #include #include +#include /* we don't have swap, but for nr_free_pages */ #include #include #include diff -Nru a/arch/v850/kernel/v850e_cache.c b/arch/v850/kernel/v850e_cache.c --- a/arch/v850/kernel/v850e_cache.c Tue Feb 17 20:00:07 2004 +++ b/arch/v850/kernel/v850e_cache.c Tue Feb 17 20:00:07 2004 @@ -17,6 +17,7 @@ implementation. */ #include +#include #include #define WAIT_UNTIL_CLEAR(value) while (value) {} diff -Nru a/arch/x86_64/defconfig b/arch/x86_64/defconfig --- a/arch/x86_64/defconfig Tue Feb 17 20:00:07 2004 +++ b/arch/x86_64/defconfig Tue Feb 17 20:00:07 2004 @@ -191,7 +191,6 @@ # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_IDEDMA_PCI_WIP is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set diff -Nru a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c --- a/arch/x86_64/ia32/sys_ia32.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/ia32/sys_ia32.c Tue Feb 17 20:00:06 2004 @@ -274,13 +274,16 @@ return -EINVAL; if (act) { + compat_uptr_t handler, restorer; + if (verify_area(VERIFY_READ, act, sizeof(*act)) || - __get_user((long)new_ka.sa.sa_handler, &act->sa_handler) || + __get_user(handler, &act->sa_handler) || __get_user(new_ka.sa.sa_flags, &act->sa_flags) || - __get_user((long)new_ka.sa.sa_restorer, &act->sa_restorer)|| + __get_user(restorer, &act->sa_restorer)|| __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t))) return -EFAULT; - + new_ka.sa.sa_handler = compat_ptr(handler); + new_ka.sa.sa_restorer = compat_ptr(restorer); /* FIXME: here we rely on _COMPAT_NSIG_WORS to be >= than _NSIG_WORDS << 1 */ switch (_NSIG_WORDS) { case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] @@ -331,13 +334,18 @@ if (act) { compat_old_sigset_t mask; + compat_uptr_t handler, restorer; if (verify_area(VERIFY_READ, act, sizeof(*act)) || - __get_user((long)new_ka.sa.sa_handler, &act->sa_handler) || + __get_user(handler, &act->sa_handler) || __get_user(new_ka.sa.sa_flags, &act->sa_flags) || - __get_user((long)new_ka.sa.sa_restorer, &act->sa_restorer) || + __get_user(restorer, &act->sa_restorer) || __get_user(mask, &act->sa_mask)) return -EFAULT; + + new_ka.sa.sa_handler = compat_ptr(handler); + new_ka.sa.sa_restorer = compat_ptr(restorer); + siginitset(&new_ka.sa.sa_mask, mask); } @@ -525,7 +533,7 @@ put_user(reclen, &dirent->d_reclen); copy_to_user(dirent->d_name, name, namlen); put_user(0, dirent->d_name + namlen); - ((char *) dirent) += reclen; + dirent = ((void *)dirent) + reclen; buf->current_dir = dirent; buf->count -= reclen; return 0; diff -Nru a/arch/x86_64/kernel/acpi/boot.c b/arch/x86_64/kernel/acpi/boot.c --- a/arch/x86_64/kernel/acpi/boot.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/kernel/acpi/boot.c Tue Feb 17 20:00:06 2004 @@ -51,8 +51,8 @@ int acpi_noirq __initdata = 0; /* skip ACPI IRQ initialization */ int acpi_ht __initdata = 1; /* enable HT */ -int acpi_lapic = 0; -int acpi_ioapic = 0; +int acpi_lapic; +int acpi_ioapic; /* -------------------------------------------------------------------------- Boot-time Configuration @@ -120,6 +120,11 @@ acpi_table_print_madt_entry(header); + /* no utility in registering a disabled processor */ + if (processor->flags.enabled == 0) + return 0; + + mp_register_lapic ( processor->id, /* APIC ID */ processor->flags.enabled); /* Enabled? */ @@ -439,7 +444,7 @@ * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value). */ - result = acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing LAPIC address override entry\n"); return result; @@ -447,7 +452,8 @@ mp_register_lapic_address(acpi_lapic_addr); - result = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic, + MAX_APICS); if (!result) { printk(KERN_ERR PREFIX "No LAPIC entries present\n"); /* TBD: Cleanup to allow fallback to MPS */ @@ -459,7 +465,7 @@ return result; } - result = acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi); + result = acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); /* TBD: Cleanup to allow fallback to MPS */ @@ -496,8 +502,8 @@ return 1; } - result = acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic); - if (!result) { + result = acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic, MAX_IO_APICS); + if (!result) { printk(KERN_ERR PREFIX "No IOAPIC entries present\n"); return -ENODEV; } @@ -509,14 +515,15 @@ /* Build a default routing table for legacy (ISA) interrupts. */ mp_config_acpi_legacy_irqs(); - result = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr); + result = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, NR_IRQ_VECTORS); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); /* TBD: Cleanup to allow fallback to MPS */ return result; } - result = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src); + result = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, + NR_IRQ_VECTORS); if (result < 0) { printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); /* TBD: Cleanup to allow fallback to MPS */ diff -Nru a/arch/x86_64/kernel/aperture.c b/arch/x86_64/kernel/aperture.c --- a/arch/x86_64/kernel/aperture.c Tue Feb 17 20:00:07 2004 +++ b/arch/x86_64/kernel/aperture.c Tue Feb 17 20:00:07 2004 @@ -87,13 +87,15 @@ /* Find a PCI capability */ static __u32 __init find_cap(int num, int slot, int func, int cap) { + u8 pos; + int bytes; if (!(read_pci_config_16(num,slot,func,PCI_STATUS) & PCI_STATUS_CAP_LIST)) return 0; - u8 pos = read_pci_config_byte(num,slot,func,PCI_CAPABILITY_LIST); - int bytes; + pos = read_pci_config_byte(num,slot,func,PCI_CAPABILITY_LIST); for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) { + u8 id; pos &= ~3; - u8 id = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_ID); + id = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_ID); if (id == 0xff) break; if (id == cap) @@ -106,26 +108,31 @@ /* Read a standard AGPv3 bridge header */ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) { - printk("AGP bridge at %02x:%02x:%02x\n", num, slot, func); - u32 apsizereg = read_pci_config_16(num,slot,func, cap + 0x14); + u32 apsize; + u32 apsizereg; + int nbits; + u32 aper_low, aper_hi; + u64 aper; + printk("AGP bridge at %02x:%02x:%02x\n", num, slot, func); + apsizereg = read_pci_config_16(num,slot,func, cap + 0x14); if (apsizereg == 0xffffffff) { printk("APSIZE in AGP bridge unreadable\n"); return 0; } - u32 apsize = apsizereg & 0xfff; + apsize = apsizereg & 0xfff; /* Some BIOS use weird encodings not in the AGPv3 table. */ if (apsize & 0xff) apsize |= 0xf00; - int nbits = hweight16(apsize); + nbits = hweight16(apsize); *order = 7 - nbits; if ((int)*order < 0) /* < 32MB */ *order = 0; - u32 aper_low = read_pci_config(num,slot,func, 0x10); - u32 aper_hi = read_pci_config(num,slot,func,0x14); - u64 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); + aper_low = read_pci_config(num,slot,func, 0x10); + aper_hi = read_pci_config(num,slot,func,0x14); + aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); printk("Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n", aper, 32 << *order, apsizereg); @@ -155,6 +162,7 @@ for (slot = 0; slot < 32; slot++) { for (func = 0; func < 8; func++) { u32 class, cap; + u8 type; class = read_pci_config(num,slot,func, PCI_CLASS_REVISION); if (class == 0xffffffff) @@ -172,7 +180,7 @@ } /* No multi-function device? */ - u8 type = read_pci_config_byte(num,slot,func, + type = read_pci_config_byte(num,slot,func, PCI_HEADER_TYPE); if (!(type & 0x80)) break; diff -Nru a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S --- a/arch/x86_64/kernel/entry.S Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/kernel/entry.S Tue Feb 17 20:00:06 2004 @@ -436,7 +436,7 @@ popq %rdi cli subl $1,%gs:pda_irqcount -#ifdef CONFIG_KGDB +#ifdef CONFIG_DEBUG_INFO movq RBP(%rdi),%rbp #endif leaq ARGOFFSET(%rdi),%rsp diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c --- a/arch/x86_64/kernel/mpparse.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/kernel/mpparse.c Tue Feb 17 20:00:06 2004 @@ -487,7 +487,7 @@ /* * ACPI may be used to obtain the entire SMP configuration or just to - * enumerate/configure processors (CONFIG_ACPI_HT_ONLY). Note that + * enumerate/configure processors (CONFIG_ACPI_BOOT). Note that * ACPI supports both logical (e.g. Hyper-Threading) and physical * processors, where MPS only supports physical. */ @@ -787,7 +787,7 @@ * erroneously sets the trigger to level, resulting in a HUGE * increase of timer interrupts! */ - if ((bus_irq == 0) && (global_irq == 2) && (trigger == 3)) + if ((bus_irq == 0) && (trigger == 3)) trigger = 1; intsrc.mpc_type = MP_INTSRC; @@ -808,8 +808,8 @@ * Otherwise create a new entry (e.g. global_irq == 2). */ for (i = 0; i < mp_irq_entries; i++) { - if ((mp_irqs[i].mpc_dstapic == intsrc.mpc_dstapic) - && (mp_irqs[i].mpc_dstirq == intsrc.mpc_dstirq)) { + if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus) + && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) { mp_irqs[i] = intsrc; found = 1; break; @@ -855,9 +855,10 @@ */ for (i = 0; i < 16; i++) { - if (i == 2) continue; /* Don't connect IRQ2 */ + if (i == 2) + continue; /* Don't connect IRQ2 */ - intsrc.mpc_irqtype = i ? mp_INT : mp_ExtINT; /* 8259A to #0 */ + intsrc.mpc_irqtype = mp_INT; intsrc.mpc_srcbusirq = i; /* Identity mapped */ intsrc.mpc_dstirq = i; diff -Nru a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c --- a/arch/x86_64/kernel/nmi.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/kernel/nmi.c Tue Feb 17 20:00:06 2004 @@ -311,10 +311,10 @@ void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason) { + int sum, cpu = safe_smp_processor_id(); + if (nmi_watchdog_disabled) return; - - int sum, cpu = safe_smp_processor_id(); sum = read_pda(apic_timer_irqs); if (last_irq_sums[cpu] == sum) { diff -Nru a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c --- a/arch/x86_64/kernel/pci-gart.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/kernel/pci-gart.c Tue Feb 17 20:00:06 2004 @@ -117,11 +117,11 @@ static void free_iommu(unsigned long offset, int size) { + unsigned long flags; if (size == 1) { clear_bit(offset, iommu_gart_bitmap); return; } - unsigned long flags; spin_lock_irqsave(&iommu_bitmap_lock, flags); __clear_bit_string(iommu_gart_bitmap, offset, size); spin_unlock_irqrestore(&iommu_bitmap_lock, flags); @@ -329,6 +329,7 @@ { unsigned long npages = to_pages(phys_mem, size); unsigned long iommu_page = alloc_iommu(npages); + int i; if (iommu_page == -1) { if (!nonforced_iommu(dev, phys_mem, size)) return phys_mem; @@ -338,7 +339,6 @@ return bad_dma_address; } - int i; for (i = 0; i < npages; i++) { iommu_gatt_base[iommu_page + i] = GPTE_ENCODE(phys_mem); SET_LEAK(iommu_page + i); @@ -398,11 +398,11 @@ struct scatterlist *sout, unsigned long pages) { unsigned long iommu_start = alloc_iommu(pages); - if (iommu_start == -1) - return -1; - unsigned long iommu_page = iommu_start; int i; + + if (iommu_start == -1) + return -1; for (i = start; i < stopat; i++) { struct scatterlist *s = &sg[i]; @@ -519,12 +519,12 @@ { unsigned long iommu_page; int npages; + int i; if (dma_addr < iommu_bus_base + EMERGENCY_PAGES*PAGE_SIZE || - dma_addr > iommu_bus_base + iommu_size) + dma_addr >= iommu_bus_base + iommu_size) return; iommu_page = (dma_addr - iommu_bus_base)>>PAGE_SHIFT; npages = to_pages(dma_addr, size); - int i; for (i = 0; i < npages; i++) { iommu_gatt_base[iommu_page + i] = 0; CLEAR_LEAK(iommu_page + i); diff -Nru a/arch/x86_64/kernel/suspend_asm.S b/arch/x86_64/kernel/suspend_asm.S --- a/arch/x86_64/kernel/suspend_asm.S Tue Feb 17 20:00:08 2004 +++ b/arch/x86_64/kernel/suspend_asm.S Tue Feb 17 20:00:08 2004 @@ -122,4 +122,4 @@ .quad 0 loop2: .quad 0 - .previous \ No newline at end of file + .previous diff -Nru a/arch/x86_64/kernel/sys_x86_64.c b/arch/x86_64/kernel/sys_x86_64.c --- a/arch/x86_64/kernel/sys_x86_64.c Tue Feb 17 20:00:07 2004 +++ b/arch/x86_64/kernel/sys_x86_64.c Tue Feb 17 20:00:07 2004 @@ -105,7 +105,7 @@ return -ENOMEM; if (addr) { - addr = PAGE_ALIGN(addr); + addr = PAGE_ALIGN(addr); vma = find_vma(mm, addr); if (end - len >= addr && (!vma || addr + len <= vma->vm_start)) diff -Nru a/arch/x86_64/lib/csum-partial.c b/arch/x86_64/lib/csum-partial.c --- a/arch/x86_64/lib/csum-partial.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/lib/csum-partial.c Tue Feb 17 20:00:06 2004 @@ -56,6 +56,8 @@ } count >>= 1; /* nr of 32-bit words.. */ if (count) { + unsigned long zero; + unsigned count64; if (4 & (unsigned long) buff) { result += *(unsigned int *) buff; count--; @@ -65,8 +67,8 @@ count >>= 1; /* nr of 64-bit words.. */ /* main loop using 64byte blocks */ - unsigned long zero = 0; - unsigned count64 = count >> 3; + zero = 0; + count64 = count >> 3; while (count64) { asm("addq 0*8(%[src]),%[res]\n\t" "adcq 1*8(%[src]),%[res]\n\t" diff -Nru a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c --- a/arch/x86_64/mm/fault.c Tue Feb 17 20:00:05 2004 +++ b/arch/x86_64/mm/fault.c Tue Feb 17 20:00:05 2004 @@ -142,6 +142,10 @@ void dump_pagetable(unsigned long address) { pml4_t *pml4; + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + asm("movq %%cr3,%0" : "=r" (pml4)); pml4 = __va((unsigned long)pml4 & PHYSICAL_PAGE_MASK); @@ -150,17 +154,17 @@ if (bad_address(pml4)) goto bad; if (!pml4_present(*pml4)) goto ret; - pgd_t *pgd = __pgd_offset_k((pgd_t *)pml4_page(*pml4), address); + pgd = __pgd_offset_k((pgd_t *)pml4_page(*pml4), address); if (bad_address(pgd)) goto bad; printk("PGD %lx ", pgd_val(*pgd)); if (!pgd_present(*pgd)) goto ret; - pmd_t *pmd = pmd_offset(pgd, address); + pmd = pmd_offset(pgd, address); if (bad_address(pmd)) goto bad; printk("PMD %lx ", pmd_val(*pmd)); if (!pmd_present(*pmd)) goto ret; - pte_t *pte = pte_offset_kernel(pmd, address); + pte = pte_offset_kernel(pmd, address); if (bad_address(pte)) goto bad; printk("PTE %lx", pte_val(*pte)); ret: diff -Nru a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c --- a/arch/x86_64/mm/init.c Tue Feb 17 20:00:06 2004 +++ b/arch/x86_64/mm/init.c Tue Feb 17 20:00:06 2004 @@ -39,7 +39,7 @@ #define Dprintk(x...) -extern char _stext; +extern char _stext[]; DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); @@ -80,7 +80,7 @@ /* References to section boundaries */ -extern char _text, _etext, _edata, __bss_start, _end; +extern char _text, _etext, _edata, __bss_start, _end[]; extern char __init_begin, __init_end; int after_bootmem; @@ -442,7 +442,7 @@ kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START); - kclist_add(&kcore_kernel, &_stext, &_end - &_stext); + kclist_add(&kcore_kernel, &_stext, _end - _stext); kclist_add(&kcore_modules, (void *)MODULES_VADDR, MODULES_LEN); kclist_add(&kcore_vsyscall, (void *)VSYSCALL_START, VSYSCALL_END - VSYSCALL_START); diff -Nru a/crypto/sha256.c b/crypto/sha256.c --- a/crypto/sha256.c Tue Feb 17 20:00:06 2004 +++ b/crypto/sha256.c Tue Feb 17 20:00:06 2004 @@ -34,12 +34,12 @@ static inline u32 Ch(u32 x, u32 y, u32 z) { - return ((x & y) ^ (~x & z)); + return z ^ (x & (y ^ z)); } static inline u32 Maj(u32 x, u32 y, u32 z) { - return ((x & y) ^ (x & z) ^ (y & z)); + return (x & y) | (z & (x | y)); } static inline u32 RORu32(u32 x, u32 y) diff -Nru a/crypto/sha512.c b/crypto/sha512.c --- a/crypto/sha512.c Tue Feb 17 20:00:08 2004 +++ b/crypto/sha512.c Tue Feb 17 20:00:08 2004 @@ -34,12 +34,12 @@ static inline u64 Ch(u64 x, u64 y, u64 z) { - return ((x & y) ^ (~x & z)); + return z ^ (x & (y ^ z)); } static inline u64 Maj(u64 x, u64 y, u64 z) { - return ((x & y) ^ (x & z) ^ (y & z)); + return (x & y) | (z & (x | y)); } static inline u64 RORu64(u64 x, u64 y) @@ -249,7 +249,7 @@ { struct sha512_ctx *sctx = ctx; - const static u8 padding[128] = { 0x80, }; + static u8 padding[128] = { 0x80, }; u32 t; u64 t2; diff -Nru a/drivers/Kconfig b/drivers/Kconfig --- a/drivers/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/Kconfig Tue Feb 17 20:00:08 2004 @@ -26,6 +26,8 @@ source "drivers/message/i2o/Kconfig" +source "drivers/macintosh/Kconfig" + source "net/Kconfig" source "drivers/isdn/Kconfig" diff -Nru a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig --- a/drivers/acpi/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/acpi/Kconfig Tue Feb 17 20:00:08 2004 @@ -143,7 +143,7 @@ bool "NUMA support" depends on ACPI_INTERPRETER depends on NUMA - depends on !X86_64 + depends on IA64 default y if IA64_GENERIC || IA64_SGI_SN2 config ACPI_ASUS diff -Nru a/drivers/acpi/ac.c b/drivers/acpi/ac.c --- a/drivers/acpi/ac.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/ac.c Tue Feb 17 20:00:06 2004 @@ -246,8 +246,8 @@ memset(ac, 0, sizeof(struct acpi_ac)); ac->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_AC_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_AC_CLASS); + strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_AC_CLASS); acpi_driver_data(device) = ac; result = acpi_ac_get_state(ac); diff -Nru a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c --- a/drivers/acpi/asus_acpi.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/asus_acpi.c Tue Feb 17 20:00:06 2004 @@ -2,7 +2,7 @@ * asus_acpi.c - Asus Laptop ACPI Extras * * - * Copyright (C) 2002, 2003 Julien Lerouge, Karol Kozimor + * Copyright (C) 2002, 2003, 2004 Julien Lerouge, Karol Kozimor * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,16 +23,16 @@ * http://sourceforge.net/projects/acpi4asus/ * * Credits: + * Pontus Fuchs - Helper functions, cleanup * Johann Wiesner - Small compile fixes * John Belmonte - ACPI code for Toshiba laptop was a good starting point. * * TODO: * add Fn key status * Add mode selection on module loading (parameter) -> still necessary? - * Complete display switching -- may require dirty hacks? + * Complete display switching -- may require dirty hacks or calling _DOS? */ -#include #include #include #include @@ -41,12 +41,13 @@ #include #include -#define ASUS_ACPI_VERSION "0.26" +#define ASUS_ACPI_VERSION "0.27" #define PROC_ASUS "asus" //the directory #define PROC_MLED "mled" #define PROC_WLED "wled" -#define PROC_INFOS "info" +#define PROC_TLED "tled" +#define PROC_INFO "info" #define PROC_LCD "lcd" #define PROC_BRN "brn" #define PROC_DISP "disp" @@ -67,6 +68,7 @@ */ #define MLED_ON 0x01 //is MLED ON ? #define WLED_ON 0x02 +#define TLED_ON 0x04 MODULE_AUTHOR("Julien Lerouge, Karol Kozimor"); MODULE_DESCRIPTION(ACPI_HOTK_NAME); @@ -81,22 +83,25 @@ MODULE_PARM_DESC(gid, "GID for entries in /proc/acpi/asus.\n"); -/* For each model, all features implemented */ +/* For each model, all features implemented, + * those marked with R are relative to HOTK, A for absolute */ struct model_data { - char *name; //name of the laptop - char *mt_mled; //method to handle mled - char *mled_status; //node to handle mled reading - char *mt_wled; //method to handle wled - char *wled_status; //node to handle wled reading - char *mt_lcd_switch; //method to turn LCD ON/OFF - char *lcd_status; //node to read LCD panel state - char *brightness_up; //method to set brightness up - char *brightness_down; //guess what ? - char *brightness_set; //method to set absolute brightness - char *brightness_get; //method to get absolute brightness - char *brightness_status;//node to get brightness - char *display_set; //method to set video output - char *display_get; //method to get video output + char *name; //name of the laptop________________A + char *mt_mled; //method to handle mled_____________R + char *mled_status; //node to handle mled reading_______A + char *mt_wled; //method to handle wled_____________R + char *wled_status; //node to handle wled reading_______A + char *mt_tled; //method to handle tled_____________R + char *tled_status; //node to handle tled reading_______A + char *mt_lcd_switch; //method to turn LCD ON/OFF_________A + char *lcd_status; //node to read LCD panel state______A + char *brightness_up; //method to set brightness up_______A + char *brightness_down; //guess what ?______________________A + char *brightness_set; //method to set absolute brightness_R + char *brightness_get; //method to get absolute brightness_R + char *brightness_status; //node to get brightness____________A + char *display_set; //method to set video output________R + char *display_get; //method to get video output________R }; /* @@ -104,91 +109,239 @@ * about the hotk device */ struct asus_hotk { - struct acpi_device *device; //the device we are in - acpi_handle handle; //the handle of the hotk device - char status; //status of the hotk, for LEDs, ... - struct model_data *methods; //methods available on the laptop - u8 brightness; //brighness level + struct acpi_device *device; //the device we are in + acpi_handle handle; //the handle of the hotk device + char status; //status of the hotk, for LEDs, ... + struct model_data *methods; //methods available on the laptop + u8 brightness; //brightness level enum { - A1X=0, //A1340D, A1300F - A2X, //A2500H - D1X, //D1 - L1X, //L1400B - L2X, //L2000D -> TODO check Q11 (Fn+F8) - // Calling this method simply hangs the - // computer, ISMI method hangs the laptop. - L3D, //L3400D - L3X, //L3C - L5X, //L5C TODO this model seems to have one more - // LED, add support - M2X, //M2400E - M3N, //M3700N, but also S1300N -> TODO WLED - S1X, //S1300A -> TODO special keys do not work ? - S2X, //S200 (J1 reported), Victor MP-XP7210 - //TODO A1370D does not seem to have an ATK device - // L8400 model doesn't have ATK + A1x = 0, //A1340D, A1300F + A2x, //A2500H + D1x, //D1 + L2D, //L2000D + L3C, //L3800C + L3D, //L3400D + L3H, //L3H, but also L2000E + L5x, //L5800C + L8L, //L8400L + M1A, //M1300A + M2E, //M2400E + S1x, //S1300A, but also L1400B and M2400A (L84F) + S2x, //S200 (J1 reported), Victor MP-XP7210 + //TODO A1370D does not seem to have an ATK device + // L8400 model doesn't have ATK + xxN, //M2400N, M3700N, S1300N (Centrino) END_MODEL - } model; //Models currently supported - u16 event_count[128]; //count for each event TODO make this better + } model; //Models currently supported + u16 event_count[128]; //count for each event TODO make this better }; /* Here we go */ -#define L3X_PREFIX "\\_SB.PCI0.PX40.ECD0." -#define S1X_PREFIX "\\_SB.PCI0.PX40." -#define L1X_PREFIX S1X_PREFIX -#define A1X_PREFIX "\\_SB.PCI0.ISA.EC0." -#define S2X_PREFIX A1X_PREFIX -#define M3N_PREFIX "\\_SB.PCI0.SBRG.EC0." +#define A1x_PREFIX "\\_SB.PCI0.ISA.EC0." +#define L3C_PREFIX "\\_SB.PCI0.PX40.ECD0." +#define M1A_PREFIX "\\_SB.PCI0.PX40.EC0." +#define S1x_PREFIX "\\_SB.PCI0.PX40." +#define S2x_PREFIX A1x_PREFIX +#define xxN_PREFIX "\\_SB.PCI0.SBRG.EC0." static struct model_data model_conf[END_MODEL] = { /* - * name| mled |mled read| wled |wled read| lcd sw |lcd read | - * br up|br down | br set | br read | br status|set disp | get disp - * - * br set and read shall be in hotk device ! - * same for set disp + * Those pathnames are relative to the HOTK / ATKD device : + * - mt_mled + * - mt_wled + * - brightness_set + * - brightness_get + * - display_set + * - display_get * * TODO I have seen a SWBX and AIBX method on some models, like L1400B, * it seems to be a kind of switch, but what for ? * */ - {"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI", - A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL}, - - {"A2X", "MLED", NULL, "WLED", "\\SG66", "\\Q10", "\\BAOF", - "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\CMOD", "SDSP", "\\INFB"}, - - {"D1X", "MLED", NULL, NULL, NULL, "\\Q0D", "\\GP11", - "\\Q0C", "\\Q0B", NULL, NULL, "\\BLVL", "SDSP","\\INFB"}, - {"L1X", "MLED", NULL, "WLED", NULL, L1X_PREFIX "Q10", "\\PNOF", - L1X_PREFIX "Q0F", L1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, - - {"L2X", "MLED", "\\SGP6", "WLED", "\\RCP3", "\\Q10", "\\SGP0", - "\\Q0E", "\\Q0F", NULL, NULL, NULL, "SDSP", "\\INFB"}, - - {"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG", - "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"}, - - {"L3X", "MLED", NULL, "WLED", NULL, L3X_PREFIX "_Q10", "\\GL32", - L3X_PREFIX "_Q0F", L3X_PREFIX "_Q0E", "SPLV", "GPLV", "\\BLVL", "SDSP", - "\\_SB.PCI0.PCI1.VGAC.NMAP"}, - - {"L5X", "MLED", NULL, "WLED", "WRED", "\\Q0D", "\\BAOF", - "\\Q0C","\\Q0B", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"}, - - {"M2X", "MLED", NULL, "WLED", NULL, "\\Q10", "\\GP06", - "\\Q0E","\\Q0F", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"}, - - {"M3N", "MLED", NULL, "WLED", "\\PO33", M3N_PREFIX "_Q10", "\\BKLT", - M3N_PREFIX "_Q0F", M3N_PREFIX "_Q0E", "SPLV", "GPLV", "\\LBTN", "SDSP", - "\\ADVG"}, - - {"S1X", "MLED", "\\EMLE", "WLED", NULL, S1X_PREFIX "Q10", "\\PNOF", - S1X_PREFIX "Q0F", S1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, - - {"S2X", "MLED", "\\MAIL", NULL, NULL, S2X_PREFIX "_Q10", "\\BKLI", - S2X_PREFIX "_Q0B", S2X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL} + { + .name = "A1x", + .mt_mled = "MLED", + .mled_status = "\\MAIL", + .mt_lcd_switch = A1x_PREFIX "_Q10", + .lcd_status = "\\BKLI", + .brightness_up = A1x_PREFIX "_Q0E", + .brightness_down = A1x_PREFIX "_Q0F", + }, + + { + .name = "A2x", + .mt_mled = "MLED", + .mt_wled = "WLED", + .wled_status = "\\SG66", + .mt_lcd_switch = "\\Q10", + .lcd_status = "\\BAOF", + .brightness_up = "\\Q0E", + .brightness_down = "\\Q0F", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .brightness_status = "\\CMOD", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "D1x", + .mt_mled = "MLED", + .mt_lcd_switch = "\\Q0D", + .lcd_status = "\\GP11", + .brightness_up = "\\Q0C", + .brightness_down = "\\Q0B", + .brightness_status = "\\BLVL", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "L2D", + .mt_mled = "MLED", + .mled_status = "\\SGP6", + .mt_wled = "WLED", + .wled_status = "\\RCP3", + .mt_lcd_switch = "\\Q10", + .lcd_status = "\\SGP0", + .brightness_up = "\\Q0E", + .brightness_down = "\\Q0F", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "L3C", + .mt_mled = "MLED", + .mt_wled = "WLED", + .mt_lcd_switch = L3C_PREFIX "_Q10", + .lcd_status = "\\GL32", + .brightness_up = L3C_PREFIX "_Q0F", + .brightness_down = L3C_PREFIX "_Q0E", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .brightness_status = "\\BLVL", + .display_set = "SDSP", + .display_get = "\\_SB.PCI0.PCI1.VGAC.NMAP" + }, + + { + .name = "L3D", + .mt_mled = "MLED", + .mled_status = "\\MALD", + .mt_wled = "WLED", + .mt_lcd_switch = "\\Q10", + .lcd_status = "\\BKLG", + .brightness_up = "\\Q0E", + .brightness_down = "\\Q0F", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .brightness_status = "\\BLVL", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "L3H", + .mt_mled = "MLED", + .mt_wled = "WLED", + .mt_lcd_switch = "EHK", + .lcd_status = "\\_SB.PCI0.PM.PBC", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "L5x", + .mt_mled = "MLED", +// .mt_wled = "WLED", +// .wled_status = "\\WRED", +/* Present, but not controlled by ACPI */ + .mt_tled = "TLED", + .mt_lcd_switch = "\\Q0D", + .lcd_status = "\\BAOF", + .brightness_up = "\\Q0C", + .brightness_down = "\\Q0B", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "L8L" +/* No features, but at least support the hotkeys */ + }, + + { + .name = "M1A", + .mt_mled = "MLED", + .mt_lcd_switch = M1A_PREFIX "Q10", + .lcd_status = "\\PNOF", + .brightness_up = M1A_PREFIX "Q0E", + .brightness_down = M1A_PREFIX "Q0F", + .brightness_status = "\\BRIT", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "M2E", + .mt_mled = "MLED", + .mt_wled = "WLED", + .mt_lcd_switch = "\\Q10", + .lcd_status = "\\GP06", + .brightness_up = "\\Q0E", + .brightness_down = "\\Q0F", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .display_set = "SDSP", + .display_get = "\\INFB" + }, + + { + .name = "S1x", + .mt_mled = "MLED", + .mled_status = "\\EMLE", + .mt_wled = "WLED", + .mt_lcd_switch = S1x_PREFIX "Q10" , + .lcd_status = "\\PNOF", + .brightness_up = S1x_PREFIX "Q0F", + .brightness_down = S1x_PREFIX "Q0E", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .brightness_status = "\\BRIT", + }, + + { + .name = "S2x", + .mt_mled = "MLED", + .mled_status = "\\MAIL", + .mt_lcd_switch = S2x_PREFIX "_Q10", + .lcd_status = "\\BKLI", + .brightness_up = S2x_PREFIX "_Q0B", + .brightness_down = S2x_PREFIX "_Q0A", + }, + + { + .name = "xxN", + .mt_mled = "MLED", +// .mt_wled = "WLED", +// .wled_status = "\\PO33", +/* Present, but not controlled by ACPI */ + .mt_lcd_switch = xxN_PREFIX "_Q10", + .lcd_status = "\\BKLT", + .brightness_up = xxN_PREFIX "_Q0F", + .brightness_down = xxN_PREFIX "_Q0E", + .brightness_set = "SPLV", + .brightness_get = "GPLV", + .brightness_status = "\\LBTN", + .display_set = "SDSP", + .display_get = "\\ADVG" + } }; /* procdir we use */ @@ -264,7 +417,7 @@ void *data) { int len = 0; - int sfun; + int temp; struct asus_hotk *hotk = (struct asus_hotk *) data; char buf[16]; //enough for all info /* @@ -275,8 +428,23 @@ len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n"); len += sprintf(page + len, "Model reference : %s\n", hotk->methods->name); - if(read_acpi_int(hotk->handle, "SFUN", &sfun)) - len += sprintf(page + len, "SFUN value : 0x%04x\n", sfun); + /* + * The SFUN method probably allows the original driver to get the list + * of features supported by a given model. For now, 0x0100 or 0x0800 + * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card. + * The significance of others is yet to be found. + */ + if (read_acpi_int(hotk->handle, "SFUN", &temp)) + len += sprintf(page + len, "SFUN value : 0x%04x\n", temp); + /* + * Another value for userspace: the ASYM method returns 0x02 for + * battery low and 0x04 for battery critical, it's readings tend to be + * more accurate than those provided by _BST. + * Note: since not all the laptops provide this method, errors are + * silently ignored. + */ + if (read_acpi_int(hotk->handle, "ASYM", &temp)) + len += sprintf(page + len, "ASYM value : 0x%04x\n", temp); if (asus_info) { snprintf(buf, 16, "%d", asus_info->length); len += sprintf(page + len, "DSDT length : %s\n", buf); @@ -300,128 +468,179 @@ } -/* - * proc file handlers +/* + * /proc handlers + * We write our info in page, we begin at offset off and cannot write more + * than count bytes. We set eof to 1 if we handle those 2 values. We return the + * number of bytes written in page */ + +/* Generic LED functions */ static int -proc_read_mled(char *page, char **start, off_t off, int count, int *eof, - void *data) +read_led(struct asus_hotk *hotk, const char *ledname, int ledmask) { - int len = 0; - struct asus_hotk *hotk = (struct asus_hotk *) data; - int led_status = 0; - /* - * We use the easy way, we don't care of off and count, so we don't set eof - * to 1 - */ - if (hotk->methods->mled_status) { - if (read_acpi_int(NULL, hotk->methods->mled_status, - &led_status)) - len = sprintf(page, "%d\n", led_status); + if (ledname) { + int led_status; + + if (read_acpi_int(NULL, ledname, &led_status)) + return led_status; else - printk(KERN_WARNING "Asus ACPI: Error reading MLED " + printk(KERN_WARNING "Asus ACPI: Error reading LED " "status\n"); - } else { - len = sprintf(page, "%d\n", (hotk->status & MLED_ON) ? 1 : 0); } - - return len; + return (hotk->status & ledmask) ? 1 : 0; } +/* FIXME: kill extraneous args so it can be called independently */ static int -proc_write_mled(struct file *file, const char *buffer, - unsigned long count, void *data) +write_led(const char *buffer, unsigned long count, struct asus_hotk *hotk, + char *ledname, int ledmask, int invert) { int value; int led_out = 0; - struct asus_hotk *hotk = (struct asus_hotk *) data; - - - /* scan expression. Multiple expressions may be delimited with ; */ if (sscanf(buffer, "%i", &value) == 1) - led_out = ~value & 1; + led_out = value ? 1 : 0; hotk->status = - (value) ? (hotk->status | MLED_ON) : (hotk->status & ~MLED_ON); - - /* We don't have to check mt_mled exists if we are here :) */ - if (!write_acpi_int(hotk->handle, hotk->methods->mt_mled, led_out, - NULL)) - printk(KERN_WARNING "Asus ACPI: MLED write failed\n"); + (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask); + if (invert) /* invert target value */ + led_out = !led_out & 0x1; + if (!write_acpi_int(hotk->handle, ledname, led_out, NULL)) + printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n", ledname); return count; } + /* - * We write our info in page, we begin at offset off and cannot write more - * than count bytes. We set eof to 1 if we handle those 2 values. We return the - * number of bytes written in page + * Proc handlers for MLED */ static int -proc_read_wled(char *page, char **start, off_t off, int count, int *eof, +proc_read_mled(char *page, char **start, off_t off, int count, int *eof, void *data) { - int len = 0; struct asus_hotk *hotk = (struct asus_hotk *) data; - int led_status; + return sprintf(page, "%d\n", read_led(hotk, hotk->methods->mled_status, MLED_ON)); +} - if (hotk->methods->wled_status) { - if (read_acpi_int(NULL, hotk->methods->wled_status, - &led_status)) - len = sprintf(page, "%d\n", led_status); - else - printk(KERN_WARNING "Asus ACPI: Error reading WLED " - "status\n"); - } else { - len = sprintf(page, "%d\n", (hotk->status & WLED_ON) ? 1 : 0); - } - return len; +static int +proc_write_mled(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct asus_hotk *hotk = (struct asus_hotk *) data; + return write_led(buffer, count, hotk, hotk->methods->mt_mled, MLED_ON, 1); +} + +/* + * Proc handlers for WLED + */ +static int +proc_read_wled(char *page, char **start, off_t off, int count, int *eof, + void *data) +{ + struct asus_hotk *hotk = (struct asus_hotk *) data; + return sprintf(page, "%d\n", read_led(hotk, hotk->methods->wled_status, WLED_ON)); } static int proc_write_wled(struct file *file, const char *buffer, unsigned long count, void *data) { - int value; - int led_out = 0; struct asus_hotk *hotk = (struct asus_hotk *) data; + return write_led(buffer, count, hotk, hotk->methods->mt_wled, WLED_ON, 0); +} - /* scan expression. Multiple expressions may be delimited with ; */ - if (sscanf(buffer, "%i", &value) == 1) - led_out = value & 1; - - hotk->status = - (value) ? (hotk->status | WLED_ON) : (hotk->status & ~WLED_ON); - - /* We don't have to check if mt_wled exists if we are here :) */ - if (!write_acpi_int(hotk->handle, hotk->methods->mt_wled, led_out, - NULL)) - printk(KERN_WARNING "Asus ACPI: WLED write failed\n"); - +/* + * Proc handlers for TLED + */ +static int +proc_read_tled(char *page, char **start, off_t off, int count, int *eof, + void *data) +{ + struct asus_hotk *hotk = (struct asus_hotk *) data; + return sprintf(page, "%d\n", read_led(hotk, hotk->methods->tled_status, TLED_ON)); +} - return count; +static int +proc_write_tled(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct asus_hotk *hotk = (struct asus_hotk *) data; + return write_led(buffer, count, hotk, hotk->methods->mt_tled, TLED_ON, 0); } + static int get_lcd_state(struct asus_hotk *hotk) { int lcd = 0; - /* We don't have to check anything, if we are here */ - if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd)) - printk(KERN_WARNING "Asus ACPI: Error reading LCD status\n"); + if (hotk->model != L3H) { + /* We don't have to check anything if we are here */ + if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd)) + printk(KERN_WARNING "Asus ACPI: Error reading LCD status\n"); - if (hotk->model == L2X) - lcd = ~lcd; + if (hotk->model == L2D) + lcd = ~lcd; + } else { /* L3H and the like have to be handled differently */ + acpi_status status = 0; + struct acpi_object_list input; + union acpi_object mt_params[2]; + struct acpi_buffer output; + union acpi_object out_obj; + + input.count = 2; + input.pointer = mt_params; + /* Note: the following values are partly guessed up, but + otherwise they seem to work */ + mt_params[0].type = ACPI_TYPE_INTEGER; + mt_params[0].integer.value = 0x02; + mt_params[1].type = ACPI_TYPE_INTEGER; + mt_params[1].integer.value = 0x02; + + output.length = sizeof(out_obj); + output.pointer = &out_obj; + + status = acpi_evaluate_object(NULL, hotk->methods->lcd_status, &input, &output); + if (status != AE_OK) + return -1; + if (out_obj.type == ACPI_TYPE_INTEGER) + /* That's what the AML code does */ + lcd = out_obj.integer.value >> 8; + } return (lcd & 1); } +static int set_lcd_state(struct asus_hotk *hotk, int value) +{ + int lcd = 0; + acpi_status status = 0; + + lcd = value ? 1 : 0; + if (lcd != get_lcd_state(hotk)) { + /* switch */ + if (hotk->model != L3H) { + status = + acpi_evaluate_object(NULL, hotk->methods->mt_lcd_switch, + NULL, NULL); + } else { /* L3H and the like have to be handled differently */ + if (!write_acpi_int(hotk->handle, hotk->methods->mt_lcd_switch, 0x07, NULL)) + status = AE_ERROR; + /* L3H's AML executes EHK (0x07) upon Fn+F7 keypress, + the exact behaviour is simulated here */ + } + if (ACPI_FAILURE(status)) + printk(KERN_WARNING "Asus ACPI: Error switching LCD\n"); + } + return 0; + +} static int proc_read_lcd(char *page, char **start, off_t off, int count, int *eof, @@ -436,26 +655,10 @@ unsigned long count, void *data) { int value; - int lcd = 0; - acpi_status status = 0; - int lcd_status = 0; struct asus_hotk *hotk = (struct asus_hotk *) data; - - /* scan expression. Multiple expressions may be delimited with ; */ + if (sscanf(buffer, "%i", &value) == 1) - lcd = value & 1; - - lcd_status = get_lcd_state(hotk); - - if (lcd_status != lcd) { - /* switch */ - status = - acpi_evaluate_object(NULL, hotk->methods->mt_lcd_switch, - NULL, NULL); - if (ACPI_FAILURE(status)) - printk(KERN_WARNING "Asus ACPI: Error switching LCD\n"); - } - + set_lcd_state(hotk, value); return count; } @@ -521,7 +724,6 @@ int value; struct asus_hotk *hotk = (struct asus_hotk *) data; - /* scan expression. Multiple expressions may be delimited with ; */ if (sscanf(buffer, "%d", &value) == 1) { value = (0 < value) ? ((15 < value) ? 15 : value) : 0; /* 0 <= value <= 15 */ @@ -546,7 +748,6 @@ * Now, *this* one could be more user-friendly, but so far, no-one has * complained. The significance of bits is the same as in proc_write_disp() */ - static int proc_read_disp(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -560,12 +761,11 @@ } /* - * Experimental support for display switching. As of now: 0x01 should activate - * the LCD output, 0x02 should do for CRT, and 0x04 for TV-Out. Any combination + * Experimental support for display switching. As of now: 1 should activate + * the LCD output, 2 should do for CRT, and 4 for TV-Out. Any combination * (bitwise) of these will suffice. I never actually tested 3 displays hooked up - * simultaneously, so be warned. + * simultaneously, so be warned. See the acpi4asus README for more info. */ - static int proc_write_disp(struct file *file, const char *buffer, unsigned long count, void *data) @@ -573,7 +773,6 @@ int value; struct asus_hotk *hotk = (struct asus_hotk *) data; - /* scan expression. Multiple expressions may be delimited with ; */ if (sscanf(buffer, "%d", &value) == 1) set_display(value, hotk); else { @@ -583,6 +782,31 @@ return count; } + +typedef int (proc_readfunc)(char *page, char **start, off_t off, int count, + int *eof, void *data); +typedef int (proc_writefunc)(struct file *file, const char *buffer, + unsigned long count, void *data); + +static int +__init asus_proc_add(char *name, proc_writefunc *writefunc, + proc_readfunc *readfunc, mode_t mode, + struct acpi_device *device) +{ + struct proc_dir_entry *proc = create_proc_entry(name, mode, acpi_device_dir(device)); + if(!proc) { + printk(KERN_WARNING " Unable to create %s fs entry\n", name); + return -1; + } + proc->write_proc = writefunc; + proc->read_proc = readfunc; + proc->data = acpi_driver_data(device); + proc->owner = THIS_MODULE; + proc->uid = asus_uid; + proc->gid = asus_gid; + return 0; +} + static int __init asus_hotk_add_fs(struct acpi_device *device) { struct proc_dir_entry *proc; @@ -605,46 +829,28 @@ if (!acpi_device_dir(device)) return(-ENODEV); - proc = create_proc_entry(PROC_INFOS, mode, acpi_device_dir(device)); + proc = create_proc_entry(PROC_INFO, mode, acpi_device_dir(device)); if (proc) { proc->read_proc = proc_read_info; proc->data = acpi_driver_data(device); proc->owner = THIS_MODULE; proc->uid = asus_uid; - proc->gid = asus_gid;; + proc->gid = asus_gid; } else { - printk(KERN_WARNING " Unable to create " PROC_INFOS + printk(KERN_WARNING " Unable to create " PROC_INFO " fs entry\n"); } if (hotk->methods->mt_wled) { - proc = create_proc_entry(PROC_WLED, mode, acpi_device_dir(device)); - if (proc) { - proc->write_proc = proc_write_wled; - proc->read_proc = proc_read_wled; - proc->data = acpi_driver_data(device); - proc->owner = THIS_MODULE; - proc->uid = asus_uid; - proc->gid = asus_gid;; - } else { - printk(KERN_WARNING " Unable to create " PROC_WLED - " fs entry\n"); - } + asus_proc_add(PROC_WLED, &proc_write_wled, &proc_read_wled, mode, device); } if (hotk->methods->mt_mled) { - proc = create_proc_entry(PROC_MLED, mode, acpi_device_dir(device)); - if (proc) { - proc->write_proc = proc_write_mled; - proc->read_proc = proc_read_mled; - proc->data = acpi_driver_data(device); - proc->owner = THIS_MODULE; - proc->uid = asus_uid; - proc->gid = asus_gid;; - } else { - printk(KERN_WARNING " Unable to create " PROC_MLED - " fs entry\n"); - } + asus_proc_add(PROC_MLED, &proc_write_mled, &proc_read_mled, mode, device); + } + + if (hotk->methods->mt_tled) { + asus_proc_add(PROC_TLED, &proc_write_tled, &proc_read_tled, mode, device); } /* @@ -652,49 +858,17 @@ * from keyboard */ if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) { - proc = create_proc_entry(PROC_LCD, mode, acpi_device_dir(device)); - if (proc) { - proc->write_proc = proc_write_lcd; - proc->read_proc = proc_read_lcd; - proc->data = acpi_driver_data(device); - proc->owner = THIS_MODULE; - proc->uid = asus_uid; - proc->gid = asus_gid;; - } else { - printk(KERN_WARNING " Unable to create " PROC_LCD - " fs entry\n"); - } + asus_proc_add(PROC_LCD, &proc_write_lcd, &proc_read_lcd, mode, device); } if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || (hotk->methods->brightness_get && hotk->methods->brightness_get)) { - proc = create_proc_entry(PROC_BRN, mode, acpi_device_dir(device)); - if (proc) { - proc->write_proc = proc_write_brn; - proc->read_proc = proc_read_brn; - proc->data = acpi_driver_data(device); - proc->owner = THIS_MODULE; - proc->uid = asus_uid; - proc->gid = asus_gid;; - } else { - printk(KERN_WARNING " Unable to create " PROC_BRN - " fs entry\n"); - } + asus_proc_add(PROC_BRN, &proc_write_brn, &proc_read_brn, mode, device); } if (hotk->methods->display_set) { - proc = create_proc_entry(PROC_DISP, mode, acpi_device_dir(device)); - if (proc) { - proc->write_proc = proc_write_disp; - proc->read_proc = proc_read_disp; - proc->data = acpi_driver_data(device); - proc->owner = THIS_MODULE; - proc->uid = asus_uid; - proc->gid = asus_gid;; - } else { - printk(KERN_WARNING " Unable to create " PROC_DISP - " fs entry\n"); - } + asus_proc_add(PROC_DISP, &proc_write_disp, &proc_read_disp, mode, device); + } return 0; @@ -761,11 +935,6 @@ else if (bsts_result) printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", bsts_result); - /* - * Here, we also use asus_info to make decision. For example, on INIT - * method, S1X and L1X models both reports to be L84F, but they don't - * have the same methods (L1X has WLED, S1X don't) - */ model = (union acpi_object *) buffer.pointer; if (model->type == ACPI_TYPE_STRING) { printk(KERN_NOTICE " %s model detected, ", model->string.pointer); @@ -774,52 +943,63 @@ hotk->model = END_MODEL; if (strncmp(model->string.pointer, "L3D", 3) == 0) hotk->model = L3D; - /* - * L2B has same settings that L3X, except for GL32, but as - * there is no node to get the LCD status, and as GL32 is never - * used anywhere else, I assume it's safe, even if lcd get is - * broken for this model (TODO fix it ?) - */ + else if (strncmp(model->string.pointer, "L3H", 3) == 0 || + strncmp(model->string.pointer, "L2E", 3) == 0) + hotk->model = L3H; else if (strncmp(model->string.pointer, "L3", 2) == 0 || strncmp(model->string.pointer, "L2B", 3) == 0) - hotk->model = L3X; + hotk->model = L3C; + else if (strncmp(model->string.pointer, "L8L", 3) == 0) + hotk->model = L8L; + else if (strncmp(model->string.pointer, "M2N", 3) == 0 || + strncmp(model->string.pointer, "M3N", 3) == 0 || + strncmp(model->string.pointer, "S1N", 3) == 0 || + strncmp(model->string.pointer, "S5N", 3) == 0) + hotk->model = xxN; + else if (strncmp(model->string.pointer, "M1", 2) == 0) + hotk->model = M1A; else if (strncmp(model->string.pointer, "M2", 2) == 0) - hotk->model = M2X; - else if (strncmp(model->string.pointer, "M3N", 3) == 0 || - strncmp(model->string.pointer, "S1N", 3) == 0) - hotk->model = M3N; /* S1300N is similar enough */ + hotk->model = M2E; else if (strncmp(model->string.pointer, "L2", 2) == 0) - hotk->model = L2X; - else if (strncmp(model->string.pointer, "L8", 2) == 0) { - /* S1300A reports L84F, but L1400B too */ - if (asus_info) { - if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) - hotk->model = L1X; - } else - hotk->model = S1X; - } + hotk->model = L2D; + else if (strncmp(model->string.pointer, "L8", 2) == 0) + hotk->model = S1x; else if (strncmp(model->string.pointer, "D1", 2) == 0) - hotk->model = D1X; + hotk->model = D1x; else if (strncmp(model->string.pointer, "A1", 2) == 0) - hotk->model = A1X; + hotk->model = A1x; else if (strncmp(model->string.pointer, "A2", 2) == 0) - hotk->model = A2X; + hotk->model = A2x; else if (strncmp(model->string.pointer, "J1", 2) == 0) - hotk->model = S2X; + hotk->model = S2x; else if (strncmp(model->string.pointer, "L5", 2) == 0) - hotk->model = L5X; + hotk->model = L5x; if (hotk->model == END_MODEL) { /* By default use the same values, as I don't know others */ printk("unsupported, trying default values, supply the " "developers with your DSDT\n"); - hotk->model = L2X; + hotk->model = M2E; } else { printk("supported\n"); } hotk->methods = &model_conf[hotk->model]; + /* Sort of per-model blacklist */ + if (strncmp(model->string.pointer, "L2B", 3) == 0) + hotk->methods->lcd_status = NULL; + /* L2B is similar enough to L3C to use its settings, with this only + exception */ + else if (strncmp(model->string.pointer, "S5N", 3) == 0) + hotk->methods->mt_mled = NULL; + /* S5N has no MLED */ + else if (asus_info) { + if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) + hotk->methods->mled_status = NULL; + /* S1300A reports L84F, but L1400B too, account for that */ + } + acpi_os_free(model); return AE_OK; @@ -869,8 +1049,8 @@ memset(hotk, 0, sizeof(struct asus_hotk)); hotk->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_HOTK_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_HOTK_CLASS); + strcpy(acpi_device_name(device), ACPI_HOTK_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_HOTK_CLASS); acpi_driver_data(device) = hotk; hotk->device = device; @@ -917,8 +1097,6 @@ } - - static int asus_hotk_remove(struct acpi_device *device, int type) { acpi_status status = 0; @@ -940,15 +1118,13 @@ } - - static int __init asus_acpi_init(void) { int result; asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir); if (!asus_proc_dir) { - printk(KERN_ERR "Asus ACPI: Unable to create /proc entry"); + printk(KERN_ERR "Asus ACPI: Unable to create /proc entry\n"); return(-ENODEV); } asus_proc_dir->owner = THIS_MODULE; @@ -961,7 +1137,6 @@ return(0); } - static void __exit asus_acpi_exit(void) diff -Nru a/drivers/acpi/battery.c b/drivers/acpi/battery.c --- a/drivers/acpi/battery.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/battery.c Tue Feb 17 20:00:07 2004 @@ -735,8 +735,8 @@ memset(battery, 0, sizeof(struct acpi_battery)); battery->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_BATTERY_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_BATTERY_CLASS); + strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); acpi_driver_data(device) = battery; result = acpi_battery_check(battery); diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c --- a/drivers/acpi/bus.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/bus.c Tue Feb 17 20:00:07 2004 @@ -296,8 +296,8 @@ if (!event) return_VALUE(-ENOMEM); - sprintf(event->device_class, "%s", device->pnp.device_class); - sprintf(event->bus_id, "%s", device->pnp.bus_id); + strcpy(event->device_class, device->pnp.device_class); + strcpy(event->bus_id, device->pnp.bus_id); event->type = type; event->data = data; diff -Nru a/drivers/acpi/button.c b/drivers/acpi/button.c --- a/drivers/acpi/button.c Tue Feb 17 20:00:05 2004 +++ b/drivers/acpi/button.c Tue Feb 17 20:00:05 2004 @@ -316,35 +316,35 @@ */ if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_POWER)) { button->type = ACPI_BUTTON_TYPE_POWER; - sprintf(acpi_device_name(device), "%s", + strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_POWER); sprintf(acpi_device_class(device), "%s/%s", ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER); } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_POWERF)) { button->type = ACPI_BUTTON_TYPE_POWERF; - sprintf(acpi_device_name(device), "%s", + strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_POWERF); sprintf(acpi_device_class(device), "%s/%s", ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER); } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_SLEEP)) { button->type = ACPI_BUTTON_TYPE_SLEEP; - sprintf(acpi_device_name(device), "%s", + strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_SLEEP); sprintf(acpi_device_class(device), "%s/%s", ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP); } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_SLEEPF)) { button->type = ACPI_BUTTON_TYPE_SLEEPF; - sprintf(acpi_device_name(device), "%s", + strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_SLEEPF); sprintf(acpi_device_class(device), "%s/%s", ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP); } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_LID)) { button->type = ACPI_BUTTON_TYPE_LID; - sprintf(acpi_device_name(device), "%s", + strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_LID); sprintf(acpi_device_class(device), "%s/%s", ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID); diff -Nru a/drivers/acpi/ec.c b/drivers/acpi/ec.c --- a/drivers/acpi/ec.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/ec.c Tue Feb 17 20:00:07 2004 @@ -578,8 +578,8 @@ ec->handle = device->handle; ec->uid = -1; ec->lock = SPIN_LOCK_UNLOCKED; - sprintf(acpi_device_name(device), "%s", ACPI_EC_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_EC_CLASS); + strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_EC_CLASS); acpi_driver_data(device) = ec; /* Use the global lock for all EC transactions? */ diff -Nru a/drivers/acpi/fan.c b/drivers/acpi/fan.c --- a/drivers/acpi/fan.c Tue Feb 17 20:00:05 2004 +++ b/drivers/acpi/fan.c Tue Feb 17 20:00:05 2004 @@ -214,8 +214,8 @@ memset(fan, 0, sizeof(struct acpi_fan)); fan->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_FAN_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_FAN_CLASS); + strcpy(acpi_device_name(device), ACPI_FAN_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_FAN_CLASS); acpi_driver_data(device) = fan; result = acpi_bus_get_power(fan->handle, &state); diff -Nru a/drivers/acpi/numa.c b/drivers/acpi/numa.c --- a/drivers/acpi/numa.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/numa.c Tue Feb 17 20:00:07 2004 @@ -30,8 +30,9 @@ #include #include #include +#include -extern int __init acpi_table_parse_madt_family (enum acpi_table_id id, unsigned long madt_size, int entry_id, acpi_madt_entry_handler handler); +extern int __init acpi_table_parse_madt_family (enum acpi_table_id id, unsigned long madt_size, int entry_id, acpi_madt_entry_handler handler, unsigned int max_entries); void __init acpi_table_print_srat_entry ( @@ -46,9 +47,9 @@ { struct acpi_table_processor_affinity *p = (struct acpi_table_processor_affinity*) header; - printk(KERN_INFO PREFIX "SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO "SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s\n", p->apic_id, p->lsapic_eid, p->proximity_domain, - p->flags.enabled?"enabled":"disabled"); + p->flags.enabled?"enabled":"disabled")); } break; @@ -56,11 +57,11 @@ { struct acpi_table_memory_affinity *p = (struct acpi_table_memory_affinity*) header; - printk(KERN_INFO PREFIX "SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity domain %d %s%s\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO "SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity domain %d %s%s\n", p->base_addr_hi, p->base_addr_lo, p->length_hi, p->length_lo, p->memory_type, p->proximity_domain, p->flags.enabled ? "enabled" : "disabled", - p->flags.hot_pluggable ? " hot-pluggable" : ""); + p->flags.hot_pluggable ? " hot-pluggable" : "")); } break; @@ -97,7 +98,7 @@ static int __init acpi_parse_processor_affinity (acpi_table_entry_header *header) { - struct acpi_table_processor_affinity *processor_affinity = NULL; + struct acpi_table_processor_affinity *processor_affinity; processor_affinity = (struct acpi_table_processor_affinity*) header; if (!processor_affinity) @@ -115,7 +116,7 @@ static int __init acpi_parse_memory_affinity (acpi_table_entry_header *header) { - struct acpi_table_memory_affinity *memory_affinity = NULL; + struct acpi_table_memory_affinity *memory_affinity; memory_affinity = (struct acpi_table_memory_affinity*) header; if (!memory_affinity) @@ -133,7 +134,7 @@ static int __init acpi_parse_srat (unsigned long phys_addr, unsigned long size) { - struct acpi_table_srat *srat = NULL; + struct acpi_table_srat *srat; if (!phys_addr || !size) return -EINVAL; @@ -149,10 +150,11 @@ int __init acpi_table_parse_srat ( enum acpi_srat_entry_id id, - acpi_madt_entry_handler handler) + acpi_madt_entry_handler handler, + unsigned int max_entries) { return acpi_table_parse_madt_family(ACPI_SRAT, sizeof(struct acpi_table_srat), - id, handler); + id, handler, max_entries); } @@ -166,9 +168,11 @@ if (result > 0) { result = acpi_table_parse_srat(ACPI_SRAT_PROCESSOR_AFFINITY, - acpi_parse_processor_affinity); + acpi_parse_processor_affinity, + NR_CPUS); result = acpi_table_parse_srat(ACPI_SRAT_MEMORY_AFFINITY, - acpi_parse_memory_affinity); + acpi_parse_memory_affinity, + NR_NODE_MEMBLKS); // IA64 specific } else { /* FIXME */ printk("Warning: acpi_table_parse(ACPI_SRAT) returned %d!\n",result); diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c --- a/drivers/acpi/osl.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/osl.c Tue Feb 17 20:00:07 2004 @@ -249,7 +249,7 @@ */ irq = acpi_fadt.sci_int; -#ifdef CONFIG_IA64 +#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) irq = acpi_irq_to_vector(irq); if (irq < 0) { printk(KERN_ERR PREFIX "SCI (ACPI interrupt %d) not registered\n", @@ -272,7 +272,7 @@ acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) { if (irq) { -#ifdef CONFIG_IA64 +#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) irq = acpi_irq_to_vector(irq); #endif free_irq(irq, acpi_irq); diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c --- a/drivers/acpi/pci_irq.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/pci_irq.c Tue Feb 17 20:00:06 2004 @@ -315,7 +315,6 @@ { int irq = 0; u8 pin = 0; - static u16 irq_mask = 0; ACPI_FUNCTION_TRACE("acpi_pci_irq_enable"); @@ -372,10 +371,13 @@ * Make sure all (legacy) PCI IRQs are set as level-triggered. */ #ifdef CONFIG_X86 - if ((dev->irq < 16) && !((1 << dev->irq) & irq_mask)) { - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Setting IRQ %d as level-triggered\n", dev->irq)); - irq_mask |= (1 << dev->irq); - eisa_set_level_irq(dev->irq); + { + static u16 irq_mask; + if ((dev->irq < 16) && !((1 << dev->irq) & irq_mask)) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Setting IRQ %d as level-triggered\n", dev->irq)); + irq_mask |= (1 << dev->irq); + eisa_set_level_irq(dev->irq); + } } #endif #ifdef CONFIG_IOSAPIC diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c --- a/drivers/acpi/pci_link.c Tue Feb 17 20:00:05 2004 +++ b/drivers/acpi/pci_link.c Tue Feb 17 20:00:05 2004 @@ -652,8 +652,8 @@ link->device = device; link->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_PCI_LINK_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_PCI_LINK_CLASS); + strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS); acpi_driver_data(device) = link; result = acpi_pci_link_get_possible(link); diff -Nru a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c --- a/drivers/acpi/pci_root.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/pci_root.c Tue Feb 17 20:00:06 2004 @@ -134,8 +134,8 @@ memset(root, 0, sizeof(struct acpi_pci_root)); root->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_PCI_ROOT_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_PCI_ROOT_CLASS); + strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); acpi_driver_data(device) = root; /* diff -Nru a/drivers/acpi/power.c b/drivers/acpi/power.c --- a/drivers/acpi/power.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/power.c Tue Feb 17 20:00:07 2004 @@ -503,9 +503,9 @@ memset(resource, 0, sizeof(struct acpi_power_resource)); resource->handle = device->handle; - sprintf(resource->name, "%s", device->pnp.bus_id); - sprintf(acpi_device_name(device), "%s", ACPI_POWER_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_POWER_CLASS); + strcpy(resource->name, device->pnp.bus_id); + strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_POWER_CLASS); acpi_driver_data(device) = resource; /* Evalute the object to get the system level and resource order. */ diff -Nru a/drivers/acpi/processor.c b/drivers/acpi/processor.c --- a/drivers/acpi/processor.c Tue Feb 17 20:00:07 2004 +++ b/drivers/acpi/processor.c Tue Feb 17 20:00:07 2004 @@ -3,6 +3,7 @@ * * Copyright (C) 2001, 2002 Andy Grover * Copyright (C) 2001, 2002 Paul Diefenbaugh + * Copyright (C) 2004 Dominik Brodowski * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -22,7 +23,7 @@ * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * TBD: - * 1. Make # power/performance states dynamic. + * 1. Make # power states dynamic. * 2. Support duty_cycle values that span bit 4. * 3. Optimize by having scheduler determine business instead of * having us try to calculate it here. @@ -55,9 +56,9 @@ #define ACPI_PROCESSOR_DEVICE_NAME "Processor" #define ACPI_PROCESSOR_FILE_INFO "info" #define ACPI_PROCESSOR_FILE_POWER "power" -#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance" #define ACPI_PROCESSOR_FILE_THROTTLING "throttling" #define ACPI_PROCESSOR_FILE_LIMIT "limit" +#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance" #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 #define ACPI_PROCESSOR_NOTIFY_POWER 0x81 @@ -746,7 +747,62 @@ /* -------------------------------------------------------------------------- Performance Management -------------------------------------------------------------------------- */ -int +#ifdef CONFIG_CPU_FREQ + +static DECLARE_MUTEX(performance_sem); + +/* + * _PPC support is implemented as a CPUfreq policy notifier: + * This means each time a CPUfreq driver registered also with + * the ACPI core is asked to change the speed policy, the maximum + * value is adjusted so that it is within the platform limit. + * + * Also, when a new platform limit value is detected, the CPUfreq + * policy is adjusted accordingly. + */ + +static int acpi_processor_ppc_is_init = 0; + +static int acpi_processor_ppc_notifier(struct notifier_block *nb, + unsigned long event, + void *data) +{ + struct cpufreq_policy *policy = data; + struct acpi_processor *pr; + unsigned int ppc = 0; + + down(&performance_sem); + + if (event != CPUFREQ_INCOMPATIBLE) + goto out; + + pr = processors[policy->cpu]; + if (!pr || !pr->performance) + goto out; + + ppc = (unsigned int) pr->performance_platform_limit; + if (!ppc) + goto out; + + if (ppc > pr->performance->state_count) + goto out; + + cpufreq_verify_within_limits(policy, 0, + pr->performance->states[ppc].core_frequency * 1000); + + out: + up(&performance_sem); + + return 0; +} + + +static struct notifier_block acpi_ppc_notifier_block = { + .notifier_call = acpi_processor_ppc_notifier, +}; + + +static int acpi_processor_get_platform_limit ( struct acpi_processor* pr) { @@ -770,35 +826,491 @@ pr->performance_platform_limit = (int) ppc; - acpi_processor_get_limit_info(pr); + return_VALUE(0); +} + + +static int acpi_processor_ppc_has_changed( + struct acpi_processor *pr) +{ + int ret = acpi_processor_get_platform_limit(pr); + if (ret < 0) + return (ret); + else + return cpufreq_update_policy(pr->id); +} + + +static void acpi_processor_ppc_init(void) { + if (!cpufreq_register_notifier(&acpi_ppc_notifier_block, CPUFREQ_POLICY_NOTIFIER)) + acpi_processor_ppc_is_init = 1; + else + printk(KERN_DEBUG "Warning: Processor Platform Limit not supported.\n"); +} + + +static void acpi_processor_ppc_exit(void) { + if (acpi_processor_ppc_is_init) + cpufreq_unregister_notifier(&acpi_ppc_notifier_block, CPUFREQ_POLICY_NOTIFIER); + + acpi_processor_ppc_is_init = 0; +} + +/* + * when registering a cpufreq driver with this ACPI processor driver, the + * _PCT and _PSS structures are read out and written into struct + * acpi_processor_performance. + */ + +static int acpi_processor_set_pdc (struct acpi_processor *pr) +{ + acpi_status status = AE_OK; + u32 arg0_buf[3]; + union acpi_object arg0 = {ACPI_TYPE_BUFFER}; + struct acpi_object_list no_object = {1, &arg0}; + struct acpi_object_list *pdc; + + ACPI_FUNCTION_TRACE("acpi_processor_set_pdc"); + arg0.buffer.length = 12; + arg0.buffer.pointer = (u8 *) arg0_buf; + arg0_buf[0] = ACPI_PDC_REVISION_ID; + arg0_buf[1] = 0; + arg0_buf[2] = 0; + + pdc = (pr->performance->pdc) ? pr->performance->pdc : &no_object; + + status = acpi_evaluate_object(pr->handle, "_PDC", pdc, NULL); + + if ((ACPI_FAILURE(status)) && (pr->performance->pdc)) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Error evaluating _PDC, using legacy perf. control...\n")); + + return_VALUE(status); +} + + +static int +acpi_processor_get_performance_control ( + struct acpi_processor *pr) +{ + int result = 0; + acpi_status status = 0; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + union acpi_object *pct = NULL; + union acpi_object obj = {0}; + + ACPI_FUNCTION_TRACE("acpi_processor_get_performance_control"); + + status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); + if(ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PCT\n")); + return_VALUE(-ENODEV); + } + + pct = (union acpi_object *) buffer.pointer; + if (!pct || (pct->type != ACPI_TYPE_PACKAGE) + || (pct->package.count != 2)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PCT data\n")); + result = -EFAULT; + goto end; + } + + /* + * control_register + */ + + obj = pct->package.elements[0]; + + if ((obj.type != ACPI_TYPE_BUFFER) + || (obj.buffer.length < sizeof(struct acpi_pct_register)) + || (obj.buffer.pointer == NULL)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Invalid _PCT data (control_register)\n")); + result = -EFAULT; + goto end; + } + memcpy(&pr->performance->control_register, obj.buffer.pointer, sizeof(struct acpi_pct_register)); + + + /* + * status_register + */ + + obj = pct->package.elements[1]; + + if ((obj.type != ACPI_TYPE_BUFFER) + || (obj.buffer.length < sizeof(struct acpi_pct_register)) + || (obj.buffer.pointer == NULL)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Invalid _PCT data (status_register)\n")); + result = -EFAULT; + goto end; + } + + memcpy(&pr->performance->status_register, obj.buffer.pointer, sizeof(struct acpi_pct_register)); + +end: + acpi_os_free(buffer.pointer); + + return_VALUE(result); +} + + +static int +acpi_processor_get_performance_states ( + struct acpi_processor *pr) +{ + int result = 0; + acpi_status status = AE_OK; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + struct acpi_buffer format = {sizeof("NNNNNN"), "NNNNNN"}; + struct acpi_buffer state = {0, NULL}; + union acpi_object *pss = NULL; + int i = 0; + + ACPI_FUNCTION_TRACE("acpi_processor_get_performance_states"); + + status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer); + if(ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PSS\n")); + return_VALUE(-ENODEV); + } + + pss = (union acpi_object *) buffer.pointer; + if (!pss || (pss->type != ACPI_TYPE_PACKAGE)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data\n")); + result = -EFAULT; + goto end; + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d performance states\n", + pss->package.count)); + + pr->performance->state_count = pss->package.count; + pr->performance->states = kmalloc(sizeof(struct acpi_processor_px) * pss->package.count, GFP_KERNEL); + if (!pr->performance->states) { + result = -ENOMEM; + goto end; + } + + for (i = 0; i < pr->performance->state_count; i++) { + + struct acpi_processor_px *px = &(pr->performance->states[i]); + + state.length = sizeof(struct acpi_processor_px); + state.pointer = px; + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Extracting state %d\n", i)); + + status = acpi_extract_package(&(pss->package.elements[i]), + &format, &state); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data\n")); + result = -EFAULT; + kfree(pr->performance->states); + goto end; + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "State [%d]: core_frequency[%d] power[%d] transition_latency[%d] bus_master_latency[%d] control[0x%x] status[0x%x]\n", + i, + (u32) px->core_frequency, + (u32) px->power, + (u32) px->transition_latency, + (u32) px->bus_master_latency, + (u32) px->control, + (u32) px->status)); + + if (!px->core_frequency) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSS data: freq is zero\n")); + result = -EFAULT; + kfree(pr->performance->states); + goto end; + } + } + +end: + acpi_os_free(buffer.pointer); + + return_VALUE(result); +} + + +static int +acpi_processor_get_performance_info ( + struct acpi_processor *pr) +{ + int result = 0; + acpi_status status = AE_OK; + acpi_handle handle = NULL; + + ACPI_FUNCTION_TRACE("acpi_processor_get_performance_info"); + + if (!pr || !pr->performance || !pr->handle) + return_VALUE(-EINVAL); + + status = acpi_get_handle(pr->handle, "_PCT", &handle); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "ACPI-based processor performance control unavailable\n")); + return_VALUE(-ENODEV); + } + + acpi_processor_set_pdc(pr); + + result = acpi_processor_get_performance_control(pr); + if (result) + return_VALUE(result); + + result = acpi_processor_get_performance_states(pr); + if (result) + return_VALUE(result); + + result = acpi_processor_get_platform_limit(pr); + if (result) + return_VALUE(result); + return_VALUE(0); } -EXPORT_SYMBOL(acpi_processor_get_platform_limit); + + +#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF +/* /proc/acpi/processor/../performance interface (DEPRECATED) */ + +static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file); +static struct file_operations acpi_processor_perf_fops = { + .open = acpi_processor_perf_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int acpi_processor_perf_seq_show(struct seq_file *seq, void *offset) +{ + struct acpi_processor *pr = (struct acpi_processor *)seq->private; + int i = 0; + + ACPI_FUNCTION_TRACE("acpi_processor_perf_seq_show"); + + if (!pr) + goto end; + + if (!pr->performance) { + seq_puts(seq, "\n"); + goto end; + } + + seq_printf(seq, "state count: %d\n" + "active state: P%d\n", + pr->performance->state_count, + pr->performance->state); + + seq_puts(seq, "states:\n"); + for (i = 0; i < pr->performance->state_count; i++) + seq_printf(seq, " %cP%d: %d MHz, %d mW, %d uS\n", + (i == pr->performance->state?'*':' '), i, + (u32) pr->performance->states[i].core_frequency, + (u32) pr->performance->states[i].power, + (u32) pr->performance->states[i].transition_latency); + +end: + return 0; +} + +static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, acpi_processor_perf_seq_show, + PDE(inode)->data); +} + +static int +acpi_processor_write_performance ( + struct file *file, + const char __user *buffer, + size_t count, + loff_t *data) +{ + int result = 0; + struct seq_file *m = (struct seq_file *) file->private_data; + struct acpi_processor *pr = (struct acpi_processor *) m->private; + struct acpi_processor_performance *perf; + char state_string[12] = {'\0'}; + unsigned int new_state = 0; + struct cpufreq_policy policy; + + ACPI_FUNCTION_TRACE("acpi_processor_write_performance"); + + if (!pr || (count > sizeof(state_string) - 1)) + return_VALUE(-EINVAL); + + perf = pr->performance; + if (!perf) + return_VALUE(-EINVAL); + + if (copy_from_user(state_string, buffer, count)) + return_VALUE(-EFAULT); + + state_string[count] = '\0'; + new_state = simple_strtoul(state_string, NULL, 0); + + if (new_state >= perf->state_count) + return_VALUE(-EINVAL); + + cpufreq_get_policy(&policy, pr->id); + + policy.cpu = pr->id; + policy.min = perf->states[new_state].core_frequency * 1000; + policy.max = perf->states[new_state].core_frequency * 1000; + + result = cpufreq_set_policy(&policy); + if (result) + return_VALUE(result); + + return_VALUE(count); +} + +static void +acpi_cpufreq_add_file ( + struct acpi_processor *pr) +{ + struct proc_dir_entry *entry = NULL; + struct acpi_device *device = NULL; + + ACPI_FUNCTION_TRACE("acpi_cpufreq_addfile"); + + if (acpi_bus_get_device(pr->handle, &device)) + return_VOID; + + /* add file 'performance' [R/W] */ + entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, + S_IFREG|S_IRUGO|S_IWUSR, acpi_device_dir(device)); + if (!entry) + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Unable to create '%s' fs entry\n", + ACPI_PROCESSOR_FILE_PERFORMANCE)); + else { + entry->proc_fops = &acpi_processor_perf_fops; + entry->proc_fops->write = acpi_processor_write_performance; + entry->data = acpi_driver_data(device); + } + return_VOID; +} + +static void +acpi_cpufreq_remove_file ( + struct acpi_processor *pr) +{ + struct acpi_device *device = NULL; + + ACPI_FUNCTION_TRACE("acpi_cpufreq_addfile"); + + if (acpi_bus_get_device(pr->handle, &device)) + return_VOID; + + /* remove file 'performance' */ + remove_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, + acpi_device_dir(device)); + + return_VOID; +} + +#else +static void acpi_cpufreq_add_file (struct acpi_processor *pr) { return; } +static void acpi_cpufreq_remove_file (struct acpi_processor *pr) { return; } +#endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */ + int acpi_processor_register_performance ( struct acpi_processor_performance * performance, - struct acpi_processor ** pr, unsigned int cpu) { + struct acpi_processor *pr; + ACPI_FUNCTION_TRACE("acpi_processor_register_performance"); - *pr = processors[cpu]; - if (!*pr) + if (!acpi_processor_ppc_is_init) + return_VALUE(-EINVAL); + + down(&performance_sem); + + pr = processors[cpu]; + if (!pr) { + up(&performance_sem); return_VALUE(-ENODEV); + } - if ((*pr)->performance) + if (pr->performance) { + up(&performance_sem); return_VALUE(-EBUSY); + } - (*pr)->performance = performance; - performance->pr = *pr; - return 0; + pr->performance = performance; + + if (acpi_processor_get_performance_info(pr)) { + pr->performance = NULL; + up(&performance_sem); + return_VALUE(-EIO); + } + + acpi_cpufreq_add_file(pr); + + up(&performance_sem); + return_VALUE(0); } EXPORT_SYMBOL(acpi_processor_register_performance); -/* for the rest of it, check cpufreq/acpi.c */ +void +acpi_processor_unregister_performance ( + struct acpi_processor_performance * performance, + unsigned int cpu) +{ + struct acpi_processor *pr; + + ACPI_FUNCTION_TRACE("acpi_processor_unregister_performance"); + + if (!acpi_processor_ppc_is_init) + return_VOID; + + down(&performance_sem); + + pr = processors[cpu]; + if (!pr) { + up(&performance_sem); + return_VOID; + } + + kfree(pr->performance->states); + pr->performance = NULL; + + acpi_cpufreq_remove_file(pr); + + up(&performance_sem); + + return_VOID; +} +EXPORT_SYMBOL(acpi_processor_unregister_performance); + + +/* for the rest of it, check arch/i386/kernel/cpu/cpufreq/acpi.c */ + +#else /* !CONFIG_CPU_FREQ */ + +static void acpi_processor_ppc_init(void) { return; } +static void acpi_processor_ppc_exit(void) { return; } + +static int acpi_processor_ppc_has_changed(struct acpi_processor *pr) { + static unsigned int printout = 1; + if (printout) { + printk(KERN_WARNING "Warning: Processor Platform Limit event detected, but not handled.\n"); + printk(KERN_WARNING "Consider compiling CPUfreq support into your kernel.\n"); + printout = 0; + } + return 0; +} + +#endif /* CONFIG_CPU_FREQ */ /* -------------------------------------------------------------------------- Throttling Control @@ -1043,27 +1555,6 @@ if (!pr->flags.limit) return_VALUE(-ENODEV); -#ifdef CONFIG_CPU_FREQ - if (pr->flags.performance) { - px = pr->performance_platform_limit; - if (pr->limit.user.px > px) - px = pr->limit.user.px; - if (pr->limit.thermal.px > px) - px = pr->limit.thermal.px; - { - struct cpufreq_policy policy; - policy.cpu = pr->id; - cpufreq_get_policy(&policy, pr->id); - policy.max = pr->performance->states[px].core_frequency * 1000; /* racy */ - result = cpufreq_set_policy(&policy); - } - if (result) - goto end; - } else if (pr->performance_platform_limit) { - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Platform limit event detected. Consider using ACPI P-States CPUfreq driver\n")); - } -#endif - if (pr->flags.throttling) { if (pr->limit.user.tx > tx) tx = pr->limit.user.tx; @@ -1091,6 +1582,113 @@ } +#ifdef CONFIG_CPU_FREQ + +/* If a passive cooling situation is detected, primarily CPUfreq is used, as it + * offers (in most cases) voltage scaling in addition to frequency scaling, and + * thus a cubic (instead of linear) reduction of energy. Also, we allow for + * _any_ cpufreq driver and not only the acpi-cpufreq driver. + */ + +static unsigned int cpufreq_thermal_reduction_pctg[NR_CPUS]; +static unsigned int acpi_thermal_cpufreq_is_init = 0; + + +static int cpu_has_cpufreq(unsigned int cpu) +{ + struct cpufreq_policy policy; + if (!acpi_thermal_cpufreq_is_init) + return -ENODEV; + if (!cpufreq_get_policy(&policy, cpu)) + return -ENODEV; + return 0; +} + + +static int acpi_thermal_cpufreq_increase(unsigned int cpu) +{ + if (!cpu_has_cpufreq(cpu)) + return -ENODEV; + + if (cpufreq_thermal_reduction_pctg[cpu] < 60) { + cpufreq_thermal_reduction_pctg[cpu] += 20; + cpufreq_update_policy(cpu); + return 0; + } + + return -ERANGE; +} + + +static int acpi_thermal_cpufreq_decrease(unsigned int cpu) +{ + if (!cpu_has_cpufreq(cpu)) + return -ENODEV; + + if (cpufreq_thermal_reduction_pctg[cpu] >= 20) { + cpufreq_thermal_reduction_pctg[cpu] -= 20; + cpufreq_update_policy(cpu); + return 0; + } + + return -ERANGE; +} + + +static int acpi_thermal_cpufreq_notifier( + struct notifier_block *nb, + unsigned long event, + void *data) +{ + struct cpufreq_policy *policy = data; + unsigned long max_freq = 0; + + if (event != CPUFREQ_ADJUST) + goto out; + + max_freq = (policy->cpuinfo.max_freq * (100 - cpufreq_thermal_reduction_pctg[policy->cpu])) / 100; + + cpufreq_verify_within_limits(policy, 0, max_freq); + + out: + return 0; +} + + +static struct notifier_block acpi_thermal_cpufreq_notifier_block = { + .notifier_call = acpi_thermal_cpufreq_notifier, +}; + + +static void acpi_thermal_cpufreq_init(void) { + int i; + + for (i=0; iflags.limit) - return_VALUE(-ENODEV); - /* Thermal limits are always relative to the current Px/Tx state. */ - if (pr->flags.performance) - pr->limit.thermal.px = pr->performance->state; if (pr->flags.throttling) pr->limit.thermal.tx = pr->throttling.state; @@ -1130,26 +1722,27 @@ * performance state. */ - px = pr->limit.thermal.px; tx = pr->limit.thermal.tx; switch (type) { case ACPI_PROCESSOR_LIMIT_NONE: - px = 0; + do { + result = acpi_thermal_cpufreq_decrease(pr->id); + } while (!result); tx = 0; break; case ACPI_PROCESSOR_LIMIT_INCREMENT: - if (pr->flags.performance) { - if (px == (pr->performance->state_count - 1)) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, + /* if going up: P-states first, T-states later */ + + result = acpi_thermal_cpufreq_increase(pr->id); + if (!result) + goto end; + else if (result == -ERANGE) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "At maximum performance state\n")); - else { - px++; - goto end; - } - } + if (pr->flags.throttling) { if (tx == (pr->throttling.state_count - 1)) ACPI_DEBUG_PRINT((ACPI_DB_INFO, @@ -1160,37 +1753,41 @@ break; case ACPI_PROCESSOR_LIMIT_DECREMENT: - if (pr->flags.performance) { - if (px == pr->performance_platform_limit) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "At minimum performance state\n")); - else { - px--; - goto end; - } - } + /* if going down: T-states first, P-states later */ + if (pr->flags.throttling) { if (tx == 0) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "At minimum throttling state\n")); - else + else { tx--; + goto end; + } } + + result = acpi_thermal_cpufreq_decrease(pr->id); + if (result == -ERANGE) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "At minimum performance state\n")); + break; } end: - pr->limit.thermal.px = px; - pr->limit.thermal.tx = tx; + if (pr->flags.throttling) { + pr->limit.thermal.px = 0; + pr->limit.thermal.tx = tx; - result = acpi_processor_apply_limit(pr); - if (result) - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Unable to set thermal limit\n")); + result = acpi_processor_apply_limit(pr); + if (result) + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Unable to set thermal limit\n")); - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Thermal limit now (P%d:T%d)\n", - pr->limit.thermal.px, - pr->limit.thermal.tx)); + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Thermal limit now (P%d:T%d)\n", + pr->limit.thermal.px, + pr->limit.thermal.tx)); + } else + result = 0; return_VALUE(result); } @@ -1205,7 +1802,7 @@ if (!pr) return_VALUE(-EINVAL); - if (pr->flags.performance || pr->flags.throttling) + if (pr->flags.throttling) pr->flags.limit = 1; return_VALUE(0); @@ -1232,14 +1829,12 @@ "bus mastering control: %s\n" "power management: %s\n" "throttling control: %s\n" - "performance management: %s\n" "limit interface: %s\n", pr->id, pr->acpi_id, pr->flags.bm_control ? "yes" : "no", pr->flags.power ? "yes" : "no", pr->flags.throttling ? "yes" : "no", - pr->flags.performance ? "yes" : "no", pr->flags.limit ? "yes" : "no"); end: @@ -1396,11 +1991,9 @@ } seq_printf(seq, "active limit: P%d:T%d\n" - "platform limit: P%d:T0\n" "user limit: P%d:T%d\n" "thermal limit: P%d:T%d\n", pr->limit.state.px, pr->limit.state.tx, - pr->flags.performance?pr->performance_platform_limit:0, pr->limit.user.px, pr->limit.user.tx, pr->limit.thermal.px, pr->limit.thermal.tx); @@ -1447,15 +2040,6 @@ return_VALUE(-EINVAL); } - if (pr->flags.performance) { - if ((px < pr->performance_platform_limit) - || (px > (pr->performance->state_count - 1))) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid px\n")); - return_VALUE(-EINVAL); - } - pr->limit.user.px = px; - } - if (pr->flags.throttling) { if ((tx < 0) || (tx > (pr->throttling.state_count - 1))) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid tx\n")); @@ -1635,9 +2219,9 @@ } acpi_processor_get_power_info(pr); - pr->flags.performance = 0; - pr->performance_platform_limit = 0; - acpi_processor_get_platform_limit(pr); +#ifdef CONFIG_CPU_FREQ + acpi_processor_ppc_has_changed(pr); +#endif acpi_processor_get_throttling_info(pr); acpi_processor_get_limit_info(pr); @@ -1651,7 +2235,6 @@ u32 event, void *data) { - int result = 0; struct acpi_processor *pr = (struct acpi_processor *) data; struct acpi_device *device = NULL; @@ -1665,9 +2248,7 @@ switch (event) { case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: - result = acpi_processor_get_platform_limit(pr); - if (!result) - acpi_processor_apply_limit(pr); + acpi_processor_ppc_has_changed(pr); acpi_bus_generate_event(device, event, pr->performance_platform_limit); break; @@ -1705,8 +2286,8 @@ memset(pr, 0, sizeof(struct acpi_processor)); pr->handle = device->handle; - sprintf(acpi_device_name(device), "%s", ACPI_PROCESSOR_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_PROCESSOR_CLASS); + strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); acpi_driver_data(device) = pr; result = acpi_processor_get_info(pr); @@ -1813,6 +2394,10 @@ return_VALUE(-ENODEV); } + acpi_thermal_cpufreq_init(); + + acpi_processor_ppc_init(); + return_VALUE(0); } @@ -1821,6 +2406,10 @@ acpi_processor_exit (void) { ACPI_FUNCTION_TRACE("acpi_processor_exit"); + + acpi_processor_ppc_exit(); + + acpi_thermal_cpufreq_exit(); acpi_bus_unregister_driver(&acpi_processor_driver); diff -Nru a/drivers/acpi/scan.c b/drivers/acpi/scan.c --- a/drivers/acpi/scan.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/scan.c Tue Feb 17 20:00:06 2004 @@ -486,13 +486,13 @@ */ switch (type) { case ACPI_BUS_TYPE_SYSTEM: - sprintf(device->pnp.bus_id, "%s", "ACPI"); + strcpy(device->pnp.bus_id, "ACPI"); break; case ACPI_BUS_TYPE_POWER_BUTTON: - sprintf(device->pnp.bus_id, "%s", "PWRF"); + strcpy(device->pnp.bus_id, "PWRF"); break; case ACPI_BUS_TYPE_SLEEP_BUTTON: - sprintf(device->pnp.bus_id, "%s", "SLPF"); + strcpy(device->pnp.bus_id, "SLPF"); break; default: acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer); @@ -503,7 +503,7 @@ else break; } - sprintf(device->pnp.bus_id, "%s", bus_id); + strcpy(device->pnp.bus_id, bus_id); break; } } @@ -565,16 +565,16 @@ */ if ((parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) { hid = ACPI_BUS_HID; - sprintf(device->pnp.device_name, "%s", ACPI_BUS_DEVICE_NAME); - sprintf(device->pnp.device_class, "%s", ACPI_BUS_CLASS); + strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); + strcpy(device->pnp.device_class, ACPI_BUS_CLASS); } if (hid) { - sprintf(device->pnp.hardware_id, "%s", hid); + strcpy(device->pnp.hardware_id, hid); device->flags.hardware_id = 1; } if (uid) { - sprintf(device->pnp.unique_id, "%s", uid); + strcpy(device->pnp.unique_id, uid); device->flags.unique_id = 1; } if (cid_list) { diff -Nru a/drivers/acpi/tables.c b/drivers/acpi/tables.c --- a/drivers/acpi/tables.c Tue Feb 17 20:00:06 2004 +++ b/drivers/acpi/tables.c Tue Feb 17 20:00:06 2004 @@ -302,13 +302,14 @@ enum acpi_table_id id, unsigned long madt_size, int entry_id, - acpi_madt_entry_handler handler) + acpi_madt_entry_handler handler, + unsigned int max_entries) { void *madt = NULL; - acpi_table_entry_header *entry = NULL; - unsigned long count = 0; - unsigned long madt_end = 0; - unsigned int i = 0; + acpi_table_entry_header *entry; + unsigned int count = 0; + unsigned long madt_end; + unsigned int i; if (!handler) return -EINVAL; @@ -342,13 +343,18 @@ ((unsigned long) madt + madt_size); while (((unsigned long) entry) < madt_end) { - if (entry->type == entry_id) { - count++; + if (entry->type == entry_id && + (!max_entries || count++ < max_entries)) handler(entry); - } + entry = (acpi_table_entry_header *) ((unsigned long) entry + entry->length); } + if (max_entries && count > max_entries) { + printk(KERN_WARNING PREFIX "[%s:0x%02x] ignored %i entries of " + "%i found\n", acpi_table_signatures[id], entry_id, + count - max_entries, count); + } return count; } @@ -357,10 +363,11 @@ int __init acpi_table_parse_madt ( enum acpi_madt_entry_id id, - acpi_madt_entry_handler handler) + acpi_madt_entry_handler handler, + unsigned int max_entries) { return acpi_table_parse_madt_family(ACPI_APIC, sizeof(struct acpi_table_madt), - id, handler); + id, handler, max_entries); } @@ -585,4 +592,3 @@ return 0; } - diff -Nru a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c --- a/drivers/acpi/thermal.c Tue Feb 17 20:00:08 2004 +++ b/drivers/acpi/thermal.c Tue Feb 17 20:00:08 2004 @@ -1246,9 +1246,9 @@ memset(tz, 0, sizeof(struct acpi_thermal)); tz->handle = device->handle; - sprintf(tz->name, "%s", device->pnp.bus_id); - sprintf(acpi_device_name(device), "%s", ACPI_THERMAL_DEVICE_NAME); - sprintf(acpi_device_class(device), "%s", ACPI_THERMAL_CLASS); + strcpy(tz->name, device->pnp.bus_id); + strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); acpi_driver_data(device) = tz; result = acpi_thermal_get_info(tz); diff -Nru a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c --- a/drivers/acpi/toshiba_acpi.c Tue Feb 17 20:00:05 2004 +++ b/drivers/acpi/toshiba_acpi.c Tue Feb 17 20:00:05 2004 @@ -2,7 +2,7 @@ * toshiba_acpi.c - Toshiba Laptop ACPI Extras * * - * Copyright (C) 2002-2003 John Belmonte + * Copyright (C) 2002-2004 John Belmonte * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ * */ -#define TOSHIBA_ACPI_VERSION "0.16" +#define TOSHIBA_ACPI_VERSION "0.17" #define PROC_INTERFACE_VERSION 1 #include @@ -48,9 +48,15 @@ MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver"); MODULE_LICENSE("GPL"); +#define MY_LOGPREFIX "toshiba_acpi: " +#define MY_ERR KERN_ERR MY_LOGPREFIX +#define MY_NOTICE KERN_NOTICE MY_LOGPREFIX +#define MY_INFO KERN_INFO MY_LOGPREFIX + /* Toshiba ACPI method paths */ #define METHOD_LCD_BRIGHTNESS "\\_SB_.PCI0.VGA_.LCD_._BCM" -#define METHOD_HCI "\\_SB_.VALD.GHCI" +#define METHOD_HCI_1 "\\_SB_.VALD.GHCI" +#define METHOD_HCI_2 "\\_SB_.VALZ.GHCI" #define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX" /* Toshiba HCI interface definitions @@ -121,6 +127,16 @@ */ static int +is_valid_acpi_path(const char* methodName) +{ + acpi_handle handle; + acpi_status status; + + status = acpi_get_handle(0, (char*)methodName, &handle); + return !ACPI_FAILURE(status); +} + +static int write_acpi_int(const char* methodName, int val) { struct acpi_object_list params; @@ -154,6 +170,8 @@ } #endif +static const char* method_hci /*= 0*/; + /* Perform a raw HCI call. Here we don't care about input or output buffer * format. */ @@ -177,7 +195,7 @@ results.length = sizeof(out_objs); results.pointer = out_objs; - status = acpi_evaluate_object(0, METHOD_HCI, ¶ms, + status = acpi_evaluate_object(0, (char*)method_hci, ¶ms, &results); if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) { for (i = 0; i < out_objs->package.count; ++i) { @@ -215,7 +233,7 @@ return status; } -static struct proc_dir_entry* toshiba_proc_dir; +static struct proc_dir_entry* toshiba_proc_dir /*= 0*/; static int force_fan; static int last_key_event; static int key_event_valid; @@ -270,7 +288,7 @@ p += sprintf(p, "brightness_levels: %d\n", HCI_LCD_BRIGHTNESS_LEVELS); } else { - p += sprintf(p, "ERROR\n"); + printk(MY_ERR "Error reading LCD brightness\n"); } return p; @@ -310,7 +328,7 @@ p += sprintf(p, "crt_out: %d\n", is_crt); p += sprintf(p, "tv_out: %d\n", is_tv); } else { - p += sprintf(p, "ERROR\n"); + printk(MY_ERR "Error reading video out status\n"); } return p; @@ -320,25 +338,31 @@ write_video(const char* buffer, unsigned long count) { int value; - const char* buffer_end = buffer + count; + int remain = count; int lcd_out = -1; int crt_out = -1; int tv_out = -1; u32 hci_result; int video_out; - /* scan expression. Multiple expressions may be delimited with ; */ - do { - if (snscanf(buffer, count, " lcd_out : %i", &value) == 1) + /* scan expression. Multiple expressions may be delimited with ; + * + * NOTE: to keep scanning simple, invalid fields are ignored + */ + while (remain) { + if (snscanf(buffer, remain, " lcd_out : %i", &value) == 1) lcd_out = value & 1; - else if (snscanf(buffer, count, " crt_out : %i", &value) == 1) + else if (snscanf(buffer, remain, " crt_out : %i", &value) == 1) crt_out = value & 1; - else if (snscanf(buffer, count, " tv_out : %i", &value) == 1) + else if (snscanf(buffer, remain, " tv_out : %i", &value) == 1) tv_out = value & 1; /* advance to one character past the next ; */ - do ++buffer; - while ((buffer < buffer_end) && (*(buffer-1) != ';')); - } while (buffer < buffer_end); + do { + ++buffer; + --remain; + } + while (remain && *(buffer-1) != ';'); + } hci_read1(HCI_VIDEO_OUT, &video_out, &hci_result); if (hci_result == HCI_SUCCESS) { @@ -353,6 +377,8 @@ * video setting if something changed. */ if (new_video_out != video_out) write_acpi_int(METHOD_VIDEO_OUT, new_video_out); + } else { + return -EFAULT; } return count; @@ -369,7 +395,7 @@ p += sprintf(p, "running: %d\n", (value > 0)); p += sprintf(p, "force_on: %d\n", force_fan); } else { - p += sprintf(p, "ERROR\n"); + printk(MY_ERR "Error reading fan status\n"); } return p; @@ -413,8 +439,9 @@ * some machines where system events sporadically * become disabled. */ hci_write1(HCI_SYSTEM_EVENT, 1, &hci_result); + printk(MY_NOTICE "Re-enabled hotkeys\n"); } else { - p += sprintf(p, "ERROR\n"); + printk(MY_ERR "Error reading hotkey status\n"); goto end; } } @@ -465,7 +492,7 @@ { 0 , 0 , 0 }, }; -static acpi_status +static acpi_status __init add_device(void) { struct proc_dir_entry* proc; @@ -483,7 +510,7 @@ return(AE_OK); } -static acpi_status +static acpi_status __exit remove_device(void) { ProcItem* item; @@ -497,15 +524,19 @@ toshiba_acpi_init(void) { acpi_status status = AE_OK; - int value; u32 hci_result; - /* simple device detection: try reading an HCI register */ - hci_read1(HCI_LCD_BRIGHTNESS, &value, &hci_result); - if (hci_result != HCI_SUCCESS) + /* simple device detection: look for HCI method */ + if (is_valid_acpi_path(METHOD_HCI_1)) + method_hci = METHOD_HCI_1; + else if (is_valid_acpi_path(METHOD_HCI_2)) + method_hci = METHOD_HCI_2; + else return -ENODEV; - printk("Toshiba Laptop ACPI Extras version %s\n", TOSHIBA_ACPI_VERSION); + printk(MY_INFO "Toshiba Laptop ACPI Extras version %s\n", + TOSHIBA_ACPI_VERSION); + printk(MY_INFO " HCI method: %s\n", method_hci); force_fan = 0; key_event_valid = 0; diff -Nru a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c --- a/drivers/atm/atmtcp.c Tue Feb 17 20:00:07 2004 +++ b/drivers/atm/atmtcp.c Tue Feb 17 20:00:07 2004 @@ -255,7 +255,7 @@ dev_data = PRIV(atmtcp_dev); dev_data->vcc = NULL; if (dev_data->persist) return; - PRIV(atmtcp_dev) = NULL; + atmtcp_dev->dev_data = NULL; kfree(dev_data); shutdown_atm_dev(atmtcp_dev); vcc->dev_data = NULL; @@ -380,7 +380,7 @@ } dev->ci_range.vpi_bits = MAX_VPI_BITS; dev->ci_range.vci_bits = MAX_VCI_BITS; - PRIV(dev) = dev_data; + dev->dev_data = dev_data; PRIV(dev)->vcc = NULL; PRIV(dev)->persist = persist; if (result) *result = dev; diff -Nru a/drivers/atm/eni.c b/drivers/atm/eni.c --- a/drivers/atm/eni.c Tue Feb 17 20:00:06 2004 +++ b/drivers/atm/eni.c Tue Feb 17 20:00:06 2004 @@ -1875,7 +1875,7 @@ DPRINTK("eni_close: done waiting\n"); /* deallocate memory */ kfree(ENI_VCC(vcc)); - ENI_VCC(vcc) = NULL; + vcc->dev_data = NULL; clear_bit(ATM_VF_ADDR,&vcc->flags); /*foo();*/ } @@ -1891,7 +1891,8 @@ DPRINTK(">eni_open\n"); EVENT("eni_open\n",0,0); - if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ENI_VCC(vcc) = NULL; + if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) + vcc->dev_data = NULL; eni_dev = ENI_DEV(vcc->dev); if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR,&vcc->flags); @@ -1902,7 +1903,7 @@ if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) { eni_vcc = kmalloc(sizeof(struct eni_vcc),GFP_KERNEL); if (!eni_vcc) return -ENOMEM; - ENI_VCC(vcc) = eni_vcc; + vcc->dev_data = eni_vcc; eni_vcc->tx = NULL; /* for eni_close after open_rx */ if ((error = open_rx_first(vcc))) { eni_close(vcc); @@ -2230,7 +2231,7 @@ if (!dev) goto out2; pci_set_drvdata(pci_dev, dev); eni_dev->pci_dev = pci_dev; - ENI_DEV(dev) = eni_dev; + dev->dev_data = eni_dev; eni_dev->asic = ent->driver_data; error = eni_do_init(dev); if (error) goto out3; diff -Nru a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c --- a/drivers/atm/fore200e.c Tue Feb 17 20:00:08 2004 +++ b/drivers/atm/fore200e.c Tue Feb 17 20:00:08 2004 @@ -1417,7 +1417,7 @@ return -ENOMEM; } - FORE200E_VCC(vcc) = fore200e_vcc; + vcc->dev_data = fore200e_vcc; if (fore200e_activate_vcin(fore200e, 1, vcc, vcc->qos.rxtp.max_sdu) < 0) { kfree(fore200e_vcc); @@ -2482,7 +2482,7 @@ return -ENODEV; } - FORE200E_DEV(atm_dev) = fore200e; + atm_dev->dev_data = fore200e; fore200e->atm_dev = atm_dev; atm_dev->ci_range.vpi_bits = 8; diff -Nru a/drivers/atm/he.c b/drivers/atm/he.c --- a/drivers/atm/he.c Tue Feb 17 20:00:06 2004 +++ b/drivers/atm/he.c Tue Feb 17 20:00:06 2004 @@ -177,9 +177,7 @@ unsigned flags) { he_writel(he_dev, val, CON_DAT); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, CON_DAT); -#endif + (void) he_readl(he_dev, CON_DAT); /* flush posted writes */ he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL); while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY); } @@ -380,7 +378,7 @@ he_dev->pci_dev = pci_dev; he_dev->atm_dev = atm_dev; he_dev->atm_dev->dev_data = he_dev; - HE_DEV(atm_dev) = he_dev; + atm_dev->dev_data = he_dev; he_dev->number = atm_dev->number; if (he_start(atm_dev)) { he_stop(he_dev); @@ -1950,9 +1948,6 @@ he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head), G0_RBRQ_H + (group * 16)); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, G0_RBRQ_H + (group * 16)); -#endif } return pdus_assembled; @@ -2045,9 +2040,6 @@ he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head), G0_TBRQ_H + (group * 16)); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, G0_TBRQ_H + (group * 16)); -#endif } } @@ -2075,12 +2067,8 @@ ++moved; } - if (moved) { + if (moved) he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, G0_RBPL_T); -#endif - } } #ifdef USE_RBPS @@ -2107,12 +2095,8 @@ ++moved; } - if (moved) { + if (moved) he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, G0_RBPS_T); -#endif - } } #endif /* USE_RBPS */ @@ -2209,7 +2193,7 @@ IRQ_SIZE(CONFIG_IRQ_SIZE) | IRQ_THRESH(CONFIG_IRQ_THRESH) | IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD); - (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata */ + (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */ } #ifdef USE_TASKLET spin_unlock_irqrestore(&he_dev->global_lock, flags); @@ -2250,11 +2234,8 @@ #else he_tasklet((unsigned long) he_dev); #endif - he_writel(he_dev, INT_CLEAR_A, INT_FIFO); - /* clear interrupt */ -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, INT_FIFO); -#endif + he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */ + (void) he_readl(he_dev, INT_FIFO); /* flush posted writes */ } spin_unlock_irqrestore(&he_dev->global_lock, flags); return IRQ_RETVAL(handled); @@ -2323,9 +2304,7 @@ he_dev->tpdrq_tail = new_tail; he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, TPDRQ_T); -#endif + (void) he_readl(he_dev, TPDRQ_T); /* flush posted writes */ } static int @@ -2361,7 +2340,7 @@ init_waitqueue_head(&he_vcc->rx_waitq); init_waitqueue_head(&he_vcc->tx_waitq); - HE_VCC(vcc) = he_vcc; + vcc->dev_data = he_vcc; if (vcc->qos.txtp.traffic_class != ATM_NONE) { int pcr_goal; @@ -2475,9 +2454,7 @@ he_writel_tsr12(he_dev, 0x0, cid); he_writel_tsr13(he_dev, 0x0, cid); he_writel_tsr14(he_dev, 0x0, cid); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl_tsr0(he_dev, cid); -#endif + (void) he_readl_tsr0(he_dev, cid); /* flush posted writes */ spin_unlock_irqrestore(&he_dev->global_lock, flags); } @@ -2531,9 +2508,7 @@ the open/closed indication in rsr0 */ he_writel_rsr0(he_dev, rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl_rsr0(he_dev, cid); -#endif + (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */ spin_unlock_irqrestore(&he_dev->global_lock, flags); } @@ -2587,9 +2562,7 @@ set_current_state(TASK_UNINTERRUPTIBLE); he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl_rsr0(he_dev, cid); -#endif + (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */ he_writel_mbox(he_dev, cid, RXCON_CLOSE); spin_unlock_irqrestore(&he_dev->global_lock, flags); @@ -2638,9 +2611,6 @@ spin_lock_irqsave(&he_dev->global_lock, flags); he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid); /* also clears TSR4_SESSION_ENDED */ -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl_tsr4(he_dev, cid); -#endif switch (vcc->qos.txtp.traffic_class) { case ATM_UBR: @@ -2652,6 +2622,7 @@ he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid); break; } + (void) he_readl_tsr4(he_dev, cid); /* flush posted writes */ tpd = __alloc_tpd(he_dev); if (tpd == NULL) { @@ -2904,9 +2875,7 @@ spin_lock_irqsave(&he_dev->global_lock, flags); he_writel(he_dev, val, FRAMER + (addr*4)); -#ifdef CONFIG_IA64_SGI_SN2 - (void) he_readl(he_dev, FRAMER + (addr*4)); -#endif + (void) he_readl(he_dev, FRAMER + (addr*4)); /* flush posted writes */ spin_unlock_irqrestore(&he_dev->global_lock, flags); } diff -Nru a/drivers/atm/idt77105.c b/drivers/atm/idt77105.c --- a/drivers/atm/idt77105.c Tue Feb 17 20:00:07 2004 +++ b/drivers/atm/idt77105.c Tue Feb 17 20:00:07 2004 @@ -265,7 +265,7 @@ { unsigned long flags; - if (!(PRIV(dev) = kmalloc(sizeof(struct idt77105_priv),GFP_KERNEL))) + if (!(dev->dev_data = kmalloc(sizeof(struct idt77105_priv),GFP_KERNEL))) return -ENOMEM; PRIV(dev)->dev = dev; spin_lock_irqsave(&idt77105_priv_lock, flags); @@ -343,7 +343,7 @@ else idt77105_all = walk->next; dev->phy = NULL; - PRIV(dev) = NULL; + dev->dev_data = NULL; kfree(walk); break; } diff -Nru a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c --- a/drivers/atm/idt77252.c Tue Feb 17 20:00:07 2004 +++ b/drivers/atm/idt77252.c Tue Feb 17 20:00:07 2004 @@ -664,8 +664,8 @@ skb_queue_head_init(&scq->transmit); skb_queue_head_init(&scq->pending); - TXPRINTK("idt77252: SCQ: base 0x%p, next 0x%p, last 0x%p, paddr %08x\n", - scq->base, scq->next, scq->last, scq->paddr); + TXPRINTK("idt77252: SCQ: base 0x%p, next 0x%p, last 0x%p, paddr %08llx\n", + scq->base, scq->next, scq->last, (unsigned long long)scq->paddr); return scq; } diff -Nru a/drivers/atm/iphase.c b/drivers/atm/iphase.c --- a/drivers/atm/iphase.c Tue Feb 17 20:00:08 2004 +++ b/drivers/atm/iphase.c Tue Feb 17 20:00:08 2004 @@ -1754,7 +1754,7 @@ (iadev->tx_buf_sz - sizeof(struct cpcs_trailer))){ printk("IA: SDU size over (%d) the configured SDU size %d\n", vcc->qos.txtp.max_sdu,iadev->tx_buf_sz); - INPH_IA_VCC(vcc) = NULL; + vcc->dev_data = NULL; kfree(ia_vcc); return -EINVAL; } @@ -2671,7 +2671,7 @@ } kfree(INPH_IA_VCC(vcc)); ia_vcc = NULL; - INPH_IA_VCC(vcc) = NULL; + vcc->dev_data = NULL; clear_bit(ATM_VF_ADDR,&vcc->flags); return; } @@ -2684,7 +2684,7 @@ if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) { IF_EVENT(printk("ia: not partially allocated resources\n");) - INPH_IA_VCC(vcc) = NULL; + vcc->dev_data = NULL; } iadev = INPH_IA_DEV(vcc->dev); if (vcc->vci != ATM_VPI_UNSPEC && vcc->vpi != ATM_VCI_UNSPEC) @@ -2700,7 +2700,7 @@ /* Device dependent initialization */ ia_vcc = kmalloc(sizeof(*ia_vcc), GFP_KERNEL); if (!ia_vcc) return -ENOMEM; - INPH_IA_VCC(vcc) = ia_vcc; + vcc->dev_data = ia_vcc; if ((error = open_rx(vcc))) { @@ -3196,7 +3196,7 @@ ret = -ENOMEM; goto err_out_disable_dev; } - INPH_IA_DEV(dev) = iadev; + dev->dev_data = iadev; IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", dev->number);) IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, iadev->LineRate);) diff -Nru a/drivers/atm/suni.c b/drivers/atm/suni.c --- a/drivers/atm/suni.c Tue Feb 17 20:00:07 2004 +++ b/drivers/atm/suni.c Tue Feb 17 20:00:07 2004 @@ -230,7 +230,7 @@ unsigned long flags; int first; - if (!(PRIV(dev) = kmalloc(sizeof(struct suni_priv),GFP_KERNEL))) + if (!(dev->dev_data = kmalloc(sizeof(struct suni_priv),GFP_KERNEL))) return -ENOMEM; PRIV(dev)->dev = dev; diff -Nru a/drivers/atm/uPD98402.c b/drivers/atm/uPD98402.c --- a/drivers/atm/uPD98402.c Tue Feb 17 20:00:06 2004 +++ b/drivers/atm/uPD98402.c Tue Feb 17 20:00:06 2004 @@ -211,7 +211,7 @@ static int uPD98402_start(struct atm_dev *dev) { DPRINTK("phy_start\n"); - if (!(PRIV(dev) = kmalloc(sizeof(struct uPD98402_priv),GFP_KERNEL))) + if (!(dev->dev_data = kmalloc(sizeof(struct uPD98402_priv),GFP_KERNEL))) return -ENOMEM; spin_lock_init(&PRIV(dev)->lock); memset(&PRIV(dev)->sonet_stats,0,sizeof(struct k_sonet_stats)); diff -Nru a/drivers/atm/zatm.c b/drivers/atm/zatm.c --- a/drivers/atm/zatm.c Tue Feb 17 20:00:06 2004 +++ b/drivers/atm/zatm.c Tue Feb 17 20:00:06 2004 @@ -1368,7 +1368,7 @@ DPRINTK("zatm_close: done waiting\n"); /* deallocate memory */ kfree(ZATM_VCC(vcc)); - ZATM_VCC(vcc) = NULL; + vcc->dev_data = NULL; clear_bit(ATM_VF_ADDR,&vcc->flags); } @@ -1383,7 +1383,8 @@ DPRINTK(">zatm_open\n"); zatm_dev = ZATM_DEV(vcc->dev); - if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ZATM_VCC(vcc) = NULL; + if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) + vcc->dev_data = NULL; if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR,&vcc->flags); if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */ @@ -1395,7 +1396,7 @@ clear_bit(ATM_VF_ADDR,&vcc->flags); return -ENOMEM; } - ZATM_VCC(vcc) = zatm_vcc; + vcc->dev_data = zatm_vcc; ZATM_VCC(vcc)->tx_chan = 0; /* for zatm_close after open_rx */ if ((error = open_rx_first(vcc))) { zatm_close(vcc); @@ -1597,7 +1598,7 @@ dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL); if (!dev) break; zatm_dev->pci_dev = pci_dev; - ZATM_DEV(dev) = zatm_dev; + dev->dev_data = zatm_dev; zatm_dev->copper = type; if (zatm_init(dev) || zatm_start(dev)) { atm_dev_deregister(dev); diff -Nru a/drivers/base/Makefile b/drivers/base/Makefile --- a/drivers/base/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/base/Makefile Tue Feb 17 20:00:08 2004 @@ -2,7 +2,7 @@ obj-y := core.o sys.o interface.o bus.o \ driver.o class.o class_simple.o platform.o \ - cpu.o firmware.o init.o map.o + cpu.o firmware.o init.o map.o dmapool.o obj-y += power/ obj-$(CONFIG_FW_LOADER) += firmware_class.o -obj-$(CONFIG_NUMA) += node.o memblk.o +obj-$(CONFIG_NUMA) += node.o diff -Nru a/drivers/base/bus.c b/drivers/base/bus.c --- a/drivers/base/bus.c Tue Feb 17 20:00:06 2004 +++ b/drivers/base/bus.c Tue Feb 17 20:00:06 2004 @@ -158,17 +158,19 @@ int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, int (*fn)(struct device *, void *)) { - struct list_head * head, * entry; + struct device *dev; + struct list_head * head; int error = 0; if (!(bus = get_bus(bus))) return -EINVAL; - head = start ? &start->bus_list : &bus->devices.list; + head = &bus->devices.list; + dev = list_prepare_entry(start, head, bus_list); down_read(&bus->subsys.rwsem); - list_for_each(entry,head) { - struct device * dev = get_device(to_dev(entry)); + list_for_each_entry_continue(dev, head, bus_list) { + get_device(dev); error = fn(dev,data); put_device(dev); if (error) @@ -202,17 +204,19 @@ int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, void * data, int (*fn)(struct device_driver *, void *)) { - struct list_head * head, * entry; + struct list_head * head; + struct device_driver *drv; int error = 0; if(!(bus = get_bus(bus))) return -EINVAL; - head = start ? &start->kobj.entry : &bus->drivers.list; + head = &bus->drivers.list; + drv = list_prepare_entry(start, head, kobj.entry); down_read(&bus->subsys.rwsem); - list_for_each(entry,head) { - struct device_driver * drv = get_driver(to_drv(entry)); + list_for_each_entry_continue(drv, head, kobj.entry) { + get_driver(drv); error = fn(drv,data); put_driver(drv); if(error) diff -Nru a/drivers/base/class.c b/drivers/base/class.c --- a/drivers/base/class.c Tue Feb 17 20:00:08 2004 +++ b/drivers/base/class.c Tue Feb 17 20:00:08 2004 @@ -3,8 +3,8 @@ * * Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs - * Copyright (c) 2003 Greg Kroah-Hartman - * Copyright (c) 2003 IBM Corp. + * Copyright (c) 2003-2004 Greg Kroah-Hartman + * Copyright (c) 2003-2004 IBM Corp. * * This file is released under the GPLv2 * @@ -278,7 +278,6 @@ { struct class * parent; struct class_interface * class_intf; - struct list_head * entry; int error; class_dev = class_device_get(class_dev); @@ -302,11 +301,9 @@ if (parent) { down_write(&parent->subsys.rwsem); list_add_tail(&class_dev->node, &parent->children); - list_for_each(entry, &parent->interfaces) { - class_intf = container_of(entry, struct class_interface, node); + list_for_each_entry(class_intf, &parent->interfaces, node) if (class_intf->add) class_intf->add(class_dev); - } up_write(&parent->subsys.rwsem); } @@ -330,16 +327,13 @@ { struct class * parent = class_dev->class; struct class_interface * class_intf; - struct list_head * entry; if (parent) { down_write(&parent->subsys.rwsem); list_del_init(&class_dev->node); - list_for_each(entry, &parent->interfaces) { - class_intf = container_of(entry, struct class_interface, node); + list_for_each_entry(class_intf, &parent->interfaces, node) if (class_intf->remove) class_intf->remove(class_dev); - } up_write(&parent->subsys.rwsem); } @@ -395,7 +389,6 @@ { struct class * parent; struct class_device * class_dev; - struct list_head * entry; if (!class_intf || !class_intf->class) return -ENODEV; @@ -408,10 +401,8 @@ list_add_tail(&class_intf->node, &parent->interfaces); if (class_intf->add) { - list_for_each(entry, &parent->children) { - class_dev = container_of(entry, struct class_device, node); + list_for_each_entry(class_dev, &parent->children, node) class_intf->add(class_dev); - } } up_write(&parent->subsys.rwsem); @@ -421,7 +412,7 @@ void class_interface_unregister(struct class_interface *class_intf) { struct class * parent = class_intf->class; - struct list_head * entry; + struct class_device *class_dev; if (!parent) return; @@ -430,10 +421,8 @@ list_del_init(&class_intf->node); if (class_intf->remove) { - list_for_each(entry, &parent->children) { - struct class_device *class_dev = container_of(entry, struct class_device, node); + list_for_each_entry(class_dev, &parent->children, node) class_intf->remove(class_dev); - } } up_write(&parent->subsys.rwsem); diff -Nru a/drivers/base/class_simple.c b/drivers/base/class_simple.c --- a/drivers/base/class_simple.c Tue Feb 17 20:00:06 2004 +++ b/drivers/base/class_simple.c Tue Feb 17 20:00:06 2004 @@ -170,6 +170,24 @@ EXPORT_SYMBOL(class_simple_device_add); /** + * class_simple_set_hotplug - set the hotplug callback in the embedded struct class + * @cs: pointer to the struct class_simple to hold the pointer + * @hotplug: function pointer to the hotplug function + * + * Implement and set a hotplug function to add environment variables specific to this + * class on the hotplug event. + */ +int class_simple_set_hotplug(struct class_simple *cs, + int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size)) +{ + if ((cs == NULL) || (IS_ERR(cs))) + return -ENODEV; + cs->class.hotplug = hotplug; + return 0; +} +EXPORT_SYMBOL(class_simple_set_hotplug); + +/** * class_simple_device_remove - removes a class device that was created with class_simple_device_add() * @dev: the dev_t of the device that was previously registered. * @@ -179,12 +197,10 @@ void class_simple_device_remove(dev_t dev) { struct simple_dev *s_dev = NULL; - struct list_head *tmp; int found = 0; spin_lock(&simple_dev_list_lock); - list_for_each(tmp, &simple_dev_list) { - s_dev = list_entry(tmp, struct simple_dev, node); + list_for_each_entry(s_dev, &simple_dev_list, node) { if (s_dev->dev == dev) { found = 1; break; diff -Nru a/drivers/base/core.c b/drivers/base/core.c --- a/drivers/base/core.c Tue Feb 17 20:00:05 2004 +++ b/drivers/base/core.c Tue Feb 17 20:00:05 2004 @@ -76,7 +76,6 @@ static void device_release(struct kobject * kobj) { struct device * dev = to_dev(kobj); - struct completion * c = dev->complete; if (dev->release) dev->release(dev); @@ -86,8 +85,6 @@ dev->bus_id); WARN_ON(1); } - if (c) - complete(c); } static struct kobj_type ktype_device = { @@ -197,6 +194,7 @@ INIT_LIST_HEAD(&dev->children); INIT_LIST_HEAD(&dev->driver_list); INIT_LIST_HEAD(&dev->bus_list); + INIT_LIST_HEAD(&dev->dma_pools); } /** @@ -355,25 +353,6 @@ /** - * device_unregister_wait - Unregister device and wait for it to be freed. - * @dev: Device to unregister. - * - * For the cases where the caller needs to wait for all references to - * be dropped from the device before continuing (e.g. modules with - * statically allocated devices), this function uses a completion struct - * to wait, along with a matching complete() in device_release() above. - */ - -void device_unregister_wait(struct device * dev) -{ - struct completion c; - init_completion(&c); - dev->complete = &c; - device_unregister(dev); - wait_for_completion(&c); -} - -/** * device_for_each_child - device child iterator. * @dev: parent struct device. * @data: data for the callback. @@ -421,7 +400,6 @@ EXPORT_SYMBOL(device_del); EXPORT_SYMBOL(device_unregister); -EXPORT_SYMBOL(device_unregister_wait); EXPORT_SYMBOL(get_device); EXPORT_SYMBOL(put_device); EXPORT_SYMBOL(device_find); diff -Nru a/drivers/base/dmapool.c b/drivers/base/dmapool.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/base/dmapool.c Tue Feb 17 20:00:08 2004 @@ -0,0 +1,414 @@ + +#include +#include +#include /* Needed for i386 to build */ +#include /* Needed for i386 to build */ +#include +#include +#include +#include + +/* + * Pool allocator ... wraps the dma_alloc_coherent page allocator, so + * small blocks are easily used by drivers for bus mastering controllers. + * This should probably be sharing the guts of the slab allocator. + */ + +struct dma_pool { /* the pool */ + struct list_head page_list; + spinlock_t lock; + size_t blocks_per_page; + size_t size; + struct device *dev; + size_t allocation; + char name [32]; + wait_queue_head_t waitq; + struct list_head pools; +}; + +struct dma_page { /* cacheable header for 'allocation' bytes */ + struct list_head page_list; + void *vaddr; + dma_addr_t dma; + unsigned in_use; + unsigned long bitmap [0]; +}; + +#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) +#define POOL_POISON_FREED 0xa7 /* !inuse */ +#define POOL_POISON_ALLOCATED 0xa9 /* !initted */ + +static DECLARE_MUTEX (pools_lock); + +static ssize_t +show_pools (struct device *dev, char *buf) +{ + unsigned temp; + unsigned size; + char *next; + struct dma_page *page; + struct dma_pool *pool; + + next = buf; + size = PAGE_SIZE; + + temp = snprintf (next, size, "poolinfo - 0.1\n"); + size -= temp; + next += temp; + + down (&pools_lock); + list_for_each_entry(pool, &dev->dma_pools, pools) { + unsigned pages = 0; + unsigned blocks = 0; + + list_for_each_entry(page, &pool->page_list, page_list) { + pages++; + blocks += page->in_use; + } + + /* per-pool info, no real statistics yet */ + temp = snprintf (next, size, "%-16s %4u %4Zu %4Zu %2u\n", + pool->name, + blocks, pages * pool->blocks_per_page, + pool->size, pages); + size -= temp; + next += temp; + } + up (&pools_lock); + + return PAGE_SIZE - size; +} +static DEVICE_ATTR (pools, S_IRUGO, show_pools, NULL); + +/** + * dma_pool_create - Creates a pool of consistent memory blocks, for dma. + * @name: name of pool, for diagnostics + * @dev: device that will be doing the DMA + * @size: size of the blocks in this pool. + * @align: alignment requirement for blocks; must be a power of two + * @allocation: returned blocks won't cross this boundary (or zero) + * Context: !in_interrupt() + * + * Returns a dma allocation pool with the requested characteristics, or + * null if one can't be created. Given one of these pools, dma_pool_alloc() + * may be used to allocate memory. Such memory will all have "consistent" + * DMA mappings, accessible by the device and its driver without using + * cache flushing primitives. The actual size of blocks allocated may be + * larger than requested because of alignment. + * + * If allocation is nonzero, objects returned from dma_pool_alloc() won't + * cross that size boundary. This is useful for devices which have + * addressing restrictions on individual DMA transfers, such as not crossing + * boundaries of 4KBytes. + */ +struct dma_pool * +dma_pool_create (const char *name, struct device *dev, + size_t size, size_t align, size_t allocation) +{ + struct dma_pool *retval; + + if (align == 0) + align = 1; + if (size == 0) + return 0; + else if (size < align) + size = align; + else if ((size % align) != 0) { + size += align + 1; + size &= ~(align - 1); + } + + if (allocation == 0) { + if (PAGE_SIZE < size) + allocation = size; + else + allocation = PAGE_SIZE; + // FIXME: round up for less fragmentation + } else if (allocation < size) + return 0; + + if (!(retval = kmalloc (sizeof *retval, SLAB_KERNEL))) + return retval; + + strlcpy (retval->name, name, sizeof retval->name); + + retval->dev = dev; + + INIT_LIST_HEAD (&retval->page_list); + spin_lock_init (&retval->lock); + retval->size = size; + retval->allocation = allocation; + retval->blocks_per_page = allocation / size; + init_waitqueue_head (&retval->waitq); + + if (dev) { + down (&pools_lock); + if (list_empty (&dev->dma_pools)) + device_create_file (dev, &dev_attr_pools); + /* note: not currently insisting "name" be unique */ + list_add (&retval->pools, &dev->dma_pools); + up (&pools_lock); + } else + INIT_LIST_HEAD (&retval->pools); + + return retval; +} + + +static struct dma_page * +pool_alloc_page (struct dma_pool *pool, int mem_flags) +{ + struct dma_page *page; + int mapsize; + + mapsize = pool->blocks_per_page; + mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG; + mapsize *= sizeof (long); + + page = (struct dma_page *) kmalloc (mapsize + sizeof *page, mem_flags); + if (!page) + return 0; + page->vaddr = dma_alloc_coherent (pool->dev, + pool->allocation, + &page->dma, + mem_flags); + if (page->vaddr) { + memset (page->bitmap, 0xff, mapsize); // bit set == free +#ifdef CONFIG_DEBUG_SLAB + memset (page->vaddr, POOL_POISON_FREED, pool->allocation); +#endif + list_add (&page->page_list, &pool->page_list); + page->in_use = 0; + } else { + kfree (page); + page = 0; + } + return page; +} + + +static inline int +is_page_busy (int blocks, unsigned long *bitmap) +{ + while (blocks > 0) { + if (*bitmap++ != ~0UL) + return 1; + blocks -= BITS_PER_LONG; + } + return 0; +} + +static void +pool_free_page (struct dma_pool *pool, struct dma_page *page) +{ + dma_addr_t dma = page->dma; + +#ifdef CONFIG_DEBUG_SLAB + memset (page->vaddr, POOL_POISON_FREED, pool->allocation); +#endif + dma_free_coherent (pool->dev, pool->allocation, page->vaddr, dma); + list_del (&page->page_list); + kfree (page); +} + + +/** + * dma_pool_destroy - destroys a pool of dma memory blocks. + * @pool: dma pool that will be destroyed + * Context: !in_interrupt() + * + * Caller guarantees that no more memory from the pool is in use, + * and that nothing will try to use the pool after this call. + */ +void +dma_pool_destroy (struct dma_pool *pool) +{ + down (&pools_lock); + list_del (&pool->pools); + if (pool->dev && list_empty (&pool->dev->dma_pools)) + device_remove_file (pool->dev, &dev_attr_pools); + up (&pools_lock); + + while (!list_empty (&pool->page_list)) { + struct dma_page *page; + page = list_entry (pool->page_list.next, + struct dma_page, page_list); + if (is_page_busy (pool->blocks_per_page, page->bitmap)) { + if (pool->dev) + dev_err(pool->dev, "dma_pool_destroy %s, %p busy\n", + pool->name, page->vaddr); + else + printk (KERN_ERR "dma_pool_destroy %s, %p busy\n", + pool->name, page->vaddr); + /* leak the still-in-use consistent memory */ + list_del (&page->page_list); + kfree (page); + } else + pool_free_page (pool, page); + } + + kfree (pool); +} + + +/** + * dma_pool_alloc - get a block of consistent memory + * @pool: dma pool that will produce the block + * @mem_flags: GFP_* bitmask + * @handle: pointer to dma address of block + * + * This returns the kernel virtual address of a currently unused block, + * and reports its dma address through the handle. + * If such a memory block can't be allocated, null is returned. + */ +void * +dma_pool_alloc (struct dma_pool *pool, int mem_flags, dma_addr_t *handle) +{ + unsigned long flags; + struct dma_page *page; + int map, block; + size_t offset; + void *retval; + +restart: + spin_lock_irqsave (&pool->lock, flags); + list_for_each_entry(page, &pool->page_list, page_list) { + int i; + /* only cachable accesses here ... */ + for (map = 0, i = 0; + i < pool->blocks_per_page; + i += BITS_PER_LONG, map++) { + if (page->bitmap [map] == 0) + continue; + block = ffz (~ page->bitmap [map]); + if ((i + block) < pool->blocks_per_page) { + clear_bit (block, &page->bitmap [map]); + offset = (BITS_PER_LONG * map) + block; + offset *= pool->size; + goto ready; + } + } + } + if (!(page = pool_alloc_page (pool, SLAB_ATOMIC))) { + if (mem_flags & __GFP_WAIT) { + DECLARE_WAITQUEUE (wait, current); + + current->state = TASK_INTERRUPTIBLE; + add_wait_queue (&pool->waitq, &wait); + spin_unlock_irqrestore (&pool->lock, flags); + + schedule_timeout (POOL_TIMEOUT_JIFFIES); + + remove_wait_queue (&pool->waitq, &wait); + goto restart; + } + retval = 0; + goto done; + } + + clear_bit (0, &page->bitmap [0]); + offset = 0; +ready: + page->in_use++; + retval = offset + page->vaddr; + *handle = offset + page->dma; +#ifdef CONFIG_DEBUG_SLAB + memset (retval, POOL_POISON_ALLOCATED, pool->size); +#endif +done: + spin_unlock_irqrestore (&pool->lock, flags); + return retval; +} + + +static struct dma_page * +pool_find_page (struct dma_pool *pool, dma_addr_t dma) +{ + unsigned long flags; + struct dma_page *page; + + spin_lock_irqsave (&pool->lock, flags); + list_for_each_entry(page, &pool->page_list, page_list) { + if (dma < page->dma) + continue; + if (dma < (page->dma + pool->allocation)) + goto done; + } + page = 0; +done: + spin_unlock_irqrestore (&pool->lock, flags); + return page; +} + + +/** + * dma_pool_free - put block back into dma pool + * @pool: the dma pool holding the block + * @vaddr: virtual address of block + * @dma: dma address of block + * + * Caller promises neither device nor driver will again touch this block + * unless it is first re-allocated. + */ +void +dma_pool_free (struct dma_pool *pool, void *vaddr, dma_addr_t dma) +{ + struct dma_page *page; + unsigned long flags; + int map, block; + + if ((page = pool_find_page (pool, dma)) == 0) { + if (pool->dev) + dev_err(pool->dev, "dma_pool_free %s, %p/%lx (bad dma)\n", + pool->name, vaddr, (unsigned long) dma); + else + printk (KERN_ERR "dma_pool_free %s, %p/%lx (bad dma)\n", + pool->name, vaddr, (unsigned long) dma); + return; + } + + block = dma - page->dma; + block /= pool->size; + map = block / BITS_PER_LONG; + block %= BITS_PER_LONG; + +#ifdef CONFIG_DEBUG_SLAB + if (((dma - page->dma) + (void *)page->vaddr) != vaddr) { + if (pool->dev) + dev_err(pool->dev, "dma_pool_free %s, %p (bad vaddr)/%Lx\n", + pool->name, vaddr, (unsigned long long) dma); + else + printk (KERN_ERR "dma_pool_free %s, %p (bad vaddr)/%Lx\n", + pool->name, vaddr, (unsigned long long) dma); + return; + } + if (page->bitmap [map] & (1UL << block)) { + if (pool->dev) + dev_err(pool->dev, "dma_pool_free %s, dma %Lx already free\n", + pool->name, (unsigned long long)dma); + else + printk (KERN_ERR "dma_pool_free %s, dma %Lx already free\n", + pool->name, (unsigned long long)dma); + return; + } + memset (vaddr, POOL_POISON_FREED, pool->size); +#endif + + spin_lock_irqsave (&pool->lock, flags); + page->in_use--; + set_bit (block, &page->bitmap [map]); + if (waitqueue_active (&pool->waitq)) + wake_up (&pool->waitq); + /* + * Resist a temptation to do + * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); + * Better have a few empty pages hang around. + */ + spin_unlock_irqrestore (&pool->lock, flags); +} + + +EXPORT_SYMBOL (dma_pool_create); +EXPORT_SYMBOL (dma_pool_destroy); +EXPORT_SYMBOL (dma_pool_alloc); +EXPORT_SYMBOL (dma_pool_free); diff -Nru a/drivers/base/memblk.c b/drivers/base/memblk.c --- a/drivers/base/memblk.c Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,43 +0,0 @@ -/* - * drivers/base/memblk.c - basic Memory Block class support - */ - -#include -#include -#include -#include -#include - - -static struct sysdev_class memblk_class = { - set_kset_name("memblk"), -}; - -/* - * register_memblk - Setup a driverfs device for a MemBlk - * @num - MemBlk number to use when creating the device. - * - * Initialize and register the MemBlk device. - */ -int __init register_memblk(struct memblk *memblk, int num, struct node *root) -{ - int error; - - memblk->node_id = memblk_to_node(num); - memblk->sysdev.cls = &memblk_class, - memblk->sysdev.id = num; - - error = sys_device_register(&memblk->sysdev); - if (!error) - error = sysfs_create_link(&root->sysdev.kobj, - &memblk->sysdev.kobj, - kobject_name(&memblk->sysdev.kobj)); - return error; -} - - -int __init register_memblk_type(void) -{ - return sysdev_class_register(&memblk_class); -} -postcore_initcall(register_memblk_type); diff -Nru a/drivers/block/cciss.c b/drivers/block/cciss.c --- a/drivers/block/cciss.c Tue Feb 17 20:00:08 2004 +++ b/drivers/block/cciss.c Tue Feb 17 20:00:08 2004 @@ -45,12 +45,14 @@ #include #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) -#define DRIVER_NAME "Compaq CISS Driver (v 2.5.0)" -#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,5,0) +#define DRIVER_NAME "Compaq CISS Driver (v 2.6.0)" +#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,6,0) /* Embedded module documentation macros - see modules.h */ -MODULE_AUTHOR("Charles M. White III - Compaq Computer Corporation"); -MODULE_DESCRIPTION("Driver for Compaq Smart Array Controller 5xxx v. 2.5.0"); +MODULE_AUTHOR("Hewlett-Packard Company"); +MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 2.6.0"); +MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" + " SA6i"); MODULE_LICENSE("GPL"); #include "cciss_cmd.h" @@ -75,6 +77,8 @@ 0x0E11, 0x409C, 0, 0, 0}, { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x409D, 0, 0, 0}, + { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, + 0x0E11, 0x4091, 0, 0, 0}, {0,} }; MODULE_DEVICE_TABLE(pci, cciss_pci_device_id); @@ -94,6 +98,7 @@ { 0x409B0E11, "Smart Array 642", &SA5_access}, { 0x409C0E11, "Smart Array 6400", &SA5_access}, { 0x409D0E11, "Smart Array 6400 EM", &SA5_access}, + { 0x40910E11, "Smart Array 6i", &SA5_access}, }; /* How long to wait (in millesconds) for board to go into simple mode */ @@ -103,7 +108,7 @@ /*define how many times we will try a command because of bus resets */ #define MAX_CMD_RETRIES 3 -#define READ_AHEAD 128 +#define READ_AHEAD 256 #define NR_CMDS 384 /* #commands that can be outstanding */ #define MAX_CTLR 8 @@ -151,6 +156,11 @@ /* * Report information about this controller. */ +#define ENG_GIG 1048576000 +#define ENG_GIG_FACTOR (ENG_GIG/512) +#define RAID_UNKNOWN 6 +static const char *raid_label[] = {"0","4","1(0+1)","5","5+1","ADG", + "UNKNOWN"}; #ifdef CONFIG_PROC_FS static struct proc_dir_entry *proc_cciss; @@ -163,49 +173,80 @@ int size, i, ctlr; ctlr_info_t *h = (ctlr_info_t*)data; drive_info_struct *drv; + unsigned long flags; + unsigned int vol_sz, vol_sz_frac; ctlr = h->ctlr; - size = sprintf(buffer, "%s: Compaq %s Controller\n" - " Board ID: 0x%08lx\n" - " Firmware Version: %c%c%c%c\n" - " Memory Address: 0x%08lx\n" - " IRQ: %d\n" - " Logical drives: %d\n" - " Highest Logical Volume ID: %d\n" - " Current Q depth: %d\n" - " Max Q depth since init: %d\n" - " Max # commands on controller since init: %d\n" - " Max SG entries since init: %d\n\n", + + /* prevent displaying bogus info during configuration + * or deconfiguration of a logical volume + */ + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + if (h->busy_configuring) { + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + return -EBUSY; + } + h->busy_configuring = 1; + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + size = sprintf(buffer, "%s: HP %s Controller\n" + "Board ID: 0x%08lx\n" + "Firmware Version: %c%c%c%c\n" + "IRQ: %d\n" + "Logical drives: %d\n" + "Current Q depth: %d\n" + "Current # commands on controller: %d\n" + "Max Q depth since init: %d\n" + "Max # commands on controller since init: %d\n" + "Max SG entries since init: %d\n\n", h->devname, h->product_name, (unsigned long)h->board_id, h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], h->firm_ver[3], - (unsigned long)h->vaddr, (unsigned int)h->intr, h->num_luns, - h->highest_lun, - h->Qdepth, h->maxQsinceinit, h->max_outstanding, h->maxSG); + h->Qdepth, h->commands_outstanding, + h->maxQsinceinit, h->max_outstanding, h->maxSG); pos += size; len += size; cciss_proc_tape_report(ctlr, buffer, &pos, &len); for(i=0; ihighest_lun; i++) { + sector_t tmp; + drv = &h->drv[i]; if (drv->block_size == 0) continue; - size = sprintf(buffer+len, "cciss/c%dd%d: blksz=%d nr_blocks=%llu\n", - ctlr, i, drv->block_size, (unsigned long long)drv->nr_blocks); + vol_sz = drv->nr_blocks; + sector_div(vol_sz, ENG_GIG_FACTOR); + + /* + * Awkwardly do this: + * vol_sz_frac = + * (drv->nr_blocks%ENG_GIG_FACTOR)*100/ENG_GIG_FACTOR; + */ + tmp = drv->nr_blocks; + vol_sz_frac = sector_div(tmp, ENG_GIG_FACTOR); + + /* Now, vol_sz_frac = (drv->nr_blocks%ENG_GIG_FACTOR) */ + + vol_sz_frac *= 100; + sector_div(vol_sz_frac, ENG_GIG_FACTOR); + + if (drv->raid_level > 5) + drv->raid_level = RAID_UNKNOWN; + size = sprintf(buffer+len, "cciss/c%dd%d:" + "\t%4d.%02dGB\tRAID %s\n", + ctlr, i, vol_sz,vol_sz_frac, + raid_label[drv->raid_level]); pos += size; len += size; } - size = sprintf(buffer+len, "nr_allocs = %d\nnr_frees = %d\n", - h->nr_allocs, h->nr_frees); - pos += size; len += size; - *eof = 1; *start = buffer+offset; len -= offset; if (len>length) len = length; + h->busy_configuring = 0; return len; } @@ -1304,7 +1345,7 @@ *total_size = 0; *block_size = BLOCK_SIZE; } - printk(KERN_INFO " blocks= %d block_size= %d\n", + printk(KERN_INFO " blocks= %u block_size= %d\n", *total_size, *block_size); return; } @@ -1978,7 +2019,7 @@ /* Is this interrupt for us? */ - if ( h->access.intr_pending(h) == 0) + if (( h->access.intr_pending(h) == 0) || (h->interrupts_enabled == 0)) return IRQ_NONE; /* @@ -2078,18 +2119,61 @@ c->io_mem_addr = 0; c->io_mem_length = 0; } + +static int find_PCI_BAR_index(struct pci_dev *pdev, + unsigned long pci_bar_addr) +{ + int i, offset, mem_type, bar_type; + if (pci_bar_addr == PCI_BASE_ADDRESS_0) /* looking for BAR zero? */ + return 0; + offset = 0; + for (i=0; iirq; __u32 board_id, scratchpad = 0; - int cfg_offset; - int cfg_base_addr; - int cfg_base_addr_index; + __u64 cfg_offset; + __u32 cfg_base_addr; + __u64 cfg_base_addr_index; int i; + /* check to see if controller has been disabled */ + /* BEFORE trying to enable it */ + (void) pci_read_config_word(pdev, PCI_COMMAND,&command); + if(!(command & 0x02)) + { + printk(KERN_WARNING "cciss: controller appears to be disabled\n"); + return(-1); + } + if (pci_enable_device(pdev)) { printk(KERN_ERR "cciss: Unable to Enable PCI device\n"); @@ -2101,38 +2185,19 @@ return(-1); } - vendor_id = pdev->vendor; - device_id = pdev->device; - irq = pdev->irq; - - for(i=0; i<6; i++) - addr[i] = pdev->resource[i].start; - - (void) pci_read_config_word(pdev, PCI_COMMAND,&command); - (void) pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); - (void) pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, - &cache_line_size); - (void) pci_read_config_byte(pdev, PCI_LATENCY_TIMER, - &latency_timer); - (void) pci_read_config_dword(pdev, PCI_SUBSYSTEM_VENDOR_ID, - &board_id); - - /* check to see if controller has been disabled */ - if(!(command & 0x02)) - { - printk(KERN_WARNING "cciss: controller appears to be disabled\n"); - return(-1); - } + subsystem_vendor_id = pdev->subsystem_vendor; + subsystem_device_id = pdev->subsystem_device; + board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) | + subsystem_vendor_id); /* search for our IO range so we can protect it */ - for(i=0; i<6; i++) + for(i=0; iresource[i].flags & 0x01 ) - { - c->io_mem_addr = pdev->resource[i].start; - c->io_mem_length = pdev->resource[i].end - - pdev->resource[i].start +1; + if( pci_resource_flags(pdev, i) & 0x01 ) { + c->io_mem_addr = pci_resource_start(pdev, i); + c->io_mem_length = pci_resource_end(pdev, i) - + pci_resource_start(pdev, i) +1; #ifdef CCISS_DEBUG printk("IO value found base_addr[%d] %lx %lx\n", i, c->io_mem_addr, c->io_mem_length); @@ -2151,15 +2216,8 @@ } #ifdef CCISS_DEBUG - printk("vendor_id = %x\n", vendor_id); - printk("device_id = %x\n", device_id); printk("command = %x\n", command); - for(i=0; i<6; i++) - printk("addr[%d] = %x\n", i, addr[i]); - printk("revision = %x\n", revision); printk("irq = %x\n", irq); - printk("cache_line_size = %x\n", cache_line_size); - printk("latency_timer = %x\n", latency_timer); printk("board_id = %x\n", board_id); #endif /* CCISS_DEBUG */ @@ -2170,7 +2228,7 @@ * table */ - c->paddr = addr[0] ; /* addressing mode bits already removed */ + c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ #ifdef CCISS_DEBUG printk("address 0 = %x\n", c->paddr); #endif /* CCISS_DEBUG */ @@ -2192,22 +2250,27 @@ /* get the address index number */ cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET); - /* I am not prepared to deal with a 64 bit address value */ - cfg_base_addr &= 0xffff; + cfg_base_addr &= (__u32) 0x0000ffff; #ifdef CCISS_DEBUG printk("cfg base address = %x\n", cfg_base_addr); #endif /* CCISS_DEBUG */ - cfg_base_addr_index = (cfg_base_addr - PCI_BASE_ADDRESS_0)/4; + cfg_base_addr_index = + find_PCI_BAR_index(pdev, cfg_base_addr); #ifdef CCISS_DEBUG printk("cfg base address index = %x\n", cfg_base_addr_index); #endif /* CCISS_DEBUG */ + if (cfg_base_addr_index == -1) { + printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); + release_io_mem(c); + return -1; + } cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); #ifdef CCISS_DEBUG printk("cfg offset = %x\n", cfg_offset); #endif /* CCISS_DEBUG */ c->cfgtable = (CfgTable_struct *) - remap_pci_mem((addr[cfg_base_addr_index] & 0xfffffff0) + remap_pci_mem(pci_resource_start(pdev, cfg_base_addr_index) + cfg_offset, sizeof(CfgTable_struct)); c->board_id = board_id; @@ -2236,6 +2299,17 @@ printk("Does not appear to be a valid CISS config table\n"); return -1; } + +#ifdef CONFIG_X86 +{ + /* Need to enable prefetch in the SCSI core for 6400 in x86 */ + __u32 prefetch; + prefetch = readl(&(c->cfgtable->SCSI_Prefetch)); + prefetch |= 0x100; + writel(prefetch, &(c->cfgtable->SCSI_Prefetch)); +} +#endif + #ifdef CCISS_DEBUG printk("Trying to put board into Simple mode\n"); #endif /* CCISS_DEBUG */ @@ -2501,6 +2575,7 @@ if (!q) goto clean4; + q->backing_dev_info.ra_pages = READ_AHEAD; hba[i]->queue = q; q->queuedata = hba[i]; @@ -2610,7 +2685,6 @@ pci_set_drvdata(pdev, NULL); iounmap((void*)hba[i]->vaddr); cciss_unregister_scsi(i); /* unhook from SCSI subsystem */ - blk_cleanup_queue(hba[i]->queue); unregister_blkdev(COMPAQ_CISS_MAJOR+i, hba[i]->devname); remove_proc_entry(hba[i]->devname, proc_cciss); @@ -2621,6 +2695,7 @@ del_gendisk(disk); } + blk_cleanup_queue(hba[i]->queue); pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct), hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle); pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct), @@ -2646,7 +2721,7 @@ printk(KERN_INFO DRIVER_NAME "\n"); /* Register for our PCI devices */ - return pci_register_driver(&cciss_pci_driver); + return pci_module_init(&cciss_pci_driver); } static int __init init_cciss_module(void) diff -Nru a/drivers/block/cciss.h b/drivers/block/cciss.h --- a/drivers/block/cciss.h Tue Feb 17 20:00:05 2004 +++ b/drivers/block/cciss.h Tue Feb 17 20:00:05 2004 @@ -32,6 +32,7 @@ int heads; int sectors; int cylinders; + int raid_level; } drive_info_struct; struct ctlr_info @@ -42,13 +43,13 @@ char firm_ver[4]; // Firmware version struct pci_dev *pdev; __u32 board_id; - ulong vaddr; - __u32 paddr; + unsigned long vaddr; + unsigned long paddr; unsigned long io_mem_addr; unsigned long io_mem_length; CfgTable_struct *cfgtable; int intr; - + int interrupts_enabled; int max_commands; int commands_outstanding; int max_outstanding; /* Debug */ @@ -78,6 +79,7 @@ unsigned long *cmd_pool_bits; int nr_allocs; int nr_frees; + int busy_configuring; // Disk structures we need to pass back struct gendisk *gendisk[NWD]; @@ -134,9 +136,11 @@ { if (val) { /* Turn interrupts on */ + h->interrupts_enabled = 1; writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); } else /* Turn them off */ { + h->interrupts_enabled = 0; writel( SA5_INTR_OFF, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); } @@ -150,9 +154,11 @@ { if (val) { /* Turn interrupts on */ + h->interrupts_enabled = 1; writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); } else /* Turn them off */ { + h->interrupts_enabled = 0; writel( SA5B_INTR_OFF, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); } diff -Nru a/drivers/block/cciss_cmd.h b/drivers/block/cciss_cmd.h --- a/drivers/block/cciss_cmd.h Tue Feb 17 20:00:06 2004 +++ b/drivers/block/cciss_cmd.h Tue Feb 17 20:00:06 2004 @@ -265,6 +265,7 @@ DWORD Reserved; BYTE ServerName[16]; DWORD HeartBeat; + DWORD SCSI_Prefetch; } CfgTable_struct; #pragma pack() #endif // CCISS_CMD_H diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c --- a/drivers/block/floppy.c Tue Feb 17 20:00:06 2004 +++ b/drivers/block/floppy.c Tue Feb 17 20:00:06 2004 @@ -4376,6 +4376,7 @@ /* to be cleaned up... */ disks[drive]->private_data = (void*)(long)drive; disks[drive]->queue = floppy_queue; + disks[drive]->flags |= GENHD_FL_REMOVABLE; add_disk(disks[drive]); } diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c --- a/drivers/block/genhd.c Tue Feb 17 20:00:06 2004 +++ b/drivers/block/genhd.c Tue Feb 17 20:00:06 2004 @@ -260,8 +260,10 @@ if (&sgp->kobj.entry == block_subsys.kset.list.next) seq_puts(part, "major minor #blocks name\n\n"); - /* Don't show non-partitionable devices or empty devices */ - if (!get_capacity(sgp) || sgp->minors == 1) + /* Don't show non-partitionable removeable devices or empty devices */ + if (!get_capacity(sgp) || + (sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE)) + ) return 0; /* show the full disk and all non-0 size partitions of it */ diff -Nru a/drivers/block/paride/Transition-notes b/drivers/block/paride/Transition-notes --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/block/paride/Transition-notes Tue Feb 17 20:00:14 2004 @@ -0,0 +1,128 @@ +Lemma 1: + If ps_tq is scheduled, ps_tq_active is 1. ps_tq_int() can be called + only when ps_tq_active is 1. +Proof: All assignments to ps_tq_active and all scheduling of ps_tq happen + under ps_spinlock. There are three places where that can happen: + one in ps_set_intr() (A) and two in ps_tq_int() (B and C). + Consider the sequnce of these events. A can not be preceded by + anything except B, since it is under if (!ps_tq_active) under + ps_spinlock. C is always preceded by B, since we can't reach it + other than through B and we don't drop ps_spinlock between them. + IOW, the sequence is A?(BA|BC|B)*. OTOH, number of B can not exceed + the sum of numbers of A and C, since each call of ps_tq_int() is + the result of ps_tq execution. Therefore, the sequence starts with + A and each B is preceded by either A or C. Moments when we enter + ps_tq_int() are sandwiched between {A,C} and B in that sequence, + since at any time number of B can not exceed the number of these + moments which, in turn, can not exceed the number of A and C. + In other words, the sequence of events is (A or C set ps_tq_active to + 1 and schedule ps_tq, ps_tq is executed, ps_tq_int() is entered, + B resets ps_tq_active)*. + + +consider the following area: + * in do_pd_request1(): to calls of pi_do_claimed() and return in + case when pd_req is NULL. + * in next_request(): to call of do_pd_request1() + * in do_pd_read(): to call of ps_set_intr() + * in do_pd_read_start(): to calls of pi_do_claimed(), next_request() +and ps_set_intr() + * in do_pd_read_drq(): to calls of pi_do_claimed() and next_request() + * in do_pd_write(): to call of ps_set_intr() + * in do_pd_write_start(): to calls of pi_do_claimed(), next_request() +and ps_set_intr() + * in do_pd_write_done(): to calls of pi_do_claimed() and next_request() + * in ps_set_intr(): to check for ps_tq_active and to scheduling + ps_tq if ps_tq_active was 0. + * in ps_tq_int(): from the moment when we get ps_spinlock() to the + return, call of con() or scheduling ps_tq. + * in pi_schedule_claimed() when called from pi_do_claimed() called from + pd.c, everything until returning 1 or setting or setting ->claim_cont + on the path that returns 0 + * in pi_do_claimed() when called from pd.c, everything until the call + of pi_do_claimed() plus the everything until the call of cont() if + pi_do_claimed() has returned 1. + * in pi_wake_up() called for PIA that belongs to pd.c, everything from + the moment when pi_spinlock has been acquired. + +Lemma 2: + 1) at any time at most one thread of execution can be in that area or + be preempted there. + 2) When there is such a thread, pd_busy is set or pd_lock is held by + that thread. + 3) When there is such a thread, ps_tq_active is 0 or ps_spinlock is + held by that thread. + 4) When there is such a thread, all PIA belonging to pd.c have NULL + ->claim_cont or pi_spinlock is held by thread in question. + +Proof: consider the first moment when the above is not true. + +(1) can become not true if some thread enters that area while another is there. + a) do_pd_request1() can be called from next_request() or do_pd_request() + In the first case the thread was already in the area. In the second, + the thread was holding pd_lock and found pd_busy not set, which would + mean that (2) was already not true. + b) ps_set_intr() and pi_schedule_claimed() can be called only from the + area. + c) pi_do_claimed() is called by pd.c only from the area. + d) ps_tq_int() can enter the area only when the thread is holding + ps_spinlock and ps_tq_active is 1 (due to Lemma 1). It means that + (3) was already not true. + e) do_pd_{read,write}* could be called only from the area. The only + case that needs consideration is call from pi_wake_up() and there + we would have to be called for the PIA that got ->claimed_cont + from pd.c. That could happen only if pi_do_claimed() had been + called from pd.c for that PIA, which happens only for PIA belonging + to pd.c. + f) pi_wake_up() can enter the area only when the thread is holding + pi_spinlock and ->claimed_cont is non-NULL for PIA belonging to + pd.c. It means that (4) was already not true. + +(2) can become not true only when pd_lock is released by the thread in question. + Indeed, pd_busy is reset only in the area and thread that resets + it is holding pd_lock. The only place within the area where we + release pd_lock is in pd_next_buf() (called from within the area). + But that code does not reset pd_busy, so pd_busy would have to be + 0 when pd_next_buf() had acquired pd_lock. If it become 0 while + we were acquiring the lock, (1) would be already false, since + the thread that had reset it would be in the area simulateously. + If it was 0 before we tried to acquire pd_lock, (2) would be + already false. + +For similar reasons, (3) can become not true only when ps_spinlock is released +by the thread in question. However, all such places within the area are right +after resetting ps_tq_active to 0. + +(4) is done the same way - all places where we release pi_spinlock within +the area are either after resetting ->claimed_cont to NULL while holding +pi_spinlock, or after not tocuhing ->claimed_cont since acquiring pi_spinlock +also in the area. The only place where ->claimed_cont is made non-NULL is +in the area, under pi_spinlock and we do not release it until after leaving +the area. + +QED. + + +Corollary 1: ps_tq_active can be killed. Indeed, the only place where we +check its value is in ps_set_intr() and if it had been non-zero at that +point, we would have violated either (2.1) (if it was set while ps_set_intr() +was acquiring ps_spinlock) or (2.3) (if it was set when we started to +acquire ps_spinlock). + +Corollary 2: ps_spinlock can be killed. Indeed, Lemma 1 and Lemma 2 show +that the only possible contention is between scheduling ps_tq followed by +immediate release of spinlock and beginning of execution of ps_tq on +another CPU. + +Corollary 3: assignment to pd_busy in do_pd_read_start() and do_pd_write_start() +can be killed. Indeed, we are not holding pd_lock and thus pd_busy is already +1 here. + +Corollary 4: in ps_tq_int() uses of con can be replaced with uses of +ps_continuation, since the latter is changed only from the area. +We don't need to reset it to NULL, since we are guaranteed that there +will be a call of ps_set_intr() before we look at ps_continuation again. +We can remove the check for ps_continuation being NULL for the same +reason - the value is guaranteed to be set by the last ps_set_intr() and +we never pass it NULL. Assignements in the beginning of ps_set_intr() +can be taken to callers as long as they remain within the area. diff -Nru a/drivers/block/paride/bpck6.c b/drivers/block/paride/bpck6.c --- a/drivers/block/paride/bpck6.c Tue Feb 17 20:00:07 2004 +++ b/drivers/block/paride/bpck6.c Tue Feb 17 20:00:07 2004 @@ -228,7 +228,7 @@ if (p) { memset(p, 0, sizeof(PPC)); - pi->private = (int)p; + pi->private = (unsigned long)p; return 0; } diff -Nru a/drivers/block/paride/frpw.c b/drivers/block/paride/frpw.c --- a/drivers/block/paride/frpw.c Tue Feb 17 20:00:08 2004 +++ b/drivers/block/paride/frpw.c Tue Feb 17 20:00:08 2004 @@ -261,7 +261,7 @@ frpw_disconnect(pi); if (verbose) { - printk("%s: frpw: port 0x%x, chip %d, mode %d, test=(%d,%d,%d)\n", + printk("%s: frpw: port 0x%x, chip %ld, mode %d, test=(%d,%d,%d)\n", pi->device,pi->port,(pi->private%2),pi->mode,e[0],e[1],r); } diff -Nru a/drivers/block/paride/paride.c b/drivers/block/paride/paride.c --- a/drivers/block/paride/paride.c Tue Feb 17 20:00:06 2004 +++ b/drivers/block/paride/paride.c Tue Feb 17 20:00:06 2004 @@ -102,7 +102,7 @@ #endif -void pi_do_claimed(PIA * pi, void (*cont) (void)) +int pi_schedule_claimed(PIA * pi, void (*cont) (void)) { #ifdef CONFIG_PARPORT unsigned long flags; @@ -111,12 +111,19 @@ if (pi->pardev && parport_claim(pi->pardev)) { pi->claim_cont = cont; spin_unlock_irqrestore(&pi_spinlock, flags); - return; + return 0; } pi->claimed = 1; spin_unlock_irqrestore(&pi_spinlock, flags); #endif - cont(); + return 1; +} +EXPORT_SYMBOL(pi_schedule_claimed); + +void pi_do_claimed(PIA * pi, void (*cont) (void)) +{ + if (pi_schedule_claimed(pi, cont)) + cont(); } EXPORT_SYMBOL(pi_do_claimed); @@ -133,7 +140,7 @@ #endif } -static void pi_unclaim(PIA * pi) +void pi_unclaim(PIA * pi) { pi->claimed = 0; #ifdef CONFIG_PARPORT @@ -141,6 +148,8 @@ parport_release((struct pardevice *) (pi->pardev)); #endif } + +EXPORT_SYMBOL(pi_unclaim); void pi_connect(PIA * pi) { diff -Nru a/drivers/block/paride/paride.h b/drivers/block/paride/paride.h --- a/drivers/block/paride/paride.h Tue Feb 17 20:00:06 2004 +++ b/drivers/block/paride/paride.h Tue Feb 17 20:00:06 2004 @@ -45,7 +45,7 @@ int saved_r0; /* saved port state */ int saved_r2; /* saved port state */ int reserved; /* number of ports reserved */ - int private; /* for protocol module */ + unsigned long private; /* for protocol module */ wait_queue_head_t parq; /* semaphore for parport sharing */ void *pardev; /* pointer to pardevice */ @@ -88,11 +88,14 @@ extern void pi_read_block(PIA *pi, char * buf, int count); +extern void pi_unclaim(PIA *pi); + extern void pi_connect(PIA *pi); extern void pi_disconnect(PIA *pi); extern void pi_do_claimed(PIA *pi, void (*cont)(void)); +extern int pi_schedule_claimed(PIA *pi, void (*cont)(void)); /* macros and functions exported to the protocol modules */ diff -Nru a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c --- a/drivers/block/paride/pd.c Tue Feb 17 20:00:07 2004 +++ b/drivers/block/paride/pd.c Tue Feb 17 20:00:07 2004 @@ -138,7 +138,6 @@ static int drive3[8] = { 0, 0, 0, -1, 0, 1, -1, -1 }; static int (*drives[4])[8] = {&drive0, &drive1, &drive2, &drive3}; -static int pd_drive_count; enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO, D_SBY, D_DLY, D_SLV}; @@ -153,6 +152,8 @@ #include #include #include +#include +#include static spinlock_t pd_lock = SPIN_LOCK_UNLOCKED; @@ -188,7 +189,6 @@ MODULE_PARM(drive3, "1-8i"); #include "paride.h" -#include "pseudo.h" #define PD_BITS 4 @@ -235,21 +235,6 @@ #define IDE_IDENTIFY 0xec #define IDE_EJECT 0xed -void pd_setup(char *str, int *ints); -static int pd_open(struct inode *inode, struct file *file); -static void do_pd_request(request_queue_t * q); -static int pd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg); -static int pd_release(struct inode *inode, struct file *file); -static int pd_revalidate(struct gendisk *p); -static int pd_detect(void); -static void do_pd_read(void); -static void do_pd_read_start(void); -static void do_pd_write(void); -static void do_pd_write_start(void); -static void do_pd_read_drq(void); -static void do_pd_write_done(void); - #define PD_NAMELEN 8 struct pd_unit { @@ -266,153 +251,19 @@ int removable; /* removable media device ? */ int standby; int alt_geom; - int present; char name[PD_NAMELEN]; /* pda, pdb, etc ... */ struct gendisk *gd; }; struct pd_unit pd[PD_UNITS]; -static int pd_identify(struct pd_unit *disk); -static void pd_media_check(struct pd_unit *disk); -static void pd_doorlock(struct pd_unit *disk, int func); -static int pd_check_media(struct gendisk *p); -static void pd_eject(struct pd_unit *disk); - static char pd_scratch[512]; /* scratch block buffer */ -/* the variables below are used mainly in the I/O request engine, which - processes only one request at a time. -*/ - -static struct pd_unit *pd_current; /* current request's drive */ -static int pd_retries = 0; /* i/o error retry count */ -static int pd_busy = 0; /* request being processed ? */ -static struct request *pd_req; /* current request */ -static int pd_block; /* address of next requested block */ -static int pd_count; /* number of blocks still to do */ -static int pd_run; /* sectors in current cluster */ -static int pd_cmd; /* current command READ/WRITE */ -static char *pd_buf; /* buffer for request in progress */ - -static DECLARE_WAIT_QUEUE_HEAD(pd_wait_open); - static char *pd_errs[17] = { "ERR", "INDEX", "ECC", "DRQ", "SEEK", "WRERR", "READY", "BUSY", "AMNF", "TK0NF", "ABRT", "MCR", "IDNF", "MC", "UNC", "???", "TMO" }; -/* kernel glue structures */ - -extern struct block_device_operations pd_fops; - -static struct block_device_operations pd_fops = { - .owner = THIS_MODULE, - .open = pd_open, - .release = pd_release, - .ioctl = pd_ioctl, - .media_changed = pd_check_media, - .revalidate_disk= pd_revalidate -}; - -static void pd_init_units(void) -{ - int unit; - - pd_drive_count = 0; - for (unit = 0; unit < PD_UNITS; unit++) { - int *parm = *drives[unit]; - struct pd_unit *disk = pd + unit; - disk->pi = &disk->pia; - disk->access = 0; - disk->changed = 1; - disk->capacity = 0; - disk->drive = parm[D_SLV]; - disk->present = 0; - snprintf(disk->name, PD_NAMELEN, "%s%c", name, 'a'+unit); - disk->alt_geom = parm[D_GEO]; - disk->standby = parm[D_SBY]; - if (parm[D_PRT]) - pd_drive_count++; - } -} - -static int pd_open(struct inode *inode, struct file *file) -{ - struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; - - disk->access++; - - if (disk->removable) { - pd_media_check(disk); - pd_doorlock(disk, IDE_DOORLOCK); - } - return 0; -} - -static int pd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; - struct hd_geometry *geo = (struct hd_geometry *) arg; - struct hd_geometry g; - - switch (cmd) { - case CDROMEJECT: - if (disk->access == 1) - pd_eject(disk); - return 0; - case HDIO_GETGEO: - if (disk->alt_geom) { - g.heads = PD_LOG_HEADS; - g.sectors = PD_LOG_SECTS; - g.cylinders = disk->capacity / (g.heads * g.sectors); - } else { - g.heads = disk->heads; - g.sectors = disk->sectors; - g.cylinders = disk->cylinders; - } - g.start = get_start_sect(inode->i_bdev); - if (copy_to_user(geo, &g, sizeof(struct hd_geometry))) - return -EFAULT; - return 0; - default: - return -EINVAL; - } -} - -static int pd_release(struct inode *inode, struct file *file) -{ - struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; - - if (!--disk->access && disk->removable) - pd_doorlock(disk, IDE_DOORUNLOCK); - - return 0; -} - -static int pd_check_media(struct gendisk *p) -{ - struct pd_unit *disk = p->private_data; - int r; - if (!disk->removable) - return 0; - pd_media_check(disk); - r = disk->changed; - disk->changed = 0; - return r; -} - -static int pd_revalidate(struct gendisk *p) -{ - struct pd_unit *disk = p->private_data; - if (pd_identify(disk)) - set_capacity(p, disk->capacity); - else - set_capacity(p, 0); - return 0; -} - static inline int status_reg(struct pd_unit *disk) { return pi_read_regr(disk->pi, 1, 6); @@ -453,11 +304,9 @@ static void pd_reset(struct pd_unit *disk) { /* called only for MASTER drive */ - pi_connect(disk->pi); write_status(disk, 4); udelay(50); write_status(disk, 0); - pi_disconnect(disk->pi); udelay(250); } @@ -514,6 +363,236 @@ pd_send_command(disk, count, s, h, c0, c1, func); } +/* The i/o request engine */ + +enum action {Fail = 0, Ok = 1, Hold, Wait}; + +static struct request *pd_req; /* current request */ +static enum action (*phase)(void); + +static void run_fsm(void); + +static void ps_tq_int( void *data); + +static DECLARE_WORK(fsm_tq, ps_tq_int, NULL); + +static void schedule_fsm(void) +{ + if (!nice) + schedule_work(&fsm_tq); + else + schedule_delayed_work(&fsm_tq, nice-1); +} + +static void ps_tq_int(void *data) +{ + run_fsm(); +} + +static enum action do_pd_io_start(void); +static enum action pd_special(void); +static enum action do_pd_read_start(void); +static enum action do_pd_write_start(void); +static enum action do_pd_read_drq(void); +static enum action do_pd_write_done(void); + +static struct request_queue *pd_queue; +static int pd_claimed; + +static struct pd_unit *pd_current; /* current request's drive */ +static PIA *pi_current; /* current request's PIA */ + +static void run_fsm(void) +{ + while (1) { + enum action res; + unsigned long saved_flags; + int stop = 0; + + if (!phase) { + pd_current = pd_req->rq_disk->private_data; + pi_current = pd_current->pi; + phase = do_pd_io_start; + } + + switch (pd_claimed) { + case 0: + pd_claimed = 1; + if (!pi_schedule_claimed(pi_current, run_fsm)) + return; + case 1: + pd_claimed = 2; + pi_current->proto->connect(pi_current); + } + + switch(res = phase()) { + case Ok: case Fail: + pi_disconnect(pi_current); + pd_claimed = 0; + phase = NULL; + spin_lock_irqsave(&pd_lock, saved_flags); + end_request(pd_req, res); + pd_req = elv_next_request(pd_queue); + if (!pd_req) + stop = 1; + spin_unlock_irqrestore(&pd_lock, saved_flags); + if (stop) + return; + case Hold: + schedule_fsm(); + return; + case Wait: + pi_disconnect(pi_current); + pd_claimed = 0; + } + } +} + +static int pd_retries = 0; /* i/o error retry count */ +static int pd_block; /* address of next requested block */ +static int pd_count; /* number of blocks still to do */ +static int pd_run; /* sectors in current cluster */ +static int pd_cmd; /* current command READ/WRITE */ +static char *pd_buf; /* buffer for request in progress */ + +static enum action do_pd_io_start(void) +{ + if (pd_req->flags & REQ_SPECIAL) { + phase = pd_special; + return pd_special(); + } + + pd_cmd = rq_data_dir(pd_req); + if (pd_cmd == READ || pd_cmd == WRITE) { + pd_block = pd_req->sector; + pd_count = pd_req->current_nr_sectors; + if (pd_block + pd_count > get_capacity(pd_req->rq_disk)) + return Fail; + pd_run = pd_req->nr_sectors; + pd_buf = pd_req->buffer; + pd_retries = 0; + if (pd_cmd == READ) + return do_pd_read_start(); + else + return do_pd_write_start(); + } + return Fail; +} + +static enum action pd_special(void) +{ + enum action (*func)(struct pd_unit *) = pd_req->special; + return func(pd_current); +} + +static int pd_next_buf(void) +{ + unsigned long saved_flags; + + pd_count--; + pd_run--; + pd_buf += 512; + pd_block++; + if (!pd_run) + return 1; + if (pd_count) + return 0; + spin_lock_irqsave(&pd_lock, saved_flags); + end_request(pd_req, 1); + pd_count = pd_req->current_nr_sectors; + pd_buf = pd_req->buffer; + spin_unlock_irqrestore(&pd_lock, saved_flags); + return 0; +} + +static unsigned long pd_timeout; + +static enum action do_pd_read_start(void) +{ + if (pd_wait_for(pd_current, STAT_READY, "do_pd_read") & STAT_ERR) { + if (pd_retries < PD_MAX_RETRIES) { + pd_retries++; + return Wait; + } + return Fail; + } + pd_ide_command(pd_current, IDE_READ, pd_block, pd_run); + phase = do_pd_read_drq; + pd_timeout = jiffies + PD_TMO; + return Hold; +} + +static enum action do_pd_write_start(void) +{ + if (pd_wait_for(pd_current, STAT_READY, "do_pd_write") & STAT_ERR) { + if (pd_retries < PD_MAX_RETRIES) { + pd_retries++; + return Wait; + } + return Fail; + } + pd_ide_command(pd_current, IDE_WRITE, pd_block, pd_run); + while (1) { + if (pd_wait_for(pd_current, STAT_DRQ, "do_pd_write_drq") & STAT_ERR) { + if (pd_retries < PD_MAX_RETRIES) { + pd_retries++; + return Wait; + } + return Fail; + } + pi_write_block(pd_current->pi, pd_buf, 512); + if (pd_next_buf()) + break; + } + phase = do_pd_write_done; + pd_timeout = jiffies + PD_TMO; + return Hold; +} + +static inline int pd_ready(void) +{ + return !(status_reg(pd_current) & STAT_BUSY); +} + +static enum action do_pd_read_drq(void) +{ + if (!pd_ready() && !time_after_eq(jiffies, pd_timeout)) + return Hold; + + while (1) { + if (pd_wait_for(pd_current, STAT_DRQ, "do_pd_read_drq") & STAT_ERR) { + if (pd_retries < PD_MAX_RETRIES) { + pd_retries++; + phase = do_pd_read_start; + return Wait; + } + return Fail; + } + pi_read_block(pd_current->pi, pd_buf, 512); + if (pd_next_buf()) + break; + } + return Ok; +} + +static enum action do_pd_write_done(void) +{ + if (!pd_ready() && !time_after_eq(jiffies, pd_timeout)) + return Hold; + + if (pd_wait_for(pd_current, STAT_READY, "do_pd_write_done") & STAT_ERR) { + if (pd_retries < PD_MAX_RETRIES) { + pd_retries++; + phase = do_pd_write_start; + return Wait; + } + return Fail; + } + return Ok; +} + +/* special io requests */ + /* According to the ATA standard, the default CHS geometry should be available following a reset. Some Western Digital drives come up in a mode where only LBA addresses are accepted until the device @@ -522,43 +601,45 @@ static void pd_init_dev_parms(struct pd_unit *disk) { - pi_connect(disk->pi); pd_wait_for(disk, 0, DBMSG("before init_dev_parms")); pd_send_command(disk, disk->sectors, 0, disk->heads - 1, 0, 0, IDE_INIT_DEV_PARMS); udelay(300); pd_wait_for(disk, 0, "Initialise device parameters"); - pi_disconnect(disk->pi); } -static void pd_doorlock(struct pd_unit *disk, int func) +static enum action pd_door_lock(struct pd_unit *disk) +{ + if (!(pd_wait_for(disk, STAT_READY, "Lock") & STAT_ERR)) { + pd_send_command(disk, 1, 0, 0, 0, 0, IDE_DOORLOCK); + pd_wait_for(disk, STAT_READY, "Lock done"); + } + return Ok; +} + +static enum action pd_door_unlock(struct pd_unit *disk) { - pi_connect(disk->pi); if (!(pd_wait_for(disk, STAT_READY, "Lock") & STAT_ERR)) { - pd_send_command(disk, 1, 0, 0, 0, 0, func); + pd_send_command(disk, 1, 0, 0, 0, 0, IDE_DOORUNLOCK); pd_wait_for(disk, STAT_READY, "Lock done"); } - pi_disconnect(disk->pi); + return Ok; } -static void pd_eject(struct pd_unit *disk) +static enum action pd_eject(struct pd_unit *disk) { - pi_connect(disk->pi); pd_wait_for(disk, 0, DBMSG("before unlock on eject")); pd_send_command(disk, 1, 0, 0, 0, 0, IDE_DOORUNLOCK); pd_wait_for(disk, 0, DBMSG("after unlock on eject")); pd_wait_for(disk, 0, DBMSG("before eject")); pd_send_command(disk, 0, 0, 0, 0, 0, IDE_EJECT); pd_wait_for(disk, 0, DBMSG("after eject")); - pi_disconnect(disk->pi); + return Ok; } -static void pd_media_check(struct pd_unit *disk) +static enum action pd_media_check(struct pd_unit *disk) { - int r; - - pi_connect(disk->pi); - r = pd_wait_for(disk, STAT_READY, DBMSG("before media_check")); + int r = pd_wait_for(disk, STAT_READY, DBMSG("before media_check")); if (!(r & STAT_ERR)) { pd_send_command(disk, 1, 1, 0, 0, 0, IDE_READ_VRFY); r = pd_wait_for(disk, STAT_READY, DBMSG("RDY after READ_VRFY")); @@ -571,20 +652,17 @@ pd_send_command(disk, 1, 1, 0, 0, 0, IDE_READ_VRFY); r = pd_wait_for(disk, STAT_READY, DBMSG("RDY after VRFY")); } - pi_disconnect(disk->pi); - + return Ok; } static void pd_standby_off(struct pd_unit *disk) { - pi_connect(disk->pi); pd_wait_for(disk, 0, DBMSG("before STANDBY")); pd_send_command(disk, 0, 0, 0, 0, 0, IDE_STANDBY); pd_wait_for(disk, 0, DBMSG("after STANDBY")); - pi_disconnect(disk->pi); } -static int pd_identify(struct pd_unit *disk) +static enum action pd_identify(struct pd_unit *disk) { int j; char id[PD_ID_LEN + 1]; @@ -598,17 +676,13 @@ if (disk->drive == 0) pd_reset(disk); - pi_connect(disk->pi); write_reg(disk, 6, DRIVE(disk)); pd_wait_for(disk, 0, DBMSG("before IDENT")); pd_send_command(disk, 1, 0, 0, 0, 0, IDE_IDENTIFY); - if (pd_wait_for(disk, STAT_DRQ, DBMSG("IDENT DRQ")) & STAT_ERR) { - pi_disconnect(disk->pi); - return 0; - } + if (pd_wait_for(disk, STAT_DRQ, DBMSG("IDENT DRQ")) & STAT_ERR) + return Fail; pi_read_block(disk->pi, pd_scratch, 512); - pi_disconnect(disk->pi); disk->can_lba = pd_scratch[99] & 2; disk->sectors = le16_to_cpu(*(u16 *) (pd_scratch + 12)); disk->heads = le16_to_cpu(*(u16 *) (pd_scratch + 6)); @@ -640,250 +714,209 @@ if (!disk->standby) pd_standby_off(disk); - return 1; -} - -static int pd_probe_drive(struct pd_unit *disk) -{ - if (disk->drive == -1) { - for (disk->drive = 0; disk->drive <= 1; disk->drive++) - if (pd_identify(disk)) - return 1; - return 0; - } - return pd_identify(disk); + return Ok; } -static struct request_queue *pd_queue; +/* end of io request engine */ -static int pd_detect(void) +static void do_pd_request(request_queue_t * q) { - int k, unit; - struct pd_unit *disk; - - k = 0; - if (pd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */ - disk = pd; - if (pi_init(disk->pi, 1, -1, -1, -1, -1, -1, pd_scratch, - PI_PD, verbose, disk->name)) { - if (pd_probe_drive(disk)) { - disk->present = 1; - k = 1; - } else - pi_release(disk->pi); - } + if (pd_req) + return; + pd_req = elv_next_request(q); + if (!pd_req) + return; - } else { - for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) { - int *parm = *drives[unit]; - if (!parm[D_PRT]) - continue; - if (pi_init(disk->pi, 0, parm[D_PRT], parm[D_MOD], - parm[D_UNI], parm[D_PRO], parm[D_DLY], - pd_scratch, PI_PD, verbose, disk->name)) { - if (pd_probe_drive(disk)) { - disk->present = 1; - k = unit + 1; - } else - pi_release(disk->pi); - } - } - } - for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) { - if (disk->present) { - struct gendisk *p = alloc_disk(1 << PD_BITS); - if (!p) { - disk->present = 0; - k--; - continue; - } - strcpy(p->disk_name, disk->name); - p->fops = &pd_fops; - p->major = major; - p->first_minor = unit << PD_BITS; - set_capacity(p, disk->capacity); - disk->gd = p; - p->private_data = disk; - p->queue = pd_queue; - add_disk(p); - } - } - if (k) - return 1; - printk("%s: no valid drive found\n", name); - return 0; + schedule_fsm(); } -/* The i/o request engine */ - -static int pd_ready(void) +static int pd_special_command(struct pd_unit *disk, + enum action (*func)(struct pd_unit *disk)) { - return !(status_reg(pd_current) & STAT_BUSY); + DECLARE_COMPLETION(wait); + struct request rq; + int err = 0; + + memset(&rq, 0, sizeof(rq)); + rq.errors = 0; + rq.rq_status = RQ_ACTIVE; + rq.rq_disk = disk->gd; + rq.ref_count = 1; + rq.waiting = &wait; + blk_insert_request(disk->gd->queue, &rq, 0, func, 0); + wait_for_completion(&wait); + rq.waiting = NULL; + if (rq.errors) + err = -EIO; + blk_put_request(&rq); + return err; } -static void do_pd_request(request_queue_t * q) -{ - if (pd_busy) - return; -repeat: - pd_req = elv_next_request(q); - if (!pd_req) - return; +/* kernel glue structures */ - pd_block = pd_req->sector; - pd_run = pd_req->nr_sectors; - pd_count = pd_req->current_nr_sectors; - pd_current = pd_req->rq_disk->private_data; - if (pd_block + pd_count > get_capacity(pd_req->rq_disk)) { - end_request(pd_req, 0); - goto repeat; - } +static int pd_open(struct inode *inode, struct file *file) +{ + struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; - pd_cmd = rq_data_dir(pd_req); - pd_buf = pd_req->buffer; - pd_retries = 0; + disk->access++; - pd_busy = 1; - if (pd_cmd == READ) - pi_do_claimed(pd_current->pi, do_pd_read); - else if (pd_cmd == WRITE) - pi_do_claimed(pd_current->pi, do_pd_write); - else { - pd_busy = 0; - end_request(pd_req, 0); - goto repeat; + if (disk->removable) { + pd_special_command(disk, pd_media_check); + pd_special_command(disk, pd_door_lock); } + return 0; } -static int pd_next_buf(void) +static int pd_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) { - unsigned long saved_flags; + struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; + struct hd_geometry *geo = (struct hd_geometry *) arg; + struct hd_geometry g; - pd_count--; - pd_run--; - pd_buf += 512; - pd_block++; - if (!pd_run) - return 1; - if (pd_count) + switch (cmd) { + case CDROMEJECT: + if (disk->access == 1) + pd_special_command(disk, pd_eject); return 0; - spin_lock_irqsave(&pd_lock, saved_flags); - end_request(pd_req, 1); - pd_count = pd_req->current_nr_sectors; - pd_buf = pd_req->buffer; - spin_unlock_irqrestore(&pd_lock, saved_flags); - return 0; + case HDIO_GETGEO: + if (disk->alt_geom) { + g.heads = PD_LOG_HEADS; + g.sectors = PD_LOG_SECTS; + g.cylinders = disk->capacity / (g.heads * g.sectors); + } else { + g.heads = disk->heads; + g.sectors = disk->sectors; + g.cylinders = disk->cylinders; + } + g.start = get_start_sect(inode->i_bdev); + if (copy_to_user(geo, &g, sizeof(struct hd_geometry))) + return -EFAULT; + return 0; + default: + return -EINVAL; + } } -static inline void next_request(int success) +static int pd_release(struct inode *inode, struct file *file) { - unsigned long saved_flags; + struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; - spin_lock_irqsave(&pd_lock, saved_flags); - end_request(pd_req, success); - pd_busy = 0; - do_pd_request(pd_queue); - spin_unlock_irqrestore(&pd_lock, saved_flags); + if (!--disk->access && disk->removable) + pd_special_command(disk, pd_door_unlock); + + return 0; } -static void do_pd_read(void) +static int pd_check_media(struct gendisk *p) { - ps_set_intr(do_pd_read_start, 0, 0, nice); + struct pd_unit *disk = p->private_data; + int r; + if (!disk->removable) + return 0; + pd_special_command(disk, pd_media_check); + r = disk->changed; + disk->changed = 0; + return r; } -static void do_pd_read_start(void) +static int pd_revalidate(struct gendisk *p) { - pd_busy = 1; - - pi_connect(pd_current->pi); - if (pd_wait_for(pd_current, STAT_READY, "do_pd_read") & STAT_ERR) { - pi_disconnect(pd_current->pi); - if (pd_retries < PD_MAX_RETRIES) { - pd_retries++; - pi_do_claimed(pd_current->pi, do_pd_read_start); - return; - } - next_request(0); - return; - } - pd_ide_command(pd_current, IDE_READ, pd_block, pd_run); - ps_set_intr(do_pd_read_drq, pd_ready, PD_TMO, nice); + struct pd_unit *disk = p->private_data; + if (pd_special_command(disk, pd_identify) == 0) + set_capacity(p, disk->capacity); + else + set_capacity(p, 0); + return 0; } -static void do_pd_read_drq(void) +static struct block_device_operations pd_fops = { + .owner = THIS_MODULE, + .open = pd_open, + .release = pd_release, + .ioctl = pd_ioctl, + .media_changed = pd_check_media, + .revalidate_disk= pd_revalidate +}; + +/* probing */ + +static void pd_probe_drive(struct pd_unit *disk) { - while (1) { - if (pd_wait_for(pd_current, STAT_DRQ, "do_pd_read_drq") & STAT_ERR) { - pi_disconnect(pd_current->pi); - if (pd_retries < PD_MAX_RETRIES) { - pd_retries++; - pi_do_claimed(pd_current->pi, do_pd_read_start); + struct gendisk *p = alloc_disk(1 << PD_BITS); + if (!p) + return; + strcpy(p->disk_name, disk->name); + p->fops = &pd_fops; + p->major = major; + p->first_minor = (disk - pd) << PD_BITS; + disk->gd = p; + p->private_data = disk; + p->queue = pd_queue; + + if (disk->drive == -1) { + for (disk->drive = 0; disk->drive <= 1; disk->drive++) + if (pd_special_command(disk, pd_identify) == 0) return; - } - next_request(0); - return; - } - pi_read_block(pd_current->pi, pd_buf, 512); - if (pd_next_buf()) - break; - } - pi_disconnect(pd_current->pi); - next_request(1); + } else if (pd_special_command(disk, pd_identify) == 0) + return; + disk->gd = NULL; + put_disk(p); } -static void do_pd_write(void) +static int pd_detect(void) { - ps_set_intr(do_pd_write_start, 0, 0, nice); -} + int found = 0, unit, pd_drive_count = 0; + struct pd_unit *disk; -static void do_pd_write_start(void) -{ - pd_busy = 1; + for (unit = 0; unit < PD_UNITS; unit++) { + int *parm = *drives[unit]; + struct pd_unit *disk = pd + unit; + disk->pi = &disk->pia; + disk->access = 0; + disk->changed = 1; + disk->capacity = 0; + disk->drive = parm[D_SLV]; + snprintf(disk->name, PD_NAMELEN, "%s%c", name, 'a'+unit); + disk->alt_geom = parm[D_GEO]; + disk->standby = parm[D_SBY]; + if (parm[D_PRT]) + pd_drive_count++; + } - pi_connect(pd_current->pi); - if (pd_wait_for(pd_current, STAT_READY, "do_pd_write") & STAT_ERR) { - pi_disconnect(pd_current->pi); - if (pd_retries < PD_MAX_RETRIES) { - pd_retries++; - pi_do_claimed(pd_current->pi, do_pd_write_start); - return; + if (pd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */ + disk = pd; + if (pi_init(disk->pi, 1, -1, -1, -1, -1, -1, pd_scratch, + PI_PD, verbose, disk->name)) { + pd_probe_drive(disk); + if (!disk->gd) + pi_release(disk->pi); } - next_request(0); - return; - } - pd_ide_command(pd_current, IDE_WRITE, pd_block, pd_run); - while (1) { - if (pd_wait_for(pd_current, STAT_DRQ, "do_pd_write_drq") & STAT_ERR) { - pi_disconnect(pd_current->pi); - if (pd_retries < PD_MAX_RETRIES) { - pd_retries++; - pi_do_claimed(pd_current->pi, do_pd_write_start); - return; + + } else { + for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) { + int *parm = *drives[unit]; + if (!parm[D_PRT]) + continue; + if (pi_init(disk->pi, 0, parm[D_PRT], parm[D_MOD], + parm[D_UNI], parm[D_PRO], parm[D_DLY], + pd_scratch, PI_PD, verbose, disk->name)) { + pd_probe_drive(disk); + if (!disk->gd) + pi_release(disk->pi); } - next_request(0); - return; } - pi_write_block(pd_current->pi, pd_buf, 512); - if (pd_next_buf()) - break; } - ps_set_intr(do_pd_write_done, pd_ready, PD_TMO, nice); -} - -static void do_pd_write_done(void) -{ - if (pd_wait_for(pd_current, STAT_READY, "do_pd_write_done") & STAT_ERR) { - pi_disconnect(pd_current->pi); - if (pd_retries < PD_MAX_RETRIES) { - pd_retries++; - pi_do_claimed(pd_current->pi, do_pd_write_start); - return; + for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) { + if (disk->gd) { + set_capacity(disk->gd, disk->capacity); + add_disk(disk->gd); + found = 1; } - next_request(0); - return; } - pi_disconnect(pd_current->pi); - next_request(1); + if (!found) + printk("%s: no valid drive found\n", name); + return found; } static int __init pd_init(void) @@ -902,7 +935,6 @@ printk("%s: %s version %s, major %d, cluster %d, nice %d\n", name, name, PD_VERSION, major, cluster, nice); - pd_init_units(); if (!pd_detect()) goto out3; @@ -922,8 +954,8 @@ int unit; unregister_blkdev(major, name); for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) { - if (disk->present) { - struct gendisk *p = disk->gd; + struct gendisk *p = disk->gd; + if (p) { disk->gd = NULL; del_gendisk(p); put_disk(p); diff -Nru a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c --- a/drivers/block/ps2esdi.c Tue Feb 17 20:00:05 2004 +++ b/drivers/block/ps2esdi.c Tue Feb 17 20:00:05 2004 @@ -743,7 +743,7 @@ drive_num = int_ret_code >> 5; switch (int_ret_code & 0xf) { case INT_CMD_COMPLETE: - for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); + for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) { printk("%s: timeout reading status word\n", DEVICE_NAME); outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN); @@ -879,7 +879,7 @@ break; case INT_CMD_COMPLETE: - for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); + for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) { printk("%s: timeout reading status word\n", DEVICE_NAME); outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN); diff -Nru a/drivers/block/scsi_ioctl.c b/drivers/block/scsi_ioctl.c --- a/drivers/block/scsi_ioctl.c Tue Feb 17 20:00:08 2004 +++ b/drivers/block/scsi_ioctl.c Tue Feb 17 20:00:08 2004 @@ -46,14 +46,14 @@ #define SCSI_SENSE_BUFFERSIZE 64 #endif -static int blk_do_rq(request_queue_t *q, struct block_device *bdev, +static int blk_do_rq(request_queue_t *q, struct gendisk *bd_disk, struct request *rq) { char sense[SCSI_SENSE_BUFFERSIZE]; DECLARE_COMPLETION(wait); int err = 0; - rq->rq_disk = bdev->bd_disk; + rq->rq_disk = bd_disk; /* * we need an extra reference to the request, so we can look at @@ -142,7 +142,7 @@ return put_user(1, p); } -static int sg_io(request_queue_t *q, struct block_device *bdev, +static int sg_io(request_queue_t *q, struct gendisk *bd_disk, struct sg_io_hdr *hdr) { unsigned long start_time; @@ -190,7 +190,7 @@ * first try to map it into a bio. reading from device will * be a write to vm. */ - bio = bio_map_user(bdev, (unsigned long) hdr->dxferp, + bio = bio_map_user(q, NULL, (unsigned long) hdr->dxferp, hdr->dxfer_len, reading); /* @@ -246,7 +246,7 @@ * (if he doesn't check that is his problem). * N.B. a non-zero SCSI status is _not_ necessarily an error. */ - blk_do_rq(q, bdev, rq); + blk_do_rq(q, bd_disk, rq); if (bio) bio_unmap_user(bio, reading); @@ -296,7 +296,7 @@ #define READ_DEFECT_DATA_TIMEOUT (60 * HZ ) #define OMAX_SB_LEN 16 /* For backward compatibility */ -static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev, +static int sg_scsi_ioctl(request_queue_t *q, struct gendisk *bd_disk, Scsi_Ioctl_Command *sic) { struct request *rq; @@ -369,7 +369,7 @@ rq->data_len = bytes; rq->flags |= REQ_BLOCK_PC; - blk_do_rq(q, bdev, rq); + blk_do_rq(q, bd_disk, rq); err = rq->errors & 0xff; /* only 8 bit SCSI status */ if (err) { if (rq->sense_len && rq->sense) { @@ -389,13 +389,13 @@ return err; } -int scsi_cmd_ioctl(struct block_device *bdev, unsigned int cmd, unsigned long arg) +int scsi_cmd_ioctl(struct gendisk *bd_disk, unsigned int cmd, unsigned long arg) { request_queue_t *q; struct request *rq; int close = 0, err; - q = bdev_get_queue(bdev); + q = bd_disk->queue; if (!q) return -ENXIO; @@ -446,7 +446,7 @@ old_cdb = hdr.cmdp; hdr.cmdp = cdb; - err = sg_io(q, bdev, &hdr); + err = sg_io(q, bd_disk, &hdr); hdr.cmdp = old_cdb; if (copy_to_user((struct sg_io_hdr *) arg, &hdr, sizeof(hdr))) @@ -493,7 +493,7 @@ hdr.timeout = cgc.timeout; hdr.cmdp = cgc.cmd; hdr.cmd_len = sizeof(cgc.cmd); - err = sg_io(q, bdev, &hdr); + err = sg_io(q, bd_disk, &hdr); if (hdr.status) err = -EIO; @@ -514,7 +514,8 @@ if (!arg) break; - err = sg_scsi_ioctl(q, bdev, (Scsi_Ioctl_Command *)arg); + err = sg_scsi_ioctl(q, bd_disk, + (Scsi_Ioctl_Command *)arg); break; case CDROMCLOSETRAY: close = 1; @@ -528,7 +529,7 @@ rq->cmd[0] = GPCMD_START_STOP_UNIT; rq->cmd[4] = 0x02 + (close != 0); rq->cmd_len = 6; - err = blk_do_rq(q, bdev, rq); + err = blk_do_rq(q, bd_disk, rq); blk_put_request(rq); break; default: diff -Nru a/drivers/block/swim3.c b/drivers/block/swim3.c --- a/drivers/block/swim3.c Tue Feb 17 20:00:06 2004 +++ b/drivers/block/swim3.c Tue Feb 17 20:00:06 2004 @@ -24,7 +24,10 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -144,7 +147,7 @@ #define RELAX 3 /* also eject in progress */ #define READ_DATA_0 4 #define TWOMEG_DRIVE 5 -#define SINGLE_SIDED 6 +#define SINGLE_SIDED 6 /* drive or diskette is 4MB type? */ #define DRIVE_PRESENT 7 #define DISK_IN 8 #define WRITE_PROT 9 @@ -184,6 +187,7 @@ int req_sector; /* sector number ditto */ int scount; /* # sectors we're transferring at present */ int retries; + int settle_time; int secpercyl; /* disk geometry information */ int secpertrack; int total_secs; @@ -232,8 +236,9 @@ static void act(struct floppy_state *fs); static void scan_timeout(unsigned long data); static void seek_timeout(unsigned long data); +static void settle_timeout(unsigned long data); static void xfer_timeout(unsigned long data); -static void swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs); /*static void fd_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs);*/ static int grab_drive(struct floppy_state *fs, enum swim_state state, int interruptible); @@ -274,7 +279,6 @@ udelay(2); out_8(&sw->select, sw->select & ~LSTRB); udelay(1); - out_8(&sw->select, RELAX); } static int swim3_readbit(struct floppy_state *fs, int bit) @@ -283,9 +287,8 @@ int stat; swim3_select(fs, bit); - udelay(10); + udelay(1); stat = in_8(&sw->status); - out_8(&sw->select, RELAX); return (stat & DATA) == 0; } @@ -374,13 +377,13 @@ static inline void scan_track(struct floppy_state *fs) { volatile struct swim3 *sw = fs->swim3; - int xx; swim3_select(fs, READ_DATA_0); - xx = sw->intr; /* clear SEEN_SECTOR bit */ + in_8(&sw->intr); /* clear SEEN_SECTOR bit */ + in_8(&sw->error); + out_8(&sw->intr_enable, SEEN_SECTOR); out_8(&sw->control_bis, DO_ACTION); /* enable intr when track found */ - out_8(&sw->intr_enable, ERROR_INTR | SEEN_SECTOR); set_timeout(fs, HZ, scan_timeout); /* enable timeout */ } @@ -395,12 +398,14 @@ swim3_action(fs, SEEK_NEGATIVE); sw->nseek = -n; } - fs->expect_cyl = (fs->cur_cyl > 0)? fs->cur_cyl + n: -1; + fs->expect_cyl = (fs->cur_cyl >= 0)? fs->cur_cyl + n: -1; swim3_select(fs, STEP); - out_8(&sw->control_bis, DO_SEEK); + in_8(&sw->error); /* enable intr when seek finished */ - out_8(&sw->intr_enable, ERROR_INTR | SEEK_DONE); - set_timeout(fs, HZ/2, seek_timeout); /* enable timeout */ + out_8(&sw->intr_enable, SEEK_DONE); + out_8(&sw->control_bis, DO_SEEK); + set_timeout(fs, 3*HZ, seek_timeout); /* enable timeout */ + fs->settle_time = 0; } static inline void init_dma(struct dbdma_cmd *cp, int cmd, @@ -448,18 +453,21 @@ } ++cp; out_le16(&cp->command, DBDMA_STOP); + out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); + in_8(&sw->error); + out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); + if (rq_data_dir(fd_req) == WRITE) + out_8(&sw->control_bis, WRITE_SECTORS); + in_8(&sw->intr); out_le32(&dr->control, (RUN << 16) | RUN); - out_8(&sw->control_bis, - (rq_data_dir(fd_req) == WRITE? WRITE_SECTORS: 0) | DO_ACTION); /* enable intr when transfer complete */ - out_8(&sw->intr_enable, ERROR_INTR | TRANSFER_DONE); + out_8(&sw->intr_enable, TRANSFER_DONE); + out_8(&sw->control_bis, DO_ACTION); set_timeout(fs, 2*HZ, xfer_timeout); /* enable timeout */ } static void act(struct floppy_state *fs) { - volatile struct swim3 *sw = fs->swim3; - for (;;) { switch (fs->state) { case idle: @@ -492,20 +500,10 @@ return; case settling: - /* wait for SEEK_COMPLETE to become true */ - swim3_select(fs, SEEK_COMPLETE); - udelay(10); - out_8(&sw->intr_enable, ERROR_INTR | DATA_CHANGED); - in_8(&sw->intr); /* clear DATA_CHANGED */ - if (in_8(&sw->status) & DATA) { - /* seek_complete is not yet true */ - set_timeout(fs, HZ/2, seek_timeout); - return; - } - out_8(&sw->intr_enable, 0); - in_8(&sw->intr); - fs->state = locating; - break; + /* check for SEEK_COMPLETE after 30ms */ + fs->settle_time = (HZ + 32) / 33; + set_timeout(fs, fs->settle_time, settle_timeout); + return; case do_transfer: if (fs->cur_cyl != fs->req_cyl) { @@ -537,7 +535,7 @@ volatile struct swim3 *sw = fs->swim3; fs->timeout_pending = 0; - out_8(&sw->control_bic, DO_ACTION); + out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); out_8(&sw->select, RELAX); out_8(&sw->intr_enable, 0); fs->cur_cyl = -1; @@ -557,20 +555,34 @@ volatile struct swim3 *sw = fs->swim3; fs->timeout_pending = 0; - if (fs->state == settling) { - printk(KERN_ERR "swim3: MSI sel=%x ctrl=%x stat=%x intr=%x ie=%x\n", - sw->select, sw->control, sw->status, sw->intr, sw->intr_enable); - } out_8(&sw->control_bic, DO_SEEK); out_8(&sw->select, RELAX); out_8(&sw->intr_enable, 0); - if (fs->state == settling && swim3_readbit(fs, SEEK_COMPLETE)) { - /* printk(KERN_DEBUG "swim3: missed settling interrupt\n"); */ + printk(KERN_ERR "swim3: seek timeout\n"); + end_request(fd_req, 0); + fs->state = idle; + start_request(fs); +} + +static void settle_timeout(unsigned long data) +{ + struct floppy_state *fs = (struct floppy_state *) data; + volatile struct swim3 *sw = fs->swim3; + + fs->timeout_pending = 0; + if (swim3_readbit(fs, SEEK_COMPLETE)) { + out_8(&sw->select, RELAX); fs->state = locating; act(fs); return; } - printk(KERN_ERR "swim3: seek timeout\n"); + out_8(&sw->select, RELAX); + if (fs->settle_time < 2*HZ) { + ++fs->settle_time; + set_timeout(fs, 1, settle_timeout); + return; + } + printk(KERN_ERR "swim3: seek settle timeout\n"); end_request(fd_req, 0); fs->state = idle; start_request(fs); @@ -583,9 +595,13 @@ struct dbdma_regs *dr = fs->dma; struct dbdma_cmd *cp = fs->dma_cmd; unsigned long s; + int n; fs->timeout_pending = 0; st_le32(&dr->control, RUN << 16); + /* We must wait a bit for dbdma to stop */ + for (n = 0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++) + udelay(1); out_8(&sw->intr_enable, 0); out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); out_8(&sw->select, RELAX); @@ -604,7 +620,7 @@ start_request(fs); } -static void swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t swim3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct floppy_state *fs = (struct floppy_state *) dev_id; volatile struct swim3 *sw = fs->swim3; @@ -613,18 +629,15 @@ struct dbdma_regs *dr; struct dbdma_cmd *cp; - err = in_8(&sw->error); intr = in_8(&sw->intr); -#if 0 - printk("swim3 intr state=%d intr=%x err=%x\n", fs->state, intr, err); -#endif + err = (intr & ERROR_INTR)? in_8(&sw->error): 0; if ((intr & ERROR_INTR) && fs->state != do_transfer) printk(KERN_ERR "swim3_interrupt, state=%d, dir=%lx, intr=%x, err=%x\n", fs->state, rq_data_dir(fd_req), intr, err); switch (fs->state) { case locating: if (intr & SEEN_SECTOR) { - out_8(&sw->control_bic, DO_ACTION); + out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); out_8(&sw->select, RELAX); out_8(&sw->intr_enable, 0); del_timer(&fs->timeout); @@ -674,19 +687,33 @@ case do_transfer: if ((intr & (ERROR_INTR | TRANSFER_DONE)) == 0) break; - dr = fs->dma; - cp = fs->dma_cmd; - /* We must wait a bit for dbdma to complete */ - for (n=0; (in_le32(&dr->status) & ACTIVE) && n < 1000; n++) - udelay(10); - DBDMA_DO_STOP(dr); out_8(&sw->intr_enable, 0); out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); out_8(&sw->select, RELAX); del_timer(&fs->timeout); fs->timeout_pending = 0; + dr = fs->dma; + cp = fs->dma_cmd; if (rq_data_dir(fd_req) == WRITE) ++cp; + /* + * Check that the main data transfer has finished. + * On writing, the swim3 sometimes doesn't use + * up all the bytes of the postamble, so we can still + * see DMA active here. That doesn't matter as long + * as all the sector data has been transferred. + */ + if ((intr & ERROR_INTR) == 0 && cp->xfer_status == 0) { + /* wait a little while for DMA to complete */ + for (n = 0; n < 100; ++n) { + if (cp->xfer_status != 0) + break; + udelay(1); + barrier(); + } + } + /* turn off DMA */ + out_le32(&dr->control, (RUN | PAUSE) << 16); stat = ld_le16(&cp->xfer_status); resid = ld_le16(&cp->res_count); if (intr & ERROR_INTR) { @@ -742,6 +769,7 @@ default: printk(KERN_ERR "swim3: don't know what to do in state %d\n", fs->state); } + return IRQ_HANDLED; } /* @@ -793,16 +821,19 @@ if (err) return err; swim3_action(fs, EJECT); - for (n = 2*HZ; n > 0; --n) { - if (swim3_readbit(fs, RELAX)) - break; + for (n = 20; n > 0; --n) { if (signal_pending(current)) { err = -EINTR; break; } + swim3_select(fs, RELAX); current->state = TASK_INTERRUPTIBLE; schedule_timeout(1); + if (swim3_readbit(fs, DISK_IN) == 0) + break; } + swim3_select(fs, RELAX); + udelay(150); fs->ejected = 1; release_drive(fs); return err; @@ -847,29 +878,31 @@ if (fs->ref_count == 0) { if (fs->media_bay && check_media_bay(fs->media_bay, MB_FD)) return -ENXIO; - out_8(&sw->mode, 0x95); - out_8(&sw->control_bic, 0xff); out_8(&sw->setup, S_IBM_DRIVE | S_FCLK_DIV2); + out_8(&sw->control_bic, 0xff); + out_8(&sw->mode, 0x95); udelay(10); out_8(&sw->intr_enable, 0); out_8(&sw->control_bis, DRIVE_ENABLE | INTR_ENABLE); swim3_action(fs, MOTOR_ON); fs->write_prot = -1; fs->cur_cyl = -1; - for (n = HZ; n > 0; --n) { - if (swim3_readbit(fs, SEEK_COMPLETE)) + for (n = 0; n < 2 * HZ; ++n) { + if (n >= HZ/30 && swim3_readbit(fs, SEEK_COMPLETE)) break; if (signal_pending(current)) { err = -EINTR; break; } + swim3_select(fs, RELAX); current->state = TASK_INTERRUPTIBLE; schedule_timeout(1); } if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0 || swim3_readbit(fs, DISK_IN) == 0)) err = -ENXIO; - swim3_action(fs, 9); + swim3_action(fs, SETMFM); + swim3_select(fs, RELAX); } else if (fs->ref_count == -1 || filp->f_flags & O_EXCL) return -EBUSY; @@ -892,6 +925,7 @@ if (fs->ref_count == 0) { swim3_action(fs, MOTOR_OFF); out_8(&sw->control_bic, DRIVE_ENABLE | INTR_ENABLE); + swim3_select(fs, RELAX); } return err; } @@ -911,6 +945,7 @@ if (fs->ref_count > 0 && --fs->ref_count == 0) { swim3_action(fs, MOTOR_OFF); out_8(&sw->control_bic, 0xff); + swim3_select(fs, RELAX); } return 0; } @@ -933,15 +968,17 @@ sw = fs->swim3; grab_drive(fs, revalidating, 0); out_8(&sw->intr_enable, 0); - out_8(&sw->control_bis, DRIVE_ENABLE | INTR_ENABLE); - swim3_action(fs, MOTOR_ON); + out_8(&sw->control_bis, DRIVE_ENABLE); + swim3_action(fs, MOTOR_ON); /* necessary? */ fs->write_prot = -1; fs->cur_cyl = -1; + mdelay(1); for (n = HZ; n > 0; --n) { if (swim3_readbit(fs, SEEK_COMPLETE)) break; if (signal_pending(current)) break; + swim3_select(fs, RELAX); current->state = TASK_INTERRUPTIBLE; schedule_timeout(1); } @@ -951,17 +988,14 @@ swim3_action(fs, MOTOR_OFF); else { fs->ejected = 0; - swim3_action(fs, 9); + swim3_action(fs, SETMFM); } + swim3_select(fs, RELAX); release_drive(fs); return ret; } -static void floppy_off(unsigned int nr) -{ -} - static struct block_device_operations floppy_fops = { .open = floppy_open, .release = floppy_release, @@ -1104,3 +1138,5 @@ return 0; } + +module_init(swim3_init) diff -Nru a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c --- a/drivers/cdrom/cdrom.c Tue Feb 17 20:00:06 2004 +++ b/drivers/cdrom/cdrom.c Tue Feb 17 20:00:06 2004 @@ -695,6 +695,35 @@ return ret; } +static int mo_open_write(struct cdrom_device_info *cdi) +{ + struct cdrom_generic_command cgc; + char buffer[255]; + int ret; + + init_cdrom_command(&cgc, &buffer, 4, CGC_DATA_READ); + cgc.quiet = 1; + + /* + * obtain write protect information as per + * drivers/scsi/sd.c:sd_read_write_protect_flag + */ + + ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0); + if (ret) + ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0); + if (ret) { + cgc.buflen = 255; + ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0); + } + + /* drive gave us no info, let the user go ahead */ + if (ret) + return 0; + + return buffer[3] & 0x80; +} + /* * returns 0 for ok to open write, non-0 to disallow */ @@ -706,11 +735,8 @@ ret = cdrom_mrw_open_write(cdi); else if (CDROM_CAN(CDC_DVD_RAM)) ret = cdrom_dvdram_open_write(cdi); - /* - * needs to really check whether media is writeable - */ else if (CDROM_CAN(CDC_MO_DRIVE)) - ret = 0; + ret = mo_open_write(cdi); return ret; } @@ -1773,7 +1799,7 @@ int ret; /* Try the generic SCSI command ioctl's first.. */ - ret = scsi_cmd_ioctl(ip->i_bdev, cmd, arg); + ret = scsi_cmd_ioctl(ip->i_bdev->bd_disk, cmd, arg); if (ret != -ENOTTY) return ret; @@ -2268,7 +2294,7 @@ return -EINVAL; /* FIXME: we need upper bound checking, too!! */ - if (lba < 0 || ra.nframes <= 0 || ra.nframes > 64) + if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES) return -EINVAL; /* @@ -2740,13 +2766,13 @@ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0); - pos += sprintf(info+pos, "\nCan read MRW:"); + pos += sprintf(info+pos, "\nCan read MRW:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW) != 0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW) != 0); - pos += sprintf(info+pos, "\nCan write MRW:"); + pos += sprintf(info+pos, "\nCan write MRW:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW_W) != 0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0); strcpy(info+pos,"\n\n"); diff -Nru a/drivers/char/Kconfig b/drivers/char/Kconfig --- a/drivers/char/Kconfig Tue Feb 17 20:00:05 2004 +++ b/drivers/char/Kconfig Tue Feb 17 20:00:05 2004 @@ -962,11 +962,15 @@ If compiled as a module, it will be called scx200_gpio. config RAW_DRIVER - tristate "RAW driver (/dev/raw/rawN)" + tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)" help The raw driver permits block devices to be bound to /dev/raw/rawN. Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. See the raw(8) manpage for more details. + + The raw driver is deprecated and may be removed from 2.7 + kernels. Applications should simply open the device (eg /dev/hda1) + with the O_DIRECT flag. config MAX_RAW_DEVS int "Maximum number of RAW devices to support (1-8192)" diff -Nru a/drivers/char/Makefile b/drivers/char/Makefile --- a/drivers/char/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/char/Makefile Tue Feb 17 20:00:08 2004 @@ -57,7 +57,9 @@ obj-$(CONFIG_RTC) += rtc.o obj-$(CONFIG_GEN_RTC) += genrtc.o obj-$(CONFIG_EFI_RTC) += efirtc.o -ifeq ($(CONFIG_PPC),) +ifeq ($(CONFIG_GENERIC_NVRAM),y) + obj-$(CONFIG_NVRAM) += generic_nvram.o +else obj-$(CONFIG_NVRAM) += nvram.o endif obj-$(CONFIG_TOSHIBA) += toshiba.o diff -Nru a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig --- a/drivers/char/agp/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/char/agp/Kconfig Tue Feb 17 20:00:07 2004 @@ -127,14 +127,14 @@ config AGP_I460 tristate "Intel 460GX chipset support" - depends on AGP && IA64 + depends on AGP && (IA64_DIG || IA64_GENERIC) help This option gives you AGP GART support for the Intel 460GX chipset for IA64 processors. config AGP_HP_ZX1 tristate "HP ZX1 chipset AGP support" - depends on AGP && IA64 + depends on AGP && (IA64_HP_ZX1 || IA64_GENERIC) help This option gives you AGP GART support for the HP ZX1 chipset for IA64 processors. diff -Nru a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c --- a/drivers/char/drm/radeon_state.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/drm/radeon_state.c Tue Feb 17 20:00:08 2004 @@ -1221,7 +1221,7 @@ /* Update the input parameters for next time */ image->y += height; image->height -= height; - (const u8 *)image->data += size; + image->data = (const u8 *)image->data + size; } while (image->height > 0); /* Flush the pixel cache after the blit completes. This ensures @@ -2185,10 +2185,21 @@ case RADEON_PARAM_STATUS_HANDLE: value = dev_priv->ring_rptr_offset; break; +#if BITS_PER_LONG == 32 + /* + * This ioctl() doesn't work on 64-bit platforms because hw_lock is a + * pointer which can't fit into an int-sized variable. According to + * Michel Dänzer, the ioctl() is only used on embedded platforms, so + * not supporting it shouldn't be a problem. If the same functionality + * is needed on 64-bit platforms, a new ioctl() would have to be added, + * so backwards-compatibility for the embedded platforms can be + * maintained. --davidm 4-Feb-2004. + */ case RADEON_PARAM_SAREA_HANDLE: /* The lock is the first dword in the sarea. */ - value = (int)dev->lock.hw_lock; - break; + value = (long)dev->lock.hw_lock; + break; +#endif case RADEON_PARAM_GART_TEX_HANDLE: value = dev_priv->gart_textures_offset; break; diff -Nru a/drivers/char/dz.c b/drivers/char/dz.c --- a/drivers/char/dz.c Tue Feb 17 20:00:05 2004 +++ b/drivers/char/dz.c Tue Feb 17 20:00:05 2004 @@ -986,11 +986,7 @@ return 0; case TIOCGSOFTCAR: - error = verify_area (VERIFY_WRITE, (void *)arg, sizeof(long)); - if (error) - return error; - put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *)arg); - return 0; + return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *)arg); case TIOCSSOFTCAR: if (get_user (arg, (unsigned long *)arg)) @@ -1001,10 +997,6 @@ return 0; case TIOCGSERIAL: - error = verify_area(VERIFY_WRITE, (void *)arg, - sizeof(struct serial_struct)); - if (error) - return error; return get_serial_info(info, (struct serial_struct *)arg); case TIOCSSERIAL: diff -Nru a/drivers/char/generic_nvram.c b/drivers/char/generic_nvram.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/char/generic_nvram.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,145 @@ +/* + * Generic /dev/nvram driver for architectures providing some + * "generic" hooks, that is : + * + * nvram_read_byte, nvram_write_byte, nvram_sync + * + * Note that an additional hook is supported for PowerMac only + * for getting the nvram "partition" informations + * + */ + +#define NVRAM_VERSION "1.1" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NVRAM_SIZE 8192 + +static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) +{ + lock_kernel(); + switch (origin) { + case 1: + offset += file->f_pos; + break; + case 2: + offset += NVRAM_SIZE; + break; + } + if (offset < 0) { + unlock_kernel(); + return -EINVAL; + } + file->f_pos = offset; + unlock_kernel(); + return file->f_pos; +} + +static ssize_t read_nvram(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + unsigned int i; + char __user *p = buf; + + if (verify_area(VERIFY_WRITE, buf, count)) + return -EFAULT; + if (*ppos >= NVRAM_SIZE) + return 0; + for (i = *ppos; count > 0 && i < NVRAM_SIZE; ++i, ++p, --count) + if (__put_user(nvram_read_byte(i), p)) + return -EFAULT; + *ppos = i; + return p - buf; +} + +static ssize_t write_nvram(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + unsigned int i; + const char __user *p = buf; + char c; + + if (verify_area(VERIFY_READ, buf, count)) + return -EFAULT; + if (*ppos >= NVRAM_SIZE) + return 0; + for (i = *ppos; count > 0 && i < NVRAM_SIZE; ++i, ++p, --count) { + if (__get_user(c, p)) + return -EFAULT; + nvram_write_byte(c, i); + } + *ppos = i; + return p - buf; +} + +static int nvram_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + switch(cmd) { +#ifdef CONFIG_PPC_PMAC + case OBSOLETE_PMAC_NVRAM_GET_OFFSET: + printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n"); + case IOC_NVRAM_GET_OFFSET: { + int part, offset; + + if (_machine != _MACH_Pmac) + return -EINVAL; + if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0) + return -EFAULT; + if (part < pmac_nvram_OF || part > pmac_nvram_NR) + return -EINVAL; + offset = pmac_get_partition(part); + if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0) + return -EFAULT; + break; + } +#endif /* CONFIG_PPC_PMAC */ + case IOC_NVRAM_SYNC: + nvram_sync(); + break; + default: + return -EINVAL; + } + + return 0; +} + +struct file_operations nvram_fops = { + .owner = THIS_MODULE, + .llseek = nvram_llseek, + .read = read_nvram, + .write = write_nvram, + .ioctl = nvram_ioctl, +}; + +static struct miscdevice nvram_dev = { + NVRAM_MINOR, + "nvram", + &nvram_fops +}; + +int __init nvram_init(void) +{ + printk(KERN_INFO "Macintosh non-volatile memory driver v%s\n", + NVRAM_VERSION); + return misc_register(&nvram_dev); +} + +void __exit nvram_cleanup(void) +{ + misc_deregister( &nvram_dev ); +} + +module_init(nvram_init); +module_exit(nvram_cleanup); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c --- a/drivers/char/hvc_console.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/hvc_console.c Tue Feb 17 20:00:08 2004 @@ -29,6 +29,7 @@ #include #include #include +#include extern int hvc_count(int *); extern int hvc_get_chars(int index, char *buf, int count); @@ -223,10 +224,10 @@ spin_unlock_irqrestore(&hp->lock, flags); } -#if defined (CONFIG_XMON) -extern unsigned long cpus_in_xmon; +#if defined(CONFIG_XMON) && defined(CONFIG_SMP) +extern cpumask_t cpus_in_xmon; #else -unsigned long cpus_in_xmon=0; +static const cpumask_t cpus_in_xmon = CPU_MASK_NONE; #endif @@ -237,7 +238,7 @@ daemonize("khvcd"); for (;;) { - if (!cpus_in_xmon) { + if (cpus_empty(cpus_in_xmon)) { for (i = 0; i < MAX_NR_HVC_CONSOLES; ++i) hvc_poll(i); } @@ -268,8 +269,9 @@ return -ENOMEM; hvc_driver->owner = THIS_MODULE; + hvc_driver->devfs_name = "hvc/"; hvc_driver->driver_name = "hvc"; - hvc_driver->name = "hvc/"; + hvc_driver->name = "hvc"; hvc_driver->major = HVC_MAJOR; hvc_driver->minor_start = HVC_MINOR; hvc_driver->type = TTY_DRIVER_TYPE_SYSTEM; diff -Nru a/drivers/char/istallion.c b/drivers/char/istallion.c --- a/drivers/char/istallion.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/istallion.c Tue Feb 17 20:00:07 2004 @@ -417,13 +417,14 @@ #ifndef PCI_DEVICE_ID_ECRA #define PCI_DEVICE_ID_ECRA 0x0004 #endif -#endif static struct pci_device_id istallion_pci_tbl[] = { { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0 } }; MODULE_DEVICE_TABLE(pci, istallion_pci_tbl); + +#endif /* CONFIG_PCI */ /*****************************************************************************/ diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c --- a/drivers/char/keyboard.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/keyboard.c Tue Feb 17 20:00:06 2004 @@ -201,8 +201,7 @@ if (scancode < 0 || scancode >= dev->keycodemax) return -EINVAL; - oldkey = INPUT_KEYCODE(dev, scancode); - INPUT_KEYCODE(dev, scancode) = keycode; + oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode); clear_bit(oldkey, dev->keybit); set_bit(keycode, dev->keybit); @@ -972,11 +971,6 @@ static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char up_flag) { -#ifdef CONFIG_MAC_EMUMOUSEBTN - if (mac_hid_mouse_emulate_buttons(1, keycode, !up_flag)) - return 0; -#endif /* CONFIG_MAC_EMUMOUSEBTN */ - if (keycode > 255 || !x86_keycodes[keycode]) return -1; @@ -1054,6 +1048,11 @@ #endif rep = (down == 2); + +#ifdef CONFIG_MAC_EMUMOUSEBTN + if (mac_hid_mouse_emulate_buttons(1, keycode, down)) + return; +#endif /* CONFIG_MAC_EMUMOUSEBTN */ if ((raw_mode = (kbd->kbdmode == VC_RAW))) if (emulate_raw(vc, keycode, !down << 7)) diff -Nru a/drivers/char/moxa.c b/drivers/char/moxa.c --- a/drivers/char/moxa.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/moxa.c Tue Feb 17 20:00:08 2004 @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -292,7 +293,7 @@ static int __init moxa_init(void) { - int i, n, numBoards; + int i, numBoards; struct moxa_str *ch; printk(KERN_INFO "MOXA Intellio family driver version %s\n", MOXA_VERSION); @@ -410,7 +411,7 @@ #ifdef CONFIG_PCI { struct pci_dev *p = NULL; - n = (sizeof(moxa_pcibrds) / sizeof(moxa_pcibrds[0])) - 1; + int n = (sizeof(moxa_pcibrds) / sizeof(moxa_pcibrds[0])) - 1; i = 0; while (i < n) { while ((p = pci_find_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL) diff -Nru a/drivers/char/mxser.c b/drivers/char/mxser.c --- a/drivers/char/mxser.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/mxser.c Tue Feb 17 20:00:07 2004 @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -496,7 +497,6 @@ static int __init mxser_module_init(void) { int i, m, retval, b; - int n, index; struct mxser_hwconf hwconf; mxvar_sdriver = alloc_tty_driver(MXSER_PORTS + 1); @@ -509,6 +509,7 @@ mxvar_sdriver->owner = THIS_MODULE; mxvar_sdriver->name = "ttyM"; + mxvar_sdriver->devfs_name = "tts/M"; mxvar_sdriver->major = ttymajor; mxvar_sdriver->minor_start = 0; mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; @@ -600,9 +601,8 @@ #ifdef CONFIG_PCI { struct pci_dev *pdev = NULL; - - n = (sizeof(mxser_pcibrds) / sizeof(mxser_pcibrds[0])) - 1; - index = 0; + int n = (sizeof(mxser_pcibrds) / sizeof(mxser_pcibrds[0])) - 1; + int index = 0; for (b = 0; b < n; b++) { while ((pdev = pci_find_device(mxser_pcibrds[b].vendor, mxser_pcibrds[b].device, pdev))) { diff -Nru a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c --- a/drivers/char/pcmcia/synclink_cs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/pcmcia/synclink_cs.c Tue Feb 17 20:00:06 2004 @@ -244,7 +244,6 @@ char netname[10]; struct net_device *netdev; struct net_device_stats netstats; - struct net_device netdevice; #endif } MGSLPC_INFO; @@ -4206,35 +4205,46 @@ #ifdef CONFIG_SYNCLINK_SYNCPPP /* syncppp net device routines */ + +static void mgslpc_setup(struct net_device *dev) +{ + dev->open = mgslpc_sppp_open; + dev->stop = mgslpc_sppp_close; + dev->hard_start_xmit = mgslpc_sppp_tx; + dev->do_ioctl = mgslpc_sppp_ioctl; + dev->get_stats = mgslpc_net_stats; + dev->tx_timeout = mgslpc_sppp_tx_timeout; + dev->watchdog_timeo = 10*HZ; +} void mgslpc_sppp_init(MGSLPC_INFO *info) { struct net_device *d; sprintf(info->netname,"mgslp%d",info->line); + + d = alloc_netdev(0, info->netname, mgslpc_setup); + if (!d) { + printk(KERN_WARNING "%s: alloc_netdev failed.\n", + info->netname); + return; + } info->if_ptr = &info->pppdev; - info->netdev = info->pppdev.dev = &info->netdevice; + info->netdev = info->pppdev.dev = d; sppp_attach(&info->pppdev); - d = info->netdev; - strcpy(d->name,info->netname); d->base_addr = info->io_base; d->irq = info->irq_level; d->priv = info; - d->init = NULL; - d->open = mgslpc_sppp_open; - d->stop = mgslpc_sppp_close; - d->hard_start_xmit = mgslpc_sppp_tx; - d->do_ioctl = mgslpc_sppp_ioctl; - d->get_stats = mgslpc_net_stats; - d->tx_timeout = mgslpc_sppp_tx_timeout; - d->watchdog_timeo = 10*HZ; if (register_netdev(d)) { printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); sppp_detach(info->netdev); + info->netdev = NULL; + info->pppdev.dev = NULL; + free_netdev(d); return; } @@ -4246,8 +4256,11 @@ { if (debug_level >= DEBUG_LEVEL_INFO) printk("mgslpc_sppp_delete(%s)\n",info->netname); - sppp_detach(info->netdev); unregister_netdev(info->netdev); + sppp_detach(info->netdev); + free_netdev(info->netdev); + info->netdev = NULL; + info->pppdev.dev = NULL; } int mgslpc_sppp_open(struct net_device *d) diff -Nru a/drivers/char/selection.c b/drivers/char/selection.c --- a/drivers/char/selection.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/selection.c Tue Feb 17 20:00:08 2004 @@ -24,6 +24,7 @@ #include #include #include +#include #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) @@ -290,7 +291,10 @@ int pasted = 0, count; DECLARE_WAITQUEUE(wait, current); + acquire_console_sem(); poke_blanked_console(); + release_console_sem(); + add_wait_queue(&vt->paste_wait, &wait); while (sel_buffer && sel_buffer_lth > pasted) { set_current_state(TASK_INTERRUPTIBLE); diff -Nru a/drivers/char/sh-sci.c b/drivers/char/sh-sci.c --- a/drivers/char/sh-sci.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/sh-sci.c Tue Feb 17 20:00:08 2004 @@ -1,4 +1,4 @@ -/* $Id: sh-sci.c,v 1.15 2003/10/13 07:21:19 lethal Exp $ +/* $Id: sh-sci.c,v 1.16 2004/02/10 17:04:17 lethal Exp $ * * linux/drivers/char/sh-sci.c * @@ -7,6 +7,7 @@ * Copyright (C) 2000 Sugioka Toshinobu * Modified to support multiple serial ports. Stuart Menefy (May 2000). * Modified to support SH7760 SCIF. Paul Mundt (Oct 2003). + * Modified to support H8/300 Series. Yoshinori Sato (Feb 2004). * * TTY code is based on sx.c (Specialix SX driver) by: * @@ -337,6 +338,7 @@ NULL }; +#if !defined(__H8300H__) && !defined(__H8300S__) #if defined(SCI_ONLY) || defined(SCI_AND_SCIF) static void sci_init_pins_sci(struct sci_port* port, unsigned int cflag) { @@ -403,6 +405,32 @@ #endif #endif /* SCIF_ONLY || SCI_AND_SCIF */ +#else /* !defined(__H8300H__) && !defined(__H8300S__) */ +static void sci_init_pins_sci(struct sci_port* port, unsigned int cflag) +{ + int ch = (port->base - SMR0) >> 3; + /* set DDR regs */ + H8300_GPIO_DDR(h8300_sci_pins[ch].port,h8300_sci_pins[ch].rx,H8300_GPIO_INPUT); + H8300_GPIO_DDR(h8300_sci_pins[ch].port,h8300_sci_pins[ch].tx,H8300_GPIO_OUTPUT); + /* tx mark output*/ + H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx; +} + +#if defined(__H8300S__) +enum {sci_disable,sci_enable}; + +static void h8300_sci_enable(struct sci_port* port, unsigned int ctrl) +{ + volatile unsigned char *mstpcrl=(volatile unsigned char *)MSTPCRL; + int ch = (port->base - SMR0) >> 3; + unsigned char mask = 1 << (ch+1); + if (ctrl == sci_disable) + *mstpcrl |= mask; + else + *mstpcrl &= ~mask; +} +#endif +#endif static void sci_setsignals(struct sci_port *port, int dtr, int rts) { @@ -487,9 +515,11 @@ sci_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */ +#if !defined(SCI_ONLY) if (port->type == PORT_SCIF) { sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST); } +#endif smr_val = sci_in(port, SCSMR) & 3; if ((cflag & CSIZE) == CS7) @@ -559,11 +589,15 @@ while (1) { count = port->gs.xmit_cnt; +#if !defined(SCI_ONLY) if (port->type == PORT_SCIF) { txroom = 16 - (sci_in(port, SCFDR)>>8); } else { txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0; } +#else + txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0; +#endif if (count > txroom) count = txroom; @@ -600,10 +634,12 @@ ctrl &= ~SCI_CTRL_FLAGS_TIE; port->gs.flags &= ~GS_TX_INTEN; } else { +#if !defined(SCI_ONLY) if (port->type == PORT_SCIF) { sci_in(port, SCxSR); /* Dummy read */ sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); } +#endif ctrl |= SCI_CTRL_FLAGS_TIE; } sci_out(port, SCSCR, ctrl); @@ -627,11 +663,15 @@ tty = port->gs.tty; while (1) { +#if !defined(SCI_ONLY) if (port->type == PORT_SCIF) { count = sci_in(port, SCFDR)&0x001f; } else { count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0; } +#else + count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0; +#endif /* Don't copy more bytes than there is room for in the buffer */ if (tty->flip.count + count > TTY_FLIPBUF_SIZE) @@ -861,6 +901,7 @@ return IRQ_HANDLED; } +#if !defined(SCI_ONLY) static irqreturn_t sci_br_interrupt(int irq, void *ptr, struct pt_regs *regs) { struct sci_port *port = ptr; @@ -871,6 +912,7 @@ return IRQ_HANDLED; } +#endif static void do_softint(void *private_) { @@ -955,11 +997,15 @@ { struct sci_port *port = ptr; +#if !defined(SCI_ONLY) if (port->type == PORT_SCIF) { return (sci_in(port, SCFDR) >> 8) + ((sci_in(port, SCxSR) & SCxSR_TEND(port))? 0: 1); } else { return (sci_in(port, SCxSR) & SCxSR_TEND(port))? 0: 1; } +#else + return (sci_in(port, SCxSR) & SCxSR_TEND(port))? 0: 1; +#endif } static void sci_shutdown_port(void * ptr) @@ -970,6 +1016,9 @@ if (port->gs.tty && port->gs.tty->termios->c_cflag & HUPCL) sci_setsignals(port, 0, 0); sci_free_irq(port); +#if defined(__H8300S__) + h8300_sci_enable(port,sci_disable); +#endif } /* ********************************************************************** * @@ -996,6 +1045,10 @@ port->event = 0; INIT_WORK(&port->tqueue, do_softint, port); +#if defined(__H8300S__) + h8300_sci_enable(port,sci_enable); +#endif + /* * Start up serial port */ @@ -1282,12 +1335,17 @@ static int sci_request_irq(struct sci_port *port) { int i; +#if !defined(SCI_ONLY) irqreturn_t (*handlers[4])(int irq, void *p, struct pt_regs *regs) = { sci_er_interrupt, sci_rx_interrupt, sci_tx_interrupt, sci_br_interrupt, }; - - for (i=0; i<4; i++) { +#else + void (*handlers[3])(int irq, void *ptr, struct pt_regs *regs) = { + sci_er_interrupt, sci_rx_interrupt, sci_tx_interrupt, + }; +#endif + for (i=0; i<(sizeof(handlers)/sizeof(handlers[0])); i++) { if (!port->irqs[i]) continue; if (request_irq(port->irqs[i], handlers[i], SA_INTERRUPT, "sci", port)) { @@ -1432,6 +1490,9 @@ co->cflag = cflag; sercons_baud = baud; +#if defined(__H8300S__) + h8300_sci_enable(sercons_port,sci_enable); +#endif sci_set_termios_cflag(sercons_port, cflag, baud); sercons_port->old_cflag = cflag; diff -Nru a/drivers/char/sh-sci.h b/drivers/char/sh-sci.h --- a/drivers/char/sh-sci.h Tue Feb 17 20:00:07 2004 +++ b/drivers/char/sh-sci.h Tue Feb 17 20:00:07 2004 @@ -1,4 +1,4 @@ -/* $Id: sh-sci.h,v 1.6 2003/10/13 01:11:11 lethal Exp $ +/* $Id: sh-sci.h,v 1.7 2004/02/10 17:04:17 lethal Exp $ * * linux/drivers/char/sh-sci.h * @@ -7,10 +7,21 @@ * Copyright (C) 2000 Greg Banks * Modified to support multiple serial ports. Stuart Menefy (May 2000). * Modified to support SH7760 SCIF. Paul Mundt (Oct 2003). + * Modified to support H8/300 Serise Yoshinori Sato (Feb 2004). * */ #include +#if defined(__H8300H__) || defined(__H8300S__) +#include +#if defined(CONFIG_H83007) || defined(CONFIG_H83068) +#include +#endif +#if defined(CONFIG_H8S2678) +#include +#endif +#endif + /* Values for sci_port->type */ #define PORT_SCI 0 #define PORT_SCIF 1 @@ -30,6 +41,12 @@ #define SH7760_SCIF0_IRQS { 52, 53, 55, 54 } #define SH7760_SCIF1_IRQS { 72, 73, 75, 74 } #define SH7760_SCIF2_IRQS { 76, 77, 79, 78 } +#define H8300H_SCI_IRQS0 {52, 53, 54, 0 } +#define H8300H_SCI_IRQS1 {56, 57, 58, 0 } +#define H8300H_SCI_IRQS2 {60, 61, 62, 0 } +#define H8S_SCI_IRQS0 {88, 89, 90, 0 } +#define H8S_SCI_IRQS1 {92, 93, 94, 0 } +#define H8S_SCI_IRQS2 {96, 97, 98, 0 } #if defined(CONFIG_CPU_SUBTYPE_SH7708) # define SCI_NPORTS 1 @@ -87,6 +104,26 @@ # define SCIF_ORER 0x0001 /* overrun error bit */ # define SCSCR_INIT(port) 0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ # define SCIF_ONLY +#elif defined(CONFIG_H83007) || defined(CONFIG_H83068) +# define SCI_NPORTS 3 +# define SCI_INIT { \ + { {}, PORT_SCI, 0x00ffffb0, H8300H_SCI_IRQS0, sci_init_pins_sci }, \ + { {}, PORT_SCI, 0x00ffffb8, H8300H_SCI_IRQS1, sci_init_pins_sci }, \ + { {}, PORT_SCI, 0x00ffffc0, H8300H_SCI_IRQS2, sci_init_pins_sci } \ +} +# define SCSCR_INIT(port) 0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ +# define SCI_ONLY +# define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port) +#elif defined(CONFIG_H8S2678) +# define SCI_NPORTS 3 +# define SCI_INIT { \ + { {}, PORT_SCI, 0x00ffff78, H8S_SCI_IRQS0, sci_init_pins_sci }, \ + { {}, PORT_SCI, 0x00ffff80, H8S_SCI_IRQS1, sci_init_pins_sci }, \ + { {}, PORT_SCI, 0x00ffff88, H8S_SCI_IRQS2, sci_init_pins_sci } \ +} +# define SCSCR_INIT(port) 0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ +# define SCI_ONLY +# define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port) #else # error CPU subtype not defined #endif @@ -242,28 +279,46 @@ SCI_OUT(scif_size, scif_offset, value); \ } +#define CPU_SCI_FNS(name, sci_offset, sci_size) \ + static inline unsigned int sci_##name##_in(struct sci_port* port) \ + { \ + SCI_IN(sci_size, sci_offset); \ + } \ + static inline void sci_##name##_out(struct sci_port* port, unsigned int value) \ + { \ + SCI_OUT(sci_size, sci_offset, value); \ + } + #ifdef CONFIG_CPU_SH3 #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \ - sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \ + sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \ + h8_sci_offset, h8_sci_size) \ CPU_SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh3_scif_offset, sh3_scif_size) #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \ CPU_SCIF_FNS(name, sh3_scif_offset, sh3_scif_size) +#elif defined(__H8300H__) || defined(__H8300S__) +#define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \ + sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \ + h8_sci_offset, h8_sci_size) \ + CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size) +#define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) #else #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \ - sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \ + sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \ + h8_sci_offset, h8_sci_size) \ CPU_SCIx_FNS(name, sh4_sci_offset, sh4_sci_size, sh4_scif_offset, sh4_scif_size) #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \ CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) #endif -/* reg SCI/SH3 SCI/SH4 SCIF/SH3 SCIF/SH4 */ -/* name off sz off sz off sz off sz */ -SCIx_FNS(SCSMR, 0x00, 8, 0x00, 8, 0x00, 8, 0x00, 16) -SCIx_FNS(SCBRR, 0x02, 8, 0x04, 8, 0x02, 8, 0x04, 8) -SCIx_FNS(SCSCR, 0x04, 8, 0x08, 8, 0x04, 8, 0x08, 16) -SCIx_FNS(SCxTDR, 0x06, 8, 0x0c, 8, 0x06, 8, 0x0C, 8) -SCIx_FNS(SCxSR, 0x08, 8, 0x10, 8, 0x08, 16, 0x10, 16) -SCIx_FNS(SCxRDR, 0x0a, 8, 0x14, 8, 0x0A, 8, 0x14, 8) +/* reg SCI/SH3 SCI/SH4 SCIF/SH3 SCIF/SH4 SCI/H8*/ +/* name off sz off sz off sz off sz off sz*/ +SCIx_FNS(SCSMR, 0x00, 8, 0x00, 8, 0x00, 8, 0x00, 16, 0x00, 8) +SCIx_FNS(SCBRR, 0x02, 8, 0x04, 8, 0x02, 8, 0x04, 8, 0x01, 8) +SCIx_FNS(SCSCR, 0x04, 8, 0x08, 8, 0x04, 8, 0x08, 16, 0x02, 8) +SCIx_FNS(SCxTDR, 0x06, 8, 0x0c, 8, 0x06, 8, 0x0C, 8, 0x03, 8) +SCIx_FNS(SCxSR, 0x08, 8, 0x10, 8, 0x08, 16, 0x10, 16, 0x04, 8) +SCIx_FNS(SCxRDR, 0x0a, 8, 0x14, 8, 0x0A, 8, 0x14, 8, 0x05, 8) SCIF_FNS(SCFCR, 0x0c, 8, 0x18, 16) SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16) SCIF_FNS(SCLSR, 0, 0, 0x24, 16) @@ -271,6 +326,50 @@ #define sci_in(port, reg) sci_##reg##_in(port) #define sci_out(port, reg, value) sci_##reg##_out(port, value) +/* H8/300 series SCI pins assignment */ +#if defined(__H8300H__) || defined(__H8300S__) +static const struct __attribute__((packed)) +{ + int port; /* GPIO port no */ + unsigned short rx,tx; /* GPIO bit no */ +} h8300_sci_pins[] = +{ +#if defined(CONFIG_H83007) || defined(CONFIG_H83068) + { /* SCI0 */ + .port = H8300_GPIO_P9, + .rx = H8300_GPIO_B2, + .tx = H8300_GPIO_B0, + }, + { /* SCI1 */ + .port = H8300_GPIO_P9, + .rx = H8300_GPIO_B3, + .tx = H8300_GPIO_B1, + }, + { /* SCI2 */ + .port = H8300_GPIO_PB, + .rx = H8300_GPIO_B7, + .tx = H8300_GPIO_B6, + } +#elif defined(CONFIG_H8S2678) + { /* SCI0 */ + .port = H8300_GPIO_P3, + .rx = H8300_GPIO_B2, + .tx = H8300_GPIO_B0, + }, + { /* SCI1 */ + .port = H8300_GPIO_P3, + .rx = H8300_GPIO_B3, + .tx = H8300_GPIO_B1, + }, + { /* SCI2 */ + .port = H8300_GPIO_P5, + .rx = H8300_GPIO_B1, + .tx = H8300_GPIO_B0, + } +#endif +}; +#endif + #if defined(CONFIG_CPU_SUBTYPE_SH7708) static inline int sci_rxd_in(struct sci_port *port) { @@ -321,6 +420,12 @@ return ctrl_inw(SCSPTR2)&0x0001 ? 1 : 0; /* SCIF */ } +#elif defined(__H8300H__) || defined(__H8300S__) +static inline int sci_rxd_in(struct sci_port *port) +{ + int ch = (port->base - SMR0) >> 3; + return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0; +} #endif /* @@ -357,7 +462,11 @@ #define PCLK (current_cpu_data.module_clock) +#if !defined(__H8300H__) && !defined(__H8300S__) #define SCBRR_VALUE(bps) ((PCLK+16*bps)/(32*bps)-1) +#else +#define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1) +#endif #define BPS_2400 SCBRR_VALUE(2400) #define BPS_4800 SCBRR_VALUE(4800) #define BPS_9600 SCBRR_VALUE(9600) diff -Nru a/drivers/char/sn_serial.c b/drivers/char/sn_serial.c --- a/drivers/char/sn_serial.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/sn_serial.c Tue Feb 17 20:00:08 2004 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -771,7 +772,7 @@ int len = 0; off_t begin = 0; - len += sprintf(page, "sn_serial: nasid:%d irq:%d tx:%d rx:%d\n", + len += sprintf(page, "sn_serial: nasid:%ld irq:%d tx:%d rx:%d\n", ia64_sn_get_console_nasid(), sn_sal_irq, sn_total_tx_count, sn_total_rx_count); *eof = 1; diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h --- a/drivers/char/sonypi.h Tue Feb 17 20:00:07 2004 +++ b/drivers/char/sonypi.h Tue Feb 17 20:00:07 2004 @@ -239,6 +239,7 @@ { 0x01, SONYPI_EVENT_PKEY_P1 }, { 0x02, SONYPI_EVENT_PKEY_P2 }, { 0x04, SONYPI_EVENT_PKEY_P3 }, + { 0x5c, SONYPI_EVENT_PKEY_P1 }, { 0, 0 } }; @@ -333,6 +334,7 @@ { SONYPI_DEVICE_MODEL_TYPE2, 0x20, SONYPI_THUMBPHRASE_MASK, sonypi_thumbphraseev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x41, SONYPI_BATTERY_MASK, sonypi_batteryev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_PKEY_MASK, sonypi_pkeyev }, { 0, 0, 0, 0 } }; diff -Nru a/drivers/char/specialix.c b/drivers/char/specialix.c --- a/drivers/char/specialix.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/specialix.c Tue Feb 17 20:00:08 2004 @@ -92,6 +92,7 @@ #include #include #include +#include #include #include "specialix_io8.h" diff -Nru a/drivers/char/synclink.c b/drivers/char/synclink.c --- a/drivers/char/synclink.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/synclink.c Tue Feb 17 20:00:06 2004 @@ -327,7 +327,6 @@ char netname[10]; struct net_device *netdev; struct net_device_stats netstats; - struct net_device netdevice; #endif }; @@ -737,8 +736,8 @@ #ifdef CONFIG_SYNCLINK_SYNCPPP /* SPPP/HDLC stuff */ -void mgsl_sppp_init(struct mgsl_struct *info); -void mgsl_sppp_delete(struct mgsl_struct *info); +static void mgsl_sppp_init(struct mgsl_struct *info); +static void mgsl_sppp_delete(struct mgsl_struct *info); int mgsl_sppp_open(struct net_device *d); int mgsl_sppp_close(struct net_device *d); void mgsl_sppp_tx_timeout(struct net_device *d); @@ -7820,36 +7819,45 @@ #ifdef CONFIG_SYNCLINK_SYNCPPP /* syncppp net device routines */ +static void mgsl_setup(struct net_device *dev) +{ + dev->open = mgsl_sppp_open; + dev->stop = mgsl_sppp_close; + dev->hard_start_xmit = mgsl_sppp_tx; + dev->do_ioctl = mgsl_sppp_ioctl; + dev->get_stats = mgsl_net_stats; + dev->tx_timeout = mgsl_sppp_tx_timeout; + dev->watchdog_timeo = 10*HZ; +} -void mgsl_sppp_init(struct mgsl_struct *info) +static void mgsl_sppp_init(struct mgsl_struct *info) { struct net_device *d; sprintf(info->netname,"mgsl%d",info->line); + d = alloc_netdev(0, info->netname, mgsl_setup); + if (!d) { + printk(KERN_WARNING "%s: alloc_netdev failed.\n", + info->netname); + return; + } + info->if_ptr = &info->pppdev; - info->netdev = info->pppdev.dev = &info->netdevice; + info->netdev = info->pppdev.dev = d; sppp_attach(&info->pppdev); - d = info->netdev; - strcpy(d->name,info->netname); d->base_addr = info->io_base; d->irq = info->irq_level; d->dma = info->dma_level; d->priv = info; - d->init = NULL; - d->open = mgsl_sppp_open; - d->stop = mgsl_sppp_close; - d->hard_start_xmit = mgsl_sppp_tx; - d->do_ioctl = mgsl_sppp_ioctl; - d->get_stats = mgsl_net_stats; - d->tx_timeout = mgsl_sppp_tx_timeout; - d->watchdog_timeo = 10*HZ; if (register_netdev(d)) { printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); sppp_detach(info->netdev); + info->netdev = NULL; + free_netdev(d); return; } @@ -7861,8 +7869,11 @@ { if (debug_level >= DEBUG_LEVEL_INFO) printk("mgsl_sppp_delete(%s)\n",info->netname); - sppp_detach(info->netdev); unregister_netdev(info->netdev); + sppp_detach(info->netdev); + free_netdev(info->netdev); + info->netdev = NULL; + info->pppdev.dev = NULL; } int mgsl_sppp_open(struct net_device *d) diff -Nru a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c --- a/drivers/char/synclinkmp.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/synclinkmp.c Tue Feb 17 20:00:06 2004 @@ -289,7 +289,6 @@ char netname[10]; struct net_device *netdev; struct net_device_stats netstats; - struct net_device netdevice; #endif } SLMP_INFO; @@ -1627,35 +1626,44 @@ /* syncppp support and callbacks */ +static void cb_setup(struct net_device *dev) +{ + dev->open = sppp_cb_open; + dev->stop = sppp_cb_close; + dev->hard_start_xmit = sppp_cb_tx; + dev->do_ioctl = sppp_cb_ioctl; + dev->get_stats = sppp_cb_net_stats; + dev->tx_timeout = sppp_cb_tx_timeout; + dev->watchdog_timeo = 10*HZ; +} + static void sppp_init(SLMP_INFO *info) { struct net_device *d; sprintf(info->netname,"mgslm%dp%d",info->adapter_num,info->port_num); + d = alloc_netdev(0, info->netname, cb_setup); + if (!d) { + printk(KERN_WARNING "%s: alloc_netdev failed.\n", + info->netname); + return; + } + info->if_ptr = &info->pppdev; - info->netdev = info->pppdev.dev = &info->netdevice; + info->netdev = info->pppdev.dev = d; sppp_attach(&info->pppdev); - d = info->netdev; - strcpy(d->name,info->netname); - d->base_addr = 0; d->irq = info->irq_level; - d->dma = 0; d->priv = info; - d->init = NULL; - d->open = sppp_cb_open; - d->stop = sppp_cb_close; - d->hard_start_xmit = sppp_cb_tx; - d->do_ioctl = sppp_cb_ioctl; - d->get_stats = sppp_cb_net_stats; - d->tx_timeout = sppp_cb_tx_timeout; - d->watchdog_timeo = 10*HZ; if (register_netdev(d)) { printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); sppp_detach(info->netdev); + info->netdev = NULL; + info->pppdev.dev = NULL; + free_netdev(d); return; } @@ -1667,8 +1675,11 @@ { if (debug_level >= DEBUG_LEVEL_INFO) printk("sppp_delete(%s)\n",info->netname); - sppp_detach(info->netdev); unregister_netdev(info->netdev); + sppp_detach(info->netdev); + free_netdev(info->netdev); + info->netdev = NULL; + info->pppdev.dev = NULL; } static int sppp_cb_open(struct net_device *d) diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c --- a/drivers/char/tty_io.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/tty_io.c Tue Feb 17 20:00:07 2004 @@ -1484,7 +1484,12 @@ #ifdef CONFIG_VT if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { unsigned int currcons = tty->index; - if (vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row)) + int rc; + + acquire_console_sem(); + rc = vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row); + release_console_sem(); + if (rc) return -ENXIO; } #endif @@ -2259,7 +2264,6 @@ if (driver->refcount) return -EBUSY; - cdev_unmap(MKDEV(driver->major, driver->minor_start), driver->num); unregister_chrdev_region(MKDEV(driver->major, driver->minor_start), driver->num); diff -Nru a/drivers/char/vt.c b/drivers/char/vt.c --- a/drivers/char/vt.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/vt.c Tue Feb 17 20:00:08 2004 @@ -148,7 +148,6 @@ static int con_open(struct tty_struct *, struct file *); static void vc_init(unsigned int console, unsigned int rows, unsigned int cols, int do_clear); -static void blank_screen(unsigned long dummy); static void gotoxy(int currcons, int new_x, int new_y); static void save_cur(int currcons); static void reset_terminal(int currcons, int do_clear); @@ -156,8 +155,8 @@ static void set_vesa_blanking(unsigned long arg); static void set_cursor(int currcons); static void hide_cursor(int currcons); -static void unblank_screen_t(unsigned long dummy); static void console_callback(void *ignored); +static void blank_screen_t(unsigned long dummy); static int printable; /* Is console ready for printing? */ @@ -214,6 +213,13 @@ int (*console_blank_hook)(int); static struct timer_list console_timer; +static int blank_state; +static int blank_timer_expired; +enum { + blank_off = 0, + blank_normal_wait, + blank_vesa_wait, +}; /* * Low-Level Functions @@ -337,6 +343,8 @@ void update_region(int currcons, unsigned long start, int count) { + WARN_CONSOLE_UNLOCKED(); + if (DO_UPDATE) { hide_cursor(currcons); do_update_region(currcons, start, count); @@ -400,6 +408,8 @@ { unsigned short *p; + WARN_CONSOLE_UNLOCKED(); + count /= 2; p = screenpos(currcons, offset, viewed); if (sw->con_invert_region) @@ -445,6 +455,8 @@ static unsigned short old; static unsigned short oldx, oldy; + WARN_CONSOLE_UNLOCKED(); + if (p) { scr_writew(old, p); if (DO_UPDATE) @@ -564,6 +576,8 @@ static void set_origin(int currcons) { + WARN_CONSOLE_UNLOCKED(); + if (!IS_VISIBLE || !sw->con_set_origin || !sw->con_set_origin(vc_cons[currcons].d)) @@ -575,6 +589,8 @@ static inline void save_screen(int currcons) { + WARN_CONSOLE_UNLOCKED(); + if (sw->con_save_screen) sw->con_save_screen(vc_cons[currcons].d); } @@ -588,6 +604,8 @@ int redraw = 1; int currcons, old_console; + WARN_CONSOLE_UNLOCKED(); + if (!vc_cons_allocated(new_console)) { /* strange ... */ /* printk("redraw_screen: tty %d not allocated ??\n", new_console+1); */ @@ -665,6 +683,8 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ { + WARN_CONSOLE_UNLOCKED(); + if (currcons >= MAX_NR_CONSOLES) return -ENXIO; if (!vc_cons[currcons].d) { @@ -731,6 +751,8 @@ unsigned int new_cols, new_rows, new_row_size, new_screen_size; unsigned short *newscreen; + WARN_CONSOLE_UNLOCKED(); + if (!vc_cons_allocated(currcons)) return -ENXIO; @@ -817,7 +839,8 @@ void vc_disallocate(unsigned int currcons) { - acquire_console_sem(); + WARN_CONSOLE_UNLOCKED(); + if (vc_cons_allocated(currcons)) { sw->con_deinit(vc_cons[currcons].d); if (kmalloced) @@ -826,7 +849,6 @@ kfree(vc_cons[currcons].d); vc_cons[currcons].d = NULL; } - release_console_sem(); } /* @@ -2081,6 +2103,10 @@ sw->con_scrolldelta(vc_cons[currcons].d, scrollback_delta); scrollback_delta = 0; } + if (blank_timer_expired) { + do_blank_screen(0); + blank_timer_expired = 0; + } release_console_sem(); } @@ -2091,6 +2117,8 @@ schedule_console_callback(); } +struct tty_driver *console_driver; + #ifdef CONFIG_VT_CONSOLE /* @@ -2190,8 +2218,6 @@ clear_bit(0, &printing); } -struct tty_driver *console_driver; - static struct tty_driver *vt_console_device(struct console *c, int *index) { *index = c->index ? c->index-1 : fg_console; @@ -2414,7 +2440,9 @@ currcons = tty->index; + acquire_console_sem(); i = vc_allocate(currcons); + release_console_sem(); if (i) return i; @@ -2480,16 +2508,20 @@ const char *display_desc = NULL; unsigned int currcons = 0; + acquire_console_sem(); + if (conswitchp) display_desc = conswitchp->con_startup(); if (!display_desc) { fg_console = 0; + release_console_sem(); return 0; } init_timer(&console_timer); - console_timer.function = blank_screen; + console_timer.function = blank_screen_t; if (blankinterval) { + blank_state = blank_normal_wait; mod_timer(&console_timer, jiffies + blankinterval); } @@ -2520,6 +2552,8 @@ printable = 1; printk("\n"); + release_console_sem(); + #ifdef CONFIG_VT_CONSOLE register_console(&vt_console_driver); #endif @@ -2599,8 +2633,13 @@ int i, j = -1; const char *desc; + acquire_console_sem(); + desc = csw->con_startup(); - if (!desc) return; + if (!desc) { + release_console_sem(); + return; + } if (deflt) conswitchp = csw; @@ -2640,6 +2679,8 @@ desc, vc_cons[j].d->vc_cols, vc_cons[j].d->vc_rows); else printk("to %s\n", desc); + + release_console_sem(); } void give_up_console(const struct consw *csw) @@ -2688,23 +2729,24 @@ } } -/* - * This is a timer handler - */ -static void vesa_powerdown_screen(unsigned long dummy) -{ - console_timer.function = unblank_screen_t; - - vesa_powerdown(); -} - -static void timer_do_blank_screen(int entering_gfx, int from_timer_handler) +void do_blank_screen(int entering_gfx) { int currcons = fg_console; int i; - if (console_blanked) + WARN_CONSOLE_UNLOCKED(); + + if (console_blanked) { + if (blank_state == blank_vesa_wait) { + blank_state = blank_off; + vesa_powerdown(); + + } + return; + } + if (blank_state != blank_normal_wait) return; + blank_state = blank_off; /* entering graphics mode? */ if (entering_gfx) { @@ -2723,9 +2765,8 @@ } hide_cursor(currcons); - if (!from_timer_handler) - del_timer_sync(&console_timer); - console_timer.function = unblank_screen_t; + del_timer_sync(&console_timer); + blank_timer_expired = 0; save_screen(currcons); /* In case we need to reset origin, blanking hook returns 1 */ @@ -2738,7 +2779,7 @@ return; if (vesa_off_interval) { - console_timer.function = vesa_powerdown_screen; + blank_state = blank_vesa_wait, mod_timer(&console_timer, jiffies + vesa_off_interval); } @@ -2746,18 +2787,6 @@ sw->con_blank(vc_cons[currcons].d, vesa_blank_mode + 1); } -void do_blank_screen(int entering_gfx) -{ - timer_do_blank_screen(entering_gfx, 0); -} - -/* - * This is a timer handler - */ -static void unblank_screen_t(unsigned long dummy) -{ - unblank_screen(); -} /* * Called by timer as well as from vt_console_driver @@ -2766,6 +2795,8 @@ { int currcons; + WARN_CONSOLE_UNLOCKED(); + ignore_poke = 0; if (!console_blanked) return; @@ -2778,9 +2809,9 @@ if (vcmode != KD_TEXT) return; /* but leave console_blanked != 0 */ - console_timer.function = blank_screen; if (blankinterval) { mod_timer(&console_timer, jiffies + blankinterval); + blank_state = blank_normal_wait; } console_blanked = 0; @@ -2794,23 +2825,33 @@ } /* - * This is both a user-level callable and a timer handler + * We defer the timer blanking to work queue so it can take the console semaphore + * (console operations can still happen at irq time, but only from printk which + * has the console semaphore. Not perfect yet, but better than no locking */ -static void blank_screen(unsigned long dummy) +static void blank_screen_t(unsigned long dummy) { - timer_do_blank_screen(0, 1); + blank_timer_expired = 1; + schedule_work(&console_work); } void poke_blanked_console(void) { + WARN_CONSOLE_UNLOCKED(); + + /* This isn't perfectly race free, but a race here would be mostly harmless, + * at worse, we'll do a spurrious blank and it's unlikely + */ del_timer(&console_timer); + blank_timer_expired = 0; + if (ignore_poke || !vt_cons[fg_console] || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) return; - if (console_blanked) { - console_timer.function = unblank_screen_t; - mod_timer(&console_timer, jiffies); /* Now */ - } else if (blankinterval) { + if (console_blanked) + unblank_screen(); + else if (blankinterval) { mod_timer(&console_timer, jiffies + blankinterval); + blank_state = blank_normal_wait; } } @@ -2820,6 +2861,8 @@ void set_palette(int currcons) { + WARN_CONSOLE_UNLOCKED(); + if (vcmode != KD_GRAPHICS) sw->con_set_palette(vc_cons[currcons].d, color_table); } @@ -2828,6 +2871,8 @@ { int i, j, k; + WARN_CONSOLE_UNLOCKED(); + for (i = 0; i < 16; i++) if (set) { get_user(default_red[i], arg++); @@ -2859,12 +2904,24 @@ int con_set_cmap(unsigned char *arg) { - return set_get_cmap (arg,1); + int rc; + + acquire_console_sem(); + rc = set_get_cmap (arg,1); + release_console_sem(); + + return rc; } int con_get_cmap(unsigned char *arg) { - return set_get_cmap (arg,0); + int rc; + + acquire_console_sem(); + rc = set_get_cmap (arg,0); + release_console_sem(); + + return rc; } void reset_palette(int currcons) @@ -2938,8 +2995,12 @@ set = 1; } else if (op->op == KD_FONT_OP_GET) set = 0; - else - return sw->con_font_op(vc_cons[currcons].d, op); + else { + acquire_console_sem(); + rc = sw->con_font_op(vc_cons[currcons].d, op); + release_console_sem(); + return rc; + } if (op->data) { temp = kmalloc(size, GFP_KERNEL); if (!temp) @@ -3001,13 +3062,13 @@ return screenpos(currcons, 2 * w_offset, viewed); } -void getconsxy(int currcons, char *p) +void getconsxy(int currcons, unsigned char *p) { p[0] = x; p[1] = y; } -void putconsxy(int currcons, char *p) +void putconsxy(int currcons, unsigned char *p) { gotoxy(currcons, p[0], p[1]); set_cursor(currcons); @@ -3034,10 +3095,14 @@ switch (rqst) { case PM_RESUME: + acquire_console_sem(); unblank_screen(); + release_console_sem(); break; case PM_SUSPEND: + acquire_console_sem(); do_blank_screen(0); + release_console_sem(); break; } return 0; diff -Nru a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c --- a/drivers/char/vt_ioctl.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/vt_ioctl.c Tue Feb 17 20:00:07 2004 @@ -470,6 +470,9 @@ * currently, setting the mode from KD_TEXT to KD_GRAPHICS * doesn't do a whole lot. i'm not sure if it should do any * restoration of modes or what... + * + * XXX It should at least call into the driver, fbdev's definitely + * need to restore their engine state. --BenH */ if (!perm) return -EPERM; @@ -492,10 +495,12 @@ /* * explicitly blank/unblank the screen if switching modes */ + acquire_console_sem(); if (arg == KD_TEXT) unblank_screen(); else do_blank_screen(1); + release_console_sem(); return 0; case KDGETMODE: @@ -665,18 +670,29 @@ return -EFAULT; if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) return -EINVAL; + acquire_console_sem(); vt_cons[console]->vt_mode = tmp; /* the frsig is ignored, so we set it to 0 */ vt_cons[console]->vt_mode.frsig = 0; vt_cons[console]->vt_pid = current->pid; /* no switch is required -- saw@shade.msu.ru */ vt_cons[console]->vt_newvt = -1; + release_console_sem(); return 0; } case VT_GETMODE: - return copy_to_user((void*)arg, &(vt_cons[console]->vt_mode), - sizeof(struct vt_mode)) ? -EFAULT : 0; + { + struct vt_mode tmp; + int rc; + + acquire_console_sem(); + memcpy(&tmp, &vt_cons[console]->vt_mode, sizeof(struct vt_mode)); + release_console_sem(); + + rc = copy_to_user((void*)arg, &tmp, sizeof(struct vt_mode)); + return rc ? -EFAULT : 0; + } /* * Returns global vt state. Note that VT 0 is always open, since @@ -718,7 +734,9 @@ if (arg == 0 || arg > MAX_NR_CONSOLES) return -ENXIO; arg--; + acquire_console_sem(); i = vc_allocate(arg); + release_console_sem(); if (i) return i; set_console(arg); @@ -768,17 +786,20 @@ * The current vt has been released, so * complete the switch. */ - int newvt = vt_cons[console]->vt_newvt; + int newvt; + acquire_console_sem(); + newvt = vt_cons[console]->vt_newvt; vt_cons[console]->vt_newvt = -1; i = vc_allocate(newvt); - if (i) + if (i) { + release_console_sem(); return i; + } /* * When we actually do the console switch, * make sure we are atomic with respect to * other console switches.. */ - acquire_console_sem(); complete_change_console(newvt); release_console_sem(); } @@ -806,16 +827,21 @@ return -ENXIO; if (arg == 0) { /* disallocate all unused consoles, but leave 0 */ - for (i=1; iv_rows) || get_user(cc, &vtsizes->v_cols)) return -EFAULT; - for (i = 0; i < MAX_NR_CONSOLES; i++) + for (i = 0; i < MAX_NR_CONSOLES; i++) { + acquire_console_sem(); vc_resize(i, cc, ll); + release_console_sem(); + } return 0; } @@ -870,11 +899,13 @@ for (i = 0; i < MAX_NR_CONSOLES; i++) { if (!vc_cons[i].d) continue; + acquire_console_sem(); if (vlin) vc_cons[i].d->vc_scan_lines = vlin; if (clin) vc_cons[i].d->vc_font.height = clin; vc_resize(i, cc, ll); + release_console_sem(); } return 0; } diff -Nru a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig --- a/drivers/char/watchdog/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/Kconfig Tue Feb 17 20:00:07 2004 @@ -38,6 +38,15 @@ get killed. If you say Y here, the watchdog cannot be stopped once it has been started. +# +# General Watchdog drivers +# + +comment "Watchdog Device Drivers" + depends on WATCHDOG + +# Architecture Independant + config SOFT_WATCHDOG tristate "Software watchdog" depends on WATCHDOG @@ -49,88 +58,53 @@ To compile this driver as a module, choose M here: the module will be called softdog. -config WDT - tristate "WDT Watchdog timer" - depends on WATCHDOG - ---help--- - If you have a WDT500P or WDT501P watchdog board, say Y here, - otherwise N. It is not possible to probe for this board, which means - that you have to inform the kernel about the IO port and IRQ using - the "wdt=" kernel option (try "man bootparam" or see the - documentation of your boot loader (lilo or loadlin) about how to - pass options to the kernel at boot time). - - To compile this driver as a module, choose M here: the - module will be called wdt. - -config WDT_501 - bool "WDT501 features" - depends on WDT - help - Saying Y here and creating a character special file /dev/temperature - with major number 10 and minor number 131 ("man mknod") will give - you a thermometer inside your computer: reading from - /dev/temperature yields one byte, the temperature in degrees - Fahrenheit. This works only if you have a WDT501P watchdog board - installed. +# ARM Architecture -config WDT_501_FAN - bool "Fan Tachometer" - depends on WDT_501 +config 21285_WATCHDOG + tristate "DC21285 watchdog" + depends on WATCHDOG && FOOTBRIDGE help - Enable the Fan Tachometer on the WDT501. Only do this if you have a - fan tachometer actually set up. + The Intel Footbridge chip contains a builtin watchdog circuit. Say Y + here if you wish to use this. Alternatively say M to compile the + driver as a module, which will be called wdt285. -config WDTPCI - tristate "WDT PCI Watchdog timer" - depends on WATCHDOG - ---help--- - If you have a PCI WDT500/501 watchdog board, say Y here, otherwise - N. It is not possible to probe for this board, which means that you - have to inform the kernel about the IO port and IRQ using the "wdt=" - kernel option (try "man bootparam" or see the documentation of your - boot loader (lilo or loadlin) about how to pass options to the - kernel at boot time). + This driver does not work on all machines. In particular, early CATS + boards have hardware problems that will cause the machine to simply + lock up if the watchdog fires. - To compile this driver as a module, choose M here: the - module will be called wdt_pci. + "If in doubt, leave it out" - say N. -config WDT_501_PCI - bool "WDT501-PCI features" - depends on WDTPCI +config 977_WATCHDOG + tristate "NetWinder WB83C977 watchdog" + depends on WATCHDOG && FOOTBRIDGE && ARCH_NETWINDER help - Saying Y here and creating a character special file /dev/temperature - with major number 10 and minor number 131 ("man mknod") will give - you a thermometer inside your computer: reading from - /dev/temperature yields one byte, the temperature in degrees - Fahrenheit. This works only if you have a WDT501P watchdog board - installed. + Say Y here to include support for the WB977 watchdog included in + NetWinder machines. Alternatively say M to compile the driver as + a module, which will be called wdt977. -config PCWATCHDOG - tristate "Berkshire Products PC Watchdog" - depends on WATCHDOG - ---help--- - This is the driver for the Berkshire Products PC Watchdog card. - This card simply watches your kernel to make sure it doesn't freeze, - and if it does, it reboots your computer after a certain amount of - time. This driver is like the WDT501 driver but for different - hardware. Please read . The PC - watchdog cards can be ordered from . + Not sure? It's safe to say N. + +config SA1100_WATCHDOG + tristate "SA1100 watchdog" + depends on WATCHDOG && ARCH_SA1100 + help + Watchdog timer embedded into SA11x0 chips. This will reboot your + system when timeout is reached. + NOTE, that once enabled, this timer cannot be disabled. To compile this driver as a module, choose M here: the - module will be called pcwd. + module will be called sa1100_wdt. - Most people will say N. +# X86 (i386 + ia64 + x86_64) Architecture config ACQUIRE_WDT tristate "Acquire SBC Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 ---help--- - This is the driver for the hardware watchdog on the PSC-6x86 Single - Board Computer produced by Acquire Inc (and others). This watchdog + This is the driver for the hardware watchdog on Single Board + Computers produced by Acquire Inc (and others). This watchdog simply watches your kernel to make sure it doesn't freeze, and if it does, it reboots your computer after a certain amount of time. - This driver is like the WDT501 driver but for different hardware. To compile this driver as a module, choose M here: the module will be called acquirewdt. @@ -139,50 +113,65 @@ config ADVANTECH_WDT tristate "Advantech SBC Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 help If you are configuring a Linux kernel for the Advantech single-board computer, say `Y' here to support its built-in watchdog timer - feature. See the help for CONFIG_WATCHDOG for discussion. + feature. More information can be found at + -config 21285_WATCHDOG - tristate "DC21285 watchdog" - depends on WATCHDOG && FOOTBRIDGE +config ALIM1535_WDT + tristate "ALi M1535 PMU Watchdog Timer" + depends on WATCHDOG && X86 && PCI + ---help--- + This is the driver for the hardware watchdog on the ALi M1535 PMU. + + To compile this driver as a module, choose M here: the + module will be called alim1535_wdt. + + Most people will say N. + +config ALIM7101_WDT + tristate "ALi M7101 PMU Computer Watchdog" + depends on WATCHDOG && X86 && PCI help - The Intel Footbridge chip contains a builtin watchdog circuit. Say Y - here if you wish to use this. Alternatively say M to compile the - driver as a module, which will be called wdt285. + This is the driver for the hardware watchdog on the ALi M7101 PMU + as used in the x86 Cobalt servers. - This driver does not work on all machines. In particular, early CATS - boards have hardware problems that will cause the machine to simply - lock up if the watchdog fires. + To compile this driver as a module, choose M here: the + module will be called alim7101_wdt. - "If in doubt, leave it out" - say N. + Most people will say N. -config 977_WATCHDOG - tristate "NetWinder WB83C977 watchdog" - depends on WATCHDOG && FOOTBRIDGE && ARCH_NETWINDER +config AMD7XX_TCO + tristate "AMD 766/768 TCO Timer/Watchdog" + depends on WATCHDOG && X86 && PCI help - Say Y here to include support for the WB977 watchdog included in - NetWinder machines. Alternatively say M to compile the driver as - a module, which will be called wdt977. + This is the driver for the hardware watchdog built in to the + AMD 766/768 chipsets. + This watchdog simply watches your kernel to make sure it doesn't + freeze, and if it does, it reboots your computer after a certain + amount of time. - Not sure? It's safe to say N. + You can compile this driver directly into the kernel, or use + it as a module. The module will be called amd7xx_tco. -config SA1100_WATCHDOG - tristate "SA1100 watchdog" - depends on WATCHDOG && ARCH_SA1100 +config SC520_WDT + tristate "AMD Elan SC520 processor Watchdog" + depends on WATCHDOG && X86 help - Watchdog timer embedded into SA11x0 chips. This will reboot your - system when timeout is reached. - NOTE, that once enabled, this timer cannot be disabled. + This is the driver for the hardware watchdog built in to the + AMD "Elan" SC520 microcomputer commonly used in embedded systems. + This watchdog simply watches your kernel to make sure it doesn't + freeze, and if it does, it reboots your computer after a certain + amount of time. - To compile this driver as a module, choose M here: the - module will be called sa1100_wdt. + You can compile this driver directly into the kernel, or use + it as a module. The module will be called sc520_wdt. config EUROTECH_WDT tristate "Eurotech CPU-1220/1410 Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 help Enable support for the watchdog timer on the Eurotech CPU-1220 and CPU-1410 cards. These are PC/104 SBCs. Spec sheets and product @@ -190,7 +179,7 @@ config IB700_WDT tristate "IB700 SBC Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 ---help--- This is the driver for the hardware watchdog on the IB700 Single Board Computer produced by TMC Technology (www.tmc-uk.com). This watchdog @@ -204,52 +193,60 @@ Most people will say N. -config I810_TCO - tristate "Intel i8xx TCO timer / Watchdog" - depends on WATCHDOG - ---help--- - Hardware driver for the TCO timer built into the Intel i8xx - chipset family. The TCO (Total Cost of Ownership) timer is a - watchdog timer that will reboot the machine after its second - expiration. The expiration time can be configured by commandline - argument "i810_margin=" where is the counter initial value. - It is decremented every 0.6 secs, the default is 50 which gives a - timeout of 30 seconds and one minute until reset. +config WAFER_WDT + tristate "ICP Wafer 5823 Single Board Computer Watchdog" + depends on WATCHDOG && X86 + help + This is a driver for the hardware watchdog on the ICP Wafer 5823 + Single Board Computer (and probably other similar models). + + To compile this driver as a module, choose M here: the + module will be called wafer5823wdt. + +config I8XX_TCO + tristate "Intel i8xx TCO Timer/Watchdog" + depends on WATCHDOG && (X86 || IA64) && PCI + ---help--- + Hardware driver for the TCO timer built into the Intel 82801 + I/O Controller Hub family. The TCO (Total Cost of Ownership) + timer is a watchdog timer that will reboot the machine after + its second expiration. The expiration time can be configured + with the "heartbeat" parameter. On some motherboards the driver may fail to reset the chipset's NO_REBOOT flag which prevents the watchdog from rebooting the machine. If this is the case you will get a kernel message like - "i810tco init: failed to reset NO_REBOOT flag". + "failed to reset NO_REBOOT flag, reboot disabled by hardware". To compile this driver as a module, choose M here: the - module will be called i810-tco. + module will be called i8xx_tco. -config MIXCOMWD - tristate "Mixcom Watchdog" - depends on WATCHDOG - ---help--- - This is a driver for the Mixcom hardware watchdog cards. This - watchdog simply watches your kernel to make sure it doesn't freeze, - and if it does, it reboots your computer after a certain amount of - time. +config SC1200_WDT + tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog" + depends on WATCHDOG && X86 + help + This is a driver for National Semiconductor PC87307/PC97307 hardware + watchdog cards as found on the SC1200. This watchdog is mainly used + for power management purposes and can be used to power down the device + during inactivity periods (includes interrupt activity monitoring). To compile this driver as a module, choose M here: the - module will be called mixcomwd. + module will be called sc1200wdt. Most people will say N. config SCx200_WDT - tristate "NatSemi SCx200 Watchdog" - depends on WATCHDOG + tristate "National Semiconductor SCx200 Watchdog" + depends on WATCHDOG && X86 && PCI help - Enable the built-in watchdog timer support on the National + Enable the built-in watchdog timer support on the National Semiconductor SCx200 processors. If compiled as a module, it will be called scx200_watchdog. config 60XX_WDT tristate "SBC-60XX Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 help This driver can be used with the watchdog timer found on some single board computers, namely the 6010 PII based computer. @@ -261,24 +258,17 @@ You can compile this driver directly into the kernel, or use it as a module. The module will be called sbc60xxwdt. -config W83877F_WDT - tristate "W83877F (EMACS) Watchdog Timer" - depends on WATCHDOG +config CPU5_WDT + tristate "SMA CPU5 Watchdog" + depends on WATCHDOG && X86 ---help--- - This is the driver for the hardware watchdog on the W83877F chipset - as used in EMACS PC-104 motherboards (and likely others). This - watchdog simply watches your kernel to make sure it doesn't freeze, - and if it does, it reboots your computer after a certain amount of - time. - + TBD. To compile this driver as a module, choose M here: the - module will be called w83877f_wdt. - - Most people will say N. + module will be called cpu5wdt. config W83627HF_WDT tristate "W83627HF Watchdog Timer" - depends on WATCHDOG + depends on WATCHDOG && X86 ---help--- This is the driver for the hardware watchdog on the W83627HF chipset as used in Advantech PC-9578 and Tyan S2721-533 motherboards @@ -291,9 +281,24 @@ Most people will say N. +config W83877F_WDT + tristate "W83877F (EMACS) Watchdog Timer" + depends on WATCHDOG && X86 + ---help--- + This is the driver for the hardware watchdog on the W83877F chipset + as used in EMACS PC-104 motherboards (and likely others). This + watchdog simply watches your kernel to make sure it doesn't freeze, + and if it does, it reboots your computer after a certain amount of + time. + + To compile this driver as a module, choose M here: the + module will be called w83877f_wdt. + + Most people will say N. + config MACHZ_WDT tristate "ZF MachZ Watchdog" - depends on WATCHDOG + depends on WATCHDOG && X86 ---help--- If you are using a ZF Micro MachZ processor, say Y here, otherwise N. This is the driver for the watchdog timer builtin on that @@ -304,85 +309,150 @@ To compile this driver as a module, choose M here: the module will be called machzwd. -config SC520_WDT - tristate "AMD Elan SC520 processor Watchdog" - depends on WATCHDOG - help - This is the driver for the hardware watchdog built in to the - AMD "Elan" SC520 microcomputer commonly used in embedded systems. - This watchdog simply watches your kernel to make sure it doesn't - freeze, and if it does, it reboots your computer after a certain - amount of time. - - You can compile this driver directly into the kernel, or use - it as a module. The module will be called sc520_wdt. +# MIPS Architecture -config AMD7XX_TCO - tristate "AMD 766/768 TCO Timer/Watchdog" - depends on WATCHDOG +config INDYDOG + tristate "Indy/I2 Hardware Watchdog" + depends on WATCHDOG && SGI_IP22 help - This is the driver for the hardware watchdog built in to the - AMD 766/768 chipsets. - This watchdog simply watches your kernel to make sure it doesn't - freeze, and if it does, it reboots your computer after a certain - amount of time. - - You can compile this driver directly into the kernel, or use - it as a module. The module will be called amd7xx_tco. + Hardwaredriver for the Indy's/I2's watchdog. This is a + watchdog timer that will reboot the machine after a 60 second + timer expired and no process has written to /dev/watchdog during + that time. -config ALIM7101_WDT - tristate "ALi M7101 PMU Computer Watchdog" - depends on WATCHDOG +# SUPERH Architecture + +config SH_WDT + tristate "SuperH Watchdog" + depends on WATCHDOG && SUPERH help - This is the driver for the hardware watchdog on the ALi M7101 PMU - as used in the x86 Cobalt servers. + This driver adds watchdog support for the integrated watchdog in the + SuperH processors. If you have one of these processors and wish + to have watchdog support enabled, say Y, otherwise say N. + + As a side note, saying Y here will automatically boost HZ to 1000 + so that the timer has a chance to clear the overflow counter. On + slower systems (such as the SH-2 and SH-3) this will likely yield + some performance issues. As such, the WDT should be avoided here + unless it is absolutely necessary. To compile this driver as a module, choose M here: the - module will be called alim7101_wdt. + module will be called shwdt. - Most people will say N. +# +# ISA-based Watchdog Cards +# -config ALIM1535_WDT - tristate "ALi M1535 PMU Watchdog Timer" - depends on WATCHDOG +comment "ISA-based Watchdog Cards" + depends on WATCHDOG && ISA + +config PCWATCHDOG + tristate "Berkshire Products ISA-PC Watchdog" + depends on WATCHDOG && ISA ---help--- - This is the driver for the hardware watchdog on the ALi M1535 PMU. + This is the driver for the Berkshire Products PC Watchdog card. + This card simply watches your kernel to make sure it doesn't freeze, + and if it does, it reboots your computer after a certain amount of + time. This driver is like the WDT501 driver but for different + hardware. Please read . The PC + watchdog cards can be ordered from . To compile this driver as a module, choose M here: the - module will be called alim1535_wdt. + module will be called pcwd. Most people will say N. -config SC1200_WDT - tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog" - depends on WATCHDOG - help - This is a driver for National Semiconductor PC87307/PC97307 hardware - watchdog cards as found on the SC1200. This watchdog is mainly used - for power management purposes and can be used to power down the device - during inactivity periods (includes interrupt activity monitoring). +config MIXCOMWD + tristate "Mixcom Watchdog" + depends on WATCHDOG && ISA + ---help--- + This is a driver for the Mixcom hardware watchdog cards. This + watchdog simply watches your kernel to make sure it doesn't freeze, + and if it does, it reboots your computer after a certain amount of + time. To compile this driver as a module, choose M here: the - module will be called sc1200wdt. + module will be called mixcomwd. Most people will say N. -config WAFER_WDT - tristate "ICP Wafer 5823 Single Board Computer Watchdog" - depends on WATCHDOG +config WDT + tristate "WDT Watchdog timer" + depends on WATCHDOG && ISA + ---help--- + If you have a WDT500P or WDT501P watchdog board, say Y here, + otherwise N. It is not possible to probe for this board, which means + that you have to inform the kernel about the IO port and IRQ using + the "wdt=" kernel option (try "man bootparam" or see the + documentation of your boot loader (lilo or loadlin) about how to + pass options to the kernel at boot time). + + To compile this driver as a module, choose M here: the + module will be called wdt. + +config WDT_501 + bool "WDT501 features" + depends on WDT help - This is a driver for the hardware watchdog on the ICP Wafer 5823 - Single Board Computer (and probably other similar models). + Saying Y here and creating a character special file /dev/temperature + with major number 10 and minor number 131 ("man mknod") will give + you a thermometer inside your computer: reading from + /dev/temperature yields one byte, the temperature in degrees + Fahrenheit. This works only if you have a WDT501P watchdog board + installed. + +config WDT_501_FAN + bool "Fan Tachometer" + depends on WDT_501 + help + Enable the Fan Tachometer on the WDT501. Only do this if you have a + fan tachometer actually set up. + +# +# PCI-based Watchdog Cards +# + +comment "PCI-based Watchdog Cards" + depends on WATCHDOG && PCI + +config PCIPCWATCHDOG + tristate "Berkshire Products PCI-PC Watchdog" + depends on WATCHDOG && PCI + ---help--- + This is the driver for the Berkshire Products PCI-PC Watchdog card. + This card simply watches your kernel to make sure it doesn't freeze, + and if it does, it reboots your computer after a certain amount of + time. The card can also monitor the internal temperature of the PC. + More info is available at . To compile this driver as a module, choose M here: the - module will be called wafer5823wdt. + module will be called pcwd_pci. -config CPU5_WDT - tristate "SMA CPU5 Watchdog" - depends on WATCHDOG + Most people will say N. + +config WDTPCI + tristate "WDT PCI Watchdog timer" + depends on WATCHDOG && PCI ---help--- - TBD. + If you have a PCI WDT500/501 watchdog board, say Y here, otherwise + N. It is not possible to probe for this board, which means that you + have to inform the kernel about the IO port and IRQ using the "wdt=" + kernel option (try "man bootparam" or see the documentation of your + boot loader (lilo or loadlin) about how to pass options to the + kernel at boot time). + To compile this driver as a module, choose M here: the - module will be called cpu5wdt. + module will be called wdt_pci. + +config WDT_501_PCI + bool "WDT501-PCI features" + depends on WDTPCI + help + Saying Y here and creating a character special file /dev/temperature + with major number 10 and minor number 131 ("man mknod") will give + you a thermometer inside your computer: reading from + /dev/temperature yields one byte, the temperature in degrees + Fahrenheit. This works only if you have a WDT501P watchdog board + installed. endmenu diff -Nru a/drivers/char/watchdog/Makefile b/drivers/char/watchdog/Makefile --- a/drivers/char/watchdog/Makefile Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/Makefile Tue Feb 17 20:00:07 2004 @@ -18,7 +18,7 @@ obj-$(CONFIG_WDTPCI) += wdt_pci.o obj-$(CONFIG_21285_WATCHDOG) += wdt285.o obj-$(CONFIG_977_WATCHDOG) += wdt977.o -obj-$(CONFIG_I810_TCO) += i810-tco.o +obj-$(CONFIG_I8XX_TCO) += i8xx_tco.o obj-$(CONFIG_MACHZ_WDT) += machzwd.o obj-$(CONFIG_SH_WDT) += shwdt.o obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o @@ -33,3 +33,5 @@ obj-$(CONFIG_WAFER_WDT) += wafer5823wdt.o obj-$(CONFIG_CPU5_WDT) += cpu5wdt.o obj-$(CONFIG_AMD7XX_TCO) += amd7xx_tco.o +obj-$(CONFIG_INDYDOG) += indydog.o +obj-$(CONFIG_PCIPCWATCHDOG) += pcwd_pci.o diff -Nru a/drivers/char/watchdog/acquirewdt.c b/drivers/char/watchdog/acquirewdt.c --- a/drivers/char/watchdog/acquirewdt.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/acquirewdt.c Tue Feb 17 20:00:07 2004 @@ -22,6 +22,32 @@ * Can't add timeout - driver doesn't allow changing value */ +/* + * Theory of Operation: + * The Watch-Dog Timer is provided to ensure that standalone + * Systems can always recover from catastrophic conditions that + * caused the CPU to crash. This condition may have occured by + * external EMI or a software bug. When the CPU stops working + * correctly, hardware on the board will either perform a hardware + * reset (cold boot) or a non-maskable interrupt (NMI) to bring the + * system back to a known state. + * + * The Watch-Dog Timer is controlled by two I/O Ports. + * 443 hex - Read - Enable or refresh the Watch-Dog Timer + * 043 hex - Read - Disable the Watch-Dog Timer + * + * To enable the Watch-Dog Timer, a read from I/O port 443h must + * be performed. This will enable and activate the countdown timer + * which will eventually time out and either reset the CPU or cause + * an NMI depending on the setting of a jumper. To ensure that this + * reset condition does not occur, the Watch-Dog Timer must be + * periodically refreshed by reading the same I/O port 443h. + * The Watch-Dog Timer is disabled by reading I/O port 043h. + * + * The Watch-Dog Timer Time-Out Period is set via jumpers. + * It can be 1, 2, 10, 20, 110 or 220 seconds. + */ + #include #include #include @@ -39,7 +65,7 @@ #define WATCHDOG_NAME "Acquire WDT" #define PFX WATCHDOG_NAME ": " -#define WATCHDOG_TIMEOUT 0 /* ??? Is the timeout hardcoded to 1 minute ??? */ +#define WATCHDOG_HEARTBEAT 0 /* There is no way to see what the correct time-out period is */ static unsigned long acq_is_open; static char expect_close; @@ -69,7 +95,7 @@ * Kernel methods. */ -static void acq_ping(void) +static void acq_keepalive(void) { /* Write a watchdog value */ inb_p(wdt_start); @@ -111,7 +137,7 @@ } /* Well, anyhow someone wrote to us, we should return that favour */ - acq_ping(); + acq_keepalive(); } return count; } @@ -119,6 +145,7 @@ static int acq_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + int options, retval = -EINVAL; static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, @@ -136,16 +163,14 @@ return put_user(0, (int *)arg); case WDIOC_KEEPALIVE: - acq_ping(); + acq_keepalive(); return 0; case WDIOC_GETTIMEOUT: - return put_user(WATCHDOG_TIMEOUT, (int *)arg); + return put_user(WATCHDOG_HEARTBEAT, (int *)arg); case WDIOC_SETOPTIONS: { - int options, retval = -EINVAL; - if (get_user(options, (int *)arg)) return -EFAULT; @@ -157,7 +182,7 @@ if (options & WDIOS_ENABLECARD) { - acq_ping(); + acq_keepalive(); retval = 0; } @@ -178,7 +203,7 @@ __module_get(THIS_MODULE); /* Activate */ - acq_ping(); + acq_keepalive(); return 0; } @@ -188,7 +213,7 @@ acq_stop(); } else { printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); - acq_ping(); + acq_keepalive(); } clear_bit(0, &acq_is_open); expect_close = 0; @@ -237,8 +262,6 @@ static struct notifier_block acq_notifier = { .notifier_call = acq_notify_sys, - .next = NULL, - .priority = 0, }; static int __init acq_init(void) @@ -280,8 +303,8 @@ printk (KERN_INFO PFX "initialized. (nowayout=%d)\n", nowayout); -out: - return ret; + return 0; + unreg_reboot: unregister_reboot_notifier(&acq_notifier); unreg_regions: @@ -289,7 +312,8 @@ unreg_stop: if (wdt_stop != wdt_start) release_region(wdt_stop, 1); - goto out; +out: + return ret; } static void __exit acq_exit(void) @@ -304,6 +328,7 @@ module_init(acq_init); module_exit(acq_exit); +MODULE_AUTHOR("David Woodhouse"); +MODULE_DESCRIPTION("Acquire Inc. Single Board Computer Watchdog Timer driver"); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Unkown"); -MODULE_DESCRIPTION("Acquire Single Board Computer Watchdog Timer driver"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/advantechwdt.c b/drivers/char/watchdog/advantechwdt.c --- a/drivers/char/watchdog/advantechwdt.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/advantechwdt.c Tue Feb 17 20:00:06 2004 @@ -334,4 +334,4 @@ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Marek Michalkiewicz "); MODULE_DESCRIPTION("Advantech Single Board Computer WDT driver"); - +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/alim1535_wdt.c b/drivers/char/watchdog/alim1535_wdt.c --- a/drivers/char/watchdog/alim1535_wdt.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/alim1535_wdt.c Tue Feb 17 20:00:06 2004 @@ -463,3 +463,4 @@ MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("ALi M1535 PMU Watchdog Timer driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/alim7101_wdt.c b/drivers/char/watchdog/alim7101_wdt.c --- a/drivers/char/watchdog/alim7101_wdt.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/alim7101_wdt.c Tue Feb 17 20:00:07 2004 @@ -383,3 +383,4 @@ MODULE_AUTHOR("Steve Hill"); MODULE_DESCRIPTION("ALi M7101 PMU Computer Watchdog Timer driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/amd7xx_tco.c b/drivers/char/watchdog/amd7xx_tco.c --- a/drivers/char/watchdog/amd7xx_tco.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/amd7xx_tco.c Tue Feb 17 20:00:06 2004 @@ -390,4 +390,4 @@ MODULE_AUTHOR("Zwane Mwaikambo "); MODULE_DESCRIPTION("AMD 766/768 TCO Timer Driver"); MODULE_LICENSE("GPL"); - +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/i810-tco.c b/drivers/char/watchdog/i810-tco.c --- a/drivers/char/watchdog/i810-tco.c Tue Feb 17 20:00:05 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,437 +0,0 @@ -/* - * i810-tco 0.05: TCO timer driver for i8xx chipsets - * - * (c) Copyright 2000 kernel concepts , All Rights Reserved. - * http://www.kernelconcepts.de - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Neither kernel concepts nor Nils Faerber admit liability nor provide - * warranty for any of this software. This material is provided - * "AS-IS" and at no charge. - * - * (c) Copyright 2000 kernel concepts - * developed for - * Jentro AG, Haar/Munich (Germany) - * - * TCO timer driver for i8xx chipsets - * based on softdog.c by Alan Cox - * - * The TCO timer is implemented in the following I/O controller hubs: - * (See the intel documentation on http://developer.intel.com.) - * 82801AA & 82801AB chip : document number 290655-003, 290677-004, - * 82801BA & 82801BAM chip : document number 290687-002, 298242-005, - * 82801CA & 82801CAM chip : document number 290716-001, 290718-001, - * 82801DB & 82801E chip : document number 290744-001, 273599-001, - * 82801EB & 82801ER chip : document number 252516-001 - * - * 20000710 Nils Faerber - * Initial Version 0.01 - * 20000728 Nils Faerber - * 0.02 Fix for SMI_EN->TCO_EN bit, some cleanups - * 20011214 Matt Domsch - * 0.03 Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT - * Didn't add timeout option as i810_margin already exists. - * 20020224 Joel Becker, Wim Van Sebroeck - * 0.04 Support for 82801CA(M) chipset, timer margin needs to be > 3, - * add support for WDIOC_SETTIMEOUT and WDIOC_GETTIMEOUT. - * 20020412 Rob Radez , Wim Van Sebroeck - * 0.05 Fix possible timer_alive race, add expect close support, - * clean up ioctls (WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS and - * WDIOC_SETOPTIONS), made i810tco_getdevice __init, - * removed boot_status, removed tco_timer_read, - * added support for 82801DB and 82801E chipset, - * added support for 82801EB and 8280ER chipset, - * general cleanup. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "i810-tco.h" - - -/* Module and version information */ -#define TCO_VERSION "0.05" -#define TCO_MODULE_NAME "i810 TCO timer" -#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION - -/* Default expire timeout */ -#define TIMER_MARGIN 50 /* steps of 0.6sec, 3 0x3f || tmrval < 0x04) - return -1; - - spin_lock(&tco_lock); - val = inb (TCO1_TMR); - val &= 0xc0; - val |= tmrval; - outb (val, TCO1_TMR); - val = inb (TCO1_TMR); - spin_unlock(&tco_lock); - - if ((val & 0x3f) != tmrval) - return -1; - - return 0; -} - -/* - * Reload (trigger) the timer. Lock is needed so we don't reload it during - * a reprogramming event - */ - -static void tco_timer_reload (void) -{ - spin_lock(&tco_lock); - outb (0x01, TCO1_RLD); - spin_unlock(&tco_lock); -} - -/* - * Allow only one person to hold it open - */ - -static int i810tco_open (struct inode *inode, struct file *file) -{ - if (test_and_set_bit(0, &timer_alive)) - return -EBUSY; - - /* - * Reload and activate timer - */ - tco_timer_reload (); - tco_timer_start (); - return 0; -} - -static int i810tco_release (struct inode *inode, struct file *file) -{ - /* - * Shut off the timer. - */ - if (tco_expect_close == 42) { - tco_timer_stop (); - } else { - tco_timer_reload (); - printk(KERN_CRIT TCO_MODULE_NAME ": Unexpected close, not stopping watchdog!\n"); - } - clear_bit(0, &timer_alive); - tco_expect_close = 0; - return 0; -} - -static ssize_t i810tco_write (struct file *file, const char *data, - size_t len, loff_t * ppos) -{ - /* Can't seek (pwrite) on this device */ - if (ppos != &file->f_pos) - return -ESPIPE; - - /* See if we got the magic character 'V' and reload the timer */ - if (len) { - if (!nowayout) { - size_t i; - - /* note: just in case someone wrote the magic character - * five months ago... */ - tco_expect_close = 0; - - /* scan to see whether or not we got the magic character */ - for (i = 0; i != len; i++) { - u8 c; - if(get_user(c, data+i)) - return -EFAULT; - if (c == 'V') - tco_expect_close = 42; - } - } - - /* someone wrote to us, we should reload the timer */ - tco_timer_reload (); - } - return len; -} - -static int i810tco_ioctl (struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int new_margin, u_margin; - int options, retval = -EINVAL; - - static struct watchdog_info ident = { - .options = WDIOF_SETTIMEOUT | - WDIOF_KEEPALIVEPING | - WDIOF_MAGICCLOSE, - .firmware_version = 0, - .identity = "i810 TCO timer", - }; - switch (cmd) { - default: - return -ENOIOCTLCMD; - case WDIOC_GETSUPPORT: - if (copy_to_user - ((struct watchdog_info *) arg, &ident, sizeof (ident))) - return -EFAULT; - return 0; - case WDIOC_GETSTATUS: - case WDIOC_GETBOOTSTATUS: - return put_user (0, (int *) arg); - case WDIOC_SETOPTIONS: - if (get_user (options, (int *) arg)) - return -EFAULT; - if (options & WDIOS_DISABLECARD) { - tco_timer_stop (); - retval = 0; - } - if (options & WDIOS_ENABLECARD) { - tco_timer_reload (); - tco_timer_start (); - retval = 0; - } - return retval; - case WDIOC_KEEPALIVE: - tco_timer_reload (); - return 0; - case WDIOC_SETTIMEOUT: - if (get_user (u_margin, (int *) arg)) - return -EFAULT; - new_margin = (u_margin * 10 + 5) / 6; - if ((new_margin < 4) || (new_margin > 63)) - return -EINVAL; - if (tco_timer_settimer ((unsigned char) new_margin)) - return -EINVAL; - i810_margin = new_margin; - tco_timer_reload (); - /* Fall */ - case WDIOC_GETTIMEOUT: - return put_user ((int)(i810_margin * 6 / 10), (int *) arg); - } -} - -/* - * Data for PCI driver interface - * - * This data only exists for exporting the supported - * PCI ids via MODULE_DEVICE_TABLE. We do not actually - * register a pci_driver, because someone else might one day - * want to register another driver on the same PCI id. - */ -static struct pci_device_id i810tco_pci_tbl[] = { - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, }, - { 0, }, -}; -MODULE_DEVICE_TABLE (pci, i810tco_pci_tbl); - -static struct pci_dev *i810tco_pci; - -static unsigned char __init i810tco_getdevice (void) -{ - struct pci_dev *dev = NULL; - u8 val1, val2; - u16 badr; - /* - * Find the PCI device - */ - - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { - if (pci_match_device(i810tco_pci_tbl, dev)) { - i810tco_pci = dev; - break; - } - } - - if (i810tco_pci) { - /* - * Find the ACPI base I/O address which is the base - * for the TCO registers (TCOBASE=ACPIBASE + 0x60) - * ACPIBASE is bits [15:7] from 0x40-0x43 - */ - pci_read_config_byte (i810tco_pci, 0x40, &val1); - pci_read_config_byte (i810tco_pci, 0x41, &val2); - badr = ((val2 << 1) | (val1 >> 7)) << 7; - ACPIBASE = badr; - /* Something's wrong here, ACPIBASE has to be set */ - if (badr == 0x0001 || badr == 0x0000) { - printk (KERN_ERR TCO_MODULE_NAME " init: failed to get TCOBASE address\n"); - return 0; - } - /* - * Check chipset's NO_REBOOT bit - */ - pci_read_config_byte (i810tco_pci, 0xd4, &val1); - if (val1 & 0x02) { - val1 &= 0xfd; - pci_write_config_byte (i810tco_pci, 0xd4, val1); - pci_read_config_byte (i810tco_pci, 0xd4, &val1); - if (val1 & 0x02) { - printk (KERN_ERR TCO_MODULE_NAME " init: failed to reset NO_REBOOT flag, reboot disabled by hardware\n"); - return 0; /* Cannot reset NO_REBOOT bit */ - } - } - /* Set the TCO_EN bit in SMI_EN register */ - val1 = inb (SMI_EN + 1); - val1 &= 0xdf; - outb (val1, SMI_EN + 1); - /* Clear out the (probably old) status */ - outb (0, TCO1_STS); - outb (3, TCO2_STS); - return 1; - } - return 0; -} - -static struct file_operations i810tco_fops = { - .owner = THIS_MODULE, - .write = i810tco_write, - .ioctl = i810tco_ioctl, - .open = i810tco_open, - .release = i810tco_release, -}; - -static struct miscdevice i810tco_miscdev = { - .minor = WATCHDOG_MINOR, - .name = "watchdog", - .fops = &i810tco_fops, -}; - -static int __init watchdog_init (void) -{ - spin_lock_init(&tco_lock); - if (!i810tco_getdevice () || i810tco_pci == NULL) - return -ENODEV; - if (!request_region (TCOBASE, 0x10, "i810 TCO")) { - printk (KERN_ERR TCO_MODULE_NAME - ": I/O address 0x%04x already in use\n", - TCOBASE); - return -EIO; - } - if (misc_register (&i810tco_miscdev) != 0) { - release_region (TCOBASE, 0x10); - printk (KERN_ERR TCO_MODULE_NAME ": cannot register miscdev\n"); - return -EIO; - } - tco_timer_settimer ((unsigned char) i810_margin); - tco_timer_reload (); - - printk (KERN_INFO TCO_DRIVER_NAME - ": timer margin: %d sec (0x%04x) (nowayout=%d)\n", - (int) (i810_margin * 6 / 10), TCOBASE, nowayout); - return 0; -} - -static void __exit watchdog_cleanup (void) -{ - u8 val; - - /* Reset the timer before we leave */ - tco_timer_reload (); - /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ - pci_read_config_byte (i810tco_pci, 0xd4, &val); - val |= 0x02; - pci_write_config_byte (i810tco_pci, 0xd4, val); - release_region (TCOBASE, 0x10); - misc_deregister (&i810tco_miscdev); -} - -module_init(watchdog_init); -module_exit(watchdog_cleanup); - -MODULE_AUTHOR("Nils Faerber"); -MODULE_DESCRIPTION("TCO timer driver for i8xx chipsets"); -MODULE_LICENSE("GPL"); diff -Nru a/drivers/char/watchdog/i810-tco.h b/drivers/char/watchdog/i810-tco.h --- a/drivers/char/watchdog/i810-tco.h Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,42 +0,0 @@ -/* - * i810-tco: TCO timer driver for i8xx chipsets - * - * (c) Copyright 2000 kernel concepts , All Rights Reserved. - * http://www.kernelconcepts.de - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Neither kernel concepts nor Nils Faerber admit liability nor provide - * warranty for any of this software. This material is provided - * "AS-IS" and at no charge. - * - * (c) Copyright 2000 kernel concepts - * developed for - * Jentro AG, Haar/Munich (Germany) - * - * TCO timer driver for i8xx chipsets - * based on softdog.c by Alan Cox - * - * For history and the complete list of supported I/O Controller Hub's - * see i810-tco.c - */ - - -/* - * Some address definitions for the i810 TCO - */ - -#define TCOBASE ACPIBASE + 0x60 /* TCO base address */ -#define TCO1_RLD TCOBASE + 0x00 /* TCO Timer Reload and Current Value */ -#define TCO1_TMR TCOBASE + 0x01 /* TCO Timer Initial Value */ -#define TCO1_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */ -#define TCO1_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */ -#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */ -#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */ -#define TCO1_CNT TCOBASE + 0x08 /* TCO1 Control Register */ -#define TCO2_CNT TCOBASE + 0x0a /* TCO2 Control Register */ - -#define SMI_EN ACPIBASE + 0x30 /* SMI Control and Enable Register */ diff -Nru a/drivers/char/watchdog/i8xx_tco.c b/drivers/char/watchdog/i8xx_tco.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/char/watchdog/i8xx_tco.c Tue Feb 17 20:00:05 2004 @@ -0,0 +1,510 @@ +/* + * i8xx_tco 0.06: TCO timer driver for i8xx chipsets + * + * (c) Copyright 2000 kernel concepts , All Rights Reserved. + * http://www.kernelconcepts.de + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Neither kernel concepts nor Nils Faerber admit liability nor provide + * warranty for any of this software. This material is provided + * "AS-IS" and at no charge. + * + * (c) Copyright 2000 kernel concepts + * developed for + * Jentro AG, Haar/Munich (Germany) + * + * TCO timer driver for i8xx chipsets + * based on softdog.c by Alan Cox + * + * The TCO timer is implemented in the following I/O controller hubs: + * (See the intel documentation on http://developer.intel.com.) + * 82801AA & 82801AB chip : document number 290655-003, 290677-004, + * 82801BA & 82801BAM chip : document number 290687-002, 298242-005, + * 82801CA & 82801CAM chip : document number 290716-001, 290718-001, + * 82801DB & 82801E chip : document number 290744-001, 273599-001, + * 82801EB & 82801ER chip : document number 252516-001 + * + * 20000710 Nils Faerber + * Initial Version 0.01 + * 20000728 Nils Faerber + * 0.02 Fix for SMI_EN->TCO_EN bit, some cleanups + * 20011214 Matt Domsch + * 0.03 Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT + * Didn't add timeout option as i810_margin already exists. + * 20020224 Joel Becker, Wim Van Sebroeck + * 0.04 Support for 82801CA(M) chipset, timer margin needs to be > 3, + * add support for WDIOC_SETTIMEOUT and WDIOC_GETTIMEOUT. + * 20020412 Rob Radez , Wim Van Sebroeck + * 0.05 Fix possible timer_alive race, add expect close support, + * clean up ioctls (WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS and + * WDIOC_SETOPTIONS), made i810tco_getdevice __init, + * removed boot_status, removed tco_timer_read, + * added support for 82801DB and 82801E chipset, + * added support for 82801EB and 8280ER chipset, + * general cleanup. + * 20030921 Wim Van Sebroeck + * 0.06 change i810_margin to heartbeat, use module_param, + * added notify system support, renamed module to i8xx_tco. + */ + +/* + * Includes, defines, variables, module parameters, ... + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "i8xx_tco.h" + +/* Module and version information */ +#define TCO_VERSION "0.06" +#define TCO_MODULE_NAME "i8xx TCO timer" +#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION +#define PFX TCO_MODULE_NAME ": " + +/* internal variables */ +static unsigned int ACPIBASE; +static spinlock_t tco_lock; /* Guards the hardware */ +static unsigned long timer_alive; +static char tco_expect_close; +static struct pci_dev *i8xx_tco_pci; + +/* module parameters */ +#define WATCHDOG_HEARTBEAT 30 /* 30 sec default heartbeat (2 0x3f || tmrval < 0x04) + return -EINVAL; + + /* Write new heartbeat to watchdog */ + spin_lock(&tco_lock); + val = inb (TCO1_TMR); + val &= 0xc0; + val |= tmrval; + outb (val, TCO1_TMR); + val = inb (TCO1_TMR); + spin_unlock(&tco_lock); + + if ((val & 0x3f) != tmrval) + return -EINVAL; + + heartbeat = t; + return 0; +} + +/* + * /dev/watchdog handling + */ + +static int i8xx_tco_open (struct inode *inode, struct file *file) +{ + /* /dev/watchdog can only be opened once */ + if (test_and_set_bit(0, &timer_alive)) + return -EBUSY; + + /* + * Reload and activate timer + */ + tco_timer_keepalive (); + tco_timer_start (); + return 0; +} + +static int i8xx_tco_release (struct inode *inode, struct file *file) +{ + /* + * Shut off the timer. + */ + if (tco_expect_close == 42) { + tco_timer_stop (); + } else { + printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + tco_timer_keepalive (); + } + clear_bit(0, &timer_alive); + tco_expect_close = 0; + return 0; +} + +static ssize_t i8xx_tco_write (struct file *file, const char *data, + size_t len, loff_t * ppos) +{ + /* Can't seek (pwrite) on this device */ + if (ppos != &file->f_pos) + return -ESPIPE; + + /* See if we got the magic character 'V' and reload the timer */ + if (len) { + if (!nowayout) { + size_t i; + + /* note: just in case someone wrote the magic character + * five months ago... */ + tco_expect_close = 0; + + /* scan to see whether or not we got the magic character */ + for (i = 0; i != len; i++) { + char c; + if(get_user(c, data+i)) + return -EFAULT; + if (c == 'V') + tco_expect_close = 42; + } + } + + /* someone wrote to us, we should reload the timer */ + tco_timer_keepalive (); + } + return len; +} + +static int i8xx_tco_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + int new_options, retval = -EINVAL; + int new_heartbeat; + static struct watchdog_info ident = { + .options = WDIOF_SETTIMEOUT | + WDIOF_KEEPALIVEPING | + WDIOF_MAGICCLOSE, + .firmware_version = 0, + .identity = TCO_MODULE_NAME, + }; + + switch (cmd) { + case WDIOC_GETSUPPORT: + return copy_to_user((struct watchdog_info *) arg, &ident, + sizeof (ident)) ? -EFAULT : 0; + + case WDIOC_GETSTATUS: + case WDIOC_GETBOOTSTATUS: + return put_user (0, (int *) arg); + + case WDIOC_KEEPALIVE: + tco_timer_keepalive (); + return 0; + + case WDIOC_SETOPTIONS: + { + if (get_user (new_options, (int *) arg)) + return -EFAULT; + + if (new_options & WDIOS_DISABLECARD) { + tco_timer_stop (); + retval = 0; + } + + if (new_options & WDIOS_ENABLECARD) { + tco_timer_keepalive (); + tco_timer_start (); + retval = 0; + } + + return retval; + } + + case WDIOC_SETTIMEOUT: + { + if (get_user(new_heartbeat, (int *) arg)) + return -EFAULT; + + if (tco_timer_set_heartbeat(new_heartbeat)) + return -EINVAL; + + tco_timer_keepalive (); + /* Fall */ + } + + case WDIOC_GETTIMEOUT: + return put_user(heartbeat, (int *)arg); + + default: + return -ENOIOCTLCMD; + } +} + +/* + * Notify system + */ + +static int i8xx_tco_notify_sys (struct notifier_block *this, unsigned long code, void *unused) +{ + if (code==SYS_DOWN || code==SYS_HALT) { + /* Turn the WDT off */ + tco_timer_stop (); + } + + return NOTIFY_DONE; +} + +/* + * Kernel Interfaces + */ + +static struct file_operations i8xx_tco_fops = { + .owner = THIS_MODULE, + .llseek = no_llseek, + .write = i8xx_tco_write, + .ioctl = i8xx_tco_ioctl, + .open = i8xx_tco_open, + .release = i8xx_tco_release, +}; + +static struct miscdevice i8xx_tco_miscdev = { + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &i8xx_tco_fops, +}; + +static struct notifier_block i8xx_tco_notifier = { + .notifier_call = i8xx_tco_notify_sys, +}; + +/* + * Data for PCI driver interface + * + * This data only exists for exporting the supported + * PCI ids via MODULE_DEVICE_TABLE. We do not actually + * register a pci_driver, because someone else might one day + * want to register another driver on the same PCI id. + */ +static struct pci_device_id i8xx_tco_pci_tbl[] = { + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, }, + { 0, }, /* End of list */ +}; +MODULE_DEVICE_TABLE (pci, i8xx_tco_pci_tbl); + +/* + * Init & exit routines + */ + +static unsigned char __init i8xx_tco_getdevice (void) +{ + struct pci_dev *dev = NULL; + u8 val1, val2; + u16 badr; + /* + * Find the PCI device + */ + + while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + if (pci_match_device(i8xx_tco_pci_tbl, dev)) { + i8xx_tco_pci = dev; + break; + } + } + + if (i8xx_tco_pci) { + /* + * Find the ACPI base I/O address which is the base + * for the TCO registers (TCOBASE=ACPIBASE + 0x60) + * ACPIBASE is bits [15:7] from 0x40-0x43 + */ + pci_read_config_byte (i8xx_tco_pci, 0x40, &val1); + pci_read_config_byte (i8xx_tco_pci, 0x41, &val2); + badr = ((val2 << 1) | (val1 >> 7)) << 7; + ACPIBASE = badr; + /* Something's wrong here, ACPIBASE has to be set */ + if (badr == 0x0001 || badr == 0x0000) { + printk (KERN_ERR PFX "failed to get TCOBASE address\n"); + return 0; + } + /* + * Check chipset's NO_REBOOT bit + */ + pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1); + if (val1 & 0x02) { + val1 &= 0xfd; + pci_write_config_byte (i8xx_tco_pci, 0xd4, val1); + pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1); + if (val1 & 0x02) { + printk (KERN_ERR PFX "failed to reset NO_REBOOT flag, reboot disabled by hardware\n"); + return 0; /* Cannot reset NO_REBOOT bit */ + } + } + /* Set the TCO_EN bit in SMI_EN register */ + val1 = inb (SMI_EN + 1); + val1 &= 0xdf; + outb (val1, SMI_EN + 1); + /* Clear out the (probably old) status */ + outb (0, TCO1_STS); + outb (3, TCO2_STS); + return 1; + } + return 0; +} + +static int __init watchdog_init (void) +{ + int ret; + + spin_lock_init(&tco_lock); + + /* Check whether or not the hardware watchdog is there */ + if (!i8xx_tco_getdevice () || i8xx_tco_pci == NULL) + return -ENODEV; + + if (!request_region (TCOBASE, 0x10, "i8xx TCO")) { + printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", + TCOBASE); + ret = -EIO; + goto out; + } + + /* Check that the heartbeat value is within it's range ; if not reset to the default */ + if (tco_timer_set_heartbeat (heartbeat)) { + heartbeat = WATCHDOG_HEARTBEAT; + tco_timer_set_heartbeat (heartbeat); + printk(KERN_INFO PFX "heartbeat value must be 2, All Rights Reserved. + * http://www.kernelconcepts.de + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Neither kernel concepts nor Nils Faerber admit liability nor provide + * warranty for any of this software. This material is provided + * "AS-IS" and at no charge. + * + * (c) Copyright 2000 kernel concepts + * developed for + * Jentro AG, Haar/Munich (Germany) + * + * TCO timer driver for i8xx chipsets + * based on softdog.c by Alan Cox + * + * For history and the complete list of supported I/O Controller Hub's + * see i8xx_tco.c + */ + + +/* + * Some address definitions for the TCO + */ + +#define TCOBASE ACPIBASE + 0x60 /* TCO base address */ +#define TCO1_RLD TCOBASE + 0x00 /* TCO Timer Reload and Current Value */ +#define TCO1_TMR TCOBASE + 0x01 /* TCO Timer Initial Value */ +#define TCO1_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */ +#define TCO1_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */ +#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */ +#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */ +#define TCO1_CNT TCOBASE + 0x08 /* TCO1 Control Register */ +#define TCO2_CNT TCOBASE + 0x0a /* TCO2 Control Register */ + +#define SMI_EN ACPIBASE + 0x30 /* SMI Control and Enable Register */ diff -Nru a/drivers/char/watchdog/indydog.c b/drivers/char/watchdog/indydog.c --- a/drivers/char/watchdog/indydog.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/watchdog/indydog.c Tue Feb 17 20:00:08 2004 @@ -1,5 +1,5 @@ /* - * IndyDog 0.2 A Hardware Watchdog Device for SGI IP22 + * IndyDog 0.3 A Hardware Watchdog Device for SGI IP22 * * (c) Copyright 2002 Guido Guenther , All Rights Reserved. * @@ -19,11 +19,16 @@ #include #include #include +#include +#include #include #include #include #include +#define PFX "indydog: " +#define WATCHDOG_HEARTBEAT 60 + static unsigned long indydog_alive; static struct sgimc_misc_ctrl *mcmisc_regs; static char expect_close; @@ -37,11 +42,30 @@ module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); -static void indydog_ping() +static void indydog_start(void) { - mcmisc_regs->watchdogt = 0; + u32 mc_ctrl0 = mcmisc_regs->cpuctrl0; + + mc_ctrl0 |= SGIMC_CCTRL0_WDOG; + mcmisc_regs->cpuctrl0 = mc_ctrl0; + + printk(KERN_INFO PFX "Started watchdog timer.\n"); } +static void indydog_stop(void) +{ + u32 mc_ctrl0 = mcmisc_regs->cpuctrl0; + + mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG; + mcmisc_regs->cpuctrl0 = mc_ctrl0; + + printk(KERN_INFO PFX "Stopped watchdog timer.\n"); +} + +static void indydog_ping(void) +{ + mcmisc_regs->watchdogt = 0; +} /* * Allow only one person to hold it open @@ -49,8 +73,6 @@ static int indydog_open(struct inode *inode, struct file *file) { - u32 mc_ctrl0; - if( test_and_set_bit(0,&indydog_alive) ) return -EBUSY; @@ -60,13 +82,9 @@ /* * Activate timer */ - mcmisc_regs = (struct sgimc_misc_ctrl *)(KSEG1+0x1fa00000); - - mc_ctrl0 = mcmisc_regs->cpuctrl0 | SGIMC_CCTRL0_WDOG; - mcmisc_regs->cpuctrl0 = mc_ctrl0; + indydog_start(); indydog_ping(); - printk("Started watchdog timer.\n"); return 0; } @@ -78,12 +96,10 @@ */ if (expect_close == 42) { - u32 mc_ctrl0 = mcmisc_regs->cpuctrl0; - mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG; - mcmisc_regs->cpuctrl0 = mc_ctrl0; - printk("Stopped watchdog timer.\n"); + indydog_stop(); } else { - printk(KERN_CRIT "WDT device closed unexpectedly. WDT will not stop!\n"); + printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); + indydog_ping(); } clear_bit(0,&indydog_alive); expect_close = 0; @@ -121,9 +137,12 @@ static int indydog_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + int options, retval = -EINVAL; static struct watchdog_info ident = { - .options = WDIOF_MAGICCLOSE, - .identity = "Hardware Watchdog for SGI IP22", + .options = WDIOF_KEEPALIVEPING | + WDIOF_MAGICCLOSE, + .firmware_version = 0, + .identity = "Hardware Watchdog for SGI IP22", }; switch (cmd) { @@ -139,9 +158,40 @@ case WDIOC_KEEPALIVE: indydog_ping(); return 0; + case WDIOC_GETTIMEOUT: + return put_user(WATCHDOG_TIMEOUT,(int *)arg); + case WDIOC_SETOPTIONS: + { + if (get_user(options, (int *)arg)) + return -EFAULT; + + if (options & WDIOS_DISABLECARD) + { + indydog_stop(); + retval = 0; + } + + if (options & WDIOS_ENABLECARD) + { + indydog_start(); + retval = 0; + } + + return retval; + } } } +static int indydog_notify_sys(struct notifier_block *this, unsigned long code, void *unused) +{ + if (code==SYS_DOWN || code==SYS_HALT) { + /* Turn the WDT off */ + indydog_stop(); + } + + return NOTIFY_DONE; +} + static struct file_operations indydog_fops = { .owner = THIS_MODULE, .write = indydog_write, @@ -156,16 +206,32 @@ .fops = &indydog_fops, }; -static char banner[] __initdata = KERN_INFO "Hardware Watchdog Timer for SGI IP22: 0.2\n"; +static struct notifier_block indydog_notifier = { + .notifier_call = indydog_notify_sys, +}; + +static char banner[] __initdata = KERN_INFO PFX "Hardware Watchdog Timer for SGI IP22: 0.3\n"; static int __init watchdog_init(void) { int ret; - ret = misc_register(&indydog_miscdev); + mcmisc_regs = (struct sgimc_misc_ctrl *)(KSEG1+0x1fa00000); + + ret = register_reboot_notifier(&indydog_notifier); + if (ret) { + printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", + ret); + return ret; + } - if (ret) + ret = misc_register(&indydog_miscdev); + if (ret) { + printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", + WATCHDOG_MINOR, ret); + unregister_reboot_notifier(&indydog_notifier); return ret; + } printk(banner); @@ -175,8 +241,13 @@ static void __exit watchdog_exit(void) { misc_deregister(&indydog_miscdev); + unregister_reboot_notifier(&indydog_notifier); } module_init(watchdog_init); module_exit(watchdog_exit); + +MODULE_AUTHOR("Guido Guenther "); +MODULE_DESCRIPTION("Hardware Watchdog Device for SGI IP22"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/pcwd_pci.c b/drivers/char/watchdog/pcwd_pci.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/char/watchdog/pcwd_pci.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,681 @@ +/* + * Berkshire PCI-PC Watchdog Card Driver + * + * (c) Copyright 2003 Wim Van Sebroeck . + * + * Based on source code of the following authors: + * Ken Hollis , + * Lindsay Harris , + * Alan Cox , + * Matt Domsch , + * Rob Radez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Neither Wim Van Sebroeck nor Iguana vzw. admit liability nor + * provide warranty for any of this software. This material is + * provided "AS-IS" and at no charge. + */ + +/* + * A bells and whistles driver is available from http://www.pcwd.de/ + * More info available at http://www.berkprod.com/ or http://www.pcwatchdog.com/ + */ + +/* + * Includes, defines, variables, module parameters, ... + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Module and version information */ +#define WATCHDOG_VERSION "1.00" +#define WATCHDOG_DATE "09/02/2004" +#define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog" +#define WATCHDOG_NAME "pcwd_pci" +#define PFX WATCHDOG_NAME ": " +#define DRIVER_VERSION WATCHDOG_DRIVER_NAME " driver, v" WATCHDOG_VERSION " (" WATCHDOG_DATE ")\n" + +/* Stuff for the PCI ID's */ +#ifndef PCI_VENDOR_ID_QUICKLOGIC +#define PCI_VENDOR_ID_QUICKLOGIC 0x11e3 +#endif + +#ifndef PCI_DEVICE_ID_WATCHDOG_PCIPCWD +#define PCI_DEVICE_ID_WATCHDOG_PCIPCWD 0x5030 +#endif + +/* + * These are the defines that describe the control status bits for the + * PCI-PC Watchdog card. + */ +#define WD_PCI_WTRP 0x01 /* Watchdog Trip status */ +#define WD_PCI_HRBT 0x02 /* Watchdog Heartbeat */ +#define WD_PCI_TTRP 0x04 /* Temperature Trip status */ + +/* according to documentation max. time to process a command for the pci + watchdog card is 100 ms, so we give it 150 ms to do it's job */ +#define PCI_COMMAND_TIMEOUT 150 + +/* Watchdog's internal commands */ +#define CMD_GET_STATUS 0x04 +#define CMD_GET_FIRMWARE_VERSION 0x08 +#define CMD_READ_WATCHDOG_TIMEOUT 0x18 +#define CMD_WRITE_WATCHDOG_TIMEOUT 0x19 + +/* internal variables */ +static int temp_panic; +static unsigned long is_active; +static char expect_release; +static struct { + int supports_temp; /* Wether or not the card has a temperature device */ + int boot_status; /* The card's boot status */ + unsigned long io_addr; /* The cards I/O address */ + spinlock_t io_lock; + struct pci_dev *pdev; +} pcipcwd_private; + +/* module parameters */ +#define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ +static int heartbeat = WATCHDOG_HEARTBEAT; +module_param(heartbeat, int, 0); +MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0 0xFFFF)) + return -EINVAL; + + /* Write new heartbeat to watchdog */ + send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb); + + heartbeat = t; + return 0; +} + +static int pcipcwd_get_status(int *status) +{ + int new_status; + + *status=0; + new_status = inb_p(pcipcwd_private.io_addr + 1); + if (new_status & WD_PCI_WTRP) + *status |= WDIOF_CARDRESET; + if (new_status & WD_PCI_TTRP) { + *status |= WDIOF_OVERHEAT; + if (temp_panic) + panic(PFX "Temperature overheat trip!\n"); + } + + return 0; +} + +static int pcipcwd_clear_status(void) +{ + outb_p(0x01, pcipcwd_private.io_addr + 1); + return 0; +} + +static int pcipcwd_get_temperature(int *temperature) +{ + *temperature = 0; + if (!pcipcwd_private.supports_temp) + return -ENODEV; + + /* + * Convert celsius to fahrenheit, since this was + * the decided 'standard' for this return value. + */ + *temperature = ((inb_p(pcipcwd_private.io_addr)) * 9 / 5) + 32; + + return 0; +} + +/* + * /dev/watchdog handling + */ + +static ssize_t pcipcwd_write(struct file *file, const char *data, + size_t len, loff_t *ppos) +{ + /* Can't seek (pwrite) on this device */ + if (ppos != &file->f_pos) + return -ESPIPE; + + /* See if we got the magic character 'V' and reload the timer */ + if (len) { + if (!nowayout) { + size_t i; + + /* note: just in case someone wrote the magic character + * five months ago... */ + expect_release = 0; + + /* scan to see whether or not we got the magic character */ + for (i = 0; i != len; i++) { + char c; + if(get_user(c, data+i)) + return -EFAULT; + if (c == 'V') + expect_release = 42; + } + } + + /* someone wrote to us, we should reload the timer */ + pcipcwd_keepalive(); + } + return len; +} + +static int pcipcwd_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + static struct watchdog_info ident = { + .options = WDIOF_OVERHEAT | + WDIOF_CARDRESET | + WDIOF_KEEPALIVEPING | + WDIOF_SETTIMEOUT | + WDIOF_MAGICCLOSE, + .firmware_version = 1, + .identity = WATCHDOG_DRIVER_NAME, + }; + + switch (cmd) { + case WDIOC_GETSUPPORT: + return copy_to_user((struct watchdog_info *) arg, &ident, + sizeof (ident)) ? -EFAULT : 0; + + case WDIOC_GETSTATUS: + { + int status; + + pcipcwd_get_status(&status); + + return put_user(status, (int *) arg); + } + + case WDIOC_GETBOOTSTATUS: + return put_user(pcipcwd_private.boot_status, (int *) arg); + + case WDIOC_GETTEMP: + { + int temperature; + + if (pcipcwd_get_temperature(&temperature)) + return -EFAULT; + + return put_user(temperature, (int *) arg); + } + + case WDIOC_KEEPALIVE: + pcipcwd_keepalive(); + return 0; + + case WDIOC_SETOPTIONS: + { + int new_options, retval = -EINVAL; + + if (get_user (new_options, (int *) arg)) + return -EFAULT; + + if (new_options & WDIOS_DISABLECARD) { + pcipcwd_stop(); + retval = 0; + } + + if (new_options & WDIOS_ENABLECARD) { + pcipcwd_start(); + retval = 0; + } + + if (new_options & WDIOS_TEMPPANIC) { + temp_panic = 1; + retval = 0; + } + + return retval; + } + + case WDIOC_SETTIMEOUT: + { + int new_heartbeat; + + if (get_user(new_heartbeat, (int *) arg)) + return -EFAULT; + + if (pcipcwd_set_heartbeat(new_heartbeat)) + return -EINVAL; + + pcipcwd_keepalive(); + /* Fall */ + } + + case WDIOC_GETTIMEOUT: + return put_user(heartbeat, (int *)arg); + + default: + return -ENOIOCTLCMD; + } +} + +static int pcipcwd_open(struct inode *inode, struct file *file) +{ + /* /dev/watchdog can only be opened once */ + if (test_and_set_bit(0, &is_active)) + return -EBUSY; + + /* Activate */ + pcipcwd_start(); + pcipcwd_keepalive(); + return 0; +} + +static int pcipcwd_release(struct inode *inode, struct file *file) +{ + /* + * Shut off the timer. + */ + if (expect_release == 42) { + pcipcwd_stop(); + } else { + printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + pcipcwd_keepalive(); + } + clear_bit(0, &is_active); + expect_release = 0; + return 0; +} + +/* + * /dev/temperature handling + */ + +static ssize_t pcipcwd_temp_read(struct file *file, char *data, + size_t len, loff_t *ppos) +{ + int temperature; + + /* Can't seek (pwrite) on this device */ + if (ppos != &file->f_pos) + return -ESPIPE; + + if (pcipcwd_get_temperature(&temperature)) + return -EFAULT; + + if (copy_to_user (data, &temperature, 1)) + return -EFAULT; + + return 1; +} + +static int pcipcwd_temp_open(struct inode *inode, struct file *file) +{ + if (!pcipcwd_private.supports_temp) + return -ENODEV; + + return 0; +} + +static int pcipcwd_temp_release(struct inode *inode, struct file *file) +{ + return 0; +} + +/* + * Notify system + */ + +static int pcipcwd_notify_sys(struct notifier_block *this, unsigned long code, void *unused) +{ + if (code==SYS_DOWN || code==SYS_HALT) { + /* Turn the WDT off */ + pcipcwd_stop(); + } + + return NOTIFY_DONE; +} + +/* + * Kernel Interfaces + */ + +static struct file_operations pcipcwd_fops = { + .owner = THIS_MODULE, + .llseek = no_llseek, + .write = pcipcwd_write, + .ioctl = pcipcwd_ioctl, + .open = pcipcwd_open, + .release = pcipcwd_release, +}; + +static struct miscdevice pcipcwd_miscdev = { + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &pcipcwd_fops, +}; + +static struct file_operations pcipcwd_temp_fops = { + .owner = THIS_MODULE, + .llseek = no_llseek, + .read = pcipcwd_temp_read, + .open = pcipcwd_temp_open, + .release = pcipcwd_temp_release, +}; + +static struct miscdevice pcipcwd_temp_miscdev = { + .minor = TEMP_MINOR, + .name = "temperature", + .fops = &pcipcwd_temp_fops, +}; + +static struct notifier_block pcipcwd_notifier = { + .notifier_call = pcipcwd_notify_sys, +}; + +/* + * Init & exit routines + */ + +static inline void check_temperature_support(void) +{ + if (inb_p(pcipcwd_private.io_addr) != 0xF0) + pcipcwd_private.supports_temp = 1; +} + +static int __devinit pcipcwd_card_init(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + static int cards_found; + int ret = -EIO; + int got_fw_rev, fw_rev_major, fw_rev_minor; + char fw_ver_str[20]; + char option_switches; + + cards_found++; + if (cards_found == 1) + printk(KERN_INFO PFX DRIVER_VERSION); + + if (cards_found > 1) { + printk(KERN_ERR PFX "This driver only supports 1 device\n"); + return -ENODEV; + } + + if (pci_enable_device(pdev)) { + printk(KERN_ERR PFX "Not possible to enable PCI Device\n"); + return -ENODEV; + } + + if (pci_resource_start(pdev, 0) == 0x0000) { + printk(KERN_ERR PFX "No I/O-Address for card detected\n"); + return -ENODEV; + } + + pcipcwd_private.pdev = pdev; + pcipcwd_private.io_addr = pci_resource_start(pdev, 0); + + if (pci_request_regions(pdev, WATCHDOG_NAME)) { + printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", + (int) pcipcwd_private.io_addr); + ret = -EIO; + goto err_out_disable_device; + } + + /* get the boot_status */ + pcipcwd_get_status(&pcipcwd_private.boot_status); + + /* clear the "card caused reboot" flag */ + pcipcwd_clear_status(); + + /* disable card */ + pcipcwd_stop(); + + /* Check whether or not the card supports the temperature device */ + check_temperature_support(); + + /* Get the Firmware Version */ + got_fw_rev = send_command(CMD_GET_FIRMWARE_VERSION, &fw_rev_major, &fw_rev_minor); + if (got_fw_rev) { + sprintf(fw_ver_str, "%u.%02u", fw_rev_major, fw_rev_minor); + } else { + sprintf(fw_ver_str, ""); + } + + /* Get switch settings */ + option_switches = inb_p(pcipcwd_private.io_addr + 3); + + printk(KERN_INFO PFX "Found card at port 0x%04x (Firmware: %s) %s temp option\n", + (int) pcipcwd_private.io_addr, fw_ver_str, + (pcipcwd_private.supports_temp ? "with" : "without")); + + printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n", + option_switches, + ((option_switches & 0x10) ? "ON" : "OFF"), + ((option_switches & 0x08) ? "ON" : "OFF")); + + if (pcipcwd_private.boot_status & WDIOF_CARDRESET) + printk(KERN_INFO PFX "Previous reset was caused by the Watchdog card\n"); + + if (pcipcwd_private.boot_status & WDIOF_OVERHEAT) + printk(KERN_INFO PFX "Card sensed a CPU Overheat\n"); + + if (pcipcwd_private.boot_status == 0) + printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n"); + + /* Check that the heartbeat value is within it's range ; if not reset to the default */ + if (heartbeat < 1 || heartbeat > 0xFFFF) { + heartbeat = WATCHDOG_HEARTBEAT; + printk(KERN_INFO PFX "heartbeat value must be 0"); +MODULE_DESCRIPTION("Berkshire PCI-PC Watchdog driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); +MODULE_ALIAS_MISCDEV(TEMP_MINOR); diff -Nru a/drivers/char/watchdog/sbc60xxwdt.c b/drivers/char/watchdog/sbc60xxwdt.c --- a/drivers/char/watchdog/sbc60xxwdt.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/sbc60xxwdt.c Tue Feb 17 20:00:07 2004 @@ -412,3 +412,4 @@ MODULE_AUTHOR("Jakob Oestergaard "); MODULE_DESCRIPTION("60xx Single Board Computer Watchdog Timer driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/sc520_wdt.c b/drivers/char/watchdog/sc520_wdt.c --- a/drivers/char/watchdog/sc520_wdt.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/sc520_wdt.c Tue Feb 17 20:00:06 2004 @@ -447,3 +447,4 @@ MODULE_AUTHOR("Scott and Bill Jennings"); MODULE_DESCRIPTION("Driver for watchdog timer in AMD \"Elan\" SC520 uProcessor"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/scx200_wdt.c b/drivers/char/watchdog/scx200_wdt.c --- a/drivers/char/watchdog/scx200_wdt.c Tue Feb 17 20:00:07 2004 +++ b/drivers/char/watchdog/scx200_wdt.c Tue Feb 17 20:00:07 2004 @@ -36,6 +36,7 @@ MODULE_AUTHOR("Christer Weinigel "); MODULE_DESCRIPTION("NatSemi SCx200 Watchdog Driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); #ifndef CONFIG_WATCHDOG_NOWAYOUT #define CONFIG_WATCHDOG_NOWAYOUT 0 diff -Nru a/drivers/char/watchdog/shwdt.c b/drivers/char/watchdog/shwdt.c --- a/drivers/char/watchdog/shwdt.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/shwdt.c Tue Feb 17 20:00:06 2004 @@ -33,6 +33,8 @@ #include #include +#define PFX "shwdt: " + /* * Default clock division ratio is 5.25 msecs. For an additional table of * values, consult the asm-sh/watchdog.h. Overload this at module load @@ -70,7 +72,9 @@ static char shwdt_expect_close; static struct timer_list timer; static unsigned long next_heartbeat; -static int heartbeat = 30; + +#define WATCHDOG_HEARTBEAT 30 /* 30 sec default heartbeat */ +static int heartbeat = WATCHDOG_HEARTBEAT; /* in seconds */ #ifdef CONFIG_WATCHDOG_NOWAYOUT static int nowayout = 1; @@ -87,8 +91,8 @@ { __u8 csr; - mod_timer(&timer, next_ping_period(clock_division_ratio)); next_heartbeat = jiffies + (heartbeat * HZ); + mod_timer(&timer, next_ping_period(clock_division_ratio)); csr = sh_wdt_read_csr(); csr |= WTCSR_WT | clock_division_ratio; @@ -142,6 +146,30 @@ } /** + * sh_wdt_keepalive - Keep the Userspace Watchdog Alive + * + * The Userspace watchdog got a KeepAlive: schedule the next heartbeat. + */ +static void sh_wdt_keepalive(void) +{ + next_heartbeat = jiffies + (heartbeat * HZ); +} + +/** + * sh_wdt_set_heartbeat - Set the Userspace Watchdog heartbeat + * + * Set the Userspace Watchdog heartbeat + */ +static int sh_wdt_set_heartbeat(int t) +{ + if ((t < 1) || (t > 3600)) /* arbitrary upper limit */ + return -EINVAL; + + heartbeat = t; + return 0; +} + +/** * sh_wdt_ping - Ping the Watchdog * * @data: Unused @@ -160,6 +188,8 @@ sh_wdt_write_cnt(0); mod_timer(&timer, next_ping_period(clock_division_ratio)); + } else { + printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } } @@ -193,11 +223,11 @@ */ static int sh_wdt_close(struct inode *inode, struct file *file) { - if (!nowayout && shwdt_expect_close == 42) { + if (shwdt_expect_close == 42) { sh_wdt_stop(); } else { - printk(KERN_CRIT "shwdt: Unexpected close, not stopping watchdog!\n"); - next_heartbeat = jiffies + (heartbeat * HZ); + printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + sh_wdt_keepalive(); } clear_bit(0, &shwdt_is_open); @@ -224,18 +254,20 @@ return -ESPIPE; if (count) { - size_t i; + if (!nowayout) { + size_t i; - shwdt_expect_close = 0; + shwdt_expect_close = 0; - for (i = 0; i != count; i++) { - char c; - if (get_user(c, buf + i)) - return -EFAULT; - if (c == 'V') - shwdt_expect_close = 42; + for (i = 0; i != count; i++) { + char c; + if (get_user(c, buf + i)) + return -EFAULT; + if (c == 'V') + shwdt_expect_close = 42; + } } - next_heartbeat = jiffies + (heartbeat * HZ); + sh_wdt_keepalive(); } return count; @@ -255,38 +287,32 @@ static int sh_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - int new_timeout; + int new_heartbeat; + int options, retval = -EINVAL; switch (cmd) { case WDIOC_GETSUPPORT: - if (copy_to_user((struct watchdog_info *)arg, + return copy_to_user((struct watchdog_info *)arg, &sh_wdt_info, - sizeof(sh_wdt_info))) { - return -EFAULT; - } - - break; + sizeof(sh_wdt_info)) ? -EFAULT : 0; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, (int *)arg); case WDIOC_KEEPALIVE: - next_heartbeat = jiffies + (heartbeat * HZ); - - break; + sh_wdt_keepalive(); + return 0; case WDIOC_SETTIMEOUT: - if (get_user(new_timeout, (int *)arg)) + if (get_user(new_heartbeat, (int *)arg)) return -EFAULT; - if (new_timeout < 1 || new_timeout > 3600) /* arbitrary upper limit */ + + if (sh_wdt_set_heartbeat(new_heartbeat)) return -EINVAL; - heartbeat = new_timeout; - next_heartbeat = jiffies + (heartbeat * HZ); + + sh_wdt_keepalive(); /* Fall */ case WDIOC_GETTIMEOUT: return put_user(heartbeat, (int *)arg); case WDIOC_SETOPTIONS: - { - int options, retval = -EINVAL; - if (get_user(options, (int *)arg)) return -EFAULT; @@ -301,7 +327,6 @@ } return retval; - } default: return -ENOIOCTLCMD; } @@ -346,7 +371,6 @@ static struct notifier_block sh_wdt_notifier = { .notifier_call = sh_wdt_notify_sys, - .priority = 0, }; static struct miscdevice sh_wdt_miscdev = { @@ -363,21 +387,42 @@ */ static int __init sh_wdt_init(void) { - if (misc_register(&sh_wdt_miscdev)) { - printk(KERN_ERR "shwdt: Can't register misc device\n"); - return -EINVAL; + int rc; + + if ((clock_division_ratio < 0x5) || (clock_division_ratio > 0x7)) { + clock_division_ratio = WTCSR_CKS_4096; + printk(KERN_INFO PFX "clock_division_ratio value must be 0x5<=x<=0x7, using %d\n", + clock_division_ratio); } - if (register_reboot_notifier(&sh_wdt_notifier)) { - printk(KERN_ERR "shwdt: Can't register reboot notifier\n"); - misc_deregister(&sh_wdt_miscdev); - return -EINVAL; + if (sh_wdt_set_heartbeat(heartbeat)) + { + heartbeat = WATCHDOG_HEARTBEAT; + printk(KERN_INFO PFX "heartbeat value must be 1<=x<=3600, using %d\n", + heartbeat); } init_timer(&timer); timer.function = sh_wdt_ping; timer.data = 0; + rc = register_reboot_notifier(&sh_wdt_notifier); + if (rc) { + printk(KERN_ERR PFX "Can't register reboot notifier (err=%d)\n", rc); + return rc; + } + + rc = misc_register(&sh_wdt_miscdev) + if (rc) { + printk(KERN_ERR PFX "Can't register miscdev on minor=%d (err=%d)\n", + sh_wdt_miscdev.minor, rc); + unregister_reboot_notifier(&sh_wdt_notifier); + return rc; + } + + printk(KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n", + heartbeat, nowayout); + return 0; } @@ -389,16 +434,20 @@ */ static void __exit sh_wdt_exit(void) { - unregister_reboot_notifier(&sh_wdt_notifier); misc_deregister(&sh_wdt_miscdev); + unregister_reboot_notifier(&sh_wdt_notifier); } MODULE_AUTHOR("Paul Mundt "); MODULE_DESCRIPTION("SuperH watchdog driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); module_param(clock_division_ratio, int, 0); MODULE_PARM_DESC(clock_division_ratio, "Clock division ratio. Valid ranges are from 0x5 (1.31ms) to 0x7 (5.25ms). Defaults to 0x7."); + +module_param(heartbeat, int, 0); +MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1<=heartbeat<=3600, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); diff -Nru a/drivers/char/watchdog/softdog.c b/drivers/char/watchdog/softdog.c --- a/drivers/char/watchdog/softdog.c Tue Feb 17 20:00:06 2004 +++ b/drivers/char/watchdog/softdog.c Tue Feb 17 20:00:06 2004 @@ -231,3 +231,8 @@ module_init(watchdog_init); module_exit(watchdog_exit); + +MODULE_AUTHOR("Alan Cox"); +MODULE_DESCRIPTION("Software Watchdog Device Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); diff -Nru a/drivers/char/watchdog/wafer5823wdt.c b/drivers/char/watchdog/wafer5823wdt.c --- a/drivers/char/watchdog/wafer5823wdt.c Tue Feb 17 20:00:08 2004 +++ b/drivers/char/watchdog/wafer5823wdt.c Tue Feb 17 20:00:08 2004 @@ -330,5 +330,6 @@ MODULE_AUTHOR("Justin Cormack"); MODULE_DESCRIPTION("ICP Wafer 5823 Single Board Computer WDT driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); /* end of wafer5823wdt.c */ diff -Nru a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c --- a/drivers/cpufreq/cpufreq_userspace.c Tue Feb 17 20:00:06 2004 +++ b/drivers/cpufreq/cpufreq_userspace.c Tue Feb 17 20:00:06 2004 @@ -2,7 +2,7 @@ * linux/drivers/cpufreq/cpufreq_userspace.c * * Copyright (C) 2001 Russell King - * (C) 2002 - 2003 Dominik Brodowski + * (C) 2002 - 2004 Dominik Brodowski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -112,7 +112,14 @@ if (freq > cpu_max_freq[cpu]) freq = cpu_max_freq[cpu]; - ret = cpufreq_driver_target(¤t_policy[cpu], freq, + /* + * We're safe from concurrent calls to ->target() here + * as we hold the userspace_sem lock. If we were calling + * cpufreq_driver_target, a deadlock situation might occur: + * A: cpufreq_set (lock userspace_sem) -> cpufreq_driver_target(lock policy->lock) + * B: cpufreq_set_policy(lock policy->lock) -> __cpufreq_governor -> cpufreq_governor_userspace (lock userspace_sem) + */ + ret = __cpufreq_driver_target(¤t_policy[cpu], freq, CPUFREQ_RELATION_L); err: diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig --- a/drivers/i2c/busses/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/i2c/busses/Kconfig Tue Feb 17 20:00:08 2004 @@ -69,6 +69,18 @@ This support is also available as a module. If so, the module will be called i2c-elv. +config I2C_HYDRA + tristate "CHRP Apple Hydra Mac I/O I2C interface" + depends on I2C && PCI && PPC_CHRP && EXPERIMENTAL + select I2C_ALGOBIT + help + This supports the use of the I2C interface in the Apple Hydra Mac + I/O chip on some CHRP machines (e.g. the LongTrail). Say Y if you + have such a machine. + + This support is also available as a module. If so, the module + will be called i2c-hydra. + config I2C_I801 tristate "Intel 801" depends on I2C && PCI && EXPERIMENTAL diff -Nru a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile --- a/drivers/i2c/busses/Makefile Tue Feb 17 20:00:05 2004 +++ b/drivers/i2c/busses/Makefile Tue Feb 17 20:00:05 2004 @@ -8,6 +8,7 @@ obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o obj-$(CONFIG_I2C_ELV) += i2c-elv.o +obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o obj-$(CONFIG_I2C_I801) += i2c-i801.o obj-$(CONFIG_I2C_I810) += i2c-i810.o obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o diff -Nru a/drivers/i2c/busses/i2c-hydra.c b/drivers/i2c/busses/i2c-hydra.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/busses/i2c-hydra.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,186 @@ +/* + i2c-hydra.c - Part of lm_sensors, Linux kernel modules + for hardware monitoring + + i2c Support for the Apple `Hydra' Mac I/O + + Copyright (c) 1999-2004 Geert Uytterhoeven + + Based on i2c Support for Via Technologies 82C586B South Bridge + Copyright (c) 1998, 1999 Kyösti Mälkki + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define HYDRA_CPD_PD0 0x00000001 /* CachePD lines */ +#define HYDRA_CPD_PD1 0x00000002 +#define HYDRA_CPD_PD2 0x00000004 +#define HYDRA_CPD_PD3 0x00000008 + +#define HYDRA_SCLK HYDRA_CPD_PD0 +#define HYDRA_SDAT HYDRA_CPD_PD1 +#define HYDRA_SCLK_OE 0x00000010 +#define HYDRA_SDAT_OE 0x00000020 + +static inline void pdregw(void *data, u32 val) +{ + struct Hydra *hydra = (struct Hydra *)data; + writel(val, &hydra->CachePD); +} + +static inline u32 pdregr(void *data) +{ + struct Hydra *hydra = (struct Hydra *)data; + return readl(&hydra->CachePD); +} + +static void hydra_bit_setscl(void *data, int state) +{ + u32 val = pdregr(data); + if (state) + val &= ~HYDRA_SCLK_OE; + else { + val &= ~HYDRA_SCLK; + val |= HYDRA_SCLK_OE; + } + pdregw(data, val); +} + +static void hydra_bit_setsda(void *data, int state) +{ + u32 val = pdregr(data); + if (state) + val &= ~HYDRA_SDAT_OE; + else { + val &= ~HYDRA_SDAT; + val |= HYDRA_SDAT_OE; + } + pdregw(data, val); +} + +static int hydra_bit_getscl(void *data) +{ + return (pdregr(data) & HYDRA_SCLK) != 0; +} + +static int hydra_bit_getsda(void *data) +{ + return (pdregr(data) & HYDRA_SDAT) != 0; +} + +/* ------------------------------------------------------------------------ */ + +static struct i2c_algo_bit_data hydra_bit_data = { + .setsda = hydra_bit_setsda, + .setscl = hydra_bit_setscl, + .getsda = hydra_bit_getsda, + .getscl = hydra_bit_getscl, + .udelay = 5, + .mdelay = 5, + .timeout = HZ +}; + +static struct i2c_adapter hydra_adap = { + .owner = THIS_MODULE, + .name = "Hydra i2c", + .id = I2C_HW_B_HYDRA, + .algo_data = &hydra_bit_data, +}; + +static struct pci_device_id hydra_ids[] = { + { + .vendor = PCI_VENDOR_ID_APPLE, + .device = PCI_DEVICE_ID_APPLE_HYDRA, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + }, + { 0, } +}; + +static int __devinit hydra_probe(struct pci_dev *dev, + const struct pci_device_id *id) +{ + unsigned long base = pci_resource_start(dev, 0); + int res; + + if (!request_mem_region(base+offsetof(struct Hydra, CachePD), 4, + hydra_adap.name)) + return -EBUSY; + + hydra_bit_data.data = ioremap(base, pci_resource_len(dev, 0)); + if (hydra_bit_data.data == NULL) { + release_mem_region(base+offsetof(struct Hydra, CachePD), 4); + return -ENODEV; + } + + pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */ + hydra_adap.dev.parent = &dev->dev; + res = i2c_bit_add_bus(&hydra_adap); + if (res < 0) { + iounmap(hydra_bit_data.data); + release_mem_region(base+offsetof(struct Hydra, CachePD), 4); + return res; + } + return 0; +} + +static void __devexit hydra_remove(struct pci_dev *dev) +{ + pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */ + i2c_bit_del_bus(&hydra_adap); + iounmap(hydra_bit_data.data); + release_mem_region(pci_resource_start(dev, 0)+ + offsetof(struct Hydra, CachePD), 4); +} + + +static struct pci_driver hydra_driver = { + .name = "hydra smbus", + .id_table = hydra_ids, + .probe = hydra_probe, + .remove = __devexit_p(hydra_remove), +}; + +static int __init i2c_hydra_init(void) +{ + return pci_module_init(&hydra_driver); +} + + +static void __exit i2c_hydra_exit(void) +{ + pci_unregister_driver(&hydra_driver); +} + + + +MODULE_AUTHOR("Geert Uytterhoeven "); +MODULE_DESCRIPTION("i2c for Apple Hydra Mac I/O"); +MODULE_LICENSE("GPL"); + +module_init(i2c_hydra_init); +module_exit(i2c_hydra_exit); + diff -Nru a/drivers/i2c/busses/i2c-keywest.c b/drivers/i2c/busses/i2c-keywest.c --- a/drivers/i2c/busses/i2c-keywest.c Tue Feb 17 20:00:07 2004 +++ b/drivers/i2c/busses/i2c-keywest.c Tue Feb 17 20:00:07 2004 @@ -26,6 +26,9 @@ 2001/12/13 BenH New implementation 2001/12/15 BenH Add support for "byte" and "quick" transfers. Add i2c_xfer routine. + 2003/09/21 BenH Rework state machine with Paulus help + 2004/01/21 BenH Merge in Greg KH changes, polled mode is back + 2004/02/05 BenH Merge 64 bits fixes from the g5 ppc64 tree My understanding of the various modes supported by keywest are: @@ -67,9 +70,28 @@ #include #include #include +#include #include "i2c-keywest.h" +#undef POLLED_MODE + +/* Some debug macros */ +#define WRONG_STATE(name) do {\ + pr_debug("KW: wrong state. Got %s, state: %s (isr: %02x)\n", \ + name, __kw_state_names[iface->state], isr); \ + } while(0) + +#ifdef DEBUG +static const char *__kw_state_names[] = { + "state_idle", + "state_addr", + "state_read", + "state_write", + "state_stop", + "state_dead" +}; +#endif /* DEBUG */ MODULE_AUTHOR("Benjamin Herrenschmidt "); MODULE_DESCRIPTION("I2C driver for Apple's Keywest"); @@ -78,121 +100,154 @@ static int probe = 0; +#ifdef POLLED_MODE +/* Don't schedule, the g5 fan controller is too + * timing sensitive + */ +static u8 +wait_interrupt(struct keywest_iface* iface) +{ + int i; + u8 isr; + + for (i = 0; i < 200000; i++) { + isr = read_reg(reg_isr) & KW_I2C_IRQ_MASK; + if (isr != 0) + return isr; + udelay(10); + } + return isr; +} +#endif /* POLLED_MODE */ + static void do_stop(struct keywest_iface* iface, int result) { - write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_STOP); + write_reg(reg_control, KW_I2C_CTL_STOP); iface->state = state_stop; iface->result = result; } /* Main state machine for standard & standard sub mode */ -static int +static void handle_interrupt(struct keywest_iface *iface, u8 isr) { int ack; - int rearm_timer = 1; - pr_debug("handle_interrupt(), got: %x, status: %x, state: %d\n", - isr, read_reg(reg_status), iface->state); - if (isr == 0 && iface->state != state_stop) { - do_stop(iface, -1); - return rearm_timer; - } - if (isr & KW_I2C_IRQ_STOP && iface->state != state_stop) { - iface->result = -1; - iface->state = state_stop; - } - switch(iface->state) { - case state_addr: - if (!(isr & KW_I2C_IRQ_ADDR)) { - do_stop(iface, -1); - break; - } - ack = read_reg(reg_status); - pr_debug("ack on set address: %x\n", ack); - if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { - do_stop(iface, -1); - break; - } - /* Handle rw "quick" mode */ - if (iface->datalen == 0) - do_stop(iface, 0); - else if (iface->read_write == I2C_SMBUS_READ) { - iface->state = state_read; - if (iface->datalen > 1) - write_reg(reg_control, read_reg(reg_control) - | KW_I2C_CTL_AAK); - } else { - iface->state = state_write; - pr_debug("write byte: %x\n", *(iface->data)); - write_reg(reg_data, *(iface->data++)); - iface->datalen--; - } - - break; - case state_read: - if (!(isr & KW_I2C_IRQ_DATA)) { - do_stop(iface, -1); - break; + if (isr == 0) { + if (iface->state != state_stop) { + pr_debug("KW: Timeout !\n"); + do_stop(iface, -EIO); } - *(iface->data++) = read_reg(reg_data); - pr_debug("read byte: %x\n", *(iface->data-1)); - iface->datalen--; - if (iface->datalen == 0) - iface->state = state_stop; - else - write_reg(reg_control, 0); - break; - case state_write: - if (!(isr & KW_I2C_IRQ_DATA)) { - do_stop(iface, -1); - break; + if (iface->state == state_stop) { + ack = read_reg(reg_status); + if (!(ack & KW_I2C_STAT_BUSY)) { + iface->state = state_idle; + write_reg(reg_ier, 0x00); +#ifndef POLLED_MODE + complete(&iface->complete); +#endif /* POLLED_MODE */ + } } - /* Check ack status */ + return; + } + + if (isr & KW_I2C_IRQ_ADDR) { ack = read_reg(reg_status); - pr_debug("ack on data write: %x\n", ack); + if (iface->state != state_addr) { + write_reg(reg_isr, KW_I2C_IRQ_ADDR); + WRONG_STATE("KW_I2C_IRQ_ADDR"); + do_stop(iface, -EIO); + return; + } if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { - do_stop(iface, -1); - break; + iface->state = state_stop; + iface->result = -ENODEV; + pr_debug("KW: NAK on address\n"); + } else { + /* Handle rw "quick" mode */ + if (iface->datalen == 0) { + do_stop(iface, 0); + } else if (iface->read_write == I2C_SMBUS_READ) { + iface->state = state_read; + if (iface->datalen > 1) + write_reg(reg_control, KW_I2C_CTL_AAK); + } else { + iface->state = state_write; + write_reg(reg_data, *(iface->data++)); + iface->datalen--; + } } - if (iface->datalen) { - pr_debug("write byte: %x\n", *(iface->data)); - write_reg(reg_data, *(iface->data++)); + write_reg(reg_isr, KW_I2C_IRQ_ADDR); + } + + if (isr & KW_I2C_IRQ_DATA) { + if (iface->state == state_read) { + *(iface->data++) = read_reg(reg_data); + write_reg(reg_isr, KW_I2C_IRQ_DATA); iface->datalen--; - } else - do_stop(iface, 0); - break; - - case state_stop: - if (!(isr & KW_I2C_IRQ_STOP) && (++iface->stopretry) < 10) - do_stop(iface, -1); - else { - rearm_timer = 0; - iface->state = state_idle; - write_reg(reg_control, 0x00); - write_reg(reg_ier, 0x00); - complete(&iface->complete); + if (iface->datalen == 0) + iface->state = state_stop; + else if (iface->datalen == 1) + write_reg(reg_control, 0); + } else if (iface->state == state_write) { + /* Check ack status */ + ack = read_reg(reg_status); + if ((ack & KW_I2C_STAT_LAST_AAK) == 0) { + pr_debug("KW: nack on data write (%x): %x\n", + iface->data[-1], ack); + do_stop(iface, -EIO); + } else if (iface->datalen) { + write_reg(reg_data, *(iface->data++)); + iface->datalen--; + } else { + write_reg(reg_control, KW_I2C_CTL_STOP); + iface->state = state_stop; + iface->result = 0; + } + write_reg(reg_isr, KW_I2C_IRQ_DATA); + } else { + write_reg(reg_isr, KW_I2C_IRQ_DATA); + WRONG_STATE("KW_I2C_IRQ_DATA"); + if (iface->state != state_stop) + do_stop(iface, -EIO); } - break; } - - write_reg(reg_isr, isr); - return rearm_timer; + if (isr & KW_I2C_IRQ_STOP) { + write_reg(reg_isr, KW_I2C_IRQ_STOP); + if (iface->state != state_stop) { + WRONG_STATE("KW_I2C_IRQ_STOP"); + iface->result = -EIO; + } + iface->state = state_idle; + write_reg(reg_ier, 0x00); +#ifndef POLLED_MODE + complete(&iface->complete); +#endif /* POLLED_MODE */ + } + + if (isr & KW_I2C_IRQ_START) + write_reg(reg_isr, KW_I2C_IRQ_START); } +#ifndef POLLED_MODE + /* Interrupt handler */ static irqreturn_t keywest_irq(int irq, void *dev_id, struct pt_regs *regs) { struct keywest_iface *iface = (struct keywest_iface *)dev_id; + unsigned long flags; - spin_lock(&iface->lock); + spin_lock_irqsave(&iface->lock, flags); del_timer(&iface->timeout_timer); - if (handle_interrupt(iface, read_reg(reg_isr))) - mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT); - spin_unlock(&iface->lock); + handle_interrupt(iface, read_reg(reg_isr)); + if (iface->state != state_idle) { + iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; + add_timer(&iface->timeout_timer); + } + spin_unlock_irqrestore(&iface->lock, flags); return IRQ_HANDLED; } @@ -200,14 +255,20 @@ keywest_timeout(unsigned long data) { struct keywest_iface *iface = (struct keywest_iface *)data; + unsigned long flags; pr_debug("timeout !\n"); - spin_lock_irq(&iface->lock); - if (handle_interrupt(iface, read_reg(reg_isr))) - mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT); - spin_unlock(&iface->lock); + spin_lock_irqsave(&iface->lock, flags); + handle_interrupt(iface, read_reg(reg_isr)); + if (iface->state != state_idle) { + iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; + add_timer(&iface->timeout_timer); + } + spin_unlock_irqrestore(&iface->lock, flags); } +#endif /* POLLED_MODE */ + /* * SMBUS-type transfer entrypoint */ @@ -228,46 +289,54 @@ int rc = 0; if (iface->state == state_dead) - return -1; + return -ENXIO; /* Prepare datas & select mode */ iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK; switch (size) { - case I2C_SMBUS_QUICK: + case I2C_SMBUS_QUICK: len = 0; buffer = NULL; iface->cur_mode |= KW_I2C_MODE_STANDARD; break; - case I2C_SMBUS_BYTE: + case I2C_SMBUS_BYTE: len = 1; buffer = &data->byte; iface->cur_mode |= KW_I2C_MODE_STANDARD; break; - case I2C_SMBUS_BYTE_DATA: + case I2C_SMBUS_BYTE_DATA: len = 1; buffer = &data->byte; iface->cur_mode |= KW_I2C_MODE_STANDARDSUB; break; - case I2C_SMBUS_WORD_DATA: + case I2C_SMBUS_WORD_DATA: len = 2; cur_word = cpu_to_le16(data->word); buffer = (u8 *)&cur_word; iface->cur_mode |= KW_I2C_MODE_STANDARDSUB; break; - case I2C_SMBUS_BLOCK_DATA: + case I2C_SMBUS_BLOCK_DATA: len = data->block[0]; buffer = &data->block[1]; iface->cur_mode |= KW_I2C_MODE_STANDARDSUB; break; - default: + default: return -1; } + /* Turn a standardsub read into a combined mode access */ + if (read_write == I2C_SMBUS_READ + && (iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_STANDARDSUB) { + iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK; + iface->cur_mode |= KW_I2C_MODE_COMBINED; + } + /* Original driver had this limitation */ if (len > 32) len = 32; - down(&iface->sem); + if (pmac_low_i2c_lock(iface->node)) + return -ENXIO; pr_debug("chan: %d, addr: 0x%x, transfer len: %d, read: %d\n", chan->chan_no, addr, len, read_write == I2C_SMBUS_READ); @@ -276,12 +345,11 @@ iface->datalen = len; iface->state = state_addr; iface->result = 0; - iface->stopretry = 0; iface->read_write = read_write; /* Setup channel & clear pending irqs */ - write_reg(reg_mode, iface->cur_mode | (chan->chan_no << 4)); write_reg(reg_isr, read_reg(reg_isr)); + write_reg(reg_mode, iface->cur_mode | (chan->chan_no << 4)); write_reg(reg_status, 0); /* Set up address and r/w bit */ @@ -293,15 +361,31 @@ || (iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_COMBINED) write_reg(reg_subaddr, command); +#ifndef POLLED_MODE /* Arm timeout */ - mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT); + iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; + add_timer(&iface->timeout_timer); +#endif /* Start sending address & enable interrupt*/ - write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR); + write_reg(reg_control, KW_I2C_CTL_XADDR); write_reg(reg_ier, KW_I2C_IRQ_MASK); - /* Wait interrupt operations completion */ +#ifdef POLLED_MODE + pr_debug("using polled mode...\n"); + /* State machine, to turn into an interrupt handler */ + while(iface->state != state_idle) { + unsigned long flags; + + u8 isr = wait_interrupt(iface); + spin_lock_irqsave(&iface->lock, flags); + handle_interrupt(iface, isr); + spin_unlock_irqrestore(&iface->lock, flags); + } +#else /* POLLED_MODE */ + pr_debug("using interrupt mode...\n"); wait_for_completion(&iface->complete); +#endif /* POLLED_MODE */ rc = iface->result; pr_debug("transfer done, result: %d\n", rc); @@ -310,7 +394,7 @@ data->word = le16_to_cpu(cur_word); /* Release sem */ - up(&iface->sem); + pmac_low_i2c_unlock(iface->node); return rc; } @@ -329,7 +413,11 @@ int i, completed; int rc = 0; - down(&iface->sem); + if (iface->state == state_dead) + return -ENXIO; + + if (pmac_low_i2c_lock(iface->node)) + return -ENXIO; /* Set adapter to standard mode */ iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK; @@ -360,7 +448,6 @@ iface->datalen = pmsg->len; iface->state = state_addr; iface->result = 0; - iface->stopretry = 0; if (pmsg->flags & I2C_M_RD) iface->read_write = I2C_SMBUS_READ; else @@ -373,15 +460,27 @@ (addr << 1) | ((iface->read_write == I2C_SMBUS_READ) ? 0x01 : 0x00)); +#ifndef POLLED_MODE /* Arm timeout */ - mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT); + iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; + add_timer(&iface->timeout_timer); +#endif /* Start sending address & enable interrupt*/ - write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR); write_reg(reg_ier, KW_I2C_IRQ_MASK); + write_reg(reg_control, KW_I2C_CTL_XADDR); - /* Wait interrupt operations completion */ +#ifdef POLLED_MODE + pr_debug("using polled mode...\n"); + /* State machine, to turn into an interrupt handler */ + while(iface->state != state_idle) { + u8 isr = wait_interrupt(iface); + handle_interrupt(iface, isr); + } +#else /* POLLED_MODE */ + pr_debug("using interrupt mode...\n"); wait_for_completion(&iface->complete); +#endif /* POLLED_MODE */ rc = iface->result; if (rc == 0) @@ -390,7 +489,7 @@ } /* Release sem */ - up(&iface->sem); + pmac_low_i2c_unlock(iface->node); return completed; } @@ -416,19 +515,23 @@ static int create_iface(struct device_node *np, struct device *dev) { - unsigned long steps, *psteps, *prate; + unsigned long steps; unsigned bsteps, tsize, i, nchan, addroffset; struct keywest_iface* iface; + u32 *psteps, *prate; int rc; - psteps = (unsigned long *)get_property(np, "AAPL,address-step", NULL); + if (pmac_low_i2c_lock(np)) + return -ENODEV; + + psteps = (u32 *)get_property(np, "AAPL,address-step", NULL); steps = psteps ? (*psteps) : 0x10; /* Hrm... maybe we can be smarter here */ for (bsteps = 0; (steps & 0x01) == 0; bsteps++) steps >>= 1; - if (!strcmp(np->parent->name, "uni-n")) { + if (np->parent->name[0] == 'u') { nchan = 2; addroffset = 3; } else { @@ -441,12 +544,13 @@ iface = (struct keywest_iface *) kmalloc(tsize, GFP_KERNEL); if (iface == NULL) { printk(KERN_ERR "i2c-keywest: can't allocate inteface !\n"); + pmac_low_i2c_unlock(np); return -ENOMEM; } memset(iface, 0, tsize); - init_MUTEX(&iface->sem); spin_lock_init(&iface->lock); init_completion(&iface->complete); + iface->node = of_node_get(np); iface->bsteps = bsteps; iface->chan_count = nchan; iface->state = state_idle; @@ -458,16 +562,19 @@ if (iface->base == 0) { printk(KERN_ERR "i2c-keywest: can't map inteface !\n"); kfree(iface); + pmac_low_i2c_unlock(np); return -ENOMEM; } +#ifndef POLLED_MODE init_timer(&iface->timeout_timer); iface->timeout_timer.function = keywest_timeout; iface->timeout_timer.data = (unsigned long)iface; +#endif /* Select interface rate */ iface->cur_mode = KW_I2C_MODE_100KHZ; - prate = (unsigned long *)get_property(np, "AAPL,i2c-rate", NULL); + prate = (u32 *)get_property(np, "AAPL,i2c-rate", NULL); if (prate) switch(*prate) { case 100: iface->cur_mode = KW_I2C_MODE_100KHZ; @@ -480,11 +587,11 @@ break; default: printk(KERN_WARNING "i2c-keywest: unknown rate %ldKhz, using 100KHz\n", - *prate); + (long)*prate); } - /* Select standard sub mode */ - iface->cur_mode |= KW_I2C_MODE_STANDARDSUB; + /* Select standard mode by default */ + iface->cur_mode |= KW_I2C_MODE_STANDARD; /* Write mode */ write_reg(reg_mode, iface->cur_mode); @@ -493,14 +600,17 @@ write_reg(reg_ier, 0x00); write_reg(reg_isr, KW_I2C_IRQ_MASK); +#ifndef POLLED_MODE /* Request chip interrupt */ - rc = request_irq(iface->irq, keywest_irq, 0, "keywest i2c", iface); + rc = request_irq(iface->irq, keywest_irq, SA_INTERRUPT, "keywest i2c", iface); if (rc) { printk(KERN_ERR "i2c-keywest: can't get IRQ %d !\n", iface->irq); iounmap((void *)iface->base); kfree(iface); + pmac_low_i2c_unlock(np); return -ENODEV; } +#endif /* POLLED_MODE */ dev_set_drvdata(dev, iface); @@ -539,6 +649,7 @@ printk(KERN_INFO "Found KeyWest i2c on \"%s\", %d channel%s, stepping: %d bits\n", np->parent->name, nchan, nchan > 1 ? "s" : "", bsteps); + pmac_low_i2c_unlock(np); return 0; } @@ -549,8 +660,10 @@ int i, rc; /* Make sure we stop all activity */ - down(&iface->sem); + if (pmac_low_i2c_lock(iface->node)) + return -ENODEV; +#ifndef POLLED_MODE spin_lock_irq(&iface->lock); while (iface->state != state_idle) { spin_unlock_irq(&iface->lock); @@ -558,10 +671,14 @@ schedule_timeout(HZ/10); spin_lock_irq(&iface->lock); } +#endif /* POLLED_MODE */ iface->state = state_dead; +#ifndef POLLED_MODE spin_unlock_irq(&iface->lock); free_irq(iface->irq, iface); - up(&iface->sem); +#endif /* POLLED_MODE */ + + pmac_low_i2c_unlock(iface->node); /* Release all channels */ for (i=0; ichan_count; i++) { @@ -576,6 +693,7 @@ } iounmap((void *)iface->base); dev_set_drvdata(dev, NULL); + of_node_put(iface->node); kfree(iface); return 0; @@ -634,8 +752,8 @@ static int __init i2c_keywest_init(void) { - macio_register_driver(&i2c_keywest_macio_driver); of_register_driver(&i2c_keywest_of_platform_driver); + macio_register_driver(&i2c_keywest_macio_driver); return 0; } @@ -643,8 +761,8 @@ static void __exit i2c_keywest_cleanup(void) { - macio_unregister_driver(&i2c_keywest_macio_driver); of_unregister_driver(&i2c_keywest_of_platform_driver); + macio_unregister_driver(&i2c_keywest_macio_driver); } module_init(i2c_keywest_init); diff -Nru a/drivers/i2c/busses/i2c-keywest.h b/drivers/i2c/busses/i2c-keywest.h --- a/drivers/i2c/busses/i2c-keywest.h Tue Feb 17 20:00:08 2004 +++ b/drivers/i2c/busses/i2c-keywest.h Tue Feb 17 20:00:08 2004 @@ -51,20 +51,19 @@ /* Physical interface */ struct keywest_iface { + struct device_node *node; unsigned long base; unsigned bsteps; int irq; - struct semaphore sem; spinlock_t lock; - struct keywest_chan* channels; + struct keywest_chan *channels; unsigned chan_count; u8 cur_mode; char read_write; - u8* data; + u8 *data; unsigned datalen; int state; int result; - int stopretry; struct timer_list timeout_timer; struct completion complete; }; @@ -98,8 +97,7 @@ { out_8(((volatile u8 *)iface->base) + (((unsigned)reg) << iface->bsteps), val); - (void)__read_reg(iface, reg); - udelay(10); + (void)__read_reg(iface, reg_subaddr); } #define write_reg(reg, val) __write_reg(iface, reg, val) diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig --- a/drivers/i2c/chips/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/i2c/chips/Kconfig Tue Feb 17 20:00:07 2004 @@ -45,6 +45,28 @@ This driver can also be built as a module. If so, the module will be called eeprom. +config SENSORS_FSCHER + tristate "FSC Hermes" + depends on I2C && EXPERIMENTAL + select I2C_SENSOR + help + If you say yes here you get support for Fujitsu Siemens + Computers Hermes sensor chips. + + This driver can also be built as a module. If so, the module + will be called fscher. + +config SENSORS_GL518SM + tristate "Genesys Logic GL518SM" + depends on I2C && EXPERIMENTAL + select I2C_SENSOR + help + If you say yes here you get support for Genesys Logic GL518SM + sensor chips. + + This driver can also be built as a module. If so, the module + will be called gl518sm. + config SENSORS_IT87 tristate "ITE IT87xx and compatibles" depends on I2C && EXPERIMENTAL diff -Nru a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile --- a/drivers/i2c/chips/Makefile Tue Feb 17 20:00:14 2004 +++ b/drivers/i2c/chips/Makefile Tue Feb 17 20:00:14 2004 @@ -8,6 +8,8 @@ obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o +obj-$(CONFIG_SENSORS_FSCHER) += fscher.o +obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o obj-$(CONFIG_SENSORS_IT87) += it87.o obj-$(CONFIG_SENSORS_LM75) += lm75.o obj-$(CONFIG_SENSORS_LM78) += lm78.o diff -Nru a/drivers/i2c/chips/fscher.c b/drivers/i2c/chips/fscher.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/chips/fscher.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,681 @@ +/* + * fscher.c - Part of lm_sensors, Linux kernel modules for hardware + * monitoring + * Copyright (C) 2003, 2004 Reinhard Nissl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * fujitsu siemens hermes chip, + * module based on fscpos.c + * Copyright (C) 2000 Hermann Jung + * Copyright (C) 1998, 1999 Frodo Looijaard + * and Philip Edelbrock + */ + +#include +#include +#include +#include +#include + +/* + * Addresses to scan + */ + +static unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END }; +static unsigned short normal_i2c_range[] = { I2C_CLIENT_END }; +static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; +static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END }; + +/* + * Insmod parameters + */ + +SENSORS_INSMOD_1(fscher); + +/* + * The FSCHER registers + */ + +/* chip identification */ +#define FSCHER_REG_IDENT_0 0x00 +#define FSCHER_REG_IDENT_1 0x01 +#define FSCHER_REG_IDENT_2 0x02 +#define FSCHER_REG_REVISION 0x03 + +/* global control and status */ +#define FSCHER_REG_EVENT_STATE 0x04 +#define FSCHER_REG_CONTROL 0x05 + +/* watchdog */ +#define FSCHER_REG_WDOG_PRESET 0x28 +#define FSCHER_REG_WDOG_STATE 0x23 +#define FSCHER_REG_WDOG_CONTROL 0x21 + +/* fan 0 */ +#define FSCHER_REG_FAN0_MIN 0x55 +#define FSCHER_REG_FAN0_ACT 0x0e +#define FSCHER_REG_FAN0_STATE 0x0d +#define FSCHER_REG_FAN0_RIPPLE 0x0f + +/* fan 1 */ +#define FSCHER_REG_FAN1_MIN 0x65 +#define FSCHER_REG_FAN1_ACT 0x6b +#define FSCHER_REG_FAN1_STATE 0x62 +#define FSCHER_REG_FAN1_RIPPLE 0x6f + +/* fan 2 */ +#define FSCHER_REG_FAN2_MIN 0xb5 +#define FSCHER_REG_FAN2_ACT 0xbb +#define FSCHER_REG_FAN2_STATE 0xb2 +#define FSCHER_REG_FAN2_RIPPLE 0xbf + +/* voltage supervision */ +#define FSCHER_REG_VOLT_12 0x45 +#define FSCHER_REG_VOLT_5 0x42 +#define FSCHER_REG_VOLT_BATT 0x48 + +/* temperature 0 */ +#define FSCHER_REG_TEMP0_ACT 0x64 +#define FSCHER_REG_TEMP0_STATE 0x71 + +/* temperature 1 */ +#define FSCHER_REG_TEMP1_ACT 0x32 +#define FSCHER_REG_TEMP1_STATE 0x81 + +/* temperature 2 */ +#define FSCHER_REG_TEMP2_ACT 0x35 +#define FSCHER_REG_TEMP2_STATE 0x91 + +/* + * Functions declaration + */ + +static int fscher_attach_adapter(struct i2c_adapter *adapter); +static int fscher_detect(struct i2c_adapter *adapter, int address, int kind); +static int fscher_detach_client(struct i2c_client *client); +static void fscher_update_client(struct i2c_client *client); +static void fscher_init_client(struct i2c_client *client); + +static int fscher_read_value(struct i2c_client *client, u8 reg); +static int fscher_write_value(struct i2c_client *client, u8 reg, u8 value); + +/* + * Driver data (common to all clients) + */ + +static struct i2c_driver fscher_driver = { + .owner = THIS_MODULE, + .name = "fscher", + .id = I2C_DRIVERID_FSCHER, + .flags = I2C_DF_NOTIFY, + .attach_adapter = fscher_attach_adapter, + .detach_client = fscher_detach_client, +}; + +/* + * Client data (each client gets its own) + */ + +struct fscher_data { + struct semaphore update_lock; + char valid; /* zero until following fields are valid */ + unsigned long last_updated; /* in jiffies */ + + /* register values */ + u8 revision; /* revision of chip */ + u8 global_event; /* global event status */ + u8 global_control; /* global control register */ + u8 watchdog[3]; /* watchdog */ + u8 volt[3]; /* 12, 5, battery voltage */ + u8 temp_act[3]; /* temperature */ + u8 temp_status[3]; /* status of sensor */ + u8 fan_act[3]; /* fans revolutions per second */ + u8 fan_status[3]; /* fan status */ + u8 fan_min[3]; /* fan min value for rps */ + u8 fan_ripple[3]; /* divider for rps */ +}; + +/* + * Internal variables + */ + +static int fscher_id = 0; + +/* + * Sysfs stuff + */ + +#define sysfs_r(kind, offset, reg) \ +static ssize_t show_##kind (struct fscher_data *, char *, int); \ +static ssize_t show_##kind##offset (struct device *, char *); \ +static ssize_t show_##kind##offset (struct device *dev, char *buf) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct fscher_data *data = i2c_get_clientdata(client); \ + fscher_update_client(client); \ + return show_##kind(data, buf, (offset)); \ +} + +#define sysfs_w(kind, offset, reg) \ +static ssize_t set_##kind (struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \ +static ssize_t set_##kind##offset (struct device *, const char *, size_t); \ +static ssize_t set_##kind##offset (struct device *dev, const char *buf, size_t count) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct fscher_data *data = i2c_get_clientdata(client); \ + return set_##kind(client, data, buf, count, (offset), reg); \ +} + +#define sysfs_rw_n(kind, offset, reg) \ +sysfs_r(kind, offset, reg) \ +sysfs_w(kind, offset, reg) \ +static DEVICE_ATTR(kind##offset, S_IRUGO | S_IWUSR, show_##kind##offset, set_##kind##offset); + +#define sysfs_rw(kind, reg) \ +sysfs_r(kind, 0, reg) \ +sysfs_w(kind, 0, reg) \ +static DEVICE_ATTR(kind, S_IRUGO | S_IWUSR, show_##kind##0, set_##kind##0); + +#define sysfs_ro_n(kind, offset, reg) \ +sysfs_r(kind, offset, reg) \ +static DEVICE_ATTR(kind##offset, S_IRUGO, show_##kind##offset, NULL); + +#define sysfs_ro(kind, reg) \ +sysfs_r(kind, 0, reg) \ +static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0, NULL); + +#define sysfs_fan(offset, reg_status, reg_min, reg_ripple, reg_act) \ +sysfs_rw_n(pwm , offset, reg_min) \ +sysfs_rw_n(fan_status, offset, reg_status) \ +sysfs_rw_n(fan_div , offset, reg_ripple) \ +sysfs_ro_n(fan_input , offset, reg_act) + +#define sysfs_temp(offset, reg_status, reg_act) \ +sysfs_rw_n(temp_status, offset, reg_status) \ +sysfs_ro_n(temp_input , offset, reg_act) + +#define sysfs_in(offset, reg_act) \ +sysfs_ro_n(in_input, offset, reg_act) + +#define sysfs_revision(reg_revision) \ +sysfs_ro(revision, reg_revision) + +#define sysfs_alarms(reg_events) \ +sysfs_ro(alarms, reg_events) + +#define sysfs_control(reg_control) \ +sysfs_rw(control, reg_control) + +#define sysfs_watchdog(reg_control, reg_status, reg_preset) \ +sysfs_rw(watchdog_control, reg_control) \ +sysfs_rw(watchdog_status , reg_status) \ +sysfs_rw(watchdog_preset , reg_preset) + +sysfs_fan(1, FSCHER_REG_FAN0_STATE, FSCHER_REG_FAN0_MIN, + FSCHER_REG_FAN0_RIPPLE, FSCHER_REG_FAN0_ACT) +sysfs_fan(2, FSCHER_REG_FAN1_STATE, FSCHER_REG_FAN1_MIN, + FSCHER_REG_FAN1_RIPPLE, FSCHER_REG_FAN1_ACT) +sysfs_fan(3, FSCHER_REG_FAN2_STATE, FSCHER_REG_FAN2_MIN, + FSCHER_REG_FAN2_RIPPLE, FSCHER_REG_FAN2_ACT) + +sysfs_temp(1, FSCHER_REG_TEMP0_STATE, FSCHER_REG_TEMP0_ACT) +sysfs_temp(2, FSCHER_REG_TEMP1_STATE, FSCHER_REG_TEMP1_ACT) +sysfs_temp(3, FSCHER_REG_TEMP2_STATE, FSCHER_REG_TEMP2_ACT) + +sysfs_in(0, FSCHER_REG_VOLT_12) +sysfs_in(1, FSCHER_REG_VOLT_5) +sysfs_in(2, FSCHER_REG_VOLT_BATT) + +sysfs_revision(FSCHER_REG_REVISION) +sysfs_alarms(FSCHER_REG_EVENTS) +sysfs_control(FSCHER_REG_CONTROL) +sysfs_watchdog(FSCHER_REG_WDOG_CONTROL, FSCHER_REG_WDOG_STATE, FSCHER_REG_WDOG_PRESET) + +#define device_create_file_fan(client, offset) \ +do { \ + device_create_file(&client->dev, &dev_attr_fan_status##offset); \ + device_create_file(&client->dev, &dev_attr_pwm##offset); \ + device_create_file(&client->dev, &dev_attr_fan_div##offset); \ + device_create_file(&client->dev, &dev_attr_fan_input##offset); \ +} while (0) + +#define device_create_file_temp(client, offset) \ +do { \ + device_create_file(&client->dev, &dev_attr_temp_status##offset); \ + device_create_file(&client->dev, &dev_attr_temp_input##offset); \ +} while (0) + +#define device_create_file_in(client, offset) \ +do { \ + device_create_file(&client->dev, &dev_attr_in_input##offset); \ +} while (0) + +#define device_create_file_revision(client) \ +do { \ + device_create_file(&client->dev, &dev_attr_revision); \ +} while (0) + +#define device_create_file_alarms(client) \ +do { \ + device_create_file(&client->dev, &dev_attr_alarms); \ +} while (0) + +#define device_create_file_control(client) \ +do { \ + device_create_file(&client->dev, &dev_attr_control); \ +} while (0) + +#define device_create_file_watchdog(client) \ +do { \ + device_create_file(&client->dev, &dev_attr_watchdog_status); \ + device_create_file(&client->dev, &dev_attr_watchdog_control); \ + device_create_file(&client->dev, &dev_attr_watchdog_preset); \ +} while (0) + +/* + * Real code + */ + +static int fscher_attach_adapter(struct i2c_adapter *adapter) +{ + if (!(adapter->class & I2C_ADAP_CLASS_SMBUS)) + return 0; + return i2c_detect(adapter, &addr_data, fscher_detect); +} + +static int fscher_detect(struct i2c_adapter *adapter, int address, int kind) +{ + struct i2c_client *new_client; + struct fscher_data *data; + int err = 0; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + goto exit; + + /* OK. For now, we presume we have a valid client. We now create the + * client structure, even though we cannot fill it completely yet. + * But it allows us to access i2c_smbus_read_byte_data. */ + if (!(new_client = kmalloc(sizeof(struct i2c_client) + + sizeof(struct fscher_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + memset(new_client, 0x00, sizeof(struct i2c_client) + + sizeof(struct fscher_data)); + + /* The Hermes-specific data is placed right after the common I2C + * client data. */ + data = (struct fscher_data *) (new_client + 1); + i2c_set_clientdata(new_client, data); + new_client->addr = address; + new_client->adapter = adapter; + new_client->driver = &fscher_driver; + new_client->flags = 0; + + /* Do the remaining detection unless force or force_fscher parameter */ + if (kind < 0) { + if ((i2c_smbus_read_byte_data(new_client, + FSCHER_REG_IDENT_0) != 0x48) /* 'H' */ + || (i2c_smbus_read_byte_data(new_client, + FSCHER_REG_IDENT_1) != 0x45) /* 'E' */ + || (i2c_smbus_read_byte_data(new_client, + FSCHER_REG_IDENT_2) != 0x52)) /* 'R' */ + goto exit_free; + } + + /* Fill in the remaining client fields and put it into the + * global list */ + strlcpy(new_client->name, "fscher", I2C_NAME_SIZE); + new_client->id = fscher_id++; + data->valid = 0; + init_MUTEX(&data->update_lock); + + /* Tell the I2C layer a new client has arrived */ + if ((err = i2c_attach_client(new_client))) + goto exit_free; + + fscher_init_client(new_client); + + /* Register sysfs hooks */ + device_create_file_revision(new_client); + device_create_file_alarms(new_client); + device_create_file_control(new_client); + device_create_file_watchdog(new_client); + + device_create_file_in(new_client, 0); + device_create_file_in(new_client, 1); + device_create_file_in(new_client, 2); + + device_create_file_fan(new_client, 1); + device_create_file_fan(new_client, 2); + device_create_file_fan(new_client, 3); + + device_create_file_temp(new_client, 1); + device_create_file_temp(new_client, 2); + device_create_file_temp(new_client, 3); + + return 0; + +exit_free: + kfree(new_client); +exit: + return err; +} + +static int fscher_detach_client(struct i2c_client *client) +{ + int err; + + if ((err = i2c_detach_client(client))) { + dev_err(&client->dev, "Client deregistration failed, " + "client not detached.\n"); + return err; + } + + kfree(client); + return 0; +} + +static int fscher_read_value(struct i2c_client *client, u8 reg) +{ + dev_dbg(&client->dev, "read reg 0x%02x\n", reg); + + return i2c_smbus_read_byte_data(client, reg); +} + +static int fscher_write_value(struct i2c_client *client, u8 reg, u8 value) +{ + dev_dbg(&client->dev, "write reg 0x%02x, val 0x%02x\n", + reg, value); + + return i2c_smbus_write_byte_data(client, reg, value); +} + +/* Called when we have found a new FSC Hermes. */ +static void fscher_init_client(struct i2c_client *client) +{ + struct fscher_data *data = i2c_get_clientdata(client); + + /* Read revision from chip */ + data->revision = fscher_read_value(client, FSCHER_REG_REVISION); +} + +static void fscher_update_client(struct i2c_client *client) +{ + struct fscher_data *data = i2c_get_clientdata(client); + + down(&data->update_lock); + + if ((jiffies - data->last_updated > 2 * HZ) || + (jiffies < data->last_updated) || !data->valid) { + + dev_dbg(&client->dev, "Starting fscher update\n"); + + data->temp_act[0] = fscher_read_value(client, FSCHER_REG_TEMP0_ACT); + data->temp_act[1] = fscher_read_value(client, FSCHER_REG_TEMP1_ACT); + data->temp_act[2] = fscher_read_value(client, FSCHER_REG_TEMP2_ACT); + data->temp_status[0] = fscher_read_value(client, FSCHER_REG_TEMP0_STATE); + data->temp_status[1] = fscher_read_value(client, FSCHER_REG_TEMP1_STATE); + data->temp_status[2] = fscher_read_value(client, FSCHER_REG_TEMP2_STATE); + + data->volt[0] = fscher_read_value(client, FSCHER_REG_VOLT_12); + data->volt[1] = fscher_read_value(client, FSCHER_REG_VOLT_5); + data->volt[2] = fscher_read_value(client, FSCHER_REG_VOLT_BATT); + + data->fan_act[0] = fscher_read_value(client, FSCHER_REG_FAN0_ACT); + data->fan_act[1] = fscher_read_value(client, FSCHER_REG_FAN1_ACT); + data->fan_act[2] = fscher_read_value(client, FSCHER_REG_FAN2_ACT); + data->fan_status[0] = fscher_read_value(client, FSCHER_REG_FAN0_STATE); + data->fan_status[1] = fscher_read_value(client, FSCHER_REG_FAN1_STATE); + data->fan_status[2] = fscher_read_value(client, FSCHER_REG_FAN2_STATE); + data->fan_min[0] = fscher_read_value(client, FSCHER_REG_FAN0_MIN); + data->fan_min[1] = fscher_read_value(client, FSCHER_REG_FAN1_MIN); + data->fan_min[2] = fscher_read_value(client, FSCHER_REG_FAN2_MIN); + data->fan_ripple[0] = fscher_read_value(client, FSCHER_REG_FAN0_RIPPLE); + data->fan_ripple[1] = fscher_read_value(client, FSCHER_REG_FAN1_RIPPLE); + data->fan_ripple[2] = fscher_read_value(client, FSCHER_REG_FAN2_RIPPLE); + + data->watchdog[0] = fscher_read_value(client, FSCHER_REG_WDOG_PRESET); + data->watchdog[1] = fscher_read_value(client, FSCHER_REG_WDOG_STATE); + data->watchdog[2] = fscher_read_value(client, FSCHER_REG_WDOG_CONTROL); + + data->global_event = fscher_read_value(client, FSCHER_REG_EVENT_STATE); + + data->last_updated = jiffies; + data->valid = 1; + } + + up(&data->update_lock); +} + + + +#define FAN_INDEX_FROM_NUM(nr) ((nr) - 1) + +static ssize_t set_fan_status(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + /* bits 0..1, 3..7 reserved => mask with 0x04 */ + unsigned long v = simple_strtoul(buf, NULL, 10) & 0x04; + data->fan_status[FAN_INDEX_FROM_NUM(nr)] &= ~v; + + fscher_write_value(client, reg, v); + return count; +} + +static ssize_t show_fan_status(struct fscher_data *data, char *buf, int nr) +{ + /* bits 0..1, 3..7 reserved => mask with 0x04 */ + return sprintf(buf, "%u\n", data->fan_status[FAN_INDEX_FROM_NUM(nr)] & 0x04); +} + +static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + data->fan_min[FAN_INDEX_FROM_NUM(nr)] = simple_strtoul(buf, NULL, 10) & 0xff; + + fscher_write_value(client, reg, data->fan_min[FAN_INDEX_FROM_NUM(nr)]); + return count; +} + +static ssize_t show_pwm (struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%u\n", data->fan_min[FAN_INDEX_FROM_NUM(nr)]); +} + +static ssize_t set_fan_div(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + /* supported values: 2, 4, 8 */ + unsigned long v = simple_strtoul(buf, NULL, 10); + + switch (v) { + case 2: v = 1; break; + case 4: v = 2; break; + case 8: v = 3; break; + default: + dev_err(&client->dev, "fan_div value %ld not " + "supported. Choose one of 2, 4 or 8!\n", v); + return -1; + } + + /* bits 2..7 reserved => mask with 0x03 */ + data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] &= ~0x03; + data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] |= v; + + fscher_write_value(client, reg, data->fan_ripple[FAN_INDEX_FROM_NUM(nr)]); + return count; +} + +static ssize_t show_fan_div(struct fscher_data *data, char *buf, int nr) +{ + /* bits 2..7 reserved => mask with 0x03 */ + return sprintf(buf, "%u\n", 1 << (data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] & 0x03)); +} + +#define RPM_FROM_REG(val) (val*60) + +static ssize_t show_fan_input (struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[FAN_INDEX_FROM_NUM(nr)])); +} + + + +#define TEMP_INDEX_FROM_NUM(nr) ((nr) - 1) + +static ssize_t set_temp_status(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + /* bits 2..7 reserved, 0 read only => mask with 0x02 */ + unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; + data->temp_status[TEMP_INDEX_FROM_NUM(nr)] &= ~v; + + fscher_write_value(client, reg, v); + return count; +} + +static ssize_t show_temp_status(struct fscher_data *data, char *buf, int nr) +{ + /* bits 2..7 reserved => mask with 0x03 */ + return sprintf(buf, "%u\n", data->temp_status[TEMP_INDEX_FROM_NUM(nr)] & 0x03); +} + +#define TEMP_FROM_REG(val) (((val) - 128) * 1000) + +static ssize_t show_temp_input(struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[TEMP_INDEX_FROM_NUM(nr)])); +} + +/* + * The final conversion is specified in sensors.conf, as it depends on + * mainboard specific values. We export the registers contents as + * pseudo-hundredths-of-Volts (range 0V - 2.55V). Not that it makes much + * sense per se, but it minimizes the conversions count and keeps the + * values within a usual range. + */ +#define VOLT_FROM_REG(val) ((val) * 10) + +static ssize_t show_in_input(struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%u\n", VOLT_FROM_REG(data->volt[nr])); +} + + + +static ssize_t show_revision(struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%u\n", data->revision); +} + + + +static ssize_t show_alarms(struct fscher_data *data, char *buf, int nr) +{ + /* bits 2, 5..6 reserved => mask with 0x9b */ + return sprintf(buf, "%u\n", data->global_event & 0x9b); +} + + + +static ssize_t set_control(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + /* bits 1..7 reserved => mask with 0x01 */ + unsigned long v = simple_strtoul(buf, NULL, 10) & 0x01; + data->global_control &= ~v; + + fscher_write_value(client, reg, v); + return count; +} + +static ssize_t show_control(struct fscher_data *data, char *buf, int nr) +{ + /* bits 1..7 reserved => mask with 0x01 */ + return sprintf(buf, "%u\n", data->global_control & 0x01); +} + + + +static ssize_t set_watchdog_control(struct i2c_client *client, struct + fscher_data *data, const char *buf, size_t count, + int nr, int reg) +{ + /* bits 0..3 reserved => mask with 0xf0 */ + unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; + data->watchdog[2] &= ~0xf0; + data->watchdog[2] |= v; + + fscher_write_value(client, reg, data->watchdog[2]); + return count; +} + +static ssize_t show_watchdog_control(struct fscher_data *data, char *buf, int nr) +{ + /* bits 0..3 reserved, bit 5 write only => mask with 0xd0 */ + return sprintf(buf, "%u\n", data->watchdog[2] & 0xd0); +} + +static ssize_t set_watchdog_status(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + /* bits 0, 2..7 reserved => mask with 0x02 */ + unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; + data->watchdog[1] &= ~v; + + fscher_write_value(client, reg, v); + return count; +} + +static ssize_t show_watchdog_status(struct fscher_data *data, char *buf, int nr) +{ + /* bits 0, 2..7 reserved => mask with 0x02 */ + return sprintf(buf, "%u\n", data->watchdog[1] & 0x02); +} + +static ssize_t set_watchdog_preset(struct i2c_client *client, struct fscher_data *data, + const char *buf, size_t count, int nr, int reg) +{ + data->watchdog[0] = simple_strtoul(buf, NULL, 10) & 0xff; + + fscher_write_value(client, reg, data->watchdog[0]); + return count; +} + +static ssize_t show_watchdog_preset(struct fscher_data *data, char *buf, int nr) +{ + return sprintf(buf, "%u\n", data->watchdog[0]); +} + +static int __init sensors_fscher_init(void) +{ + return i2c_add_driver(&fscher_driver); +} + +static void __exit sensors_fscher_exit(void) +{ + i2c_del_driver(&fscher_driver); +} + +MODULE_AUTHOR("Reinhard Nissl "); +MODULE_DESCRIPTION("FSC Hermes driver"); +MODULE_LICENSE("GPL"); + +module_init(sensors_fscher_init); +module_exit(sensors_fscher_exit); diff -Nru a/drivers/i2c/chips/gl518sm.c b/drivers/i2c/chips/gl518sm.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/chips/gl518sm.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,612 @@ +/* + * gl518sm.c - Part of lm_sensors, Linux kernel modules for hardware + * monitoring + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Kyosti Malkki + * Copyright (C) 2004 Hong-Gunn Chew and + * Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Ported to Linux 2.6 by Hong-Gunn Chew with the help of Jean Delvare + * and advice of Greg Kroah-Hartman. + * + * Notes about the port: + * Release 0x00 of the GL518SM chipset doesn't support reading of in0, + * in1 nor in2. The original driver had an ugly workaround to get them + * anyway (changing limits and watching alarms trigger and wear off). + * We did not keep that part of the original driver in the Linux 2.6 + * version, since it was making the driver significantly more complex + * with no real benefit. + * + * History: + * 2004-01-28 Original port. (Hong-Gunn Chew) + * 2004-01-31 Code review and approval. (Jean Delvare) + */ + +#include +#ifdef CONFIG_I2C_DEBUG_CHIP +#define DEBUG 1 +#endif + +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; +static unsigned short normal_i2c_range[] = { I2C_CLIENT_END }; +static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; +static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END }; + +/* Insmod parameters */ +SENSORS_INSMOD_2(gl518sm_r00, gl518sm_r80); + +/* Many GL518 constants specified below */ + +/* The GL518 registers */ +#define GL518_REG_CHIP_ID 0x00 +#define GL518_REG_REVISION 0x01 +#define GL518_REG_VENDOR_ID 0x02 +#define GL518_REG_CONF 0x03 +#define GL518_REG_TEMP_IN 0x04 +#define GL518_REG_TEMP_MAX 0x05 +#define GL518_REG_TEMP_HYST 0x06 +#define GL518_REG_FAN_COUNT 0x07 +#define GL518_REG_FAN_LIMIT 0x08 +#define GL518_REG_VIN1_LIMIT 0x09 +#define GL518_REG_VIN2_LIMIT 0x0a +#define GL518_REG_VIN3_LIMIT 0x0b +#define GL518_REG_VDD_LIMIT 0x0c +#define GL518_REG_VIN3 0x0d +#define GL518_REG_MISC 0x0f +#define GL518_REG_ALARM 0x10 +#define GL518_REG_MASK 0x11 +#define GL518_REG_INT 0x12 +#define GL518_REG_VIN2 0x13 +#define GL518_REG_VIN1 0x14 +#define GL518_REG_VDD 0x15 + + +/* + * Conversions. Rounding and limit checking is only done on the TO_REG + * variants. Note that you should be a bit careful with which arguments + * these macros are called: arguments may be evaluated more than once. + * Fixing this is just not worth it. + */ + +#define RAW_FROM_REG(val) val + +#define BOOL_FROM_REG(val) ((val)?0:1) +#define BOOL_TO_REG(val) ((val)?0:1) + +#define TEMP_TO_REG(val) (SENSORS_LIMIT(((((val)<0? \ + (val)-500:(val)+500)/1000)+119),0,255)) +#define TEMP_FROM_REG(val) (((val) - 119) * 1000) + +static inline u8 FAN_TO_REG(long rpm, int div) +{ + long rpmdiv; + if (rpm == 0) + return 0; + rpmdiv = SENSORS_LIMIT(rpm, 1, 1920000) * div; + return SENSORS_LIMIT((960000 + rpmdiv / 2) / rpmdiv, 1, 255); +} +#define FAN_FROM_REG(val,div) ((val)==0 ? 0 : (960000/((val)*(div)))) + +#define IN_TO_REG(val) (SENSORS_LIMIT((((val)+9)/19),0,255)) +#define IN_FROM_REG(val) ((val)*19) + +#define VDD_TO_REG(val) (SENSORS_LIMIT((((val)*4+47)/95),0,255)) +#define VDD_FROM_REG(val) (((val)*95+2)/4) + +#define DIV_TO_REG(val) ((val)==4?2:(val)==2?1:(val)==1?0:3) +#define DIV_FROM_REG(val) (1 << (val)) + +#define BEEP_MASK_TO_REG(val) ((val) & 0x7f & data->alarm_mask) +#define BEEP_MASK_FROM_REG(val) ((val) & 0x7f) + +/* Each client has this additional data */ +struct gl518_data { + enum chips type; + + struct semaphore update_lock; + char valid; /* !=0 if following fields are valid */ + unsigned long last_updated; /* In jiffies */ + + u8 voltage_in[4]; /* Register values; [0] = VDD */ + u8 voltage_min[4]; /* Register values; [0] = VDD */ + u8 voltage_max[4]; /* Register values; [0] = VDD */ + u8 iter_voltage_in[4]; /* Register values; [0] = VDD */ + u8 fan_in[2]; + u8 fan_min[2]; + u8 fan_div[2]; /* Register encoding, shifted right */ + u8 fan_auto1; /* Boolean */ + u8 temp_in; /* Register values */ + u8 temp_max; /* Register values */ + u8 temp_hyst; /* Register values */ + u8 alarms; /* Register value */ + u8 alarm_mask; /* Register value */ + u8 beep_mask; /* Register value */ + u8 beep_enable; /* Boolean */ +}; + +static int gl518_attach_adapter(struct i2c_adapter *adapter); +static int gl518_detect(struct i2c_adapter *adapter, int address, int kind); +static void gl518_init_client(struct i2c_client *client); +static int gl518_detach_client(struct i2c_client *client); +static int gl518_read_value(struct i2c_client *client, u8 reg); +static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value); +static void gl518_update_client(struct i2c_client *client); + +/* This is the driver that will be inserted */ +static struct i2c_driver gl518_driver = { + .owner = THIS_MODULE, + .name = "gl518sm", + .id = I2C_DRIVERID_GL518, + .flags = I2C_DF_NOTIFY, + .attach_adapter = gl518_attach_adapter, + .detach_client = gl518_detach_client, +}; + +/* + * Internal variables + */ + +static int gl518_id = 0; + +/* + * Sysfs stuff + */ + +#define show(type, suffix, value) \ +static ssize_t show_##suffix(struct device *dev, char *buf) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct gl518_data *data = i2c_get_clientdata(client); \ + gl518_update_client(client); \ + return sprintf(buf, "%d\n", type##_FROM_REG(data->value)); \ +} + +#define show_fan(suffix, value, index) \ +static ssize_t show_##suffix(struct device *dev, char *buf) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct gl518_data *data = i2c_get_clientdata(client); \ + gl518_update_client(client); \ + return sprintf(buf, "%d\n", FAN_FROM_REG(data->value[index], \ + DIV_FROM_REG(data->fan_div[index]))); \ +} + +show(TEMP, temp_input1, temp_in); +show(TEMP, temp_max1, temp_max); +show(TEMP, temp_hyst1, temp_hyst); +show(BOOL, fan_auto1, fan_auto1); +show_fan(fan_input1, fan_in, 0); +show_fan(fan_input2, fan_in, 1); +show_fan(fan_min1, fan_min, 0); +show_fan(fan_min2, fan_min, 1); +show(DIV, fan_div1, fan_div[0]); +show(DIV, fan_div2, fan_div[1]); +show(VDD, in_input0, voltage_in[0]); +show(IN, in_input1, voltage_in[1]); +show(IN, in_input2, voltage_in[2]); +show(IN, in_input3, voltage_in[3]); +show(VDD, in_min0, voltage_min[0]); +show(IN, in_min1, voltage_min[1]); +show(IN, in_min2, voltage_min[2]); +show(IN, in_min3, voltage_min[3]); +show(VDD, in_max0, voltage_max[0]); +show(IN, in_max1, voltage_max[1]); +show(IN, in_max2, voltage_max[2]); +show(IN, in_max3, voltage_max[3]); +show(RAW, alarms, alarms); +show(BOOL, beep_enable, beep_enable); +show(BEEP_MASK, beep_mask, beep_mask); + +#define set(type, suffix, value, reg) \ +static ssize_t set_##suffix(struct device *dev, const char *buf, \ + size_t count) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct gl518_data *data = i2c_get_clientdata(client); \ + data->value = type##_TO_REG(simple_strtol(buf, NULL, 10)); \ + gl518_write_value(client, reg, data->value); \ + return count; \ +} + +#define set_bits(type, suffix, value, reg, mask, shift) \ +static ssize_t set_##suffix(struct device *dev, const char *buf, \ + size_t count) \ +{ \ + struct i2c_client *client = to_i2c_client(dev); \ + struct gl518_data *data = i2c_get_clientdata(client); \ + int regvalue = gl518_read_value(client, reg); \ + data->value = type##_TO_REG(simple_strtoul(buf, NULL, 10)); \ + regvalue = (regvalue & ~mask) | (data->value << shift); \ + gl518_write_value(client, reg, regvalue); \ + return count; \ +} + +#define set_low(type, suffix, value, reg) \ + set_bits(type, suffix, value, reg, 0x00ff, 0) +#define set_high(type, suffix, value, reg) \ + set_bits(type, suffix, value, reg, 0xff00, 8) + +set(TEMP, temp_max1, temp_max, GL518_REG_TEMP_MAX); +set(TEMP, temp_hyst1, temp_hyst, GL518_REG_TEMP_HYST); +set_bits(BOOL, fan_auto1, fan_auto1, GL518_REG_MISC, 0x08, 3); +set_bits(DIV, fan_div1, fan_div[0], GL518_REG_MISC, 0xc0, 6); +set_bits(DIV, fan_div2, fan_div[1], GL518_REG_MISC, 0x30, 4); +set_low(VDD, in_min0, voltage_min[0], GL518_REG_VDD_LIMIT); +set_low(IN, in_min1, voltage_min[1], GL518_REG_VIN1_LIMIT); +set_low(IN, in_min2, voltage_min[2], GL518_REG_VIN2_LIMIT); +set_low(IN, in_min3, voltage_min[3], GL518_REG_VIN3_LIMIT); +set_high(VDD, in_max0, voltage_max[0], GL518_REG_VDD_LIMIT); +set_high(IN, in_max1, voltage_max[1], GL518_REG_VIN1_LIMIT); +set_high(IN, in_max2, voltage_max[2], GL518_REG_VIN2_LIMIT); +set_high(IN, in_max3, voltage_max[3], GL518_REG_VIN3_LIMIT); +set_bits(BOOL, beep_enable, beep_enable, GL518_REG_CONF, 0x04, 2); +set(BEEP_MASK, beep_mask, beep_mask, GL518_REG_ALARM); + +static ssize_t set_fan_min1(struct device *dev, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct gl518_data *data = i2c_get_clientdata(client); + int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); + + data->fan_min[0] = FAN_TO_REG(simple_strtoul(buf, NULL, 10), + DIV_FROM_REG(data->fan_div[0])); + regvalue = (regvalue & 0x00ff) | (data->fan_min[0] << 8); + gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue); + + data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); + if (data->fan_min[0] == 0) + data->alarm_mask &= ~0x20; + else + data->alarm_mask |= 0x20; + data->beep_mask &= data->alarm_mask; + gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); + + return count; +} + +static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct gl518_data *data = i2c_get_clientdata(client); + int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); + + data->fan_min[1] = FAN_TO_REG(simple_strtoul(buf, NULL, 10), + DIV_FROM_REG(data->fan_div[1])); + regvalue = (regvalue & 0xff00) | data->fan_min[1]; + gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue); + + data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); + if (data->fan_min[1] == 0) + data->alarm_mask &= ~0x40; + else + data->alarm_mask |= 0x40; + data->beep_mask &= data->alarm_mask; + gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); + + return count; +} + +static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL); +static DEVICE_ATTR(temp_max1, S_IWUSR|S_IRUGO, show_temp_max1, set_temp_max1); +static DEVICE_ATTR(temp_hyst1, S_IWUSR|S_IRUGO, + show_temp_hyst1, set_temp_hyst1); +static DEVICE_ATTR(fan_auto1, S_IWUSR|S_IRUGO, show_fan_auto1, set_fan_auto1); +static DEVICE_ATTR(fan_input1, S_IRUGO, show_fan_input1, NULL); +static DEVICE_ATTR(fan_input2, S_IRUGO, show_fan_input2, NULL); +static DEVICE_ATTR(fan_min1, S_IWUSR|S_IRUGO, show_fan_min1, set_fan_min1); +static DEVICE_ATTR(fan_min2, S_IWUSR|S_IRUGO, show_fan_min2, set_fan_min2); +static DEVICE_ATTR(fan_div1, S_IWUSR|S_IRUGO, show_fan_div1, set_fan_div1); +static DEVICE_ATTR(fan_div2, S_IWUSR|S_IRUGO, show_fan_div2, set_fan_div2); +static DEVICE_ATTR(in_input0, S_IRUGO, show_in_input0, NULL); +static DEVICE_ATTR(in_input1, S_IRUGO, show_in_input1, NULL); +static DEVICE_ATTR(in_input2, S_IRUGO, show_in_input2, NULL); +static DEVICE_ATTR(in_input3, S_IRUGO, show_in_input3, NULL); +static DEVICE_ATTR(in_min0, S_IWUSR|S_IRUGO, show_in_min0, set_in_min0); +static DEVICE_ATTR(in_min1, S_IWUSR|S_IRUGO, show_in_min1, set_in_min1); +static DEVICE_ATTR(in_min2, S_IWUSR|S_IRUGO, show_in_min2, set_in_min2); +static DEVICE_ATTR(in_min3, S_IWUSR|S_IRUGO, show_in_min3, set_in_min3); +static DEVICE_ATTR(in_max0, S_IWUSR|S_IRUGO, show_in_max0, set_in_max0); +static DEVICE_ATTR(in_max1, S_IWUSR|S_IRUGO, show_in_max1, set_in_max1); +static DEVICE_ATTR(in_max2, S_IWUSR|S_IRUGO, show_in_max2, set_in_max2); +static DEVICE_ATTR(in_max3, S_IWUSR|S_IRUGO, show_in_max3, set_in_max3); +static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); +static DEVICE_ATTR(beep_enable, S_IWUSR|S_IRUGO, + show_beep_enable, set_beep_enable); +static DEVICE_ATTR(beep_mask, S_IWUSR|S_IRUGO, + show_beep_mask, set_beep_mask); + +/* + * Real code + */ + +static int gl518_attach_adapter(struct i2c_adapter *adapter) +{ + if (!(adapter->class & I2C_ADAP_CLASS_SMBUS)) + return 0; + return i2c_detect(adapter, &addr_data, gl518_detect); +} + +static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) +{ + int i; + struct i2c_client *new_client; + struct gl518_data *data; + int err = 0; + const char *name = ""; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) + goto exit; + + /* OK. For now, we presume we have a valid client. We now create the + client structure, even though we cannot fill it completely yet. + But it allows us to access gl518_{read,write}_value. */ + + if (!(new_client = kmalloc(sizeof(struct i2c_client) + + sizeof(struct gl518_data), + GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + memset(new_client, 0x00, sizeof(struct i2c_client) + + sizeof(struct gl518_data)); + + data = (struct gl518_data *) (new_client + 1); + i2c_set_clientdata(new_client, data); + + new_client->addr = address; + new_client->adapter = adapter; + new_client->driver = &gl518_driver; + new_client->flags = 0; + + /* Now, we do the remaining detection. */ + + if (kind < 0) { + if ((gl518_read_value(new_client, GL518_REG_CHIP_ID) != 0x80) + || (gl518_read_value(new_client, GL518_REG_CONF) & 0x80)) + goto exit_free; + } + + /* Determine the chip type. */ + if (kind <= 0) { + i = gl518_read_value(new_client, GL518_REG_REVISION); + if (i == 0x00) { + kind = gl518sm_r00; + name = "gl518sm"; + } else if (i == 0x80) { + kind = gl518sm_r80; + name = "gl518sm"; + } else { + if (kind <= 0) + dev_info(&adapter->dev, + "Ignoring 'force' parameter for unknown " + "chip at adapter %d, address 0x%02x\n", + i2c_adapter_id(adapter), address); + goto exit_free; + } + } + + /* Fill in the remaining client fields */ + strlcpy(new_client->name, name, I2C_NAME_SIZE); + new_client->id = gl518_id++; + data->type = kind; + data->valid = 0; + init_MUTEX(&data->update_lock); + + /* Tell the I2C layer a new client has arrived */ + if ((err = i2c_attach_client(new_client))) + goto exit_free; + + /* Initialize the GL518SM chip */ + data->alarm_mask = 0xff; + data->voltage_in[0]=data->voltage_in[1]=data->voltage_in[2]=0; + gl518_init_client((struct i2c_client *) new_client); + + /* Register sysfs hooks */ + device_create_file(&new_client->dev, &dev_attr_in_input0); + device_create_file(&new_client->dev, &dev_attr_in_input1); + device_create_file(&new_client->dev, &dev_attr_in_input2); + device_create_file(&new_client->dev, &dev_attr_in_input3); + device_create_file(&new_client->dev, &dev_attr_in_min0); + device_create_file(&new_client->dev, &dev_attr_in_min1); + device_create_file(&new_client->dev, &dev_attr_in_min2); + device_create_file(&new_client->dev, &dev_attr_in_min3); + device_create_file(&new_client->dev, &dev_attr_in_max0); + device_create_file(&new_client->dev, &dev_attr_in_max1); + device_create_file(&new_client->dev, &dev_attr_in_max2); + device_create_file(&new_client->dev, &dev_attr_in_max3); + device_create_file(&new_client->dev, &dev_attr_fan_auto1); + device_create_file(&new_client->dev, &dev_attr_fan_input1); + device_create_file(&new_client->dev, &dev_attr_fan_input2); + device_create_file(&new_client->dev, &dev_attr_fan_min1); + device_create_file(&new_client->dev, &dev_attr_fan_min2); + device_create_file(&new_client->dev, &dev_attr_fan_div1); + device_create_file(&new_client->dev, &dev_attr_fan_div2); + device_create_file(&new_client->dev, &dev_attr_temp_input1); + device_create_file(&new_client->dev, &dev_attr_temp_max1); + device_create_file(&new_client->dev, &dev_attr_temp_hyst1); + device_create_file(&new_client->dev, &dev_attr_alarms); + device_create_file(&new_client->dev, &dev_attr_beep_enable); + device_create_file(&new_client->dev, &dev_attr_beep_mask); + + return 0; + +/* OK, this is not exactly good programming practice, usually. But it is + very code-efficient in this case. */ + +exit_free: + kfree(new_client); +exit: + return err; +} + + +/* Called when we have found a new GL518SM. + Note that we preserve D4:NoFan2 and D2:beep_enable. */ +static void gl518_init_client(struct i2c_client *client) +{ + /* Make sure we leave D7:Reset untouched */ + u8 regvalue = gl518_read_value(client, GL518_REG_CONF) & 0x7f; + + /* Comparator mode (D3=0), standby mode (D6=0) */ + gl518_write_value(client, GL518_REG_CONF, (regvalue &= 0x37)); + + /* Never interrupts */ + gl518_write_value(client, GL518_REG_MASK, 0x00); + + /* Clear status register (D5=1), start (D6=1) */ + gl518_write_value(client, GL518_REG_CONF, 0x20 | regvalue); + gl518_write_value(client, GL518_REG_CONF, 0x40 | regvalue); +} + +static int gl518_detach_client(struct i2c_client *client) +{ + int err; + + if ((err = i2c_detach_client(client))) { + dev_err(&client->dev, "Client deregistration failed, " + "client not detached.\n"); + return err; + } + + kfree(client); + + return 0; +} + +static inline u16 swap_bytes(u16 val) +{ + return (val >> 8) | (val << 8); +} + +/* Registers 0x07 to 0x0c are word-sized, others are byte-sized + GL518 uses a high-byte first convention, which is exactly opposite to + the usual practice. */ +static int gl518_read_value(struct i2c_client *client, u8 reg) +{ + if ((reg >= 0x07) && (reg <= 0x0c)) + return swap_bytes(i2c_smbus_read_word_data(client, reg)); + else + return i2c_smbus_read_byte_data(client, reg); +} + +/* Registers 0x07 to 0x0c are word-sized, others are byte-sized + GL518 uses a high-byte first convention, which is exactly opposite to + the usual practice. */ +static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value) +{ + if ((reg >= 0x07) && (reg <= 0x0c)) + return i2c_smbus_write_word_data(client, reg, + swap_bytes(value)); + else + return i2c_smbus_write_byte_data(client, reg, value); +} + +static void gl518_update_client(struct i2c_client *client) +{ + struct gl518_data *data = i2c_get_clientdata(client); + int val; + + down(&data->update_lock); + + if ((jiffies - data->last_updated > HZ + HZ / 2) || + (jiffies < data->last_updated) || !data->valid) { + dev_dbg(&client->dev, "Starting gl518 update\n"); + + data->alarms = gl518_read_value(client, GL518_REG_INT); + data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); + + val = gl518_read_value(client, GL518_REG_VDD_LIMIT); + data->voltage_min[0] = val & 0xff; + data->voltage_max[0] = (val >> 8) & 0xff; + val = gl518_read_value(client, GL518_REG_VIN1_LIMIT); + data->voltage_min[1] = val & 0xff; + data->voltage_max[1] = (val >> 8) & 0xff; + val = gl518_read_value(client, GL518_REG_VIN2_LIMIT); + data->voltage_min[2] = val & 0xff; + data->voltage_max[2] = (val >> 8) & 0xff; + val = gl518_read_value(client, GL518_REG_VIN3_LIMIT); + data->voltage_min[3] = val & 0xff; + data->voltage_max[3] = (val >> 8) & 0xff; + + val = gl518_read_value(client, GL518_REG_FAN_COUNT); + data->fan_in[0] = (val >> 8) & 0xff; + data->fan_in[1] = val & 0xff; + + val = gl518_read_value(client, GL518_REG_FAN_LIMIT); + data->fan_min[0] = (val >> 8) & 0xff; + data->fan_min[1] = val & 0xff; + + data->temp_in = gl518_read_value(client, GL518_REG_TEMP_IN); + data->temp_max = + gl518_read_value(client, GL518_REG_TEMP_MAX); + data->temp_hyst = + gl518_read_value(client, GL518_REG_TEMP_HYST); + + val = gl518_read_value(client, GL518_REG_MISC); + data->fan_div[0] = (val >> 6) & 0x03; + data->fan_div[1] = (val >> 4) & 0x03; + data->fan_auto1 = (val >> 3) & 0x01; + + data->alarms &= data->alarm_mask; + + val = gl518_read_value(client, GL518_REG_CONF); + data->beep_enable = (val >> 2) & 1; + + if (data->type != gl518sm_r00) { + data->voltage_in[0] = + gl518_read_value(client, GL518_REG_VDD); + data->voltage_in[1] = + gl518_read_value(client, GL518_REG_VIN1); + data->voltage_in[2] = + gl518_read_value(client, GL518_REG_VIN2); + } + data->voltage_in[3] = + gl518_read_value(client, GL518_REG_VIN3); + + data->last_updated = jiffies; + data->valid = 1; + } + + up(&data->update_lock); +} + +static int __init sensors_gl518sm_init(void) +{ + return i2c_add_driver(&gl518_driver); +} + +static void __exit sensors_gl518sm_exit(void) +{ + i2c_del_driver(&gl518_driver); +} + +MODULE_AUTHOR("Frodo Looijaard , " + "Kyosti Malkki and " + "Hong-Gunn Chew "); +MODULE_DESCRIPTION("GL518SM driver"); +MODULE_LICENSE("GPL"); + +module_init(sensors_gl518sm_init); +module_exit(sensors_gl518sm_exit); diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c --- a/drivers/i2c/chips/it87.c Tue Feb 17 20:00:07 2004 +++ b/drivers/i2c/chips/it87.c Tue Feb 17 20:00:07 2004 @@ -126,14 +126,13 @@ 205-(val)*5) #define ALARMS_FROM_REG(val) (val) -static int log2(int val) +static int DIV_TO_REG(int val) { int answer = 0; while ((val >>= 1)) answer++; return answer; } -#define DIV_TO_REG(val) log2(val) #define DIV_FROM_REG(val) (1 << (val)) /* Initial limits. Use the config file to set better limits. */ diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c --- a/drivers/i2c/chips/lm85.c Tue Feb 17 20:00:06 2004 +++ b/drivers/i2c/chips/lm85.c Tue Feb 17 20:00:06 2004 @@ -816,7 +816,7 @@ kind = lm85b ; } else if( company == LM85_COMPANY_NATIONAL && (verstep & 0xf0) == LM85_VERSTEP_GENERIC ) { - dev_err(&adapter->dev, "Unrecgonized version/stepping 0x%02x" + dev_err(&adapter->dev, "Unrecognized version/stepping 0x%02x" " Defaulting to LM85.\n", verstep); kind = any_chip ; } else if( company == LM85_COMPANY_ANALOG_DEV @@ -827,7 +827,7 @@ kind = adt7463 ; } else if( company == LM85_COMPANY_ANALOG_DEV && (verstep & 0xf0) == LM85_VERSTEP_GENERIC ) { - dev_err(&adapter->dev, "Unrecgonized version/stepping 0x%02x" + dev_err(&adapter->dev, "Unrecognized version/stepping 0x%02x" " Defaulting to ADM1027.\n", verstep); kind = adm1027 ; } else if( kind == 0 && (verstep & 0xf0) == 0x60) { @@ -1204,7 +1204,7 @@ /* Thanks to Richard Barrington for adding the LM85 to sensors-detect. * Thanks to Margit Schubert-While for help with - * post 2.7.0 CVS changes + * post 2.7.0 CVS changes. */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Philip Pokorny , Margit Schubert-While "); diff -Nru a/drivers/i2c/chips/w83l785ts.c b/drivers/i2c/chips/w83l785ts.c --- a/drivers/i2c/chips/w83l785ts.c Tue Feb 17 20:00:06 2004 +++ b/drivers/i2c/chips/w83l785ts.c Tue Feb 17 20:00:06 2004 @@ -38,6 +38,9 @@ #include #include +/* How many retries on register read error */ +#define MAX_RETRIES 5 + /* * Address to scan * Address is fully defined internally and cannot be changed. @@ -82,6 +85,7 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind); static int w83l785ts_detach_client(struct i2c_client *client); +static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval); static void w83l785ts_update_client(struct i2c_client *client); /* @@ -137,8 +141,8 @@ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over)); } -static DEVICE_ATTR(temp_input, S_IRUGO, show_temp, NULL) -static DEVICE_ATTR(temp_max, S_IRUGO, show_temp_over, NULL) +static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp, NULL) +static DEVICE_ATTR(temp_max1, S_IRUGO, show_temp_over, NULL) /* * Real code @@ -196,10 +200,10 @@ * are skipped. */ if (kind < 0) { /* detection */ - if (((i2c_smbus_read_byte_data(new_client, - W83L785TS_REG_CONFIG) & 0x80) != 0x00) - || ((i2c_smbus_read_byte_data(new_client, - W83L785TS_REG_TYPE) & 0xFC) != 0x00)) { + if (((w83l785ts_read_value(new_client, + W83L785TS_REG_CONFIG, 0) & 0x80) != 0x00) + || ((w83l785ts_read_value(new_client, + W83L785TS_REG_TYPE, 0) & 0xFC) != 0x00)) { dev_dbg(&adapter->dev, "W83L785TS-S detection failed at 0x%02x.\n", address); @@ -211,12 +215,12 @@ u16 man_id; u8 chip_id; - man_id = (i2c_smbus_read_byte_data(new_client, - W83L785TS_REG_MAN_ID1) << 8) + - i2c_smbus_read_byte_data(new_client, - W83L785TS_REG_MAN_ID2); - chip_id = i2c_smbus_read_byte_data(new_client, - W83L785TS_REG_CHIP_ID); + man_id = (w83l785ts_read_value(new_client, + W83L785TS_REG_MAN_ID1, 0) << 8) + + w83l785ts_read_value(new_client, + W83L785TS_REG_MAN_ID2, 0); + chip_id = w83l785ts_read_value(new_client, + W83L785TS_REG_CHIP_ID, 0); if (man_id == 0x5CA3) { /* Winbond */ if (chip_id == 0x70) { /* W83L785TS-S */ @@ -239,6 +243,9 @@ data->valid = 0; init_MUTEX(&data->update_lock); + /* Default values in case the first read fails (unlikely). */ + data->temp_over = data->temp = 0; + /* Tell the I2C layer a new client has arrived. */ if ((err = i2c_attach_client(new_client))) goto exit_free; @@ -249,8 +256,8 @@ */ /* Register sysfs hooks */ - device_create_file(&new_client->dev, &dev_attr_temp_input); - device_create_file(&new_client->dev, &dev_attr_temp_max); + device_create_file(&new_client->dev, &dev_attr_temp_input1); + device_create_file(&new_client->dev, &dev_attr_temp_max1); return 0; @@ -274,6 +281,26 @@ return 0; } +static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval) +{ + int value, i; + + /* Frequent read errors have been reported on Asus boards, so we + * retry on read errors. If it still fails (unlikely), return the + * default value requested by the caller. */ + for (i = 1; i <= MAX_RETRIES; i++) { + value = i2c_smbus_read_byte_data(client, reg); + if (value >= 0) + return value; + dev_dbg(&client->dev, "Read failed, will retry in %d.\n", i); + i2c_delay(i); + } + + dev_err(&client->dev, "Couldn't read value from register. " + "Please report.\n"); + return defval; +} + static void w83l785ts_update_client(struct i2c_client *client) { struct w83l785ts_data *data = i2c_get_clientdata(client); @@ -284,10 +311,10 @@ || (jiffies - data->last_updated > HZ * 2) || (jiffies < data->last_updated)) { dev_dbg(&client->dev, "Updating w83l785ts data.\n"); - data->temp = i2c_smbus_read_byte_data(client, - W83L785TS_REG_TEMP); - data->temp_over = i2c_smbus_read_byte_data(client, - W83L785TS_REG_TEMP_OVER); + data->temp = w83l785ts_read_value(client, + W83L785TS_REG_TEMP, data->temp); + data->temp_over = w83l785ts_read_value(client, + W83L785TS_REG_TEMP_OVER, data->temp_over); data->last_updated = jiffies; data->valid = 1; diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c --- a/drivers/i2c/i2c-core.c Tue Feb 17 20:00:06 2004 +++ b/drivers/i2c/i2c-core.c Tue Feb 17 20:00:06 2004 @@ -598,7 +598,7 @@ ret = adap->algo->master_xfer(adap,&msg,1); up(&adap->bus_lock); - dev_dbg(&client->dev, "master_recv: return:%d (count:%d, addr:0x%02x)\n", + dev_dbg(&client->adapter->dev, "master_recv: return:%d (count:%d, addr:0x%02x)\n", ret, count, client->addr); /* if everything went ok (i.e. 1 msg transmitted), return #bytes diff -Nru a/drivers/ide/Kconfig b/drivers/ide/Kconfig --- a/drivers/ide/Kconfig Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/Kconfig Tue Feb 17 20:00:06 2004 @@ -511,27 +511,6 @@ Generally say N here. -config IDEDMA_PCI_WIP - bool "ATA Work(s) In Progress (EXPERIMENTAL)" - depends on EXPERIMENTAL - help - If you enable this you will be able to use and test highly - developmental projects. If you say N, the configurator will - simply skip those options. - - It is SAFEST to say N to this question. - -config IDEDMA_NEW_DRIVE_LISTINGS - bool "Good-Bad DMA Model-Firmware (WIP)" - depends on IDEDMA_PCI_WIP - help - If you say Y here, the model and firmware revision of your drive - will be compared against a blacklist of buggy drives that claim to - be (U)DMA capable but aren't. This is a blanket on/off test with no - speed limit options. - - If in doubt, say N. - config BLK_DEV_ADMA bool depends on PCI && BLK_DEV_IDEPCI @@ -630,8 +609,8 @@ DVD II drives, by the manufacturer. config HPT34X_AUTODMA - bool "HPT34X AUTODMA support (WIP)" - depends on BLK_DEV_HPT34X && IDEDMA_PCI_WIP + bool "HPT34X AUTODMA support (EXPERIMENTAL)" + depends on BLK_DEV_HPT34X && EXPERIMENTAL help This is a dangerous thing to attempt currently! Please read the comments at the top of . If you say Y diff -Nru a/drivers/ide/Makefile b/drivers/ide/Makefile --- a/drivers/ide/Makefile Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/Makefile Tue Feb 17 20:00:07 2004 @@ -20,7 +20,7 @@ # Core IDE code - must come before legacy ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o -ide-core-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o +ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o ide-core-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o ide-core-$(CONFIG_PROC_FS) += ide-proc.o ide-core-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o diff -Nru a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c --- a/drivers/ide/arm/icside.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/arm/icside.c Tue Feb 17 20:00:07 2004 @@ -330,72 +330,6 @@ return on; } -/* - * The following is a sick duplication from ide-dma.c ;( - * - * This should be defined in one place only. - */ -struct drive_list_entry { - const char * id_model; - const char * id_firmware; -}; - -static const struct drive_list_entry drive_whitelist [] = { - { "Micropolis 2112A", "ALL" }, - { "CONNER CTMA 4000", "ALL" }, - { "CONNER CTT8000-A", "ALL" }, - { "ST34342A", "ALL" }, - { NULL, NULL } -}; - -static struct drive_list_entry drive_blacklist [] = { - { "WDC AC11000H", "ALL" }, - { "WDC AC22100H", "ALL" }, - { "WDC AC32500H", "ALL" }, - { "WDC AC33100H", "ALL" }, - { "WDC AC31600H", "ALL" }, - { "WDC AC32100H", "24.09P07" }, - { "WDC AC23200L", "21.10N21" }, - { "Compaq CRD-8241B", "ALL" }, - { "CRD-8400B", "ALL" }, - { "CRD-8480B", "ALL" }, - { "CRD-8480C", "ALL" }, - { "CRD-8482B", "ALL" }, - { "CRD-84", "ALL" }, - { "SanDisk SDP3B", "ALL" }, - { "SanDisk SDP3B-64", "ALL" }, - { "SANYO CD-ROM CRD", "ALL" }, - { "HITACHI CDR-8", "ALL" }, - { "HITACHI CDR-8335", "ALL" }, - { "HITACHI CDR-8435", "ALL" }, - { "Toshiba CD-ROM XM-6202B", "ALL" }, - { "CD-532E-A", "ALL" }, - { "E-IDE CD-ROM CR-840", "ALL" }, - { "CD-ROM Drive/F5A", "ALL" }, - { "RICOH CD-R/RW MP7083A", "ALL" }, - { "WPI CDD-820", "ALL" }, - { "SAMSUNG CD-ROM SC-148C", "ALL" }, - { "SAMSUNG CD-ROM SC-148F", "ALL" }, - { "SAMSUNG CD-ROM SC", "ALL" }, - { "SanDisk SDP3B-64", "ALL" }, - { "SAMSUNG CD-ROM SN-124", "ALL" }, - { "PLEXTOR CD-R PX-W8432T", "ALL" }, - { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, - { "_NEC DV5800A", "ALL" }, - { NULL, NULL } -}; - -static int -in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table) -{ - for ( ; drive_table->id_model ; drive_table++) - if ((!strcmp(drive_table->id_model, id->model)) && - ((!strstr(drive_table->id_firmware, id->fw_rev)) || - (!strcmp(drive_table->id_firmware, "ALL")))) - return 1; - return 0; -} - static int icside_dma_host_off(ide_drive_t *drive) { return 0; @@ -407,12 +341,6 @@ return icside_dma_host_off(drive); } -static int icside_dma_off(ide_drive_t *drive) -{ - printk("%s: DMA disabled\n", drive->name); - return icside_dma_off_quietly(drive); -} - static int icside_dma_host_on(ide_drive_t *drive) { return 0; @@ -437,11 +365,8 @@ /* * Consult the list of known "bad" drives */ - if (in_drive_list(id, drive_blacklist)) { - printk("%s: Disabling DMA for %s (blacklisted)\n", - drive->name, id->model); + if (__ide_dma_bad_drive(drive)) goto out; - } /* * Enable DMA on any drive that has multiword DMA @@ -454,7 +379,7 @@ /* * Consult the list of known "good" drives */ - if (in_drive_list(id, drive_whitelist)) { + if (__ide_dma_good_drive(drive)) { if (id->eide_dma_time > 150) goto out; xfer_mode = XFER_MW_DMA_1; @@ -497,11 +422,6 @@ return 0; } -static int icside_dma_count(ide_drive_t *drive) -{ - return icside_dma_begin(drive); -} - /* * dma_intr() is the handler for disk read/write DMA interrupts */ @@ -717,12 +637,10 @@ hwif->ide_dma_check = icside_dma_check; hwif->ide_dma_host_off = icside_dma_host_off; hwif->ide_dma_off_quietly = icside_dma_off_quietly; - hwif->ide_dma_off = icside_dma_off; hwif->ide_dma_host_on = icside_dma_host_on; hwif->ide_dma_on = icside_dma_on; hwif->ide_dma_read = icside_dma_read; hwif->ide_dma_write = icside_dma_write; - hwif->ide_dma_count = icside_dma_count; hwif->ide_dma_begin = icside_dma_begin; hwif->ide_dma_end = icside_dma_end; hwif->ide_dma_test_irq = icside_dma_test_irq; @@ -954,18 +872,10 @@ break; } - if (ret == 0) { + if (ret == 0) ecard_set_drvdata(ec, state); - - /* - * this locks the driver in-core - remove this - * comment and the line below when we can - * safely remove interfaces. - */ - MOD_INC_USE_COUNT; - } else { + else kfree(state); - } out: return ret; } @@ -1048,14 +958,8 @@ return ecard_register_driver(&icside_driver); } -static void __exit icside_exit(void) -{ - ecard_remove_driver(&icside_driver); -} - MODULE_AUTHOR("Russell King "); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("ICS IDE driver"); module_init(icside_init); -module_exit(icside_exit); diff -Nru a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c --- a/drivers/ide/arm/rapide.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/arm/rapide.c Tue Feb 17 20:00:07 2004 @@ -33,14 +33,6 @@ if (ret) ecard_release(ec); - /* - * this locks the driver in-core - remove this - * comment and the two lines below when we can - * safely remove interfaces. - */ - else - MOD_INC_USE_COUNT; - return ret; } @@ -68,13 +60,7 @@ return ecard_register_driver(&rapide_driver); } -static void __exit rapide_exit(void) -{ - ecard_remove_driver(&rapide_driver); -} - MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Yellowstone RAPIDE driver"); module_init(rapide_init); -module_exit(rapide_exit); diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c --- a/drivers/ide/ide-cd.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ide-cd.c Tue Feb 17 20:00:06 2004 @@ -294,10 +294,12 @@ * 4.60 Dec 17, 2003 - Add mt rainier support * - Bump timeout for packet commands, matches sr * - Odd stuff + * 4.61 Jan 22, 2004 - support hardware sector sizes other than 2kB, + * Pascal Schmidt * *************************************************************************/ -#define IDECD_VERSION "4.60" +#define IDECD_VERSION "4.61" #include #include @@ -818,6 +820,14 @@ do_end_request = 1; } else if (sense_key == ILLEGAL_REQUEST || sense_key == DATA_PROTECT) { + /* + * check if this was a write protected media + */ + if (rq_data_dir(rq) == WRITE) { + printk("ide-cd: media marked write protected\n"); + set_disk_ro(drive->disk, 1); + } + /* No point in retrying after an illegal request or data protect error.*/ ide_dump_status (drive, "command error", stat); @@ -1091,7 +1101,7 @@ if (dma) { info->dma = 0; if ((dma_error = HWIF(drive)->ide_dma_end(drive))) - HWIF(drive)->ide_dma_off(drive); + __ide_dma_off(drive); } if (cdrom_decode_status(drive, 0, &stat)) @@ -1211,6 +1221,9 @@ { struct cdrom_info *info = drive->driver_data; struct request *rq = HWGROUP(drive)->rq; + unsigned short sectors_per_frame; + + sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; /* Can't do anything if there's no buffer. */ if (info->buffer == NULL) return 0; @@ -1249,7 +1262,7 @@ will fail. I think that this will never happen, but let's be paranoid and check. */ if (rq->current_nr_sectors < bio_cur_sectors(rq->bio) && - (rq->sector % SECTORS_PER_FRAME) != 0) { + (rq->sector & (sectors_per_frame - 1))) { printk("%s: cdrom_read_from_buffer: buffer botch (%ld)\n", drive->name, (long)rq->sector); cdrom_end_request(drive, 0); @@ -1268,13 +1281,10 @@ static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive) { struct request *rq = HWGROUP(drive)->rq; - int nsect, sector, nframes, frame, nskip; + unsigned short sectors_per_frame; + int nskip; - /* Number of sectors to transfer. */ - nsect = rq->nr_sectors; - - /* Starting sector. */ - sector = rq->sector; + sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; /* If the requested sector doesn't start on a cdrom block boundary, we must adjust the start of the transfer so that it does, @@ -1283,31 +1293,19 @@ of the buffer, it will mean that we're to skip a number of sectors equal to the amount by which CURRENT_NR_SECTORS is larger than the buffer size. */ - nskip = (sector % SECTORS_PER_FRAME); + nskip = rq->sector & (sectors_per_frame - 1); if (nskip > 0) { /* Sanity check... */ if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) && - (rq->sector % CD_FRAMESIZE != 0)) { + (rq->sector & (sectors_per_frame - 1))) { printk ("%s: cdrom_start_read_continuation: buffer botch (%u)\n", drive->name, rq->current_nr_sectors); cdrom_end_request(drive, 0); return ide_stopped; } - sector -= nskip; - nsect += nskip; rq->current_nr_sectors += nskip; } - /* Convert from sectors to cdrom blocks, rounding up the transfer - length if needed. */ - nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME; - frame = sector / SECTORS_PER_FRAME; - - /* Largest number of frames was can transfer at once is 64k-1. For - some drives we need to limit this even more. */ - nframes = MIN (nframes, (CDROM_CONFIG_FLAGS (drive)->limit_nframes) ? - (65534 / CD_FRAMESIZE) : 65535); - /* Set up the command */ rq->timeout = ATAPI_WAIT_PC; @@ -1346,13 +1344,9 @@ static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive) { struct request *rq = HWGROUP(drive)->rq; - int sector, frame, nskip; + sector_t frame = rq->sector; - sector = rq->sector; - nskip = (sector % SECTORS_PER_FRAME); - if (nskip > 0) - sector -= nskip; - frame = sector / SECTORS_PER_FRAME; + sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); memset(rq->cmd, 0, sizeof(rq->cmd)); rq->cmd[0] = GPCMD_SEEK; @@ -1396,6 +1390,9 @@ { struct cdrom_info *info = drive->driver_data; struct request *rq = HWGROUP(drive)->rq; + unsigned short sectors_per_frame; + + sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; /* We may be retrying this request after an error. Fix up any weirdness which might be present in the request packet. */ @@ -1411,10 +1408,9 @@ info->nsectors_buffered = 0; /* use dma, if possible. */ - if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) && - (rq->nr_sectors % SECTORS_PER_FRAME == 0)) - info->dma = 1; - else + info->dma = drive->using_dma; + if ((rq->sector & (sectors_per_frame - 1)) || + (rq->nr_sectors & (sectors_per_frame - 1))) info->dma = 0; info->cmd = READ; @@ -1724,7 +1720,7 @@ if (dma) { if (dma_error) { printk("ide-cd: dma error\n"); - HWIF(drive)->ide_dma_off(drive); + __ide_dma_off(drive); return DRIVER(drive)->error(drive, "dma error", stat); } @@ -1851,7 +1847,7 @@ info->dma = 0; if ((dma_error = HWIF(drive)->ide_dma_end(drive))) { printk("ide-cd: write dma error\n"); - HWIF(drive)->ide_dma_off(drive); + __ide_dma_off(drive); } } @@ -1950,11 +1946,22 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq) { struct cdrom_info *info = drive->driver_data; + struct gendisk *g = drive->disk; + unsigned short sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; /* - * writes *must* be 2kB frame aligned + * writes *must* be hardware frame aligned */ - if ((rq->nr_sectors & 3) || (rq->sector & 3)) { + if ((rq->nr_sectors & (sectors_per_frame - 1)) || + (rq->sector & (sectors_per_frame - 1))) { + cdrom_end_request(drive, 0); + return ide_stopped; + } + + /* + * disk has become write protected + */ + if (g->policy) { cdrom_end_request(drive, 0); return ide_stopped; } @@ -1969,12 +1976,12 @@ info->nsectors_buffered = 0; - /* use dma, if possible. we don't need to check more, since we - * know that the transfer is always (at least!) 2KB aligned */ + /* use dma, if possible. we don't need to check more, since we + * know that the transfer is always (at least!) frame aligned */ info->dma = drive->using_dma ? 1 : 0; info->cmd = WRITE; - /* Start sending the read request to the drive. */ + /* Start sending the write request to the drive. */ return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont); } @@ -2209,6 +2216,7 @@ } static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, + unsigned long *sectors_per_frame, struct request_sense *sense) { struct { @@ -2227,8 +2235,11 @@ req.data_len = sizeof(capbuf); stat = cdrom_queue_packet_command(drive, &req); - if (stat == 0) + if (stat == 0) { *capacity = 1 + be32_to_cpu(capbuf.lba); + *sectors_per_frame = + be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS; + } return stat; } @@ -2270,6 +2281,7 @@ struct atapi_toc_entry ent; } ms_tmp; long last_written; + unsigned long sectors_per_frame = SECTORS_PER_FRAME; if (toc == NULL) { /* Try to allocate space. */ @@ -2289,12 +2301,15 @@ if (CDROM_STATE_FLAGS(drive)->toc_valid) return 0; - /* Try to get the total cdrom capacity. */ - stat = cdrom_read_capacity(drive, &toc->capacity, sense); + /* Try to get the total cdrom capacity and sector size. */ + stat = cdrom_read_capacity(drive, &toc->capacity, §ors_per_frame, + sense); if (stat) toc->capacity = 0x1fffff; - set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME); + set_capacity(drive->disk, toc->capacity * sectors_per_frame); + blk_queue_hardsect_size(drive->queue, + sectors_per_frame << SECTOR_BITS); /* First read just the header, so we know how long the TOC is. */ stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr, @@ -2406,7 +2421,7 @@ stat = cdrom_get_last_written(cdi, &last_written); if (!stat && last_written) { toc->capacity = last_written; - set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME); + set_capacity(drive->disk, toc->capacity * sectors_per_frame); } /* Remember that we've read this stuff. */ @@ -2845,6 +2860,10 @@ static void ide_cdrom_release_real (struct cdrom_device_info *cdi) { + ide_drive_t *drive = cdi->handle; + + if (!cdi->use_count) + CDROM_STATE_FLAGS(drive)->toc_valid = 0; } @@ -3306,12 +3325,12 @@ static sector_t ide_cdrom_capacity (ide_drive_t *drive) { - unsigned long capacity; + unsigned long capacity, sectors_per_frame; - if (cdrom_read_capacity(drive, &capacity, NULL)) + if (cdrom_read_capacity(drive, &capacity, §ors_per_frame, NULL)) return 0; - return capacity * SECTORS_PER_FRAME; + return capacity * sectors_per_frame; } static @@ -3511,7 +3530,7 @@ snprintf(g->devfs_name, sizeof(g->devfs_name), "%s/cd", drive->devfs_name); g->driverfs_dev = &drive->gendev; - g->flags = GENHD_FL_CD; + g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; if (ide_cdrom_setup(drive)) { struct cdrom_device_info *devinfo = &info->devinfo; DRIVER(drive)->busy--; diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c --- a/drivers/ide/ide-disk.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ide-disk.c Tue Feb 17 20:00:06 2004 @@ -470,9 +470,10 @@ } if (rq_data_dir(rq) == READ) { +#ifdef CONFIG_BLK_DEV_IDE_TCQ if (blk_rq_tagged(rq)) - return hwif->ide_dma_queued_read(drive); - + return __ide_dma_queued_read(drive); +#endif if (drive->using_dma && !hwif->ide_dma_read(drive)) return ide_started; @@ -483,10 +484,10 @@ return ide_started; } else if (rq_data_dir(rq) == WRITE) { ide_startstop_t startstop; - +#ifdef CONFIG_BLK_DEV_IDE_TCQ if (blk_rq_tagged(rq)) - return hwif->ide_dma_queued_write(drive); - + return __ide_dma_queued_write(drive); +#endif if (drive->using_dma && !(HWIF(drive)->ide_dma_write(drive))) return ide_started; @@ -1400,13 +1401,10 @@ #ifdef CONFIG_BLK_DEV_IDE_TCQ static int set_using_tcq(ide_drive_t *drive, int arg) { - ide_hwif_t *hwif = HWIF(drive); int ret; if (!drive->driver) return -EPERM; - if (!hwif->ide_dma_queued_on || !hwif->ide_dma_queued_off) - return -ENXIO; if (arg == drive->queue_depth && drive->using_tcq) return 0; @@ -1420,9 +1418,9 @@ } if (arg) - ret = HWIF(drive)->ide_dma_queued_on(drive); + ret = __ide_dma_queued_on(drive); else - ret = HWIF(drive)->ide_dma_queued_off(drive); + ret = __ide_dma_queued_off(drive); return ret ? -EIO : 0; } @@ -1673,7 +1671,7 @@ #ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT if (drive->using_dma) - HWIF(drive)->ide_dma_queued_on(drive); + __ide_dma_queued_on(drive); #endif } diff -Nru a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c --- a/drivers/ide/ide-dma.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/ide-dma.c Tue Feb 17 20:00:07 2004 @@ -90,11 +90,11 @@ #include struct drive_list_entry { - char * id_model; - char * id_firmware; + const char *id_model; + const char *id_firmware; }; -struct drive_list_entry drive_whitelist [] = { +static const struct drive_list_entry drive_whitelist [] = { { "Micropolis 2112A" , "ALL" }, { "CONNER CTMA 4000" , "ALL" }, @@ -103,7 +103,7 @@ { 0 , 0 } }; -struct drive_list_entry drive_blacklist [] = { +static const struct drive_list_entry drive_blacklist [] = { { "WDC AC11000H" , "ALL" }, { "WDC AC22100H" , "ALL" }, @@ -151,7 +151,7 @@ * Returns 1 if the drive is found in the table. */ -static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_table) +static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table) { for ( ; drive_table->id_model ; drive_table++) if ((!strcmp(drive_table->id_model, id->model)) && @@ -161,6 +161,7 @@ return 0; } +#ifdef CONFIG_BLK_DEV_IDEDMA_PCI /** * ide_dma_intr - IDE DMA interrupt handler * @drive: the drive the interrupt is for @@ -412,8 +413,8 @@ if ((id->capability & 1) && hwif->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) - return hwif->ide_dma_off(drive); + if (__ide_dma_bad_drive(drive)) + return __ide_dma_off(drive); /* * Enable DMA on any drive that has @@ -431,7 +432,7 @@ return hwif->ide_dma_on(drive); /* Consult the list of known "good" drives */ - if (hwif->ide_dma_good_drive(drive)) + if (__ide_dma_good_drive(drive)) return hwif->ide_dma_on(drive); } // if (hwif->tuneproc != NULL) hwif->tuneproc(drive, 255); @@ -512,20 +513,21 @@ if (HWIF(drive)->ide_dma_host_off(drive)) return 1; - - HWIF(drive)->ide_dma_queued_off(drive); - +#ifdef CONFIG_BLK_DEV_IDE_TCQ + __ide_dma_queued_off(drive); +#endif return 0; } EXPORT_SYMBOL(__ide_dma_off_quietly); +#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ /** - * __ide_dma_host_off - Generic DMA kill - * @drive: drive to control + * __ide_dma_off - disable DMA on a device + * @drive: drive to disable DMA on * - * Turn off the current DMA on this IDE controller. Inform the - * user that DMA has been disabled. + * Disable IDE DMA for a device on this IDE controller. + * Inform the user that DMA has been disabled. */ int __ide_dma_off (ide_drive_t *drive) @@ -536,6 +538,7 @@ EXPORT_SYMBOL(__ide_dma_off); +#ifdef CONFIG_BLK_DEV_IDEDMA_PCI /** * __ide_dma_host_on - Enable DMA on a host * @drive: drive to enable for DMA @@ -661,7 +664,7 @@ /* issue cmd to drive */ ide_execute_command(drive, command, &ide_dma_intr, 2*WAIT_CMD, dma_timer_expiry); - return HWIF(drive)->ide_dma_count(drive); + return hwif->ide_dma_begin(drive); } EXPORT_SYMBOL(__ide_dma_read); @@ -693,7 +696,7 @@ /* issue cmd to drive */ ide_execute_command(drive, command, &ide_dma_intr, 2*WAIT_CMD, dma_timer_expiry); - return HWIF(drive)->ide_dma_count(drive); + return hwif->ide_dma_begin(drive); } EXPORT_SYMBOL(__ide_dma_write); @@ -764,6 +767,7 @@ } EXPORT_SYMBOL(__ide_dma_test_irq); +#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ int __ide_dma_bad_drive (ide_drive_t *drive) { @@ -771,8 +775,9 @@ int blacklist = in_drive_list(id, drive_blacklist); if (blacklist) { - printk(KERN_WARNING "%s: Disabling (U)DMA for %s\n", drive->name, id->model); - return(blacklist); + printk(KERN_WARNING "%s: Disabling (U)DMA for %s (blacklisted)\n", + drive->name, id->model); + return blacklist; } return 0; } @@ -787,17 +792,7 @@ EXPORT_SYMBOL(__ide_dma_good_drive); -/* - * Used for HOST FIFO counters for VDMA - * PIO over DMA, effective ATA-Bridge operator. - */ -int __ide_dma_count (ide_drive_t *drive) -{ - return HWIF(drive)->ide_dma_begin(drive); -} - -EXPORT_SYMBOL(__ide_dma_count); - +#ifdef CONFIG_BLK_DEV_IDEDMA_PCI int __ide_dma_verbose (ide_drive_t *drive) { struct hd_driveid *id = drive->id; @@ -850,22 +845,6 @@ EXPORT_SYMBOL(__ide_dma_verbose); -/** - * __ide_dma_retune - default retune handler - * @drive: drive to retune - * - * Default behaviour when we decide to return the IDE DMA setup. - * The default behaviour is "we don't" - */ - -int __ide_dma_retune (ide_drive_t *drive) -{ - printk(KERN_WARNING "%s: chipset supported call only\n", __FUNCTION__); - return 1; -} - -EXPORT_SYMBOL(__ide_dma_retune); - int __ide_dma_lostirq (ide_drive_t *drive) { printk("%s: DMA interrupt recovery\n", drive->name); @@ -1072,8 +1051,6 @@ if (!(hwif->dma_prdtable)) hwif->dma_prdtable = (hwif->dma_base + 4); - if (!hwif->ide_dma_off) - hwif->ide_dma_off = &__ide_dma_off; if (!hwif->ide_dma_off_quietly) hwif->ide_dma_off_quietly = &__ide_dma_off_quietly; if (!hwif->ide_dma_host_off) @@ -1088,44 +1065,19 @@ hwif->ide_dma_read = &__ide_dma_read; if (!hwif->ide_dma_write) hwif->ide_dma_write = &__ide_dma_write; - if (!hwif->ide_dma_count) - hwif->ide_dma_count = &__ide_dma_count; if (!hwif->ide_dma_begin) hwif->ide_dma_begin = &__ide_dma_begin; if (!hwif->ide_dma_end) hwif->ide_dma_end = &__ide_dma_end; if (!hwif->ide_dma_test_irq) hwif->ide_dma_test_irq = &__ide_dma_test_irq; - if (!hwif->ide_dma_bad_drive) - hwif->ide_dma_bad_drive = &__ide_dma_bad_drive; - if (!hwif->ide_dma_good_drive) - hwif->ide_dma_good_drive = &__ide_dma_good_drive; if (!hwif->ide_dma_verbose) hwif->ide_dma_verbose = &__ide_dma_verbose; if (!hwif->ide_dma_timeout) hwif->ide_dma_timeout = &__ide_dma_timeout; - if (!hwif->ide_dma_retune) - hwif->ide_dma_retune = &__ide_dma_retune; if (!hwif->ide_dma_lostirq) hwif->ide_dma_lostirq = &__ide_dma_lostirq; - /* - * dma queued ops. if tcq isn't set, queued on and off are just - * dummy functions. cuts down on ifdef hell - */ - if (!hwif->ide_dma_queued_on) - hwif->ide_dma_queued_on = __ide_dma_queued_on; - if (!hwif->ide_dma_queued_off) - hwif->ide_dma_queued_off = __ide_dma_queued_off; -#ifdef CONFIG_BLK_DEV_IDE_TCQ - if (!hwif->ide_dma_queued_read) - hwif->ide_dma_queued_read = __ide_dma_queued_read; - if (!hwif->ide_dma_queued_write) - hwif->ide_dma_queued_write = __ide_dma_queued_write; - if (!hwif->ide_dma_queued_start) - hwif->ide_dma_queued_start = __ide_dma_queued_start; -#endif - if (hwif->chipset != ide_trm290) { u8 dma_stat = hwif->INB(hwif->dma_status); printk(", BIOS settings: %s:%s, %s:%s", @@ -1139,3 +1091,4 @@ } EXPORT_SYMBOL_GPL(ide_setup_dma); +#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c --- a/drivers/ide/ide-floppy.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/ide-floppy.c Tue Feb 17 20:00:07 2004 @@ -830,7 +830,7 @@ if (test_and_clear_bit(PC_DMA_IN_PROGRESS, &pc->flags)) { printk(KERN_ERR "ide-floppy: The floppy wants to issue " "more interrupts in DMA mode\n"); - (void) HWIF(drive)->ide_dma_off(drive); + (void)__ide_dma_off(drive); return ide_do_reset(drive); } @@ -1045,7 +1045,7 @@ bcount.all = min(pc->request_transfer, 63 * 1024); if (test_and_clear_bit(PC_DMA_ERROR, &pc->flags)) { - (void) HWIF(drive)->ide_dma_off(drive); + (void)__ide_dma_off(drive); } feature.all = 0; @@ -1317,6 +1317,7 @@ } header = (idefloppy_mode_parameter_header_t *) pc.buffer; floppy->wp = header->wp; + set_disk_ro(drive->disk, floppy->wp); page = (idefloppy_flexible_disk_page_t *) (header + 1); page->transfer_rate = ntohs(page->transfer_rate); diff -Nru a/drivers/ide/ide-generic.c b/drivers/ide/ide-generic.c --- a/drivers/ide/ide-generic.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/ide-generic.c Tue Feb 17 20:00:07 2004 @@ -14,7 +14,6 @@ static int __init ide_generic_init(void) { - MOD_INC_USE_COUNT; if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET]) ide_get_lock(NULL, NULL); /* for atari only */ diff -Nru a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c --- a/drivers/ide/ide-iops.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ide-iops.c Tue Feb 17 20:00:06 2004 @@ -31,75 +31,6 @@ #include /* - * IDE operator we assign to an unplugged device so that - * we don't trash new hardware assigned the same resources - */ - -static u8 ide_unplugged_inb (unsigned long port) -{ - return 0xFF; -} - -static u16 ide_unplugged_inw (unsigned long port) -{ - return 0xFFFF; -} - -static void ide_unplugged_insw (unsigned long port, void *addr, u32 count) -{ -} - -static u32 ide_unplugged_inl (unsigned long port) -{ - return 0xFFFFFFFF; -} - -static void ide_unplugged_insl (unsigned long port, void *addr, u32 count) -{ -} - -static void ide_unplugged_outb (u8 val, unsigned long port) -{ -} - -static void ide_unplugged_outbsync (ide_drive_t *drive, u8 addr, unsigned long port) -{ -} - -static void ide_unplugged_outw (u16 val, unsigned long port) -{ -} - -static void ide_unplugged_outsw (unsigned long port, void *addr, u32 count) -{ -} - -static void ide_unplugged_outl (u32 val, unsigned long port) -{ -} - -static void ide_unplugged_outsl (unsigned long port, void *addr, u32 count) -{ -} - -void unplugged_hwif_iops (ide_hwif_t *hwif) -{ - hwif->OUTB = ide_unplugged_outb; - hwif->OUTBSYNC = ide_unplugged_outbsync; - hwif->OUTW = ide_unplugged_outw; - hwif->OUTL = ide_unplugged_outl; - hwif->OUTSW = ide_unplugged_outsw; - hwif->OUTSL = ide_unplugged_outsl; - hwif->INB = ide_unplugged_inb; - hwif->INW = ide_unplugged_inw; - hwif->INL = ide_unplugged_inl; - hwif->INSW = ide_unplugged_insw; - hwif->INSL = ide_unplugged_insl; -} - -EXPORT_SYMBOL(unplugged_hwif_iops); - -/* * Conventional PIO operations for ATA devices */ @@ -899,7 +830,8 @@ // ide_delay_50ms(); #if defined(CONFIG_BLK_DEV_IDEDMA) && !defined(CONFIG_DMA_NONPCI) - hwif->ide_dma_host_off(drive); + if (hwif->ide_dma_check) /* check if host supports DMA */ + hwif->ide_dma_host_off(drive); #endif /* (CONFIG_BLK_DEV_IDEDMA) && !(CONFIG_DMA_NONPCI) */ /* @@ -975,10 +907,12 @@ drive->id->dma_1word &= ~0x0F00; #if defined(CONFIG_BLK_DEV_IDEDMA) && !defined(CONFIG_DMA_NONPCI) - if (speed >= XFER_SW_DMA_0) + if (speed >= XFER_SW_DMA_0) { hwif->ide_dma_host_on(drive); - else - hwif->ide_dma_off_quietly(drive); + } else { + if (hwif->ide_dma_check) /* check if host supports DMA */ + hwif->ide_dma_off_quietly(drive); + } #endif /* (CONFIG_BLK_DEV_IDEDMA) && !(CONFIG_DMA_NONPCI) */ switch(speed) { @@ -1191,16 +1125,17 @@ return ide_stopped; } -void check_dma_crc (ide_drive_t *drive) +static void check_dma_crc(ide_drive_t *drive) { +#ifdef CONFIG_BLK_DEV_IDEDMA if (drive->crc_count) { (void) HWIF(drive)->ide_dma_off_quietly(drive); ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive)); if (drive->current_speed >= XFER_SW_DMA_0) (void) HWIF(drive)->ide_dma_on(drive); - } else { - (void) HWIF(drive)->ide_dma_off(drive); - } + } else + (void)__ide_dma_off(drive); +#endif } void pre_reset (ide_drive_t *drive) diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c --- a/drivers/ide/ide-tape.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ide-tape.c Tue Feb 17 20:00:06 2004 @@ -2198,7 +2198,7 @@ printk(KERN_ERR "ide-tape: The tape wants to issue more " "interrupts in DMA mode\n"); printk(KERN_ERR "ide-tape: DMA disabled, reverting to PIO\n"); - (void) HWIF(drive)->ide_dma_off(drive); + (void)__ide_dma_off(drive); return ide_do_reset(drive); } /* Get the number of bytes to transfer on this interrupt. */ @@ -2411,7 +2411,7 @@ if (test_and_clear_bit(PC_DMA_ERROR, &pc->flags)) { printk(KERN_WARNING "ide-tape: DMA disabled, " "reverting to PIO\n"); - (void) HWIF(drive)->ide_dma_off(drive); + (void)__ide_dma_off(drive); } if (test_bit(PC_DMA_RECOMMENDED, &pc->flags) && drive->using_dma) { if (test_bit(PC_WRITING, &pc->flags)) @@ -3212,7 +3212,7 @@ #endif /* IDETAPE_DEBUG_BUGS */ rq->waiting = &wait; tape->waiting = &wait; - spin_unlock(&tape->spinlock); + spin_unlock_irq(&tape->spinlock); wait_for_completion(&wait); /* The stage and its struct request have been deallocated */ tape->waiting = NULL; @@ -6442,12 +6442,12 @@ goto failed; } if (drive->scsi) { - if (strstr(drive->id->model, "OnStream DI-")) { - printk("ide-tape: ide-scsi emulation is not supported for %s.\n", drive->id->model); - } else { - printk("ide-tape: passing drive %s to ide-scsi emulation.\n", drive->name); - goto failed; - } + printk("ide-tape: passing drive %s to ide-scsi emulation.\n", drive->name); + goto failed; + } + if (strstr(drive->id->model, "OnStream DI-")) { + printk(KERN_WARNING "ide-tape: Use drive %s with ide-scsi emulation and osst.\n", drive->name); + printk(KERN_WARNING "ide-tape: OnStream support will be removed soon from ide-tape!\n"); } tape = (idetape_tape_t *) kmalloc (sizeof (idetape_tape_t), GFP_KERNEL); if (tape == NULL) { diff -Nru a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c --- a/drivers/ide/ide-taskfile.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/ide-taskfile.c Tue Feb 17 20:00:05 2004 @@ -200,12 +200,14 @@ if (!hwif->ide_dma_read(drive)) return ide_started; break; +#ifdef CONFIG_BLK_DEV_IDE_TCQ case WIN_READDMA_QUEUED: case WIN_READDMA_QUEUED_EXT: - return hwif->ide_dma_queued_read(drive); + return __ide_dma_queued_read(drive); case WIN_WRITEDMA_QUEUED: case WIN_WRITEDMA_QUEUED_EXT: - return hwif->ide_dma_queued_write(drive); + return __ide_dma_queued_write(drive); +#endif default: if (task->handler == NULL) return ide_stopped; @@ -772,14 +774,20 @@ static u8 wait_drive_not_busy(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); - int retries = 5; + int retries = 100; u8 stat; + /* - * (ks) Last sector was transfered, wait until drive is ready. - * This can take up to 10 usec. We willl wait max 50 us. + * Last sector was transfered, wait until drive is ready. + * This can take up to 10 usec, but we will wait max 1 ms + * (drive_cmd_intr() waits that long). */ while (((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) && retries--) udelay(10); + + if (!retries) + printk(KERN_ERR "%s: drive still BUSY!\n", drive->name); + return stat; } diff -Nru a/drivers/ide/ide-tcq.c b/drivers/ide/ide-tcq.c --- a/drivers/ide/ide-tcq.c Tue Feb 17 20:00:08 2004 +++ b/drivers/ide/ide-tcq.c Tue Feb 17 20:00:08 2004 @@ -353,7 +353,7 @@ */ TCQ_PRINTK("ide_service: starting command, stat=%x\n", stat); spin_unlock_irqrestore(&ide_lock, flags); - return HWIF(drive)->ide_dma_queued_start(drive); + return __ide_dma_queued_start(drive); } printk(KERN_ERR "ide_service: missing request for tag %d\n", tag); @@ -729,7 +729,7 @@ feat = hwif->INB(IDE_NSECTOR_REG); if (!(feat & REL)) { TCQ_PRINTK("IMMED in queued_start, feat=%x\n", feat); - return hwif->ide_dma_queued_start(drive); + return __ide_dma_queued_start(drive); } /* diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c --- a/drivers/ide/ide.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ide.c Tue Feb 17 20:00:06 2004 @@ -197,18 +197,6 @@ EXPORT_SYMBOL(ide_hwifs); -ide_devices_t *idedisk; -ide_devices_t *idecd; -ide_devices_t *idefloppy; -ide_devices_t *idetape; -ide_devices_t *idescsi; - -EXPORT_SYMBOL(idedisk); -EXPORT_SYMBOL(idecd); -EXPORT_SYMBOL(idefloppy); -EXPORT_SYMBOL(idetape); -EXPORT_SYMBOL(idescsi); - extern ide_driver_t idedefault_driver; static void setup_driver_defaults(ide_driver_t *driver); @@ -311,7 +299,9 @@ init_hwif_data(index); /* Add default hw interfaces */ + initializing = 1; ide_init_default_hwifs(); + initializing = 0; idebus_parameter = 0; system_bus_speed = 0; @@ -849,25 +839,13 @@ hwif->ide_dma_end = old_hwif.ide_dma_end; hwif->ide_dma_check = old_hwif.ide_dma_check; hwif->ide_dma_on = old_hwif.ide_dma_on; - hwif->ide_dma_off = old_hwif.ide_dma_off; hwif->ide_dma_off_quietly = old_hwif.ide_dma_off_quietly; hwif->ide_dma_test_irq = old_hwif.ide_dma_test_irq; hwif->ide_dma_host_on = old_hwif.ide_dma_host_on; hwif->ide_dma_host_off = old_hwif.ide_dma_host_off; - hwif->ide_dma_bad_drive = old_hwif.ide_dma_bad_drive; - hwif->ide_dma_good_drive = old_hwif.ide_dma_good_drive; - hwif->ide_dma_count = old_hwif.ide_dma_count; hwif->ide_dma_verbose = old_hwif.ide_dma_verbose; - hwif->ide_dma_retune = old_hwif.ide_dma_retune; hwif->ide_dma_lostirq = old_hwif.ide_dma_lostirq; hwif->ide_dma_timeout = old_hwif.ide_dma_timeout; - hwif->ide_dma_queued_on = old_hwif.ide_dma_queued_on; - hwif->ide_dma_queued_off = old_hwif.ide_dma_queued_off; -#ifdef CONFIG_BLK_DEV_IDE_TCQ - hwif->ide_dma_queued_read = old_hwif.ide_dma_queued_read; - hwif->ide_dma_queued_write = old_hwif.ide_dma_queued_write; - hwif->ide_dma_queued_start = old_hwif.ide_dma_queued_start; -#endif #endif #if 0 @@ -1342,6 +1320,7 @@ static int set_using_dma (ide_drive_t *drive, int arg) { +#ifdef CONFIG_BLK_DEV_IDEDMA if (!drive->id || !(drive->id->capability & 1)) return -EPERM; if (HWIF(drive)->ide_dma_check == NULL) @@ -1350,9 +1329,13 @@ if (HWIF(drive)->ide_dma_check(drive)) return -EIO; if (HWIF(drive)->ide_dma_on(drive)) return -EIO; } else { - if (HWIF(drive)->ide_dma_off(drive)) return -EIO; + if (__ide_dma_off(drive)) + return -EIO; } return 0; +#else + return -EPERM; +#endif } static int set_pio_mode (ide_drive_t *drive, int arg) @@ -1689,7 +1672,7 @@ case CDROMEJECT: case CDROMCLOSETRAY: - return scsi_cmd_ioctl(bdev, cmd, arg); + return scsi_cmd_ioctl(bdev->bd_disk, cmd, arg); case HDIO_GET_BUSSTATE: if (!capable(CAP_SYS_ADMIN)) diff -Nru a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c --- a/drivers/ide/pci/aec62xx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/aec62xx.c Tue Feb 17 20:00:07 2004 @@ -330,7 +330,7 @@ if ((id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -347,7 +347,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -530,7 +530,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -554,13 +553,7 @@ return ide_pci_register_driver(&driver); } -static void aec62xx_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(aec62xx_ide_init); -module_exit(aec62xx_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for ARTOP AEC62xx IDE"); diff -Nru a/drivers/ide/pci/aec62xx.h b/drivers/ide/pci/aec62xx.h --- a/drivers/ide/pci/aec62xx.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/aec62xx.h Tue Feb 17 20:00:07 2004 @@ -78,7 +78,7 @@ static int aec62xx_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t aec62xx_procs[] __initdata = { +static ide_pci_host_proc_t aec62xx_procs[] = { { .name = "aec62xx", .set = 1, diff -Nru a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c --- a/drivers/ide/pci/alim15x3.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/alim15x3.c Tue Feb 17 20:00:06 2004 @@ -516,7 +516,7 @@ if ((id != NULL) && ((id->capability & 1) != 0) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto ata_pio; if ((id->field_valid & 4) && (m5229_revision >= 0xC2)) { if (id->dma_ultra & hwif->ultra_mask) { @@ -533,7 +533,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -868,7 +868,6 @@ d->init_hwif = init_hwif_common_ali15x3; #endif /* CONFIG_SPARC64 */ ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -889,13 +888,7 @@ return ide_pci_register_driver(&driver); } -static void ali15x3_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(ali15x3_ide_init); -module_exit(ali15x3_ide_exit); MODULE_AUTHOR("Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox"); MODULE_DESCRIPTION("PCI driver module for ALi 15x3 IDE"); diff -Nru a/drivers/ide/pci/alim15x3.h b/drivers/ide/pci/alim15x3.h --- a/drivers/ide/pci/alim15x3.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/alim15x3.h Tue Feb 17 20:00:05 2004 @@ -15,7 +15,7 @@ static int ali_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t ali_procs[] __initdata = { +static ide_pci_host_proc_t ali_procs[] = { { .name = "ali", .set = 1, diff -Nru a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c --- a/drivers/ide/pci/amd74xx.c Tue Feb 17 20:00:08 2004 +++ b/drivers/ide/pci/amd74xx.c Tue Feb 17 20:00:08 2004 @@ -448,7 +448,6 @@ if (dev->device != amd_chipset->device) BUG(); if (dev->device != amd_config->id) BUG(); ide_setup_pci_device(dev, amd_chipset); - MOD_INC_USE_COUNT; return 0; } @@ -480,13 +479,7 @@ return ide_pci_register_driver(&driver); } -static void amd74xx_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(amd74xx_ide_init); -module_exit(amd74xx_ide_exit); MODULE_AUTHOR("Vojtech Pavlik"); MODULE_DESCRIPTION("AMD PCI IDE driver"); diff -Nru a/drivers/ide/pci/amd74xx.h b/drivers/ide/pci/amd74xx.h --- a/drivers/ide/pci/amd74xx.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/amd74xx.h Tue Feb 17 20:00:05 2004 @@ -15,7 +15,7 @@ static int amd74xx_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t amd74xx_procs[] __initdata = { +static ide_pci_host_proc_t amd74xx_procs[] = { { .name = "amd74xx", .set = 1, diff -Nru a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c --- a/drivers/ide/pci/cmd64x.c Tue Feb 17 20:00:08 2004 +++ b/drivers/ide/pci/cmd64x.c Tue Feb 17 20:00:08 2004 @@ -459,7 +459,7 @@ if ((id != NULL) && ((id->capability & 1) != 0) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if ((id->field_valid & 4) && cmd64x_ratemask(drive)) { if (id->dma_ultra & hwif->ultra_mask) { @@ -476,7 +476,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -752,7 +752,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -775,13 +774,7 @@ return ide_pci_register_driver(&driver); } -static void cmd64x_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(cmd64x_ide_init); -module_exit(cmd64x_ide_exit); MODULE_AUTHOR("Eddie Dost, David Miller, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for CMD64x IDE"); diff -Nru a/drivers/ide/pci/cmd64x.h b/drivers/ide/pci/cmd64x.h --- a/drivers/ide/pci/cmd64x.h Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/cmd64x.h Tue Feb 17 20:00:06 2004 @@ -69,7 +69,7 @@ static char * print_cmd64x_get_info(char *, struct pci_dev *, int); static int cmd64x_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t cmd64x_procs[] __initdata = { +static ide_pci_host_proc_t cmd64x_procs[] = { { .name = "cmd64x", .set = 1, diff -Nru a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c --- a/drivers/ide/pci/cs5520.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/cs5520.c Tue Feb 17 20:00:05 2004 @@ -291,7 +291,6 @@ probe_hwif_init(&ide_hwifs[index.b.low]); if((index.b.high & 0xf0) != 0xf0) probe_hwif_init(&ide_hwifs[index.b.high]); - MOD_INC_USE_COUNT; return 0; } @@ -312,13 +311,7 @@ return ide_pci_register_driver(&driver); } -static void cs5520_ide_exit(void) -{ - return ide_pci_unregister_driver(&driver); -} - module_init(cs5520_ide_init); -module_exit(cs5520_ide_exit); MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("PCI driver module for Cyrix 5510/5520 IDE"); diff -Nru a/drivers/ide/pci/cs5520.h b/drivers/ide/pci/cs5520.h --- a/drivers/ide/pci/cs5520.h Tue Feb 17 20:00:14 2004 +++ b/drivers/ide/pci/cs5520.h Tue Feb 17 20:00:14 2004 @@ -15,7 +15,7 @@ static int cs5520_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t cs5520_procs[] __initdata = { +static ide_pci_host_proc_t cs5520_procs[] = { { .name = "cs5520", .set = 1, diff -Nru a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c --- a/drivers/ide/pci/cs5530.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/cs5530.c Tue Feb 17 20:00:06 2004 @@ -180,7 +180,7 @@ if (mate->present) { struct hd_driveid *mateid = mate->id; if (mateid && (mateid->capability & 1) && - !hwif->ide_dma_bad_drive(mate)) { + !__ide_dma_bad_drive(mate)) { if ((mateid->field_valid & 4) && (mateid->dma_ultra & 7)) udma_ok = 1; @@ -197,7 +197,7 @@ * selecting UDMA only if the mate said it was ok. */ if (id && (id->capability & 1) && drive->autodma && - !hwif->ide_dma_bad_drive(drive)) { + !__ide_dma_bad_drive(drive)) { if (udma_ok && (id->field_valid & 4) && (id->dma_ultra & 7)) { if (id->dma_ultra & 4) mode = XFER_UDMA_2; @@ -413,7 +413,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -433,13 +432,7 @@ return ide_pci_register_driver(&driver); } -static void cs5530_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(cs5530_ide_init); -module_exit(cs5530_ide_exit); MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Cyrix/NS 5530 IDE"); diff -Nru a/drivers/ide/pci/cs5530.h b/drivers/ide/pci/cs5530.h --- a/drivers/ide/pci/cs5530.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/cs5530.h Tue Feb 17 20:00:05 2004 @@ -15,7 +15,7 @@ static int cs5530_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t cs5530_procs[] __initdata = { +static ide_pci_host_proc_t cs5530_procs[] = { { .name = "cs5530", .set = 1, diff -Nru a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c --- a/drivers/ide/pci/cy82c693.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/cy82c693.c Tue Feb 17 20:00:06 2004 @@ -434,7 +434,6 @@ dev2 = pci_find_slot(dev->bus->number, dev->devfn + 1); ide_setup_pci_devices(dev, dev2, d); } - MOD_INC_USE_COUNT; return 0; } @@ -454,13 +453,7 @@ return ide_pci_register_driver(&driver); } -static void cy82c693_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(cy82c693_ide_init); -module_exit(cy82c693_ide_exit); MODULE_AUTHOR("Andreas Krebs, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for the Cypress CY82C693 IDE"); diff -Nru a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c --- a/drivers/ide/pci/generic.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/generic.c Tue Feb 17 20:00:07 2004 @@ -121,7 +121,6 @@ return 1; } ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -150,13 +149,7 @@ return ide_pci_register_driver(&driver); } -static void generic_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(generic_ide_init); -module_exit(generic_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for generic PCI IDE"); diff -Nru a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c --- a/drivers/ide/pci/hpt34x.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/hpt34x.c Tue Feb 17 20:00:06 2004 @@ -190,7 +190,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -207,7 +207,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -331,7 +331,6 @@ d->bootable = (pcicmd & PCI_COMMAND_MEMORY) ? OFF_BOARD : NEVER_BOARD; ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -351,13 +350,7 @@ return ide_pci_register_driver(&driver); } -static void hpt34x_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(hpt34x_ide_init); -module_exit(hpt34x_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Highpoint 34x IDE"); diff -Nru a/drivers/ide/pci/hpt34x.h b/drivers/ide/pci/hpt34x.h --- a/drivers/ide/pci/hpt34x.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/hpt34x.h Tue Feb 17 20:00:05 2004 @@ -21,7 +21,7 @@ static int hpt34x_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t hpt34x_procs[] __initdata = { +static ide_pci_host_proc_t hpt34x_procs[] = { { .name = "hpt34x", .set = 1, diff -Nru a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c --- a/drivers/ide/pci/hpt366.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/hpt366.c Tue Feb 17 20:00:07 2004 @@ -514,7 +514,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -530,7 +530,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -1220,7 +1220,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -1244,13 +1243,7 @@ return ide_pci_register_driver(&driver); } -static void hpt366_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(hpt366_ide_init); -module_exit(hpt366_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Highpoint HPT366 IDE"); diff -Nru a/drivers/ide/pci/hpt366.h b/drivers/ide/pci/hpt366.h --- a/drivers/ide/pci/hpt366.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/hpt366.h Tue Feb 17 20:00:07 2004 @@ -424,7 +424,7 @@ static int hpt366_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t hpt366_procs[] __initdata = { +static ide_pci_host_proc_t hpt366_procs[] = { { .name = "hpt366", .set = 1, diff -Nru a/drivers/ide/pci/it8172.c b/drivers/ide/pci/it8172.c --- a/drivers/ide/pci/it8172.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/it8172.c Tue Feb 17 20:00:07 2004 @@ -202,7 +202,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -219,7 +219,7 @@ if (!it8172_config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!it8172_config_chipset_for_dma(drive)) @@ -295,7 +295,6 @@ (!((dev->class >> 8) == PCI_CLASS_STORAGE_IDE)))) return 1; /* IT8172 is more than only a IDE controller */ ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -315,13 +314,7 @@ return ide_pci_register_driver(&driver); } -static void it8172_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(it8172_ide_init); -module_exit(it8172_ide_exit); MODULE_AUTHOR("SteveL@mvista.com"); MODULE_DESCRIPTION("PCI driver module for ITE 8172 IDE"); diff -Nru a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c --- a/drivers/ide/pci/ns87415.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/ns87415.c Tue Feb 17 20:00:06 2004 @@ -198,7 +198,7 @@ } if (!using_inta) - hwif->irq = hwif->channel ? 15 : 14; /* legacy mode */ + hwif->irq = ide_default_irq(hwif->io_ports[IDE_DATA_OFFSET]); else if (!hwif->irq && hwif->mate && hwif->mate->irq) hwif->irq = hwif->mate->irq; /* share IRQ with mate */ @@ -225,7 +225,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -245,13 +244,7 @@ return ide_pci_register_driver(&driver); } -static void ns87415_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(ns87415_ide_init); -module_exit(ns87415_ide_exit); MODULE_AUTHOR("Mark Lord, Eddie Dost, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for NS87415 IDE"); diff -Nru a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c --- a/drivers/ide/pci/opti621.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/opti621.c Tue Feb 17 20:00:06 2004 @@ -361,7 +361,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -382,13 +381,7 @@ return ide_pci_register_driver(&driver); } -static void opti621_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(opti621_ide_init); -module_exit(opti621_ide_exit); MODULE_AUTHOR("Jaromir Koutek, Jan Harkes, Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Opti621 IDE"); diff -Nru a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c --- a/drivers/ide/pci/pdc202xx_new.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/pdc202xx_new.c Tue Feb 17 20:00:07 2004 @@ -393,7 +393,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -410,7 +410,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { goto no_dma_set; /* Consult the list of known "good" drives */ @@ -675,7 +675,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -701,13 +700,7 @@ return ide_pci_register_driver(&driver); } -static void pdc202new_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(pdc202new_ide_init); -module_exit(pdc202new_ide_exit); MODULE_AUTHOR("Andre Hedrick, Frank Tiernan"); MODULE_DESCRIPTION("PCI driver module for Promise PDC20268 and higher"); diff -Nru a/drivers/ide/pci/pdc202xx_new.h b/drivers/ide/pci/pdc202xx_new.h --- a/drivers/ide/pci/pdc202xx_new.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/pdc202xx_new.h Tue Feb 17 20:00:05 2004 @@ -172,7 +172,7 @@ static int pdcnew_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t pdcnew_procs[] __initdata = { +static ide_pci_host_proc_t pdcnew_procs[] = { { .name = "pdcnew", .set = 1, diff -Nru a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c --- a/drivers/ide/pci/pdc202xx_old.c Tue Feb 17 20:00:08 2004 +++ b/drivers/ide/pci/pdc202xx_old.c Tue Feb 17 20:00:08 2004 @@ -482,7 +482,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -499,7 +499,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { goto no_dma_set; /* Consult the list of known "good" drives */ @@ -913,7 +913,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -937,13 +936,7 @@ return ide_pci_register_driver(&driver); } -static void pdc202xx_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(pdc202xx_ide_init); -module_exit(pdc202xx_ide_exit); MODULE_AUTHOR("Andre Hedrick, Frank Tiernan"); MODULE_DESCRIPTION("PCI driver module for older Promise IDE"); diff -Nru a/drivers/ide/pci/pdc202xx_old.h b/drivers/ide/pci/pdc202xx_old.h --- a/drivers/ide/pci/pdc202xx_old.h Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/pdc202xx_old.h Tue Feb 17 20:00:05 2004 @@ -207,7 +207,7 @@ static int pdc202xx_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t pdc202xx_procs[] __initdata = { +static ide_pci_host_proc_t pdc202xx_procs[] = { { .name = "pdc202xx", .set = 1, diff -Nru a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c --- a/drivers/ide/pci/piix.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/piix.c Tue Feb 17 20:00:05 2004 @@ -563,7 +563,7 @@ if ((id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -580,7 +580,7 @@ if (!piix_config_drive_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!piix_config_drive_for_dma(drive)) @@ -743,7 +743,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -815,13 +814,7 @@ return ide_pci_register_driver(&driver); } -static void piix_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(piix_ide_init); -module_exit(piix_ide_exit); MODULE_AUTHOR("Andre Hedrick, Andrzej Krzysztofowicz"); MODULE_DESCRIPTION("PCI driver module for Intel PIIX IDE"); diff -Nru a/drivers/ide/pci/piix.h b/drivers/ide/pci/piix.h --- a/drivers/ide/pci/piix.h Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/piix.h Tue Feb 17 20:00:06 2004 @@ -17,7 +17,7 @@ static int piix_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t piix_procs[] __devinitdata = { +static ide_pci_host_proc_t piix_procs[] = { { .name = "piix", .set = 1, diff -Nru a/drivers/ide/pci/rz1000.c b/drivers/ide/pci/rz1000.c --- a/drivers/ide/pci/rz1000.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/rz1000.c Tue Feb 17 20:00:06 2004 @@ -62,7 +62,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -83,13 +82,7 @@ return ide_pci_register_driver(&driver); } -static void rz1000_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(rz1000_ide_init); -module_exit(rz1000_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for RZ1000 IDE"); diff -Nru a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c --- a/drivers/ide/pci/sc1200.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/sc1200.c Tue Feb 17 20:00:07 2004 @@ -164,7 +164,7 @@ */ if (mate->present) { struct hd_driveid *mateid = mate->id; - if (mateid && (mateid->capability & 1) && !hwif->ide_dma_bad_drive(mate)) { + if (mateid && (mateid->capability & 1) && !__ide_dma_bad_drive(mate)) { if ((mateid->field_valid & 4) && (mateid->dma_ultra & 7)) udma_ok = 1; else if ((mateid->field_valid & 2) && (mateid->dma_mword & 7)) @@ -177,7 +177,7 @@ * Now see what the current drive is capable of, * selecting UDMA only if the mate said it was ok. */ - if (id && (id->capability & 1) && hwif->autodma && !hwif->ide_dma_bad_drive(drive)) { + if (id && (id->capability & 1) && hwif->autodma && !__ide_dma_bad_drive(drive)) { if (udma_ok && (id->field_valid & 4) && (id->dma_ultra & 7)) { if (id->dma_ultra & 4) mode = XFER_UDMA_2; @@ -420,7 +420,7 @@ ss = kmalloc(sizeof(sc1200_saved_state_t), GFP_KERNEL); if (ss == NULL) return -ENOMEM; - (sc1200_saved_state_t *)hwif->config_data = ss; + hwif->config_data = (unsigned long)ss; } ss = (sc1200_saved_state_t *)hwif->config_data; // @@ -493,7 +493,7 @@ // for (d = 0; d < MAX_DRIVES; ++d) { ide_drive_t *drive = &(hwif->drives[d]); - if (drive->present && !hwif->ide_dma_bad_drive(drive)) { + if (drive->present && !__ide_dma_bad_drive(drive)) { int was_using_dma = drive->using_dma; hwif->ide_dma_off_quietly(drive); sc1200_config_dma(drive); @@ -554,7 +554,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -576,13 +575,7 @@ return ide_pci_register_driver(&driver); } -static void sc1200_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(sc1200_ide_init); -module_exit(sc1200_ide_exit); MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for NS SC1200 IDE"); diff -Nru a/drivers/ide/pci/sc1200.h b/drivers/ide/pci/sc1200.h --- a/drivers/ide/pci/sc1200.h Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/sc1200.h Tue Feb 17 20:00:06 2004 @@ -15,7 +15,7 @@ static int sc1200_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t sc1200_procs[] __initdata = { +static ide_pci_host_proc_t sc1200_procs[] = { { .name = "sc1200", .set = 1, diff -Nru a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c --- a/drivers/ide/pci/serverworks.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/serverworks.c Tue Feb 17 20:00:05 2004 @@ -464,7 +464,7 @@ if ((id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -481,7 +481,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -801,7 +801,6 @@ if (dev->device != d->device) BUG(); d->init_setup(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -828,13 +827,7 @@ return ide_pci_register_driver(&driver); } -static void svwks_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(svwks_ide_init); -module_exit(svwks_ide_exit); MODULE_AUTHOR("Michael Aubry. Andrzej Krzysztofowicz, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Serverworks OSB4/CSB5/CSB6 IDE"); diff -Nru a/drivers/ide/pci/serverworks.h b/drivers/ide/pci/serverworks.h --- a/drivers/ide/pci/serverworks.h Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/serverworks.h Tue Feb 17 20:00:06 2004 @@ -31,7 +31,7 @@ static int svwks_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t svwks_procs[] __initdata = { +static ide_pci_host_proc_t svwks_procs[] = { { .name = "svwks", .set = 1, diff -Nru a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c --- a/drivers/ide/pci/sgiioc4.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/sgiioc4.c Tue Feb 17 20:00:07 2004 @@ -303,14 +303,6 @@ } static int -sgiioc4_ide_dma_off(ide_drive_t * drive) -{ - printk(KERN_INFO "%s: DMA disabled\n", drive->name); - - return HWIF(drive)->ide_dma_off_quietly(drive); -} - -static int sgiioc4_ide_dma_off_quietly(ide_drive_t * drive) { drive->using_dma = 0; @@ -644,16 +636,11 @@ hwif->ide_dma_end = &sgiioc4_ide_dma_end; hwif->ide_dma_check = &sgiioc4_ide_dma_check; hwif->ide_dma_on = &sgiioc4_ide_dma_on; - hwif->ide_dma_off = &sgiioc4_ide_dma_off; hwif->ide_dma_off_quietly = &sgiioc4_ide_dma_off_quietly; hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq; hwif->ide_dma_host_on = &sgiioc4_ide_dma_host_on; hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off; - hwif->ide_dma_bad_drive = &__ide_dma_bad_drive; - hwif->ide_dma_good_drive = &__ide_dma_good_drive; - hwif->ide_dma_count = &__ide_dma_count; hwif->ide_dma_verbose = &sgiioc4_ide_dma_verbose; - hwif->ide_dma_retune = &__ide_dma_retune; hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq; hwif->ide_dma_timeout = &__ide_dma_timeout; hwif->INB = &sgiioc4_INB; @@ -795,8 +782,6 @@ if (pci_init_sgiioc4(dev, d)) return 0; - MOD_INC_USE_COUNT; - return 0; } @@ -818,14 +803,7 @@ return ide_pci_register_driver(&driver); } -static void -sgiioc4_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(sgiioc4_ide_init); -module_exit(sgiioc4_ide_exit); MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)"); MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card"); diff -Nru a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c --- a/drivers/ide/pci/siimage.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/siimage.c Tue Feb 17 20:00:06 2004 @@ -490,7 +490,7 @@ if ((id->capability & 1) != 0 && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if ((id->field_valid & 4) && siimage_ratemask(drive)) { @@ -508,7 +508,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -545,6 +545,7 @@ return 0; } +#if 0 /** * siimage_mmio_ide_dma_count - DMA bytes done * @drive @@ -572,6 +573,7 @@ #endif /* SIIMAGE_VIRTUAL_DMAPIO */ return __ide_dma_count(drive); } +#endif /** * siimage_mmio_ide_dma_test_irq - check we caused an IRQ @@ -1133,7 +1135,6 @@ hwif->udma_four = ata66_siimage(hwif); if (hwif->mmio) { - hwif->ide_dma_count = &siimage_mmio_ide_dma_count; hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq; hwif->ide_dma_verbose = &siimage_mmio_ide_dma_verbose; } else { @@ -1168,7 +1169,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -1190,13 +1190,7 @@ return ide_pci_register_driver(&driver); } -static void siimage_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(siimage_ide_init); -module_exit(siimage_ide_exit); MODULE_AUTHOR("Andre Hedrick, Alan Cox"); MODULE_DESCRIPTION("PCI driver module for SiI IDE"); diff -Nru a/drivers/ide/pci/siimage.h b/drivers/ide/pci/siimage.h --- a/drivers/ide/pci/siimage.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/siimage.h Tue Feb 17 20:00:07 2004 @@ -31,7 +31,7 @@ static u8 siimage_proc; -static ide_pci_host_proc_t siimage_procs[] __initdata = { +static ide_pci_host_proc_t siimage_procs[] = { { .name = "siimage", .set = 1, diff -Nru a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c --- a/drivers/ide/pci/sis5513.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/sis5513.c Tue Feb 17 20:00:07 2004 @@ -671,7 +671,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { if (id->dma_ultra & hwif->ultra_mask) { @@ -688,7 +688,7 @@ if (!config_chipset_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!config_chipset_for_dma(drive)) @@ -953,7 +953,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -973,13 +972,7 @@ return ide_pci_register_driver(&driver); } -static void sis5513_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(sis5513_ide_init); -module_exit(sis5513_ide_exit); MODULE_AUTHOR("Lionel Bouton, L C Chang, Andre Hedrick, Vojtech Pavlik"); MODULE_DESCRIPTION("PCI driver module for SIS IDE"); diff -Nru a/drivers/ide/pci/sis5513.h b/drivers/ide/pci/sis5513.h --- a/drivers/ide/pci/sis5513.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/sis5513.h Tue Feb 17 20:00:07 2004 @@ -15,7 +15,7 @@ static int sis_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t sis_procs[] __initdata = { +static ide_pci_host_proc_t sis_procs[] = { { .name = "sis", .set = 1, diff -Nru a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c --- a/drivers/ide/pci/sl82c105.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/sl82c105.c Tue Feb 17 20:00:06 2004 @@ -158,7 +158,7 @@ break; /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) break; if (id->field_valid & 2) { @@ -167,7 +167,7 @@ return hwif->ide_dma_on(drive); } - if (hwif->ide_dma_good_drive(drive)) + if (__ide_dma_good_drive(drive)) return hwif->ide_dma_on(drive); } while (0); @@ -272,22 +272,6 @@ return __ide_dma_on(drive); } -static int sl82c105_ide_dma_off (ide_drive_t *drive) -{ - u8 speed = XFER_PIO_0; - int rc; - - DBG(("sl82c105_ide_dma_off(drive:%s)\n", drive->name)); - - rc = __ide_dma_off(drive); - if (drive->pio_speed) - speed = drive->pio_speed - XFER_PIO_0; - config_for_pio(drive, speed, 0, 1); - drive->current_speed = drive->pio_speed; - - return rc; -} - static int sl82c105_ide_dma_off_quietly (ide_drive_t *drive) { u8 speed = XFER_PIO_0; @@ -485,7 +469,6 @@ #ifdef CONFIG_BLK_DEV_IDEDMA hwif->ide_dma_check = &sl82c105_check_drive; hwif->ide_dma_on = &sl82c105_ide_dma_on; - hwif->ide_dma_off = &sl82c105_ide_dma_off; hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly; hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq; hwif->ide_dma_begin = &sl82c105_ide_dma_begin; @@ -506,7 +489,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -526,13 +508,7 @@ return ide_pci_register_driver(&driver); } -static void sl82c105_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(sl82c105_ide_init); -module_exit(sl82c105_ide_exit); MODULE_DESCRIPTION("PCI driver module for W82C105 IDE"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c --- a/drivers/ide/pci/slc90e66.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/slc90e66.c Tue Feb 17 20:00:07 2004 @@ -275,7 +275,7 @@ if (id && (id->capability & 1) && drive->autodma) { /* Consult the list of known "bad" drives */ - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto fast_ata_pio; if (id->field_valid & 4) { @@ -293,7 +293,7 @@ if (!slc90e66_config_drive_for_dma(drive)) goto no_dma_set; } - } else if (hwif->ide_dma_good_drive(drive) && + } else if (__ide_dma_good_drive(drive) && (id->eide_dma_time < 150)) { /* Consult the list of known "good" drives */ if (!slc90e66_config_drive_for_dma(drive)) @@ -373,7 +373,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -393,13 +392,7 @@ return ide_pci_register_driver(&driver); } -static void slc90e66_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(slc90e66_ide_init); -module_exit(slc90e66_ide_exit); MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for SLC90E66 IDE"); diff -Nru a/drivers/ide/pci/slc90e66.h b/drivers/ide/pci/slc90e66.h --- a/drivers/ide/pci/slc90e66.h Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/slc90e66.h Tue Feb 17 20:00:06 2004 @@ -17,7 +17,7 @@ static int slc90e66_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t slc90e66_procs[] __initdata = { +static ide_pci_host_proc_t slc90e66_procs[] = { { .name = "slc90e66", .set = 1, diff -Nru a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c --- a/drivers/ide/pci/triflex.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/triflex.c Tue Feb 17 20:00:06 2004 @@ -45,6 +45,7 @@ static struct pci_dev *triflex_dev; +#ifdef CONFIG_PROC_FS static int triflex_get_info(char *buf, char **addr, off_t offset, int count) { char *p = buf; @@ -91,6 +92,7 @@ return len > count ? count : len; } +#endif static int triflex_tune_chipset(ide_drive_t *drive, u8 xferspeed) { @@ -171,7 +173,7 @@ struct hd_driveid *id = drive->id; if (id && (id->capability & 1) && drive->autodma) { - if (hwif->ide_dma_bad_drive(drive)) + if (__ide_dma_bad_drive(drive)) goto tune_pio; if (id->field_valid & 2) { if ((id->dma_mword & hwif->mwdma_mask) || @@ -224,7 +226,6 @@ ide_setup_pci_device(dev, d); triflex_dev = dev; - MOD_INC_USE_COUNT; return 0; } @@ -240,13 +241,7 @@ return ide_pci_register_driver(&driver); } -static void triflex_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(triflex_ide_init); -module_exit(triflex_ide_exit); MODULE_AUTHOR("Torben Mathiasen"); MODULE_DESCRIPTION("PCI driver module for Compaq Triflex IDE"); diff -Nru a/drivers/ide/pci/triflex.h b/drivers/ide/pci/triflex.h --- a/drivers/ide/pci/triflex.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/triflex.h Tue Feb 17 20:00:07 2004 @@ -14,8 +14,16 @@ static unsigned int __devinit init_chipset_triflex(struct pci_dev *, const char *); static void init_hwif_triflex(ide_hwif_t *); +#ifdef CONFIG_PROC_FS static int triflex_get_info(char *, char **, off_t, int); +static ide_pci_host_proc_t triflex_proc = { + .name = "triflex", + .set = 1, + .get_info = triflex_get_info, +}; +#endif + static ide_pci_device_t triflex_devices[] __devinitdata = { { .vendor = PCI_VENDOR_ID_COMPAQ, @@ -32,14 +40,6 @@ .bootable = EOL, } }; - -#ifdef CONFIG_PROC_FS -static ide_pci_host_proc_t triflex_proc __initdata = { - .name = "triflex", - .set = 1, - .get_info = triflex_get_info, -}; -#endif static struct pci_device_id triflex_pci_tbl[] = { { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_TRIFLEX_IDE, PCI_ANY_ID, diff -Nru a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c --- a/drivers/ide/pci/trm290.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/pci/trm290.c Tue Feb 17 20:00:06 2004 @@ -225,7 +225,7 @@ #endif /* issue cmd to drive */ hwif->OUTB(command, IDE_COMMAND_REG); - return HWIF(drive)->ide_dma_count(drive); + return hwif->ide_dma_begin(drive); } static int trm290_ide_dma_read (ide_drive_t *drive /*, struct request *rq */) @@ -269,7 +269,7 @@ #endif /* issue cmd to drive */ hwif->OUTB(command, IDE_COMMAND_REG); - return HWIF(drive)->ide_dma_count(drive); + return hwif->ide_dma_begin(drive); } static int trm290_ide_dma_begin (ide_drive_t *drive) @@ -403,7 +403,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -423,13 +422,7 @@ return ide_pci_register_driver(&driver); } -static void trm290_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(trm290_ide_init); -module_exit(trm290_ide_exit); MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Tekram TRM290 IDE"); diff -Nru a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c --- a/drivers/ide/pci/via82cxxx.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ide/pci/via82cxxx.c Tue Feb 17 20:00:05 2004 @@ -615,7 +615,6 @@ if (dev->device != d->device) BUG(); ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; return 0; } @@ -636,13 +635,7 @@ return ide_pci_register_driver(&driver); } -static void via_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - module_init(via_ide_init); -module_exit(via_ide_exit); MODULE_AUTHOR("Vojtech Pavlik, Michel Aubry, Jeff Garzik, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for VIA IDE"); diff -Nru a/drivers/ide/pci/via82cxxx.h b/drivers/ide/pci/via82cxxx.h --- a/drivers/ide/pci/via82cxxx.h Tue Feb 17 20:00:07 2004 +++ b/drivers/ide/pci/via82cxxx.h Tue Feb 17 20:00:07 2004 @@ -15,7 +15,7 @@ static int via_get_info(char *, char **, off_t, int); -static ide_pci_host_proc_t via_procs[] __initdata = { +static ide_pci_host_proc_t via_procs[] = { { .name = "via", .set = 1, diff -Nru a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c --- a/drivers/ide/ppc/pmac.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/ppc/pmac.c Tue Feb 17 20:00:06 2004 @@ -39,13 +39,16 @@ #include #include #include -#include #include #include #include #include #include +#ifndef CONFIG_PPC64 +#include +#endif + #include "ide-timing.h" extern void ide_do_request(ide_hwgroup_t *hwgroup, int masked_irq); @@ -69,7 +72,7 @@ #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC /* Those fields are duplicating what is in hwif. We currently * can't use the hwif ones because of some assumptions that are - * being done by the generic code about the kind of dma controller + * beeing done by the generic code about the kind of dma controller * and format of the dma table. This will have to be fixed though. */ volatile struct dbdma_regs* dma_regs; @@ -90,15 +93,17 @@ controller_heathrow, /* Heathrow/Paddington */ controller_kl_ata3, /* KeyLargo ATA-3 */ controller_kl_ata4, /* KeyLargo ATA-4 */ - controller_un_ata6 /* UniNorth2 ATA-6 */ + controller_un_ata6, /* UniNorth2 ATA-6 */ + controller_k2_ata6 /* K2 ATA-6 */ }; static const char* model_name[] = { "OHare ATA", /* OHare based */ "Heathrow ATA", /* Heathrow/Paddington */ - "KeyLargo ATA-3", /* KeyLargo ATA-3 */ - "KeyLargo ATA-4", /* KeyLargo ATA-4 */ - "UniNorth ATA-6" /* UniNorth2 ATA-6 */ + "KeyLargo ATA-3", /* KeyLargo ATA-3 (MDMA only) */ + "KeyLargo ATA-4", /* KeyLargo ATA-4 (UDMA/66) */ + "UniNorth ATA-6", /* UniNorth2 ATA-6 (UDMA/100) */ + "K2 ATA-6", /* K2 ATA-6 (UDMA/100) */ }; /* @@ -336,16 +341,19 @@ /* allow up to 256 DBDMA commands per xfer */ #define MAX_DCMDS 256 -/* Wait 2s for disk to answer on IDE bus after - * enable operation. - * NOTE: There is at least one case I know of a disk that needs about 10sec - * before anwering on the bus. I beleive we could add a kernel command - * line arg to override this delay for such cases. - * - * NOTE2: This has to be fixed with a BSY wait loop. I'm working on adding - * that to the generic probe code. +/* + * Wait 1s for disk to answer on IDE bus after a hard reset + * of the device (via GPIO/FCR). + * + * Some devices seem to "pollute" the bus even after dropping + * the BSY bit (typically some combo drives slave on the UDMA + * bus) after a hard reset. Since we hard reset all drives on + * KeyLargo ATA66, we have to keep that delay around. I may end + * up not hard resetting anymore on these and keep the delay only + * for older interfaces instead (we have to reset when coming + * from MacOS...) --BenH. */ -#define IDE_WAKEUP_DELAY_MS 2000 +#define IDE_WAKEUP_DELAY (1*HZ) static void pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif); static int pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq); @@ -357,9 +365,16 @@ #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ +/* + * Below is the code for blinking the laptop LED along with hard + * disk activity. + */ + #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK -/* Set to 50ms */ +/* Set to 50ms minimum led-on time (also used to limit frequency + * of requests sent to the PMU + */ #define PMU_HD_BLINK_TIME (HZ/50) static struct adb_request pmu_blink_on, pmu_blink_off; @@ -402,6 +417,7 @@ pmu_blink_stoptime = jiffies + PMU_HD_BLINK_TIME; wmb(); mod_timer(&pmu_blink_timer, pmu_blink_stoptime); + /* Fast path when LED is already ON */ if (pmu_blink_ledstate == 1) return; spin_lock_irqsave(&pmu_blink_lock, flags); @@ -418,6 +434,11 @@ struct device_node *dt; const char *model; + /* Currently, I only enable this feature on KeyLargo based laptops, + * older laptops may support it (at least heathrow/paddington) but + * I don't feel like loading those venerable old machines with so + * much additional interrupt & PMU activity... + */ if (pmu_get_model() != PMU_KEYLARGO_BASED) return 0; @@ -476,9 +497,11 @@ *irq = pmac_ide[ix].irq; } -/* Setup timings for the selected drive (master/slave). I still need to verify if this - * is enough, I beleive selectproc will be called whenever an IDE command is started, - * but... */ +/* + * Apply the timings of the proper unit (master/slave) to the shared + * timing register when selecting that unit. This version is for + * ASICs with a single timing register + */ static void __pmac pmac_ide_selectproc(ide_drive_t *drive) { @@ -496,6 +519,11 @@ (void)readl((unsigned *)(IDE_DATA_REG+IDE_TIMING_CONFIG)); } +/* + * Apply the timings of the proper unit (master/slave) to the shared + * timing register when selecting that unit. This version is for + * ASICs with a dual timing register (Kauai) + */ static void __pmac pmac_ide_kauai_selectproc(ide_drive_t *drive) { @@ -518,6 +546,9 @@ (void)readl((unsigned *)(IDE_DATA_REG + IDE_KAUAI_PIO_CONFIG)); } +/* + * Force an update of controller timing values for a given drive + */ static void __pmac pmac_ide_do_update_timings(ide_drive_t *drive) { @@ -526,12 +557,29 @@ if (pmif == NULL) return; - if (pmif->kind == controller_un_ata6) + if (pmif->kind == controller_un_ata6 || pmif->kind == controller_k2_ata6) pmac_ide_kauai_selectproc(drive); else pmac_ide_selectproc(drive); } +static void +pmac_outbsync(ide_drive_t *drive, u8 value, unsigned long port) +{ + u32 tmp; + + writeb(value, port); + tmp = readl((unsigned *)(IDE_DATA_REG + IDE_TIMING_CONFIG)); +} + +/* + * Send the SET_FEATURE IDE command to the drive and update drive->id with + * the new state. We currently don't use the generic routine as it used to + * cause various trouble, especially with older mediabays. + * This code is sometimes triggering a spurrious interrupt though, I need + * to sort that out sooner or later and see if I can finally get the + * common version to work properly in all cases + */ static int __pmac pmac_ide_do_setfeature(ide_drive_t *drive, u8 command) { @@ -606,7 +654,9 @@ return result; } -/* Calculate PIO timings */ +/* + * Old tuning functions (called on hdparm -p), sets up drive PIO timings + */ static void __pmac pmac_ide_tuneproc(ide_drive_t *drive, u8 pio) { @@ -625,7 +675,8 @@ pio = ide_get_best_pio_mode(drive, pio, 4, &d); switch (pmif->kind) { - case controller_un_ata6: { + case controller_un_ata6: + case controller_k2_ata6: { /* 100Mhz cell */ u32 tr = kauai_lookup_timing(kauai_pio_timings, d.cycle_time); if (tr == 0) @@ -685,6 +736,10 @@ } #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC + +/* + * Calculate KeyLargo ATA/66 UDMA timings + */ static int __pmac set_timings_udma_ata4(u32 *timings, u8 speed) { @@ -710,6 +765,9 @@ return 0; } +/* + * Calculate Kauai ATA/100 UDMA timings + */ static int __pmac set_timings_udma_ata6(u32 *pio_timings, u32 *ultra_timings, u8 speed) { @@ -727,6 +785,9 @@ return 0; } +/* + * Calculate MDMA timings for all cells + */ static int __pmac set_timings_mdma(ide_drive_t *drive, int intf_type, u32 *timings, u32 *timings2, u8 speed, int drive_cycle_time) @@ -753,6 +814,7 @@ /* Get the proper timing array for this controller */ switch(intf_type) { case controller_un_ata6: + case controller_k2_ata6: break; case controller_kl_ata4: tm = mdma_timings_66; @@ -784,7 +846,8 @@ #endif } switch(intf_type) { - case controller_un_ata6: { + case controller_un_ata6: + case controller_k2_ata6: { /* 100Mhz cell */ u32 tr = kauai_lookup_timing(kauai_mdma_timings, cycleTime); if (tr == 0) @@ -854,8 +917,12 @@ } #endif /* #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC */ -/* You may notice we don't use this function on normal operation, - * our, normal mdma function is supposed to be more precise +/* + * Speedproc. This function is called by the core to set any of the standard + * timing (PIO, MDMA or UDMA) to both the drive and the controller. + * You may notice we don't use this function on normal "dma check" operation, + * our dedicated function is more precise as it uses the drive provided + * cycle time value. We should probably fix this one to deal with that too... */ static int __pmac pmac_ide_tune_chipset (ide_drive_t *drive, byte speed) @@ -874,7 +941,8 @@ switch(speed) { #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC case XFER_UDMA_5: - if (pmif->kind != controller_un_ata6) + if (pmif->kind != controller_un_ata6 && + pmif->kind != controller_k2_ata6) return 1; case XFER_UDMA_4: case XFER_UDMA_3: @@ -885,7 +953,8 @@ case XFER_UDMA_0: if (pmif->kind == controller_kl_ata4) ret = set_timings_udma_ata4(timings, speed); - else if (pmif->kind == controller_un_ata6) + else if (pmif->kind == controller_un_ata6 + || pmif->kind == controller_k2_ata6) ret = set_timings_udma_ata6(timings, timings2, speed); else ret = 1; @@ -923,6 +992,10 @@ return 0; } +/* + * Blast some well known "safe" values to the timing registers at init or + * wakeup from sleep time, before we do real calculation + */ static void __pmac sanitize_timings(pmac_ide_hwif_t *pmif) { @@ -930,6 +1003,7 @@ switch(pmif->kind) { case controller_un_ata6: + case controller_k2_ata6: value = 0x08618a92; value2 = 0x00002921; break; @@ -1052,9 +1126,11 @@ if (!pmif->mediabay) { ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, pmif->node, pmif->aapl_bus_id, 1); - mdelay(10); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 0); - mdelay(100); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(IDE_WAKEUP_DELAY); } /* Sanitize drive timings */ @@ -1063,6 +1139,13 @@ return 0; } +/* + * Setup, register & probe an IDE channel driven by this driver, this is + * called by one of the 2 probe functions (macio or PCI). Note that a channel + * that ends up beeing free of any device is not kept around by this driver + * (it is kept in 2.4). This introduce an interface numbering change on some + * rare machines unfortunately, but it's better this way. + */ static int pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) { @@ -1073,6 +1156,8 @@ pmif->broken_dma = pmif->broken_dma_warn = 0; if (device_is_compatible(np, "kauai-ata")) pmif->kind = controller_un_ata6; + else if (device_is_compatible(np, "K2-UATA")) + pmif->kind = controller_k2_ata6; else if (device_is_compatible(np, "keylargo-ata")) { if (strcmp(np->name, "ata-4") == 0) pmif->kind = controller_kl_ata4; @@ -1089,7 +1174,8 @@ pmif->aapl_bus_id = bidp ? *bidp : 0; /* Get cable type from device-tree */ - if (pmif->kind == controller_kl_ata4 || pmif->kind == controller_un_ata6) { + if (pmif->kind == controller_kl_ata4 || pmif->kind == controller_un_ata6 + || pmif->kind == controller_k2_ata6) { char* cable = get_property(np, "cable-type", NULL); if (cable && !strncmp(cable, "80-", 3)) pmif->cable_80 = 1; @@ -1100,6 +1186,7 @@ /* Make sure we have sane timings */ sanitize_timings(pmif); +#ifndef CONFIG_PPC64 /* XXX FIXME: Media bay stuff need re-organizing */ if (np->parent && np->parent->name && strcasecmp(np->parent->name, "media-bay") == 0) { @@ -1115,17 +1202,22 @@ * units, I keep the old way */ ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, np, 0, 1); - } else { + } else +#endif + { /* This is necessary to enable IDE when net-booting */ ppc_md.feature_call(PMAC_FTR_IDE_RESET, np, pmif->aapl_bus_id, 1); ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, np, pmif->aapl_bus_id, 1); - mdelay(10); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); ppc_md.feature_call(PMAC_FTR_IDE_RESET, np, pmif->aapl_bus_id, 0); - mdelay(100); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(IDE_WAKEUP_DELAY); } /* Setup MMIO ops */ default_hwif_mmiops(hwif); + hwif->OUTBSYNC = pmac_outbsync; /* Tell common code _not_ to mess with resources */ hwif->mmio = 2; @@ -1139,7 +1231,7 @@ hwif->drives[0].unmask = 1; hwif->drives[1].unmask = 1; hwif->tuneproc = pmac_ide_tuneproc; - if (pmif->kind == controller_un_ata6) + if (pmif->kind == controller_un_ata6 || pmif->kind == controller_k2_ata6) hwif->selectproc = pmac_ide_kauai_selectproc; else hwif->selectproc = pmac_ide_selectproc; @@ -1152,9 +1244,9 @@ hwif->led_act = pmu_hd_kick_blink; #endif - printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s\n", - hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, - pmif->mediabay ? " (mediabay)" : ""); + printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", + hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, + pmif->mediabay ? " (mediabay)" : "", hwif->irq); #ifdef CONFIG_PMAC_PBOOK if (pmif->mediabay && check_media_bay_by_base(pmif->regbase, MB_CD) == 0) @@ -1187,6 +1279,9 @@ return 0; } +/* + * Attach to a macio probed interface + */ static int __devinit pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_match *match) { @@ -1215,17 +1310,8 @@ return -ENXIO; } - /* - * Some older OFs have bogus sizes, causing request_OF_resource - * to fail. We fix them up here - */ - if (mdev->ofdev.node->addrs[0].size > 0x1000) - mdev->ofdev.node->addrs[0].size = 0x1000; - if (mdev->ofdev.node->n_addrs > 1 && mdev->ofdev.node->addrs[1].size > 0x100) - mdev->ofdev.node->addrs[1].size = 0x100; - /* Request memory resource for IO ports */ - if (request_OF_resource(mdev->ofdev.node, 0, " (mac-io ata ports)") == NULL) { + if (macio_request_resource(mdev, 0, "ide-pmac (ports)")) { printk(KERN_ERR "ide%d: can't request mmio resource !\n", i); return -EBUSY; } @@ -1235,14 +1321,14 @@ * fixes in irq.c. That works well enough for the single case * where that happens though... */ - if (mdev->ofdev.node->n_intrs == 0) { + if (macio_irq_count(mdev) == 0) { printk(KERN_WARNING "ide%d: no intrs for device %s, using 13\n", i, mdev->ofdev.node->full_name); irq = 13; } else - irq = mdev->ofdev.node->intrs[0].line; + irq = macio_irq(mdev, 0); - base = (unsigned long) ioremap(mdev->ofdev.node->addrs[0].address, 0x400); + base = (unsigned long)ioremap(macio_resource_start(mdev, 0), 0x400); regbase = base; hwif->pci_dev = mdev->bus->pdev; @@ -1253,10 +1339,13 @@ pmif->regbase = regbase; pmif->irq = irq; #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC - if (mdev->ofdev.node->n_addrs >= 2) - pmif->dma_regs = (volatile struct dbdma_regs*) - ioremap(mdev->ofdev.node->addrs[1].address, 0x1000); - else + if (macio_resource_count(mdev) >= 2) { + if (macio_request_resource(mdev, 1, "ide-pmac (dma)")) + printk(KERN_WARNING "ide%d: can't request DMA resource !\n", i); + else + pmif->dma_regs = (volatile struct dbdma_regs*) + ioremap(macio_resource_start(mdev, 1), 0x1000); + } else pmif->dma_regs = NULL; #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ dev_set_drvdata(&mdev->ofdev.dev, hwif); @@ -1269,7 +1358,9 @@ if (pmif->dma_regs) iounmap((void *)pmif->dma_regs); memset(pmif, 0, sizeof(*pmif)); - release_OF_resource(mdev->ofdev.node, 0); + macio_release_resource(mdev, 0); + if (pmif->dma_regs) + macio_release_resource(mdev, 1); } return rc; @@ -1305,6 +1396,9 @@ return rc; } +/* + * Attach to a PCI probed interface + */ static int __devinit pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -1359,7 +1453,12 @@ #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC pmif->dma_regs = (volatile struct dbdma_regs*)(base + 0x1000); #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ - pmif->irq = pdev->irq; + + /* We use the OF node irq mapping */ + if (np->n_intrs == 0) + pmif->irq = pdev->irq; + else + pmif->irq = np->intrs[0].line; pci_set_drvdata(pdev, hwif); @@ -1439,8 +1538,10 @@ .resume = pmac_ide_macio_resume, }; -static struct pci_device_id pmac_ide_pci_match[] __devinitdata = { - { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_KAUAI_ATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, +static struct pci_device_id pmac_ide_pci_match[] = { + { PCI_VENDOR_ID_APPLE, PCI_DEVIEC_ID_APPLE_UNI_N_ATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, }; static struct pci_driver pmac_ide_pci_driver = { @@ -1468,6 +1569,11 @@ #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC +/* + * This is very close to the generic ide-dma version of the function except + * that we don't use the fields in the hwif but our own copies for sg_table + * and friends. We build & map the sglist for a given request + */ static int __pmac pmac_ide_build_sglist(ide_drive_t *drive, struct request *rq) { @@ -1489,6 +1595,9 @@ return pci_map_sg(hwif->pci_dev, sg, nents, pmif->sg_dma_direction); } +/* + * Same as above but for a "raw" taskfile request + */ static int __pmac pmac_ide_raw_build_sglist(ide_drive_t *drive, struct request *rq) { @@ -1630,7 +1739,9 @@ } } -/* Calculate MultiWord DMA timings */ +/* + * Pick up best MDMA timing for the drive and apply it + */ static int __pmac pmac_ide_mdma_enable(ide_drive_t *drive, u16 mode) { @@ -1685,7 +1796,9 @@ return 1; } -/* Calculate Ultra DMA timings */ +/* + * Pick up best UDMA timing for the drive and apply it + */ static int __pmac pmac_ide_udma_enable(ide_drive_t *drive, u16 mode) { @@ -1704,7 +1817,7 @@ timing_local[1] = *timings2; /* Calculate timings for interface */ - if (pmif->kind == controller_un_ata6) + if (pmif->kind == controller_un_ata6 || pmif->kind == controller_k2_ata6) ret = set_timings_udma_ata6( &timing_local[0], &timing_local[1], mode); @@ -1733,6 +1846,10 @@ return 1; } +/* + * Check what is the best DMA timing setting for the drive and + * call appropriate functions to apply it. + */ static int __pmac pmac_ide_dma_check(ide_drive_t *drive) { @@ -1754,11 +1871,13 @@ short mode; map = XFER_MWDMA; - if (pmif->kind == controller_kl_ata4 || pmif->kind == controller_un_ata6) { + if (pmif->kind == controller_kl_ata4 || pmif->kind == controller_un_ata6 + || pmif->kind == controller_k2_ata6) { map |= XFER_UDMA; if (pmif->cable_80) { map |= XFER_UDMA_66; - if (pmif->kind == controller_un_ata6) + if (pmif->kind == controller_un_ata6 || + pmif->kind == controller_k2_ata6) map |= XFER_UDMA_100; } } @@ -1774,6 +1893,10 @@ return 0; } +/* + * Prepare a DMA transfer. We build the DMA table, adjust the timings for + * a read on KeyLargo ATA/66 and mark us as waiting for DMA completion + */ static int __pmac pmac_ide_dma_start(ide_drive_t *drive, int reading) { @@ -1802,6 +1925,9 @@ return 0; } +/* + * Start a DMA READ command + */ static int __pmac pmac_ide_dma_read(ide_drive_t *drive) { @@ -1831,6 +1957,9 @@ return pmac_ide_dma_begin(drive); } +/* + * Start a DMA WRITE command + */ static int __pmac pmac_ide_dma_write (ide_drive_t *drive) { @@ -1859,12 +1988,10 @@ return pmac_ide_dma_begin(drive); } -static int __pmac -pmac_ide_dma_count (ide_drive_t *drive) -{ - return HWIF(drive)->ide_dma_begin(drive); -} - +/* + * Kick the DMA controller into life after the DMA command has been issued + * to the drive. + */ static int __pmac pmac_ide_dma_begin (ide_drive_t *drive) { @@ -1881,6 +2008,9 @@ return 0; } +/* + * After a DMA transfer, make sure the controller is stopped + */ static int __pmac pmac_ide_dma_end (ide_drive_t *drive) { @@ -1900,6 +2030,12 @@ return (dstat & (RUN|DEAD|ACTIVE)) != RUN; } +/* + * Check out that the interrupt we got was for us. We can't always know this + * for sure with those Apple interfaces (well, we could on the recent ones but + * that's not implemented yet), on the other hand, we don't have shared interrupts + * so it's not really a problem + */ static int __pmac pmac_ide_dma_test_irq (ide_drive_t *drive) { @@ -1982,6 +2118,10 @@ return 0; } +/* + * Allocate the data structures needed for using DMA with an interface + * and fill the proper list of functions pointers + */ static void __init pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) { @@ -2013,31 +2153,19 @@ pmif->dma_table_cpu, pmif->dma_table_dma); return; } - hwif->ide_dma_off = &__ide_dma_off; hwif->ide_dma_off_quietly = &__ide_dma_off_quietly; hwif->ide_dma_on = &__ide_dma_on; hwif->ide_dma_check = &pmac_ide_dma_check; hwif->ide_dma_read = &pmac_ide_dma_read; hwif->ide_dma_write = &pmac_ide_dma_write; - hwif->ide_dma_count = &pmac_ide_dma_count; hwif->ide_dma_begin = &pmac_ide_dma_begin; hwif->ide_dma_end = &pmac_ide_dma_end; hwif->ide_dma_test_irq = &pmac_ide_dma_test_irq; hwif->ide_dma_host_off = &pmac_ide_dma_host_off; hwif->ide_dma_host_on = &pmac_ide_dma_host_on; - hwif->ide_dma_good_drive = &__ide_dma_good_drive; - hwif->ide_dma_bad_drive = &__ide_dma_bad_drive; hwif->ide_dma_verbose = &__ide_dma_verbose; hwif->ide_dma_timeout = &__ide_dma_timeout; - hwif->ide_dma_retune = &__ide_dma_retune; hwif->ide_dma_lostirq = &pmac_ide_dma_lostirq; - hwif->ide_dma_queued_on = &__ide_dma_queued_on; - hwif->ide_dma_queued_off = &__ide_dma_queued_off; -#ifdef CONFIG_BLK_DEV_IDE_TCQ - hwif->ide_dma_queued_read = __ide_dma_queued_read; - hwif->ide_dma_queued_write = __ide_dma_queued_write; - hwif->ide_dma_queued_start = __ide_dma_queued_start; -#endif #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO if (!noautodma) @@ -2049,6 +2177,7 @@ hwif->atapi_dma = 1; switch(pmif->kind) { case controller_un_ata6: + case controller_k2_ata6: hwif->ultra_mask = pmif->cable_80 ? 0x3f : 0x07; hwif->mwdma_mask = 0x07; hwif->swdma_mask = 0x00; diff -Nru a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c --- a/drivers/ide/setup-pci.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ide/setup-pci.c Tue Feb 17 20:00:06 2004 @@ -150,6 +150,8 @@ return 0; } +#ifdef CONFIG_BLK_DEV_IDEDMA_PCI + #ifdef CONFIG_BLK_DEV_IDEDMA_FORCED /* * Long lost data from 2.0.34 that is now in 2.0.39 @@ -279,6 +281,7 @@ } return dma_base; } +#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ void ide_setup_pci_noise (struct pci_dev *dev, ide_pci_device_t *d) { diff -Nru a/drivers/ieee1394/amdtp.c b/drivers/ieee1394/amdtp.c --- a/drivers/ieee1394/amdtp.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ieee1394/amdtp.c Tue Feb 17 20:00:07 2004 @@ -1308,7 +1308,6 @@ hpsb_unregister_highlevel(&amdtp_highlevel); devfs_remove("amdtp"); - cdev_unmap(IEEE1394_AMDTP_DEV, 16); cdev_del(&amdtp_cdev); HPSB_INFO("Unloaded AMDTP driver"); diff -Nru a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c --- a/drivers/ieee1394/dv1394.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ieee1394/dv1394.c Tue Feb 17 20:00:07 2004 @@ -2609,7 +2609,6 @@ hpsb_unregister_protocol(&dv1394_driver); hpsb_unregister_highlevel(&dv1394_highlevel); - cdev_unmap(IEEE1394_DV1394_DEV, 16); cdev_del(&dv1394_cdev); devfs_remove("ieee1394/dv"); } diff -Nru a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c --- a/drivers/ieee1394/eth1394.c Tue Feb 17 20:00:07 2004 +++ b/drivers/ieee1394/eth1394.c Tue Feb 17 20:00:07 2004 @@ -395,8 +395,8 @@ } } -/* This function is called by register_netdev */ -static int ether1394_init_dev (struct net_device *dev) +/* This function is called right before register_netdev */ +static void ether1394_init_dev (struct net_device *dev) { /* Our functions */ dev->open = ether1394_open; @@ -423,8 +423,6 @@ dev->type = ARPHRD_IEEE1394; ether1394_reset_priv (dev, 1); - - return 0; } /* @@ -461,8 +459,6 @@ SET_MODULE_OWNER(dev); - dev->init = ether1394_init_dev; - priv = (struct eth1394_priv *)dev->priv; spin_lock_init(&priv->lock); @@ -483,6 +479,8 @@ goto out; } + ether1394_init_dev(dev); + if (register_netdev (dev)) { ETH1394_PRINT (KERN_ERR, dev->name, "Error registering network driver\n"); goto out; @@ -507,7 +505,7 @@ out: if (dev != NULL) - kfree(dev); + free_netdev(dev); if (hi) hpsb_destroy_hostinfo(ð1394_highlevel, host); diff -Nru a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c --- a/drivers/ieee1394/highlevel.c Tue Feb 17 20:00:08 2004 +++ b/drivers/ieee1394/highlevel.c Tue Feb 17 20:00:08 2004 @@ -521,7 +521,7 @@ rcode = RCODE_TYPE_ERROR; } - (u8 *)data += partlength; + data += partlength; length -= partlength; addr += partlength; @@ -567,7 +567,7 @@ rcode = RCODE_TYPE_ERROR; } - (u8 *)data += partlength; + data += partlength; length -= partlength; addr += partlength; diff -Nru a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c --- a/drivers/ieee1394/raw1394.c Tue Feb 17 20:00:05 2004 +++ b/drivers/ieee1394/raw1394.c Tue Feb 17 20:00:05 2004 @@ -2682,7 +2682,6 @@ static void __exit cleanup_raw1394(void) { hpsb_unregister_protocol(&raw1394_driver); - cdev_unmap(IEEE1394_RAW1394_DEV, 1); cdev_del(&raw1394_cdev); devfs_remove(RAW1394_DEVICE_NAME); hpsb_unregister_highlevel(&raw1394_highlevel); diff -Nru a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c --- a/drivers/ieee1394/video1394.c Tue Feb 17 20:00:06 2004 +++ b/drivers/ieee1394/video1394.c Tue Feb 17 20:00:06 2004 @@ -1447,7 +1447,6 @@ hpsb_unregister_highlevel(&video1394_highlevel); devfs_remove(VIDEO1394_DRIVER_NAME); - cdev_unmap(IEEE1394_VIDEO1394_DEV, 16); cdev_del(&video1394_cdev); PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module"); diff -Nru a/drivers/input/evdev.c b/drivers/input/evdev.c --- a/drivers/input/evdev.c Tue Feb 17 20:00:07 2004 +++ b/drivers/input/evdev.c Tue Feb 17 20:00:07 2004 @@ -209,7 +209,7 @@ struct evdev *evdev = list->evdev; struct input_dev *dev = evdev->handle.dev; struct input_absinfo abs; - int i, t, u, v; + int t, u, v; if (!evdev->exist) return -ENODEV; @@ -231,10 +231,8 @@ if (get_user(t, ((int *) arg) + 0)) return -EFAULT; if (t < 0 || t > dev->keycodemax || !dev->keycodesize) return -EINVAL; if (get_user(v, ((int *) arg) + 1)) return -EFAULT; - u = INPUT_KEYCODE(dev, t); - INPUT_KEYCODE(dev, t) = v; - for (i = 0; i < dev->keycodemax; i++) if (v == u) break; - if (i == dev->keycodemax) clear_bit(u, dev->keybit); + u = SET_INPUT_KEYCODE(dev, t, v); + clear_bit(u, dev->keybit); set_bit(v, dev->keybit); return 0; diff -Nru a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c --- a/drivers/input/joystick/db9.c Tue Feb 17 20:00:06 2004 +++ b/drivers/input/joystick/db9.c Tue Feb 17 20:00:06 2004 @@ -531,9 +531,7 @@ return NULL; } - for (pp = parport_enumerate(); pp && (config[0] > 0); pp = pp->next) - config[0]--; - + pp = parport_find_number(config[0]); if (!pp) { printk(KERN_ERR "db9.c: no such parport\n"); return NULL; @@ -542,12 +540,15 @@ if (db9_bidirectional[config[1]]) { if (!(pp->modes & PARPORT_MODE_TRISTATE)) { printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); + parport_put_port(pp); return NULL; } } - if (!(db9 = kmalloc(sizeof(struct db9), GFP_KERNEL))) + if (!(db9 = kmalloc(sizeof(struct db9), GFP_KERNEL))) { + parport_put_port(pp); return NULL; + } memset(db9, 0, sizeof(struct db9)); db9->mode = config[1]; @@ -556,6 +557,7 @@ db9->timer.function = db9_timer; db9->pd = parport_register_device(pp, "db9", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + parport_put_port(pp); if (!db9->pd) { printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n"); diff -Nru a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c --- a/drivers/input/joystick/gamecon.c Tue Feb 17 20:00:14 2004 +++ b/drivers/input/joystick/gamecon.c Tue Feb 17 20:00:14 2004 @@ -478,19 +478,22 @@ if (config[0] < 0) return NULL; - for (pp = parport_enumerate(); pp && (config[0] > 0); pp = pp->next) - config[0]--; + pp = parport_find_number(config[0]); if (!pp) { printk(KERN_ERR "gamecon.c: no such parport\n"); return NULL; } - if (!(gc = kmalloc(sizeof(struct gc), GFP_KERNEL))) + if (!(gc = kmalloc(sizeof(struct gc), GFP_KERNEL))) { + parport_put_port(pp); return NULL; + } memset(gc, 0, sizeof(struct gc)); gc->pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + + parport_put_port(pp); if (!gc->pd) { printk(KERN_ERR "gamecon.c: parport busy already - lp.o loaded?\n"); diff -Nru a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c --- a/drivers/input/joystick/turbografx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/input/joystick/turbografx.c Tue Feb 17 20:00:07 2004 @@ -142,19 +142,22 @@ if (config[0] < 0) return NULL; - for (pp = parport_enumerate(); pp && (config[0] > 0); pp = pp->next) - config[0]--; + pp = parport_find_number(config[0]); if (!pp) { printk(KERN_ERR "turbografx.c: no such parport\n"); return NULL; } - if (!(tgfx = kmalloc(sizeof(struct tgfx), GFP_KERNEL))) + if (!(tgfx = kmalloc(sizeof(struct tgfx), GFP_KERNEL))) { + parport_put_port(pp); return NULL; + } memset(tgfx, 0, sizeof(struct tgfx)); tgfx->pd = parport_register_device(pp, "turbografx", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + + parport_put_port(pp); if (!tgfx->pd) { printk(KERN_ERR "turbografx.c: parport busy already - lp.o loaded?\n"); diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c --- a/drivers/input/serio/i8042.c Tue Feb 17 20:00:05 2004 +++ b/drivers/input/serio/i8042.c Tue Feb 17 20:00:05 2004 @@ -375,13 +375,14 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; - unsigned char str, data; + unsigned char str, data = 0; unsigned int dfl; int ret; spin_lock_irqsave(&i8042_lock, flags); str = i8042_read_status(); - data = i8042_read_data(); + if (str & I8042_STR_OBF) + data = i8042_read_data(); spin_unlock_irqrestore(&i8042_lock, flags); if (~str & I8042_STR_OBF) { diff -Nru a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c --- a/drivers/input/serio/parkbd.c Tue Feb 17 20:00:05 2004 +++ b/drivers/input/serio/parkbd.c Tue Feb 17 20:00:05 2004 @@ -151,7 +151,7 @@ return -ENODEV; } - for (pp = parport_enumerate(); pp != NULL && (parkbd > 0); pp = pp->next) parkbd--; + pp = parport_find_number(parkbd); if (pp == NULL) { printk(KERN_ERR "parkbd: no such parport\n"); @@ -159,6 +159,7 @@ } parkbd_dev = parport_register_device(pp, "parkbd", NULL, NULL, parkbd_interrupt, PARPORT_DEV_EXCL, NULL); + parport_put_port(pp); if (!parkbd_dev) return -ENODEV; diff -Nru a/drivers/isdn/hardware/eicon/divasmain.c b/drivers/isdn/hardware/eicon/divasmain.c --- a/drivers/isdn/hardware/eicon/divasmain.c Tue Feb 17 20:00:06 2004 +++ b/drivers/isdn/hardware/eicon/divasmain.c Tue Feb 17 20:00:06 2004 @@ -1,4 +1,4 @@ -/* $Id: divasmain.c,v 1.46 2003/10/10 12:28:14 armin Exp $ +/* $Id: divasmain.c,v 1.47 2004/02/03 16:03:01 armin Exp $ * * Low level driver for Eicon DIVA Server ISDN cards. * @@ -41,7 +41,7 @@ #include "diva_dma.h" #include "diva_pci.h" -static char *main_revision = "$Revision: 1.46 $"; +static char *main_revision = "$Revision: 1.47 $"; static int major; @@ -594,7 +594,6 @@ int diva_os_cancel_soft_isr(diva_os_soft_isr_t * psoft_isr) { - flush_scheduled_work(); return (0); } diff -Nru a/drivers/isdn/hisax/hisax_hfcpci.c b/drivers/isdn/hisax/hisax_hfcpci.c --- a/drivers/isdn/hisax/hisax_hfcpci.c Tue Feb 17 20:00:06 2004 +++ b/drivers/isdn/hisax/hisax_hfcpci.c Tue Feb 17 20:00:06 2004 @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "hisax_hfcpci.h" // debugging cruft diff -Nru a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/macintosh/Kconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,156 @@ + +menu "Macintosh device drivers" + +# we want to change this to something like CONFIG_SYSCTRL_CUDA/PMU +config ADB_CUDA + bool "Support for CUDA based PowerMacs" + depends on PPC_PMAC && !PPC_PMAC64 + help + This provides support for CUDA based Power Macintosh systems. This + includes most OldWorld PowerMacs, the first generation iMacs, the + Blue&White G3 and the "Yikes" G4 (PCI Graphics). All later models + should use CONFIG_ADB_PMU instead. It is safe to say Y here even if + your machine doesn't have a CUDA. + + If unsure say Y. + +config ADB_PMU + bool "Support for PMU based PowerMacs" + depends on PPC_PMAC + help + On PowerBooks, iBooks, and recent iMacs and Power Macintoshes, the + PMU is an embedded microprocessor whose primary function is to + control system power, and battery charging on the portable models. + The PMU also controls the ADB (Apple Desktop Bus) which connects to + the keyboard and mouse on some machines, as well as the non-volatile + RAM and the RTC (real time clock) chip. Say Y to enable support for + this device; you should do so if your machine is one of those + mentioned above. + +config PMAC_PBOOK + bool "Power management support for PowerBooks" + depends on ADB_PMU + ---help--- + This provides support for putting a PowerBook to sleep; it also + enables media bay support. Power management works on the + PB2400/3400/3500, Wallstreet, Lombard, and Bronze PowerBook G3 and + the Titanium Powerbook G4, as well as the iBooks. You should get + the power management daemon, pmud, to make it work and you must have + the /dev/pmu device (see the pmud README). + + Get pmud from . + + If you have a PowerBook, you should say Y here. + + You may also want to compile the dma sound driver as a module and + have it autoloaded. The act of removing the module shuts down the + sound hardware for more power savings. + +config PM + bool + depends on PPC_PMAC && ADB_PMU && PMAC_PBOOK + default y + +config PMAC_APM_EMU + tristate "APM emulation" + depends on PMAC_PBOOK + +# made a separate option since backlight may end up beeing used +# on non-powerbook machines (but only on PMU based ones AFAIK) +config PMAC_BACKLIGHT + bool "Backlight control for LCD screens" + depends on ADB_PMU + help + Say Y here to build in code to manage the LCD backlight on a + Macintosh PowerBook. With this code, the backlight will be turned + on and off appropriately on power-management and lid-open/lid-closed + events; also, the PowerBook button device will be enabled so you can + change the screen brightness. + +config MAC_FLOPPY + bool "Support for PowerMac floppy" + depends on PPC_PMAC && !PPC_PMAC64 + help + If you have a SWIM-3 (Super Woz Integrated Machine 3; from Apple) + floppy controller, say Y here. Most commonly found in PowerMacs. + +config MAC_SERIAL + tristate "Support for PowerMac serial ports (OBSOLETE DRIVER)" + depends on PPC_PMAC + help + This driver is obsolete. Use CONFIG_SERIAL_PMACZILOG in + "Character devices --> Serial drivers --> PowerMac z85c30" option. + +config ADB + bool "Apple Desktop Bus (ADB) support" + depends on PPC_PMAC + help + Apple Desktop Bus (ADB) support is for support of devices which + are connected to an ADB port. ADB devices tend to have 4 pins. + If you have an Apple Macintosh prior to the iMac, an iBook or + PowerBook, or a "Blue and White G3", you probably want to say Y + here. Otherwise say N. + +config ADB_MACIO + bool "Include MacIO (CHRP) ADB driver" + depends on ADB && PPC_PMAC && !PPC_PMAC64 + help + Say Y here to include direct support for the ADB controller in the + Hydra chip used on PowerPC Macintoshes of the CHRP type. (The Hydra + also includes a MESH II SCSI controller, DBDMA controller, VIA chip, + OpenPIC controller and two RS422/Geoports.) + +config INPUT_ADBHID + bool "Support for ADB input devices (keyboard, mice, ...)" + depends on ADB && INPUT=y + help + Say Y here if you want to have ADB (Apple Desktop Bus) HID devices + such as keyboards, mice, joysticks, trackpads or graphic tablets + handled by the input layer. If you say Y here, make sure to say Y to + the corresponding drivers "Keyboard support" (CONFIG_INPUT_KEYBDEV), + "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface + support" (CONFIG_INPUT_EVDEV) as well. + + If unsure, say Y. + +config MAC_EMUMOUSEBTN + bool "Support for mouse button 2+3 emulation" + depends on INPUT_ADBHID + help + This provides generic support for emulating the 2nd and 3rd mouse + button with keypresses. If you say Y here, the emulation is still + disabled by default. The emulation is controlled by these sysctl + entries: + /proc/sys/dev/mac_hid/mouse_button_emulation + /proc/sys/dev/mac_hid/mouse_button2_keycode + /proc/sys/dev/mac_hid/mouse_button3_keycode + + If you have an Apple machine with a 1-button mouse, say Y here. + +config THERM_WINDTUNNEL + tristate "Support for thermal management on Windtunnel G4s" + depends on I2C && I2C_KEYWEST && PPC_PMAC && !PPC_PMAC64 + help + This driver provides some thermostat and fan control for the desktop + G4 "Windtunnel" + +config THERM_ADT7467 + tristate "Support for thermal mgmnt on laptops with ADT 7467 chipset" + depends on I2C && I2C_KEYWEST && PPC_PMAC && !PPC_PMAC64 + help + This driver provides some thermostat and fan control for the + iBook G4, and the ATI based aluminium PowerBooks, allowing slighlty + better fan behaviour by default, and some manual control. + +config THERM_PM72 + tristate "Support for thermal management on PowerMac G5" + depends on I2C && I2C_KEYWEST && PPC_PMAC64 + help + This driver provides thermostat and fan control for the desktop + G5 machines. + +config ANSLCD + bool "Support for ANS LCD display" + depends on ADB_CUDA + +endmenu diff -Nru a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile --- a/drivers/macintosh/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/macintosh/Makefile Tue Feb 17 20:00:08 2004 @@ -8,9 +8,6 @@ obj-$(CONFIG_PMAC_PBOOK) += mediabay.o obj-$(CONFIG_MAC_SERIAL) += macserial.o -ifneq ($(CONFIG_MAC),y) - obj-$(CONFIG_NVRAM) += nvram.o -endif obj-$(CONFIG_MAC_EMUMOUSEBTN) += mac_hid.o obj-$(CONFIG_INPUT_ADBHID) += adbhid.o obj-$(CONFIG_ANSLCD) += ans-lcd.o @@ -25,3 +22,7 @@ obj-$(CONFIG_ADB_IOP) += adb-iop.o obj-$(CONFIG_ADB_PMU68K) += via-pmu68k.o obj-$(CONFIG_ADB_MACIO) += macio-adb.o + +obj-$(CONFIG_THERM_PM72) += therm_pm72.o +obj-$(CONFIG_THERM_WINDTUNNEL) += therm_windtunnel.o +obj-$(CONFIG_THERM_ADT7467) += therm_adt7467.o diff -Nru a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c --- a/drivers/macintosh/adb.c Tue Feb 17 20:00:14 2004 +++ b/drivers/macintosh/adb.c Tue Feb 17 20:00:14 2004 @@ -40,9 +40,9 @@ #include #ifdef CONFIG_PPC #include -#include #endif + EXPORT_SYMBOL(adb_controller); EXPORT_SYMBOL(adb_client_list); @@ -83,6 +83,7 @@ static DECLARE_MUTEX(adb_probe_mutex); static struct completion adb_probe_task_comp; static int sleepy_trackpad; +static int autopoll_devs; int __adb_probe_sync; #ifdef CONFIG_PMAC_PBOOK @@ -289,7 +290,7 @@ struct adb_driver *driver; int i; -#ifdef CONFIG_PPC +#ifdef CONFIG_PPC32 if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) return 0; #endif @@ -379,7 +380,7 @@ static int do_adb_reset_bus(void) { - int ret, nret, devs; + int ret, nret; if (adb_controller == NULL) return -ENXIO; @@ -390,7 +391,7 @@ nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL); if (nret & NOTIFY_STOP_MASK) { if (adb_controller->autopoll) - adb_controller->autopoll(devs); + adb_controller->autopoll(autopoll_devs); return -EBUSY; } @@ -416,9 +417,9 @@ } if (!ret) { - devs = adb_scan_bus(); + autopoll_devs = adb_scan_bus(); if (adb_controller->autopoll) - adb_controller->autopoll(devs); + adb_controller->autopoll(autopoll_devs); } up(&adb_handler_sem); diff -Nru a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c --- a/drivers/macintosh/adbhid.c Tue Feb 17 20:00:14 2004 +++ b/drivers/macintosh/adbhid.c Tue Feb 17 20:00:14 2004 @@ -30,6 +30,8 @@ * To do: * * Improve Kensington support. + * Split mouse/kbd + * Move to syfs */ #include @@ -63,6 +65,15 @@ .notifier_call = adb_message_handler, }; +/* Some special keys */ +#define ADB_KEY_DEL 0x33 +#define ADB_KEY_CMD 0x37 +#define ADB_KEY_CAPSLOCK 0x39 +#define ADB_KEY_FN 0x3f +#define ADB_KEY_FWDEL 0x75 +#define ADB_KEY_POWER_OLD 0x7e +#define ADB_KEY_POWER 0x7f + unsigned char adb_to_linux_keycodes[128] = { 30, 31, 32, 33, 35, 34, 44, 45, 46, 47, 86, 48, 16, 17, 18, 19, 21, 20, 2, 3, 4, 5, 7, 6, 13, 10, 8, 12, 9, 11, 27, 24, @@ -84,8 +95,13 @@ unsigned char *keycode; char name[64]; char phys[32]; + int flags; }; +#define FLAG_FN_KEY_PRESSED 0x00000001 +#define FLAG_POWER_FROM_FN 0x00000002 +#define FLAG_EMU_FWDEL_DOWN 0x00000004 + static struct adbhid *adbhid[16] = { 0 }; static void adbhid_probe(void); @@ -148,28 +164,64 @@ static void adbhid_input_keycode(int id, int keycode, int repeat, struct pt_regs *regs) { + struct adbhid *ahid = adbhid[id]; int up_flag; up_flag = (keycode & 0x80); keycode &= 0x7f; switch (keycode) { - case 0x39: /* Generate down/up events for CapsLock everytime. */ - input_regs(&adbhid[id]->input, regs); - input_report_key(&adbhid[id]->input, KEY_CAPSLOCK, 1); - input_report_key(&adbhid[id]->input, KEY_CAPSLOCK, 0); - input_sync(&adbhid[id]->input); - return; - case 0x3f: /* ignore Powerbook Fn key */ + case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */ + input_regs(&ahid->input, regs); + input_report_key(&ahid->input, KEY_CAPSLOCK, 1); + input_report_key(&ahid->input, KEY_CAPSLOCK, 0); + input_sync(&ahid->input); return; #ifdef CONFIG_PPC_PMAC - case 0x7e: /* Power key on PBook 3400 needs remapping */ + case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */ switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL, PMAC_MB_INFO_MODEL, 0)) { case PMAC_TYPE_COMET: case PMAC_TYPE_HOOPER: case PMAC_TYPE_KANGA: - keycode = 0x7f; + keycode = ADB_KEY_POWER; + } + break; + case ADB_KEY_POWER: + /* Fn + Command will produce a bogus "power" keycode */ + if (ahid->flags & FLAG_FN_KEY_PRESSED) { + keycode = ADB_KEY_CMD; + if (up_flag) + ahid->flags &= ~FLAG_POWER_FROM_FN; + else + ahid->flags |= FLAG_POWER_FROM_FN; + } else if (ahid->flags & FLAG_POWER_FROM_FN) { + keycode = ADB_KEY_CMD; + ahid->flags &= ~FLAG_POWER_FROM_FN; + } + break; + case ADB_KEY_FN: + /* Keep track of the Fn key state */ + if (up_flag) { + ahid->flags &= ~FLAG_FN_KEY_PRESSED; + /* Emulate Fn+delete = forward delete */ + if (ahid->flags & FLAG_EMU_FWDEL_DOWN) { + ahid->flags &= ~FLAG_EMU_FWDEL_DOWN; + keycode = ADB_KEY_FWDEL; + break; + } + } else + ahid->flags |= FLAG_FN_KEY_PRESSED; + /* Swallow the key press */ + return; + case ADB_KEY_DEL: + /* Emulate Fn+delete = forward delete */ + if (ahid->flags & FLAG_FN_KEY_PRESSED) { + keycode = ADB_KEY_FWDEL; + if (up_flag) + ahid->flags &= ~FLAG_EMU_FWDEL_DOWN; + else + ahid->flags |= FLAG_EMU_FWDEL_DOWN; } break; #endif /* CONFIG_PPC_PMAC */ @@ -500,6 +552,7 @@ adbhid[id]->original_handler_id = original_handler_id; adbhid[id]->current_handler_id = current_handler_id; adbhid[id]->mouse_kind = mouse_kind; + adbhid[id]->flags = 0; adbhid[id]->input.private = adbhid[id]; adbhid[id]->input.name = adbhid[id]->name; adbhid[id]->input.phys = adbhid[id]->phys; diff -Nru a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c --- a/drivers/macintosh/macio_asic.c Tue Feb 17 20:00:06 2004 +++ b/drivers/macintosh/macio_asic.c Tue Feb 17 20:00:06 2004 @@ -23,10 +23,13 @@ #include #include +#define DEBUG + +#define MAX_NODE_NAME_SIZE (BUS_ID_SIZE - 12) + static struct macio_chip *macio_on_hold; -static int -macio_bus_match(struct device *dev, struct device_driver *drv) +static int macio_bus_match(struct device *dev, struct device_driver *drv) { struct macio_dev * macio_dev = to_macio_device(dev); struct macio_driver * macio_drv = to_macio_driver(drv); @@ -85,41 +88,42 @@ static int macio_device_remove(struct device *dev) { struct macio_dev * macio_dev = to_macio_device(dev); - struct macio_driver * drv = to_macio_driver(macio_dev->ofdev.dev.driver); + struct macio_driver * drv = to_macio_driver(dev->driver); - if (drv && drv->remove) + if (dev->driver && drv->remove) drv->remove(macio_dev); macio_dev_put(macio_dev); return 0; } +static void macio_device_shutdown(struct device *dev) +{ + struct macio_dev * macio_dev = to_macio_device(dev); + struct macio_driver * drv = to_macio_driver(dev->driver); + + if (dev->driver && drv->shutdown) + drv->shutdown(macio_dev); +} + static int macio_device_suspend(struct device *dev, u32 state) { struct macio_dev * macio_dev = to_macio_device(dev); - struct macio_driver * drv; - int error = 0; + struct macio_driver * drv = to_macio_driver(dev->driver); - if (macio_dev->ofdev.dev.driver == NULL) - return 0; - drv = to_macio_driver(macio_dev->ofdev.dev.driver); - if (drv->suspend) - error = drv->suspend(macio_dev, state); - return error; + if (dev->driver && drv->suspend) + return drv->suspend(macio_dev, state); + return 0; } static int macio_device_resume(struct device * dev) { struct macio_dev * macio_dev = to_macio_device(dev); - struct macio_driver * drv; - int error = 0; + struct macio_driver * drv = to_macio_driver(dev->driver); - if (macio_dev->ofdev.dev.driver == NULL) - return 0; - drv = to_macio_driver(macio_dev->ofdev.dev.driver); - if (drv->resume) - error = drv->resume(macio_dev); - return error; + if (dev->driver && drv->resume) + return drv->resume(macio_dev); + return 0; } struct bus_type macio_bus_type = { @@ -129,8 +133,7 @@ .resume = macio_device_resume, }; -static int __init -macio_bus_driver_init(void) +static int __init macio_bus_driver_init(void) { return bus_register(&macio_bus_type); } @@ -155,6 +158,58 @@ } /** + * macio_resource_quirks - tweak or skip some resources for a device + * @np: pointer to the device node + * @res: resulting resource + * @index: index of resource in node + * + * If this routine returns non-null, then the resource is completely + * skipped. + */ +static int macio_resource_quirks(struct device_node *np, struct resource *res, int index) +{ + if (res->flags & IORESOURCE_MEM) { + /* Grand Central has too large resource 0 on some machines */ + if (index == 0 && !strcmp(np->name, "gc")) { + np->addrs[0].size = 0x20000; + res->end = res->start + 0x1ffff; + } + /* Airport has bogus resource 2 */ + if (index >= 2 && !strcmp(np->name, "radio")) + return 1; + /* DBDMAs may have bogus sizes */ + if ((res->start & 0x0001f000) == 0x00008000) { + np->addrs[index].size = 0x100; + res->end = res->start + 0xff; + } + /* ESCC parent eats child resources. We could have added a level of hierarchy, + * but I don't really feel the need for it */ + if (!strcmp(np->name, "escc")) + return 1; + /* ESCC has bogus resources >= 3 */ + if (index >= 3 && !(strcmp(np->name, "ch-a") && strcmp(np->name, "ch-b"))) + return 1; + /* Media bay has too many resources, keep only first one */ + if (index > 0 && !strcmp(np->name, "media-bay")) + return 1; + /* Some older IDE resources have bogus sizes */ + if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") && + strcmp(np->type, "ide") && strcmp(np->type, "ata"))) { + if (index == 0 && np->addrs[0].size > 0x1000) { + np->addrs[0].size = 0x1000; + res->end = res->start + 0xfff; + } + if (index == 1 && np->addrs[1].size > 0x100) { + np->addrs[1].size = 0x100; + res->end = res->start + 0xff; + } + } + } + return 0; +} + + +/** * macio_add_one_device - Add one device from OF node to the device tree * @chip: pointer to the macio_chip holding the device * @np: pointer to the device node in the OF tree @@ -164,9 +219,11 @@ * be exposed to the bay driver some way... */ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, struct device *parent, - struct device_node *np, struct macio_dev *in_bay) + struct device_node *np, struct macio_dev *in_bay, + struct resource *parent_res) { struct macio_dev *dev; + int i, j; u32 *reg; if (np == NULL) @@ -186,22 +243,76 @@ dev->ofdev.dev.bus = &macio_bus_type; dev->ofdev.dev.release = macio_release_dev; +#ifdef DEBUG + printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n", + dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj); +#endif + /* MacIO itself has a different reg, we use it's PCI base */ if (np == chip->of_node) { - sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.8s", chip->lbus.index, + sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s", chip->lbus.index, #ifdef CONFIG_PCI pci_resource_start(chip->lbus.pdev, 0), #else 0, /* NuBus may want to do something better here */ #endif - np->name); + MAX_NODE_NAME_SIZE, np->name); } else { reg = (u32 *)get_property(np, "reg", NULL); - sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.8s", chip->lbus.index, - reg ? *reg : 0, np->name); + sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s", chip->lbus.index, + reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name); } + /* For now, we use pre-parsed entries in the device-tree for + * interrupt routing and addresses, but we should change that + * to dynamically parsed entries and so get rid of most of the + * clutter in struct device_node + */ + for (i = j = 0; i < np->n_intrs; i++) { + struct resource *res = &dev->interrupt[j]; + + if (j >= MACIO_DEV_COUNT_IRQS) + break; + res->start = np->intrs[i].line; + res->flags = IORESOURCE_IO; + if (np->intrs[j].sense) + res->flags |= IORESOURCE_IRQ_LOWLEVEL; + else + res->flags |= IORESOURCE_IRQ_HIGHEDGE; + res->name = dev->ofdev.dev.bus_id; + if (macio_resource_quirks(np, res, i)) + memset(res, 0, sizeof(struct resource)); + else + j++; + } + dev->n_interrupts = j; + for (i = j = 0; i < np->n_addrs; i++) { + struct resource *res = &dev->resource[j]; + + if (j >= MACIO_DEV_COUNT_RESOURCES) + break; + res->start = np->addrs[i].address; + res->end = np->addrs[i].address + np->addrs[i].size - 1; + res->flags = IORESOURCE_MEM; + res->name = dev->ofdev.dev.bus_id; + if (macio_resource_quirks(np, res, i)) + memset(res, 0, sizeof(struct resource)); + else { + j++; + /* Currently, we consider failure as harmless, this may + * change in the future, once I've found all the device + * tree bugs in older machines & worked around them + */ + if (insert_resource(parent_res, res)) + printk(KERN_WARNING "Can't request resource %d for MacIO" + " device %s\n", i, dev->ofdev.dev.bus_id); + } + } + dev->n_resources = j; + if (of_device_register(&dev->ofdev) != 0) { + printk(KERN_DEBUG"macio: device registration error for %s!\n", + dev->ofdev.dev.bus_id); kfree(dev); return NULL; } @@ -234,25 +345,30 @@ struct device_node *np, *pnode; struct macio_dev *rdev, *mdev, *mbdev = NULL, *sdev = NULL; struct device *parent = NULL; + struct resource *root_res = &iomem_resource; /* Add a node for the macio bus itself */ #ifdef CONFIG_PCI - if (chip->lbus.pdev) + if (chip->lbus.pdev) { parent = &chip->lbus.pdev->dev; + root_res = &chip->lbus.pdev->resource[0]; + } #endif pnode = of_node_get(chip->of_node); if (pnode == NULL) return; - rdev = macio_add_one_device(chip, parent, pnode, NULL); + /* Add macio itself to hierarchy */ + rdev = macio_add_one_device(chip, parent, pnode, NULL, root_res); if (rdev == NULL) return; + root_res = &rdev->resource[0]; /* First scan 1st level */ for (np = NULL; (np = of_get_next_child(pnode, np)) != NULL;) { if (!macio_skip_device(np)) { of_node_get(np); - mdev = macio_add_one_device(chip, &rdev->ofdev.dev, np, NULL); + mdev = macio_add_one_device(chip, &rdev->ofdev.dev, np, NULL, root_res); if (mdev == NULL) of_node_put(np); else if (strncmp(np->name, "media-bay", 9) == 0) @@ -267,17 +383,20 @@ for (np = NULL; (np = of_get_next_child(mbdev->ofdev.node, np)) != NULL;) if (!macio_skip_device(np)) { of_node_get(np); - if (macio_add_one_device(chip, &mbdev->ofdev.dev, np, mbdev) == NULL) + if (macio_add_one_device(chip, &mbdev->ofdev.dev, np, mbdev, + root_res) == NULL) of_node_put(np); } /* Add serial ports if any */ - if (sdev) + if (sdev) { for (np = NULL; (np = of_get_next_child(sdev->ofdev.node, np)) != NULL;) if (!macio_skip_device(np)) { of_node_get(np); - if (macio_add_one_device(chip, &sdev->ofdev.dev, np, NULL) == NULL) + if (macio_add_one_device(chip, &sdev->ofdev.dev, np, NULL, + root_res) == NULL) of_node_put(np); } + } } @@ -294,6 +413,7 @@ drv->driver.bus = &macio_bus_type; drv->driver.probe = macio_device_probe; drv->driver.remove = macio_device_remove; + drv->driver.shutdown = macio_device_shutdown; /* register with core */ count = driver_register(&drv->driver); @@ -309,6 +429,97 @@ driver_unregister(&drv->driver); } +/** + * macio_request_resource - Request an MMIO resource + * @dev: pointer to the device holding the resource + * @resource_no: resource number to request + * @name: resource name + * + * Mark memory region number @resource_no associated with MacIO + * device @dev as being reserved by owner @name. Do not access + * any address inside the memory regions unless this call returns + * successfully. + * + * Returns 0 on success, or %EBUSY on error. A warning + * message is also printed on failure. + */ +int macio_request_resource(struct macio_dev *dev, int resource_no, const char *name) +{ + if (macio_resource_len(dev, resource_no) == 0) + return 0; + + if (!request_mem_region(macio_resource_start(dev, resource_no), + macio_resource_len(dev, resource_no), + name)) + goto err_out; + + return 0; + +err_out: + printk (KERN_WARNING "MacIO: Unable to reserve resource #%d:%lx@%lx" + " for device %s\n", + resource_no, + macio_resource_len(dev, resource_no), + macio_resource_start(dev, resource_no), + dev->ofdev.dev.bus_id); + return -EBUSY; +} + +/** + * macio_release_resource - Release an MMIO resource + * @dev: pointer to the device holding the resource + * @resource_no: resource number to release + */ +void macio_release_resource(struct macio_dev *dev, int resource_no) +{ + if (macio_resource_len(dev, resource_no) == 0) + return; + release_mem_region(macio_resource_start(dev, resource_no), + macio_resource_len(dev, resource_no)); +} + +/** + * macio_request_resources - Reserve all memory resources + * @dev: MacIO device whose resources are to be reserved + * @name: Name to be associated with resource. + * + * Mark all memory regions associated with MacIO device @dev as + * being reserved by owner @name. Do not access any address inside + * the memory regions unless this call returns successfully. + * + * Returns 0 on success, or %EBUSY on error. A warning + * message is also printed on failure. + */ +int macio_request_resources(struct macio_dev *dev, const char *name) +{ + int i; + + for (i = 0; i < dev->n_resources; i++) + if (macio_request_resource(dev, i, name)) + goto err_out; + return 0; + +err_out: + while(--i >= 0) + macio_release_resource(dev, i); + + return -EBUSY; +} + +/** + * macio_release_resources - Release reserved memory resources + * @dev: MacIO device whose resources were previously reserved + */ + +void macio_release_resources(struct macio_dev *dev) +{ + int i; + + for (i = 0; i < dev->n_resources; i++) + macio_release_resource(dev, i); +} + + #ifdef CONFIG_PCI static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) @@ -328,6 +539,9 @@ if (np == NULL) return -ENODEV; + /* This assumption is wrong, fix that here for now until I fix the arch */ + of_node_get(np); + /* We also assume that pmac_feature will have done a get() on nodes stored * in the macio chips array */ @@ -416,3 +630,7 @@ EXPORT_SYMBOL(macio_unregister_driver); EXPORT_SYMBOL(macio_dev_get); EXPORT_SYMBOL(macio_dev_put); +EXPORT_SYMBOL(macio_request_resource); +EXPORT_SYMBOL(macio_release_resource); +EXPORT_SYMBOL(macio_request_resources); +EXPORT_SYMBOL(macio_release_resources); diff -Nru a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c --- a/drivers/macintosh/mediabay.c Tue Feb 17 20:00:06 2004 +++ b/drivers/macintosh/mediabay.c Tue Feb 17 20:00:06 2004 @@ -107,6 +107,11 @@ #define MS_TO_HZ(ms) ((ms * HZ + 999) / 1000) /* + * Wait that number of ms between each step in normal polling mode + */ +#define MB_POLL_DELAY 25 + +/* * Consider the media-bay ID value stable if it is the same for * this number of milliseconds */ @@ -121,7 +126,7 @@ * Hold the media-bay reset signal true for this many ticks * after a device is inserted before releasing it. */ -#define MB_RESET_DELAY 40 +#define MB_RESET_DELAY 50 /* * Wait this long after the reset signal is released and before doing @@ -390,24 +395,28 @@ int id = bay->ops->content(bay); if (id == bay->last_value) { - if (id != bay->content_id - && ++bay->value_count >= MS_TO_HZ(MB_STABLE_DELAY)) { - /* If the device type changes without going thru "MB_NO", we force - a pass by "MB_NO" to make sure things are properly reset */ - if ((id != MB_NO) && (bay->content_id != MB_NO)) { - id = MB_NO; - MBDBG("mediabay%d: forcing MB_NO\n", bay->index); - } - MBDBG("mediabay%d: switching to %d\n", bay->index, id); - set_mb_power(bay, id != MB_NO); - bay->content_id = id; - if (id == MB_NO) { + if (id != bay->content_id) { + bay->value_count += MS_TO_HZ(MB_POLL_DELAY); + if (bay->value_count >= MS_TO_HZ(MB_STABLE_DELAY)) { + /* If the device type changes without going thru + * "MB_NO", we force a pass by "MB_NO" to make sure + * things are properly reset + */ + if ((id != MB_NO) && (bay->content_id != MB_NO)) { + id = MB_NO; + MBDBG("mediabay%d: forcing MB_NO\n", bay->index); + } + MBDBG("mediabay%d: switching to %d\n", bay->index, id); + set_mb_power(bay, id != MB_NO); + bay->content_id = id; + if (id == MB_NO) { #ifdef CONFIG_BLK_DEV_IDE - bay->cd_retry = 0; + bay->cd_retry = 0; #endif - printk(KERN_INFO "media bay %d is empty\n", bay->index); + printk(KERN_INFO "media bay %d is empty\n", bay->index); + } + } } - } } else { bay->last_value = id; bay->value_count = 0; @@ -496,8 +505,12 @@ poll_media_bay(bay); /* If timer expired or polling IDE busy, run state machine */ - if ((bay->state != mb_ide_waiting) && (bay->timer != 0) && ((--bay->timer) != 0)) - return; + if ((bay->state != mb_ide_waiting) && (bay->timer != 0)) { + bay->timer -= MS_TO_HZ(MB_POLL_DELAY); + if (bay->timer > 0) + return; + bay->timer = 0; + } switch(bay->state) { case mb_powering_up: @@ -572,12 +585,13 @@ } break; } else if (bay->timer > 0) - bay->timer--; - if (bay->timer == 0) { + bay->timer -= MS_TO_HZ(MB_POLL_DELAY); + if (bay->timer <= 0) { printk("\nIDE Timeout in bay %d !, IDE state is: 0x%02x\n", i, readb(bay->cd_base + 0x70)); MBDBG("mediabay%d: nIDE Timeout !\n", i); set_mb_power(bay, 0); + bay->timer = 0; } break; #endif /* CONFIG_BLK_DEV_IDE */ @@ -630,7 +644,7 @@ } current->state = TASK_INTERRUPTIBLE; - schedule_timeout(MS_TO_HZ(10)); + schedule_timeout(MS_TO_HZ(MB_POLL_DELAY)); if (signal_pending(current)) return 0; } @@ -645,17 +659,16 @@ ofnode = mdev->ofdev.node; - if (!request_OF_resource(ofnode, 0, NULL)) - return -ENXIO; - + if (macio_resource_count(mdev) < 1) + return -ENODEV; + if (macio_request_resources(mdev, "media-bay")) + return -EBUSY; /* Media bay registers are located at the beginning of the * mac-io chip, we get the parent address for now (hrm...) */ - if (ofnode->parent->n_addrs == 0) - return -ENODEV; regbase = (volatile u32 *)ioremap(ofnode->parent->addrs[0].address, 0x100); if (regbase == NULL) { - release_OF_resource(ofnode, 0); + macio_release_resources(mdev); return -ENOMEM; } @@ -684,13 +697,13 @@ bay->state = mb_empty; do { set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MS_TO_HZ(10)); + schedule_timeout(MS_TO_HZ(MB_POLL_DELAY)); media_bay_step(i); } while((bay->state != mb_empty) && (bay->state != mb_up)); /* Mark us ready by filling our mdev data */ - dev_set_drvdata(&mdev->ofdev.dev, bay); + macio_set_drvdata(mdev, bay); /* Startup kernel thread */ if (i == 0) @@ -702,7 +715,7 @@ static int __pmac media_bay_suspend(struct macio_dev *mdev, u32 state) { - struct media_bay_info *bay = dev_get_drvdata(&mdev->ofdev.dev); + struct media_bay_info *bay = macio_get_drvdata(mdev); if (state != mdev->ofdev.dev.power_state && state >= 2) { down(&bay->lock); @@ -710,7 +723,7 @@ set_mb_power(bay, 0); up(&bay->lock); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MS_TO_HZ(10)); + schedule_timeout(MS_TO_HZ(MB_POLL_DELAY)); mdev->ofdev.dev.power_state = state; } return 0; @@ -718,7 +731,7 @@ static int __pmac media_bay_resume(struct macio_dev *mdev) { - struct media_bay_info *bay = dev_get_drvdata(&mdev->ofdev.dev); + struct media_bay_info *bay = macio_get_drvdata(mdev); if (mdev->ofdev.dev.power_state != 0) { mdev->ofdev.dev.power_state = 0; @@ -746,7 +759,7 @@ #endif do { set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MS_TO_HZ(10)); + schedule_timeout(MS_TO_HZ(MB_POLL_DELAY)); media_bay_step(bay->index); } while((bay->state != mb_empty) && (bay->state != mb_up)); diff -Nru a/drivers/macintosh/therm_adt7467.c b/drivers/macintosh/therm_adt7467.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/macintosh/therm_adt7467.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,562 @@ +/* + * Device driver for the i2c thermostat found on the iBook G4, Albook G4 + * + * Copyright (C) 2003, 2004 Colin Leroy, Rasmus Rohde, Benjamin Herrenschmidt + * + * Documentation from + * http://www.analog.com/UploadedFiles/Data_Sheets/115254175ADT7467_pra.pdf + * http://www.analog.com/UploadedFiles/Data_Sheets/3686221171167ADT7460_b.pdf + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef DEBUG + +#define CONFIG_REG 0x40 +#define MANUAL_MASK 0xe0 +#define AUTO_MASK 0x20 + +static u8 TEMP_REG[3] = {0x26, 0x25, 0x27}; /* local, cpu, gpu */ +static u8 LIMIT_REG[3] = {0x6b, 0x6a, 0x6c}; /* local, cpu, gpu */ +static u8 MANUAL_MODE[2] = {0x5c, 0x5d}; +static u8 REM_CONTROL[2] = {0x00, 0x40}; +static u8 FAN_SPEED[2] = {0x28, 0x2a}; +static u8 FAN_SPD_SET[2] = {0x30, 0x31}; + +static u8 default_limits_local[3] = {70, 50, 70}; /* local, cpu, gpu */ +static u8 default_limits_chip[3] = {80, 65, 80}; /* local, cpu, gpu */ + +static int limit_adjust = 0; +static int fan_speed = -1; + +MODULE_AUTHOR("Colin Leroy "); +MODULE_DESCRIPTION("Driver for ADT7467 thermostat in iBook G4"); +MODULE_LICENSE("GPL"); + +MODULE_PARM(limit_adjust,"i"); +MODULE_PARM_DESC(limit_adjust,"Adjust maximum temperatures (50°C cpu, 70°C gpu) by N °C."); +MODULE_PARM(fan_speed,"i"); +MODULE_PARM_DESC(fan_speed,"Specify fan speed (0-255) when lim < temp < lim+8 (default 128)"); + +struct thermostat { + struct i2c_client clt; + u8 cached_temp[3]; + u8 initial_limits[3]; + u8 limits[3]; + int last_speed[2]; + int overriding[2]; +}; + +static enum {ADT7460, ADT7467} therm_type; +static int therm_bus, therm_address; +static struct of_device * of_dev; +static struct thermostat* thermostat; +static pid_t monitor_thread_id; +static int monitor_running; +static struct completion monitor_task_compl; + +static int attach_one_thermostat(struct i2c_adapter *adapter, int addr, int busno); +static void write_both_fan_speed(struct thermostat *th, int speed); +static void write_fan_speed(struct thermostat *th, int speed, int fan); + +static int +write_reg(struct thermostat* th, int reg, u8 data) +{ + u8 tmp[2]; + int rc; + + tmp[0] = reg; + tmp[1] = data; + rc = i2c_master_send(&th->clt, (const char *)tmp, 2); + if (rc < 0) + return rc; + if (rc != 2) + return -ENODEV; + return 0; +} + +static int +read_reg(struct thermostat* th, int reg) +{ + u8 reg_addr, data; + int rc; + + reg_addr = (u8)reg; + rc = i2c_master_send(&th->clt, ®_addr, 1); + if (rc < 0) + return rc; + if (rc != 1) + return -ENODEV; + rc = i2c_master_recv(&th->clt, (char *)&data, 1); + if (rc < 0) + return rc; + return data; +} + +static int +attach_thermostat(struct i2c_adapter *adapter) +{ + unsigned long bus_no; + + if (strncmp(adapter->name, "uni-n", 5)) + return -ENODEV; + bus_no = simple_strtoul(adapter->name + 6, NULL, 10); + if (bus_no != therm_bus) + return -ENODEV; + return attach_one_thermostat(adapter, therm_address, bus_no); +} + +static int +detach_thermostat(struct i2c_adapter *adapter) +{ + struct thermostat* th; + int i; + + if (thermostat == NULL) + return 0; + + th = thermostat; + + if (monitor_running) { + monitor_running = 0; + wait_for_completion(&monitor_task_compl); + } + + printk(KERN_INFO "adt746x: Putting max temperatures back from %d, %d, %d," + " to %d, %d, %d, (°C)\n", + th->limits[0], th->limits[1], th->limits[2], + th->initial_limits[0], th->initial_limits[1], th->initial_limits[2]); + + for (i = 0; i < 3; i++) + write_reg(th, LIMIT_REG[i], th->initial_limits[i]); + + write_both_fan_speed(th, -1); + + i2c_detach_client(&th->clt); + + thermostat = NULL; + + kfree(th); + + return 0; +} + +static struct i2c_driver thermostat_driver = { + .name ="Apple Thermostat ADT7467", + .id =0xDEAD7467, + .flags =I2C_DF_NOTIFY, + .attach_adapter =&attach_thermostat, + .detach_adapter =&detach_thermostat, +}; + +static int read_fan_speed(struct thermostat *th, u8 addr) +{ + u8 tmp[2]; + u16 res; + + /* should start with low byte */ + tmp[1] = read_reg(th, addr); + tmp[0] = read_reg(th, addr + 1); + + res = tmp[1] + (tmp[0] << 8); + return (90000*60)/res; +} + +static void write_both_fan_speed(struct thermostat *th, int speed) +{ + write_fan_speed(th, speed, 0); + if (therm_type == ADT7460) + write_fan_speed(th, speed, 1); +} + +static void write_fan_speed(struct thermostat *th, int speed, int fan) +{ + u8 manual; + + if (speed > 0xff) + speed = 0xff; + else if (speed < -1) + speed = 0; + + if (therm_type == ADT7467 && fan == 1) + return; + + if (th->last_speed[fan] != speed) { + if (speed == -1) + printk(KERN_INFO "adt746x: Setting speed to: automatic for %s fan.\n", + fan?"GPU":"CPU"); + else + printk(KERN_INFO "adt746x: Setting speed to: %d for %s fan.\n", + speed, fan?"GPU":"CPU"); + } else + return; + + if (speed >= 0) { + manual = read_reg(th, MANUAL_MODE[fan]); + write_reg(th, MANUAL_MODE[fan], manual|MANUAL_MASK); + write_reg(th, FAN_SPD_SET[fan], speed); + } else { + /* back to automatic */ + if(therm_type == ADT7460) { + manual = read_reg(th, MANUAL_MODE[fan]) & (~MANUAL_MASK); + write_reg(th, MANUAL_MODE[fan], manual|REM_CONTROL[fan]); + } else { + manual = read_reg(th, MANUAL_MODE[fan]); + write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK)); + } + } + + th->last_speed[fan] = speed; +} + +static int monitor_task(void *arg) +{ + struct thermostat* th = arg; + u8 temps[3]; + u8 lims[3]; + int i; +#ifdef DEBUG + int mfan_speed; +#endif + + lock_kernel(); + daemonize("kfand"); + unlock_kernel(); + strcpy(current->comm, "thermostat"); + monitor_running = 1; + + while(monitor_running) + { + set_task_state(current, TASK_UNINTERRUPTIBLE); + schedule_timeout(2*HZ); + + /* Check status */ + /* local : chip */ + /* remote 1: CPU ?*/ + /* remote 2: GPU ?*/ +#ifndef DEBUG + if (fan_speed != -1) { +#endif + for (i = 0; i < 3; i++) { + temps[i] = read_reg(th, TEMP_REG[i]); + lims[i] = th->limits[i]; + } +#ifndef DEBUG + } +#endif + if (fan_speed != -1) { + int lastvar = 0; /* for iBook */ + for (i = 1; i < 3; i++) { /* we don't care about local sensor */ + int started = 0; + int fan_number = (therm_type == ADT7460 && i == 2); + int var = temps[i] - lims[i]; + if (var > 8) { + if (th->overriding[fan_number] == 0) + printk(KERN_INFO "adt746x: Limit exceeded by %d°C, overriding specified fan speed for %s.\n", + var, fan_number?"GPU":"CPU"); + th->overriding[fan_number] = 1; + write_fan_speed(th, 255, fan_number); + started = 1; + } else if ((!th->overriding[fan_number] || var < 6) && var > 0) { + if (th->overriding[fan_number] == 1) + printk(KERN_INFO "adt746x: Limit exceeded by %d°C, setting speed to specified for %s.\n", + var, fan_number?"GPU":"CPU"); + th->overriding[fan_number] = 0; + write_fan_speed(th, fan_speed, fan_number); + started = 1; + } else if (var < -1) { + /* don't stop iBook fan if GPU is cold and CPU is not + * so cold (lastvar >= -1) */ + if (therm_type == ADT7460 || lastvar < -1 || i == 1) { + if (th->last_speed[fan_number] != 0) + printk(KERN_INFO "adt746x: Stopping %s fan.\n", + fan_number?"GPU":"CPU"); + write_fan_speed(th, 0, fan_number); + } + } + + lastvar = var; + + if (started && therm_type == ADT7467) + break; /* we don't want to re-stop the fan + * if CPU is heating and GPU is not */ + } + } +#ifdef DEBUG + mfan_speed = read_fan_speed(th, FAN_SPEED[0]); + /* only one fan in the iBook G4 */ + + if (temps[0] != th->cached_temp[0] + || temps[1] != th->cached_temp[1] + || temps[2] != th->cached_temp[2]) { + printk(KERN_INFO "adt746x: Temperature infos:" + " thermostats: %d,%d,%d °C;" + " limits: %d,%d,%d °C;" + " fan speed: %d RPM\n", + temps[0], temps[1], temps[2], + lims[0], lims[1], lims[2], + mfan_speed); + } + th->cached_temp[0] = temps[0]; + th->cached_temp[1] = temps[1]; + th->cached_temp[2] = temps[2]; +#endif + } + + complete_and_exit(&monitor_task_compl, 0); + return 0; +} + +static void +set_limit(struct thermostat *th, int i) +{ + /* Set CPU limit higher to avoid powerdowns */ + th->limits[i] = default_limits_chip[i] + limit_adjust; + write_reg(th, LIMIT_REG[i], th->limits[i]); + + /* set our limits to normal */ + th->limits[i] = default_limits_local[i] + limit_adjust; +} + +static int +attach_one_thermostat(struct i2c_adapter *adapter, int addr, int busno) +{ + struct thermostat* th; + int rc; + int i; + + if (thermostat) + return 0; + th = (struct thermostat *)kmalloc(sizeof(struct thermostat), GFP_KERNEL); + if (!th) + return -ENOMEM; + memset(th, 0, sizeof(*th)); + th->clt.addr = addr; + th->clt.adapter = adapter; + th->clt.driver = &thermostat_driver; + th->clt.id = 0xDEAD7467; + strcpy(th->clt.name, "thermostat"); + + rc = read_reg(th, 0); + if (rc < 0) { + printk(KERN_ERR "adt746x: Thermostat failed to read config from bus %d !\n", + busno); + kfree(th); + return -ENODEV; + } + /* force manual control to start the fan quieter */ + + if (fan_speed == -1) + fan_speed=128; + + if(therm_type == ADT7460) { + printk(KERN_INFO "adt746x: ADT7460 initializing\n"); + /* The 7460 needs to be started explicitly */ + write_reg(th, CONFIG_REG, 1); + } else + printk(KERN_INFO "adt746x: ADT7467 initializing\n"); + + for (i = 0; i < 3; i++) { + th->initial_limits[i] = read_reg(th, LIMIT_REG[i]); + set_limit(th, i); + } + + printk(KERN_INFO "adt746x: Lowering max temperatures from %d, %d, %d" + " to %d, %d, %d (°C)\n", + th->initial_limits[0], th->initial_limits[1], th->initial_limits[2], + th->limits[0], th->limits[1], th->limits[2]); + + thermostat = th; + + if (i2c_attach_client(&th->clt)) { + printk("adt746x: Thermostat failed to attach client !\n"); + thermostat = NULL; + kfree(th); + return -ENODEV; + } + + /* be sure to really write fan speed the first time */ + th->last_speed[0] = -2; + th->last_speed[1] = -2; + + if (fan_speed != -1) { + write_both_fan_speed(th, 0); + } else { + write_both_fan_speed(th, -1); + } + + init_completion(&monitor_task_compl); + + monitor_thread_id = kernel_thread(monitor_task, th, + SIGCHLD | CLONE_KERNEL); + + return 0; +} + +/* + * Now, unfortunately, sysfs doesn't give us a nice void * we could + * pass around to the attribute functions, so we don't really have + * choice but implement a bunch of them... + * + */ +#define BUILD_SHOW_FUNC_DEG(name, data) \ +static ssize_t show_##name(struct device *dev, char *buf) \ +{ \ + return sprintf(buf, "%d°C\n", data); \ +} +#define BUILD_SHOW_FUNC_INT(name, data) \ +static ssize_t show_##name(struct device *dev, char *buf) \ +{ \ + return sprintf(buf, "%d\n", data); \ +} + +#define BUILD_STORE_FUNC_DEG(name, data) \ +static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \ +{ \ + int val; \ + int i; \ + val = simple_strtol(buf, NULL, 10); \ + printk(KERN_INFO "Adjusting limits by %d°C\n", val); \ + limit_adjust = val; \ + for (i=0; i < 3; i++) \ + set_limit(thermostat, i); \ + return n; \ +} + +#define BUILD_STORE_FUNC_INT(name, data) \ +static ssize_t store_##name(struct device *dev, const char *buf, size_t n) \ +{ \ + u32 val; \ + val = simple_strtoul(buf, NULL, 10); \ + if (val < 0 || val > 255) \ + return -EINVAL; \ + printk(KERN_INFO "Setting fan speed to %d\n", val); \ + data = val; \ + return n; \ +} + +BUILD_SHOW_FUNC_DEG(cpu_temperature, (read_reg(thermostat, TEMP_REG[1]))) +BUILD_SHOW_FUNC_DEG(gpu_temperature, (read_reg(thermostat, TEMP_REG[2]))) +BUILD_SHOW_FUNC_DEG(cpu_limit, thermostat->limits[1]) +BUILD_SHOW_FUNC_DEG(gpu_limit, thermostat->limits[2]) + +BUILD_SHOW_FUNC_INT(specified_fan_speed, fan_speed) +BUILD_SHOW_FUNC_INT(cpu_fan_speed, (read_fan_speed(thermostat, FAN_SPEED[0]))) +BUILD_SHOW_FUNC_INT(gpu_fan_speed, (read_fan_speed(thermostat, FAN_SPEED[1]))) + +BUILD_STORE_FUNC_INT(specified_fan_speed,fan_speed) +BUILD_SHOW_FUNC_INT(limit_adjust, limit_adjust) +BUILD_STORE_FUNC_DEG(limit_adjust, thermostat) + +static DEVICE_ATTR(cpu_temperature, S_IRUGO, + show_cpu_temperature,NULL); +static DEVICE_ATTR(gpu_temperature, S_IRUGO, + show_gpu_temperature,NULL); +static DEVICE_ATTR(cpu_limit, S_IRUGO, + show_cpu_limit, NULL); +static DEVICE_ATTR(gpu_limit, S_IRUGO, + show_gpu_limit, NULL); + +static DEVICE_ATTR(specified_fan_speed, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, + show_specified_fan_speed,store_specified_fan_speed); + +static DEVICE_ATTR(cpu_fan_speed, S_IRUGO, + show_cpu_fan_speed, NULL); +static DEVICE_ATTR(gpu_fan_speed, S_IRUGO, + show_gpu_fan_speed, NULL); + +static DEVICE_ATTR(limit_adjust, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, + show_limit_adjust, store_limit_adjust); + + +static int __init +thermostat_init(void) +{ + struct device_node* np; + u32 *prop; + + /* Currently, we only deal with the iBook G4, we will support + * all "2003" powerbooks later on + */ + np = of_find_node_by_name(NULL, "fan"); + if (!np) + return -ENODEV; + if (device_is_compatible(np, "adt7460")) + therm_type = ADT7460; + else if (device_is_compatible(np, "adt7467")) + therm_type = ADT7467; + else + return -ENODEV; + + prop = (u32 *)get_property(np, "reg", NULL); + if (!prop) + return -ENODEV; + therm_bus = ((*prop) >> 8) & 0x0f; + therm_address = ((*prop) & 0xff) >> 1; + + printk(KERN_INFO "adt746x: Thermostat bus: %d, address: 0x%02x, limit_adjust: %d, fan_speed: %d\n", + therm_bus, therm_address, limit_adjust, fan_speed); + + of_dev = of_platform_device_create(np, "temperatures"); + + if (of_dev == NULL) { + printk(KERN_ERR "Can't register temperatures device !\n"); + return -ENODEV; + } + + device_create_file(&of_dev->dev, &dev_attr_cpu_temperature); + device_create_file(&of_dev->dev, &dev_attr_gpu_temperature); + device_create_file(&of_dev->dev, &dev_attr_cpu_limit); + device_create_file(&of_dev->dev, &dev_attr_gpu_limit); + device_create_file(&of_dev->dev, &dev_attr_limit_adjust); + device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed); + device_create_file(&of_dev->dev, &dev_attr_cpu_fan_speed); + if(therm_type == ADT7460) + device_create_file(&of_dev->dev, &dev_attr_gpu_fan_speed); + +#ifndef CONFIG_I2C_KEYWEST + request_module("i2c-keywest"); +#endif + + return i2c_add_driver(&thermostat_driver); +} + +static void __exit +thermostat_exit(void) +{ + if (of_dev) { + device_remove_file(&of_dev->dev, &dev_attr_cpu_temperature); + device_remove_file(&of_dev->dev, &dev_attr_gpu_temperature); + device_remove_file(&of_dev->dev, &dev_attr_cpu_limit); + device_remove_file(&of_dev->dev, &dev_attr_gpu_limit); + device_remove_file(&of_dev->dev, &dev_attr_limit_adjust); + device_remove_file(&of_dev->dev, &dev_attr_specified_fan_speed); + device_remove_file(&of_dev->dev, &dev_attr_cpu_fan_speed); + if(therm_type == ADT7460) + device_remove_file(&of_dev->dev, &dev_attr_gpu_fan_speed); + of_device_unregister(of_dev); + } + i2c_del_driver(&thermostat_driver); +} + +module_init(thermostat_init); +module_exit(thermostat_exit); diff -Nru a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/macintosh/therm_pm72.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,1241 @@ +/* + * Device driver for the thermostats & fan controller of the + * Apple G5 "PowerMac7,2" desktop machines. + * + * (c) Copyright IBM Corp. 2003 + * + * Maintained by: Benjamin Herrenschmidt + * + * + * + * The algorithm used is the PID control algorithm, used the same + * way the published Darwin code does, using the same values that + * are present in the Darwin 7.0 snapshot property lists. + * + * As far as the CPUs control loops are concerned, I use the + * calibration & PID constants provided by the EEPROM, + * I do _not_ embed any value from the property lists, as the ones + * provided by Darwin 7.0 seem to always have an older version that + * what I've seen on the actual computers. + * It would be interesting to verify that though. Darwin has a + * version code of 1.0.0d11 for all control loops it seems, while + * so far, the machines EEPROMs contain a dataset versioned 1.0.0f + * + * Darwin doesn't provide source to all parts, some missing + * bits like the AppleFCU driver or the actual scale of some + * of the values returned by sensors had to be "guessed" some + * way... or based on what Open Firmware does. + * + * I didn't yet figure out how to get the slots power consumption + * out of the FCU, so that part has not been implemented yet and + * the slots fan is set to a fixed 50% PWM, hoping this value is + * safe enough ... + * + * Note: I have observed strange oscillations of the CPU control + * loop on a dual G5 here. When idle, the CPU exhaust fan tend to + * oscillates slowly (over several minutes) between the minimum + * of 300RPMs and approx. 1000 RPMs. I don't know what is causing + * this, it could be some incorrect constant or an error in the + * way I ported the algorithm, or it could be just normal. I + * don't have full understanding on the way Apple tweaked the PID + * algorithm for the CPU control, it is definitely not a standard + * implementation... + * + * TODO: - Check MPU structure version/signature + * - Add things like /sbin/overtemp for non-critical + * overtemp conditions so userland can take some policy + * decisions, like slewing down CPUs + * - Deal with fan failures + * + * History: + * + * Nov. 13, 2003 : 0.5 + * - First release + * + * Nov. 14, 2003 : 0.6 + * - Read fan speed from FCU, low level fan routines now deal + * with errors & check fan status, though higher level don't + * do much. + * - Move a bunch of definitions to .h file + * + * Nov. 18, 2003 : 0.7 + * - Fix build on ppc64 kernel + * - Move back statics definitions to .c file + * - Avoid calling schedule_timeout with a negative number + * + * Dev. 18, 2003 : 0.8 + * - Fix typo when reading back fan speed on 2 CPU machines + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "therm_pm72.h" + +#define VERSION "0.8" + +#undef DEBUG + +#ifdef DEBUG +#define DBG(args...) printk(args) +#else +#define DBG(args...) +#endif + + +/* + * Driver statics + */ + +static struct of_device * of_dev; +static struct i2c_adapter * u3_0; +static struct i2c_adapter * u3_1; +static struct i2c_client * fcu; +static struct cpu_pid_state cpu_state[2]; +static struct backside_pid_state backside_state; +static struct drives_pid_state drives_state; +static int state; +static int cpu_count; +static pid_t ctrl_task; +static struct completion ctrl_complete; +static int critical_state; +static DECLARE_MUTEX(driver_lock); + +/* + * i2c_driver structure to attach to the host i2c controller + */ + +static int therm_pm72_attach(struct i2c_adapter *adapter); +static int therm_pm72_detach(struct i2c_adapter *adapter); + +static struct i2c_driver therm_pm72_driver = +{ + .name = "therm_pm72", + .id = 0xDEADBEEF, + .flags = I2C_DF_NOTIFY, + .attach_adapter = therm_pm72_attach, + .detach_adapter = therm_pm72_detach, +}; + + +static inline void wait_ms(unsigned int ms) +{ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1 + (ms * HZ + 999) / 1000); +} + +/* + * Utility function to create an i2c_client structure and + * attach it to one of u3 adapters + */ +static struct i2c_client *attach_i2c_chip(int id, const char *name) +{ + struct i2c_client *clt; + struct i2c_adapter *adap; + + if (id & 0x100) + adap = u3_1; + else + adap = u3_0; + if (adap == NULL) + return NULL; + + clt = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); + if (clt == NULL) + return NULL; + memset(clt, 0, sizeof(struct i2c_client)); + + clt->addr = (id >> 1) & 0x7f; + clt->adapter = adap; + clt->driver = &therm_pm72_driver; + clt->id = 0xDEADBEEF; + strncpy(clt->name, name, I2C_NAME_SIZE-1); + + if (i2c_attach_client(clt)) { + printk(KERN_ERR "therm_pm72: Failed to attach to i2c ID 0x%x\n", id); + kfree(clt); + return NULL; + } + return clt; +} + +/* + * Utility function to get rid of the i2c_client structure + * (will also detach from the adapter hopepfully) + */ +static void detach_i2c_chip(struct i2c_client *clt) +{ + i2c_detach_client(clt); + kfree(clt); +} + +/* + * Here are the i2c chip access wrappers + */ +static int read_smon_adc(struct i2c_client *chip, int chan) +{ + int ctrl; + + ctrl = i2c_smbus_read_byte_data(chip, 1); + i2c_smbus_write_byte_data(chip, 1, (ctrl & 0x1f) | (chan << 5)); + wait_ms(1); + return le16_to_cpu(i2c_smbus_read_word_data(chip, 4)) >> 6; +} + +static int fan_read_reg(int reg, unsigned char *buf, int nb) +{ + int tries, nr, nw; + + buf[0] = reg; + tries = 0; + for (;;) { + nw = i2c_master_send(fcu, buf, 1); + if (nw > 0 || (nw < 0 && nw != -EIO) || tries >= 100) + break; + wait_ms(10); + ++tries; + } + if (nw <= 0) { + printk(KERN_ERR "Failure writing address to FCU: %d", nw); + return -EIO; + } + tries = 0; + for (;;) { + nr = i2c_master_recv(fcu, buf, nb); + if (nr > 0 || (nr < 0 && nr != ENODEV) || tries >= 100) + break; + wait_ms(10); + ++tries; + } + if (nr <= 0) + printk(KERN_ERR "Failure reading data from FCU: %d", nw); + return nr; +} + +static int fan_write_reg(int reg, const unsigned char *ptr, int nb) +{ + int tries, nw; + unsigned char buf[16]; + + buf[0] = reg; + memcpy(buf+1, ptr, nb); + ++nb; + tries = 0; + for (;;) { + nw = i2c_master_send(fcu, buf, nb); + if (nw > 0 || (nw < 0 && nw != EIO) || tries >= 100) + break; + wait_ms(10); + ++tries; + } + if (nw < 0) + printk(KERN_ERR "Failure writing to FCU: %d", nw); + return nw; +} + +static int set_rpm_fan(int fan, int rpm) +{ + unsigned char buf[2]; + int rc; + + if (rpm < 300) + rpm = 300; + else if (rpm > 8191) + rpm = 8191; + buf[0] = rpm >> 5; + buf[1] = rpm << 3; + rc = fan_write_reg(0x10 + (fan * 2), buf, 2); + if (rc < 0) + return -EIO; + return 0; +} + +static int get_rpm_fan(int fan, int programmed) +{ + unsigned char failure; + unsigned char active; + unsigned char buf[2]; + int rc, reg_base; + + rc = fan_read_reg(0xb, &failure, 1); + if (rc != 1) + return -EIO; + if ((failure & (1 << fan)) != 0) + return -EFAULT; + rc = fan_read_reg(0xd, &active, 1); + if (rc != 1) + return -EIO; + if ((active & (1 << fan)) == 0) + return -ENXIO; + + /* Programmed value or real current speed */ + reg_base = programmed ? 0x10 : 0x11; + rc = fan_read_reg(reg_base + (fan * 2), buf, 2); + if (rc != 2) + return -EIO; + + return (buf[0] << 5) | buf[1] >> 3; +} + +static int set_pwm_fan(int fan, int pwm) +{ + unsigned char buf[2]; + int rc; + + if (pwm < 10) + pwm = 10; + else if (pwm > 100) + pwm = 100; + pwm = (pwm * 2559) / 1000; + buf[0] = pwm; + rc = fan_write_reg(0x30 + (fan * 2), buf, 1); + if (rc < 0) + return rc; + return 0; +} + +static int get_pwm_fan(int fan) +{ + unsigned char failure; + unsigned char active; + unsigned char buf[2]; + int rc; + + rc = fan_read_reg(0x2b, &failure, 1); + if (rc != 1) + return -EIO; + if ((failure & (1 << fan)) != 0) + return -EFAULT; + rc = fan_read_reg(0x2d, &active, 1); + if (rc != 1) + return -EIO; + if ((active & (1 << fan)) == 0) + return -ENXIO; + + /* Programmed value or real current speed */ + rc = fan_read_reg(0x30 + (fan * 2), buf, 1); + if (rc != 1) + return -EIO; + + return (buf[0] * 1000) / 2559; +} + +/* + * Utility routine to read the CPU calibration EEPROM data + * from the device-tree + */ +static int read_eeprom(int cpu, struct mpu_data *out) +{ + struct device_node *np; + char nodename[64]; + u8 *data; + int len; + + /* prom.c routine for finding a node by path is a bit brain dead + * and requires exact @xxx unit numbers. This is a bit ugly but + * will work for these machines + */ + sprintf(nodename, "/u3@0,f8000000/i2c@f8001000/cpuid@a%d", cpu ? 2 : 0); + np = of_find_node_by_path(nodename); + if (np == NULL) { + printk(KERN_ERR "therm_pm72: Failed to retreive cpuid node from device-tree\n"); + return -ENODEV; + } + data = (u8 *)get_property(np, "cpuid", &len); + if (data == NULL) { + printk(KERN_ERR "therm_pm72: Failed to retreive cpuid property from device-tree\n"); + of_node_put(np); + return -ENODEV; + } + memcpy(out, data, sizeof(struct mpu_data)); + of_node_put(np); + + return 0; +} + +/* + * Now, unfortunately, sysfs doesn't give us a nice void * we could + * pass around to the attribute functions, so we don't really have + * choice but implement a bunch of them... + * + * That sucks a bit, we take the lock because FIX32TOPRINT evaluates + * the input twice... I accept patches :) + */ +#define BUILD_SHOW_FUNC_FIX(name, data) \ +static ssize_t show_##name(struct device *dev, char *buf) \ +{ \ + ssize_t r; \ + down(&driver_lock); \ + r = sprintf(buf, "%d.%03d", FIX32TOPRINT(data)); \ + up(&driver_lock); \ + return r; \ +} +#define BUILD_SHOW_FUNC_INT(name, data) \ +static ssize_t show_##name(struct device *dev, char *buf) \ +{ \ + return sprintf(buf, "%d", data); \ +} + +BUILD_SHOW_FUNC_FIX(cpu0_temperature, cpu_state[0].last_temp) +BUILD_SHOW_FUNC_FIX(cpu0_voltage, cpu_state[0].voltage) +BUILD_SHOW_FUNC_FIX(cpu0_current, cpu_state[0].current_a) +BUILD_SHOW_FUNC_INT(cpu0_exhaust_fan_rpm, cpu_state[0].rpm) +BUILD_SHOW_FUNC_INT(cpu0_intake_fan_rpm, cpu_state[0].intake_rpm) + +BUILD_SHOW_FUNC_FIX(cpu1_temperature, cpu_state[1].last_temp) +BUILD_SHOW_FUNC_FIX(cpu1_voltage, cpu_state[1].voltage) +BUILD_SHOW_FUNC_FIX(cpu1_current, cpu_state[1].current_a) +BUILD_SHOW_FUNC_INT(cpu1_exhaust_fan_rpm, cpu_state[1].rpm) +BUILD_SHOW_FUNC_INT(cpu1_intake_fan_rpm, cpu_state[1].intake_rpm) + +BUILD_SHOW_FUNC_FIX(backside_temperature, backside_state.last_temp) +BUILD_SHOW_FUNC_INT(backside_fan_pwm, backside_state.pwm) + +BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) +BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) + +static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); +static DEVICE_ATTR(cpu0_voltage,S_IRUGO,show_cpu0_voltage,NULL); +static DEVICE_ATTR(cpu0_current,S_IRUGO,show_cpu0_current,NULL); +static DEVICE_ATTR(cpu0_exhaust_fan_rpm,S_IRUGO,show_cpu0_exhaust_fan_rpm,NULL); +static DEVICE_ATTR(cpu0_intake_fan_rpm,S_IRUGO,show_cpu0_intake_fan_rpm,NULL); + +static DEVICE_ATTR(cpu1_temperature,S_IRUGO,show_cpu1_temperature,NULL); +static DEVICE_ATTR(cpu1_voltage,S_IRUGO,show_cpu1_voltage,NULL); +static DEVICE_ATTR(cpu1_current,S_IRUGO,show_cpu1_current,NULL); +static DEVICE_ATTR(cpu1_exhaust_fan_rpm,S_IRUGO,show_cpu1_exhaust_fan_rpm,NULL); +static DEVICE_ATTR(cpu1_intake_fan_rpm,S_IRUGO,show_cpu1_intake_fan_rpm,NULL); + +static DEVICE_ATTR(backside_temperature,S_IRUGO,show_backside_temperature,NULL); +static DEVICE_ATTR(backside_fan_pwm,S_IRUGO,show_backside_fan_pwm,NULL); + +static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); +static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); + +/* + * CPUs fans control loop + */ +static void do_monitor_cpu(struct cpu_pid_state *state) +{ + s32 temp, voltage, current_a, power, power_target; + s32 integral, derivative, proportional, adj_in_target, sval; + s64 integ_p, deriv_p, prop_p, sum; + int i, intake, rc; + + DBG("cpu %d:\n", state->index); + + /* Read current fan status */ + if (state->index == 0) + rc = get_rpm_fan(CPUA_EXHAUST_FAN_RPM_ID, !RPM_PID_USE_ACTUAL_SPEED); + else + rc = get_rpm_fan(CPUB_EXHAUST_FAN_RPM_ID, !RPM_PID_USE_ACTUAL_SPEED); + if (rc < 0) { + printk(KERN_WARNING "Error %d reading CPU %d exhaust fan !\n", + rc, state->index); + /* XXX What do we do now ? */ + } else + state->rpm = rc; + DBG(" current rpm: %d\n", state->rpm); + + /* Get some sensor readings and scale it */ + temp = read_smon_adc(state->monitor, 1); + voltage = read_smon_adc(state->monitor, 3); + current_a = read_smon_adc(state->monitor, 4); + + /* Fixup temperature according to diode calibration + */ + DBG(" temp raw: %04x, m_diode: %04x, b_diode: %04x\n", + temp, state->mpu.mdiode, state->mpu.bdiode); + temp = ((s32)temp * (s32)state->mpu.mdiode + ((s32)state->mpu.bdiode << 12)) >> 2; + state->last_temp = temp; + DBG(" temp: %d.%03d\n", FIX32TOPRINT(temp)); + + /* Check tmax, increment overtemp if we are there. At tmax+8, we go + * full blown immediately and try to trigger a shutdown + */ + if (temp >= ((state->mpu.tmax + 8) << 16)) { + printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum (%d) !\n", + state->index, temp >> 16); + state->overtemp = CPU_MAX_OVERTEMP; + } else if (temp > (state->mpu.tmax << 16)) + state->overtemp++; + else + state->overtemp = 0; + if (state->overtemp >= CPU_MAX_OVERTEMP) + critical_state = 1; + if (state->overtemp > 0) { + state->rpm = state->mpu.rmaxn_exhaust_fan; + state->intake_rpm = intake = state->mpu.rmaxn_intake_fan; + goto do_set_fans; + } + + /* Scale other sensor values according to fixed scales + * obtained in Darwin and calculate power from I and V + */ + state->voltage = voltage *= ADC_CPU_VOLTAGE_SCALE; + state->current_a = current_a *= ADC_CPU_CURRENT_SCALE; + power = (((u64)current_a) * ((u64)voltage)) >> 16; + + /* Calculate power target value (could be done once for all) + * and convert to a 16.16 fp number + */ + power_target = ((u32)(state->mpu.pmaxh - state->mpu.padjmax)) << 16; + + DBG(" current: %d.%03d, voltage: %d.%03d\n", + FIX32TOPRINT(current_a), FIX32TOPRINT(voltage)); + DBG(" power: %d.%03d W, target: %d.%03d, error: %d.%03d\n", FIX32TOPRINT(power), + FIX32TOPRINT(power_target), FIX32TOPRINT(power_target - power)); + + /* Store temperature and power in history array */ + state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; + state->temp_history[state->cur_temp] = temp; + state->cur_power = (state->cur_power + 1) % state->count_power; + state->power_history[state->cur_power] = power; + state->error_history[state->cur_power] = power_target - power; + + /* If first loop, fill the history table */ + if (state->first) { + for (i = 0; i < (state->count_power - 1); i++) { + state->cur_power = (state->cur_power + 1) % state->count_power; + state->power_history[state->cur_power] = power; + state->error_history[state->cur_power] = power_target - power; + } + for (i = 0; i < (CPU_TEMP_HISTORY_SIZE - 1); i++) { + state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; + state->temp_history[state->cur_temp] = temp; + } + state->first = 0; + } + + /* Calculate the integral term normally based on the "power" values */ + sum = 0; + integral = 0; + for (i = 0; i < state->count_power; i++) + integral += state->error_history[i]; + integral *= CPU_PID_INTERVAL; + DBG(" integral: %08x\n", integral); + + /* Calculate the adjusted input (sense value). + * G_r is 12.20 + * integ is 16.16 + * so the result is 28.36 + * + * input target is mpu.ttarget, input max is mpu.tmax + */ + integ_p = ((s64)state->mpu.pid_gr) * (s64)integral; + DBG(" integ_p: %d\n", (int)(deriv_p >> 36)); + sval = (state->mpu.tmax << 16) - ((integ_p >> 20) & 0xffffffff); + adj_in_target = (state->mpu.ttarget << 16); + if (adj_in_target > sval) + adj_in_target = sval; + DBG(" adj_in_target: %d.%03d, ttarget: %d\n", FIX32TOPRINT(adj_in_target), + state->mpu.ttarget); + + /* Calculate the derivative term */ + derivative = state->temp_history[state->cur_temp] - + state->temp_history[(state->cur_temp + CPU_TEMP_HISTORY_SIZE - 1) + % CPU_TEMP_HISTORY_SIZE]; + derivative /= CPU_PID_INTERVAL; + deriv_p = ((s64)state->mpu.pid_gd) * (s64)derivative; + DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); + sum += deriv_p; + + /* Calculate the proportional term */ + proportional = temp - adj_in_target; + prop_p = ((s64)state->mpu.pid_gp) * (s64)proportional; + DBG(" prop_p: %d\n", (int)(prop_p >> 36)); + sum += prop_p; + + /* Scale sum */ + sum >>= 36; + + DBG(" sum: %d\n", (int)sum); + state->rpm += (s32)sum; + + if (state->rpm < state->mpu.rminn_exhaust_fan) + state->rpm = state->mpu.rminn_exhaust_fan; + if (state->rpm > state->mpu.rmaxn_exhaust_fan) + state->rpm = state->mpu.rmaxn_exhaust_fan; + + intake = (state->rpm * CPU_INTAKE_SCALE) >> 16; + if (intake < state->mpu.rminn_intake_fan) + intake = state->mpu.rminn_intake_fan; + if (intake > state->mpu.rmaxn_intake_fan) + intake = state->mpu.rmaxn_intake_fan; + state->intake_rpm = intake; + + do_set_fans: + DBG("** CPU %d RPM: %d Ex, %d In, overtemp: %d\n", + state->index, (int)state->rpm, intake, state->overtemp); + + /* We should check for errors, shouldn't we ? But then, what + * do we do once the error occurs ? For FCU notified fan + * failures (-EFAULT) we probably want to notify userland + * some way... + */ + if (state->index == 0) { + set_rpm_fan(CPUA_INTAKE_FAN_RPM_ID, intake); + set_rpm_fan(CPUA_EXHAUST_FAN_RPM_ID, state->rpm); + } else { + set_rpm_fan(CPUB_INTAKE_FAN_RPM_ID, intake); + set_rpm_fan(CPUB_EXHAUST_FAN_RPM_ID, state->rpm); + } +} + +/* + * Initialize the state structure for one CPU control loop + */ +static int init_cpu_state(struct cpu_pid_state *state, int index) +{ + state->index = index; + state->first = 1; + state->rpm = 1000; + state->overtemp = 0; + + if (index == 0) + state->monitor = attach_i2c_chip(SUPPLY_MONITOR_ID, "CPU0_monitor"); + else if (index == 1) + state->monitor = attach_i2c_chip(SUPPLY_MONITORB_ID, "CPU1_monitor"); + if (state->monitor == NULL) + goto fail; + + if (read_eeprom(index, &state->mpu)) + goto fail; + + state->count_power = state->mpu.tguardband; + if (state->count_power > CPU_POWER_HISTORY_SIZE) { + printk(KERN_WARNING "Warning ! too many power history slots\n"); + state->count_power = CPU_POWER_HISTORY_SIZE; + } + DBG("CPU %d Using %d power history entries\n", index, state->count_power); + + if (index == 0) { + device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature); + device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage); + device_create_file(&of_dev->dev, &dev_attr_cpu0_current); + device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); + device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); + } else { + device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature); + device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage); + device_create_file(&of_dev->dev, &dev_attr_cpu1_current); + device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); + device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); + } + + return 0; + fail: + if (state->monitor) + detach_i2c_chip(state->monitor); + state->monitor = NULL; + + return -ENODEV; +} + +/* + * Dispose of the state data for one CPU control loop + */ +static void dispose_cpu_state(struct cpu_pid_state *state) +{ + if (state->monitor == NULL) + return; + + if (state->index == 0) { + device_remove_file(&of_dev->dev, &dev_attr_cpu0_temperature); + device_remove_file(&of_dev->dev, &dev_attr_cpu0_voltage); + device_remove_file(&of_dev->dev, &dev_attr_cpu0_current); + device_remove_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); + device_remove_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); + } else { + device_remove_file(&of_dev->dev, &dev_attr_cpu1_temperature); + device_remove_file(&of_dev->dev, &dev_attr_cpu1_voltage); + device_remove_file(&of_dev->dev, &dev_attr_cpu1_current); + device_remove_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); + device_remove_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); + } + + detach_i2c_chip(state->monitor); + state->monitor = NULL; +} + +/* + * Motherboard backside & U3 heatsink fan control loop + */ +static void do_monitor_backside(struct backside_pid_state *state) +{ + s32 temp, integral, derivative; + s64 integ_p, deriv_p, prop_p, sum; + int i, rc; + + if (--state->ticks != 0) + return; + state->ticks = BACKSIDE_PID_INTERVAL; + + DBG("backside:\n"); + + /* Check fan status */ + rc = get_pwm_fan(BACKSIDE_FAN_PWM_ID); + if (rc < 0) { + printk(KERN_WARNING "Error %d reading backside fan !\n", rc); + /* XXX What do we do now ? */ + } else + state->pwm = rc; + DBG(" current pwm: %d\n", state->pwm); + + /* Get some sensor readings */ + temp = i2c_smbus_read_byte_data(state->monitor, MAX6690_EXT_TEMP) << 16; + state->last_temp = temp; + DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), + FIX32TOPRINT(BACKSIDE_PID_INPUT_TARGET)); + + /* Store temperature and error in history array */ + state->cur_sample = (state->cur_sample + 1) % BACKSIDE_PID_HISTORY_SIZE; + state->sample_history[state->cur_sample] = temp; + state->error_history[state->cur_sample] = temp - BACKSIDE_PID_INPUT_TARGET; + + /* If first loop, fill the history table */ + if (state->first) { + for (i = 0; i < (BACKSIDE_PID_HISTORY_SIZE - 1); i++) { + state->cur_sample = (state->cur_sample + 1) % + BACKSIDE_PID_HISTORY_SIZE; + state->sample_history[state->cur_sample] = temp; + state->error_history[state->cur_sample] = + temp - BACKSIDE_PID_INPUT_TARGET; + } + state->first = 0; + } + + /* Calculate the integral term */ + sum = 0; + integral = 0; + for (i = 0; i < BACKSIDE_PID_HISTORY_SIZE; i++) + integral += state->error_history[i]; + integral *= BACKSIDE_PID_INTERVAL; + DBG(" integral: %08x\n", integral); + integ_p = ((s64)BACKSIDE_PID_G_r) * (s64)integral; + DBG(" integ_p: %d\n", (int)(integ_p >> 36)); + sum += integ_p; + + /* Calculate the derivative term */ + derivative = state->error_history[state->cur_sample] - + state->error_history[(state->cur_sample + BACKSIDE_PID_HISTORY_SIZE - 1) + % BACKSIDE_PID_HISTORY_SIZE]; + derivative /= BACKSIDE_PID_INTERVAL; + deriv_p = ((s64)BACKSIDE_PID_G_d) * (s64)derivative; + DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); + sum += deriv_p; + + /* Calculate the proportional term */ + prop_p = ((s64)BACKSIDE_PID_G_p) * (s64)(state->error_history[state->cur_sample]); + DBG(" prop_p: %d\n", (int)(prop_p >> 36)); + sum += prop_p; + + /* Scale sum */ + sum >>= 36; + + DBG(" sum: %d\n", (int)sum); + state->pwm += (s32)sum; + if (state->pwm < BACKSIDE_PID_OUTPUT_MIN) + state->pwm = BACKSIDE_PID_OUTPUT_MIN; + if (state->pwm > BACKSIDE_PID_OUTPUT_MAX) + state->pwm = BACKSIDE_PID_OUTPUT_MAX; + + DBG("** BACKSIDE PWM: %d\n", (int)state->pwm); + set_pwm_fan(BACKSIDE_FAN_PWM_ID, state->pwm); +} + +/* + * Initialize the state structure for the backside fan control loop + */ +static int init_backside_state(struct backside_pid_state *state) +{ + state->ticks = 1; + state->first = 1; + state->pwm = 50; + + state->monitor = attach_i2c_chip(BACKSIDE_MAX_ID, "backside_temp"); + if (state->monitor == NULL) + return -ENODEV; + + device_create_file(&of_dev->dev, &dev_attr_backside_temperature); + device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm); + + return 0; +} + +/* + * Dispose of the state data for the backside control loop + */ +static void dispose_backside_state(struct backside_pid_state *state) +{ + if (state->monitor == NULL) + return; + + device_remove_file(&of_dev->dev, &dev_attr_backside_temperature); + device_remove_file(&of_dev->dev, &dev_attr_backside_fan_pwm); + + detach_i2c_chip(state->monitor); + state->monitor = NULL; +} + +/* + * Drives bay fan control loop + */ +static void do_monitor_drives(struct drives_pid_state *state) +{ + s32 temp, integral, derivative; + s64 integ_p, deriv_p, prop_p, sum; + int i, rc; + + if (--state->ticks != 0) + return; + state->ticks = DRIVES_PID_INTERVAL; + + DBG("drives:\n"); + + /* Check fan status */ + rc = get_rpm_fan(DRIVES_FAN_RPM_ID, !RPM_PID_USE_ACTUAL_SPEED); + if (rc < 0) { + printk(KERN_WARNING "Error %d reading drives fan !\n", rc); + /* XXX What do we do now ? */ + } else + state->rpm = rc; + DBG(" current rpm: %d\n", state->rpm); + + /* Get some sensor readings */ + temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, DS1775_TEMP)) << 8; + state->last_temp = temp; + DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), + FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); + + /* Store temperature and error in history array */ + state->cur_sample = (state->cur_sample + 1) % DRIVES_PID_HISTORY_SIZE; + state->sample_history[state->cur_sample] = temp; + state->error_history[state->cur_sample] = temp - DRIVES_PID_INPUT_TARGET; + + /* If first loop, fill the history table */ + if (state->first) { + for (i = 0; i < (DRIVES_PID_HISTORY_SIZE - 1); i++) { + state->cur_sample = (state->cur_sample + 1) % + DRIVES_PID_HISTORY_SIZE; + state->sample_history[state->cur_sample] = temp; + state->error_history[state->cur_sample] = + temp - DRIVES_PID_INPUT_TARGET; + } + state->first = 0; + } + + /* Calculate the integral term */ + sum = 0; + integral = 0; + for (i = 0; i < DRIVES_PID_HISTORY_SIZE; i++) + integral += state->error_history[i]; + integral *= DRIVES_PID_INTERVAL; + DBG(" integral: %08x\n", integral); + integ_p = ((s64)DRIVES_PID_G_r) * (s64)integral; + DBG(" integ_p: %d\n", (int)(integ_p >> 36)); + sum += integ_p; + + /* Calculate the derivative term */ + derivative = state->error_history[state->cur_sample] - + state->error_history[(state->cur_sample + DRIVES_PID_HISTORY_SIZE - 1) + % DRIVES_PID_HISTORY_SIZE]; + derivative /= DRIVES_PID_INTERVAL; + deriv_p = ((s64)DRIVES_PID_G_d) * (s64)derivative; + DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); + sum += deriv_p; + + /* Calculate the proportional term */ + prop_p = ((s64)DRIVES_PID_G_p) * (s64)(state->error_history[state->cur_sample]); + DBG(" prop_p: %d\n", (int)(prop_p >> 36)); + sum += prop_p; + + /* Scale sum */ + sum >>= 36; + + DBG(" sum: %d\n", (int)sum); + state->rpm += (s32)sum; + if (state->rpm < DRIVES_PID_OUTPUT_MIN) + state->rpm = DRIVES_PID_OUTPUT_MIN; + if (state->rpm > DRIVES_PID_OUTPUT_MAX) + state->rpm = DRIVES_PID_OUTPUT_MAX; + + DBG("** DRIVES RPM: %d\n", (int)state->rpm); + set_rpm_fan(DRIVES_FAN_RPM_ID, state->rpm); +} + +/* + * Initialize the state structure for the drives bay fan control loop + */ +static int init_drives_state(struct drives_pid_state *state) +{ + state->ticks = 1; + state->first = 1; + state->rpm = 1000; + + state->monitor = attach_i2c_chip(DRIVES_DALLAS_ID, "drives_temp"); + if (state->monitor == NULL) + return -ENODEV; + + device_create_file(&of_dev->dev, &dev_attr_drives_temperature); + device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm); + + return 0; +} + +/* + * Dispose of the state data for the drives control loop + */ +static void dispose_drives_state(struct drives_pid_state *state) +{ + if (state->monitor == NULL) + return; + + device_remove_file(&of_dev->dev, &dev_attr_drives_temperature); + device_remove_file(&of_dev->dev, &dev_attr_drives_fan_rpm); + + detach_i2c_chip(state->monitor); + state->monitor = NULL; +} + +static int call_critical_overtemp(void) +{ + char *argv[] = { critical_overtemp_path, NULL }; + static char *envp[] = { "HOME=/", + "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", + NULL }; + + return call_usermodehelper(critical_overtemp_path, argv, envp, 0); +} + + +/* + * Here's the kernel thread that calls the various control loops + */ +static int main_control_loop(void *x) +{ + daemonize("kfand"); + + DBG("main_control_loop started\n"); + + /* Set the PCI fan once for now */ + set_pwm_fan(SLOTS_FAN_PWM_ID, SLOTS_FAN_DEFAULT_PWM); + + while (state == state_attached) { + unsigned long elapsed, start; + + start = jiffies; + + down(&driver_lock); + do_monitor_cpu(&cpu_state[0]); + if (cpu_state[1].monitor != NULL) + do_monitor_cpu(&cpu_state[1]); + do_monitor_backside(&backside_state); + do_monitor_drives(&drives_state); + up(&driver_lock); + + if (critical_state == 1) { + printk(KERN_WARNING "Temperature control detected a critical condition\n"); + printk(KERN_WARNING "Attempting to shut down...\n"); + if (call_critical_overtemp()) { + printk(KERN_WARNING "Can't call %s, power off now!\n", + critical_overtemp_path); + machine_power_off(); + } + } + if (critical_state > 0) + critical_state++; + if (critical_state > MAX_CRITICAL_STATE) { + printk(KERN_WARNING "Shutdown timed out, power off now !\n"); + machine_power_off(); + } + + // FIXME: Deal with signals + set_current_state(TASK_INTERRUPTIBLE); + elapsed = jiffies - start; + if (elapsed < HZ) + schedule_timeout(HZ - elapsed); + } + + DBG("main_control_loop ended\n"); + + ctrl_task = 0; + complete_and_exit(&ctrl_complete, 0); +} + +/* + * Dispose the control loops when tearing down + */ +static void dispose_control_loops(void) +{ + dispose_cpu_state(&cpu_state[0]); + dispose_cpu_state(&cpu_state[1]); + + dispose_backside_state(&backside_state); + dispose_drives_state(&drives_state); +} + +/* + * Create the control loops. U3-0 i2c bus is up, so we can now + * get to the various sensors + */ +static int create_control_loops(void) +{ + struct device_node *np; + + /* Count CPUs from the device-tree, we don't care how many are + * actually used by Linux + */ + cpu_count = 0; + for (np = NULL; NULL != (np = of_find_node_by_type(np, "cpu"));) + cpu_count++; + + DBG("counted %d CPUs in the device-tree\n", cpu_count); + + /* Create control loops for everything. If any fail, everything + * fails + */ + if (init_cpu_state(&cpu_state[0], 0)) + goto fail; + if (cpu_count > 1 && init_cpu_state(&cpu_state[1], 1)) + goto fail; + if (init_backside_state(&backside_state)) + goto fail; + if (init_drives_state(&drives_state)) + goto fail; + + DBG("all control loops up !\n"); + + return 0; + + fail: + DBG("failure creating control loops, disposing\n"); + + dispose_control_loops(); + + return -ENODEV; +} + +/* + * Start the control loops after everything is up, that is create + * the thread that will make them run + */ +static void start_control_loops(void) +{ + init_completion(&ctrl_complete); + + ctrl_task = kernel_thread(main_control_loop, NULL, SIGCHLD | CLONE_KERNEL); +} + +/* + * Stop the control loops when tearing down + */ +static void stop_control_loops(void) +{ + if (ctrl_task != 0) + wait_for_completion(&ctrl_complete); +} + +/* + * Attach to the i2c FCU after detecting U3-1 bus + */ +static int attach_fcu(void) +{ + fcu = attach_i2c_chip(FAN_CTRLER_ID, "fcu"); + if (fcu == NULL) + return -ENODEV; + + DBG("FCU attached\n"); + + return 0; +} + +/* + * Detach from the i2c FCU when tearing down + */ +static void detach_fcu(void) +{ + if (fcu) + detach_i2c_chip(fcu); + fcu = NULL; +} + +/* + * Attach to the i2c controller. We probe the various chips based + * on the device-tree nodes and build everything for the driver to + * run, we then kick the driver monitoring thread + */ +static int therm_pm72_attach(struct i2c_adapter *adapter) +{ + down(&driver_lock); + + /* Check state */ + if (state == state_detached) + state = state_attaching; + if (state != state_attaching) { + up(&driver_lock); + return 0; + } + + /* Check if we are looking for one of these */ + if (u3_0 == NULL && !strcmp(adapter->name, "u3 0")) { + u3_0 = adapter; + DBG("found U3-0, creating control loops\n"); + if (create_control_loops()) + u3_0 = NULL; + } else if (u3_1 == NULL && !strcmp(adapter->name, "u3 1")) { + u3_1 = adapter; + DBG("found U3-1, attaching FCU\n"); + if (attach_fcu()) + u3_1 = NULL; + } + /* We got all we need, start control loops */ + if (u3_0 != NULL && u3_1 != NULL) { + DBG("everything up, starting control loops\n"); + state = state_attached; + start_control_loops(); + } + up(&driver_lock); + + return 0; +} + +/* + * Called on every adapter when the driver or the i2c controller + * is going away. + */ +static int therm_pm72_detach(struct i2c_adapter *adapter) +{ + down(&driver_lock); + + if (state != state_detached) + state = state_detaching; + + /* Stop control loops if any */ + DBG("stopping control loops\n"); + up(&driver_lock); + stop_control_loops(); + down(&driver_lock); + + if (u3_0 != NULL && !strcmp(adapter->name, "u3 0")) { + DBG("lost U3-0, disposing control loops\n"); + dispose_control_loops(); + u3_0 = NULL; + } + + if (u3_1 != NULL && !strcmp(adapter->name, "u3 1")) { + DBG("lost U3-1, detaching FCU\n"); + detach_fcu(); + u3_1 = NULL; + } + if (u3_0 == NULL && u3_1 == NULL) + state = state_detached; + + up(&driver_lock); + + return 0; +} + +static int fcu_of_probe(struct of_device* dev, const struct of_match *match) +{ + int rc; + + state = state_detached; + + rc = i2c_add_driver(&therm_pm72_driver); + if (rc < 0) + return rc; + return 0; +} + +static int fcu_of_remove(struct of_device* dev) +{ + i2c_del_driver(&therm_pm72_driver); + + return 0; +} + +static struct of_match fcu_of_match[] = +{ + { + .name = OF_ANY_MATCH, + .type = "fcu", + .compatible = OF_ANY_MATCH + }, + {}, +}; + +static struct of_platform_driver fcu_of_platform_driver = +{ + .name = "temperature", + .match_table = fcu_of_match, + .probe = fcu_of_probe, + .remove = fcu_of_remove +}; + +/* + * Check machine type, attach to i2c controller + */ +static int __init therm_pm72_init(void) +{ + struct device_node *np; + + if (!machine_is_compatible("PowerMac7,2")) + return -ENODEV; + + printk(KERN_INFO "PowerMac G5 Thermal control driver %s\n", VERSION); + + np = of_find_node_by_type(NULL, "fcu"); + if (np == NULL) { + printk(KERN_ERR "Can't find FCU in device-tree !\n"); + return -ENODEV; + } + of_dev = of_platform_device_create(np, "temperature"); + if (of_dev == NULL) { + printk(KERN_ERR "Can't register FCU platform device !\n"); + return -ENODEV; + } + + of_register_driver(&fcu_of_platform_driver); + + return 0; +} + +static void __exit therm_pm72_exit(void) +{ + of_unregister_driver(&fcu_of_platform_driver); + + if (of_dev) + of_device_unregister(of_dev); +} + +module_init(therm_pm72_init); +module_exit(therm_pm72_exit); + +MODULE_AUTHOR("Benjamin Herrenschmidt "); +MODULE_DESCRIPTION("Driver for Apple's PowerMac7,2 G5 thermal control"); +MODULE_LICENSE("GPL"); + diff -Nru a/drivers/macintosh/therm_pm72.h b/drivers/macintosh/therm_pm72.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/macintosh/therm_pm72.h Tue Feb 17 20:00:14 2004 @@ -0,0 +1,236 @@ +#ifndef __THERM_PMAC_7_2_H__ +#define __THERM_PMAC_7_2_H__ + +typedef unsigned short fu16; +typedef int fs32; +typedef short fs16; + +struct mpu_data +{ + u8 signature; /* 0x00 - EEPROM sig. */ + u8 bytes_used; /* 0x01 - Bytes used in eeprom (160 ?) */ + u8 size; /* 0x02 - EEPROM size (256 ?) */ + u8 version; /* 0x03 - EEPROM version */ + u32 data_revision; /* 0x04 - Dataset revision */ + u8 processor_bin_code[3]; /* 0x08 - Processor BIN code */ + u8 bin_code_expansion; /* 0x0b - ??? (padding ?) */ + u8 processor_num; /* 0x0c - Number of CPUs on this MPU */ + u8 input_mul_bus_div; /* 0x0d - Clock input multiplier/bus divider */ + u8 reserved1[2]; /* 0x0e - */ + u32 input_clk_freq_high; /* 0x10 - Input clock frequency high */ + u8 cpu_nb_target_cycles; /* 0x14 - ??? */ + u8 cpu_statlat; /* 0x15 - ??? */ + u8 cpu_snooplat; /* 0x16 - ??? */ + u8 cpu_snoopacc; /* 0x17 - ??? */ + u8 nb_paamwin; /* 0x18 - ??? */ + u8 nb_statlat; /* 0x19 - ??? */ + u8 nb_snooplat; /* 0x1a - ??? */ + u8 nb_snoopwin; /* 0x1b - ??? */ + u8 api_bus_mode; /* 0x1c - ??? */ + u8 reserved2[3]; /* 0x1d - */ + u32 input_clk_freq_low; /* 0x20 - Input clock frequency low */ + u8 processor_card_slot; /* 0x24 - Processor card slot number */ + u8 reserved3[2]; /* 0x25 - */ + u8 padjmax; /* 0x27 - Max power adjustment (Not in OF!) */ + u8 ttarget; /* 0x28 - Target temperature */ + u8 tmax; /* 0x29 - Max temperature */ + u8 pmaxh; /* 0x2a - Max power */ + u8 tguardband; /* 0x2b - Guardband temp ??? Hist. len in OSX */ + fs32 pid_gp; /* 0x2c - PID proportional gain */ + fs32 pid_gr; /* 0x30 - PID reset gain */ + fs32 pid_gd; /* 0x34 - PID derivative gain */ + fu16 voph; /* 0x38 - Vop High */ + fu16 vopl; /* 0x3a - Vop Low */ + fs16 nactual_die; /* 0x3c - nActual Die */ + fs16 nactual_heatsink; /* 0x3e - nActual Heatsink */ + fs16 nactual_system; /* 0x40 - nActual System */ + u16 calibration_flags; /* 0x42 - Calibration flags */ + fu16 mdiode; /* 0x44 - Diode M value (scaling factor) */ + fs16 bdiode; /* 0x46 - Diode B value (offset) */ + fs32 theta_heat_sink; /* 0x48 - Theta heat sink */ + u16 rminn_intake_fan; /* 0x4c - Intake fan min RPM */ + u16 rmaxn_intake_fan; /* 0x4e - Intake fan max RPM */ + u16 rminn_exhaust_fan; /* 0x50 - Exhaust fan min RPM */ + u16 rmaxn_exhaust_fan; /* 0x52 - Exhaust fan max RPM */ + u8 processor_part_num[8]; /* 0x54 - Processor part number */ + u32 processor_lot_num; /* 0x5c - Processor lot number */ + u8 orig_card_sernum[0x10]; /* 0x60 - Card original serial number */ + u8 curr_card_sernum[0x10]; /* 0x70 - Card current serial number */ + u8 mlb_sernum[0x18]; /* 0x80 - MLB serial number */ + u32 checksum1; /* 0x98 - */ + u32 checksum2; /* 0x9c - */ +}; /* Total size = 0xa0 */ + +/* Display a 16.16 fixed point value */ +#define FIX32TOPRINT(f) ((f) >> 16),((((f) & 0xffff) * 1000) >> 16) + +/* + * Maximum number of seconds to be in critical state (after a + * normal shutdown attempt). If the machine isn't down after + * this counter elapses, we force an immediate machine power + * off. + */ +#define MAX_CRITICAL_STATE 30 +static char * critical_overtemp_path = "/sbin/critical_overtemp"; + +/* + * This option is "weird" :) Basically, if you define this to 1 + * the control loop for the RPMs fans (not PWMs) will apply the + * correction factor obtained from the PID to the _actual_ RPM + * speed read from the FCU. + * If you define the below constant to 0, then it will be + * applied to the setpoint RPM speed, that is basically the + * speed we proviously "asked" for. + * + * I'm not sure which of these Apple's algorithm is supposed + * to use + */ +#define RPM_PID_USE_ACTUAL_SPEED 1 + +/* + * i2c IDs. Currently, we hard code those and assume that + * the FCU is on U3 bus 1 while all sensors are on U3 bus + * 0. This appear to be safe enough for this first version + * of the driver, though I would accept any clean patch + * doing a better use of the device-tree without turning the + * while i2c registration mecanism into a racy mess + */ +#define FAN_CTRLER_ID 0x15e +#define SUPPLY_MONITOR_ID 0x58 +#define SUPPLY_MONITORB_ID 0x5a +#define DRIVES_DALLAS_ID 0x94 +#define BACKSIDE_MAX_ID 0x98 + +/* + * Some MAX6690 & DS1775 register definitions + */ +#define MAX6690_INT_TEMP 0 +#define MAX6690_EXT_TEMP 1 +#define DS1775_TEMP 0 + +/* + * Scaling factors for the AD7417 ADC converters (except + * for the CPU diode which is obtained from the EEPROM). + * Those values are obtained from the property list of + * the darwin driver + */ +#define ADC_12V_CURRENT_SCALE 0x0320 /* _AD2 */ +#define ADC_CPU_VOLTAGE_SCALE 0x00a0 /* _AD3 */ +#define ADC_CPU_CURRENT_SCALE 0x1f40 /* _AD4 */ + +/* + * PID factors for the U3/Backside fan control loop + */ +#define BACKSIDE_FAN_PWM_ID 1 +#define BACKSIDE_PID_G_d 0x02800000 +#define BACKSIDE_PID_G_p 0x00500000 +#define BACKSIDE_PID_G_r 0x00000000 +#define BACKSIDE_PID_INPUT_TARGET 0x00410000 +#define BACKSIDE_PID_INTERVAL 5 +#define BACKSIDE_PID_OUTPUT_MAX 100 +#define BACKSIDE_PID_OUTPUT_MIN 20 +#define BACKSIDE_PID_HISTORY_SIZE 2 + +struct backside_pid_state +{ + int ticks; + struct i2c_client * monitor; + s32 sample_history[BACKSIDE_PID_HISTORY_SIZE]; + s32 error_history[BACKSIDE_PID_HISTORY_SIZE]; + int cur_sample; + s32 last_temp; + int pwm; + int first; +}; + +/* + * PID factors for the Drive Bay fan control loop + */ +#define DRIVES_FAN_RPM_ID 2 +#define DRIVES_PID_G_d 0x01e00000 +#define DRIVES_PID_G_p 0x00500000 +#define DRIVES_PID_G_r 0x00000000 +#define DRIVES_PID_INPUT_TARGET 0x00280000 +#define DRIVES_PID_INTERVAL 5 +#define DRIVES_PID_OUTPUT_MAX 4000 +#define DRIVES_PID_OUTPUT_MIN 300 +#define DRIVES_PID_HISTORY_SIZE 2 + +struct drives_pid_state +{ + int ticks; + struct i2c_client * monitor; + s32 sample_history[BACKSIDE_PID_HISTORY_SIZE]; + s32 error_history[BACKSIDE_PID_HISTORY_SIZE]; + int cur_sample; + s32 last_temp; + int rpm; + int first; +}; + +#define SLOTS_FAN_PWM_ID 2 +#define SLOTS_FAN_DEFAULT_PWM 50 /* Do better here ! */ + +/* + * IDs in Darwin for the sensors & fans + * + * CPU A AD7417_TEMP 10 (CPU A ambient temperature) + * CPU A AD7417_AD1 11 (CPU A diode temperature) + * CPU A AD7417_AD2 12 (CPU A 12V current) + * CPU A AD7417_AD3 13 (CPU A voltage) + * CPU A AD7417_AD4 14 (CPU A current) + * + * CPU A FAKE POWER 48 (I_V_inputs: 13, 14) + * + * CPU B AD7417_TEMP 15 (CPU B ambient temperature) + * CPU B AD7417_AD1 16 (CPU B diode temperature) + * CPU B AD7417_AD2 17 (CPU B 12V current) + * CPU B AD7417_AD3 18 (CPU B voltage) + * CPU B AD7417_AD4 19 (CPU B current) + * + * CPU B FAKE POWER 49 (I_V_inputs: 18, 19) + */ + +#define CPUA_INTAKE_FAN_RPM_ID 3 +#define CPUA_EXHAUST_FAN_RPM_ID 4 +#define CPUB_INTAKE_FAN_RPM_ID 5 +#define CPUB_EXHAUST_FAN_RPM_ID 6 + +#define CPU_INTAKE_SCALE 0x0000f852 +#define CPU_TEMP_HISTORY_SIZE 2 +#define CPU_POWER_HISTORY_SIZE 10 +#define CPU_PID_INTERVAL 1 +#define CPU_MAX_OVERTEMP 30 + +struct cpu_pid_state +{ + int index; + struct i2c_client * monitor; + struct mpu_data mpu; + int overtemp; + s32 temp_history[CPU_TEMP_HISTORY_SIZE]; + int cur_temp; + s32 power_history[CPU_POWER_HISTORY_SIZE]; + s32 error_history[CPU_POWER_HISTORY_SIZE]; + int cur_power; + int count_power; + int rpm; + int intake_rpm; + s32 voltage; + s32 current_a; + s32 last_temp; + int first; +}; + +/* + * Driver state + */ +enum { + state_detached, + state_attaching, + state_attached, + state_detaching, +}; + + +#endif /* __THERM_PMAC_7_2_H__ */ diff -Nru a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/macintosh/therm_windtunnel.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,456 @@ +/* + * Creation Date: <2003/03/14 20:54:13 samuel> + * Time-stamp: <2003/03/15 18:55:53 samuel> + * + * + * + * The G4 "windtunnel" has a single fan controlled by a + * DS1775 fan controller and an ADM1030 thermostat. + * + * The fan controller is equipped with a temperature sensor + * which measures the case temperature. The ADM censor + * measures the CPU temperature. This driver tunes the + * behavior of the fan. It is based upon empirical observations + * of the 'AppleFan' driver under OSX. + * + * WARNING: This driver has only been testen on Apple's + * 1.25 MHz Dual G4 (March 03). Other machines might have + * a different thermal design. It is tuned for a CPU + * temperatur around 57 C. + * + * Copyright (C) 2003 Samuel Rydh (samuel@ibrium.se) + * + * Loosely based upon 'thermostat.c' written by Benjamin Herrenschmidt + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Samuel Rydh "); +MODULE_DESCRIPTION("Apple G4 (windtunnel) fan driver"); +MODULE_LICENSE("GPL"); + +#define LOG_TEMP 0 /* continously log temperature */ + +/* scan 0x48-0x4f (DS1775) and 0x2c-2x2f (ADM1030) */ +static unsigned short normal_i2c[] = { 0x49, 0x2c, I2C_CLIENT_END }; +static unsigned short normal_i2c_range[] = { 0x48, 0x4f, 0x2c, 0x2f, I2C_CLIENT_END }; +static struct work_struct poll_work; + +I2C_CLIENT_INSMOD; + +#define I2C_DRIVERID_G4FAN 0x9001 /* fixme */ + +#define THERMOSTAT_CLIENT_ID 1 +#define FAN_CLIENT_ID 2 + +struct temp_range { + u8 high; /* start the fan */ + u8 low; /* stop the fan */ +}; +struct apple_thermal_info { + u8 id; /* implementation ID */ + u8 fan_count; /* number of fans */ + u8 thermostat_count; /* number of thermostats */ + u8 unused[5]; + struct temp_range ranges[4]; /* temperature ranges (may be [])*/ +}; + +static int do_detect( struct i2c_adapter *adapter, int addr, int kind); + +static struct { + struct i2c_client *thermostat; + struct i2c_client *fan; + int error; + struct timer_list timer; + + int overheat_temp; /* 100% fan at this temp */ + int overheat_hyst; + int temp; + int casetemp; + int fan_level; /* active fan_table setting */ + + int downind; + int upind; + + int r0, r1, r20, r23, r25; /* saved register */ +} x; + +static struct { + int temp; + int fan_setting; +} fan_up_table[] = { + { 0x0000, 11 }, /* min fan */ + { 0x3900, 8 }, /* 57.0 C */ + { 0x3a4a, 7 }, /* 58.3 C */ + { 0x3ad3, 6 }, /* 58.8 C */ + { 0x3b3c, 5 }, /* 59.2 C */ + { 0x3b94, 4 }, /* 59.6 C */ + { 0x3be3, 3 }, /* 58.9 C */ + { 0x3c29, 2 }, /* 59.2 C */ + { 0xffff, 1 } /* on fire */ +}; +static struct { + int temp; + int fan_setting; +} fan_down_table[] = { + { 0x3700, 11 }, /* 55.0 C */ + { 0x374a, 6 }, + { 0x3800, 7 }, /* 56.0 C */ + { 0x3900, 8 }, /* 57.0 C */ + { 0x3a4a, 7 }, /* 58.3 C */ + { 0x3ad3, 6 }, /* 58.8 C */ + { 0x3b3c, 5 }, /* 59.2 C */ + { 0x3b94, 4 }, /* 58.9 C */ + { 0x3be3, 3 }, /* 58.9 C */ + { 0x3c29, 2 }, /* 59.2 C */ + { 0xffff, 1 } +}; + +static int +write_reg( struct i2c_client *cl, int reg, int data, int len ) +{ + u8 tmp[3]; + + if( len < 1 || len > 2 || data < 0 ) + return -EINVAL; + + tmp[0] = reg; + tmp[1] = (len == 1) ? data : (data >> 8); + tmp[2] = data; + len++; + + if( i2c_master_send(cl, tmp, len) != len ) + return -ENODEV; + return 0; +} + +static int +read_reg( struct i2c_client *cl, int reg, int len ) +{ + u8 buf[2]; + + if( len != 1 && len != 2 ) + return -EINVAL; + buf[0] = reg; + if( i2c_master_send(cl, buf, 1) != 1 ) + return -ENODEV; + if( i2c_master_recv(cl, buf, len) != len ) + return -ENODEV; + return (len == 2)? ((unsigned int)buf[0] << 8) | buf[1] : buf[0]; +} + + +static void +print_temp( const char *s, int temp ) +{ + printk("%s%d.%d C", s ? s : "", temp>>8, (temp & 255)*10/256 ); +} + +static void +tune_fan( int fan_setting ) +{ + int val = (fan_setting << 3) | 7; + x.fan_level = fan_setting; + + //write_reg( x.fan, 0x24, val, 1 ); + write_reg( x.fan, 0x25, val, 1 ); + write_reg( x.fan, 0x20, 0, 1 ); + print_temp("CPU-temp: ", x.temp ); + if( x.casetemp ) + print_temp(", Case: ", x.casetemp ); + printk(" Tuning fan: %d (%02x)\n", fan_setting, val ); +} + +static void +poll_temp( void *param ) +{ + int temp = read_reg( x.thermostat, 0, 2 ); + int i, level, casetemp; + + /* this actually occurs when the computer is loaded */ + if( temp < 0 ) + goto out; + + casetemp = read_reg(x.fan, 0x0b, 1) << 8; + casetemp |= (read_reg(x.fan, 0x06, 1) & 0x7) << 5; + + if( LOG_TEMP && x.temp != temp ) { + print_temp("CPU-temp: ", temp ); + print_temp(", Case: ", casetemp ); + printk(", Fan: %d\n", x.fan_level ); + } + x.temp = temp; + x.casetemp = casetemp; + + level = -1; + for( i=0; (temp & 0xffff) > fan_down_table[i].temp ; i++ ) + ; + if( i < x.downind ) + level = fan_down_table[i].fan_setting; + x.downind = i; + + for( i=0; (temp & 0xfffe) >= fan_up_table[i+1].temp ; i++ ) + ; + if( x.upind < i ) + level = fan_up_table[i].fan_setting; + x.upind = i; + + if( level >= 0 ) + tune_fan( level ); + out: + x.timer.expires = jiffies + 8*HZ; + add_timer( &x.timer ); +} + +static void +schedule_poll( unsigned long t ) +{ + schedule_work(&poll_work); +} + +/************************************************************************/ +/* i2c probing and setup */ +/************************************************************************/ + +static int +do_attach( struct i2c_adapter *adapter ) +{ + return i2c_probe( adapter, &addr_data, &do_detect ); +} + +static int +do_detach( struct i2c_client *client ) +{ + int err; + + printk("do_detach: id %d\n", client->id ); + if( (err=i2c_detach_client(client)) ) { + printk("failed to detach thermostat client\n"); + return err; + } + kfree( client ); + return 0; +} + +static struct i2c_driver g4fan_driver = { + .name = "Apple G4 Thermostat/Fan", + .id = I2C_DRIVERID_G4FAN, + .flags = I2C_DF_NOTIFY, + .attach_adapter = &do_attach, + .detach_client = &do_detach, + .command = NULL, +}; + +static int +detect_fan( struct i2c_client *cl ) +{ + /* check that this is an ADM1030 */ + if( read_reg(cl, 0x3d, 1) != 0x30 || read_reg(cl, 0x3e, 1) != 0x41 ) + goto out; + printk("ADM1030 fan controller detected at %02x\n", cl->addr ); + + if( x.fan ) { + x.error |= 2; + goto out; + } + x.fan = cl; + cl->id = FAN_CLIENT_ID; + strncpy( cl->name, "ADM1030 fan controller", sizeof(cl->name) ); + + if( i2c_attach_client( cl ) ) + goto out; + return 0; + out: + if( cl != x.fan ) + kfree( cl ); + return 0; +} + +static int +detect_thermostat( struct i2c_client *cl ) +{ + int hyst_temp, os_temp, temp; + + if( (temp=read_reg(cl, 0, 2)) < 0 ) + goto out; + + /* temperature sanity check */ + if( temp < 0x1600 || temp > 0x3c00 ) + goto out; + hyst_temp = read_reg(cl, 2, 2); + os_temp = read_reg(cl, 3, 2); + if( hyst_temp < 0 || os_temp < 0 ) + goto out; + + printk("DS1775 digital thermometer detected at %02x\n", cl->addr ); + print_temp("Temp: ", temp ); + print_temp(" Hyst: ", hyst_temp ); + print_temp(" OS: ", os_temp ); + printk("\n"); + + if( x.thermostat ) { + x.error |= 1; + goto out; + } + x.temp = temp; + x.thermostat = cl; + x.overheat_temp = os_temp; + x.overheat_hyst = hyst_temp; + + cl->id = THERMOSTAT_CLIENT_ID; + strncpy( cl->name, "DS1775 thermostat", sizeof(cl->name) ); + + if( i2c_attach_client( cl ) ) + goto out; + return 0; +out: + kfree( cl ); + return 0; +} + +static int +do_detect( struct i2c_adapter *adapter, int addr, int kind ) +{ + struct i2c_client *cl; + + if( strncmp(adapter->name, "uni-n", 5) ) + return 0; + if( !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA + | I2C_FUNC_SMBUS_WRITE_BYTE) ) + return 0; + + if( !(cl=kmalloc( sizeof(struct i2c_client), GFP_KERNEL )) ) + return -ENOMEM; + memset( cl, 0, sizeof(struct i2c_client) ); + + cl->addr = addr; + cl->adapter = adapter; + cl->driver = &g4fan_driver; + cl->flags = 0; + + if( addr < 0x48 ) + return detect_fan( cl ); + return detect_thermostat( cl ); +} + +#define PRINT_REG( r ) printk("reg %02x = %02x\n", r, read_reg(x.fan, r, 1) ) + +static int __init +g4fan_init( void ) +{ + struct apple_thermal_info *info; + struct device_node *np; + int ret, val; + + np = of_find_node_by_name(NULL, "power-mgt"); + if (np == NULL) + return -ENODEV; + info = (struct apple_thermal_info*)get_property(np, "thermal-info", NULL); + of_node_put(np); + if (info == NULL) + return -ENODEV; + + /* check for G4 "Windtunnel" SMP */ + if( machine_is_compatible("PowerMac3,6") ) { + if( info->id != 3 ) { + printk(KERN_ERR "g4fan: design id %d unknown\n", info->id); + return -ENODEV; + } + } else { + printk(KERN_ERR "g4fan: unsupported machine type\n"); + return -ENODEV; + } + if( (ret=i2c_add_driver(&g4fan_driver)) ) + return ret; + + if( !x.thermostat || !x.fan ) { + i2c_del_driver(&g4fan_driver ); + return -ENODEV; + } + + /* save registers (if we unload the module) */ + x.r0 = read_reg( x.fan, 0x00, 1 ); + x.r1 = read_reg( x.fan, 0x01, 1 ); + x.r20 = read_reg( x.fan, 0x20, 1 ); + x.r23 = read_reg( x.fan, 0x23, 1 ); + x.r25 = read_reg( x.fan, 0x25, 1 ); + + /* improve measurement resolution (convergence time 1.5s) */ + if( (val=read_reg( x.thermostat, 1, 1 )) >= 0 ) { + val |= 0x60; + if( write_reg( x.thermostat, 1, val, 1 ) ) + printk("Failed writing config register\n"); + } + /* disable interrupts and TAC input */ + write_reg( x.fan, 0x01, 0x01, 1 ); + /* enable filter */ + write_reg( x.fan, 0x23, 0x91, 1 ); + /* remote temp. controls fan */ + write_reg( x.fan, 0x00, 0x95, 1 ); + + /* The thermostat (which besides measureing temperature controls + * has a THERM output which puts the fan on 100%) is usually + * set to kick in at 80 C (chip default). We reduce this a bit + * to be on the safe side (OSX doesn't)... + */ + if( x.overheat_temp == (80 << 8) ) { + x.overheat_temp = 65 << 8; + x.overheat_hyst = 60 << 8; + write_reg( x.thermostat, 2, x.overheat_hyst, 2 ); + write_reg( x.thermostat, 3, x.overheat_temp, 2 ); + + print_temp("Reducing overheating limit to ", x.overheat_temp ); + print_temp(" (Hyst: ", x.overheat_hyst ); + printk(")\n"); + } + + /* set an initial fan setting */ + x.upind = x.downind = 1; + tune_fan( fan_up_table[x.upind].fan_setting ); + + INIT_WORK(&poll_work, poll_temp, NULL); + + init_timer( &x.timer ); + x.timer.expires = jiffies + 8*HZ; + x.timer.function = schedule_poll; + add_timer( &x.timer ); + return 0; +} + +static void __exit +g4fan_exit( void ) +{ + del_timer( &x.timer ); + + write_reg( x.fan, 0x01, x.r1, 1 ); + write_reg( x.fan, 0x20, x.r20, 1 ); + write_reg( x.fan, 0x23, x.r23, 1 ); + write_reg( x.fan, 0x25, x.r25, 1 ); + write_reg( x.fan, 0x00, x.r0, 1 ); + + i2c_del_driver( &g4fan_driver ); +} + +module_init(g4fan_init); +module_exit(g4fan_exit); + diff -Nru a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c --- a/drivers/macintosh/via-pmu.c Tue Feb 17 20:00:08 2004 +++ b/drivers/macintosh/via-pmu.c Tue Feb 17 20:00:08 2004 @@ -57,7 +57,6 @@ #include #include #include -#include #ifdef CONFIG_PMAC_BACKLIGHT #include #endif @@ -73,13 +72,6 @@ /* How many iterations between battery polls */ #define BATTERY_POLLING_COUNT 2 -/* Some debugging tools */ -#ifdef CONFIG_XMON -//#define LIVE_DEBUG(req) ((req) && (req)->data[0] == 0x7d) -#define LIVE_DEBUG(req) (0) -static int whacky_debug; -#endif /* CONFIG_XMON */ - static volatile unsigned char *via; /* VIA registers - spaced 0x200 bytes apart */ @@ -168,6 +160,7 @@ static struct proc_dir_entry *proc_pmu_info; static struct proc_dir_entry *proc_pmu_irqstats; static struct proc_dir_entry *proc_pmu_options; +static int option_server_mode; #ifdef CONFIG_PMAC_PBOOK int pmu_battery_count; @@ -334,7 +327,8 @@ pmu_kind = PMU_PADDINGTON_BASED; else if (device_is_compatible(vias->parent, "heathrow")) pmu_kind = PMU_HEATHROW_BASED; - else if (device_is_compatible(vias->parent, "Keylargo")) { + else if (device_is_compatible(vias->parent, "Keylargo") + || device_is_compatible(vias->parent, "K2-Keylargo")) { struct device_node *gpio, *gpiop; pmu_kind = PMU_KEYLARGO_BASED; @@ -349,6 +343,8 @@ if (gpiop && gpiop->n_addrs) { gpio_reg = ioremap(gpiop->addrs->address, 0x10); gpio = find_devices("extint-gpio1"); + if (gpio == NULL) + gpio = find_devices("pmu-interrupt"); if (gpio && gpio->parent == gpiop && gpio->n_intrs) gpio_irq = gpio->intrs[0].line; } @@ -370,7 +366,9 @@ printk(KERN_INFO "PMU driver %d initialized for %s, firmware: %02x\n", PMU_DRIVER_VERSION, pbook_type[pmu_kind], pmu_version); +#ifndef CONFIG_PPC64 sys_ctrler = SYS_CTRLER_PMU; +#endif return 1; } @@ -455,7 +453,9 @@ if (vias == NULL) return -ENODEV; +#ifndef CONFIG_PPC64 request_OF_resource(vias, 0, NULL); +#endif #ifdef CONFIG_PMAC_BACKLIGHT /* Enable backlight */ register_backlight_controller(&pmu_backlight_controller, NULL, "pmu"); @@ -564,7 +564,19 @@ pmu_wait_complete(&req); if (req.reply_len > 0) pmu_version = req.reply[0]; - + + /* Read server mode setting */ + if (pmu_kind == PMU_KEYLARGO_BASED) { + pmu_request(&req, NULL, 2, PMU_POWER_EVENTS, + PMU_PWR_GET_POWERUP_EVENTS); + pmu_wait_complete(&req); + if (req.reply_len == 2) { + if (req.reply[1] & PMU_PWR_WAKEUP_AC_INSERT) + option_server_mode = 1; + printk(KERN_INFO "via-pmu: Server Mode is %s\n", + option_server_mode ? "enabled" : "disabled"); + } + } return 1; } @@ -574,6 +586,7 @@ return pmu_kind; } +#ifndef CONFIG_PPC64 static inline void wakeup_decrementer(void) { set_dec(tb_ticks_per_jiffy); @@ -582,7 +595,30 @@ */ last_jiffy_stamp(0) = tb_last_stamp = get_tbl(); } +#endif +static void pmu_set_server_mode(int server_mode) +{ + struct adb_request req; + + if (pmu_kind != PMU_KEYLARGO_BASED) + return; + + option_server_mode = server_mode; + pmu_request(&req, NULL, 2, PMU_POWER_EVENTS, PMU_PWR_GET_POWERUP_EVENTS); + pmu_wait_complete(&req); + if (req.reply_len < 2) + return; + if (server_mode) + pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, + PMU_PWR_SET_POWERUP_EVENTS, + req.reply[0], PMU_PWR_WAKEUP_AC_INSERT); + else + pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, + PMU_PWR_CLR_POWERUP_EVENTS, + req.reply[0], PMU_PWR_WAKEUP_AC_INSERT); + pmu_wait_complete(&req); +} #ifdef CONFIG_PMAC_PBOOK @@ -845,6 +881,8 @@ if (pmu_kind == PMU_KEYLARGO_BASED && can_sleep) p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup); #endif /* CONFIG_PMAC_PBOOK */ + if (pmu_kind == PMU_KEYLARGO_BASED) + p += sprintf(p, "server_mode=%d\n", option_server_mode); return p - page; } @@ -884,6 +922,12 @@ if (!strcmp(label, "lid_wakeup")) option_lid_wakeup = ((*val) == '1'); #endif /* CONFIG_PMAC_PBOOK */ + if (pmu_kind == PMU_KEYLARGO_BASED && !strcmp(label, "server_mode")) { + int new_value; + new_value = ((*val) == '1'); + if (new_value != option_server_mode) + pmu_set_server_mode(new_value); + } return fcount; } @@ -1167,12 +1211,6 @@ wait_for_ack(); /* set the shift register to shift out and send a byte */ send_byte(req->data[0]); -#ifdef CONFIG_XMON - if (LIVE_DEBUG(req)) - xmon_printf("R"); - else - whacky_debug = 0; -#endif /* CONFIG_XMON */ } void __openfirmware @@ -1343,7 +1381,7 @@ } pmu_done(req); } else { -#ifdef CONFIG_XMON +#if defined(CONFIG_XMON) && !defined(CONFIG_PPC64) if (len == 4 && data[1] == 0x2c) { extern int xmon_wants_key, xmon_adb_keycode; if (xmon_wants_key) { @@ -1351,7 +1389,7 @@ return; } } -#endif /* CONFIG_XMON */ +#endif /* defined(CONFIG_XMON) && !defined(CONFIG_PPC64) */ #ifdef CONFIG_ADB /* * XXX On the [23]400 the PMU gives us an up @@ -1425,29 +1463,17 @@ case sending: req = current_req; if (data_len < 0) { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(req)) - xmon_printf("s"); -#endif /* CONFIG_XMON */ data_len = req->nbytes - 1; send_byte(data_len); break; } if (data_index <= data_len) { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(req)) - xmon_printf("S"); -#endif /* CONFIG_XMON */ send_byte(req->data[data_index++]); break; } req->sent = 1; data_len = pmu_data_len[req->data[0]][1]; if (data_len == 0) { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(req)) - xmon_printf("D"); -#endif /* CONFIG_XMON */ pmu_state = idle; current_req = req->next; if (req->reply_expected) @@ -1455,10 +1481,6 @@ else return req; } else { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(req)) - xmon_printf("-"); -#endif /* CONFIG_XMON */ pmu_state = reading; data_index = 0; reply_ptr = req->reply + req->reply_len; @@ -1481,18 +1503,10 @@ case reading: case reading_intr: if (data_len == -1) { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(current_req)) - xmon_printf("r"); -#endif /* CONFIG_XMON */ data_len = bite; if (bite > 32) printk(KERN_ERR "PMU: bad reply len %d\n", bite); } else if (data_index < 32) { -#ifdef CONFIG_XMON - if (LIVE_DEBUG(current_req)) - xmon_printf("R"); -#endif /* CONFIG_XMON */ reply_ptr[data_index++] = bite; } if (data_index < data_len) { @@ -1500,12 +1514,6 @@ break; } -#ifdef CONFIG_XMON - if (LIVE_DEBUG(current_req)) { - whacky_debug = 1; - xmon_printf("D"); - } -#endif /* CONFIG_XMON */ if (pmu_state == reading_intr) { pmu_state = idle; int_data_state[int_data_last] = int_data_ready; @@ -1552,10 +1560,6 @@ intr = in_8(&via[IFR]) & (SR_INT | CB1_INT); if (intr == 0) break; -#ifdef CONFIG_XMON - if (whacky_debug) - xmon_printf("|%02x|", intr); -#endif /* CONFIG_XMON */ handled = 1; if (++nloop > 1000) { printk(KERN_DEBUG "PMU: stuck in intr loop, " @@ -1578,10 +1582,6 @@ recheck: if (pmu_state == idle) { if (adb_int_pending) { -#ifdef CONFIG_XMON - if (whacky_debug) - xmon_printf("!A!"); -#endif /* CONFIG_XMON */ if (int_data_state[0] == int_data_empty) int_data_last = 0; else if (int_data_state[1] == int_data_empty) @@ -1758,6 +1758,11 @@ pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB | PMU_INT_TICK ); pmu_wait_complete(&req); + } else { + /* Disable server mode on shutdown or we'll just + * wake up again + */ + pmu_set_server_mode(0); } pmu_request(&req, NULL, 5, PMU_SHUTDOWN, @@ -2288,8 +2293,6 @@ } extern long sys_sync(void); -extern void pm_prepare_console(void); -extern void pm_restore_console(void); static int __pmac pmac_suspend_devices(void) diff -Nru a/drivers/md/Makefile b/drivers/md/Makefile --- a/drivers/md/Makefile Tue Feb 17 20:00:07 2004 +++ b/drivers/md/Makefile Tue Feb 17 20:00:07 2004 @@ -24,26 +24,43 @@ obj-$(CONFIG_BLK_DEV_MD) += md.o obj-$(CONFIG_BLK_DEV_DM) += dm-mod.o -# Files generated that shall be removed upon make clean -clean-files := raid6int*.c raid6tables.c mktables - -$(obj)/raid6int1.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 1 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6int2.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 2 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6int4.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 4 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6int8.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 8 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6int16.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 16 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6int32.c: $(src)/raid6int.uc $(src)/unroll.pl - $(PERL) $(src)/unroll.pl 32 < $< > $@ || ( rm -f $@ && exit 1 ) - -$(obj)/raid6tables.c: $(obj)/mktables - $(obj)/mktables > $@ || ( rm -f $@ && exit 1 ) +quiet_cmd_unroll = UNROLL $@ + cmd_unroll = $(PERL) $(srctree)/$(src)/unroll.pl $(UNROLL) \ + < $< > $@ || ( rm -f $@ && exit 1 ) + +targets += raid6int1.c +$(obj)/raid6int1.c: UNROLL := 1 +$(obj)/raid6int1.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +targets += raid6int2.c +$(obj)/raid6int2.c: UNROLL := 2 +$(obj)/raid6int2.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +targets += raid6int4.c +$(obj)/raid6int4.c: UNROLL := 4 +$(obj)/raid6int4.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +targets += raid6int8.c +$(obj)/raid6int8.c: UNROLL := 8 +$(obj)/raid6int8.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +targets += raid6int16.c +$(obj)/raid6int16.c: UNROLL := 16 +$(obj)/raid6int16.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +targets += raid6int32.c +$(obj)/raid6int32.c: UNROLL := 32 +$(obj)/raid6int32.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE + $(call if_changed,unroll) + +quiet_cmd_mktable = TABLE $@ + cmd_mktable = $(obj)/mktables > $@ || ( rm -f $@ && exit 1 ) + +targets += raid6tables.c +$(obj)/raid6tables.c: $(obj)/mktables FORCE + $(call if_changed,mktable) diff -Nru a/drivers/md/dm.c b/drivers/md/dm.c --- a/drivers/md/dm.c Tue Feb 17 20:00:07 2004 +++ b/drivers/md/dm.c Tue Feb 17 20:00:07 2004 @@ -674,7 +674,7 @@ bdev = bdget_disk(disk, 0); if (bdev) { down(&bdev->bd_inode->i_sem); - i_size_write(bdev->bd_inode, size << SECTOR_SHIFT); + i_size_write(bdev->bd_inode, (loff_t)size << SECTOR_SHIFT); up(&bdev->bd_inode->i_sem); bdput(bdev); } diff -Nru a/drivers/md/linear.c b/drivers/md/linear.c --- a/drivers/md/linear.c Tue Feb 17 20:00:06 2004 +++ b/drivers/md/linear.c Tue Feb 17 20:00:06 2004 @@ -208,6 +208,14 @@ dev_info_t *tmp_dev; sector_t block; + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } + tmp_dev = which_dev(mddev, bio->bi_sector); block = bio->bi_sector >> 1; diff -Nru a/drivers/md/md.c b/drivers/md/md.c --- a/drivers/md/md.c Tue Feb 17 20:00:06 2004 +++ b/drivers/md/md.c Tue Feb 17 20:00:06 2004 @@ -512,11 +512,6 @@ goto abort; } - if (sb->md_minor >= MAX_MD_DEVS) { - printk(KERN_ERR "md: %s: invalid raid minor (%x)\n", - b, sb->md_minor); - goto abort; - } if (sb->raid_disks <= 0) goto abort; @@ -999,10 +994,10 @@ same_pdev = match_dev_unit(mddev, rdev); if (same_pdev) printk(KERN_WARNING - "md%d: WARNING: %s appears to be on the same physical" + "%s: WARNING: %s appears to be on the same physical" " disk as %s. True\n protection against single-disk" " failure might be compromised.\n", - mdidx(mddev), bdevname(rdev->bdev,b), + mdname(mddev), bdevname(rdev->bdev,b), bdevname(same_pdev->bdev,b2)); /* Verify rdev->desc_nr is unique. @@ -1182,7 +1177,7 @@ printk("md: * *\n"); printk("md: **********************************\n"); ITERATE_MDDEV(mddev,tmp) { - printk("md%d: ", mdidx(mddev)); + printk("%s: ", mdname(mddev)); ITERATE_RDEV(mddev,rdev,tmp2) printk("<%s>", bdevname(rdev->bdev,b)); @@ -1262,8 +1257,8 @@ return; dprintk(KERN_INFO - "md: updating md%d RAID superblock on device (in sync %d)\n", - mdidx(mddev),mddev->in_sync); + "md: updating %s RAID superblock on device (in sync %d)\n", + mdname(mddev),mddev->in_sync); err = 0; ITERATE_RDEV(mddev,rdev,tmp) { @@ -1429,8 +1424,8 @@ if (mddev->major_version != MD_MAJOR_VERSION || mddev->minor_version > MD_MINOR_VERSION) { printk(KERN_ALERT - "md: md%d: unsupported raid array version %d.%d.%d\n", - mdidx(mddev), mddev->major_version, + "md: %s: unsupported raid array version %d.%d.%d\n", + mdname(mddev), mddev->major_version, mddev->minor_version, mddev->patch_version); goto abort; } @@ -1438,9 +1433,9 @@ if ((mddev->recovery_cp != MaxSector) && ((mddev->level == 1) || ((mddev->level >= 4) && (mddev->level <= 6)))) - printk(KERN_ERR "md: md%d: raid array is not clean" + printk(KERN_ERR "md: %s: raid array is not clean" " -- starting background reconstruction\n", - mdidx(mddev)); + mdname(mddev)); return 0; abort: @@ -1665,8 +1660,8 @@ mddev->ro = 0; set_disk_ro(disk, 0); - printk(KERN_INFO "md: md%d switched to read-write mode.\n", - mdidx(mddev)); + printk(KERN_INFO "md: %s switched to read-write mode.\n", + mdname(mddev)); /* * Kick recovery or resync if necessary */ @@ -1674,8 +1669,8 @@ md_wakeup_thread(mddev->thread); err = 0; } else { - printk(KERN_ERR "md: md%d has no personality assigned.\n", - mdidx(mddev)); + printk(KERN_ERR "md: %s has no personality assigned.\n", + mdname(mddev)); err = -EINVAL; } @@ -1690,7 +1685,7 @@ if (mddev->pers) { if (atomic_read(&mddev->active)>2) { - printk("md: md%d still in use.\n",mdidx(mddev)); + printk("md: %s still in use.\n",mdname(mddev)); return -EBUSY; } @@ -1732,7 +1727,7 @@ */ if (!ro) { struct gendisk *disk; - printk(KERN_INFO "md: md%d stopped.\n", mdidx(mddev)); + printk(KERN_INFO "md: %s stopped.\n", mdname(mddev)); export_array(mddev); @@ -1741,8 +1736,8 @@ if (disk) set_capacity(disk, 0); } else - printk(KERN_INFO "md: md%d switched to read-only mode.\n", - mdidx(mddev)); + printk(KERN_INFO "md: %s switched to read-only mode.\n", + mdname(mddev)); err = 0; out: return err; @@ -1821,16 +1816,16 @@ break; } if (mddev_lock(mddev)) - printk(KERN_WARNING "md: md%d locked, cannot run\n", - mdidx(mddev)); + printk(KERN_WARNING "md: %s locked, cannot run\n", + mdname(mddev)); else if (mddev->raid_disks || mddev->major_version || !list_empty(&mddev->disks)) { printk(KERN_WARNING - "md: md%d already running, cannot run %s\n", - mdidx(mddev), bdevname(rdev0->bdev,b)); + "md: %s already running, cannot run %s\n", + mdname(mddev), bdevname(rdev0->bdev,b)); mddev_unlock(mddev); - } else { - printk(KERN_INFO "md: created md%d\n", mdidx(mddev)); + } else if (rdev0->preferred_minor >= 0 && rdev0->preferred_minor < MAX_MD_DEVS) { + printk(KERN_INFO "md: created %s\n", mdname(mddev)); ITERATE_RDEV_GENERIC(candidates,rdev,tmp) { list_del_init(&rdev->same_set); if (bind_rdev_to_array(rdev, mddev)) @@ -1838,7 +1833,9 @@ } autorun_array(mddev); mddev_unlock(mddev); - } + } else + printk(KERN_WARNING "md: %s had invalid preferred minor %d\n", + bdevname(rdev->bdev, b), rdev0->preferred_minor); /* on success, candidates will be empty, on error * it won't... */ @@ -2062,8 +2059,8 @@ int err; if (!mddev->pers->hot_add_disk) { printk(KERN_WARNING - "md%d: personality does not support diskops!\n", - mdidx(mddev)); + "%s: personality does not support diskops!\n", + mdname(mddev)); return -EINVAL; } rdev = md_import_device(dev, mddev->major_version, @@ -2088,8 +2085,8 @@ * for major_version==0 superblocks */ if (mddev->major_version != 0) { - printk(KERN_WARNING "md%d: ADD_NEW_DISK not supported\n", - mdidx(mddev)); + printk(KERN_WARNING "%s: ADD_NEW_DISK not supported\n", + mdname(mddev)); return -EINVAL; } @@ -2143,8 +2140,8 @@ if (!mddev->pers) return -ENODEV; - printk(KERN_INFO "md: trying to generate %s error in md%d ... \n", - __bdevname(dev, b), mdidx(mddev)); + printk(KERN_INFO "md: trying to generate %s error in %s ... \n", + __bdevname(dev, b), mdname(mddev)); rdev = find_rdev(mddev, dev); if (!rdev) { @@ -2178,8 +2175,8 @@ if (!mddev->pers) return -ENODEV; - printk(KERN_INFO "md: trying to remove %s from md%d ... \n", - __bdevname(dev, b), mdidx(mddev)); + printk(KERN_INFO "md: trying to remove %s from %s ... \n", + __bdevname(dev, b), mdname(mddev)); rdev = find_rdev(mddev, dev); if (!rdev) @@ -2193,8 +2190,8 @@ return 0; busy: - printk(KERN_WARNING "md: cannot remove active disk %s from md%d ... \n", - bdevname(rdev->bdev,b), mdidx(mddev)); + printk(KERN_WARNING "md: cannot remove active disk %s from %s ... \n", + bdevname(rdev->bdev,b), mdname(mddev)); return -EBUSY; } @@ -2208,19 +2205,19 @@ if (!mddev->pers) return -ENODEV; - printk(KERN_INFO "md: trying to hot-add %s to md%d ... \n", - __bdevname(dev, b), mdidx(mddev)); + printk(KERN_INFO "md: trying to hot-add %s to %s ... \n", + __bdevname(dev, b), mdname(mddev)); if (mddev->major_version != 0) { - printk(KERN_WARNING "md%d: HOT_ADD may only be used with" + printk(KERN_WARNING "%s: HOT_ADD may only be used with" " version-0 superblocks.\n", - mdidx(mddev)); + mdname(mddev)); return -EINVAL; } if (!mddev->pers->hot_add_disk) { printk(KERN_WARNING - "md%d: personality does not support diskops!\n", - mdidx(mddev)); + "%s: personality does not support diskops!\n", + mdname(mddev)); return -EINVAL; } @@ -2238,8 +2235,8 @@ if (size < mddev->size) { printk(KERN_WARNING - "md%d: disk size %llu blocks < array size %llu\n", - mdidx(mddev), (unsigned long long)size, + "%s: disk size %llu blocks < array size %llu\n", + mdname(mddev), (unsigned long long)size, (unsigned long long)mddev->size); err = -ENOSPC; goto abort_export; @@ -2247,8 +2244,8 @@ if (rdev->faulty) { printk(KERN_WARNING - "md: can not hot-add faulty %s disk to md%d!\n", - bdevname(rdev->bdev,b), mdidx(mddev)); + "md: can not hot-add faulty %s disk to %s!\n", + bdevname(rdev->bdev,b), mdname(mddev)); err = -EINVAL; goto abort_export; } @@ -2262,8 +2259,8 @@ */ if (rdev->desc_nr == mddev->max_disks) { - printk(KERN_WARNING "md%d: can not hot-add to full array!\n", - mdidx(mddev)); + printk(KERN_WARNING "%s: can not hot-add to full array!\n", + mdname(mddev)); err = -EBUSY; goto abort_unbind_export; } @@ -2445,15 +2442,15 @@ if (!list_empty(&mddev->disks)) { printk(KERN_WARNING - "md: array md%d already has disks!\n", - mdidx(mddev)); + "md: array %s already has disks!\n", + mdname(mddev)); err = -EBUSY; goto abort_unlock; } if (mddev->raid_disks) { printk(KERN_WARNING - "md: array md%d already initialised!\n", - mdidx(mddev)); + "md: array %s already initialised!\n", + mdname(mddev)); err = -EBUSY; goto abort_unlock; } @@ -2648,7 +2645,7 @@ * Detach thread */ - daemonize(thread->name, mdidx(thread->mddev)); + daemonize(thread->name, mdname(thread->mddev)); current->exit_signal = SIGCHLD; allow_signal(SIGKILL); @@ -2693,7 +2690,7 @@ void md_wakeup_thread(mdk_thread_t *thread) { if (thread) { - dprintk("md: waking up MD thread %p.\n", thread); + dprintk("md: waking up MD thread %s.\n", thread->tsk->comm); set_bit(THREAD_WAKEUP, &thread->flags); wake_up(&thread->wqueue); } @@ -2754,12 +2751,6 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev) { - dprintk("md_error dev:(%d:%d), rdev:(%d:%d), (caller: %p,%p,%p,%p).\n", - MD_MAJOR,mdidx(mddev), - MAJOR(rdev->bdev->bd_dev), MINOR(rdev->bdev->bd_dev), - __builtin_return_address(0),__builtin_return_address(1), - __builtin_return_address(2),__builtin_return_address(3)); - if (!mddev) { MD_BUG(); return; @@ -2767,6 +2758,13 @@ if (!rdev || rdev->faulty) return; + + dprintk("md_error dev:%s, rdev:(%d:%d), (caller: %p,%p,%p,%p).\n", + mdname(mddev), + MAJOR(rdev->bdev->bd_dev), MINOR(rdev->bdev->bd_dev), + __builtin_return_address(0),__builtin_return_address(1), + __builtin_return_address(2),__builtin_return_address(3)); + if (!mddev->pers->error_handler) return; mddev->pers->error_handler(mddev,rdev); @@ -2935,7 +2933,7 @@ if (mddev_lock(mddev)!=0) return -EINTR; if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { - seq_printf(seq, "md%d : %sactive", mdidx(mddev), + seq_printf(seq, "%s : %sactive", mdname(mddev), mddev->pers ? "" : "in"); if (mddev->pers) { if (mddev->ro) @@ -3124,8 +3122,8 @@ void md_handle_safemode(mddev_t *mddev) { if (signal_pending(current)) { - printk(KERN_INFO "md: md%d in immediate safe mode\n", - mdidx(mddev)); + printk(KERN_INFO "md: %s in immediate safe mode\n", + mdname(mddev)); mddev->safemode = 2; flush_signals(current); } @@ -3167,10 +3165,10 @@ continue; if (mddev2->curr_resync && match_mddev_units(mddev,mddev2)) { - printk(KERN_INFO "md: delaying resync of md%d" - " until md%d has finished resync (they" + printk(KERN_INFO "md: delaying resync of %s" + " until %s has finished resync (they" " share one or more physical units)\n", - mdidx(mddev), mdidx(mddev2)); + mdname(mddev), mdname(mddev2)); if (mddev < mddev2) {/* arbitrarily yield */ mddev->curr_resync = 1; wake_up(&resync_wait); @@ -3191,7 +3189,7 @@ max_sectors = mddev->size << 1; - printk(KERN_INFO "md: syncing RAID array md%d\n", mdidx(mddev)); + printk(KERN_INFO "md: syncing RAID array %s\n", mdname(mddev)); printk(KERN_INFO "md: minimum _guaranteed_ reconstruction speed:" " %d KB/sec/disc.\n", sysctl_speed_limit_min); printk(KERN_INFO "md: using maximum available idle IO bandwith " @@ -3224,8 +3222,8 @@ if (j) printk(KERN_INFO - "md: resuming recovery of md%d from checkpoint.\n", - mdidx(mddev)); + "md: resuming recovery of %s from checkpoint.\n", + mdname(mddev)); while (j < max_sectors) { int sectors; @@ -3295,7 +3293,7 @@ } } } - printk(KERN_INFO "md: md%d: sync done.\n",mdidx(mddev)); + printk(KERN_INFO "md: %s: sync done.\n",mdname(mddev)); /* * this also signals 'finished resyncing' to md_stop */ @@ -3310,8 +3308,8 @@ mddev->curr_resync > mddev->recovery_cp) { if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { printk(KERN_INFO - "md: checkpointing recovery of md%d.\n", - mdidx(mddev)); + "md: checkpointing recovery of %s.\n", + mdname(mddev)); mddev->recovery_cp = mddev->curr_resync; } else mddev->recovery_cp = MaxSector; @@ -3431,11 +3429,11 @@ set_bit(MD_RECOVERY_SYNC, &mddev->recovery); mddev->sync_thread = md_register_thread(md_do_sync, mddev, - "md%d_resync"); + "%s_resync"); if (!mddev->sync_thread) { - printk(KERN_ERR "md%d: could not start resync" + printk(KERN_ERR "%s: could not start resync" " thread...\n", - mdidx(mddev)); + mdname(mddev)); /* leave the spares where they are, it shouldn't hurt */ mddev->recovery = 0; } else { diff -Nru a/drivers/md/multipath.c b/drivers/md/multipath.c --- a/drivers/md/multipath.c Tue Feb 17 20:00:06 2004 +++ b/drivers/md/multipath.c Tue Feb 17 20:00:06 2004 @@ -167,6 +167,13 @@ mp_bh->master_bio = bio; mp_bh->mddev = mddev; + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } /* * read balancing logic: */ @@ -382,8 +389,8 @@ struct list_head *tmp; if (mddev->level != LEVEL_MULTIPATH) { - printk("multipath: md%d: raid level not set to multipath IO (%d)\n", - mdidx(mddev), mddev->level); + printk("multipath: %s: raid level not set to multipath IO (%d)\n", + mdname(mddev), mddev->level); goto out; } /* @@ -396,8 +403,8 @@ mddev->private = conf; if (!conf) { printk(KERN_ERR - "multipath: couldn't allocate memory for md%d\n", - mdidx(mddev)); + "multipath: couldn't allocate memory for %s\n", + mdname(mddev)); goto out; } memset(conf, 0, sizeof(*conf)); @@ -406,8 +413,8 @@ GFP_KERNEL); if (!conf->multipaths) { printk(KERN_ERR - "multipath: couldn't allocate memory for md%d\n", - mdidx(mddev)); + "multipath: couldn't allocate memory for %s\n", + mdname(mddev)); goto out_free_conf; } memset(conf->multipaths, 0, sizeof(struct multipath_info)*mddev->raid_disks); @@ -441,8 +448,8 @@ conf->device_lock = SPIN_LOCK_UNLOCKED; if (!conf->working_disks) { - printk(KERN_ERR "multipath: no operational IO paths for md%d\n", - mdidx(mddev)); + printk(KERN_ERR "multipath: no operational IO paths for %s\n", + mdname(mddev)); goto out_free_conf; } mddev->degraded = conf->raid_disks = conf->working_disks; @@ -452,25 +459,23 @@ NULL); if (conf->pool == NULL) { printk(KERN_ERR - "multipath: couldn't allocate memory for md%d\n", - mdidx(mddev)); + "multipath: couldn't allocate memory for %s\n", + mdname(mddev)); goto out_free_conf; } { - const char * name = "md%d_multipath"; - - mddev->thread = md_register_thread(multipathd, mddev, name); + mddev->thread = md_register_thread(multipathd, mddev, "%s_multipath"); if (!mddev->thread) { printk(KERN_ERR "multipath: couldn't allocate thread" - " for md%d\n", mdidx(mddev)); + " for %s\n", mdname(mddev)); goto out_free_conf; } } printk(KERN_INFO - "multipath: array md%d active with %d out of %d IO paths\n", - mdidx(mddev), conf->working_disks, mddev->raid_disks); + "multipath: array %s active with %d out of %d IO paths\n", + mdname(mddev), conf->working_disks, mddev->raid_disks); /* * Ok, everything is just fine now */ diff -Nru a/drivers/md/raid0.c b/drivers/md/raid0.c --- a/drivers/md/raid0.c Tue Feb 17 20:00:07 2004 +++ b/drivers/md/raid0.c Tue Feb 17 20:00:07 2004 @@ -240,8 +240,8 @@ mdk_rdev_t *rdev; struct list_head *tmp; - printk("md%d: setting max_sectors to %d, segment boundary to %d\n", - mdidx(mddev), + printk("%s: setting max_sectors to %d, segment boundary to %d\n", + mdname(mddev), mddev->chunk_size >> 9, (mddev->chunk_size>>1)-1); blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9); @@ -364,6 +364,14 @@ mdk_rdev_t *tmp_dev; unsigned long chunk; sector_t block, rsect; + + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } chunk_size = mddev->chunk_size >> 10; chunk_sects = mddev->chunk_size >> 9; diff -Nru a/drivers/md/raid1.c b/drivers/md/raid1.c --- a/drivers/md/raid1.c Tue Feb 17 20:00:07 2004 +++ b/drivers/md/raid1.c Tue Feb 17 20:00:07 2004 @@ -474,6 +474,14 @@ conf->nr_pending++; spin_unlock_irq(&conf->resync_lock); + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } + /* * make_request() can abort the operation when READA is being * used and no empty request is available. @@ -1044,8 +1052,8 @@ struct list_head *tmp; if (mddev->level != 1) { - printk("raid1: md%d: raid level not set to mirroring (%d)\n", - mdidx(mddev), mddev->level); + printk("raid1: %s: raid level not set to mirroring (%d)\n", + mdname(mddev), mddev->level); goto out; } /* @@ -1056,16 +1064,16 @@ conf = kmalloc(sizeof(conf_t), GFP_KERNEL); mddev->private = conf; if (!conf) { - printk(KERN_ERR "raid1: couldn't allocate memory for md%d\n", - mdidx(mddev)); + printk(KERN_ERR "raid1: couldn't allocate memory for %s\n", + mdname(mddev)); goto out; } memset(conf, 0, sizeof(*conf)); conf->mirrors = kmalloc(sizeof(struct mirror_info)*mddev->raid_disks, GFP_KERNEL); if (!conf->mirrors) { - printk(KERN_ERR "raid1: couldn't allocate memory for md%d\n", - mdidx(mddev)); + printk(KERN_ERR "raid1: couldn't allocate memory for %s\n", + mdname(mddev)); goto out_free_conf; } memset(conf->mirrors, 0, sizeof(struct mirror_info)*mddev->raid_disks); @@ -1073,8 +1081,8 @@ conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, r1bio_pool_free, mddev); if (!conf->r1bio_pool) { - printk(KERN_ERR "raid1: couldn't allocate memory for md%d\n", - mdidx(mddev)); + printk(KERN_ERR "raid1: couldn't allocate memory for %s\n", + mdname(mddev)); goto out_free_conf; } @@ -1113,8 +1121,8 @@ init_waitqueue_head(&conf->wait_resume); if (!conf->working_disks) { - printk(KERN_ERR "raid1: no operational mirrors for md%d\n", - mdidx(mddev)); + printk(KERN_ERR "raid1: no operational mirrors for %s\n", + mdname(mddev)); goto out_free_conf; } @@ -1142,17 +1150,17 @@ { - mddev->thread = md_register_thread(raid1d, mddev, "md%d_raid1"); + mddev->thread = md_register_thread(raid1d, mddev, "%s_raid1"); if (!mddev->thread) { printk(KERN_ERR - "raid1: couldn't allocate thread for md%d\n", - mdidx(mddev)); + "raid1: couldn't allocate thread for %s\n", + mdname(mddev)); goto out_free_conf; } } printk(KERN_INFO - "raid1: raid set md%d active with %d out of %d mirrors\n", - mdidx(mddev), mddev->raid_disks - mddev->degraded, + "raid1: raid set %s active with %d out of %d mirrors\n", + mdname(mddev), mddev->raid_disks - mddev->degraded, mddev->raid_disks); /* * Ok, everything is just fine now diff -Nru a/drivers/md/raid5.c b/drivers/md/raid5.c --- a/drivers/md/raid5.c Tue Feb 17 20:00:06 2004 +++ b/drivers/md/raid5.c Tue Feb 17 20:00:06 2004 @@ -1326,6 +1326,14 @@ sector_t logical_sector, last_sector; struct stripe_head *sh; + if (bio_data_dir(bi)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi)); + } + logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1); last_sector = bi->bi_sector + (bi->bi_size>>9); @@ -1477,7 +1485,7 @@ struct list_head *tmp; if (mddev->level != 5 && mddev->level != 4) { - printk("raid5: md%d: raid level not set to 4/5 (%d)\n", mdidx(mddev), mddev->level); + printk("raid5: %s: raid level not set to 4/5 (%d)\n", mdname(mddev), mddev->level); return -EIO; } @@ -1503,7 +1511,7 @@ mddev->queue->unplug_fn = raid5_unplug_device; - PRINTK("raid5: run(md%d) called.\n", mdidx(mddev)); + PRINTK("raid5: run(%s) called.\n", mdname(mddev)); ITERATE_RDEV(mddev,rdev,tmp) { raid_disk = rdev->raid_disk; @@ -1535,37 +1543,37 @@ conf->max_nr_stripes = NR_STRIPES; if (!conf->chunk_size || conf->chunk_size % 4) { - printk(KERN_ERR "raid5: invalid chunk size %d for md%d\n", - conf->chunk_size, mdidx(mddev)); + printk(KERN_ERR "raid5: invalid chunk size %d for %s\n", + conf->chunk_size, mdname(mddev)); goto abort; } if (conf->algorithm > ALGORITHM_RIGHT_SYMMETRIC) { printk(KERN_ERR - "raid5: unsupported parity algorithm %d for md%d\n", - conf->algorithm, mdidx(mddev)); + "raid5: unsupported parity algorithm %d for %s\n", + conf->algorithm, mdname(mddev)); goto abort; } if (mddev->degraded > 1) { - printk(KERN_ERR "raid5: not enough operational devices for md%d" + printk(KERN_ERR "raid5: not enough operational devices for %s" " (%d/%d failed)\n", - mdidx(mddev), conf->failed_disks, conf->raid_disks); + mdname(mddev), conf->failed_disks, conf->raid_disks); goto abort; } if (mddev->degraded == 1 && mddev->recovery_cp != MaxSector) { printk(KERN_ERR - "raid5: cannot start dirty degraded array for md%d\n", - mdidx(mddev)); + "raid5: cannot start dirty degraded array for %s\n", + mdname(mddev)); goto abort; } { - mddev->thread = md_register_thread(raid5d, mddev, "md%d_raid5"); + mddev->thread = md_register_thread(raid5d, mddev, "%s_raid5"); if (!mddev->thread) { printk(KERN_ERR - "raid5: couldn't allocate thread for md%d\n", - mdidx(mddev)); + "raid5: couldn't allocate thread for %s\n", + mdname(mddev)); goto abort; } } @@ -1578,18 +1586,18 @@ md_unregister_thread(mddev->thread); goto abort; } else - printk(KERN_INFO "raid5: allocated %dkB for md%d\n", - memory, mdidx(mddev)); + printk(KERN_INFO "raid5: allocated %dkB for %s\n", + memory, mdname(mddev)); if (mddev->degraded == 0) - printk("raid5: raid level %d set md%d active with %d out of %d" - " devices, algorithm %d\n", conf->level, mdidx(mddev), + printk("raid5: raid level %d set %s active with %d out of %d" + " devices, algorithm %d\n", conf->level, mdname(mddev), mddev->raid_disks-mddev->degraded, mddev->raid_disks, conf->algorithm); else - printk(KERN_ALERT "raid5: raid level %d set md%d active with %d" + printk(KERN_ALERT "raid5: raid level %d set %s active with %d" " out of %d devices, algorithm %d\n", conf->level, - mdidx(mddev), mddev->raid_disks - mddev->degraded, + mdname(mddev), mddev->raid_disks - mddev->degraded, mddev->raid_disks, conf->algorithm); print_raid5_conf(conf); @@ -1616,7 +1624,7 @@ kfree(conf); } mddev->private = NULL; - printk(KERN_ALERT "raid5: failed to run raid set md%d\n", mdidx(mddev)); + printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev)); return -EIO; } diff -Nru a/drivers/md/raid6main.c b/drivers/md/raid6main.c --- a/drivers/md/raid6main.c Tue Feb 17 20:00:05 2004 +++ b/drivers/md/raid6main.c Tue Feb 17 20:00:05 2004 @@ -1488,6 +1488,14 @@ sector_t logical_sector, last_sector; struct stripe_head *sh; + if (bio_data_dir(bi)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi)); + } + logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1); last_sector = bi->bi_sector + (bi->bi_size>>9); @@ -1639,7 +1647,7 @@ struct list_head *tmp; if (mddev->level != 6) { - PRINTK("raid6: md%d: raid level not set to 6 (%d)\n", mdidx(mddev), mddev->level); + PRINTK("raid6: %s: raid level not set to 6 (%d)\n", mdname(mddev), mddev->level); return -EIO; } @@ -1665,7 +1673,7 @@ mddev->queue->unplug_fn = raid6_unplug_device; - PRINTK("raid6: run(md%d) called.\n", mdidx(mddev)); + PRINTK("raid6: run(%s) called.\n", mdname(mddev)); ITERATE_RDEV(mddev,rdev,tmp) { raid_disk = rdev->raid_disk; @@ -1698,42 +1706,42 @@ conf->max_nr_stripes = NR_STRIPES; if (conf->raid_disks < 4) { - printk(KERN_ERR "raid6: not enough configured devices for md%d (%d, minimum 4)\n", - mdidx(mddev), conf->raid_disks); + printk(KERN_ERR "raid6: not enough configured devices for %s (%d, minimum 4)\n", + mdname(mddev), conf->raid_disks); goto abort; } if (!conf->chunk_size || conf->chunk_size % 4) { - printk(KERN_ERR "raid6: invalid chunk size %d for md%d\n", - conf->chunk_size, mdidx(mddev)); + printk(KERN_ERR "raid6: invalid chunk size %d for %s\n", + conf->chunk_size, mdname(mddev)); goto abort; } if (conf->algorithm > ALGORITHM_RIGHT_SYMMETRIC) { printk(KERN_ERR - "raid6: unsupported parity algorithm %d for md%d\n", - conf->algorithm, mdidx(mddev)); + "raid6: unsupported parity algorithm %d for %s\n", + conf->algorithm, mdname(mddev)); goto abort; } if (mddev->degraded > 2) { - printk(KERN_ERR "raid6: not enough operational devices for md%d" + printk(KERN_ERR "raid6: not enough operational devices for %s" " (%d/%d failed)\n", - mdidx(mddev), conf->failed_disks, conf->raid_disks); + mdname(mddev), conf->failed_disks, conf->raid_disks); goto abort; } #if 0 /* FIX: For now */ if (mddev->degraded > 0 && mddev->recovery_cp != MaxSector) { - printk(KERN_ERR "raid6: cannot start dirty degraded array for md%d\n", mdidx(mddev)); + printk(KERN_ERR "raid6: cannot start dirty degraded array for %s\n", mdname(mddev)); goto abort; } #endif { - mddev->thread = md_register_thread(raid6d, mddev, "md%d_raid6"); + mddev->thread = md_register_thread(raid6d, mddev, "%s_raid6"); if (!mddev->thread) { printk(KERN_ERR - "raid6: couldn't allocate thread for md%d\n", - mdidx(mddev)); + "raid6: couldn't allocate thread for %s\n", + mdname(mddev)); goto abort; } } @@ -1747,18 +1755,18 @@ md_unregister_thread(mddev->thread); goto abort; } else - printk(KERN_INFO "raid6: allocated %dkB for md%d\n", - memory, mdidx(mddev)); + printk(KERN_INFO "raid6: allocated %dkB for %s\n", + memory, mdname(mddev)); if (mddev->degraded == 0) - printk(KERN_INFO "raid6: raid level %d set md%d active with %d out of %d" - " devices, algorithm %d\n", conf->level, mdidx(mddev), + printk(KERN_INFO "raid6: raid level %d set %s active with %d out of %d" + " devices, algorithm %d\n", conf->level, mdname(mddev), mddev->raid_disks-mddev->degraded, mddev->raid_disks, conf->algorithm); else - printk(KERN_ALERT "raid6: raid level %d set md%d active with %d" + printk(KERN_ALERT "raid6: raid level %d set %s active with %d" " out of %d devices, algorithm %d\n", conf->level, - mdidx(mddev), mddev->raid_disks - mddev->degraded, + mdname(mddev), mddev->raid_disks - mddev->degraded, mddev->raid_disks, conf->algorithm); print_raid6_conf(conf); @@ -1785,7 +1793,7 @@ kfree(conf); } mddev->private = NULL; - printk(KERN_ALERT "raid6: failed to run raid set md%d\n", mdidx(mddev)); + printk(KERN_ALERT "raid6: failed to run raid set %s\n", mdname(mddev)); return -EIO; } diff -Nru a/drivers/md/raid6x86.h b/drivers/md/raid6x86.h --- a/drivers/md/raid6x86.h Tue Feb 17 20:00:07 2004 +++ b/drivers/md/raid6x86.h Tue Feb 17 20:00:07 2004 @@ -1,4 +1,3 @@ -#ident "$Id: raid6x86.h,v 1.3 2002/12/12 22:41:27 hpa Exp $" /* ----------------------------------------------------------------------- * * * Copyright 2002-2004 H. Peter Anvin - All Rights Reserved diff -Nru a/drivers/media/dvb/frontends/dst.c b/drivers/media/dvb/frontends/dst.c --- a/drivers/media/dvb/frontends/dst.c Tue Feb 17 20:00:08 2004 +++ b/drivers/media/dvb/frontends/dst.c Tue Feb 17 20:00:08 2004 @@ -28,8 +28,8 @@ #include #include #include +#include #include -#include #include "dvb_frontend.h" #include "dvb_functions.h" diff -Nru a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c --- a/drivers/media/dvb/frontends/ves1820.c Tue Feb 17 20:00:07 2004 +++ b/drivers/media/dvb/frontends/ves1820.c Tue Feb 17 20:00:07 2004 @@ -48,23 +48,31 @@ */ #define SET_PWM(data,pwm) do { \ - (long) data &= ~0xff; \ - (long) data |= pwm; \ + long d = (long)data; \ + d &= ~0xff; \ + d |= pwm; \ + data = (void *)d; \ } while (0) #define SET_REG0(data,reg0) do { \ - (long) data &= ~(0xff << 8); \ - (long) data |= reg0 << 8; \ + long d = (long)data; \ + d &= ~(0xff << 8); \ + d |= reg0 << 8; \ + data = (void *)d; \ } while (0) #define SET_TUNER(data,type) do { \ - (long) data &= ~(0xff << 16); \ - (long) data |= type << 16; \ + long d = (long)data; \ + d &= ~(0xff << 16); \ + d |= type << 16; \ + data = (void *)d; \ } while (0) #define SET_DEMOD_ADDR(data,type) do { \ - (long) data &= ~(0xff << 24); \ - (long) data |= type << 24; \ + long d = (long)data; \ + d &= ~(0xff << 24); \ + d |= type << 24; \ + data = (void *)d; \ } while (0) #define GET_PWM(data) ((u8) ((long) data & 0xff)) diff -Nru a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c Tue Feb 17 20:00:08 2004 +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c Tue Feb 17 20:00:08 2004 @@ -204,12 +204,23 @@ int *result_length, u8 cmd_result[]) { int result, actual_len, i; - u8 b[COMMAND_PACKET_SIZE + 4]; - u8 c[COMMAND_PACKET_SIZE + 4]; + u8 *b; + u8 *c; + + b = kmalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL); + if (!b) + return -ENOMEM; + c = kmalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL); + if (!c) { + kfree(b); + return -ENOMEM; + } dprintk("%s\n", __FUNCTION__); if ((result = down_interruptible(&dec->usb_sem))) { + kfree(b); + kfree(c); printk("%s: Failed to down usb semaphore.\n", __FUNCTION__); return result; } @@ -230,22 +241,26 @@ } result = usb_bulk_msg(dec->udev, dec->command_pipe, b, - sizeof(b), &actual_len, HZ); + COMMAND_PACKET_SIZE + 4, &actual_len, HZ); if (result) { printk("%s: command bulk message failed: error %d\n", __FUNCTION__, result); up(&dec->usb_sem); + kfree(b); + kfree(c); return result; } result = usb_bulk_msg(dec->udev, dec->result_pipe, c, - sizeof(c), &actual_len, HZ); + COMMAND_PACKET_SIZE + 4, &actual_len, HZ); if (result) { printk("%s: result bulk message failed: error %d\n", __FUNCTION__, result); up(&dec->usb_sem); + kfree(b); + kfree(c); return result; } else { if (debug) { @@ -262,6 +277,8 @@ up(&dec->usb_sem); + kfree(b); + kfree(c); return 0; } } diff -Nru a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig --- a/drivers/media/video/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/media/video/Kconfig Tue Feb 17 20:00:08 2004 @@ -205,7 +205,7 @@ config VIDEO_MEYE tristate "Sony Vaio Picturebook Motion Eye Video For Linux (EXPERIMENTAL)" - depends on VIDEO_DEV && SONYPI + depends on VIDEO_DEV && SONYPI && !HIGHMEM64G ---help--- This is the video4linux driver for the Motion Eye camera found in the Vaio Picturebook laptops. Please read the material in diff -Nru a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c --- a/drivers/media/video/bw-qcam.c Tue Feb 17 20:00:06 2004 +++ b/drivers/media/video/bw-qcam.c Tue Feb 17 20:00:06 2004 @@ -958,45 +958,64 @@ MODULE_PARM(parport, "1-" __MODULE_STRING(MAX_CAMS) "s"); #endif -static void __exit exit_bw_qcams(void) -{ - unsigned int i; - - for (i = 0; i < num_cams; i++) - close_bwqcam(qcams[i]); -} - -static int __init init_bw_qcams(void) +static int accept_bwqcam(struct parport *port) { - struct parport *port; #ifdef MODULE int n; - - if(parport[0] && strncmp(parport[0], "auto", 4)){ + + if (parport[0] && strncmp(parport[0], "auto", 4) != 0) { /* user gave parport parameters */ for(n=0; parport[n] && nnext){ - if(r!=port->number) - continue; - init_bwqcam(port); - break; - } + if (r == port->number) + return 1; } - return (num_cams)?0:-ENODEV; - } - /* no parameter or "auto" */ - for (port = parport_enumerate(); port; port=port->next) + return 0; + } +#endif + return 1; +} + +static void bwqcam_attach(struct parport *port) +{ + if (accept_bwqcam(port)) init_bwqcam(port); +} +static void bwqcam_detach(struct parport *port) +{ + int i; + for (i = 0; i < num_cams; i++) { + struct qcam_device *qcam = qcams[i]; + if (qcam && qcam->pdev->port == port) { + qcams[i] = NULL; + close_bwqcam(qcam); + } + } +} + +static struct parport_driver bwqcam_driver = { + .name = "bw-qcam", + .attach = bwqcam_attach, + .detach = bwqcam_detach, +}; + +static void __exit exit_bw_qcams(void) +{ + parport_unregister_driver(&bwqcam_driver); +} + +static int __init init_bw_qcams(void) +{ +#ifdef MODULE /* Do some sanity checks on the module parameters. */ if (maxpoll > 5000) { printk("Connectix Quickcam max-poll was above 5000. Using 5000.\n"); @@ -1007,13 +1026,8 @@ printk("Connectix Quickcam yieldlines was less than 1. Using 1.\n"); yieldlines = 1; } - - return (num_cams)?0:-ENODEV; -#else - for (port = parport_enumerate(); port; port=port->next) - init_bwqcam(port); - return 0; #endif + return parport_register_driver(&bwqcam_driver); } module_init(init_bw_qcams); diff -Nru a/drivers/media/video/dpc7146.c b/drivers/media/video/dpc7146.c --- a/drivers/media/video/dpc7146.c Tue Feb 17 20:00:06 2004 +++ b/drivers/media/video/dpc7146.c Tue Feb 17 20:00:06 2004 @@ -131,7 +131,7 @@ DEB_D(("dpc_v4l2.o: dpc_probe succeeded for this device.\n")); /* we store the pointer in our private data field */ - (struct dpc*)dev->ext_priv = dpc; + dev->ext_priv = dpc; return 0; } diff -Nru a/drivers/media/video/hexium_gemini.c b/drivers/media/video/hexium_gemini.c --- a/drivers/media/video/hexium_gemini.c Tue Feb 17 20:00:06 2004 +++ b/drivers/media/video/hexium_gemini.c Tue Feb 17 20:00:06 2004 @@ -245,7 +245,7 @@ return -ENOMEM; } memset(hexium, 0x0, sizeof(struct hexium)); - (struct hexium *) dev->ext_priv = hexium; + dev->ext_priv = hexium; /* enable i2c-port pins */ saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26)); diff -Nru a/drivers/media/video/hexium_orion.c b/drivers/media/video/hexium_orion.c --- a/drivers/media/video/hexium_orion.c Tue Feb 17 20:00:14 2004 +++ b/drivers/media/video/hexium_orion.c Tue Feb 17 20:00:14 2004 @@ -255,7 +255,7 @@ if (0x17c8 == dev->pci->subsystem_vendor && 0x0101 == dev->pci->subsystem_device) { printk("hexium_orion: device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs.\n"); /* we store the pointer in our private data field */ - (struct hexium *) dev->ext_priv = hexium; + dev->ext_priv = hexium; hexium->type = HEXIUM_ORION_1SVHS_3BNC; return 0; } @@ -263,7 +263,7 @@ if (0x17c8 == dev->pci->subsystem_vendor && 0x2101 == dev->pci->subsystem_device) { printk("hexium_orion: device is a Hexium Orion w/ 4 BNC inputs.\n"); /* we store the pointer in our private data field */ - (struct hexium *) dev->ext_priv = hexium; + dev->ext_priv = hexium; hexium->type = HEXIUM_ORION_4BNC; return 0; } @@ -273,7 +273,7 @@ if (0 == (err = i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))) { printk("hexium_orion: device is a Hexium HV-PCI6/Orion (old).\n"); /* we store the pointer in our private data field */ - (struct hexium *) dev->ext_priv = hexium; + dev->ext_priv = hexium; hexium->type = HEXIUM_HV_PCI6_ORION; return 0; } diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c Tue Feb 17 20:00:07 2004 +++ b/drivers/media/video/meye.c Tue Feb 17 20:00:07 2004 @@ -160,23 +160,29 @@ } } -/* return a page table pointing to N pages of locked memory */ +/* return a page table pointing to N pages of locked memory + * + * NOTE: The meye device expects dma_addr_t size to be 32 bits + * (the toc must be exactly 1024 entries each of them being 4 bytes + * in size, the whole result being 4096 bytes). We're using here + * dma_addr_t for corectness but the compilation of this driver is + * disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4 */ static int ptable_alloc(void) { - u32 *pt; + dma_addr_t *pt; int i; memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable)); - meye.mchip_ptable[MCHIP_NB_PAGES] = dma_alloc_coherent(&meye.mchip_dev->dev, - PAGE_SIZE, - &meye.mchip_dmahandle, - GFP_KERNEL); - if (!meye.mchip_ptable[MCHIP_NB_PAGES]) { + meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev, + PAGE_SIZE, + &meye.mchip_dmahandle, + GFP_KERNEL); + if (!meye.mchip_ptable_toc) { meye.mchip_dmahandle = 0; return -1; } - pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; + pt = meye.mchip_ptable_toc; for (i = 0; i < MCHIP_NB_PAGES; i++) { meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev, PAGE_SIZE, @@ -184,13 +190,18 @@ GFP_KERNEL); if (!meye.mchip_ptable[i]) { int j; - pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; + pt = meye.mchip_ptable_toc; for (j = 0; j < i; ++j) { dma_free_coherent(&meye.mchip_dev->dev, PAGE_SIZE, meye.mchip_ptable[j], *pt); pt++; } + dma_free_coherent(&meye.mchip_dev->dev, + PAGE_SIZE, + meye.mchip_ptable_toc, + meye.mchip_dmahandle); + meye.mchip_ptable_toc = 0; meye.mchip_dmahandle = 0; return -1; } @@ -200,10 +211,10 @@ } static void ptable_free(void) { - u32 *pt; + dma_addr_t *pt; int i; - pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES]; + pt = meye.mchip_ptable_toc; for (i = 0; i < MCHIP_NB_PAGES; i++) { if (meye.mchip_ptable[i]) dma_free_coherent(&meye.mchip_dev->dev, @@ -212,13 +223,14 @@ pt++; } - if (meye.mchip_ptable[MCHIP_NB_PAGES]) + if (meye.mchip_ptable_toc) dma_free_coherent(&meye.mchip_dev->dev, PAGE_SIZE, - meye.mchip_ptable[MCHIP_NB_PAGES], + meye.mchip_ptable_toc, meye.mchip_dmahandle); memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable)); + meye.mchip_ptable_toc = 0; meye.mchip_dmahandle = 0; } diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h Tue Feb 17 20:00:07 2004 +++ b/drivers/media/video/meye.h Tue Feb 17 20:00:07 2004 @@ -298,7 +298,8 @@ u8 mchip_fnum; /* current mchip frame number */ unsigned char *mchip_mmregs; /* mchip: memory mapped registers */ - u8 *mchip_ptable[MCHIP_NB_PAGES+1];/* mchip: ptable + ptable toc */ + u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */ + dma_addr_t *mchip_ptable_toc; /* mchip: ptable toc */ dma_addr_t mchip_dmahandle; /* mchip: dma handle to ptable toc */ unsigned char *grab_fbuffer; /* capture framebuffer */ diff -Nru a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c --- a/drivers/media/video/msp3400.c Tue Feb 17 20:00:07 2004 +++ b/drivers/media/video/msp3400.c Tue Feb 17 20:00:07 2004 @@ -87,11 +87,13 @@ int dfp_regs[DFP_COUNT]; /* thread */ - struct task_struct *thread; + pid_t tpid; + struct completion texit; wait_queue_head_t wq; - struct semaphore *notify; - int active,restart,rmmod; + int active:1; + int restart:1; + int rmmod:1; int watch_stereo; struct timer_list wake_stereo; @@ -101,14 +103,12 @@ #define HAVE_SIMPLE(msp) ((msp->rev1 & 0xff) >= 'D'-'@') #define HAVE_RADIO(msp) ((msp->rev1 & 0xff) >= 'G'-'@') -#define MSP3400_MAX 4 -static struct i2c_client *msps[MSP3400_MAX]; - #define VIDEO_MODE_RADIO 16 /* norm magic for radio mode */ /* ---------------------------------------------------------------------- */ -#define dprintk if (debug) printk +#define dprintk if (debug >= 1) printk +#define d2printk if (debug >= 2) printk MODULE_PARM(once,"i"); MODULE_PARM(debug,"i"); @@ -735,6 +735,22 @@ * in the ioctl while doing the sound carrier & stereo detect */ +static int msp34xx_sleep(struct msp3400c *msp, int timeout) +{ + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue(&msp->wq, &wait); + if (!msp->rmmod) { + set_current_state(TASK_INTERRUPTIBLE); + if (timeout < 0) + schedule(); + else + schedule_timeout(timeout); + } + remove_wait_queue(&msp->wq, &wait); + return msp->rmmod || signal_pending(current); +} + static void msp3400c_stereo_wake(unsigned long data) { struct msp3400c *msp = (struct msp3400c*)data; /* XXX alpha ??? */ @@ -771,26 +787,16 @@ struct CARRIER_DETECT *cd; int count, max1,max2,val1,val2, val,this; - lock_kernel(); daemonize("msp3400"); - msp->thread = current; - unlock_kernel(); - + allow_signal(SIGTERM); printk("msp3400: daemon started\n"); - if(msp->notify != NULL) - up(msp->notify); for (;;) { - if (msp->rmmod) - goto done; - if (debug > 1) - printk("msp3400: thread: sleep\n"); - interruptible_sleep_on(&msp->wq); - if (debug > 1) - printk("msp3400: thread: wakeup\n"); - if (msp->rmmod || signal_pending(current)) + d2printk("msp3400: thread: sleep\n"); + if (msp34xx_sleep(msp,-1)) goto done; + d2printk("msp3400: thread: wakeup\n"); msp->active = 1; if (msp->watch_stereo) { @@ -800,9 +806,7 @@ } /* some time for the tuner to sync */ - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/5); - if (signal_pending(current)) + if (msp34xx_sleep(msp,HZ/5)) goto done; restart: @@ -835,9 +839,7 @@ for (this = 0; this < count; this++) { msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); - if (signal_pending(current)) + if (msp34xx_sleep(msp,HZ/10)) goto done; if (msp->restart) msp->restart = 0; @@ -872,9 +874,7 @@ for (this = 0; this < count; this++) { msp3400c_setcarrier(client, cd[this].cdo,cd[this].cdo); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); - if (signal_pending(current)) + if (msp34xx_sleep(msp,HZ/10)) goto done; if (msp->restart) goto restart; @@ -973,13 +973,9 @@ } done: - dprintk(KERN_DEBUG "msp3400: thread: exit\n"); msp->active = 0; - msp->thread = NULL; - - if(msp->notify != NULL) - up(msp->notify); - return 0; + dprintk(KERN_DEBUG "msp3400: thread: exit\n"); + complete_and_exit(&msp->texit, 0); } /* ----------------------------------------------------------------------- */ @@ -1019,26 +1015,16 @@ struct msp3400c *msp = i2c_get_clientdata(client); int mode,val,i,std; - lock_kernel(); daemonize("msp3410 [auto]"); - msp->thread = current; - unlock_kernel(); - + allow_signal(SIGTERM); printk("msp3410: daemon started\n"); - if(msp->notify != NULL) - up(msp->notify); - + for (;;) { - if (msp->rmmod) - goto done; - if (debug > 1) - printk(KERN_DEBUG "msp3410: thread: sleep\n"); - interruptible_sleep_on(&msp->wq); - if (debug > 1) - printk(KERN_DEBUG "msp3410: thread: wakeup\n"); - if (msp->rmmod || signal_pending(current)) + d2printk(KERN_DEBUG "msp3410: thread: sleep\n"); + if (msp34xx_sleep(msp,-1)) goto done; + d2printk(KERN_DEBUG "msp3410: thread: wakeup\n"); msp->active = 1; if (msp->watch_stereo) { @@ -1048,9 +1034,7 @@ } /* some time for the tuner to sync */ - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/5); - if (signal_pending(current)) + if (msp34xx_sleep(msp,HZ/5)) goto done; restart: @@ -1109,9 +1093,7 @@ } else { /* triggered autodetect */ for (;;) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); - if (signal_pending(current)) + if (msp34xx_sleep(msp,HZ/10)) goto done; if (msp->restart) goto restart; @@ -1222,12 +1204,9 @@ } done: - dprintk(KERN_DEBUG "msp3410: thread: exit\n"); msp->active = 0; - msp->thread = NULL; - - if(msp->notify != NULL) - up(msp->notify); + dprintk(KERN_DEBUG "msp3410: thread: exit\n"); + complete_and_exit(&msp->texit, 0); return 0; } @@ -1257,10 +1236,9 @@ static int msp_attach(struct i2c_adapter *adap, int addr, int kind) { - DECLARE_MUTEX_LOCKED(sem); struct msp3400c *msp; struct i2c_client *c; - int i, rc; + int i; client_template.adapter = adap; client_template.addr = addr; @@ -1342,24 +1320,13 @@ printk("\n"); /* startup control thread */ - msp->notify = &sem; - rc = kernel_thread(msp->simple ? msp3410d_thread : msp3400c_thread, - (void *)c, 0); - if (rc < 0) + init_completion(&msp->texit); + msp->tpid = kernel_thread(msp->simple ? msp3410d_thread : msp3400c_thread, + (void *)c, 0); + if (msp->tpid < 0) printk(KERN_WARNING "msp34xx: kernel_thread() failed\n"); - else - down(&sem); - msp->notify = NULL; wake_up_interruptible(&msp->wq); - /* update our own array */ - for (i = 0; i < MSP3400_MAX; i++) { - if (NULL == msps[i]) { - msps[i] = c; - break; - } - } - /* done */ i2c_attach_client(c); return 0; @@ -1367,30 +1334,17 @@ static int msp_detach(struct i2c_client *client) { - DECLARE_MUTEX_LOCKED(sem); struct msp3400c *msp = i2c_get_clientdata(client); - int i; /* shutdown control thread */ - del_timer(&msp->wake_stereo); - if (msp->thread) - { - msp->notify = &sem; + del_timer_sync(&msp->wake_stereo); + if (msp->tpid >= 0) { msp->rmmod = 1; wake_up_interruptible(&msp->wq); - down(&sem); - msp->notify = NULL; + wait_for_completion(&msp->texit); } msp3400c_reset(client); - /* update our own array */ - for (i = 0; i < MSP3400_MAX; i++) { - if (client == msps[i]) { - msps[i] = NULL; - break; - } - } - i2c_detach_client(client); kfree(msp); kfree(client); @@ -1403,8 +1357,13 @@ if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) return i2c_probe(adap, &addr_data, msp_attach); #else - if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) + switch (adap->id) { + case I2C_ALGO_BIT | I2C_HW_SMBUS_VOODOO3: + case I2C_ALGO_BIT | I2C_HW_B_BT848: + //case I2C_ALGO_SAA7134: return i2c_probe(adap, &addr_data, msp_attach); + break; + } #endif return 0; } diff -Nru a/drivers/media/video/mxb.c b/drivers/media/video/mxb.c --- a/drivers/media/video/mxb.c Tue Feb 17 20:00:05 2004 +++ b/drivers/media/video/mxb.c Tue Feb 17 20:00:05 2004 @@ -261,7 +261,7 @@ /* all devices are present, probe was successful */ /* we store the pointer in our private data field */ - (struct mxb*)dev->ext_priv = mxb; + dev->ext_priv = mxb; return 0; } diff -Nru a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c --- a/drivers/media/video/saa7134/saa7134-cards.c Tue Feb 17 20:00:08 2004 +++ b/drivers/media/video/saa7134/saa7134-cards.c Tue Feb 17 20:00:08 2004 @@ -834,7 +834,7 @@ }}, }, [SAA7134_BOARD_ECS_TVP3XP] = { - .name = "Elitegroup ECS TVP3XP FM1216 Tuner Card", + .name = "Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) ", .audio_clock = 0x187de7, // xtal 32.1 MHz .tuner_type = TUNER_PHILIPS_PAL, .inputs = {{ @@ -865,6 +865,82 @@ .amux = LINE2, }, }, + [SAA7134_BOARD_ECS_TVP3XP_4CB5] = { + .name = "Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)", + .audio_clock = 0x187de7, + .tuner_type = TUNER_PHILIPS_NTSC, + .inputs = {{ + .name = name_tv, + .vmux = 1, + .amux = TV, + .tv = 1, + },{ + .name = name_tv_mono, + .vmux = 1, + .amux = LINE2, + .tv = 1, + },{ + .name = name_comp1, + .vmux = 3, + .amux = LINE1, + },{ + .name = name_svideo, + .vmux = 8, + .amux = LINE1, + },{ + .name = "CVid over SVid", + .vmux = 0, + .amux = LINE1, + }}, + .radio = { + .name = name_radio, + .amux = LINE2, + }, + }, + [SAA7134_BOARD_AVACSSMARTTV] = { + /* Roman Pszonczenko */ + .name = "AVACS SmartTV", + .audio_clock = 0x00187de7, + .tuner_type = TUNER_PHILIPS_PAL, + .inputs = {{ + .name = name_tv, + .vmux = 1, + .amux = TV, + .tv = 1, + },{ + .name = name_tv_mono, + .vmux = 1, + .amux = LINE2, + .tv = 1, + },{ + .name = name_comp1, + .vmux = 0, + .amux = LINE2, + },{ + .name = name_comp2, + .vmux = 3, + .amux = LINE2, + },{ + .name = name_svideo, + .vmux = 8, + .amux = LINE2, + }}, + .radio = { + .name = name_radio, + .amux = LINE2, + .gpio = 0x200000, + }, + }, + [SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER] = { + /* Michael Smith */ + .name = "AVerMedia DVD EZMaker", + .audio_clock = 0x00187de7, + .tuner_type = TUNER_ABSENT, + .inputs = {{ + .name = name_comp1, + .vmux = 3, + }}, + }, }; const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); @@ -1023,6 +1099,12 @@ .subvendor = 0x1461, /* Avermedia Technologies Inc */ .subdevice = 0x2115, .driver_data = SAA7134_BOARD_MD2819, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7130, + .subvendor = 0x1461, /* Avermedia Technologies Inc */ + .subdevice = 0x10ff, + .driver_data = SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER, },{ /* TransGear 3000TV */ .vendor = PCI_VENDOR_ID_PHILIPS, @@ -1043,6 +1125,12 @@ .subdevice = 0x4cb4, .driver_data = SAA7134_BOARD_ECS_TVP3XP, },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7133, + .subvendor = 0x1019, + .subdevice = 0x4cb5, + .driver_data = SAA7134_BOARD_ECS_TVP3XP_4CB5, + },{ /* --- boards without eeprom + subsystem ID --- */ .vendor = PCI_VENDOR_ID_PHILIPS, @@ -1149,6 +1237,8 @@ break; case SAA7134_BOARD_CINERGY400: case SAA7134_BOARD_CINERGY600: + case SAA7134_BOARD_ECS_TVP3XP: + case SAA7134_BOARD_ECS_TVP3XP_4CB5: dev->has_remote = 1; break; } diff -Nru a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c --- a/drivers/media/video/saa7134/saa7134-input.c Tue Feb 17 20:00:07 2004 +++ b/drivers/media/video/saa7134/saa7134-input.c Tue Feb 17 20:00:07 2004 @@ -1,4 +1,6 @@ /* + * handle saa7134 IR remotes via linux kernel input layer. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -13,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to , or by paper mail: - * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ #include @@ -101,6 +100,63 @@ [ 0x23 ] = KEY_STOP, }; +/* Alfons Geser */ +static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { + [ 18 ] = KEY_POWER, + [ 1 ] = KEY_TV, // DVR + [ 21 ] = KEY_VIDEO, // DVD + [ 23 ] = KEY_AUDIO, // music + + // DVR mode / DVD mode / music mode + + [ 27 ] = KEY_MUTE, // mute + [ 2 ] = KEY_RESERVED, // MTS/SAP / audio /autoseek + [ 30 ] = KEY_RESERVED, // closed captioning / subtitle / seek + [ 22 ] = KEY_ZOOM, // full screen + [ 28 ] = KEY_RESERVED, // video source / eject /delall + [ 29 ] = KEY_RESERVED, // playback / angle /del + [ 47 ] = KEY_SEARCH, // scan / menu / playlist + [ 48 ] = KEY_RESERVED, // CH surfing / bookmark / memo + + [ 49 ] = KEY_HELP, // help + [ 50 ] = KEY_RESERVED, // num/memo + [ 51 ] = KEY_ESC, // cancel + + [ 12 ] = KEY_UP, // up + [ 16 ] = KEY_DOWN, // down + [ 8 ] = KEY_LEFT, // left + [ 4 ] = KEY_RIGHT, // right + [ 3 ] = KEY_ENTER, // select + + [ 31 ] = KEY_REWIND, // rewind + [ 32 ] = KEY_PLAYPAUSE, // play/pause + [ 41 ] = KEY_FORWARD, // forward + [ 20 ] = KEY_RESERVED, // repeat + [ 43 ] = KEY_RECORD, // recording + [ 44 ] = KEY_STOP, // stop + [ 45 ] = KEY_PLAY, // play + [ 46 ] = KEY_RESERVED, // snapshot + + [ 0 ] = KEY_KP0, + [ 5 ] = KEY_KP1, + [ 6 ] = KEY_KP2, + [ 7 ] = KEY_KP3, + [ 9 ] = KEY_KP4, + [ 10 ] = KEY_KP5, + [ 11 ] = KEY_KP6, + [ 13 ] = KEY_KP7, + [ 14 ] = KEY_KP8, + [ 15 ] = KEY_KP9, + + [ 42 ] = KEY_VOLUMEUP, + [ 17 ] = KEY_VOLUMEDOWN, + [ 24 ] = KEY_CHANNELUP, // CH.tracking up + [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down + + [ 19 ] = KEY_KPENTER, // enter + [ 33 ] = KEY_KPDOT, // . (decimal dot) +}; + /* ---------------------------------------------------------------------- */ static int build_key(struct saa7134_dev *dev) @@ -111,9 +167,15 @@ /* rising SAA7134_GPIO_GPRESCAN reads the status */ saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN); saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN); + gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); - data = ir_extract_bits(gpio, ir->mask_keycode); + if (ir->polling) { + if (ir->last_gpio == gpio) + return 0; + ir->last_gpio = gpio; + } + data = ir_extract_bits(gpio, ir->mask_keycode); printk("%s: build_key gpio=0x%x mask=0x%x data=%d\n", dev->name, gpio, ir->mask_keycode, data); @@ -130,7 +192,21 @@ void saa7134_input_irq(struct saa7134_dev *dev) { + struct saa7134_ir *ir = dev->remote; + + if (!ir->polling) + build_key(dev); +} + +static void saa7134_input_timer(unsigned long data) +{ + struct saa7134_dev *dev = (struct saa7134_dev*)data; + struct saa7134_ir *ir = dev->remote; + unsigned long timeout; + build_key(dev); + timeout = jiffies + (ir->polling * HZ / 1000); + mod_timer(&ir->timer, timeout); } int saa7134_input_init1(struct saa7134_dev *dev) @@ -140,6 +216,7 @@ u32 mask_keycode = 0; u32 mask_keydown = 0; u32 mask_keyup = 0; + int polling = 0; int ir_type = IR_TYPE_OTHER; /* detect & configure */ @@ -158,6 +235,13 @@ mask_keycode = 0x00003f; mask_keyup = 0x040000; break; + case SAA7134_BOARD_ECS_TVP3XP: + case SAA7134_BOARD_ECS_TVP3XP_4CB5: + ir_codes = eztv_codes; + mask_keycode = 0x00017c; + mask_keyup = 0x000002; + polling = 50; // ms + break; } if (NULL == ir_codes) { printk("%s: Oops: IR config error [card=%d]\n", @@ -174,6 +258,7 @@ ir->mask_keycode = mask_keycode; ir->mask_keydown = mask_keydown; ir->mask_keyup = mask_keyup; + ir->polling = polling; /* init input device */ snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", @@ -196,6 +281,14 @@ /* all done */ dev->remote = ir; + if (ir->polling) { + init_timer(&ir->timer); + ir->timer.function = saa7134_input_timer; + ir->timer.data = (unsigned long)dev; + ir->timer.expires = jiffies + HZ; + add_timer(&ir->timer); + } + input_register_device(&dev->remote->dev); printk("%s: registered input device for IR\n",dev->name); return 0; @@ -207,6 +300,8 @@ return; input_unregister_device(&dev->remote->dev); + if (dev->remote->polling) + del_timer_sync(&dev->remote->timer); kfree(dev->remote); dev->remote = NULL; } diff -Nru a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c --- a/drivers/media/video/saa7134/saa7134-tvaudio.c Tue Feb 17 20:00:05 2004 +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c Tue Feb 17 20:00:05 2004 @@ -45,6 +45,9 @@ MODULE_PARM(audio_ddep,"i"); MODULE_PARM_DESC(audio_ddep,"audio ddep overwrite"); +static int audio_clock_override = UNSET; +MODULE_PARM(audio_clock_override, "i"); + static int audio_clock_tweak = 0; MODULE_PARM(audio_clock_tweak, "i"); MODULE_PARM_DESC(audio_clock_tweak, "Audio clock tick fine tuning for cards with audio crystal that's slightly off (range [-1024 .. 1024])"); @@ -140,6 +143,9 @@ { int clock = saa7134_boards[dev->board].audio_clock; + if (UNSET != audio_clock_override) + clock = audio_clock_override; + /* init all audio registers */ saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x00); if (need_resched()) @@ -296,8 +302,13 @@ DECLARE_WAITQUEUE(wait, current); add_wait_queue(&dev->thread.wq, &wait); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(timeout); + if (dev->thread.scan1 == dev->thread.scan2 && !dev->thread.shutdown) { + set_current_state(TASK_INTERRUPTIBLE); + if (timeout < 0) + schedule(); + else + schedule_timeout(timeout); + } remove_wait_queue(&dev->thread.wq, &wait); return dev->thread.scan1 != dev->thread.scan2; } @@ -457,18 +468,11 @@ unsigned int i, audio; int max1,max2,carrier,rx,mode,lastmode; - lock_kernel(); daemonize("%s", dev->name); - dev->thread.task = current; - unlock_kernel(); - if (dev->thread.notify != NULL) - up(dev->thread.notify); - + allow_signal(SIGTERM); for (;;) { - if (dev->thread.exit || signal_pending(current)) - goto done; - interruptible_sleep_on(&dev->thread.wq); - if (dev->thread.exit || signal_pending(current)) + tvaudio_sleep(dev,-1); + if (dev->thread.shutdown || signal_pending(current)) goto done; restart: @@ -571,7 +575,7 @@ for (;;) { if (tvaudio_sleep(dev,5*HZ)) goto restart; - if (dev->thread.exit || signal_pending(current)) + if (dev->thread.shutdown || signal_pending(current)) break; if (UNSET == dev->thread.mode) { rx = tvaudio_getstereo(dev,&tvaudio[i]); @@ -587,9 +591,7 @@ } done: - dev->thread.task = NULL; - if(dev->thread.notify != NULL) - up(dev->thread.notify); + complete_and_exit(&dev->thread.exit, 0); return 0; } @@ -721,22 +723,16 @@ struct saa7134_dev *dev = data; u32 value, norms; - lock_kernel(); daemonize("%s", dev->name); - dev->thread.task = current; - unlock_kernel(); - if (dev->thread.notify != NULL) - up(dev->thread.notify); + allow_signal(SIGTERM); /* unmute */ saa_dsp_writel(dev, 0x474 >> 2, 0x00); saa_dsp_writel(dev, 0x450 >> 2, 0x00); for (;;) { - if (dev->thread.exit || signal_pending(current)) - goto done; - interruptible_sleep_on(&dev->thread.wq); - if (dev->thread.exit || signal_pending(current)) + tvaudio_sleep(dev,-1); + if (dev->thread.shutdown || signal_pending(current)) goto done; restart: @@ -808,9 +804,7 @@ } done: - dev->thread.task = NULL; - if(dev->thread.notify != NULL) - up(dev->thread.notify); + complete_and_exit(&dev->thread.exit, 0); return 0; } @@ -893,7 +887,6 @@ { DECLARE_MUTEX_LOCKED(sem); int (*my_thread)(void *data) = NULL; - int rc; /* enable I2S audio output */ if (saa7134_boards[dev->board].i2s_rate) { @@ -915,17 +908,16 @@ my_thread = tvaudio_thread_ddep; break; } + + dev->thread.pid = -1; if (my_thread) { /* start tvaudio thread */ init_waitqueue_head(&dev->thread.wq); - dev->thread.notify = &sem; - rc = kernel_thread(my_thread,dev,0); - if (rc < 0) + init_completion(&dev->thread.exit); + dev->thread.pid = kernel_thread(my_thread,dev,0); + if (dev->thread.pid < 0) printk(KERN_WARNING "%s: kernel_thread() failed\n", dev->name); - else - down(&sem); - dev->thread.notify = NULL; wake_up_interruptible(&dev->thread.wq); } @@ -934,15 +926,11 @@ int saa7134_tvaudio_fini(struct saa7134_dev *dev) { - DECLARE_MUTEX_LOCKED(sem); - /* shutdown tvaudio thread */ - if (dev->thread.task) { - dev->thread.notify = &sem; - dev->thread.exit = 1; + if (dev->thread.pid >= 0) { + dev->thread.shutdown = 1; wake_up_interruptible(&dev->thread.wq); - down(&sem); - dev->thread.notify = NULL; + wait_for_completion(&dev->thread.exit); } saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */ return 0; @@ -950,7 +938,7 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) { - if (dev->thread.task) { + if (dev->thread.pid >= 0) { dev->thread.mode = UNSET; dev->thread.scan2++; wake_up_interruptible(&dev->thread.wq); diff -Nru a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h --- a/drivers/media/video/saa7134/saa7134.h Tue Feb 17 20:00:07 2004 +++ b/drivers/media/video/saa7134/saa7134.h Tue Feb 17 20:00:07 2004 @@ -151,6 +151,9 @@ #define SAA7134_BOARD_MANLI_MTV001 28 #define SAA7134_BOARD_TG3000TV 29 #define SAA7134_BOARD_ECS_TVP3XP 30 +#define SAA7134_BOARD_ECS_TVP3XP_4CB5 31 +#define SAA7134_BOARD_AVACSSMARTTV 32 +#define SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER 33 #define SAA7134_INPUT_MAX 8 @@ -212,10 +215,10 @@ /* tvaudio thread status */ struct saa7134_thread { - struct task_struct *task; + pid_t pid; + struct completion exit; wait_queue_head_t wq; - struct semaphore *notify; - unsigned int exit; + unsigned int shutdown; unsigned int scan1; unsigned int scan2; unsigned int mode; @@ -319,6 +322,9 @@ u32 mask_keycode; u32 mask_keydown; u32 mask_keyup; + int polling; + u32 last_gpio; + struct timer_list timer; }; /* global device status */ diff -Nru a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c --- a/drivers/media/video/tda9887.c Tue Feb 17 20:00:05 2004 +++ b/drivers/media/video/tda9887.c Tue Feb 17 20:00:05 2004 @@ -24,8 +24,12 @@ /* Addresses to scan */ -static unsigned short normal_i2c[] = {I2C_CLIENT_END}; -static unsigned short normal_i2c_range[] = {0x86>>1,0x86>>1,I2C_CLIENT_END}; +static unsigned short normal_i2c[] = { + 0x86 >>1, + 0x96 >>1, + I2C_CLIENT_END, +}; +static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END}; I2C_CLIENT_INSMOD; /* insmod options */ diff -Nru a/drivers/media/video/tuner.c b/drivers/media/video/tuner.c --- a/drivers/media/video/tuner.c Tue Feb 17 20:00:08 2004 +++ b/drivers/media/video/tuner.c Tue Feb 17 20:00:08 2004 @@ -746,6 +746,7 @@ printk("tuner: microtune: companycode=%04x part=%02x rev=%02x\n", company_code,buf[0x13],buf[0x14]); switch (company_code) { + case 0x30bf: case 0x3cbf: case 0x3dbf: case 0x4d54: @@ -1040,6 +1041,7 @@ i2c_attach_client(client); if (type < TUNERS) { + t->type = type; printk("tuner: type forced to %d (%s) [insmod]\n", t->type,tuners[t->type].name); set_type(client,type); @@ -1060,6 +1062,7 @@ return i2c_probe(adap, &addr_data, tuner_attach); #else switch (adap->id) { + case I2C_ALGO_BIT | I2C_HW_SMBUS_VOODOO3: case I2C_ALGO_BIT | I2C_HW_B_BT848: case I2C_ALGO_BIT | I2C_HW_B_RIVA: case I2C_ALGO_SAA7134: diff -Nru a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c --- a/drivers/media/video/tvaudio.c Tue Feb 17 20:00:06 2004 +++ b/drivers/media/video/tvaudio.c Tue Feb 17 20:00:06 2004 @@ -122,9 +122,10 @@ __u16 left,right,treble,bass,mode; int prevmode; int norm; + /* thread */ - struct task_struct *thread; - struct semaphore *notify; + pid_t tpid; + struct completion texit; wait_queue_head_t wq; struct timer_list wt; int done; @@ -269,23 +270,24 @@ static int chip_thread(void *data) { + DECLARE_WAITQUEUE(wait, current); struct CHIPSTATE *chip = data; struct CHIPDESC *desc = chiplist + chip->type; - lock_kernel(); daemonize("%s",i2c_clientname(&chip->c)); - chip->thread = current; - unlock_kernel(); - + allow_signal(SIGTERM); dprintk("%s: thread started\n", i2c_clientname(&chip->c)); - if(chip->notify != NULL) - up(chip->notify); for (;;) { - interruptible_sleep_on(&chip->wq); - dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); + add_wait_queue(&chip->wq, &wait); + if (!chip->done) { + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + } + remove_wait_queue(&chip->wq, &wait); if (chip->done || signal_pending(current)) break; + dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); /* don't do anything for radio or if mode != auto */ if (chip->norm == VIDEO_MODE_RADIO || chip->mode != 0) @@ -298,11 +300,8 @@ mod_timer(&chip->wt, jiffies+2*HZ); } - chip->thread = NULL; dprintk("%s: thread exiting\n", i2c_clientname(&chip->c)); - if(chip->notify != NULL) - up(chip->notify); - + complete_and_exit(&chip->texit, 0); return 0; } @@ -1420,7 +1419,6 @@ { struct CHIPSTATE *chip; struct CHIPDESC *desc; - int rc; chip = kmalloc(sizeof(*chip),GFP_KERNEL); if (!chip) @@ -1480,21 +1478,18 @@ chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); } + chip->tpid = -1; if (desc->checkmode) { /* start async thread */ - DECLARE_MUTEX_LOCKED(sem); - chip->notify = &sem; init_timer(&chip->wt); chip->wt.function = chip_thread_wake; chip->wt.data = (unsigned long)chip; init_waitqueue_head(&chip->wq); - rc = kernel_thread(chip_thread,(void *)chip,0); - if (rc < 0) + init_completion(&chip->texit); + chip->tpid = kernel_thread(chip_thread,(void *)chip,0); + if (chip->tpid < 0) printk(KERN_WARNING "%s: kernel_thread() failed\n", i2c_clientname(&chip->c)); - else - down(&sem); - chip->notify = NULL; wake_up_interruptible(&chip->wq); } return 0; @@ -1520,15 +1515,12 @@ { struct CHIPSTATE *chip = i2c_get_clientdata(client); - del_timer(&chip->wt); - if (NULL != chip->thread) { + del_timer_sync(&chip->wt); + if (chip->tpid >= 0) { /* shutdown async thread */ - DECLARE_MUTEX_LOCKED(sem); - chip->notify = &sem; chip->done = 1; wake_up_interruptible(&chip->wq); - down(&sem); - chip->notify = NULL; + wait_for_completion(&chip->texit); } i2c_detach_client(&chip->c); diff -Nru a/drivers/media/video/tvmixer.c b/drivers/media/video/tvmixer.c --- a/drivers/media/video/tvmixer.c Tue Feb 17 20:00:08 2004 +++ b/drivers/media/video/tvmixer.c Tue Feb 17 20:00:08 2004 @@ -134,6 +134,8 @@ va.volume = max(left,right); va.balance = (32768*min(left,right)) / (va.volume ? va.volume : 1); va.balance = (leftdriver->command(client,VIDIOCSAUDIO,&va); client->driver->command(client,VIDIOCGAUDIO,&va); /* fall throuth */ @@ -267,6 +269,7 @@ #else /* TV card ??? */ switch (client->adapter->id) { + case I2C_ALGO_BIT | I2C_HW_SMBUS_VOODOO3: case I2C_ALGO_BIT | I2C_HW_B_BT848: case I2C_ALGO_BIT | I2C_HW_B_RIVA: /* ok, have a look ... */ diff -Nru a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c --- a/drivers/message/fusion/mptbase.c Tue Feb 17 20:00:06 2004 +++ b/drivers/message/fusion/mptbase.c Tue Feb 17 20:00:06 2004 @@ -167,6 +167,7 @@ static MPT_EVHANDLER MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS]; /* Reset handler lookup table */ static MPT_RESETHANDLER MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS]; +static struct mpt_pci_driver *MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS]; static int FusionInitCalled = 0; static int mpt_base_index = -1; @@ -183,7 +184,6 @@ static int mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply); static int mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag); -static int mpt_adapter_install(struct pci_dev *pdev); static void mpt_detect_bound_ports(MPT_ADAPTER *this, struct pci_dev *pdev); static void mpt_adapter_disable(MPT_ADAPTER *ioc, int freeup); static void mpt_adapter_dispose(MPT_ADAPTER *ioc); @@ -232,8 +232,12 @@ static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); static void mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info); -int fusion_init(void); -static void fusion_exit(void); +/* module entry point */ +static int __devinit mptbase_probe (struct pci_dev *, const struct pci_device_id *); +static void __devexit mptbase_remove(struct pci_dev *); +static void mptbase_shutdown(struct device * ); +static int __init fusion_init (void); +static void __exit fusion_exit (void); /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* @@ -260,6 +264,30 @@ #endif +/**************************************************************************** + * Supported hardware + */ + +static struct pci_device_id mptbase_pci_table[] = { + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030, + PCI_ANY_ID, PCI_ANY_ID }, + { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_1030_53C1035, + PCI_ANY_ID, PCI_ANY_ID }, + {0} /* Terminating entry */ +}; +MODULE_DEVICE_TABLE(pci, mptbase_pci_table); + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* 20000207 -sralston * GRRRRR... IOSpace (port i/o) register access (for the 909) is back! @@ -518,7 +546,7 @@ * @mf: Pointer to original MPT request frame * @reply: Pointer to MPT reply frame (NULL if TurboReply) * - * Returns 1 indicating original alloc'd request frame ptr + * Returns 1 indicating original alloc'd request frame ptr * should be freed, or 0 if it shouldn't. */ static int @@ -805,6 +833,34 @@ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** + * mpt_device_driver_register - Register device driver hooks + */ +int +mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) +{ + if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) + return -1; + + MptDeviceDriverHandlers[cb_idx] = dd_cbfunc; + return 0; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mpt_device_driver_deregister - DeRegister device driver hooks + */ +void +mpt_device_driver_deregister(int cb_idx) +{ + if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) + return; + + MptDeviceDriverHandlers[cb_idx] = NULL; +} + + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** * mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 1024) * allocated per MPT adapter. * @handle: Handle of registered MPT protocol driver @@ -1142,88 +1198,6 @@ return next; } -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* - * mpt_pci_scan - Scan PCI devices for MPT adapters. - * - * Returns count of MPT adapters found, keying off of PCI vendor and - * device_id's. - */ -static int __init -mpt_pci_scan(void) -{ - struct pci_dev *pdev = NULL; - struct pci_dev *pdev2; - int found = 0; - int count = 0; - int r; - - dprintk((KERN_INFO MYNAM ": Checking for MPT adapters...\n")); - - /* - * NOTE: The 929, 929X, 1030 and 1035 will appear as 2 separate PCI devices, - * one for each channel. - */ - while ((pdev = pci_find_device(PCI_VENDOR_ID_LSI_LOGIC, PCI_ANY_ID, pdev)) != NULL) { - pdev2 = NULL; - if ((pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC909) && - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929) && - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919) && - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929X) && - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919X) && - (pdev->device != MPI_MANUFACTPAGE_DEVID_53C1030) && - (pdev->device != MPI_MANUFACTPAGE_DEVID_1030_53C1035) && - 1) { - dprintk((KERN_INFO MYNAM ": Skipping LSI device=%04xh\n", pdev->device)); - continue; - } - - /* GRRRRR - * dual function devices (929, 929X, 1030, 1035) may be presented in Func 1,0 order, - * but we'd really really rather have them in Func 0,1 order. - * Do some kind of look ahead here... - */ - if (pdev->devfn & 1) { - pdev2 = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev); - if (pdev2 && (pdev2->vendor == 0x1000) && - (PCI_SLOT(pdev2->devfn) == PCI_SLOT(pdev->devfn)) && - (pdev2->device == pdev->device) && - (pdev2->bus->number == pdev->bus->number) && - !(pdev2->devfn & 1)) { - dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI bus/dfn=%02x/%02xh, class=%08x, id=%xh\n", - pdev2->bus->number, pdev2->devfn, pdev2->class, pdev2->device)); - found++; - if ((r = mpt_adapter_install(pdev2)) == 0) - count++; - } else { - pdev2 = NULL; - } - } - - dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI bus/dfn=%02x/%02xh, class=%08x, id=%xh\n", - pdev->bus->number, pdev->devfn, pdev->class, pdev->device)); - found++; - if ((r = mpt_adapter_install(pdev)) == 0) - count++; - - if (pdev2) - pdev = pdev2; - } - - printk(KERN_INFO MYNAM ": %d MPT adapter%s found, %d installed.\n", - found, (found==1) ? "" : "s", count); - - if (!found || !count) { - fusion_exit(); - return -ENODEV; - } - -#ifdef CONFIG_PROC_FS - (void) procmpt_create(); -#endif - - return count; -} /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** @@ -1253,7 +1227,7 @@ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* - * mpt_adapter_install - Install a PCI intelligent MPT adapter. + * mptbase_probe - Install a PCI intelligent MPT adapter. * @pdev: Pointer to pci_dev structure * * This routine performs all the steps necessary to bring the IOC of @@ -1268,8 +1242,8 @@ * * TODO: Add support for polled controllers */ -static int __init -mpt_adapter_install(struct pci_dev *pdev) +static int __devinit +mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) { MPT_ADAPTER *ioc; u8 *mem; @@ -1292,6 +1266,13 @@ return r; } + if (!pci_set_consistent_dma_mask(pdev, mask)) + dprintk((KERN_INFO MYNAM + ": Using 64 bit consistent mask\n")); + else + dprintk((KERN_INFO MYNAM + ": Not using 64 bit consistent mask\n")); + ioc = kmalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); if (ioc == NULL) { printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); @@ -1500,6 +1481,7 @@ ioc->pci_irq = pdev->irq; pci_set_master(pdev); /* ?? */ + pci_set_drvdata(pdev, ioc); #ifndef __sparc__ dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq)); @@ -1520,11 +1502,209 @@ ioc->name, r); } - return r; + if(r != 0 ) + return r; + + + /* call per device driver probe entry point */ + for(ii=0; iiprobe) { + MptDeviceDriverHandlers[ii]->probe(pdev,id); + } + } + + return 0; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptbase_remove - Remove a PCI intelligent MPT adapter. + * @pdev: Pointer to pci_dev structure + * + */ + +static void __devexit +mptbase_remove(struct pci_dev *pdev) +{ + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + int ii; + + /* call per device driver remove entry point */ + for(ii=0; iiremove) { + MptDeviceDriverHandlers[ii]->remove(pdev); + } + } + + /* Disable interrupts! */ + CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); + + ioc->active = 0; + + /* Clear any lingering interrupt */ + CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); + + CHIPREG_READ32(&ioc->chip->IntStatus); + + Q_DEL_ITEM(ioc); + mpt_adapter_dispose(ioc); + + mptscsih_sync_irq(pdev->irq); + pci_set_drvdata(pdev, NULL); } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* + * mptbase_shutdown - + * + */ +static void +mptbase_shutdown(struct device * dev) +{ + int ii; + + /* call per device driver shutdown entry point */ + for(ii=0; iishutdown) { + MptDeviceDriverHandlers[ii]->shutdown(dev); + } + } + +} + + +/************************************************************************** + * Power Management + */ +#ifdef CONFIG_PM +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptbase_suspend - Fusion MPT base driver suspend routine. + * + * + */ +static int +mptbase_suspend(struct pci_dev *pdev, u32 state) +{ + u32 device_state; + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + int ii; + + switch(state) + { + case 1: /* S1 */ + device_state=1; /* D1 */; + break; + case 3: /* S3 */ + case 4: /* S4 */ + device_state=3; /* D3 */; + break; + default: + return -EAGAIN /*FIXME*/; + break; + } + + printk(MYIOC_s_INFO_FMT + "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n", + ioc->name, pdev, pci_name(pdev), device_state); + + /* call per device driver suspend entry point */ + for(ii=0; iisuspend) { + MptDeviceDriverHandlers[ii]->suspend(pdev, state); + } + } + + pci_save_state(pdev, ioc->PciState); + + /* put ioc into READY_STATE */ + if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) { + printk(MYIOC_s_ERR_FMT + "pci-suspend: IOC msg unit reset failed!\n", ioc->name); + } + + /* disable interrupts */ + CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); + ioc->active = 0; + + /* Clear any lingering interrupt */ + CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); + + pci_disable_device(pdev); + pci_set_power_state(pdev, device_state); + + return 0; +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptbase_resume - Fusion MPT base driver resume routine. + * + * + */ +static int +mptbase_resume(struct pci_dev *pdev) +{ + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + u32 device_state = pdev->current_state; + int recovery_state; + int ii; + + printk(MYIOC_s_INFO_FMT + "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", + ioc->name, pdev, pci_name(pdev), device_state); + + pci_set_power_state(pdev, 0); + pci_restore_state(pdev, ioc->PciState); + pci_enable_device(pdev); + + /* enable interrupts */ + CHIPREG_WRITE32(&ioc->chip->IntMask, ~(MPI_HIM_RIM)); + ioc->active = 1; + + /* F/W not running */ + if(!CHIPREG_READ32(&ioc->chip->Doorbell)) { + /* enable domain validation flags */ + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_NEED_DV; + } + } + + printk(MYIOC_s_INFO_FMT + "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", + ioc->name, + (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), + CHIPREG_READ32(&ioc->chip->Doorbell)); + + /* bring ioc to operational state */ + if ((recovery_state = mpt_do_ioc_recovery(ioc, + MPT_HOSTEVENT_IOC_RECOVER, CAN_SLEEP)) != 0) { + printk(MYIOC_s_INFO_FMT + "pci-resume: Cannot recover, error:[%x]\n", + ioc->name, recovery_state); + } else { + printk(MYIOC_s_INFO_FMT + "pci-resume: success\n", ioc->name); + } + + /* call per device driver resume entry point */ + for(ii=0; iiresume) { + MptDeviceDriverHandlers[ii]->resume(pdev); + } + } + + return 0; +} +#endif + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* * mpt_do_ioc_recovery - Initialize or recover MPT adapter. * @ioc: Pointer to MPT adapter structure * @reason: Event word / reason @@ -5851,6 +6031,8 @@ EXPORT_SYMBOL(mpt_event_deregister); EXPORT_SYMBOL(mpt_reset_register); EXPORT_SYMBOL(mpt_reset_deregister); +EXPORT_SYMBOL(mpt_device_driver_register); +EXPORT_SYMBOL(mpt_device_driver_deregister); EXPORT_SYMBOL(mpt_get_msg_frame); EXPORT_SYMBOL(mpt_put_msg_frame); EXPORT_SYMBOL(mpt_free_msg_frame); @@ -5877,16 +6059,32 @@ EXPORT_SYMBOL(mpt_ASCQ_TableSz); EXPORT_SYMBOL(mpt_ScsiOpcodesPtr); + +static struct pci_driver mptbase_driver = { + .name = "mptbase", + .id_table = mptbase_pci_table, + .probe = mptbase_probe, + .remove = __devexit_p(mptbase_remove), + .driver = { + .shutdown = mptbase_shutdown, + }, +#ifdef CONFIG_PM + .suspend = mptbase_suspend, + .resume = mptbase_resume, +#endif +}; + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * fusion_init - Fusion MPT base driver initialization routine. * * Returns 0 for success, non-zero for failure. */ -int __init +static int __init fusion_init(void) { int i; + int r; if (FusionInitCalled++) { dprintk((KERN_INFO MYNAM ": INFO - Driver late-init entry point called\n")); @@ -5920,10 +6118,15 @@ /* FIXME! */ } - if ((i = mpt_pci_scan()) < 0) - return i; + r = pci_module_init(&mptbase_driver); + if(r) + return(r); - return 0; +#ifdef CONFIG_PROC_FS + (void) procmpt_create(); +#endif + + return r; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -5933,13 +6136,12 @@ * This routine frees all resources associated with each MPT adapter * and removes all %MPT_PROCFS_MPTBASEDIR entries. */ -static void +static void __exit fusion_exit(void) { - MPT_ADAPTER *this; - struct pci_dev *pdev = NULL; dprintk((KERN_INFO MYNAM ": fusion_exit() called!\n")); + pci_unregister_driver(&mptbase_driver); /* Whups? 20010120 -sralston * Moved this *above* removal of all MptAdapters! @@ -5948,30 +6150,9 @@ (void) procmpt_destroy(); #endif - while (! Q_IS_EMPTY(&MptAdapters)) { - this = MptAdapters.head; - - /* Disable interrupts! */ - CHIPREG_WRITE32(&this->chip->IntMask, 0xFFFFFFFF); - - this->active = 0; - - pdev = (struct pci_dev *)this->pcidev; - mptscsih_sync_irq(pdev->irq); - - /* Clear any lingering interrupt */ - CHIPREG_WRITE32(&this->chip->IntStatus, 0); - - CHIPREG_READ32(&this->chip->IntStatus); - - Q_DEL_ITEM(this); - mpt_adapter_dispose(this); - } - mpt_reset_deregister(mpt_base_index); } -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ module_init(fusion_init); module_exit(fusion_exit); diff -Nru a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h --- a/drivers/message/fusion/mptbase.h Tue Feb 17 20:00:06 2004 +++ b/drivers/message/fusion/mptbase.h Tue Feb 17 20:00:06 2004 @@ -80,8 +80,8 @@ #define COPYRIGHT "Copyright (c) 1999-2003 " MODULEAUTHOR #endif -#define MPT_LINUX_VERSION_COMMON "2.05.00.06" -#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-2.05.00.06" +#define MPT_LINUX_VERSION_COMMON "3.00.02" +#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.00.02" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define show_mptmod_ver(s,ver) \ @@ -180,6 +180,16 @@ MPTUNKNOWN_DRIVER } MPT_DRIVER_CLASS; +struct mpt_pci_driver{ + int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); + void (*remove) (struct pci_dev *dev); + void (*shutdown) (struct device * dev); +#ifdef CONFIG_PM + int (*suspend) (struct pci_dev *dev, u32 state); + int (*resume) (struct pci_dev *dev); +#endif +}; + /* * MPT adapter / port / bus / device info structures... */ @@ -629,6 +639,9 @@ FCPortPage0_t fc_port_page0[2]; LANPage0_t lan_cnfg_page0; LANPage1_t lan_cnfg_page1; +#ifdef CONFIG_PM + u32 PciState[64]; /* save PCI state to this area */ +#endif u8 FirstWhoInit; u8 upload_fw; /* If set, do a fw upload */ u8 reload_fw; /* Force a FW Reload on next reset */ @@ -1001,6 +1014,8 @@ extern void mpt_event_deregister(int cb_idx); extern int mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func); extern void mpt_reset_deregister(int cb_idx); +extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx); +extern void mpt_device_driver_deregister(int cb_idx); extern int mpt_register_ascqops_strings(void *ascqTable, int ascqtbl_sz, const char **opsTable); extern void mpt_deregister_ascqops_strings(void); extern MPT_FRAME_HDR *mpt_get_msg_frame(int handle, int iocid); diff -Nru a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c --- a/drivers/message/fusion/mptscsih.c Tue Feb 17 20:00:06 2004 +++ b/drivers/message/fusion/mptscsih.c Tue Feb 17 20:00:06 2004 @@ -75,7 +75,8 @@ #include /* needed for in_interrupt() proto */ #include /* notifier code */ #include "../../scsi/scsi.h" -#include "../../scsi/hosts.h" +#include + #include "mptbase.h" #include "mptscsih.h" @@ -164,8 +165,8 @@ static MPT_FRAME_HDR *mptscsih_search_pendingQ(MPT_SCSI_HOST *hd, int scpnt_idx); static void post_pendingQ_commands(MPT_SCSI_HOST *hd); -static int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag); -static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag); +static int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag); +static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag); static int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); static int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); @@ -184,7 +185,7 @@ static struct mpt_work_struct mptscsih_rstTask; -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io); static void mptscsih_domainValidation(void *hd); static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id); @@ -194,14 +195,19 @@ static void mptscsih_fillbuf(char *buffer, int size, int index, int width); #endif static int mptscsih_setup(char *str); -static int mptscsih_halt(struct notifier_block *nb, ulong event, void *buf); -/* - * Reboot Notification - */ -static struct notifier_block mptscsih_notifier = { - mptscsih_halt, NULL, 0 -}; +/* module entry point */ +static int __init mptscsih_init (void); +static void mptscsih_exit (void); + +static int __devinit mptscsih_probe (struct pci_dev *, const struct pci_device_id *); +static void __devexit mptscsih_remove(struct pci_dev *); +static void mptscsih_shutdown(struct device *); +#ifdef CONFIG_PM +static int mptscsih_suspend(struct pci_dev *pdev, u32 state); +static int mptscsih_resume(struct pci_dev *pdev); +#endif + /* * Private data... @@ -216,7 +222,7 @@ #define SNS_LEN(scp) sizeof((scp)->sense_buffer) -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /* * Domain Validation task structure */ @@ -238,6 +244,32 @@ driver_setup = MPTSCSIH_DRIVER_SETUP; /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +/* see mptscsih.h */ + +static struct scsi_host_template driver_template = { + .proc_name = "mptscsih", + .proc_info = x_scsi_proc_info, + .name = "MPT SCSI Host", + .info = x_scsi_info, + .queuecommand = x_scsi_queuecommand, + .slave_alloc = x_scsi_slave_alloc, + .slave_configure = x_scsi_slave_configure, + .slave_destroy = x_scsi_slave_destroy, + .eh_abort_handler = x_scsi_abort, + .eh_device_reset_handler = x_scsi_dev_reset, + .eh_bus_reset_handler = x_scsi_bus_reset, + .eh_host_reset_handler = x_scsi_host_reset, + .bios_param = x_scsi_bios_param, + .can_queue = MPT_SCSI_CAN_QUEUE, + .this_id = -1, + .sg_tablesize = MPT_SCSI_SG_DEPTH, + .max_sectors = MPT_SCSI_MAX_SECTORS, + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, + .use_clustering = ENABLE_CLUSTERING, +}; + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * Private inline routines... */ @@ -264,12 +296,14 @@ mptscsih_io_direction(Scsi_Cmnd *cmd) { switch (cmd->cmnd[0]) { - case WRITE_6: - case WRITE_10: + case WRITE_6: + case WRITE_10: + case WRITE_16: return SCSI_DATA_WRITE; break; - case READ_6: - case READ_10: + case READ_6: + case READ_10: + case READ_16: return SCSI_DATA_READ; break; } @@ -280,6 +314,7 @@ switch (cmd->cmnd[0]) { /* _DATA_OUT commands */ case WRITE_6: case WRITE_10: case WRITE_12: + case WRITE_16: case WRITE_LONG: case WRITE_SAME: case WRITE_BUFFER: case WRITE_VERIFY: case WRITE_VERIFY_12: case COMPARE: case COPY: case COPY_VERIFY: @@ -826,6 +861,13 @@ sc->resid = sc->request_bufflen - xfer_cnt; dprintk((KERN_NOTICE " SET sc->resid=%02xh\n", sc->resid)); + if(sc->underflow > xfer_cnt) { + printk(MYIOC_s_INFO_FMT + "SCSI data underrun: underflow=%02x, xfercnt=%02x\n", + ioc->name, sc->underflow, xfer_cnt); + sc->result = DID_SOFT_ERROR << 16; + } + /* Report Queue Full */ if (sc->result == MPI_SCSI_STATUS_TASK_SET_FULL) @@ -1235,7 +1277,6 @@ for(ii=0;iiioc->req_depth;ii++) hd->ReqToChain[ii] = MPT_HOST_NO_CHAIN; - /* ChainToChain size must equal the total number * of chain buffers to be allocated. * index = chain_idx @@ -1277,7 +1318,6 @@ mem = (u8 *) hd->ChainToChain; } memset(mem, 0xFF, sz); - sz = num_chain * hd->ioc->req_sz; if (hd->ChainBuffer == NULL) { /* Allocate free chain buffer pool @@ -1353,28 +1393,25 @@ } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -static int BeenHereDoneThat = 0; static char *info_kbuf = NULL; -/* SCSI host fops start here... */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/** - * mptscsih_detect - Register MPT adapter(s) as SCSI host(s) with - * linux scsi mid-layer. - * @tpnt: Pointer to Scsi_Host_Template structure +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptscsih_probe - Installs scsi devices per bus. + * @pdev: Pointer to pci_dev structure * - * (linux Scsi_Host_Template.detect routine) + * Returns 0 for success, non-zero for failure. * - * Returns number of SCSI host adapters that were successfully - * registered with the linux scsi mid-layer via the scsi_register() - * API call. */ -int -mptscsih_detect(Scsi_Host_Template *tpnt) + +static int __devinit +mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct Scsi_Host *sh = NULL; MPT_SCSI_HOST *hd = NULL; - MPT_ADAPTER *this; + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + int portnum; MPT_DONE_Q *freedoneQ; unsigned long flags; int sz, ii; @@ -1382,325 +1419,312 @@ int scale; u8 *mem; - if (! BeenHereDoneThat++) { - show_mptmod_ver(my_NAME, my_VERSION); - - ScsiDoneCtx = mpt_register(mptscsih_io_done, MPTSCSIH_DRIVER); - ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSCSIH_DRIVER); - ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, MPTSCSIH_DRIVER); + for (portnum=0; portnum < ioc->facts.NumberOfPorts; portnum++) { - if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) { - dprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); - } else { - /* FIXME! */ + /* 20010215 -sralston + * Added sanity check on SCSI Initiator-mode enabled + * for this MPT adapter. + */ + if (!(ioc->pfacts[portnum].ProtocolFlags & + MPI_PORTFACTS_PROTOCOL_INITIATOR)) { + printk(MYIOC_s_WARN_FMT + "Skipping because SCSI Initiator mode is NOT enabled!\n", + ioc->name); + continue; } - if (mpt_reset_register(ScsiDoneCtx, mptscsih_ioc_reset) == 0) { - dprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n")); - } else { - /* FIXME! */ + /* 20010202 -sralston + * Added sanity check on readiness of the MPT adapter. + */ + if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) { + printk(MYIOC_s_WARN_FMT + "Skipping because it's not operational!\n", + ioc->name); + continue; } - } - dprintk((KERN_INFO MYNAM ": mpt_scsih_detect()\n")); -#ifdef MODULE - /* Evaluate the command line arguments, if any */ - if (mptscsih) - mptscsih_setup(mptscsih); -#endif + sh = scsi_host_alloc(&driver_template, sizeof(MPT_SCSI_HOST)); + if (sh != NULL) { + spin_lock_irqsave(&ioc->FreeQlock, flags); - this = mpt_adapter_find_first(); - while (this != NULL) { - int portnum; - for (portnum=0; portnum < this->facts.NumberOfPorts; portnum++) { - - /* 20010215 -sralston - * Added sanity check on SCSI Initiator-mode enabled - * for this MPT adapter. - */ - if (!(this->pfacts[portnum].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_INITIATOR)) { - printk(MYIOC_s_WARN_FMT "Skipping because SCSI Initiator mode is NOT enabled!\n", - this->name); - continue; - } + /* Attach the SCSI Host to the IOC structure + */ + ioc->sh = sh; - /* 20010202 -sralston - * Added sanity check on readiness of the MPT adapter. + sh->io_port = 0; + sh->n_io_port = 0; + sh->irq = 0; + + /* set 16 byte cdb's */ + sh->max_cmd_len = 16; + + /* Yikes! This is important! + * Otherwise, by default, linux + * only scans target IDs 0-7! + * pfactsN->MaxDevices unreliable + * (not supported in early + * versions of the FW). + * max_id = 1 + actual max id, + * max_lun = 1 + actual last lun, + * see hosts.h :o( */ - if (this->last_state != MPI_IOC_STATE_OPERATIONAL) { - printk(MYIOC_s_WARN_FMT "Skipping because it's not operational!\n", - this->name); - continue; + if ((int)ioc->chip_type > (int)FC929) { + sh->max_id = MPT_MAX_SCSI_DEVICES; + } else { + /* For FC, increase the queue depth + * from MPT_SCSI_CAN_QUEUE (31) + * to MPT_FC_CAN_QUEUE (63). + */ + sh->can_queue = MPT_FC_CAN_QUEUE; + sh->max_id = + MPT_MAX_FC_DEVICES<256 ? MPT_MAX_FC_DEVICES : 255; } - tpnt->proc_info = mptscsih_proc_info; - sh = scsi_register(tpnt, sizeof(MPT_SCSI_HOST)); - if (sh != NULL) { - spin_lock_irqsave(&this->FreeQlock, flags); - sh->io_port = 0; - sh->n_io_port = 0; - sh->irq = 0; - - /* Yikes! This is important! - * Otherwise, by default, linux - * only scans target IDs 0-7! - * pfactsN->MaxDevices unreliable - * (not supported in early - * versions of the FW). - * max_id = 1 + actual max id, - * max_lun = 1 + actual last lun, - * see hosts.h :o( - */ - if ((int)this->chip_type > (int)FC929) - sh->max_id = MPT_MAX_SCSI_DEVICES; - else { - /* For FC, increase the queue depth - * from MPT_SCSI_CAN_QUEUE (31) - * to MPT_FC_CAN_QUEUE (63). - */ - sh->can_queue = MPT_FC_CAN_QUEUE; - sh->max_id = MPT_MAX_FC_DEVICES<256 ? MPT_MAX_FC_DEVICES : 255; - } - sh->max_lun = MPT_LAST_LUN + 1; + sh->max_lun = MPT_LAST_LUN + 1; + sh->max_sectors = MPT_SCSI_MAX_SECTORS; + sh->this_id = ioc->pfacts[portnum].PortSCSIID; - sh->max_sectors = MPT_SCSI_MAX_SECTORS; - sh->this_id = this->pfacts[portnum].PortSCSIID; + /* Required entry. + */ + sh->unique_id = ioc->id; - /* Required entry. - */ - sh->unique_id = this->id; + /* Verify that we won't exceed the maximum + * number of chain buffers + * We can optimize: ZZ = req_sz/sizeof(SGE) + * For 32bit SGE's: + * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ + * + (req_sz - 64)/sizeof(SGE) + * A slightly different algorithm is required for + * 64bit SGEs. + */ + scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32)); + if (sizeof(dma_addr_t) == sizeof(u64)) { + numSGE = (scale - 1) * + (ioc->facts.MaxChainDepth-1) + scale + + (ioc->req_sz - 60) / (sizeof(dma_addr_t) + + sizeof(u32)); + } else { + numSGE = 1 + (scale - 1) * + (ioc->facts.MaxChainDepth-1) + scale + + (ioc->req_sz - 64) / (sizeof(dma_addr_t) + + sizeof(u32)); + } - /* Verify that we won't exceed the maximum - * number of chain buffers - * We can optimize: ZZ = req_sz/sizeof(SGE) - * For 32bit SGE's: - * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ - * + (req_sz - 64)/sizeof(SGE) - * A slightly different algorithm is required for - * 64bit SGEs. - */ - scale = this->req_sz/(sizeof(dma_addr_t) + sizeof(u32)); - if (sizeof(dma_addr_t) == sizeof(u64)) { - numSGE = (scale - 1) * (this->facts.MaxChainDepth-1) + scale + - (this->req_sz - 60) / (sizeof(dma_addr_t) + sizeof(u32)); - } else { - numSGE = 1 + (scale - 1) * (this->facts.MaxChainDepth-1) + scale + - (this->req_sz - 64) / (sizeof(dma_addr_t) + sizeof(u32)); - } + if (numSGE < sh->sg_tablesize) { + /* Reset this value */ + dprintk((MYIOC_s_INFO_FMT + "Resetting sg_tablesize to %d from %d\n", + ioc->name, numSGE, sh->sg_tablesize)); + sh->sg_tablesize = numSGE; + } - if (numSGE < sh->sg_tablesize) { - /* Reset this value */ - dprintk((MYIOC_s_INFO_FMT - "Resetting sg_tablesize to %d from %d\n", - this->name, numSGE, sh->sg_tablesize)); - sh->sg_tablesize = numSGE; - } + /* Set the pci device pointer in Scsi_Host structure. + */ + scsi_set_device(sh, &ioc->pcidev->dev); - /* Set the pci device pointer in Scsi_Host structure. - */ - scsi_set_device(sh, &this->pcidev->dev); + spin_unlock_irqrestore(&ioc->FreeQlock, flags); - spin_unlock_irqrestore(&this->FreeQlock, flags); + hd = (MPT_SCSI_HOST *) sh->hostdata; + hd->ioc = ioc; + hd->max_sge = sh->sg_tablesize; - hd = (MPT_SCSI_HOST *) sh->hostdata; - hd->ioc = this; - hd->max_sge = sh->sg_tablesize; + if ((int)ioc->chip_type > (int)FC929) + hd->is_spi = 1; - if ((int)this->chip_type > (int)FC929) - hd->is_spi = 1; + if (DmpService && (ioc->chip_type == FC919 || + ioc->chip_type == FC929)) { + hd->is_multipath = 1; + } + hd->port = 0; /* FIXME! */ - if (DmpService && - (this->chip_type == FC919 || this->chip_type == FC929)) - hd->is_multipath = 1; + /* SCSI needs Scsi_Cmnd lookup table! + * (with size equal to req_depth*PtrSz!) + */ + sz = hd->ioc->req_depth * sizeof(void *); + mem = kmalloc(sz, GFP_ATOMIC); + if (mem == NULL) + goto mptscsih_probe_failed; - hd->port = 0; /* FIXME! */ + memset(mem, 0, sz); + hd->ScsiLookup = (struct scsi_cmnd **) mem; - /* SCSI needs Scsi_Cmnd lookup table! - * (with size equal to req_depth*PtrSz!) - */ - sz = hd->ioc->req_depth * sizeof(void *); - mem = kmalloc(sz, GFP_ATOMIC); - if (mem == NULL) - goto done; + dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p, sz=%d\n", + ioc->name, hd->ScsiLookup, sz)); - memset(mem, 0, sz); - hd->ScsiLookup = (struct scsi_cmnd **) mem; + if (mptscsih_initChainBuffers(hd, 1) < 0) + goto mptscsih_probe_failed; - dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p, sz=%d\n", - this->name, hd->ScsiLookup, sz)); + /* Allocate memory for free and doneQ's + */ + sz = sh->can_queue * sizeof(MPT_DONE_Q); + mem = kmalloc(sz, GFP_ATOMIC); + if (mem == NULL) + goto mptscsih_probe_failed; - if (mptscsih_initChainBuffers(hd, 1) < 0) - goto done; + memset(mem, 0xFF, sz); + hd->memQ = mem; - /* Allocate memory for free and doneQ's - */ - sz = sh->can_queue * sizeof(MPT_DONE_Q); - mem = kmalloc(sz, GFP_ATOMIC); - if (mem == NULL) - goto done; + /* Initialize the free, done and pending Qs. + */ + Q_INIT(&hd->freeQ, MPT_DONE_Q); + Q_INIT(&hd->doneQ, MPT_DONE_Q); + Q_INIT(&hd->pendingQ, MPT_DONE_Q); + spin_lock_init(&hd->freedoneQlock); + + mem = hd->memQ; + for (ii=0; ii < sh->can_queue; ii++) { + freedoneQ = (MPT_DONE_Q *) mem; + Q_ADD_TAIL(&hd->freeQ.head, freedoneQ, MPT_DONE_Q); + mem += sizeof(MPT_DONE_Q); + } - memset(mem, 0xFF, sz); - hd->memQ = mem; + /* Initialize this Scsi_Host + * internal task Q. + */ + Q_INIT(&hd->taskQ, MPT_FRAME_HDR); + hd->taskQcnt = 0; - /* Initialize the free, done and pending Qs. - */ - Q_INIT(&hd->freeQ, MPT_DONE_Q); - Q_INIT(&hd->doneQ, MPT_DONE_Q); - Q_INIT(&hd->pendingQ, MPT_DONE_Q); - spin_lock_init(&hd->freedoneQlock); - - mem = hd->memQ; - for (ii=0; ii < sh->can_queue; ii++) { - freedoneQ = (MPT_DONE_Q *) mem; - Q_ADD_TAIL(&hd->freeQ.head, freedoneQ, MPT_DONE_Q); - mem += sizeof(MPT_DONE_Q); - } + /* Allocate memory for the device structures. + * A non-Null pointer at an offset + * indicates a device exists. + * max_id = 1 + maximum id (hosts.h) + */ + sz = sh->max_id * sizeof(void *); + mem = kmalloc(sz, GFP_ATOMIC); + if (mem == NULL) + goto mptscsih_probe_failed; - /* Initialize this Scsi_Host - * internal task Q. - */ - Q_INIT(&hd->taskQ, MPT_FRAME_HDR); - hd->taskQcnt = 0; + memset(mem, 0, sz); + hd->Targets = (VirtDevice **) mem; - /* Allocate memory for the device structures. - * A non-Null pointer at an offset - * indicates a device exists. - * max_id = 1 + maximum id (hosts.h) - */ - sz = sh->max_id * sizeof(void *); - mem = kmalloc(sz, GFP_ATOMIC); - if (mem == NULL) - goto done; + dprintk((KERN_INFO + " Targets @ %p, sz=%d\n", hd->Targets, sz)); - memset(mem, 0, sz); - hd->Targets = (VirtDevice **) mem; - dprintk((KERN_INFO " Targets @ %p, sz=%d\n", hd->Targets, sz)); + /* Clear the TM flags + */ + hd->tmPending = 0; + hd->tmState = TM_STATE_NONE; + hd->resetPending = 0; + hd->abortSCpnt = NULL; + hd->tmPtr = NULL; + hd->numTMrequests = 0; + /* Clear the pointer used to store + * single-threaded commands, i.e., those + * issued during a bus scan, dv and + * configuration pages. + */ + hd->cmdPtr = NULL; - /* Clear the TM flags - */ - hd->tmPending = 0; - hd->tmState = TM_STATE_NONE; - hd->resetPending = 0; - hd->abortSCpnt = NULL; - hd->tmPtr = NULL; - hd->numTMrequests = 0; + /* Initialize this SCSI Hosts' timers + * To use, set the timer expires field + * and add_timer + */ + init_timer(&hd->timer); + hd->timer.data = (unsigned long) hd; + hd->timer.function = mptscsih_timer_expired; + + init_timer(&hd->TMtimer); + hd->TMtimer.data = (unsigned long) hd; + hd->TMtimer.function = mptscsih_taskmgmt_timeout; + hd->qtag_tick = jiffies; - /* Clear the pointer used to store - * single-threaded commands, i.e., those - * issued during a bus scan, dv and - * configuration pages. - */ - hd->cmdPtr = NULL; + /* Moved Earlier Pam D */ + /* ioc->sh = sh; */ - /* Attach the SCSI Host to the IOC structure + if (hd->is_spi) { + /* Update with the driver setup + * values. */ - this->sh = sh; + if (hd->ioc->spi_data.maxBusWidth > + driver_setup.max_width) { + hd->ioc->spi_data.maxBusWidth = + driver_setup.max_width; + } - /* Initialize this SCSI Hosts' timers - * To use, set the timer expires field - * and add_timer - */ - init_timer(&hd->timer); - hd->timer.data = (unsigned long) hd; - hd->timer.function = mptscsih_timer_expired; - - init_timer(&hd->TMtimer); - hd->TMtimer.data = (unsigned long) hd; - hd->TMtimer.function = mptscsih_taskmgmt_timeout; - hd->qtag_tick = jiffies; - - /* Moved Earlier Pam D */ - /* this->sh = sh; */ - - if (hd->is_spi) { - /* Update with the driver setup - * values. - */ - if (hd->ioc->spi_data.maxBusWidth > driver_setup.max_width) - hd->ioc->spi_data.maxBusWidth = driver_setup.max_width; - if (hd->ioc->spi_data.minSyncFactor < driver_setup.min_sync_fac) - hd->ioc->spi_data.minSyncFactor = driver_setup.min_sync_fac; + if (hd->ioc->spi_data.minSyncFactor < + driver_setup.min_sync_fac) { + hd->ioc->spi_data.minSyncFactor = + driver_setup.min_sync_fac; + } - if (hd->ioc->spi_data.minSyncFactor == MPT_ASYNC) - hd->ioc->spi_data.maxSyncOffset = 0; + if (hd->ioc->spi_data.minSyncFactor == MPT_ASYNC) { + hd->ioc->spi_data.maxSyncOffset = 0; + } - hd->negoNvram = 0; -#ifdef MPTSCSIH_DISABLE_DOMAIN_VALIDATION - hd->negoNvram = MPT_SCSICFG_USE_NVRAM; + hd->negoNvram = 0; +#ifndef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + hd->negoNvram = MPT_SCSICFG_USE_NVRAM; #endif - if (driver_setup.dv == 0) - hd->negoNvram = MPT_SCSICFG_USE_NVRAM; - - hd->ioc->spi_data.forceDv = 0; - for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) - hd->ioc->spi_data.dvStatus[ii] = MPT_SCSICFG_NEGOTIATE; - - if (hd->negoNvram == 0) { - for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) - hd->ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_DV_NOT_DONE; - } + if (driver_setup.dv == 0) { + hd->negoNvram = MPT_SCSICFG_USE_NVRAM; + } - ddvprintk((MYIOC_s_INFO_FMT - "dv %x width %x factor %x \n", - hd->ioc->name, driver_setup.dv, - driver_setup.max_width, - driver_setup.min_sync_fac)); + hd->ioc->spi_data.forceDv = 0; + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + hd->ioc->spi_data.dvStatus[ii] = + MPT_SCSICFG_NEGOTIATE; + } + if (hd->negoNvram == 0) { + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) + hd->ioc->spi_data.dvStatus[ii] |= + MPT_SCSICFG_DV_NOT_DONE; } - mpt_scsi_hosts++; + ddvprintk((MYIOC_s_INFO_FMT + "dv %x width %x factor %x \n", + hd->ioc->name, driver_setup.dv, + driver_setup.max_width, + driver_setup.min_sync_fac)); + } - } /* for each adapter port */ + mpt_scsi_hosts++; - this = mpt_adapter_find_next(this); - } + if(scsi_add_host (sh, &ioc->pcidev->dev)) { + dprintk((KERN_ERR MYNAM, + "scsi_add_host failed\n")); + goto mptscsih_probe_failed; + } -done: - if (mpt_scsi_hosts > 0) - register_reboot_notifier(&mptscsih_notifier); - else { - mpt_reset_deregister(ScsiDoneCtx); - dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n")); + scsi_scan_host(sh); + return 0; - mpt_event_deregister(ScsiDoneCtx); - dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n")); + } /* scsi_host_alloc */ - mpt_deregister(ScsiScanDvCtx); - mpt_deregister(ScsiTaskCtx); - mpt_deregister(ScsiDoneCtx); + } /* for each adapter port */ - if (info_kbuf != NULL) - kfree(info_kbuf); - } +mptscsih_probe_failed: + + mptscsih_remove(pdev); + return -ENODEV; - return mpt_scsi_hosts; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/** - * mptscsih_release - Unregister SCSI host from linux scsi mid-layer - * @host: Pointer to Scsi_Host structure +/* + * mptscsih_remove - Removed scsi devices + * @pdev: Pointer to pci_dev structure * - * (linux Scsi_Host_Template.release routine) - * This routine releases all resources associated with the SCSI host - * adapter. * - * Returns 0 for success. */ -int -mptscsih_release(struct Scsi_Host *host) +static void __devexit +mptscsih_remove(struct pci_dev *pdev) { - MPT_SCSI_HOST *hd; - int count; - unsigned long flags; + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + struct Scsi_Host *host = ioc->sh; + MPT_SCSI_HOST *hd; + int count; + unsigned long flags; + + if(!host) + return; - hd = (MPT_SCSI_HOST *) host->hostdata; + scsi_remove_host(host); -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /* Check DV thread active */ count = 10 * HZ; spin_lock_irqsave(&dvtaskQ_lock, flags); @@ -1721,8 +1745,7 @@ #endif #endif - unregister_reboot_notifier(&mptscsih_notifier); - + hd = (MPT_SCSI_HOST *)host->hostdata; if (hd != NULL) { int sz1, sz2, sz3, sztarget=0; int szr2chain = 0; @@ -1730,9 +1753,7 @@ int szchain = 0; int szQ = 0; - /* Synchronize disk caches - */ - (void) mptscsih_synchronize_cache(hd, 0); + mptscsih_shutdown(&pdev->dev); sz1 = sz2 = sz3 = 0; @@ -1796,72 +1817,203 @@ hd->Targets = NULL; } - dprintk((MYIOC_s_INFO_FMT "Free'd ScsiLookup (%d), chain (%d) and Target (%d+%d) memory\n", - hd->ioc->name, sz1, szchain, sz3, sztarget)); + dprintk((MYIOC_s_INFO_FMT + "Free'd ScsiLookup (%d), chain (%d) and Target (%d+%d) memory\n", + hd->ioc->name, sz1, szchain, sz3, sztarget)); dprintk(("Free'd done and free Q (%d) memory\n", szQ)); + + /* NULL the Scsi_Host pointer + */ + hd->ioc->sh = NULL; } - /* NULL the Scsi_Host pointer + + scsi_host_put(host); + +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptscsih_shutdown - reboot notifier + * + */ +static void +mptscsih_shutdown(struct device * dev) +{ + MPT_ADAPTER *ioc = pci_get_drvdata(to_pci_dev(dev)); + struct Scsi_Host *host = ioc->sh; + MPT_SCSI_HOST *hd; + + if(!host) + return; + + hd = (MPT_SCSI_HOST *)host->hostdata; + + /* Flush the cache of this adapter */ - hd->ioc->sh = NULL; - scsi_unregister(host); + if(hd != NULL) + mptscsih_synchronize_cache(hd, 0); - if (mpt_scsi_hosts) { - if (--mpt_scsi_hosts == 0) { - mpt_reset_deregister(ScsiDoneCtx); - dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n")); +} - mpt_event_deregister(ScsiDoneCtx); - dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n")); +#ifdef CONFIG_PM +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptscsih_suspend - Fusion MPT scsie driver suspend routine. + * + * + */ +static int +mptscsih_suspend(struct pci_dev *pdev, u32 state) +{ + mptscsih_shutdown(&pdev->dev); + return 0; +} - mpt_deregister(ScsiScanDvCtx); - mpt_deregister(ScsiTaskCtx); - mpt_deregister(ScsiDoneCtx); +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * mptscsih_resume - Fusion MPT scsi driver resume routine. + * + * + */ +static int +mptscsih_resume(struct pci_dev *pdev) +{ + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + struct Scsi_Host *host = ioc->sh; + MPT_SCSI_HOST *hd; - if (info_kbuf != NULL) - kfree(info_kbuf); - } - } + if(!host) + return 0; + hd = (MPT_SCSI_HOST *)host->hostdata; + if(!hd) + return 0; + +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION + { + unsigned long lflags; + spin_lock_irqsave(&dvtaskQ_lock, lflags); + if (!dvtaskQ_active) { + dvtaskQ_active = 1; + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + MPT_INIT_WORK(&mptscsih_dvTask, + mptscsih_domainValidation, (void *) hd); + SCHEDULE_TASK(&mptscsih_dvTask); + } else { + spin_unlock_irqrestore(&dvtaskQ_lock, lflags); + } + } +#endif return 0; } +#endif + +static struct mpt_pci_driver mptscsih_driver = { + .probe = mptscsih_probe, + .remove = __devexit_p(mptscsih_remove), + .shutdown = mptscsih_shutdown, +#ifdef CONFIG_PM + .suspend = mptscsih_suspend, + .resume = mptscsih_resume, +#endif +}; + + +/* SCSI host fops start here... */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** - * mptscsih_halt - Process the reboot notification - * @nb: Pointer to a struct notifier_block (ignored) - * @event: event (SYS_HALT, SYS_RESTART, SYS_POWER_OFF) - * @buf: Pointer to a data buffer (ignored) - * - * This routine called if a system shutdown or reboot is to occur. + * mptscsih_init - Register MPT adapter(s) as SCSI host(s) with + * linux scsi mid-layer. * - * Return NOTIFY_DONE if this is something other than a reboot message. - * NOTIFY_OK if this is a reboot message. + * Returns 0 for success, non-zero for failure. */ static int -mptscsih_halt(struct notifier_block *nb, ulong event, void *buf) +__init mptscsih_init(void) { - MPT_ADAPTER *ioc = NULL; - MPT_SCSI_HOST *hd = NULL; + MPT_ADAPTER *ioc; - /* Ignore all messages other than reboot message - */ - if ((event != SYS_RESTART) && (event != SYS_HALT) - && (event != SYS_POWER_OFF)) - return (NOTIFY_DONE); + show_mptmod_ver(my_NAME, my_VERSION); - for (ioc = mpt_adapter_find_first(); ioc != NULL; ioc = mpt_adapter_find_next(ioc)) { - /* Flush the cache of this adapter - */ - if (ioc->sh) { - hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; - if (hd) { - mptscsih_synchronize_cache(hd, 0); - } + ScsiDoneCtx = mpt_register(mptscsih_io_done, MPTSCSIH_DRIVER); + ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSCSIH_DRIVER); + ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, MPTSCSIH_DRIVER); + + if(mpt_device_driver_register(&mptscsih_driver, + MPTSCSIH_DRIVER) != 0 ) { + dprintk((KERN_INFO MYNAM + ": failed to register dd callbacks\n")); + } + + if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) { + dprintk((KERN_INFO MYNAM + ": Registered for IOC event notifications\n")); + } + + if (mpt_reset_register(ScsiDoneCtx, mptscsih_ioc_reset) == 0) { + dprintk((KERN_INFO MYNAM + ": Registered for IOC reset notifications\n")); + } + +#ifdef MODULE + /* Evaluate the command line arguments, if any */ + if (mptscsih) + mptscsih_setup(mptscsih); +#endif + + /* probing for devices */ + for(ioc = mpt_adapter_find_first(); ioc != NULL; + ioc = mpt_adapter_find_next(ioc)) { + if(mptscsih_probe(ioc->pcidev, ioc->pcidev->driver->id_table)) { + dprintk((KERN_INFO MYNAM ": probe failed\n")); + return -ENODEV; } } - unregister_reboot_notifier(&mptscsih_notifier); - return NOTIFY_OK; + if (mpt_scsi_hosts > 0) + return 0; + + mptscsih_exit(); + return -ENODEV; + +} + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mptscsih_exit - Unregisters MPT adapter(s) + * + */ +static void +mptscsih_exit(void) +{ + MPT_ADAPTER *ioc; + + /* removing devices */ + for(ioc = mpt_adapter_find_first(); ioc != NULL; + ioc = mpt_adapter_find_next(ioc)) { + if ((ioc->last_state != MPI_IOC_STATE_OPERATIONAL) || + (ioc->sh == NULL)) + continue; + mptscsih_remove(ioc->pcidev); + } + + mpt_reset_deregister(ScsiDoneCtx); + dprintk((KERN_INFO MYNAM + ": Deregistered for IOC reset notifications\n")); + + mpt_event_deregister(ScsiDoneCtx); + dprintk((KERN_INFO MYNAM + ": Deregistered for IOC event notifications\n")); + + mpt_device_driver_deregister(MPTSCSIH_DRIVER); + mpt_deregister(ScsiScanDvCtx); + mpt_deregister(ScsiTaskCtx); + mpt_deregister(ScsiDoneCtx); + + if (info_kbuf != NULL) + kfree(info_kbuf); + } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -2436,7 +2588,7 @@ hd->ioc->spi_data.dvStatus[target] = dvStatus; } -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION if ((dvStatus & MPT_SCSICFG_NEED_DV) || (hd->ioc->spi_data.forceDv & MPT_SCSICFG_NEED_DV)) { unsigned long lflags; @@ -2608,7 +2760,7 @@ * Returns 0 for SUCCESS or -1 if FAILED. */ static int -mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag) +mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag) { MPT_ADAPTER *ioc = NULL; int rc = -1; @@ -2664,7 +2816,7 @@ */ if (hd->hard_resets < -1) hd->hard_resets++; - rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, sleepFlag); + rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, timeout, sleepFlag); if (rc) { printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", hd->ioc->name); } else { @@ -2710,7 +2862,7 @@ * else other non-zero value returned. */ static int -mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag) +mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag) { MPT_FRAME_HDR *mf; SCSITaskMgmt_t *pScsiTm; @@ -2760,7 +2912,7 @@ */ hd->tmPtr = mf; hd->numTMrequests++; - hd->TMtimer.expires = jiffies + HZ*20; /* 20 seconds */ + hd->TMtimer.expires = jiffies + timeout; add_timer(&hd->TMtimer); if ((retval = mpt_send_handshake_request(ScsiTaskCtx, hd->ioc->id, @@ -2870,7 +3022,8 @@ spin_unlock_irq(host_lock); if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, - SCpnt->device->id, SCpnt->device->lun, ctx2abort, CAN_SLEEP) + SCpnt->device->id, SCpnt->device->lun, + ctx2abort, (HZ*2) /* 2 second timeout */,CAN_SLEEP) < 0) { /* The TM request failed and the subsequent FW-reload failed! @@ -2940,7 +3093,7 @@ } if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, - SCpnt->device->id, 0, 0, CAN_SLEEP) + SCpnt->device->id, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP) < 0){ /* The TM request failed and the subsequent FW-reload failed! * Fatal error case. @@ -3004,7 +3157,7 @@ /* We are now ready to execute the task management request. */ if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, - 0, 0, 0, CAN_SLEEP) + 0, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP) < 0){ /* The TM request failed and the subsequent FW-reload failed! @@ -3087,7 +3240,7 @@ mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd) { unsigned long flags; - int loop_count = 60 * 4; /* Wait 60 seconds */ + int loop_count = 10 * 4; /* Wait 10 seconds */ int status = FAILED; do { @@ -3227,18 +3380,50 @@ */ int mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, - sector_t capacity, int *ip) + sector_t capacity, int geom[]) { - int size; + int heads; + int sectors; + sector_t cylinders; +#ifdef CONFIG_LBD + ulong dummy; +#endif - size = capacity; - ip[0] = 64; /* heads */ - ip[1] = 32; /* sectors */ - if ((ip[2] = size >> 11) > 1024) { /* cylinders, test for big disk */ - ip[0] = 255; /* heads */ - ip[1] = 63; /* sectors */ - ip[2] = size / (255 * 63); /* cylinders */ + heads = 64; + sectors = 32; +#ifdef CONFIG_LBD + dummy = heads * sectors; + cylinders = capacity; + sector_div(cylinders,dummy); +#else + cylinders = (ulong)capacity / (heads * sectors); +#endif + + /* + * Handle extended translation size for logical drives + * > 1Gb + */ + if ((ulong)capacity >= 0x200000) { + heads = 255; + sectors = 63; +#ifdef CONFIG_LBD + dummy = heads * sectors; + cylinders = capacity; + sector_div(cylinders,dummy); +#else + cylinders = (ulong)capacity / (heads * sectors); +#endif } + + /* return result */ + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + + dprintk((KERN_NOTICE + ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n", + sdev->id, sdev->lun,sdev->channel,(int)cylinders,heads,sectors)); + return 0; } @@ -3368,7 +3553,7 @@ vdev->raidVolume = 0; if (hd->is_spi && (hd->ioc->spi_data.isRaid & (1 << (device->id)))) { vdev->raidVolume = 1; - ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", target_id)); + ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", device->id)); } mptscsih_target_settings(hd, vdev, device); @@ -3650,36 +3835,6 @@ return -1; } -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ - -/* see mptscsih.h */ - -#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS -static Scsi_Host_Template driver_template = { - .proc_name = "mptscsih", - .proc_info = x_scsi_proc_info, - .name = "MPT SCSI Host", - .detect = x_scsi_detect, - .release = x_scsi_release, - .info = x_scsi_info, - .queuecommand = x_scsi_queuecommand, - .slave_alloc = x_scsi_slave_alloc, - .slave_configure = x_scsi_slave_configure, - .slave_destroy = x_scsi_slave_destroy, - .eh_abort_handler = x_scsi_abort, - .eh_device_reset_handler = x_scsi_dev_reset, - .eh_bus_reset_handler = x_scsi_bus_reset, - .eh_host_reset_handler = x_scsi_host_reset, - .bios_param = x_scsi_bios_param, - .can_queue = MPT_SCSI_CAN_QUEUE, - .this_id = -1, - .sg_tablesize = MPT_SCSI_SG_DEPTH, - .max_sectors = MPT_SCSI_MAX_SECTORS, - .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, - .use_clustering = ENABLE_CLUSTERING, -}; -#include "../../scsi/scsi_module.c" -#endif /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* Search the pendingQ for a command with specific index. @@ -3958,7 +4113,7 @@ break; case MPI_EVENT_INTEGRATED_RAID: /* 0B */ -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /* negoNvram set to 0 if DV enabled and to USE_NVRAM if * if DV disabled. Need to check for target mode. */ @@ -3972,7 +4127,7 @@ int numPDisk; u8 reason; u8 physDiskNum; - + reason = (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16; if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) { /* New or replaced disk. @@ -4320,6 +4475,8 @@ case WRITE_10: case READ_12: case WRITE_12: + case READ_16: + case WRITE_16: break; default: return 0; @@ -4618,7 +4775,7 @@ //negoFlags = MPT_TARGET_NO_NEGO_SYNC; } -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /* Force to async and narrow if DV has not been executed * for this ID */ @@ -5000,7 +5157,7 @@ return; } -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* mptscsih_do_raid - Format and Issue a RAID volume request message. * @hd: Pointer to scsi host structure @@ -5071,7 +5228,7 @@ return 0; } -#endif /* ~MPTSCSIH_DISABLE_DOMAIN_VALIDATION */ +#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** @@ -5383,7 +5540,7 @@ if (ioc->spi_data.sdp1length > 0) { pcfg1Data = (SCSIDevicePage1_t *)pci_alloc_consistent(ioc->pcidev, ioc->spi_data.sdp1length * 4, &cfg1_dma_addr); - + if (pcfg1Data != NULL) { doConfig = 1; header1.PageVersion = ioc->spi_data.sdp1version; @@ -5415,7 +5572,7 @@ flags = hd->ioc->spi_data.noQas; if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) { data = hd->ioc->spi_data.nvram[id]; - + if (data & MPT_NVRAM_WIDE_DISABLE) flags |= MPT_TARGET_NO_NEGO_WIDE; @@ -5424,7 +5581,7 @@ flags |= MPT_TARGET_NO_NEGO_SYNC; } } - + /* Force to async, narrow */ mptscsih_setDevicePage1Flags(0, MPT_ASYNC, 0, &requested, &configuration, flags); @@ -5467,7 +5624,7 @@ return 0; } -#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION +#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /** * mptscsih_domainValidation - Top level handler for domain validation. @@ -5520,7 +5677,7 @@ /* DV only to SCSI adapters */ if ((int)ioc->chip_type <= (int)FC929) continue; - + /* Make sure everything looks ok */ if (ioc->sh == NULL) continue; @@ -6914,7 +7071,7 @@ break; } } -#endif /* ~MPTSCSIH_DISABLE_DOMAIN_VALIDATION */ +#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* Commandline Parsing routines and defines. @@ -7009,3 +7166,6 @@ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +module_init(mptscsih_init); +module_exit(mptscsih_exit); diff -Nru a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h --- a/drivers/message/fusion/mptscsih.h Tue Feb 17 20:00:08 2004 +++ b/drivers/message/fusion/mptscsih.h Tue Feb 17 20:00:08 2004 @@ -98,13 +98,14 @@ #define MPT_SCSI_SG_DEPTH 40 #endif -/* To disable domain validation, uncomment the +/* To disable domain validation, comment the * following line. No effect for FC devices. * For SCSI devices, driver will negotiate to * NVRAM settings (if available) or to maximum adapter * capabilities. */ -/* #define MPTSCSIH_DISABLE_DOMAIN_VALIDATION */ + +#define MPTSCSIH_ENABLE_DOMAIN_VALIDATION /* SCSI driver setup structure. Settings can be overridden @@ -138,15 +139,6 @@ */ /* - * Conditionalizing with "#ifdef MODULE/#endif" around: - * static Scsi_Host_Template driver_template = XX; - * #include <../../scsi/scsi_module.c> - * lines was REMOVED @ lk-2.4.0-test9 - * Issue discovered 20001213 by: sshirron - */ -#define MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS 1 - -/* * tq_scheduler disappeared @ lk-2.4.0-test12 * (right when newly defined TQ_ACTIVE) * tq_struct reworked in 2.5.41. Include workqueue.h. @@ -160,8 +152,6 @@ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -#define x_scsi_detect mptscsih_detect -#define x_scsi_release mptscsih_release #define x_scsi_info mptscsih_info #define x_scsi_queuecommand mptscsih_qcmd #define x_scsi_abort mptscsih_abort @@ -170,9 +160,6 @@ #define x_scsi_host_reset mptscsih_host_reset #define x_scsi_bios_param mptscsih_bios_param -#define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh -#define x_scsi_old_abort mptscsih_old_abort -#define x_scsi_old_reset mptscsih_old_reset #define x_scsi_slave_alloc mptscsih_slave_alloc #define x_scsi_slave_configure mptscsih_slave_configure #define x_scsi_slave_destroy mptscsih_slave_destroy @@ -182,8 +169,6 @@ /* * MPT SCSI Host / Initiator decls... */ -extern int x_scsi_detect(Scsi_Host_Template *); -extern int x_scsi_release(struct Scsi_Host *host); extern const char *x_scsi_info(struct Scsi_Host *); extern int x_scsi_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); extern int x_scsi_abort(Scsi_Cmnd *); @@ -191,8 +176,7 @@ extern int x_scsi_dev_reset(Scsi_Cmnd *); extern int x_scsi_host_reset(Scsi_Cmnd *); extern int x_scsi_bios_param(struct scsi_device * sdev, struct block_device *bdev, - sector_t capacity, int *ip); -extern void x_scsi_taskmgmt_bh(void *); + sector_t capacity, int geom[]); extern int x_scsi_slave_alloc(Scsi_Device *); extern int x_scsi_slave_configure(Scsi_Device *); extern void x_scsi_slave_destroy(Scsi_Device *); diff -Nru a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c --- a/drivers/mtd/chips/cfi_cmdset_0001.c Tue Feb 17 20:00:06 2004 +++ b/drivers/mtd/chips/cfi_cmdset_0001.c Tue Feb 17 20:00:06 2004 @@ -1003,13 +1003,25 @@ z = 0; while(z < words * CFIDEV_BUSWIDTH) { if (cfi_buswidth_is_1()) { - map_write8 (map, *((__u8*)buf)++, adr+z); + u8 *b = (u8 *)buf; + + map_write8 (map, *b++, adr+z); + buf = (const u_char *)b; } else if (cfi_buswidth_is_2()) { - map_write16 (map, *((__u16*)buf)++, adr+z); + u16 *b = (u16 *)buf; + + map_write16 (map, *b++, adr+z); + buf = (const u_char *)b; } else if (cfi_buswidth_is_4()) { - map_write32 (map, *((__u32*)buf)++, adr+z); + u32 *b = (u32 *)buf; + + map_write32 (map, *b++, adr+z); + buf = (const u_char *)b; } else if (cfi_buswidth_is_8()) { - map_write64 (map, *((__u64*)buf)++, adr+z); + u64 *b = (u64 *)buf; + + map_write64 (map, *b++, adr+z); + buf = (const u_char *)b; } else { ret = -EINVAL; goto out; @@ -1025,11 +1037,20 @@ while (i < CFIDEV_BUSWIDTH) tmp_buf[i++] = 0xff; if (cfi_buswidth_is_2()) { - map_write16 (map, *((__u16*)tmp_p)++, adr+z); + u16 *b = (u16 *)tmp_p; + + map_write16 (map, *b++, adr+z); + tmp_p = (u_char *)b; } else if (cfi_buswidth_is_4()) { - map_write32 (map, *((__u32*)tmp_p)++, adr+z); + u32 *b = (u32 *)tmp_p; + + map_write32 (map, *b++, adr+z); + tmp_p = (u_char *)b; } else if (cfi_buswidth_is_8()) { - map_write64 (map, *((__u64*)tmp_p)++, adr+z); + u64 *b = (u64 *)tmp_p; + + map_write64 (map, *b++, adr+z); + tmp_p = (u_char *)b; } else { ret = -EINVAL; goto out; diff -Nru a/drivers/mtd/chips/cfi_cmdset_0020.c b/drivers/mtd/chips/cfi_cmdset_0020.c --- a/drivers/mtd/chips/cfi_cmdset_0020.c Tue Feb 17 20:00:06 2004 +++ b/drivers/mtd/chips/cfi_cmdset_0020.c Tue Feb 17 20:00:06 2004 @@ -542,11 +542,20 @@ /* Write data */ for (z = 0; z < len; z += CFIDEV_BUSWIDTH) { if (cfi_buswidth_is_1()) { - map_write8 (map, *((__u8*)buf)++, adr+z); + u8 *b = (u8 *)buf; + + map_write8 (map, *b++, adr+z); + buf = (const u_char *)b; } else if (cfi_buswidth_is_2()) { - map_write16 (map, *((__u16*)buf)++, adr+z); + u16 *b = (u16 *)buf; + + map_write16 (map, *b++, adr+z); + buf = (const u_char *)b; } else if (cfi_buswidth_is_4()) { - map_write32 (map, *((__u32*)buf)++, adr+z); + u32 *b = (u32 *)buf; + + map_write32 (map, *b++, adr+z); + buf = (const u_char *)b; } else { DISABLE_VPP(map); return -EINVAL; diff -Nru a/drivers/mtd/maps/elan-104nc.c b/drivers/mtd/maps/elan-104nc.c --- a/drivers/mtd/maps/elan-104nc.c Tue Feb 17 20:00:07 2004 +++ b/drivers/mtd/maps/elan-104nc.c Tue Feb 17 20:00:07 2004 @@ -148,7 +148,7 @@ elan_104nc_page(map, from); memcpy_fromio(to, iomapadr + (from & WINDOW_MASK), thislen); spin_unlock(&elan_104nc_spin); - (__u8*)to += thislen; + to += thislen; from += thislen; len -= thislen; } diff -Nru a/drivers/mtd/maps/sbc_gxx.c b/drivers/mtd/maps/sbc_gxx.c --- a/drivers/mtd/maps/sbc_gxx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/mtd/maps/sbc_gxx.c Tue Feb 17 20:00:07 2004 @@ -155,7 +155,7 @@ sbc_gxx_page(map, from); memcpy_fromio(to, iomapadr + (from & WINDOW_MASK), thislen); spin_unlock(&sbc_gxx_spin); - (__u8*)to += thislen; + to += thislen; from += thislen; len -= thislen; } diff -Nru a/drivers/net/3c501.c b/drivers/net/3c501.c --- a/drivers/net/3c501.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/3c501.c Tue Feb 17 20:00:05 2004 @@ -136,17 +136,14 @@ #include "3c501.h" -/* A zero-terminated list of I/O addresses to be probed. - The 3c501 can be at many locations, but here are the popular ones. */ -static unsigned int netcard_portlist[] __initdata = { - 0x280, 0x300, 0 -}; - - /* * The boilerplate probe code. */ +static int io=0x280; +static int irq=5; +static int mem_start; + /** * el1_probe: - probe for a 3c501 * @dev: The device structure passed in to probe. @@ -160,23 +157,47 @@ * probe and failing to find anything. */ -int __init el1_probe(struct net_device *dev) +struct net_device * __init el1_probe(int unit) { - int i; - int base_addr = dev->base_addr; + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + static unsigned ports[] = { 0x280, 0x300, 0}; + unsigned *port; + int err = 0; + + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + mem_start = dev->mem_start & 7; + } SET_MODULE_OWNER(dev); - if (base_addr > 0x1ff) /* Check a single specified location. */ - return el1_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; netcard_portlist[i]; i++) - if (el1_probe1(dev, netcard_portlist[i]) == 0) - return 0; - - return -ENODEV; + if (io > 0x1ff) { /* Check a single specified location. */ + err = el1_probe1(dev, io); + } else if (io != 0) { + err = -ENXIO; /* Don't probe at all. */ + } else { + for (port = ports; *port && el1_probe1(dev, *port); port++) + ; + if (!*port) + err = -ENODEV; + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + release_region(dev->base_addr, EL1_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } /** @@ -240,6 +261,8 @@ * high. */ + dev->irq = irq; + if (dev->irq < 2) { unsigned long irq_mask; @@ -267,8 +290,8 @@ dev->base_addr = ioaddr; memcpy(dev->dev_addr, station_addr, ETH_ALEN); - if (dev->mem_start & 0xf) - el_debug = dev->mem_start & 0x7; + if (mem_start & 0xf) + el_debug = mem_start & 0x7; if (autoirq) dev->irq = autoirq; @@ -282,17 +305,7 @@ if (el_debug) printk(KERN_DEBUG "%s", version); - /* - * Initialize the device structure. - */ - - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) { - release_region(ioaddr, EL1_IO_EXTENT); - return -ENOMEM; - } memset(dev->priv, 0, sizeof(struct net_local)); - lp=dev->priv; spin_lock_init(&lp->lock); @@ -308,13 +321,6 @@ dev->get_stats = &el1_get_stats; dev->set_multicast_list = &set_multicast_list; dev->ethtool_ops = &netdev_ethtool_ops; - - /* - * Setup the generic properties - */ - - ether_setup(dev); - return 0; } @@ -884,14 +890,8 @@ #ifdef MODULE -static struct net_device dev_3c501 = { - .init = el1_probe, - .base_addr = 0x280, - .irq = 5, -}; +static struct net_device *dev_3c501; -static int io=0x280; -static int irq=5; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); MODULE_PARM_DESC(io, "EtherLink I/O base address"); @@ -911,10 +911,9 @@ int init_module(void) { - dev_3c501.irq=irq; - dev_3c501.base_addr=io; - if (register_netdev(&dev_3c501) != 0) - return -EIO; + dev_3c501 = el1_probe(-1); + if (IS_ERR(dev_3c501)) + return PTR_ERR(dev_3c501); return 0; } @@ -927,19 +926,10 @@ void cleanup_module(void) { - unregister_netdev(&dev_3c501); - - /* - * Free up the private structure, or leak memory :-) - */ - - kfree(dev_3c501.priv); - dev_3c501.priv = NULL; /* gets re-allocated by el1_probe1 */ - - /* - * If we don't do this, we can't re-insmod it later. - */ - release_region(dev_3c501.base_addr, EL1_IO_EXTENT); + struct net_device *dev = dev_3c501; + unregister_netdev(dev); + release_region(dev->base_addr, EL1_IO_EXTENT); + free_netdev(dev); } #endif /* MODULE */ diff -Nru a/drivers/net/3c501.h b/drivers/net/3c501.h --- a/drivers/net/3c501.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/3c501.h Tue Feb 17 20:00:06 2004 @@ -3,7 +3,6 @@ * Index to functions. */ -int el1_probe(struct net_device *dev); static int el1_probe1(struct net_device *dev, int ioaddr); static int el_open(struct net_device *dev); static void el_timeout(struct net_device *dev); diff -Nru a/drivers/net/3c503.c b/drivers/net/3c503.c --- a/drivers/net/3c503.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/3c503.c Tue Feb 17 20:00:07 2004 @@ -60,7 +60,6 @@ #include "3c503.h" #define WRD_COUNT 4 -int el2_probe(struct net_device *dev); static int el2_pio_probe(struct net_device *dev); static int el2_probe1(struct net_device *dev, int ioaddr); @@ -90,11 +89,11 @@ If the ethercard isn't found there is an optional probe for ethercard jumpered to programmed-I/O mode. */ -int __init -el2_probe(struct net_device *dev) +static int __init do_el2_probe(struct net_device *dev) { int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0}; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -104,16 +103,13 @@ return -ENXIO; for (addr = addrs; *addr; addr++) { - int i; - unsigned int base_bits = isa_readb(*addr); - /* Find first set bit. */ - for(i = 7; i >= 0; i--, base_bits >>= 1) - if (base_bits & 0x1) - break; - if (base_bits != 1) + unsigned base_bits = isa_readb(*addr); + int i = ffs(base_bits) - 1; + if (i == -1 || base_bits != (1 << i)) continue; if (el2_probe1(dev, netcard_portlist[i]) == 0) return 0; + dev->irq = irq; } #if ! defined(no_probe_nonshared_memory) return el2_pio_probe(dev); @@ -128,20 +124,54 @@ el2_pio_probe(struct net_device *dev) { int i; - int base_addr = dev ? dev->base_addr : 0; + int base_addr = dev->base_addr; + int irq = dev->irq; if (base_addr > 0x1ff) /* Check a single specified location. */ return el2_probe1(dev, base_addr); else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; netcard_portlist[i]; i++) + for (i = 0; netcard_portlist[i]; i++) { if (el2_probe1(dev, netcard_portlist[i]) == 0) return 0; + dev->irq = irq; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + /* NB: el2_close() handles free_irq */ + release_region(dev->base_addr, EL2_IO_EXTENT); +} + +struct net_device * __init el2_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_el2_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + /* Probe for the Etherlink II card at I/O port base IOADDR, returning non-zero on success. If found, set the station address and memory parameters in DEVICE. */ @@ -152,15 +182,19 @@ static unsigned version_printed; unsigned long vendor_id; - /* FIXME: code reads ioaddr + 0x400, we request ioaddr + 16 */ if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name)) return -EBUSY; + if (!request_region(ioaddr + 0x400, 8, dev->name)) { + retval = -EBUSY; + goto out; + } + /* Reset and/or avoid any lurking NE2000 */ if (inb(ioaddr + 0x408) == 0xff) { mdelay(1); retval = -ENODEV; - goto out; + goto out1; } /* We verify that it's a 3C503 board by checking the first three octets @@ -171,7 +205,7 @@ if ( (iobase_reg & (iobase_reg - 1)) || (membase_reg & (membase_reg - 1))) { retval = -ENODEV; - goto out; + goto out1; } saved_406 = inb_p(ioaddr + 0x406); outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */ @@ -184,19 +218,13 @@ /* Restore the register we frobbed. */ outb(saved_406, ioaddr + 0x406); retval = -ENODEV; - goto out; + goto out1; } if (ei_debug && version_printed++ == 0) printk(version); dev->base_addr = ioaddr; - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk ("3c503: unable to allocate memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr); @@ -322,7 +350,10 @@ printk("\n%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n", dev->name, ei_status.name, (wordlength+1)<<3); } + release_region(ioaddr + 0x400, 8); return 0; +out1: + release_region(ioaddr + 0x400, 8); out: release_region(ioaddr, EL2_IO_EXTENT); return retval; @@ -633,7 +664,7 @@ #ifdef MODULE #define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */ -static struct net_device dev_el2[MAX_EL2_CARDS]; +static struct net_device *dev_el2[MAX_EL2_CARDS]; static int io[MAX_EL2_CARDS]; static int irq[MAX_EL2_CARDS]; static int xcvr[MAX_EL2_CARDS]; /* choose int. or ext. xcvr */ @@ -651,28 +682,34 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) { - struct net_device *dev = &dev_el2[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */ - dev->init = el2_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "3c503.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */ + if (do_el2_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_el2[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -681,13 +718,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) { - struct net_device *dev = &dev_el2[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - /* NB: el2_close() handles free_irq */ - release_region(dev->base_addr, EL2_IO_EXTENT); + struct net_device *dev = dev_el2[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/3c505.c b/drivers/net/3c505.c --- a/drivers/net/3c505.c Tue Feb 17 20:00:14 2004 +++ b/drivers/net/3c505.c Tue Feb 17 20:00:14 2004 @@ -1293,42 +1293,6 @@ } } -/****************************************************** - * - * initialise Etherlink Plus board - * - ******************************************************/ - -static inline void elp_init(struct net_device *dev) -{ - elp_device *adapter = dev->priv; - - /* - * set ptrs to various functions - */ - dev->open = elp_open; /* local */ - dev->stop = elp_close; /* local */ - dev->get_stats = elp_get_stats; /* local */ - dev->hard_start_xmit = elp_start_xmit; /* local */ - dev->tx_timeout = elp_timeout; /* local */ - dev->watchdog_timeo = 10*HZ; - dev->set_multicast_list = elp_set_mc_list; /* local */ - dev->ethtool_ops = &netdev_ethtool_ops; /* local */ - - /* Setup the generic properties */ - ether_setup(dev); - - /* - * setup ptr to adapter specific information - */ - memset(&(adapter->stats), 0, sizeof(struct net_device_stats)); - - /* - * memory information - */ - dev->mem_start = dev->mem_end = 0; -} - /************************************************************ * * A couple of tests to see if there's 3C505 or not @@ -1442,12 +1406,13 @@ * work at all if it was in a weird state). */ -int __init elplus_probe(struct net_device *dev) +static int __init elplus_setup(struct net_device *dev) { - elp_device *adapter; + elp_device *adapter = dev->priv; int i, tries, tries1, okay; unsigned long timeout; unsigned long cookie = 0; + int err = -ENODEV; SET_MODULE_OWNER(dev); @@ -1456,17 +1421,8 @@ */ dev->base_addr = elp_autodetect(dev); - if (!(dev->base_addr)) - return -ENODEV; - - /* - * setup ptr to adapter specific information - */ - adapter = (elp_device *) (dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL)); - if (adapter == NULL) { - printk(KERN_ERR "%s: out of memory\n", dev->name); + if (!dev->base_addr) return -ENODEV; - } adapter->send_pcb_semaphore = 0; @@ -1544,8 +1500,7 @@ outb_control(adapter->hcr_val & ~(FLSH | ATTN), dev); } printk(KERN_ERR "%s: failed to initialise 3c505\n", dev->name); - release_region(dev->base_addr, ELP_IO_EXTENT); - return -ENODEV; + goto out; okay: if (dev->irq) { /* Is there a preset IRQ? */ @@ -1560,14 +1515,14 @@ case 0: printk(KERN_ERR "%s: IRQ probe failed: check 3c505 jumpers.\n", dev->name); - return -ENODEV; + goto out; case 1: case 6: case 8: case 13: printk(KERN_ERR "%s: Impossible IRQ %d reported by probe_irq_off().\n", dev->name, dev->irq); - return -ENODEV; + goto out; } /* * Now we have the IRQ number so we can disable the interrupts from @@ -1636,16 +1591,48 @@ printk(KERN_ERR "%s: adapter configuration failed\n", dev->name); } - /* - * initialise the device - */ - elp_init(dev); + dev->open = elp_open; /* local */ + dev->stop = elp_close; /* local */ + dev->get_stats = elp_get_stats; /* local */ + dev->hard_start_xmit = elp_start_xmit; /* local */ + dev->tx_timeout = elp_timeout; /* local */ + dev->watchdog_timeo = 10*HZ; + dev->set_multicast_list = elp_set_mc_list; /* local */ + dev->ethtool_ops = &netdev_ethtool_ops; /* local */ + + memset(&(adapter->stats), 0, sizeof(struct net_device_stats)); + dev->mem_start = dev->mem_end = 0; + + err = register_netdev(dev); + if (err) + goto out; return 0; +out: + release_region(dev->base_addr, ELP_IO_EXTENT); + return err; +} + +struct net_device * __init elplus_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(elp_device)); + int err; + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = elplus_setup(dev); + if (err) { + free_netdev(dev); + return ERR_PTR(err); + } + return dev; } #ifdef MODULE -static struct net_device dev_3c505[ELP_MAX_CARDS]; +static struct net_device *dev_3c505[ELP_MAX_CARDS]; static int io[ELP_MAX_CARDS]; static int irq[ELP_MAX_CARDS]; static int dma[ELP_MAX_CARDS]; @@ -1661,10 +1648,12 @@ int this_dev, found = 0; for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_3c505[this_dev]; + struct net_device *dev = alloc_etherdev(sizeof(elp_device)); + if (!dev) + break; + dev->irq = irq[this_dev]; dev->base_addr = io[this_dev]; - dev->init = elplus_probe; if (dma[this_dev]) { dev->dma = dma[this_dev]; } else { @@ -1672,16 +1661,22 @@ printk(KERN_WARNING "3c505.c: warning, using default DMA channel,\n"); } if (io[this_dev] == 0) { - if (this_dev) break; + if (this_dev) { + free_netdev(dev); + break; + } printk(KERN_NOTICE "3c505.c: module autoprobe not recommended, give io=xx.\n"); } - if (register_netdev(dev) != 0) { + if (elplus_setup(dev) != 0) { printk(KERN_WARNING "3c505.c: Failed to register card at 0x%x.\n", io[this_dev]); - if (found != 0) return 0; - return -ENXIO; + free_netdev(dev); + break; } + dev_3c505[this_dev] = dev; found++; } + if (!found) + return -ENODEV; return 0; } @@ -1690,12 +1685,11 @@ int this_dev; for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_3c505[this_dev]; - if (dev->priv != NULL) { + struct net_device *dev = dev_3c505[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(dev->priv); - dev->priv = NULL; release_region(dev->base_addr, ELP_IO_EXTENT); + free_netdev(dev); } } } diff -Nru a/drivers/net/3c507.c b/drivers/net/3c507.c --- a/drivers/net/3c507.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/3c507.c Tue Feb 17 20:00:07 2004 @@ -74,10 +74,6 @@ #define debug net_debug -/* A zero-terminated list of common I/O addresses to be probed. */ -static unsigned int netcard_portlist[] __initdata = - { 0x300, 0x320, 0x340, 0x280, 0}; - /* Details of the i82586. @@ -286,8 +282,6 @@ /* Index to functions, as function prototypes. */ -extern int el16_probe(struct net_device *dev); /* Called from Space.c */ - static int el16_probe1(struct net_device *dev, int ioaddr); static int el16_open(struct net_device *dev); static int el16_send_packet(struct sk_buff *skb, struct net_device *dev); @@ -301,6 +295,10 @@ static void init_82586_mem(struct net_device *dev); static struct ethtool_ops netdev_ethtool_ops; +static int io = 0x300; +static int irq; +static int mem_start; + /* Check for a network adaptor of this type, and return '0' iff one exists. If dev->base_addr == 0, probe all likely locations. @@ -309,23 +307,50 @@ device and return success. */ -int __init el16_probe(struct net_device *dev) +struct net_device * __init el16_probe(int unit) { - int base_addr = dev->base_addr; - int i; + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + static unsigned ports[] = { 0x300, 0x320, 0x340, 0x280, 0}; + unsigned *port; + int err = -ENODEV; + + if (!dev) + return ERR_PTR(-ENODEV); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + mem_start = dev->mem_start & 15; + } SET_MODULE_OWNER(dev); - if (base_addr > 0x1ff) /* Check a single specified location. */ - return el16_probe1(dev, base_addr); - else if (base_addr != 0) - return -ENXIO; /* Don't probe at all. */ - - for (i = 0; netcard_portlist[i]; i++) - if (el16_probe1(dev, netcard_portlist[i]) == 0) - return 0; + if (io > 0x1ff) /* Check a single specified location. */ + err = el16_probe1(dev, io); + else if (io != 0) + err = -ENXIO; /* Don't probe at all. */ + else { + for (port = ports; *port; port++) { + err = el16_probe1(dev, *port); + if (!err) + break; + } + } - return -ENODEV; + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + free_irq(dev->irq, dev); + release_region(dev->base_addr, EL16_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } static int __init el16_probe1(struct net_device *dev, int ioaddr) @@ -383,8 +408,8 @@ printk(" %02x", dev->dev_addr[i]); } - if ((dev->mem_start & 0xf) > 0) - net_debug = dev->mem_start & 7; + if (mem_start) + net_debug = mem_start & 7; #ifdef MEM_BASE dev->mem_start = MEM_BASE; @@ -416,27 +441,18 @@ if (net_debug) printk(version); - /* Initialize the device structure. */ - lp = dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) { - retval = -ENOMEM; - goto out; - } - memset(dev->priv, 0, sizeof(struct net_local)); + lp = dev->priv; + memset(lp, 0, sizeof(*lp)); spin_lock_init(&lp->lock); - dev->open = el16_open; - dev->stop = el16_close; + dev->open = el16_open; + dev->stop = el16_close; dev->hard_start_xmit = el16_send_packet; dev->get_stats = el16_get_stats; dev->tx_timeout = el16_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; dev->ethtool_ops = &netdev_ethtool_ops; - - ether_setup(dev); /* Generic ethernet behaviour */ - - dev->flags&=~IFF_MULTICAST; /* Multicast doesn't work */ - + dev->flags &= ~IFF_MULTICAST; /* Multicast doesn't work */ return 0; out: release_region(ioaddr, EL16_IO_EXTENT); @@ -899,9 +915,7 @@ }; #ifdef MODULE -static struct net_device dev_3c507; -static int io = 0x300; -static int irq; +static struct net_device *dev_3c507; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); MODULE_PARM_DESC(io, "EtherLink16 I/O base address"); @@ -911,26 +925,18 @@ { if (io == 0) printk("3c507: You should not use auto-probing with insmod!\n"); - dev_3c507.base_addr = io; - dev_3c507.irq = irq; - dev_3c507.init = el16_probe; - if (register_netdev(&dev_3c507) != 0) { - printk("3c507: register_netdev() returned non-zero.\n"); - return -EIO; - } - return 0; + dev_3c507 = el16_probe(-1); + return IS_ERR(dev_3c507) ? PTR_ERR(dev_3c507) : 0; } void cleanup_module(void) { - unregister_netdev(&dev_3c507); - kfree(dev_3c507.priv); - dev_3c507.priv = NULL; - - /* If we don't do this, we can't re-insmod it later. */ - free_irq(dev_3c507.irq, &dev_3c507); - release_region(dev_3c507.base_addr, EL16_IO_EXTENT); + struct net_device *dev = dev_3c507; + unregister_netdev(dev); + free_irq(dev->irq, dev); + release_region(dev->base_addr, EL16_IO_EXTENT); + free_netdev(dev); } #endif /* MODULE */ MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/3c515.c b/drivers/net/3c515.c --- a/drivers/net/3c515.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/3c515.c Tue Feb 17 20:00:06 2004 @@ -307,7 +307,8 @@ struct corkscrew_private { const char *product_name; - struct net_device *next_module; + struct list_head list; + struct net_device *our_dev; /* The Rx and Tx rings are here to keep them quad-word-aligned. */ struct boom_rx_desc rx_ring[RX_RING_SIZE]; struct boom_tx_desc tx_ring[TX_RING_SIZE]; @@ -329,6 +330,7 @@ full_bus_master_tx:1, full_bus_master_rx:1, /* Boomerang */ tx_full:1; spinlock_t lock; + struct device *dev; }; /* The action to take with a media selection timer tick. @@ -367,17 +369,12 @@ MODULE_DEVICE_TABLE(isapnp, corkscrew_isapnp_adapters); -static int corkscrew_isapnp_phys_addr[3]; - static int nopnp; #endif /* __ISAPNP__ */ -static int corkscrew_scan(struct net_device *dev); -static struct net_device *corkscrew_found_device(struct net_device *dev, - int ioaddr, int irq, - int product_index, - int options); -static int corkscrew_probe1(struct net_device *dev); +static struct net_device *corkscrew_scan(int unit); +static void corkscrew_setup(struct net_device *dev, int ioaddr, + struct pnp_dev *idev, int card_number); static int corkscrew_open(struct net_device *dev); static void corkscrew_timer(unsigned long arg); static int corkscrew_start_xmit(struct sk_buff *skb, @@ -413,47 +410,99 @@ #ifdef MODULE static int debug = -1; /* A list of all installed Vortex devices, for removing the driver module. */ -static struct net_device *root_corkscrew_dev; +/* we will need locking (and refcounting) if we ever use it for more */ +static LIST_HEAD(root_corkscrew_dev); int init_module(void) { - int cards_found; - + int found = 0; if (debug >= 0) corkscrew_debug = debug; if (corkscrew_debug) printk(version); - - root_corkscrew_dev = NULL; - cards_found = corkscrew_scan(NULL); - return cards_found ? 0 : -ENODEV; + while (corkscrew_scan(-1)) + found++; + return found ? 0 : -ENODEV; } #else -int tc515_probe(struct net_device *dev) +struct net_device *tc515_probe(int unit) { - int cards_found = 0; + struct net_device *dev = corkscrew_scan(unit); + static int printed; - SET_MODULE_OWNER(dev); - - cards_found = corkscrew_scan(dev); + if (!dev) + return ERR_PTR(-ENODEV); - if (corkscrew_debug > 0 && cards_found) + if (corkscrew_debug > 0 && !printed) { + printed = 1; printk(version); + } - return cards_found ? 0 : -ENODEV; + return dev; } #endif /* not MODULE */ -static int corkscrew_scan(struct net_device *dev) +static int check_device(unsigned ioaddr) +{ + int timer; + + if (!request_region(ioaddr, CORKSCREW_TOTAL_SIZE, "3c515")) + return 0; + /* Check the resource configuration for a matching ioaddr. */ + if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0)) { + release_region(ioaddr, CORKSCREW_TOTAL_SIZE); + return 0; + } + /* Verify by reading the device ID from the EEPROM. */ + outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd); + /* Pause for at least 162 us. for the read to take place. */ + for (timer = 4; timer >= 0; timer--) { + udelay(162); + if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) == 0) + break; + } + if (inw(ioaddr + Wn0EepromData) != 0x6d50) { + release_region(ioaddr, CORKSCREW_TOTAL_SIZE); + return 0; + } + return 1; +} + +static void cleanup_card(struct net_device *dev) +{ + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; + list_del_init(&vp->list); + if (dev->dma) + free_dma(dev->dma); + outw(TotalReset, dev->base_addr + EL3_CMD); + release_region(dev->base_addr, CORKSCREW_TOTAL_SIZE); + if (vp->dev) + pnp_device_detach(to_pnp_dev(vp->dev)); +} + +static struct net_device *corkscrew_scan(int unit) { - int cards_found = 0; + struct net_device *dev; + static int cards_found = 0; static int ioaddr; + int err; #ifdef __ISAPNP__ short i; static int pnp_cards; #endif + dev = alloc_etherdev(sizeof(struct corkscrew_private)); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + + SET_MODULE_OWNER(dev); + #ifdef __ISAPNP__ if(nopnp == 1) goto no_pnp; @@ -470,7 +519,7 @@ if (pnp_activate_dev(idev) < 0) { printk("pnp activate failed (out of resources?)\n"); pnp_device_detach(idev); - return -ENOMEM; + continue; } if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0)) { pnp_device_detach(idev); @@ -478,40 +527,22 @@ } ioaddr = pnp_port_start(idev, 0); irq = pnp_irq(idev, 0); - if(corkscrew_debug) - printk ("ISAPNP reports %s at i/o 0x%x, irq %d\n", - (char*) corkscrew_isapnp_adapters[i].driver_data, ioaddr, irq); - - if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0)) { + if (!check_device(ioaddr)) { pnp_device_detach(idev); continue; } - /* Verify by reading the device ID from the EEPROM. */ - { - int timer; - outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd); - /* Pause for at least 162 us. for the read to take place. */ - for (timer = 4; timer >= 0; timer--) { - udelay(162); - if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) - == 0) - break; - } - if (inw(ioaddr + Wn0EepromData) != 0x6d50) { - pnp_device_detach(idev); - continue; - } - } + if(corkscrew_debug) + printk ("ISAPNP reports %s at i/o 0x%x, irq %d\n", + (char*) corkscrew_isapnp_adapters[i].driver_data, ioaddr, irq); printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n", inl(ioaddr + 0x2002), inw(ioaddr + 0x2000)); /* irq = inw(ioaddr + 0x2002) & 15; */ /* Use the irq from isapnp */ - corkscrew_isapnp_phys_addr[pnp_cards] = ioaddr; - corkscrew_found_device(dev, ioaddr, irq, CORKSCREW_ID, dev - && dev->mem_start ? dev-> - mem_start : options[cards_found]); - dev = 0; + corkscrew_setup(dev, ioaddr, idev, cards_found++); pnp_cards++; - cards_found++; + err = register_netdev(dev); + if (!err) + return dev; + cleanup_card(dev); } } no_pnp: @@ -519,122 +550,64 @@ /* Check all locations on the ISA bus -- evil! */ for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20) { - int irq; -#ifdef __ISAPNP__ - /* Make sure this was not already picked up by isapnp */ - if(ioaddr == corkscrew_isapnp_phys_addr[0]) continue; - if(ioaddr == corkscrew_isapnp_phys_addr[1]) continue; - if(ioaddr == corkscrew_isapnp_phys_addr[2]) continue; -#endif /* __ISAPNP__ */ - if (check_region(ioaddr, CORKSCREW_TOTAL_SIZE)) - continue; - /* Check the resource configuration for a matching ioaddr. */ - if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0)) + if (!check_device(ioaddr)) continue; - /* Verify by reading the device ID from the EEPROM. */ - { - int timer; - outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd); - /* Pause for at least 162 us. for the read to take place. */ - for (timer = 4; timer >= 0; timer--) { - udelay(162); - if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) - == 0) - break; - } - if (inw(ioaddr + Wn0EepromData) != 0x6d50) - continue; - } + printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n", inl(ioaddr + 0x2002), inw(ioaddr + 0x2000)); - irq = inw(ioaddr + 0x2002) & 15; - corkscrew_found_device(dev, ioaddr, irq, CORKSCREW_ID, - dev && dev->mem_start ? dev->mem_start : - (cards_found >= MAX_UNITS ? -1 : - options[cards_found])); - dev = 0; - cards_found++; + corkscrew_setup(dev, ioaddr, NULL, cards_found++); + err = register_netdev(dev); + if (!err) + return dev; + cleanup_card(dev); } - if (corkscrew_debug) - printk(KERN_INFO "%d 3c515 cards found.\n", cards_found); - return cards_found; + free_netdev(dev); + return NULL; } -static struct net_device *corkscrew_found_device(struct net_device *dev, - int ioaddr, int irq, - int product_index, - int options) +static void corkscrew_setup(struct net_device *dev, int ioaddr, + struct pnp_dev *idev, int card_number) { - struct corkscrew_private *vp; - -#ifdef MODULE - /* Allocate and fill new device structure. */ - int dev_size = sizeof(struct net_device) + sizeof(struct corkscrew_private) + 15; /* Pad for alignment */ + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; + unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ + int i; + int irq; - dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL); - if (!dev) - return NULL; - memset(dev, 0, dev_size); - /* Align the Rx and Tx ring entries. */ - dev->priv = (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15); - vp = (struct corkscrew_private *) dev->priv; - dev->base_addr = ioaddr; - dev->irq = irq; - dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); - dev->init = corkscrew_probe1; - vp->product_name = "3c515"; - vp->options = options; - if (options >= 0) { - vp->media_override = ((options & 7) == 2) ? 0 : options & 7; - vp->full_duplex = (options & 8) ? 1 : 0; - vp->bus_master = (options & 16) ? 1 : 0; + if (idev) { + irq = pnp_irq(idev, 0); + vp->dev = &idev->dev; } else { - vp->media_override = 7; - vp->full_duplex = 0; - vp->bus_master = 0; + irq = inw(ioaddr + 0x2002) & 15; } - ether_setup(dev); - vp->next_module = root_corkscrew_dev; - root_corkscrew_dev = dev; - SET_MODULE_OWNER(dev); - if (register_netdev(dev) != 0) { - kfree(dev); - return NULL; - } -#else /* not a MODULE */ - /* Caution: quad-word alignment required for rings! */ - dev->priv = kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL); - if (!dev->priv) - return NULL; - memset(dev->priv, 0, sizeof(struct corkscrew_private)); - dev = init_etherdev(dev, sizeof(struct corkscrew_private)); + dev->base_addr = ioaddr; dev->irq = irq; - dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); - vp = (struct corkscrew_private *) dev->priv; + dev->dma = inw(ioaddr + 0x2000) & 7; vp->product_name = "3c515"; - vp->options = options; - if (options >= 0) { - vp->media_override = ((options & 7) == 2) ? 0 : options & 7; - vp->full_duplex = (options & 8) ? 1 : 0; - vp->bus_master = (options & 16) ? 1 : 0; + vp->options = dev->mem_start; + vp->our_dev = dev; + + if (!vp->options) { + if (card_number >= MAX_UNITS) + vp->options = -1; + else + vp->options = options[card_number]; + } + + if (vp->options >= 0) { + vp->media_override = vp->options & 7; + if (vp->media_override == 2) + vp->media_override = 0; + vp->full_duplex = (vp->options & 8) ? 1 : 0; + vp->bus_master = (vp->options & 16) ? 1 : 0; } else { vp->media_override = 7; vp->full_duplex = 0; vp->bus_master = 0; } - - corkscrew_probe1(dev); -#endif /* MODULE */ - return dev; -} - -static int corkscrew_probe1(struct net_device *dev) -{ - int ioaddr = dev->base_addr; - struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; - unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ - int i; +#ifdef MODULE + list_add(&vp->list, &root_corkscrew_dev); +#endif printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, vp->product_name, ioaddr); @@ -706,9 +679,6 @@ /* vp->full_bus_master_rx = 0; */ vp->full_bus_master_rx = (vp->capabilities & 0x20) ? 1 : 0; - /* We do a request_region() to register /proc/ioports info. */ - request_region(ioaddr, CORKSCREW_TOTAL_SIZE, vp->product_name); - /* The 3c51x-specific entries in the device structure. */ dev->open = &corkscrew_open; dev->hard_start_xmit = &corkscrew_start_xmit; @@ -718,8 +688,6 @@ dev->get_stats = &corkscrew_get_stats; dev->set_multicast_list = &set_rx_mode; dev->ethtool_ops = &netdev_ethtool_ops; - - return 0; } @@ -1607,20 +1575,16 @@ #ifdef MODULE void cleanup_module(void) { - struct net_device *next_dev; - - while (root_corkscrew_dev) { - next_dev = - ((struct corkscrew_private *) root_corkscrew_dev-> - priv)->next_module; - if (root_corkscrew_dev->dma) - free_dma(root_corkscrew_dev->dma); - unregister_netdev(root_corkscrew_dev); - outw(TotalReset, root_corkscrew_dev->base_addr + EL3_CMD); - release_region(root_corkscrew_dev->base_addr, - CORKSCREW_TOTAL_SIZE); - free_netdev(root_corkscrew_dev); - root_corkscrew_dev = next_dev; + while (!list_empty(&root_corkscrew_dev)) { + struct net_device *dev; + struct corkscrew_private *vp; + + vp = list_entry(root_corkscrew_dev.next, + struct corkscrew_private, list); + dev = vp->our_dev; + unregister_netdev(dev); + cleanup_card(dev); + free_netdev(dev); } } #endif /* MODULE */ diff -Nru a/drivers/net/3c523.c b/drivers/net/3c523.c --- a/drivers/net/3c523.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/3c523.c Tue Feb 17 20:00:07 2004 @@ -410,7 +410,7 @@ /*****************************************************************/ -int __init elmc_probe(struct net_device *dev) +static int __init do_elmc_probe(struct net_device *dev) { static int slot; int base_addr = dev->base_addr; @@ -420,7 +420,7 @@ int i = 0; unsigned int size = 0; int retval; - struct priv *pr; + struct priv *pr = dev->priv; SET_MODULE_OWNER(dev); if (MCA_bus == 0) { @@ -455,10 +455,9 @@ } /* we didn't find any 3c523 in the slots we checked for */ - if (slot == MCA_NOTFOUND) { - retval = ((base_addr || irq) ? -ENXIO : -ENODEV); - goto err_out; - } + if (slot == MCA_NOTFOUND) + return ((base_addr || irq) ? -ENXIO : -ENODEV); + mca_set_adapter_name(slot, "3Com 3c523 Etherlink/MC"); mca_set_adapter_procfn(slot, (MCA_ProcFn) elmc_getinfo, dev); @@ -497,13 +496,7 @@ break; } - pr = dev->priv = kmalloc(sizeof(struct priv), GFP_KERNEL); - if (dev->priv == NULL) { - retval = -ENOMEM; - goto err_out; - } memset(pr, 0, sizeof(struct priv)); - pr->slot = slot; printk(KERN_INFO "%s: 3Com 3c523 Rev 0x%x at %#lx\n", dev->name, (int) revision, @@ -530,8 +523,6 @@ if (!check586(dev, dev->mem_start, size)) { printk(KERN_ERR "%s: memprobe, Can't find memory at 0x%lx!\n", dev->name, dev->mem_start); - kfree(dev->priv); - dev->priv = NULL; retval = -ENODEV; goto err_out; } @@ -573,8 +564,6 @@ #endif dev->ethtool_ops = &netdev_ethtool_ops; - ether_setup(dev); - /* note that we haven't actually requested the IRQ from the kernel. That gets done in elmc_open(). I'm not sure that's such a good idea, but it works, so I'll go with it. */ @@ -585,9 +574,41 @@ return 0; err_out: + mca_set_adapter_procfn(slot, NULL, NULL); release_region(dev->base_addr, ELMC_IO_EXTENT); return retval; } + +static void cleanup_card(struct net_device *dev) +{ + mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot, NULL, NULL); + release_region(dev->base_addr, ELMC_IO_EXTENT); +} + +struct net_device * __init elmc_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct priv)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_elmc_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} /********************************************** * init the chip (elmc-interrupt should be disabled?!) @@ -1245,7 +1266,7 @@ /* Increase if needed ;) */ #define MAX_3C523_CARDS 4 -static struct net_device dev_elmc[MAX_3C523_CARDS]; +static struct net_device *dev_elmc[MAX_3C523_CARDS]; static int irq[MAX_3C523_CARDS]; static int io[MAX_3C523_CARDS]; MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i"); @@ -1258,16 +1279,24 @@ int this_dev,found = 0; /* Loop until we either can't find any more cards, or we have MAX_3C523_CARDS */ - for(this_dev=0; this_devirq=irq[this_dev]; dev->base_addr=io[this_dev]; - dev->init=elmc_probe; - if(register_netdev(dev)!=0) { - if(io[this_dev]==0) break; - printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]); - } else found++; + if (do_elmc_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_elmc[this_dev] = dev; + found++; + continue; + } + cleanup_card(dev); + } + free_netdev(dev); + if (io[this_dev]==0) + break; + printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]); } if(found==0) { @@ -1279,31 +1308,12 @@ void cleanup_module(void) { int this_dev; - for(this_dev=0; this_devpriv) { - /* shutdown interrupts on the card */ - elmc_id_reset586(); - if (dev->irq != 0) { - /* this should be done by close, but if we failed to - initialize properly something may have gotten hosed. */ - free_irq(dev->irq, dev); - dev->irq = 0; - } - if (dev->base_addr != 0) { - release_region(dev->base_addr, ELMC_IO_EXTENT); - dev->base_addr = 0; - } - irq[this_dev] = 0; - io[this_dev] = 0; + for (this_dev=0; this_devpriv))->slot, - NULL, NULL); - - kfree(dev->priv); - dev->priv = NULL; + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/3c527.c b/drivers/net/3c527.c --- a/drivers/net/3c527.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/3c527.c Tue Feb 17 20:00:07 2004 @@ -212,8 +212,6 @@ /* Index to functions, as function prototypes. */ -extern int mc32_probe(struct net_device *dev); - static int mc32_probe1(struct net_device *dev, int ioaddr); static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len); static int mc32_open(struct net_device *dev); @@ -226,9 +224,19 @@ static void mc32_reset_multicast_list(struct net_device *dev); static struct ethtool_ops netdev_ethtool_ops; +static void cleanup_card(struct net_device *dev) +{ + struct mc32_local *lp=dev->priv; + unsigned slot = lp->slot; + mca_mark_as_unused(slot); + mca_set_adapter_name(slot, NULL); + free_irq(dev->irq, dev); + release_region(dev->base_addr, MC32_IO_EXTENT); +} + /** * mc32_probe - Search for supported boards - * @dev: device to probe + * @unit: interface number to use * * Because MCA bus is a real bus and we can scan for cards we could do a * single scan for all boards here. Right now we use the passed in device @@ -236,10 +244,18 @@ * in particular. */ -int __init mc32_probe(struct net_device *dev) +struct net_device *__init mc32_probe(int unit) { + struct net_device *dev = alloc_etherdev(sizeof(struct mc32_local)); static int current_mca_slot = -1; int i; + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); SET_MODULE_OWNER(dev); @@ -260,12 +276,18 @@ mca_set_adapter_name(current_mca_slot, mc32_adapters[i].name); mca_mark_as_used(current_mca_slot); - return 0; + err = register_netdev(dev); + if (err) { + cleanup_card(dev); + free_netdev(dev); + dev = ERR_PTR(err); + } + return dev; } } } - return -ENODEV; + return ERR_PTR(-ENODEV); } /** @@ -285,7 +307,7 @@ int i, err; u8 POS; u32 base; - struct mc32_local *lp; + struct mc32_local *lp = dev->priv; static u16 mca_io_bases[]={ 0x7280,0x7290, 0x7680,0x7690, @@ -412,24 +434,14 @@ * Grab the IRQ */ - i = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); - if (i) { + err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + if (err) { release_region(dev->base_addr, MC32_IO_EXTENT); printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq); - return i; - } - - - /* Initialize the device structure. */ - dev->priv = kmalloc(sizeof(struct mc32_local), GFP_KERNEL); - if (dev->priv == NULL) - { - err = -ENOMEM; - goto err_exit_irq; + goto err_exit_ports; } - memset(dev->priv, 0, sizeof(struct mc32_local)); - lp = dev->priv; + memset(lp, 0, sizeof(struct mc32_local)); lp->slot = slot; i=0; @@ -443,7 +455,7 @@ { printk(KERN_ERR "%s: failed to boot adapter.\n", dev->name); err = -ENODEV; - goto err_exit_free; + goto err_exit_irq; } udelay(1000); if(inb(dev->base_addr+2)&(1<<5)) @@ -458,7 +470,7 @@ else printk(KERN_ERR "%s: unknown failure %d.\n", dev->name, base); err = -ENODEV; - goto err_exit_free; + goto err_exit_irq; } base=0; @@ -474,7 +486,7 @@ { printk(KERN_ERR "%s: mailbox read fail (%d).\n", dev->name, i); err = -ENODEV; - goto err_exit_free; + goto err_exit_irq; } } @@ -517,15 +529,11 @@ dev->watchdog_timeo = HZ*5; /* Board does all the work */ dev->ethtool_ops = &netdev_ethtool_ops; - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - return 0; -err_exit_free: - kfree(dev->priv); err_exit_irq: free_irq(dev->irq, dev); +err_exit_ports: release_region(dev->base_addr, MC32_IO_EXTENT); return err; } @@ -1630,7 +1638,7 @@ #ifdef MODULE -static struct net_device this_device; +static struct net_device *this_device; /** * init_module - entry point @@ -1642,12 +1650,9 @@ int init_module(void) { - int result; - - this_device.init = mc32_probe; - if ((result = register_netdev(&this_device)) != 0) - return result; - + this_device = mc32_probe(-1); + if (IS_ERR(this_device)) + return PTR_ERR(this_device); return 0; } @@ -1664,24 +1669,9 @@ void cleanup_module(void) { - int slot; - - unregister_netdev(&this_device); - - /* - * If we don't do this, we can't re-insmod it later. - */ - - if (this_device.priv) - { - struct mc32_local *lp=this_device.priv; - slot = lp->slot; - mca_mark_as_unused(slot); - mca_set_adapter_name(slot, NULL); - kfree(this_device.priv); - } - free_irq(this_device.irq, &this_device); - release_region(this_device.base_addr, MC32_IO_EXTENT); + unregister_netdev(this_device); + cleanup_card(this_device); + free_netdev(this_device); } #endif /* MODULE */ diff -Nru a/drivers/net/8139too.c b/drivers/net/8139too.c --- a/drivers/net/8139too.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/8139too.c Tue Feb 17 20:00:05 2004 @@ -92,7 +92,7 @@ */ #define DRV_NAME "8139too" -#define DRV_VERSION "0.9.26" +#define DRV_VERSION "0.9.27" #include @@ -117,17 +117,17 @@ #define RTL8139_DRIVER_NAME DRV_NAME " Fast Ethernet driver " DRV_VERSION #define PFX DRV_NAME ": " +/* Default Message level */ +#define RTL8139_DEF_MSG_ENABLE (NETIF_MSG_DRV | \ + NETIF_MSG_PROBE | \ + NETIF_MSG_LINK) + /* enable PIO instead of MMIO, if CONFIG_8139TOO_PIO is selected */ #ifdef CONFIG_8139TOO_PIO #define USE_IO_OPS 1 #endif -/* use a 16K rx ring buffer instead of the default 32K */ -#ifdef CONFIG_SH_DREAMCAST -#define USE_BUF16K 1 -#endif - /* define to 1 to enable copious debugging info */ #undef RTL8139_DEBUG @@ -146,9 +146,9 @@ # define assert(expr) do {} while (0) #else # define assert(expr) \ - if(!(expr)) { \ - printk( "Assertion failed! %s,%s,%s,line=%d\n", \ - #expr,__FILE__,__FUNCTION__,__LINE__); \ + if(unlikely(!(expr))) { \ + printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \ + #expr,__FILE__,__FUNCTION__,__LINE__); \ } #endif @@ -159,9 +159,6 @@ static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; -/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ -static int max_interrupt_work = 20; - /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). The RTL chips use a 64 element hash table based on the Ethernet CRC. */ static int multicast_filter_limit = 32; @@ -169,16 +166,16 @@ /* bitmapped message enable number */ static int debug = -1; -/* Size of the in-memory receive ring. */ -#ifdef USE_BUF16K -#define RX_BUF_LEN_IDX 1 /* 0==8K, 1==16K, 2==32K, 3==64K */ -#else -#define RX_BUF_LEN_IDX 2 /* 0==8K, 1==16K, 2==32K, 3==64K */ -#endif -#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX) +/* Ring size is now a config option */ +#define RX_BUF_LEN (8192 << CONFIG_8139_RXBUF_IDX) #define RX_BUF_PAD 16 #define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */ + +#if RX_BUF_LEN == 65536 +#define RX_BUF_TOT_LEN RX_BUF_LEN +#else #define RX_BUF_TOT_LEN (RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD) +#endif /* Number of Tx descriptor registers. */ #define NUM_TX_DESC 4 @@ -251,6 +248,10 @@ {0x11db, 0x1234, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, {0x1432, 0x9130, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, {0x02ac, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x018a, 0x0106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x126c, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1743, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, #ifdef CONFIG_SH_SECUREEDGE5410 /* Bogus 8139 silicon reports 8129 without external PROM :-( */ @@ -450,7 +451,7 @@ RxCfgRcv32K = (1 << 12), RxCfgRcv64K = (1 << 11) | (1 << 12), - /* Disable packet wrap at end of Rx buffer */ + /* Disable packet wrap at end of Rx buffer. (not possible with 64k) */ RxNoWrap = (1 << 7), }; @@ -560,6 +561,7 @@ int drv_flags; struct pci_dev *pci_dev; u32 pci_state[16]; + u32 msg_enable; struct net_device_stats stats; unsigned char *rx_ring; unsigned int cur_rx; /* Index into the Rx buffer of next Rx pkt. */ @@ -574,6 +576,7 @@ char twistie, twist_row, twist_col; /* Twister tune state. */ unsigned int default_port:4; /* Last dev->if_port value. */ spinlock_t lock; + spinlock_t rx_lock; chip_t chipset; pid_t thr_pid; wait_queue_head_t thr_wait; @@ -590,13 +593,11 @@ MODULE_LICENSE("GPL"); MODULE_PARM (multicast_filter_limit, "i"); -MODULE_PARM (max_interrupt_work, "i"); MODULE_PARM (media, "1-" __MODULE_STRING(MAX_UNITS) "i"); MODULE_PARM (full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); MODULE_PARM (debug, "i"); MODULE_PARM_DESC (debug, "8139too bitmapped message enable number"); MODULE_PARM_DESC (multicast_filter_limit, "8139too maximum number of filtered multicast addresses"); -MODULE_PARM_DESC (max_interrupt_work, "8139too maximum events handled per interrupt"); MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"); MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)"); @@ -610,6 +611,10 @@ static void rtl8139_init_ring (struct net_device *dev); static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev); +static int rtl8139_poll(struct net_device *dev, int *budget); +#ifdef CONFIG_NET_POLL_CONTROLLER +static void rtl8139_poll_controller(struct net_device *dev); +#endif static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs); static int rtl8139_close (struct net_device *dev); @@ -682,16 +687,32 @@ PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; -#ifdef USE_BUF16K +static const u16 rtl8139_norx_intr_mask = + PCIErr | PCSTimeout | RxUnderrun | + TxErr | TxOK | RxErr ; + +#if CONFIG_8139_RXBUF_IDX == 0 +static const unsigned int rtl8139_rx_config = + RxCfgRcv8K | RxNoWrap | + (RX_FIFO_THRESH << RxCfgFIFOShift) | + (RX_DMA_BURST << RxCfgDMAShift); +#elif CONFIG_8139_RXBUF_IDX == 1 static const unsigned int rtl8139_rx_config = RxCfgRcv16K | RxNoWrap | (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); -#else +#elif CONFIG_8139_RXBUF_IDX == 2 static const unsigned int rtl8139_rx_config = RxCfgRcv32K | RxNoWrap | (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); +#elif CONFIG_8139_RXBUF_IDX == 3 +static const unsigned int rtl8139_rx_config = + RxCfgRcv64K | + (RX_FIFO_THRESH << RxCfgFIFOShift) | + (RX_DMA_BURST << RxCfgDMAShift); +#else +#error "Invalid configuration for 8139_RXBUF_IDX" #endif static const unsigned int rtl8139_tx_config = @@ -868,9 +889,7 @@ match: DPRINTK ("chipset id (%d) == index %d, '%s'\n", - tmp, - tp->chipset, - rtl_chip_info[tp->chipset].name); + version, i, rtl_chip_info[i].name); if (tp->chipset >= CH_8139B) { u8 new_tmp8 = tmp8 = RTL_R8 (Config1); @@ -964,6 +983,8 @@ /* The Rtl8139-specific entries in the device structure. */ dev->open = rtl8139_open; dev->hard_start_xmit = rtl8139_start_xmit; + dev->poll = rtl8139_poll; + dev->weight = 64; dev->stop = rtl8139_close; dev->get_stats = rtl8139_get_stats; dev->set_multicast_list = rtl8139_set_rx_mode; @@ -971,6 +992,9 @@ dev->ethtool_ops = &rtl8139_ethtool_ops; dev->tx_timeout = rtl8139_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = rtl8139_poll_controller; +#endif /* note: the hardware is not capable of sg/csum/highdma, however * through the use of skb_copy_and_csum_dev we enable these @@ -986,7 +1010,10 @@ /* note: tp->chipset set in rtl8139_init_board */ tp->drv_flags = board_info[ent->driver_data].hw_flags; tp->mmio_addr = ioaddr; + tp->msg_enable = + (debug < 0 ? RTL8139_DEF_MSG_ENABLE : ((1 << debug) - 1)); spin_lock_init (&tp->lock); + spin_lock_init (&tp->rx_lock); init_waitqueue_head (&tp->thr_wait); init_completion (&tp->thr_exited); tp->mii.dev = dev; @@ -1288,9 +1315,7 @@ { struct rtl8139_private *tp = dev->priv; int retval; -#ifdef RTL8139_DEBUG void *ioaddr = tp->mmio_addr; -#endif retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev); if (retval) @@ -1319,8 +1344,10 @@ rtl8139_init_ring (dev); rtl8139_hw_start (dev); + netif_start_queue (dev); - DPRINTK ("%s: rtl8139_open() ioaddr %#lx IRQ %d" + if (netif_msg_ifup(tp)) + printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d" " GP Pins %2.2x %s-duplex.\n", dev->name, pci_resource_start (tp->pci_dev, 1), dev->irq, RTL_R8 (MediaStatus), @@ -1337,7 +1364,7 @@ struct rtl8139_private *tp = dev->priv; if (tp->phys[0] >= 0) { - mii_check_media(&tp->mii, 1, init_media); + mii_check_media(&tp->mii, netif_msg_link(tp), init_media); } } @@ -1407,8 +1434,6 @@ /* Enable all known interrupts by setting the interrupt mask. */ RTL_W16 (IntrMask, rtl8139_intr_mask); - - netif_start_queue (dev); } @@ -1631,7 +1656,7 @@ } } -static void rtl8139_tx_clear (struct rtl8139_private *tp) +static inline void rtl8139_tx_clear (struct rtl8139_private *tp) { tp->cur_tx = 0; tp->dirty_tx = 0; @@ -1661,6 +1686,7 @@ if (tmp8 & CmdTxEnb) RTL_W8 (ChipCmd, CmdRxEnb); + spin_lock(&tp->rx_lock); /* Disable interrupts by clearing the interrupt mask. */ RTL_W16 (IntrMask, 0x0000); @@ -1679,9 +1705,12 @@ spin_unlock_irqrestore (&tp->lock, flags); /* ...and finally, reset everything */ - rtl8139_hw_start (dev); - - netif_wake_queue (dev); + if (netif_running(dev)) { + rtl8139_hw_start (dev); + netif_wake_queue (dev); + } + spin_unlock(&tp->rx_lock); + } @@ -1695,6 +1724,7 @@ /* Calculate the next Tx descriptor entry. */ entry = tp->cur_tx % NUM_TX_DESC; + /* Note: the chip doesn't have auto-pad! */ if (likely(len < TX_BUF_SIZE)) { if (len < ETH_ZLEN) memset(tp->tx_buf[entry], 0, ETH_ZLEN); @@ -1706,7 +1736,6 @@ return 0; } - /* Note: the chip doesn't have auto-pad! */ spin_lock_irq(&tp->lock); RTL_W32_F (TxStatus0 + (entry * sizeof (u32)), tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); @@ -1720,8 +1749,9 @@ netif_stop_queue (dev); spin_unlock_irq(&tp->lock); - DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n", - dev->name, len, entry); + if (netif_msg_tx_queued(tp)) + printk (KERN_DEBUG "%s: Queued Tx packet size %u to slot %d.\n", + dev->name, len, entry); return 0; } @@ -1751,8 +1781,9 @@ /* Note: TxCarrierLost is always asserted at 100mbps. */ if (txstatus & (TxOutOfWindow | TxAborted)) { /* There was an major error, log it. */ - DPRINTK ("%s: Transmit error, Tx status %8.8x.\n", - dev->name, txstatus); + if (netif_msg_tx_err(tp)) + printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n", + dev->name, txstatus); tp->stats.tx_errors++; if (txstatus & TxAborted) { tp->stats.tx_aborted_errors++; @@ -1792,8 +1823,7 @@ if (tp->dirty_tx != dirty_tx) { tp->dirty_tx = dirty_tx; mb(); - if (netif_queue_stopped (dev)) - netif_wake_queue (dev); + netif_wake_queue (dev); } } @@ -1807,8 +1837,9 @@ int tmp_work; #endif - DPRINTK ("%s: Ethernet frame had errors, status %8.8x.\n", - dev->name, rx_status); + if (netif_msg_rx_err (tp)) + printk(KERN_DEBUG "%s: Ethernet frame had errors, status %8.8x.\n", + dev->name, rx_status); tp->stats.rx_errors++; if (!(rx_status & RxStatusOK)) { if (rx_status & RxTooLong) { @@ -1880,30 +1911,41 @@ #endif } -static void rtl8139_rx_interrupt (struct net_device *dev, - struct rtl8139_private *tp, void *ioaddr) -{ - unsigned char *rx_ring; - u16 cur_rx; - - assert (dev != NULL); - assert (tp != NULL); - assert (ioaddr != NULL); +#if CONFIG_8139_RXBUF_IDX == 3 +static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring, + u32 offset, unsigned int size) +{ + u32 left = RX_BUF_LEN - offset; + + if (size > left) { + memcpy(skb->data, ring + offset, left); + memcpy(skb->data+left, ring, size - left); + } else + memcpy(skb->data, ring + offset, size); +} +#endif - rx_ring = tp->rx_ring; - cur_rx = tp->cur_rx; +static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp, + int budget) +{ + void *ioaddr = tp->mmio_addr; + int received = 0; + unsigned char *rx_ring = tp->rx_ring; + unsigned int cur_rx = tp->cur_rx; DPRINTK ("%s: In rtl8139_rx(), current %4.4x BufAddr %4.4x," " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx, RTL_R16 (RxBufAddr), RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd)); - while ((RTL_R8 (ChipCmd) & RxBufEmpty) == 0) { - int ring_offset = cur_rx % RX_BUF_LEN; + while (netif_running(dev) && received < budget + && (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) { + u32 ring_offset = cur_rx % RX_BUF_LEN; u32 rx_status; unsigned int rx_size; unsigned int pkt_size; struct sk_buff *skb; + u16 status; rmb(); @@ -1912,8 +1954,9 @@ rx_size = rx_status >> 16; pkt_size = rx_size - 4; - DPRINTK ("%s: rtl8139_rx() status %4.4x, size %4.4x," - " cur %4.4x.\n", dev->name, rx_status, + if (netif_msg_rx_status(tp)) + printk(KERN_DEBUG "%s: rtl8139_rx() status %4.4x, size %4.4x," + " cur %4.4x.\n", dev->name, rx_status, rx_size, cur_rx); #if RTL8139_DEBUG > 2 { @@ -1930,9 +1973,9 @@ * Theoretically, this should never happen * since EarlyRx is disabled. */ - if (rx_size == 0xfff0) { + if (unlikely(rx_size == 0xfff0)) { tp->xstats.early_rx++; - break; + goto done; } /* If Rx err or invalid rx_size/rx_status received @@ -1940,55 +1983,69 @@ * Rx process gets reset, so we abort any further * Rx processing. */ - if ((rx_size > (MAX_ETH_FRAME_SIZE+4)) || - (rx_size < 8) || - (!(rx_status & RxStatusOK))) { + if (unlikely((rx_size > (MAX_ETH_FRAME_SIZE+4)) || + (rx_size < 8) || + (!(rx_status & RxStatusOK)))) { rtl8139_rx_err (rx_status, dev, tp, ioaddr); - return; + return -1; } /* Malloc up new buffer, compatible with net-2e. */ /* Omit the four octet CRC from the length. */ - /* TODO: consider allocating skb's outside of - * interrupt context, both to speed interrupt processing, - * and also to reduce the chances of having to - * drop packets here under memory pressure. - */ - skb = dev_alloc_skb (pkt_size + 2); - if (skb) { + if (likely(skb)) { skb->dev = dev; skb_reserve (skb, 2); /* 16 byte align the IP fields. */ - +#if CONFIG_8139_RXBUF_IDX == 3 + wrap_copy(skb, rx_ring, ring_offset+4, pkt_size); +#else eth_copy_and_sum (skb, &rx_ring[ring_offset + 4], pkt_size, 0); +#endif skb_put (skb, pkt_size); skb->protocol = eth_type_trans (skb, dev); - netif_rx (skb); + dev->last_rx = jiffies; tp->stats.rx_bytes += pkt_size; tp->stats.rx_packets++; + + netif_receive_skb (skb); } else { - printk (KERN_WARNING - "%s: Memory squeeze, dropping packet.\n", - dev->name); + if (net_ratelimit()) + printk (KERN_WARNING + "%s: Memory squeeze, dropping packet.\n", + dev->name); tp->stats.rx_dropped++; } + received++; cur_rx = (cur_rx + rx_size + 4 + 3) & ~3; - RTL_W16 (RxBufPtr, cur_rx - 16); + RTL_W16 (RxBufPtr, (u16) (cur_rx - 16)); - if (RTL_R16 (IntrStatus) & RxAckBits) + /* Clear out errors and receive interrupts */ + status = RTL_R16 (IntrStatus) & RxAckBits; + if (likely(status != 0)) { + if (unlikely(status & (RxFIFOOver | RxOverflow))) { + tp->stats.rx_errors++; + if (status & RxFIFOOver) + tp->stats.rx_fifo_errors++; + } RTL_W16_F (IntrStatus, RxAckBits); + } } + done: + +#if RTL8139_DEBUG > 1 DPRINTK ("%s: Done rtl8139_rx(), current %4.4x BufAddr %4.4x," " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx, RTL_R16 (RxBufAddr), RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd)); +#endif tp->cur_rx = cur_rx; + return received; } @@ -2014,14 +2071,12 @@ status &= ~RxUnderrun; } - /* XXX along with rtl8139_rx_err, are we double-counting errors? */ - if (status & - (RxUnderrun | RxOverflow | RxErr | RxFIFOOver)) + if (status & (RxUnderrun | RxErr)) tp->stats.rx_errors++; if (status & PCSTimeout) tp->stats.rx_length_errors++; - if (status & (RxUnderrun | RxFIFOOver)) + if (status & RxUnderrun) tp->stats.rx_fifo_errors++; if (status & PCIErr) { u16 pci_cmd_status; @@ -2033,6 +2088,39 @@ } } +static int rtl8139_poll(struct net_device *dev, int *budget) +{ + struct rtl8139_private *tp = dev->priv; + void *ioaddr = tp->mmio_addr; + int orig_budget = min(*budget, dev->quota); + int done = 1; + + spin_lock(&tp->rx_lock); + if (likely(RTL_R16(IntrStatus) & RxAckBits)) { + int work_done; + + work_done = rtl8139_rx(dev, tp, orig_budget); + if (likely(work_done > 0)) { + *budget -= work_done; + dev->quota -= work_done; + done = (work_done < orig_budget); + } + } + + if (done) { + /* + * Order is important since data can get interrupted + * again when we think we are done. + */ + local_irq_disable(); + RTL_W16_F(IntrMask, rtl8139_intr_mask); + __netif_rx_complete(dev); + local_irq_enable(); + } + spin_unlock(&tp->rx_lock); + + return !done; +} /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ @@ -2041,68 +2129,59 @@ { struct net_device *dev = (struct net_device *) dev_instance; struct rtl8139_private *tp = dev->priv; - int boguscnt = max_interrupt_work; void *ioaddr = tp->mmio_addr; - int ackstat, status; + u16 status, ackstat; int link_changed = 0; /* avoid bogus "uninit" warning */ int handled = 0; spin_lock (&tp->lock); + status = RTL_R16 (IntrStatus); - do { - status = RTL_R16 (IntrStatus); + /* shared irq? */ + if (unlikely((status & rtl8139_intr_mask) == 0)) + goto out; - /* h/w no longer present (hotplug?) or major error, bail */ - if (status == 0xFFFF) - break; + handled = 1; - if ((status & - (PCIErr | PCSTimeout | RxUnderrun | RxOverflow | - RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0) - break; + /* h/w no longer present (hotplug?) or major error, bail */ + if (unlikely(status == 0xFFFF)) + goto out; - handled = 1; + /* close possible race's with dev_close */ + if (unlikely(!netif_running(dev))) { + RTL_W16 (IntrMask, 0); + goto out; + } - /* Acknowledge all of the current interrupt sources ASAP, but - an first get an additional status bit from CSCR. */ - if (status & RxUnderrun) - link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit; + /* Acknowledge all of the current interrupt sources ASAP, but + an first get an additional status bit from CSCR. */ + if (unlikely(status & RxUnderrun)) + link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit; - /* The chip takes special action when we clear RxAckBits, - * so we clear them later in rtl8139_rx_interrupt - */ - ackstat = status & ~(RxAckBits | TxErr); + ackstat = status & ~(RxAckBits | TxErr); + if (ackstat) RTL_W16 (IntrStatus, ackstat); - DPRINTK ("%s: interrupt status=%#4.4x ackstat=%#4.4x new intstat=%#4.4x.\n", - dev->name, status, ackstat, RTL_R16 (IntrStatus)); - - if (netif_running (dev) && (status & RxAckBits)) - rtl8139_rx_interrupt (dev, tp, ioaddr); - - /* Check uncommon events with one test. */ - if (status & (PCIErr | PCSTimeout | RxUnderrun | RxOverflow | - RxFIFOOver | RxErr)) - rtl8139_weird_interrupt (dev, tp, ioaddr, - status, link_changed); - - if (netif_running (dev) && (status & (TxOK | TxErr))) { - rtl8139_tx_interrupt (dev, tp, ioaddr); - if (status & TxErr) - RTL_W16 (IntrStatus, TxErr); + /* Receive packets are processed by poll routine. + If not running start it now. */ + if (status & RxAckBits){ + if (netif_rx_schedule_prep(dev)) { + RTL_W16_F (IntrMask, rtl8139_norx_intr_mask); + __netif_rx_schedule (dev); } - - boguscnt--; - } while (boguscnt > 0); - - if (boguscnt <= 0) { - printk (KERN_WARNING "%s: Too much work at interrupt, " - "IntrStatus=0x%4.4x.\n", dev->name, status); - - /* Clear all interrupt sources. */ - RTL_W16 (IntrStatus, 0xffff); } + /* Check uncommon events with one test. */ + if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr))) + rtl8139_weird_interrupt (dev, tp, ioaddr, + status, link_changed); + + if (status & (TxOK | TxErr)) { + rtl8139_tx_interrupt (dev, tp, ioaddr); + if (status & TxErr) + RTL_W16 (IntrStatus, TxErr); + } + out: spin_unlock (&tp->lock); DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n", @@ -2110,6 +2189,18 @@ return IRQ_RETVAL(handled); } +#ifdef CONFIG_NET_POLL_CONTROLLER +/* + * Polling receive - used by netconsole and other diagnostic tools + * to allow network i/o with interrupts disabled. + */ +static void rtl8139_poll_controller(struct net_device *dev) +{ + disable_irq(dev->irq); + rtl8139_interrupt(dev->irq, dev, NULL); + enable_irq(dev->irq); +} +#endif static int rtl8139_close (struct net_device *dev) { @@ -2130,8 +2221,9 @@ } wait_for_completion (&tp->thr_exited); } - - DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n", + + if (netif_msg_ifdown(tp)) + printk(KERN_DEBUG "%s: Shutting down ethercard, status was 0x%4.4x.\n", dev->name, RTL_R16 (IntrStatus)); spin_lock_irqsave (&tp->lock, flags); @@ -2289,12 +2381,14 @@ static u32 rtl8139_get_msglevel(struct net_device *dev) { - return debug; + struct rtl8139_private *np = dev->priv; + return np->msg_enable; } static void rtl8139_set_msglevel(struct net_device *dev, u32 datum) { - debug = datum; + struct rtl8139_private *np = dev->priv; + np->msg_enable = datum; } /* TODO: we are too slack to do reg dumping for pio, for now */ diff -Nru a/drivers/net/82596.c b/drivers/net/82596.c --- a/drivers/net/82596.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/82596.c Tue Feb 17 20:00:07 2004 @@ -1129,21 +1129,40 @@ printk(" %02X%02X, %s\n", add[12], add[13], str); } -int __init i82596_probe(struct net_device *dev) +static int io = 0x300; +static int irq = 10; + +struct net_device * __init i82596_probe(int unit) { + struct net_device *dev; int i; struct i596_private *lp; char eth_addr[8]; static int probed; + int err; if (probed) - return -ENODEV; + return ERR_PTR(-ENODEV); probed++; + + dev = alloc_etherdev(0); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } else { + dev->base_addr = io; + dev->irq = irq; + } + #ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { if (mvme16x_config & MVME16x_CONFIG_NO_ETHERNET) { printk(KERN_NOTICE "Ethernet probe disabled - chip not present\n"); - return -ENODEV; + err = -ENODEV; + goto out; } memcpy(eth_addr, (void *) 0xfffc1f2c, 6); /* YUCK! Get addr from NOVRAM */ dev->base_addr = MVME_I596_BASE; @@ -1174,7 +1193,8 @@ if (!request_region(ioaddr, I596_TOTAL_SIZE, dev->name)) { printk(KERN_ERR "82596: IO address 0x%04x in use\n", ioaddr); - return -EBUSY; + err = -EBUSY; + goto out; } for (i = 0; i < 8; i++) { @@ -1190,8 +1210,8 @@ if ((checksum % 0x100) || (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)) { - release_region(ioaddr, I596_TOTAL_SIZE); - return -ENODEV; + err = -ENODEV; + goto out1; } dev->base_addr = ioaddr; @@ -1200,13 +1220,10 @@ #endif dev->mem_start = (int)__get_free_pages(GFP_ATOMIC, 0); if (!dev->mem_start) { -#ifdef ENABLE_APRICOT - release_region(dev->base_addr, I596_TOTAL_SIZE); -#endif - return -ENOMEM; + err = -ENOMEM; + goto out1; } - ether_setup(dev); DEB(DEB_PROBE,printk(KERN_INFO "%s: 82596 at %#3lx,", dev->name, dev->base_addr)); for (i = 0; i < 6; i++) @@ -1244,7 +1261,26 @@ lp->scb.rfd = I596_NULL; lp->lock = SPIN_LOCK_UNLOCKED; - return 0; + err = register_netdev(dev); + if (err) + goto out2; + return dev; +out2: +#ifdef __mc68000__ + /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING, + * XXX which may be invalid (CONFIG_060_WRITETHROUGH) + */ + kernel_set_cachemode((void *)(dev->mem_start), 4096, + IOMAP_FULL_CACHING); +#endif + free_page ((u32)(dev->mem_start)); +out1: +#ifdef ENABLE_APRICOT + release_region(dev->base_addr, I596_TOTAL_SIZE); +#endif +out: + free_netdev(dev); + return ERR_PTR(err); } static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -1532,11 +1568,9 @@ } #ifdef MODULE -static struct net_device dev_82596 = { .init = i82596_probe }; +static struct net_device *dev_82596; #ifdef ENABLE_APRICOT -static int io = 0x300; -static int irq = 10; MODULE_PARM(irq, "i"); MODULE_PARM_DESC(irq, "Apricot IRQ number"); #endif @@ -1547,34 +1581,31 @@ int init_module(void) { -#ifdef ENABLE_APRICOT - dev_82596.base_addr = io; - dev_82596.irq = irq; -#endif if (debug >= 0) i596_debug = debug; - if (register_netdev(&dev_82596) != 0) - return -EIO; + dev_82596 = i82596_probe(-1); + if (IS_ERR(dev_82596)) + return PTR_ERR(dev_82596); return 0; } void cleanup_module(void) { - unregister_netdev(&dev_82596); + unregister_netdev(dev_82596); #ifdef __mc68000__ /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING, * XXX which may be invalid (CONFIG_060_WRITETHROUGH) */ - kernel_set_cachemode((void *)(dev_82596.mem_start), 4096, + kernel_set_cachemode((void *)(dev_82596->mem_start), 4096, IOMAP_FULL_CACHING); #endif - free_page ((u32)(dev_82596.mem_start)); - dev_82596.priv = NULL; + free_page ((u32)(dev_82596->mem_start)); #ifdef ENABLE_APRICOT /* If we don't do this, we can't re-insmod it later. */ - release_region(dev_82596.base_addr, I596_TOTAL_SIZE); + release_region(dev_82596->base_addr, I596_TOTAL_SIZE); #endif + free_netdev(dev_82596); } #endif /* MODULE */ diff -Nru a/drivers/net/8390.c b/drivers/net/8390.c --- a/drivers/net/8390.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/8390.c Tue Feb 17 20:00:06 2004 @@ -157,15 +157,8 @@ int ei_open(struct net_device *dev) { unsigned long flags; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); - /* This can't happen unless somebody forgot to call ethdev_init(). */ - if (ei_local == NULL) - { - printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name); - return -ENXIO; - } - /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout wrapper that does e.g. media check & then calls ei_tx_timeout. */ if (dev->tx_timeout == NULL) @@ -196,7 +189,7 @@ */ int ei_close(struct net_device *dev) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned long flags; /* @@ -221,7 +214,7 @@ void ei_tx_timeout(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int txsr, isr, tickssofar = jiffies - dev->trans_start; unsigned long flags; @@ -267,7 +260,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int length, send_length, output_page; unsigned long flags; char scratch[ETH_ZLEN]; @@ -435,7 +428,7 @@ } e8390_base = dev->base_addr; - ei_local = (struct ei_device *) dev->priv; + ei_local = (struct ei_device *) netdev_priv(dev); /* * Protect the irq test too. @@ -540,7 +533,7 @@ static void ei_tx_err(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned char txsr = inb_p(e8390_base+EN0_TSR); unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); @@ -583,7 +576,7 @@ static void ei_tx_intr(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int status = inb(e8390_base + EN0_TSR); outb_p(ENISR_TX, e8390_base + EN0_ISR); /* Ack intr. */ @@ -675,7 +668,7 @@ static void ei_receive(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned char rxing_page, this_frame, next_frame; unsigned short current_offset; int rx_pkt_count = 0; @@ -813,7 +806,7 @@ { long e8390_base = dev->base_addr; unsigned char was_txing, must_resend = 0; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); /* * Record whether a Tx was in progress and then issue the @@ -881,7 +874,7 @@ static struct net_device_stats *get_stats(struct net_device *dev) { long ioaddr = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned long flags; /* If the card is stopped, just return the present stats. */ @@ -936,7 +929,7 @@ { long e8390_base = dev->base_addr; int i; - struct ei_device *ei_local = (struct ei_device*)dev->priv; + struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev); if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) { @@ -990,53 +983,34 @@ static void set_multicast_list(struct net_device *dev) { unsigned long flags; - struct ei_device *ei_local = (struct ei_device*)dev->priv; + struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev); spin_lock_irqsave(&ei_local->page_lock, flags); do_set_multicast_list(dev); spin_unlock_irqrestore(&ei_local->page_lock, flags); } -static inline void ei_device_init(struct ei_device *ei_local) -{ - spin_lock_init(&ei_local->page_lock); -} - /** - * ethdev_init - init rest of 8390 device struct + * ethdev_setup - init rest of 8390 device struct * @dev: network device structure to init * * Initialize the rest of the 8390 device structure. Do NOT __init * this, as it is used by 8390 based modular drivers too. */ -int ethdev_init(struct net_device *dev) +static void ethdev_setup(struct net_device *dev) { + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); if (ei_debug > 1) printk(version); - if (dev->priv == NULL) - { - dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct ei_device)); - ei_device_init(dev->priv); - } - dev->hard_start_xmit = &ei_start_xmit; dev->get_stats = get_stats; dev->set_multicast_list = &set_multicast_list; ether_setup(dev); - - return 0; -} -/* wrapper to make alloc_netdev happy; probably should just cast... */ -static void __ethdev_init(struct net_device *dev) -{ - ethdev_init(dev); + spin_lock_init(&ei_local->page_lock); } /** @@ -1044,15 +1018,10 @@ * * Allocate 8390-specific net_device. */ -struct net_device *alloc_ei_netdev(void) +struct net_device *__alloc_ei_netdev(int size) { - struct net_device *dev; - - dev = alloc_netdev(sizeof(struct ei_device), "eth%d", __ethdev_init); - if (dev) - ei_device_init(dev->priv); - - return dev; + return alloc_netdev(sizeof(struct ei_device) + size, "eth%d", + ethdev_setup); } @@ -1072,7 +1041,7 @@ void NS8390_init(struct net_device *dev, int startp) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int i; int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0)) @@ -1136,7 +1105,7 @@ int start_page) { long e8390_base = dev->base_addr; - struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv; + struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev); outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD); @@ -1156,9 +1125,8 @@ EXPORT_SYMBOL(ei_close); EXPORT_SYMBOL(ei_interrupt); EXPORT_SYMBOL(ei_tx_timeout); -EXPORT_SYMBOL(ethdev_init); EXPORT_SYMBOL(NS8390_init); -EXPORT_SYMBOL(alloc_ei_netdev); +EXPORT_SYMBOL(__alloc_ei_netdev); #if defined(MODULE) diff -Nru a/drivers/net/8390.h b/drivers/net/8390.h --- a/drivers/net/8390.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/8390.h Tue Feb 17 20:00:07 2004 @@ -39,12 +39,15 @@ #define ei_debug 1 #endif -extern int ethdev_init(struct net_device *dev); extern void NS8390_init(struct net_device *dev, int startp); extern int ei_open(struct net_device *dev); extern int ei_close(struct net_device *dev); extern irqreturn_t ei_interrupt(int irq, void *dev_id, struct pt_regs *regs); -extern struct net_device *alloc_ei_netdev(void); +extern struct net_device *__alloc_ei_netdev(int size); +static inline struct net_device *alloc_ei_netdev(void) +{ + return __alloc_ei_netdev(0); +} /* You have one of these per-board */ struct ei_device { @@ -84,7 +87,7 @@ /* The maximum time waited (in jiffies) before assuming a Tx failed. (20ms) */ #define TX_TIMEOUT (20*HZ/100) -#define ei_status (*(struct ei_device *)(dev->priv)) +#define ei_status (*(struct ei_device *)netdev_priv(dev)) /* Some generic ethernet register configurations. */ #define E8390_TX_IRQ_MASK 0xa /* For register EN0_ISR */ diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig --- a/drivers/net/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/net/Kconfig Tue Feb 17 20:00:08 2004 @@ -1577,6 +1577,24 @@ experience problems, you can enable this option to restore the old RX-reset behavior. If unsure, say N. +config 8139_RXBUF_IDX + int "Receive ring size (0 => 8K, 1 => 16K, 2 => 32K, 3 => 64K)" + depends on 8139TOO + range 0 3 + default 1 if EMBEDDED || SH_DREAMCAST + default 2 + help + The 8139too driver has a fixed area of memory for receiving data. + The default value is adequate for most systems. The 64KB + ring size has hardware issues that may cause problems. + Values: + 0 => 8 KB + 1 => 16 KB embedded systems + 2 => 32 KB default for most systems + 3 => 64 KB + If unsure, use the default 2. + + config SIS900 tristate "SiS 900/7016 PCI Fast Ethernet Adapter support" depends on NET_PCI && PCI diff -Nru a/drivers/net/Makefile b/drivers/net/Makefile --- a/drivers/net/Makefile Tue Feb 17 20:00:06 2004 +++ b/drivers/net/Makefile Tue Feb 17 20:00:06 2004 @@ -112,7 +112,6 @@ obj-$(CONFIG_DUMMY) += dummy.o obj-$(CONFIG_DE600) += de600.o obj-$(CONFIG_DE620) += de620.o -obj-$(CONFIG_AT1500) += lance.o obj-$(CONFIG_LANCE) += lance.o obj-$(CONFIG_SUN3_82586) += sun3_82586.o obj-$(CONFIG_SUN3LANCE) += sun3lance.o diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c --- a/drivers/net/Space.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/Space.c Tue Feb 17 20:00:06 2004 @@ -40,63 +40,62 @@ ethernet adaptor have the name "eth[0123...]". */ -extern int ne2_probe(struct net_device *dev); -extern int hp100_probe(struct net_device *dev); -extern int ultra_probe(struct net_device *dev); -extern int ultra32_probe(struct net_device *dev); -extern int wd_probe(struct net_device *dev); -extern int el2_probe(struct net_device *dev); -extern int ne_probe(struct net_device *dev); -extern int hp_probe(struct net_device *dev); -extern int hp_plus_probe(struct net_device *dev); -extern int express_probe(struct net_device *); -extern int eepro_probe(struct net_device *); -extern int at1500_probe(struct net_device *); -extern int at1700_probe(struct net_device *); -extern int fmv18x_probe(struct net_device *); -extern int eth16i_probe(struct net_device *); -extern int i82596_probe(struct net_device *); -extern int ewrk3_probe(struct net_device *); -extern int el1_probe(struct net_device *); -extern int wavelan_probe(struct net_device *); -extern int arlan_probe(struct net_device *); -extern int el16_probe(struct net_device *); -extern int elmc_probe(struct net_device *); -extern int skmca_probe(struct net_device *); -extern int elplus_probe(struct net_device *); -extern int ac3200_probe(struct net_device *); -extern int es_probe(struct net_device *); -extern int lne390_probe(struct net_device *); -extern int e2100_probe(struct net_device *); -extern int ni5010_probe(struct net_device *); -extern int ni52_probe(struct net_device *); -extern int ni65_probe(struct net_device *); -extern int sonic_probe(struct net_device *); -extern int SK_init(struct net_device *); -extern int seeq8005_probe(struct net_device *); -extern int smc_init( struct net_device * ); -extern int atarilance_probe(struct net_device *); -extern int sun3lance_probe(struct net_device *); -extern int sun3_82586_probe(struct net_device *); -extern int apne_probe(struct net_device *); -extern int bionet_probe(struct net_device *); -extern int pamsnet_probe(struct net_device *); -extern int cs89x0_probe(struct net_device *dev); -extern int hplance_probe(struct net_device *dev); -extern int bagetlance_probe(struct net_device *); -extern int mvme147lance_probe(struct net_device *dev); -extern int tc515_probe(struct net_device *dev); -extern int lance_probe(struct net_device *dev); -extern int mace_probe(struct net_device *dev); -extern int macsonic_probe(struct net_device *dev); -extern int mac8390_probe(struct net_device *dev); -extern int mac89x0_probe(struct net_device *dev); -extern int mc32_probe(struct net_device *dev); +extern struct net_device *ne2_probe(int unit); +extern struct net_device *hp100_probe(int unit); +extern struct net_device *ultra_probe(int unit); +extern struct net_device *ultra32_probe(int unit); +extern struct net_device *wd_probe(int unit); +extern struct net_device *el2_probe(int unit); +extern struct net_device *ne_probe(int unit); +extern struct net_device *hp_probe(int unit); +extern struct net_device *hp_plus_probe(int unit); +extern struct net_device *express_probe(int unit); +extern struct net_device *eepro_probe(int unit); +extern struct net_device *at1700_probe(int unit); +extern struct net_device *fmv18x_probe(int unit); +extern struct net_device *eth16i_probe(int unit); +extern struct net_device *i82596_probe(int unit); +extern struct net_device *ewrk3_probe(int unit); +extern struct net_device *el1_probe(int unit); +extern struct net_device *wavelan_probe(int unit); +extern struct net_device *arlan_probe(int unit); +extern struct net_device *el16_probe(int unit); +extern struct net_device *elmc_probe(int unit); +extern struct net_device *skmca_probe(int unit); +extern struct net_device *elplus_probe(int unit); +extern struct net_device *ac3200_probe(int unit); +extern struct net_device *es_probe(int unit); +extern struct net_device *lne390_probe(int unit); +extern struct net_device *e2100_probe(int unit); +extern struct net_device *ni5010_probe(int unit); +extern struct net_device *ni52_probe(int unit); +extern struct net_device *ni65_probe(int unit); +extern struct net_device *sonic_probe(int unit); +extern struct net_device *SK_init(int unit); +extern struct net_device *seeq8005_probe(int unit); +extern struct net_device *smc_init(int unit); +extern struct net_device *atarilance_probe(int unit); +extern struct net_device *sun3lance_probe(int unit); +extern struct net_device *sun3_82586_probe(int unit); +extern struct net_device *apne_probe(int unit); +extern struct net_device *bionet_probe(int unit); +extern struct net_device *pamsnet_probe(int unit); +extern struct net_device *cs89x0_probe(int unit); +extern struct net_device *hplance_probe(int unit); +extern struct net_device *bagetlance_probe(int unit); +extern struct net_device *mvme147lance_probe(int unit); +extern struct net_device *tc515_probe(int unit); +extern struct net_device *lance_probe(int unit); +extern struct net_device *mace_probe(int unit); +extern struct net_device *macsonic_probe(int unit); +extern struct net_device *mac8390_probe(int unit); +extern struct net_device *mac89x0_probe(int unit); +extern struct net_device *mc32_probe(int unit); extern struct net_device *cops_probe(int unit); extern struct net_device *ltpc_probe(void); /* Detachable devices ("pocket adaptors") */ -extern int de620_probe(struct net_device *); +extern struct net_device *de620_probe(int unit); /* Fibre Channel adapters */ extern int iph5526_probe(struct net_device *dev); @@ -104,33 +103,22 @@ /* SBNI adapters */ extern int sbni_probe(int unit); -struct devprobe -{ - int (*probe)(struct net_device *dev); +struct devprobe2 { + struct net_device *(*probe)(int unit); int status; /* non-zero if autoprobe has failed */ }; -/* - * probe_list walks a list of probe functions and calls each so long - * as a non-zero ioaddr is given, or as long as it hasn't already failed - * to find a card in the past (as recorded by "status") when asked to - * autoprobe (i.e. a probe that fails to find a card when autoprobing - * will not be asked to autoprobe again). It exits when a card is found. - */ -static int __init probe_list(struct net_device *dev, struct devprobe *plist) +static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe) { - struct devprobe *p = plist; - unsigned long base_addr = dev->base_addr; - - while (p->probe != NULL) { - if (base_addr && p->probe(dev) == 0) /* probe given addr */ + struct net_device *dev; + for (; p->probe; p++) { + if (autoprobe && p->status) + continue; + dev = p->probe(unit); + if (!IS_ERR(dev)) return 0; - else if (p->status == 0) { /* has autoprobe failed yet? */ - p->status = p->probe(dev); /* no, try autoprobe */ - if (p->status == 0) - return 0; - } - p++; + if (autoprobe) + p->status = PTR_ERR(dev); } return -ENODEV; } @@ -141,7 +129,8 @@ * drivers that probe for EISA cards (in the ISA group). These are the * legacy EISA only driver probes, and also the legacy PCI probes */ -static struct devprobe eisa_probes[] __initdata = { + +static struct devprobe2 eisa_probes[] __initdata = { #ifdef CONFIG_ULTRA32 {ultra32_probe, 0}, #endif @@ -157,8 +146,7 @@ {NULL, 0}, }; - -static struct devprobe mca_probes[] __initdata = { +static struct devprobe2 mca_probes[] __initdata = { #ifdef CONFIG_NE2_MCA {ne2_probe, 0}, #endif @@ -178,7 +166,7 @@ * ISA probes that touch addresses < 0x400 (including those that also * look for EISA/PCI/MCA cards in addition to ISA cards). */ -static struct devprobe isa_probes[] __initdata = { +static struct devprobe2 isa_probes[] __initdata = { #ifdef CONFIG_HP100 /* ISA, EISA & PCI */ {hp100_probe, 0}, #endif @@ -215,9 +203,6 @@ #ifdef CONFIG_SEEQ8005 {seeq8005_probe, 0}, #endif -#ifdef CONFIG_AT1500 - {at1500_probe, 0}, -#endif #ifdef CONFIG_CS89x0 {cs89x0_probe, 0}, #endif @@ -272,14 +257,14 @@ {NULL, 0}, }; -static struct devprobe parport_probes[] __initdata = { +static struct devprobe2 parport_probes[] __initdata = { #ifdef CONFIG_DE620 /* D-Link DE-620 adapter */ {de620_probe, 0}, #endif {NULL, 0}, }; -static struct devprobe m68k_probes[] __initdata = { +static struct devprobe2 m68k_probes[] __initdata = { #ifdef CONFIG_ATARILANCE /* Lance-based Atari ethernet boards */ {atarilance_probe, 0}, #endif @@ -319,7 +304,7 @@ {NULL, 0}, }; -static struct devprobe mips_probes[] __initdata = { +static struct devprobe2 mips_probes[] __initdata = { #ifdef CONFIG_MIPS_JAZZ_SONIC {sonic_probe, 0}, #endif @@ -334,83 +319,65 @@ * per bus interface. This drives the legacy devices only for now. */ -static int __init ethif_probe(int unit) +static void __init ethif_probe2(int unit) { - struct net_device *dev; - int err = -ENODEV; + unsigned long base_addr = netdev_boot_base("eth", unit); - dev = alloc_etherdev(0); - if (!dev) - return -ENOMEM; - - sprintf(dev->name, "eth%d", unit); - netdev_boot_setup_check(dev); - - /* - * Backwards compatibility - historically an I/O base of 1 was - * used to indicate not to probe for this ethN interface - */ - if (__dev_get_by_name(dev->name) || dev->base_addr == 1) { - free_netdev(dev); - return -ENXIO; - } - - /* - * The arch specific probes are 1st so that any on-board ethernet - * will be probed before other ISA/EISA/MCA/PCI bus cards. - */ - if (probe_list(dev, m68k_probes) == 0 || - probe_list(dev, mips_probes) == 0 || - probe_list(dev, eisa_probes) == 0 || - probe_list(dev, mca_probes) == 0 || - probe_list(dev, isa_probes) == 0 || - probe_list(dev, parport_probes) == 0) - err = register_netdev(dev); - - if (err) - free_netdev(dev); - return err; + if (base_addr == 1) + return; + (void)( probe_list2(unit, m68k_probes, base_addr == 0) && + probe_list2(unit, mips_probes, base_addr == 0) && + probe_list2(unit, eisa_probes, base_addr == 0) && + probe_list2(unit, mca_probes, base_addr == 0) && + probe_list2(unit, isa_probes, base_addr == 0) && + probe_list2(unit, parport_probes, base_addr == 0)); } #ifdef CONFIG_TR /* Token-ring device probe */ -extern int ibmtr_probe(struct net_device *); -extern int sk_isa_probe(struct net_device *); -extern int proteon_probe(struct net_device *); -extern int smctr_probe(struct net_device *); +extern int ibmtr_probe_card(struct net_device *); +extern struct net_device *sk_isa_probe(int unit); +extern struct net_device *proteon_probe(int unit); +extern struct net_device *smctr_probe(int unit); + +static struct devprobe2 tr_probes2[] __initdata = { +#ifdef CONFIG_SKISA + {sk_isa_probe, 0}, +#endif +#ifdef CONFIG_PROTEON + {proteon_probe, 0}, +#endif +#ifdef CONFIG_SMCTR + {smctr_probe, 0}, +#endif + {NULL, 0}, +}; static __init int trif_probe(int unit) { - struct net_device *dev; int err = -ENODEV; - - dev = alloc_trdev(0); +#ifdef CONFIG_IBMTR + struct net_device *dev = alloc_trdev(0); if (!dev) return -ENOMEM; sprintf(dev->name, "tr%d", unit); netdev_boot_setup_check(dev); - if ( -#ifdef CONFIG_IBMTR - ibmtr_probe(dev) == 0 || -#endif -#ifdef CONFIG_SKISA - sk_isa_probe(dev) == 0 || -#endif -#ifdef CONFIG_PROTEON - proteon_probe(dev) == 0 || -#endif -#ifdef CONFIG_SMCTR - smctr_probe(dev) == 0 || -#endif - 0 ) - err = register_netdev(dev); - + err = ibmtr_probe_card(dev); if (err) free_netdev(dev); +#endif return err; +} +static void __init trif_probe2(int unit) +{ + unsigned long base_addr = netdev_boot_base("tr", unit); + + if (base_addr == 1) + return; + probe_list2(unit, tr_probes2, base_addr == 0); } #endif @@ -437,10 +404,11 @@ #endif #ifdef CONFIG_TR for (num = 0; num < 8; ++num) - trif_probe(num); + if (!trif_probe(num)) + trif_probe2(num); #endif for (num = 0; num < 8; ++num) - ethif_probe(num); + ethif_probe2(num); #ifdef CONFIG_COPS cops_probe(0); @@ -455,28 +423,3 @@ } device_initcall(net_olddevs_init); - -/* - * The @dev_base list is protected by @dev_base_lock and the rtln - * semaphore. - * - * Pure readers hold dev_base_lock for reading. - * - * Writers must hold the rtnl semaphore while they loop through the - * dev_base list, and hold dev_base_lock for writing when they do the - * actual updates. This allows pure readers to access the list even - * while a writer is preparing to update it. - * - * To put it another way, dev_base_lock is held for writing only to - * protect against pure readers; the rtnl semaphore provides the - * protection against other writers. - * - * See, for example usages, register_netdevice() and - * unregister_netdevice(), which must be called with the rtnl - * semaphore held. - */ -struct net_device *dev_base; -rwlock_t dev_base_lock = RW_LOCK_UNLOCKED; - -EXPORT_SYMBOL(dev_base); -EXPORT_SYMBOL(dev_base_lock); diff -Nru a/drivers/net/a2065.c b/drivers/net/a2065.c --- a/drivers/net/a2065.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/a2065.c Tue Feb 17 20:00:07 2004 @@ -737,7 +737,7 @@ continue; } - dev = init_etherdev(NULL, sizeof(struct lance_private)); + dev = alloc_etherdev(sizeof(struct lance_private)); if (dev == NULL) { release_resource(r1); @@ -791,17 +791,22 @@ dev->set_multicast_list = &lance_set_multicast; dev->dma = 0; -#ifdef MODULE - priv->next_module = root_a2065_dev; - root_a2065_dev = priv; -#endif - ether_setup(dev); init_timer(&priv->multicast_timer); priv->multicast_timer.data = (unsigned long) dev; priv->multicast_timer.function = (void (*)(unsigned long)) &lance_set_multicast; - res = 0; + res = register_netdev(dev); + if (res) { + release_resource(r1); + release_resource(r2); + free_netdev(dev); + break; + } +#ifdef MODULE + priv->next_module = root_a2065_dev; + root_a2065_dev = priv; +#endif } return res; } diff -Nru a/drivers/net/ac3200.c b/drivers/net/ac3200.c --- a/drivers/net/ac3200.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/ac3200.c Tue Feb 17 20:00:07 2004 @@ -75,7 +75,6 @@ #define AC_START_PG 0x00 /* First page of 8390 TX buffer */ #define AC_STOP_PG 0x80 /* Last page +1 of the 8390 RX ring */ -int ac3200_probe(struct net_device *dev); static int ac_probe1(int ioaddr, struct net_device *dev); static int ac_open(struct net_device *dev); @@ -96,9 +95,11 @@ or the unique value in the station address PROM. */ -int __init ac3200_probe(struct net_device *dev) +static int __init do_ac3200_probe(struct net_device *dev) { unsigned short ioaddr = dev->base_addr; + int irq = dev->irq; + int mem_start = dev->mem_start; SET_MODULE_OWNER(dev); @@ -110,13 +111,50 @@ if ( ! EISA_bus) return -ENXIO; - for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) + for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) { if (ac_probe1(ioaddr, dev) == 0) return 0; + dev->irq = irq; + dev->mem_start = mem_start; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + /* Someday free_irq may be in ac_close_card() */ + free_irq(dev->irq, dev); + release_region(dev->base_addr, AC_IO_EXTENT); + if (ei_status.reg0) + iounmap((void *)dev->mem_start); +} + +struct net_device * __init ac3200_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_ac3200_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init ac_probe1(int ioaddr, struct net_device *dev) { int i, retval; @@ -156,13 +194,6 @@ } #endif - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (", unable to allocate memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - /* Assign and allocate the interrupt now. */ if (dev->irq == 0) { dev->irq = config2irq(inb(ioaddr + AC_CONFIG)); @@ -210,7 +241,7 @@ printk(KERN_CRIT "ac3200.c: or to an address above 0x%lx.\n", virt_to_phys(high_memory)); printk(KERN_CRIT "ac3200.c: Driver NOT installed.\n"); retval = -EINVAL; - goto out2; + goto out1; } dev->mem_start = (unsigned long)ioremap(dev->mem_start, AC_STOP_PG*0x100); if (dev->mem_start == 0) { @@ -218,7 +249,7 @@ printk(KERN_ERR "ac3200.c: Try using EISA SCU to set memory below 1MB.\n"); printk(KERN_ERR "ac3200.c: Driver NOT installed.\n"); retval = -EINVAL; - goto out2; + goto out1; } ei_status.reg0 = 1; /* Use as remap flag */ printk("ac3200.c: remapped %dkB card memory to virtual address %#lx\n", @@ -247,11 +278,8 @@ dev->stop = &ac_close_card; NS8390_init(dev, 0); return 0; -out2: - free_irq(dev->irq, dev); out1: - kfree(dev->priv); - dev->priv = NULL; + free_irq(dev->irq, dev); out: release_region(ioaddr, AC_IO_EXTENT); return retval; @@ -338,7 +366,7 @@ #ifdef MODULE #define MAX_AC32_CARDS 4 /* Max number of AC32 cards per module */ -static struct net_device dev_ac32[MAX_AC32_CARDS]; +static struct net_device *dev_ac32[MAX_AC32_CARDS]; static int io[MAX_AC32_CARDS]; static int irq[MAX_AC32_CARDS]; static int mem[MAX_AC32_CARDS]; @@ -354,26 +382,32 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) { - struct net_device *dev = &dev_ac32[this_dev]; + if (io[this_dev] == 0 && this_dev != 0) + break; + dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->base_addr = io[this_dev]; dev->mem_start = mem[this_dev]; /* Currently ignored by driver */ - dev->init = ac3200_probe; - /* Default is to only install one card. */ - if (io[this_dev] == 0 && this_dev != 0) break; - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + if (do_ac3200_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_ac32[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -382,16 +416,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) { - struct net_device *dev = &dev_ac32[this_dev]; - if (dev->priv != NULL) { - /* Someday free_irq may be in ac_close_card() */ - free_irq(dev->irq, dev); - release_region(dev->base_addr, AC_IO_EXTENT); - if (ei_status.reg0) - iounmap((void *)dev->mem_start); + struct net_device *dev = dev_ac32[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(dev->priv); - dev->priv = NULL; + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/acenic.c b/drivers/net/acenic.c --- a/drivers/net/acenic.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/acenic.c Tue Feb 17 20:00:06 2004 @@ -1209,8 +1209,9 @@ switch(tig_ver){ #ifndef CONFIG_ACENIC_OMIT_TIGON_I case 4: - printk(KERN_INFO " Tigon I (Rev. 4), Firmware: %i.%i.%i, ", - tigonFwReleaseMajor, tigonFwReleaseMinor, + case 5: + printk(KERN_INFO " Tigon I (Rev. %i), Firmware: %i.%i.%i, ", + tig_ver, tigonFwReleaseMajor, tigonFwReleaseMinor, tigonFwReleaseFix); writel(0, ®s->LocalCtrl); ap->version = 1; @@ -1235,7 +1236,7 @@ break; default: printk(KERN_WARNING " Unsupported Tigon version detected " - "(%i), ", tig_ver); + "(%i)\n", tig_ver); ecode = -ENODEV; goto init_error; } diff -Nru a/drivers/net/apne.c b/drivers/net/apne.c --- a/drivers/net/apne.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/apne.c Tue Feb 17 20:00:08 2004 @@ -72,7 +72,7 @@ #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ -int apne_probe(struct net_device *dev); +struct net_device * __init apne_probe(int unit); static int apne_probe1(struct net_device *dev, int ioaddr); static int apne_open(struct net_device *dev); @@ -116,28 +116,37 @@ static int apne_owned; /* signal if card already owned */ -int __init apne_probe(struct net_device *dev) +struct net_device * __init apne_probe(int unit) { + struct net_device *dev; #ifndef MANUAL_CONFIG char tuple[8]; #endif + int err; if (apne_owned) - return -ENODEV; - - SET_MODULE_OWNER(dev); + return ERR_PTR(-ENODEV); if ( !(AMIGAHW_PRESENT(PCMCIA)) ) - return (-ENODEV); + return ERR_PTR(-ENODEV); printk("Looking for PCMCIA ethernet card : "); /* check if a card is inserted */ if (!(PCMCIA_INSERTED)) { printk("NO PCMCIA card inserted\n"); - return (-ENODEV); + return ERR_PTR(-ENODEV); } - + + dev = alloc_ei_netdev(); + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + SET_MODULE_OWNER(dev); + /* disable pcmcia irq for readtuple */ pcmcia_disable_irq(); @@ -145,17 +154,41 @@ if ((pcmcia_copy_tuple(CISTPL_FUNCID, tuple, 8) < 3) || (tuple[2] != CISTPL_FUNCID_NETWORK)) { printk("not an ethernet card\n"); - return (-ENODEV); + /* XXX: shouldn't we re-enable irq here? */ + free_netdev(dev); + return ERR_PTR(-ENODEV); } #endif printk("ethernet PCMCIA card inserted\n"); - if (init_pcmcia()) - return apne_probe1(dev, IOBASE); - else - return (-ENODEV); + if (!init_pcmcia()) { + /* XXX: shouldn't we re-enable irq here? */ + free_netdev(dev); + return ERR_PTR(-ENODEV); + } + if (!request_region(IOBASE, 0x20, dev->name)) { + free_netdev(dev); + return ERR_PTR(-EBUSY); + } + + err = apne_probe1(dev, IOBASE); + if (err) { + release_region(IOBASE, 0x20); + free_netdev(dev); + return ERR_PTR(err); + } + err = register_netdev(dev); + if (!err) + return dev; + + pcmcia_disable_irq(); + free_irq(IRQ_AMIGA_PORTS, dev); + pcmcia_reset(); + release_region(IOBASE, 0x20); + free_netdev(dev); + return ERR_PTR(err); } static int __init apne_probe1(struct net_device *dev, int ioaddr) @@ -280,13 +313,6 @@ i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to get memory for dev->priv.\n"); - free_irq(IRQ_AMIGA_PORTS, dev); - return -ENOMEM; - } - for(i = 0; i < ETHER_ADDR_LEN; i++) { printk(" %2.2x", SA_prom[i]); dev->dev_addr[i] = SA_prom[i]; @@ -534,32 +560,27 @@ } #ifdef MODULE -static struct net_device apne_dev; +static struct net_device *apne_dev; int init_module(void) { - int err; - - apne_dev.init = apne_probe; - if ((err = register_netdev(&apne_dev))) { - if (err == -EIO) - printk("No PCMCIA NEx000 ethernet card found.\n"); - return (err); - } - return (0); + apne_dev = apne_probe(-1); + if (IS_ERR(apne_dev)) + return PTR_ERR(apne_dev); + return 0; } void cleanup_module(void) { - unregister_netdev(&apne_dev); + unregister_netdev(apne_dev); pcmcia_disable_irq(); - free_irq(IRQ_AMIGA_PORTS, &apne_dev); + free_irq(IRQ_AMIGA_PORTS, apne_dev); pcmcia_reset(); - apne_owned = 0; + free_netdev(apne_dev); } #endif diff -Nru a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c --- a/drivers/net/appletalk/ipddp.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/appletalk/ipddp.c Tue Feb 17 20:00:05 2004 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -55,34 +56,24 @@ static int ipddp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); -static int __init ipddp_init(struct net_device *dev) +static struct net_device * __init ipddp_init(void) { static unsigned version_printed; + struct net_device *dev; + int err; + + dev = alloc_etherdev(sizeof(struct net_device_stats)); + if (!dev) + return ERR_PTR(-ENOMEM); SET_MODULE_OWNER(dev); + strcpy(dev->name, "ipddp%d"); if (version_printed++ == 0) printk(version); - /* Let the user now what mode we are in */ - if(ipddp_mode == IPDDP_ENCAP) - printk("%s: Appletalk-IP Encap. mode by Bradford W. Johnson \n", - dev->name); - if(ipddp_mode == IPDDP_DECAP) - printk("%s: Appletalk-IP Decap. mode by Jay Schulist \n", - dev->name); - - /* Fill in the device structure with ethernet-generic values. */ - ether_setup(dev); - /* Initalize the device structure. */ dev->hard_start_xmit = ipddp_xmit; - - dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL); - if(!dev->priv) - return -ENOMEM; - memset(dev->priv,0,sizeof(struct net_device_stats)); - dev->get_stats = ipddp_get_stats; dev->do_ioctl = ipddp_ioctl; @@ -97,7 +88,21 @@ */ dev->hard_header_len = 14+8+sizeof(struct ddpehdr)+1; - return 0; + err = register_netdev(dev); + if (err) { + free_netdev(dev); + return ERR_PTR(err); + } + + /* Let the user now what mode we are in */ + if(ipddp_mode == IPDDP_ENCAP) + printk("%s: Appletalk-IP Encap. mode by Bradford W. Johnson \n", + dev->name); + if(ipddp_mode == IPDDP_DECAP) + printk("%s: Appletalk-IP Decap. mode by Jay Schulist \n", + dev->name); + + return dev; } /* @@ -281,23 +286,16 @@ } } -static struct net_device dev_ipddp; +static struct net_device *dev_ipddp; MODULE_LICENSE("GPL"); MODULE_PARM(ipddp_mode, "i"); static int __init ipddp_init_module(void) { - int err; - - dev_ipddp.init = ipddp_init; - err=dev_alloc_name(&dev_ipddp, "ipddp%d"); - if(err < 0) - return err; - - if(register_netdev(&dev_ipddp) != 0) - return -EIO; - + dev_ipddp = ipddp_init(); + if (IS_ERR(dev_ipddp)) + return PTR_ERR(dev_ipddp); return 0; } @@ -305,8 +303,8 @@ { struct ipddp_route *p; - unregister_netdev(&dev_ipddp); - kfree(dev_ipddp.priv); + unregister_netdev(dev_ipddp); + free_netdev(dev_ipddp); while (ipddp_route_list) { p = ipddp_route_list->next; diff -Nru a/drivers/net/appletalk/ltpc.c b/drivers/net/appletalk/ltpc.c --- a/drivers/net/appletalk/ltpc.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/appletalk/ltpc.c Tue Feb 17 20:00:06 2004 @@ -1213,7 +1213,7 @@ out2: release_region(io, 8); out1: - kfree(dev); + free_netdev(dev); out: return ERR_PTR(err); } diff -Nru a/drivers/net/arcnet/arc-rimi.c b/drivers/net/arcnet/arc-rimi.c --- a/drivers/net/arcnet/arc-rimi.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/arcnet/arc-rimi.c Tue Feb 17 20:00:05 2004 @@ -26,6 +26,7 @@ */ #include #include +#include #include #include #include @@ -85,8 +86,6 @@ */ static int __init arcrimi_probe(struct net_device *dev) { - int retval; - BUGLVL(D_NORMAL) printk(VERSION); BUGLVL(D_NORMAL) printk("E-mail me if you actually test the RIM I driver, please!\n"); @@ -114,11 +113,7 @@ "ID!\n"); return -ENODEV; } - retval = arcrimi_found(dev); - if (retval < 0) { - release_mem_region(dev->mem_start, BUFFER_SIZE); - } - return retval; + return arcrimi_found(dev); } @@ -129,11 +124,13 @@ static int __init arcrimi_found(struct net_device *dev) { struct arcnet_local *lp; - u_long first_mirror, last_mirror, shmem; + unsigned long first_mirror, last_mirror, shmem; int mirror_size; + int err; /* reserve the irq */ if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) { + release_mem_region(dev->mem_start, BUFFER_SIZE); BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq); return -ENODEV; } @@ -168,11 +165,7 @@ /* initialize the rest of the device structure. */ - lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); - if (!lp) { - BUGMSG(D_NORMAL, "Can't allocate device data!\n"); - goto err_free_irq; - } + lp = dev->priv; lp->card_name = "RIM I"; lp->hw.command = arcrimi_command; lp->hw.status = arcrimi_status; @@ -181,18 +174,6 @@ lp->hw.owner = THIS_MODULE; lp->hw.copy_to_card = arcrimi_copy_to_card; lp->hw.copy_from_card = arcrimi_copy_from_card; - lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1); - if (!lp->mem_start) { - BUGMSG(D_NORMAL, "Can't remap device memory!\n"); - goto err_free_dev_priv; - } - /* Fill in the fields of the device structure with generic - * values. - */ - arcdev_setup(dev); - - /* get and check the station ID from offset 1 in shmem */ - dev->dev_addr[0] = readb(lp->mem_start + 1); /* * re-reserve the memory region - arcrimi_probe() alloced this reqion @@ -200,25 +181,40 @@ * with the correct size. There is a VERY slim chance this could * fail. */ - release_mem_region(dev->mem_start, BUFFER_SIZE); + release_mem_region(shmem, BUFFER_SIZE); if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) { BUGMSG(D_NORMAL, "Card memory already allocated\n"); - goto err_free_dev_priv; + goto err_free_irq; } + lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1); + if (!lp->mem_start) { + BUGMSG(D_NORMAL, "Can't remap device memory!\n"); + goto err_release_mem; + } + + /* get and check the station ID from offset 1 in shmem */ + dev->dev_addr[0] = readb(lp->mem_start + 1); + BUGMSG(D_NORMAL, "ARCnet RIM I: station %02Xh found at IRQ %d, " "ShMem %lXh (%ld*%d bytes).\n", dev->dev_addr[0], dev->irq, dev->mem_start, (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size); + err = register_netdev(dev); + if (err) + goto err_unmap; + return 0; - err_free_dev_priv: - kfree(dev->priv); - err_free_irq: +err_unmap: + iounmap(lp->mem_start); +err_release_mem: + release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); +err_free_irq: free_irq(dev->irq, dev); return -EIO; } @@ -294,94 +290,79 @@ TIME("memcpy_fromio", count, memcpy_fromio(buf, memaddr, count)); } -#ifdef MODULE +static int node; +static int io; /* use the insmod io= irq= node= options */ +static int irq; +static char device[9]; /* use eg. device=arc1 to change name */ + +module_param(node, int, 0); +module_param(io, int, 0); +module_param(irq, int, 0); +module_param_string(device, device, sizeof(device), 0); +MODULE_LICENSE("GPL"); static struct net_device *my_dev; -/* Module parameters */ - -static int node = 0; -static int io = 0x0; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ -static int irq = 0; /* or use the insmod io= irq= shmem= options */ -static char *device; /* use eg. device="arc1" to change name */ - -MODULE_PARM(node, "i"); -MODULE_PARM(io, "i"); -MODULE_PARM(irq, "i"); -MODULE_PARM(device, "s"); -MODULE_LICENSE("GPL"); - -int init_module(void) +static int __init arc_rimi_init(void) { struct net_device *dev; - int err; - dev = dev_alloc(device ? : "arc%d", &err); + dev = alloc_arcdev(device); if (!dev) - return err; + return -ENOMEM; if (node && node != 0xff) dev->dev_addr[0] = node; - dev->base_addr = io; + dev->mem_start = io; dev->irq = irq; if (dev->irq == 2) dev->irq = 9; - if (arcrimi_probe(dev)) + if (arcrimi_probe(dev)) { + free_netdev(dev); return -EIO; + } my_dev = dev; return 0; } -void cleanup_module(void) +static void __exit arc_rimi_exit(void) { struct net_device *dev = my_dev; struct arcnet_local *lp = (struct arcnet_local *) dev->priv; unregister_netdev(dev); - free_irq(dev->irq, dev); iounmap(lp->mem_start); release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); - kfree(dev->priv); + free_irq(dev->irq, dev); free_netdev(dev); } -#else - +#ifndef MODULE static int __init arcrimi_setup(char *s) { - struct net_device *dev; int ints[8]; - s = get_options(s, 8, ints); if (!ints[0]) return 1; - dev = alloc_bootmem(sizeof(struct net_device)); - memset(dev, 0, sizeof(struct net_device)); - dev->init = arcrimi_probe; - switch (ints[0]) { default: /* ERROR */ printk("arcrimi: Too many arguments.\n"); case 3: /* Node ID */ - dev->dev_addr[0] = ints[3]; + node = ints[3]; case 2: /* IRQ */ - dev->irq = ints[2]; + irq = ints[2]; case 1: /* IO address */ - dev->mem_start = ints[1]; + io = ints[1]; } if (*s) - strncpy(dev->name, s, 9); - else - strcpy(dev->name, "arc%d"); - if (register_netdev(dev)) - printk(KERN_ERR "arc-rimi: Cannot register arcnet device\n"); - + snprintf(device, sizeof(device), "%s", s); return 1; } - __setup("arcrimi=", arcrimi_setup); - #endif /* MODULE */ + +module_init(arc_rimi_init) +module_exit(arc_rimi_exit) diff -Nru a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c --- a/drivers/net/arcnet/arcnet.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/arcnet/arcnet.c Tue Feb 17 20:00:07 2004 @@ -92,6 +92,7 @@ EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_debug); EXPORT_SYMBOL(arcdev_setup); +EXPORT_SYMBOL(alloc_arcdev); EXPORT_SYMBOL(arcnet_interrupt); /* Internal function prototypes */ @@ -331,6 +332,11 @@ dev->rebuild_header = arcnet_rebuild_header; } +struct net_device *alloc_arcdev(char *name) +{ + return alloc_netdev(sizeof(struct arcnet_local), + name && *name ? name : "arc%d", arcdev_setup); +} /* * Open/initialize the board. This is called sometime after booting when diff -Nru a/drivers/net/arcnet/com20020-isa.c b/drivers/net/arcnet/com20020-isa.c --- a/drivers/net/arcnet/com20020-isa.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/arcnet/com20020-isa.c Tue Feb 17 20:00:06 2004 @@ -26,6 +26,7 @@ * ********************** */ #include +#include #include #include #include @@ -117,49 +118,41 @@ return err; } - -#ifdef MODULE - -static struct net_device *my_dev; - -/* Module parameters */ - static int node = 0; static int io = 0x0; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ static int irq = 0; /* or use the insmod io= irq= shmem= options */ -static char *device; /* use eg. device="arc1" to change name */ +static char device[9]; /* use eg. device="arc1" to change name */ static int timeout = 3; static int backplane = 0; static int clockp = 0; static int clockm = 0; -MODULE_PARM(node, "i"); -MODULE_PARM(io, "i"); -MODULE_PARM(irq, "i"); -MODULE_PARM(device, "s"); -MODULE_PARM(timeout, "i"); -MODULE_PARM(backplane, "i"); -MODULE_PARM(clockp, "i"); -MODULE_PARM(clockm, "i"); +module_param(node, int, 0); +module_param(io, int, 0); +module_param(irq, int, 0); +module_param_string(device, device, sizeof(device), 0); +module_param(timeout, int, 0); +module_param(backplane, int, 0); +module_param(clockp, int, 0); +module_param(clockm, int, 0); + MODULE_LICENSE("GPL"); -int init_module(void) +static struct net_device *my_dev; + +static int __init com20020_init(void) { struct net_device *dev; struct arcnet_local *lp; - int err; - dev = dev_alloc(device ? : "arc%d", &err); + dev = alloc_arcdev(device); if (!dev) - return err; - lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); - if (!lp) return -ENOMEM; - memset(lp, 0, sizeof(struct arcnet_local)); if (node && node != 0xff) dev->dev_addr[0] = node; + lp = dev->priv; lp->backplane = backplane; lp->clockp = clockp & 7; lp->clockm = clockm & 3; @@ -172,21 +165,24 @@ if (dev->irq == 2) dev->irq = 9; - if (com20020isa_probe(dev)) + if (com20020isa_probe(dev)) { + free_netdev(dev); return -EIO; + } my_dev = dev; return 0; } -void cleanup_module(void) +static void __exit com20020_exit(void) { - com20020_remove(my_dev); + unregister_netdev(my_dev); + free_irq(my_dev->irq, my_dev); release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE); + free_netdev(my_dev); } -#else - +#ifndef MODULE static int __init com20020isa_setup(char *s) { struct net_device *dev; @@ -196,37 +192,31 @@ s = get_options(s, 8, ints); if (!ints[0]) return 1; - dev = alloc_bootmem(sizeof(struct net_device) + sizeof(struct arcnet_local)); - memset(dev, 0, sizeof(struct net_device) + sizeof(struct arcnet_local)); - lp = dev->priv = (struct arcnet_local *) (dev + 1); - dev->init = com20020isa_probe; switch (ints[0]) { default: /* ERROR */ printk("com90xx: Too many arguments.\n"); case 6: /* Timeout */ - lp->timeout = ints[6]; + timeout = ints[6]; case 5: /* CKP value */ - lp->clockp = ints[5]; + clockp = ints[5]; case 4: /* Backplane flag */ - lp->backplane = ints[4]; + backplane = ints[4]; case 3: /* Node ID */ - dev->dev_addr[0] = ints[3]; + node = ints[3]; case 2: /* IRQ */ - dev->irq = ints[2]; + irq = ints[2]; case 1: /* IO address */ - dev->base_addr = ints[1]; + io = ints[1]; } if (*s) - strncpy(dev->name, s, 9); - else - strcpy(dev->name, "arc%d"); - if (register_netdev(dev)) - printk(KERN_ERR "com20020: Cannot register arcnet device\n"); - + snprintf(device, sizeof(device), "%s", s); return 1; } __setup("com20020=", com20020isa_setup); #endif /* MODULE */ + +module_init(com20020_init) +module_exit(com20020_exit) diff -Nru a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c --- a/drivers/net/arcnet/com20020-pci.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/arcnet/com20020-pci.c Tue Feb 17 20:00:06 2004 @@ -27,6 +27,7 @@ * ********************** */ #include +#include #include #include #include @@ -46,18 +47,18 @@ /* Module parameters */ static int node; -static char *device; /* use eg. device="arc1" to change name */ +static char device[9]; /* use eg. device="arc1" to change name */ static int timeout = 3; static int backplane; static int clockp; static int clockm; -MODULE_PARM(node, "i"); -MODULE_PARM(device, "s"); -MODULE_PARM(timeout, "i"); -MODULE_PARM(backplane, "i"); -MODULE_PARM(clockp, "i"); -MODULE_PARM(clockm, "i"); +module_param(node, int, 0); +module_param_string(device, device, sizeof(device), 0); +module_param(timeout, int, 0); +module_param(backplane, int, 0); +module_param(clockp, int, 0); +module_param(clockm, int, 0); MODULE_LICENSE("GPL"); static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) @@ -68,15 +69,11 @@ if (pci_enable_device(pdev)) return -EIO; - dev = dev_alloc(device ? : "arc%d", &err); + dev = alloc_arcdev(device); if (!dev) - return err; - lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); - if (!lp) { - err = -ENOMEM; - goto out_dev; - } - memset(lp, 0, sizeof(struct arcnet_local)); + return -ENOMEM; + lp = dev->priv; + pci_set_drvdata(pdev, dev); // SOHARD needs PCI base addr 4 @@ -89,6 +86,13 @@ ioaddr = pci_resource_start(pdev, 2); } + if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com20020-pci")) { + BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n", + ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); + err = -EBUSY; + goto out_dev; + } + // Dummy access after Reset // ARCNET controller needs this access to detect bustype outb(0x00,ioaddr+1); @@ -105,12 +109,6 @@ lp->timeout = timeout; lp->hw.owner = THIS_MODULE; - if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com20020-pci")) { - BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n", - ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); - err = -EBUSY; - goto out_priv; - } if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %Xh was reported by PCI BIOS, " "but seems empty!\n", ioaddr); @@ -129,18 +127,18 @@ out_port: release_region(ioaddr, ARCNET_TOTAL_SIZE); -out_priv: - kfree(dev->priv); out_dev: - kfree(dev); + free_netdev(dev); return err; } static void __devexit com20020pci_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - com20020_remove(dev); + unregister_netdev(dev); + free_irq(dev->irq, dev); release_region(dev->base_addr, ARCNET_TOTAL_SIZE); + free_netdev(dev); } static struct pci_device_id com20020pci_id_table[] = { diff -Nru a/drivers/net/arcnet/com20020.c b/drivers/net/arcnet/com20020.c --- a/drivers/net/arcnet/com20020.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/arcnet/com20020.c Tue Feb 17 20:00:06 2004 @@ -172,11 +172,6 @@ dev->set_multicast_list = com20020_set_mc_list; - /* Fill in the fields of the device structure with generic - * values. - */ - arcdev_setup(dev); - if (!dev->dev_addr[0]) dev->dev_addr[0] = inb(ioaddr + 8); /* FIXME: do this some other way! */ @@ -221,7 +216,7 @@ lp->setup >> 1, clockrates[3 - ((lp->setup2 & 0xF0) >> 4) + ((lp->setup & 0x0F) >> 1)]); - if (!dev->init && register_netdev(dev)) { + if (register_netdev(dev)) { free_irq(dev->irq, dev); return -EIO; } @@ -332,19 +327,10 @@ } } -void com20020_remove(struct net_device *dev) -{ - unregister_netdev(dev); - free_irq(dev->irq, dev); - kfree(dev->priv); - free_netdev(dev); -} - #ifdef MODULE EXPORT_SYMBOL(com20020_check); EXPORT_SYMBOL(com20020_found); -EXPORT_SYMBOL(com20020_remove); MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/arcnet/com90io.c b/drivers/net/arcnet/com90io.c --- a/drivers/net/arcnet/com90io.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/arcnet/com90io.c Tue Feb 17 20:00:06 2004 @@ -27,6 +27,7 @@ */ #include #include +#include #include #include #include @@ -234,6 +235,7 @@ { struct arcnet_local *lp; int ioaddr = dev->base_addr; + int err; /* Reserve the irq */ if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (COM90xx-IO)", dev)) { @@ -246,15 +248,6 @@ return -EBUSY; } - /* Initialize the rest of the device structure. */ - dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); - if (!dev->priv) { - free_irq(dev->irq, dev); - release_region(dev->base_addr, ARCNET_TOTAL_SIZE); - return -ENOMEM; - } - memset(dev->priv, 0, sizeof(struct arcnet_local)); - lp = (struct arcnet_local *) (dev->priv); lp->card_name = "COM90xx I/O"; lp->hw.command = com90io_command; @@ -265,12 +258,6 @@ lp->hw.copy_to_card = com90io_copy_to_card; lp->hw.copy_from_card = com90io_copy_from_card; - /* - * Fill in the fields of the device structure with generic - * values. - */ - arcdev_setup(dev); - lp->config = (0x16 | IOMAPflag) & ~ENABLE16flag; SETCONF(); @@ -278,6 +265,14 @@ dev->dev_addr[0] = get_buffer_byte(dev, 1); + err = register_netdev(dev); + if (err) { + outb((inb(_CONFIG) & ~IOMAPflag), _CONFIG); + free_irq(dev->irq, dev); + release_region(dev->base_addr, ARCNET_TOTAL_SIZE); + return err; + } + BUGMSG(D_NORMAL, "COM90IO: station %02Xh found at %03lXh, IRQ %d.\n", dev->dev_addr[0], dev->base_addr, dev->irq); @@ -361,44 +356,67 @@ TIME("get_whole_buffer", count, get_whole_buffer(dev, bufnum * 512 + offset, count, buf)); } - -#ifdef MODULE - -static struct net_device *my_dev; - -/* Module parameters */ - static int io; /* use the insmod io= irq= shmem= options */ static int irq; -static char *device; /* use eg. device=arc1 to change name */ +static char device[9]; /* use eg. device=arc1 to change name */ -MODULE_PARM(io, "i"); -MODULE_PARM(irq, "i"); -MODULE_PARM(device, "s"); +module_param(io, int, 0); +module_param(irq, int, 0); +module_param_string(device, device, sizeof(device), 0); MODULE_LICENSE("GPL"); -int init_module(void) +#ifndef MODULE +static int __init com90io_setup(char *s) +{ + int ints[4]; + s = get_options(s, 4, ints); + if (!ints[0]) + return 0; + switch (ints[0]) { + default: /* ERROR */ + printk("com90io: Too many arguments.\n"); + case 2: /* IRQ */ + irq = ints[2]; + case 1: /* IO address */ + io = ints[1]; + } + if (*s) + snprintf(device, sizeof(device), "%s", s); + return 1; +} +__setup("com90io=", com90io_setup); +#endif + +static struct net_device *my_dev; + +static int __init com90io_init(void) { struct net_device *dev; int err; - dev = dev_alloc(device ? : "arc%d", &err); + dev = alloc_arcdev(device); if (!dev) - return err; + return -ENOMEM; + + SET_MODULE_OWNER(dev); dev->base_addr = io; dev->irq = irq; if (dev->irq == 2) dev->irq = 9; - if (com90io_probe(dev)) - return -EIO; + err = com90io_probe(dev); + + if (err) { + free_netdev(dev); + return err; + } my_dev = dev; return 0; } -void cleanup_module(void) +static void __exit com90io_exit(void) { struct net_device *dev = my_dev; int ioaddr = dev->base_addr; @@ -410,42 +428,8 @@ free_irq(dev->irq, dev); release_region(dev->base_addr, ARCNET_TOTAL_SIZE); - kfree(dev->priv); free_netdev(dev); } -#else - -static int __init com90io_setup(char *s) -{ - struct net_device *dev; - int ints[4]; - - s = get_options(s, 4, ints); - if (!ints[0]) - return 0; - dev = alloc_bootmem(sizeof(struct net_device)); - memset(dev, 0, sizeof(struct net_device)); - dev->init = com90io_probe; - - switch (ints[0]) { - default: /* ERROR */ - printk("com90io: Too many arguments.\n"); - case 2: /* IRQ */ - dev->irq = ints[2]; - case 1: /* IO address */ - dev->base_addr = ints[1]; - } - if (*s) - strncpy(dev->name, s, 9); - else - strcpy(dev->name, "arc%d"); - if (register_netdev(dev)) - printk(KERN_ERR "com90io: Cannot register arcnet device\n"); - - return 1; -} - -__setup("com90io=", com90io_setup); - -#endif /* MODULE */ +module_init(com90io_init) +module_exit(com90io_exit) diff -Nru a/drivers/net/arcnet/com90xx.c b/drivers/net/arcnet/com90xx.c --- a/drivers/net/arcnet/com90xx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/arcnet/com90xx.c Tue Feb 17 20:00:07 2004 @@ -25,6 +25,7 @@ * ********************** */ #include +#include #include #include #include @@ -52,8 +53,7 @@ /* Internal function declarations */ -static int com90xx_found(struct net_device *dev, int ioaddr, int airq, - u_long shmem); +static int com90xx_found(int ioaddr, int airq, u_long shmem); static void com90xx_command(struct net_device *dev, int command); static int com90xx_status(struct net_device *dev); static void com90xx_setmask(struct net_device *dev, int mask); @@ -98,32 +98,43 @@ static int com90xx_skip_probe __initdata = 0; -static int __init com90xx_probe(struct net_device *dev) +/* Module parameters */ + +static int io; /* use the insmod io= irq= shmem= options */ +static int irq; +static int shmem; +static char device[9]; /* use eg. device=arc1 to change name */ + +module_param(io, int, 0); +module_param(irq, int, 0); +module_param(shmem, int, 0); +module_param_string(device, device, sizeof(device), 0); + +static void __init com90xx_probe(void) { - int count, status, ioaddr, numprint, airq, retval = -ENODEV, - openparen = 0; + int count, status, ioaddr, numprint, airq, openparen = 0; unsigned long airqmask; int ports[(0x3f0 - 0x200) / 16 + 1] = {0}; u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] = {0}; int numports, numshmems, *port; - u_long *shmem; + u_long *p; - if (!dev && com90xx_skip_probe) - return -ENODEV; + if (!io && !irq && !shmem && !*device && com90xx_skip_probe) + return; BUGLVL(D_NORMAL) printk(VERSION); /* set up the arrays where we'll store the possible probe addresses */ numports = numshmems = 0; - if (dev && dev->base_addr) - ports[numports++] = dev->base_addr; + if (io) + ports[numports++] = io; else for (count = 0x200; count <= 0x3f0; count += 16) ports[numports++] = count; - if (dev && dev->mem_start) - shmems[numshmems++] = dev->mem_start; + if (shmem) + shmems[numshmems++] = shmem; else for (count = 0xA0000; count <= 0xFF800; count += 2048) shmems[numshmems++] = count; @@ -143,22 +154,19 @@ ioaddr = *port; - if (check_region(*port, ARCNET_TOTAL_SIZE)) { + if (!request_region(*port, ARCNET_TOTAL_SIZE, "arcnet (90xx)")) { BUGMSG2(D_INIT_REASONS, "(check_region)\n"); BUGMSG2(D_INIT_REASONS, "S1: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *port = ports[numports - 1]; - numports--; - port--; + *port-- = ports[--numports]; continue; } if (ASTATUS() == 0xFF) { BUGMSG2(D_INIT_REASONS, "(empty)\n"); BUGMSG2(D_INIT_REASONS, "S1: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *port = ports[numports - 1]; - numports--; - port--; + release_region(*port, ARCNET_TOTAL_SIZE); + *port-- = ports[--numports]; continue; } inb(_RESET); /* begin resetting card */ @@ -171,14 +179,14 @@ if (!numports) { BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n"); - return -ENODEV; + return; } /* Stage 2: we have now reset any possible ARCnet cards, so we can't * do anything until they finish. If D_INIT, print the list of * cards that are left. */ numprint = -1; - for (port = &ports[0]; port - ports < numports; port++) { + for (port = &ports[0]; port < ports + numports; port++) { numprint++; numprint %= 8; if (!numprint) { @@ -194,8 +202,8 @@ * 0xD1 byte in the right place, or are read-only. */ numprint = -1; - for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) { - u_long ptr = *shmem; + for (p = &shmems[0]; p < shmems + numshmems; p++) { + u_long ptr = *p; numprint++; numprint %= 8; @@ -203,15 +211,13 @@ BUGMSG2(D_INIT, "\n"); BUGMSG2(D_INIT, "S3: "); } - BUGMSG2(D_INIT, "%lXh ", *shmem); + BUGMSG2(D_INIT, "%lXh ", *p); - if (check_mem_region(*shmem, BUFFER_SIZE)) { + if (!request_mem_region(*p, BUFFER_SIZE, "arcnet (90xx)")) { BUGMSG2(D_INIT_REASONS, "(check_mem_region)\n"); BUGMSG2(D_INIT_REASONS, "Stage 3: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *shmem = shmems[numshmems - 1]; - numshmems--; - shmem--; + *p-- = shmems[--numshmems]; continue; } if (isa_readb(ptr) != TESTvalue) { @@ -219,9 +225,8 @@ isa_readb(ptr), TESTvalue); BUGMSG2(D_INIT_REASONS, "S3: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *shmem = shmems[numshmems - 1]; - numshmems--; - shmem--; + release_mem_region(*p, BUFFER_SIZE); + *p-- = shmems[--numshmems]; continue; } /* By writing 0x42 to the TESTvalue location, we also make @@ -233,9 +238,8 @@ if (isa_readb(ptr) != 0x42) { BUGMSG2(D_INIT_REASONS, "(read only)\n"); BUGMSG2(D_INIT_REASONS, "S3: "); - *shmem = shmems[numshmems - 1]; - numshmems--; - shmem--; + release_mem_region(*p, BUFFER_SIZE); + *p-- = shmems[--numshmems]; continue; } BUGMSG2(D_INIT_REASONS, "\n"); @@ -246,20 +250,22 @@ if (!numshmems) { BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n"); - return -ENODEV; + for (port = &ports[0]; port < ports + numports; port++) + release_region(*port, ARCNET_TOTAL_SIZE); + return; } /* Stage 4: something of a dummy, to report the shmems that are * still possible after stage 3. */ numprint = -1; - for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) { + for (p = &shmems[0]; p < shmems + numshmems; p++) { numprint++; numprint %= 8; if (!numprint) { BUGMSG2(D_INIT, "\n"); BUGMSG2(D_INIT, "S4: "); } - BUGMSG2(D_INIT, "%lXh ", *shmem); + BUGMSG2(D_INIT, "%lXh ", *p); } BUGMSG2(D_INIT, "\n"); @@ -271,7 +277,8 @@ * after the first one is found. */ numprint = -1; - for (port = &ports[0]; port - ports < numports; port++) { + for (port = &ports[0]; port < ports + numports; port++) { + int found = 0; numprint++; numprint %= 8; if (!numprint) { @@ -288,9 +295,8 @@ BUGMSG2(D_INIT_REASONS, "(status=%Xh)\n", status); BUGMSG2(D_INIT_REASONS, "S5: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *port = ports[numports - 1]; - numports--; - port--; + release_region(*port, ARCNET_TOTAL_SIZE); + *port-- = ports[--numports]; continue; } ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear); @@ -300,15 +306,14 @@ status); BUGMSG2(D_INIT_REASONS, "S5: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *port = ports[numports - 1]; - numports--; - port--; + release_region(*port, ARCNET_TOTAL_SIZE); + *port-- = ports[--numports]; continue; } /* skip this completely if an IRQ was given, because maybe * we're on a machine that locks during autoirq! */ - if (!dev || !dev->irq) { + if (!irq) { /* if we do this, we're sure to get an IRQ since the * card has just reset and the NORXflag is on until * we tell it to start receiving. @@ -323,13 +328,12 @@ BUGMSG2(D_INIT_REASONS, "(airq=%d)\n", airq); BUGMSG2(D_INIT_REASONS, "S5: "); BUGLVL(D_INIT_REASONS) numprint = 0; - *port = ports[numports - 1]; - numports--; - port--; + release_region(*port, ARCNET_TOTAL_SIZE); + *port-- = ports[--numports]; continue; } } else { - airq = dev->irq; + airq = irq; } BUGMSG2(D_INIT, "(%d,", airq); @@ -354,21 +358,20 @@ mdelay(RESETtime); #endif - for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) { - u_long ptr = *shmem; + for (p = &shmems[0]; p < shmems + numshmems; p++) { + u_long ptr = *p; if (isa_readb(ptr) == TESTvalue) { /* found one */ - BUGMSG2(D_INIT, "%lXh)\n", *shmem); + BUGMSG2(D_INIT, "%lXh)\n", *p); openparen = 0; /* register the card */ - retval = com90xx_found(dev, *port, airq, *shmem); + if (com90xx_found(*port, airq, *p) == 0) + found = 1; numprint = -1; /* remove shmem from the list */ - *shmem = shmems[numshmems - 1]; - numshmems--; - + *p = shmems[--numshmems]; break; /* go to the next I/O port */ } else { BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr)); @@ -380,44 +383,39 @@ BUGLVL(D_INIT_REASONS) printk("S5: "); BUGLVL(D_INIT_REASONS) numprint = 0; } - *port = ports[numports - 1]; - numports--; - port--; + if (!found) + release_region(*port, ARCNET_TOTAL_SIZE); + *port-- = ports[--numports]; } BUGLVL(D_INIT_REASONS) printk("\n"); /* Now put back TESTvalue on all leftover shmems. */ - for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) - isa_writeb(TESTvalue, *shmem); - - if (retval && dev && !numcards) - BUGMSG2(D_NORMAL, "S5: No ARCnet cards found.\n"); - return retval; + for (p = &shmems[0]; p < shmems + numshmems; p++) { + isa_writeb(TESTvalue, *p); + release_mem_region(*p, BUFFER_SIZE); + } } /* Set up the struct net_device associated with this card. Called after * probing succeeds. */ -static int __init com90xx_found(struct net_device *dev0, int ioaddr, int airq, - u_long shmem) +static int __init com90xx_found(int ioaddr, int airq, u_long shmem) { - struct net_device *dev = dev0; + struct net_device *dev = NULL; struct arcnet_local *lp; u_long first_mirror, last_mirror; - int mirror_size, err; + int mirror_size; - /* allocate struct net_device if we don't have one yet */ - if (!dev && !(dev = dev_alloc("arc%d", &err))) { + /* allocate struct net_device */ + dev = alloc_arcdev(device); + if (!dev) { BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n"); - return err; - } - lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); - if (!lp) { - BUGMSG(D_NORMAL, "Can't allocate device data!\n"); - goto err_free_dev; + release_mem_region(shmem, BUFFER_SIZE); + return -ENOMEM; } + lp = dev->priv; /* find the real shared memory start/end points, including mirrors */ /* guess the actual size of one "memory mirror" - the number of @@ -442,8 +440,18 @@ dev->mem_start = first_mirror; dev->mem_end = last_mirror + MIRROR_SIZE - 1; + release_mem_region(shmem, BUFFER_SIZE); + if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) + goto err_free_dev; + + /* reserve the irq */ + if (request_irq(airq, &arcnet_interrupt, 0, "arcnet (90xx)", dev)) { + BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq); + goto err_release_mem; + } + dev->irq = airq; + /* Initialize the rest of the device structure. */ - memset(lp, 0, sizeof(struct arcnet_local)); lp->card_name = "COM90xx"; lp->hw.command = com90xx_command; lp->hw.status = com90xx_status; @@ -455,24 +463,12 @@ lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1); if (!lp->mem_start) { BUGMSG(D_NORMAL, "Can't remap device memory!\n"); - goto err_free_dev_priv; + goto err_free_irq; } - /* Fill in the fields of the device structure with generic values. */ - arcdev_setup(dev); /* get and check the station ID from offset 1 in shmem */ dev->dev_addr[0] = readb(lp->mem_start + 1); - /* reserve the irq */ - if (request_irq(airq, &arcnet_interrupt, 0, "arcnet (90xx)", dev)) { - BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq); - goto err_unmap; - } - dev->irq = airq; - - /* reserve the I/O and memory regions - guaranteed to work by check_region */ - request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (90xx)"); - request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)"); dev->base_addr = ioaddr; BUGMSG(D_NORMAL, "COM90xx station %02Xh found at %03lXh, IRQ %d, " @@ -481,23 +477,20 @@ dev->base_addr, dev->irq, dev->mem_start, (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size); - if (!dev0 && register_netdev(dev)) - goto err_release; + if (register_netdev(dev)) + goto err_unmap; cards[numcards++] = dev; return 0; - err_release: +err_unmap: + iounmap(lp->mem_start); +err_free_irq: free_irq(dev->irq, dev); - release_region(dev->base_addr, ARCNET_TOTAL_SIZE); +err_release_mem: release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); - err_unmap: - iounmap(lp->mem_start); - err_free_dev_priv: - kfree(dev->priv); - err_free_dev: - if (!dev0) - kfree(dev); +err_free_dev: + free_netdev(dev); return -EIO; } @@ -587,37 +580,13 @@ } -/* Module parameters */ - -static int io; /* use the insmod io= irq= shmem= options */ -static int irq; -static int shmem; -static char *device; /* use eg. device=arc1 to change name */ - -MODULE_PARM(io, "i"); -MODULE_PARM(irq, "i"); -MODULE_PARM(shmem, "i"); -MODULE_PARM(device, "s"); MODULE_LICENSE("GPL"); static int __init com90xx_init(void) { - struct net_device *dev; - int err; - - if (io || irq || shmem || device) { - dev = dev_alloc(device ? : "arc%d", &err); - if (!dev) - return err; - dev->base_addr = io; - dev->irq = irq; - if (dev->irq == 2) - dev->irq = 9; - dev->mem_start = shmem; - com90xx_probe(dev); - } else - com90xx_probe(NULL); - + if (irq == 2) + irq = 9; + com90xx_probe(); if (!numcards) return -EIO; return 0; @@ -638,7 +607,6 @@ iounmap(lp->mem_start); release_region(dev->base_addr, ARCNET_TOTAL_SIZE); release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); - kfree(dev->priv); free_netdev(dev); } } @@ -669,9 +637,7 @@ } if (*s) - strncpy(device, s, 9); - else - strcpy(device, "arc%d"); + snprintf(device, sizeof(device), "%s", s); return 1; } diff -Nru a/drivers/net/ariadne.c b/drivers/net/ariadne.c --- a/drivers/net/ariadne.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/ariadne.c Tue Feb 17 20:00:07 2004 @@ -168,7 +168,7 @@ continue; } - dev = init_etherdev(NULL, sizeof(struct ariadne_private)); + dev = alloc_etherdev(sizeof(struct ariadne_private)); if (dev == NULL) { release_resource(r1); @@ -205,11 +205,17 @@ dev->get_stats = &ariadne_get_stats; dev->set_multicast_list = &set_multicast_list; + res = register_netdev(dev); + if (res) { + release_resource(r1); + release_resource(r2); + free_netdev(dev); + break; + } #ifdef MODULE priv->next_module = root_ariadne_dev; root_ariadne_dev = priv; #endif - res = 0; } return res; } diff -Nru a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c --- a/drivers/net/arm/am79c961a.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/arm/am79c961a.c Tue Feb 17 20:00:07 2004 @@ -722,7 +722,7 @@ release: release_region(dev->base_addr, 0x18); nodev: - kfree(dev); + free_netdev(dev); out: return ret; } diff -Nru a/drivers/net/arm/ether00.c b/drivers/net/arm/ether00.c --- a/drivers/net/arm/ether00.c Tue Feb 17 20:00:14 2004 +++ b/drivers/net/arm/ether00.c Tue Feb 17 20:00:14 2004 @@ -923,8 +923,6 @@ result = -ENOMEM; goto out_release; } - memset(dev,0,sizeof(struct net_device)); - memset(dev->priv, 0, sizeof(struct net_priv)); priv = dev->priv; priv->tq_memupdate.routine=ether00_mem_update; @@ -966,7 +964,7 @@ out_unmap: iounmap(map_addr); out_kfree: - kfree(dev); + free_netdev(dev); out_release: release_mem_region(dev_info->base_addr, MAC_REG_SIZE); return result; diff -Nru a/drivers/net/arm/ether1.c b/drivers/net/arm/ether1.c --- a/drivers/net/arm/ether1.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/arm/ether1.c Tue Feb 17 20:00:07 2004 @@ -149,34 +149,34 @@ length -= thislen; __asm__ __volatile__( - "subs %3, %3, #2 - bmi 2f -1: ldr %0, [%1], #2 - mov %0, %0, lsl #16 - orr %0, %0, %0, lsr #16 - str %0, [%2], #4 - subs %3, %3, #2 - bmi 2f - ldr %0, [%1], #2 - mov %0, %0, lsl #16 - orr %0, %0, %0, lsr #16 - str %0, [%2], #4 - subs %3, %3, #2 - bmi 2f - ldr %0, [%1], #2 - mov %0, %0, lsl #16 - orr %0, %0, %0, lsr #16 - str %0, [%2], #4 - subs %3, %3, #2 - bmi 2f - ldr %0, [%1], #2 - mov %0, %0, lsl #16 - orr %0, %0, %0, lsr #16 - str %0, [%2], #4 - subs %3, %3, #2 - bpl 1b -2: adds %3, %3, #1 - ldreqb %0, [%1] + "subs %3, %3, #2\n\ + bmi 2f\n\ +1: ldr %0, [%1], #2\n\ + mov %0, %0, lsl #16\n\ + orr %0, %0, %0, lsr #16\n\ + str %0, [%2], #4\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%1], #2\n\ + mov %0, %0, lsl #16\n\ + orr %0, %0, %0, lsr #16\n\ + str %0, [%2], #4\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%1], #2\n\ + mov %0, %0, lsl #16\n\ + orr %0, %0, %0, lsr #16\n\ + str %0, [%2], #4\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%1], #2\n\ + mov %0, %0, lsl #16\n\ + orr %0, %0, %0, lsr #16\n\ + str %0, [%2], #4\n\ + subs %3, %3, #2\n\ + bpl 1b\n\ +2: adds %3, %3, #1\n\ + ldreqb %0, [%1]\n\ streqb %0, [%2]" : "=&r" (used), "=&r" (data) : "r" (addr), "r" (thislen), "1" (data)); @@ -211,34 +211,34 @@ length -= thislen; __asm__ __volatile__( - "subs %3, %3, #2 - bmi 2f -1: ldr %0, [%2], #4 - strb %0, [%1], #1 - mov %0, %0, lsr #8 - strb %0, [%1], #1 - subs %3, %3, #2 - bmi 2f - ldr %0, [%2], #4 - strb %0, [%1], #1 - mov %0, %0, lsr #8 - strb %0, [%1], #1 - subs %3, %3, #2 - bmi 2f - ldr %0, [%2], #4 - strb %0, [%1], #1 - mov %0, %0, lsr #8 - strb %0, [%1], #1 - subs %3, %3, #2 - bmi 2f - ldr %0, [%2], #4 - strb %0, [%1], #1 - mov %0, %0, lsr #8 - strb %0, [%1], #1 - subs %3, %3, #2 - bpl 1b -2: adds %3, %3, #1 - ldreqb %0, [%2] + "subs %3, %3, #2\n\ + bmi 2f\n\ +1: ldr %0, [%2], #4\n\ + strb %0, [%1], #1\n\ + mov %0, %0, lsr #8\n\ + strb %0, [%1], #1\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%2], #4\n\ + strb %0, [%1], #1\n\ + mov %0, %0, lsr #8\n\ + strb %0, [%1], #1\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%2], #4\n\ + strb %0, [%1], #1\n\ + mov %0, %0, lsr #8\n\ + strb %0, [%1], #1\n\ + subs %3, %3, #2\n\ + bmi 2f\n\ + ldr %0, [%2], #4\n\ + strb %0, [%1], #1\n\ + mov %0, %0, lsr #8\n\ + strb %0, [%1], #1\n\ + subs %3, %3, #2\n\ + bpl 1b\n\ +2: adds %3, %3, #1\n\ + ldreqb %0, [%2]\n\ streqb %0, [%1]" : "=&r" (used), "=&r" (data) : "r" (addr), "r" (thislen), "1" (data)); @@ -1068,7 +1068,7 @@ release: release_region(dev->base_addr, 16); release_region(dev->base_addr + 0x800, 4096); - kfree(dev); + free_netdev(dev); out: return ret; } diff -Nru a/drivers/net/arm/ether3.c b/drivers/net/arm/ether3.c --- a/drivers/net/arm/ether3.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/arm/ether3.c Tue Feb 17 20:00:08 2004 @@ -908,7 +908,7 @@ failed: release_region(dev->base_addr, 128); free: - kfree(dev); + free_netdev(dev); out: return ret; } diff -Nru a/drivers/net/arm/etherh.c b/drivers/net/arm/etherh.c --- a/drivers/net/arm/etherh.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/arm/etherh.c Tue Feb 17 20:00:08 2004 @@ -551,15 +551,12 @@ etherh_banner(); - dev = alloc_etherdev(sizeof(struct etherh_priv)); + dev = alloc_ei_netdev(); if (!dev) { ret = -ENOMEM; goto out; } - /* - * alloc_etherdev allocs and zeros dev->priv - */ eh = dev->priv; spin_lock_init(&eh->eidev.page_lock); @@ -622,21 +619,12 @@ goto free; } - if (ethdev_init(dev)) { - ret = -ENODEV; - goto release; - } - /* * If we're in the NIC slot, make sure the IRQ is enabled */ if (dev->irq == 11) etherh_set_ctrl(eh, ETHERH_CP_IE); - /* - * Unfortunately, ethdev_init eventually calls - * ether_setup, which re-writes dev->flags. - */ switch (ec->cid.product) { case PROD_ANT_ETHERM: dev_type = "ANT EtherM"; @@ -705,7 +693,7 @@ release: release_region(dev->base_addr, 16); free: - kfree(dev); + free_netdev(dev); out: return ret; } diff -Nru a/drivers/net/at1700.c b/drivers/net/at1700.c --- a/drivers/net/at1700.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/at1700.c Tue Feb 17 20:00:06 2004 @@ -81,12 +81,12 @@ */ #ifndef CONFIG_X86_PC9800 -static int at1700_probe_list[] __initdata = { +static unsigned at1700_probe_list[] __initdata = { 0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 }; #else /* CONFIG_X86_PC9800 */ -static int at1700_probe_list[] __initdata = { +static unsigned at1700_probe_list[] __initdata = { 0x1d6, 0x1d8, 0x1da, 0x1d4, 0xd4, 0xd2, 0xd8, 0xd0, 0 }; @@ -196,8 +196,6 @@ /* Index to functions, as function prototypes. */ -extern int at1700_probe(struct net_device *dev); - static int at1700_probe1(struct net_device *dev, int ioaddr); static int read_eeprom(long ioaddr, int location); static int net_open(struct net_device *dev); @@ -232,24 +230,78 @@ (detachable devices only). */ -int __init at1700_probe(struct net_device *dev) +#ifndef CONFIG_X86_PC9800 +static int io = 0x260; +#else +static int io = 0xd0; +#endif + +static int irq; + +static void cleanup_card(struct net_device *dev) { - int i; - int base_addr = dev->base_addr; +#ifdef CONFIG_MCA + struct net_local *lp = dev->priv; + if (lp->mca_slot) + mca_mark_as_unused(lp->mca_slot); +#endif + free_irq(dev->irq, NULL); +#ifndef CONFIG_X86_PC9800 + release_region(dev->base_addr, AT1700_IO_EXTENT); +#else + { + int i; + for (i = 0; i < 0x2000; i += 0x200) + release_region(dev->base_addr + i, 2); + } +#endif +} + +struct net_device * __init at1700_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + unsigned *port; + int err = 0; + + if (!dev) + return ERR_PTR(-ENODEV); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + } else { + dev->base_addr = io; + dev->irq = irq; + } SET_MODULE_OWNER(dev); - if (base_addr > 0x1ff) /* Check a single specified location. */ - return at1700_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; at1700_probe_list[i]; i++) { - int ioaddr = at1700_probe_list[i]; - if (at1700_probe1(dev, ioaddr) == 0) - return 0; + if (io > 0x1ff) { /* Check a single specified location. */ + err = at1700_probe1(dev, io); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = at1700_probe_list; *port; port++) { + if (at1700_probe1(dev, *port) == 0) + break; + dev->irq = irq; + } + if (!*port) + err = -ENODEV; } - return -ENODEV; + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); } /* The Fujitsu datasheet suggests that the NIC be probed for by checking its @@ -267,7 +319,7 @@ char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15}; unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0; int slot, ret = -ENODEV; - struct net_local *lp; + struct net_local *lp = dev->priv; #ifndef CONFIG_X86_PC9800 if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name)) @@ -284,9 +336,10 @@ } #endif - /* Resetting the chip doesn't reset the ISA interface, so don't bother. - That means we have to be careful with the register values we probe for. - */ + /* Resetting the chip doesn't reset the ISA interface, so don't bother. + That means we have to be careful with the register values we probe + for. + */ #ifdef notdef printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n", ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5), @@ -331,15 +384,13 @@ break; /* probing for a card at a particular IO/IRQ */ - if (dev && - ((dev->irq && dev->irq != irq) || - (dev->base_addr && dev->base_addr != ioaddr))) { + if ((dev->irq && dev->irq != irq) || + (dev->base_addr && dev->base_addr != ioaddr)) { slot++; /* probing next slot */ continue; } - if (dev) - dev->irq = irq; + dev->irq = irq; /* claim the slot */ mca_set_adapter_name( slot, at1720_mca_adapters[j].name ); @@ -476,13 +527,7 @@ if (net_debug) printk(version); - /* Initialize the device structure. */ - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) { - ret = -ENOMEM; - goto err_out; - } - memset(dev->priv, 0, sizeof(struct net_local)); + memset(lp, 0, sizeof(struct net_local)); dev->open = net_open; dev->stop = net_close; @@ -492,11 +537,7 @@ dev->tx_timeout = net_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - lp = (struct net_local *)dev->priv; - lp->lock = SPIN_LOCK_UNLOCKED; - - /* Fill in the fields of 'dev' with ethernet-generic values. */ - ether_setup(dev); + spin_lock_init(&lp->lock); lp->jumpered = is_fmv18x; lp->mca_slot = slot; @@ -505,14 +546,11 @@ if (ret) { printk (" AT1700 at %#3x is unusable due to a conflict on" "IRQ %d.\n", ioaddr, irq); - goto err_out_priv; + goto err_out; } return 0; -err_out_priv: - kfree(dev->priv); - dev->priv = NULL; err_out: #ifndef CONFIG_X86_PC9800 release_region(ioaddr, AT1700_IO_EXTENT); @@ -940,14 +978,7 @@ } #ifdef MODULE -static struct net_device dev_at1700; -#ifndef CONFIG_X86_PC9800 -static int io = 0x260; -#else -static int io = 0xd0; -#endif - -static int irq; +static struct net_device *dev_at1700; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); @@ -960,41 +991,18 @@ { if (io == 0) printk("at1700: You should not use auto-probing with insmod!\n"); - dev_at1700.base_addr = io; - dev_at1700.irq = irq; - dev_at1700.init = at1700_probe; - if (register_netdev(&dev_at1700) != 0) { - printk("at1700: register_netdev() returned non-zero.\n"); - return -EIO; - } + dev_at1700 = at1700_probe(-1); + if (IS_ERR(dev_at1700)) + return PTR_ERR(dev_at1700); return 0; } void cleanup_module(void) { -#ifdef CONFIG_MCA - struct net_local *lp = dev_at1700.priv; - if(lp->mca_slot) - { - mca_mark_as_unused(lp->mca_slot); - } -#endif - unregister_netdev(&dev_at1700); - kfree(dev_at1700.priv); - dev_at1700.priv = NULL; - - /* If we don't do this, we can't re-insmod it later. */ - free_irq(dev_at1700.irq, NULL); -#ifndef CONFIG_X86_PC9800 - release_region(dev_at1700.base_addr, AT1700_IO_EXTENT); -#else - { - int i; - for (i = 0; i < 0x2000; i += 0x200) - release_region(dev_at1700.base_addr + i, 2); - } -#endif + unregister_netdev(dev_at1700); + cleanup_card(dev_at1700); + free_netdev(dev_at1700); } #endif /* MODULE */ MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/atari_bionet.c b/drivers/net/atari_bionet.c --- a/drivers/net/atari_bionet.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/atari_bionet.c Tue Feb 17 20:00:07 2004 @@ -148,8 +148,6 @@ /* Index to functions, as function prototypes. */ -extern int bionet_probe(struct net_device *dev); - static int bionet_open(struct net_device *dev); static int bionet_send_packet(struct sk_buff *skb, struct net_device *dev); static void bionet_poll_rx(struct net_device *); @@ -321,15 +319,26 @@ /* Check for a network adaptor of this type, and return '0' if one exists. */ -int __init -bionet_probe(struct net_device *dev){ +struct net_device * __init bionet_probe(int unit) +{ + struct net_device *dev; unsigned char station_addr[6]; static unsigned version_printed; static int no_more_found; /* avoid "Probing for..." printed 4 times */ int i; + int err; if (!MACH_IS_ATARI || no_more_found) - return -ENODEV; + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(sizeof(struct net_local)); + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + SET_MODULE_OWNER(dev); printk("Probing for BioNet 100 Adapter...\n"); @@ -347,11 +356,10 @@ || station_addr[2] != 'O' ) { no_more_found = 1; printk( "No BioNet 100 found.\n" ); - return -ENODEV; + free_netdev(dev); + return ERR_PTR(-ENODEV); } - SET_MODULE_OWNER(dev); - if (bionet_debug > 0 && version_printed++ == 0) printk(version); @@ -369,12 +377,6 @@ nic_packet, phys_nic_packet ); } - if (dev->priv == NULL) - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (!dev->priv) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct net_local)); - dev->open = bionet_open; dev->stop = bionet_close; dev->hard_start_xmit = bionet_send_packet; @@ -390,8 +392,11 @@ #endif dev->dev_addr[i] = station_addr[i]; } - ether_setup(dev); - return 0; + err = register_netdev(dev); + if (!err) + return dev; + free_netdev(dev); + return ERR_PTR(err); } /* Open/initialize the board. This is called (in the current kernel) @@ -640,25 +645,20 @@ #ifdef MODULE -static struct net_device bio_dev; - -int -init_module(void) { - int err; +static struct net_device *bio_dev; - bio_dev.init = bionet_probe; - if ((err = register_netdev(&bio_dev))) { - if (err == -EEXIST) { - printk("BIONET: devices already present. Module not loaded.\n"); - } - return err; - } +int init_module(void) +{ + bio_dev = bionet_probe(-1); + if (IS_ERR(bio_dev)) + return PTR_ERR(bio_dev); return 0; } -void -cleanup_module(void) { - unregister_netdev(&bio_dev); +void cleanup_module(void) +{ + unregister_netdev(bio_dev); + free_netdev(bio_dev); } #endif /* MODULE */ diff -Nru a/drivers/net/atari_pamsnet.c b/drivers/net/atari_pamsnet.c --- a/drivers/net/atari_pamsnet.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/atari_pamsnet.c Tue Feb 17 20:00:06 2004 @@ -110,8 +110,6 @@ #undef READ #undef WRITE -extern struct net_device *init_etherdev(struct net_device *dev, int sizeof_private); - /* use 0 for production, 1 for verification, >2 for debug */ #ifndef NET_DEBUG @@ -158,8 +156,6 @@ static int get_status (void); static int calc_received (void *start_address); -extern int pamsnet_probe(struct net_device *dev); - static int pamsnet_open(struct net_device *dev); static int pamsnet_send_packet(struct sk_buff *skb, struct net_device *dev); static void pamsnet_poll_rx(struct net_device *); @@ -562,12 +558,12 @@ /* Check for a network adaptor of this type, and return '0' if one exists. */ -int __init -pamsnet_probe (dev) - struct net_device *dev; +struct net_device * __init pamsnet_probe (int unit) { + struct net_device *dev; int i; HADDR *hwaddr; + int err; unsigned char station_addr[6]; static unsigned version_printed; @@ -575,12 +571,18 @@ static int no_more_found; if (no_more_found) - return -ENODEV; + return ERR_PTR(-ENODEV); + no_more_found = 1; + dev = alloc_etherdev(sizeof(struct net_local)); + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); - no_more_found = 1; - printk("Probing for PAM's Net/GK Adapter...\n"); /* Allocate the DMA buffer here since we need it for probing! */ @@ -618,11 +620,12 @@ ENABLE_IRQ(); stdma_release(); - if (lance_target < 0) + if (lance_target < 0) { printk("No PAM's Net/GK found.\n"); + free_netdev(dev); + return ERR_PTR(-ENODEV); + } - if ((dev == NULL) || (lance_target < 0)) - return -ENODEV; if (pamsnet_debug > 0 && version_printed++ == 0) printk(version); @@ -632,12 +635,6 @@ station_addr[3], station_addr[4], station_addr[5]); /* Initialize the device structure. */ - if (dev->priv == NULL) - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (!dev->priv) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct net_local)); - dev->open = pamsnet_open; dev->stop = pamsnet_close; dev->hard_start_xmit = pamsnet_send_packet; @@ -653,9 +650,12 @@ #endif dev->dev_addr[i] = station_addr[i]; } - ether_setup(dev); + err = register_netdev(dev); + if (!err) + return dev; - return(0); + free_netdev(dev); + return ERR_PTR(err); } /* Open/initialize the board. This is called (in the current kernel) @@ -866,25 +866,20 @@ #ifdef MODULE -static struct net_device pam_dev; - -int -init_module(void) { - int err; +static struct net_device *pam_dev; - pam_dev.init = pamsnet_probe; - if ((err = register_netdev(&pam_dev))) { - if (err == -EEXIST) { - printk("PAM's Net/GK: devices already present. Module not loaded.\n"); - } - return err; - } +int init_module(void) +{ + pam_dev = pamsnet_probe(-1); + if (IS_ERR(pam_dev)) + return PTR_ERR(pam_dev); return 0; } -void -cleanup_module(void) { - unregister_netdev(&pam_dev); +void cleanup_module(void) +{ + unregister_netdev(pam_dev); + free_netdev(pam_dev); } #endif /* MODULE */ diff -Nru a/drivers/net/atarilance.c b/drivers/net/atarilance.c --- a/drivers/net/atarilance.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/atarilance.c Tue Feb 17 20:00:06 2004 @@ -371,26 +371,39 @@ } -int __init atarilance_probe( struct net_device *dev ) -{ +struct net_device * __init atarilance_probe(int unit) +{ int i; static int found; - - SET_MODULE_OWNER(dev); + struct net_device *dev; + int err = -ENODEV; if (!MACH_IS_ATARI || found) /* Assume there's only one board possible... That seems true, since * the Riebl/PAM board's address cannot be changed. */ - return( ENODEV ); + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(sizeof(struct lance_private)); + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + SET_MODULE_OWNER(dev); for( i = 0; i < N_LANCE_ADDR; ++i ) { if (lance_probe1( dev, &lance_addr_list[i] )) { found = 1; - return( 0 ); + err = register_netdev(dev); + if (!err) + return dev; + free_irq(dev->irq, dev); + break; } } - - return( ENODEV ); + free_netdev(dev); + return ERR_PTR(err); } @@ -511,12 +524,6 @@ return( 0 ); probe_ok: - init_etherdev( dev, sizeof(struct lance_private) ); - if (!dev->priv) { - dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL ); - if (!dev->priv) - return 0; - } lp = (struct lance_private *)dev->priv; MEM = (struct lance_memory *)memaddr; IO = lp->iobase = (struct lance_ioreg *)ioaddr; @@ -1171,26 +1178,21 @@ #ifdef MODULE -static struct net_device atarilance_dev; +static struct net_device *atarilance_dev; int init_module(void) - -{ int err; - - atarilance_dev.init = atarilance_probe; - if ((err = register_netdev( &atarilance_dev ))) { - if (err == -EIO) { - printk( "No Atari Lance board found. Module not loaded.\n"); - } - return( err ); - } - return( 0 ); +{ + atarilance_dev = atarilance_probe(-1); + if (IS_ERR(atarilance_dev)) + return PTR_ERR(atarilance_dev); + return 0; } void cleanup_module(void) - { - unregister_netdev( &atarilance_dev ); + unregister_netdev(atarilance_dev); + free_irq(atarilance_dev->irq, atarilance_dev); + free_netdev(atarilance_dev); } #endif /* MODULE */ diff -Nru a/drivers/net/atp.c b/drivers/net/atp.c --- a/drivers/net/atp.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/atp.c Tue Feb 17 20:00:08 2004 @@ -195,7 +195,7 @@ /* Index to functions, as function prototypes. */ -static int atp_probe1(struct net_device *dev, long ioaddr); +static int atp_probe1(long ioaddr); static void get_node_ID(struct net_device *dev); static unsigned short eeprom_op(long ioaddr, unsigned int cmd); static int net_open(struct net_device *dev); @@ -224,13 +224,13 @@ FIXME: we should use the parport layer for this */ -static int __init atp_init(struct net_device *dev) +static int __init atp_init(void) { int *port, ports[] = {0x378, 0x278, 0x3bc, 0}; - int base_addr = dev ? dev->base_addr : io[0]; + int base_addr = io[0]; if (base_addr > 0x1ff) /* Check a single specified location. */ - return atp_probe1(dev, base_addr); + return atp_probe1(base_addr); else if (base_addr == 1) /* Don't probe at all. */ return -ENXIO; @@ -239,17 +239,19 @@ outb(0x57, ioaddr + PAR_DATA); if (inb(ioaddr + PAR_DATA) != 0x57) continue; - if (atp_probe1(dev, ioaddr) == 0) + if (atp_probe1(ioaddr) == 0) return 0; } return -ENODEV; } -static int __init atp_probe1(struct net_device *dev, long ioaddr) +static int __init atp_probe1(long ioaddr) { + struct net_device *dev = NULL; struct net_local *lp; int saved_ctrl_reg, status, i; + int res; outb(0xff, ioaddr + PAR_DATA); /* Save the original value of the Control register, in case we guessed @@ -296,7 +298,7 @@ return -ENODEV; } - dev = init_etherdev(dev, sizeof(struct net_local)); + dev = alloc_etherdev(sizeof(struct net_local)); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); @@ -331,24 +333,13 @@ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); /* Reset the ethernet hardware and activate the printer pass-through. */ - write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX); - - /* Initialize the device structure. */ - ether_setup(dev); - if (dev->priv == NULL) - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct net_local)); + write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX); lp = (struct net_local *)dev->priv; lp->chip_type = RTL8002; lp->addr_mode = CMR2h_Normal; spin_lock_init(&lp->lock); - lp->next_module = root_atp_dev; - root_atp_dev = dev; - /* For the ATP adapter the "if_port" is really the data transfer mode. */ if (xcvr[0]) dev->if_port = xcvr[0]; @@ -366,6 +357,15 @@ dev->tx_timeout = tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; + res = register_netdev(dev); + if (res) { + free_netdev(dev); + return res; + } + + lp->next_module = root_atp_dev; + root_atp_dev = dev; + return 0; } @@ -933,7 +933,7 @@ static int __init atp_init_module(void) { if (debug) /* Emit version even if no cards detected. */ printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB); - return atp_init(NULL); + return atp_init(); } static void __exit atp_cleanup_module(void) { diff -Nru a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c --- a/drivers/net/au1000_eth.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/au1000_eth.c Tue Feb 17 20:00:07 2004 @@ -56,7 +56,7 @@ static void dma_free(void *, size_t); static void hard_stop(struct net_device *); static void enable_rx_tx(struct net_device *dev); -static int __init au1000_probe1(struct net_device *, long, int, int); +static int __init au1000_probe1(long, int, int); static int au1000_init(struct net_device *); static int au1000_open(struct net_device *); static int au1000_close(struct net_device *); @@ -644,17 +644,17 @@ } // check for valid entries, au1100 only has one entry if (base_addr && irq) { - if (au1000_probe1(NULL, base_addr, irq, i) != 0) { + if (au1000_probe1(base_addr, irq, i) != 0) return -ENODEV; - } } } return 0; } static int __init -au1000_probe1(struct net_device *dev, long ioaddr, int irq, int port_num) +au1000_probe1(long ioaddr, int irq, int port_num) { + struct net_device *dev; static unsigned version_printed = 0; struct au1000_private *aup = NULL; int i, retval = 0; @@ -668,15 +668,16 @@ if (version_printed++ == 0) printk(version); - if (!dev) - dev = init_etherdev(NULL, sizeof(struct au1000_private)); + retval = -ENOMEM; + dev = alloc_etherdev(sizeof(struct au1000_private)); if (!dev) { - printk (KERN_ERR "au1000 eth: init_etherdev failed\n"); - release_region(ioaddr, MAC_IOSIZE); - return -ENODEV; + printk (KERN_ERR "au1000 eth: alloc_etherdev failed\n"); + goto out; } + SET_MODULE_OWNER(dev); + printk("%s: Au1xxx ethernet found at 0x%lx, irq %d\n", dev->name, ioaddr, irq); @@ -685,10 +686,8 @@ /* Allocate the data buffers */ aup->vaddr = (u32)dma_alloc(MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS), &aup->dma_addr); - if (!aup->vaddr) { - retval = -ENOMEM; - goto free_region; - } + if (!aup->vaddr) + goto out1; /* aup->mac is the base address of the MAC's registers */ aup->mac = (volatile mac_reg_t *)((unsigned long)ioaddr); @@ -749,10 +748,11 @@ MAC_EN_RESET2 | MAC_EN_CLOCK_ENABLE; au_sync_delay(2); - if (mii_probe(dev) != 0) { - goto free_region; - } + retval = mii_probe(dev); + if (retval) + goto out2; + retval = -EINVAL; pDBfree = NULL; /* setup the data buffer descriptors and attach a buffer to each one */ pDB = aup->db; @@ -767,13 +767,13 @@ for (i=0; irx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr; aup->rx_db_inuse[i] = pDB; } for (i=0; itx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr; aup->tx_dma_ring[i]->len = 0; aup->tx_db_inuse[i] = pDB; @@ -792,26 +792,25 @@ dev->tx_timeout = au1000_tx_timeout; dev->watchdog_timeo = ETH_TX_TIMEOUT; - - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - /* * The boot code uses the ethernet controller, so reset it to start * fresh. au1000_init() expects that the device is in reset state. */ reset_mac(dev); + + retval = register_netdev(dev); + if (retval) + goto out2; return 0; -free_region: +out2: + dma_free(aup->vaddr, MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS)); +out1: + free_netdev(dev); +out: release_region(PHYSADDR(ioaddr), MAC_IOSIZE); - unregister_netdev(dev); - if (aup->vaddr) - dma_free((void *)aup->vaddr, - MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS)); printk(KERN_ERR "%s: au1000_probe1 failed. Returns %d\n", dev->name, retval); - free_netdev(dev); return retval; } @@ -933,15 +932,12 @@ int retval; struct au1000_private *aup = (struct au1000_private *) dev->priv; - MOD_INC_USE_COUNT; - if (au1000_debug > 4) printk("%s: open: dev=%p\n", dev->name, dev); if ((retval = au1000_init(dev))) { printk(KERN_ERR "%s: error in au1000_init\n", dev->name); free_irq(dev->irq, dev); - MOD_DEC_USE_COUNT; return retval; } netif_start_queue(dev); @@ -950,7 +946,6 @@ dev->name, dev))) { printk(KERN_ERR "%s: unable to get IRQ %d\n", dev->name, dev->irq); - MOD_DEC_USE_COUNT; return retval; } @@ -984,8 +979,6 @@ spin_unlock_irqrestore(&aup->lock, flags); reset_mac(dev); - kfree(dev); - MOD_DEC_USE_COUNT; return 0; } diff -Nru a/drivers/net/bagetlance.c b/drivers/net/bagetlance.c --- a/drivers/net/bagetlance.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/bagetlance.c Tue Feb 17 20:00:05 2004 @@ -465,30 +465,43 @@ } -int __init bagetlance_probe( struct net_device *dev ) - -{ int i; +struct net_device * __init bagetlance_probe(int unit) +{ + struct net_device *dev; + int i; static int found; - - SET_MODULE_OWNER(dev); + int err = -ENODEV; if (found) /* Assume there's only one board possible... That seems true, since * the Riebl/PAM board's address cannot be changed. */ - return( -ENODEV ); + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(sizeof(struct lance_private)); + if (!dev) + return ERR_PTR(-ENOMEM); + + SET_MODULE_OWNER(dev); for( i = 0; i < N_LANCE_ADDR; ++i ) { if (lance_probe1( dev, &lance_addr_list[i] )) { found = 1; - return( 0 ); + break; } } - - return( -ENODEV ); + if (!found) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + free_irq(dev->irq, dev); +out: + free_netdev(dev); + return ERR_PTR(err); } - - /* Derived from hwreg_present() in vme/config.c: */ static int __init addr_accessible( volatile void *regp, @@ -527,6 +540,7 @@ if (!addr_accessible( memaddr, 1, 1 )) goto probe_fail; if ((unsigned long)memaddr >= KSEG2) { + /* FIXME: do we need to undo that on cleanup paths? */ extern int kseg2_alloc_io (unsigned long addr, unsigned long size); if (kseg2_alloc_io((unsigned long)memaddr, BAGET_LANCE_MEM_SIZE)) { printk("bagetlance: unable map lance memory\n"); @@ -580,12 +594,6 @@ return( 0 ); probe_ok: - init_etherdev( dev, sizeof(struct lance_private) ); - if (!dev->priv) { - dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL ); - if (!dev->priv) - return 0; - } lp = (struct lance_private *)dev->priv; MEM = (struct lance_memory *)memaddr; IO = lp->iobase = (struct lance_ioreg *)ioaddr; @@ -617,8 +625,9 @@ if (lp->cardtype == PAM_CARD || memaddr == (unsigned short *)0xffe00000) { /* PAMs card and Riebl on ST use level 5 autovector */ - request_irq(BAGET_LANCE_IRQ, lance_interrupt, IRQ_TYPE_PRIO, - "PAM/Riebl-ST Ethernet", dev); + if (request_irq(BAGET_LANCE_IRQ, lance_interrupt, IRQ_TYPE_PRIO, + "PAM/Riebl-ST Ethernet", dev)) + goto probe_fail; dev->irq = (unsigned short)BAGET_LANCE_IRQ; } else { @@ -629,10 +638,11 @@ unsigned long irq = BAGET_LANCE_IRQ; if (!irq) { printk( "Lance: request for VME interrupt failed\n" ); - return( 0 ); + goto probe_fail; } - request_irq(irq, lance_interrupt, IRQ_TYPE_PRIO, - "Riebl-VME Ethernet", dev); + if (request_irq(irq, lance_interrupt, IRQ_TYPE_PRIO, + "Riebl-VME Ethernet", dev)) + goto probe_fail; dev->irq = irq; } @@ -1331,26 +1341,21 @@ #ifdef MODULE -static struct net_device bagetlance_dev; +static struct net_device *bagetlance_dev; int init_module(void) - -{ int err; - - bagetlance_dev.init = bagetlance_probe; - if ((err = register_netdev( &bagetlance_dev ))) { - if (err == -EIO) { - printk( "No Vme Lance board found. Module not loaded.\n"); - } - return( err ); - } - return( 0 ); +{ + bagetlance_dev = bagetlance_probe(-1); + if (IS_ERR(bagetlance_dev)) + return PTR_ERR(bagetlance_dev); + return 0; } void cleanup_module(void) - { - unregister_netdev( &bagetlance_dev ); + unregister_netdev(bagetlance_dev); + free_irq(bagetlance_dev->irq, bagetlance_dev); + free_netdev(bagetlance_dev); } #endif /* MODULE */ diff -Nru a/drivers/net/bmac.c b/drivers/net/bmac.c --- a/drivers/net/bmac.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/bmac.c Tue Feb 17 20:00:05 2004 @@ -26,11 +26,9 @@ #include #include #include +#include #include -#ifdef CONFIG_PMAC_PBOOK -#include -#include -#endif + #include "bmac.h" #define trunc_page(x) ((void *)(((unsigned long)(x)) & ~((unsigned long)(PAGE_SIZE - 1)))) @@ -67,7 +65,7 @@ int rx_dma_intr; volatile struct dbdma_cmd *tx_cmds; /* xmit dma command list */ volatile struct dbdma_cmd *rx_cmds; /* recv dma command list */ - struct device_node *node; + struct macio_dev *mdev; int is_bmac_plus; struct sk_buff *rx_bufs[N_RX_RING]; int rx_fill; @@ -84,9 +82,10 @@ unsigned short hash_use_count[64]; unsigned short hash_table_mask[4]; spinlock_t lock; - struct net_device *next_bmac; }; +#if 0 /* Move that to ethtool */ + typedef struct bmac_reg_entry { char *name; unsigned short reg_offset; @@ -128,16 +127,10 @@ {"RXCV", RXCV} }; -static struct net_device *bmac_devs; -static unsigned char *bmac_emergency_rxbuf; - -#ifdef CONFIG_PMAC_PBOOK -static int bmac_sleep_notify(struct pmu_sleep_notifier *self, int when); -static struct pmu_sleep_notifier bmac_sleep_notifier = { - bmac_sleep_notify, SLEEP_LEVEL_NET, -}; #endif +static unsigned char *bmac_emergency_rxbuf; + /* * Number of bytes of private data per BMAC: allow enough for * the rx and tx dma commands plus a branch dma command each, @@ -149,7 +142,6 @@ + sizeof(struct sk_buff_head)) static unsigned char bitrev(unsigned char b); -static void bmac_probe1(struct device_node *bmac, int is_bmac_plus); static int bmac_open(struct net_device *dev); static int bmac_close(struct net_device *dev); static int bmac_transmit_packet(struct sk_buff *skb, struct net_device *dev); @@ -166,7 +158,6 @@ static irqreturn_t bmac_rxdma_intr(int irq, void *dev_id, struct pt_regs *regs); static void bmac_set_timeout(struct net_device *dev); static void bmac_tx_timeout(unsigned long data); -static int bmac_proc_info ( char *buffer, char **start, off_t offset, int length); static int bmac_output(struct sk_buff *skb, struct net_device *dev); static void bmac_start(struct net_device *dev); @@ -244,7 +235,7 @@ if (td) dbdma_reset(td); - pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 1); + pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 1); } #define MIFDELAY udelay(10) @@ -457,87 +448,80 @@ } } -static void -bmac_init_chip(struct net_device *dev) +static void bmac_init_chip(struct net_device *dev) { bmac_init_phy(dev); bmac_init_registers(dev); } -#ifdef CONFIG_PMAC_PBOOK -static int -bmac_sleep_notify(struct pmu_sleep_notifier *self, int when) +#ifdef CONFIG_PM +static int bmac_suspend(struct macio_dev *mdev, u32 state) { - struct bmac_data *bp; + struct net_device* dev = macio_get_drvdata(mdev); + struct bmac_data *bp = dev->priv; unsigned long flags; unsigned short config; - struct net_device* dev = bmac_devs; int i; - if (bmac_devs == 0) - return PBOOK_SLEEP_OK; - - bp = (struct bmac_data *) dev->priv; - - switch (when) { - case PBOOK_SLEEP_REQUEST: - break; - case PBOOK_SLEEP_REJECT: - break; - case PBOOK_SLEEP_NOW: - netif_device_detach(dev); - /* prolly should wait for dma to finish & turn off the chip */ - spin_lock_irqsave(&bp->lock, flags); - if (bp->timeout_active) { - del_timer(&bp->tx_timeout); - bp->timeout_active = 0; - } - disable_irq(dev->irq); - disable_irq(bp->tx_dma_intr); - disable_irq(bp->rx_dma_intr); - bp->sleeping = 1; - spin_unlock_irqrestore(&bp->lock, flags); - if (bp->opened) { - volatile struct dbdma_regs *rd = bp->rx_dma; - volatile struct dbdma_regs *td = bp->tx_dma; + netif_device_detach(dev); + /* prolly should wait for dma to finish & turn off the chip */ + spin_lock_irqsave(&bp->lock, flags); + if (bp->timeout_active) { + del_timer(&bp->tx_timeout); + bp->timeout_active = 0; + } + disable_irq(dev->irq); + disable_irq(bp->tx_dma_intr); + disable_irq(bp->rx_dma_intr); + bp->sleeping = 1; + spin_unlock_irqrestore(&bp->lock, flags); + if (bp->opened) { + volatile struct dbdma_regs *rd = bp->rx_dma; + volatile struct dbdma_regs *td = bp->tx_dma; - config = bmread(dev, RXCFG); - bmwrite(dev, RXCFG, (config & ~RxMACEnable)); - config = bmread(dev, TXCFG); - bmwrite(dev, TXCFG, (config & ~TxMACEnable)); - bmwrite(dev, INTDISABLE, DisableAll); /* disable all intrs */ - /* disable rx and tx dma */ - st_le32(&rd->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */ - st_le32(&td->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */ - /* free some skb's */ - for (i=0; irx_bufs[i] != NULL) { - dev_kfree_skb(bp->rx_bufs[i]); - bp->rx_bufs[i] = NULL; - } - } - for (i = 0; itx_bufs[i] != NULL) { - dev_kfree_skb(bp->tx_bufs[i]); - bp->tx_bufs[i] = NULL; - } - } + config = bmread(dev, RXCFG); + bmwrite(dev, RXCFG, (config & ~RxMACEnable)); + config = bmread(dev, TXCFG); + bmwrite(dev, TXCFG, (config & ~TxMACEnable)); + bmwrite(dev, INTDISABLE, DisableAll); /* disable all intrs */ + /* disable rx and tx dma */ + st_le32(&rd->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */ + st_le32(&td->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */ + /* free some skb's */ + for (i=0; irx_bufs[i] != NULL) { + dev_kfree_skb(bp->rx_bufs[i]); + bp->rx_bufs[i] = NULL; + } + } + for (i = 0; itx_bufs[i] != NULL) { + dev_kfree_skb(bp->tx_bufs[i]); + bp->tx_bufs[i] = NULL; + } } - pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 0); - break; - case PBOOK_WAKE: - /* see if this is enough */ - if (bp->opened) - bmac_reset_and_enable(dev); - enable_irq(dev->irq); - enable_irq(bp->tx_dma_intr); - enable_irq(bp->rx_dma_intr); - netif_device_attach(dev); - break; } - return PBOOK_SLEEP_OK; + pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0); + return 0; } -#endif + +static int bmac_resume(struct macio_dev *mdev) +{ + struct net_device* dev = macio_get_drvdata(mdev); + struct bmac_data *bp = dev->priv; + + /* see if this is enough */ + if (bp->opened) + bmac_reset_and_enable(dev); + + enable_irq(dev->irq); + enable_irq(bp->tx_dma_intr); + enable_irq(bp->rx_dma_intr); + netif_device_attach(dev); + + return 0; +} +#endif /* CONFIG_PM */ static int bmac_set_address(struct net_device *dev, void *addr) { @@ -1277,103 +1261,61 @@ spin_unlock_irqrestore(&bp->lock, flags); } -static int __init bmac_probe(void) -{ - struct device_node *bmac; - - MOD_INC_USE_COUNT; - - for (bmac = find_devices("bmac"); bmac != 0; bmac = bmac->next) - bmac_probe1(bmac, 0); - for (bmac = find_compatible_devices("network", "bmac+"); bmac != 0; - bmac = bmac->next) - bmac_probe1(bmac, 1); - - if (bmac_devs != 0) { - proc_net_create ("bmac", 0, bmac_proc_info); -#ifdef CONFIG_PMAC_PBOOK - pmu_register_sleep_notifier(&bmac_sleep_notifier); -#endif - } - - MOD_DEC_USE_COUNT; - - return bmac_devs? 0: -ENODEV; -} - -static void __init bmac_probe1(struct device_node *bmac, int is_bmac_plus) +static int __devinit bmac_probe(struct macio_dev *mdev, const struct of_match *match) { int j, rev, ret; struct bmac_data *bp; unsigned char *addr; struct net_device *dev; + int is_bmac_plus = ((int)match->data) != 0; - if (bmac->n_addrs != 3 || bmac->n_intrs != 3) { - printk(KERN_ERR "can't use BMAC %s: need 3 addrs and 3 intrs\n", - bmac->full_name); - return; + if (macio_resource_count(mdev) != 3 || macio_irq_count(mdev) != 3) { + printk(KERN_ERR "BMAC: can't use, need 3 addrs and 3 intrs\n"); + return -ENODEV; } - addr = get_property(bmac, "mac-address", NULL); + addr = get_property(macio_get_of_node(mdev), "mac-address", NULL); if (addr == NULL) { - addr = get_property(bmac, "local-mac-address", NULL); + addr = get_property(macio_get_of_node(mdev), "local-mac-address", NULL); if (addr == NULL) { - printk(KERN_ERR "Can't get mac-address for BMAC %s\n", - bmac->full_name); - return; - } - } - - if (bmac_emergency_rxbuf == NULL) { - bmac_emergency_rxbuf = kmalloc(RX_BUFLEN, GFP_KERNEL); - if (bmac_emergency_rxbuf == NULL) { - printk(KERN_ERR "BMAC: can't allocate emergency RX buffer\n"); - return; + printk(KERN_ERR "BMAC: Can't get mac-address\n"); + return -ENODEV; } } dev = alloc_etherdev(PRIV_BYTES); if (!dev) { - printk(KERN_ERR "alloc_etherdev failed, out of memory for BMAC %s\n", - bmac->full_name); - return; + printk(KERN_ERR "BMAC: alloc_etherdev failed, out of memory\n"); + return -ENOMEM; } bp = (struct bmac_data *) dev->priv; SET_MODULE_OWNER(dev); - bp->node = bmac; + SET_NETDEV_DEV(dev, &mdev->ofdev.dev); + macio_set_drvdata(mdev, dev); + + bp->mdev = mdev; spin_lock_init(&bp->lock); - if (!request_OF_resource(bmac, 0, " (bmac)")) { + if (macio_request_resources(mdev, "bmac")) { printk(KERN_ERR "BMAC: can't request IO resource !\n"); - goto out1; - } - if (!request_OF_resource(bmac, 1, " (bmac tx dma)")) { - printk(KERN_ERR "BMAC: can't request TX DMA resource !\n"); - goto out2; - } - if (!request_OF_resource(bmac, 2, " (bmac rx dma)")) { - printk(KERN_ERR "BMAC: can't request RX DMA resource !\n"); - goto out3; + goto out_free; } dev->base_addr = (unsigned long) - ioremap(bmac->addrs[0].address, bmac->addrs[0].size); - if (!dev->base_addr) - goto out4; + ioremap(macio_resource_start(mdev, 0), macio_resource_len(mdev, 0)); + if (dev->base_addr == 0) + goto out_release; - dev->irq = bmac->intrs[0].line; + dev->irq = macio_irq(mdev, 0); bmac_enable_and_reset_chip(dev); bmwrite(dev, INTDISABLE, DisableAll); - printk(KERN_INFO "%s: BMAC%s at", dev->name, (is_bmac_plus? "+": "")); rev = addr[0] == 0 && addr[1] == 0xA0; for (j = 0; j < 6; ++j) { dev->dev_addr[j] = rev? bitrev(addr[j]): addr[j]; printk("%c%.2x", (j? ':': ' '), dev->dev_addr[j]); } - XXDEBUG((", base_addr=%#0lx", dev->base_addr)); - printk("\n"); /* Enable chip without interrupts for now */ bmac_enable_and_reset_chip(dev); @@ -1392,15 +1334,15 @@ bp->is_bmac_plus = is_bmac_plus; bp->tx_dma = (volatile struct dbdma_regs *) - ioremap(bmac->addrs[1].address, bmac->addrs[1].size); + ioremap(macio_resource_start(mdev, 1), macio_resource_len(mdev, 1)); if (!bp->tx_dma) goto err_out_iounmap; - bp->tx_dma_intr = bmac->intrs[1].line; + bp->tx_dma_intr = macio_irq(mdev, 1); bp->rx_dma = (volatile struct dbdma_regs *) - ioremap(bmac->addrs[2].address, bmac->addrs[2].size); + ioremap(macio_resource_start(mdev, 2), macio_resource_len(mdev, 2)); if (!bp->rx_dma) goto err_out_iounmap_tx; - bp->rx_dma_intr = bmac->intrs[2].line; + bp->rx_dma_intr = macio_irq(mdev, 2); bp->tx_cmds = (volatile struct dbdma_cmd *) DBDMA_ALIGN(bp + 1); bp->rx_cmds = bp->tx_cmds + N_TX_RING + 1; @@ -1415,14 +1357,14 @@ printk(KERN_ERR "BMAC: can't get irq %d\n", dev->irq); goto err_out_iounmap_rx; } - ret = request_irq(bmac->intrs[1].line, bmac_txdma_intr, 0, "BMAC-txdma", dev); + ret = request_irq(bp->tx_dma_intr, bmac_txdma_intr, 0, "BMAC-txdma", dev); if (ret) { - printk(KERN_ERR "BMAC: can't get irq %d\n", bmac->intrs[1].line); + printk(KERN_ERR "BMAC: can't get irq %d\n", bp->tx_dma_intr); goto err_out_irq0; } - ret = request_irq(bmac->intrs[2].line, bmac_rxdma_intr, 0, "BMAC-rxdma", dev); + ret = request_irq(bp->rx_dma_intr, bmac_rxdma_intr, 0, "BMAC-rxdma", dev); if (ret) { - printk(KERN_ERR "BMAC: can't get irq %d\n", bmac->intrs[2].line); + printk(KERN_ERR "BMAC: can't get irq %d\n", bp->rx_dma_intr); goto err_out_irq1; } @@ -1430,22 +1372,23 @@ * re-enabled on open() */ disable_irq(dev->irq); - pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 0); + pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0); if (register_netdev(dev) != 0) { - printk(KERN_ERR "registration failed for BMAC %s\n", - bmac->full_name); + printk(KERN_ERR "BMAC: Ethernet registration failed\n"); goto err_out_irq2; } + + printk(KERN_INFO "%s: BMAC%s at", dev->name, (is_bmac_plus? "+": "")); + XXDEBUG((", base_addr=%#0lx", dev->base_addr)); + printk("\n"); - bp->next_bmac = bmac_devs; - bmac_devs = dev; - return; + return 0; err_out_irq2: - free_irq(bmac->intrs[2].line, dev); + free_irq(bp->rx_dma_intr, dev); err_out_irq1: - free_irq(bmac->intrs[1].line, dev); + free_irq(bp->tx_dma_intr, dev); err_out_irq0: free_irq(dev->irq, dev); err_out_iounmap_rx: @@ -1454,15 +1397,13 @@ iounmap((void *)bp->tx_dma); err_out_iounmap: iounmap((void *)dev->base_addr); -out4: - release_OF_resource(bp->node, 2); -out3: - release_OF_resource(bp->node, 1); -out2: - release_OF_resource(bp->node, 0); -out1: - pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 0); +out_release: + macio_release_resources(mdev); +out_free: + pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0); free_netdev(dev); + + return -ENODEV; } static int bmac_open(struct net_device *dev) @@ -1520,7 +1461,7 @@ bp->opened = 0; disable_irq(dev->irq); - pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 0); + pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0); return 0; } @@ -1649,6 +1590,7 @@ } #endif +#if 0 static int bmac_proc_info(char *buffer, char **start, off_t offset, int length) { @@ -1683,46 +1625,86 @@ return len; } +#endif +static int __devexit bmac_remove(struct macio_dev *mdev) +{ + struct net_device *dev = macio_get_drvdata(mdev); + struct bmac_data *bp = dev->priv; -MODULE_AUTHOR("Randy Gobbel/Paul Mackerras"); -MODULE_DESCRIPTION("PowerMac BMAC ethernet driver."); -MODULE_LICENSE("GPL"); + unregister_netdev(dev); -static void __exit bmac_cleanup (void) -{ - struct bmac_data *bp; - struct net_device *dev; + free_irq(dev->irq, dev); + free_irq(bp->tx_dma_intr, dev); + free_irq(bp->rx_dma_intr, dev); - if (bmac_emergency_rxbuf != NULL) { - kfree(bmac_emergency_rxbuf); - bmac_emergency_rxbuf = NULL; - } + iounmap((void *)dev->base_addr); + iounmap((void *)bp->tx_dma); + iounmap((void *)bp->rx_dma); - if (bmac_devs == 0) - return; -#ifdef CONFIG_PMAC_PBOOK - pmu_unregister_sleep_notifier(&bmac_sleep_notifier); + macio_release_resources(mdev); + + free_netdev(dev); + + return 0; +} + +static struct of_match bmac_match[] = +{ + { + .name = "bmac", + .type = OF_ANY_MATCH, + .compatible = OF_ANY_MATCH, + .data = (void *)0, + }, + { + .name = OF_ANY_MATCH, + .type = "network", + .compatible = "bmac+", + .data = (void *)1, + }, + {}, +}; + +static struct macio_driver bmac_driver = +{ + .name = "bmac", + .match_table = bmac_match, + .probe = bmac_probe, + .remove = bmac_remove, +#ifdef CONFIG_PM + .suspend = bmac_suspend, + .resume = bmac_resume, #endif - proc_net_remove("bmac"); +}; - do { - dev = bmac_devs; - bp = (struct bmac_data *) dev->priv; - bmac_devs = bp->next_bmac; - unregister_netdev(dev); +static int __init bmac_init(void) +{ + if (bmac_emergency_rxbuf == NULL) { + bmac_emergency_rxbuf = kmalloc(RX_BUFLEN, GFP_KERNEL); + if (bmac_emergency_rxbuf == NULL) { + printk(KERN_ERR "BMAC: can't allocate emergency RX buffer\n"); + return -ENOMEM; + } + } - release_OF_resource(bp->node, 0); - release_OF_resource(bp->node, 1); - release_OF_resource(bp->node, 2); - free_irq(dev->irq, dev); - free_irq(bp->tx_dma_intr, dev); - free_irq(bp->rx_dma_intr, dev); + return macio_register_driver(&bmac_driver); +} - free_netdev(dev); - } while (bmac_devs != NULL); +static void __exit bmac_exit(void) +{ + macio_unregister_driver(&bmac_driver); + + if (bmac_emergency_rxbuf != NULL) { + kfree(bmac_emergency_rxbuf); + bmac_emergency_rxbuf = NULL; + } } -module_init(bmac_probe); -module_exit(bmac_cleanup); +MODULE_AUTHOR("Randy Gobbel/Paul Mackerras"); +MODULE_DESCRIPTION("PowerMac BMAC ethernet driver."); +MODULE_LICENSE("GPL"); + +module_init(bmac_init); +module_exit(bmac_exit); diff -Nru a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c --- a/drivers/net/bonding/bond_3ad.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/bonding/bond_3ad.c Tue Feb 17 20:00:07 2004 @@ -47,8 +47,13 @@ * - Send LACPDU as highest priority packet to further fix the above * problem on very high Tx traffic load where packets may get dropped * by the slave. + * + * 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes */ +//#define BONDING_DEBUG 1 + #include #include #include @@ -119,6 +124,7 @@ static struct mac_addr null_mac_addr = {{0, 0, 0, 0, 0, 0}}; static u16 ad_ticks_per_sec; +static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000; // ================= 3AD api to bonding and kernel code ================== static u16 __get_link_speed(struct port *port); @@ -196,13 +202,11 @@ */ static inline struct port *__get_first_port(struct bonding *bond) { - struct slave *slave = bond->next; - - if (slave == (struct slave *)bond) { + if (bond->slave_cnt == 0) { return NULL; } - return &(SLAVE_AD_INFO(slave).port); + return &(SLAVE_AD_INFO(bond->first_slave).port); } /** @@ -218,7 +222,7 @@ struct slave *slave = port->slave; // If there's no bond for this port, or this is the last slave - if ((bond == NULL) || (slave->next == bond->next)) { + if ((bond == NULL) || (slave->next == bond->first_slave)) { return NULL; } @@ -236,12 +240,12 @@ { struct bonding *bond = __get_bond_by_port(port); - // If there's no bond for this port, or this is the last slave - if ((bond == NULL) || (bond->next == (struct slave *)bond)) { + // If there's no bond for this port, or bond has no slaves + if ((bond == NULL) || (bond->slave_cnt == 0)) { return NULL; } - return &(SLAVE_AD_INFO(bond->next).aggregator); + return &(SLAVE_AD_INFO(bond->first_slave).aggregator); } /** @@ -257,7 +261,7 @@ struct bonding *bond = bond_get_bond_by_slave(slave); // If there's no bond for this aggregator, or this is the last slave - if ((bond == NULL) || (slave->next == bond->next)) { + if ((bond == NULL) || (slave->next == bond->first_slave)) { return NULL; } @@ -392,7 +396,7 @@ } } - BOND_PRINT_DBG(("Port %d Received link speed %d update from adapter", port->actor_port_number, speed)); + dprintk("Port %d Received link speed %d update from adapter\n", port->actor_port_number, speed); return speed; } @@ -418,12 +422,12 @@ switch (slave->duplex) { case DUPLEX_FULL: retval=0x1; - BOND_PRINT_DBG(("Port %d Received status full duplex update from adapter", port->actor_port_number)); + dprintk("Port %d Received status full duplex update from adapter\n", port->actor_port_number); break; case DUPLEX_HALF: default: retval=0x0; - BOND_PRINT_DBG(("Port %d Received status NOT full duplex update from adapter", port->actor_port_number)); + dprintk("Port %d Received status NOT full duplex update from adapter\n", port->actor_port_number); break; } } @@ -1059,7 +1063,7 @@ // check if the state machine was changed if (port->sm_mux_state != last_state) { - BOND_PRINT_DBG(("Mux Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_mux_state)); + dprintk("Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_mux_state); switch (port->sm_mux_state) { case AD_MUX_DETACHED: __detach_bond_from_agg(port); @@ -1158,7 +1162,7 @@ // check if the State machine was changed or new lacpdu arrived if ((port->sm_rx_state != last_state) || (lacpdu)) { - BOND_PRINT_DBG(("Rx Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_rx_state)); + dprintk("Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_rx_state); switch (port->sm_rx_state) { case AD_RX_INITIALIZE: if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) { @@ -1204,7 +1208,7 @@ // detect loopback situation if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) { // INFO_RECEIVED_LOOPBACK_FRAMES - printk(KERN_ERR "bonding: An illegal loopback occurred on adapter (%s)\n", + printk(KERN_ERR DRV_NAME ": An illegal loopback occurred on adapter (%s)\n", port->slave->dev->name); printk(KERN_ERR "Check the configuration to verify that all Adapters " "are connected to 802.3ad compliant switch ports\n"); @@ -1245,7 +1249,7 @@ __update_lacpdu_from_port(port); // send the lacpdu if (ad_lacpdu_send(port) >= 0) { - BOND_PRINT_DBG(("Sent LACPDU on port %d", port->actor_port_number)); + dprintk("Sent LACPDU on port %d\n", port->actor_port_number); // mark ntt as false, so it will not be sent again until demanded port->ntt = 0; } @@ -1318,7 +1322,7 @@ // check if the state machine was changed if (port->sm_periodic_state != last_state) { - BOND_PRINT_DBG(("Periodic Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_periodic_state)); + dprintk("Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_periodic_state); switch (port->sm_periodic_state) { case AD_NO_PERIODIC: port->sm_periodic_timer_counter = 0; // zero timer @@ -1375,7 +1379,7 @@ port->next_port_in_aggregator=NULL; port->actor_port_aggregator_identifier=0; - BOND_PRINT_DBG(("Port %d left LAG %d", port->actor_port_number, temp_aggregator->aggregator_identifier)); + dprintk("Port %d left LAG %d\n", port->actor_port_number, temp_aggregator->aggregator_identifier); // if the aggregator is empty, clear its parameters, and set it ready to be attached if (!temp_aggregator->lag_ports) { ad_clear_agg(temp_aggregator); @@ -1384,7 +1388,7 @@ } } if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator port list - printk(KERN_WARNING "bonding: Warning: Port %d (on %s) was " + printk(KERN_WARNING DRV_NAME ": Warning: Port %d (on %s) was " "related to aggregator %d but was not on its port list\n", port->actor_port_number, port->slave->dev->name, port->aggregator->aggregator_identifier); @@ -1417,7 +1421,7 @@ port->next_port_in_aggregator=aggregator->lag_ports; port->aggregator->num_of_ports++; aggregator->lag_ports=port; - BOND_PRINT_DBG(("Port %d joined LAG %d(existing LAG)", port->actor_port_number, port->aggregator->aggregator_identifier)); + dprintk("Port %d joined LAG %d(existing LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier); // mark this port as selected port->sm_vars |= AD_PORT_SELECTED; @@ -1454,9 +1458,9 @@ // mark this port as selected port->sm_vars |= AD_PORT_SELECTED; - BOND_PRINT_DBG(("Port %d joined LAG %d(new LAG)", port->actor_port_number, port->aggregator->aggregator_identifier)); + dprintk("Port %d joined LAG %d(new LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier); } else { - printk(KERN_ERR "bonding: Port %d (on %s) did not find a suitable aggregator\n", + printk(KERN_ERR DRV_NAME ": Port %d (on %s) did not find a suitable aggregator\n", port->actor_port_number, port->slave->dev->name); } } @@ -1580,30 +1584,30 @@ aggregator; aggregator = __get_next_agg(aggregator)) { - BOND_PRINT_DBG(("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d", + dprintk("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d\n", aggregator->aggregator_identifier, aggregator->num_of_ports, aggregator->actor_oper_aggregator_key, aggregator->partner_oper_aggregator_key, - aggregator->is_individual, aggregator->is_active)); + aggregator->is_individual, aggregator->is_active); } // check if any partner replys if (best_aggregator->is_individual) { - printk(KERN_WARNING "bonding: Warning: No 802.3ad response from the link partner " + printk(KERN_WARNING DRV_NAME ": Warning: No 802.3ad response from the link partner " "for any adapters in the bond\n"); } // check if there are more than one aggregator if (num_of_aggs > 1) { - BOND_PRINT_DBG(("Warning: More than one Link Aggregation Group was " - "found in the bond. Only one group will function in the bond")); + dprintk("Warning: More than one Link Aggregation Group was " + "found in the bond. Only one group will function in the bond\n"); } best_aggregator->is_active = 1; - BOND_PRINT_DBG(("LAG %d choosed as the active LAG", best_aggregator->aggregator_identifier)); - BOND_PRINT_DBG(("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d", + dprintk("LAG %d choosed as the active LAG\n", best_aggregator->aggregator_identifier); + dprintk("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d\n", best_aggregator->aggregator_identifier, best_aggregator->num_of_ports, best_aggregator->actor_oper_aggregator_key, best_aggregator->partner_oper_aggregator_key, - best_aggregator->is_individual, best_aggregator->is_active)); + best_aggregator->is_individual, best_aggregator->is_active); // disable the ports that were related to the former active_aggregator if (last_active_aggregator) { @@ -1644,7 +1648,7 @@ aggregator->lag_ports = NULL; aggregator->is_active = 0; aggregator->num_of_ports = 0; - BOND_PRINT_DBG(("LAG %d was cleared", aggregator->aggregator_identifier)); + dprintk("LAG %d was cleared\n", aggregator->aggregator_identifier); } } @@ -1729,7 +1733,7 @@ static void ad_enable_collecting_distributing(struct port *port) { if (port->aggregator->is_active) { - BOND_PRINT_DBG(("Enabling port %d(LAG %d)", port->actor_port_number, port->aggregator->aggregator_identifier)); + dprintk("Enabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier); __enable_port(port); } } @@ -1742,7 +1746,7 @@ static void ad_disable_collecting_distributing(struct port *port) { if (port->aggregator && MAC_ADDRESS_COMPARE(&(port->aggregator->partner_system), &(null_mac_addr))) { - BOND_PRINT_DBG(("Disabling port %d(LAG %d)", port->actor_port_number, port->aggregator->aggregator_identifier)); + dprintk("Disabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier); __disable_port(port); } } @@ -1780,7 +1784,7 @@ // send the marker information if (ad_marker_send(port, &marker) >= 0) { - BOND_PRINT_DBG(("Sent Marker Information on port %d", port->actor_port_number)); + dprintk("Sent Marker Information on port %d\n", port->actor_port_number); } } #endif @@ -1803,7 +1807,7 @@ // send the marker response if (ad_marker_send(port, &marker) >= 0) { - BOND_PRINT_DBG(("Sent Marker Response on port %d", port->actor_port_number)); + dprintk("Sent Marker Response on port %d\n", port->actor_port_number); } } @@ -1890,13 +1894,13 @@ void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast) { // check that the bond is not initialized yet - if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), &(bond->device->dev_addr))) { + if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), &(bond->dev->dev_addr))) { aggregator_identifier = 0; BOND_AD_INFO(bond).lacp_fast = lacp_fast; BOND_AD_INFO(bond).system.sys_priority = 0xFFFF; - BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->device->dev_addr); + BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr); // initialize how many times this module is called in one second(should be about every 100ms) ad_ticks_per_sec = tick_resolution; @@ -1921,7 +1925,7 @@ struct aggregator *aggregator; if (bond == NULL) { - printk(KERN_CRIT "The slave %s is not attached to its bond\n", slave->dev->name); + printk(KERN_ERR "The slave %s is not attached to its bond\n", slave->dev->name); return -1; } @@ -1964,7 +1968,7 @@ ad_initialize_agg(aggregator); - aggregator->aggregator_mac_address = *((struct mac_addr *)bond->device->dev_addr); + aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr); aggregator->aggregator_identifier = (++aggregator_identifier); aggregator->slave = slave; aggregator->is_active = 0; @@ -1996,11 +2000,11 @@ // if slave is null, the whole port is not initialized if (!port->slave) { - printk(KERN_WARNING "bonding: Trying to unbind an uninitialized port on %s\n", slave->dev->name); + printk(KERN_WARNING DRV_NAME ": Trying to unbind an uninitialized port on %s\n", slave->dev->name); return; } - BOND_PRINT_DBG(("Unbinding Link Aggregation Group %d", aggregator->aggregator_identifier)); + dprintk("Unbinding Link Aggregation Group %d\n", aggregator->aggregator_identifier); /* Tell the partner that this port is not suitable for aggregation */ port->actor_oper_port_state &= ~AD_STATE_AGGREGATION; @@ -2024,10 +2028,10 @@ // if new aggregator found, copy the aggregator's parameters // and connect the related lag_ports to the new aggregator if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) { - BOND_PRINT_DBG(("Some port(s) related to LAG %d - replaceing with LAG %d", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier)); + dprintk("Some port(s) related to LAG %d - replaceing with LAG %d\n", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier); if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) { - printk(KERN_INFO "bonding: Removing an active aggregator\n"); + printk(KERN_INFO DRV_NAME ": Removing an active aggregator\n"); // select new active aggregator select_new_active_agg = 1; } @@ -2057,7 +2061,7 @@ ad_agg_selection_logic(__get_first_agg(port)); } } else { - printk(KERN_WARNING "bonding: Warning: unbinding aggregator, " + printk(KERN_WARNING DRV_NAME ": Warning: unbinding aggregator, " "and could not find a new aggregator for its ports\n"); } } else { // in case that the only port related to this aggregator is the one we want to remove @@ -2072,7 +2076,7 @@ } } - BOND_PRINT_DBG(("Unbinding port %d", port->actor_port_number)); + dprintk("Unbinding port %d\n", port->actor_port_number); // find the aggregator that this port is connected to temp_aggregator = __get_first_agg(port); for (; temp_aggregator; temp_aggregator = __get_next_agg(temp_aggregator)) { @@ -2123,13 +2127,13 @@ read_lock(&bond->lock); - //check if there are any slaves - if (bond->next == (struct slave *)bond) { - goto end; + if (bond->kill_timers) { + goto out; } - if ((bond->device->flags & IFF_UP) != IFF_UP) { - goto end; + //check if there are any slaves + if (bond->slave_cnt == 0) { + goto re_arm; } // check if agg_select_timer timer after initialize is timed out @@ -2137,8 +2141,8 @@ // select the active aggregator for the bond if ((port = __get_first_port(bond))) { if (!port->slave) { - printk(KERN_WARNING "bonding: Warning: bond's first port is uninitialized\n"); - goto end; + printk(KERN_WARNING DRV_NAME ": Warning: bond's first port is uninitialized\n"); + goto re_arm; } aggregator = __get_first_agg(port); @@ -2149,8 +2153,8 @@ // for each port run the state machines for (port = __get_first_port(bond); port; port = __get_next_port(port)) { if (!port->slave) { - printk(KERN_WARNING "bonding: Warning: Found an uninitialized port\n"); - goto end; + printk(KERN_WARNING DRV_NAME ": Warning: Found an uninitialized port\n"); + goto re_arm; } ad_rx_machine(NULL, port); @@ -2165,14 +2169,10 @@ } } -end: +re_arm: + mod_timer(&(BOND_AD_INFO(bond).ad_timer), jiffies + ad_delta_in_ticks); +out: read_unlock(&bond->lock); - - - if ((bond->device->flags & IFF_UP) == IFF_UP) { - /* re-arm the timer */ - mod_timer(&(BOND_AD_INFO(bond).ad_timer), jiffies + (AD_TIMER_INTERVAL * HZ / 1000)); - } } /** @@ -2194,14 +2194,14 @@ port = &(SLAVE_AD_INFO(slave).port); if (!port->slave) { - printk(KERN_WARNING "bonding: Warning: port of slave %s is uninitialized\n", slave->dev->name); + printk(KERN_WARNING DRV_NAME ": Warning: port of slave %s is uninitialized\n", slave->dev->name); return; } switch (lacpdu->subtype) { case AD_TYPE_LACPDU: __ntohs_lacpdu(lacpdu); - BOND_PRINT_DBG(("Received LACPDU on port %d", port->actor_port_number)); + dprintk("Received LACPDU on port %d\n", port->actor_port_number); ad_rx_machine(lacpdu, port); break; @@ -2210,17 +2210,17 @@ switch (((struct marker *)lacpdu)->tlv_type) { case AD_MARKER_INFORMATION_SUBTYPE: - BOND_PRINT_DBG(("Received Marker Information on port %d", port->actor_port_number)); + dprintk("Received Marker Information on port %d\n", port->actor_port_number); ad_marker_info_received((struct marker *)lacpdu, port); break; case AD_MARKER_RESPONSE_SUBTYPE: - BOND_PRINT_DBG(("Received Marker Response on port %d", port->actor_port_number)); + dprintk("Received Marker Response on port %d\n", port->actor_port_number); ad_marker_response_received((struct marker *)lacpdu, port); break; default: - BOND_PRINT_DBG(("Received an unknown Marker subtype on slot %d", port->actor_port_number)); + dprintk("Received an unknown Marker subtype on slot %d\n", port->actor_port_number); } } } @@ -2240,14 +2240,14 @@ // if slave is null, the whole port is not initialized if (!port->slave) { - printk(KERN_WARNING "bonding: Warning: speed changed for uninitialized port on %s\n", + printk(KERN_WARNING DRV_NAME ": Warning: speed changed for uninitialized port on %s\n", slave->dev->name); return; } port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS; port->actor_oper_port_key=port->actor_admin_port_key |= (__get_link_speed(port) << 1); - BOND_PRINT_DBG(("Port %d changed speed", port->actor_port_number)); + dprintk("Port %d changed speed\n", port->actor_port_number); // there is no need to reselect a new aggregator, just signal the // state machines to reinitialize port->sm_vars |= AD_PORT_BEGIN; @@ -2267,14 +2267,14 @@ // if slave is null, the whole port is not initialized if (!port->slave) { - printk(KERN_WARNING "bonding: Warning: duplex changed for uninitialized port on %s\n", + printk(KERN_WARNING DRV_NAME ": Warning: duplex changed for uninitialized port on %s\n", slave->dev->name); return; } port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; port->actor_oper_port_key=port->actor_admin_port_key |= __get_duplex(port); - BOND_PRINT_DBG(("Port %d changed duplex", port->actor_port_number)); + dprintk("Port %d changed duplex\n", port->actor_port_number); // there is no need to reselect a new aggregator, just signal the // state machines to reinitialize port->sm_vars |= AD_PORT_BEGIN; @@ -2295,10 +2295,8 @@ // if slave is null, the whole port is not initialized if (!port->slave) { -#ifdef BONDING_DEBUG - printk(KERN_WARNING "bonding: Warning: link status changed for uninitialized port on %s\n", - slave->dev->name); -#endif + printk(KERN_WARNING DRV_NAME ": Warning: link status changed for uninitialized port on %s\n", + slave->dev->name); return; } @@ -2356,41 +2354,27 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev) { - slave_t *slave, *start_at; - struct bonding *bond = (struct bonding *) dev->priv; + struct slave *slave, *start_at; + struct bonding *bond = dev->priv; struct ethhdr *data = (struct ethhdr *)skb->data; int slave_agg_no; int slaves_in_agg; int agg_id; + int i; struct ad_info ad_info; - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; - } - - if (bond == NULL) { - printk(KERN_CRIT "bonding: Error: bond is NULL on device %s\n", dev->name); - dev_kfree_skb(skb); - return 0; - } - + /* make sure that the slaves list will + * not change during tx + */ read_lock(&bond->lock); - slave = bond->prev; - /* check if bond is empty */ - if ((slave == (struct slave *) bond) || (bond->slave_cnt == 0)) { - printk(KERN_DEBUG "ERROR: bond is empty\n"); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; + if (!BOND_IS_OK(bond)) { + goto free_out; } if (bond_3ad_get_active_agg_info(bond, &ad_info)) { printk(KERN_DEBUG "ERROR: bond_3ad_get_active_agg_info failed\n"); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; + goto free_out; } slaves_in_agg = ad_info.ports; @@ -2399,21 +2383,12 @@ if (slaves_in_agg == 0) { /*the aggregator is empty*/ printk(KERN_DEBUG "ERROR: active aggregator is empty\n"); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; + goto free_out; } - /* we're at the root, get the first slave */ - if ((slave == NULL) || (slave->dev == NULL)) { - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; - } + slave_agg_no = (data->h_dest[5]^bond->dev->dev_addr[5]) % slaves_in_agg; - slave_agg_no = (data->h_dest[5]^slave->dev->dev_addr[5]) % slaves_in_agg; - while (slave != (slave_t *)bond) { + bond_for_each_slave(bond, slave, i) { struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; if (agg && (agg->aggregator_identifier == agg_id)) { @@ -2422,37 +2397,18 @@ break; } } - - slave = slave->prev; - if (slave == NULL) { - printk(KERN_ERR "bonding: Error: slave is NULL\n"); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; - } } - if (slave == (slave_t *)bond) { - printk(KERN_ERR "bonding: Error: Couldn't find a slave to tx on for aggregator ID %d\n", agg_id); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; + if (slave_agg_no >= 0) { + printk(KERN_ERR DRV_NAME ": Error: Couldn't find a slave to tx on for aggregator ID %d\n", agg_id); + goto free_out; } start_at = slave; - do { + bond_for_each_slave_from(bond, slave, i, start_at) { int slave_agg_id = 0; - struct aggregator *agg; - - if (slave == NULL) { - printk(KERN_ERR "bonding: Error: slave is NULL\n"); - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; - } - - agg = SLAVE_AD_INFO(slave).port.aggregator; + struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; if (agg) { slave_agg_id = agg->aggregator_identifier; @@ -2463,20 +2419,24 @@ skb->dev = slave->dev; skb->priority = 1; dev_queue_xmit(skb); - read_unlock(&bond->lock); - return 0; + + goto out; } - } while ((slave = slave->next) != start_at); + } - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); +out: read_unlock(&bond->lock); return 0; + +free_out: + /* no suitable interface, frame not sent */ + dev_kfree_skb(skb); + goto out; } int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype) { - struct bonding *bond = (struct bonding *)dev->priv; + struct bonding *bond = dev->priv; struct slave *slave = NULL; int ret = NET_RX_DROP; diff -Nru a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h --- a/drivers/net/bonding/bond_3ad.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/bonding/bond_3ad.h Tue Feb 17 20:00:08 2004 @@ -28,6 +28,9 @@ * 2003/05/01 - Shmulik Hen * - Renamed bond_3ad_link_status_changed() to * bond_3ad_handle_link_change() for compatibility with TLB. + * + * 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes */ #ifndef __BOND_3AD_H__ diff -Nru a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c --- a/drivers/net/bonding/bond_alb.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/bonding/bond_alb.c Tue Feb 17 20:00:07 2004 @@ -28,8 +28,13 @@ * 2003/08/06 - Amir Noam * - Add support for setting bond's MAC address with special * handling required for ALB/TLB. + * + * 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes */ +//#define BONDING_DEBUG 1 + #include #include #include @@ -50,11 +55,11 @@ #define ALB_TIMER_TICKS_PER_SEC 10 /* should be a divisor of HZ */ -#define BOND_TLB_REBALANCE_INTERVAL 10 /* in seconds, periodic re-balancing - * used for division - never set +#define BOND_TLB_REBALANCE_INTERVAL 10 /* In seconds, periodic re-balancing. + * Used for division - never set * to zero !!! */ -#define BOND_ALB_LP_INTERVAL 1 /* in seconds periodic send of +#define BOND_ALB_LP_INTERVAL 1 /* In seconds, periodic send of * learning packets to the switch */ @@ -66,7 +71,7 @@ #define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table. * Note that this value MUST NOT be smaller - * because the key hash table BYTE wide ! + * because the key hash table is BYTE wide ! */ @@ -86,12 +91,15 @@ */ #define RLB_PROMISC_TIMEOUT 10*ALB_TIMER_TICKS_PER_SEC +static const u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; +static const int alb_delta_in_ticks = HZ / ALB_TIMER_TICKS_PER_SEC; + #pragma pack(1) struct learning_pkt { u8 mac_dst[ETH_ALEN]; u8 mac_src[ETH_ALEN]; u16 type; - u8 padding[ETH_ZLEN - (2*ETH_ALEN + 2)]; + u8 padding[ETH_ZLEN - ETH_HLEN]; }; struct arp_pkt { @@ -110,13 +118,12 @@ /* Forward declaration */ static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]); -static inline u8 -_simple_hash(u8 *hash_start, int hash_size) +static inline u8 _simple_hash(u8 *hash_start, int hash_size) { int i; u8 hash = 0; - for (i=0; iload_history = 1 + entry->tx_bytes / - BOND_TLB_REBALANCE_INTERVAL; + BOND_TLB_REBALANCE_INTERVAL; entry->tx_bytes = 0; } + entry->tx_slave = NULL; entry->next = TLB_NULL_INDEX; entry->prev = TLB_NULL_INDEX; } -static inline void -tlb_init_slave(struct slave *slave) +static inline void tlb_init_slave(struct slave *slave) { - struct tlb_slave_info *slave_info = &(SLAVE_TLB_INFO(slave)); - - slave_info->load = 0; - slave_info->head = TLB_NULL_INDEX; + SLAVE_TLB_INFO(slave).load = 0; + SLAVE_TLB_INFO(slave).head = TLB_NULL_INDEX; } /* Caller must hold bond lock for read */ -static inline void -tlb_clear_slave(struct bonding *bond, struct slave *slave, u8 save_load) +static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_load) { - struct tlb_client_info *tx_hash_table = NULL; - u32 index, next_index; + struct tlb_client_info *tx_hash_table; + u32 index; - /* clear slave from tx_hashtbl */ _lock_tx_hashtbl(bond); + + /* clear slave from tx_hashtbl */ tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl; - if (tx_hash_table) { - index = SLAVE_TLB_INFO(slave).head; - while (index != TLB_NULL_INDEX) { - next_index = tx_hash_table[index].next; - tlb_init_table_entry(bond, index, save_load); - index = next_index; - } + index = SLAVE_TLB_INFO(slave).head; + while (index != TLB_NULL_INDEX) { + u32 next_index = tx_hash_table[index].next; + tlb_init_table_entry(&tx_hash_table[index], save_load); + index = next_index; } + _unlock_tx_hashtbl(bond); tlb_init_slave(slave); } /* Must be called before starting the monitor timer */ -static int -tlb_initialize(struct bonding *bond) +static int tlb_initialize(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); + int size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info); int i; - size_t size; - -#if(TLB_HASH_TABLE_SIZE != 256) - /* Key to the hash table is byte wide. Check the size! */ - #error Hash Table size is wrong. -#endif spin_lock_init(&(bond_info->tx_hashtbl_lock)); _lock_tx_hashtbl(bond); - if (bond_info->tx_hashtbl != NULL) { - printk (KERN_ERR "%s: TLB hash table is not NULL\n", - bond->device->name); - _unlock_tx_hashtbl(bond); - return -1; - } - size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info); bond_info->tx_hashtbl = kmalloc(size, GFP_KERNEL); - if (bond_info->tx_hashtbl == NULL) { - printk (KERN_ERR "%s: Failed to allocate TLB hash table\n", - bond->device->name); + if (!bond_info->tx_hashtbl) { + printk(KERN_ERR DRV_NAME + ": Error: %s: Failed to allocate TLB hash table\n", + bond->dev->name); _unlock_tx_hashtbl(bond); return -1; } memset(bond_info->tx_hashtbl, 0, size); - for (i=0; itx_hashtbl[i], 1); } + _unlock_tx_hashtbl(bond); return 0; } /* Must be called only after all slaves have been released */ -static void -tlb_deinitialize(struct bonding *bond) +static void tlb_deinitialize(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); _lock_tx_hashtbl(bond); - if (bond_info->tx_hashtbl == NULL) { - _unlock_tx_hashtbl(bond); - return; - } + kfree(bond_info->tx_hashtbl); bond_info->tx_hashtbl = NULL; + _unlock_tx_hashtbl(bond); } /* Caller must hold bond lock for read */ -static struct slave* -tlb_get_least_loaded_slave(struct bonding *bond) +static struct slave *tlb_get_least_loaded_slave(struct bonding *bond) { - struct slave *slave; - struct slave *least_loaded; - s64 curr_gap, max_gap; + struct slave *slave, *least_loaded; + s64 max_gap; + int i, found = 0; /* Find the first enabled slave */ - slave = bond_get_first_slave(bond); - while (slave) { + bond_for_each_slave(bond, slave, i) { if (SLAVE_IS_OK(slave)) { + found = 1; break; } - slave = bond_get_next_slave(bond, slave); } - if (!slave) { + if (!found) { return NULL; } least_loaded = slave; - max_gap = (s64)(slave->speed * 1000000) - - (s64)(SLAVE_TLB_INFO(slave).load * 8); + max_gap = (s64)(slave->speed << 20) - /* Convert to Megabit per sec */ + (s64)(SLAVE_TLB_INFO(slave).load << 3); /* Bytes to bits */ /* Find the slave with the largest gap */ - slave = bond_get_next_slave(bond, slave); - while (slave) { + bond_for_each_slave_from(bond, slave, i, least_loaded) { if (SLAVE_IS_OK(slave)) { - curr_gap = (s64)(slave->speed * 1000000) - - (s64)(SLAVE_TLB_INFO(slave).load * 8); - if (max_gap < curr_gap) { + s64 gap = (s64)(slave->speed << 20) - + (s64)(SLAVE_TLB_INFO(slave).load << 3); + if (max_gap < gap) { least_loaded = slave; - max_gap = curr_gap; + max_gap = gap; } } - slave = bond_get_next_slave(bond, slave); } return least_loaded; } /* Caller must hold bond lock for read */ -struct slave* -tlb_choose_channel(struct bonding *bond, u32 hash_index, u32 skb_len) +struct slave *tlb_choose_channel(struct bonding *bond, u32 hash_index, u32 skb_len) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - struct tlb_client_info *hash_table = NULL; - struct slave *assigned_slave = NULL; + struct tlb_client_info *hash_table; + struct slave *assigned_slave; _lock_tx_hashtbl(bond); hash_table = bond_info->tx_hashtbl; - if (hash_table == NULL) { - printk (KERN_ERR "%s: TLB hash table is NULL\n", - bond->device->name); - _unlock_tx_hashtbl(bond); - return NULL; - } - assigned_slave = hash_table[hash_index].tx_slave; if (!assigned_slave) { assigned_slave = tlb_get_least_loaded_slave(bond); @@ -345,14 +310,12 @@ } /*********************** rlb specific functions ***************************/ -static inline void -_lock_rx_hashtbl(struct bonding *bond) +static inline void _lock_rx_hashtbl(struct bonding *bond) { spin_lock(&(BOND_ALB_INFO(bond).rx_hashtbl_lock)); } -static inline void -_unlock_rx_hashtbl(struct bonding *bond) +static inline void _unlock_rx_hashtbl(struct bonding *bond) { spin_unlock(&(BOND_ALB_INFO(bond).rx_hashtbl_lock)); } @@ -360,26 +323,20 @@ /* when an ARP REPLY is received from a client update its info * in the rx_hashtbl */ -static void -rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp) +static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp) { - u32 hash_index; - struct rlb_client_info *client_info = NULL; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); + struct rlb_client_info *client_info; + u32 hash_index; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } - hash_index = _simple_hash((u8*)&(arp->ip_src), 4); + hash_index = _simple_hash((u8*)&(arp->ip_src), sizeof(arp->ip_src)); client_info = &(bond_info->rx_hashtbl[hash_index]); if ((client_info->assigned) && (client_info->ip_src == arp->ip_dst) && (client_info->ip_dst == arp->ip_src)) { - /* update the clients MAC address */ memcpy(client_info->mac_dst, arp->mac_src, ETH_ALEN); client_info->ntt = 1; @@ -389,66 +346,60 @@ _unlock_rx_hashtbl(bond); } -static int -rlb_arp_recv(struct sk_buff *skb, - struct net_device *dev, - struct packet_type* ptype) +static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct packet_type *ptype) { - struct bonding *bond = (struct bonding *)dev->priv; - int ret = NET_RX_DROP; + struct bonding *bond = bond_dev->priv; struct arp_pkt *arp = (struct arp_pkt *)skb->data; + int res = NET_RX_DROP; - if (!(dev->flags & IFF_MASTER)) { + if (!(bond_dev->flags & IFF_MASTER)) { goto out; } if (!arp) { - printk(KERN_ERR "Packet has no ARP data\n"); + dprintk("Packet has no ARP data\n"); goto out; } if (skb->len < sizeof(struct arp_pkt)) { - printk(KERN_ERR "Packet is too small to be an ARP\n"); + dprintk("Packet is too small to be an ARP\n"); goto out; } if (arp->op_code == htons(ARPOP_REPLY)) { /* update rx hash table for this ARP */ rlb_update_entry_from_arp(bond, arp); - BOND_PRINT_DBG(("Server received an ARP Reply from client")); + dprintk("Server received an ARP Reply from client\n"); } - ret = NET_RX_SUCCESS; + res = NET_RX_SUCCESS; out: dev_kfree_skb(skb); - return ret; + return res; } /* Caller must hold bond lock for read */ -static struct slave* -rlb_next_rx_slave(struct bonding *bond) +static struct slave *rlb_next_rx_slave(struct bonding *bond) { - struct slave *rx_slave = NULL, *slave = NULL; - unsigned int i = 0; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); + struct slave *rx_slave, *slave, *start_at; + int i = 0; - slave = bond_info->next_rx_slave; - if (slave == NULL) { - slave = bond->next; + if (bond_info->next_rx_slave) { + start_at = bond_info->next_rx_slave; + } else { + start_at = bond->first_slave; } - /* this loop uses the circular linked list property of the - * slave's list to go through all slaves - */ - for (i = 0; i < bond->slave_cnt; i++, slave = slave->next) { + rx_slave = NULL; + bond_for_each_slave_from(bond, slave, i, start_at) { if (SLAVE_IS_OK(slave)) { if (!rx_slave) { rx_slave = slave; - } - else if (slave->speed > rx_slave->speed) { + } else if (slave->speed > rx_slave->speed) { rx_slave = slave; } } @@ -464,48 +415,41 @@ /* teach the switch the mac of a disabled slave * on the primary for fault tolerance * - * Caller must hold bond->ptrlock for write or bond lock for write + * Caller must hold bond->curr_slave_lock for write or bond lock for write */ -static void -rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[]) +static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[]) { - if (!bond->current_slave) { + if (!bond->curr_active_slave) { return; } + if (!bond->alb_info.primary_is_promisc) { bond->alb_info.primary_is_promisc = 1; - dev_set_promiscuity(bond->current_slave->dev, 1); + dev_set_promiscuity(bond->curr_active_slave->dev, 1); } + bond->alb_info.rlb_promisc_timeout_counter = 0; - alb_send_learning_packets(bond->current_slave, addr); + alb_send_learning_packets(bond->curr_active_slave, addr); } /* slave being removed should not be active at this point * * Caller must hold bond lock for read */ -static void -rlb_clear_slave(struct bonding *bond, struct slave *slave) +static void rlb_clear_slave(struct bonding *bond, struct slave *slave) { - struct rlb_client_info *rx_hash_table = NULL; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + struct rlb_client_info *rx_hash_table; u32 index, next_index; /* clear slave from rx_hashtbl */ _lock_rx_hashtbl(bond); - rx_hash_table = bond_info->rx_hashtbl; - - if (rx_hash_table == NULL) { - _unlock_rx_hashtbl(bond); - return; - } + rx_hash_table = bond_info->rx_hashtbl; index = bond_info->rx_hashtbl_head; for (; index != RLB_NULL_INDEX; index = next_index) { next_index = rx_hash_table[index].next; - if (rx_hash_table[index].slave == slave) { struct slave *assigned_slave = rlb_next_rx_slave(bond); @@ -533,23 +477,24 @@ _unlock_rx_hashtbl(bond); - write_lock(&bond->ptrlock); - if (slave != bond->current_slave) { + write_lock(&bond->curr_slave_lock); + + if (slave != bond->curr_active_slave) { rlb_teach_disabled_mac_on_primary(bond, slave->dev->dev_addr); } - write_unlock(&bond->ptrlock); + + write_unlock(&bond->curr_slave_lock); } -static void -rlb_update_client(struct rlb_client_info *client_info) +static void rlb_update_client(struct rlb_client_info *client_info) { - int i = 0; + int i; - if (client_info->slave == NULL) { + if (!client_info->slave) { return; } - for (i=0; iip_dst, client_info->slave->dev, @@ -561,20 +506,14 @@ } /* sends ARP REPLIES that update the clients that need updating */ -static void -rlb_update_rx_clients(struct bonding *bond) +static void rlb_update_rx_clients(struct bonding *bond) { - u32 hash_index; - struct rlb_client_info *client_info = NULL; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); + struct rlb_client_info *client_info; + u32 hash_index; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } - hash_index = bond_info->rx_hashtbl_head; for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) { client_info = &(bond_info->rx_hashtbl[hash_index]); @@ -595,22 +534,15 @@ } /* The slave was assigned a new mac address - update the clients */ -static void -rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave) +static void rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave) { - u32 hash_index; - u8 ntt = 0; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - struct rlb_client_info* client_info = NULL; + struct rlb_client_info *client_info; + int ntt = 0; + u32 hash_index; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } - hash_index = bond_info->rx_hashtbl_head; for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) { client_info = &(bond_info->rx_hashtbl[hash_index]); @@ -633,37 +565,31 @@ } /* mark all clients using src_ip to be updated */ -static void -rlb_req_update_subnet_clients(struct bonding *bond, u32 src_ip) +static void rlb_req_update_subnet_clients(struct bonding *bond, u32 src_ip) { - u32 hash_index; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - struct rlb_client_info *client_info = NULL; + struct rlb_client_info *client_info; + u32 hash_index; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } - hash_index = bond_info->rx_hashtbl_head; for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) { client_info = &(bond_info->rx_hashtbl[hash_index]); if (!client_info->slave) { - printk(KERN_ERR "Bonding: Error: found a client with no" - " channel in the client's hash table\n"); + printk(KERN_ERR DRV_NAME + ": Error: found a client with no channel in " + "the client's hash table\n"); continue; } /*update all clients using this src_ip, that are not assigned - * to the team's address (current_slave) and have a known + * to the team's address (curr_active_slave) and have a known * unicast mac address. */ if ((client_info->ip_src == src_ip) && memcmp(client_info->slave->dev->dev_addr, - bond->device->dev_addr, ETH_ALEN) && + bond->dev->dev_addr, ETH_ALEN) && memcmp(client_info->mac_dst, mac_bcast, ETH_ALEN)) { client_info->ntt = 1; bond_info->rx_ntt = 1; @@ -674,30 +600,22 @@ } /* Caller must hold both bond and ptr locks for read */ -struct slave* -rlb_choose_channel(struct bonding *bond, struct arp_pkt *arp) +struct slave *rlb_choose_channel(struct bonding *bond, struct arp_pkt *arp) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - struct rlb_client_info *client_info = NULL; + struct slave *assigned_slave; + struct rlb_client_info *client_info; u32 hash_index = 0; - struct slave *assigned_slave = NULL; - u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return NULL; - } - - hash_index = _simple_hash((u8 *)&arp->ip_dst, 4); + hash_index = _simple_hash((u8 *)&arp->ip_dst, sizeof(arp->ip_src)); client_info = &(bond_info->rx_hashtbl[hash_index]); - if (client_info->assigned == 1) { + if (client_info->assigned) { if ((client_info->ip_src == arp->ip_src) && (client_info->ip_dst == arp->ip_dst)) { /* the entry is already assigned to this client */ - if (memcmp(arp->mac_dst, mac_bcast, ETH_ALEN)) { /* update mac address from arp */ memcpy(client_info->mac_dst, arp->mac_dst, ETH_ALEN); @@ -710,12 +628,12 @@ } } else { /* the entry is already assigned to some other client, - * move the old client to primary (current_slave) so + * move the old client to primary (curr_active_slave) so * that the new client can be assigned to this entry. */ - if (bond->current_slave && - client_info->slave != bond->current_slave) { - client_info->slave = bond->current_slave; + if (bond->curr_active_slave && + client_info->slave != bond->curr_active_slave) { + client_info->slave = bond->curr_active_slave; rlb_update_client(client_info); } } @@ -736,8 +654,7 @@ if (memcmp(client_info->mac_dst, mac_bcast, ETH_ALEN)) { client_info->ntt = 1; bond->alb_info.rx_ntt = 1; - } - else { + } else { client_info->ntt = 0; } @@ -760,10 +677,9 @@ /* chooses (and returns) transmit channel for arp reply * does not choose channel for other arp types since they are - * sent on the current_slave + * sent on the curr_active_slave */ -static struct slave* -rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) +static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) { struct arp_pkt *arp = (struct arp_pkt *)skb->nh.raw; struct slave *tx_slave = NULL; @@ -776,9 +692,8 @@ if (tx_slave) { memcpy(arp->mac_src,tx_slave->dev->dev_addr, ETH_ALEN); } - BOND_PRINT_DBG(("Server sent ARP Reply packet")); + dprintk("Server sent ARP Reply packet\n"); } else if (arp->op_code == __constant_htons(ARPOP_REQUEST)) { - /* Create an entry in the rx_hashtbl for this client as a * place holder. * When the arp reply is received the entry will be updated @@ -797,34 +712,29 @@ * updated with their assigned mac. */ rlb_req_update_subnet_clients(bond, arp->ip_src); - BOND_PRINT_DBG(("Server sent ARP Request packet")); + dprintk("Server sent ARP Request packet\n"); } return tx_slave; } /* Caller must hold bond lock for read */ -static void -rlb_rebalance(struct bonding *bond) +static void rlb_rebalance(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - struct slave *assigned_slave = NULL; + struct slave *assigned_slave; + struct rlb_client_info *client_info; + int ntt; u32 hash_index; - struct rlb_client_info *client_info = NULL; - u8 ntt = 0; _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } - + ntt = 0; hash_index = bond_info->rx_hashtbl_head; for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) { client_info = &(bond_info->rx_hashtbl[hash_index]); assigned_slave = rlb_next_rx_slave(bond); - if (assigned_slave && (client_info->slave != assigned_slave)){ + if (assigned_slave && (client_info->slave != assigned_slave)) { client_info->slave = assigned_slave; client_info->ntt = 1; ntt = 1; @@ -839,96 +749,83 @@ } /* Caller must hold rx_hashtbl lock */ -static inline void -rlb_init_table_entry(struct rlb_client_info *entry) +static void rlb_init_table_entry(struct rlb_client_info *entry) { + memset(entry, 0, sizeof(struct rlb_client_info)); entry->next = RLB_NULL_INDEX; entry->prev = RLB_NULL_INDEX; - entry->assigned = 0; - entry->ntt = 0; } -static int -rlb_initialize(struct bonding *bond) +static int rlb_initialize(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); struct packet_type *pk_type = &(BOND_ALB_INFO(bond).rlb_pkt_type); + int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info); int i; - size_t size; spin_lock_init(&(bond_info->rx_hashtbl_lock)); _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl != NULL) { - printk (KERN_ERR "%s: RLB hash table is not NULL\n", - bond->device->name); - _unlock_rx_hashtbl(bond); - return -1; - } - size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info); bond_info->rx_hashtbl = kmalloc(size, GFP_KERNEL); - if (bond_info->rx_hashtbl == NULL) { - printk (KERN_ERR "%s: Failed to allocate" - " RLB hash table\n", bond->device->name); + if (!bond_info->rx_hashtbl) { + printk(KERN_ERR DRV_NAME + ": Error: %s: Failed to allocate RLB hash table\n", + bond->dev->name); _unlock_rx_hashtbl(bond); return -1; } bond_info->rx_hashtbl_head = RLB_NULL_INDEX; - for (i=0; irx_hashtbl + i); } - _unlock_rx_hashtbl(bond); - /* register to receive ARPs */ + _unlock_rx_hashtbl(bond); /*initialize packet type*/ pk_type->type = __constant_htons(ETH_P_ARP); - pk_type->dev = bond->device; + pk_type->dev = bond->dev; pk_type->func = rlb_arp_recv; + /* register to receive ARPs */ dev_add_pack(pk_type); return 0; } -static void -rlb_deinitialize(struct bonding *bond) +static void rlb_deinitialize(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); dev_remove_pack(&(bond_info->rlb_pkt_type)); _lock_rx_hashtbl(bond); - if (bond_info->rx_hashtbl == NULL) { - _unlock_rx_hashtbl(bond); - return; - } + kfree(bond_info->rx_hashtbl); bond_info->rx_hashtbl = NULL; + _unlock_rx_hashtbl(bond); } /*********************** tlb/rlb shared functions *********************/ -static void -alb_send_learning_packets(struct slave *slave, u8 mac_addr[]) +static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]) { - struct sk_buff *skb = NULL; struct learning_pkt pkt; - char *data = NULL; + int size = sizeof(struct learning_pkt); int i; - unsigned int size = sizeof(struct learning_pkt); memset(&pkt, 0, size); memcpy(pkt.mac_dst, mac_addr, ETH_ALEN); memcpy(pkt.mac_src, mac_addr, ETH_ALEN); pkt.type = __constant_htons(ETH_P_LOOP); - for (i=0; i < MAX_LP_RETRY; i++) { - skb = NULL; + for (i = 0; i < MAX_LP_RETRY; i++) { + struct sk_buff *skb; + char *data; + skb = dev_alloc_skb(size); if (!skb) { return; @@ -936,28 +833,26 @@ data = skb_put(skb, size); memcpy(data, &pkt, size); + skb->mac.raw = data; skb->nh.raw = data + ETH_HLEN; skb->protocol = pkt.type; skb->priority = TC_PRIO_CONTROL; skb->dev = slave->dev; + dev_queue_xmit(skb); } - } /* hw is a boolean parameter that determines whether we should try and * set the hw address of the device as well as the hw address of the * net_device */ -static int -alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw) +static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw) { - struct net_device *dev = NULL; + struct net_device *dev = slave->dev; struct sockaddr s_addr; - dev = slave->dev; - if (!hw) { memcpy(dev->dev_addr, addr, dev->addr_len); return 0; @@ -968,26 +863,23 @@ memcpy(s_addr.sa_data, addr, dev->addr_len); s_addr.sa_family = dev->type; if (dev->set_mac_address(dev, &s_addr)) { - printk(KERN_DEBUG "bonding: Error: alb_set_slave_mac_addr:" - " dev->set_mac_address of dev %s failed!" - " ALB mode requires that the base driver" - " support setting the hw address also when" - " the network device's interface is open\n", - dev->name); + printk(KERN_ERR DRV_NAME + ": Error: dev->set_mac_address of dev %s failed! ALB " + "mode requires that the base driver support setting " + "the hw address also when the network device's " + "interface is open\n", + dev->name); return -EOPNOTSUPP; } return 0; } -/* Caller must hold bond lock for write or ptrlock for write*/ -static void -alb_swap_mac_addr(struct bonding *bond, - struct slave *slave1, - struct slave *slave2) +/* Caller must hold bond lock for write or curr_slave_lock for write*/ +static void alb_swap_mac_addr(struct bonding *bond, struct slave *slave1, struct slave *slave2) { - u8 tmp_mac_addr[ETH_ALEN]; struct slave *disabled_slave = NULL; - u8 slaves_state_differ; + u8 tmp_mac_addr[ETH_ALEN]; + int slaves_state_differ; slaves_state_differ = (SLAVE_IS_OK(slave1) != SLAVE_IS_OK(slave2)); @@ -1004,8 +896,7 @@ */ rlb_req_update_slave_clients(bond, slave1); } - } - else { + } else { disabled_slave = slave1; } @@ -1017,15 +908,14 @@ */ rlb_req_update_slave_clients(bond, slave2); } - } - else { + } else { disabled_slave = slave2; } if (bond->alb_info.rlb_enabled && slaves_state_differ) { - /* A disabled slave was assigned an active mac addr */ - rlb_teach_disabled_mac_on_primary(bond, - disabled_slave->dev->dev_addr); + /* A disabled slave was assigned an active mac addr */ + rlb_teach_disabled_mac_on_primary(bond, + disabled_slave->dev->dev_addr); } } @@ -1043,10 +933,8 @@ * * Caller must hold bond lock */ -static void -alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave) +static void alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave) { - struct slave *tmp_slave; int perm_curr_diff; int perm_bond_diff; @@ -1054,20 +942,23 @@ slave->dev->dev_addr, ETH_ALEN); perm_bond_diff = memcmp(slave->perm_hwaddr, - bond->device->dev_addr, + bond->dev->dev_addr, ETH_ALEN); + if (perm_curr_diff && perm_bond_diff) { - tmp_slave = bond_get_first_slave(bond); - while (tmp_slave) { + struct slave *tmp_slave; + int i, found = 0; + + bond_for_each_slave(bond, tmp_slave, i) { if (!memcmp(slave->perm_hwaddr, - tmp_slave->dev->dev_addr, - ETH_ALEN)) { + tmp_slave->dev->dev_addr, + ETH_ALEN)) { + found = 1; break; } - tmp_slave = bond_get_next_slave(bond, tmp_slave); } - if (tmp_slave) { + if (found) { alb_swap_mac_addr(bond, slave, tmp_slave); } } @@ -1098,10 +989,10 @@ * caller must hold the bond lock for write since the mac addresses are compared * and may be swapped. */ -static int -alb_handle_addr_collision_on_attach(struct bonding *bond, struct slave *slave) +static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slave *slave) { - struct slave *tmp_slave1, *tmp_slave2; + struct slave *tmp_slave1, *tmp_slave2, *free_mac_slave; + int i, j, found = 0; if (bond->slave_cnt == 0) { /* this is the first slave */ @@ -1112,65 +1003,68 @@ * check uniqueness of slave's mac address against the other * slaves in the bond. */ - if (memcmp(slave->perm_hwaddr, bond->device->dev_addr, ETH_ALEN)) { - tmp_slave1 = bond_get_first_slave(bond); - for (; tmp_slave1; tmp_slave1 = bond_get_next_slave(bond, tmp_slave1)) { + if (memcmp(slave->perm_hwaddr, bond->dev->dev_addr, ETH_ALEN)) { + bond_for_each_slave(bond, tmp_slave1, i) { if (!memcmp(tmp_slave1->dev->dev_addr, slave->dev->dev_addr, ETH_ALEN)) { + found = 1; break; } } - if (tmp_slave1) { + + if (found) { /* a slave was found that is using the mac address * of the new slave */ - printk(KERN_ERR "bonding: Warning: the hw address " - "of slave %s is not unique - cannot enslave it!" - , slave->dev->name); + printk(KERN_ERR DRV_NAME + ": Error: the hw address of slave %s is not " + "unique - cannot enslave it!", + slave->dev->name); return -EINVAL; } + return 0; } - /* the slave's address is equal to the address of the bond - * search for a spare address in the bond for this slave. + /* The slave's address is equal to the address of the bond. + * Search for a spare address in the bond for this slave. */ - tmp_slave1 = bond_get_first_slave(bond); - for (; tmp_slave1; tmp_slave1 = bond_get_next_slave(bond, tmp_slave1)) { - - tmp_slave2 = bond_get_first_slave(bond); - for (; tmp_slave2; tmp_slave2 = bond_get_next_slave(bond, tmp_slave2)) { + free_mac_slave = NULL; + bond_for_each_slave(bond, tmp_slave1, i) { + found = 0; + bond_for_each_slave(bond, tmp_slave2, j) { if (!memcmp(tmp_slave1->perm_hwaddr, tmp_slave2->dev->dev_addr, ETH_ALEN)) { - + found = 1; break; } } - if (!tmp_slave2) { + if (!found) { /* no slave has tmp_slave1's perm addr * as its curr addr */ + free_mac_slave = tmp_slave1; break; } } - if (tmp_slave1) { - alb_set_slave_mac_addr(slave, tmp_slave1->perm_hwaddr, + if (free_mac_slave) { + alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr, bond->alb_info.rlb_enabled); - printk(KERN_WARNING "bonding: Warning: the hw address " - "of slave %s is in use by the bond; " - "giving it the hw address of %s\n", - slave->dev->name, tmp_slave1->dev->name); + printk(KERN_WARNING DRV_NAME + ": Warning: the hw address of slave %s is in use by " + "the bond; giving it the hw address of %s\n", + slave->dev->name, free_mac_slave->dev->name); } else { - printk(KERN_CRIT "bonding: Error: the hw address " - "of slave %s is in use by the bond; " - "couldn't find a slave with a free hw " - "address to give it (this should not have " - "happened)\n", slave->dev->name); + printk(KERN_ERR DRV_NAME + ": Error: the hw address of slave %s is in use by the " + "bond; couldn't find a slave with a free hw address to " + "give it (this should not have happened)\n", + slave->dev->name); return -EFAULT; } @@ -1188,37 +1082,36 @@ * * For each slave, this function sets the interface to the new address and then * changes its dev_addr field to its previous value. - * + * * Unwinding assumes bond's mac address has not yet changed. */ -static inline int -alb_set_mac_address(struct bonding *bond, void *addr) +static int alb_set_mac_address(struct bonding *bond, void *addr) { struct sockaddr sa; - struct slave *slave; + struct slave *slave, *stop_at; char tmp_addr[ETH_ALEN]; - int error; + int res; + int i; if (bond->alb_info.rlb_enabled) { return 0; } - slave = bond_get_first_slave(bond); - for (; slave; slave = bond_get_next_slave(bond, slave)) { + bond_for_each_slave(bond, slave, i) { if (slave->dev->set_mac_address == NULL) { - error = -EOPNOTSUPP; + res = -EOPNOTSUPP; goto unwind; } /* save net_device's current hw address */ memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN); - error = slave->dev->set_mac_address(slave->dev, addr); + res = slave->dev->set_mac_address(slave->dev, addr); /* restore net_device's hw address */ memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN); - if (error) { + if (res) { goto unwind; } } @@ -1226,22 +1119,23 @@ return 0; unwind: - memcpy(sa.sa_data, bond->device->dev_addr, bond->device->addr_len); - sa.sa_family = bond->device->type; - slave = bond_get_first_slave(bond); - for (; slave; slave = bond_get_next_slave(bond, slave)) { + memcpy(sa.sa_data, bond->dev->dev_addr, bond->dev->addr_len); + sa.sa_family = bond->dev->type; + + /* unwind from head to the slave that failed */ + stop_at = slave; + bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) { memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN); slave->dev->set_mac_address(slave->dev, &sa); memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN); } - return error; + return res; } /************************ exported alb funcions ************************/ -int -bond_alb_initialize(struct bonding *bond, int rlb_enabled) +int bond_alb_initialize(struct bonding *bond, int rlb_enabled) { int res; @@ -1263,8 +1157,7 @@ return 0; } -void -bond_alb_deinitialize(struct bonding *bond) +void bond_alb_deinitialize(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); @@ -1275,49 +1168,38 @@ } } -int -bond_alb_xmit(struct sk_buff *skb, struct net_device *dev) +int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) { - struct bonding *bond = (struct bonding *) dev->priv; - struct ethhdr *eth_data = (struct ethhdr *)skb->data; + struct bonding *bond = bond_dev->priv; + struct ethhdr *eth_data = (struct ethhdr *)skb->mac.raw = skb->data; struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); struct slave *tx_slave = NULL; - char do_tx_balance = 1; + static u32 ip_bcast = 0xffffffff; int hash_size = 0; + int do_tx_balance = 1; u32 hash_index = 0; u8 *hash_start = NULL; - u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; - } - /* make sure that the current_slave and the slaves list do + /* make sure that the curr_active_slave and the slaves list do * not change during tx */ read_lock(&bond->lock); + read_lock(&bond->curr_slave_lock); - if (bond->slave_cnt == 0) { - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; + if (!BOND_IS_OK(bond)) { + goto free_out; } - read_lock(&bond->ptrlock); - switch (ntohs(skb->protocol)) { case ETH_P_IP: if ((memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) || - (skb->nh.iph->daddr == 0xffffffff)) { + (skb->nh.iph->daddr == ip_bcast)) { do_tx_balance = 0; break; } hash_start = (char*)&(skb->nh.iph->daddr); - hash_size = 4; + hash_size = sizeof(skb->nh.iph->daddr); break; - case ETH_P_IPV6: if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) { do_tx_balance = 0; @@ -1325,9 +1207,8 @@ } hash_start = (char*)&(skb->nh.ipv6h->daddr); - hash_size = 16; + hash_size = sizeof(skb->nh.ipv6h->daddr); break; - case ETH_P_IPX: if (ipx_hdr(skb)->ipx_checksum != __constant_htons(IPX_NO_CHECKSUM)) { @@ -1349,14 +1230,12 @@ hash_start = (char*)eth_data->h_dest; hash_size = ETH_ALEN; break; - case ETH_P_ARP: do_tx_balance = 0; if (bond_info->rlb_enabled) { tx_slave = rlb_arp_xmit(skb, bond); } break; - default: do_tx_balance = 0; break; @@ -1369,16 +1248,16 @@ if (!tx_slave) { /* unbalanced or unassigned, send through primary */ - tx_slave = bond->current_slave; + tx_slave = bond->curr_active_slave; bond_info->unbalanced_load += skb->len; } if (tx_slave && SLAVE_IS_OK(tx_slave)) { skb->dev = tx_slave->dev; - if (tx_slave != bond->current_slave) { + if (tx_slave != bond->curr_active_slave) { memcpy(eth_data->h_source, - tx_slave->dev->dev_addr, - ETH_ALEN); + tx_slave->dev->dev_addr, + ETH_ALEN); } dev_queue_xmit(skb); } else { @@ -1386,26 +1265,35 @@ if (tx_slave) { tlb_clear_slave(bond, tx_slave, 0); } - dev_kfree_skb(skb); + goto free_out; } - read_unlock(&bond->ptrlock); +out: + read_unlock(&bond->curr_slave_lock); read_unlock(&bond->lock); return 0; + +free_out: + dev_kfree_skb(skb); + goto out; } -void -bond_alb_monitor(struct bonding *bond) +void bond_alb_monitor(struct bonding *bond) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - struct slave *slave = NULL; + struct slave *slave; + int i; read_lock(&bond->lock); - if ((bond->slave_cnt == 0) || !(bond->device->flags & IFF_UP)) { + if (bond->kill_timers) { + goto out; + } + + if (bond->slave_cnt == 0) { bond_info->tx_rebalance_counter = 0; bond_info->lp_counter = 0; - goto out; + goto re_arm; } bond_info->tx_rebalance_counter++; @@ -1413,51 +1301,53 @@ /* send learning packets */ if (bond_info->lp_counter >= BOND_ALB_LP_TICKS) { - /* change of current_slave involves swapping of mac addresses. + /* change of curr_active_slave involves swapping of mac addresses. * in order to avoid this swapping from happening while - * sending the learning packets, the ptrlock must be held for + * sending the learning packets, the curr_slave_lock must be held for * read. */ - read_lock(&bond->ptrlock); - slave = bond_get_first_slave(bond); - while (slave) { + read_lock(&bond->curr_slave_lock); + + bond_for_each_slave(bond, slave, i) { alb_send_learning_packets(slave,slave->dev->dev_addr); - slave = bond_get_next_slave(bond, slave); } - read_unlock(&bond->ptrlock); + + read_unlock(&bond->curr_slave_lock); bond_info->lp_counter = 0; } /* rebalance tx traffic */ if (bond_info->tx_rebalance_counter >= BOND_TLB_REBALANCE_TICKS) { - read_lock(&bond->ptrlock); - slave = bond_get_first_slave(bond); - while (slave) { + + read_lock(&bond->curr_slave_lock); + + bond_for_each_slave(bond, slave, i) { tlb_clear_slave(bond, slave, 1); - if (slave == bond->current_slave) { + if (slave == bond->curr_active_slave) { SLAVE_TLB_INFO(slave).load = bond_info->unbalanced_load / BOND_TLB_REBALANCE_INTERVAL; bond_info->unbalanced_load = 0; } - slave = bond_get_next_slave(bond, slave); } - read_unlock(&bond->ptrlock); + + read_unlock(&bond->curr_slave_lock); + bond_info->tx_rebalance_counter = 0; } /* handle rlb stuff */ if (bond_info->rlb_enabled) { /* the following code changes the promiscuity of the - * the current_slave. It needs to be locked with a + * the curr_active_slave. It needs to be locked with a * write lock to protect from other code that also * sets the promiscuity. */ - write_lock(&bond->ptrlock); + write_lock(&bond->curr_slave_lock); + if (bond_info->primary_is_promisc && - (++bond_info->rlb_promisc_timeout_counter >= - RLB_PROMISC_TIMEOUT)) { + (++bond_info->rlb_promisc_timeout_counter >= RLB_PROMISC_TIMEOUT)) { bond_info->rlb_promisc_timeout_counter = 0; @@ -1465,12 +1355,13 @@ * because a slave was disabled then * it can now leave promiscuous mode. */ - dev_set_promiscuity(bond->current_slave->dev, -1); + dev_set_promiscuity(bond->curr_active_slave->dev, -1); bond_info->primary_is_promisc = 0; } - write_unlock(&bond->ptrlock); - if (bond_info->rlb_rebalance == 1) { + write_unlock(&bond->curr_slave_lock); + + if (bond_info->rlb_rebalance) { bond_info->rlb_rebalance = 0; rlb_rebalance(bond); } @@ -1490,28 +1381,23 @@ } } +re_arm: + mod_timer(&(bond_info->alb_timer), jiffies + alb_delta_in_ticks); out: read_unlock(&bond->lock); - - if (bond->device->flags & IFF_UP) { - /* re-arm the timer */ - mod_timer(&(bond_info->alb_timer), - jiffies + (HZ/ALB_TIMER_TICKS_PER_SEC)); - } } -/* assumption: called before the slave is attched to the bond +/* assumption: called before the slave is attached to the bond * and not locked by the bond lock */ -int -bond_alb_init_slave(struct bonding *bond, struct slave *slave) +int bond_alb_init_slave(struct bonding *bond, struct slave *slave) { - int err = 0; + int res; - err = alb_set_slave_mac_addr(slave, slave->perm_hwaddr, + res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr, bond->alb_info.rlb_enabled); - if (err) { - return err; + if (res) { + return res; } /* caller must hold the bond lock for write since the mac addresses @@ -1519,12 +1405,12 @@ */ write_lock_bh(&bond->lock); - err = alb_handle_addr_collision_on_attach(bond, slave); + res = alb_handle_addr_collision_on_attach(bond, slave); write_unlock_bh(&bond->lock); - if (err) { - return err; + if (res) { + return res; } tlb_init_slave(slave); @@ -1540,8 +1426,7 @@ } /* Caller must hold bond lock for write */ -void -bond_alb_deinit_slave(struct bonding *bond, struct slave *slave) +void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave) { if (bond->slave_cnt > 1) { alb_change_hw_addr_on_detach(bond, slave); @@ -1556,9 +1441,7 @@ } /* Caller must hold bond lock for read */ -void -bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, - char link) +void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); @@ -1582,109 +1465,111 @@ } /** - * bond_alb_assign_current_slave - assign new current_slave + * bond_alb_handle_active_change - assign new curr_active_slave * @bond: our bonding struct * @new_slave: new slave to assign * - * Set the bond->current_slave to @new_slave and handle + * Set the bond->curr_active_slave to @new_slave and handle * mac address swapping and promiscuity changes as needed. * - * Caller must hold bond ptrlock for write (or bond lock for write) + * Caller must hold bond curr_slave_lock for write (or bond lock for write) */ -void -bond_alb_assign_current_slave(struct bonding *bond, struct slave *new_slave) +void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave) { - struct slave *swap_slave = bond->current_slave; + struct slave *swap_slave; + int i; - if (bond->current_slave == new_slave) { + if (bond->curr_active_slave == new_slave) { return; } - if (bond->current_slave && bond->alb_info.primary_is_promisc) { - dev_set_promiscuity(bond->current_slave->dev, -1); + if (bond->curr_active_slave && bond->alb_info.primary_is_promisc) { + dev_set_promiscuity(bond->curr_active_slave->dev, -1); bond->alb_info.primary_is_promisc = 0; bond->alb_info.rlb_promisc_timeout_counter = 0; } - bond->current_slave = new_slave; + swap_slave = bond->curr_active_slave; + bond->curr_active_slave = new_slave; if (!new_slave || (bond->slave_cnt == 0)) { return; } - /* set the new current_slave to the bonds mac address - * i.e. swap mac addresses of old current_slave and new current_slave + /* set the new curr_active_slave to the bonds mac address + * i.e. swap mac addresses of old curr_active_slave and new curr_active_slave */ if (!swap_slave) { + struct slave *tmp_slave; /* find slave that is holding the bond's mac address */ - swap_slave = bond_get_first_slave(bond); - while (swap_slave) { - if (!memcmp(swap_slave->dev->dev_addr, - bond->device->dev_addr, ETH_ALEN)) { + bond_for_each_slave(bond, tmp_slave, i) { + if (!memcmp(tmp_slave->dev->dev_addr, + bond->dev->dev_addr, ETH_ALEN)) { + swap_slave = tmp_slave; break; } - swap_slave = bond_get_next_slave(bond, swap_slave); } } - /* current_slave must be set before calling alb_swap_mac_addr */ + /* curr_active_slave must be set before calling alb_swap_mac_addr */ if (swap_slave) { /* swap mac address */ alb_swap_mac_addr(bond, swap_slave, new_slave); } else { /* set the new_slave to the bond mac address */ - alb_set_slave_mac_addr(new_slave, bond->device->dev_addr, + alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr, bond->alb_info.rlb_enabled); /* fasten bond mac on new current slave */ - alb_send_learning_packets(new_slave, bond->device->dev_addr); + alb_send_learning_packets(new_slave, bond->dev->dev_addr); } } -int -bond_alb_set_mac_address(struct net_device *dev, void *addr) +int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) { - struct bonding *bond = dev->priv; + struct bonding *bond = bond_dev->priv; struct sockaddr *sa = addr; - struct slave *swap_slave = NULL; - int error = 0; + struct slave *slave, *swap_slave; + int res; + int i; if (!is_valid_ether_addr(sa->sa_data)) { return -EADDRNOTAVAIL; } - error = alb_set_mac_address(bond, addr); - if (error) { - return error; + res = alb_set_mac_address(bond, addr); + if (res) { + return res; } - memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); + memcpy(bond_dev->dev_addr, sa->sa_data, bond_dev->addr_len); - /* If there is no current_slave there is nothing else to do. + /* If there is no curr_active_slave there is nothing else to do. * Otherwise we'll need to pass the new address to it and handle * duplications. */ - if (bond->current_slave == NULL) { + if (!bond->curr_active_slave) { return 0; } - swap_slave = bond_get_first_slave(bond); - while (swap_slave) { - if (!memcmp(swap_slave->dev->dev_addr, dev->dev_addr, ETH_ALEN)) { + swap_slave = NULL; + + bond_for_each_slave(bond, slave, i) { + if (!memcmp(slave->dev->dev_addr, bond_dev->dev_addr, ETH_ALEN)) { + swap_slave = slave; break; } - swap_slave = bond_get_next_slave(bond, swap_slave); } if (swap_slave) { - alb_swap_mac_addr(bond, swap_slave, bond->current_slave); + alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); } else { - alb_set_slave_mac_addr(bond->current_slave, dev->dev_addr, + alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr, bond->alb_info.rlb_enabled); - alb_send_learning_packets(bond->current_slave, dev->dev_addr); + alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); if (bond->alb_info.rlb_enabled) { /* inform clients mac address has changed */ - rlb_req_update_slave_clients(bond, bond->current_slave); + rlb_req_update_slave_clients(bond, bond->curr_active_slave); } } diff -Nru a/drivers/net/bonding/bond_alb.h b/drivers/net/bonding/bond_alb.h --- a/drivers/net/bonding/bond_alb.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/bonding/bond_alb.h Tue Feb 17 20:00:06 2004 @@ -24,6 +24,9 @@ * 2003/08/06 - Amir Noam * - Add support for setting bond's MAC address with special * handling required for ALB/TLB. + * + * 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes */ #ifndef __BOND_ALB_H__ @@ -126,10 +129,10 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave); void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave); void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); -void bond_alb_assign_current_slave(struct bonding *bond, struct slave *new_slave); -int bond_alb_xmit(struct sk_buff *skb, struct net_device *dev); +void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); +int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); void bond_alb_monitor(struct bonding *bond); -int bond_alb_set_mac_address(struct net_device *dev, void *addr); +int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); #endif /* __BOND_ALB_H__ */ diff -Nru a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c --- a/drivers/net/bonding/bond_main.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/bonding/bond_main.c Tue Feb 17 20:00:08 2004 @@ -1,7 +1,7 @@ /* * originally based on the dummy device. * - * Copyright 1999, Thomas Davis, tadavis@lbl.gov. + * Copyright 1999, Thomas Davis, tadavis@lbl.gov. * Licensed under the GPL. Based on dummy.c, and eql.c devices. * * bonding.c: an Ethernet Bonding driver @@ -15,9 +15,9 @@ * * How it works: * ifconfig bond0 ipaddress netmask up - * will setup a network device, with an ip address. No mac address - * will be assigned at this time. The hw mac address will come from - * the first slave bonded to the channel. All slaves will then use + * will setup a network device, with an ip address. No mac address + * will be assigned at this time. The hw mac address will come from + * the first slave bonded to the channel. All slaves will then use * this hw mac address. * * ifconfig bond0 down @@ -26,7 +26,7 @@ * ifenslave bond0 eth0 * will attach eth0 to bond0 as a slave. eth0 hw mac address will either * a: be used as initial mac address - * b: if a hw mac address already is there, eth0's hw mac address + * b: if a hw mac address already is there, eth0's hw mac address * will then be set from bond0. * * v0.1 - first working version. @@ -93,14 +93,14 @@ * * 2001/4/5 - Chad N. Tindel * - Ported to 2.4 Kernel - * + * * 2001/5/2 - Jeffrey E. Mast * - When a device is detached from a bond, the slave device is no longer * left thinking that is has a master. * * 2001/5/16 - Jeffrey E. Mast - * - memset did not appropriately initialized the bond rw_locks. Used - * rwlock_init to initialize to unlocked state to prevent deadlock when + * - memset did not appropriately initialized the bond rw_locks. Used + * rwlock_init to initialize to unlocked state to prevent deadlock when * first attempting a lock * - Called SET_MODULE_OWNER for bond device * @@ -119,7 +119,7 @@ * * 2001/6/01 - Chad N. Tindel * - Added /proc support for getting bond and slave information. - * Information is in /proc/net//info. + * Information is in /proc/net//info. * - Changed the locking when calling bond_close to prevent deadlock. * * 2001/8/05 - Janice Girouard @@ -144,8 +144,8 @@ * but only for an up link. * * 2001/9/20 - Chad N. Tindel - * - Add the device field to bonding_t. Previously the net_device - * corresponding to a bond wasn't available from the bonding_t + * - Add the device field to bonding_t. Previously the net_device + * corresponding to a bond wasn't available from the bonding_t * structure. * * 2001/9/25 - Janice Girouard @@ -155,10 +155,10 @@ * - Various memory leak fixes * * 2001/11/5 - Mark Huth - * - Don't take rtnl lock in bond_mii_monitor as it deadlocks under - * certain hotswap conditions. + * - Don't take rtnl lock in bond_mii_monitor as it deadlocks under + * certain hotswap conditions. * Note: this same change may be required in bond_arp_monitor ??? - * - Remove possibility of calling bond_sethwaddr with NULL slave_dev ptr + * - Remove possibility of calling bond_sethwaddr with NULL slave_dev ptr * - Handle hot swap ethernet interface deregistration events to remove * kernel oops following hot swap of enslaved interface * @@ -222,23 +222,23 @@ * - fix deletion of multicast groups after unloading module * * 2002/11/06 - Kameshwara Rayaprolu - * - Changes to prevent panic from closing the device twice; if we close - * the device in bond_release, we must set the original_flags to down + * - Changes to prevent panic from closing the device twice; if we close + * the device in bond_release, we must set the original_flags to down * so it won't be closed again by the network layer. * * 2002/11/07 - Tony Cureington * - Fix arp_target_hw_addr memory leak - * - Created activebackup_arp_monitor function to handle arp monitoring - * in active backup mode - the bond_arp_monitor had several problems... - * such as allowing slaves to tx arps sequentially without any delay + * - Created activebackup_arp_monitor function to handle arp monitoring + * in active backup mode - the bond_arp_monitor had several problems... + * such as allowing slaves to tx arps sequentially without any delay * for a response * - Renamed bond_arp_monitor to loadbalance_arp_monitor and re-wrote * this function to just handle arp monitoring in load-balancing mode; * it is a lot more compact now - * - Changes to ensure one and only one slave transmits in active-backup + * - Changes to ensure one and only one slave transmits in active-backup * mode - * - Robustesize parameters; warn users about bad combinations of - * parameters; also if miimon is specified and a network driver does + * - Robustesize parameters; warn users about bad combinations of + * parameters; also if miimon is specified and a network driver does * not support MII or ETHTOOL, inform the user of this * - Changes to support link_failure_count when in arp monitoring mode * - Fix up/down delay reported in /proc @@ -248,7 +248,7 @@ * * 2002/11/16 - Laurent Deniel * - fix multicast handling in activebackup_arp_monitor - * - remove one unnecessary and confusing current_slave == slave test + * - remove one unnecessary and confusing curr_active_slave == slave test * in activebackup_arp_monitor * * 2002/11/17 - Laurent Deniel @@ -267,7 +267,7 @@ * One change: an invalid choice will cause module load failure, * rather than the previous behavior of just picking one. * - Minor cleanups; got rid of dup ctype stuff, atoi function - * + * * 2003/02/07 - Jay Vosburgh * - Added use_carrier module parameter that causes miimon to * use netif_carrier_ok() test instead of MII/ETHTOOL ioctls. @@ -330,7 +330,7 @@ * new/old ifenslave and new/old bonding. * * 2003/05/01 - Shmulik Hen - * - Fixed bug in bond_release_all(): save old value of current_slave + * - Fixed bug in bond_release_all(): save old value of curr_active_slave * before setting it to NULL. * - Changed driver versioning scheme to include version number instead * of release date (that is already in another field). There are 3 @@ -358,7 +358,7 @@ * * 2003/05/01 - Shmulik Hen * - Added support for Transmit load balancing mode. - * - Concentrate all assignments of current_slave to a single point + * - Concentrate all assignments of curr_active_slave to a single point * so specific modes can take actions when the primary adapter is * changed. * - Take the updelay parameter into consideration during bond_enslave @@ -426,8 +426,36 @@ * - Convert /proc to seq_file interface. * Change /proc/net/bondX/info to /proc/net/bonding/bondX. * Set version to 2.4.1. + * + * 2003/11/20 - Amir Noam + * - Fix /proc creation/destruction. + * + * 2003/12/01 - Shmulik Hen + * - Massive cleanup - Set version to 2.5.0 + * Code changes: + * o Consolidate format of prints and debug prints. + * o Remove bonding_t/slave_t typedefs and consolidate all casts. + * o Remove dead code and unnecessary checks. + * o Consolidate starting/stopping timers. + * o Consolidate handling of primary module param throughout the code. + * o Removed multicast module param support - all settings are done + * according to mode. + * o Slave list iteration - bond is no longer part of the list, + * added cyclic list iteration macros. + * o Consolidate error handling in all xmit functions. + * Style changes: + * o Consolidate function naming and declarations. + * o Consolidate function params and local variables names. + * o Consolidate return values. + * o Consolidate curly braces. + * o Consolidate conditionals format. + * o Change struct member names and types. + * o Chomp trailing spaces, remove empty lines, fix indentations. + * o Re-organize code according to context. */ +//#define BONDING_DEBUG 1 + #include #include #include @@ -452,7 +480,6 @@ #include #include #include - #include #include #include @@ -461,58 +488,72 @@ #include #include #include - -#include #include #include #include #include #include +#include #include "bonding.h" #include "bond_3ad.h" #include "bond_alb.h" -#define DRV_VERSION "2.4.1" -#define DRV_RELDATE "September 15, 2003" -#define DRV_NAME "bonding" -#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" - -static const char *version = -DRV_NAME ".c:v" DRV_VERSION " (" DRV_RELDATE ")\n"; +/*---------------------------- Module parameters ----------------------------*/ /* monitor all links that often (in milliseconds). <=0 disables monitoring */ -#ifndef BOND_LINK_MON_INTERV #define BOND_LINK_MON_INTERV 0 -#endif - -#ifndef BOND_LINK_ARP_INTERV #define BOND_LINK_ARP_INTERV 0 -#endif +#define MAX_ARP_IP_TARGETS 16 -#ifndef MAX_ARP_IP_TARGETS -#define MAX_ARP_IP_TARGETS 16 -#endif +static int max_bonds = BOND_DEFAULT_MAX_BONDS; +static int miimon = BOND_LINK_MON_INTERV; +static int updelay = 0; +static int downdelay = 0; +static int use_carrier = 1; +static char *mode = NULL; +static char *primary = NULL; +static char *lacp_rate = NULL; +static int arp_interval = BOND_LINK_ARP_INTERV; +static char *arp_ip_target[MAX_ARP_IP_TARGETS] = { NULL, }; + +MODULE_PARM(max_bonds, "i"); +MODULE_PARM_DESC(max_bonds, "Max number of bonded devices"); +MODULE_PARM(miimon, "i"); +MODULE_PARM_DESC(miimon, "Link check interval in milliseconds"); +MODULE_PARM(updelay, "i"); +MODULE_PARM_DESC(updelay, "Delay before considering link up, in milliseconds"); +MODULE_PARM(downdelay, "i"); +MODULE_PARM_DESC(downdelay, "Delay before considering link down, in milliseconds"); +MODULE_PARM(use_carrier, "i"); +MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default)"); +MODULE_PARM(mode, "s"); +MODULE_PARM_DESC(mode, "Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor"); +MODULE_PARM(primary, "s"); +MODULE_PARM_DESC(primary, "Primary network device to use"); +MODULE_PARM(lacp_rate, "s"); +MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner (slow/fast)"); +MODULE_PARM(arp_interval, "i"); +MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds"); +MODULE_PARM(arp_ip_target, "1-" __MODULE_STRING(MAX_ARP_IP_TARGETS) "s"); +MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form"); -#define USES_PRIMARY(mode) \ - (((mode) == BOND_MODE_ACTIVEBACKUP) || \ - ((mode) == BOND_MODE_TLB) || \ - ((mode) == BOND_MODE_ALB)) +/*----------------------------- Global variables ----------------------------*/ -struct bond_parm_tbl { - char *modename; - int mode; -}; +static const char *version = + DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n"; -static int arp_interval = BOND_LINK_ARP_INTERV; -static char *arp_ip_target[MAX_ARP_IP_TARGETS] = { NULL, }; -static u32 arp_target[MAX_ARP_IP_TARGETS] = { 0, } ; -static int arp_ip_count = 0; -static u32 my_ip = 0; -char *arp_target_hw_addr = NULL; +static LIST_HEAD(bond_dev_list); -static char *primary= NULL; +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *bond_proc_dir = NULL; +#endif -static int app_abi_ver = 0; +static u32 arp_target[MAX_ARP_IP_TARGETS] = { 0, } ; +static int arp_ip_count = 0; +static u32 my_ip = 0; +static int bond_mode = BOND_MODE_ROUNDROBIN; +static int lacp_fast = 0; +static int app_abi_ver = 0; static int orig_app_abi_ver = -1; /* This is used to save the first ABI version * we receive from the application. Once set, * it won't be changed, and the module will @@ -521,14 +562,16 @@ * another ABI version. */ -static int max_bonds = BOND_DEFAULT_MAX_BONDS; -static int miimon = BOND_LINK_MON_INTERV; -static int use_carrier = 1; -static int bond_mode = BOND_MODE_ROUNDROBIN; -static int updelay = 0; -static int downdelay = 0; +struct bond_parm_tbl { + char *modename; + int mode; +}; -static char *mode = NULL; +static struct bond_parm_tbl bond_lacp_tbl[] = { +{ "slow", AD_LACP_SLOW}, +{ "fast", AD_LACP_FAST}, +{ NULL, -1}, +}; static struct bond_parm_tbl bond_mode_tbl[] = { { "balance-rr", BOND_MODE_ROUNDROBIN}, @@ -541,101 +584,9 @@ { NULL, -1}, }; -static int multicast_mode = BOND_MULTICAST_ALL; -static char *multicast = NULL; - -static struct bond_parm_tbl bond_mc_tbl[] = { -{ "disabled", BOND_MULTICAST_DISABLED}, -{ "active", BOND_MULTICAST_ACTIVE}, -{ "all", BOND_MULTICAST_ALL}, -{ NULL, -1}, -}; - -static int lacp_fast = 0; -static char *lacp_rate = NULL; +/*---------------------------- General routines -----------------------------*/ -static struct bond_parm_tbl bond_lacp_tbl[] = { -{ "slow", AD_LACP_SLOW}, -{ "fast", AD_LACP_FAST}, -{ NULL, -1}, -}; - -static LIST_HEAD(bond_dev_list); -#ifdef CONFIG_PROC_FS -static struct proc_dir_entry *bond_proc_dir = NULL; -#endif - -MODULE_PARM(max_bonds, "i"); -MODULE_PARM_DESC(max_bonds, "Max number of bonded devices"); -MODULE_PARM(miimon, "i"); -MODULE_PARM_DESC(miimon, "Link check interval in milliseconds"); -MODULE_PARM(use_carrier, "i"); -MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default)"); -MODULE_PARM(mode, "s"); -MODULE_PARM_DESC(mode, "Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor"); -MODULE_PARM(arp_interval, "i"); -MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds"); -MODULE_PARM(arp_ip_target, "1-" __MODULE_STRING(MAX_ARP_IP_TARGETS) "s"); -MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form"); -MODULE_PARM(updelay, "i"); -MODULE_PARM_DESC(updelay, "Delay before considering link up, in milliseconds"); -MODULE_PARM(downdelay, "i"); -MODULE_PARM_DESC(downdelay, "Delay before considering link down, in milliseconds"); -MODULE_PARM(primary, "s"); -MODULE_PARM_DESC(primary, "Primary network device to use"); -MODULE_PARM(multicast, "s"); -MODULE_PARM_DESC(multicast, "Mode for multicast support : 0 for none, 1 for active slave, 2 for all slaves (default)"); -MODULE_PARM(lacp_rate, "s"); -MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner (slow/fast)"); - -static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *dev); -static int bond_xmit_xor(struct sk_buff *skb, struct net_device *dev); -static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *dev); -static struct net_device_stats *bond_get_stats(struct net_device *dev); -static void bond_mii_monitor(struct net_device *dev); -static void loadbalance_arp_monitor(struct net_device *dev); -static void activebackup_arp_monitor(struct net_device *dev); -static void bond_mc_list_destroy(struct bonding *bond); -static void bond_mc_add(bonding_t *bond, void *addr, int alen); -static void bond_mc_delete(bonding_t *bond, void *addr, int alen); -static int bond_mc_list_copy (struct dev_mc_list *src, struct bonding *dst, int gpf_flag); -static inline int dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2); -static void bond_set_promiscuity(bonding_t *bond, int inc); -static void bond_set_allmulti(bonding_t *bond, int inc); -static struct dev_mc_list* bond_mc_list_find_dmi(struct dev_mc_list *dmi, struct dev_mc_list *mc_list); -static void bond_mc_update(bonding_t *bond, slave_t *new, slave_t *old); -static int bond_enslave(struct net_device *master, struct net_device *slave); -static int bond_release(struct net_device *master, struct net_device *slave); -static int bond_release_all(struct net_device *master); -static int bond_sethwaddr(struct net_device *master, struct net_device *slave); -static void change_active_interface(struct bonding *bond, struct slave *new); -static void reselect_active_interface(struct bonding *bond); -static struct slave *find_best_interface(struct bonding *bond); - - -/* #define BONDING_DEBUG 1 */ -#ifdef BONDING_DEBUG -#define dprintk(x...) printk(x...) -#else /* BONDING_DEBUG */ -#define dprintk(x...) do {} while (0) -#endif /* BONDING_DEBUG */ - -/* several macros */ - -static void arp_send_all(slave_t *slave) -{ - int i; - - for (i = 0; (idev, - my_ip, arp_target_hw_addr, slave->dev->dev_addr, - arp_target_hw_addr); - } -} - - -static const char * -bond_mode_name(void) +static const char *bond_mode_name(void) { switch (bond_mode) { case BOND_MODE_ROUNDROBIN : @@ -657,149 +608,7 @@ } } -static const char * -multicast_mode_name(void) -{ - switch(multicast_mode) { - case BOND_MULTICAST_DISABLED : - return "disabled"; - case BOND_MULTICAST_ACTIVE : - return "active slave only"; - case BOND_MULTICAST_ALL : - return "all slaves"; - default : - return "unknown"; - } -} - -void bond_set_slave_inactive_flags(slave_t *slave) -{ - slave->state = BOND_STATE_BACKUP; - slave->dev->flags |= IFF_NOARP; -} - -void bond_set_slave_active_flags(slave_t *slave) -{ - slave->state = BOND_STATE_ACTIVE; - slave->dev->flags &= ~IFF_NOARP; -} - -/* - * This function counts and verifies the the number of attached - * slaves, checking the count against the expected value (given that incr - * is either 1 or -1, for add or removal of a slave). Only - * bond_xmit_xor() uses the slave_cnt value, but this is still a good - * consistency check. - */ -static inline void -update_slave_cnt(bonding_t *bond, int incr) -{ - slave_t *slave = NULL; - int expect = bond->slave_cnt + incr; - - bond->slave_cnt = 0; - for (slave = bond->prev; slave != (slave_t*)bond; - slave = slave->prev) { - bond->slave_cnt++; - } - - if (expect != bond->slave_cnt) - BUG(); -} - -/* - * This function detaches the slave from the list . - * WARNING: no check is made to verify if the slave effectively - * belongs to . It returns in case it's needed. - * Nothing is freed on return, structures are just unchained. - * If the bond->current_slave pointer was pointing to , - * it should be changed by the calling function. - * - * bond->lock held for writing by caller. - */ -static slave_t * -bond_detach_slave(bonding_t *bond, slave_t *slave) -{ - if ((bond == NULL) || (slave == NULL) || - ((void *)bond == (void *)slave)) { - printk(KERN_ERR - "bond_detach_slave(): trying to detach " - "slave %p from bond %p\n", bond, slave); - return slave; - } - - if (bond->next == slave) { /* is the slave at the head ? */ - if (bond->prev == slave) { /* is the slave alone ? */ - bond->prev = bond->next = (slave_t *)bond; - } else { /* not alone */ - bond->next = slave->next; - slave->next->prev = (slave_t *)bond; - bond->prev->next = slave->next; - } - } else { - slave->prev->next = slave->next; - if (bond->prev == slave) { /* is this slave the last one ? */ - bond->prev = slave->prev; - } else { - slave->next->prev = slave->prev; - } - } - - update_slave_cnt(bond, -1); - - return slave; -} - -/* - * This function attaches the slave to the list . - * - * bond->lock held for writing by caller. - */ -static void -bond_attach_slave(struct bonding *bond, struct slave *new_slave) -{ - /* - * queue to the end of the slaves list, make the first element its - * successor, the last one its predecessor, and make it the bond's - * predecessor. - * - * Just to clarify, so future bonding driver hackers don't go through - * the same confusion stage I did trying to figure this out, the - * slaves are stored in a double linked circular list, sortof. - * In the ->next direction, the last slave points to the first slave, - * bypassing bond; only the slaves are in the ->next direction. - * In the ->prev direction, however, the first slave points to bond - * and bond points to the last slave. - * - * It looks like a circle with a little bubble hanging off one side - * in the ->prev direction only. - * - * When going through the list once, its best to start at bond->prev - * and go in the ->prev direction, testing for bond. Doing this - * in the ->next direction doesn't work. Trust me, I know this now. - * :) -mts 2002.03.14 - */ - new_slave->prev = bond->prev; - new_slave->prev->next = new_slave; - bond->prev = new_slave; - new_slave->next = bond->next; - - update_slave_cnt(bond, 1); -} - - -/* - * Less bad way to call ioctl from within the kernel; this needs to be - * done some other way to get the call out of interrupt context. - * Needs "ioctl" variable to be supplied by calling context. - */ -#define IOCTL(dev, arg, cmd) ({ \ - int ret; \ - mm_segment_t fs = get_fs(); \ - set_fs(get_ds()); \ - ret = ioctl(dev, arg, cmd); \ - set_fs(fs); \ - ret; }) +/*------------------------------- Link status -------------------------------*/ /* * Get link speed and duplex from the slave's base driver @@ -809,16 +618,16 @@ */ static int bond_update_speed_duplex(struct slave *slave) { - struct net_device *dev = slave->dev; + struct net_device *slave_dev = slave->dev; static int (* ioctl)(struct net_device *, struct ifreq *, int); struct ifreq ifr; struct ethtool_cmd etool; - ioctl = dev->do_ioctl; + ioctl = slave_dev->do_ioctl; if (ioctl) { etool.cmd = ETHTOOL_GSET; ifr.ifr_data = (char*)&etool; - if (IOCTL(dev, &ifr, SIOCETHTOOL) == 0) { + if (IOCTL(slave_dev, &ifr, SIOCETHTOOL) == 0) { slave->speed = etool.speed; slave->duplex = etool.duplex; } else { @@ -829,20 +638,20 @@ } switch (slave->speed) { - case SPEED_10: - case SPEED_100: - case SPEED_1000: - break; - default: - goto err_out; + case SPEED_10: + case SPEED_100: + case SPEED_1000: + break; + default: + goto err_out; } switch (slave->duplex) { - case DUPLEX_FULL: - case DUPLEX_HALF: - break; - default: - goto err_out; + case DUPLEX_FULL: + case DUPLEX_HALF: + break; + default: + goto err_out; } return 0; @@ -854,7 +663,7 @@ return -1; } -/* +/* * if supports MII link status reporting, check its link status. * * We either do MII/ETHTOOL ioctls, or check netif_carrier_ok(), @@ -870,8 +679,7 @@ * It'd be nice if there was a good way to tell if a driver supports * netif_carrier, but there really isn't. */ -static int -bond_check_dev_link(struct net_device *dev, int reporting) +static int bond_check_dev_link(struct net_device *slave_dev, int reporting) { static int (* ioctl)(struct net_device *, struct ifreq *, int); struct ifreq ifr; @@ -879,10 +687,10 @@ struct ethtool_value etool; if (use_carrier) { - return netif_carrier_ok(dev) ? BMSR_LSTATUS : 0; + return netif_carrier_ok(slave_dev) ? BMSR_LSTATUS : 0; } - ioctl = dev->do_ioctl; + ioctl = slave_dev->do_ioctl; if (ioctl) { /* TODO: set pointer to correct ioctl on a per team member */ /* bases to make this more efficient. that is, once */ @@ -898,476 +706,495 @@ /* Yes, the mii is overlaid on the ifreq.ifr_ifru */ mii = (struct mii_ioctl_data *)&ifr.ifr_data; - if (IOCTL(dev, &ifr, SIOCGMIIPHY) == 0) { + if (IOCTL(slave_dev, &ifr, SIOCGMIIPHY) == 0) { mii->reg_num = MII_BMSR; - if (IOCTL(dev, &ifr, SIOCGMIIREG) == 0) { - return mii->val_out & BMSR_LSTATUS; + if (IOCTL(slave_dev, &ifr, SIOCGMIIREG) == 0) { + return (mii->val_out & BMSR_LSTATUS); } } /* try SIOCETHTOOL ioctl, some drivers cache ETHTOOL_GLINK */ /* for a period of time so we attempt to get link status */ /* from it last if the above MII ioctls fail... */ - etool.cmd = ETHTOOL_GLINK; - ifr.ifr_data = (char*)&etool; - if (IOCTL(dev, &ifr, SIOCETHTOOL) == 0) { + etool.cmd = ETHTOOL_GLINK; + ifr.ifr_data = (char*)&etool; + if (IOCTL(slave_dev, &ifr, SIOCETHTOOL) == 0) { if (etool.data == 1) { return BMSR_LSTATUS; - } else { -#ifdef BONDING_DEBUG - printk(KERN_INFO - ":: SIOCETHTOOL shows link down \n"); -#endif + } else { + dprintk("SIOCETHTOOL shows link down\n"); return 0; - } + } } - } - + /* * If reporting, report that either there's no dev->do_ioctl, * or both SIOCGMIIREG and SIOCETHTOOL failed (meaning that we * cannot report link status). If not reporting, pretend * we're ok. */ - return reporting ? -1 : BMSR_LSTATUS; + return (reporting ? -1 : BMSR_LSTATUS); } -static u16 bond_check_mii_link(bonding_t *bond) -{ - int has_active_interface = 0; - - read_lock_bh(&bond->lock); - read_lock(&bond->ptrlock); - has_active_interface = (bond->current_slave != NULL); - read_unlock(&bond->ptrlock); - read_unlock_bh(&bond->lock); +/*----------------------------- Multicast list ------------------------------*/ - return (has_active_interface ? BMSR_LSTATUS : 0); +/* + * Returns 0 if dmi1 and dmi2 are the same, non-0 otherwise + */ +static inline int bond_is_dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2) +{ + return memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0 && + dmi1->dmi_addrlen == dmi2->dmi_addrlen; } -/* register to receive lacpdus on a bond */ -static void bond_register_lacpdu(struct bonding *bond) +/* + * returns dmi entry if found, NULL otherwise + */ +static struct dev_mc_list *bond_mc_list_find_dmi(struct dev_mc_list *dmi, struct dev_mc_list *mc_list) { - struct packet_type* pk_type = &(BOND_AD_INFO(bond).ad_pkt_type); + struct dev_mc_list *idmi; - /* initialize packet type */ - pk_type->type = PKT_TYPE_LACPDU; - pk_type->dev = bond->device; - pk_type->func = bond_3ad_lacpdu_recv; + for (idmi = mc_list; idmi; idmi = idmi->next) { + if (bond_is_dmi_same(dmi, idmi)) { + return idmi; + } + } - dev_add_pack(pk_type); + return NULL; } -/* unregister to receive lacpdus on a bond */ -static void bond_unregister_lacpdu(struct bonding *bond) +/* + * Push the promiscuity flag down to appropriate slaves + */ +static void bond_set_promiscuity(struct bonding *bond, int inc) { - dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type)); + if (USES_PRIMARY(bond_mode)) { + /* write lock already acquired */ + if (bond->curr_active_slave) { + dev_set_promiscuity(bond->curr_active_slave->dev, inc); + } + } else { + struct slave *slave; + int i; + bond_for_each_slave(bond, slave, i) { + dev_set_promiscuity(slave->dev, inc); + } + } } -static int bond_open(struct net_device *dev) +/* + * Push the allmulti flag down to all slaves + */ +static void bond_set_allmulti(struct bonding *bond, int inc) { - struct bonding *bond = (struct bonding *)(dev->priv); - struct timer_list *timer = &((struct bonding *)(dev->priv))->mii_timer; - struct timer_list *arp_timer = &((struct bonding *)(dev->priv))->arp_timer; - - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - struct timer_list *alb_timer = &(BOND_ALB_INFO(bond).alb_timer); - - /* bond_alb_initialize must be called before the timer - * is started. - */ - if (bond_alb_initialize(bond, (bond_mode == BOND_MODE_ALB))) { - /* something went wrong - fail the open operation */ - return -1; + if (USES_PRIMARY(bond_mode)) { + /* write lock already acquired */ + if (bond->curr_active_slave) { + dev_set_allmulti(bond->curr_active_slave->dev, inc); } - - init_timer(alb_timer); - alb_timer->expires = jiffies + 1; - alb_timer->data = (unsigned long)bond; - alb_timer->function = (void *)&bond_alb_monitor; - add_timer(alb_timer); - } - - if (miimon > 0) { /* link check interval, in milliseconds. */ - init_timer(timer); - timer->expires = jiffies + (miimon * HZ / 1000); - timer->data = (unsigned long)dev; - timer->function = (void *)&bond_mii_monitor; - add_timer(timer); - } - - if (arp_interval> 0) { /* arp interval, in milliseconds. */ - init_timer(arp_timer); - arp_timer->expires = jiffies + (arp_interval * HZ / 1000); - arp_timer->data = (unsigned long)dev; - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - arp_timer->function = (void *)&activebackup_arp_monitor; - } else { - arp_timer->function = (void *)&loadbalance_arp_monitor; + } else { + struct slave *slave; + int i; + bond_for_each_slave(bond, slave, i) { + dev_set_allmulti(slave->dev, inc); } - add_timer(arp_timer); } +} - if (bond_mode == BOND_MODE_8023AD) { - struct timer_list *ad_timer = &(BOND_AD_INFO(bond).ad_timer); - init_timer(ad_timer); - ad_timer->expires = jiffies + (AD_TIMER_INTERVAL * HZ / 1000); - ad_timer->data = (unsigned long)bond; - ad_timer->function = (void *)&bond_3ad_state_machine_handler; - add_timer(ad_timer); - - /* register to receive LACPDUs */ - bond_register_lacpdu(bond); +/* + * Add a Multicast address to slaves + * according to mode + */ +static void bond_mc_add(struct bonding *bond, void *addr, int alen) +{ + if (USES_PRIMARY(bond_mode)) { + /* write lock already acquired */ + if (bond->curr_active_slave) { + dev_mc_add(bond->curr_active_slave->dev, addr, alen, 0); + } + } else { + struct slave *slave; + int i; + bond_for_each_slave(bond, slave, i) { + dev_mc_add(slave->dev, addr, alen, 0); + } } - - return 0; } -static int bond_close(struct net_device *master) +/* + * Remove a multicast address from slave + * according to mode + */ +static void bond_mc_delete(struct bonding *bond, void *addr, int alen) { - bonding_t *bond = (struct bonding *) master->priv; - - write_lock_bh(&bond->lock); - - if (miimon > 0) { /* link check interval, in milliseconds. */ - del_timer(&bond->mii_timer); - } - if (arp_interval> 0) { /* arp interval, in milliseconds. */ - del_timer(&bond->arp_timer); - if (arp_target_hw_addr != NULL) { - kfree(arp_target_hw_addr); - arp_target_hw_addr = NULL; + if (USES_PRIMARY(bond_mode)) { + /* write lock already acquired */ + if (bond->curr_active_slave) { + dev_mc_delete(bond->curr_active_slave->dev, addr, alen, 0); + } + } else { + struct slave *slave; + int i; + bond_for_each_slave(bond, slave, i) { + dev_mc_delete(slave->dev, addr, alen, 0); } } +} - if (bond_mode == BOND_MODE_8023AD) { - del_timer_sync(&(BOND_AD_INFO(bond).ad_timer)); +/* + * Totally destroys the mc_list in bond + */ +static void bond_mc_list_destroy(struct bonding *bond) +{ + struct dev_mc_list *dmi; - /* Unregister the receive of LACPDUs */ - bond_unregister_lacpdu(bond); + dmi = bond->mc_list; + while (dmi) { + bond->mc_list = dmi->next; + kfree(dmi); + dmi = bond->mc_list; } +} - bond_mc_list_destroy (bond); - - write_unlock_bh(&bond->lock); +/* + * Copy all the Multicast addresses from src to the bonding device dst + */ +static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond, int gpf_flag) +{ + struct dev_mc_list *dmi, *new_dmi; - /* Release the bonded slaves */ - bond_release_all(master); + for (dmi = mc_list; dmi; dmi = dmi->next) { + new_dmi = kmalloc(sizeof(struct dev_mc_list), gpf_flag); - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - del_timer_sync(&(BOND_ALB_INFO(bond).alb_timer)); + if (!new_dmi) { + /* FIXME: Potential memory leak !!! */ + return -ENOMEM; + } - bond_alb_deinitialize(bond); + new_dmi->next = bond->mc_list; + bond->mc_list = new_dmi; + new_dmi->dmi_addrlen = dmi->dmi_addrlen; + memcpy(new_dmi->dmi_addr, dmi->dmi_addr, dmi->dmi_addrlen); + new_dmi->dmi_users = dmi->dmi_users; + new_dmi->dmi_gusers = dmi->dmi_gusers; } return 0; } -/* +/* * flush all members of flush->mc_list from device dev->mc_list */ -static void bond_mc_list_flush(struct net_device *dev, struct net_device *flush) -{ - struct dev_mc_list *dmi; - - for (dmi = flush->mc_list; dmi != NULL; dmi = dmi->next) - dev_mc_delete(dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); +static void bond_mc_list_flush(struct net_device *bond_dev, struct net_device *slave_dev) +{ + struct dev_mc_list *dmi; + + for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) { + dev_mc_delete(slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); + } if (bond_mode == BOND_MODE_8023AD) { /* del lacpdu mc addr from mc list */ u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR; - dev_mc_delete(dev, lacpdu_multicast, ETH_ALEN, 0); + dev_mc_delete(slave_dev, lacpdu_multicast, ETH_ALEN, 0); } } +/*--------------------------- Active slave change ---------------------------*/ + /* - * Totally destroys the mc_list in bond + * Update the mc list and multicast-related flags for the new and + * old active slaves (if any) according to the multicast mode, and + * promiscuous flags unconditionally. */ -static void bond_mc_list_destroy(struct bonding *bond) +static void bond_mc_swap(struct bonding *bond, struct slave *new_active, struct slave *old_active) { struct dev_mc_list *dmi; - dmi = bond->mc_list; - while (dmi) { - bond->mc_list = dmi->next; - kfree(dmi); - dmi = bond->mc_list; - } -} - -/* - * Add a Multicast address to every slave in the bonding group - */ -static void bond_mc_add(bonding_t *bond, void *addr, int alen) -{ - slave_t *slave; - switch (multicast_mode) { - case BOND_MULTICAST_ACTIVE : - /* write lock already acquired */ - if (bond->current_slave != NULL) - dev_mc_add(bond->current_slave->dev, addr, alen, 0); - break; - case BOND_MULTICAST_ALL : - for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev) - dev_mc_add(slave->dev, addr, alen, 0); - break; - case BOND_MULTICAST_DISABLED : - break; + if (!USES_PRIMARY(bond_mode)) { + /* nothing to do - mc list is already up-to-date on + * all slaves + */ + return; } -} -/* - * Remove a multicast address from every slave in the bonding group - */ -static void bond_mc_delete(bonding_t *bond, void *addr, int alen) -{ - slave_t *slave; - switch (multicast_mode) { - case BOND_MULTICAST_ACTIVE : - /* write lock already acquired */ - if (bond->current_slave != NULL) - dev_mc_delete(bond->current_slave->dev, addr, alen, 0); - break; - case BOND_MULTICAST_ALL : - for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev) - dev_mc_delete(slave->dev, addr, alen, 0); - break; - case BOND_MULTICAST_DISABLED : - break; - } -} + if (old_active) { + if (bond->dev->flags & IFF_PROMISC) { + dev_set_promiscuity(old_active->dev, -1); + } -/* - * Copy all the Multicast addresses from src to the bonding device dst - */ -static int bond_mc_list_copy (struct dev_mc_list *src, struct bonding *dst, - int gpf_flag) -{ - struct dev_mc_list *dmi, *new_dmi; + if (bond->dev->flags & IFF_ALLMULTI) { + dev_set_allmulti(old_active->dev, -1); + } - for (dmi = src; dmi != NULL; dmi = dmi->next) { - new_dmi = kmalloc(sizeof(struct dev_mc_list), gpf_flag); + for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) { + dev_mc_delete(old_active->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); + } + } - if (new_dmi == NULL) { - return -ENOMEM; + if (new_active) { + if (bond->dev->flags & IFF_PROMISC) { + dev_set_promiscuity(new_active->dev, 1); } - new_dmi->next = dst->mc_list; - dst->mc_list = new_dmi; + if (bond->dev->flags & IFF_ALLMULTI) { + dev_set_allmulti(new_active->dev, 1); + } - new_dmi->dmi_addrlen = dmi->dmi_addrlen; - memcpy(new_dmi->dmi_addr, dmi->dmi_addr, dmi->dmi_addrlen); - new_dmi->dmi_users = dmi->dmi_users; - new_dmi->dmi_gusers = dmi->dmi_gusers; - } - return 0; + for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) { + dev_mc_add(new_active->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); + } + } } -/* - * Returns 0 if dmi1 and dmi2 are the same, non-0 otherwise - */ -static inline int dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2) -{ - return memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0 && - dmi1->dmi_addrlen == dmi2->dmi_addrlen; -} - -/* - * Push the promiscuity flag down to appropriate slaves +/** + * find_best_interface - select the best available slave to be the active one + * @bond: our bonding struct + * + * Warning: Caller must hold curr_slave_lock for writing. */ -static void bond_set_promiscuity(bonding_t *bond, int inc) -{ - slave_t *slave; +static struct slave *bond_find_best_slave(struct bonding *bond) +{ + struct slave *new_active, *old_active; + struct slave *bestslave = NULL; + int mintime; + int i; - if (USES_PRIMARY(bond_mode)) { - if (bond->current_slave) { - dev_set_promiscuity(bond->current_slave->dev, inc); - } + new_active = old_active = bond->curr_active_slave; - } else { - for (slave = bond->prev; slave != (slave_t*)bond; - slave = slave->prev) { - dev_set_promiscuity(slave->dev, inc); + if (!new_active) { /* there were no active slaves left */ + if (bond->slave_cnt > 0) { /* found one slave */ + new_active = bond->first_slave; + } else { + return NULL; /* still no slave, return NULL */ } } -} -/* - * Push the allmulti flag down to all slaves - */ -static void bond_set_allmulti(bonding_t *bond, int inc) -{ - slave_t *slave; - switch (multicast_mode) { - case BOND_MULTICAST_ACTIVE : - /* write lock already acquired */ - if (bond->current_slave != NULL) - dev_set_allmulti(bond->current_slave->dev, inc); - break; - case BOND_MULTICAST_ALL : - for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev) - dev_set_allmulti(slave->dev, inc); - break; - case BOND_MULTICAST_DISABLED : - break; + mintime = updelay; + + /* first try the primary link; if arping, a link must tx/rx traffic + * before it can be considered the curr_active_slave - also, we would skip + * slaves between the curr_active_slave and primary_slave that may be up + * and able to arp + */ + if ((bond->primary_slave) && + (!arp_interval) && + (IS_UP(bond->primary_slave->dev))) { + new_active = bond->primary_slave; } -} -/* - * returns dmi entry if found, NULL otherwise - */ -static struct dev_mc_list* bond_mc_list_find_dmi(struct dev_mc_list *dmi, - struct dev_mc_list *mc_list) -{ - struct dev_mc_list *idmi; + /* remember where to stop iterating over the slaves */ + old_active = new_active; - for (idmi = mc_list; idmi != NULL; idmi = idmi->next) { - if (dmi_same(dmi, idmi)) { - return idmi; + bond_for_each_slave_from(bond, new_active, i, old_active) { + if (IS_UP(new_active->dev)) { + if (new_active->link == BOND_LINK_UP) { + return new_active; + } else if (new_active->link == BOND_LINK_BACK) { + /* link up, but waiting for stabilization */ + if (new_active->delay < mintime) { + mintime = new_active->delay; + bestslave = new_active; + } + } } } - return NULL; -} -static void set_multicast_list(struct net_device *master) + return bestslave; +} + +/** + * change_active_interface - change the active slave into the specified one + * @bond: our bonding struct + * @new: the new slave to make the active one + * + * Set the new slave to the bond's settings and unset them on the old + * curr_active_slave. + * Setting include flags, mc-list, promiscuity, allmulti, etc. + * + * If @new's link state is %BOND_LINK_BACK we'll set it to %BOND_LINK_UP, + * because it is apparently the best available slave we have, even though its + * updelay hasn't timed out yet. + * + * Warning: Caller must hold curr_slave_lock for writing. + */ +static void bond_change_active_slave(struct bonding *bond, struct slave *new_active) { - bonding_t *bond = master->priv; - struct dev_mc_list *dmi; + struct slave *old_active = bond->curr_active_slave; - write_lock_bh(&bond->lock); + if (old_active == new_active) { + return; + } - /* - * Do promisc before checking multicast_mode - */ - if ( (master->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC) ) - bond_set_promiscuity(bond, 1); + if (new_active) { + if (new_active->link == BOND_LINK_BACK) { + if (USES_PRIMARY(bond_mode)) { + printk(KERN_INFO DRV_NAME + ": %s: making interface %s the new " + "active one %d ms earlier.\n", + bond->dev->name, new_active->dev->name, + (updelay - new_active->delay) * miimon); + } - if ( !(master->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC) ) - bond_set_promiscuity(bond, -1); + new_active->delay = 0; + new_active->link = BOND_LINK_UP; + new_active->jiffies = jiffies; - if (multicast_mode == BOND_MULTICAST_DISABLED) { - bond->flags = master->flags; - write_unlock_bh(&bond->lock); - return; + if (bond_mode == BOND_MODE_8023AD) { + bond_3ad_handle_link_change(new_active, BOND_LINK_UP); + } + + if ((bond_mode == BOND_MODE_TLB) || + (bond_mode == BOND_MODE_ALB)) { + bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP); + } + } else { + if (USES_PRIMARY(bond_mode)) { + printk(KERN_INFO DRV_NAME + ": %s: making interface %s the new " + "active one.\n", + bond->dev->name, new_active->dev->name); + } + } } - /* set allmulti flag to slaves */ - if ( (master->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI) ) - bond_set_allmulti(bond, 1); + if (bond_mode == BOND_MODE_ACTIVEBACKUP) { + if (old_active) { + bond_set_slave_inactive_flags(old_active); + } - if ( !(master->flags & IFF_ALLMULTI) && (bond->flags & IFF_ALLMULTI) ) - bond_set_allmulti(bond, -1); + if (new_active) { + bond_set_slave_active_flags(new_active); + } + } - bond->flags = master->flags; + if (USES_PRIMARY(bond_mode)) { + bond_mc_swap(bond, new_active, old_active); + } - /* looking for addresses to add to slaves' mc list */ - for (dmi = master->mc_list; dmi != NULL; dmi = dmi->next) { - if (bond_mc_list_find_dmi(dmi, bond->mc_list) == NULL) - bond_mc_add(bond, dmi->dmi_addr, dmi->dmi_addrlen); - } + if ((bond_mode == BOND_MODE_TLB) || + (bond_mode == BOND_MODE_ALB)) { + bond_alb_handle_active_change(bond, new_active); + } else { + bond->curr_active_slave = new_active; + } +} - /* looking for addresses to delete from slaves' list */ - for (dmi = bond->mc_list; dmi != NULL; dmi = dmi->next) { - if (bond_mc_list_find_dmi(dmi, master->mc_list) == NULL) - bond_mc_delete(bond, dmi->dmi_addr, dmi->dmi_addrlen); +/** + * bond_select_active_slave - select a new active slave, if needed + * @bond: our bonding struct + * + * This functions shoud be called when one of the following occurs: + * - The old curr_active_slave has been released or lost its link. + * - The primary_slave has got its link back. + * - A slave has got its link back and there's no old curr_active_slave. + * + * Warning: Caller must hold curr_slave_lock for writing. + */ +static void bond_select_active_slave(struct bonding *bond) +{ + struct slave *best_slave; + + best_slave = bond_find_best_slave(bond); + if (best_slave != bond->curr_active_slave) { + bond_change_active_slave(bond, best_slave); } +} +/*--------------------------- slave list handling ---------------------------*/ - /* save master's multicast list */ - bond_mc_list_destroy (bond); - bond_mc_list_copy (master->mc_list, bond, GFP_ATOMIC); +/* + * This function attaches the slave to the end of list. + * + * bond->lock held for writing by caller. + */ +static void bond_attach_slave(struct bonding *bond, struct slave *new_slave) +{ + if (bond->first_slave == NULL) { /* attaching the first slave */ + new_slave->next = new_slave; + new_slave->prev = new_slave; + bond->first_slave = new_slave; + } else { + new_slave->next = bond->first_slave; + new_slave->prev = bond->first_slave->prev; + new_slave->next->prev = new_slave; + new_slave->prev->next = new_slave; + } - write_unlock_bh(&bond->lock); + bond->slave_cnt++; } /* - * Update the mc list and multicast-related flags for the new and - * old active slaves (if any) according to the multicast mode, and - * promiscuous flags unconditionally. + * This function detaches the slave from the list. + * WARNING: no check is made to verify if the slave effectively + * belongs to . + * Nothing is freed on return, structures are just unchained. + * If any slave pointer in bond was pointing to , + * it should be changed by the calling function. + * + * bond->lock held for writing by caller. */ -static void bond_mc_update(bonding_t *bond, slave_t *new, slave_t *old) +static void bond_detach_slave(struct bonding *bond, struct slave *slave) { - struct dev_mc_list *dmi; + if (slave->next) { + slave->next->prev = slave->prev; + } - if (USES_PRIMARY(bond_mode)) { - if (bond->device->flags & IFF_PROMISC) { - if (old) - dev_set_promiscuity(old->dev, -1); - if (new) - dev_set_promiscuity(new->dev, 1); - } + if (slave->prev) { + slave->prev->next = slave->next; } - switch(multicast_mode) { - case BOND_MULTICAST_ACTIVE : - if (bond->device->flags & IFF_ALLMULTI) { - if (old) - dev_set_allmulti(old->dev, -1); - if (new) - dev_set_allmulti(new->dev, 1); - } - /* first remove all mc addresses from old slave if any, - and _then_ add them to new active slave */ - if (old) { - for (dmi = bond->device->mc_list; dmi != NULL; dmi = dmi->next) - dev_mc_delete(old->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); - } - if (new) { - for (dmi = bond->device->mc_list; dmi != NULL; dmi = dmi->next) - dev_mc_add(new->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); + if (bond->first_slave == slave) { /* slave is the first slave */ + if (bond->slave_cnt > 1) { /* there are more slave */ + bond->first_slave = slave->next; + } else { + bond->first_slave = NULL; /* slave was the last one */ } - break; - case BOND_MULTICAST_ALL : - /* nothing to do: mc list is already up-to-date on all slaves */ - break; - case BOND_MULTICAST_DISABLED : - break; } + + slave->next = NULL; + slave->prev = NULL; + bond->slave_cnt--; +} + +/*---------------------------------- IOCTL ----------------------------------*/ + +static int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev) +{ + dprintk("bond_dev=%p\n", bond_dev); + dprintk("slave_dev=%p\n", slave_dev); + dprintk("slave_dev->addr_len=%d\n", slave_dev->addr_len); + memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len); + return 0; } /* enslave device to bond device */ -static int bond_enslave(struct net_device *master_dev, - struct net_device *slave_dev) +static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) { - bonding_t *bond = NULL; - slave_t *new_slave = NULL; - unsigned long rflags = 0; - int err = 0; + struct bonding *bond = bond_dev->priv; + struct slave *new_slave = NULL; struct dev_mc_list *dmi; - struct in_ifaddr **ifap; - struct in_ifaddr *ifa; - int link_reporting; struct sockaddr addr; - - if (master_dev == NULL || slave_dev == NULL) { - return -ENODEV; - } - bond = (struct bonding *) master_dev->priv; + int link_reporting; + int res = 0; if (slave_dev->do_ioctl == NULL) { - printk(KERN_DEBUG - "Warning : no link monitoring support for %s\n", - slave_dev->name); + printk(KERN_WARNING DRV_NAME + ": Warning : no link monitoring support for %s\n", + slave_dev->name); } - /* bond must be initialized by bond_open() before enslaving */ - if (!(master_dev->flags & IFF_UP)) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error, master_dev is not up\n"); -#endif + if (!(bond_dev->flags & IFF_UP)) { + dprintk("Error, master_dev is not up\n"); return -EPERM; } /* already enslaved */ - if (master_dev->flags & IFF_SLAVE || slave_dev->flags & IFF_SLAVE) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error, Device was already enslaved\n"); -#endif + if (slave_dev->flags & IFF_SLAVE) { + dprintk("Error, Device was already enslaved\n"); return -EBUSY; } @@ -1376,19 +1203,19 @@ * slave interface to be closed. */ if ((slave_dev->flags & IFF_UP)) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error, slave_dev is up\n"); -#endif + printk(KERN_ERR DRV_NAME + ": Error: %s is up\n", + slave_dev->name); return -EPERM; } if (slave_dev->set_mac_address == NULL) { - printk(KERN_CRIT - "The slave device you specified does not support" - " setting the MAC address.\n"); - printk(KERN_CRIT - "Your kernel likely does not support slave" - " devices.\n"); + printk(KERN_ERR DRV_NAME + ": Error: The slave device you specified does " + "not support setting the MAC address.\n"); + printk(KERN_ERR + "Your kernel likely does not support slave " + "devices.\n"); return -EOPNOTSUPP; } @@ -1397,26 +1224,29 @@ * slave interface to be open. */ if (!(slave_dev->flags & IFF_UP)) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error, slave_dev is not running\n"); -#endif + printk(KERN_ERR DRV_NAME + ": Error: %s is not running\n", + slave_dev->name); return -EINVAL; } if ((bond_mode == BOND_MODE_8023AD) || - (bond_mode == BOND_MODE_TLB) || + (bond_mode == BOND_MODE_TLB) || (bond_mode == BOND_MODE_ALB)) { - printk(KERN_ERR - "bonding: Error: to use %s mode, you must " - "upgrade ifenslave.\n", bond_mode_name()); + printk(KERN_ERR DRV_NAME + ": Error: to use %s mode, you must upgrade " + "ifenslave.\n", + bond_mode_name()); return -EOPNOTSUPP; } } - if ((new_slave = kmalloc(sizeof(slave_t), GFP_KERNEL)) == NULL) { + new_slave = kmalloc(sizeof(struct slave), GFP_KERNEL); + if (!new_slave) { return -ENOMEM; } - memset(new_slave, 0, sizeof(slave_t)); + + memset(new_slave, 0, sizeof(struct slave)); /* save slave's original flags before calling * netdev_set_master and dev_open @@ -1430,37 +1260,29 @@ */ memcpy(new_slave->perm_hwaddr, slave_dev->dev_addr, ETH_ALEN); - if (bond->slave_cnt > 0) { - /* set slave to master's mac address - * The application already set the master's - * mac address to that of the first slave - */ - memcpy(addr.sa_data, master_dev->dev_addr, master_dev->addr_len); - addr.sa_family = slave_dev->type; - err = slave_dev->set_mac_address(slave_dev, &addr); - if (err) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error %d calling set_mac_address\n", err); -#endif - goto err_free; - } + /* set slave to master's mac address + * The application already set the master's + * mac address to that of the first slave + */ + memcpy(addr.sa_data, bond_dev->dev_addr, bond_dev->addr_len); + addr.sa_family = slave_dev->type; + res = slave_dev->set_mac_address(slave_dev, &addr); + if (res) { + dprintk("Error %d calling set_mac_address\n", res); + goto err_free; } /* open the slave since the application closed it */ - err = dev_open(slave_dev); - if (err) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Openning slave %s failed\n", slave_dev->name); -#endif + res = dev_open(slave_dev); + if (res) { + dprintk("Openning slave %s failed\n", slave_dev->name); goto err_restore_mac; } } - err = netdev_set_master(slave_dev, master_dev); - if (err) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Error %d calling netdev_set_master\n", err); -#endif + res = netdev_set_master(slave_dev, bond_dev); + if (res) { + dprintk("Error %d calling netdev_set_master\n", res); if (app_abi_ver < 1) { goto err_free; } else { @@ -1475,32 +1297,32 @@ /* bond_alb_init_slave() must be called before all other stages since * it might fail and we do not want to have to undo everything */ - err = bond_alb_init_slave(bond, new_slave); - if (err) { + res = bond_alb_init_slave(bond, new_slave); + if (res) { goto err_unset_master; } } - /* set promiscuity level to new slave */ - if (master_dev->flags & IFF_PROMISC) { - /* If the mode USES_PRIMARY, then the new slave gets the - * master's promisc (and mc) settings only if it becomes the - * current_slave, and that is taken care of later when calling - * bond_change_active() - */ - if (!USES_PRIMARY(bond_mode)) { - dev_set_promiscuity(slave_dev, 1); + /* If the mode USES_PRIMARY, then the new slave gets the + * master's promisc (and mc) settings only if it becomes the + * curr_active_slave, and that is taken care of later when calling + * bond_change_active() + */ + if (!USES_PRIMARY(bond_mode)) { + /* set promiscuity level to new slave */ + if (bond_dev->flags & IFF_PROMISC) { + dev_set_promiscuity(slave_dev, 1); } - } - - if (multicast_mode == BOND_MULTICAST_ALL) { + /* set allmulti level to new slave */ - if (master_dev->flags & IFF_ALLMULTI) - dev_set_allmulti(slave_dev, 1); - - /* upload master's mc_list to new slave */ - for (dmi = master_dev->mc_list; dmi != NULL; dmi = dmi->next) + if (bond_dev->flags & IFF_ALLMULTI) { + dev_set_allmulti(slave_dev, 1); + } + + /* upload master's mc_list to new slave */ + for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) { dev_mc_add (slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); + } } if (bond_mode == BOND_MODE_8023AD) { @@ -1511,15 +1333,16 @@ } write_lock_bh(&bond->lock); - + bond_attach_slave(bond, new_slave); + new_slave->delay = 0; new_slave->link_failure_count = 0; - if (miimon > 0 && !use_carrier) { + if (miimon && !use_carrier) { link_reporting = bond_check_dev_link(slave_dev, 1); - if ((link_reporting == -1) && (arp_interval == 0)) { + if ((link_reporting == -1) && !arp_interval) { /* * miimon is set but a bonded network driver * does not support ETHTOOL/MII and @@ -1528,115 +1351,97 @@ * here (because netif_carrier is always * supported); thus, we don't need to change * the messages for netif_carrier. - */ - printk(KERN_ERR - "bond_enslave(): MII and ETHTOOL support not " - "available for interface %s, and " - "arp_interval/arp_ip_target module parameters " - "not specified, thus bonding will not detect " - "link failures! see bonding.txt for details.\n", - slave_dev->name); + */ + printk(KERN_WARNING DRV_NAME + ": Warning: MII and ETHTOOL support not " + "available for interface %s, and " + "arp_interval/arp_ip_target module parameters " + "not specified, thus bonding will not detect " + "link failures! see bonding.txt for details.\n", + slave_dev->name); } else if (link_reporting == -1) { - /* unable get link status using mii/ethtool */ - printk(KERN_WARNING - "bond_enslave: can't get link status from " + /* unable get link status using mii/ethtool */ + printk(KERN_WARNING DRV_NAME + ": Warning: can't get link status from " "interface %s; the network driver associated " - "with this interface does not support " - "MII or ETHTOOL link status reporting, thus " - "miimon has no effect on this interface.\n", + "with this interface does not support MII or " + "ETHTOOL link status reporting, thus miimon " + "has no effect on this interface.\n", slave_dev->name); } } /* check for initial state */ - if ((miimon <= 0) || + if (!miimon || (bond_check_dev_link(slave_dev, 0) == BMSR_LSTATUS)) { if (updelay) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Initial state of slave_dev is " - "BOND_LINK_BACK\n"); -#endif + dprintk("Initial state of slave_dev is " + "BOND_LINK_BACK\n"); new_slave->link = BOND_LINK_BACK; new_slave->delay = updelay; - } - else { -#ifdef BONDING_DEBUG - printk(KERN_DEBUG "Initial state of slave_dev is " + } else { + dprintk("Initial state of slave_dev is " "BOND_LINK_UP\n"); -#endif new_slave->link = BOND_LINK_UP; } new_slave->jiffies = jiffies; - } - else { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "Initial state of slave_dev is " + } else { + dprintk("Initial state of slave_dev is " "BOND_LINK_DOWN\n"); -#endif new_slave->link = BOND_LINK_DOWN; } if (bond_update_speed_duplex(new_slave) && (new_slave->link != BOND_LINK_DOWN)) { - - printk(KERN_WARNING - "bond_enslave(): failed to get speed/duplex from %s, " - "speed forced to 100Mbps, duplex forced to Full.\n", + printk(KERN_WARNING DRV_NAME + ": Warning: failed to get speed/duplex from %s, speed " + "forced to 100Mbps, duplex forced to Full.\n", new_slave->dev->name); + if (bond_mode == BOND_MODE_8023AD) { printk(KERN_WARNING - "Operation of 802.3ad mode requires ETHTOOL support " - "in base driver for proper aggregator selection.\n"); + "Operation of 802.3ad mode requires ETHTOOL " + "support in base driver for proper aggregator " + "selection.\n"); } } - /* if we're in active-backup mode, we need one and only one active - * interface. The backup interfaces will have their NOARP flag set - * because we need them to be completely deaf and not to respond to - * any ARP request on the network to avoid fooling a switch. Thus, - * since we guarantee that current_slave always point to the last - * usable interface, we just have to verify this interface's flag. - */ - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - if (((bond->current_slave == NULL) - || (bond->current_slave->dev->flags & IFF_NOARP)) - && (new_slave->link != BOND_LINK_DOWN)) { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "This is the first active slave\n"); -#endif + if (USES_PRIMARY(bond_mode) && primary) { + /* if there is a primary slave, remember it */ + if (strcmp(primary, new_slave->dev->name) == 0) { + bond->primary_slave = new_slave; + } + } + + switch (bond_mode) { + case BOND_MODE_ACTIVEBACKUP: + /* if we're in active-backup mode, we need one and only one active + * interface. The backup interfaces will have their NOARP flag set + * because we need them to be completely deaf and not to respond to + * any ARP request on the network to avoid fooling a switch. Thus, + * since we guarantee that curr_active_slave always point to the last + * usable interface, we just have to verify this interface's flag. + */ + if (((!bond->curr_active_slave) || + (bond->curr_active_slave->dev->flags & IFF_NOARP)) && + (new_slave->link != BOND_LINK_DOWN)) { + dprintk("This is the first active slave\n"); /* first slave or no active slave yet, and this link is OK, so make this interface the active one */ - change_active_interface(bond, new_slave); - } - else { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "This is just a backup slave\n"); -#endif + bond_change_active_slave(bond, new_slave); + } else { + dprintk("This is just a backup slave\n"); bond_set_slave_inactive_flags(new_slave); } - if (((struct in_device *)slave_dev->ip_ptr) != NULL) { - read_lock_irqsave(&(((struct in_device *)slave_dev->ip_ptr)->lock), rflags); - ifap= &(((struct in_device *)slave_dev->ip_ptr)->ifa_list); - ifa = *ifap; - if (ifa != NULL) - my_ip = ifa->ifa_address; - read_unlock_irqrestore(&(((struct in_device *)slave_dev->ip_ptr)->lock), rflags); - } - - /* if there is a primary slave, remember it */ - if (primary != NULL) { - if (strcmp(primary, new_slave->dev->name) == 0) { - bond->primary_slave = new_slave; - } - } - } else if (bond_mode == BOND_MODE_8023AD) { + break; + case BOND_MODE_8023AD: /* in 802.3ad mode, the internal mechanism * will activate the slaves in the selected * aggregator */ bond_set_slave_inactive_flags(new_slave); /* if this is the first slave */ - if (new_slave == bond->next) { + if (bond->slave_cnt == 1) { SLAVE_AD_INFO(new_slave).id = 1; /* Initialize AD with the number of times that the AD timer is called in 1 second * can be called only after the mac address of the bond is set @@ -1645,40 +1450,37 @@ lacp_fast); } else { SLAVE_AD_INFO(new_slave).id = - SLAVE_AD_INFO(new_slave->prev).id + 1; + SLAVE_AD_INFO(new_slave->prev).id + 1; } bond_3ad_bind_slave(new_slave); - } else if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { + break; + case BOND_MODE_TLB: + case BOND_MODE_ALB: new_slave->state = BOND_STATE_ACTIVE; - if ((bond->current_slave == NULL) && (new_slave->link != BOND_LINK_DOWN)) { + if ((!bond->curr_active_slave) && + (new_slave->link != BOND_LINK_DOWN)) { /* first slave or no active slave yet, and this link * is OK, so make this interface the active one */ - change_active_interface(bond, new_slave); + bond_change_active_slave(bond, new_slave); } + break; + default: + dprintk("This slave is always active in trunk mode\n"); - /* if there is a primary slave, remember it */ - if (primary != NULL) { - if (strcmp(primary, new_slave->dev->name) == 0) { - bond->primary_slave = new_slave; - } - } - } else { -#ifdef BONDING_DEBUG - printk(KERN_CRIT "This slave is always active in trunk mode\n"); -#endif /* always active in trunk mode */ new_slave->state = BOND_STATE_ACTIVE; - /* In trunking mode there is little meaning to current_slave + /* In trunking mode there is little meaning to curr_active_slave * anyway (it holds no special properties of the bond device), * so we can change it without calling change_active_interface() */ - if (bond->current_slave == NULL) - bond->current_slave = new_slave; - } + if (!bond->curr_active_slave) { + bond->curr_active_slave = new_slave; + } + break; + } /* switch(bond_mode) */ write_unlock_bh(&bond->lock); @@ -1692,38 +1494,34 @@ */ int ndx = 0; - for (ndx = 0; ndx < slave_dev->addr_len; ndx++) { -#ifdef BONDING_DEBUG - printk(KERN_DEBUG - "Checking ndx=%d of master_dev->dev_addr\n", ndx); -#endif - if (master_dev->dev_addr[ndx] != 0) { -#ifdef BONDING_DEBUG - printk(KERN_DEBUG - "Found non-zero byte at ndx=%d\n", ndx); -#endif + for (ndx = 0; ndx < bond_dev->addr_len; ndx++) { + dprintk("Checking ndx=%d of bond_dev->dev_addr\n", + ndx); + if (bond_dev->dev_addr[ndx] != 0) { + dprintk("Found non-zero byte at ndx=%d\n", + ndx); break; } } - if (ndx == slave_dev->addr_len) { + + if (ndx == bond_dev->addr_len) { /* * We got all the way through the address and it was * all 0's. */ -#ifdef BONDING_DEBUG - printk(KERN_DEBUG "%s doesn't have a MAC address yet. ", - master_dev->name); - printk(KERN_DEBUG "Going to give assign it from %s.\n", - slave_dev->name); -#endif - bond_sethwaddr(master_dev, slave_dev); + dprintk("%s doesn't have a MAC address yet. \n", + bond_dev->name); + dprintk("Going to give assign it from %s.\n", + slave_dev->name); + bond_sethwaddr(bond_dev, slave_dev); } } - printk (KERN_INFO "%s: enslaving %s as a%s interface with a%s link.\n", - master_dev->name, slave_dev->name, - new_slave->state == BOND_STATE_ACTIVE ? "n active" : " backup", - new_slave->link != BOND_LINK_DOWN ? "n up" : " down"); + printk(KERN_INFO DRV_NAME + ": %s: enslaving %s as a%s interface with a%s link.\n", + bond_dev->name, slave_dev->name, + new_slave->state == BOND_STATE_ACTIVE ? "n active" : " backup", + new_slave->link != BOND_LINK_DOWN ? "n up" : " down"); /* enslave is successful */ return 0; @@ -1742,435 +1540,204 @@ err_free: kfree(new_slave); - return err; + return res; } -/* - * This function changes the active slave to slave . - * It returns -EINVAL in the following cases. - * - is not found in the list. - * - There is not active slave now. - * - is already active. - * - The link state of is not BOND_LINK_UP. - * - is not running. - * In these cases, this fuction does nothing. - * In the other cases, currnt_slave pointer is changed and 0 is returned. +/* + * Try to release the slave device from the bond device + * It is legal to access curr_active_slave without a lock because all the function + * is write-locked. + * + * The rules for slave state should be: + * for Active/Backup: + * Active stays on all backups go down + * for Bonded connections: + * The first up interface should be left on and all others downed. */ -static int bond_change_active(struct net_device *master_dev, struct net_device *slave_dev) +static int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) { - bonding_t *bond; - slave_t *slave; - slave_t *oldactive = NULL; - slave_t *newactive = NULL; - int ret = 0; - - if (master_dev == NULL || slave_dev == NULL) { - return -ENODEV; - } + struct bonding *bond = bond_dev->priv; + struct slave *slave; + struct sockaddr addr; + int mac_addr_differ; - /* Verify that master_dev is indeed the master of slave_dev */ + /* slave is not a slave or master is not master of this slave */ if (!(slave_dev->flags & IFF_SLAVE) || - (slave_dev->master != master_dev)) { - + (slave_dev->master != bond_dev)) { + printk(KERN_ERR DRV_NAME + ": Error: %s: cannot release %s.\n", + bond_dev->name, slave_dev->name); return -EINVAL; } - bond = (struct bonding *) master_dev->priv; write_lock_bh(&bond->lock); - slave = (slave_t *)bond; - oldactive = bond->current_slave; - - while ((slave = slave->prev) != (slave_t *)bond) { - if(slave_dev == slave->dev) { - newactive = slave; - break; - } - } - - /* - * Changing to the current active: do nothing; return success. - */ - if (newactive && (newactive == oldactive)) { - write_unlock_bh(&bond->lock); - return 0; - } - if ((newactive != NULL)&& - (oldactive != NULL)&& - (newactive->link == BOND_LINK_UP)&& - IS_UP(newactive->dev)) { - change_active_interface(bond, newactive); - } else { - ret = -EINVAL; - } - write_unlock_bh(&bond->lock); - return ret; -} - -/** - * find_best_interface - select the best available slave to be the active one - * @bond: our bonding struct - * - * Warning: Caller must hold ptrlock for writing. - */ -static struct slave *find_best_interface(struct bonding *bond) -{ - struct slave *newslave, *oldslave; - struct slave *bestslave = NULL; - int mintime; - - newslave = oldslave = bond->current_slave; - - if (newslave == NULL) { /* there were no active slaves left */ - if (bond->next != (slave_t *)bond) { /* found one slave */ - newslave = bond->next; - } else { - return NULL; /* still no slave, return NULL */ - } + slave = bond_get_slave_by_dev(bond, slave_dev); + if (!slave) { + /* not a slave of this bond */ + printk(KERN_INFO DRV_NAME + ": %s: %s not enslaved\n", + bond_dev->name, slave_dev->name); + return -EINVAL; } - mintime = updelay; - - /* first try the primary link; if arping, a link must tx/rx traffic - * before it can be considered the current_slave - also, we would skip - * slaves between the current_slave and primary_slave that may be up - * and able to arp - */ - if ((bond->primary_slave != NULL) && (arp_interval == 0)) { - if (IS_UP(bond->primary_slave->dev)) - newslave = bond->primary_slave; + mac_addr_differ = memcmp(bond_dev->dev_addr, + slave->perm_hwaddr, + ETH_ALEN); + if (!mac_addr_differ && (bond->slave_cnt > 1)) { + printk(KERN_WARNING DRV_NAME + ": Warning: the permanent HWaddr of %s " + "- %02X:%02X:%02X:%02X:%02X:%02X - is " + "still in use by %s. Set the HWaddr of " + "%s to a different address to avoid " + "conflicts.\n", + slave_dev->name, + slave->perm_hwaddr[0], + slave->perm_hwaddr[1], + slave->perm_hwaddr[2], + slave->perm_hwaddr[3], + slave->perm_hwaddr[4], + slave->perm_hwaddr[5], + bond_dev->name, + slave_dev->name); } - /* remember where to stop iterating over the slaves */ - oldslave = newslave; - - do { - if (IS_UP(newslave->dev)) { - if (newslave->link == BOND_LINK_UP) { - return newslave; - } - else if (newslave->link == BOND_LINK_BACK) { - /* link up, but waiting for stabilization */ - if (newslave->delay < mintime) { - mintime = newslave->delay; - bestslave = newslave; - } - } - } - } while ((newslave = newslave->next) != oldslave); - - return bestslave; -} - -/** - * change_active_interface - change the active slave into the specified one - * @bond: our bonding struct - * @new: the new slave to make the active one - * - * Set the new slave to the bond's settings and unset them on the old - * current_slave. - * Setting include flags, mc-list, promiscuity, allmulti, etc. - * - * If @new's link state is %BOND_LINK_BACK we'll set it to %BOND_LINK_UP, - * because it is apparently the best available slave we have, even though its - * updelay hasn't timed out yet. - * - * Warning: Caller must hold ptrlock for writing. - */ -static void change_active_interface(struct bonding *bond, struct slave *new) -{ - struct slave *old = bond->current_slave; - - if (old == new) { - return; + /* Inform AD package of unbinding of slave. */ + if (bond_mode == BOND_MODE_8023AD) { + /* must be called before the slave is + * detached from the list + */ + bond_3ad_unbind_slave(slave); } - if (new) { - if (new->link == BOND_LINK_BACK) { - if (USES_PRIMARY(bond_mode)) { - printk (KERN_INFO - "%s: making interface %s the new " - "active one %d ms earlier.\n", - bond->device->name, new->dev->name, - (updelay - new->delay) * miimon); - } + printk(KERN_INFO DRV_NAME + ": %s: releasing %s interface %s\n", + bond_dev->name, + (slave->state == BOND_STATE_ACTIVE) + ? "active" : "backup", + slave_dev->name); - new->delay = 0; - new->link = BOND_LINK_UP; - new->jiffies = jiffies; + bond->current_arp_slave = NULL; - if (bond_mode == BOND_MODE_8023AD) { - bond_3ad_handle_link_change(new, BOND_LINK_UP); - } + /* release the slave from its bond */ + bond_detach_slave(bond, slave); - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - bond_alb_handle_link_change(bond, new, BOND_LINK_UP); - } - } else { - if (USES_PRIMARY(bond_mode)) { - printk (KERN_INFO - "%s: making interface %s the new active one.\n", - bond->device->name, new->dev->name); - } - } + if (bond->primary_slave == slave) { + bond->primary_slave = NULL; } - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - if (old) { - bond_set_slave_inactive_flags(old); - } - - if (new) { - bond_set_slave_active_flags(new); - } + if (bond->curr_active_slave == slave) { + bond_change_active_slave(bond, NULL); + bond_select_active_slave(bond); } - if (USES_PRIMARY(bond_mode)) { - bond_mc_update(bond, new, old); + if (!bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); } if ((bond_mode == BOND_MODE_TLB) || (bond_mode == BOND_MODE_ALB)) { - bond_alb_assign_current_slave(bond, new); - } else { - bond->current_slave = new; - } -} - -/** - * reselect_active_interface - select a new active slave, if needed - * @bond: our bonding struct - * - * This functions shoud be called when one of the following occurs: - * - The old current_slave has been released or lost its link. - * - The primary_slave has got its link back. - * - A slave has got its link back and there's no old current_slave. - * - * Warning: Caller must hold ptrlock for writing. - */ -static void reselect_active_interface(struct bonding *bond) -{ - struct slave *best_slave; - - best_slave = find_best_interface(bond); - - if (best_slave != bond->current_slave) { - change_active_interface(bond, best_slave); - } -} - -/* - * Try to release the slave device from the bond device - * It is legal to access current_slave without a lock because all the function - * is write-locked. - * - * The rules for slave state should be: - * for Active/Backup: - * Active stays on all backups go down - * for Bonded connections: - * The first up interface should be left on and all others downed. - */ -static int bond_release(struct net_device *master, struct net_device *slave) -{ - bonding_t *bond; - slave_t *our_slave, *old_current; - struct sockaddr addr; - - if (master == NULL || slave == NULL) { - return -ENODEV; - } - - bond = (struct bonding *) master->priv; - - /* master already enslaved, or slave not enslaved, - or no slave for this master */ - if ((master->flags & IFF_SLAVE) || !(slave->flags & IFF_SLAVE)) { - printk (KERN_DEBUG "%s: cannot release %s.\n", master->name, slave->name); - return -EINVAL; + /* must be called only after the slave has been + * detached from the list and the curr_active_slave + * has been replaced (if our_slave == old_current) + */ + bond_alb_deinit_slave(bond, slave); } - write_lock_bh(&bond->lock); - bond->current_arp_slave = NULL; - our_slave = (slave_t *)bond; - old_current = bond->current_slave; - while ((our_slave = our_slave->prev) != (slave_t *)bond) { - if (our_slave->dev == slave) { - int mac_addr_differ = memcmp(bond->device->dev_addr, - our_slave->perm_hwaddr, - ETH_ALEN); - if (!mac_addr_differ && (bond->slave_cnt > 1)) { - printk(KERN_WARNING "WARNING: the permanent HWaddr of %s " - "- %02X:%02X:%02X:%02X:%02X:%02X - " - "is still in use by %s. Set the HWaddr " - "of %s to a different address " - "to avoid conflicts.\n", - slave->name, - our_slave->perm_hwaddr[0], - our_slave->perm_hwaddr[1], - our_slave->perm_hwaddr[2], - our_slave->perm_hwaddr[3], - our_slave->perm_hwaddr[4], - our_slave->perm_hwaddr[5], - bond->device->name, - slave->name); - } - - /* Inform AD package of unbinding of slave. */ - if (bond_mode == BOND_MODE_8023AD) { - /* must be called before the slave is - * detached from the list - */ - bond_3ad_unbind_slave(our_slave); - } - - printk (KERN_INFO "%s: releasing %s interface %s\n", - master->name, - (our_slave->state == BOND_STATE_ACTIVE) ? "active" : "backup", - slave->name); - - /* release the slave from its bond */ - bond_detach_slave(bond, our_slave); - - if (bond->primary_slave == our_slave) { - bond->primary_slave = NULL; - } - - if (bond->current_slave == our_slave) { - change_active_interface(bond, NULL); - reselect_active_interface(bond); - } - - if (bond->current_slave == NULL) { - printk(KERN_INFO - "%s: now running without any active interface !\n", - master->name); - } - - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - /* must be called only after the slave has been - * detached from the list and the current_slave - * has been replaced (if our_slave == old_current) - */ - bond_alb_deinit_slave(bond, our_slave); - } - - break; - } - - } write_unlock_bh(&bond->lock); - - if (our_slave == (slave_t *)bond) { - /* if we get here, it's because the device was not found */ - printk (KERN_INFO "%s: %s not enslaved\n", master->name, slave->name); - return -EINVAL; - } - /* unset promiscuity level from slave */ - if (master->flags & IFF_PROMISC) { - /* If the mode USES_PRIMARY, then we should only remove its - * promisc settings if it was the current_slave, but that was - * already taken care of above when we detached the slave - */ - if (!USES_PRIMARY(bond_mode)) { - dev_set_promiscuity(slave, -1); + /* If the mode USES_PRIMARY, then we should only remove its + * promisc and mc settings if it was the curr_active_slave, but that was + * already taken care of above when we detached the slave + */ + if (!USES_PRIMARY(bond_mode)) { + /* unset promiscuity level from slave */ + if (bond_dev->flags & IFF_PROMISC) { + dev_set_promiscuity(slave_dev, -1); } - } - /* undo settings and restore original values */ - if (multicast_mode == BOND_MULTICAST_ALL) { - /* flush master's mc_list from slave */ - bond_mc_list_flush (slave, master); + /* unset allmulti level from slave */ + if (bond_dev->flags & IFF_ALLMULTI) { + dev_set_allmulti(slave_dev, -1); + } - /* unset allmulti level from slave */ - if (master->flags & IFF_ALLMULTI) - dev_set_allmulti(slave, -1); + /* flush master's mc_list from slave */ + bond_mc_list_flush(bond_dev, slave_dev); } - netdev_set_master(slave, NULL); + netdev_set_master(slave_dev, NULL); /* close slave before restoring its mac address */ - dev_close(slave); + dev_close(slave_dev); if (app_abi_ver >= 1) { /* restore original ("permanent") mac address */ - memcpy(addr.sa_data, our_slave->perm_hwaddr, ETH_ALEN); - addr.sa_family = slave->type; - slave->set_mac_address(slave, &addr); + memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN); + addr.sa_family = slave_dev->type; + slave_dev->set_mac_address(slave_dev, &addr); } /* restore the original state of the * IFF_NOARP flag that might have been * set by bond_set_slave_inactive_flags() */ - if ((our_slave->original_flags & IFF_NOARP) == 0) { - slave->flags &= ~IFF_NOARP; + if ((slave->original_flags & IFF_NOARP) == 0) { + slave_dev->flags &= ~IFF_NOARP; } - kfree(our_slave); + kfree(slave); /* if the last slave was removed, zero the mac address * of the master so it will be set by the application * to the mac address of the first slave */ - if (bond->next == (slave_t*)bond) { - memset(master->dev_addr, 0, master->addr_len); + if (bond->slave_cnt == 0) { + memset(bond_dev->dev_addr, 0, bond_dev->addr_len); } return 0; /* deletion OK */ } -/* +/* * This function releases all slaves. */ -static int bond_release_all(struct net_device *master) +static int bond_release_all(struct net_device *bond_dev) { - bonding_t *bond; - slave_t *our_slave, *old_current; + struct bonding *bond = bond_dev->priv; + struct slave *slave; struct net_device *slave_dev; struct sockaddr addr; - int err = 0; - - if (master == NULL) { - return -ENODEV; - } - - if (master->flags & IFF_SLAVE) { - return -EINVAL; - } - - bond = (struct bonding *) master->priv; write_lock_bh(&bond->lock); - if (bond->next == (struct slave *) bond) { - err = -EINVAL; + + if (bond->slave_cnt == 0) { goto out; } - old_current = bond->current_slave; - change_active_interface(bond, NULL); bond->current_arp_slave = NULL; bond->primary_slave = NULL; + bond_change_active_slave(bond, NULL); - while ((our_slave = bond->prev) != (slave_t *)bond) { + while ((slave = bond->first_slave) != NULL) { /* Inform AD package of unbinding of slave * before slave is detached from the list. */ if (bond_mode == BOND_MODE_8023AD) { - bond_3ad_unbind_slave(our_slave); + bond_3ad_unbind_slave(slave); } - slave_dev = our_slave->dev; - bond_detach_slave(bond, our_slave); + slave_dev = slave->dev; + bond_detach_slave(bond, slave); if ((bond_mode == BOND_MODE_TLB) || (bond_mode == BOND_MODE_ALB)) { /* must be called only after the slave * has been detached from the list */ - bond_alb_deinit_slave(bond, our_slave); + bond_alb_deinit_slave(bond, slave); } /* now that the slave is detached, unlock and perform @@ -2179,20 +1746,23 @@ */ write_unlock_bh(&bond->lock); - /* unset promiscuity level from slave */ - if (master->flags & IFF_PROMISC) { - if (!USES_PRIMARY(bond_mode)) { - dev_set_promiscuity(slave_dev, -1); + /* If the mode USES_PRIMARY, then we should only remove its + * promisc and mc settings if it was the curr_active_slave, but that was + * already taken care of above when we detached the slave + */ + if (!USES_PRIMARY(bond_mode)) { + /* unset promiscuity level from slave */ + if (bond_dev->flags & IFF_PROMISC) { + dev_set_promiscuity(slave_dev, -1); } - } - if (multicast_mode == BOND_MULTICAST_ALL) { - /* flush master's mc_list from slave */ - bond_mc_list_flush (slave_dev, master); - - /* unset allmulti level from slave */ - if (master->flags & IFF_ALLMULTI) - dev_set_allmulti(slave_dev, -1); + /* unset allmulti level from slave */ + if (bond_dev->flags & IFF_ALLMULTI) { + dev_set_allmulti(slave_dev, -1); + } + + /* flush master's mc_list from slave */ + bond_mc_list_flush(bond_dev, slave_dev); } netdev_set_master(slave_dev, NULL); @@ -2202,7 +1772,7 @@ if (app_abi_ver >= 1) { /* restore original ("permanent") mac address*/ - memcpy(addr.sa_data, our_slave->perm_hwaddr, ETH_ALEN); + memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN); addr.sa_family = slave_dev->type; slave_dev->set_mac_address(slave_dev, &addr); } @@ -2210,11 +1780,11 @@ /* restore the original state of the IFF_NOARP flag that might have * been set by bond_set_slave_inactive_flags() */ - if ((our_slave->original_flags & IFF_NOARP) == 0) { + if ((slave->original_flags & IFF_NOARP) == 0) { slave_dev->flags &= ~IFF_NOARP; } - kfree(our_slave); + kfree(slave); /* re-acquire the lock before getting the next slave */ write_lock_bh(&bond->lock); @@ -2224,72 +1794,234 @@ * set by the application to the mac address of the * first slave */ - memset(master->dev_addr, 0, master->addr_len); + memset(bond_dev->dev_addr, 0, bond_dev->addr_len); - printk (KERN_INFO "%s: released all slaves\n", master->name); + printk(KERN_INFO DRV_NAME + ": %s: released all slaves\n", + bond_dev->name); out: write_unlock_bh(&bond->lock); - return err; + return 0; +} + +/* + * This function changes the active slave to slave . + * It returns -EINVAL in the following cases. + * - is not found in the list. + * - There is not active slave now. + * - is already active. + * - The link state of is not BOND_LINK_UP. + * - is not running. + * In these cases, this fuction does nothing. + * In the other cases, currnt_slave pointer is changed and 0 is returned. + */ +static int bond_ioctl_change_active(struct net_device *bond_dev, struct net_device *slave_dev) +{ + struct bonding *bond = bond_dev->priv; + struct slave *old_active = NULL; + struct slave *new_active = NULL; + int res = 0; + + /* Verify that master_dev is indeed the master of slave_dev */ + if (!(slave_dev->flags & IFF_SLAVE) || + (slave_dev->master != bond_dev)) { + return -EINVAL; + } + + write_lock_bh(&bond->lock); + + old_active = bond->curr_active_slave; + new_active = bond_get_slave_by_dev(bond, slave_dev); + + /* + * Changing to the current active: do nothing; return success. + */ + if (new_active && (new_active == old_active)) { + write_unlock_bh(&bond->lock); + return 0; + } + + if ((new_active) && + (old_active) && + (new_active->link == BOND_LINK_UP) && + IS_UP(new_active->dev)) { + bond_change_active_slave(bond, new_active); + } else { + res = -EINVAL; + } + + write_unlock_bh(&bond->lock); + + return res; +} + +static int bond_ethtool_ioctl(struct net_device *bond_dev, struct ifreq *ifr) +{ + struct ethtool_drvinfo info; + void *addr = ifr->ifr_data; + uint32_t cmd; + + if (get_user(cmd, (uint32_t *)addr)) { + return -EFAULT; + } + + switch (cmd) { + case ETHTOOL_GDRVINFO: + if (copy_from_user(&info, addr, sizeof(info))) { + return -EFAULT; + } + + if (strcmp(info.driver, "ifenslave") == 0) { + int new_abi_ver; + char *endptr; + + new_abi_ver = simple_strtoul(info.fw_version, + &endptr, 0); + if (*endptr) { + printk(KERN_ERR DRV_NAME + ": Error: got invalid ABI " + "version from application\n"); + + return -EINVAL; + } + + if (orig_app_abi_ver == -1) { + orig_app_abi_ver = new_abi_ver; + } + + app_abi_ver = new_abi_ver; + } + + strncpy(info.driver, DRV_NAME, 32); + strncpy(info.version, DRV_VERSION, 32); + snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION); + + if (copy_to_user(addr, &info, sizeof(info))) { + return -EFAULT; + } + + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int bond_info_query(struct net_device *bond_dev, struct ifbond *info) +{ + struct bonding *bond = bond_dev->priv; + + info->bond_mode = bond_mode; + info->miimon = miimon; + + read_lock_bh(&bond->lock); + info->num_slaves = bond->slave_cnt; + read_unlock_bh(&bond->lock); + + return 0; +} + +static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *info) +{ + struct bonding *bond = bond_dev->priv; + struct slave *slave; + int i, found = 0; + + if (info->slave_id < 0) { + return -ENODEV; + } + + read_lock_bh(&bond->lock); + + bond_for_each_slave(bond, slave, i) { + if (i == (int)info->slave_id) { + found = 1; + break; + } + } + + read_unlock_bh(&bond->lock); + + if (found) { + strcpy(info->slave_name, slave->dev->name); + info->link = slave->link; + info->state = slave->state; + info->link_failure_count = slave->link_failure_count; + } else { + return -ENODEV; + } + + return 0; } +/*-------------------------------- Monitoring -------------------------------*/ + /* this function is called regularly to monitor each slave's link. */ -static void bond_mii_monitor(struct net_device *master) +static void bond_mii_monitor(struct net_device *bond_dev) { - bonding_t *bond = (struct bonding *) master->priv; - slave_t *slave, *oldcurrent; - int slave_died = 0; + struct bonding *bond = bond_dev->priv; + struct slave *slave, *oldcurrent; int do_failover = 0; + int delta_in_ticks = (miimon * HZ) / 1000; + int i; read_lock(&bond->lock); + if (bond->kill_timers) { + goto out; + } + + if (bond->slave_cnt == 0) { + goto re_arm; + } + /* we will try to read the link status of each of our slaves, and * set their IFF_RUNNING flag appropriately. For each slave not * supporting MII status, we won't do anything so that a user-space * program could monitor the link itself if needed. */ - slave = (slave_t *)bond; + read_lock(&bond->curr_slave_lock); + oldcurrent = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); - read_lock(&bond->ptrlock); - oldcurrent = bond->current_slave; - read_unlock(&bond->ptrlock); - - while ((slave = slave->prev) != (slave_t *)bond) { - struct net_device *dev = slave->dev; + bond_for_each_slave(bond, slave, i) { + struct net_device *slave_dev = slave->dev; int link_state; u16 old_speed = slave->speed; u8 old_duplex = slave->duplex; - - link_state = bond_check_dev_link(dev, 0); + + link_state = bond_check_dev_link(slave_dev, 0); switch (slave->link) { case BOND_LINK_UP: /* the link was up */ if (link_state == BMSR_LSTATUS) { /* link stays up, nothing more to do */ break; - } - else { /* link going down */ + } else { /* link going down */ slave->link = BOND_LINK_FAIL; slave->delay = downdelay; + if (slave->link_failure_count < UINT_MAX) { slave->link_failure_count++; } - if (downdelay > 0) { - printk (KERN_INFO - "%s: link status down for %sinterface " - "%s, disabling it in %d ms.\n", - master->name, - IS_UP(dev) - ? ((bond_mode == BOND_MODE_ACTIVEBACKUP) - ? ((slave == oldcurrent) - ? "active " : "backup ") - : "") - : "idle ", - dev->name, - downdelay * miimon); - } + + if (downdelay) { + printk(KERN_INFO DRV_NAME + ": %s: link status down for %s " + "interface %s, disabling it in " + "%d ms.\n", + bond_dev->name, + IS_UP(slave_dev) + ? ((bond_mode == BOND_MODE_ACTIVEBACKUP) + ? ((slave == oldcurrent) + ? "active " : "backup ") + : "") + : "idle ", + slave_dev->name, + downdelay * miimon); + } } /* no break ! fall through the BOND_LINK_FAIL test to ensure proper action to be taken @@ -2300,6 +2032,7 @@ if (slave->delay <= 0) { /* link down for too long time */ slave->link = BOND_LINK_DOWN; + /* in active/backup mode, we must * completely disable this interface */ @@ -2308,11 +2041,12 @@ bond_set_slave_inactive_flags(slave); } - printk(KERN_INFO - "%s: link status definitely down " - "for interface %s, disabling it", - master->name, - dev->name); + printk(KERN_INFO DRV_NAME + ": %s: link status definitely " + "down for interface %s, " + "disabling it\n", + bond_dev->name, + slave_dev->name); /* notify ad that the link status has changed */ if (bond_mode == BOND_MODE_8023AD) { @@ -2327,8 +2061,6 @@ if (slave == oldcurrent) { do_failover = 1; } - - slave_died = 1; } else { slave->delay--; } @@ -2336,12 +2068,12 @@ /* link up again */ slave->link = BOND_LINK_UP; slave->jiffies = jiffies; - printk(KERN_INFO - "%s: link status up again after %d ms " - "for interface %s.\n", - master->name, - (downdelay - slave->delay) * miimon, - dev->name); + printk(KERN_INFO DRV_NAME + ": %s: link status up again after %d " + "ms for interface %s.\n", + bond_dev->name, + (downdelay - slave->delay) * miimon, + slave_dev->name); } break; case BOND_LINK_DOWN: /* the link was down */ @@ -2351,16 +2083,17 @@ } else { /* link going up */ slave->link = BOND_LINK_BACK; slave->delay = updelay; - - if (updelay > 0) { + + if (updelay) { /* if updelay == 0, no need to advertise about a 0 ms delay */ - printk (KERN_INFO - "%s: link status up for interface" - " %s, enabling it in %d ms.\n", - master->name, - dev->name, - updelay * miimon); + printk(KERN_INFO DRV_NAME + ": %s: link status up for " + "interface %s, enabling it " + "in %d ms.\n", + bond_dev->name, + slave_dev->name, + updelay * miimon); } } /* no break ! fall through the BOND_LINK_BACK state in @@ -2370,12 +2103,13 @@ if (link_state != BMSR_LSTATUS) { /* link down again */ slave->link = BOND_LINK_DOWN; - printk(KERN_INFO - "%s: link status down again after %d ms " - "for interface %s.\n", - master->name, - (updelay - slave->delay) * miimon, - dev->name); + + printk(KERN_INFO DRV_NAME + ": %s: link status down again after %d " + "ms for interface %s.\n", + bond_dev->name, + (updelay - slave->delay) * miimon, + slave_dev->name); } else { /* link stays up */ if (slave->delay == 0) { @@ -2386,8 +2120,7 @@ if (bond_mode == BOND_MODE_8023AD) { /* prevent it from being the active one */ slave->state = BOND_STATE_BACKUP; - } - else if (bond_mode != BOND_MODE_ACTIVEBACKUP) { + } else if (bond_mode != BOND_MODE_ACTIVEBACKUP) { /* make it immediately active */ slave->state = BOND_STATE_ACTIVE; } else if (slave != bond->primary_slave) { @@ -2395,12 +2128,12 @@ slave->state = BOND_STATE_BACKUP; } - printk(KERN_INFO - "%s: link status definitely up " - "for interface %s.\n", - master->name, - dev->name); - + printk(KERN_INFO DRV_NAME + ": %s: link status definitely " + "up for interface %s.\n", + bond_dev->name, + slave_dev->name); + /* notify ad that the link status has changed */ if (bond_mode == BOND_MODE_8023AD) { bond_3ad_handle_link_change(slave, BOND_LINK_UP); @@ -2411,7 +2144,7 @@ bond_alb_handle_link_change(bond, slave, BOND_LINK_UP); } - if ((oldcurrent == NULL) || + if ((!oldcurrent) || (slave == bond->primary_slave)) { do_failover = 1; } @@ -2420,7 +2153,12 @@ } } break; - } /* end of switch */ + default: + /* Should not happen */ + printk(KERN_ERR "bonding: Error: %s Illegal value (link=%d)\n", + slave->dev->name, slave->link); + goto out; + } /* end of switch (slave->link) */ bond_update_speed_duplex(slave); @@ -2428,112 +2166,110 @@ if (old_speed != slave->speed) { bond_3ad_adapter_speed_changed(slave); } + if (old_duplex != slave->duplex) { bond_3ad_adapter_duplex_changed(slave); } } - } /* end of while */ + } /* end of for */ if (do_failover) { - write_lock(&bond->ptrlock); + write_lock(&bond->curr_slave_lock); - reselect_active_interface(bond); - if (oldcurrent && !bond->current_slave) { - printk(KERN_INFO - "%s: now running without any active interface !\n", - master->name); + bond_select_active_slave(bond); + + if (oldcurrent && !bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); } - write_unlock(&bond->ptrlock); + write_unlock(&bond->curr_slave_lock); } +re_arm: + mod_timer(&bond->mii_timer, jiffies + delta_in_ticks); +out: read_unlock(&bond->lock); - /* re-arm the timer */ - mod_timer(&bond->mii_timer, jiffies + (miimon * HZ / 1000)); } -/* - * this function is called regularly to monitor each slave's link +static void bond_arp_send_all(struct slave *slave) +{ + int i; + + for (i = 0; (idev, + my_ip, NULL, slave->dev->dev_addr, + NULL); + } +} + +/* + * this function is called regularly to monitor each slave's link * ensuring that traffic is being sent and received when arp monitoring - * is used in load-balancing mode. if the adapter has been dormant, then an - * arp is transmitted to generate traffic. see activebackup_arp_monitor for - * arp monitoring in active backup mode. + * is used in load-balancing mode. if the adapter has been dormant, then an + * arp is transmitted to generate traffic. see activebackup_arp_monitor for + * arp monitoring in active backup mode. */ -static void loadbalance_arp_monitor(struct net_device *master) +static void bond_loadbalance_arp_mon(struct net_device *bond_dev) { - bonding_t *bond; - slave_t *slave, *oldcurrent; - int the_delta_in_ticks = arp_interval * HZ / 1000; - int next_timer = jiffies + (arp_interval * HZ / 1000); + struct bonding *bond = bond_dev->priv; + struct slave *slave, *oldcurrent; int do_failover = 0; + int delta_in_ticks = (arp_interval * HZ) / 1000; + int i; - bond = (struct bonding *) master->priv; - if (master->priv == NULL) { - mod_timer(&bond->arp_timer, next_timer); - return; - } + read_lock(&bond->lock); - /* TODO: investigate why rtnl_shlock_nowait and rtnl_exlock_nowait - * are called below and add comment why they are required... - */ - if ((!IS_UP(master)) || rtnl_shlock_nowait()) { - mod_timer(&bond->arp_timer, next_timer); - return; + if (bond->kill_timers) { + goto out; } - if (rtnl_exlock_nowait()) { - rtnl_shunlock(); - mod_timer(&bond->arp_timer, next_timer); - return; + if (bond->slave_cnt == 0) { + goto re_arm; } - read_lock(&bond->lock); - - read_lock(&bond->ptrlock); - oldcurrent = bond->current_slave; - read_unlock(&bond->ptrlock); + read_lock(&bond->curr_slave_lock); + oldcurrent = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); /* see if any of the previous devices are up now (i.e. they have - * xmt and rcv traffic). the current_slave does not come into + * xmt and rcv traffic). the curr_active_slave does not come into * the picture unless it is null. also, slave->jiffies is not needed * here because we send an arp on each slave and give a slave as * long as it needs to get the tx/rx within the delta. * TODO: what about up/down delay in arp mode? it wasn't here before - * so it can wait + * so it can wait */ - slave = (slave_t *)bond; - while ((slave = slave->prev) != (slave_t *)bond) { - - if (slave->link != BOND_LINK_UP) { - - if (((jiffies - slave->dev->trans_start) <= - the_delta_in_ticks) && - ((jiffies - slave->dev->last_rx) <= - the_delta_in_ticks)) { + bond_for_each_slave(bond, slave, i) { + if (slave->link != BOND_LINK_UP) { + if (((jiffies - slave->dev->trans_start) <= delta_in_ticks) && + ((jiffies - slave->dev->last_rx) <= delta_in_ticks)) { slave->link = BOND_LINK_UP; slave->state = BOND_STATE_ACTIVE; /* primary_slave has no meaning in round-robin - * mode. the window of a slave being up and - * current_slave being null after enslaving + * mode. the window of a slave being up and + * curr_active_slave being null after enslaving * is closed. */ - if (oldcurrent == NULL) { - printk(KERN_INFO - "%s: link status definitely up " - "for interface %s, ", - master->name, - slave->dev->name); + if (!oldcurrent) { + printk(KERN_INFO DRV_NAME + ": %s: link status definitely " + "up for interface %s, ", + bond_dev->name, + slave->dev->name); do_failover = 1; } else { - printk(KERN_INFO - "%s: interface %s is now up\n", - master->name, - slave->dev->name); + printk(KERN_INFO DRV_NAME + ": %s: interface %s is now up\n", + bond_dev->name, + slave->dev->name); } - } + } } else { /* slave->link == BOND_LINK_UP */ @@ -2541,224 +2277,233 @@ * when the source ip is 0, so don't take the link down * if we don't know our ip yet */ - if (((jiffies - slave->dev->trans_start) >= - (2*the_delta_in_ticks)) || - (((jiffies - slave->dev->last_rx) >= - (2*the_delta_in_ticks)) && my_ip !=0)) { + if (((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) || + (((jiffies - slave->dev->last_rx) >= (2*delta_in_ticks)) && + my_ip)) { + slave->link = BOND_LINK_DOWN; slave->state = BOND_STATE_BACKUP; + if (slave->link_failure_count < UINT_MAX) { slave->link_failure_count++; } - printk(KERN_INFO - "%s: interface %s is now down.\n", - master->name, + + printk(KERN_INFO DRV_NAME + ": %s: interface %s is now down.\n", + bond_dev->name, slave->dev->name); if (slave == oldcurrent) { do_failover = 1; } } - } + } - /* note: if switch is in round-robin mode, all links + /* note: if switch is in round-robin mode, all links * must tx arp to ensure all links rx an arp - otherwise - * links may oscillate or not come up at all; if switch is - * in something like xor mode, there is nothing we can - * do - all replies will be rx'ed on same link causing slaves + * links may oscillate or not come up at all; if switch is + * in something like xor mode, there is nothing we can + * do - all replies will be rx'ed on same link causing slaves * to be unstable during low/no traffic periods */ if (IS_UP(slave->dev)) { - arp_send_all(slave); + bond_arp_send_all(slave); } } if (do_failover) { - write_lock(&bond->ptrlock); + write_lock(&bond->curr_slave_lock); + + bond_select_active_slave(bond); - reselect_active_interface(bond); - if (oldcurrent && !bond->current_slave) { - printk(KERN_INFO - "%s: now running without any active interface !\n", - master->name); + if (oldcurrent && !bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: now running without any active " + "interface !\n", + bond_dev->name); } - write_unlock(&bond->ptrlock); + write_unlock(&bond->curr_slave_lock); } +re_arm: + mod_timer(&bond->arp_timer, jiffies + delta_in_ticks); +out: read_unlock(&bond->lock); - rtnl_exunlock(); - rtnl_shunlock(); - - /* re-arm the timer */ - mod_timer(&bond->arp_timer, next_timer); } -/* +/* * When using arp monitoring in active-backup mode, this function is * called to determine if any backup slaves have went down or a new * current slave needs to be found. - * The backup slaves never generate traffic, they are considered up by merely - * receiving traffic. If the current slave goes down, each backup slave will - * be given the opportunity to tx/rx an arp before being taken down - this - * prevents all slaves from being taken down due to the current slave not + * The backup slaves never generate traffic, they are considered up by merely + * receiving traffic. If the current slave goes down, each backup slave will + * be given the opportunity to tx/rx an arp before being taken down - this + * prevents all slaves from being taken down due to the current slave not * sending any traffic for the backups to receive. The arps are not necessarily - * necessary, any tx and rx traffic will keep the current slave up. While any - * rx traffic will keep the backup slaves up, the current slave is responsible - * for generating traffic to keep them up regardless of any other traffic they + * necessary, any tx and rx traffic will keep the current slave up. While any + * rx traffic will keep the backup slaves up, the current slave is responsible + * for generating traffic to keep them up regardless of any other traffic they * may have received. * see loadbalance_arp_monitor for arp monitoring in load balancing mode */ -static void activebackup_arp_monitor(struct net_device *master) +static void bond_activebackup_arp_mon(struct net_device *bond_dev) { - bonding_t *bond; - slave_t *slave; - int the_delta_in_ticks = arp_interval * HZ / 1000; - int next_timer = jiffies + (arp_interval * HZ / 1000); - - bond = (struct bonding *) master->priv; - if (master->priv == NULL) { - mod_timer(&bond->arp_timer, next_timer); - return; - } + struct bonding *bond = bond_dev->priv; + struct slave *slave; + int delta_in_ticks = (arp_interval * HZ) / 1000; + int i; - if (!IS_UP(master)) { - mod_timer(&bond->arp_timer, next_timer); - return; + read_lock(&bond->lock); + + if (bond->kill_timers) { + goto out; } - read_lock(&bond->lock); + if (bond->slave_cnt == 0) { + goto re_arm; + } - /* determine if any slave has come up or any backup slave has - * gone down + /* determine if any slave has come up or any backup slave has + * gone down * TODO: what about up/down delay in arp mode? it wasn't here before - * so it can wait + * so it can wait */ - slave = (slave_t *)bond; - while ((slave = slave->prev) != (slave_t *)bond) { - - if (slave->link != BOND_LINK_UP) { - if ((jiffies - slave->dev->last_rx) <= - the_delta_in_ticks) { + bond_for_each_slave(bond, slave, i) { + if (slave->link != BOND_LINK_UP) { + if ((jiffies - slave->dev->last_rx) <= delta_in_ticks) { slave->link = BOND_LINK_UP; - write_lock(&bond->ptrlock); - if ((bond->current_slave == NULL) && - ((jiffies - slave->dev->trans_start) <= - the_delta_in_ticks)) { - change_active_interface(bond, slave); + + write_lock(&bond->curr_slave_lock); + + if ((!bond->curr_active_slave) && + ((jiffies - slave->dev->trans_start) <= delta_in_ticks)) { + bond_change_active_slave(bond, slave); bond->current_arp_slave = NULL; - } else if (bond->current_slave != slave) { - /* this slave has just come up but we + } else if (bond->curr_active_slave != slave) { + /* this slave has just come up but we * already have a current slave; this * can also happen if bond_enslave adds - * a new slave that is up while we are + * a new slave that is up while we are * searching for a new slave */ bond_set_slave_inactive_flags(slave); bond->current_arp_slave = NULL; } - if (slave == bond->current_slave) { - printk(KERN_INFO - "%s: %s is up and now the " - "active interface\n", - master->name, - slave->dev->name); + if (slave == bond->curr_active_slave) { + printk(KERN_INFO DRV_NAME + ": %s: %s is up and now the " + "active interface\n", + bond_dev->name, + slave->dev->name); } else { - printk(KERN_INFO - "%s: backup interface %s is " - "now up\n", - master->name, - slave->dev->name); + printk(KERN_INFO DRV_NAME + ": %s: backup interface %s is " + "now up\n", + bond_dev->name, + slave->dev->name); } - write_unlock(&bond->ptrlock); + write_unlock(&bond->curr_slave_lock); } } else { - read_lock(&bond->ptrlock); - if ((slave != bond->current_slave) && - (bond->current_arp_slave == NULL) && - (((jiffies - slave->dev->last_rx) >= - 3*the_delta_in_ticks) && (my_ip != 0))) { - /* a backup slave has gone down; three times - * the delta allows the current slave to be + read_lock(&bond->curr_slave_lock); + + if ((slave != bond->curr_active_slave) && + (!bond->current_arp_slave) && + (((jiffies - slave->dev->last_rx) >= 3*delta_in_ticks) && + my_ip)) { + /* a backup slave has gone down; three times + * the delta allows the current slave to be * taken out before the backup slave. * note: a non-null current_arp_slave indicates - * the current_slave went down and we are - * searching for a new one; under this - * condition we only take the current_slave - * down - this gives each slave a chance to + * the curr_active_slave went down and we are + * searching for a new one; under this + * condition we only take the curr_active_slave + * down - this gives each slave a chance to * tx/rx traffic before being taken out */ - read_unlock(&bond->ptrlock); + + read_unlock(&bond->curr_slave_lock); + slave->link = BOND_LINK_DOWN; + if (slave->link_failure_count < UINT_MAX) { slave->link_failure_count++; } + bond_set_slave_inactive_flags(slave); - printk(KERN_INFO - "%s: backup interface %s is now down\n", - master->name, - slave->dev->name); + + printk(KERN_INFO DRV_NAME + ": %s: backup interface %s is now down\n", + bond_dev->name, + slave->dev->name); } else { - read_unlock(&bond->ptrlock); + read_unlock(&bond->curr_slave_lock); } } } - read_lock(&bond->ptrlock); - slave = bond->current_slave; - read_unlock(&bond->ptrlock); - - if (slave != NULL) { + read_lock(&bond->curr_slave_lock); + slave = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); + if (slave) { /* if we have sent traffic in the past 2*arp_intervals but - * haven't xmit and rx traffic in that time interval, select + * haven't xmit and rx traffic in that time interval, select * a different slave. slave->jiffies is only updated when - * a slave first becomes the current_slave - not necessarily - * after every arp; this ensures the slave has a full 2*delta - * before being taken out. if a primary is being used, check - * if it is up and needs to take over as the current_slave + * a slave first becomes the curr_active_slave - not necessarily + * after every arp; this ensures the slave has a full 2*delta + * before being taken out. if a primary is being used, check + * if it is up and needs to take over as the curr_active_slave */ - if ((((jiffies - slave->dev->trans_start) >= - (2*the_delta_in_ticks)) || - (((jiffies - slave->dev->last_rx) >= - (2*the_delta_in_ticks)) && (my_ip != 0))) && - ((jiffies - slave->jiffies) >= 2*the_delta_in_ticks)) { + if ((((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) || + (((jiffies - slave->dev->last_rx) >= (2*delta_in_ticks)) && + my_ip)) && + ((jiffies - slave->jiffies) >= 2*delta_in_ticks)) { slave->link = BOND_LINK_DOWN; + if (slave->link_failure_count < UINT_MAX) { slave->link_failure_count++; } - printk(KERN_INFO "%s: link status down for " - "active interface %s, disabling it", - master->name, + + printk(KERN_INFO DRV_NAME + ": %s: link status down for active interface " + "%s, disabling it\n", + bond_dev->name, slave->dev->name); - write_lock(&bond->ptrlock); - reselect_active_interface(bond); - slave = bond->current_slave; - write_unlock(&bond->ptrlock); + + write_lock(&bond->curr_slave_lock); + + bond_select_active_slave(bond); + slave = bond->curr_active_slave; + + write_unlock(&bond->curr_slave_lock); + bond->current_arp_slave = slave; - if (slave != NULL) { + + if (slave) { slave->jiffies = jiffies; } - - } else if ((bond->primary_slave != NULL) && - (bond->primary_slave != slave) && + } else if ((bond->primary_slave) && + (bond->primary_slave != slave) && (bond->primary_slave->link == BOND_LINK_UP)) { - /* at this point, slave is the current_slave */ - printk(KERN_INFO - "%s: changing from interface %s to primary " + /* at this point, slave is the curr_active_slave */ + printk(KERN_INFO DRV_NAME + ": %s: changing from interface %s to primary " "interface %s\n", - master->name, - slave->dev->name, + bond_dev->name, + slave->dev->name, bond->primary_slave->dev->name); - + /* primary is up so switch to it */ - write_lock(&bond->ptrlock); - change_active_interface(bond, bond->primary_slave); - write_unlock(&bond->ptrlock); + write_lock(&bond->curr_slave_lock); + bond_change_active_slave(bond, bond->primary_slave); + write_unlock(&bond->curr_slave_lock); + slave = bond->primary_slave; slave->jiffies = jiffies; } else { @@ -2768,598 +2513,66 @@ /* the current slave must tx an arp to ensure backup slaves * rx traffic */ - if ((slave != NULL) && (my_ip != 0)) { - arp_send_all(slave); + if (slave && my_ip) { + bond_arp_send_all(slave); } } - /* if we don't have a current_slave, search for the next available - * backup slave from the current_arp_slave and make it the candidate - * for becoming the current_slave + /* if we don't have a curr_active_slave, search for the next available + * backup slave from the current_arp_slave and make it the candidate + * for becoming the curr_active_slave */ - if (slave == NULL) { - - if ((bond->current_arp_slave == NULL) || - (bond->current_arp_slave == (slave_t *)bond)) { - bond->current_arp_slave = bond->prev; - } + if (!slave) { + if (!bond->current_arp_slave) { + bond->current_arp_slave = bond->first_slave; + } - if (bond->current_arp_slave != (slave_t *)bond) { + if (bond->current_arp_slave) { bond_set_slave_inactive_flags(bond->current_arp_slave); - slave = bond->current_arp_slave->next; /* search for next candidate */ - do { + bond_for_each_slave_from(bond, slave, i, bond->current_arp_slave) { if (IS_UP(slave->dev)) { slave->link = BOND_LINK_BACK; bond_set_slave_active_flags(slave); - arp_send_all(slave); + bond_arp_send_all(slave); slave->jiffies = jiffies; bond->current_arp_slave = slave; break; } - /* if the link state is up at this point, we - * mark it down - this can happen if we have - * simultaneous link failures and - * reselect_active_interface doesn't make this - * one the current slave so it is still marked + /* if the link state is up at this point, we + * mark it down - this can happen if we have + * simultaneous link failures and + * reselect_active_interface doesn't make this + * one the current slave so it is still marked * up when it is actually down */ if (slave->link == BOND_LINK_UP) { slave->link = BOND_LINK_DOWN; - if (slave->link_failure_count < - UINT_MAX) { + if (slave->link_failure_count < UINT_MAX) { slave->link_failure_count++; } bond_set_slave_inactive_flags(slave); - printk(KERN_INFO - "%s: backup interface " - "%s is now down.\n", - master->name, - slave->dev->name); - } - } while ((slave = slave->next) != - bond->current_arp_slave->next); - } - } - - read_unlock(&bond->lock); - mod_timer(&bond->arp_timer, next_timer); -} - -static int bond_sethwaddr(struct net_device *master, struct net_device *slave) -{ -#ifdef BONDING_DEBUG - printk(KERN_CRIT "bond_sethwaddr: master=%x\n", (unsigned int)master); - printk(KERN_CRIT "bond_sethwaddr: slave=%x\n", (unsigned int)slave); - printk(KERN_CRIT "bond_sethwaddr: slave->addr_len=%d\n", slave->addr_len); -#endif - memcpy(master->dev_addr, slave->dev_addr, slave->addr_len); - return 0; -} -static int bond_info_query(struct net_device *master, struct ifbond *info) -{ - bonding_t *bond = (struct bonding *) master->priv; - slave_t *slave; - - info->bond_mode = bond_mode; - info->num_slaves = 0; - info->miimon = miimon; - - read_lock_bh(&bond->lock); - for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) { - info->num_slaves++; - } - read_unlock_bh(&bond->lock); - - return 0; -} - -static int bond_slave_info_query(struct net_device *master, - struct ifslave *info) -{ - bonding_t *bond = (struct bonding *) master->priv; - slave_t *slave; - int cur_ndx = 0; - - if (info->slave_id < 0) { - return -ENODEV; - } - - read_lock_bh(&bond->lock); - for (slave = bond->prev; - slave != (slave_t *)bond && cur_ndx < info->slave_id; - slave = slave->prev) { - cur_ndx++; - } - read_unlock_bh(&bond->lock); - - if (slave != (slave_t *)bond) { - strcpy(info->slave_name, slave->dev->name); - info->link = slave->link; - info->state = slave->state; - info->link_failure_count = slave->link_failure_count; - } else { - return -ENODEV; - } - - return 0; -} - -static int bond_ethtool_ioctl(struct net_device *master_dev, struct ifreq *ifr) -{ - void *addr = ifr->ifr_data; - uint32_t cmd; - - if (get_user(cmd, (uint32_t *) addr)) - return -EFAULT; - - switch (cmd) { - - case ETHTOOL_GDRVINFO: - { - struct ethtool_drvinfo info; - char *endptr; - - if (copy_from_user(&info, addr, sizeof(info))) - return -EFAULT; - - if (strcmp(info.driver, "ifenslave") == 0) { - int new_abi_ver; - - new_abi_ver = simple_strtoul(info.fw_version, - &endptr, 0); - if (*endptr) { - printk(KERN_ERR - "bonding: Error: got invalid ABI" - " version from application\n"); - - return -EINVAL; - } - - if (orig_app_abi_ver == -1) { - orig_app_abi_ver = new_abi_ver; + printk(KERN_INFO DRV_NAME + ": %s: backup interface %s is " + "now down.\n", + bond_dev->name, + slave->dev->name); } - - app_abi_ver = new_abi_ver; } - - strncpy(info.driver, DRV_NAME, 32); - strncpy(info.version, DRV_VERSION, 32); - snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION); - - if (copy_to_user(addr, &info, sizeof(info))) - return -EFAULT; - - return 0; } - break; - default: - return -EOPNOTSUPP; - } -} - -static int bond_ioctl(struct net_device *master_dev, struct ifreq *ifr, int cmd) -{ - struct net_device *slave_dev = NULL; - struct ifbond *u_binfo = NULL, k_binfo; - struct ifslave *u_sinfo = NULL, k_sinfo; - struct mii_ioctl_data *mii = NULL; - int prev_abi_ver = orig_app_abi_ver; - int ret = 0; - -#ifdef BONDING_DEBUG - printk(KERN_INFO "bond_ioctl: master=%s, cmd=%d\n", - master_dev->name, cmd); -#endif - - switch (cmd) { - case SIOCETHTOOL: - return bond_ethtool_ioctl(master_dev, ifr); - - case SIOCGMIIPHY: - mii = (struct mii_ioctl_data *)&ifr->ifr_data; - if (mii == NULL) { - return -EINVAL; - } - mii->phy_id = 0; - /* Fall Through */ - case SIOCGMIIREG: - /* - * We do this again just in case we were called by SIOCGMIIREG - * instead of SIOCGMIIPHY. - */ - mii = (struct mii_ioctl_data *)&ifr->ifr_data; - if (mii == NULL) { - return -EINVAL; - } - if (mii->reg_num == 1) { - mii->val_out = bond_check_mii_link( - (struct bonding *)master_dev->priv); - } - return 0; - case BOND_INFO_QUERY_OLD: - case SIOCBONDINFOQUERY: - u_binfo = (struct ifbond *)ifr->ifr_data; - if (copy_from_user(&k_binfo, u_binfo, sizeof(ifbond))) { - return -EFAULT; - } - ret = bond_info_query(master_dev, &k_binfo); - if (ret == 0) { - if (copy_to_user(u_binfo, &k_binfo, sizeof(ifbond))) { - return -EFAULT; - } - } - return ret; - case BOND_SLAVE_INFO_QUERY_OLD: - case SIOCBONDSLAVEINFOQUERY: - u_sinfo = (struct ifslave *)ifr->ifr_data; - if (copy_from_user(&k_sinfo, u_sinfo, sizeof(ifslave))) { - return -EFAULT; - } - ret = bond_slave_info_query(master_dev, &k_sinfo); - if (ret == 0) { - if (copy_to_user(u_sinfo, &k_sinfo, sizeof(ifslave))) { - return -EFAULT; - } - } - return ret; - } - - if (!capable(CAP_NET_ADMIN)) { - return -EPERM; - } - - if (orig_app_abi_ver == -1) { - /* no orig_app_abi_ver was provided yet, so we'll use the - * current one from now on, even if it's 0 - */ - orig_app_abi_ver = app_abi_ver; - - } else if (orig_app_abi_ver != app_abi_ver) { - printk(KERN_ERR - "bonding: Error: already using ifenslave ABI " - "version %d; to upgrade ifenslave to version %d, " - "you must first reload bonding.\n", - orig_app_abi_ver, app_abi_ver); - return -EINVAL; - } - - slave_dev = dev_get_by_name(ifr->ifr_slave); - -#ifdef BONDING_DEBUG - printk(KERN_INFO "slave_dev=%x: \n", (unsigned int)slave_dev); - printk(KERN_INFO "slave_dev->name=%s: \n", slave_dev->name); -#endif - - if (slave_dev == NULL) { - ret = -ENODEV; - } else { - switch (cmd) { - case BOND_ENSLAVE_OLD: - case SIOCBONDENSLAVE: - ret = bond_enslave(master_dev, slave_dev); - break; - case BOND_RELEASE_OLD: - case SIOCBONDRELEASE: - ret = bond_release(master_dev, slave_dev); - break; - case BOND_SETHWADDR_OLD: - case SIOCBONDSETHWADDR: - ret = bond_sethwaddr(master_dev, slave_dev); - break; - case BOND_CHANGE_ACTIVE_OLD: - case SIOCBONDCHANGEACTIVE: - if (USES_PRIMARY(bond_mode)) { - ret = bond_change_active(master_dev, slave_dev); - } - else { - ret = -EINVAL; - } - break; - default: - ret = -EOPNOTSUPP; - } - dev_put(slave_dev); - } - - if (ret < 0) { - /* The ioctl failed, so there's no point in changing the - * orig_app_abi_ver. We'll restore it's value just in case - * we've changed it earlier in this function. - */ - orig_app_abi_ver = prev_abi_ver; - } - - return ret; -} - -#ifdef CONFIG_NET_FASTROUTE -static int bond_accept_fastpath(struct net_device *dev, struct dst_entry *dst) -{ - return -1; -} -#endif - -/* - * in broadcast mode, we send everything to all usable interfaces. - */ -static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *dev) -{ - slave_t *slave, *start_at; - struct bonding *bond = (struct bonding *) dev->priv; - struct net_device *device_we_should_send_to = 0; - - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; - } - - read_lock(&bond->lock); - - read_lock(&bond->ptrlock); - slave = start_at = bond->current_slave; - read_unlock(&bond->ptrlock); - - if (slave == NULL) { /* we're at the root, get the first slave */ - /* no suitable interface, frame not sent */ - read_unlock(&bond->lock); - dev_kfree_skb(skb); - return 0; - } - - do { - if (IS_UP(slave->dev) - && (slave->link == BOND_LINK_UP) - && (slave->state == BOND_STATE_ACTIVE)) { - if (device_we_should_send_to) { - struct sk_buff *skb2; - if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) { - printk(KERN_ERR "bond_xmit_broadcast: skb_clone() failed\n"); - continue; - } - - skb2->dev = device_we_should_send_to; - skb2->priority = 1; - dev_queue_xmit(skb2); - } - device_we_should_send_to = slave->dev; - } - } while ((slave = slave->next) != start_at); - - if (device_we_should_send_to) { - skb->dev = device_we_should_send_to; - skb->priority = 1; - dev_queue_xmit(skb); - } else - dev_kfree_skb(skb); - - /* frame sent to all suitable interfaces */ - read_unlock(&bond->lock); - return 0; -} - -static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *dev) -{ - slave_t *slave, *start_at; - struct bonding *bond = (struct bonding *) dev->priv; - - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; - } - - read_lock(&bond->lock); - - read_lock(&bond->ptrlock); - slave = start_at = bond->current_slave; - read_unlock(&bond->ptrlock); - - if (slave == NULL) { /* we're at the root, get the first slave */ - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; - } - - do { - if (IS_UP(slave->dev) - && (slave->link == BOND_LINK_UP) - && (slave->state == BOND_STATE_ACTIVE)) { - - skb->dev = slave->dev; - skb->priority = 1; - dev_queue_xmit(skb); - - write_lock(&bond->ptrlock); - bond->current_slave = slave->next; - write_unlock(&bond->ptrlock); - - read_unlock(&bond->lock); - return 0; - } - } while ((slave = slave->next) != start_at); - - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; -} - -/* - * in XOR mode, we determine the output device by performing xor on - * the source and destination hw adresses. If this device is not - * enabled, find the next slave following this xor slave. - */ -static int bond_xmit_xor(struct sk_buff *skb, struct net_device *dev) -{ - slave_t *slave, *start_at; - struct bonding *bond = (struct bonding *) dev->priv; - struct ethhdr *data = (struct ethhdr *)skb->data; - int slave_no; - - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; - } - - read_lock(&bond->lock); - slave = bond->prev; - - /* we're at the root, get the first slave */ - if (bond->slave_cnt == 0) { - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; - } - - slave_no = (data->h_dest[5]^slave->dev->dev_addr[5]) % bond->slave_cnt; - - while ( (slave_no > 0) && (slave != (slave_t *)bond) ) { - slave = slave->prev; - slave_no--; - } - start_at = slave; - - do { - if (IS_UP(slave->dev) - && (slave->link == BOND_LINK_UP) - && (slave->state == BOND_STATE_ACTIVE)) { - - skb->dev = slave->dev; - skb->priority = 1; - dev_queue_xmit(skb); - - read_unlock(&bond->lock); - return 0; - } - } while ((slave = slave->next) != start_at); - - /* no suitable interface, frame not sent */ - dev_kfree_skb(skb); - read_unlock(&bond->lock); - return 0; -} - -/* - * in active-backup mode, we know that bond->current_slave is always valid if - * the bond has a usable interface. - */ -static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *dev) -{ - struct bonding *bond = (struct bonding *) dev->priv; - int ret; - - if (!IS_UP(dev)) { /* bond down */ - dev_kfree_skb(skb); - return 0; } - /* if we are sending arp packets, try to at least - identify our own ip address */ - if ( (arp_interval > 0) && (my_ip == 0) && - (skb->protocol == __constant_htons(ETH_P_ARP) ) ) { - char *the_ip = (((char *)skb->data)) - + sizeof(struct ethhdr) - + sizeof(struct arphdr) + - ETH_ALEN; - memcpy(&my_ip, the_ip, 4); - } - - /* if we are sending arp packets and don't know - * the target hw address, save it so we don't need - * to use a broadcast address. - * don't do this if in active backup mode because the slaves must - * receive packets to stay up, and the only ones they receive are - * broadcasts. - */ - if ( (bond_mode != BOND_MODE_ACTIVEBACKUP) && - (arp_ip_count == 1) && - (arp_interval > 0) && (arp_target_hw_addr == NULL) && - (skb->protocol == __constant_htons(ETH_P_IP) ) ) { - struct ethhdr *eth_hdr = - (struct ethhdr *) (((char *)skb->data)); - struct iphdr *ip_hdr = (struct iphdr *)(eth_hdr + 1); - - if (arp_target[0] == ip_hdr->daddr) { - arp_target_hw_addr = kmalloc(ETH_ALEN, GFP_KERNEL); - if (arp_target_hw_addr != NULL) - memcpy(arp_target_hw_addr, eth_hdr->h_dest, ETH_ALEN); - } - } - - read_lock(&bond->lock); - - read_lock(&bond->ptrlock); - if (bond->current_slave != NULL) { /* one usable interface */ - skb->dev = bond->current_slave->dev; - read_unlock(&bond->ptrlock); - skb->priority = 1; - ret = dev_queue_xmit(skb); - read_unlock(&bond->lock); - return 0; - } - else { - read_unlock(&bond->ptrlock); - } - - /* no suitable interface, frame not sent */ -#ifdef BONDING_DEBUG - printk(KERN_INFO "There was no suitable interface, so we don't transmit\n"); -#endif - dev_kfree_skb(skb); +re_arm: + mod_timer(&bond->arp_timer, jiffies + delta_in_ticks); +out: read_unlock(&bond->lock); - return 0; } -static struct net_device_stats *bond_get_stats(struct net_device *dev) -{ - bonding_t *bond = dev->priv; - struct net_device_stats *stats = &(bond->stats), *sstats; - slave_t *slave; - - memset(stats, 0, sizeof(struct net_device_stats)); - - read_lock_bh(&bond->lock); - - for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) { - sstats = slave->dev->get_stats(slave->dev); - - stats->rx_packets += sstats->rx_packets; - stats->rx_bytes += sstats->rx_bytes; - stats->rx_errors += sstats->rx_errors; - stats->rx_dropped += sstats->rx_dropped; - - stats->tx_packets += sstats->tx_packets; - stats->tx_bytes += sstats->tx_bytes; - stats->tx_errors += sstats->tx_errors; - stats->tx_dropped += sstats->tx_dropped; - - stats->multicast += sstats->multicast; - stats->collisions += sstats->collisions; - - stats->rx_length_errors += sstats->rx_length_errors; - stats->rx_over_errors += sstats->rx_over_errors; - stats->rx_crc_errors += sstats->rx_crc_errors; - stats->rx_frame_errors += sstats->rx_frame_errors; - stats->rx_fifo_errors += sstats->rx_fifo_errors; - stats->rx_missed_errors += sstats->rx_missed_errors; - - stats->tx_aborted_errors += sstats->tx_aborted_errors; - stats->tx_carrier_errors += sstats->tx_carrier_errors; - stats->tx_fifo_errors += sstats->tx_fifo_errors; - stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; - stats->tx_window_errors += sstats->tx_window_errors; - - } - - read_unlock_bh(&bond->lock); - return stats; -} +/*------------------------------ proc/seq_file-------------------------------*/ #ifdef CONFIG_PROC_FS @@ -3370,6 +2583,7 @@ struct bonding *bond = seq->private; loff_t off = 0; struct slave *slave; + int i; /* make sure the bond won't be taken away */ read_lock(&dev_base_lock); @@ -3379,9 +2593,7 @@ return SEQ_START_TOKEN; } - for (slave = bond->prev; slave != (slave_t *)bond; - slave = slave->prev) { - + bond_for_each_slave(bond, slave, i) { if (++off == *pos) { return slave; } @@ -3397,12 +2609,12 @@ ++*pos; if (v == SEQ_START_TOKEN) { - slave = bond->prev; - } else { - slave = slave->prev; + return bond->first_slave; } - return (slave == (struct slave *) bond) ? NULL : slave; + slave = slave->next; + + return (slave == bond->first_slave) ? NULL : slave; } static void bond_info_seq_stop(struct seq_file *seq, void *v) @@ -3417,9 +2629,9 @@ { struct slave *curr; - read_lock(&bond->ptrlock); - curr = bond->current_slave; - read_unlock(&bond->ptrlock); + read_lock(&bond->curr_slave_lock); + curr = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); seq_printf(seq, "Bonding Mode: %s\n", bond_mode_name()); @@ -3435,7 +2647,6 @@ seq_printf(seq, "MII Polling Interval (ms): %d\n", miimon); seq_printf(seq, "Up Delay (ms): %d\n", updelay * miimon); seq_printf(seq, "Down Delay (ms): %d\n", downdelay * miimon); - seq_printf(seq, "Multicast Mode: %s\n", multicast_mode_name()); if (bond_mode == BOND_MODE_8023AD) { struct ad_info ad_info; @@ -3444,7 +2655,7 @@ if (bond_3ad_get_active_agg_info(bond, &ad_info)) { seq_printf(seq, "bond %s has no active aggregator\n", - bond->device->name); + bond->dev->name); } else { seq_printf(seq, "Active Aggregator Info:\n"); @@ -3522,55 +2733,56 @@ { struct seq_file *seq; struct proc_dir_entry *proc; - int rc; + int res; - rc = seq_open(file, &bond_info_seq_ops); - if (!rc) { + res = seq_open(file, &bond_info_seq_ops); + if (!res) { /* recover the pointer buried in proc_dir_entry data */ seq = file->private_data; proc = PDE(inode); seq->private = proc->data; } - return rc; + + return res; } static struct file_operations bond_info_fops = { - .owner = THIS_MODULE, + .owner = THIS_MODULE, .open = bond_info_open, .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; -static int bond_create_proc_info(struct bonding *bond) +static int bond_create_proc_entry(struct bonding *bond) { - struct net_device *dev = bond->device; + struct net_device *bond_dev = bond->dev; if (bond_proc_dir) { - bond->bond_proc_file = create_proc_entry(dev->name, - S_IRUGO, - bond_proc_dir); - if (bond->bond_proc_file == NULL) { - printk(KERN_WARNING - "%s: Cannot create /proc/net/bonding/%s\n", - dev->name, dev->name); + bond->proc_entry = create_proc_entry(bond_dev->name, + S_IRUGO, + bond_proc_dir); + if (bond->proc_entry == NULL) { + printk(KERN_WARNING DRV_NAME + ": Warning: Cannot create /proc/net/%s/%s\n", + DRV_NAME, bond_dev->name); } else { - bond->bond_proc_file->data = bond; - bond->bond_proc_file->proc_fops = &bond_info_fops; - bond->bond_proc_file->owner = THIS_MODULE; - memcpy(bond->procdir_name, dev->name, IFNAMSIZ); + bond->proc_entry->data = bond; + bond->proc_entry->proc_fops = &bond_info_fops; + bond->proc_entry->owner = THIS_MODULE; + memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ); } } return 0; } -static void bond_destroy_proc_info(struct bonding *bond) +static void bond_remove_proc_entry(struct bonding *bond) { - if (bond_proc_dir && bond->bond_proc_file) { - remove_proc_entry(bond->procdir_name, bond_proc_dir); - memset(bond->procdir_name, 0, IFNAMSIZ); - bond->bond_proc_file = NULL; + if (bond_proc_dir && bond->proc_entry) { + remove_proc_entry(bond->proc_file_name, bond_proc_dir); + memset(bond->proc_file_name, 0, IFNAMSIZ); + bond->proc_entry = NULL; } } @@ -3631,158 +2843,24 @@ } #endif /* CONFIG_PROC_FS */ -/* - * Change HW address - * - * Note that many devices must be down to change the HW address, and - * downing the master releases all slaves. We can make bonds full of - * bonding devices to test this, however. - */ -static inline int -bond_set_mac_address(struct net_device *dev, void *addr) -{ - struct bonding *bond = dev->priv; - struct sockaddr *sa = addr, tmp_sa; - struct slave *slave; - int error; - - dprintk(KERN_INFO "bond_set_mac_address %p %s\n", dev, - dev->name); - - if (!is_valid_ether_addr(sa->sa_data)) { - return -EADDRNOTAVAIL; - } - - for (slave = bond->prev; slave != (struct slave *)bond; - slave = slave->prev) { - dprintk(KERN_INFO "bond_set_mac: slave %p %s\n", slave, - slave->dev->name); - if (slave->dev->set_mac_address == NULL) { - error = -EOPNOTSUPP; - dprintk(KERN_INFO "bond_set_mac EOPNOTSUPP %s\n", - slave->dev->name); - goto unwind; - } - - error = slave->dev->set_mac_address(slave->dev, addr); - if (error) { - /* TODO: consider downing the slave - * and retry ? - * User should expect communications - * breakage anyway until ARP finish - * updating, so... - */ - dprintk(KERN_INFO "bond_set_mac err %d %s\n", - error, slave->dev->name); - goto unwind; - } - } - - /* success */ - memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); - return 0; - -unwind: - memcpy(tmp_sa.sa_data, dev->dev_addr, dev->addr_len); - tmp_sa.sa_family = dev->type; - - for (slave = slave->next; slave != bond->next; - slave = slave->next) { - int tmp_error; - - tmp_error = slave->dev->set_mac_address(slave->dev, &tmp_sa); - if (tmp_error) { - dprintk(KERN_INFO "bond_set_mac_address: " - "unwind err %d dev %s\n", - tmp_error, slave->dev->name); - } - } - - return error; -} - -/* - * Change the MTU of all of a master's slaves to match the master - */ -static inline int -bond_change_mtu(struct net_device *dev, int newmtu) -{ - bonding_t *bond = dev->priv; - slave_t *slave; - int error; - - dprintk(KERN_INFO "CM: b %p nm %d\n", bond, newmtu); - for (slave = bond->prev; slave != (slave_t *)bond; - slave = slave->prev) { - dprintk(KERN_INFO "CM: s %p s->p %p c_m %p\n", slave, - slave->prev, slave->dev->change_mtu); - if (slave->dev->change_mtu) { - error = slave->dev->change_mtu(slave->dev, newmtu); - } else { - slave->dev->mtu = newmtu; - error = 0; - } - - if (error) { - /* If we failed to set the slave's mtu to the new value - * we must abort the operation even in ACTIVE_BACKUP - * mode, because if we allow the backup slaves to have - * different mtu values than the active slave we'll - * need to change their mtu when doing a failover. That - * means changing their mtu from timer context, which - * is probably not a good idea. - */ - dprintk(KERN_INFO "bond_change_mtu err %d %s\n", - error, slave->dev->name); - goto unwind; - } - } - - dev->mtu = newmtu; - return 0; - - -unwind: - for (slave = slave->next; slave != bond->next; - slave = slave->next) { - - if (slave->dev->change_mtu) { - slave->dev->change_mtu(slave->dev, dev->mtu); - } else { - slave->dev->mtu = dev->mtu; - } - } - - return error; -} +/*-------------------------- netdev event handling --------------------------*/ /* * Change device name */ -static inline int bond_event_changename(struct bonding *bond) +static int bond_event_changename(struct bonding *bond) { #ifdef CONFIG_PROC_FS - bond_destroy_proc_info(bond); - bond_create_proc_info(bond); + bond_remove_proc_entry(bond); + bond_create_proc_entry(bond); #endif return NOTIFY_DONE; } -static int bond_master_netdev_event(unsigned long event, struct net_device *event_dev) +static int bond_master_netdev_event(unsigned long event, struct net_device *bond_dev) { - struct bonding *bond, *event_bond = NULL; - - list_for_each_entry(bond, &bond_dev_list, bond_list) { - if (bond == event_dev->priv) { - event_bond = bond; - break; - } - } - - if (event_bond == NULL) { - return NOTIFY_DONE; - } + struct bonding *event_bond = bond_dev->priv; switch (event) { case NETDEV_CHANGENAME: @@ -3799,14 +2877,14 @@ return NOTIFY_DONE; } -static int bond_slave_netdev_event(unsigned long event, struct net_device *event_dev) +static int bond_slave_netdev_event(unsigned long event, struct net_device *slave_dev) { - struct net_device *master = event_dev->master; + struct net_device *bond_dev = slave_dev->master; switch (event) { case NETDEV_UNREGISTER: - if (master != NULL) { - bond_release(master, event_dev); + if (bond_dev) { + bond_release(bond_dev, slave_dev); } break; case NETDEV_CHANGE: @@ -3858,132 +2936,856 @@ static int bond_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) { struct net_device *event_dev = (struct net_device *)ptr; - unsigned short flags; - int res = NOTIFY_DONE; - dprintk(KERN_INFO "bond_netdev_event n_b %p ev %lx ptr %p\n", - this, event, ptr); + dprintk("event_dev: %s, event: %lx\n", + (event_dev ? event_dev->name : "None"), + event); + + if (event_dev->flags & IFF_MASTER) { + dprintk("IFF_MASTER\n"); + return bond_master_netdev_event(event, event_dev); + } + + if (event_dev->flags & IFF_SLAVE) { + dprintk("IFF_SLAVE\n"); + return bond_slave_netdev_event(event, event_dev); + } + + return NOTIFY_DONE; +} + +static struct notifier_block bond_netdev_notifier = { + .notifier_call = bond_netdev_event, +}; + +/*-------------------------- Packet type handling ---------------------------*/ + +/* register to receive lacpdus on a bond */ +static void bond_register_lacpdu(struct bonding *bond) +{ + struct packet_type *pk_type = &(BOND_AD_INFO(bond).ad_pkt_type); + + /* initialize packet type */ + pk_type->type = PKT_TYPE_LACPDU; + pk_type->dev = bond->dev; + pk_type->func = bond_3ad_lacpdu_recv; + + dev_add_pack(pk_type); +} + +/* unregister to receive lacpdus on a bond */ +static void bond_unregister_lacpdu(struct bonding *bond) +{ + dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type)); +} + +/*-------------------------- Device entry points ----------------------------*/ + +static int bond_open(struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct timer_list *mii_timer = &bond->mii_timer; + struct timer_list *arp_timer = &bond->arp_timer; + + bond->kill_timers = 0; + + if ((bond_mode == BOND_MODE_TLB) || + (bond_mode == BOND_MODE_ALB)) { + struct timer_list *alb_timer = &(BOND_ALB_INFO(bond).alb_timer); + + /* bond_alb_initialize must be called before the timer + * is started. + */ + if (bond_alb_initialize(bond, (bond_mode == BOND_MODE_ALB))) { + /* something went wrong - fail the open operation */ + return -1; + } + + init_timer(alb_timer); + alb_timer->expires = jiffies + 1; + alb_timer->data = (unsigned long)bond; + alb_timer->function = (void *)&bond_alb_monitor; + add_timer(alb_timer); + } + + if (miimon) { /* link check interval, in milliseconds. */ + init_timer(mii_timer); + mii_timer->expires = jiffies + 1; + mii_timer->data = (unsigned long)bond_dev; + mii_timer->function = (void *)&bond_mii_monitor; + add_timer(mii_timer); + } - flags = event_dev->flags & (IFF_MASTER | IFF_SLAVE); - switch (flags) { - case IFF_MASTER: - res = bond_master_netdev_event(event, event_dev); + if (arp_interval) { /* arp interval, in milliseconds. */ + init_timer(arp_timer); + arp_timer->expires = jiffies + 1; + arp_timer->data = (unsigned long)bond_dev; + if (bond_mode == BOND_MODE_ACTIVEBACKUP) { + arp_timer->function = (void *)&bond_activebackup_arp_mon; + } else { + arp_timer->function = (void *)&bond_loadbalance_arp_mon; + } + add_timer(arp_timer); + } + + if (bond_mode == BOND_MODE_8023AD) { + struct timer_list *ad_timer = &(BOND_AD_INFO(bond).ad_timer); + init_timer(ad_timer); + ad_timer->expires = jiffies + 1; + ad_timer->data = (unsigned long)bond; + ad_timer->function = (void *)&bond_3ad_state_machine_handler; + add_timer(ad_timer); + + /* register to receive LACPDUs */ + bond_register_lacpdu(bond); + } + + return 0; +} + +static int bond_close(struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + + write_lock_bh(&bond->lock); + + bond_mc_list_destroy(bond); + + if (bond_mode == BOND_MODE_8023AD) { + /* Unregister the receive of LACPDUs */ + bond_unregister_lacpdu(bond); + } + + /* signal timers not to re-arm */ + bond->kill_timers = 1; + + write_unlock_bh(&bond->lock); + + /* del_timer_sync must run without holding the bond->lock + * because a running timer might be trying to hold it too + */ + + if (miimon) { /* link check interval, in milliseconds. */ + del_timer_sync(&bond->mii_timer); + } + + if (arp_interval) { /* arp interval, in milliseconds. */ + del_timer_sync(&bond->arp_timer); + } + + switch (bond_mode) { + case BOND_MODE_8023AD: + del_timer_sync(&(BOND_AD_INFO(bond).ad_timer)); break; - case IFF_SLAVE: - res = bond_slave_netdev_event(event, event_dev); + case BOND_MODE_TLB: + case BOND_MODE_ALB: + del_timer_sync(&(BOND_ALB_INFO(bond).alb_timer)); break; default: - /* A master that is also a slave ? */ break; } + /* Release the bonded slaves */ + bond_release_all(bond_dev); + + if ((bond_mode == BOND_MODE_TLB) || + (bond_mode == BOND_MODE_ALB)) { + /* Must be called only after all + * slaves have been released + */ + bond_alb_deinitialize(bond); + } + + return 0; +} + +static struct net_device_stats *bond_get_stats(struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct net_device_stats *stats = &(bond->stats), *sstats; + struct slave *slave; + int i; + + memset(stats, 0, sizeof(struct net_device_stats)); + + read_lock_bh(&bond->lock); + + bond_for_each_slave(bond, slave, i) { + sstats = slave->dev->get_stats(slave->dev); + + stats->rx_packets += sstats->rx_packets; + stats->rx_bytes += sstats->rx_bytes; + stats->rx_errors += sstats->rx_errors; + stats->rx_dropped += sstats->rx_dropped; + + stats->tx_packets += sstats->tx_packets; + stats->tx_bytes += sstats->tx_bytes; + stats->tx_errors += sstats->tx_errors; + stats->tx_dropped += sstats->tx_dropped; + + stats->multicast += sstats->multicast; + stats->collisions += sstats->collisions; + + stats->rx_length_errors += sstats->rx_length_errors; + stats->rx_over_errors += sstats->rx_over_errors; + stats->rx_crc_errors += sstats->rx_crc_errors; + stats->rx_frame_errors += sstats->rx_frame_errors; + stats->rx_fifo_errors += sstats->rx_fifo_errors; + stats->rx_missed_errors += sstats->rx_missed_errors; + + stats->tx_aborted_errors += sstats->tx_aborted_errors; + stats->tx_carrier_errors += sstats->tx_carrier_errors; + stats->tx_fifo_errors += sstats->tx_fifo_errors; + stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; + stats->tx_window_errors += sstats->tx_window_errors; + } + + read_unlock_bh(&bond->lock); + + return stats; +} + +static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd) +{ + struct net_device *slave_dev = NULL; + struct ifbond *u_binfo = NULL, k_binfo; + struct ifslave *u_sinfo = NULL, k_sinfo; + struct mii_ioctl_data *mii = NULL; + int prev_abi_ver = orig_app_abi_ver; + int res = 0; + + dprintk("bond_ioctl: master=%s, cmd=%d\n", + bond_dev->name, cmd); + + switch (cmd) { + case SIOCETHTOOL: + return bond_ethtool_ioctl(bond_dev, ifr); + case SIOCGMIIPHY: + mii = (struct mii_ioctl_data *)&ifr->ifr_data; + if (!mii) { + return -EINVAL; + } + mii->phy_id = 0; + /* Fall Through */ + case SIOCGMIIREG: + /* + * We do this again just in case we were called by SIOCGMIIREG + * instead of SIOCGMIIPHY. + */ + mii = (struct mii_ioctl_data *)&ifr->ifr_data; + if (!mii) { + return -EINVAL; + } + + if (mii->reg_num == 1) { + struct bonding *bond = bond_dev->priv; + mii->val_out = 0; + read_lock_bh(&bond->lock); + read_lock(&bond->curr_slave_lock); + if (bond->curr_active_slave) { + mii->val_out = BMSR_LSTATUS; + } + read_unlock(&bond->curr_slave_lock); + read_unlock_bh(&bond->lock); + } + + return 0; + case BOND_INFO_QUERY_OLD: + case SIOCBONDINFOQUERY: + u_binfo = (struct ifbond *)ifr->ifr_data; + + if (copy_from_user(&k_binfo, u_binfo, sizeof(ifbond))) { + return -EFAULT; + } + + res = bond_info_query(bond_dev, &k_binfo); + if (res == 0) { + if (copy_to_user(u_binfo, &k_binfo, sizeof(ifbond))) { + return -EFAULT; + } + } + + return res; + case BOND_SLAVE_INFO_QUERY_OLD: + case SIOCBONDSLAVEINFOQUERY: + u_sinfo = (struct ifslave *)ifr->ifr_data; + + if (copy_from_user(&k_sinfo, u_sinfo, sizeof(ifslave))) { + return -EFAULT; + } + + res = bond_slave_info_query(bond_dev, &k_sinfo); + if (res == 0) { + if (copy_to_user(u_sinfo, &k_sinfo, sizeof(ifslave))) { + return -EFAULT; + } + } + + return res; + default: + /* Go on */ + break; + } + + if (!capable(CAP_NET_ADMIN)) { + return -EPERM; + } + + if (orig_app_abi_ver == -1) { + /* no orig_app_abi_ver was provided yet, so we'll use the + * current one from now on, even if it's 0 + */ + orig_app_abi_ver = app_abi_ver; + + } else if (orig_app_abi_ver != app_abi_ver) { + printk(KERN_ERR DRV_NAME + ": Error: already using ifenslave ABI version %d; to " + "upgrade ifenslave to version %d, you must first " + "reload bonding.\n", + orig_app_abi_ver, app_abi_ver); + return -EINVAL; + } + + slave_dev = dev_get_by_name(ifr->ifr_slave); + + dprintk("slave_dev=%p: \n", slave_dev); + + if (!slave_dev) { + res = -ENODEV; + } else { + dprintk("slave_dev->name=%s: \n", slave_dev->name); + switch (cmd) { + case BOND_ENSLAVE_OLD: + case SIOCBONDENSLAVE: + res = bond_enslave(bond_dev, slave_dev); + break; + case BOND_RELEASE_OLD: + case SIOCBONDRELEASE: + res = bond_release(bond_dev, slave_dev); + break; + case BOND_SETHWADDR_OLD: + case SIOCBONDSETHWADDR: + res = bond_sethwaddr(bond_dev, slave_dev); + break; + case BOND_CHANGE_ACTIVE_OLD: + case SIOCBONDCHANGEACTIVE: + if (USES_PRIMARY(bond_mode)) { + res = bond_ioctl_change_active(bond_dev, slave_dev); + } else { + res = -EINVAL; + } + break; + default: + res = -EOPNOTSUPP; + } + + dev_put(slave_dev); + } + + if (res < 0) { + /* The ioctl failed, so there's no point in changing the + * orig_app_abi_ver. We'll restore it's value just in case + * we've changed it earlier in this function. + */ + orig_app_abi_ver = prev_abi_ver; + } + return res; } -static struct notifier_block bond_netdev_notifier = { - .notifier_call = bond_netdev_event, -}; +static void bond_set_multicast_list(struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct dev_mc_list *dmi; -/* De-initialize device specific data. - * Caller must hold rtnl_lock. + write_lock_bh(&bond->lock); + + /* + * Do promisc before checking multicast_mode + */ + if ((bond_dev->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC)) { + bond_set_promiscuity(bond, 1); + } + + if (!(bond_dev->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC)) { + bond_set_promiscuity(bond, -1); + } + + /* set allmulti flag to slaves */ + if ((bond_dev->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI)) { + bond_set_allmulti(bond, 1); + } + + if (!(bond_dev->flags & IFF_ALLMULTI) && (bond->flags & IFF_ALLMULTI)) { + bond_set_allmulti(bond, -1); + } + + bond->flags = bond_dev->flags; + + /* looking for addresses to add to slaves' mc list */ + for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) { + if (!bond_mc_list_find_dmi(dmi, bond->mc_list)) { + bond_mc_add(bond, dmi->dmi_addr, dmi->dmi_addrlen); + } + } + + /* looking for addresses to delete from slaves' list */ + for (dmi = bond->mc_list; dmi; dmi = dmi->next) { + if (!bond_mc_list_find_dmi(dmi, bond_dev->mc_list)) { + bond_mc_delete(bond, dmi->dmi_addr, dmi->dmi_addrlen); + } + } + + /* save master's multicast list */ + bond_mc_list_destroy(bond); + bond_mc_list_copy(bond_dev->mc_list, bond, GFP_ATOMIC); + + write_unlock_bh(&bond->lock); +} + +/* + * Change the MTU of all of a master's slaves to match the master */ -static inline void bond_deinit(struct net_device *dev) +static int bond_change_mtu(struct net_device *bond_dev, int new_mtu) { - struct bonding *bond = dev->priv; + struct bonding *bond = bond_dev->priv; + struct slave *slave, *stop_at; + int res = 0; + int i; - list_del(&bond->bond_list); + dprintk("bond=%p, name=%s, new_mtu=%d\n", bond, + (bond_dev ? bond_dev->name : "None"), new_mtu); -#ifdef CONFIG_PROC_FS - bond_destroy_proc_info(bond); -#endif + /* Can't hold bond->lock with bh disabled here since + * some base drivers panic. On the other hand we can't + * hold bond->lock without bh disabled because we'll + * deadlock. The only solution is to rely on the fact + * that we're under rtnl_lock here, and the slaves + * list won't change. This doesn't solve the problem + * of setting the slave's MTU while it is + * transmitting, but the assumption is that the base + * driver can handle that. + * + * TODO: figure out a way to safely iterate the slaves + * list, but without holding a lock around the actual + * call to the base driver. + */ + + bond_for_each_slave(bond, slave, i) { + dprintk("s %p s->p %p c_m %p\n", slave, + slave->prev, slave->dev->change_mtu); + if (slave->dev->change_mtu) { + res = slave->dev->change_mtu(slave->dev, new_mtu); + } else { + slave->dev->mtu = new_mtu; + res = 0; + } + + if (res) { + /* If we failed to set the slave's mtu to the new value + * we must abort the operation even in ACTIVE_BACKUP + * mode, because if we allow the backup slaves to have + * different mtu values than the active slave we'll + * need to change their mtu when doing a failover. That + * means changing their mtu from timer context, which + * is probably not a good idea. + */ + dprintk("err %d %s\n", res, slave->dev->name); + goto unwind; + } + } + + bond_dev->mtu = new_mtu; + + return 0; + +unwind: + /* unwind from head to the slave that failed */ + stop_at = slave; + bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) { + int tmp_res; + + if (slave->dev->change_mtu) { + tmp_res = slave->dev->change_mtu(slave->dev, bond_dev->mtu); + if (tmp_res) { + dprintk("unwind err %d dev %s\n", tmp_res, + slave->dev->name); + } + } else { + slave->dev->mtu = bond_dev->mtu; + } + } + + return res; } -/* Unregister and free all bond devices. - * Caller must hold rtnl_lock. +/* + * Change HW address + * + * Note that many devices must be down to change the HW address, and + * downing the master releases all slaves. We can make bonds full of + * bonding devices to test this, however. */ -static void bond_free_all(void) +static int bond_set_mac_address(struct net_device *bond_dev, void *addr) { - struct bonding *bond, *nxt; + struct bonding *bond = bond_dev->priv; + struct sockaddr *sa = addr, tmp_sa; + struct slave *slave, *stop_at; + int res = 0; + int i; - list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list) { - struct net_device *dev = bond->device; + dprintk("bond=%p, name=%s\n", bond, (bond_dev ? bond_dev->name : "None")); - unregister_netdevice(dev); - bond_deinit(dev); + if (!is_valid_ether_addr(sa->sa_data)) { + return -EADDRNOTAVAIL; } -#ifdef CONFIG_PROC_FS - bond_destroy_proc_dir(); -#endif + /* Can't hold bond->lock with bh disabled here since + * some base drivers panic. On the other hand we can't + * hold bond->lock without bh disabled because we'll + * deadlock. The only solution is to rely on the fact + * that we're under rtnl_lock here, and the slaves + * list won't change. This doesn't solve the problem + * of setting the slave's hw address while it is + * transmitting, but the assumption is that the base + * driver can handle that. + * + * TODO: figure out a way to safely iterate the slaves + * list, but without holding a lock around the actual + * call to the base driver. + */ + + bond_for_each_slave(bond, slave, i) { + dprintk("slave %p %s\n", slave, slave->dev->name); + + if (slave->dev->set_mac_address == NULL) { + res = -EOPNOTSUPP; + dprintk("EOPNOTSUPP %s\n", slave->dev->name); + goto unwind; + } + + res = slave->dev->set_mac_address(slave->dev, addr); + if (res) { + /* TODO: consider downing the slave + * and retry ? + * User should expect communications + * breakage anyway until ARP finish + * updating, so... + */ + dprintk("err %d %s\n", res, slave->dev->name); + goto unwind; + } + } + + /* success */ + memcpy(bond_dev->dev_addr, sa->sa_data, bond_dev->addr_len); + return 0; + +unwind: + memcpy(tmp_sa.sa_data, bond_dev->dev_addr, bond_dev->addr_len); + tmp_sa.sa_family = bond_dev->type; + + /* unwind from head to the slave that failed */ + stop_at = slave; + bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) { + int tmp_res; + + tmp_res = slave->dev->set_mac_address(slave->dev, &tmp_sa); + if (tmp_res) { + dprintk("unwind err %d dev %s\n", tmp_res, + slave->dev->name); + } + } + + return res; +} + +static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct slave *slave, *start_at; + int i; + + read_lock(&bond->lock); + + if (!BOND_IS_OK(bond)) { + goto free_out; + } + + read_lock(&bond->curr_slave_lock); + slave = start_at = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); + + if (!slave) { + goto free_out; + } + + bond_for_each_slave_from(bond, slave, i, start_at) { + if (IS_UP(slave->dev) && + (slave->link == BOND_LINK_UP) && + (slave->state == BOND_STATE_ACTIVE)) { + skb->dev = slave->dev; + skb->priority = 1; + dev_queue_xmit(skb); + + write_lock(&bond->curr_slave_lock); + bond->curr_active_slave = slave->next; + write_unlock(&bond->curr_slave_lock); + + goto out; + } + } + +out: + read_unlock(&bond->lock); + return 0; + +free_out: + /* no suitable interface, frame not sent */ + dev_kfree_skb(skb); + goto out; +} + +/* + * in active-backup mode, we know that bond->curr_active_slave is always valid if + * the bond has a usable interface. + */ +static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + + /* if we are sending arp packets, try to at least + identify our own ip address */ + if (arp_interval && !my_ip && + (skb->protocol == __constant_htons(ETH_P_ARP))) { + char *the_ip = (char *)skb->data + + sizeof(struct ethhdr) + + sizeof(struct arphdr) + + ETH_ALEN; + memcpy(&my_ip, the_ip, 4); + } + + read_lock(&bond->lock); + read_lock(&bond->curr_slave_lock); + + if (!BOND_IS_OK(bond)) { + goto free_out; + } + + if (bond->curr_active_slave) { /* one usable interface */ + skb->dev = bond->curr_active_slave->dev; + skb->priority = 1; + dev_queue_xmit(skb); + goto out; + } else { + goto free_out; + } +out: + read_unlock(&bond->curr_slave_lock); + read_unlock(&bond->lock); + return 0; + +free_out: + /* no suitable interface, frame not sent */ + dev_kfree_skb(skb); + goto out; +} + +/* + * in XOR mode, we determine the output device by performing xor on + * the source and destination hw adresses. If this device is not + * enabled, find the next slave following this xor slave. + */ +static int bond_xmit_xor(struct sk_buff *skb, struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct ethhdr *data = (struct ethhdr *)skb->data; + struct slave *slave, *start_at; + int slave_no; + int i; + + read_lock(&bond->lock); + + if (!BOND_IS_OK(bond)) { + goto free_out; + } + + slave_no = (data->h_dest[5]^bond_dev->dev_addr[5]) % bond->slave_cnt; + + bond_for_each_slave(bond, slave, i) { + slave_no--; + if (slave_no < 0) { + break; + } + } + + start_at = slave; + + bond_for_each_slave_from(bond, slave, i, start_at) { + if (IS_UP(slave->dev) && + (slave->link == BOND_LINK_UP) && + (slave->state == BOND_STATE_ACTIVE)) { + skb->dev = slave->dev; + skb->priority = 1; + dev_queue_xmit(skb); + + goto out; + } + } + +out: + read_unlock(&bond->lock); + return 0; + +free_out: + /* no suitable interface, frame not sent */ + dev_kfree_skb(skb); + goto out; +} + +/* + * in broadcast mode, we send everything to all usable interfaces. + */ +static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev) +{ + struct bonding *bond = bond_dev->priv; + struct slave *slave, *start_at; + struct net_device *tx_dev = NULL; + int i; + + read_lock(&bond->lock); + + if (!BOND_IS_OK(bond)) { + goto free_out; + } + + read_lock(&bond->curr_slave_lock); + start_at = bond->curr_active_slave; + read_unlock(&bond->curr_slave_lock); + + if (!start_at) { + goto free_out; + } + + bond_for_each_slave_from(bond, slave, i, start_at) { + if (IS_UP(slave->dev) && + (slave->link == BOND_LINK_UP) && + (slave->state == BOND_STATE_ACTIVE)) { + if (tx_dev) { + struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); + if (!skb2) { + printk(KERN_ERR DRV_NAME + ": Error: bond_xmit_broadcast(): " + "skb_clone() failed\n"); + continue; + } + + skb2->dev = tx_dev; + skb2->priority = 1; + dev_queue_xmit(skb2); + } + tx_dev = slave->dev; + } + } + + if (tx_dev) { + skb->dev = tx_dev; + skb->priority = 1; + dev_queue_xmit(skb); + } else { + goto free_out; + } + +out: + /* frame sent to all suitable interfaces */ + read_unlock(&bond->lock); + return 0; + +free_out: + /* no suitable interface, frame not sent */ + dev_kfree_skb(skb); + goto out; } +#ifdef CONFIG_NET_FASTROUTE +static int bond_accept_fastpath(struct net_device *bond_dev, struct dst_entry *dst) +{ + return -1; +} +#endif + +/*------------------------- Device initialization ---------------------------*/ + /* * Does not allocate but creates a /proc entry. * Allowed to fail. */ -static int __init bond_init(struct net_device *dev) +static int __init bond_init(struct net_device *bond_dev) { - struct bonding *bond; + struct bonding *bond = bond_dev->priv; int count; -#ifdef BONDING_DEBUG - printk (KERN_INFO "Begin bond_init for %s\n", dev->name); -#endif - bond = dev->priv; + dprintk("Begin bond_init for %s\n", bond_dev->name); /* initialize rwlocks */ rwlock_init(&bond->lock); - rwlock_init(&bond->ptrlock); + rwlock_init(&bond->curr_slave_lock); /* Initialize pointers */ - bond->next = bond->prev = (slave_t *)bond; - bond->current_slave = NULL; + bond->first_slave = NULL; + bond->curr_active_slave = NULL; bond->current_arp_slave = NULL; - bond->device = dev; + bond->primary_slave = NULL; + bond->dev = bond_dev; - /* Initialize the device structure. */ - dev->set_mac_address = bond_set_mac_address; + /* Initialize the device entry points */ + bond_dev->open = bond_open; + bond_dev->stop = bond_close; + bond_dev->get_stats = bond_get_stats; + bond_dev->do_ioctl = bond_do_ioctl; + bond_dev->set_multicast_list = bond_set_multicast_list; + bond_dev->change_mtu = bond_change_mtu; + bond_dev->set_mac_address = bond_set_mac_address; switch (bond_mode) { - case BOND_MODE_ACTIVEBACKUP: - dev->hard_start_xmit = bond_xmit_activebackup; - break; case BOND_MODE_ROUNDROBIN: - dev->hard_start_xmit = bond_xmit_roundrobin; + bond_dev->hard_start_xmit = bond_xmit_roundrobin; + break; + case BOND_MODE_ACTIVEBACKUP: + bond_dev->hard_start_xmit = bond_xmit_activebackup; break; case BOND_MODE_XOR: - dev->hard_start_xmit = bond_xmit_xor; + bond_dev->hard_start_xmit = bond_xmit_xor; break; case BOND_MODE_BROADCAST: - dev->hard_start_xmit = bond_xmit_broadcast; + bond_dev->hard_start_xmit = bond_xmit_broadcast; break; case BOND_MODE_8023AD: - dev->hard_start_xmit = bond_3ad_xmit_xor; + bond_dev->hard_start_xmit = bond_3ad_xmit_xor; /* extern */ break; case BOND_MODE_TLB: case BOND_MODE_ALB: - dev->hard_start_xmit = bond_alb_xmit; - dev->set_mac_address = bond_alb_set_mac_address; + bond_dev->hard_start_xmit = bond_alb_xmit; /* extern */ + bond_dev->set_mac_address = bond_alb_set_mac_address; /* extern */ break; default: - printk(KERN_ERR "Unknown bonding mode %d\n", bond_mode); + printk(KERN_ERR DRV_NAME + ": Error: Unknown bonding mode %d\n", + bond_mode); return -EINVAL; } - dev->get_stats = bond_get_stats; - dev->open = bond_open; - dev->stop = bond_close; - dev->set_multicast_list = set_multicast_list; - dev->do_ioctl = bond_ioctl; - dev->change_mtu = bond_change_mtu; - dev->tx_queue_len = 0; - dev->flags |= IFF_MASTER|IFF_MULTICAST; + bond_dev->destructor = free_netdev; #ifdef CONFIG_NET_FASTROUTE - dev->accept_fastpath = bond_accept_fastpath; + bond_dev->accept_fastpath = bond_accept_fastpath; #endif - printk(KERN_INFO "%s registered with", dev->name); - if (miimon > 0) { + /* Initialize the device options */ + bond_dev->tx_queue_len = 0; + bond_dev->flags |= IFF_MASTER|IFF_MULTICAST; + + printk(KERN_INFO DRV_NAME ": %s registered with", bond_dev->name); + if (miimon) { printk(" MII link monitoring set to %d ms", miimon); updelay /= miimon; downdelay /= miimon; @@ -3992,50 +3794,75 @@ } printk(", in %s mode.\n", bond_mode_name()); - printk(KERN_INFO "%s registered with", dev->name); + printk(KERN_INFO DRV_NAME ": %s registered with", bond_dev->name); if (arp_interval > 0) { - printk(" ARP monitoring set to %d ms with %d target(s):", - arp_interval, arp_ip_count); - for (count=0 ; countdestructor = free_netdev; - list_add_tail(&bond->bond_list, &bond_dev_list); return 0; } -/* -static int __init bond_probe(struct net_device *dev) +/* De-initialize device specific data. + * Caller must hold rtnl_lock. + */ +static inline void bond_deinit(struct net_device *bond_dev) { - bond_init(dev); - return 0; + struct bonding *bond = bond_dev->priv; + + list_del(&bond->bond_list); + +#ifdef CONFIG_PROC_FS + bond_remove_proc_entry(bond); +#endif } + +/* Unregister and free all bond devices. + * Caller must hold rtnl_lock. */ +static void bond_free_all(void) +{ + struct bonding *bond, *nxt; + + list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list) { + struct net_device *bond_dev = bond->dev; + + unregister_netdevice(bond_dev); + bond_deinit(bond_dev); + } + +#ifdef CONFIG_PROC_FS + bond_destroy_proc_dir(); +#endif +} + +/*------------------------- Module initialization ---------------------------*/ /* * Convert string input module parms. Accept either the * number of the mode or its string name. */ -static inline int -bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl) +static inline int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl) { int i; - for (i = 0; tbl[i].modename != NULL; i++) { + for (i = 0; tbl[i].modename; i++) { if ((isdigit(*mode_arg) && - tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) || - (0 == strncmp(mode_arg, tbl[i].modename, - strlen(tbl[i].modename)))) { + tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) || + (strncmp(mode_arg, tbl[i].modename, + strlen(tbl[i].modename)) == 0)) { return tbl[i].mode; } } @@ -4043,88 +3870,64 @@ return -1; } - -static int __init bonding_init(void) +static int bond_check_params(void) { - int no; - int err; - - printk(KERN_INFO "%s", version); - /* * Convert string parameters. */ if (mode) { bond_mode = bond_parse_parm(mode, bond_mode_tbl); if (bond_mode == -1) { - printk(KERN_WARNING - "bonding_init(): Invalid bonding mode \"%s\"\n", + printk(KERN_ERR DRV_NAME + ": Error: Invalid bonding mode \"%s\"\n", mode == NULL ? "NULL" : mode); return -EINVAL; } } - if (USES_PRIMARY(bond_mode)) { - multicast_mode = BOND_MULTICAST_ACTIVE; - } else { - multicast_mode = BOND_MULTICAST_ALL; - } - - if (multicast) { - multicast_mode = bond_parse_parm(multicast, bond_mc_tbl); - if (multicast_mode == -1) { - printk(KERN_WARNING - "bonding_init(): Invalid multicast mode \"%s\"\n", - multicast == NULL ? "NULL" : multicast); - return -EINVAL; - } - } - if (lacp_rate) { if (bond_mode != BOND_MODE_8023AD) { - printk(KERN_WARNING - "lacp_rate param is irrelevant in mode %s\n", + printk(KERN_INFO DRV_NAME + ": lacp_rate param is irrelevant in mode %s\n", bond_mode_name()); } else { lacp_fast = bond_parse_parm(lacp_rate, bond_lacp_tbl); if (lacp_fast == -1) { - printk(KERN_WARNING - "bonding_init(): Invalid lacp rate " - "\"%s\"\n", + printk(KERN_ERR DRV_NAME + ": Error: Invalid lacp rate \"%s\"\n", lacp_rate == NULL ? "NULL" : lacp_rate); - return -EINVAL; } } } if (max_bonds < 1 || max_bonds > INT_MAX) { - printk(KERN_WARNING - "bonding_init(): max_bonds (%d) not in range %d-%d, " - "so it was reset to BOND_DEFAULT_MAX_BONDS (%d)", + printk(KERN_WARNING DRV_NAME + ": Warning: max_bonds (%d) not in range %d-%d, so it " + "was reset to BOND_DEFAULT_MAX_BONDS (%d)", max_bonds, 1, INT_MAX, BOND_DEFAULT_MAX_BONDS); max_bonds = BOND_DEFAULT_MAX_BONDS; } if (miimon < 0) { - printk(KERN_WARNING - "bonding_init(): miimon module parameter (%d), " + printk(KERN_WARNING DRV_NAME + ": Warning: miimon module parameter (%d), " "not in range 0-%d, so it was reset to %d\n", miimon, INT_MAX, BOND_LINK_MON_INTERV); miimon = BOND_LINK_MON_INTERV; } if (updelay < 0) { - printk(KERN_WARNING - "bonding_init(): updelay module parameter (%d), " + printk(KERN_WARNING DRV_NAME + ": Warning: updelay module parameter (%d), " "not in range 0-%d, so it was reset to 0\n", updelay, INT_MAX); updelay = 0; } if (downdelay < 0) { - printk(KERN_WARNING - "bonding_init(): downdelay module parameter (%d), " + printk(KERN_WARNING DRV_NAME + ": Warning: downdelay module parameter (%d), " "not in range 0-%d, so it was reset to 0\n", downdelay, INT_MAX); downdelay = 0; @@ -4132,82 +3935,69 @@ /* reset values for 802.3ad */ if (bond_mode == BOND_MODE_8023AD) { - if (arp_interval != 0) { - printk(KERN_WARNING "bonding_init(): ARP monitoring" - "can't be used simultaneously with 802.3ad, " - "disabling ARP monitoring\n"); + if (arp_interval) { + printk(KERN_WARNING DRV_NAME + ": Warning: ARP monitoring can't be used " + "simultaneously with 802.3ad, disabling ARP " + "monitoring\n"); arp_interval = 0; } - if (miimon == 0) { - printk(KERN_ERR - "bonding_init(): miimon must be specified, " - "otherwise bonding will not detect link failure, " - "speed and duplex which are essential " - "for 802.3ad operation\n"); - printk(KERN_ERR "Forcing miimon to 100msec\n"); + if (miimon) { + printk(KERN_WARNING DRV_NAME + ": Warning: miimon must be specified, " + "otherwise bonding will not detect link " + "failure, speed and duplex which are " + "essential for 802.3ad operation\n"); + printk(KERN_WARNING "Forcing miimon to 100msec\n"); miimon = 100; } - - if (multicast_mode != BOND_MULTICAST_ALL) { - printk(KERN_ERR - "bonding_init(): Multicast mode must " - "be set to ALL for 802.3ad\n"); - printk(KERN_ERR "Forcing Multicast mode to ALL\n"); - multicast_mode = BOND_MULTICAST_ALL; - } } /* reset values for TLB/ALB */ if ((bond_mode == BOND_MODE_TLB) || (bond_mode == BOND_MODE_ALB)) { - if (miimon == 0) { - printk(KERN_ERR - "bonding_init(): miimon must be specified, " - "otherwise bonding will not detect link failure " - "and link speed which are essential " + if (!miimon) { + printk(KERN_WARNING DRV_NAME + ": Warning: miimon must be specified, " + "otherwise bonding will not detect link " + "failure and link speed which are essential " "for TLB/ALB load balancing\n"); - printk(KERN_ERR "Forcing miimon to 100msec\n"); + printk(KERN_WARNING "Forcing miimon to 100msec\n"); miimon = 100; } - - if (multicast_mode != BOND_MULTICAST_ACTIVE) { - printk(KERN_ERR - "bonding_init(): Multicast mode must " - "be set to ACTIVE for TLB/ALB\n"); - printk(KERN_ERR "Forcing Multicast mode to ACTIVE\n"); - multicast_mode = BOND_MULTICAST_ACTIVE; - } } if (bond_mode == BOND_MODE_ALB) { - printk(KERN_INFO - "In ALB mode you might experience client disconnections" - " upon reconnection of a link if the bonding module" - " updelay parameter (%d msec) is incompatible with the" - " forwarding delay time of the switch\n", updelay); + printk(KERN_NOTICE DRV_NAME + ": In ALB mode you might experience client " + "disconnections upon reconnection of a link if the " + "bonding module updelay parameter (%d msec) is " + "incompatible with the forwarding delay time of the " + "switch\n", + updelay); } - if (miimon == 0) { - if ((updelay != 0) || (downdelay != 0)) { + if (!miimon) { + if (updelay || downdelay) { /* just warn the user the up/down delay will have * no effect since miimon is zero... */ - printk(KERN_WARNING - "bonding_init(): miimon module parameter not " - "set and updelay (%d) or downdelay (%d) module " + printk(KERN_WARNING DRV_NAME + ": Warning: miimon module parameter not set " + "and updelay (%d) or downdelay (%d) module " "parameter is set; updelay and downdelay have " "no effect unless miimon is set\n", - updelay, downdelay); + updelay, downdelay); } } else { /* don't allow arp monitoring */ - if (arp_interval != 0) { - printk(KERN_WARNING - "bonding_init(): miimon (%d) and arp_interval " - "(%d) can't be used simultaneously, " - "disabling ARP monitoring\n", - miimon, arp_interval); + if (arp_interval) { + printk(KERN_WARNING DRV_NAME + ": Warning: miimon (%d) and arp_interval (%d) " + "can't be used simultaneously, disabling ARP " + "monitoring\n", + miimon, arp_interval); arp_interval = 0; } @@ -4215,103 +4005,114 @@ /* updelay will be rounded in bond_init() when it * is divided by miimon, we just inform user here */ - printk(KERN_WARNING - "bonding_init(): updelay (%d) is not a multiple " + printk(KERN_WARNING DRV_NAME + ": Warning: updelay (%d) is not a multiple " "of miimon (%d), updelay rounded to %d ms\n", - updelay, miimon, (updelay / miimon) * miimon); + updelay, miimon, (updelay / miimon) * miimon); } if ((downdelay % miimon) != 0) { /* downdelay will be rounded in bond_init() when it * is divided by miimon, we just inform user here */ - printk(KERN_WARNING - "bonding_init(): downdelay (%d) is not a " - "multiple of miimon (%d), downdelay rounded " - "to %d ms\n", - downdelay, miimon, + printk(KERN_WARNING DRV_NAME + ": Warning: downdelay (%d) is not a multiple " + "of miimon (%d), downdelay rounded to %d ms\n", + downdelay, miimon, (downdelay / miimon) * miimon); } } if (arp_interval < 0) { - printk(KERN_WARNING - "bonding_init(): arp_interval module parameter (%d), " - "not in range 0-%d, so it was reset to %d\n", + printk(KERN_WARNING DRV_NAME + ": Warning: arp_interval module parameter (%d) " + ", not in range 0-%d, so it was reset to %d\n", arp_interval, INT_MAX, BOND_LINK_ARP_INTERV); arp_interval = BOND_LINK_ARP_INTERV; } - for (arp_ip_count=0 ; - (arp_ip_count < MAX_ARP_IP_TARGETS) && arp_ip_target[arp_ip_count]; - arp_ip_count++ ) { + for (arp_ip_count = 0; + (arp_ip_count < MAX_ARP_IP_TARGETS) && arp_ip_target[arp_ip_count]; + arp_ip_count++) { /* not complete check, but should be good enough to catch mistakes */ - if (!isdigit(arp_ip_target[arp_ip_count][0])) { - printk(KERN_WARNING - "bonding_init(): bad arp_ip_target module " - "parameter (%s), ARP monitoring will not be " - "performed\n", - arp_ip_target[arp_ip_count]); - arp_interval = 0; - } else { - u32 ip = in_aton(arp_ip_target[arp_ip_count]); + if (!isdigit(arp_ip_target[arp_ip_count][0])) { + printk(KERN_WARNING DRV_NAME + ": Warning: bad arp_ip_target module parameter " + "(%s), ARP monitoring will not be performed\n", + arp_ip_target[arp_ip_count]); + arp_interval = 0; + } else { + u32 ip = in_aton(arp_ip_target[arp_ip_count]); arp_target[arp_ip_count] = ip; } - } - + } - if ( (arp_interval > 0) && (arp_ip_count==0)) { + if (arp_interval && !arp_ip_count) { /* don't allow arping if no arp_ip_target given... */ - printk(KERN_WARNING - "bonding_init(): arp_interval module parameter " - "(%d) specified without providing an arp_ip_target " + printk(KERN_WARNING DRV_NAME + ": Warning: arp_interval module parameter (%d) " + "specified without providing an arp_ip_target " "parameter, arp_interval was reset to 0\n", arp_interval); arp_interval = 0; } - if ((miimon == 0) && (arp_interval == 0)) { + if (!miimon && !arp_interval) { /* miimon and arp_interval not set, we need one so things * work as expected, see bonding.txt for details */ - printk(KERN_ERR - "bonding_init(): either miimon or " - "arp_interval and arp_ip_target module parameters " - "must be specified, otherwise bonding will not detect " - "link failures! see bonding.txt for details.\n"); + printk(KERN_WARNING DRV_NAME + ": Warning: either miimon or arp_interval and " + "arp_ip_target module parameters must be specified, " + "otherwise bonding will not detect link failures! see " + "bonding.txt for details.\n"); } - if ((primary != NULL) && !USES_PRIMARY(bond_mode)) { + if (primary && !USES_PRIMARY(bond_mode)) { /* currently, using a primary only makes sense * in active backup, TLB or ALB modes */ - printk(KERN_WARNING - "bonding_init(): %s primary device specified but has " - "no effect in %s mode\n", + printk(KERN_WARNING DRV_NAME + ": Warning: %s primary device specified but has no " + "effect in %s mode\n", primary, bond_mode_name()); primary = NULL; } + return 0; +} + +static int __init bonding_init(void) +{ + int i; + int res; + + printk(KERN_INFO "%s", version); + + res = bond_check_params(); + if (res) { + return res; + } + rtnl_lock(); #ifdef CONFIG_PROC_FS bond_create_proc_dir(); #endif - err = 0; - for (no = 0; no < max_bonds; no++) { - struct net_device *dev; - - dev = alloc_netdev(sizeof(struct bonding), "", ether_setup); - if (!dev) { - err = -ENOMEM; + for (i = 0; i < max_bonds; i++) { + struct net_device *bond_dev; + + bond_dev = alloc_netdev(sizeof(struct bonding), "", ether_setup); + if (!bond_dev) { + res = -ENOMEM; goto out_err; } - err = dev_alloc_name(dev, "bond%d"); - if (err < 0) { - free_netdev(dev); + res = dev_alloc_name(bond_dev, "bond%d"); + if (res < 0) { + free_netdev(bond_dev); goto out_err; } @@ -4319,18 +4120,18 @@ * /proc files), but before register_netdevice(), because we * need to set function pointers. */ - err = bond_init(dev); - if (err < 0) { - free_netdev(dev); + res = bond_init(bond_dev); + if (res < 0) { + free_netdev(bond_dev); goto out_err; } - SET_MODULE_OWNER(dev); + SET_MODULE_OWNER(bond_dev); - err = register_netdevice(dev); - if (err < 0) { - bond_deinit(dev); - free_netdev(dev); + res = register_netdevice(bond_dev); + if (res < 0) { + bond_deinit(bond_dev); + free_netdev(bond_dev); goto out_err; } } @@ -4346,7 +4147,7 @@ rtnl_unlock(); - return err; + return res; } static void __exit bonding_exit(void) @@ -4362,6 +4163,8 @@ module_exit(bonding_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION(DRV_DESCRIPTION ", v" DRV_VERSION); +MODULE_AUTHOR("Thomas Davis, tadavis@lbl.gov and many others"); +MODULE_SUPPORTED_DEVICE("most ethernet devices"); /* * Local variables: @@ -4370,3 +4173,4 @@ * tab-width: 8 * End: */ + diff -Nru a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h --- a/drivers/net/bonding/bonding.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/bonding/bonding.h Tue Feb 17 20:00:06 2004 @@ -9,7 +9,7 @@ * * This software may be used and distributed according to the terms * of the GNU Public License, incorporated herein by reference. - * + * * * 2003/03/18 - Amir Noam , * Tsippy Mendelson and @@ -22,159 +22,205 @@ * * 2003/05/01 - Shmulik Hen * - Added support for Transmit load balancing mode. + * + * 2003/09/24 - Shmulik Hen + * - Code cleanup and style changes */ - + #ifndef _LINUX_BONDING_H #define _LINUX_BONDING_H #include #include +#include #include "bond_3ad.h" #include "bond_alb.h" -#ifdef BONDING_DEBUG - -// use this like so: BOND_PRINT_DBG(("foo = %d, bar = %d", foo, bar)); -#define BOND_PRINT_DBG(X) \ -do { \ - printk(KERN_DEBUG "%s (%d)", __FUNCTION__, __LINE__); \ - printk X; \ - printk("\n"); \ -} while(0) +#define DRV_VERSION "2.5.0" +#define DRV_RELDATE "December 1, 2003" +#define DRV_NAME "bonding" +#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" +#ifdef BONDING_DEBUG +#define dprintk(fmt, args...) \ + printk(KERN_DEBUG \ + DRV_NAME ": %s() %d: " fmt, __FUNCTION__, __LINE__ , ## args ) #else -#define BOND_PRINT_DBG(X) +#define dprintk(fmt, args...) #endif /* BONDING_DEBUG */ -#define IS_UP(dev) ((((dev)->flags & (IFF_UP)) == (IFF_UP)) && \ - (netif_running(dev) && netif_carrier_ok(dev))) +#define IS_UP(dev) \ + ((((dev)->flags & IFF_UP) == IFF_UP) && \ + netif_running(dev) && \ + netif_carrier_ok(dev)) + +/* + * Checks whether bond is ready for transmit. + * + * Caller must hold bond->lock + */ +#define BOND_IS_OK(bond) \ + (((bond)->dev->flags & IFF_UP) && \ + netif_running((bond)->dev) && \ + ((bond)->slave_cnt > 0)) -/* Checks whether the dev is ready for transmit. We do not check netif_running - * since a device can be stopped by the driver for short periods of time for - * maintainance. dev_queue_xmit() handles this by queing the packet until the - * the dev is running again. Keeping packets ordering requires sticking the - * same dev as much as possible - */ -#define SLAVE_IS_OK(slave) \ - ((((slave)->dev->flags & (IFF_UP)) == (IFF_UP)) && \ - netif_carrier_ok((slave)->dev) && \ +/* + * Checks whether slave is ready for transmit. + */ +#define SLAVE_IS_OK(slave) \ + (((slave)->dev->flags & IFF_UP) && \ + netif_running((slave)->dev) && \ ((slave)->link == BOND_LINK_UP) && \ ((slave)->state == BOND_STATE_ACTIVE)) -typedef struct slave { +#define USES_PRIMARY(mode) \ + (((mode) == BOND_MODE_ACTIVEBACKUP) || \ + ((mode) == BOND_MODE_TLB) || \ + ((mode) == BOND_MODE_ALB)) + +/* + * Less bad way to call ioctl from within the kernel; this needs to be + * done some other way to get the call out of interrupt context. + * Needs "ioctl" variable to be supplied by calling context. + */ +#define IOCTL(dev, arg, cmd) ({ \ + int res = 0; \ + mm_segment_t fs = get_fs(); \ + set_fs(get_ds()); \ + res = ioctl(dev, arg, cmd); \ + set_fs(fs); \ + res; }) + +/** + * bond_for_each_slave_from - iterate the slaves list from a starting point + * @bond: the bond holding this list. + * @pos: current slave. + * @cnt: counter for max number of moves + * @start: starting point. + * + * Caller must hold bond->lock + */ +#define bond_for_each_slave_from(bond, pos, cnt, start) \ + for (cnt = 0, pos = start; \ + cnt < (bond)->slave_cnt; \ + cnt++, pos = (pos)->next) + +/** + * bond_for_each_slave_from_to - iterate the slaves list from start point to stop point + * @bond: the bond holding this list. + * @pos: current slave. + * @cnt: counter for number max of moves + * @start: start point. + * @stop: stop point. + * + * Caller must hold bond->lock + */ +#define bond_for_each_slave_from_to(bond, pos, cnt, start, stop) \ + for (cnt = 0, pos = start; \ + ((cnt < (bond)->slave_cnt) && (pos != (stop)->next)); \ + cnt++, pos = (pos)->next) + +/** + * bond_for_each_slave - iterate the slaves list from head + * @bond: the bond holding this list. + * @pos: current slave. + * @cnt: counter for max number of moves + * + * Caller must hold bond->lock + */ +#define bond_for_each_slave(bond, pos, cnt) \ + bond_for_each_slave_from(bond, pos, cnt, (bond)->first_slave) + + +struct slave { + struct net_device *dev; /* first - usefull for panic debug */ struct slave *next; struct slave *prev; - struct net_device *dev; - short delay; - unsigned long jiffies; - char link; /* one of BOND_LINK_XXXX */ - char state; /* one of BOND_STATE_XXXX */ - unsigned short original_flags; - u32 link_failure_count; + s16 delay; + u32 jiffies; + s8 link; /* one of BOND_LINK_XXXX */ + s8 state; /* one of BOND_STATE_XXXX */ + u32 original_flags; + u32 link_failure_count; u16 speed; u8 duplex; u8 perm_hwaddr[ETH_ALEN]; struct ad_slave_info ad_info; /* HUGE - better to dynamically alloc */ struct tlb_slave_info tlb_info; -} slave_t; +}; /* * Here are the locking policies for the two bonding locks: * * 1) Get bond->lock when reading/writing slave list. - * 2) Get bond->ptrlock when reading/writing bond->current_slave. + * 2) Get bond->curr_slave_lock when reading/writing bond->curr_active_slave. * (It is unnecessary when the write-lock is put with bond->lock.) - * 3) When we lock with bond->ptrlock, we must lock with bond->lock + * 3) When we lock with bond->curr_slave_lock, we must lock with bond->lock * beforehand. */ -typedef struct bonding { - slave_t *next; - slave_t *prev; - slave_t *current_slave; - slave_t *primary_slave; - slave_t *current_arp_slave; - __s32 slave_cnt; +struct bonding { + struct net_device *dev; /* first - usefull for panic debug */ + struct slave *first_slave; + struct slave *curr_active_slave; + struct slave *current_arp_slave; + struct slave *primary_slave; + s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ rwlock_t lock; - rwlock_t ptrlock; - struct timer_list mii_timer; - struct timer_list arp_timer; - struct net_device_stats stats; + rwlock_t curr_slave_lock; + struct timer_list mii_timer; + struct timer_list arp_timer; + s8 kill_timers; + struct net_device_stats stats; #ifdef CONFIG_PROC_FS - struct proc_dir_entry *bond_proc_file; - char procdir_name[IFNAMSIZ]; + struct proc_dir_entry *proc_entry; + char proc_file_name[IFNAMSIZ]; #endif /* CONFIG_PROC_FS */ - struct list_head bond_list; - struct net_device *device; - struct dev_mc_list *mc_list; - unsigned short flags; - struct ad_bond_info ad_info; - struct alb_bond_info alb_info; -} bonding_t; - -/* Forward declarations */ -void bond_set_slave_active_flags(slave_t *slave); -void bond_set_slave_inactive_flags(slave_t *slave); - -/** - * These functions can be used for iterating the slave list - * (which is circular) - * Caller must hold bond lock for read - */ -extern inline struct slave* -bond_get_first_slave(struct bonding *bond) -{ - /* if there are no slaves return NULL */ - if (bond->next == (slave_t *)bond) { - return NULL; - } - return bond->next; -} - -/** - * Caller must hold bond lock for read - */ -extern inline struct slave* -bond_get_next_slave(struct bonding *bond, struct slave *slave) -{ - /* If we have reached the last slave return NULL */ - if (slave->next == bond->next) { - return NULL; - } - return slave->next; -} + struct list_head bond_list; + struct dev_mc_list *mc_list; + u16 flags; + struct ad_bond_info ad_info; + struct alb_bond_info alb_info; +}; /** * Returns NULL if the net_device does not belong to any of the bond's slaves * * Caller must hold bond lock for read */ -extern inline struct slave* -bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev) +extern inline struct slave *bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev) { - struct slave *our_slave = bond->next; + struct slave *slave = NULL; + int i; - /* check if the list of slaves is empty */ - if (our_slave == (slave_t *)bond) { - return NULL; - } - - for (; our_slave; our_slave = bond_get_next_slave(bond, our_slave)) { - if (our_slave->dev == slave_dev) { + bond_for_each_slave(bond, slave, i) { + if (slave->dev == slave_dev) { break; } } - return our_slave; + + return slave; } -extern inline struct bonding* -bond_get_bond_by_slave(struct slave *slave) +extern inline struct bonding *bond_get_bond_by_slave(struct slave *slave) { if (!slave || !slave->dev->master) { return NULL; } - return (struct bonding *)(slave->dev->master->priv); + return (struct bonding *)slave->dev->master->priv; +} + +extern inline void bond_set_slave_inactive_flags(struct slave *slave) +{ + slave->state = BOND_STATE_BACKUP; + slave->dev->flags |= IFF_NOARP; +} + +extern inline void bond_set_slave_active_flags(struct slave *slave) +{ + slave->state = BOND_STATE_ACTIVE; + slave->dev->flags &= ~IFF_NOARP; } #endif /* _LINUX_BONDING_H */ diff -Nru a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c --- a/drivers/net/cs89x0.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/cs89x0.c Tue Feb 17 20:00:07 2004 @@ -212,9 +212,7 @@ /* Index to functions, as function prototypes. */ -extern int cs89x0_probe(struct net_device *dev); - -static int cs89x0_probe1(struct net_device *dev, int ioaddr); +static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular); static int net_open(struct net_device *dev); static int net_send_packet(struct sk_buff *skb, struct net_device *dev); static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs); @@ -274,27 +272,51 @@ Return 0 on success. */ -int __init cs89x0_probe(struct net_device *dev) +struct net_device * __init cs89x0_probe(int unit) { - int i; - int base_addr = dev ? dev->base_addr : 0; - - SET_MODULE_OWNER(dev); + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + unsigned *port; + int err = 0; + int irq; + int io; + + if (!dev) + return ERR_PTR(-ENODEV); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; if (net_debug) - printk("cs89x0:cs89x0_probe(0x%x)\n", base_addr); + printk("cs89x0:cs89x0_probe(0x%x)\n", io); - if (base_addr > 0x1ff) /* Check a single specified location. */ - return cs89x0_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; netcard_portlist[i]; i++) { - if (cs89x0_probe1(dev, netcard_portlist[i]) == 0) - return 0; + if (io > 0x1ff) { /* Check a single specified location. */ + err = cs89x0_probe1(dev, io, 0); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = netcard_portlist; *port; port++) { + if (cs89x0_probe1(dev, *port, 0) == 0) + break; + dev->irq = irq; + } + if (!*port) + err = -ENODEV; } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + outw(PP_ChipID, dev->base_addr + ADD_PORT); + release_region(dev->base_addr, NETCARD_IO_EXTENT); +out: + free_netdev(dev); printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n"); - return -ENODEV; + return ERR_PTR(err); } static int @@ -375,39 +397,34 @@ */ static int __init -cs89x0_probe1(struct net_device *dev, int ioaddr) +cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) { - struct net_local *lp; + struct net_local *lp = (struct net_local *)dev->priv; static unsigned version_printed; int i; unsigned rev_type = 0; int eeprom_buff[CHKSUM_LEN]; int retval; + SET_MODULE_OWNER(dev); /* Initialize the device structure. */ - if (dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == 0) { - retval = -ENOMEM; - goto out; - } - lp = (struct net_local *)dev->priv; + if (!modular) { memset(lp, 0, sizeof(*lp)); spin_lock_init(&lp->lock); -#if !defined(MODULE) && (ALLOW_DMA != 0) +#ifndef MODULE +#if ALLOW_DMA if (g_cs89x0_dma) { lp->use_dma = 1; lp->dma = g_cs89x0_dma; lp->dmasize = 16; /* Could make this an option... */ } #endif -#ifndef MODULE lp->force = g_cs89x0_media__force; #endif } - lp = (struct net_local *)dev->priv; /* Grab the region so we can find another board if autoIRQ fails. */ + /* WTF is going on here? */ if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, dev->name)) { printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n", dev->name, ioaddr, NETCARD_IO_EXTENT); @@ -696,9 +713,6 @@ dev->set_multicast_list = set_multicast_list; dev->set_mac_address = set_mac_address; - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - printk("\n"); if (net_debug) printk("cs89x0_probe1() successful\n"); @@ -706,9 +720,6 @@ out2: release_region(ioaddr & ~3, NETCARD_IO_EXTENT); out1: - kfree(dev->priv); - dev->priv = 0; -out: return retval; } @@ -1655,7 +1666,7 @@ #ifdef MODULE -static struct net_device dev_cs89x0; +static struct net_device *dev_cs89x0; /* * Support the 'debug' module parm even if we're compiled for non-debug to @@ -1733,6 +1744,7 @@ int init_module(void) { + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); struct net_local *lp; int ret = 0; @@ -1741,18 +1753,12 @@ #else debug = 0; #endif - - dev_cs89x0.irq = irq; - dev_cs89x0.base_addr = io; - - dev_cs89x0.init = cs89x0_probe; - dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev_cs89x0.priv == 0) { - printk(KERN_ERR "cs89x0.c: Out of memory.\n"); + if (!dev) return -ENOMEM; - } - memset(dev_cs89x0.priv, 0, sizeof(struct net_local)); - lp = (struct net_local *)dev_cs89x0.priv; + + dev->irq = irq; + dev->base_addr = io; + lp = dev->priv; #if ALLOW_DMA if (use_dma) { @@ -1782,7 +1788,10 @@ printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n"); ret = -EPERM; goto out; - } + } else if (io <= 0x1ff) { + ret = -ENXIO; + goto out; + } #if ALLOW_DMA if (use_dma && dmasize != 16 && dmasize != 64) { @@ -1791,30 +1800,31 @@ goto out; } #endif + ret = cs89x0_probe1(dev, io, 1); + if (ret) + goto out; - if (register_netdev(&dev_cs89x0) != 0) { + if (register_netdev(dev) != 0) { printk(KERN_ERR "cs89x0.c: No card found at 0x%x\n", io); ret = -ENXIO; + outw(PP_ChipID, dev->base_addr + ADD_PORT); + release_region(dev->base_addr, NETCARD_IO_EXTENT); goto out; } + dev_cs89x0 = dev; + return 0; out: - if (ret) - kfree(dev_cs89x0.priv); + free_netdev(dev); return ret; } void cleanup_module(void) { - if (dev_cs89x0.priv != NULL) { - /* Free up the private structure, or leak memory :-) */ - unregister_netdev(&dev_cs89x0); - outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT); - kfree(dev_cs89x0.priv); - dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */ - /* If we don't do this, we can't re-insmod it later. */ - release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT); - } + unregister_netdev(dev_cs89x0); + outw(PP_ChipID, dev_cs89x0->base_addr + ADD_PORT); + release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT); + free_netdev(dev_cs89x0); } #endif /* MODULE */ diff -Nru a/drivers/net/de600.c b/drivers/net/de600.c --- a/drivers/net/de600.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/de600.c Tue Feb 17 20:00:08 2004 @@ -99,7 +99,7 @@ static volatile int tx_fifo_out; static volatile int free_tx_pages = TX_PAGES; static int was_down; -static spinlock_t de600_lock; +static spinlock_t de600_lock = SPIN_LOCK_UNLOCKED; static inline u8 de600_read_status(struct net_device *dev) { @@ -398,20 +398,31 @@ */ } -int __init de600_probe(struct net_device *dev) +static struct net_device * __init de600_probe(void) { int i; - static struct net_device_stats de600_netstats; - /*dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);*/ + struct net_device *dev; + int err; + + dev = alloc_etherdev(sizeof(struct net_device_stats)); + if (!dev) + return ERR_PTR(-ENOMEM); SET_MODULE_OWNER(dev); + if (!request_region(DE600_IO, 3, "de600")) { + printk(KERN_WARNING "DE600: port 0x%x busy\n", DE600_IO); + err = -EBUSY; + goto out; + } + printk(KERN_INFO "%s: D-Link DE-600 pocket adapter", dev->name); /* Alpha testers must have the version number to report bugs. */ if (de600_debug > 1) printk(version); /* probe for adapter */ + err = -ENODEV; rx_page = 0; select_nic(); (void)de600_read_status(dev); @@ -419,7 +430,7 @@ de600_put_command(STOP_RESET); if (de600_read_status(dev) & 0xf0) { printk(": not at I/O %#3x.\n", DATA_PORT); - return -ENODEV; + goto out1; } /* @@ -444,12 +455,7 @@ dev->dev_addr[3] |= 0x70; } else { printk(" not identified in the printer port\n"); - return -ENODEV; - } - - if (!request_region(DE600_IO, 3, "de600")) { - printk(KERN_WARNING "DE600: port 0x%x busy\n", DE600_IO); - return -EBUSY; + goto out1; } printk(", Ethernet Address: %02X", dev->dev_addr[0]); @@ -457,22 +463,27 @@ printk(":%02X",dev->dev_addr[i]); printk("\n"); - /* Initialize the device structure. */ - dev->priv = &de600_netstats; - - memset(dev->priv, 0, sizeof(struct net_device_stats)); dev->get_stats = get_stats; dev->open = de600_open; dev->stop = de600_close; dev->hard_start_xmit = &de600_start_xmit; - ether_setup(dev); - dev->flags&=~IFF_MULTICAST; select_prn(); - return 0; + + err = register_netdev(dev); + if (err) + goto out1; + + return dev; + +out1: + release_region(DE600_IO, 3); +out: + free_netdev(dev); + return ERR_PTR(err); } static int adapter_init(struct net_device *dev) @@ -527,21 +538,21 @@ return 0; /* OK */ } -static struct net_device de600_dev; +static struct net_device *de600_dev; static int __init de600_init(void) { - spin_lock_init(&de600_lock); - de600_dev.init = de600_probe; - if (register_netdev(&de600_dev) != 0) - return -EIO; + de600_dev = de600_probe(); + if (IS_ERR(de600_dev)) + return PTR_ERR(de600_dev); return 0; } static void __exit de600_exit(void) { - unregister_netdev(&de600_dev); + unregister_netdev(de600_dev); release_region(DE600_IO, 3); + free_netdev(de600_dev); } module_init(de600_init); diff -Nru a/drivers/net/de600.h b/drivers/net/de600.h --- a/drivers/net/de600.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/de600.h Tue Feb 17 20:00:07 2004 @@ -131,7 +131,6 @@ /* Initialization */ static void trigger_interrupt(struct net_device *dev); -int de600_probe(struct net_device *dev); static int adapter_init(struct net_device *dev); /* diff -Nru a/drivers/net/de620.c b/drivers/net/de620.c --- a/drivers/net/de620.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/de620.c Tue Feb 17 20:00:07 2004 @@ -226,7 +226,6 @@ /* Initialization */ static int adapter_init(struct net_device *); -int de620_probe(struct net_device *); static int read_eeprom(struct net_device *); @@ -814,11 +813,16 @@ * * Check if there is a DE-620 connected */ -int __init de620_probe(struct net_device *dev) +struct net_device * __init de620_probe(int unit) { - static struct net_device_stats de620_netstats; - int i; byte checkbyte = 0xa5; + struct net_device *dev; + int err = -ENOMEM; + int i; + + dev = alloc_etherdev(sizeof(struct net_device_stats)); + if (!dev) + goto out; SET_MODULE_OWNER(dev); @@ -831,11 +835,23 @@ dev->base_addr = io; dev->irq = irq; + /* allow overriding parameters on command line */ + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + if (de620_debug) printk(version); printk(KERN_INFO "D-Link DE-620 pocket adapter"); + if (!request_region(dev->base_addr, 3, "de620")) { + printk(" io 0x%3lX, which is busy.\n", dev->base_addr); + err = -EBUSY; + goto out1; + } + /* Initially, configure basic nibble mode, so we can read the EEPROM */ NIC_Cmd = DEF_NIC_CMD; de620_set_register(dev, W_EIP, EIPRegister); @@ -846,12 +862,8 @@ if ((checkbyte != 0xa5) || (read_eeprom(dev) != 0)) { printk(" not identified in the printer port\n"); - return -ENODEV; - } - - if (!request_region(dev->base_addr, 3, "de620")) { - printk(KERN_ERR "io 0x%3lX, which is busy.\n", dev->base_addr); - return -EBUSY; + err = -ENODEV; + goto out2; } /* else, got it! */ @@ -870,10 +882,6 @@ else printk(" UTP)\n"); - /* Initialize the device structure. */ - dev->priv = &de620_netstats; - - memset(dev->priv, 0, sizeof(struct net_device_stats)); dev->get_stats = get_stats; dev->open = de620_open; dev->stop = de620_close; @@ -884,8 +892,6 @@ /* base_addr and irq are already set, see above! */ - ether_setup(dev); - /* dump eeprom */ if (de620_debug) { printk("\nEEPROM contents:\n"); @@ -899,7 +905,17 @@ printk("SCR = 0x%02x\n", nic_data.SCR); } - return 0; + err = register_netdev(dev); + if (err) + goto out2; + return dev; + +out2: + release_region(dev->base_addr, 3); +out1: + free_netdev(dev); +out: + return ERR_PTR(err); } /********************************** @@ -994,20 +1010,21 @@ * */ #ifdef MODULE -static struct net_device de620_dev; +static struct net_device *de620_dev; int init_module(void) { - de620_dev.init = de620_probe; - if (register_netdev(&de620_dev) != 0) - return -EIO; + de620_dev = de620_probe(-1); + if (IS_ERR(de620_dev)) + return PTR_ERR(de620_dev); return 0; } void cleanup_module(void) { - unregister_netdev(&de620_dev); - release_region(de620_dev.base_addr, 3); + unregister_netdev(de620_dev); + release_region(de620_dev->base_addr, 3); + free_netdev(de620_dev); } #endif /* MODULE */ MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/declance.c b/drivers/net/declance.c --- a/drivers/net/declance.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/declance.c Tue Feb 17 20:00:07 2004 @@ -1039,13 +1039,13 @@ if (dec_lance_debug && version_printed++ == 0) printk(version); - dev = init_etherdev(NULL, sizeof(struct lance_private)); + dev = alloc_etherdev(sizeof(struct lance_private)); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); /* - * init_etherdev ensures the data structures used by the LANCE + * alloc_etherdev ensures the data structures used by the LANCE * are aligned. */ lp = (struct lance_private *) dev->priv; @@ -1188,9 +1188,6 @@ } } - lp->next = root_lance_dev; - root_lance_dev = dev; - /* Copy the ethernet address to the device structure, later to the * lance initialization block so the lance gets it every time it's * (re)initialized. @@ -1239,11 +1236,14 @@ init_timer(&lp->multicast_timer); lp->multicast_timer.data = (unsigned long) dev; lp->multicast_timer.function = &lance_set_multicast_retry; - + ret = register_netdev(dev); + if (ret) + goto err_out; + lp->next = root_lance_dev; + root_lance_dev = dev; return 0; err_out: - unregister_netdev(dev); free_netdev(dev); return ret; } @@ -1288,13 +1288,12 @@ while (root_lance_dev) { struct net_device *dev = root_lance_dev; struct lance_private *lp = (struct lance_private *)dev->priv; - + unregister_netdev(dev); #ifdef CONFIG_TC if (lp->slot >= 0) release_tc_card(lp->slot); #endif root_lance_dev = lp->next; - unregister_netdev(dev); free_netdev(dev); } } diff -Nru a/drivers/net/defxx.c b/drivers/net/defxx.c --- a/drivers/net/defxx.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/defxx.c Tue Feb 17 20:00:05 2004 @@ -491,7 +491,7 @@ err_out_region: release_region(ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN); err_out: - kfree(dev); + free_netdev(dev); return err; } diff -Nru a/drivers/net/depca.c b/drivers/net/depca.c --- a/drivers/net/depca.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/depca.c Tue Feb 17 20:00:07 2004 @@ -681,8 +681,7 @@ lp->sh_mem = ioremap(mem_start, mem_len); if (lp->sh_mem == NULL) { printk(KERN_ERR "depca: cannot remap ISA memory, aborting\n"); - release_mem_region (mem_start, mem_len); - goto out_priv; + goto out1; } lp->mem_start = mem_start; @@ -771,7 +770,7 @@ status = -ENXIO; if (!irqnum) { printk(" and failed to detect IRQ line.\n"); - goto out_priv; + goto out2; } else { for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++) if (irqnum == depca_irq[i]) { @@ -781,7 +780,7 @@ if (!dev->irq) { printk(" but incorrect IRQ line detected.\n"); - return -ENXIO; + goto out2; } } } else { @@ -807,11 +806,14 @@ device->driver_data = dev; SET_NETDEV_DEV (dev, device); - register_netdev (dev); - return 0; - - out_priv: - + status = register_netdev(dev); + if (status == 0) + return 0; +out2: + iounmap(lp->sh_mem); +out1: + release_mem_region (mem_start, mem_len); +out_priv: return status; } diff -Nru a/drivers/net/dl2k.c b/drivers/net/dl2k.c --- a/drivers/net/dl2k.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/dl2k.c Tue Feb 17 20:00:06 2004 @@ -745,7 +745,7 @@ static void rio_free_tx (struct net_device *dev, int irq) { - struct netdev_private *np = (struct netdev_private *) dev->priv; + struct netdev_private *np = dev->priv; int entry = np->old_tx % TX_RING_SIZE; int tx_use = 0; unsigned long flag = 0; @@ -855,7 +855,7 @@ static int receive_packet (struct net_device *dev) { - struct netdev_private *np = (struct netdev_private *) dev->priv; + struct netdev_private *np = dev->priv; int entry = np->cur_rx % RX_RING_SIZE; int cnt = 30; diff -Nru a/drivers/net/dummy.c b/drivers/net/dummy.c --- a/drivers/net/dummy.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/dummy.c Tue Feb 17 20:00:06 2004 @@ -103,7 +103,7 @@ return -ENOMEM; if ((err = register_netdev(dev_dummy))) { - kfree(dev_dummy); + free_netdev(dev_dummy); dev_dummy = NULL; } else { dummies[index] = dev_dummy; diff -Nru a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c --- a/drivers/net/e100/e100_main.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/e100/e100_main.c Tue Feb 17 20:00:06 2004 @@ -46,20 +46,18 @@ /* Change Log * - * 2.3.30 09/21/03 + * 2.3.36 11/13/03 + * o Moved to 2.6 APIs: pci_name() and free_netdev(). + * o Removed some __devinit from some functions that shouldn't be marked + * as such (Anton Blanchard [anton@samba.org]). + * + * 2.3.33 10/21/03 * o Bug fix (Bugzilla 97908): Loading e100 was causing crash on Itanium2 * with HP chipset * o Bug fix (Bugzilla 101583): e100 can't pass traffic with ipv6 * o Bug fix (Bugzilla 101360): PRO/10+ can't pass traffic * * 2.3.27 08/08/03 - * o Bug fix: read skb->len after freeing skb - * [Andrew Morton] akpm@zip.com.au - * o Bug fix: 82557 (with National PHY) timeout during init - * [Adam Kropelin] akropel1@rochester.rr.com - * o Feature add: allow to change Wake On LAN when EEPROM disabled - * - * 2.3.13 05/08/03 */ #include @@ -125,7 +123,7 @@ static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb); /* Global Data structures and variables */ char e100_copyright[] = "Copyright (c) 2003 Intel Corporation"; -char e100_driver_version[]="2.3.30-k1"; +char e100_driver_version[]="2.3.36-k1"; const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver"; char e100_short_driver_name[] = "e100"; static int e100nics = 0; @@ -696,7 +694,7 @@ pci_disable_device(pcid); err_dev: pci_set_drvdata(pcid, NULL); - kfree(dev); + free_netdev(dev); out: return rc; } diff -Nru a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h --- a/drivers/net/e1000/e1000.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/e1000/e1000.h Tue Feb 17 20:00:05 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -92,6 +92,16 @@ #define E1000_MAX_INTR 10 +/* How many descriptors for TX and RX ? */ +#define E1000_DEFAULT_TXD 256 +#define E1000_MAX_TXD 256 +#define E1000_MIN_TXD 80 +#define E1000_MAX_82544_TXD 4096 +#define E1000_DEFAULT_RXD 256 +#define E1000_MAX_RXD 256 +#define E1000_MIN_RXD 80 +#define E1000_MAX_82544_RXD 4096 + /* Supported Rx Buffer Sizes */ #define E1000_RXBUFFER_2048 2048 #define E1000_RXBUFFER_4096 4096 @@ -192,10 +202,14 @@ /* TX */ struct e1000_desc_ring tx_ring; + spinlock_t tx_lock; uint32_t txd_cmd; uint32_t tx_int_delay; uint32_t tx_abs_int_delay; uint32_t gotcl; + uint64_t gotcl_old; + uint64_t tpt_old; + uint64_t colc_old; uint32_t tx_fifo_head; uint32_t tx_head_addr; uint32_t tx_fifo_size; @@ -210,6 +224,7 @@ uint32_t rx_abs_int_delay; boolean_t rx_csum; uint32_t gorcl; + uint64_t gorcl_old; /* Interrupt Throttle Rate */ uint32_t itr; diff -Nru a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c --- a/drivers/net/e1000/e1000_ethtool.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/e1000/e1000_ethtool.c Tue Feb 17 20:00:06 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -39,6 +39,11 @@ extern void e1000_down(struct e1000_adapter *adapter); extern void e1000_reset(struct e1000_adapter *adapter); extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); +extern int e1000_setup_rx_resources(struct e1000_adapter *adapter); +extern int e1000_setup_tx_resources(struct e1000_adapter *adapter); +extern void e1000_free_rx_resources(struct e1000_adapter *adapter); +extern void e1000_free_tx_resources(struct e1000_adapter *adapter); +extern void e1000_update_stats(struct e1000_adapter *adapter); struct e1000_stats { char stat_string[ETH_GSTRING_LEN]; @@ -440,6 +445,71 @@ return ret_val; } +static int +e1000_ethtool_gring(struct e1000_adapter *adapter, + struct ethtool_ringparam *ring) +{ + e1000_mac_type mac_type = adapter->hw.mac_type; + struct e1000_desc_ring *txdr = &adapter->tx_ring; + struct e1000_desc_ring *rxdr = &adapter->rx_ring; + + ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD : + E1000_MAX_82544_RXD; + ring->tx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_TXD : + E1000_MAX_82544_TXD; + ring->rx_mini_max_pending = 0; + ring->rx_jumbo_max_pending = 0; + ring->rx_pending = rxdr->count; + ring->tx_pending = txdr->count; + ring->rx_mini_pending = 0; + ring->rx_jumbo_pending = 0; + + return 0; +} +static int +e1000_ethtool_sring(struct e1000_adapter *adapter, + struct ethtool_ringparam *ring) +{ + int err; + e1000_mac_type mac_type = adapter->hw.mac_type; + struct e1000_desc_ring *txdr = &adapter->tx_ring; + struct e1000_desc_ring *rxdr = &adapter->rx_ring; + + if(netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_free_rx_resources(adapter); + e1000_free_tx_resources(adapter); + } + + rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD); + rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ? + E1000_MAX_RXD : E1000_MAX_82544_RXD)); + E1000_ROUNDUP(rxdr->count, REQ_RX_DESCRIPTOR_MULTIPLE); + + txdr->count = max(ring->tx_pending,(uint32_t)E1000_MIN_TXD); + txdr->count = min(txdr->count,(uint32_t)(mac_type < e1000_82544 ? + E1000_MAX_TXD : E1000_MAX_82544_TXD)); + E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE); + + if(netif_running(adapter->netdev)) { + if((err = e1000_setup_rx_resources(adapter))) + goto err_setup_rx; + if((err = e1000_setup_tx_resources(adapter))) + goto err_setup_tx; + if((err = e1000_up(adapter))) + goto err_up; + } + + return 0; +err_up: + e1000_free_tx_resources(adapter); +err_setup_tx: + e1000_free_rx_resources(adapter); +err_setup_rx: + e1000_reset(adapter); + return err; +} + #define REG_PATTERN_TEST(R, M, W) \ { \ uint32_t pat, value; \ @@ -579,8 +649,8 @@ *data = 0; /* Hook up test interrupt handler just for this test */ - if(request_irq - (netdev->irq, &e1000_test_intr, SA_SHIRQ, netdev->name, netdev)) { + if(request_irq(adapter->pdev->irq, &e1000_test_intr, SA_SHIRQ, + netdev->name, netdev)) { *data = 1; return -1; } @@ -664,7 +734,7 @@ msec_delay(10); /* Unhook test interrupt handler */ - free_irq(netdev->irq, netdev); + free_irq(adapter->pdev->irq, netdev); return *data; } @@ -770,9 +840,9 @@ PCI_DMA_TODEVICE); tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma); tx_desc->lower.data = cpu_to_le32(skb->len); - tx_desc->lower.data |= E1000_TXD_CMD_EOP; - tx_desc->lower.data |= E1000_TXD_CMD_IFCS; - tx_desc->lower.data |= E1000_TXD_CMD_RPS; + tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP | + E1000_TXD_CMD_IFCS | + E1000_TXD_CMD_RPS); tx_desc->upper.data = 0; } @@ -1502,6 +1572,19 @@ addr += offsetof(struct ethtool_eeprom, data); return e1000_ethtool_seeprom(adapter, &eeprom, addr); } + case ETHTOOL_GRINGPARAM: { + struct ethtool_ringparam ering = {ETHTOOL_GRINGPARAM}; + e1000_ethtool_gring(adapter, &ering); + if(copy_to_user(addr, &ering, sizeof(ering))) + return -EFAULT; + return 0; + } + case ETHTOOL_SRINGPARAM: { + struct ethtool_ringparam ering; + if(copy_from_user(&ering, addr, sizeof(ering))) + return -EFAULT; + return e1000_ethtool_sring(adapter, &ering); + } case ETHTOOL_GPAUSEPARAM: { struct ethtool_pauseparam epause = {ETHTOOL_GPAUSEPARAM}; e1000_ethtool_gpause(adapter, &epause); @@ -1522,6 +1605,7 @@ } stats = { {ETHTOOL_GSTATS, E1000_STATS_LEN} }; int i; + e1000_update_stats(adapter); for(i = 0; i < E1000_STATS_LEN; i++) stats.data[i] = (e1000_gstrings_stats[i].sizeof_stat == sizeof(uint64_t)) ? diff -Nru a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c --- a/drivers/net/e1000/e1000_hw.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/e1000/e1000_hw.c Tue Feb 17 20:00:08 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -96,8 +96,14 @@ hw->phy_type = e1000_phy_m88; break; case IGP01E1000_I_PHY_ID: - hw->phy_type = e1000_phy_igp; - break; + if(hw->mac_type == e1000_82541 || + hw->mac_type == e1000_82541_rev_2 || + hw->mac_type == e1000_82547 || + hw->mac_type == e1000_82547_rev_2) { + hw->phy_type = e1000_phy_igp; + break; + } + /* Fall Through */ default: /* Should never have loaded on this device */ hw->phy_type = e1000_phy_undefined; @@ -148,7 +154,6 @@ e1000_write_phy_reg(hw, 0x0000, 0x3300); - if(hw->mac_type == e1000_82547) { uint16_t fused, fine, coarse; @@ -1485,8 +1490,8 @@ if(mii_status_reg & MII_SR_LINK_STATUS) break; msec_delay(100); } - if(i == 0) { /* We didn't get link */ - /* Reset the DSP and wait again for link. */ + if((i == 0) && (hw->phy_type == e1000_phy_m88)) { + /* We didn't get link. Reset the DSP and wait again for link. */ if((ret_val = e1000_phy_reset_dsp(hw))) { DEBUGOUT("Error Resetting PHY DSP\n"); return ret_val; @@ -1533,6 +1538,25 @@ phy_data))) return ret_val; + /* Polarity reversal workaround for forced 10F/10H links. */ + if(hw->mac_type <= e1000_82544 && + (hw->forced_speed_duplex == e1000_10_full || + hw->forced_speed_duplex == e1000_10_half)) { + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, + 0x0019))) + return ret_val; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, + 0x8F0F))) + return ret_val; + /* IEEE requirement is 150ms */ + msec_delay(200); + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, + 0x0019))) + return ret_val; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, + 0x8F00))) + return ret_val; + } } return E1000_SUCCESS; } @@ -1916,7 +1940,6 @@ uint32_t signal = 0; int32_t ret_val; uint16_t phy_data; - uint16_t lp_capability; DEBUGFUNC("e1000_check_for_link"); @@ -1996,24 +2019,17 @@ /* At this point we know that we are on copper and we have * auto-negotiated link. These are conditions for checking the link - * parter capability register. We use the link partner capability to - * determine if TBI Compatibility needs to be turned on or off. If - * the link partner advertises any speed in addition to Gigabit, then - * we assume that they are GMII-based, and TBI compatibility is not - * needed. If no other speeds are advertised, we assume the link - * partner is TBI-based, and we turn on TBI Compatibility. - */ - if(hw->tbi_compatibility_en) { - if((ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY, - &lp_capability))) - return ret_val; - if(lp_capability & (NWAY_LPAR_10T_HD_CAPS | - NWAY_LPAR_10T_FD_CAPS | - NWAY_LPAR_100TX_HD_CAPS | - NWAY_LPAR_100TX_FD_CAPS | - NWAY_LPAR_100T4_CAPS)) { - /* If our link partner advertises anything in addition to - * gigabit, we do not need to enable TBI compatibility. + * partner capability register. We use the link speed to determine if + * TBI compatibility needs to be turned on or off. If the link is not + * at gigabit speed, then TBI compatibility is not needed. If we are + * at gigabit speed, we turn on TBI compatibility. + */ + if(hw->tbi_compatibility_en) { + uint16_t speed, duplex; + e1000_get_speed_and_duplex(hw, &speed, &duplex); + if(speed != SPEED_1000) { + /* If link speed is not set to gigabit speed, we do not need + * to enable TBI compatibility. */ if(hw->tbi_compatibility_on) { /* If we previously were in the mode, turn it off. */ @@ -2081,6 +2097,29 @@ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n"); E1000_WRITE_REG(hw, TXCW, hw->txcw); E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); + + hw->serdes_link_down = FALSE; + } + /* If we force link for non-auto-negotiation switch, check link status + * based on MAC synchronization for internal serdes media type. + */ + else if((hw->media_type == e1000_media_type_internal_serdes) && + !(E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) { + /* SYNCH bit and IV bit are sticky. */ + udelay(10); + if(E1000_RXCW_SYNCH & E1000_READ_REG(hw, RXCW)) { + if(!(rxcw & E1000_RXCW_IV)) { + hw->serdes_link_down = FALSE; + DEBUGOUT("SERDES: Link is up.\n"); + } + } else { + hw->serdes_link_down = TRUE; + DEBUGOUT("SERDES: Link is down.\n"); + } + } + if((hw->media_type == e1000_media_type_internal_serdes) && + (E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) { + hw->serdes_link_down = !(E1000_STATUS_LU & E1000_READ_REG(hw, STATUS)); } return E1000_SUCCESS; } @@ -2481,8 +2520,8 @@ E1000_WRITE_REG(hw, MDIC, mdic); /* Poll the ready bit to see if the MDI read completed */ - for(i = 0; i < 64; i++) { - udelay(50); + for(i = 0; i < 640; i++) { + udelay(5); mdic = E1000_READ_REG(hw, MDIC); if(mdic & E1000_MDIC_READY) break; } @@ -3498,10 +3537,12 @@ if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) return -E1000_ERR_EEPROM; - if(eeprom->type == e1000_eeprom_microwire) + if(eeprom->type == e1000_eeprom_microwire) { status = e1000_write_eeprom_microwire(hw, offset, words, data); - else + } else { status = e1000_write_eeprom_spi(hw, offset, words, data); + msec_delay(10); + } /* Done with writing */ e1000_release_eeprom(hw); @@ -3719,12 +3760,9 @@ hw->perm_mac_addr[i+1] = (uint8_t) (eeprom_data >> 8); } if(((hw->mac_type == e1000_82546) || (hw->mac_type == e1000_82546_rev_3)) && - (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { - if(hw->perm_mac_addr[5] & 0x01) - hw->perm_mac_addr[5] &= ~(0x01); - else - hw->perm_mac_addr[5] |= 0x01; - } + (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) + hw->perm_mac_addr[5] ^= 0x01; + for(i = 0; i < NODE_ADDRESS_SIZE; i++) hw->mac_addr[i] = hw->perm_mac_addr[i]; return E1000_SUCCESS; @@ -3743,22 +3781,13 @@ e1000_init_rx_addrs(struct e1000_hw *hw) { uint32_t i; - uint32_t addr_low; - uint32_t addr_high; DEBUGFUNC("e1000_init_rx_addrs"); /* Setup the receive address. */ DEBUGOUT("Programming MAC Address into RAR[0]\n"); - addr_low = (hw->mac_addr[0] | - (hw->mac_addr[1] << 8) | - (hw->mac_addr[2] << 16) | (hw->mac_addr[3] << 24)); - - addr_high = (hw->mac_addr[4] | - (hw->mac_addr[5] << 8) | E1000_RAH_AV); - E1000_WRITE_REG_ARRAY(hw, RA, 0, addr_low); - E1000_WRITE_REG_ARRAY(hw, RA, 1, addr_high); + e1000_rar_set(hw, hw->mac_addr, 0); /* Zero out the other 15 receive addresses. */ DEBUGOUT("Clearing RAR[1-15]\n"); @@ -3775,6 +3804,7 @@ * mc_addr_list - the list of new multicast addresses * mc_addr_count - number of addresses * pad - number of bytes between addresses in the list + * rar_used_count - offset where to start adding mc addresses into the RAR's * * The given list replaces any existing list. Clears the last 15 receive * address registers and the multicast table. Uses receive address registers @@ -3785,11 +3815,11 @@ e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t *mc_addr_list, uint32_t mc_addr_count, - uint32_t pad) + uint32_t pad, + uint32_t rar_used_count) { uint32_t hash_value; uint32_t i; - uint32_t rar_used_count = 1; /* RAR[0] is used for our MAC address */ DEBUGFUNC("e1000_mc_addr_list_update"); @@ -4523,8 +4553,8 @@ e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset) { - uint32_t io_addr = hw->io_base; - uint32_t io_data = hw->io_base + 4; + unsigned long io_addr = hw->io_base; + unsigned long io_data = hw->io_base + 4; e1000_io_write(hw, io_addr, offset); return e1000_io_read(hw, io_data); @@ -4543,8 +4573,8 @@ uint32_t offset, uint32_t value) { - uint32_t io_addr = hw->io_base; - uint32_t io_data = hw->io_base + 4; + unsigned long io_addr = hw->io_base; + unsigned long io_data = hw->io_base + 4; e1000_io_write(hw, io_addr, offset); e1000_io_write(hw, io_data, value); diff -Nru a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h --- a/drivers/net/e1000/e1000_hw.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/e1000/e1000_hw.h Tue Feb 17 20:00:08 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -291,7 +291,7 @@ /* Filters (multicast, vlan, receive) */ void e1000_init_rx_addrs(struct e1000_hw *hw); -void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad); +void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad, uint32_t rar_used_count); uint32_t e1000_hash_mc_addr(struct e1000_hw *hw, uint8_t * mc_addr); void e1000_mta_set(struct e1000_hw *hw, uint32_t hash_value); void e1000_rar_set(struct e1000_hw *hw, uint8_t * mc_addr, uint32_t rar_index); @@ -317,9 +317,9 @@ void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); /* Port I/O is only supported on 82544 and newer */ -uint32_t e1000_io_read(struct e1000_hw *hw, uint32_t port); +uint32_t e1000_io_read(struct e1000_hw *hw, unsigned long port); uint32_t e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset); -void e1000_io_write(struct e1000_hw *hw, uint32_t port, uint32_t value); +void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value); void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value); int32_t e1000_config_dsp_after_link_change(struct e1000_hw *hw, boolean_t link_up); int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active); @@ -978,7 +978,7 @@ e1000_ms_type master_slave; e1000_ms_type original_master_slave; e1000_ffe_config ffe_config_state; - uint32_t io_base; + unsigned long io_base; uint32_t phy_id; uint32_t phy_revision; uint32_t phy_addr; @@ -1021,6 +1021,7 @@ boolean_t speed_downgraded; e1000_dsp_config dsp_config_state; boolean_t get_link_status; + boolean_t serdes_link_down; boolean_t tbi_compatibility_en; boolean_t tbi_compatibility_on; boolean_t phy_reset_disable; @@ -1310,6 +1311,7 @@ #define E1000_RCTL_DPF 0x00400000 /* discard pause frames */ #define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */ #define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */ +#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ /* Receive Descriptor */ #define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */ diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c --- a/drivers/net/e1000/e1000_main.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/e1000/e1000_main.c Tue Feb 17 20:00:06 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -30,10 +30,25 @@ /* Change Log * - * 5.2.20 9/30/03 + * 5.2.30.1 1/29/03 + * o Set VLAN filtering to IEEE 802.1Q after reset so we don't break + * SoL connections that use VLANs. + * o Allow 1000/Full setting for AutoNeg param for Fiber connections + * Jon D Mason [jonmason@us.ibm.com]. + * o Race between Tx queue and Tx clean fixed with a spin lock. + * o Added netpoll support. + * o Fixed endianess bug causing ethtool loopback diags to fail on ppc. + * o Use pdev->irq rather than netdev->irq in preparation for MSI support. + * o Report driver message on user override of InterruptThrottleRate + * module parameter. + * o Change I/O address storage from uint32_t to unsigned long. + * o Added ethtool RINGPARAM support. + * + * 5.2.22 10/15/03 * o Bug fix: SERDES devices might be connected to a back-plane * switch that doesn't support auto-neg, so add the capability - * to force 1000/Full. + * to force 1000/Full. Also, since forcing 1000/Full, sample + * RxSynchronize bit to detect link state. * o Bug fix: Flow control settings for hi/lo watermark didn't * consider changes in the Rx FIFO size, which could occur with * Jumbo Frames or with the reduced FIFO in 82547. @@ -42,30 +57,19 @@ * o Bug fix: hang under heavy Tx stress when running out of Tx * descriptors; wasn't clearing context descriptor when backing * out of send because of no-resource condition. + * o Bug fix: check netif_running in dev->poll so we don't have to + * hang in dev->close until all polls are finished. [Robert + * Ollson (robert.olsson@data.slu.se)]. + * o Revert TxDescriptor ring size back to 256 since change to 1024 + * wasn't accepted into the kernel. * * 5.2.16 8/8/03 - * o Added support for new controllers: 82545GM, 82546GB, 82541/7_B1 - * o Bug fix: reset h/w before first EEPROM read because we don't know - * who may have been messing with the device before we got there. - * [Dave Johnson (ddj -a-t- cascv.brown.edu)] - * o Bug fix: read the correct work from EEPROM to detect programmed - * WoL settings. - * o Bug fix: TSO would hang if space left in FIFO was being miscalculated - * when mss dropped without a correspoding drop in the DMA buffer size. - * o ASF for Fiber nics isn't supported. - * o Bug fix: Workaround added for potential hang with 82544 running in - * PCI-X if send buffer terminates within an evenly-aligned dword. - * o Feature: Add support for ethtool flow control setting. - * o Feature: Add support for ethtool TSO setting. - * o Feature: Increase default Tx Descriptor count to 1024 for >= 82544. - * - * 5.1.13 5/28/03 */ char e1000_driver_name[] = "e1000"; char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; -char e1000_driver_version[] = "5.2.20-k1"; -char e1000_copyright[] = "Copyright (c) 1999-2003 Intel Corporation."; +char e1000_driver_version[] = "5.2.30.1-k1"; +char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation."; /* e1000_pci_tbl - PCI Device ID Table * @@ -89,7 +93,6 @@ {0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1013, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0x8086, 0x1014, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1015, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1016, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1017, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, @@ -113,12 +116,17 @@ MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); -/* Local Function Prototypes */ - int e1000_up(struct e1000_adapter *adapter); void e1000_down(struct e1000_adapter *adapter); void e1000_reset(struct e1000_adapter *adapter); int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx); +int e1000_setup_tx_resources(struct e1000_adapter *adapter); +int e1000_setup_rx_resources(struct e1000_adapter *adapter); +void e1000_free_tx_resources(struct e1000_adapter *adapter); +void e1000_free_rx_resources(struct e1000_adapter *adapter); +void e1000_update_stats(struct e1000_adapter *adapter); + +/* Local Function Prototypes */ static int e1000_init_module(void); static void e1000_exit_module(void); @@ -127,15 +135,11 @@ static int e1000_sw_init(struct e1000_adapter *adapter); static int e1000_open(struct net_device *netdev); static int e1000_close(struct net_device *netdev); -static int e1000_setup_tx_resources(struct e1000_adapter *adapter); -static int e1000_setup_rx_resources(struct e1000_adapter *adapter); static void e1000_configure_tx(struct e1000_adapter *adapter); static void e1000_configure_rx(struct e1000_adapter *adapter); static void e1000_setup_rctl(struct e1000_adapter *adapter); static void e1000_clean_tx_ring(struct e1000_adapter *adapter); static void e1000_clean_rx_ring(struct e1000_adapter *adapter); -static void e1000_free_tx_resources(struct e1000_adapter *adapter); -static void e1000_free_rx_resources(struct e1000_adapter *adapter); static void e1000_set_multi(struct net_device *netdev); static void e1000_update_phy_info(unsigned long data); static void e1000_watchdog(unsigned long data); @@ -144,7 +148,6 @@ static struct net_device_stats * e1000_get_stats(struct net_device *netdev); static int e1000_change_mtu(struct net_device *netdev, int new_mtu); static int e1000_set_mac(struct net_device *netdev, void *p); -static void e1000_update_stats(struct e1000_adapter *adapter); static inline void e1000_irq_disable(struct e1000_adapter *adapter); static inline void e1000_irq_enable(struct e1000_adapter *adapter); static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs); @@ -182,6 +185,11 @@ static int e1000_resume(struct pci_dev *pdev); #endif +#ifdef CONFIG_NET_POLL_CONTROLLER +/* for netdump / net console */ +static void e1000_netpoll (struct net_device *dev); +#endif + struct notifier_block e1000_notifier_reboot = { .notifier_call = e1000_notify_reboot, .next = NULL, @@ -268,7 +276,7 @@ e1000_configure_rx(adapter); e1000_alloc_rx_buffers(adapter); - if((err = request_irq(netdev->irq, &e1000_intr, + if((err = request_irq(adapter->pdev->irq, &e1000_intr, SA_SHIRQ | SA_SAMPLE_RANDOM, netdev->name, netdev))) return err; @@ -285,7 +293,7 @@ struct net_device *netdev = adapter->netdev; e1000_irq_disable(adapter); - free_irq(netdev->irq, netdev); + free_irq(adapter->pdev->irq, netdev); del_timer_sync(&adapter->tx_fifo_stall_timer); del_timer_sync(&adapter->watchdog_timer); del_timer_sync(&adapter->phy_info_timer); @@ -336,6 +344,10 @@ if(adapter->hw.mac_type >= e1000_82544) E1000_WRITE_REG(&adapter->hw, WUC, 0); e1000_init_hw(&adapter->hw); + + /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ + E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE); + e1000_reset_adaptive(&adapter->hw); e1000_phy_get_info(&adapter->hw, &adapter->phy_info); } @@ -434,8 +446,10 @@ netdev->vlan_rx_register = e1000_vlan_rx_register; netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; +#ifdef CONFIG_NET_POLL_CONTROLLER + netdev->poll_controller = e1000_netpoll; +#endif - netdev->irq = pdev->irq; netdev->mem_start = mmio_start; netdev->mem_end = mmio_start + mmio_len; netdev->base_addr = adapter->hw.io_base; @@ -669,6 +683,7 @@ atomic_set(&adapter->irq_sem, 1); spin_lock_init(&adapter->stats_lock); + spin_lock_init(&adapter->tx_lock); return 0; } @@ -749,7 +764,7 @@ * Return 0 on success, negative on failure **/ -static int +int e1000_setup_tx_resources(struct e1000_adapter *adapter) { struct e1000_desc_ring *txdr = &adapter->tx_ring; @@ -866,7 +881,7 @@ * Returns 0 on success, negative on failure **/ -static int +int e1000_setup_rx_resources(struct e1000_adapter *adapter) { struct e1000_desc_ring *rxdr = &adapter->rx_ring; @@ -1005,7 +1020,7 @@ * Free all transmit software resources **/ -static void +void e1000_free_tx_resources(struct e1000_adapter *adapter) { struct pci_dev *pdev = adapter->pdev; @@ -1073,7 +1088,7 @@ * Free all receive software resources **/ -static void +void e1000_free_rx_resources(struct e1000_adapter *adapter) { struct e1000_desc_ring *rx_ring = &adapter->rx_ring; @@ -1281,41 +1296,6 @@ e1000_leave_82542_rst(adapter); } -static void -e1000_tx_flush(struct e1000_adapter *adapter) -{ - uint32_t ctrl, tctl, txcw, icr; - - e1000_irq_disable(adapter); - - if(adapter->hw.mac_type < e1000_82543) { - /* Transmit Unit Reset */ - tctl = E1000_READ_REG(&adapter->hw, TCTL); - E1000_WRITE_REG(&adapter->hw, TCTL, tctl | E1000_TCTL_RST); - E1000_WRITE_REG(&adapter->hw, TCTL, tctl); - e1000_clean_tx_ring(adapter); - e1000_configure_tx(adapter); - } else { - txcw = E1000_READ_REG(&adapter->hw, TXCW); - E1000_WRITE_REG(&adapter->hw, TXCW, txcw & ~E1000_TXCW_ANE); - - ctrl = E1000_READ_REG(&adapter->hw, CTRL); - E1000_WRITE_REG(&adapter->hw, CTRL, ctrl | E1000_CTRL_SLU | - E1000_CTRL_ILOS); - - mdelay(10); - - e1000_clean_tx_irq(adapter); - E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); - E1000_WRITE_REG(&adapter->hw, TXCW, txcw); - - /* clear the link status change interrupts this caused */ - icr = E1000_READ_REG(&adapter->hw, ICR); - } - - e1000_irq_enable(adapter); -} - /* need to wait a few seconds after link up to get diagnostic information from the phy */ static void @@ -1379,10 +1359,17 @@ struct net_device *netdev = adapter->netdev; struct e1000_desc_ring *txdr = &adapter->tx_ring; unsigned int i; + uint32_t link; e1000_check_for_link(&adapter->hw); - if(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) { + if((adapter->hw.media_type == e1000_media_type_internal_serdes) && + !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE)) + link = !adapter->hw.serdes_link_down; + else + link = E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU; + + if(link) { if(!netif_carrier_ok(netdev)) { e1000_get_speed_and_duplex(&adapter->hw, &adapter->link_speed, @@ -1415,14 +1402,26 @@ } e1000_update_stats(adapter); + + adapter->hw.tx_packet_delta = adapter->stats.tpt - adapter->tpt_old; + adapter->tpt_old = adapter->stats.tpt; + adapter->hw.collision_delta = adapter->stats.colc - adapter->colc_old; + adapter->colc_old = adapter->stats.colc; + + adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old; + adapter->gorcl_old = adapter->stats.gorcl; + adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old; + adapter->gotcl_old = adapter->stats.gotcl; + e1000_update_adaptive(&adapter->hw); if(!netif_carrier_ok(netdev)) { if(E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { - unsigned long flags; - spin_lock_irqsave(&netdev->xmit_lock, flags); - e1000_tx_flush(adapter); - spin_unlock_irqrestore(&netdev->xmit_lock, flags); + /* We've lost link, so the controller stops DMA, + * but we've got queued Tx work that's never going + * to get done, so reset controller to flush Tx. + * (Do the reset outside of interrupt context). */ + schedule_work(&adapter->tx_timeout_task); } } @@ -1783,6 +1782,7 @@ struct e1000_adapter *adapter = netdev->priv; unsigned int first; unsigned int tx_flags = 0; + unsigned long flags; int count; if(skb->len <= 0) { @@ -1790,10 +1790,13 @@ return 0; } + spin_lock_irqsave(&adapter->tx_lock, flags); + if(adapter->hw.mac_type == e1000_82547) { if(e1000_82547_fifo_workaround(adapter, skb)) { netif_stop_queue(netdev); mod_timer(&adapter->tx_fifo_stall_timer, jiffies); + spin_unlock_irqrestore(&adapter->tx_lock, flags); return 1; } } @@ -1814,11 +1817,14 @@ e1000_tx_queue(adapter, count, tx_flags); else { netif_stop_queue(netdev); + spin_unlock_irqrestore(&adapter->tx_lock, flags); return 1; } netdev->trans_start = jiffies; + spin_unlock_irqrestore(&adapter->tx_lock, flags); + return 0; } @@ -1860,6 +1866,7 @@ { struct e1000_adapter *adapter = netdev->priv; + e1000_update_stats(adapter); return &adapter->net_stats; } @@ -1918,7 +1925,7 @@ * @adapter: board private structure **/ -static void +void e1000_update_stats(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; @@ -1936,8 +1943,7 @@ adapter->stats.crcerrs += E1000_READ_REG(hw, CRCERRS); adapter->stats.gprc += E1000_READ_REG(hw, GPRC); - adapter->gorcl = E1000_READ_REG(hw, GORCL); - adapter->stats.gorcl += adapter->gorcl; + adapter->stats.gorcl += E1000_READ_REG(hw, GORCL); adapter->stats.gorch += E1000_READ_REG(hw, GORCH); adapter->stats.bprc += E1000_READ_REG(hw, BPRC); adapter->stats.mprc += E1000_READ_REG(hw, MPRC); @@ -1949,8 +1955,6 @@ adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023); adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522); - spin_unlock_irqrestore(&adapter->stats_lock, flags); - /* the rest of the counters are only modified here */ adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS); @@ -1968,8 +1972,7 @@ adapter->stats.xofftxc += E1000_READ_REG(hw, XOFFTXC); adapter->stats.fcruc += E1000_READ_REG(hw, FCRUC); adapter->stats.gptc += E1000_READ_REG(hw, GPTC); - adapter->gotcl = E1000_READ_REG(hw, GOTCL); - adapter->stats.gotcl += adapter->gotcl; + adapter->stats.gotcl += E1000_READ_REG(hw, GOTCL); adapter->stats.gotch += E1000_READ_REG(hw, GOTCH); adapter->stats.rnbc += E1000_READ_REG(hw, RNBC); adapter->stats.ruc += E1000_READ_REG(hw, RUC); @@ -2051,6 +2054,8 @@ !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp)) adapter->phy_stats.receive_errors += phy_tmp; } + + spin_unlock_irqrestore(&adapter->stats_lock, flags); } /** @@ -2064,7 +2069,7 @@ atomic_inc(&adapter->irq_sem); E1000_WRITE_REG(&adapter->hw, IMC, ~0); E1000_WRITE_FLUSH(&adapter->hw); - synchronize_irq(adapter->netdev->irq); + synchronize_irq(adapter->pdev->irq); } /** @@ -2093,6 +2098,7 @@ { struct net_device *netdev = data; struct e1000_adapter *adapter = netdev->priv; + struct e1000_hw *hw = &adapter->hw; uint32_t icr = E1000_READ_REG(&adapter->hw, ICR); #ifndef CONFIG_E1000_NAPI unsigned int i; @@ -2102,7 +2108,7 @@ return IRQ_NONE; /* Not our interrupt */ if(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { - adapter->hw.get_link_status = 1; + hw->get_link_status = 1; mod_timer(&adapter->watchdog_timer, jiffies); } @@ -2114,14 +2120,30 @@ */ atomic_inc(&adapter->irq_sem); - E1000_WRITE_REG(&adapter->hw, IMC, ~0); + E1000_WRITE_REG(hw, IMC, ~0); __netif_rx_schedule(netdev); } #else + /* Writing IMC and IMS is needed for 82547. + Due to Hub Link bus being occupied, an interrupt + de-assertion message is not able to be sent. + When an interrupt assertion message is generated later, + two messages are re-ordered and sent out. + That causes APIC to think 82547 is in de-assertion + state, while 82547 is in assertion state, resulting + in dead lock. Writing IMC forces 82547 into + de-assertion state. + */ + if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) + e1000_irq_disable(adapter); + for(i = 0; i < E1000_MAX_INTR; i++) if(!e1000_clean_rx_irq(adapter) & !e1000_clean_tx_irq(adapter)) break; + + if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) + e1000_irq_enable(adapter); #endif return IRQ_HANDLED; @@ -2146,7 +2168,7 @@ *budget -= work_done; netdev->quota -= work_done; - if(work_done < work_to_do) { + if(work_done < work_to_do || !netif_running(netdev)) { netif_rx_complete(netdev); e1000_irq_enable(adapter); } @@ -2171,6 +2193,8 @@ unsigned int i, eop; boolean_t cleaned = FALSE; + spin_lock(&adapter->tx_lock); + i = tx_ring->next_to_clean; eop = tx_ring->buffer_info[i].next_to_watch; eop_desc = E1000_TX_DESC(*tx_ring, eop); @@ -2215,6 +2239,8 @@ if(cleaned && netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) netif_wake_queue(netdev); + spin_unlock(&adapter->tx_lock); + return cleaned; } @@ -2642,13 +2668,13 @@ } uint32_t -e1000_io_read(struct e1000_hw *hw, uint32_t port) +e1000_io_read(struct e1000_hw *hw, unsigned long port) { return inl(port); } void -e1000_io_write(struct e1000_hw *hw, uint32_t port, uint32_t value) +e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value) { outl(value, port); } @@ -2665,8 +2691,6 @@ if(grp) { /* enable VLAN tag insert/strip */ - E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE); - ctrl = E1000_READ_REG(&adapter->hw, CTRL); ctrl |= E1000_CTRL_VME; E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); @@ -2897,6 +2921,22 @@ } return 0; +} +#endif + +#ifdef CONFIG_NET_POLL_CONTROLLER +/* + * Polling 'interrupt' - used by things like netconsole to send skbs + * without having to re-enable interrupts. It's not called while + * the interrupt routine is executing. + */ + +static void e1000_netpoll (struct net_device *dev) +{ + struct e1000_adapter *adapter = dev->priv; + disable_irq(adapter->pdev->irq); + e1000_intr (adapter->pdev->irq, dev, NULL); + enable_irq(adapter->pdev->irq); } #endif diff -Nru a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h --- a/drivers/net/e1000/e1000_osdep.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/e1000/e1000_osdep.h Tue Feb 17 20:00:06 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free diff -Nru a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c --- a/drivers/net/e1000/e1000_param.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/e1000/e1000_param.c Tue Feb 17 20:00:07 2004 @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -63,7 +63,7 @@ /* Transmit Descriptor Count * * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers - * Valid Range: 80-4096 for 82544 + * Valid Range: 80-4096 for 82544 and newer * * Default Value: 256 */ @@ -73,7 +73,7 @@ /* Receive Descriptor Count * * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers - * Valid Range: 80-4096 for 82544 + * Valid Range: 80-4096 for 82544 and newer * * Default Value: 256 */ @@ -196,16 +196,6 @@ #define AUTONEG_ADV_MASK 0x2F #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL -#define DEFAULT_TXD 256 -#define MAX_TXD 256 -#define MIN_TXD 80 -#define MAX_82544_TXD 4096 - -#define DEFAULT_RXD 256 -#define MAX_RXD 256 -#define MIN_RXD 80 -#define MAX_82544_RXD 4096 - #define DEFAULT_RDTR 0 #define MAX_RXDELAY 0xFFFF #define MIN_RXDELAY 0 @@ -299,7 +289,7 @@ * e1000_check_options - Range Checking for Command Line Parameters * @adapter: board private structure * - * This routine checks all command line paramters for valid user + * This routine checks all command line parameters for valid user * input. If an invalid value is given, or if no user specified * value exists, a default value is used. The final value is stored * in a variable in the adapter structure. @@ -320,14 +310,15 @@ struct e1000_option opt = { .type = range_option, .name = "Transmit Descriptors", - .err = "using default of " __MODULE_STRING(DEFAULT_TXD), - .def = DEFAULT_TXD, - .arg = { .r = { .min = MIN_TXD }} + .err = "using default of " + __MODULE_STRING(E1000_DEFAULT_TXD), + .def = E1000_DEFAULT_TXD, + .arg = { .r = { .min = E1000_MIN_TXD }} }; struct e1000_desc_ring *tx_ring = &adapter->tx_ring; e1000_mac_type mac_type = adapter->hw.mac_type; opt.arg.r.max = mac_type < e1000_82544 ? - MAX_TXD : MAX_82544_TXD; + E1000_MAX_TXD : E1000_MAX_82544_TXD; tx_ring->count = TxDescriptors[bd]; e1000_validate_option(&tx_ring->count, &opt); @@ -337,13 +328,15 @@ struct e1000_option opt = { .type = range_option, .name = "Receive Descriptors", - .err = "using default of " __MODULE_STRING(DEFAULT_RXD), - .def = DEFAULT_RXD, - .arg = { .r = { .min = MIN_RXD }} + .err = "using default of " + __MODULE_STRING(E1000_DEFAULT_RXD), + .def = E1000_DEFAULT_RXD, + .arg = { .r = { .min = E1000_MIN_RXD }} }; struct e1000_desc_ring *rx_ring = &adapter->rx_ring; e1000_mac_type mac_type = adapter->hw.mac_type; - opt.arg.r.max = mac_type < e1000_82544 ? MAX_RXD : MAX_82544_RXD; + opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : + E1000_MAX_82544_RXD; rx_ring->count = RxDescriptors[bd]; e1000_validate_option(&rx_ring->count, &opt); @@ -446,13 +439,19 @@ }; adapter->itr = InterruptThrottleRate[bd]; - if(adapter->itr == 0) { - printk(KERN_INFO "%s turned off\n", opt.name); - } else if(adapter->itr == 1 || adapter->itr == -1) { - /* Dynamic mode */ + switch(adapter->itr) { + case -1: adapter->itr = 1; - } else { + break; + case 0: + printk(KERN_INFO "%s turned off\n", opt.name); + break; + case 1: + printk(KERN_INFO "%s set to dynamic mode\n", opt.name); + break; + default: e1000_validate_option(&adapter->itr, &opt); + break; } } @@ -490,9 +489,9 @@ printk(KERN_INFO "Duplex not valid for fiber adapters, " "parameter ignored\n"); } - if((AutoNeg[bd] != OPTION_UNSET)) { - printk(KERN_INFO "AutoNeg not valid for fiber adapters, " - "parameter ignored\n"); + if((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { + printk(KERN_INFO "AutoNeg other than Full/1000 is " + "not valid for fiber adapters, parameter ignored\n"); } } diff -Nru a/drivers/net/e2100.c b/drivers/net/e2100.c --- a/drivers/net/e2100.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/e2100.c Tue Feb 17 20:00:08 2004 @@ -95,7 +95,6 @@ #define E21_BIG_RX_STOP_PG 0xF0 /* Last page +1 of RX ring */ #define E21_TX_START_PG E21_RX_STOP_PG /* First page of TX buffer */ -int e2100_probe(struct net_device *dev); static int e21_probe1(struct net_device *dev, int ioaddr); static int e21_open(struct net_device *dev); @@ -117,10 +116,11 @@ station address). */ -int __init e2100_probe(struct net_device *dev) +static int __init do_e2100_probe(struct net_device *dev) { int *port; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -129,13 +129,46 @@ else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (port = e21_probe_list; *port; port++) + for (port = e21_probe_list; *port; port++) { + dev->irq = irq; if (e21_probe1(dev, *port) == 0) return 0; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + /* NB: e21_close() handles free_irq */ + release_region(dev->base_addr, E21_IO_EXTENT); +} + +struct net_device * __init e2100_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_e2100_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init e21_probe1(struct net_device *dev, int ioaddr) { int i, status, retval; @@ -175,13 +208,6 @@ for (i = 0; i < 6; i++) printk(" %02X", station_addr[i]); - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to get memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - if (dev->irq < 2) { int irqlist[] = {15,11,10,12,5,9,3,4}, i; for (i = 0; i < 8; i++) @@ -191,8 +217,6 @@ } if (i >= 8) { printk(" unable to get IRQ %d.\n", dev->irq); - kfree(dev->priv); - dev->priv = NULL; retval = -EAGAIN; goto out; } @@ -376,7 +400,7 @@ #ifdef MODULE #define MAX_E21_CARDS 4 /* Max number of E21 cards per module */ -static struct net_device dev_e21[MAX_E21_CARDS]; +static struct net_device *dev_e21[MAX_E21_CARDS]; static int io[MAX_E21_CARDS]; static int irq[MAX_E21_CARDS]; static int mem[MAX_E21_CARDS]; @@ -398,29 +422,35 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) { - struct net_device *dev = &dev_e21[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->mem_start = mem[this_dev]; - dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */ - dev->init = e2100_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "e2100.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + dev->mem_start = mem[this_dev]; + dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */ + if (do_e2100_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_e21[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -429,13 +459,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) { - struct net_device *dev = &dev_e21[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - /* NB: e21_close() handles free_irq */ - release_region(dev->base_addr, E21_IO_EXTENT); + struct net_device *dev = dev_e21[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/eepro.c b/drivers/net/eepro.c --- a/drivers/net/eepro.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/eepro.c Tue Feb 17 20:00:07 2004 @@ -302,9 +302,7 @@ /* Index to functions, as function prototypes. */ -extern int eepro_probe(struct net_device *dev); - -static int eepro_probe1(struct net_device *dev, short ioaddr); +static int eepro_probe1(struct net_device *dev, int autoprobe); static int eepro_open(struct net_device *dev); static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev); static irqreturn_t eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs); @@ -527,10 +525,11 @@ If dev->base_addr == 2, allocate space for the device and return success (detachable devices only). */ -int __init eepro_probe(struct net_device *dev) +static int __init do_eepro_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -563,24 +562,48 @@ #endif if (base_addr > 0x1ff) /* Check a single specified location. */ - return eepro_probe1(dev, base_addr); + return eepro_probe1(dev, 0); else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; eepro_portlist[i]; i++) { - int ioaddr = eepro_portlist[i]; - - if (check_region(ioaddr, EEPRO_IO_EXTENT)) - continue; - if (eepro_probe1(dev, ioaddr) == 0) + dev->base_addr = eepro_portlist[i]; + dev->irq = irq; + if (eepro_probe1(dev, 1) == 0) return 0; } return -ENODEV; } +struct net_device * __init eepro_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct eepro_local)); + int err; + + if (!dev) + return ERR_PTR(-ENODEV); + + SET_MODULE_OWNER(dev); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_eepro_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + release_region(dev->base_addr, EEPRO_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static void __init printEEPROMInfo(short ioaddr, struct net_device *dev) { unsigned short Word; @@ -713,83 +736,75 @@ probes on the ISA bus. A good device probe avoids doing writes, and verifies that the correct device exists and functions. */ -static int __init eepro_probe1(struct net_device *dev, short ioaddr) +static int __init eepro_probe1(struct net_device *dev, int autoprobe) { unsigned short station_addr[6], id, counter; - int i, j, irqMask, retval = 0; + int i; struct eepro_local *lp; enum iftype { AUI=0, BNC=1, TPE=2 }; + int ioaddr = dev->base_addr; + + /* Grab the region so we can find another board if autoIRQ fails. */ + if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) { + if (!autoprobe) + printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n", + ioaddr); + return -EBUSY; + } /* Now, we are going to check for the signature of the ID_REG (register 2 of bank 0) */ - id=inb(ioaddr + ID_REG); + id = inb(ioaddr + ID_REG); - if (((id) & ID_REG_MASK) != ID_REG_SIG) { - retval = -ENODEV; + if ((id & ID_REG_MASK) != ID_REG_SIG) goto exit; - } - /* We seem to have the 82595 signature, let's - play with its counter (last 2 bits of - register 2 of bank 0) to be sure. */ + /* We seem to have the 82595 signature, let's + play with its counter (last 2 bits of + register 2 of bank 0) to be sure. */ - counter = (id & R_ROBIN_BITS); - - if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS)!=(counter + 0x40)) { - retval = -ENODEV; - goto exit; - } + counter = id & R_ROBIN_BITS; - /* Initialize the device structure */ - dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL); - if (!dev->priv) { - retval = -ENOMEM; + if ((inb(ioaddr + ID_REG) & R_ROBIN_BITS) != (counter + 0x40)) goto exit; - } - - memset(dev->priv, 0, sizeof(struct eepro_local)); - - lp = (struct eepro_local *)dev->priv; - /* default values */ - lp->eepro = 0; + lp = (struct eepro_local *)dev->priv; + memset(lp, 0, sizeof(struct eepro_local)); lp->xmt_bar = XMT_BAR_PRO; lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO; lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO; lp->eeprom_reg = EEPROM_REG_PRO; + spin_lock_init(&lp->lock); - /* Now, get the ethernet hardware address from - the EEPROM */ - station_addr[0] = read_eeprom(ioaddr, 2, dev); - - /* FIXME - find another way to know that we've found - * an Etherexpress 10 - */ - if (station_addr[0] == 0x0000 || - station_addr[0] == 0xffff) { - lp->eepro = LAN595FX_10ISA; + /* Now, get the ethernet hardware address from + the EEPROM */ + station_addr[0] = read_eeprom(ioaddr, 2, dev); + + /* FIXME - find another way to know that we've found + * an Etherexpress 10 + */ + if (station_addr[0] == 0x0000 || station_addr[0] == 0xffff) { + lp->eepro = LAN595FX_10ISA; lp->eeprom_reg = EEPROM_REG_10; lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10; lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10; lp->xmt_bar = XMT_BAR_10; - station_addr[0] = read_eeprom(ioaddr, 2, dev); - } - station_addr[1] = read_eeprom(ioaddr, 3, dev); - station_addr[2] = read_eeprom(ioaddr, 4, dev); + station_addr[0] = read_eeprom(ioaddr, 2, dev); + } + station_addr[1] = read_eeprom(ioaddr, 3, dev); + station_addr[2] = read_eeprom(ioaddr, 4, dev); if (!lp->eepro) { if (read_eeprom(ioaddr,7,dev)== ee_FX_INT2IRQ) lp->eepro = 2; else if (station_addr[2] == SA_ADDR1) lp->eepro = 1; - } - - /* Fill in the 'dev' fields. */ - dev->base_addr = ioaddr; + } + /* Fill in the 'dev' fields. */ for (i=0; i < 6; i++) - dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i]; + dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i]; /* RX buffer must be more than 3K and less than 29K */ if (dev->mem_end < 3072 || dev->mem_end > 29696) @@ -798,65 +813,49 @@ /* calculate {xmt,rcv}_{lower,upper}_limit */ eepro_recalc(dev); - - if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE)) - dev->if_port = BNC; + if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE)) + dev->if_port = BNC; else dev->if_port = TPE; - if ((dev->irq < 2) && (lp->eepro!=0)) { - i = read_eeprom(ioaddr, 1, dev); - irqMask = read_eeprom(ioaddr, 7, dev); - i &= 0x07; /* Mask off INT number */ - - for (j=0; ((j<16) && (i>=0)); j++) { - if ((irqMask & (1<irq = j; - break; /* found bit corresponding to irq */ - } - i--; /* count bits set in irqMask */ - } - } - if (dev->irq < 2) { - printk(KERN_ERR " Duh! invalid interrupt vector stored in EEPROM.\n"); - retval = -ENODEV; - goto freeall; - } else - if (dev->irq==2) dev->irq = 9; - } - - /* Grab the region so we can find another board if autoIRQ fails. */ - if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) { - printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n", ioaddr); - goto freeall; - } - ((struct eepro_local *)dev->priv)->lock = SPIN_LOCK_UNLOCKED; - - dev->open = eepro_open; - dev->stop = eepro_close; - dev->hard_start_xmit = eepro_send_packet; - dev->get_stats = eepro_get_stats; - dev->set_multicast_list = &set_multicast_list; - dev->tx_timeout = eepro_tx_timeout; - dev->watchdog_timeo = TX_TIMEOUT; - - /* Fill in the fields of the device structure with - ethernet generic values */ - ether_setup(dev); - + if (dev->irq < 2 && lp->eepro != 0) { + /* Mask off INT number */ + int count = read_eeprom(ioaddr, 1, dev) & 7; + unsigned irqMask = read_eeprom(ioaddr, 7, dev); + + while (count--) + irqMask &= irqMask - 1; + + count = ffs(irqMask); + + if (count) + dev->irq = count - 1; + + if (dev->irq < 2) { + printk(KERN_ERR " Duh! illegal interrupt vector stored in EEPROM.\n"); + goto exit; + } else if (dev->irq == 2) { + dev->irq = 9; + } + } + + dev->open = eepro_open; + dev->stop = eepro_close; + dev->hard_start_xmit = eepro_send_packet; + dev->get_stats = eepro_get_stats; + dev->set_multicast_list = &set_multicast_list; + dev->tx_timeout = eepro_tx_timeout; + dev->watchdog_timeo = TX_TIMEOUT; + /* print boot time info */ eepro_print_info(dev); /* reset 82595 */ - eepro_reset(ioaddr); - + eepro_reset(ioaddr); + return 0; exit: - return retval; -freeall: - kfree(dev->priv); - goto exit; - + release_region(dev->base_addr, EEPRO_IO_EXTENT); + return -ENODEV; } /* Open/initialize the board. This is called (in the current kernel) @@ -1701,7 +1700,7 @@ #ifdef MODULE #define MAX_EEPRO 8 -static struct net_device dev_eepro[MAX_EEPRO]; +static struct net_device *dev_eepro[MAX_EEPRO]; static int io[MAX_EEPRO]; static int irq[MAX_EEPRO]; @@ -1729,6 +1728,7 @@ int init_module(void) { + struct net_device *dev; int i; if (io[0] == 0 && autodetect == 0) { printk(KERN_WARNING "eepro_init_module: Probe is very dangerous in ISA boards!\n"); @@ -1743,17 +1743,24 @@ } for (i = 0; i < MAX_EEPRO; i++) { - struct net_device *d = &dev_eepro[n_eepro]; - d->mem_end = mem[i]; - d->base_addr = io[i]; - d->irq = irq[i]; - d->init = eepro_probe; - - if (register_netdev(d) == 0) - n_eepro++; - else - break; + dev = alloc_etherdev(sizeof(struct eepro_local)); + if (!dev) + break; + + dev->mem_end = mem[i]; + dev->base_addr = io[i]; + dev->irq = irq[i]; + + if (do_eepro_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_eepro[n_eepro++] = dev; + continue; + } + release_region(dev->base_addr, EEPRO_IO_EXTENT); } + free_netdev(dev); + break; + } if (n_eepro) printk(KERN_INFO "%s", version); @@ -1767,15 +1774,10 @@ int i; for (i=0; ipriv); - d->priv=NULL; - - /* If we don't do this, we can't re-insmod it later. */ - release_region(d->base_addr, EEPRO_IO_EXTENT); - + struct net_device *dev = dev_eepro[i]; + unregister_netdev(dev); + release_region(dev->base_addr, EEPRO_IO_EXTENT); + free_netdev(dev); } } #endif /* MODULE */ diff -Nru a/drivers/net/eexpress.c b/drivers/net/eexpress.c --- a/drivers/net/eexpress.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/eexpress.c Tue Feb 17 20:00:05 2004 @@ -244,7 +244,6 @@ * Prototypes for Linux interface */ -extern int express_probe(struct net_device *dev); static int eexp_open(struct net_device *dev); static int eexp_close(struct net_device *dev); static void eexp_timeout(struct net_device *dev); @@ -334,11 +333,13 @@ * checks for presence of EtherExpress card */ -int __init express_probe(struct net_device *dev) +static int __init do_express_probe(struct net_device *dev) { unsigned short *port; static unsigned short ports[] = { 0x240,0x300,0x310,0x270,0x320,0x340,0 }; unsigned short ioaddr = dev->base_addr; + int dev_irq = dev->irq; + int err; SET_MODULE_OWNER(dev); @@ -391,27 +392,58 @@ } } #endif - if (ioaddr&0xfe00) - return eexp_hw_probe(dev,ioaddr); - else if (ioaddr) + if (ioaddr&0xfe00) { + if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress")) + return -EBUSY; + err = eexp_hw_probe(dev,ioaddr); + release_region(ioaddr, EEXP_IO_EXTENT); + return err; + } else if (ioaddr) return -ENXIO; for (port=&ports[0] ; *port ; port++ ) { unsigned short sum = 0; int i; + if (!request_region(*port, EEXP_IO_EXTENT, "EtherExpress")) + continue; for ( i=0 ; i<4 ; i++ ) { unsigned short t; t = inb(*port + ID_PORT); sum |= (t>>4) << ((t & 0x03)<<2); } - if (sum==0xbaba && !eexp_hw_probe(dev,*port)) + if (sum==0xbaba && !eexp_hw_probe(dev,*port)) { + release_region(*port, EEXP_IO_EXTENT); return 0; + } + release_region(*port, EEXP_IO_EXTENT); + dev->irq = dev_irq; } return -ENODEV; } +struct net_device * __init express_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_express_probe(dev); + if (!err) { + err = register_netdev(dev); + if (!err) + return dev; + } + free_netdev(dev); + return ERR_PTR(err); +} + /* * open and initialize the adapter, ready for use */ @@ -1058,7 +1090,7 @@ unsigned int memory_size; int i; unsigned short xsum = 0; - struct net_local *lp; + struct net_local *lp = dev->priv; printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr); @@ -1108,17 +1140,18 @@ buswidth = !((setupval & 0x400) >> 10); } - dev->priv = lp = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (!dev->priv) - return -ENOMEM; - - memset(dev->priv, 0, sizeof(struct net_local)); + memset(lp, 0, sizeof(struct net_local)); spin_lock_init(&lp->lock); printk("(IRQ %d, %s connector, %d-bit bus", dev->irq, eexp_ifmap[dev->if_port], buswidth?8:16); + if (!request_region(dev->base_addr + 0x300e, 1, "EtherExpress")) + return -EBUSY; + eexp_hw_set_interface(dev); + + release_region(dev->base_addr + 0x300e, 1); /* Find out how much RAM we have on the card */ outw(0, dev->base_addr + WRITE_PTR); @@ -1156,7 +1189,6 @@ break; default: printk(") bad memory size (%dk).\n", memory_size); - kfree(dev->priv); return -ENODEV; break; } @@ -1171,7 +1203,6 @@ dev->set_multicast_list = &eexp_set_multicast; dev->tx_timeout = eexp_timeout; dev->watchdog_timeo = 2*HZ; - ether_setup(dev); return 0; } @@ -1654,7 +1685,7 @@ #define EEXP_MAX_CARDS 4 /* max number of cards to support */ -static struct net_device dev_eexp[EEXP_MAX_CARDS]; +static struct net_device *dev_eexp[EEXP_MAX_CARDS]; static int irq[EEXP_MAX_CARDS]; static int io[EEXP_MAX_CARDS]; @@ -1671,25 +1702,30 @@ */ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_eexp[this_dev]; + dev = alloc_etherdev(sizeof(struct net_local)); dev->irq = irq[this_dev]; dev->base_addr = io[this_dev]; - dev->init = express_probe; if (io[this_dev] == 0) { - if (this_dev) break; + if (this_dev) + break; printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]); - if (found != 0) return 0; - return -ENXIO; + if (do_express_probe(dev) == 0 && register_netdev(dev) == 0) { + dev_eexp[this_dev] = dev; + found++; + continue; } - found++; + printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]); + free_netdev(dev); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void cleanup_module(void) @@ -1697,11 +1733,10 @@ int this_dev; for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_eexp[this_dev]; - if (dev->priv != NULL) { + struct net_device *dev = dev_eexp[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(dev->priv); - dev->priv = NULL; + free_netdev(dev); } } } diff -Nru a/drivers/net/eql.c b/drivers/net/eql.c --- a/drivers/net/eql.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/eql.c Tue Feb 17 20:00:08 2004 @@ -600,7 +600,7 @@ err = register_netdev(dev_eql); if (err) - kfree(dev_eql); + free_netdev(dev_eql); return err; } diff -Nru a/drivers/net/es3210.c b/drivers/net/es3210.c --- a/drivers/net/es3210.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/es3210.c Tue Feb 17 20:00:07 2004 @@ -62,7 +62,6 @@ #include "8390.h" -int es_probe(struct net_device *dev); static int es_probe1(struct net_device *dev, int ioaddr); static int es_open(struct net_device *dev); @@ -125,9 +124,11 @@ * PROM for a match against the Racal-Interlan assigned value. */ -int __init es_probe(struct net_device *dev) +static int __init do_es_probe(struct net_device *dev) { unsigned short ioaddr = dev->base_addr; + int irq = dev->irq; + int mem_start = dev->mem_start; SET_MODULE_OWNER(dev); @@ -144,13 +145,47 @@ } /* EISA spec allows for up to 16 slots, but 8 is typical. */ - for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) + for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) { if (es_probe1(dev, ioaddr) == 0) return 0; + dev->irq = irq; + dev->mem_start = mem_start; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + free_irq(dev->irq, dev); + release_region(dev->base_addr, ES_IO_EXTENT); +} + +struct net_device * __init es_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_es_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init es_probe1(struct net_device *dev, int ioaddr) { int i, retval; @@ -240,13 +275,6 @@ printk("mem %#lx-%#lx\n", dev->mem_start, dev->mem_end-1); - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to allocate memory for dev->priv.\n"); - retval = -ENOMEM; - goto out1; - } - #if ES_DEBUG & ES_D_PROBE if (inb(ioaddr + ES_CFG5)) printk("es3210: Warning - DMA channel enabled, but not used here.\n"); @@ -376,7 +404,7 @@ #ifdef MODULE #define MAX_ES_CARDS 4 /* Max number of ES3210 cards per module */ #define NAMELEN 8 /* # of chars for storing dev->name */ -static struct net_device dev_es3210[MAX_ES_CARDS]; +static struct net_device *dev_es3210[MAX_ES_CARDS]; static int io[MAX_ES_CARDS]; static int irq[MAX_ES_CARDS]; static int mem[MAX_ES_CARDS]; @@ -393,26 +421,32 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) { - struct net_device *dev = &dev_es3210[this_dev]; + if (io[this_dev] == 0 && this_dev != 0) + break; + dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->base_addr = io[this_dev]; - dev->mem_start = mem[this_dev]; /* Currently ignored by driver */ - dev->init = es_probe; - /* Default is to only install one card. */ - if (io[this_dev] == 0 && this_dev != 0) break; - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev->mem_start = mem[this_dev]; + if (do_es_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_es3210[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -421,13 +455,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) { - struct net_device *dev = &dev_es3210[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - free_irq(dev->irq, dev); - release_region(dev->base_addr, ES_IO_EXTENT); + struct net_device *dev = dev_es3210[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/eth16i.c b/drivers/net/eth16i.c --- a/drivers/net/eth16i.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/eth16i.c Tue Feb 17 20:00:08 2004 @@ -369,7 +369,6 @@ #define NUM_OF_EISA_IRQS 8 static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 }; -static unsigned int boot = 1; /* Use 0 for production, 1 for verification, >2 for debug */ #ifndef ETH16I_DEBUG @@ -395,8 +394,6 @@ /* Function prototypes */ -extern int eth16i_probe(struct net_device *dev); - static int eth16i_probe1(struct net_device *dev, int ioaddr); static int eth16i_check_signature(int ioaddr); static int eth16i_probe_port(int ioaddr); @@ -418,7 +415,7 @@ static void eth16i_skip_packet(struct net_device *dev); static void eth16i_multicast(struct net_device *dev); static void eth16i_select_regbank(unsigned char regbank, int ioaddr); -static void eth16i_initialize(struct net_device *dev); +static void eth16i_initialize(struct net_device *dev, int boot); #if 0 static int eth16i_set_irq(struct net_device *dev); @@ -432,7 +429,7 @@ static char cardname[] __initdata = "ICL EtherTeam 16i/32"; -int __init eth16i_probe(struct net_device *dev) +static int __init do_eth16i_probe(struct net_device *dev) { int i; int ioaddr; @@ -461,14 +458,38 @@ return -ENODEV; } +struct net_device * __init eth16i_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct eth16i_local)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_eth16i_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + free_irq(dev->irq, dev); + release_region(dev->base_addr, ETH16I_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init eth16i_probe1(struct net_device *dev, int ioaddr) { - struct eth16i_local *lp; + struct eth16i_local *lp = dev->priv; static unsigned version_printed; int retval; - boot = 1; /* To inform initilization that we are in boot probe */ - /* Let's grab the region */ if (!request_region(ioaddr, ETH16I_IO_EXTENT, dev->name)) return -EBUSY; @@ -531,22 +552,13 @@ eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr); outb(0x38, ioaddr + TRANSCEIVER_MODE_REG); - eth16i_initialize(dev); /* Initialize rest of the chip's registers */ + eth16i_initialize(dev, 1); /* Initialize rest of the chip's registers */ /* Now let's same some energy by shutting down the chip ;) */ BITCLR(ioaddr + CONFIG_REG_1, POWERUP); /* Initialize the device structure */ - if(dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL); - if(dev->priv == NULL) { - free_irq(dev->irq, dev); - retval = -ENOMEM; - goto out; - } - } - - memset(dev->priv, 0, sizeof(struct eth16i_local)); + memset(lp, 0, sizeof(struct eth16i_local)); dev->open = eth16i_open; dev->stop = eth16i_close; dev->hard_start_xmit = eth16i_tx; @@ -554,15 +566,7 @@ dev->set_multicast_list = eth16i_multicast; dev->tx_timeout = eth16i_timeout; dev->watchdog_timeo = TX_TIMEOUT; - - lp = (struct eth16i_local *)dev->priv; spin_lock_init(&lp->lock); - - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - - boot = 0; - return 0; out: release_region(ioaddr, ETH16I_IO_EXTENT); @@ -570,7 +574,7 @@ } -static void eth16i_initialize(struct net_device *dev) +static void eth16i_initialize(struct net_device *dev, int boot) { int ioaddr = dev->base_addr; int i, node_w = 0; @@ -953,7 +957,7 @@ outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1); /* Initialize the chip */ - eth16i_initialize(dev); + eth16i_initialize(dev, 0); /* Set the transmit buffer size */ lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03]; @@ -1401,7 +1405,7 @@ #define MAX_ETH16I_CARDS 4 /* Max number of Eth16i cards per module */ -static struct net_device dev_eth16i[MAX_ETH16I_CARDS]; +static struct net_device *dev_eth16i[MAX_ETH16I_CARDS]; static int io[MAX_ETH16I_CARDS]; #if 0 static int irq[MAX_ETH16I_CARDS]; @@ -1431,14 +1435,14 @@ int init_module(void) { int this_dev, found = 0; + struct net_device *dev; + + for (this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) { + dev = alloc_etherdev(sizeof(struct eth16i_local)); + if (!dev) + break; - for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) - { - struct net_device *dev = &dev_eth16i[this_dev]; - - dev->irq = 0; /* irq[this_dev]; */ dev->base_addr = io[this_dev]; - dev->init = eth16i_probe; if(debug != -1) eth16i_debug = debug; @@ -1448,44 +1452,43 @@ dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]); - if(io[this_dev] == 0) - { - if(this_dev != 0) break; /* Only autoprobe 1st one */ + if(io[this_dev] == 0) { + if(this_dev != 0) /* Only autoprobe 1st one */ + break; printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n"); } - if(register_netdev(dev) != 0) - { - printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n", - io[this_dev]); - - if(found != 0) return 0; - return -ENXIO; + if (do_eth16i_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_eth16i[found++] = dev; + continue; + } + free_irq(dev->irq, dev); + release_region(dev->base_addr, ETH16I_IO_EXTENT); } - - found++; + printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n", + io[this_dev]); + free_netdev(dev); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void cleanup_module(void) { int this_dev; - for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) - { - struct net_device* dev = &dev_eth16i[this_dev]; + for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) { + struct net_device *dev = dev_eth16i[this_dev]; - if(dev->priv != NULL) - { + if(dev->priv) { unregister_netdev(dev); - kfree(dev->priv); - dev->priv = NULL; - free_irq(dev->irq, dev); release_region(dev->base_addr, ETH16I_IO_EXTENT); - + free_netdev(dev); } } } diff -Nru a/drivers/net/ethertap.c b/drivers/net/ethertap.c --- a/drivers/net/ethertap.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ethertap.c Tue Feb 17 20:00:06 2004 @@ -72,8 +72,7 @@ struct net_device *dev; int err = -ENOMEM; - dev = alloc_netdev(sizeof(struct net_local), "tap%d", - ether_setup); + dev = alloc_etherdev(sizeof(struct net_local)); if (!dev) goto out; diff -Nru a/drivers/net/ewrk3.c b/drivers/net/ewrk3.c --- a/drivers/net/ewrk3.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ewrk3.c Tue Feb 17 20:00:08 2004 @@ -324,25 +324,14 @@ static int Write_EEPROM(short data, u_long iobase, u_char eaddr); static u_char get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType); -static void isa_probe(struct net_device *dev, u_long iobase); -static void eisa_probe(struct net_device *dev, u_long iobase); -static struct net_device *alloc_device(struct net_device *dev, u_long iobase); -static int ewrk3_dev_index(char *s); -static struct net_device *insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *)); +static int ewrk3_probe1(struct net_device *dev, u_long iobase, int irq); +static int isa_probe(struct net_device *dev, u_long iobase); +static int eisa_probe(struct net_device *dev, u_long iobase); - -#ifdef MODULE -static int autoprobed = 1, loading_module = 1; - -#else -static u_char irq[] = -{5, 0, 10, 3, 11, 9, 15, 12}; -static int autoprobed, loading_module; - -#endif /* MODULE */ +static u_char irq[MAX_NUM_EWRK3S+1] = {5, 0, 10, 3, 11, 9, 15, 12}; static char name[EWRK3_STRLEN + 1]; -static int num_ewrk3s, num_eth; +static int num_ewrks3s; /* ** Miscellaneous defines... @@ -352,38 +341,50 @@ mdelay(1);\ } -int __init ewrk3_probe(struct net_device *dev) +struct net_device * __init ewrk3_probe(int unit) { - int tmp = num_ewrk3s, status = -ENODEV; - u_long iobase = dev->base_addr; + struct net_device *dev = alloc_etherdev(sizeof(struct ewrk3_private)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); - if ((iobase == 0) && loading_module) { - printk("Autoprobing is not supported when loading a module based driver.\n"); - status = -EIO; - } else { /* First probe for the Ethernet */ - /* Address PROM pattern */ - isa_probe(dev, iobase); - eisa_probe(dev, iobase); - - if ((tmp == num_ewrk3s) && (iobase != 0) && loading_module) { - printk("%s: ewrk3_probe() cannot find device at 0x%04lx.\n", dev->name, - iobase); - } - /* - ** Walk the device list to check that at least one device - ** initialised OK - */ - for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next); + err = ewrk3_probe1(dev, dev->base_addr, dev->irq); + if (err) + goto out; + return dev; +out: + free_netdev(dev); + return ERR_PTR(err); + +} - if (dev->priv) - status = 0; - if (iobase == 0) - autoprobed = 1; - } +static int __init ewrk3_probe1(struct net_device *dev, u_long iobase, int irq) +{ + int err; - return status; + dev->base_addr = iobase; + dev->irq = irq; + + /* Address PROM pattern */ + err = isa_probe(dev, iobase); + if (err != 0) + err = eisa_probe(dev, iobase); + + if (err) + return err; + + err = register_netdev(dev); + if (err) + release_region(dev->base_addr, EWRK3_TOTAL_SIZE); + + return err; } static int __init @@ -396,8 +397,8 @@ u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0; /* - ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot. - ** This also disables the EISA_ENABLE bit in the EISA Control Register. + ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot. + ** This also disables the EISA_ENABLE bit in the EISA Control Register. */ if (iobase > 0x400) eisa_cr = inb(EISA_CR); @@ -409,232 +410,210 @@ icr &= 0x70; outb(icr, EWRK3_ICR); /* Disable all the IRQs */ - if (nicsr == (CSR_TXD | CSR_RXD)) { + if (nicsr == (CSR_TXD | CSR_RXD)) + return -ENXIO; - /* Check that the EEPROM is alive and well and not living on Pluto... */ - for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) { - union { - short val; - char c[2]; - } tmp; - - tmp.val = (short) Read_EEPROM(iobase, (i >> 1)); - eeprom_image[i] = tmp.c[0]; - eeprom_image[i + 1] = tmp.c[1]; - chksum += eeprom_image[i] + eeprom_image[i + 1]; - } - - if (chksum != 0) { /* Bad EEPROM Data! */ - printk("%s: Device has a bad on-board EEPROM.\n", dev->name); - status = -ENXIO; - } else { - EthwrkSignature(name, eeprom_image); - if (*name != '\0') { /* found a EWRK3 device */ - dev->base_addr = iobase; - - if (iobase > 0x400) { - outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */ - } - lemac = eeprom_image[EEPROM_CHIPVER]; - cmr = inb(EWRK3_CMR); - - if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) || - ((lemac == LeMAC2) && !(cmr & CMR_HS))) { - printk("%s: %s at %#4lx", dev->name, name, iobase); - hard_strapped = 1; - } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) { - /* EISA slot address */ - printk("%s: %s at %#4lx (EISA slot %ld)", - dev->name, name, iobase, ((iobase >> 12) & 0x0f)); - } else { /* ISA port address */ - printk("%s: %s at %#4lx", dev->name, name, iobase); - } - - if (!status) { - printk(", h/w address "); - if (lemac != LeMAC2) - DevicePresent(iobase); /* need after EWRK3_INIT */ - status = get_hw_addr(dev, eeprom_image, lemac); - for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */ - printk("%2.2x:", dev->dev_addr[i]); - } - printk("%2.2x,\n", dev->dev_addr[i]); - if (status) { - printk(" which has an EEPROM CRC error.\n"); - status = -ENXIO; - } else { - if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */ - cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS); - if (eeprom_image[EEPROM_MISC0] & READ_AHEAD) - cmr |= CMR_RA; - if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND) - cmr |= CMR_WB; - if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL) - cmr |= CMR_POLARITY; - if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK) - cmr |= CMR_LINK; - if (eeprom_image[EEPROM_MISC0] & _0WS_ENA) - cmr |= CMR_0WS; - } - if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM) - cmr |= CMR_DRAM; - outb(cmr, EWRK3_CMR); - - cr = inb(EWRK3_CR); /* Set up the Control Register */ - cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD; - if (cr & SETUP_APD) - cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS; - cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS; - cr |= eeprom_image[EEPROM_MISC0] & ENA_16; - outb(cr, EWRK3_CR); + /* Check that the EEPROM is alive and well and not living on Pluto... */ + for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) { + union { + short val; + char c[2]; + } tmp; + + tmp.val = (short) Read_EEPROM(iobase, (i >> 1)); + eeprom_image[i] = tmp.c[0]; + eeprom_image[i + 1] = tmp.c[1]; + chksum += eeprom_image[i] + eeprom_image[i + 1]; + } + + if (chksum != 0) { /* Bad EEPROM Data! */ + printk("%s: Device has a bad on-board EEPROM.\n", dev->name); + return -ENXIO; + } + + EthwrkSignature(name, eeprom_image); + if (*name == '\0') + return -ENXIO; + + dev->base_addr = iobase; + + if (iobase > 0x400) { + outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */ + } + lemac = eeprom_image[EEPROM_CHIPVER]; + cmr = inb(EWRK3_CMR); + + if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) || + ((lemac == LeMAC2) && !(cmr & CMR_HS))) { + printk("%s: %s at %#4lx", dev->name, name, iobase); + hard_strapped = 1; + } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) { + /* EISA slot address */ + printk("%s: %s at %#4lx (EISA slot %ld)", + dev->name, name, iobase, ((iobase >> 12) & 0x0f)); + } else { /* ISA port address */ + printk("%s: %s at %#4lx", dev->name, name, iobase); + } + + printk(", h/w address "); + if (lemac != LeMAC2) + DevicePresent(iobase); /* need after EWRK3_INIT */ + status = get_hw_addr(dev, eeprom_image, lemac); + for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */ + printk("%2.2x:", dev->dev_addr[i]); + } + printk("%2.2x,\n", dev->dev_addr[i]); + + if (status) { + printk(" which has an EEPROM CRC error.\n"); + return -ENXIO; + } + + if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */ + cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS); + if (eeprom_image[EEPROM_MISC0] & READ_AHEAD) + cmr |= CMR_RA; + if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND) + cmr |= CMR_WB; + if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL) + cmr |= CMR_POLARITY; + if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK) + cmr |= CMR_LINK; + if (eeprom_image[EEPROM_MISC0] & _0WS_ENA) + cmr |= CMR_0WS; + } + if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM) + cmr |= CMR_DRAM; + outb(cmr, EWRK3_CMR); + + cr = inb(EWRK3_CR); /* Set up the Control Register */ + cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD; + if (cr & SETUP_APD) + cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS; + cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS; + cr |= eeprom_image[EEPROM_MISC0] & ENA_16; + outb(cr, EWRK3_CR); - /* - ** Determine the base address and window length for the EWRK3 - ** RAM from the memory base register. - */ - mem_start = inb(EWRK3_MBR); - shmem_length = 0; - if (mem_start != 0) { - if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) { - mem_start *= SHMEM_64K; - shmem_length = SHMEM_64K; - } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) { - mem_start *= SHMEM_32K; - shmem_length = SHMEM_32K; - } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) { - mem_start = mem_start * SHMEM_2K + 0x80000; - shmem_length = SHMEM_2K; - } else { - status = -ENXIO; - } - } - /* - ** See the top of this source code for comments about - ** uncommenting this line. - */ + /* + ** Determine the base address and window length for the EWRK3 + ** RAM from the memory base register. + */ + mem_start = inb(EWRK3_MBR); + shmem_length = 0; + if (mem_start != 0) { + if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) { + mem_start *= SHMEM_64K; + shmem_length = SHMEM_64K; + } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) { + mem_start *= SHMEM_32K; + shmem_length = SHMEM_32K; + } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) { + mem_start = mem_start * SHMEM_2K + 0x80000; + shmem_length = SHMEM_2K; + } else { + return -ENXIO; + } + } + /* + ** See the top of this source code for comments about + ** uncommenting this line. + */ /* FORCE_2K_MODE; */ + + if (hard_strapped) { + printk(" is hard strapped.\n"); + } else if (mem_start) { + printk(" has a %dk RAM window", (int) (shmem_length >> 10)); + printk(" at 0x%.5lx", mem_start); + } else { + printk(" is in I/O only mode"); + } - if (!status) { - if (hard_strapped) { - printk(" is hard strapped.\n"); - } else if (mem_start) { - printk(" has a %dk RAM window", (int) (shmem_length >> 10)); - printk(" at 0x%.5lx", mem_start); - } else { - printk(" is in I/O only mode"); - } - - /* private area & initialise */ - dev->priv = (void *) kmalloc(sizeof(struct ewrk3_private), - GFP_KERNEL); - if (dev->priv == NULL) { - return -ENOMEM; - } - lp = (struct ewrk3_private *) dev->priv; - memset(dev->priv, 0, sizeof(struct ewrk3_private)); - lp->shmem_base = mem_start; - lp->shmem_length = shmem_length; - lp->lemac = lemac; - lp->hard_strapped = hard_strapped; - lp->led_mask = CR_LED; - spin_lock_init(&lp->hw_lock); - - lp->mPage = 64; - if (cmr & CMR_DRAM) - lp->mPage <<= 1; /* 2 DRAMS on module */ - - sprintf(lp->adapter_name, "%s (%s)", name, dev->name); - request_region(iobase, EWRK3_TOTAL_SIZE, lp->adapter_name); - - lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM; - - if (!hard_strapped) { - /* - ** Enable EWRK3 board interrupts for autoprobing - */ - icr |= ICR_IE; /* Enable interrupts */ - outb(icr, EWRK3_ICR); - - /* The DMA channel may be passed in on this parameter. */ - dev->dma = 0; - - /* To auto-IRQ we enable the initialization-done and DMA err, - interrupts. For now we will always get a DMA error. */ - if (dev->irq < 2) { + lp = (struct ewrk3_private *) dev->priv; + lp->shmem_base = mem_start; + lp->shmem_length = shmem_length; + lp->lemac = lemac; + lp->hard_strapped = hard_strapped; + lp->led_mask = CR_LED; + spin_lock_init(&lp->hw_lock); + + lp->mPage = 64; + if (cmr & CMR_DRAM) + lp->mPage <<= 1; /* 2 DRAMS on module */ + + sprintf(lp->adapter_name, "%s (%s)", name, dev->name); + + lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM; + + if (!hard_strapped) { + /* + ** Enable EWRK3 board interrupts for autoprobing + */ + icr |= ICR_IE; /* Enable interrupts */ + outb(icr, EWRK3_ICR); + + /* The DMA channel may be passed in on this parameter. */ + dev->dma = 0; + + /* To auto-IRQ we enable the initialization-done and DMA err, + interrupts. For now we will always get a DMA error. */ + if (dev->irq < 2) { #ifndef MODULE - u_char irqnum; - unsigned long irq_mask; + u_char irqnum; + unsigned long irq_mask; - irq_mask = probe_irq_on(); - - /* - ** Trigger a TNE interrupt. - */ - icr |= ICR_TNEM; - outb(1, EWRK3_TDQ); /* Write to the TX done queue */ - outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */ - - irqnum = irq[((icr & IRQ_SEL) >> 4)]; - - mdelay(20); - dev->irq = probe_irq_off(irq_mask); - if ((dev->irq) && (irqnum == dev->irq)) { - printk(" and uses IRQ%d.\n", dev->irq); - } else { - if (!dev->irq) { - printk(" and failed to detect IRQ line.\n"); - } else if ((irqnum == 1) && (lemac == LeMAC2)) { - printk(" and an illegal IRQ line detected.\n"); - } else { - printk(", but incorrect IRQ line detected.\n"); - } - status = -ENXIO; - } - - DISABLE_IRQs; /* Mask all interrupts */ - -#endif /* MODULE */ - } else { - printk(" and requires IRQ%d.\n", dev->irq); - } - } - if (status) - release_region(iobase, EWRK3_TOTAL_SIZE); - } else { - status = -ENXIO; - } - } - } + irq_mask = probe_irq_on(); + + /* + ** Trigger a TNE interrupt. + */ + icr |= ICR_TNEM; + outb(1, EWRK3_TDQ); /* Write to the TX done queue */ + outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */ + + irqnum = irq[((icr & IRQ_SEL) >> 4)]; + + mdelay(20); + dev->irq = probe_irq_off(irq_mask); + if ((dev->irq) && (irqnum == dev->irq)) { + printk(" and uses IRQ%d.\n", dev->irq); } else { - status = -ENXIO; - } - } - - if (!status) { - if (ewrk3_debug > 1) { - printk(version); + if (!dev->irq) { + printk(" and failed to detect IRQ line.\n"); + } else if ((irqnum == 1) && (lemac == LeMAC2)) { + printk(" and an illegal IRQ line detected.\n"); + } else { + printk(", but incorrect IRQ line detected.\n"); + } + return -ENXIO; } - /* The EWRK3-specific entries in the device structure. */ - dev->open = ewrk3_open; - dev->hard_start_xmit = ewrk3_queue_pkt; - dev->stop = ewrk3_close; - dev->get_stats = ewrk3_get_stats; - dev->set_multicast_list = set_multicast_list; - dev->do_ioctl = ewrk3_ioctl; - dev->tx_timeout = ewrk3_timeout; - dev->watchdog_timeo = QUEUE_PKT_TIMEOUT; - dev->mem_start = 0; + DISABLE_IRQs; /* Mask all interrupts */ - /* Fill in the generic field of the device structure. */ - ether_setup(dev); +#endif /* MODULE */ + } else { + printk(" and requires IRQ%d.\n", dev->irq); } - } else { - status = -ENXIO; } - return status; + + if (ewrk3_debug > 1) { + printk(version); + } + /* The EWRK3-specific entries in the device structure. */ + dev->open = ewrk3_open; + dev->hard_start_xmit = ewrk3_queue_pkt; + dev->stop = ewrk3_close; + dev->get_stats = ewrk3_get_stats; + dev->set_multicast_list = set_multicast_list; + dev->do_ioctl = ewrk3_ioctl; + dev->tx_timeout = ewrk3_timeout; + dev->watchdog_timeo = QUEUE_PKT_TIMEOUT; + + dev->mem_start = 0; + + return 0; } @@ -1269,15 +1248,15 @@ /* ** ISA bus I/O device probe */ -static void __init isa_probe(struct net_device *dev, u_long ioaddr) +static int __init isa_probe(struct net_device *dev, u_long ioaddr) { - int i = num_ewrk3s, maxSlots; + int i = num_ewrks3s, maxSlots; + int ret = -ENODEV; + u_long iobase; - if (!ioaddr && autoprobed) - return; /* Been here before ! */ if (ioaddr >= 0x400) - return; /* Not ISA */ + goto out; if (ioaddr == 0) { /* Autoprobing */ iobase = EWRK3_IO_BASE; /* Get the first slot address */ @@ -1287,38 +1266,37 @@ maxSlots = i + 1; } - for (; (i < maxSlots) && (dev != NULL); iobase += EWRK3_IOP_INC, i++) { - if (!check_region(iobase, EWRK3_TOTAL_SIZE)) { + for (; (i < maxSlots) && (dev != NULL); + iobase += EWRK3_IOP_INC, i++) + { + if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name)) { if (DevicePresent(iobase) == 0) { - if ((dev = alloc_device(dev, iobase)) != NULL) { - if (ewrk3_hw_init(dev, iobase) == 0) { - num_ewrk3s++; - } - num_eth++; - } + int irq = dev->irq; + ret = ewrk3_hw_init(dev, iobase); + if (!ret) + break; + dev->irq = irq; } - } else if (autoprobed) { - printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase); + release_region(iobase, EWRK3_TOTAL_SIZE); } } + out: - return; + return ret; } /* ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually ** the motherboard. */ -static void __init eisa_probe(struct net_device *dev, u_long ioaddr) +static int __init eisa_probe(struct net_device *dev, u_long ioaddr) { int i, maxSlots; u_long iobase; - char name[EWRK3_STRLEN]; + int ret = -ENODEV; - if (!ioaddr && autoprobed) - return; /* Been here before ! */ if (ioaddr < 0x1000) - return; /* Not EISA */ + goto out; if (ioaddr == 0) { /* Autoprobing */ iobase = EISA_SLOT_INC; /* Get the first slot address */ @@ -1332,114 +1310,22 @@ for (i = 1; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) { if (EISA_signature(name, EISA_ID) == 0) { - if (!check_region(iobase, EWRK3_TOTAL_SIZE)) { - if (DevicePresent(iobase) == 0) { - if ((dev = alloc_device(dev, iobase)) != NULL) { - if (ewrk3_hw_init(dev, iobase) == 0) { - num_ewrk3s++; - } - num_eth++; - } - } - } else if (autoprobed) { - printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase); + if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name) && + DevicePresent(iobase) == 0) { + int irq = dev->irq; + ret = ewrk3_hw_init(dev, iobase); + if (!ret) + break; + dev->irq = irq; } + release_region(iobase, EWRK3_TOTAL_SIZE); } } - return; + out: + return ret; } -/* - ** Search the entire 'eth' device list for a fixed probe. If a match isn't - ** found then check for an autoprobe or unused device location. If they - ** are not available then insert a new device structure at the end of - ** the current list. - */ -static struct net_device * __init alloc_device(struct net_device *dev, u_long iobase) -{ - struct net_device *adev = NULL; - int fixed = 0, new_dev = 0; - - num_eth = ewrk3_dev_index(dev->name); - if (loading_module) - return dev; - - while (1) { - if (((dev->base_addr == EWRK3_NDA) || (dev->base_addr == 0)) && !adev) { - adev = dev; - } else if ((dev->priv == NULL) && (dev->base_addr == iobase)) { - fixed = 1; - } else { - if (dev->next == NULL) { - new_dev = 1; - } else if (strncmp(dev->next->name, "eth", 3) != 0) { - new_dev = 1; - } - } - if ((dev->next == NULL) || new_dev || fixed) - break; - dev = dev->next; - num_eth++; - } - if (adev && !fixed) { - dev = adev; - num_eth = ewrk3_dev_index(dev->name); - new_dev = 0; - } - if (((dev->next == NULL) && - ((dev->base_addr != EWRK3_NDA) && (dev->base_addr != 0)) && !fixed) || - new_dev) { - num_eth++; /* New device */ - dev = insert_device(dev, iobase, ewrk3_probe); - } - return dev; -} - -/* - ** If at end of eth device list and can't use current entry, malloc - ** one up. If memory could not be allocated, print an error message. - */ -static struct net_device * __init -insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *)) -{ - struct net_device *new; - - new = (struct net_device *) kmalloc(sizeof(struct net_device) + 8, GFP_KERNEL); - if (new == NULL) { - printk("eth%d: Device not initialised, insufficient memory\n", num_eth); - return NULL; - } else { - new->next = dev->next; - dev->next = new; - dev = dev->next; /* point to the new device */ - if (num_eth > 9999) { - sprintf(dev->name, "eth????"); /* New device name */ - } else { - sprintf(dev->name, "eth%d", num_eth); /* New device name */ - } - dev->base_addr = iobase; /* assign the io address */ - dev->init = init; /* initialisation routine */ - } - - return dev; -} - -static int __init -ewrk3_dev_index(char *s) -{ - int i = 0, j = 0; - - for (; *s; s++) { - if (isdigit(*s)) { - j = 1; - i = (i * 10) + (*s - '0'); - } else if (j) - break; - } - - return i; -} /* ** Read the EWRK3 EEPROM using this routine @@ -2074,8 +1960,7 @@ #ifdef MODULE static struct net_device *ewrk3_devs[MAX_NUM_EWRK3S]; static int ndevs; -static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, }; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ -static int irq[MAX_NUM_EWRK3S+1] = { 5, 0, }; /* or use the insmod io= irq= options */ +static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, }; /* '21' below should really be 'MAX_NUM_EWRK3S' */ MODULE_PARM(io, "0-21i"); @@ -2083,50 +1968,39 @@ MODULE_PARM_DESC(io, "EtherWORKS 3 I/O base address(es)"); MODULE_PARM_DESC(irq, "EtherWORKS 3 IRQ number(s)"); -static void ewrk3_exit_module(void) +static __exit void ewrk3_exit_module(void) { int i; for( i=0; ipriv) { - kfree(ewrk3_devs[i]->priv); - ewrk3_devs[i]->priv = NULL; - } - ewrk3_devs[i]->irq = 0; - release_region(ewrk3_devs[i]->base_addr, EWRK3_TOTAL_SIZE); free_netdev(ewrk3_devs[i]); ewrk3_devs[i] = NULL; } } -static int ewrk3_init_module(void) +static __init int ewrk3_init_module(void) { int i=0; while( io[i] && irq[i] ) { - ewrk3_devs[ndevs] = kmalloc(sizeof(struct net_device), GFP_KERNEL); - if (!ewrk3_devs[ndevs]) - goto error; - memset(ewrk3_devs[ndevs], 0, sizeof(struct net_device)); - ewrk3_devs[ndevs]->base_addr = io[i]; - ewrk3_devs[ndevs]->irq = irq[i]; - ewrk3_devs[ndevs]->init = ewrk3_probe; - - if (register_netdev(ewrk3_devs[ndevs]) == 0) - ndevs++; - else - kfree(ewrk3_devs[ndevs]); + struct net_device *dev + = alloc_etherdev(sizeof(struct ewrk3_private)); + + if (!dev) + break; + if (ewrk3_probe1(dev, io[i], irq[i]) != 0) { + free_netdev(dev); + break; + } + + ewrk3_devs[ndevs++] = dev; i++; } return ndevs ? 0 : -EIO; - -error: - ewrk3_exit_module(); - return -ENOMEM; } diff -Nru a/drivers/net/fc/iph5526.c b/drivers/net/fc/iph5526.c --- a/drivers/net/fc/iph5526.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/fc/iph5526.c Tue Feb 17 20:00:06 2004 @@ -259,6 +259,7 @@ static int __init fcdev_init(struct net_device *dev) { + SET_MODULE_OWNER(dev); dev->open = iph5526_open; dev->stop = iph5526_close; dev->hard_start_xmit = iph5526_send_packet; @@ -2896,14 +2897,12 @@ static int iph5526_open(struct net_device *dev) { netif_start_queue(dev); - MOD_INC_USE_COUNT; return 0; } static int iph5526_close(struct net_device *dev) { netif_stop_queue(dev); - MOD_DEC_USE_COUNT; return 0; } diff -Nru a/drivers/net/fc/iph5526_scsi.h b/drivers/net/fc/iph5526_scsi.h --- a/drivers/net/fc/iph5526_scsi.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/fc/iph5526_scsi.h Tue Feb 17 20:00:07 2004 @@ -25,7 +25,7 @@ int iph5526_release(struct Scsi_Host *host); int iph5526_abort(Scsi_Cmnd *Cmnd); const char *iph5526_info(struct Scsi_Host *host); -int iph5526_biosparam(Disk * disk, struct block_device *n, int ip[]); +int iph5526_biosparam(struct Scsi_Disk * disk, struct block_device *n, int ip[]); #endif diff -Nru a/drivers/net/fealnx.c b/drivers/net/fealnx.c --- a/drivers/net/fealnx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/fealnx.c Tue Feb 17 20:00:07 2004 @@ -1426,7 +1426,7 @@ writel(0, dev->base_addr + IMR); ioaddr = dev->base_addr; - np = (struct netdev_private *) dev->priv; + np = dev->priv; do { u32 intr_status = readl(ioaddr + ISR); diff -Nru a/drivers/net/fmv18x.c b/drivers/net/fmv18x.c --- a/drivers/net/fmv18x.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/fmv18x.c Tue Feb 17 20:00:05 2004 @@ -57,7 +57,7 @@ #include #include -static int fmv18x_probe_list[] __initdata = { +static unsigned fmv18x_probe_list[] __initdata = { 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0 }; @@ -109,8 +109,6 @@ /* Index to functions, as function prototypes. */ -extern int fmv18x_probe(struct net_device *dev); - static int fmv18x_probe1(struct net_device *dev, short ioaddr); static int net_open(struct net_device *dev); static int net_send_packet(struct sk_buff *skb, struct net_device *dev); @@ -129,23 +127,50 @@ (detachable devices only). */ -int __init fmv18x_probe(struct net_device *dev) +static int io = 0x220; +static int irq; + +struct net_device * __init fmv18x_probe(int unit) { - int i; - int base_addr = dev->base_addr; + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + unsigned *port; + int err = 0; + + if (!dev) + return ERR_PTR(-ENODEV); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + } SET_MODULE_OWNER(dev); - if (base_addr > 0x1ff) /* Check a single specified location. */ - return fmv18x_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; fmv18x_probe_list[i]; i++) - if (fmv18x_probe1(dev, fmv18x_probe_list[i]) == 0) - return 0; - - return -ENODEV; + if (io > 0x1ff) { /* Check a single specified location. */ + err = fmv18x_probe1(dev, io); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = fmv18x_probe_list; *port; port++) + if (fmv18x_probe1(dev, *port) == 0) + break; + if (!*port) + err = -ENODEV; + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + free_irq(dev->irq, dev); + release_region(dev->base_addr, FMV18X_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } /* The Fujitsu datasheet suggests that the NIC be probed for by checking its @@ -160,7 +185,7 @@ { char irqmap[4] = {3, 7, 10, 15}; char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15}; - unsigned int i, irq, retval; + unsigned int i, retval; struct net_local *lp; /* Resetting the chip doesn't reset the ISA interface, so don't bother. @@ -170,6 +195,9 @@ if (!request_region(ioaddr, FMV18X_IO_EXTENT, dev->name)) return -EBUSY; + dev->irq = irq; + dev->base_addr = ioaddr; + /* Check I/O address configuration and Fujitsu vendor code */ if (inb(ioaddr+FJ_MACADDR ) != 0x00 || inb(ioaddr+FJ_MACADDR+1) != 0x00 @@ -181,9 +209,8 @@ /* Check PnP mode for FMV-183/184/183A/184A. */ /* This PnP routine is very poor. IO and IRQ should be known. */ if (inb(ioaddr + FJ_STATUS1) & 0x20) { - irq = dev->irq; for (i = 0; i < 8; i++) { - if (irq == irqmap_pnp[i]) + if (dev->irq == irqmap_pnp[i]) break; } if (i == 8) { @@ -193,22 +220,19 @@ } else { if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr) return -ENODEV; - irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03]; + dev->irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03]; } /* Snarf the interrupt vector now. */ - retval = request_irq(irq, &net_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev); if (retval) { printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on" - "IRQ %d.\n", ioaddr, irq); + "IRQ %d.\n", ioaddr, dev->irq); goto out; } printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev->name, - ioaddr, irq); - - dev->base_addr = ioaddr; - dev->irq = irq; + ioaddr, dev->irq); for(i = 0; i < 6; i++) { unsigned char val = inb(ioaddr + FJ_MACADDR + i); @@ -279,14 +303,10 @@ dev->watchdog_timeo = HZ/10; dev->get_stats = net_get_stats; dev->set_multicast_list = set_multicast_list; - - /* Fill in the fields of 'dev' with ethernet-generic values. */ - - ether_setup(dev); return 0; out_irq: - free_irq(irq, dev); + free_irq(dev->irq, dev); out: release_region(ioaddr, FMV18X_IO_EXTENT); return retval; @@ -413,9 +433,7 @@ lp->tx_queue_len = 0; dev->trans_start = jiffies; lp->tx_started = 1; - } else if (lp->tx_queue_len < 4096 - 1502) - /* Yes, there is room for one more packet. */ - else + } else if (lp->tx_queue_len >= 4096 - 1502) /* No room for a packet */ netif_stop_queue(dev); dev_kfree_skb(skb); @@ -628,9 +646,7 @@ } #ifdef MODULE -static struct net_device dev_fmv18x; -static int io = 0x220; -static int irq; +static struct net_device *dev_fmv18x; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); @@ -644,26 +660,19 @@ { if (io == 0) printk("fmv18x: You should not use auto-probing with insmod!\n"); - dev_fmv18x.base_addr = io; - dev_fmv18x.irq = irq; - dev_fmv18x.init = fmv18x_probe; - if (register_netdev(&dev_fmv18x) != 0) { - printk("fmv18x: register_netdev() returned non-zero.\n"); - return -EIO; - } + dev_fmv18x = fmv18x_probe(-1); + if (IS_ERR(dev_fmv18x)) + return PTR_ERR(dev_fmv18x); return 0; } void cleanup_module(void) { - unregister_netdev(&dev_fmv18x); - kfree(dev_fmv18x.priv); - dev_fmv18x.priv = NULL; - - /* If we don't do this, we can't re-insmod it later. */ - free_irq(dev_fmv18x.irq, &dev_fmv18x); - release_region(dev_fmv18x.base_addr, FMV18X_IO_EXTENT); + unregister_netdev(dev_fmv18x); + free_irq(dev_fmv18x->irq, dev_fmv18x); + release_region(dev_fmv18x->base_addr, FMV18X_IO_EXTENT); + free_netdev(dev_fmv18x); } #endif /* MODULE */ diff -Nru a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c --- a/drivers/net/forcedeth.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/forcedeth.c Tue Feb 17 20:00:05 2004 @@ -60,15 +60,24 @@ * addresses, really stop rx if already running * in start_rx, clean up a bit. * (C) Carl-Daniel Hailfinger - * 0.20: 07 Dev 2003: alloc fixes + * 0.20: 07 Dec 2003: alloc fixes + * 0.21: 12 Jan 2004: additional alloc fix, nic polling fix. + * 0.22: 19 Jan 2004: reprogram timer to a sane rate, avoid lockup + * on close. + * (C) Carl-Daniel Hailfinger, Manfred Spraul + * 0.23: 26 Jan 2004: various small cleanups * * Known bugs: - * The irq handling is wrong - no tx done interrupts are generated. - * This means recovery from netif_stop_queue only happens in the hw timer - * interrupt (1/2 second on nForce2, 1/100 second on nForce3), or if an - * rx packet arrives by chance. + * We suspect that on some hardware no TX done interrupts are generated. + * This means recovery from netif_stop_queue only happens if the hw timer + * interrupt fires (100 times/second, configurable with NVREG_POLL_DEFAULT) + * and the timer is active in the IRQMask, or if a rx packet arrives by chance. + * If your hardware reliably generates tx done interrupts, then you can remove + * DEV_NEED_TIMERIRQ from the driver_data flags. + * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few + * superfluous timer interrupts from the nic. */ -#define FORCEDETH_VERSION "0.19" +#define FORCEDETH_VERSION "0.23" #include #include @@ -104,6 +113,7 @@ #define DEV_NEED_LASTPACKET1 0x0001 #define DEV_IRQMASK_1 0x0002 #define DEV_IRQMASK_2 0x0004 +#define DEV_NEED_TIMERIRQ 0x0008 enum { NvRegIrqStatus = 0x000, @@ -124,7 +134,12 @@ NvRegUnknownSetupReg6 = 0x008, #define NVREG_UNKSETUP6_VAL 3 +/* + * NVREG_POLL_DEFAULT is the interval length of the timer source on the nic + * NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms + */ NvRegPollingInterval = 0x00c, +#define NVREG_POLL_DEFAULT 970 NvRegMisc1 = 0x080, #define NVREG_MISC1_HD 0x02 #define NVREG_MISC1_FORCE 0x3b0f3c @@ -286,7 +301,7 @@ #define NV_WAKEUPMASKENTRIES 4 /* General driver defaults */ -#define NV_WATCHDOG_TIMEO (2*HZ) +#define NV_WATCHDOG_TIMEO (5*HZ) #define DEFAULT_MTU 1500 /* also maximum supported, at least for now */ #define RX_RING 128 @@ -520,12 +535,12 @@ } /* - * get_stats: dev->get_stats function + * nv_get_stats: dev->get_stats function * Get latest stats value from the nic. * Called with read_lock(&dev_base_lock) held for read - * only synchronized against unregister_netdevice. */ -static struct net_device_stats *get_stats(struct net_device *dev) +static struct net_device_stats *nv_get_stats(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); @@ -536,14 +551,55 @@ return &np->stats; } +static int nv_ethtool_ioctl (struct net_device *dev, void *useraddr) +{ + struct fe_priv *np = get_nvpriv(dev); + u32 ethcmd; + + if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) + return -EFAULT; + + switch (ethcmd) { + case ETHTOOL_GDRVINFO: + { + struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; + strcpy(info.driver, "forcedeth"); + strcpy(info.version, FORCEDETH_VERSION); + strcpy(info.bus_info, pci_name(np->pci_dev)); + if (copy_to_user(useraddr, &info, sizeof (info))) + return -EFAULT; + return 0; + } + case ETHTOOL_GLINK: + { + struct ethtool_value edata = { ETHTOOL_GLINK }; + + edata.data = !!netif_carrier_ok(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + default: + break; + } + + return -EOPNOTSUPP; +} /* - * nic_ioctl: dev->do_ioctl function + * nv_ioctl: dev->do_ioctl function * Called with rtnl_lock held. */ -static int nic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static int nv_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - return -EOPNOTSUPP; + switch(cmd) { + case SIOCETHTOOL: + return nv_ethtool_ioctl(dev, (void *) rq->ifr_data); + + default: + return -EOPNOTSUPP; + } } /* @@ -661,10 +717,10 @@ } /* - * start_xmit: dev->hard_start_xmit function + * nv_start_xmit: dev->hard_start_xmit function * Called with dev->xmit_lock held. */ -static int start_xmit(struct sk_buff *skb, struct net_device *dev) +static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); int nr = np->next_tx % TX_RING; @@ -679,7 +735,7 @@ spin_lock_irq(&np->lock); wmb(); np->tx_ring[nr].Flags = np->tx_flags; - dprintk(KERN_DEBUG "%s: start_xmit: packet packet %d queued for transmission.\n", + dprintk(KERN_DEBUG "%s: nv_start_xmit: packet packet %d queued for transmission.\n", dev->name, np->next_tx); { int j; @@ -698,6 +754,7 @@ netif_stop_queue(dev); spin_unlock_irq(&np->lock); writel(NVREG_TXRXCTL_KICK, get_hwbase(dev) + NvRegTxRxControl); + pci_push(get_hwbase(dev)); return 0; } @@ -743,10 +800,10 @@ } /* - * tx_timeout: dev->tx_timeout function + * nv_tx_timeout: dev->tx_timeout function * Called with dev->xmit_lock held. */ -static void tx_timeout(struct net_device *dev) +static void nv_tx_timeout(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); u8 *base = get_hwbase(dev); @@ -797,13 +854,13 @@ break; /* still owned by hardware, */ /* - * the packet is for us - immediately tear down the pci mapping, and - * prefetch the first cacheline of the packet. + * the packet is for us - immediately tear down the pci mapping. + * TODO: check if a prefetch of the first cacheline improves + * the performance. */ pci_unmap_single(np->pci_dev, np->rx_dma[i], np->rx_skbuff[i]->len, PCI_DMA_FROMDEVICE); - prefetch(np->rx_skbuff[i]->data); { int j; @@ -870,10 +927,10 @@ } /* - * change_mtu: dev->change_mtu function + * nv_change_mtu: dev->change_mtu function * Called with dev_base_lock held for read. */ -static int change_mtu(struct net_device *dev, int new_mtu) +static int nv_change_mtu(struct net_device *dev, int new_mtu) { if (new_mtu > DEFAULT_MTU) return -EINVAL; @@ -882,10 +939,10 @@ } /* - * change_mtu: dev->change_mtu function + * nv_set_multicast: dev->set_multicast function * Called with dev->xmit_lock held. */ -static void set_multicast(struct net_device *dev) +static void nv_set_multicast(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); u8 *base = get_hwbase(dev); @@ -1098,13 +1155,13 @@ enable_irq(dev->irq); } -static int open(struct net_device *dev) +static int nv_open(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); u8 *base = get_hwbase(dev); int ret, oom, i; - dprintk(KERN_DEBUG "forcedeth: open\n"); + dprintk(KERN_DEBUG "nv_open: begin\n"); /* 1) erase previous misconfiguration */ /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */ @@ -1152,17 +1209,23 @@ for (i = 1; i < 32; i++) { int id1, id2; + spin_lock_irq(&np->lock); id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ); - if (id1 < 0) + spin_unlock_irq(&np->lock); + if (id1 < 0 || id1 == 0xffff) continue; + spin_lock_irq(&np->lock); id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ); - if (id2 < 0) + spin_unlock_irq(&np->lock); + if (id2 < 0 || id2 == 0xffff) continue; dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n", dev->name, id1, id2, i); np->phyaddr = i; + spin_lock_irq(&np->lock); update_linkspeed(dev); + spin_unlock_irq(&np->lock); break; } @@ -1185,6 +1248,7 @@ writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); + writel(NVREG_POLL_DEFAULT, base + NvRegPollingInterval); writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6); writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID, base + NvRegAdapterControl); @@ -1198,9 +1262,9 @@ base + NvRegRingSizes); i = readl(base + NvRegPowerState); - if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) { + if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) writel(NVREG_POWERSTATE_POWEREDUP|i, base + NvRegPowerState); - } + pci_push(base); udelay(10); writel(readl(base + NvRegPowerState) | NVREG_POWERSTATE_VALID, base + NvRegPowerState); @@ -1232,7 +1296,9 @@ netif_start_queue(dev); if (oom) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); - if (!(mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ) & BMSR_ANEGCOMPLETE)) { + if (mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ) & BMSR_ANEGCOMPLETE) { + netif_carrier_on(dev); + } else { printk("%s: no link during initialization.\n", dev->name); netif_carrier_off(dev); } @@ -1245,9 +1311,10 @@ return ret; } -static int close(struct net_device *dev) +static int nv_close(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); + u8 *base; spin_lock_irq(&np->lock); np->in_shutdown = 1; @@ -1261,6 +1328,13 @@ spin_lock_irq(&np->lock); stop_tx(dev); stop_rx(dev); + base = get_hwbase(dev); + + /* disable interrupts on the nic or we will lock up */ + writel(0, base + NvRegIrqMask); + pci_push(base); + dprintk(KERN_INFO "%s: Irqmask is zero again\n", dev->name); + spin_unlock_irq(&np->lock); free_irq(dev->irq, dev); @@ -1272,7 +1346,7 @@ return 0; } -static int __devinit probe_nic(struct pci_dev *pci_dev, const struct pci_device_id *id) +static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) { struct net_device *dev; struct fe_priv *np; @@ -1281,11 +1355,11 @@ int err, i; dev = alloc_etherdev(sizeof(struct fe_priv)); - np = get_nvpriv(dev); err = -ENOMEM; if (!dev) goto out; + np = get_nvpriv(dev); np->pci_dev = pci_dev; spin_lock_init(&np->lock); SET_MODULE_OWNER(dev); @@ -1333,7 +1407,7 @@ err = -ENOMEM; dev->base_addr = (unsigned long) ioremap(addr, NV_PCI_REGSZ); if (!dev->base_addr) - goto out_disable; + goto out_relreg; dev->irq = pci_dev->irq; np->rx_ring = pci_alloc_consistent(pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), &np->ring_addr); @@ -1341,19 +1415,18 @@ goto out_unmap; np->tx_ring = &np->rx_ring[RX_RING]; - dev->open = open; - dev->stop = close; - dev->hard_start_xmit = start_xmit; - dev->get_stats = get_stats; - dev->change_mtu = change_mtu; - dev->set_multicast_list = set_multicast; - dev->do_ioctl = nic_ioctl; - dev->tx_timeout = tx_timeout; + dev->open = nv_open; + dev->stop = nv_close; + dev->hard_start_xmit = nv_start_xmit; + dev->get_stats = nv_get_stats; + dev->change_mtu = nv_change_mtu; + dev->set_multicast_list = nv_set_multicast; + dev->do_ioctl = nv_ioctl; + dev->tx_timeout = nv_tx_timeout; dev->watchdog_timeo = NV_WATCHDOG_TIMEO; pci_set_drvdata(pci_dev, dev); - /* read the mac address */ base = get_hwbase(dev); np->orig_mac[0] = readl(base + NvRegMacAddrA); @@ -1393,6 +1466,8 @@ np->irqmask = NVREG_IRQMASK_WANTED_1; if (id->driver_data & DEV_IRQMASK_2) np->irqmask = NVREG_IRQMASK_WANTED_2; + if (id->driver_data & DEV_NEED_TIMERIRQ) + np->irqmask |= NVREG_IRQ_TIMER; err = register_netdev(dev); if (err) { @@ -1408,6 +1483,7 @@ out_freering: pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), np->rx_ring, np->ring_addr); + pci_set_drvdata(pci_dev, NULL); out_unmap: iounmap(get_hwbase(dev)); out_relreg: @@ -1416,12 +1492,11 @@ pci_disable_device(pci_dev); out_free: free_netdev(dev); - pci_set_drvdata(pci_dev, NULL); out: return err; } -static void __devexit remove_nic(struct pci_dev *pci_dev) +static void __devexit nv_remove(struct pci_dev *pci_dev) { struct net_device *dev = pci_get_drvdata(pci_dev); struct fe_priv *np = get_nvpriv(dev); @@ -1430,7 +1505,7 @@ unregister_netdev(dev); /* special op: write back the misordered MAC address - otherwise - * the next probe_nic would see a wrong address. + * the next nv_probe would see a wrong address. */ writel(np->orig_mac[0], base + NvRegMacAddrA); writel(np->orig_mac[1], base + NvRegMacAddrB); @@ -1450,21 +1525,21 @@ .device = 0x1C3, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, - .driver_data = DEV_IRQMASK_1, + .driver_data = DEV_IRQMASK_1|DEV_NEED_TIMERIRQ, }, { /* nForce2 Ethernet Controller */ .vendor = PCI_VENDOR_ID_NVIDIA, .device = 0x0066, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, - .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2, + .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ, }, { /* nForce3 Ethernet Controller */ .vendor = PCI_VENDOR_ID_NVIDIA, .device = 0x00D6, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, - .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2, + .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ, }, {0,}, }; @@ -1472,8 +1547,8 @@ static struct pci_driver driver = { .name = "forcedeth", .id_table = pci_tbl, - .probe = probe_nic, - .remove = __devexit_p(remove_nic), + .probe = nv_probe, + .remove = __devexit_p(nv_remove), }; diff -Nru a/drivers/net/gt96100eth.c b/drivers/net/gt96100eth.c --- a/drivers/net/gt96100eth.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/gt96100eth.c Tue Feb 17 20:00:07 2004 @@ -729,10 +729,12 @@ return -EBUSY; } - dev = init_etherdev(0, sizeof(struct gt96100_private)); + dev = alloc_etherdev(sizeof(struct gt96100_private)); + if (!dev) + goto out; gtif->dev = dev; - /* private struct aligned and zeroed by init_etherdev */ + /* private struct aligned and zeroed by alloc_etherdev */ /* Fill in the 'dev' fields. */ dev->base_addr = gtif->iobase; dev->irq = gtif->irq; @@ -740,7 +742,7 @@ if ((retval = parse_mac_addr(dev, gtif->mac_str))) { err("%s: MAC address parse failed\n", __FUNCTION__); retval = -EINVAL; - goto free_region; + goto out1; } gp = dev->priv; @@ -768,7 +770,7 @@ &gp->rx_ring_dma); if (gp->rx_ring == NULL) { retval = -ENOMEM; - goto free_region; + goto out1; } gp->tx_ring = (gt96100_td_t *)(gp->rx_ring + RX_RING_SIZE); @@ -781,11 +783,8 @@ gp->rx_buff = dmaalloc(PKT_BUF_SZ*RX_RING_SIZE, &gp->rx_buff_dma); if (gp->rx_buff == NULL) { - dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE - + sizeof(gt96100_td_t) * TX_RING_SIZE, - gp->rx_ring); retval = -ENOMEM; - goto free_region; + goto out2; } } @@ -797,12 +796,8 @@ gp->hash_table = (char*)dmaalloc(RX_HASH_TABLE_SIZE, &gp->hash_table_dma); if (gp->hash_table == NULL) { - dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE - + sizeof(gt96100_td_t) * TX_RING_SIZE, - gp->rx_ring); - dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff); retval = -ENOMEM; - goto free_region; + goto out3; } } @@ -819,14 +814,23 @@ dev->tx_timeout = gt96100_tx_timeout; dev->watchdog_timeo = GT96100ETH_TX_TIMEOUT; - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); + retval = register_netdev(dev); + if (retval) + goto out4; return 0; - free_region: - release_region(gtif->iobase, GT96100_ETH_IO_SIZE); - unregister_netdev(dev); +out4: + dmafree(RX_HASH_TABLE_SIZE, gp->hash_table_dma); +out3: + dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff); +out2: + dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE + + sizeof(gt96100_td_t) * TX_RING_SIZE, + gp->rx_ring); +out1: free_netdev (dev); +out: + release_region(gtif->iobase, GT96100_ETH_IO_SIZE); err("%s failed. Returns %d\n", __FUNCTION__, retval); return retval; } @@ -1573,9 +1577,14 @@ if (gtif->dev != NULL) { struct gt96100_private *gp = (struct gt96100_private *)gtif->dev->priv; - release_region(gtif->iobase, gp->io_size); unregister_netdev(gtif->dev); - free_netdev (gtif->dev); + dmafree(RX_HASH_TABLE_SIZE, gp->hash_table_dma); + dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff); + dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE + + sizeof(gt96100_td_t) * TX_RING_SIZE, + gp->rx_ring); + free_netdev(gtif->dev); + release_region(gtif->iobase, gp->io_size); } } } diff -Nru a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c --- a/drivers/net/hamradio/6pack.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hamradio/6pack.c Tue Feb 17 20:00:06 2004 @@ -516,7 +516,6 @@ static void sixpack_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { unsigned char buf[512]; - unsigned long flags; int count1; struct sixpack *sp = (struct sixpack *) tty->disc_data; @@ -525,10 +524,7 @@ !netif_running(sp->dev) || !count) return; - save_flags(flags); - cli(); memcpy(buf, cp, countpriv; - pp = parport_enumerate(); - while (pp && pp->base != dev->base_addr) - pp = pp->next; + pp = parport_find_base(dev->base_addr); if (!pp) { printk(KERN_ERR "%s: parport at 0x%lx unknown\n", bc_drvname, dev->base_addr); return -ENXIO; @@ -1001,17 +999,21 @@ #if 0 if (pp->irq < 0) { printk(KERN_ERR "%s: parport at 0x%lx has no irq\n", bc_drvname, pp->base); + parport_put_port(pp); return -ENXIO; } #endif if ((~pp->modes) & (PARPORT_MODE_TRISTATE | PARPORT_MODE_PCSPP | PARPORT_MODE_SAFEININT)) { printk(KERN_ERR "%s: parport at 0x%lx cannot be used\n", bc_drvname, pp->base); + parport_put_port(pp); return -EIO; } memset(&bc->modem, 0, sizeof(bc->modem)); - if (!(bc->pdev = parport_register_device(pp, dev->name, NULL, epp_wakeup, - epp_interrupt, PARPORT_DEV_EXCL, dev))) { + bc->pdev = parport_register_device(pp, dev->name, NULL, epp_wakeup, + epp_interrupt, PARPORT_DEV_EXCL, dev); + parport_put_port(pp); + if (!bc->pdev) { printk(KERN_ERR "%s: cannot register parport at 0x%lx\n", bc_drvname, pp->base); return -ENXIO; } @@ -1275,7 +1277,7 @@ * If dev->base_addr == 2, allocate space for the device and return success * (detachable devices only). */ -static int baycom_probe(struct net_device *dev) +static void baycom_probe(struct net_device *dev) { static char ax25_bcast[AX25_ADDR_LEN] = { 'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1 @@ -1288,9 +1290,6 @@ }; struct baycom_state *bc; - if (!dev) - return -ENXIO; - baycom_paranoia_check(dev, "baycom_probe", -ENXIO); /* * not a real probe! only initialize data structures */ @@ -1332,8 +1331,6 @@ /* New style flags */ dev->flags = 0; - - return 0; } /* --------------------------------------------------------------------- */ @@ -1368,7 +1365,7 @@ /* * initialize part of the device struct */ - dev->init = baycom_probe; + baycom_probe(dev); } static int __init init_baycomepp(void) @@ -1401,7 +1398,7 @@ if (register_netdev(dev)) { printk(KERN_WARNING "%s: cannot register net device %s\n", bc_drvname, dev->name); - kfree(dev); + free_netdev(dev); break; } if (set_hw && baycom_setmode(dev->priv, mode[i])) diff -Nru a/drivers/net/hamradio/baycom_par.c b/drivers/net/hamradio/baycom_par.c --- a/drivers/net/hamradio/baycom_par.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/hamradio/baycom_par.c Tue Feb 17 20:00:08 2004 @@ -314,29 +314,32 @@ static int par96_open(struct net_device *dev) { struct baycom_state *bc = (struct baycom_state *)dev->priv; - struct parport *pp = parport_enumerate(); + struct parport *pp; if (!dev || !bc) return -ENXIO; - while (pp && pp->base != dev->base_addr) - pp = pp->next; + pp = parport_find_base(dev->base_addr); if (!pp) { printk(KERN_ERR "baycom_par: parport at 0x%lx unknown\n", dev->base_addr); return -ENXIO; } if (pp->irq < 0) { printk(KERN_ERR "baycom_par: parport at 0x%lx has no irq\n", pp->base); + parport_put_port(pp); return -ENXIO; } if ((~pp->modes) & (PARPORT_MODE_PCSPP | PARPORT_MODE_SAFEININT)) { printk(KERN_ERR "baycom_par: parport at 0x%lx cannot be used\n", pp->base); + parport_put_port(pp); return -ENXIO; } memset(&bc->modem, 0, sizeof(bc->modem)); bc->hdrv.par.bitrate = 9600; - if (!(bc->pdev = parport_register_device(pp, dev->name, NULL, par96_wakeup, - par96_interrupt, PARPORT_DEV_EXCL, dev))) { - printk(KERN_ERR "baycom_par: cannot register parport at 0x%lx\n", pp->base); + bc->pdev = parport_register_device(pp, dev->name, NULL, par96_wakeup, + par96_interrupt, PARPORT_DEV_EXCL, dev); + parport_put_port(pp); + if (!bc->pdev) { + printk(KERN_ERR "baycom_par: cannot register parport at 0x%lx\n", dev->base_addr); return -ENXIO; } if (parport_claim(bc->pdev)) { diff -Nru a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c --- a/drivers/net/hamradio/bpqether.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hamradio/bpqether.c Tue Feb 17 20:00:06 2004 @@ -547,7 +547,7 @@ error: dev_put(edev); - kfree(ndev); + free_netdev(ndev); return err; } diff -Nru a/drivers/net/hamradio/dmascc.c b/drivers/net/hamradio/dmascc.c --- a/drivers/net/hamradio/dmascc.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hamradio/dmascc.c Tue Feb 17 20:00:06 2004 @@ -242,7 +242,7 @@ struct scc_info { int irq_used; int twin_serial_cfg; - struct net_device dev[2]; + struct net_device *dev[2]; struct scc_priv priv[2]; struct scc_info *next; spinlock_t register_lock; /* Per device register lock */ @@ -310,18 +310,19 @@ info = first; /* Unregister devices */ - for (i = 0; i < 2; i++) { - if (info->dev[i].name) - unregister_netdev(&info->dev[i]); - } + for (i = 0; i < 2; i++) + unregister_netdev(info->dev[i]); /* Reset board */ if (info->priv[0].type == TYPE_TWIN) - outb(0, info->dev[0].base_addr + TWIN_SERIAL_CFG); + outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG); write_scc(&info->priv[0], R9, FHWRES); - release_region(info->dev[0].base_addr, + release_region(info->dev[0]->base_addr, hw[info->priv[0].type].io_size); + for (i = 0; i < 2; i++) + free_netdev(info->dev[i]); + /* Free memory */ first = info->next; kfree(info); @@ -443,156 +444,193 @@ module_init(dmascc_init); module_exit(dmascc_exit); +static void dev_setup(struct net_device *dev) +{ + dev->type = ARPHRD_AX25; + dev->hard_header_len = 73; + dev->mtu = 1500; + dev->addr_len = 7; + dev->tx_queue_len = 64; + memcpy(dev->broadcast, ax25_broadcast, 7); + memcpy(dev->dev_addr, ax25_test, 7); +} -int __init setup_adapter(int card_base, int type, int n) { - int i, irq, chip; - struct scc_info *info; - struct net_device *dev; - struct scc_priv *priv; - unsigned long time; - unsigned int irqs; - int tmr_base = card_base + hw[type].tmr_offset; - int scc_base = card_base + hw[type].scc_offset; - char *chipnames[] = CHIPNAMES; - - /* Allocate memory */ - info = kmalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA); - if (!info) { - printk(KERN_ERR "dmascc: could not allocate memory for %s at %#3x\n", - hw[type].name, card_base); - return -1; - } +static int __init setup_adapter(int card_base, int type, int n) +{ + int i, irq, chip; + struct scc_info *info; + struct net_device *dev; + struct scc_priv *priv; + unsigned long time; + unsigned int irqs; + int tmr_base = card_base + hw[type].tmr_offset; + int scc_base = card_base + hw[type].scc_offset; + char *chipnames[] = CHIPNAMES; + + /* Allocate memory */ + info = kmalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA); + if (!info) { + printk(KERN_ERR "dmascc: " + "could not allocate memory for %s at %#3x\n", + hw[type].name, card_base); + goto out; + } - /* Initialize what is necessary for write_scc and write_scc_data */ - memset(info, 0, sizeof(struct scc_info)); - spin_lock_init(&info->register_lock); - - priv = &info->priv[0]; - priv->type = type; - priv->card_base = card_base; - priv->scc_cmd = scc_base + SCCA_CMD; - priv->scc_data = scc_base + SCCA_DATA; - priv->register_lock = &info->register_lock; - - /* Reset SCC */ - write_scc(priv, R9, FHWRES | MIE | NV); - - /* Determine type of chip by enabling SDLC/HDLC enhancements */ - write_scc(priv, R15, SHDLCE); - if (!read_scc(priv, R15)) { - /* WR7' not present. This is an ordinary Z8530 SCC. */ - chip = Z8530; - } else { - /* Put one character in TX FIFO */ - write_scc_data(priv, 0, 0); - if (read_scc(priv, R0) & Tx_BUF_EMP) { - /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */ - chip = Z85230; - } else { - /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */ - chip = Z85C30; - } - } - write_scc(priv, R15, 0); + /* Initialize what is necessary for write_scc and write_scc_data */ + memset(info, 0, sizeof(struct scc_info)); - /* Start IRQ auto-detection */ - irqs = probe_irq_on(); + info->dev[0] = alloc_netdev(0, "", dev_setup); + if (!info->dev[0]) { + printk(KERN_ERR "dmascc: " + "could not allocate memory for %s at %#3x\n", + hw[type].name, card_base); + goto out1; + } - /* Enable interrupts */ - if (type == TYPE_TWIN) { - outb(0, card_base + TWIN_DMA_CFG); - inb(card_base + TWIN_CLR_TMR1); - inb(card_base + TWIN_CLR_TMR2); - outb((info->twin_serial_cfg = TWIN_EI), card_base + TWIN_SERIAL_CFG); - } else { - write_scc(priv, R15, CTSIE); - write_scc(priv, R0, RES_EXT_INT); - write_scc(priv, R1, EXT_INT_ENAB); - } + info->dev[1] = alloc_netdev(0, "", dev_setup); + if (!info->dev[1]) { + printk(KERN_ERR "dmascc: " + "could not allocate memory for %s at %#3x\n", + hw[type].name, card_base); + goto out2; + } + spin_lock_init(&info->register_lock); - /* Start timer */ - outb(1, tmr_base + TMR_CNT1); - outb(0, tmr_base + TMR_CNT1); - - /* Wait and detect IRQ */ - time = jiffies; while (jiffies - time < 2 + HZ / TMR_0_HZ); - irq = probe_irq_off(irqs); - - /* Clear pending interrupt, disable interrupts */ - if (type == TYPE_TWIN) { - inb(card_base + TWIN_CLR_TMR1); - } else { - write_scc(priv, R1, 0); - write_scc(priv, R15, 0); - write_scc(priv, R0, RES_EXT_INT); - } + priv = &info->priv[0]; + priv->type = type; + priv->card_base = card_base; + priv->scc_cmd = scc_base + SCCA_CMD; + priv->scc_data = scc_base + SCCA_DATA; + priv->register_lock = &info->register_lock; + + /* Reset SCC */ + write_scc(priv, R9, FHWRES | MIE | NV); + + /* Determine type of chip by enabling SDLC/HDLC enhancements */ + write_scc(priv, R15, SHDLCE); + if (!read_scc(priv, R15)) { + /* WR7' not present. This is an ordinary Z8530 SCC. */ + chip = Z8530; + } else { + /* Put one character in TX FIFO */ + write_scc_data(priv, 0, 0); + if (read_scc(priv, R0) & Tx_BUF_EMP) { + /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */ + chip = Z85230; + } else { + /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */ + chip = Z85C30; + } + } + write_scc(priv, R15, 0); - if (irq <= 0) { - printk(KERN_ERR "dmascc: could not find irq of %s at %#3x (irq=%d)\n", - hw[type].name, card_base, irq); - kfree(info); - return -1; - } + /* Start IRQ auto-detection */ + irqs = probe_irq_on(); - /* Set up data structures */ - for (i = 0; i < 2; i++) { - dev = &info->dev[i]; - priv = &info->priv[i]; - priv->type = type; - priv->chip = chip; - priv->dev = dev; - priv->info = info; - priv->channel = i; - spin_lock_init(&priv->ring_lock); - priv->register_lock = &info->register_lock; - priv->card_base = card_base; - priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD); - priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA); - priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1); - priv->tmr_ctrl = tmr_base + TMR_CTRL; - priv->tmr_mode = i ? 0xb0 : 0x70; - priv->param.pclk_hz = hw[type].pclk_hz; - priv->param.brg_tc = -1; - priv->param.clocks = TCTRxCP | RCRTxCP; - priv->param.persist = 256; - priv->param.dma = -1; - INIT_WORK(&priv->rx_work, rx_bh, priv); - dev->priv = priv; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) - if (sizeof(dev->name) == sizeof(char *)) dev->name = priv->name; -#endif - sprintf(dev->name, "dmascc%i", 2*n+i); - SET_MODULE_OWNER(dev); - dev->base_addr = card_base; - dev->irq = irq; - dev->open = scc_open; - dev->stop = scc_close; - dev->do_ioctl = scc_ioctl; - dev->hard_start_xmit = scc_send_packet; - dev->get_stats = scc_get_stats; - dev->hard_header = ax25_encapsulate; - dev->rebuild_header = ax25_rebuild_header; - dev->set_mac_address = scc_set_mac_address; - dev->type = ARPHRD_AX25; - dev->hard_header_len = 73; - dev->mtu = 1500; - dev->addr_len = 7; - dev->tx_queue_len = 64; - memcpy(dev->broadcast, ax25_broadcast, 7); - memcpy(dev->dev_addr, ax25_test, 7); - rtnl_lock(); - if (register_netdevice(dev)) { - printk(KERN_ERR "dmascc: could not register %s\n", dev->name); - } - rtnl_unlock(); - } + /* Enable interrupts */ + if (type == TYPE_TWIN) { + outb(0, card_base + TWIN_DMA_CFG); + inb(card_base + TWIN_CLR_TMR1); + inb(card_base + TWIN_CLR_TMR2); + info->twin_serial_cfg = TWIN_EI; + outb(info->twin_serial_cfg, card_base + TWIN_SERIAL_CFG); + } else { + write_scc(priv, R15, CTSIE); + write_scc(priv, R0, RES_EXT_INT); + write_scc(priv, R1, EXT_INT_ENAB); + } + + /* Start timer */ + outb(1, tmr_base + TMR_CNT1); + outb(0, tmr_base + TMR_CNT1); + + /* Wait and detect IRQ */ + time = jiffies; while (jiffies - time < 2 + HZ / TMR_0_HZ); + irq = probe_irq_off(irqs); + + /* Clear pending interrupt, disable interrupts */ + if (type == TYPE_TWIN) { + inb(card_base + TWIN_CLR_TMR1); + } else { + write_scc(priv, R1, 0); + write_scc(priv, R15, 0); + write_scc(priv, R0, RES_EXT_INT); + } + + if (irq <= 0) { + printk(KERN_ERR "dmascc: could not find irq of %s at %#3x (irq=%d)\n", + hw[type].name, card_base, irq); + goto out3; + } + + /* Set up data structures */ + for (i = 0; i < 2; i++) { + dev = info->dev[i]; + priv = &info->priv[i]; + priv->type = type; + priv->chip = chip; + priv->dev = dev; + priv->info = info; + priv->channel = i; + spin_lock_init(&priv->ring_lock); + priv->register_lock = &info->register_lock; + priv->card_base = card_base; + priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD); + priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA); + priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1); + priv->tmr_ctrl = tmr_base + TMR_CTRL; + priv->tmr_mode = i ? 0xb0 : 0x70; + priv->param.pclk_hz = hw[type].pclk_hz; + priv->param.brg_tc = -1; + priv->param.clocks = TCTRxCP | RCRTxCP; + priv->param.persist = 256; + priv->param.dma = -1; + INIT_WORK(&priv->rx_work, rx_bh, priv); + dev->priv = priv; + sprintf(dev->name, "dmascc%i", 2*n+i); + SET_MODULE_OWNER(dev); + dev->base_addr = card_base; + dev->irq = irq; + dev->open = scc_open; + dev->stop = scc_close; + dev->do_ioctl = scc_ioctl; + dev->hard_start_xmit = scc_send_packet; + dev->get_stats = scc_get_stats; + dev->hard_header = ax25_encapsulate; + dev->rebuild_header = ax25_rebuild_header; + dev->set_mac_address = scc_set_mac_address; + } + if (register_netdev(info->dev[0])) { + printk(KERN_ERR "dmascc: could not register %s\n", + info->dev[0]->name); + goto out3; + } + if (register_netdev(info->dev[1])) { + printk(KERN_ERR "dmascc: could not register %s\n", + info->dev[1]->name); + goto out4; + } - info->next = first; - first = info; - printk(KERN_INFO "dmascc: found %s (%s) at %#3x, irq %d\n", hw[type].name, - chipnames[chip], card_base, irq); - return 0; + info->next = first; + first = info; + printk(KERN_INFO "dmascc: found %s (%s) at %#3x, irq %d\n", hw[type].name, + chipnames[chip], card_base, irq); + return 0; + +out4: + unregister_netdev(info->dev[0]); +out3: + if (info->priv[0].type == TYPE_TWIN) + outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG); + write_scc(&info->priv[0], R9, FHWRES); + free_netdev(info->dev[1]); +out2: + free_netdev(info->dev[0]); +out1: + kfree(info); +out: + return -1; } diff -Nru a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c --- a/drivers/net/hamradio/hdlcdrv.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/hamradio/hdlcdrv.c Tue Feb 17 20:00:07 2004 @@ -832,7 +832,7 @@ if (err < 0) { printk(KERN_WARNING "hdlcdrv: cannot register net " "device %s\n", dev->name); - kfree(dev); + free_netdev(dev); dev = ERR_PTR(err); } return dev; diff -Nru a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c --- a/drivers/net/hamradio/mkiss.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/hamradio/mkiss.c Tue Feb 17 20:00:08 2004 @@ -24,6 +24,7 @@ * called twice, causing a deadlock. * Jeroen (PE1RXQ) Removed old MKISS_MAGIC stuff and calls to * MOD_*_USE_COUNT + * Remove cli() and fix rtnl lock usage. */ #include @@ -167,17 +168,17 @@ /* If no channels are available, allocate one */ if (axp == NULL && (ax25_ctrls[i] = kmalloc(sizeof(ax25_ctrl_t), GFP_KERNEL)) != NULL) { axp = ax25_ctrls[i]; - memset(axp, 0, sizeof(ax25_ctrl_t)); - - /* Initialize channel control data */ - set_bit(AXF_INUSE, &axp->ctrl.flags); - sprintf(axp->dev.name, "ax%d", i++); - axp->ctrl.tty = NULL; - axp->dev.base_addr = i; - axp->dev.priv = (void *)&axp->ctrl; - axp->dev.next = NULL; - axp->dev.init = ax25_init; } + memset(axp, 0, sizeof(ax25_ctrl_t)); + + /* Initialize channel control data */ + set_bit(AXF_INUSE, &axp->ctrl.flags); + sprintf(axp->dev.name, "ax%d", i++); + axp->ctrl.tty = NULL; + axp->dev.base_addr = i; + axp->dev.priv = (void *)&axp->ctrl; + axp->dev.next = NULL; + axp->dev.init = ax25_init; if (axp != NULL) { /* @@ -220,7 +221,6 @@ struct net_device *dev = ax->dev; unsigned char *xbuff, *rbuff, *oxbuff, *orbuff; int len; - unsigned long flags; len = dev->mtu * 2; @@ -246,8 +246,7 @@ return; } - save_flags(flags); - cli(); + spin_lock_bh(&ax->buflock); oxbuff = ax->xbuff; ax->xbuff = xbuff; @@ -278,7 +277,7 @@ ax->mtu = dev->mtu + 73; ax->buffsize = len; - restore_flags(flags); + spin_unlock_bh(&ax->buflock); if (oxbuff != NULL) kfree(oxbuff); @@ -306,6 +305,7 @@ struct sk_buff *skb; int count; + spin_lock_bh(&ax->buflock); if (ax->rbuff[0] > 0x0f) { if (ax->rbuff[0] & 0x20) { ax->crcmode = CRC_MODE_FLEX; @@ -322,6 +322,7 @@ *ax->rbuff &= ~0x20; } } + spin_unlock_bh(&ax->buflock); count = ax->rcount; @@ -332,7 +333,9 @@ } skb->dev = ax->dev; + spin_lock_bh(&ax->buflock); memcpy(skb_put(skb,count), ax->rbuff, count); + spin_unlock_bh(&ax->buflock); skb->mac.raw = skb->data; skb->protocol = htons(ETH_P_AX25); netif_rx(skb); @@ -360,6 +363,7 @@ p = icp; + spin_lock_bh(&ax->buflock); switch (ax->crcmode) { unsigned short crc; @@ -373,6 +377,7 @@ count = kiss_esc(p, (unsigned char *)ax->xbuff, len); break; } + ax->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP); actual = ax->tty->driver->write(ax->tty, 0, ax->xbuff, count); ax->tx_packets++; @@ -380,6 +385,8 @@ ax->dev->trans_start = jiffies; ax->xleft = count - actual; ax->xhead = ax->xbuff + actual; + + spin_unlock_bh(&ax->buflock); } /* @@ -511,6 +518,8 @@ ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */ + ax->buflock = SPIN_LOCK_UNLOCKED; + netif_start_queue(dev); return 0; @@ -750,15 +759,18 @@ break; } + spin_lock_bh(&ax->buflock); if (!test_bit(AXF_ERROR, &ax->flags)) { if (ax->rcount < ax->buffsize) { ax->rbuff[ax->rcount++] = s; + spin_unlock_bh(&ax->buflock); return; } ax->rx_over_errors++; set_bit(AXF_ERROR, &ax->flags); } + spin_unlock_bh(&ax->buflock); } diff -Nru a/drivers/net/hamradio/mkiss.h b/drivers/net/hamradio/mkiss.h --- a/drivers/net/hamradio/mkiss.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hamradio/mkiss.h Tue Feb 17 20:00:06 2004 @@ -56,6 +56,7 @@ #define CRC_MODE_NONE 0 #define CRC_MODE_FLEX 1 #define CRC_MODE_SMACK 2 + spinlock_t buflock; /* lock for rbuf and xbuf */ }; #define AX25_MAGIC 0x5316 diff -Nru a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c --- a/drivers/net/hamradio/scc.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/hamradio/scc.c Tue Feb 17 20:00:08 2004 @@ -163,6 +163,7 @@ #include #include #include +#include #include #include #include @@ -1520,8 +1521,10 @@ dev->priv = scc; scc->dev = dev; spin_lock_init(&scc->lock); + init_timer(&scc->tx_t); + init_timer(&scc->tx_wdog); - err = register_netdev(dev); + err = register_netdevice(dev); if (err) { printk(KERN_ERR "%s: can't register network device (%d)\n", name, err); @@ -1625,6 +1628,7 @@ } scc->dev_stat.rx_packets++; + scc->dev_stat.rx_bytes += skb->len; skb->dev = scc->dev; skb->protocol = htons(ETH_P_AX25); @@ -1651,6 +1655,7 @@ } scc->dev_stat.tx_packets++; + scc->dev_stat.tx_bytes += skb->len; scc->stat.txframes++; kisscmd = *skb->data & 0x1f; @@ -2114,10 +2119,13 @@ sprintf(devname,"%s0", SCC_DriverName); + rtnl_lock(); if (scc_net_alloc(devname, SCC_Info)) { + rtnl_unlock(); printk(KERN_ERR "z8530drv: cannot initialize module\n"); return -EIO; } + rtnl_unlock(); proc_net_fops_create("z8530drv", 0, &scc_net_seq_fops); diff -Nru a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c --- a/drivers/net/hamradio/yam.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/hamradio/yam.c Tue Feb 17 20:00:07 2004 @@ -1192,7 +1192,7 @@ struct net_device *dev = yam_devs[i]; if (dev) { unregister_netdev(dev); - kfree(dev); + free_netdev(dev); } } diff -Nru a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c --- a/drivers/net/hp-plus.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/hp-plus.c Tue Feb 17 20:00:05 2004 @@ -92,7 +92,6 @@ EnableIRQ = 4, FakeIntr = 8, BootROMEnb = 0x10, IOEnb = 0x20, MemEnable = 0x40, ZeroWait = 0x80, MemDisable = 0x1000, }; -int hp_plus_probe(struct net_device *dev); static int hpp_probe1(struct net_device *dev, int ioaddr); static void hpp_reset_8390(struct net_device *dev); @@ -115,10 +114,11 @@ /* Probe a list of addresses for an HP LAN+ adaptor. This routine is almost boilerplate. */ -int __init hp_plus_probe(struct net_device *dev) +static int __init do_hpp_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -127,13 +127,46 @@ else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; hpplus_portlist[i]; i++) + for (i = 0; hpplus_portlist[i]; i++) { if (hpp_probe1(dev, hpplus_portlist[i]) == 0) return 0; + dev->irq = irq; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + /* NB: hpp_close() handles free_irq */ + release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); +} + +struct net_device * __init hp_plus_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_hpp_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + /* Do the interesting part of the probe at a single address. */ static int __init hpp_probe1(struct net_device *dev, int ioaddr) { @@ -179,13 +212,6 @@ printk(" ID %4.4x", inw(ioaddr + 12)); } - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk ("hp-plus.c: unable to allocate memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - /* Read the IRQ line. */ outw(HW_Page, ioaddr + HP_PAGING); { @@ -400,7 +426,7 @@ #ifdef MODULE #define MAX_HPP_CARDS 4 /* Max number of HPP cards per module */ -static struct net_device dev_hpp[MAX_HPP_CARDS]; +static struct net_device *dev_hpp[MAX_HPP_CARDS]; static int io[MAX_HPP_CARDS]; static int irq[MAX_HPP_CARDS]; @@ -416,27 +442,33 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) { - struct net_device *dev = &dev_hpp[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->init = hp_plus_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + if (do_hpp_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_hpp[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -445,14 +477,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) { - struct net_device *dev = &dev_hpp[this_dev]; - if (dev->priv != NULL) { - int ioaddr = dev->base_addr - NIC_OFFSET; - void *priv = dev->priv; - /* NB: hpp_close() handles free_irq */ - release_region(ioaddr, HP_IO_EXTENT); + struct net_device *dev = dev_hpp[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/hp.c b/drivers/net/hp.c --- a/drivers/net/hp.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hp.c Tue Feb 17 20:00:06 2004 @@ -55,7 +55,6 @@ #define HP_8BSTOP_PG 0x80 /* Last page +1 of RX ring */ #define HP_16BSTOP_PG 0xFF /* Same, for 16 bit cards. */ -int hp_probe(struct net_device *dev); static int hp_probe1(struct net_device *dev, int ioaddr); static int hp_open(struct net_device *dev); @@ -79,10 +78,11 @@ Also initialize the card and fill in STATION_ADDR with the station address. */ -int __init hp_probe(struct net_device *dev) +static int __init do_hp_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -91,13 +91,46 @@ else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; hppclan_portlist[i]; i++) + for (i = 0; hppclan_portlist[i]; i++) { if (hp_probe1(dev, hppclan_portlist[i]) == 0) return 0; + dev->irq = irq; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + free_irq(dev->irq, dev); + release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); +} + +struct net_device * __init hp_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_hp_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init hp_probe1(struct net_device *dev, int ioaddr) { int i, retval, board_id, wordmode; @@ -131,13 +164,6 @@ if (ei_debug && version_printed++ == 0) printk(version); - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to get memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - printk("%s: %s (ID %02x) at %#3x,", dev->name, name, board_id, ioaddr); for(i = 0; i < ETHER_ADDR_LEN; i++) @@ -166,14 +192,14 @@ if (*irqp == 0) { printk(" no free IRQ lines.\n"); retval = -EBUSY; - goto out1; + goto out; } } else { if (dev->irq == 2) dev->irq = 9; if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { printk (" unable to get IRQ %d.\n", dev->irq); - goto out1; + goto out; } } @@ -195,9 +221,6 @@ hp_init_card(dev); return 0; -out1: - kfree(dev->priv); - dev->priv = NULL; out: release_region(ioaddr, HP_IO_EXTENT); return retval; @@ -372,7 +395,7 @@ #ifdef MODULE #define MAX_HP_CARDS 4 /* Max number of HP cards per module */ -static struct net_device dev_hp[MAX_HP_CARDS]; +static struct net_device *dev_hp[MAX_HP_CARDS]; static int io[MAX_HP_CARDS]; static int irq[MAX_HP_CARDS]; @@ -388,27 +411,33 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) { - struct net_device *dev = &dev_hp[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->init = hp_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "hp.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + if (do_hp_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_hp[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -417,14 +446,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) { - struct net_device *dev = &dev_hp[this_dev]; - if (dev->priv != NULL) { - int ioaddr = dev->base_addr - NIC_OFFSET; - void *priv = dev->priv; - free_irq(dev->irq, dev); - release_region(ioaddr, HP_IO_EXTENT); + struct net_device *dev = dev_hp[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/hp100.c b/drivers/net/hp100.c --- a/drivers/net/hp100.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hp100.c Tue Feb 17 20:00:06 2004 @@ -118,8 +118,6 @@ #include #include -typedef struct net_device_stats hp100_stats_t; - #include "hp100.h" /* @@ -130,23 +128,8 @@ #define HP100_BUS_EISA 1 #define HP100_BUS_PCI 2 -#ifndef PCI_DEVICE_ID_HP_J2585B -#define PCI_DEVICE_ID_HP_J2585B 0x1031 -#endif -#ifndef PCI_VENDOR_ID_COMPEX -#define PCI_VENDOR_ID_COMPEX 0x11f6 -#endif -#ifndef PCI_DEVICE_ID_COMPEX_ENET100VG4 -#define PCI_DEVICE_ID_COMPEX_ENET100VG4 0x0112 -#endif -#ifndef PCI_VENDOR_ID_COMPEX2 -#define PCI_VENDOR_ID_COMPEX2 0x101a -#endif -#ifndef PCI_DEVICE_ID_COMPEX2_100VG -#define PCI_DEVICE_ID_COMPEX2_100VG 0x0005 -#endif - #define HP100_REGION_SIZE 0x20 /* for ioports */ +#define HP100_SIG_LEN 8 /* same as EISA_SIG_LEN */ #define HP100_MAX_PACKET_SIZE (1536+4) #define HP100_MIN_PACKET_SIZE 60 @@ -165,20 +148,9 @@ * structures */ -struct hp100_eisa_id { - u_int id; - const char *name; - u_char bus; -}; - -struct hp100_pci_id { - u_short vendor; - u_short device; -}; - struct hp100_private { - struct hp100_eisa_id *id; spinlock_t lock; + char id[HP100_SIG_LEN]; u_short chip; u_short soft_model; u_int memory_size; @@ -196,7 +168,7 @@ u_char mac1_mode; u_char mac2_mode; u_char hash_bytes[8]; - hp100_stats_t stats; + struct net_device_stats stats; /* Rings for busmaster mode: */ hp100_ring_t *rxrhead; /* Head (oldest) index into rxring */ @@ -216,83 +188,36 @@ /* * variables */ - -static struct hp100_eisa_id hp100_eisa_ids[] = { - - /* 10/100 EISA card with revision A Cascade chip */ - {0x80F1F022, "HP J2577 rev A", HP100_BUS_EISA}, - - /* 10/100 ISA card with revision A Cascade chip */ - {0x50F1F022, "HP J2573 rev A", HP100_BUS_ISA}, - - /* 10 only EISA card with Cascade chip */ - {0x2019F022, "HP 27248B", HP100_BUS_EISA}, - - /* 10/100 EISA card with Cascade chip */ - {0x4019F022, "HP J2577", HP100_BUS_EISA}, - - /* 10/100 ISA card with Cascade chip */ - {0x5019F022, "HP J2573", HP100_BUS_ISA}, - - /* 10/100 EISA card with AT&T chip */ - {0x9019f022, "HP J2577", HP100_BUS_EISA }, - - /* 10/100 PCI card - old J2585A */ - {0x1030103c, "HP J2585A", HP100_BUS_PCI}, - - /* 10/100 PCI card - new J2585B - master capable */ - {0x1041103c, "HP J2585B", HP100_BUS_PCI}, - - /* 10 Mbit Combo Adapter */ - {0x1042103c, "HP J2970", HP100_BUS_PCI}, - - /* 10 Mbit 10baseT Adapter */ - {0x1040103c, "HP J2973", HP100_BUS_PCI}, - - /* 10/100 EISA card from Compex */ - {0x0103180e, "ReadyLink ENET100-VG4", HP100_BUS_EISA}, - - /* 10/100 EISA card from Compex - FreedomLine (sq5bpf) */ - /* Note: plhbrod@mbox.vol.cz reported that same ID have ISA */ - /* version of adapter, too... */ - {0x0104180e, "FreedomLine 100/VG", HP100_BUS_EISA}, - - /* 10/100 PCI card from Compex - FreedomLine - * - * I think this card doesn't like aic7178 scsi controller, but - * I haven't tested this much. It works fine on diskless machines. - * Jacek Lipkowski - */ - {0x021211f6, "FreedomLine 100/VG", HP100_BUS_PCI}, - - /* 10/100 PCI card from Compex (J2585A compatible) */ - {0x011211f6, "ReadyLink ENET100-VG4", HP100_BUS_PCI}, - - /* 10/100 PCI card from KTI */ - {0x40008e2e, "KTI DP-200", HP100_BUS_PCI } +static const char *hp100_isa_tbl[] = { + "HWPF150", /* HP J2573 rev A */ + "HWP1950", /* HP J2573 */ }; -#define HP100_EISA_IDS_SIZE (sizeof(hp100_eisa_ids)/sizeof(struct hp100_eisa_id)) - -#ifdef CONFIG_PCI -static struct hp100_pci_id hp100_pci_ids[] = { - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A}, - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B}, - {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4}, - {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG} +#ifdef CONFIG_EISA +static struct eisa_device_id hp100_eisa_tbl[] = { + { "HWPF180" }, /* HP J2577 rev A */ + { "HWP1920" }, /* HP 27248B */ + { "HWP1940" }, /* HP J2577 */ + { "HWP1990" }, /* HP J2577 */ + { "CPX0301" }, /* ReadyLink ENET100-VG4 */ + { "CPX0401" }, /* FreedomLine 100/VG */ }; +MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl); #endif -#define HP100_PCI_IDS_SIZE (sizeof(hp100_pci_ids)/sizeof(struct hp100_pci_id)) - +#ifdef CONFIG_PCI static struct pci_device_id hp100_pci_tbl[] = { {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A, PCI_ANY_ID, PCI_ANY_ID,}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B, PCI_ANY_ID, PCI_ANY_ID,}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2970A, PCI_ANY_ID, PCI_ANY_ID,}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2973A, PCI_ANY_ID, PCI_ANY_ID,}, {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4, PCI_ANY_ID, PCI_ANY_ID,}, {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG, PCI_ANY_ID, PCI_ANY_ID,}, +/* {PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_DP200, PCI_ANY_ID, PCI_ANY_ID }, */ {} /* Terminating entry */ }; MODULE_DEVICE_TABLE(pci, hp100_pci_tbl); +#endif static int hp100_rx_ratio = HP100_DEFAULT_RX_RATIO; static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX; @@ -316,7 +241,7 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev); static void hp100_rx(struct net_device *dev); -static hp100_stats_t *hp100_get_stats(struct net_device *dev); +static struct net_device_stats *hp100_get_stats(struct net_device *dev); static void hp100_misc_interrupt(struct net_device *dev); static void hp100_update_stats(struct net_device *dev); static void hp100_clear_stats(struct hp100_private *lp, int ioaddr); @@ -370,196 +295,180 @@ * since this could cause problems when the card is not installed. */ -int __init hp100_probe(struct net_device *dev) +/* + * Read board id and convert to string. + * Effectively same code as decode_eisa_sig + */ +static __init const char *hp100_read_id(int ioaddr) { - int base_addr = dev ? dev->base_addr : 0; - int ioaddr = 0; - int pci_start_index = 0; + int i; + static char str[HP100_SIG_LEN]; + unsigned char sig[4], sum; + unsigned short rev; -#ifdef HP100_DEBUG_B - hp100_outw(0x4200, TRACE); - printk("hp100: %s: probe\n", dev->name); -#endif + hp100_page(ID_MAC_ADDR); + sum = 0; + for (i = 0; i < 4; i++) { + sig[i] = hp100_inb(BOARD_ID + i); + sum += sig[i]; + } - if (base_addr > 0xff) { /* Check a single specified location. */ - if (check_region(base_addr, HP100_REGION_SIZE)) - return -EINVAL; - if (base_addr < 0x400) - return hp100_probe1(dev, base_addr, HP100_BUS_ISA, - NULL); - if (EISA_bus && base_addr >= 0x1c38 && ((base_addr - 0x1c38) & 0x3ff) == 0) - return hp100_probe1(dev, base_addr, HP100_BUS_EISA, NULL); -#ifdef CONFIG_PCI - printk("hp100: %s: You must specify card # in i/o address parameter for PCI bus...", dev->name); -#else - return -ENODEV; -#endif - } else -#ifdef CONFIG_PCI - if (base_addr > 0 && base_addr < 8 + 1) - pci_start_index = 0x100 | (base_addr - 1); - else -#endif - if (base_addr != 0) - return -ENXIO; + sum += hp100_inb(BOARD_ID + i); + if (sum != 0xff) + return NULL; /* bad checksum */ - /* First: scan PCI bus(es) */ + str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1); + str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1); + str[2] = (sig[1] & 0x1f) + ('A' - 1); + rev = (sig[2] << 8) | sig[3]; + sprintf(str + 3, "%04X", rev); -#ifdef CONFIG_PCI - { - int pci_index; - struct pci_dev *pci_dev = NULL; - int pci_id_index; - u_short pci_command; - -#ifdef HP100_DEBUG_PCI - printk("hp100: %s: PCI BIOS is present, checking for devices..\n", dev->name); -#endif - pci_index = 0; - for (pci_id_index = 0; pci_id_index < HP100_PCI_IDS_SIZE; - pci_id_index++) { - while ((pci_dev = pci_find_device(hp100_pci_ids[pci_id_index].vendor, - hp100_pci_ids[pci_id_index].device, - pci_dev)) != NULL) { - if (pci_index < (pci_start_index & 7)) { - pci_index++; - continue; - } - if (pci_enable_device(pci_dev)) - continue; - /* found... */ - ioaddr = pci_resource_start(pci_dev, 0); - if (check_region(ioaddr, HP100_REGION_SIZE)) - continue; - pci_read_config_word(pci_dev, PCI_COMMAND, &pci_command); - if (!(pci_command & PCI_COMMAND_IO)) { -#ifdef HP100_DEBUG - printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name); -#endif - pci_command |= PCI_COMMAND_IO; - pci_write_config_word(pci_dev, PCI_COMMAND, pci_command); - } - if (!(pci_command & PCI_COMMAND_MASTER)) { -#ifdef HP100_DEBUG - printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name); -#endif - pci_command |= PCI_COMMAND_MASTER; - pci_write_config_word(pci_dev, PCI_COMMAND, pci_command); - } -#ifdef HP100_DEBUG - printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr); -#endif - if (hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pci_dev) == 0) - return 0; - } - } - } - if (pci_start_index > 0) - return -ENODEV; -#endif /* CONFIG_PCI */ + return str; +} - /* Second: Probe all EISA possible port regions (if EISA bus present) */ - for (ioaddr = 0x1c38; EISA_bus && ioaddr < 0x10000; ioaddr += 0x400) { - if (check_region(ioaddr, HP100_REGION_SIZE)) - continue; - if (hp100_probe1(dev, ioaddr, HP100_BUS_EISA, NULL) == 0) - return 0; - } +static __init int hp100_isa_probe1(struct net_device *dev, int addr) +{ + const char *sig; + int i; + + if (!request_region(addr, HP100_REGION_SIZE, "hp100")) + goto err; + + sig = hp100_read_id(addr); + release_region(addr, HP100_REGION_SIZE); + + if (sig == NULL) + goto err; + + for (i = 0; i < ARRAY_SIZE(hp100_isa_tbl); i++) { + if (!strcmp(hp100_isa_tbl[i], sig)) + break; - /* Third: Probe all ISA possible port regions */ - for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20) { - if (check_region(ioaddr, HP100_REGION_SIZE)) - continue; - if (hp100_probe1(dev, ioaddr, HP100_BUS_ISA, NULL) == 0) - return 0; } + if (i < ARRAY_SIZE(hp100_isa_tbl)) + return hp100_probe1(dev, addr, HP100_BUS_ISA, NULL); + err: return -ENODEV; + +} +/* + * Probe for ISA board. + * EISA and PCI are handled by device infrastructure. + */ + +static int __init hp100_isa_probe(struct net_device *dev, int addr) +{ + int err = -ENODEV; + + /* Probe for a specific ISA address */ + if (addr > 0xff && addr < 0x400) + err = hp100_isa_probe1(dev, addr); + + else if (addr != 0) + err = -ENXIO; + + else { + /* Probe all ISA possible port regions */ + for (addr = 0x100; addr < 0x400; addr += 0x20) { + err = hp100_isa_probe1(dev, addr); + if (!err) + break; + } + } + return err; +} + + +struct net_device * __init hp100_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); + int err; + + if (!dev) + return ERR_PTR(-ENODEV); + + SET_MODULE_OWNER(dev); + +#ifdef HP100_DEBUG_B + hp100_outw(0x4200, TRACE); + printk("hp100: %s: probe\n", dev->name); +#endif + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } + + err = hp100_isa_probe(dev, dev->base_addr); + if (err) + goto out; + + err = register_netdev(dev); + if (err) + goto out1; + return dev; + out1: + release_region(dev->base_addr, HP100_REGION_SIZE); + out: + free_netdev(dev); + return ERR_PTR(err); } static int __init hp100_probe1(struct net_device *dev, int ioaddr, u_char bus, struct pci_dev *pci_dev) { int i; - - u_char uc, uc_1; - u_int eisa_id; + int err = -ENODEV; + const char *eid; u_int chip; + u_char uc; u_int memory_size = 0, virt_memory_size = 0; u_short local_mode, lsw; short mem_mapped; unsigned long mem_ptr_phys; void **mem_ptr_virt; struct hp100_private *lp; - struct hp100_eisa_id *eid; #ifdef HP100_DEBUG_B hp100_outw(0x4201, TRACE); printk("hp100: %s: probe1\n", dev->name); #endif - if (dev == NULL) { -#ifdef HP100_DEBUG - printk("hp100_probe1: %s: dev == NULL ?\n", dev->name); -#endif - return -EIO; - } + /* memory region for programmed i/o */ + if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100")) + goto out1; - if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE) { - return -ENODEV; - } else { - chip = hp100_inw(PAGING) & HP100_CHIPID_MASK; + if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE) + goto out2; + + chip = hp100_inw(PAGING) & HP100_CHIPID_MASK; #ifdef HP100_DEBUG - if (chip == HP100_CHIPID_SHASTA) - printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name); - else if (chip == HP100_CHIPID_RAINIER) - printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name); - else if (chip == HP100_CHIPID_LASSEN) - printk("hp100: %s: Lassen Chip detected.\n", dev->name); - else - printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip); + if (chip == HP100_CHIPID_SHASTA) + printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name); + else if (chip == HP100_CHIPID_RAINIER) + printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name); + else if (chip == HP100_CHIPID_LASSEN) + printk("hp100: %s: Lassen Chip detected.\n", dev->name); + else + printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip); #endif - } dev->base_addr = ioaddr; - hp100_page(ID_MAC_ADDR); - for (i = uc = eisa_id = 0; i < 4; i++) { - eisa_id >>= 8; - uc_1 = hp100_inb(BOARD_ID + i); - eisa_id |= uc_1 << 24; - uc += uc_1; - } - uc += hp100_inb(BOARD_ID + 4); - - if (uc != 0xff) { /* bad checksum? */ - printk("hp100_probe: %s: bad EISA ID checksum at base port 0x%x\n", dev->name, ioaddr); - return -ENODEV; - } - - for (i = 0; i < HP100_EISA_IDS_SIZE; i++) - if (hp100_eisa_ids[i].id == eisa_id) - break; - if (i >= HP100_EISA_IDS_SIZE) { - for (i = 0; i < HP100_EISA_IDS_SIZE; i++) - if ((hp100_eisa_ids[i].id & 0xf0ffffff) == (eisa_id & 0xf0ffffff)) - break; - if (i >= HP100_EISA_IDS_SIZE) { - printk ("hp100_probe: %s: card at port 0x%x isn't known (id = 0x%x)\n", dev->name, ioaddr, eisa_id); - return -ENODEV; - } - } - eid = &hp100_eisa_ids[i]; - if ((eid->id & 0x0f000000) < (eisa_id & 0x0f000000)) { - printk("hp100_probe: %s: newer version of card %s at port 0x%x - unsupported\n", dev->name, eid->name, ioaddr); - return -ENODEV; + eid = hp100_read_id(ioaddr); + if (eid == NULL) { /* bad checksum? */ + printk(KERN_WARNING "hp100_probe: bad ID checksum at base port 0x%x\n", ioaddr); + goto out2; } + hp100_page(ID_MAC_ADDR); for (i = uc = 0; i < 7; i++) uc += hp100_inb(LAN_ADDR + i); if (uc != 0xff) { - printk("hp100_probe: %s: bad lan address checksum (card %s at port 0x%x)\n", dev->name, eid->name, ioaddr); - return -EIO; + printk(KERN_WARNING "hp100_probe: bad lan address checksum at port 0x%x)\n", ioaddr); + err = -EIO; + goto out2; } /* Make sure, that all registers are correctly updated... */ @@ -607,17 +516,17 @@ hp100_outw(HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW); hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW); hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW); - printk("hp100: %s: IO mapped mode forced.\n", dev->name); + printk("hp100: IO mapped mode forced.\n"); } else if (local_mode == 2) { hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW); hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW); hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW); - printk("hp100: %s: Shared memory mode requested.\n", dev->name); + printk("hp100: Shared memory mode requested.\n"); } else if (local_mode == 4) { if (chip == HP100_CHIPID_LASSEN) { hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_SET_HB, OPTION_LSW); hp100_outw(HP100_IO_EN | HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW); - printk("hp100: %s: Busmaster mode requested.\n", dev->name); + printk("hp100: Busmaster mode requested.\n"); } local_mode = 1; } @@ -643,7 +552,7 @@ /* Gracefully fallback to shared memory */ goto busmasterfail; } - printk("hp100: %s: Busmaster mode enabled.\n", dev->name); + printk("hp100: Busmaster mode enabled.\n"); hp100_outw(HP100_MEM_EN | HP100_IO_EN | HP100_RESET_LB, OPTION_LSW); } else { busmasterfail: @@ -675,7 +584,7 @@ mem_ptr_phys &= ~0x1fff; /* 8k alignment */ if (bus == HP100_BUS_ISA && (mem_ptr_phys & ~0xfffff) != 0) { - printk("hp100: %s: Can only use programmed i/o mode.\n", dev->name); + printk("hp100: Can only use programmed i/o mode.\n"); mem_ptr_phys = 0; mem_mapped = 0; local_mode = 3; /* Use programmed i/o */ @@ -699,7 +608,7 @@ } if (mem_ptr_virt == NULL) { /* all ioremap tries failed */ - printk("hp100: %s: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n", dev->name); + printk("hp100: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n"); local_mode = 3; virt_memory_size = 0; } @@ -710,17 +619,14 @@ mem_mapped = 0; mem_ptr_phys = 0; mem_ptr_virt = NULL; - printk("hp100: %s: Using (slow) programmed i/o mode.\n", dev->name); + printk("hp100: Using (slow) programmed i/o mode.\n"); } /* Initialise the "private" data structure for this card. */ - if ((dev->priv = kmalloc(sizeof(struct hp100_private), GFP_KERNEL)) == NULL) - return -ENOMEM; - lp = (struct hp100_private *) dev->priv; - memset(lp, 0, sizeof(struct hp100_private)); + spin_lock_init(&lp->lock); - lp->id = eid; + strlcpy(lp->id, eid, HP100_SIG_LEN); lp->chip = chip; lp->mode = local_mode; lp->bus = bus; @@ -741,9 +647,6 @@ lp->virt_memory_size = virt_memory_size; lp->rx_ratio = hp100_rx_ratio; /* can be conf'd with insmod */ - /* memory region for programmed i/o */ - request_region(dev->base_addr, HP100_REGION_SIZE, eid->name); - dev->open = hp100_open; dev->stop = hp100_close; @@ -776,10 +679,6 @@ /* Reset statistics (counters) */ hp100_clear_stats(lp, ioaddr); - SET_MODULE_OWNER(dev); - SET_NETDEV_DEV(dev, &pci_dev->dev); - ether_setup(dev); - /* If busmaster mode is wanted, a dma-capable memory area is needed for * the rx and tx PDLs * PCI cards can access the whole PC memory. Therefore GFP_DMA is not @@ -795,8 +694,10 @@ /* Conversion to new PCI API : * Pages are always aligned and zeroed, no need to it ourself. * Doc says should be OK for EISA bus as well - Jean II */ - if ((lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr)) == NULL) - return -ENOMEM; + if ((lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr)) == NULL) { + err = -ENOMEM; + goto out2; + } lp->whatever_offset = ((u_long) page_baddr) - ((u_long) lp->page_vaddr_algn); #ifdef HP100_DEBUG_BM @@ -818,7 +719,7 @@ lp->lan_type = hp100_sense_lan(dev); /* Print out a message what about what we think we have probed. */ - printk("hp100: %s: %s at 0x%x, IRQ %d, ", dev->name, lp->id->name, ioaddr, dev->irq); + printk("hp100: at 0x%x, IRQ %d, ", ioaddr, dev->irq); switch (bus) { case HP100_BUS_EISA: printk("EISA"); @@ -833,7 +734,7 @@ printk(" bus, %dk SRAM (rx/tx %d%%).\n", lp->memory_size >> 10, lp->rx_ratio); if (lp->mode == 2) { /* memory mapped */ - printk("hp100: %s: Memory area at 0x%lx-0x%lx", dev->name, mem_ptr_phys, + printk("hp100: Memory area at 0x%lx-0x%lx", mem_ptr_phys, (mem_ptr_phys + (mem_ptr_phys > 0x100000 ? (u_long) lp->memory_size : 16 * 1024)) - 1); if (mem_ptr_virt) printk(" (virtual base %p)", mem_ptr_virt); @@ -843,7 +744,8 @@ dev->mem_start = mem_ptr_phys; dev->mem_end = mem_ptr_phys + lp->memory_size; } - printk("hp100: %s: ", dev->name); + + printk("hp100: "); if (lp->lan_type != HP100_LAN_ERR) printk("Adapter is attached to "); switch (lp->lan_type) { @@ -861,6 +763,10 @@ } return 0; +out2: + release_region(ioaddr, HP100_REGION_SIZE); +out1: + return -ENODEV; } /* This procedure puts the card into a stable init state */ @@ -950,6 +856,7 @@ /* Finally try to log in the Hub if there may be a VG connection. */ if ((lp->lan_type == HP100_LAN_100) || (lp->lan_type == HP100_LAN_ERR)) hp100_login_to_vg_hub(dev, 0); /* relogin */ + } @@ -1152,7 +1059,7 @@ if (request_irq(dev->irq, hp100_interrupt, lp->bus == HP100_BUS_PCI || lp->bus == HP100_BUS_EISA ? SA_SHIRQ : SA_INTERRUPT, - lp->id->name, dev)) { + "hp100", dev)) { printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq); return -EAGAIN; } @@ -2054,7 +1961,7 @@ /* * statistics */ -static hp100_stats_t *hp100_get_stats(struct net_device *dev) +static struct net_device_stats *hp100_get_stats(struct net_device *dev) { unsigned long flags; int ioaddr = dev->base_addr; @@ -2558,10 +2465,14 @@ return HP100_LAN_COAX; } - if ((lp->id->id == 0x02019F022) || - (lp->id->id == 0x01042103c) || (lp->id->id == 0x01040103c)) - return HP100_LAN_ERR; /* Those cards don't have a 100 Mbit connector */ - + /* Those cards don't have a 100 Mbit connector */ + if ( !strcmp(lp->id, "HWP1920") || + (lp->pci_dev && + lp->pci_dev->vendor == PCI_VENDOR_ID && + (lp->pci_dev->device == PCI_DEVICE_ID_HP_J2970A || + lp->pci_dev->device == PCI_DEVICE_ID_HP_J2973A))) + return HP100_LAN_ERR; + if (val_VG & HP100_LINK_CABLE_ST) /* Can hear the HUBs tone. */ return HP100_LAN_100; return HP100_LAN_ERR; @@ -2915,121 +2826,247 @@ #endif +static void cleanup_dev(struct net_device *d) +{ + struct hp100_private *p = (struct hp100_private *) d->priv; + + unregister_netdev(d); + release_region(d->base_addr, HP100_REGION_SIZE); + + if (p->mode == 1) /* busmaster */ + pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f, + p->page_vaddr_algn, + virt_to_whatever(d, p->page_vaddr_algn)); + if (p->mem_ptr_virt) + iounmap(p->mem_ptr_virt); + + free_netdev(d); +} + +#ifdef CONFIG_EISA +static int __init hp100_eisa_probe (struct device *gendev) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); + struct eisa_device *edev = to_eisa_device(gendev); + int err; + + if (!dev) + return -ENOMEM; + + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &edev->dev); + + err = hp100_probe1(dev, edev->base_addr, HP100_BUS_EISA, NULL); + if (err) + goto out1; + + err = register_netdev(dev); + if (err) + goto out2; + +#ifdef HP100_DEBUG + printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name, + dev->base_addr); +#endif + gendev->driver_data = dev; + return 0; + out2: + release_region(dev->base_addr, HP100_REGION_SIZE); + out1: + free_netdev(dev); + return err; +} + +static int __devexit hp100_eisa_remove (struct device *gendev) +{ + struct net_device *dev = gendev->driver_data; + cleanup_dev(dev); + return 0; +} + +static struct eisa_driver hp100_eisa_driver = { + .id_table = hp100_eisa_tbl, + .driver = { + .name = "hp100", + .probe = hp100_eisa_probe, + .remove = __devexit_p (hp100_eisa_remove), + } +}; +#endif + +#ifdef CONFIG_PCI +static int __devinit hp100_pci_probe (struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); + int ioaddr = pci_resource_start(pdev, 0); + u_short pci_command; + int err; + + if (!dev) + return -ENOMEM; + + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); + + pci_read_config_word(pdev, PCI_COMMAND, &pci_command); + if (!(pci_command & PCI_COMMAND_IO)) { +#ifdef HP100_DEBUG + printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name); +#endif + pci_command |= PCI_COMMAND_IO; + pci_write_config_word(pdev, PCI_COMMAND, pci_command); + } + + if (!(pci_command & PCI_COMMAND_MASTER)) { +#ifdef HP100_DEBUG + printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name); +#endif + pci_command |= PCI_COMMAND_MASTER; + pci_write_config_word(pdev, PCI_COMMAND, pci_command); + } + + + err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev); + if (err) + goto out1; + err = register_netdev(dev); + if (err) + goto out2; + +#ifdef HP100_DEBUG + printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr); +#endif + pci_set_drvdata(pdev, dev); + return 0; + out2: + release_region(dev->base_addr, HP100_REGION_SIZE); + out1: + free_netdev(dev); + return err; +} + +static void __devexit hp100_pci_remove (struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + + cleanup_dev(dev); +} + + +static struct pci_driver hp100_pci_driver = { + .name = "hp100", + .id_table = hp100_pci_tbl, + .probe = hp100_pci_probe, + .remove = __devexit_p(hp100_pci_remove), +}; +#endif + /* * module section */ -#ifdef MODULE - MODULE_LICENSE("GPL"); MODULE_AUTHOR("Jaroslav Kysela , " "Siegfried \"Frieder\" Loeffler (dg1sek) "); MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters"); /* - * Note: if you have more than five 100vg cards in your pc, feel free to - * increase this value - */ - -#define HP100_DEVICES 5 - -/* - * Note: to register three eisa or pci devices, use: + * Note: to register three isa devices, use: * option hp100 hp100_port=0,0,0 * to register one card at io 0x280 as eth239, use: - * option hp100 hp100_port=0x280 hp100_name=eth239 + * option hp100 hp100_port=0x280 */ - +#if defined(MODULE) && defined(CONFIG_ISA) +#define HP100_DEVICES 5 /* Parameters set by insmod */ static int hp100_port[HP100_DEVICES] = { 0, [1 ... (HP100_DEVICES-1)] = -1 }; MODULE_PARM(hp100_port, "1-" __MODULE_STRING(HP100_DEVICES) "i"); -/* Allocate HP100_DEVICES strings of length IFNAMSIZ, one string for each device */ -static char hp100_name[HP100_DEVICES][IFNAMSIZ] = { "", "", "", "", "" }; -/* Allow insmod to write those HP100_DEVICES strings individually */ -MODULE_PARM(hp100_name, "1-" __MODULE_STRING(HP100_DEVICES) "c" __MODULE_STRING(IFNAMSIZ)); - /* List of devices */ static struct net_device *hp100_devlist[HP100_DEVICES]; -static void release_dev(int i) +static int __init hp100_isa_init(void) { - struct net_device *d = hp100_devlist[i]; - struct hp100_private *p = (struct hp100_private *) d->priv; + struct net_device *dev; + int i, err, cards = 0; - unregister_netdev(d); - release_region(d->base_addr, HP100_REGION_SIZE); + /* Don't autoprobe ISA bus */ + if (hp100_port[0] == 0) + return -ENODEV; - if (p->mode == 1) /* busmaster */ - pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f, p->page_vaddr_algn, virt_to_whatever(d, p->page_vaddr_algn)); - if (p->mem_ptr_virt) - iounmap(p->mem_ptr_virt); - kfree(d->priv); - d->priv = NULL; - free_netdev(d); - hp100_devlist[i] = NULL; + /* Loop on all possible base addresses */ + for (i = 0; i < HP100_DEVICES && hp100_port[i] != -1; ++i) { + dev = alloc_etherdev(sizeof(struct hp100_private)); + if (!dev) { + printk(KERN_WARNING "hp100: no memory for network device\n"); + while (cards > 0) + cleanup_dev(hp100_devlist[--cards]); + + return -ENOMEM; + } + SET_MODULE_OWNER(dev); + + err = hp100_isa_probe(dev, hp100_port[i]); + if (!err) { + err = register_netdev(dev); + if (!err) + hp100_devlist[cards++] = dev; + else + release_region(dev->base_addr, HP100_REGION_SIZE); + } + + if (err) + free_netdev(dev); + } + + return cards > 0 ? 0 : -ENODEV; } -static int __init hp100_module_init(void) +static void __exit hp100_isa_cleanup(void) { - int i, cards; + int i; -#ifndef CONFIG_PCI - if (hp100_port == 0 && !EISA_bus) - printk("hp100: You should not use auto-probing with insmod!\n"); + for (i = 0; i < HP100_DEVICES; i++) { + struct net_device *dev = hp100_devlist[i]; + if (dev) + cleanup_dev(dev); + } +} +#else +#define hp100_isa_init() (0) +#define hp100_isa_cleanup() do { } while(0) #endif - /* Loop on all possible base addresses */ - i = -1; - cards = 0; - while ((hp100_port[++i] != -1) && (i < HP100_DEVICES)) { - /* Create device and set basics args */ - hp100_devlist[i] = kmalloc(sizeof(struct net_device), GFP_KERNEL); - if (!hp100_devlist[i]) - goto fail; - memset(hp100_devlist[i], 0x00, sizeof(struct net_device)); -#if LINUX_VERSION_CODE >= 0x020362 /* 2.3.99-pre7 */ - memcpy(hp100_devlist[i]->name, hp100_name[i], IFNAMSIZ); /* Copy name */ -#else - hp100_devlist[i]->name = hp100_name[i]; -#endif /* LINUX_VERSION_CODE >= 0x020362 */ - hp100_devlist[i]->base_addr = hp100_port[i]; - hp100_devlist[i]->init = &hp100_probe; - - /* Try to create the device */ - if (register_netdev(hp100_devlist[i]) != 0) { - /* DeAllocate everything */ - /* Note: if dev->priv is mallocated, there is no way to fail */ - kfree(hp100_devlist[i]); - hp100_devlist[i] = (struct net_device *) NULL; - } else - cards++; - } /* Loop over all devices */ +static int __init hp100_module_init(void) +{ + int err; - return cards > 0 ? 0 : -ENODEV; - fail: - while (cards && --i) - if (hp100_devlist[i]) { - release_dev(i); - --cards; - } - return -ENOMEM; + err = hp100_isa_init(); + +#ifdef CONFIG_EISA + err |= eisa_driver_register(&hp100_eisa_driver); +#endif +#ifdef CONFIG_PCI + err |= pci_module_init(&hp100_pci_driver); +#endif + return err; } + static void __exit hp100_module_exit(void) { - int i; - - /* TODO: Check if all skb's are released/freed. */ - for (i = 0; i < HP100_DEVICES; i++) - if (hp100_devlist[i] != (struct net_device *) NULL) - release_dev(i); + hp100_isa_cleanup(); +#ifdef CONFIG_EISA + eisa_driver_unregister (&hp100_eisa_driver); +#endif +#ifdef CONFIG_PCI + pci_unregister_driver (&hp100_pci_driver); +#endif } module_init(hp100_module_init) module_exit(hp100_module_exit) - -#endif /* MODULE */ /* diff -Nru a/drivers/net/hplance.c b/drivers/net/hplance.c --- a/drivers/net/hplance.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hplance.c Tue Feb 17 20:00:06 2004 @@ -50,8 +50,7 @@ * plus board-specific init, open and close actions. * Oh, and we need to tell the generic code how to read and write LANCE registers... */ -int hplance_probe(struct net_device *dev); -static int hplance_init(struct net_device *dev, int scode); +static void hplance_init(struct net_device *dev, int scode); static int hplance_open(struct net_device *dev); static int hplance_close(struct net_device *dev); static void hplance_writerap(void *priv, unsigned short value); @@ -62,57 +61,61 @@ static struct hplance_private *root_hplance_dev; #endif +static void cleanup_card(struct net_device *dev) +{ + struct hplance_private *lp = dev->priv; + dio_unconfig_board(lp->scode); +} + /* Find all the HP Lance boards and initialise them... */ -int __init hplance_probe(struct net_device *dev) +struct net_device * __init hplance_probe(int unit) { - int cards = 0, called = 0; + struct net_device *dev; + + if (!MACH_IS_HP300) + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(sizeof(struct hplance_private)); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } - if (!MACH_IS_HP300 || called) - return(ENODEV); - called++; + SET_MODULE_OWNER(dev); /* Isn't DIO nice? */ for(;;) { - int v, scode = dio_find(DIO_ID_LAN); + int scode = dio_find(DIO_ID_LAN); if (!scode) break; - if(cards) - dev = NULL; /* don't trash previous device, make a new one */ - cards++; - - v = hplance_init(dev, scode); - if (v) /* error, abort immediately */ - return v; + dio_config_board(scode); + hplance_init(dev, scode); + if (!register_netdev(dev)) { + struct hplance_private *lp = dev->priv; + lp->next_module = root_hplance_dev; + root_hplance_dev = lp; + return dev; + } + cleanup_card(dev); } - /* OK, return success, or ENODEV if we didn't find any cards */ - if (!cards) - return -ENODEV; - return 0; + free_netdev(dev); + return ERR_PTR(-ENODEV); } /* Initialise a single lance board at the given select code */ -static int __init hplance_init(struct net_device *dev, int scode) +static void __init hplance_init(struct net_device *dev, int scode) { const char *name = dio_scodetoname(scode); void *va = dio_scodetoviraddr(scode); struct hplance_private *lp; int i; -#ifdef MODULE - dev = init_etherdev(0, sizeof(struct hplance_private)); - if (!dev) - return -ENOMEM; -#else - dev->priv = kmalloc(sizeof(struct hplance_private), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct hplance_private)); -#endif - SET_MODULE_OWNER(dev); - printk("%s: %s; select code %d, addr", dev->name, name, scode); /* reset the board */ @@ -154,17 +157,7 @@ lp->lance.tx_ring_mod_mask = TX_RING_MOD_MASK; lp->scode = scode; lp->base = va; - ether_setup(dev); printk(", irq %d\n", lp->lance.irq); - -#ifdef MODULE - dev->ifindex = dev_new_index(); - lp->next_module = root_hplance_dev; - root_hplance_dev = lp; -#endif /* MODULE */ - - dio_config_board(scode); /* tell bus scanning code this one's taken */ - return 0; } /* This is disgusting. We have to check the DIO status register for ack every @@ -227,8 +220,10 @@ MODULE_LICENSE("GPL"); int init_module(void) { - root_lance_dev = NULL; - return hplance_probe(NULL); + int found = 0; + while (!IS_ERR(hplance_probe(-1))) + found++; + return found ? 0 : -ENODEV; } void cleanup_module(void) @@ -237,8 +232,8 @@ struct hplance_private *lp; while (root_hplance_dev) { lp = root_hplance_dev->next_module; - dio_unconfig_board(lp->scode); unregister_netdev(root_lance_dev->dev); + cleanup_card(root_lance_dev->dev); free_netdev(root_lance_dev->dev); root_lance_dev = lp; } diff -Nru a/drivers/net/hydra.c b/drivers/net/hydra.c --- a/drivers/net/hydra.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/hydra.c Tue Feb 17 20:00:06 2004 @@ -89,13 +89,14 @@ const char name[] = "NE2000"; int start_page, stop_page; int j; + int err; static u32 hydra_offsets[16] = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, }; - dev = init_etherdev(NULL, 0); + dev = alloc_ei_netdev(); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); @@ -113,13 +114,9 @@ /* Install the Interrupt handler */ if (request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, "Hydra Ethernet", - dev)) + dev)) { + free_netdev(dev); return -EAGAIN; - - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk("Unable to get memory for dev->priv.\n"); - return -ENOMEM; } printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, ZTWO_PADDR(board), @@ -146,7 +143,13 @@ root_hydra_dev = dev; #endif NS8390_init(dev, 0); - return 0; + err = register_netdev(dev); + if (!err) + return 0; + + free_irq(IRQ_AMIGA_PORTS, dev); + free_netdev(dev); + return err; } static int hydra_open(struct net_device *dev) diff -Nru a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c --- a/drivers/net/ibmlana.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ibmlana.c Tue Feb 17 20:00:06 2004 @@ -906,7 +906,7 @@ static int startslot; /* counts through slots when probing multiple devices */ -int ibmlana_probe(struct net_device *dev) +static int ibmlana_probe(struct net_device *dev) { int force_detect = 0; int slot, z; @@ -924,34 +924,21 @@ if (dev->mem_start == 1) force_detect = 1; - /* search through slots */ - if (dev != NULL) { - base = dev->mem_start; - irq = dev->irq; - } - slot = mca_find_adapter(IBM_LANA_ID, startslot); + base = dev->mem_start; + irq = dev->irq; - while (slot != -1) { + for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) { /* deduce card addresses */ getaddrs(slot, &base, &memlen, &iobase, &irq, &medium); /* slot already in use ? */ - if (mca_is_adapter_used(slot)) { - slot = mca_find_adapter(IBM_LANA_ID, slot + 1); + if (mca_is_adapter_used(slot)) continue; - } /* were we looking for something different ? */ - if (dev->irq != 0 || dev->mem_start != 0) { - if (dev->irq != 0 && dev->irq != irq) { - slot = mca_find_adapter(IBM_LANA_ID, slot + 1); - continue; - } - if (dev->mem_start != 0 && dev->mem_start != base) - { - slot = mca_find_adapter(IBM_LANA_ID, slot + 1); - continue; - } - } + if (dev->irq && dev->irq != irq) + continue; + if (dev->mem_start && dev->mem_start != base) + continue; /* found something that matches */ break; } @@ -977,16 +964,11 @@ mca_mark_as_used(slot); /* allocate structure */ - priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); - if (!priv) { - release_region(iobase, IBM_LANA_IORANGE); - return -ENOMEM; - } + priv = dev->priv; priv->slot = slot; priv->realirq = irq; priv->medium = medium; spin_lock_init(&priv->lock); - memset(&priv->stat, 0, sizeof(struct net_device_stats)); /* set base + irq for this device (irq not allocated so far) */ @@ -1006,10 +988,6 @@ dev->set_multicast_list = ibmlana_set_multicast_list; dev->flags |= IFF_MULTICAST; - /* generic setup */ - - ether_setup(dev); - /* copy out MAC address */ for (z = 0; z < sizeof(dev->dev_addr); z++) @@ -1044,7 +1022,7 @@ #define DEVMAX 5 -static struct net_device moddevs[DEVMAX]; +static struct net_device *moddevs[DEVMAX]; static int irq; static int io; @@ -1056,41 +1034,47 @@ int init_module(void) { - int z, res; + int z; startslot = 0; for (z = 0; z < DEVMAX; z++) { - moddevs[z].init = ibmlana_probe; - moddevs[z].irq = irq; - moddevs[z].base_addr = io; - res = register_netdev(moddevs + z); - if (res != 0) - return (z > 0) ? 0 : -EIO; + struct net_device *dev = alloc_etherdev(sizeof(ibmlana_priv)); + if (!dev) + break; + dev->irq = irq; + dev->base_addr = io; + if (ibmlana_probe(dev)) { + free_netdev(dev); + break; + } + if (register_netdev(dev)) { + ibmlana_priv *priv = dev->priv; + release_region(dev->base_addr, IBM_LANA_IORANGE); + mca_mark_as_unused(priv->slot); + mca_set_adapter_name(priv->slot, ""); + mca_set_adapter_procfn(priv->slot, NULL, NULL); + free_netdev(dev); + break; + } + moddevs[z] = dev; } - return 0; + return (z > 0) ? 0 : -EIO; } void cleanup_module(void) { - struct net_device *dev; - ibmlana_priv *priv; int z; - for (z = 0; z < DEVMAX; z++) { - dev = moddevs + z; - if (dev->priv != NULL) { - priv = (ibmlana_priv *) dev->priv; + struct net_device *dev = moddevs[z]; + if (dev) { + ibmlana_priv *priv = (ibmlana_priv *) dev->priv; + unregister_netdev(dev); /*DeinitBoard(dev); */ - if (dev->irq != 0) - free_irq(dev->irq, dev); - dev->irq = 0; release_region(dev->base_addr, IBM_LANA_IORANGE); - unregister_netdev(dev); mca_mark_as_unused(priv->slot); mca_set_adapter_name(priv->slot, ""); mca_set_adapter_procfn(priv->slot, NULL, NULL); - kfree(dev->priv); - dev->priv = NULL; + free_netdev(dev); } } } diff -Nru a/drivers/net/ibmlana.h b/drivers/net/ibmlana.h --- a/drivers/net/ibmlana.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ibmlana.h Tue Feb 17 20:00:08 2004 @@ -275,7 +275,4 @@ #endif /* _IBM_LANA_DRIVER_ */ -extern int ibmlana_probe(struct net_device *); - - #endif /* _IBM_LANA_INCLUDE_ */ diff -Nru a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c --- a/drivers/net/irda/ali-ircc.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/irda/ali-ircc.c Tue Feb 17 20:00:06 2004 @@ -103,7 +103,7 @@ /* SIR function */ static int ali_ircc_sir_hard_xmit(struct sk_buff *skb, struct net_device *dev); -static void ali_ircc_sir_interrupt(int irq, struct ali_ircc_cb *self, struct pt_regs *regs); +static irqreturn_t ali_ircc_sir_interrupt(struct ali_ircc_cb *self); static void ali_ircc_sir_receive(struct ali_ircc_cb *self); static void ali_ircc_sir_write_wakeup(struct ali_ircc_cb *self); static int ali_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len); @@ -112,7 +112,7 @@ /* FIR function */ static int ali_ircc_fir_hard_xmit(struct sk_buff *skb, struct net_device *dev); static void ali_ircc_fir_change_speed(struct ali_ircc_cb *priv, __u32 speed); -static void ali_ircc_fir_interrupt(int irq, struct ali_ircc_cb *self, struct pt_regs *regs); +static irqreturn_t ali_ircc_fir_interrupt(struct ali_ircc_cb *self); static int ali_ircc_dma_receive(struct ali_ircc_cb *self); static int ali_ircc_dma_receive_complete(struct ali_ircc_cb *self); static int ali_ircc_dma_xmit_complete(struct ali_ircc_cb *self); @@ -635,6 +635,7 @@ { struct net_device *dev = (struct net_device *) dev_id; struct ali_ircc_cb *self; + int ret; IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__); @@ -649,22 +650,22 @@ /* Dispatch interrupt handler for the current speed */ if (self->io.speed > 115200) - ali_ircc_fir_interrupt(irq, self, regs); + ret = ali_ircc_fir_interrupt(self); else - ali_ircc_sir_interrupt(irq, self, regs); + ret = ali_ircc_sir_interrupt(self); spin_unlock(&self->lock); IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__); - return IRQ_HANDLED; + return ret; } /* - * Function ali_ircc_fir_interrupt(irq, struct ali_ircc_cb *self, regs) + * Function ali_ircc_fir_interrupt(irq, struct ali_ircc_cb *self) * * Handle MIR/FIR interrupt * */ -static void ali_ircc_fir_interrupt(int irq, struct ali_ircc_cb *self, struct pt_regs *regs) +static irqreturn_t ali_ircc_fir_interrupt(struct ali_ircc_cb *self) { __u8 eir, OldMessageCount; int iobase, tmp; @@ -777,6 +778,7 @@ SetCOMInterrupts(self, TRUE); IRDA_DEBUG(1, "%s(), ----------------- End ---------------\n", __FUNCTION__); + return IRQ_RETVAL(eir); } /* @@ -785,7 +787,7 @@ * Handle SIR interrupt * */ -static void ali_ircc_sir_interrupt(int irq, struct ali_ircc_cb *self, struct pt_regs *regs) +static irqreturn_t ali_ircc_sir_interrupt(struct ali_ircc_cb *self) { int iobase; int iir, lsr; @@ -827,6 +829,8 @@ IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__); + + return IRQ_RETVAL(iir); } diff -Nru a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c --- a/drivers/net/irda/nsc-ircc.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/irda/nsc-ircc.c Tue Feb 17 20:00:05 2004 @@ -1949,7 +1949,7 @@ outb(bsr, iobase+BSR); /* Restore bank register */ spin_unlock(&self->lock); - return IRQ_HANDLED; + return IRQ_RETVAL(eir); } /* diff -Nru a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c --- a/drivers/net/irda/sa1100_ir.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/irda/sa1100_ir.c Tue Feb 17 20:00:06 2004 @@ -20,6 +20,7 @@ */ #include #include +#include #include #include #include @@ -358,9 +359,13 @@ static int sa1100_irda_suspend(struct device *_dev, u32 state, u32 level) { struct net_device *dev = dev_get_drvdata(_dev); - struct sa1100_irda *si = dev->priv; + struct sa1100_irda *si; + + if (!dev || level != SUSPEND_DISABLE) + return 0; - if (si && si->open && level == SUSPEND_DISABLE) { + si = dev->priv; + if (si->open) { /* * Stop the transmit queue */ @@ -379,9 +384,13 @@ static int sa1100_irda_resume(struct device *_dev, u32 level) { struct net_device *dev = dev_get_drvdata(_dev); - struct sa1100_irda *si = dev->priv; + struct sa1100_irda *si; - if (si && si->open && level == RESUME_ENABLE) { + if (!dev || level != RESUME_ENABLE) + return 0; + + si = dev->priv; + if (si->open) { /* * If we missed a speed change, initialise at the new speed * directly. It is debatable whether this is actually @@ -833,8 +842,6 @@ struct sa1100_irda *si = dev->priv; int err; - MOD_INC_USE_COUNT; - si->speed = 9600; err = request_irq(dev->irq, sa1100_irda_irq, 0, dev->name, dev); @@ -890,7 +897,6 @@ err_rx_dma: free_irq(dev->irq, dev); err_irq: - MOD_DEC_USE_COUNT; return err; } @@ -930,8 +936,6 @@ sa1100_set_power(si, 0); - MOD_DEC_USE_COUNT; - return 0; } @@ -947,56 +951,48 @@ return io->head ? 0 : -ENOMEM; } -static struct device_driver sa1100ir_driver = { - .name = "sa1100ir", - .bus = &system_bus_type, - .suspend = sa1100_irda_suspend, - .resume = sa1100_irda_resume, -}; - -static struct sys_device sa1100ir_device = { - .name = "sa1100ir", - .id = 0, - .root = NULL, - .dev = { - .name = "Intel Corporation SA11x0 [IrDA]", - .bus_id = "0", - .driver = &sa1100ir_driver, - }, -}; - -static int sa1100_irda_net_init(struct net_device *dev) +static int sa1100_irda_probe(struct device *_dev) { - struct sa1100_irda *si = dev->priv; + struct platform_device *pdev = to_platform_device(_dev); + struct net_device *dev; + struct sa1100_irda *si; unsigned int baudrate_mask; - int err = -ENOMEM; + int err; - si = kmalloc(sizeof(struct sa1100_irda), GFP_KERNEL); - if (!si) - goto out; + err = request_mem_region(__PREG(Ser2UTCR0), 0x24, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_1; + err = request_mem_region(__PREG(Ser2HSCR0), 0x1c, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_2; + err = request_mem_region(__PREG(Ser2HSCR2), 0x04, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_3; - memset(si, 0, sizeof(*si)); + dev = alloc_irdadev(sizeof(struct sa1100_irda)); + if (!dev) + goto err_mem_4; - si->dev = &sa1100ir_device.dev; + si = dev->priv; + si->dev = &pdev->dev; /* * Initialise the HP-SIR buffers */ err = sa1100_irda_init_iobuf(&si->rx_buff, 14384); if (err) - goto out; + goto err_mem_5; err = sa1100_irda_init_iobuf(&si->tx_buff, 4000); if (err) - goto out_free_rx; + goto err_mem_5; - dev->priv = si; dev->hard_start_xmit = sa1100_irda_hard_xmit; dev->open = sa1100_irda_start; dev->stop = sa1100_irda_stop; dev->do_ioctl = sa1100_irda_ioctl; dev->get_stats = sa1100_irda_stats; + dev->irq = IRQ_Ser2ICP; - irda_device_setup(dev); irda_init_max_qos_capabilies(&si->qos); /* @@ -1030,42 +1026,62 @@ Ser2UTCR4 = si->utcr4; Ser2HSCR0 = HSCR0_UART; - return 0; - - kfree(si->tx_buff.head); -out_free_rx: - kfree(si->rx_buff.head); -out: - kfree(si); + err = register_netdev(dev); + if (err == 0) + dev_set_drvdata(&pdev->dev, si); + if (err) { + err_mem_5: + kfree(si->tx_buff.head); + kfree(si->rx_buff.head); + free_netdev(dev); + err_mem_4: + release_mem_region(__PREG(Ser2HSCR2), 0x04); + err_mem_3: + release_mem_region(__PREG(Ser2HSCR0), 0x1c); + err_mem_2: + release_mem_region(__PREG(Ser2UTCR0), 0x24); + } + err_mem_1: return err; } -/* - * Remove all traces of this driver module from the kernel, so we can't be - * called. Note that the device has already been stopped, so we don't have - * to worry about interrupts or dma. - */ -static void sa1100_irda_net_uninit(struct net_device *dev) +static int sa1100_irda_remove(struct device *_dev) { - struct sa1100_irda *si = dev->priv; + struct net_device *dev = dev_get_drvdata(_dev); - dev->hard_start_xmit = NULL; - dev->open = NULL; - dev->stop = NULL; - dev->do_ioctl = NULL; - dev->get_stats = NULL; - dev->priv = NULL; - - kfree(si->tx_buff.head); - kfree(si->rx_buff.head); - kfree(si); + if (dev) { + struct sa1100_irda *si = dev->priv; + unregister_netdev(dev); + kfree(si->tx_buff.head); + kfree(si->rx_buff.head); + free_netdev(dev); + } + + release_mem_region(__PREG(Ser2HSCR2), 0x04); + release_mem_region(__PREG(Ser2HSCR0), 0x1c); + release_mem_region(__PREG(Ser2UTCR0), 0x24); + + return 0; } +static struct device_driver sa1100ir_driver = { + .name = "sa11x0-ir", + .bus = &platform_bus_type, + .probe = sa1100_irda_probe, + .remove = sa1100_irda_remove, + .suspend = sa1100_irda_suspend, + .resume = sa1100_irda_resume, +}; + +static struct platform_device sa1100ir_device = { + .name = "sa11x0-ir", + .id = 0, +}; + static int __init sa1100_irda_init(void) { - struct net_device *dev; - int err; + int ret; /* * Limit power level a sensible range. @@ -1075,103 +1091,30 @@ if (power_level > 3) power_level = 3; - err = request_mem_region(__PREG(Ser2UTCR0), 0x24, "IrDA") ? 0 : -EBUSY; - if (err) - goto err_mem_1; - err = request_mem_region(__PREG(Ser2HSCR0), 0x1c, "IrDA") ? 0 : -EBUSY; - if (err) - goto err_mem_2; - err = request_mem_region(__PREG(Ser2HSCR2), 0x04, "IrDA") ? 0 : -EBUSY; - if (err) - goto err_mem_3; - - driver_register(&sa1100ir_driver); - sys_device_register(&sa1100ir_device); - - rtnl_lock(); - dev = dev_alloc("irda%d", &err); - if (dev) { - dev->irq = IRQ_Ser2ICP; - dev->init = sa1100_irda_net_init; - dev->uninit = sa1100_irda_net_uninit; - - err = register_netdevice(dev); - - if (err) - kfree(dev); - else - dev_set_drvdata(&sa1100ir_device.dev, dev); + ret = driver_register(&sa1100ir_driver); + if (ret == 0) { + ret = platform_device_register(&sa1100ir_device); + if (ret) + driver_unregister(&sa1100ir_driver); } - rtnl_unlock(); - - if (err) { - sys_device_unregister(&sa1100ir_device); - driver_unregister(&sa1100ir_driver); - - release_mem_region(__PREG(Ser2HSCR2), 0x04); -err_mem_3: - release_mem_region(__PREG(Ser2HSCR0), 0x1c); -err_mem_2: - release_mem_region(__PREG(Ser2UTCR0), 0x24); - } -err_mem_1: - return err; + return ret; } static void __exit sa1100_irda_exit(void) { - struct net_device *dev = dev_get_drvdata(&sa1100ir_device.dev); - - if (dev) - unregister_netdev(dev); - - sys_device_unregister(&sa1100ir_device); driver_unregister(&sa1100ir_driver); - - release_mem_region(__PREG(Ser2HSCR2), 0x04); - release_mem_region(__PREG(Ser2HSCR0), 0x1c); - release_mem_region(__PREG(Ser2UTCR0), 0x24); - - if(dev) - free_netdev(dev); + platform_device_unregister(&sa1100ir_device); } -static int __init sa1100ir_setup(char *line) -{ - char *opt; - - if (!line) - return 0; - - while ((opt = strsep(&line, ",")) != NULL) { - if (!strncmp(opt, "max_rate:", 9)) { - max_rate = simple_strtoul(opt + 9, NULL, 0); - continue; - } - if (!strncmp(opt, "power_level:", 12)) { - power_level = simple_strtoul(opt + 12, NULL, 0); - continue; - } - if (!strncmp(opt, "tx_lpm:", 7)) { - tx_lpm = simple_strtoul(opt + 7, NULL, 0); - continue; - } - } - - return 1; -} - -__setup("sa1100ir=", sa1100ir_setup); - module_init(sa1100_irda_init); module_exit(sa1100_irda_exit); +module_param(power_level, int, 0); +module_param(tx_lpm, int, 0); +module_param(max_rate, int, 0); MODULE_AUTHOR("Russell King "); MODULE_DESCRIPTION("StrongARM SA1100 IrDA driver"); MODULE_LICENSE("GPL"); -MODULE_PARM(power_level, "i"); MODULE_PARM_DESC(power_level, "IrDA power level, 1 (low) to 3 (high)"); -MODULE_PARM(tx_lpm, "i"); MODULE_PARM_DESC(tx_lpm, "Enable transmitter low power (1.6us) mode"); -MODULE_PARM(max_rate, "i"); MODULE_PARM_DESC(max_rate, "Maximum baud rate (4000000, 115200, 57600, 38400, 19200, 9600)"); diff -Nru a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c --- a/drivers/net/irda/smsc-ircc2.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/irda/smsc-ircc2.c Tue Feb 17 20:00:07 2004 @@ -154,7 +154,7 @@ static void smsc_ircc_change_speed(void *priv, u32 speed); static void smsc_ircc_set_sir_speed(void *priv, u32 speed); static irqreturn_t smsc_ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static void smsc_ircc_interrupt_sir(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t smsc_ircc_interrupt_sir(struct net_device *dev); static void smsc_ircc_sir_start(struct smsc_ircc_cb *self); #if SMSC_IRCC2_C_SIR_STOP static void smsc_ircc_sir_stop(struct smsc_ircc_cb *self); @@ -1401,9 +1401,9 @@ /* Check if we should use the SIR interrupt handler */ if (self->io.speed <= SMSC_IRCC2_MAX_SIR_SPEED) { - smsc_ircc_interrupt_sir(irq, dev_id, regs); + irqreturn_t ret = smsc_ircc_interrupt_sir(dev); spin_unlock(&self->lock); - return IRQ_HANDLED; + return ret; } iobase = self->io.fir_base; @@ -1435,7 +1435,7 @@ outb(IRCC_IER_ACTIVE_FRAME|IRCC_IER_EOM, iobase+IRCC_IER); spin_unlock(&self->lock); - return IRQ_HANDLED; + return IRQ_RETVAL(iir); } /* @@ -1443,21 +1443,13 @@ * * Interrupt handler for SIR modes */ -void smsc_ircc_interrupt_sir(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t smsc_ircc_interrupt_sir(struct net_device *dev) { - struct net_device *dev = (struct net_device *) dev_id; - struct smsc_ircc_cb *self; + struct smsc_ircc_cb *self = dev->priv; int boguscount = 0; int iobase; int iir, lsr; - if (!dev) { - WARNING("%s() irq %d for unknown device.\n", - __FUNCTION__, irq); - return; - } - self = (struct smsc_ircc_cb *) dev->priv; - /* Already locked comming here in smsc_ircc_interrupt() */ /*spin_lock(&self->lock);*/ @@ -1497,6 +1489,7 @@ iir = inb(iobase + UART_IIR) & UART_IIR_ID; } /*spin_unlock(&self->lock);*/ + return IRQ_RETVAL(iir); } diff -Nru a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c --- a/drivers/net/irda/via-ircc.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/irda/via-ircc.c Tue Feb 17 20:00:05 2004 @@ -1394,7 +1394,7 @@ } //Rx Event spin_unlock(&self->lock); - return IRQ_HANDLED; + return IRQ_RETVAL(iHostIntType); } void hwreset(struct via_ircc_cb *self) diff -Nru a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c --- a/drivers/net/irda/w83977af_ir.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/irda/w83977af_ir.c Tue Feb 17 20:00:06 2004 @@ -1143,7 +1143,7 @@ outb(icr, iobase+ICR); /* Restore (new) interrupts */ outb(set, iobase+SSR); /* Restore bank register */ - return IRQ_HANDLED; + return IRQ_RETVAL(isr); } /* diff -Nru a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c --- a/drivers/net/ixgb/ixgb_main.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ixgb/ixgb_main.c Tue Feb 17 20:00:06 2004 @@ -446,7 +446,7 @@ iounmap(adapter->hw.hw_addr); err_ioremap: pci_release_regions(pdev); - kfree(netdev); + free_netdev(netdev); err_alloc_etherdev: return -ENOMEM; } diff -Nru a/drivers/net/jazzsonic.c b/drivers/net/jazzsonic.c --- a/drivers/net/jazzsonic.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/jazzsonic.c Tue Feb 17 20:00:06 2004 @@ -80,7 +80,6 @@ /* Index to functions, as function prototypes. */ -extern int sonic_probe(struct net_device *dev); static int sonic_probe1(struct net_device *dev, unsigned int base_addr, unsigned int irq); @@ -89,29 +88,57 @@ * Probe for a SONIC ethernet controller on a Mips Jazz board. * Actually probing is superfluous but we're paranoid. */ -int __init sonic_probe(struct net_device *dev) +struct net_device * __init sonic_probe(int unit) { - unsigned int base_addr = dev ? dev->base_addr : 0; + struct net_device *dev; + struct sonic_local *lp; + unsigned int base_addr; + int err = 0; int i; /* * Don't probe if we're not running on a Jazz board. */ if (mips_machgroup != MACH_GROUP_JAZZ) - return -ENODEV; - if (base_addr >= KSEG0) /* Check a single specified location. */ - return sonic_probe1(dev, base_addr, dev->irq); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; sonic_portlist[i].port; i++) { - int base_addr = sonic_portlist[i].port; - if (check_region(base_addr, 0x100)) - continue; - if (sonic_probe1(dev, base_addr, sonic_portlist[i].irq) == 0) - return 0; + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(0); + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + base_addr = dev->base_addr; + + if (base_addr >= KSEG0) { /* Check a single specified location. */ + err = sonic_probe1(dev, base_addr, dev->irq); + } else if (base_addr != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (i = 0; sonic_portlist[i].port; i++) { + int io = sonic_portlist[i].port; + if (sonic_probe1(dev, io, sonic_portlist[i].irq) == 0) + break; + } + if (!sonic_portlist[i].port) + err = -ENODEV; } - return -ENODEV; + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + lp = dev->priv; + vdma_free(lp->rba_laddr); + kfree(lp->rba); + vdma_free(lp->cda_laddr); + kfree(lp); + release_region(dev->base_addr, 0x100); +out: + free_netdev(dev); + return ERR_PTR(err); } static int __init sonic_probe1(struct net_device *dev, unsigned int base_addr, @@ -121,8 +148,11 @@ unsigned int silicon_revision; unsigned int val; struct sonic_local *lp; + int err = -ENODEV; int i; + if (!request_region(base_addr, 0x100, dev->name)) + return -EBUSY; /* * get the Silicon Revision ID. If this is one of the known * one assume that we found a SONIC ethernet controller at @@ -140,12 +170,9 @@ if (known_revisions[i] == 0xffff) { printk("SONIC ethernet controller not found (0x%4x)\n", silicon_revision); - return -ENODEV; + goto out; } - if (!request_region(base_addr, 0x100, dev->name)) - return -EBUSY; - if (sonic_debug && version_printed++ == 0) printk(version); @@ -175,6 +202,8 @@ } printk(" IRQ %d\n", irq); + + err = -ENOMEM; /* Initialize the device structure. */ if (dev->priv == NULL) { @@ -196,7 +225,7 @@ if (lp == NULL) { printk("%s: couldn't allocate memory for descriptors\n", dev->name); - return -ENOMEM; + goto out; } memset(lp, 0, sizeof(struct sonic_local)); @@ -206,7 +235,7 @@ if (lp->cda_laddr == ~0UL) { printk("%s: couldn't get DMA page entry for " "descriptors\n", dev->name); - return -ENOMEM; + goto out1; } lp->tda_laddr = lp->cda_laddr + sizeof (lp->cda); @@ -219,7 +248,7 @@ if (!lp->rba) { printk("%s: couldn't allocate receive buffers\n", dev->name); - return -ENOMEM; + goto out2; } /* get virtual dma address */ @@ -228,7 +257,7 @@ if (lp->rba_laddr == ~0UL) { printk("%s: couldn't get DMA page entry for receive " "buffers\n",dev->name); - return -ENOMEM; + goto out3; } /* now convert pointer to KSEG1 pointer */ @@ -252,9 +281,16 @@ SONIC_WRITE(SONIC_FAET,0xffff); SONIC_WRITE(SONIC_MPT,0xffff); - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); return 0; +out3: + kfree(lp->rba); +out2: + vdma_free(lp->cda_laddr); +out1: + kfree(lp); +out: + release_region(base_addr, 0x100); + return err; } /* diff -Nru a/drivers/net/lance.c b/drivers/net/lance.c --- a/drivers/net/lance.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/lance.c Tue Feb 17 20:00:05 2004 @@ -59,8 +59,8 @@ #include static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360, 0}; -int lance_probe(struct net_device *dev); static int lance_probe1(struct net_device *dev, int ioaddr, int irq, int options); +static int __init do_lance_probe(struct net_device *dev); #ifdef LANCE_DEBUG static int lance_debug = LANCE_DEBUG; @@ -274,7 +274,6 @@ static unsigned char lance_need_isa_bounce_buffers = 1; static int lance_open(struct net_device *dev); -static int lance_open_fail(struct net_device *dev); static void lance_init_ring(struct net_device *dev, int mode); static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev); static int lance_rx(struct net_device *dev); @@ -286,10 +285,21 @@ +static void cleanup_card(struct net_device *dev) +{ + struct lance_private *lp = dev->priv; + if (dev->dma != 4) + free_dma(dev->dma); + release_region(dev->base_addr, LANCE_TOTAL_SIZE); + kfree(lp->tx_bounce_buffs); + kfree((void*)lp->rx_buffs); + kfree(lp); +} + #ifdef MODULE #define MAX_CARDS 8 /* Max number of interfaces (cards) per module */ -static struct net_device dev_lance[MAX_CARDS]; +static struct net_device *dev_lance[MAX_CARDS]; static int io[MAX_CARDS]; static int dma[MAX_CARDS]; static int irq[MAX_CARDS]; @@ -305,28 +315,35 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_lance[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->dma = dma[this_dev]; - dev->init = lance_probe; if (io[this_dev] == 0) { - if (this_dev != 0) break; /* only complain once */ + if (this_dev != 0) /* only complain once */ + break; printk(KERN_NOTICE "lance.c: Module autoprobing not allowed. Append \"io=0xNNN\" value(s).\n"); return -EPERM; } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "lance.c: No PCnet/LANCE card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) return 0; /* Got at least one. */ - return -ENXIO; + dev = alloc_etherdev(0); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + dev->dma = dma[this_dev]; + if (do_lance_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_lance[found++] = dev; + continue; + } + cleanup_card(dev); } - found++; + free_netdev(dev); + break; } - - return 0; + if (found != 0) + return 0; + return -ENXIO; } void cleanup_module(void) @@ -334,13 +351,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) { - struct net_device *dev = &dev_lance[this_dev]; - if (dev->priv != NULL) { + struct net_device *dev = dev_lance[this_dev]; + if (dev) { unregister_netdev(dev); - free_dma(dev->dma); - release_region(dev->base_addr, LANCE_TOTAL_SIZE); - kfree(dev->priv); - dev->priv = NULL; + cleanup_card(dev); + free_netdev(dev); } } } @@ -352,7 +367,7 @@ board probes now that kmalloc() can allocate ISA DMA-able regions. This also allows the LANCE driver to be used as a module. */ -int __init lance_probe(struct net_device *dev) +static int __init do_lance_probe(struct net_device *dev) { int *port, result; @@ -387,6 +402,31 @@ return -ENODEV; } +struct net_device * __init lance_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(0); + int err; + + if (!dev) + return ERR_PTR(-ENODEV); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_lance_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init lance_probe1(struct net_device *dev, int ioaddr, int irq, int options) { struct lance_private *lp; @@ -398,6 +438,7 @@ int hp_builtin = 0; /* HP on-board ethernet. */ static int did_version; /* Already printed version info. */ unsigned long flags; + int err = -ENOMEM; /* First we look for special cases. Check for HP's on-board ethernet by looking for 'HP' in the BIOS. @@ -432,7 +473,7 @@ outw(88, ioaddr+LANCE_ADDR); if (inw(ioaddr+LANCE_ADDR) != 88) { lance_version = 0; - } else { /* Good, it's a newer chip. */ + } else { /* Good, it's a newer chip. */ int chip_version = inw(ioaddr+LANCE_DATA); outw(89, ioaddr+LANCE_ADDR); chip_version |= inw(ioaddr+LANCE_DATA) << 16; @@ -447,13 +488,9 @@ } } - /* We can't use init_etherdev() to allocate dev->priv because it must + /* We can't allocate dev->priv from alloc_etherdev() because it must a ISA DMA-able region. */ - dev = init_etherdev(dev, 0); - if (!dev) - return -ENOMEM; SET_MODULE_OWNER(dev); - dev->open = lance_open_fail; chipname = chip_table[lance_version].name; printk("%s: %s at %#3x,", dev->name, chipname, ioaddr); @@ -465,8 +502,7 @@ dev->base_addr = ioaddr; /* Make certain the data structures used by the LANCE are aligned and DMAble. */ - lp = (struct lance_private *)(((unsigned long)kmalloc(sizeof(*lp)+7, - GFP_DMA | GFP_KERNEL)+7) & ~7); + lp = kmalloc(sizeof(*lp), GFP_DMA | GFP_KERNEL); if(lp==NULL) return -ENODEV; if (lance_debug > 6) printk(" (#0x%05lx)", (unsigned long)lp); @@ -486,7 +522,7 @@ lp->tx_bounce_buffs = NULL; lp->chip_version = lance_version; - lp->devlock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&lp->devlock); lp->init_block.mode = 0x0003; /* Disable Rx and Tx. */ for (i = 0; i < 6; i++) @@ -540,6 +576,7 @@ dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) | (inb(DMA2_STAT_REG) & 0xf0); } + err = -ENODEV; if (dev->irq >= 2) printk(" assigned IRQ %d", dev->irq); else if (lance_version != 0) { /* 7990 boards need DMA detection first. */ @@ -559,7 +596,7 @@ printk(", probed IRQ %d", dev->irq); else { printk(", failed to detect IRQ line.\n"); - return -ENODEV; + goto out_tx; } /* Check for the initialization done bit, 0x0100, which means @@ -573,7 +610,7 @@ } else if (dev->dma) { if (request_dma(dev->dma, chipname)) { printk("DMA %d allocation failed.\n", dev->dma); - return -ENODEV; + goto out_tx; } else printk(", assigned DMA %d.\n", dev->dma); } else { /* OK, we have to auto-DMA. */ @@ -613,7 +650,7 @@ } if (i == 4) { /* Failure: bail. */ printk("DMA detection failed.\n"); - return -ENODEV; + goto out_tx; } } @@ -629,7 +666,7 @@ dev->irq = probe_irq_off(irq_mask); if (dev->irq == 0) { printk(" Failed to detect the 7990 IRQ line.\n"); - return -ENODEV; + goto out_dma; } printk(" Auto-IRQ detected IRQ%d.\n", dev->irq); } @@ -655,17 +692,17 @@ dev->watchdog_timeo = TX_TIMEOUT; return 0; -out_rx: kfree((void*)lp->rx_buffs); -out_lp: kfree(lp); - return -ENOMEM; +out_dma: + if (dev->dma != 4) + free_dma(dev->dma); +out_tx: + kfree(lp->tx_bounce_buffs); +out_rx: + kfree((void*)lp->rx_buffs); +out_lp: + kfree(lp); + return err; } - -static int -lance_open_fail(struct net_device *dev) -{ - return -ENODEV; -} - static int diff -Nru a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c --- a/drivers/net/lasi_82596.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/lasi_82596.c Tue Feb 17 20:00:06 2004 @@ -1149,12 +1149,11 @@ #define LAN_PROM_ADDR 0xF0810000 -static int __devinit i82596_probe(struct net_device *dev) +static int __devinit i82596_probe(struct net_device *dev, + struct device *gen_dev) { int i; struct i596_private *lp; - /* we're going to overwrite dev->priv, so pull the device out */ - struct device *gen_dev = dev->priv; char eth_addr[6]; dma_addr_t dma_addr; @@ -1204,7 +1203,6 @@ return -ENOMEM; } - ether_setup(dev); DEB(DEB_PROBE,printk("%s: 82596 at %#3lx,", dev->name, dev->base_addr)); for (i = 0; i < 6; i++) @@ -1537,12 +1535,19 @@ netdevice->base_addr = dev->hpa; netdevice->irq = dev->irq; - netdevice->init = i82596_probe; - netdevice->priv = &dev->dev; + + retval = i82596_probe(netdevice, &dev->dev); + if (retval) { + free_netdev(netdevice); + return -ENODEV; + } retval = register_netdev(netdevice); if (retval) { + struct i596_private *lp = netdevice->priv; printk(KERN_WARNING __FILE__ ": register_netdevice ret'd %d\n", retval); + dma_free_noncoherent(lp->dev, sizeof(struct i596_private), + (void *)netdevice->mem_start, lp->dma_addr); free_netdev(netdevice); return -ENODEV; }; diff -Nru a/drivers/net/lne390.c b/drivers/net/lne390.c --- a/drivers/net/lne390.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/lne390.c Tue Feb 17 20:00:08 2004 @@ -49,7 +49,6 @@ #include "8390.h" -int lne390_probe(struct net_device *dev); static int lne390_probe1(struct net_device *dev, int ioaddr); static int lne390_open(struct net_device *dev); @@ -103,9 +102,11 @@ * PROM for a match against the value assigned to Mylex. */ -int __init lne390_probe(struct net_device *dev) +static int __init do_lne390_probe(struct net_device *dev) { unsigned short ioaddr = dev->base_addr; + int irq = dev->irq; + int mem_start = dev->mem_start; int ret; SET_MODULE_OWNER(dev); @@ -135,11 +136,46 @@ if (lne390_probe1(dev, ioaddr) == 0) return 0; release_region(ioaddr, LNE390_IO_EXTENT); + dev->irq = irq; + dev->mem_start = mem_start; } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + free_irq(dev->irq, dev); + release_region(dev->base_addr, LNE390_IO_EXTENT); + if (ei_status.reg0) + iounmap((void *)dev->mem_start); +} + +struct net_device * __init lne390_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_lne390_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init lne390_probe1(struct net_device *dev, int ioaddr) { int i, revision, ret; @@ -174,11 +210,6 @@ return -ENODEV; } #endif - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk ("lne390.c: unable to allocate memory for dev->priv!\n"); - return -ENOMEM; - } printk("lne390.c: LNE390%X in EISA slot %d, address", 0xa+revision, ioaddr/0x1000); for(i = 0; i < ETHER_ADDR_LEN; i++) @@ -199,8 +230,6 @@ if ((ret = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { printk (" unable to get IRQ %d.\n", dev->irq); - kfree(dev->priv); - dev->priv = NULL; return ret; } @@ -274,8 +303,6 @@ return 0; cleanup: free_irq(dev->irq, dev); - kfree(dev->priv); - dev->priv = NULL; return ret; } @@ -373,7 +400,7 @@ #ifdef MODULE #define MAX_LNE_CARDS 4 /* Max number of LNE390 cards per module */ -static struct net_device dev_lne[MAX_LNE_CARDS]; +static struct net_device *dev_lne[MAX_LNE_CARDS]; static int io[MAX_LNE_CARDS]; static int irq[MAX_LNE_CARDS]; static int mem[MAX_LNE_CARDS]; @@ -389,26 +416,32 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) { - struct net_device *dev = &dev_lne[this_dev]; + if (io[this_dev] == 0 && this_dev != 0) + break; + dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->base_addr = io[this_dev]; dev->mem_start = mem[this_dev]; - dev->init = lne390_probe; - /* Default is to only install one card. */ - if (io[this_dev] == 0 && this_dev != 0) break; - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + if (do_lne390_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_lne[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; - } - return 0; + free_netdev(dev); + printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]); + break; + } + if (found) + return 0; + return -ENXIO; } void cleanup_module(void) @@ -416,15 +449,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) { - struct net_device *dev = &dev_lne[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - free_irq(dev->irq, dev); - release_region(dev->base_addr, LNE390_IO_EXTENT); - if (ei_status.reg0) - iounmap((void *)dev->mem_start); + struct net_device *dev = dev_lne[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/lp486e.c b/drivers/net/lp486e.c --- a/drivers/net/lp486e.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/lp486e.c Tue Feb 17 20:00:06 2004 @@ -1314,18 +1314,23 @@ static int irq = IRQ; static int __init lp486e_init_module(void) { - struct net_device *dev; - - dev = alloc_etherdev(sizeof(struct i596_private)); + int err; + struct net_device *dev = alloc_etherdev(sizeof(struct i596_private)); if (!dev) return -ENOMEM; dev->irq = irq; dev->base_addr = io; - dev->init = lp486e_probe; - if (register_netdev(dev) != 0) { + err = lp486e_probe(dev); + if (err) { + free_netdev(dev); + return err; + } + err = register_netdev(dev); + if (err) { + release_region(dev->base_addr, LP486E_TOTAL_SIZE); free_netdev(dev); - return -EIO; + return err; } dev_lp486e = dev; full_duplex = 0; diff -Nru a/drivers/net/mac8390.c b/drivers/net/mac8390.c --- a/drivers/net/mac8390.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/mac8390.c Tue Feb 17 20:00:07 2004 @@ -124,11 +124,10 @@ static char version[] __initdata = "mac8390.c: v0.4 2001-05-15 David Huggins-Daines and others\n"; -extern int mac8390_probe(struct net_device * dev); extern enum mac8390_type mac8390_ident(struct nubus_dev * dev); extern int mac8390_memsize(unsigned long membase); extern int mac8390_memtest(struct net_device * dev); -extern int mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev, +static int mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev, enum mac8390_type type); static int mac8390_open(struct net_device * dev); @@ -223,43 +222,43 @@ return i * 0x1000; } -static int probed __initdata = 0; - -int __init mac8390_probe(struct net_device * dev) +struct net_device * __init mac8390_probe(int unit) { + struct net_device *dev; volatile unsigned short *i; - int boards_found = 0; int version_disp = 0; struct nubus_dev * ndev = NULL; + int err = -ENODEV; struct nubus_dir dir; struct nubus_dirent ent; int offset; + static unsigned int slots; enum mac8390_type cardtype; - if (probed) - return -ENODEV; - probed++; - /* probably should check for Nubus instead */ if (!MACH_IS_MAC) - return -ENODEV; + return ERR_PTR(-ENODEV); + + dev = alloc_ei_netdev(); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); + + SET_MODULE_OWNER(dev); while ((ndev = nubus_find_type(NUBUS_CAT_NETWORK, NUBUS_TYPE_ETHERNET, ndev))) { - - dev = NULL; - - if ((cardtype = mac8390_ident(ndev)) == MAC8390_NONE) + /* Have we seen it already? */ + if (slots & (1<board->slot)) continue; + slots |= 1<board->slot; - dev = init_etherdev(dev, 0); - if (dev == NULL) { - printk(KERN_ERR "Unable to allocate etherdev" - "structure!\n"); - return -ENOMEM; - } + if ((cardtype = mac8390_ident(ndev)) == MAC8390_NONE) + continue; if (version_disp == 0) { version_disp = 1; @@ -358,21 +357,25 @@ printk(KERN_ERR "Card type %s is" " unsupported, sorry\n", cardname[cardtype]); - return -ENODEV; + continue; } } /* Do the nasty 8390 stuff */ - if (mac8390_initdev(dev, ndev, cardtype)) - continue; - boards_found++; + if (!mac8390_initdev(dev, ndev, cardtype)) + break; } - /* We're outta here */ - if (boards_found > 0) - return 0; - else - return -ENODEV; + if (!ndev) + goto out; + err = register_netdev(dev); + if (err) + goto out; + return dev; + +out: + free_netdev(dev); + return ERR_PTR(err); } #ifdef MODULE @@ -380,26 +383,39 @@ MODULE_DESCRIPTION("Macintosh NS8390-based Nubus Ethernet driver"); MODULE_LICENSE("GPL"); +/* overkill, of course */ +static struct net_device *dev_mac8390[15]; int init_module(void) { - if (mac8390_probe(NULL)) { + int i; + for (i = 0; i < 15; i++) { + struct net_device *dev = mac8390_probe(-1); + if (IS_ERR(dev)) + break; + dev_mac890[i] = dev; + } + if (!i) { printk(KERN_NOTICE "mac8390.c: No useable cards found, driver NOT installed.\n"); return -ENODEV; } - lock_8390_module(); return 0; } void cleanup_module(void) { - /* FIXME: should probably keep track of net_device structs - somewhere and unregister them here? */ - unlock_8390_module(); + int i; + for (i = 0; i < 15; i++) { + struct net_device *dev = dev_mac890[i]; + if (dev) { + unregister_netdev(dev); + free_netdev(dev); + } + } } #endif /* MODULE */ -int __init mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev, +static int __init mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev, enum mac8390_type type) { static u32 fwrd4_offsets[16]={ @@ -423,12 +439,6 @@ int access_bitmode; - /* 8390 specific init for dev - allocates dev->priv */ - if (ethdev_init(dev)) { - printk(KERN_ERR "%s: Unable to allocate memory for dev->priv!\n", dev->name); - return -ENOMEM; - } - /* Now fill in our stuff */ dev->open = &mac8390_open; dev->stop = &mac8390_close; @@ -529,7 +539,6 @@ printk ("%s: unable to get IRQ %d.\n", dev->name, dev->irq); return -EAGAIN; } - MOD_INC_USE_COUNT; return 0; } @@ -537,7 +546,6 @@ { free_irq(dev->irq, dev); ei_close(dev); - MOD_DEC_USE_COUNT; return 0; } diff -Nru a/drivers/net/mac89x0.c b/drivers/net/mac89x0.c --- a/drivers/net/mac89x0.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/mac89x0.c Tue Feb 17 20:00:07 2004 @@ -123,7 +123,6 @@ /* Index to functions, as function prototypes. */ -extern int mac89x0_probe(struct net_device *dev); #if 0 extern void reset_chip(struct net_device *dev); #endif @@ -170,8 +169,9 @@ /* Probe for the CS8900 card in slot E. We won't bother looking anywhere else until we have a really good reason to do so. */ -int __init mac89x0_probe(struct net_device *dev) +struct net_device * __init mac89x0_probe(int unit) { + struct net_device *dev; static int once_is_enough; struct net_local *lp; static unsigned version_printed; @@ -179,18 +179,28 @@ unsigned rev_type = 0; unsigned long ioaddr; unsigned short sig; + int err = -ENODEV; + + dev = alloc_etherdev(sizeof(struct net_local)); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); if (once_is_enough) - return -ENODEV; + goto out; once_is_enough = 1; /* We might have to parameterize this later */ slot = 0xE; /* Get out now if there's a real NuBus card in slot E */ if (nubus_find_slot(slot, NULL) != NULL) - return -ENODEV; + goto out; /* The pseudo-ISA bits always live at offset 0x300 (gee, wonder why...) */ @@ -206,21 +216,15 @@ local_irq_restore(flags); if (!card_present) - return -ENODEV; + goto out; } nubus_writew(0, ioaddr + ADD_PORT); sig = nubus_readw(ioaddr + DATA_PORT); if (sig != swab16(CHIP_EISA_ID_SIG)) - return -ENODEV; + goto out; /* Initialize the net_device structure. */ - if (dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (!dev->priv) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct net_local)); - } lp = (struct net_local *)dev->priv; /* Fill in the 'dev' fields. */ @@ -258,9 +262,7 @@ /* Try to read the MAC address */ if ((readreg(dev, PP_SelfST) & (EEPROM_PRESENT | EEPROM_OK)) == 0) { printk("\nmac89x0: No EEPROM, giving up now.\n"); - kfree(dev->priv); - dev->priv = NULL; - return -ENODEV; + goto out1; } else { for (i = 0; i < ETH_ALEN; i += 2) { /* Big-endian (why??!) */ @@ -277,6 +279,7 @@ for (i = 0; i < ETH_ALEN; i++) printk("%2.2x%s", dev->dev_addr[i], ((i < ETH_ALEN-1) ? ":" : "")); + printk("\n"); dev->open = net_open; dev->stop = net_close; @@ -285,11 +288,15 @@ dev->set_multicast_list = &set_multicast_list; dev->set_mac_address = &set_mac_address; - /* Fill in the fields of the net_device structure with ethernet values. */ - ether_setup(dev); - - printk("\n"); + err = register_netdev(dev); + if (err) + goto out1; return 0; +out1: + nubus_writew(0, dev->base_addr + ADD_PORT); +out: + free_netdev(dev); + return ERR_PTR(err); } #if 0 @@ -619,7 +626,7 @@ #ifdef MODULE -static struct net_device dev_cs89x0; +static struct net_device *dev_cs89x0; static int debug; MODULE_PARM(debug, "i"); @@ -630,36 +637,20 @@ init_module(void) { net_debug = debug; - dev_cs89x0.init = mac89x0_probe; - dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (!dev_cs89x0.priv) - return -ENOMEM; - memset(dev_cs89x0.priv, 0, sizeof(struct net_local)); - - if (register_netdev(&dev_cs89x0) != 0) { + dev_cs89x0 = mac89x0_probe(-1); + if (IS_ERR(dev_cs89x0)) { printk(KERN_WARNING "mac89x0.c: No card found\n"); - kfree(dev_cs89x0.priv); - return -ENXIO; - } + return PTR_ERR(dev_cs89x0); + } return 0; } void cleanup_module(void) { - -#endif -#ifdef MODULE - nubus_writew(0, dev_cs89x0.base_addr + ADD_PORT); -#endif -#ifdef MODULE - - if (dev_cs89x0.priv != NULL) { - /* Free up the private structure, or leak memory :-) */ - unregister_netdev(&dev_cs89x0); - kfree(dev_cs89x0.priv); - dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */ - } + unregister_netdev(dev_cs89x0); + nubus_writew(0, dev_cs89x0->base_addr + ADD_PORT); + free_netdev(dev_cs89x0); } #endif /* MODULE */ diff -Nru a/drivers/net/mace.c b/drivers/net/mace.c --- a/drivers/net/mace.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/mace.c Tue Feb 17 20:00:06 2004 @@ -20,9 +20,10 @@ #include #include #include +#include + #include "mace.h" -static struct net_device *mace_devs; static int port_aaui = -1; #define N_RX_RING 8 @@ -61,8 +62,7 @@ int timeout_active; int port_aaui; int chipid; - struct device_node* of_node; - struct net_device *next_mace; + struct macio_dev *mdev; spinlock_t lock; }; @@ -76,8 +76,6 @@ + (N_RX_RING + NCMDS_TX * N_TX_RING + 3) * sizeof(struct dbdma_cmd)) static int bitrev(int); -static int mace_probe(void); -static void mace_probe1(struct device_node *mace); static int mace_open(struct net_device *dev); static int mace_close(struct net_device *dev); static int mace_xmit_start(struct sk_buff *skb, struct net_device *dev); @@ -110,26 +108,19 @@ return d; } -static int __init mace_probe(void) -{ - struct device_node *mace; - - for (mace = find_devices("mace"); mace != NULL; mace = mace->next) - mace_probe1(mace); - return mace_devs? 0: -ENODEV; -} -static void __init mace_probe1(struct device_node *mace) +static int __devinit mace_probe(struct macio_dev *mdev, const struct of_match *match) { - int j, rev; + struct device_node *mace = macio_get_of_node(mdev); struct net_device *dev; struct mace_data *mp; unsigned char *addr; + int j, rev, rc = -EBUSY; - if (mace->n_addrs != 3 || mace->n_intrs != 3) { + if (macio_resource_count(mdev) != 3 || macio_irq_count(mdev) != 3) { printk(KERN_ERR "can't use MACE %s: need 3 addrs and 3 irqs\n", mace->full_name); - return; + return -ENODEV; } addr = get_property(mace, "mac-address", NULL); @@ -138,44 +129,48 @@ if (addr == NULL) { printk(KERN_ERR "Can't get mac-address for MACE %s\n", mace->full_name); - return; + return -ENODEV; } } + /* + * lazy allocate the driver-wide dummy buffer. (Note that we + * never have more than one MACE in the system anyway) + */ if (dummy_buf == NULL) { dummy_buf = kmalloc(RX_BUFLEN+2, GFP_KERNEL); if (dummy_buf == NULL) { printk(KERN_ERR "MACE: couldn't allocate dummy buffer\n"); - return; + return -ENOMEM; } } - dev = init_etherdev(0, PRIV_BYTES); - if (!dev) - return; + if (macio_request_resources(mdev, "mace")) { + printk(KERN_ERR "MACE: can't request IO resources !\n"); + return -EBUSY; + } + + dev = alloc_etherdev(PRIV_BYTES); + if (!dev) { + printk(KERN_ERR "MACE: can't allocate ethernet device !\n"); + rc = -ENOMEM; + goto err_release; + } SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &mdev->ofdev.dev); mp = dev->priv; - mp->of_node = mace; - - if (!request_OF_resource(mace, 0, " (mace)")) { - printk(KERN_ERR "MACE: can't request IO resource !\n"); - goto err_out; - } - if (!request_OF_resource(mace, 1, " (mace tx dma)")) { - printk(KERN_ERR "MACE: can't request TX DMA resource !\n"); - goto err_out; - } - - if (!request_OF_resource(mace, 2, " (mace tx dma)")) { - printk(KERN_ERR "MACE: can't request RX DMA resource !\n"); - goto err_out; - } - - dev->base_addr = mace->addrs[0].address; - mp->mace = (volatile struct mace *) - ioremap(mace->addrs[0].address, 0x1000); - dev->irq = mace->intrs[0].line; + mp->mdev = mdev; + macio_set_drvdata(mdev, dev); + + dev->base_addr = macio_resource_start(mdev, 0); + mp->mace = (volatile struct mace *)ioremap(dev->base_addr, 0x1000); + if (mp->mace == NULL) { + printk(KERN_ERR "MACE: can't map IO resources !\n"); + rc = -ENOMEM; + goto err_free; + } + dev->irq = macio_irq(mdev, 0); printk(KERN_INFO "%s: MACE at", dev->name); rev = addr[0] == 0 && addr[1] == 0xA0; @@ -190,12 +185,24 @@ mp = (struct mace_data *) dev->priv; mp->maccc = ENXMT | ENRCV; + mp->tx_dma = (volatile struct dbdma_regs *) - ioremap(mace->addrs[1].address, 0x1000); - mp->tx_dma_intr = mace->intrs[1].line; + ioremap(macio_resource_start(mdev, 1), 0x1000); + if (mp->tx_dma == NULL) { + printk(KERN_ERR "MACE: can't map TX DMA resources !\n"); + rc = -ENOMEM; + goto err_unmap_io; + } + mp->tx_dma_intr = macio_irq(mdev, 1); + mp->rx_dma = (volatile struct dbdma_regs *) - ioremap(mace->addrs[2].address, 0x1000); - mp->rx_dma_intr = mace->intrs[2].line; + ioremap(macio_resource_start(mdev, 2), 0x1000); + if (mp->rx_dma == NULL) { + printk(KERN_ERR "MACE: can't map RX DMA resources !\n"); + rc = -ENOMEM; + goto err_unmap_tx_dma; + } + mp->rx_dma_intr = macio_irq(mdev, 2);; mp->tx_cmds = (volatile struct dbdma_cmd *) DBDMA_ALIGN(mp + 1); mp->rx_cmds = mp->tx_cmds + NCMDS_TX * N_TX_RING + 1; @@ -229,31 +236,81 @@ dev->set_multicast_list = mace_set_multicast; dev->set_mac_address = mace_set_address; - ether_setup(dev); - + /* + * Most of what is below could be moved to mace_open() + */ mace_reset(dev); - if (request_irq(dev->irq, mace_interrupt, 0, "MACE", dev)) + rc = request_irq(dev->irq, mace_interrupt, 0, "MACE", dev); + if (rc) { printk(KERN_ERR "MACE: can't get irq %d\n", dev->irq); - if (request_irq(mace->intrs[1].line, mace_txdma_intr, 0, "MACE-txdma", - dev)) + goto err_unmap_rx_dma; + } + rc = request_irq(mp->tx_dma_intr, mace_txdma_intr, 0, "MACE-txdma", dev); + if (rc) { printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[1].line); - if (request_irq(mace->intrs[2].line, mace_rxdma_intr, 0, "MACE-rxdma", - dev)) + goto err_free_irq; + } + rc = request_irq(mp->rx_dma_intr, mace_rxdma_intr, 0, "MACE-rxdma", dev); + if (rc) { printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[2].line); + goto err_free_tx_irq; + } + + rc = register_netdev(dev); + if (rc) { + printk(KERN_ERR "Cannot register net device, aborting.\n"); + goto err_free_rx_irq; + } + + return 0; + + err_free_rx_irq: + free_irq(macio_irq(mdev, 2), dev); + err_free_tx_irq: + free_irq(macio_irq(mdev, 1), dev); + err_free_irq: + free_irq(macio_irq(mdev, 0), dev); + err_unmap_rx_dma: + iounmap((void*)mp->rx_dma); + err_unmap_tx_dma: + iounmap((void*)mp->tx_dma); + err_unmap_io: + iounmap((void*)mp->mace); + err_free: + free_netdev(dev); + err_release: + macio_release_resources(mdev); + + return rc; +} + +static int __devexit mace_remove(struct macio_dev *mdev) +{ + struct net_device *dev = macio_get_drvdata(mdev); + struct mace_data *mp; + + BUG_ON(dev == NULL); + + macio_set_drvdata(mdev, NULL); + + mp = dev->priv; - mp->next_mace = mace_devs; - mace_devs = dev; - return; - -err_out: unregister_netdev(dev); - if (mp->of_node) { - release_OF_resource(mp->of_node, 0); - release_OF_resource(mp->of_node, 1); - release_OF_resource(mp->of_node, 2); - } + + free_irq(dev->irq, dev); + free_irq(mp->tx_dma_intr, dev); + free_irq(mp->rx_dma_intr, dev); + + iounmap((void*)mp->rx_dma); + iounmap((void*)mp->tx_dma); + iounmap((void*)mp->mace); + free_netdev(dev); + + macio_release_resources(mdev); + + return 0; } static void dbdma_reset(volatile struct dbdma_regs *dma) @@ -951,37 +1008,45 @@ return IRQ_HANDLED; } -MODULE_AUTHOR("Paul Mackerras"); -MODULE_DESCRIPTION("PowerMac MACE driver."); -MODULE_PARM(port_aaui, "i"); -MODULE_PARM_DESC(port_aaui, "MACE uses AAUI port (0-1)"); -MODULE_LICENSE("GPL"); +static struct of_match mace_match[] = +{ + { + .name = "mace", + .type = OF_ANY_MATCH, + .compatible = OF_ANY_MATCH + }, + {}, +}; -static void __exit mace_cleanup (void) +static struct macio_driver mace_driver = { - struct net_device *dev; - struct mace_data *mp; + .name = "mace", + .match_table = mace_match, + .probe = mace_probe, + .remove = mace_remove, +}; - while ((dev = mace_devs) != 0) { - mp = (struct mace_data *) mace_devs->priv; - mace_devs = mp->next_mace; - unregister_netdev(dev); - free_irq(dev->irq, dev); - free_irq(mp->tx_dma_intr, dev); - free_irq(mp->rx_dma_intr, dev); +static int __init mace_init(void) +{ + return macio_register_driver(&mace_driver); +} - release_OF_resource(mp->of_node, 0); - release_OF_resource(mp->of_node, 1); - release_OF_resource(mp->of_node, 2); +static void __exit mace_cleanup(void) +{ + macio_unregister_driver(&mace_driver); - kfree(dev); - } - if (dummy_buf != NULL) { + if (dummy_buf) { kfree(dummy_buf); dummy_buf = NULL; - } + } } -module_init(mace_probe); +MODULE_AUTHOR("Paul Mackerras"); +MODULE_DESCRIPTION("PowerMac MACE driver."); +MODULE_PARM(port_aaui, "i"); +MODULE_PARM_DESC(port_aaui, "MACE uses AAUI port (0-1)"); +MODULE_LICENSE("GPL"); + +module_init(mace_init); module_exit(mace_cleanup); diff -Nru a/drivers/net/macmace.c b/drivers/net/macmace.c --- a/drivers/net/macmace.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/macmace.c Tue Feb 17 20:00:06 2004 @@ -180,7 +180,7 @@ * model of Macintrash has a MACE (AV macintoshes) */ -int mace_probe(struct net_device *unused) +struct net_device *mace_probe(int unit) { int j; struct mace_data *mp; @@ -188,13 +188,19 @@ struct net_device *dev; unsigned char checksum = 0; static int found = 0; + int err; - if (found || macintosh_config->ether_type != MAC_ETHER_MACE) return -ENODEV; + if (found || macintosh_config->ether_type != MAC_ETHER_MACE) + return ERR_PTR(-ENODEV); found = 1; /* prevent 'finding' one on every device probe */ - dev = init_etherdev(0, PRIV_BYTES); - if (!dev) return -ENOMEM; + dev = alloc_etherdev(PRIV_BYTES); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); mp = (struct mace_data *) dev->priv; dev->base_addr = (u32)MACE_BASE; @@ -221,7 +227,10 @@ checksum ^= bitrev(addr[j<<4]); } - if (checksum != 0xFF) return -ENODEV; + if (checksum != 0xFF) { + free_netdev(dev); + return ERR_PTR(-ENODEV); + } memset(&mp->stats, 0, sizeof(mp->stats)); @@ -234,13 +243,16 @@ dev->set_multicast_list = mace_set_multicast; dev->set_mac_address = mace_set_address; - ether_setup(dev); - printk(KERN_INFO "%s: 68K MACE, hardware address %.2X", dev->name, dev->dev_addr[0]); for (j = 1 ; j < 6 ; j++) printk(":%.2X", dev->dev_addr[j]); printk("\n"); - return 0; + err = register_netdev(dev); + if (!err) + return dev; + + free_netdev(dev); + return ERR_PTR(err); } /* diff -Nru a/drivers/net/macsonic.c b/drivers/net/macsonic.c --- a/drivers/net/macsonic.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/macsonic.c Tue Feb 17 20:00:06 2004 @@ -74,7 +74,6 @@ static int reg_offset; -extern int macsonic_probe(struct net_device* dev); extern int mac_onboard_sonic_probe(struct net_device* dev); extern int mac_nubus_sonic_probe(struct net_device* dev); @@ -110,14 +109,38 @@ #define SONIC_READ_PROM(addr) nubus_readb(prom_addr+addr) -int __init macsonic_probe(struct net_device* dev) +struct net_device * __init macsonic_probe(int unit) { - int rv; + struct net_device *dev = alloc_etherdev(0); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); + + SET_MODULE_OWNER(dev); /* This will catch fatal stuff like -ENOMEM as well as success */ - if ((rv = mac_onboard_sonic_probe(dev)) != -ENODEV) - return rv; - return mac_nubus_sonic_probe(dev); + err = mac_onboard_sonic_probe(dev); + if (err == 0) + goto found; + if (err != -ENODEV) + goto out; + err = mac_nubus_sonic_probe(dev); + if (err) + goto out; +found: + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + kfree(dev->priv); +out: + free_netdev(dev); + return ERR_PTR(err); } /* @@ -195,6 +218,7 @@ if ((lp->rba = (char *) kmalloc(SONIC_NUM_RRS * SONIC_RBSIZE, GFP_KERNEL | GFP_DMA)) == NULL) { printk(KERN_ERR "%s: couldn't allocate receive buffers\n", dev->name); + dev->priv = NULL; kfree(lp); return -ENOMEM; } @@ -229,8 +253,6 @@ sonic_write(dev, SONIC_FAET, 0xffff); sonic_write(dev, SONIC_MPT, 0xffff); - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); return 0; } @@ -344,30 +366,6 @@ printk("yes\n"); - if (dev) { - dev = init_etherdev(dev, sizeof(struct sonic_local)); - if (!dev) - return -ENOMEM; - /* methinks this will always be true but better safe than sorry */ - if (dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL); - if (!dev->priv) - return -ENOMEM; - } - } else { - dev = init_etherdev(NULL, sizeof(struct sonic_local)); - } - - if (dev == NULL) - return -ENOMEM; - - if(dev->priv) { - printk("%s: warning! sonic entering with priv already allocated!\n", - dev->name); - printk("%s: discarding, will attempt to reallocate\n", dev->name); - dev->priv = NULL; - } - /* Danger! My arms are flailing wildly! You *must* set this before using sonic_read() */ @@ -497,7 +495,6 @@ { static int slots; struct nubus_dev* ndev = NULL; - struct sonic_local* lp; unsigned long base_addr, prom_addr; u16 sonic_dcr; int id; @@ -567,25 +564,6 @@ return -ENODEV; } - if (dev) { - dev = init_etherdev(dev, sizeof(struct sonic_local)); - if (!dev) - return -ENOMEM; - /* methinks this will always be true but better safe than sorry */ - if (dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL); - if (!dev->priv) /* FIXME: kfree dev if necessary */ - return -ENOMEM; - } - } else { - dev = init_etherdev(NULL, sizeof(struct sonic_local)); - } - - if (dev == NULL) - return -ENOMEM; - - lp = (struct sonic_local*) dev->priv; - memset(lp, 0, sizeof(struct sonic_local)); /* Danger! My arms are flailing wildly! You *must* set this before using sonic_read() */ dev->base_addr = base_addr; @@ -631,8 +609,7 @@ } #ifdef MODULE -static char namespace[16] = ""; -static struct net_device dev_macsonic; +static struct net_device *dev_macsonic; MODULE_PARM(sonic_debug, "i"); MODULE_PARM_DESC(sonic_debug, "macsonic debug level (1-4)"); @@ -641,24 +618,20 @@ int init_module(void) { - dev_macsonic.name = namespace; - dev_macsonic.init = macsonic_probe; - - if (register_netdev(&dev_macsonic) != 0) { + dev_macsonic = macsonic_probe(-1); + if (IS_ERR(dev_macsonic)) { printk(KERN_WARNING "macsonic.c: No card found\n"); - return -ENXIO; - } + return PTR_ERR(dev_macsonic); + } return 0; } void cleanup_module(void) { - if (dev_macsonic.priv != NULL) { - unregister_netdev(&dev_macsonic); - kfree(dev_macsonic.priv); - dev_macsonic.priv = NULL; - } + unregister_netdev(dev_macsonic); + kfree(dev_macsonic->priv); + free_netdev(dev_macsonic); } #endif /* MODULE */ diff -Nru a/drivers/net/meth.c b/drivers/net/meth.c --- a/drivers/net/meth.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/meth.c Tue Feb 17 20:00:07 2004 @@ -95,7 +95,6 @@ spinlock_t meth_lock; } meth_private; -extern struct net_device meth_devs[]; void meth_tx_timeout (struct net_device *dev); void meth_interrupt(int irq, void *dev_id, struct pt_regs *pregs); @@ -762,17 +761,16 @@ /* * The init function (sometimes called probe). - * It is invoked by register_netdev() */ -int meth_init(struct net_device *dev) +static struct net_device *meth_init(struct net_device *dev) { + struct net_device *dev; meth_private *priv; int ret; - /* - * Then, assign other fields in dev, using ether_setup() and some - * hand assignments - */ - ether_setup(dev); /* assign some of the fields */ + + dev = alloc_etherdev(sizeof(struct meth_private)); + if (!dev) + return ERR_PTR(-ENOMEM); dev->open = meth_open; dev->stop = meth_release; @@ -787,16 +785,8 @@ dev->irq = MACE_ETHERNET_IRQ; SET_MODULE_OWNER(dev); - /* - * Then, allocate the priv field. This encloses the statistics - * and a few private fields. - */ - priv = kmalloc(sizeof(struct meth_private), GFP_KERNEL); - if (priv == NULL) - return -ENOMEM; - dev->priv=priv; - memset(priv, 0, sizeof(struct meth_private)); - spin_lock_init(&((struct meth_private *) dev->priv)->meth_lock); + priv = dev->priv; + spin_lock_init(&priv->meth_lock); /* * Make the usual checks: check_region(), probe irq, ... -ENODEV * should be returned if no device found. No resource should be @@ -807,28 +797,41 @@ priv->phy_addr = -1; /* No phy is known yet... */ /* Initialize the hardware */ - if((ret=meth_reset(dev)) < 0) - return ret; + ret = meth_reset(dev); + if (ret < 0) + goto out; /* Allocate the ring buffers */ - if((ret=meth_init_tx_ring(priv))<0||(ret=meth_init_rx_ring(priv))<0){ - meth_free_tx_ring(priv); - meth_free_rx_ring(priv); - return ret; - } + ret = meth_init_tx_ring(priv); + if (ret < 0) + goto out; + + ret = meth_init_rx_ring(priv); + if (ret < 0) + goto out1; + + ret = register_netdev(dev); + if (ret) + goto out2; printk("SGI O2 Fast Ethernet rev. %ld\n", priv->regs->mac_ctrl >> 29); - return 0; + return ret; + +out2: + meth_free_rx_ring(priv); +out1: + meth_free_tx_ring(priv); +out: + free_netdev(dev); + return ERR_PTR(ret); } /* * The devices */ -struct net_device meth_devs[1] = { - { init: meth_init, } /* init, nothing more */ -}; +struct net_device *meth_dev; /* * Finally, the module stuff @@ -836,23 +839,19 @@ int meth_init_module(void) { - int result, device_present = 0; - - strcpy(meth_devs[0].name, "eth%d"); - - if ( (result = register_netdev(meth_devs)) ) - printk("meth: error %i registering device \"%s\"\n", - result, meth_devs->name); - else device_present++; - - return device_present ? 0 : -ENODEV; + meth_dev = meth_init(); + if (IS_ERR(meth_dev)) + return PTR_ERR(meth_dev); + return 0; } void meth_cleanup(void) { - kfree(meth_devs->priv); - unregister_netdev(meth_devs); - return; + meth_private *priv = meth_dev->priv; + unregister_netdev(meth_dev); + meth_free_rx_ring(priv); + meth_free_tx_ring(priv); + free_netdev(meth_dev); } module_init(meth_init_module); diff -Nru a/drivers/net/mvme147.c b/drivers/net/mvme147.c --- a/drivers/net/mvme147.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/mvme147.c Tue Feb 17 20:00:06 2004 @@ -41,7 +41,7 @@ struct m147lance_private { struct lance_private lance; void *base; - void *ram; + unsigned long ram; }; /* function prototypes... This is easy because all the grot is in the @@ -49,7 +49,6 @@ * plus board-specific init, open and close actions. * Oh, and we need to tell the generic code how to read and write LANCE registers... */ -int mvme147lance_probe(struct net_device *dev); static int m147lance_open(struct net_device *dev); static int m147lance_close(struct net_device *dev); static void m147lance_writerap(struct m147lance_private *lp, unsigned short value); @@ -60,29 +59,29 @@ typedef void (*writerdp_t)(void *, unsigned short); typedef unsigned short (*readrdp_t)(void *); -#ifdef MODULE -static struct m147lance_private *root_m147lance_dev; -#endif - /* Initialise the one and only on-board 7990 */ -int __init mvme147lance_probe(struct net_device *dev) +struct net_device * __init mvme147lance_probe(int unit) { + struct net_device *dev; static int called; static const char name[] = "MVME147 LANCE"; struct m147lance_private *lp; u_long *addr; u_long address; + int err; if (!MACH_IS_MVME147 || called) - return -ENODEV; + return ERR_PTR(-ENODEV); called++; - SET_MODULE_OWNER(dev); + dev = alloc_etherdev(sizeof(struct m147lance_private)); + if (!dev) + return ERR_PTR(-ENOMEM); - dev->priv = kmalloc(sizeof(struct m147lance_private), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct m147lance_private)); + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); + + SET_MODULE_OWNER(dev); /* Fill the dev fields */ dev->base_addr = (unsigned long)MVME147_LANCE_BASE; @@ -114,11 +113,12 @@ dev->dev_addr[5]); lp = (struct m147lance_private *)dev->priv; - lp->ram = (void *)__get_dma_pages(GFP_ATOMIC, 3); /* 16K */ + lp->ram = __get_dma_pages(GFP_ATOMIC, 3); /* 16K */ if (!lp->ram) { printk("%s: No memory for LANCE buffers\n", dev->name); - return -ENODEV; + free_netdev(dev); + return ERR_PTR(-ENOMEM); } lp->lance.name = (char*)name; /* discards const, shut up gcc */ @@ -134,15 +134,15 @@ lp->lance.lance_log_tx_bufs = LANCE_LOG_TX_BUFFERS; lp->lance.rx_ring_mod_mask = RX_RING_MOD_MASK; lp->lance.tx_ring_mod_mask = TX_RING_MOD_MASK; - ether_setup(dev); -#ifdef MODULE - dev->ifindex = dev_new_index(); - lp->next_module = root_m147lance_dev; - root_m147lance_dev = lp; -#endif /* MODULE */ + err = register_netdev(dev); + if (err) { + free_pages(lp->ram, 3); + free_netdev(dev); + return ERR_PTR(err); + } - return 0; + return dev; } static void m147lance_writerap(struct m147lance_private *lp, unsigned short value) @@ -185,23 +185,21 @@ #ifdef MODULE MODULE_LICENSE("GPL"); +static struct net_device *dev_mvme147_lance; int init_module(void) { - root_lance_dev = NULL; - return mvme147lance_probe(NULL); + dev_mvme147_lance = mvme147lance_probe(-1); + if (IS_ERR(dev_mvme147_lance)) + return PTR_ERR(dev_mvme147_lance); + return 0; } void cleanup_module(void) { - /* Walk the chain of devices, unregistering them */ - struct m147lance_private *lp; - while (root_m147lance_dev) { - lp = root_m147lance_dev->next_module; - unregister_netdev(root_lance_dev->dev); - free_pages(lp->ram, 3); - free_netdev(root_lance_dev->dev); - root_lance_dev = lp; - } + struct m147lance_private *lp = dev_mvme147_lance->priv; + unregister_netdev(dev_mvme147_lance); + free_pages(lp->ram, 3); + free_netdev(dev_mvme147_lance); } #endif /* MODULE */ diff -Nru a/drivers/net/ne.c b/drivers/net/ne.c --- a/drivers/net/ne.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ne.c Tue Feb 17 20:00:06 2004 @@ -126,7 +126,6 @@ #define NESM_START_PG 0x40 /* First page of TX buffer */ #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ -int ne_probe(struct net_device *dev); static int ne_probe1(struct net_device *dev, int ioaddr); static int ne_probe_isapnp(struct net_device *dev); @@ -163,9 +162,10 @@ E2010 starts at 0x100 and ends at 0x4000. E2010-x starts at 0x100 and ends at 0xffff. */ -int __init ne_probe(struct net_device *dev) +static int __init do_ne_probe(struct net_device *dev) { unsigned int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -183,6 +183,7 @@ /* Last resort. The semi-risky ISA auto-probe. */ for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) { int ioaddr = netcard_portlist[base_addr]; + dev->irq = irq; if (ne_probe1(dev, ioaddr) == 0) return 0; } @@ -191,6 +192,40 @@ return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; + if (idev) + pnp_device_detach(idev); + free_irq(dev->irq, dev); + release_region(dev->base_addr, NE_IO_EXTENT); +} + +struct net_device * __init ne_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_ne_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init ne_probe_isapnp(struct net_device *dev) { int i; @@ -425,20 +460,12 @@ goto err_out; } - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) - { - printk (" unable to get memory for dev->priv.\n"); - ret = -ENOMEM; - goto err_out; - } - /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ ret = request_irq(dev->irq, ei_interrupt, 0, name, dev); if (ret) { printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret); - goto err_out_kfree; + goto err_out; } dev->base_addr = ioaddr; @@ -472,9 +499,6 @@ NS8390_init(dev, 0); return 0; -err_out_kfree: - kfree(dev->priv); - dev->priv = NULL; err_out: release_region(ioaddr, NE_IO_EXTENT); return ret; @@ -734,7 +758,7 @@ #ifdef MODULE #define MAX_NE_CARDS 4 /* Max number of NE cards per module */ -static struct net_device dev_ne[MAX_NE_CARDS]; +static struct net_device *dev_ne[MAX_NE_CARDS]; static int io[MAX_NE_CARDS]; static int irq[MAX_NE_CARDS]; static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */ @@ -758,25 +782,31 @@ int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; + struct net_device *dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->mem_end = bad[this_dev]; dev->base_addr = io[this_dev]; - dev->init = ne_probe; - if (register_netdev(dev) == 0) { - found++; - continue; - } - if (found != 0) { /* Got at least one. */ - return 0; + if (do_ne_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_ne[found++] = dev; + continue; + } + cleanup_card(dev); } + free_netdev(dev); + if (found) + break; if (io[this_dev] != 0) printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]); else printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n"); return -ENXIO; } - return 0; + if (found) + return 0; + return -ENODEV; } void cleanup_module(void) @@ -784,16 +814,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; - if (idev) - pnp_device_detach(idev); - free_irq(dev->irq, dev); - release_region(dev->base_addr, NE_IO_EXTENT); + struct net_device *dev = dev_ne[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/ne2.c b/drivers/net/ne2.c --- a/drivers/net/ne2.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ne2.c Tue Feb 17 20:00:08 2004 @@ -242,7 +242,7 @@ * Note that at boot, this probe only picks up one card at a time. */ -int __init ne2_probe(struct net_device *dev) +static int __init do_ne2_probe(struct net_device *dev) { static int current_mca_slot = -1; int i; @@ -262,16 +262,52 @@ mca_find_unused_adapter(ne2_adapters[i].id, 0); if((current_mca_slot != MCA_NOTFOUND) && !adapter_found) { + int res; mca_set_adapter_name(current_mca_slot, ne2_adapters[i].name); mca_mark_as_used(current_mca_slot); - return ne2_probe1(dev, current_mca_slot); + res = ne2_probe1(dev, current_mca_slot); + if (res) + mca_mark_as_unused(current_mca_slot); + return res; } } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + mca_mark_as_unused(ei_status.priv); + mca_set_adapter_procfn( ei_status.priv, NULL, NULL); + free_irq(dev->irq, dev); + release_region(dev->base_addr, NE_IO_EXTENT); +} + +struct net_device * __init ne2_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_ne2_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} static int ne2_procinfo(char *buf, int slot, struct net_device *dev) { @@ -443,14 +479,6 @@ dev->base_addr = base_addr; - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to get memory for dev->priv.\n"); - free_irq(dev->irq, dev); - retval = -ENOMEM; - goto out; - } - for(i = 0; i < ETHER_ADDR_LEN; i++) { printk(" %2.2x", SA_prom[i]); dev->dev_addr[i] = SA_prom[i]; @@ -735,7 +763,7 @@ #ifdef MODULE #define MAX_NE_CARDS 4 /* Max number of NE cards per module */ -static struct net_device dev_ne[MAX_NE_CARDS]; +static struct net_device *dev_ne[MAX_NE_CARDS]; static int io[MAX_NE_CARDS]; static int irq[MAX_NE_CARDS]; static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */ @@ -754,23 +782,30 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; + dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->mem_end = bad[this_dev]; dev->base_addr = io[this_dev]; - dev->init = ne2_probe; - if (register_netdev(dev) != 0) { - if (found != 0) return 0; /* Got at least one. */ - - printk(KERN_WARNING "ne2.c: No NE/2 card found.\n"); - return -ENXIO; + if (do_ne2_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_ne[found++] = dev; + continue; + } + cleanup_card(dev); } - found++; + free_netdev(dev); + break; } - return 0; + if (found) + return 0; + printk(KERN_WARNING "ne2.c: No NE/2 card found\n"); + return -ENXIO; } void cleanup_module(void) @@ -778,14 +813,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; - if (dev->priv != NULL) { - mca_mark_as_unused(ei_status.priv); - mca_set_adapter_procfn( ei_status.priv, NULL, NULL); - kfree(dev->priv); - free_irq(dev->irq, dev); - release_region(dev->base_addr, NE_IO_EXTENT); + struct net_device *dev = dev_ne[this_dev]; + if (dev) { unregister_netdev(dev); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c --- a/drivers/net/ne2k-pci.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ne2k-pci.c Tue Feb 17 20:00:06 2004 @@ -532,8 +532,12 @@ insl(NE_BASE + NE_DATAPORT, buf, count>>2); if (count & 3) { buf += count & ~3; - if (count & 2) - *((u16*)buf)++ = le16_to_cpu(inw(NE_BASE + NE_DATAPORT)); + if (count & 2) { + u16 *b = (u16 *)buf; + + *b++ = le16_to_cpu(inw(NE_BASE + NE_DATAPORT)); + buf = (char *)b; + } if (count & 1) *buf = inb(NE_BASE + NE_DATAPORT); } @@ -593,8 +597,12 @@ outsl(NE_BASE + NE_DATAPORT, buf, count>>2); if (count & 3) { buf += count & ~3; - if (count & 2) - outw(cpu_to_le16(*((u16*)buf)++), NE_BASE + NE_DATAPORT); + if (count & 2) { + u16 *b = (u16 *)buf; + + outw(cpu_to_le16(*b++), NE_BASE + NE_DATAPORT); + buf = (char *)b; + } } } diff -Nru a/drivers/net/ne2k_cbus.c b/drivers/net/ne2k_cbus.c --- a/drivers/net/ne2k_cbus.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ne2k_cbus.c Tue Feb 17 20:00:06 2004 @@ -78,7 +78,6 @@ #include "ne2k_cbus.h" -int ne_probe(struct net_device *dev); static int ne_probe1(struct net_device *dev, int ioaddr); static int ne_open(struct net_device *dev); static int ne_close(struct net_device *dev); @@ -113,9 +112,10 @@ E2010 starts at 0x100 and ends at 0x4000. E2010-x starts at 0x100 and ends at 0xffff. */ -int __init ne_probe(struct net_device *dev) +static int __init do_ne_probe(struct net_device *dev) { unsigned int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -135,7 +135,7 @@ if (ei_debug > 2) printk(KERN_DEBUG "ne_probe(): call ne_probe_cbus(base_addr=0x%x)\n", base_addr); - result = ne_probe_cbus(dev, hw, base_addr); + result = ne_probe_cbus(dev, hw, base_addr, irq); if (result != 0) ne2k_cbus_destroy(dev); @@ -156,13 +156,13 @@ if (hw && hw->hwtype) { const unsigned short *plist; for (plist = hw->portlist; *plist; plist++) - if (ne_probe_cbus(dev, hw, *plist) == 0) + if (ne_probe_cbus(dev, hw, *plist, irq) == 0) return 0; } else { for (hw = &ne2k_cbus_hwinfo_list[0]; hw->hwtype; hw++) { const unsigned short *plist; for (plist = hw->portlist; *plist; plist++) - if (ne_probe_cbus(dev, hw, *plist) == 0) + if (ne_probe_cbus(dev, hw, *plist, irq) == 0) return 0; } } @@ -174,7 +174,45 @@ return -ENODEV; } -static int __init ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr) +static void cleanup_card(struct net_device *dev) +{ + const struct ne2k_cbus_region *rlist; + const struct ne2k_cbus_hwinfo *hw = ne2k_cbus_get_hwinfo((int)(dev->mem_start & NE2K_CBUS_HARDWARE_TYPE_MASK)); + + free_irq(dev->irq, dev); + for (rlist = hw->regionlist; rlist->range; rlist++) { + release_region(dev->base_addr + rlist->start, + rlist->range); + } + ne2k_cbus_destroy(dev); +} + +struct net_device * __init ne_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_ne_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + +static int __init ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr, int irq) { if (ei_debug > 2) printk(KERN_DEBUG "ne_probe_cbus(): entered. (called from %p)\n", @@ -182,6 +220,7 @@ if (hw && hw->hwtype) { ne2k_cbus_set_hwtype(dev, hw, ioaddr); + dev->irq = irq; return ne_probe1(dev, ioaddr); } else { /* auto detect */ @@ -189,6 +228,7 @@ printk(KERN_DEBUG "ne_probe_cbus(): try to determine hardware types.\n"); for (hw = &ne2k_cbus_hwinfo_list[0]; hw->hwtype; hw++) { ne2k_cbus_set_hwtype(dev, hw, ioaddr); + dev->irq = irq; if (ne_probe1(dev, ioaddr) == 0) return 0; } @@ -301,11 +341,12 @@ if (ei_debug > 2) printk(" [CNET98EL-specific initialize..."); outb_p(E8390_NODMA | E8390_STOP, ioaddr + E8390_CMD); /* 0x20|0x1 */ + ret = -ENODEV; i = inb(ioaddr); if ((i & ~0x2) != (0x20 | 0x01)) - return -ENODEV; + goto err_out; if ((inb(ioaddr + 0x7) & 0x80) != 0x80) - return -ENODEV; + goto err_out; outb_p(E8390_RXOFF, ioaddr + EN0_RXCR); /* out(ioaddr+0xc, 0x20) */ /* outb_p(ENDCFG_WTS|ENDCFG_FT1|ENDCFG_LS, ioaddr+EN0_DCFG); */ outb_p(ENDCFG_WTS | 0x48, ioaddr + EN0_DCFG); /* 0x49 */ @@ -330,7 +371,7 @@ if (ei_debug > 2) printk("] "); printk("memory failure at %x\n", i); - return -ENODEV; + goto err_out; } if (ei_debug > 2) printk(" good..."); @@ -338,7 +379,7 @@ if (ei_debug > 2) printk("] "); printk("IRQ must be specified for C-NET(98)E/L. probe failed.\n"); - return -ENODEV; + goto err_out; } outb((dev->irq > 5) ? (dev->irq & 4):(dev->irq >> 1), ioaddr + (0x2 | 0x400)); outb(0x7e, ioaddr + (0x4 | 0x400)); @@ -457,14 +498,6 @@ goto err_out; } - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) - { - printk (" unable to get memory for dev->priv.\n"); - ret = -ENOMEM; - goto err_out; - } - /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ ret = request_irq(dev->irq, ei_interrupt, 0, name, dev); @@ -779,7 +812,7 @@ #ifdef MODULE #define MAX_NE_CARDS 4 /* Max number of NE cards per module */ -static struct net_device dev_ne[MAX_NE_CARDS]; +static struct net_device *dev_ne[MAX_NE_CARDS]; static int io[MAX_NE_CARDS]; static int irq[MAX_NE_CARDS]; static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */ @@ -806,26 +839,32 @@ int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; + struct net_device *dev = alloc_ei_netdev(); + if (!dev) + break; dev->irq = irq[this_dev]; dev->mem_end = bad[this_dev]; dev->base_addr = io[this_dev]; dev->mem_start = hwtype[this_dev]; - dev->init = ne_probe; - if (register_netdev(dev) == 0) { - found++; - continue; - } - if (found != 0) { /* Got at least one. */ - return 0; + if (do_ne_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_ne[found++] = dev; + continue; + } + cleanup_card(dev); } + free_netdev(dev); + if (found) + break; if (io[this_dev] != 0) printk(KERN_WARNING "ne2k_cbus: No NE*000 card found at i/o = %#x\n", io[this_dev]); else - printk(KERN_NOTICE "ne2k_cbus: You must supply \"io=0xNNN\" value(s) for C-Bus cards.\n"); + printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n"); return -ENXIO; } - return 0; + if (found) + return 0; + return -ENODEV; } void cleanup_module(void) @@ -833,18 +872,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) { - struct net_device *dev = &dev_ne[this_dev]; - if (dev->priv != NULL) { - const struct ne2k_cbus_region *rlist; - const struct ne2k_cbus_hwinfo *hw = ne2k_cbus_get_hwinfo((int)(dev->mem_start & NE2K_CBUS_HARDWARE_TYPE_MASK)); - - free_irq(dev->irq, dev); - for (rlist = hw->regionlist; rlist->range; rlist++) { - release_region(dev->base_addr + rlist->start, - rlist->range); - } + struct net_device *dev = dev_ne[this_dev]; + if (dev) { unregister_netdev(dev); - ne2k_cbus_destroy(dev); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/ne2k_cbus.h b/drivers/net/ne2k_cbus.h --- a/drivers/net/ne2k_cbus.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/ne2k_cbus.h Tue Feb 17 20:00:05 2004 @@ -477,5 +477,5 @@ } #endif -static int ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr); +static int ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr, int irq); /* End of ne2k_cbus.h */ diff -Nru a/drivers/net/ne3210.c b/drivers/net/ne3210.c --- a/drivers/net/ne3210.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ne3210.c Tue Feb 17 20:00:06 2004 @@ -111,12 +111,6 @@ device->driver_data = dev; ioaddr = edev->base_addr; - if (ethdev_init (dev)) { - printk ("ne3210.c: unable to allocate memory for dev->priv!\n"); - retval = -ENOMEM; - goto out; - } - if (!request_region(ioaddr, NE3210_IO_EXTENT, dev->name)) { retval = -EBUSY; goto out; @@ -356,24 +350,6 @@ .remove = __devexit_p (ne3210_eisa_remove), }, }; - -#ifdef MODULE -#if 0 -#define MAX_NE3210_CARDS 4 /* Max number of NE3210 cards per module */ -static struct net_device dev_ne3210[MAX_NE3210_CARDS]; -static int io[MAX_NE3210_CARDS]; -static int irq[MAX_NE3210_CARDS]; -static int mem[MAX_NE3210_CARDS]; - -MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i"); -MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i"); -MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i"); -MODULE_PARM_DESC(io, "I/O base address(es)"); -MODULE_PARM_DESC(irq, "IRQ number(s)"); -MODULE_PARM_DESC(mem, "memory base address(es)"); -#endif -#endif /* MODULE */ - MODULE_DESCRIPTION("NE3210 EISA Ethernet driver"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/net_init.c b/drivers/net/net_init.c --- a/drivers/net/net_init.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/net_init.c Tue Feb 17 20:00:05 2004 @@ -73,23 +73,28 @@ struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) { + void *p; struct net_device *dev; int alloc_size; - /* ensure 32-byte alignment of the private area */ - alloc_size = sizeof (*dev) + sizeof_priv + 31; + /* ensure 32-byte alignment of both the device and private area */ - dev = (struct net_device *) kmalloc (alloc_size, GFP_KERNEL); - if (dev == NULL) - { - printk(KERN_ERR "alloc_dev: Unable to allocate device memory.\n"); + alloc_size = (sizeof(struct net_device) + 31) & ~31; + alloc_size += sizeof_priv + 31; + + p = kmalloc (alloc_size, GFP_KERNEL); + if (!p) { + printk(KERN_ERR "alloc_dev: Unable to allocate device.\n"); return NULL; } - memset(dev, 0, alloc_size); + memset(p, 0, alloc_size); + + dev = (struct net_device *)(((long)p + 31) & ~31); + dev->padded = (char *)dev - (char *)p; if (sizeof_priv) - dev->priv = (void *) (((long)(dev + 1) + 31) & ~31); + dev->priv = netdev_priv(dev); setup(dev); strcpy(dev->name, mask); diff -Nru a/drivers/net/ni5010.c b/drivers/net/ni5010.c --- a/drivers/net/ni5010.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ni5010.c Tue Feb 17 20:00:06 2004 @@ -82,7 +82,7 @@ #ifndef FULL_IODETECT /* A zero-terminated list of I/O addresses to be probed. */ -static unsigned int ni5010_portlist[] __initdata = +static unsigned int ports[] __initdata = { 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 }; #endif @@ -95,13 +95,11 @@ struct ni5010_local { struct net_device_stats stats; int o_pkt_size; - int i_pkt_size; spinlock_t lock; }; /* Index to functions, as function prototypes. */ -extern int ni5010_probe(struct net_device *dev); static int ni5010_probe1(struct net_device *dev, int ioaddr); static int ni5010_open(struct net_device *dev); static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev); @@ -120,38 +118,58 @@ static void dump_packet(void *buf, int len); static void ni5010_show_registers(struct net_device *dev); +static int io; +static int irq; -int __init ni5010_probe(struct net_device *dev) +struct net_device * __init ni5010_probe(int unit) { + struct net_device *dev = alloc_etherdev(sizeof(struct ni5010_local)); int *port; - int base_addr = dev->base_addr; + int err = 0; - PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name)); + if (!dev) + return ERR_PTR(-ENOMEM); - SET_MODULE_OWNER(dev); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + } - if (base_addr > 0x1ff) /* Check a single specified location. */ - return ni5010_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; + PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name)); + SET_MODULE_OWNER(dev); + + if (io > 0x1ff) { /* Check a single specified location. */ + err = ni5010_probe1(dev, io); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { #ifdef FULL_IODETECT - for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) { - if (check_region(ioaddr, NI5010_IO_EXTENT)) - continue; - if (ni5010_probe1(dev, ioaddr) == 0) - return 0; - } + for (io=0x200; io<0x400 && ni5010_probe1(dev, io) ; io+=0x20) + ; + if (io == 0x400) + err = -ENODEV; + #else - for (port = ni5010_portlist; *port; port++) { - int ioaddr = *port; - if (check_region(ioaddr, NI5010_IO_EXTENT)) - continue; - if (ni5010_probe1(dev, ioaddr) == 0) - return 0; - } + for (port = ports; *port && ni5010_probe1(dev, *port); port++) + ; + if (!*port) + err = -ENODEV; #endif /* FULL_IODETECT */ - return -ENODEV; + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + release_region(dev->base_addr, NI5010_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } static inline int rd_port(int ioaddr) @@ -188,9 +206,17 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed; + struct ni5010_local *lp; int i; unsigned int data = 0; int boguscount = 40; + int err = -ENODEV; + + dev->base_addr = ioaddr; + dev->irq = irq; + + if (!request_region(ioaddr, NI5010_IO_EXTENT, boardname)) + return -EBUSY; /* * This is no "official" probe method, I've rather tested which @@ -205,36 +231,40 @@ * * - Andreas */ - + PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n", dev->name, ioaddr)); - if (inb(ioaddr+0) == 0xff) return -ENODEV; + if (inb(ioaddr+0) == 0xff) + goto out; while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff) { - if (boguscount-- == 0) return -ENODEV; + if (boguscount-- == 0) + goto out; } PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name)); for (i=0; i<32; i++) if ( (data = rd_port(ioaddr)) != 0xff) break; - if (data==0xff) return -ENODEV; + if (data==0xff) + goto out; PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name)); - if ( (data == SA_ADDR0) && - (rd_port(ioaddr) == SA_ADDR1) && - (rd_port(ioaddr) == SA_ADDR2) ) { - for (i=0; i<4; i++) rd_port(ioaddr); - if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) || - (rd_port(ioaddr) != NI5010_MAGICVAL2) ) { - return -ENODEV; - } - } else return -ENODEV; - + if ((data != SA_ADDR0) || (rd_port(ioaddr) != SA_ADDR1) || + (rd_port(ioaddr) != SA_ADDR2)) + goto out; + + for (i=0; i<4; i++) + rd_port(ioaddr); + + if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) || + (rd_port(ioaddr) != NI5010_MAGICVAL2) ) + goto out; + PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name)); if (NI5010_DEBUG && version_printed++ == 0) @@ -267,8 +297,9 @@ PRINTK2((KERN_DEBUG "%s: I/O #6 passed!\n", dev->name)); if (dev->irq == 0) { + err = -EAGAIN; printk(KERN_WARNING "%s: no IRQ found!\n", dev->name); - return -EAGAIN; + goto out; } PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name)); } else if (dev->irq == 2) { @@ -278,19 +309,9 @@ PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); /* DMA is not supported (yet?), so no use detecting it */ + lp = (struct ni5010_local*)dev->priv; - if (dev->priv == NULL) { - struct ni5010_local* lp; - - dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA); - if (dev->priv == NULL) { - printk(KERN_WARNING "%s: Failed to allocate private memory\n", dev->name); - return -ENOMEM; - } - - lp = (struct ni5010_local*)dev->priv; - spin_lock_init(&lp->lock); - } + spin_lock_init(&lp->lock); PRINTK2((KERN_DEBUG "%s: I/O #10 passed!\n", dev->name)); @@ -315,9 +336,6 @@ } printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); memset(dev->priv, 0, sizeof(struct ni5010_local)); - - /* Grab the region so we can find another board if autoIRQ fails. */ - request_region(ioaddr, NI5010_IO_EXTENT, boardname); dev->open = ni5010_open; dev->stop = ni5010_close; @@ -327,9 +345,6 @@ dev->tx_timeout = ni5010_timeout; dev->watchdog_timeo = HZ/20; - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - dev->flags &= ~IFF_MULTICAST; /* Multicast doesn't work */ /* Shut up the ni5010 */ @@ -345,6 +360,9 @@ printk(KERN_INFO "Join the NI5010 driver development team!\n"); printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n"); return 0; +out: + release_region(dev->base_addr, NI5010_IO_EXTENT); + return err; } /* @@ -513,6 +531,7 @@ int ioaddr = dev->base_addr; unsigned char rcv_stat; struct sk_buff *skb; + int i_pkt_size; PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()\n", dev->name)); @@ -532,17 +551,17 @@ outb(0xff, EDLC_RCLR); /* Clear the interrupt */ - lp->i_pkt_size = inw(IE_RCNT); - if (lp->i_pkt_size > ETH_FRAME_LEN || lp->i_pkt_size < 10 ) { + i_pkt_size = inw(IE_RCNT); + if (i_pkt_size > ETH_FRAME_LEN || i_pkt_size < 10 ) { PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4x\n", - dev->name, lp->i_pkt_size)); + dev->name, i_pkt_size)); lp->stats.rx_errors++; lp->stats.rx_length_errors++; return; } /* Malloc up new buffer. */ - skb = dev_alloc_skb(lp->i_pkt_size + 3); + skb = dev_alloc_skb(i_pkt_size + 3); if (skb == NULL) { printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name); lp->stats.rx_dropped++; @@ -555,7 +574,7 @@ /* Read packet into buffer */ outb(MM_MUX, IE_MMODE); /* Rcv buffer to system bus */ outw(0, IE_GP); /* Seek to beginning of packet */ - insb(IE_RBUF, skb_put(skb, lp->i_pkt_size), lp->i_pkt_size); + insb(IE_RBUF, skb_put(skb, i_pkt_size), i_pkt_size); if (NI5010_DEBUG >= 4) dump_packet(skb->data, skb->len); @@ -564,10 +583,10 @@ netif_rx(skb); dev->last_rx = jiffies; lp->stats.rx_packets++; - lp->stats.rx_bytes += lp->i_pkt_size; + lp->stats.rx_bytes += i_pkt_size; PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4x\n", - dev->name, lp->i_pkt_size)); + dev->name, i_pkt_size)); } @@ -697,10 +716,10 @@ if (NI5010_DEBUG > 3) dump_packet(buf, length); - buf_offs = NI5010_BUFSIZE - length - pad; - lp->o_pkt_size = length + pad; + buf_offs = NI5010_BUFSIZE - length - pad; spin_lock_irqsave(&lp->lock, flags); + lp->o_pkt_size = length + pad; outb(0, EDLC_RMASK); /* Mask all receive interrupts */ outb(0, IE_MMODE); /* Put Xmit buffer on system bus */ @@ -745,9 +764,7 @@ } #ifdef MODULE -static struct net_device dev_ni5010; -static int io; -static int irq; +static struct net_device *dev_ni5010; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); @@ -756,8 +773,6 @@ int init_module(void) { - int result; - PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); /* if(io <= 0 || irq == 0){ @@ -771,29 +786,18 @@ } PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3x\n", boardname, irq, io)); - dev_ni5010.irq=irq; - dev_ni5010.base_addr=io; - dev_ni5010.init=ni5010_probe; - if ((result = register_netdev(&dev_ni5010)) != 0) { - PRINTK((KERN_WARNING "%s: register_netdev returned %d.\n", - boardname, result)); - return -EIO; - } + dev_ni5010 = ni5010_probe(-1); + if (IS_ERR(dev_ni5010)) + return PTR_ERR(dev_ni5010); return 0; } -void -cleanup_module(void) +void cleanup_module(void) { PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname)); - - unregister_netdev(&dev_ni5010); - - release_region(dev_ni5010.base_addr, NI5010_IO_EXTENT); - if (dev_ni5010.priv != NULL){ - kfree(dev_ni5010.priv); - dev_ni5010.priv = NULL; - } + unregister_netdev(dev_ni5010); + release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT); + free_netdev(dev_ni5010); } #endif /* MODULE */ MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/ni52.c b/drivers/net/ni52.c --- a/drivers/net/ni52.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/ni52.c Tue Feb 17 20:00:07 2004 @@ -354,50 +354,76 @@ memset((char *)p->scb,0,sizeof(struct scb_struct)); } +/* set: io,irq,memstart,memend or set it when calling insmod */ +static int irq=9; +static int io=0x300; +static long memstart; /* e.g 0xd0000 */ +static long memend; /* e.g 0xd4000 */ + /********************************************** * probe the ni5210-card */ -int __init ni52_probe(struct net_device *dev) +struct net_device * __init ni52_probe(int unit) { -#ifndef MODULE - int *port; + struct net_device *dev = alloc_etherdev(sizeof(struct priv)); static int ports[] = {0x300, 0x280, 0x360 , 0x320 , 0x340, 0}; -#endif - int base_addr = dev->base_addr; - - SET_MODULE_OWNER(dev); + int *port; + int err = 0; - if (base_addr > 0x1ff) /* Check a single specified location. */ - return ni52_probe1(dev, base_addr); - else if (base_addr > 0) /* Don't probe at all. */ - return -ENXIO; + if (!dev) + return ERR_PTR(-ENOMEM); -#ifdef MODULE - printk("%s: no autoprobing allowed for modules.\n",dev->name); -#else - for (port = ports; *port; port++) { - int ioaddr = *port; - dev->base_addr = ioaddr; - if (ni52_probe1(dev, ioaddr) == 0) - return 0; + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + memstart = dev->mem_start; + memend = dev->mem_end; } -#ifdef FULL_IO_PROBE - for(dev->base_addr=0x200; dev->base_addr<0x400; dev->base_addr+=8) - if (ni52_probe1(dev, dev->base_addr) == 0) - return 0; -#endif + SET_MODULE_OWNER(dev); + if (io > 0x1ff) { /* Check a single specified location. */ + err = ni52_probe1(dev, io); + } else if (io > 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = ports; *port && ni52_probe1(dev, *port) ; port++) + ; + if (*port) + goto got_it; +#ifdef FULL_IO_PROBE + for (io = 0x200; io < 0x400 && ni52_probe1(dev, io); io += 8) + ; + if (io < 0x400) + goto got_it; #endif - - dev->base_addr = base_addr; - return -ENODEV; + err = -ENODEV; + } + if (err) + goto out; +got_it: + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + release_region(dev->base_addr, NI52_TOTAL_SIZE); +out: + free_netdev(dev); + return ERR_PTR(err); } static int __init ni52_probe1(struct net_device *dev,int ioaddr) { int i, size, retval; + dev->base_addr = ioaddr; + dev->irq = irq; + dev->mem_start = memstart; + dev->mem_end = memend; + if (!request_region(ioaddr, NI52_TOTAL_SIZE, dev->name)) return -EBUSY; @@ -416,7 +442,7 @@ goto out; } - printk("%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr); + printk(KERN_INFO "%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr); /* * check (or search) IO-Memory, 8K and 16K @@ -469,13 +495,6 @@ dev->mem_end = dev->mem_start + size; /* set mem_end showed by 'ifconfig' */ #endif - dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL); - if(dev->priv == NULL) { - printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name); - retval = -ENOMEM; - goto out; - } - /* warning: we don't free it on errors */ memset((char *) dev->priv,0,sizeof(struct priv)); ((struct priv *) (dev->priv))->memtop = isa_bus_to_virt(dev->mem_start) + size; @@ -503,8 +522,6 @@ if(!dev->irq) { printk("?autoirq, Failed to detect IRQ line!\n"); - kfree(dev->priv); - dev->priv = NULL; retval = -EAGAIN; goto out; } @@ -526,8 +543,6 @@ dev->if_port = 0; - ether_setup(dev); - return 0; out: release_region(ioaddr, NI52_TOTAL_SIZE); @@ -1295,13 +1310,7 @@ } #ifdef MODULE -static struct net_device dev_ni52; - -/* set: io,irq,memstart,memend or set it when calling insmod */ -static int irq=9; -static int io=0x300; -static long memstart; /* e.g 0xd0000 */ -static long memend; /* e.g 0xd4000 */ +static struct net_device *dev_ni52; MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); @@ -1318,22 +1327,17 @@ printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n"); return -ENODEV; } - dev_ni52.init = ni52_probe; - dev_ni52.irq = irq; - dev_ni52.base_addr = io; - dev_ni52.mem_end = memend; - dev_ni52.mem_start = memstart; - if (register_netdev(&dev_ni52) != 0) - return -EIO; + dev_ni52 = ni52_probe(-1); + if (IS_ERR(dev_ni52)) + return PTR_ERR(dev_ni52); return 0; } void cleanup_module(void) { - release_region(dev_ni52.base_addr, NI52_TOTAL_SIZE); - unregister_netdev(&dev_ni52); - kfree(dev_ni52.priv); - dev_ni52.priv = NULL; + unregister_netdev(dev_ni52); + release_region(dev_ni52->base_addr, NI52_TOTAL_SIZE); + free_netdev(dev_ni52); } #endif /* MODULE */ diff -Nru a/drivers/net/ni65.c b/drivers/net/ni65.c --- a/drivers/net/ni65.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/ni65.c Tue Feb 17 20:00:06 2004 @@ -343,29 +343,64 @@ return 0; } +static void cleanup_card(struct net_device *dev) +{ + struct priv *p = (struct priv *) dev->priv; + disable_dma(dev->dma); + free_dma(dev->dma); + release_region(dev->base_addr, cards[p->cardno].total_size); + ni65_free_buffer(p); +} + +/* set: io,irq,dma or set it when calling insmod */ +static int irq; +static int io; +static int dma; + /* * Probe The Card (not the lance-chip) */ -#ifdef MODULE -static -#endif -int __init ni65_probe(struct net_device *dev) +struct net_device * __init ni65_probe(int unit) { - int *port; + struct net_device *dev = alloc_etherdev(0); static int ports[] = {0x360,0x300,0x320,0x340, 0}; + int *port; + int err = 0; - if (dev->base_addr > 0x1ff) /* Check a single specified location. */ - return ni65_probe1(dev, dev->base_addr); - else if (dev->base_addr > 0) /* Don't probe at all. */ - return -ENXIO; + if (!dev) + return ERR_PTR(-ENOMEM); - for (port = ports; *port; port++) - { - if (ni65_probe1(dev, *port) == 0) - return 0; - } - - return -ENODEV; + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + irq = dev->irq; + dma = dev->dma; + } else { + dev->base_addr = io; + } + + if (dev->base_addr > 0x1ff) { /* Check a single specified location. */ + err = ni65_probe1(dev, dev->base_addr); + } else if (dev->base_addr > 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = ports; *port && ni65_probe1(dev, *port); port++) + ; + if (!*port) + err = -ENODEV; + } + if (err) + goto out; + + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); } /* @@ -377,6 +412,9 @@ struct priv *p; unsigned long flags; + dev->irq = irq; + dev->dma = dma; + for(i=0;iwatchdog_timeo = HZ/2; dev->get_stats = ni65_get_stats; dev->set_multicast_list = set_multicast_list; - - ether_setup(dev); - return 0; /* everything is OK */ } @@ -1213,12 +1248,7 @@ } #ifdef MODULE -static struct net_device dev_ni65 = { .base_addr = 0x360, .irq = 9, .init = ni65_probe }; - -/* set: io,irq,dma or set it when calling insmod */ -static int irq; -static int io; -static int dma; +static struct net_device *dev_ni65; MODULE_PARM(irq, "i"); MODULE_PARM(io, "i"); @@ -1229,26 +1259,15 @@ int init_module(void) { - dev_ni65.irq = irq; - dev_ni65.dma = dma; - dev_ni65.base_addr = io; - if (register_netdev(&dev_ni65) != 0) - return -EIO; - return 0; + dev_ni65 = ni65_probe(-1); + return IS_ERR(dev_ni65) ? PTR_ERR(dev_ni65) : 0; } void cleanup_module(void) { - struct priv *p; - p = (struct priv *) dev_ni65.priv; - if(!p) - BUG(); - disable_dma(dev_ni65.dma); - free_dma(dev_ni65.dma); - unregister_netdev(&dev_ni65); - release_region(dev_ni65.base_addr,cards[p->cardno].total_size); - ni65_free_buffer(p); - dev_ni65.priv = NULL; + unregister_netdev(dev_ni65); + cleanup_card(dev_ni65); + free_netdev(dev_ni65); } #endif /* MODULE */ diff -Nru a/drivers/net/ns83820.c b/drivers/net/ns83820.c --- a/drivers/net/ns83820.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ns83820.c Tue Feb 17 20:00:08 2004 @@ -374,19 +374,6 @@ #define LINK_DOWN 0x02 #define LINK_UP 0x04 -#define __kick_rx(dev) writel(CR_RXE, dev->base + CR) - -#define kick_rx(dev) do { \ - dprintk("kick_rx: maybe kicking\n"); \ - if (test_and_clear_bit(0, &dev->rx_info.idle)) { \ - dprintk("actually kicking\n"); \ - writel(dev->rx_info.phy_descs + (4 * DESC_SIZE * dev->rx_info.next_rx), dev->base + RXDP); \ - if (dev->rx_info.next_rx == dev->rx_info.next_empty) \ - printk(KERN_DEBUG "%s: uh-oh: next_rx == next_empty???\n", dev->net_dev.name);\ - __kick_rx(dev); \ - } \ -} while(0) - #ifdef USE_64BIT_ADDR #define HW_ADDR_LEN 8 #define desc_addr_set(desc, addr) \ @@ -438,7 +425,6 @@ struct ns83820 { - struct net_device net_dev; /* must be first */ struct net_device_stats stats; u8 *base; @@ -478,6 +464,29 @@ struct timer_list tx_watchdog; }; +static inline struct ns83820 *PRIV(struct net_device *dev) +{ + return netdev_priv(dev); +} + +#define __kick_rx(dev) writel(CR_RXE, dev->base + CR) + +static inline void kick_rx(struct net_device *ndev) +{ + struct ns83820 *dev = PRIV(ndev); + dprintk("kick_rx: maybe kicking\n"); + if (test_and_clear_bit(0, &dev->rx_info.idle)) { + dprintk("actually kicking\n"); + writel(dev->rx_info.phy_descs + + (4 * DESC_SIZE * dev->rx_info.next_rx), + dev->base + RXDP); + if (dev->rx_info.next_rx == dev->rx_info.next_empty) + printk(KERN_DEBUG "%s: uh-oh: next_rx == next_empty???\n", + ndev->name); + __kick_rx(dev); + } +} + //free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC #define start_tx_okay(dev) \ (((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % NR_TX_DESC) > MIN_TX_DESC_FREE) @@ -546,15 +555,16 @@ return 0; } -static inline int rx_refill(struct ns83820 *dev, int gfp) +static inline int rx_refill(struct net_device *ndev, int gfp) { + struct ns83820 *dev = PRIV(ndev); unsigned i; unsigned long flags = 0; if (unlikely(nr_rx_empty(dev) <= 2)) return 0; - dprintk("rx_refill(%p)\n", dev); + dprintk("rx_refill(%p)\n", ndev); if (gfp == GFP_ATOMIC) spin_lock_irqsave(&dev->rx_info.lock, flags); for (i=0; idev = &dev->net_dev; + skb->dev = ndev; if (gfp != GFP_ATOMIC) spin_lock_irqsave(&dev->rx_info.lock, flags); res = ns83820_add_rx_skb(dev, skb); @@ -587,20 +597,21 @@ return i ? 0 : -ENOMEM; } -static void FASTCALL(rx_refill_atomic(struct ns83820 *dev)); -static void rx_refill_atomic(struct ns83820 *dev) +static void FASTCALL(rx_refill_atomic(struct net_device *ndev)); +static void rx_refill_atomic(struct net_device *ndev) { - rx_refill(dev, GFP_ATOMIC); + rx_refill(ndev, GFP_ATOMIC); } /* REFILL */ static inline void queue_refill(void *_dev) { - struct ns83820 *dev = _dev; + struct net_device *ndev = _dev; + struct ns83820 *dev = PRIV(ndev); - rx_refill(dev, GFP_KERNEL); + rx_refill(ndev, GFP_KERNEL); if (dev->rx_info.up) - kick_rx(dev); + kick_rx(ndev); } static inline void clear_rx_desc(struct ns83820 *dev, unsigned i) @@ -608,9 +619,10 @@ build_rx_desc(dev, dev->rx_info.descs + (DESC_SIZE * i), 0, 0, CMDSTS_OWN, 0); } -static void FASTCALL(phy_intr(struct ns83820 *dev)); -static void phy_intr(struct ns83820 *dev) +static void FASTCALL(phy_intr(struct net_device *ndev)); +static void phy_intr(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" }; u32 cfg, new_cfg; u32 tbisr, tanar, tanlpar; @@ -688,27 +700,28 @@ if (newlinkstate & LINK_UP && dev->linkstate != newlinkstate) { - netif_start_queue(&dev->net_dev); - netif_wake_queue(&dev->net_dev); + netif_start_queue(ndev); + netif_wake_queue(ndev); printk(KERN_INFO "%s: link now %s mbps, %s duplex and up.\n", - dev->net_dev.name, + ndev->name, speeds[speed], fullduplex ? "full" : "half"); } else if (newlinkstate & LINK_DOWN && dev->linkstate != newlinkstate) { - netif_stop_queue(&dev->net_dev); - printk(KERN_INFO "%s: link now down.\n", dev->net_dev.name); + netif_stop_queue(ndev); + printk(KERN_INFO "%s: link now down.\n", ndev->name); } dev->linkstate = newlinkstate; } -static int ns83820_setup_rx(struct ns83820 *dev) +static int ns83820_setup_rx(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); unsigned i; int ret; - dprintk("ns83820_setup_rx(%p)\n", dev); + dprintk("ns83820_setup_rx(%p)\n", ndev); dev->rx_info.idle = 1; dev->rx_info.next_rx = 0; @@ -721,7 +734,7 @@ writel(0, dev->base + RXDP_HI); writel(dev->rx_info.phy_descs, dev->base + RXDP); - ret = rx_refill(dev, GFP_KERNEL); + ret = rx_refill(ndev, GFP_KERNEL); if (!ret) { dprintk("starting receiver\n"); /* prevent the interrupt handler from stomping on us */ @@ -734,7 +747,7 @@ dev->rx_info.up = 1; - phy_intr(dev); + phy_intr(ndev); /* Okay, let it rip */ spin_lock_irq(&dev->misc_lock); @@ -753,7 +766,7 @@ writel(1, dev->base + IER); spin_unlock_irq(&dev->misc_lock); - kick_rx(dev); + kick_rx(ndev); spin_unlock_irq(&dev->rx_info.lock); } @@ -793,37 +806,39 @@ } } -static void FASTCALL(ns83820_rx_kick(struct ns83820 *dev)); -static void ns83820_rx_kick(struct ns83820 *dev) +static void FASTCALL(ns83820_rx_kick(struct net_device *ndev)); +static void ns83820_rx_kick(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); /*if (nr_rx_empty(dev) >= NR_RX_DESC/4)*/ { if (dev->rx_info.up) { - rx_refill_atomic(dev); - kick_rx(dev); + rx_refill_atomic(ndev); + kick_rx(ndev); } } if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4) schedule_work(&dev->tq_refill); else - kick_rx(dev); + kick_rx(ndev); if (dev->rx_info.idle) - printk(KERN_DEBUG "%s: BAD\n", dev->net_dev.name); + printk(KERN_DEBUG "%s: BAD\n", ndev->name); } /* rx_irq * */ -static void FASTCALL(rx_irq(struct ns83820 *dev)); -static void rx_irq(struct ns83820 *dev) +static void FASTCALL(rx_irq(struct net_device *ndev)); +static void rx_irq(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); struct rx_info *info = &dev->rx_info; unsigned next_rx; u32 cmdsts, *desc; unsigned long flags; int nr = 0; - dprintk("rx_irq(%p)\n", dev); + dprintk("rx_irq(%p)\n", ndev); dprintk("rxdp: %08x, descs: %08lx next_rx[%d]: %p next_empty[%d]: %p\n", readl(dev->base + RXDP), (long)(dev->rx_info.phy_descs), @@ -873,7 +888,7 @@ } else { skb->ip_summed = CHECKSUM_NONE; } - skb->protocol = eth_type_trans(skb, &dev->net_dev); + skb->protocol = eth_type_trans(skb, ndev); if (NET_RX_DROP == netif_rx(skb)) { netdev_mangle_me_harder_failed: dev->stats.rx_dropped ++; @@ -899,8 +914,9 @@ static void rx_action(unsigned long _dev) { - struct ns83820 *dev = (void *)_dev; - rx_irq(dev); + struct net_device *ndev = (void *)_dev; + struct ns83820 *dev = PRIV(ndev); + rx_irq(ndev); writel(ihr, dev->base + IHR); spin_lock_irq(&dev->misc_lock); @@ -908,8 +924,8 @@ writel(dev->IMR_cache, dev->base + IMR); spin_unlock_irq(&dev->misc_lock); - rx_irq(dev); - ns83820_rx_kick(dev); + rx_irq(ndev); + ns83820_rx_kick(ndev); } /* Packet Transmit code @@ -924,13 +940,14 @@ /* No spinlock needed on the transmit irq path as the interrupt handler is * serialized. */ -static void do_tx_done(struct ns83820 *dev) +static void do_tx_done(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); u32 cmdsts, tx_done_idx, *desc; spin_lock_irq(&dev->tx_lock); - dprintk("do_tx_done(%p)\n", dev); + dprintk("do_tx_done(%p)\n", ndev); tx_done_idx = dev->tx_done_idx; desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); @@ -980,10 +997,10 @@ /* Allow network stack to resume queueing packets after we've * finished transmitting at least 1/4 of the packets in the queue. */ - if (netif_queue_stopped(&dev->net_dev) && start_tx_okay(dev)) { - dprintk("start_queue(%p)\n", dev); - netif_start_queue(&dev->net_dev); - netif_wake_queue(&dev->net_dev); + if (netif_queue_stopped(ndev) && start_tx_okay(dev)) { + dprintk("start_queue(%p)\n", ndev); + netif_start_queue(ndev); + netif_wake_queue(ndev); } spin_unlock_irq(&dev->tx_lock); } @@ -1015,9 +1032,9 @@ * while trying to track down a bug in either the zero copy code or * the tx fifo (hence the MAX_FRAG_LEN). */ -static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *_dev) +static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) { - struct ns83820 *dev = (struct ns83820 *)_dev; + struct ns83820 *dev = PRIV(ndev); u32 free_idx, cmdsts, extsts; int nr_free, nr_frags; unsigned tx_done_idx, last_idx; @@ -1033,10 +1050,10 @@ nr_frags = skb_shinfo(skb)->nr_frags; again: if (unlikely(dev->CFG_cache & CFG_LNKSTS)) { - netif_stop_queue(&dev->net_dev); + netif_stop_queue(ndev); if (unlikely(dev->CFG_cache & CFG_LNKSTS)) return 1; - netif_start_queue(&dev->net_dev); + netif_start_queue(ndev); } last_idx = free_idx = dev->tx_free_idx; @@ -1044,13 +1061,13 @@ nr_free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC; nr_free -= 1; if (nr_free <= nr_frags) { - dprintk("stop_queue - not enough(%p)\n", dev); - netif_stop_queue(&dev->net_dev); + dprintk("stop_queue - not enough(%p)\n", ndev); + netif_stop_queue(ndev); /* Check again: we may have raced with a tx done irq */ if (dev->tx_done_idx != tx_done_idx) { - dprintk("restart queue(%p)\n", dev); - netif_start_queue(&dev->net_dev); + dprintk("restart queue(%p)\n", ndev); + netif_start_queue(ndev); goto again; } return 1; @@ -1063,8 +1080,8 @@ nr_free -= nr_frags; if (nr_free < MIN_TX_DESC_FREE) { - dprintk("stop_queue - last entry(%p)\n", dev); - netif_stop_queue(&dev->net_dev); + dprintk("stop_queue - last entry(%p)\n", ndev); + netif_stop_queue(ndev); stopped = 1; } @@ -1136,10 +1153,10 @@ /* Check again: we may have raced with a tx done irq */ if (stopped && (dev->tx_done_idx != tx_done_idx) && start_tx_okay(dev)) - netif_start_queue(&dev->net_dev); + netif_start_queue(ndev); /* set the transmit start time to catch transmit timeouts */ - dev->net_dev.trans_start = jiffies; + ndev->trans_start = jiffies; return 0; } @@ -1161,9 +1178,9 @@ dev->stats.tx_carrier_errors += readl(base + 0x88) & 0xff; } -static struct net_device_stats *ns83820_get_stats(struct net_device *_dev) +static struct net_device_stats *ns83820_get_stats(struct net_device *ndev) { - struct ns83820 *dev = (void *)_dev; + struct ns83820 *dev = PRIV(ndev); /* somewhat overkill */ spin_lock_irq(&dev->misc_lock); @@ -1213,9 +1230,9 @@ return -EOPNOTSUPP; } -static int ns83820_ioctl(struct net_device *_dev, struct ifreq *rq, int cmd) +static int ns83820_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) { - struct ns83820 *dev = (struct ns83820 *)_dev; + struct ns83820 *dev = PRIV(ndev); switch(cmd) { case SIOCETHTOOL: @@ -1233,23 +1250,25 @@ spin_unlock(&dev->misc_lock); } -static void ns83820_do_isr(struct ns83820 *dev, u32 isr); +static void ns83820_do_isr(struct net_device *ndev, u32 isr); static irqreturn_t ns83820_irq(int foo, void *data, struct pt_regs *regs) { - struct ns83820 *dev = data; + struct net_device *ndev = data; + struct ns83820 *dev = PRIV(ndev); u32 isr; - dprintk("ns83820_irq(%p)\n", dev); + dprintk("ns83820_irq(%p)\n", ndev); dev->ihr = 0; isr = readl(dev->base + ISR); dprintk("irq: %08x\n", isr); - ns83820_do_isr(dev, isr); + ns83820_do_isr(ndev, isr); return IRQ_HANDLED; } -static void ns83820_do_isr(struct ns83820 *dev, u32 isr) +static void ns83820_do_isr(struct net_device *ndev, u32 isr) { + struct ns83820 *dev = PRIV(ndev); #ifdef DEBUG if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC)) Dprintk("odd isr? 0x%08x\n", isr); @@ -1258,7 +1277,7 @@ if (ISR_RXIDLE & isr) { dev->rx_info.idle = 1; Dprintk("oh dear, we are idle\n"); - ns83820_rx_kick(dev); + ns83820_rx_kick(ndev); } if ((ISR_RXDESC | ISR_RXOK) & isr) { @@ -1270,12 +1289,12 @@ spin_unlock_irq(&dev->misc_lock); tasklet_schedule(&dev->rx_tasklet); - //rx_irq(dev); + //rx_irq(ndev); //writel(4, dev->base + IHR); } if ((ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & isr) - ns83820_rx_kick(dev); + ns83820_rx_kick(ndev); if (unlikely(ISR_RXSOVR & isr)) { //printk("overrun: rxsovr\n"); @@ -1297,7 +1316,7 @@ txdp -= dev->tx_phy_descs; dev->tx_idx = txdp / (DESC_SIZE * 4); if (dev->tx_idx >= NR_TX_DESC) { - printk(KERN_ALERT "%s: BUG -- txdp out of range\n", dev->net_dev.name); + printk(KERN_ALERT "%s: BUG -- txdp out of range\n", ndev->name); dev->tx_idx = 0; } /* The may have been a race between a pci originated read @@ -1313,7 +1332,7 @@ * work has accumulated */ if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) { - do_tx_done(dev); + do_tx_done(ndev); /* Disable TxOk if there are no outstanding tx packets. */ @@ -1345,7 +1364,7 @@ /* PHY: Link up/down/negotiation state change */ if (unlikely(ISR_PHY & isr)) - phy_intr(dev); + phy_intr(ndev); #if 0 /* Still working on the interrupt mitigation strategy */ if (dev->ihr) @@ -1363,9 +1382,9 @@ Dprintk("okay!\n"); } -static int ns83820_stop(struct net_device *_dev) +static int ns83820_stop(struct net_device *ndev) { - struct ns83820 *dev = (struct ns83820 *)_dev; + struct ns83820 *dev = PRIV(ndev); /* FIXME: protect against interrupt handler? */ del_timer_sync(&dev->tx_watchdog); @@ -1392,10 +1411,9 @@ return 0; } -static void ns83820_do_isr(struct ns83820 *dev, u32 isr); -static void ns83820_tx_timeout(struct net_device *_dev) +static void ns83820_tx_timeout(struct net_device *ndev) { - struct ns83820 *dev = (struct ns83820 *)_dev; + struct ns83820 *dev = PRIV(ndev); u32 tx_done_idx, *desc; unsigned long flags; @@ -1405,7 +1423,7 @@ desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); printk(KERN_INFO "%s: tx_timeout: tx_done_idx=%d free_idx=%d cmdsts=%08x\n", - dev->net_dev.name, + ndev->name, tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); #if defined(DEBUG) @@ -1413,17 +1431,17 @@ u32 isr; isr = readl(dev->base + ISR); printk("irq: %08x imr: %08x\n", isr, dev->IMR_cache); - ns83820_do_isr(dev, isr); + ns83820_do_isr(ndev, isr); } #endif - do_tx_done(dev); + do_tx_done(ndev); tx_done_idx = dev->tx_done_idx; desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); printk(KERN_INFO "%s: after: tx_done_idx=%d free_idx=%d cmdsts=%08x\n", - dev->net_dev.name, + ndev->name, tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); local_irq_restore(flags); @@ -1431,7 +1449,8 @@ static void ns83820_tx_watch(unsigned long data) { - struct ns83820 *dev = (void *)data; + struct net_device *ndev = (void *)data; + struct ns83820 *dev = PRIV(ndev); #if defined(DEBUG) printk("ns83820_tx_watch: %u %u %d\n", @@ -1439,21 +1458,21 @@ ); #endif - if (time_after(jiffies, dev->net_dev.trans_start + 1*HZ) && + if (time_after(jiffies, ndev->trans_start + 1*HZ) && dev->tx_done_idx != dev->tx_free_idx) { printk(KERN_DEBUG "%s: ns83820_tx_watch: %u %u %d\n", - dev->net_dev.name, + ndev->name, dev->tx_done_idx, dev->tx_free_idx, atomic_read(&dev->nr_tx_skbs)); - ns83820_tx_timeout(&dev->net_dev); + ns83820_tx_timeout(ndev); } mod_timer(&dev->tx_watchdog, jiffies + 2*HZ); } -static int ns83820_open(struct net_device *_dev) +static int ns83820_open(struct net_device *ndev) { - struct ns83820 *dev = (struct ns83820 *)_dev; + struct ns83820 *dev = PRIV(ndev); unsigned i; u32 desc; int ret; @@ -1462,7 +1481,7 @@ writel(0, dev->base + PQCR); - ret = ns83820_setup_rx(dev); + ret = ns83820_setup_rx(ndev); if (ret) goto failed; @@ -1481,16 +1500,16 @@ writel(desc, dev->base + TXDP); init_timer(&dev->tx_watchdog); - dev->tx_watchdog.data = (unsigned long)dev; + dev->tx_watchdog.data = (unsigned long)ndev; dev->tx_watchdog.function = ns83820_tx_watch; mod_timer(&dev->tx_watchdog, jiffies + 2*HZ); - netif_start_queue(&dev->net_dev); /* FIXME: wait for phy to come up */ + netif_start_queue(ndev); /* FIXME: wait for phy to come up */ return 0; failed: - ns83820_stop(_dev); + ns83820_stop(ndev); return ret; } @@ -1513,28 +1532,28 @@ } } -static int ns83820_change_mtu(struct net_device *_dev, int new_mtu) +static int ns83820_change_mtu(struct net_device *ndev, int new_mtu) { if (new_mtu > RX_BUF_SIZE) return -EINVAL; - _dev->mtu = new_mtu; + ndev->mtu = new_mtu; return 0; } -static void ns83820_set_multicast(struct net_device *_dev) +static void ns83820_set_multicast(struct net_device *ndev) { - struct ns83820 *dev = (void *)_dev; + struct ns83820 *dev = PRIV(ndev); u8 *rfcr = dev->base + RFCR; u32 and_mask = 0xffffffff; u32 or_mask = 0; u32 val; - if (dev->net_dev.flags & IFF_PROMISC) + if (ndev->flags & IFF_PROMISC) or_mask |= RFCR_AAU | RFCR_AAM; else and_mask &= ~(RFCR_AAU | RFCR_AAM); - if (dev->net_dev.flags & IFF_ALLMULTI) + if (ndev->flags & IFF_ALLMULTI) or_mask |= RFCR_AAM; else and_mask &= ~RFCR_AAM; @@ -1547,14 +1566,15 @@ spin_unlock_irq(&dev->misc_lock); } -static void ns83820_run_bist(struct ns83820 *dev, const char *name, u32 enable, u32 done, u32 fail) +static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enable, u32 done, u32 fail) { + struct ns83820 *dev = PRIV(ndev); int timed_out = 0; long start; u32 status; int loops = 0; - dprintk("%s: start %s\n", dev->net_dev.name, name); + dprintk("%s: start %s\n", ndev->name, name); start = jiffies; @@ -1578,12 +1598,12 @@ if (status & fail) printk(KERN_INFO "%s: %s failed! (0x%08x & 0x%08x)\n", - dev->net_dev.name, name, status, fail); + ndev->name, name, status, fail); else if (timed_out) printk(KERN_INFO "%s: run_bist %s timed out! (%08x)\n", - dev->net_dev.name, name, status); + ndev->name, name, status); - dprintk("%s: done %s in %d loops\n", dev->net_dev.name, name, loops); + dprintk("%s: done %s in %d loops\n", ndev->name, name, loops); } #ifdef PHY_CODE_IS_FINISHED @@ -1706,8 +1726,9 @@ return data; } -static void ns83820_probe_phy(struct ns83820 *dev) +static void ns83820_probe_phy(struct net_device *ndev) { + struct ns83820 *dev = PRIV(ndev); static int first; int i; #define MII_PHYIDR1 0x02 @@ -1734,11 +1755,11 @@ b = ns83820_mii_read_reg(dev, i, MII_PHYIDR2); //printk("%s: phy %d: 0x%04x 0x%04x\n", - // dev->net_dev.name, i, a, b); + // ndev->name, i, a, b); for (j=0; j<0x16; j+=4) { dprintk("%s: [0x%02x] %04x %04x %04x %04x\n", - dev->net_dev.name, j, + ndev->name, j, ns83820_mii_read_reg(dev, i, 0 + j), ns83820_mii_read_reg(dev, i, 1 + j), ns83820_mii_read_reg(dev, i, 2 + j), @@ -1763,6 +1784,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_device_id *id) { + struct net_device *ndev; struct ns83820 *dev; long addr; int err; @@ -1778,7 +1800,8 @@ return -ENODEV; } - dev = (struct ns83820 *)alloc_etherdev((sizeof *dev) - (sizeof dev->net_dev)); + ndev = alloc_etherdev(sizeof(struct ns83820)); + dev = PRIV(ndev); err = -ENOMEM; if (!dev) goto out; @@ -1790,12 +1813,11 @@ dev->ee.cache = &dev->MEAR_cache; dev->ee.lock = &dev->misc_lock; - SET_MODULE_OWNER(dev->net_dev); - SET_NETDEV_DEV(&dev->net_dev, &pci_dev->dev); - dev->net_dev.priv = dev; + SET_MODULE_OWNER(ndev); + SET_NETDEV_DEV(ndev, &pci_dev->dev); - INIT_WORK(&dev->tq_refill, queue_refill, dev); - tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)dev); + INIT_WORK(&dev->tq_refill, queue_refill, ndev); + tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)ndev); err = pci_enable_device(pci_dev); if (err) { @@ -1829,55 +1851,63 @@ 0); err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ, - dev->net_dev.name, dev); + ndev->name, ndev); if (err) { printk(KERN_INFO "ns83820: unable to register irq %d\n", pci_dev->irq); goto out_disable; } - err = register_netdev(&dev->net_dev); - if (err) { - printk(KERN_INFO "ns83820: unable to register netdev: %d\n", err); + /* + * FIXME: we are holding rtnl_lock() over obscenely long area only + * because some of the setup code uses dev->name. It's Wrong(tm) - + * we should be using driver-specific names for all that stuff. + * For now that will do, but we really need to come back and kill + * most of the dev_alloc_name() users later. + */ + rtnl_lock(); + err = dev_alloc_name(ndev, ndev->name); + if (err < 0) { + printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err); goto out_free_irq; } printk("%s: ns83820.c: 0x22c: %08x, subsystem: %04x:%04x\n", - dev->net_dev.name, le32_to_cpu(readl(dev->base + 0x22c)), + ndev->name, le32_to_cpu(readl(dev->base + 0x22c)), pci_dev->subsystem_vendor, pci_dev->subsystem_device); - dev->net_dev.open = ns83820_open; - dev->net_dev.stop = ns83820_stop; - dev->net_dev.hard_start_xmit = ns83820_hard_start_xmit; - dev->net_dev.get_stats = ns83820_get_stats; - dev->net_dev.change_mtu = ns83820_change_mtu; - dev->net_dev.set_multicast_list = ns83820_set_multicast; - dev->net_dev.do_ioctl = ns83820_ioctl; - dev->net_dev.tx_timeout = ns83820_tx_timeout; - dev->net_dev.watchdog_timeo = 5 * HZ; + ndev->open = ns83820_open; + ndev->stop = ns83820_stop; + ndev->hard_start_xmit = ns83820_hard_start_xmit; + ndev->get_stats = ns83820_get_stats; + ndev->change_mtu = ns83820_change_mtu; + ndev->set_multicast_list = ns83820_set_multicast; + ndev->do_ioctl = ns83820_ioctl; + ndev->tx_timeout = ns83820_tx_timeout; + ndev->watchdog_timeo = 5 * HZ; - pci_set_drvdata(pci_dev, dev); + pci_set_drvdata(pci_dev, ndev); ns83820_do_reset(dev, CR_RST); /* Must reset the ram bist before running it */ writel(PTSCR_RBIST_RST, dev->base + PTSCR); - ns83820_run_bist(dev, "sram bist", PTSCR_RBIST_EN, + ns83820_run_bist(ndev, "sram bist", PTSCR_RBIST_EN, PTSCR_RBIST_DONE, PTSCR_RBIST_FAIL); - ns83820_run_bist(dev, "eeprom bist", PTSCR_EEBIST_EN, 0, + ns83820_run_bist(ndev, "eeprom bist", PTSCR_EEBIST_EN, 0, PTSCR_EEBIST_FAIL); - ns83820_run_bist(dev, "eeprom load", PTSCR_EELOAD_EN, 0, 0); + ns83820_run_bist(ndev, "eeprom load", PTSCR_EELOAD_EN, 0, 0); /* I love config registers */ dev->CFG_cache = readl(dev->base + CFG); if ((dev->CFG_cache & CFG_PCI64_DET)) { printk(KERN_INFO "%s: detected 64 bit PCI data bus.\n", - dev->net_dev.name); + ndev->name); /*dev->CFG_cache |= CFG_DATA64_EN;*/ if (!(dev->CFG_cache & CFG_DATA64_EN)) printk(KERN_INFO "%s: EEPROM did not enable 64 bit bus. Disabled.\n", - dev->net_dev.name); + ndev->name); } else dev->CFG_cache &= ~(CFG_DATA64_EN); @@ -1905,7 +1935,7 @@ /* setup optical transceiver if we have one */ if (dev->CFG_cache & CFG_TBI_EN) { printk(KERN_INFO "%s: enabling optical transceiver\n", - dev->net_dev.name); + ndev->name); writel(readl(dev->base + GPIOR) | 0x3e8, dev->base + GPIOR); /* setup auto negotiation feature advertisement */ @@ -1926,7 +1956,7 @@ dprintk("CFG: %08x\n", dev->CFG_cache); if (reset_phy) { - printk(KERN_INFO "%s: resetting phy\n", dev->net_dev.name); + printk(KERN_INFO "%s: resetting phy\n", ndev->name); writel(dev->CFG_cache | CFG_PHY_RST, dev->base + CFG); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((HZ+99)/100); @@ -1996,37 +2026,49 @@ /* Disable Wake On Lan */ writel(0, dev->base + WCSR); - ns83820_getmac(dev, dev->net_dev.dev_addr); + ns83820_getmac(dev, ndev->dev_addr); /* Yes, we support dumb IP checksum on transmit */ - dev->net_dev.features |= NETIF_F_SG; - dev->net_dev.features |= NETIF_F_IP_CSUM; + ndev->features |= NETIF_F_SG; + ndev->features |= NETIF_F_IP_CSUM; if (using_dac) { printk(KERN_INFO "%s: using 64 bit addressing.\n", - dev->net_dev.name); - dev->net_dev.features |= NETIF_F_HIGHDMA; + ndev->name); + ndev->features |= NETIF_F_HIGHDMA; } printk(KERN_INFO "%s: ns83820 v" VERSION ": DP83820 v%u.%u: %02x:%02x:%02x:%02x:%02x:%02x io=0x%08lx irq=%d f=%s\n", - dev->net_dev.name, + ndev->name, (unsigned)readl(dev->base + SRR) >> 8, (unsigned)readl(dev->base + SRR) & 0xff, - dev->net_dev.dev_addr[0], dev->net_dev.dev_addr[1], - dev->net_dev.dev_addr[2], dev->net_dev.dev_addr[3], - dev->net_dev.dev_addr[4], dev->net_dev.dev_addr[5], + ndev->dev_addr[0], ndev->dev_addr[1], + ndev->dev_addr[2], ndev->dev_addr[3], + ndev->dev_addr[4], ndev->dev_addr[5], addr, pci_dev->irq, - (dev->net_dev.features & NETIF_F_HIGHDMA) ? "h,sg" : "sg" + (ndev->features & NETIF_F_HIGHDMA) ? "h,sg" : "sg" ); #ifdef PHY_CODE_IS_FINISHED - ns83820_probe_phy(dev); + ns83820_probe_phy(ndev); #endif + err = register_netdevice(ndev); + if (err) { + printk(KERN_INFO "ns83820: unable to register netdev: %d\n", err); + goto out_cleanup; + } + rtnl_unlock(); + return 0; +out_cleanup: + writel(0, dev->base + IMR); /* paranoia */ + writel(0, dev->base + IER); + readl(dev->base + IER); out_free_irq: - free_irq(pci_dev->irq, dev); + rtnl_unlock(); + free_irq(pci_dev->irq, ndev); out_disable: if (dev->base) iounmap(dev->base); @@ -2034,7 +2076,7 @@ pci_free_consistent(pci_dev, 4 * DESC_SIZE * NR_RX_DESC, dev->rx_info.descs, dev->rx_info.phy_descs); pci_disable_device(pci_dev); out_free: - kfree(dev); + free_netdev(ndev); pci_set_drvdata(pci_dev, NULL); out: return err; @@ -2042,24 +2084,25 @@ static void __devexit ns83820_remove_one(struct pci_dev *pci_dev) { - struct ns83820 *dev = pci_get_drvdata(pci_dev); + struct net_device *ndev = pci_get_drvdata(pci_dev); + struct ns83820 *dev = PRIV(ndev); /* ok even if NULL */ - if (!dev) /* paranoia */ + if (!ndev) /* paranoia */ return; writel(0, dev->base + IMR); /* paranoia */ writel(0, dev->base + IER); readl(dev->base + IER); - unregister_netdev(&dev->net_dev); - free_irq(dev->pci_dev->irq, dev); + unregister_netdev(ndev); + free_irq(dev->pci_dev->irq, ndev); iounmap(dev->base); pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_TX_DESC, dev->tx_descs, dev->tx_phy_descs); pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_RX_DESC, dev->rx_info.descs, dev->rx_info.phy_descs); pci_disable_device(dev->pci_dev); - free_netdev(&dev->net_dev); + free_netdev(ndev); pci_set_drvdata(pci_dev, NULL); } diff -Nru a/drivers/net/oaknet.c b/drivers/net/oaknet.c --- a/drivers/net/oaknet.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/oaknet.c Tue Feb 17 20:00:07 2004 @@ -94,8 +94,8 @@ { register int i; int reg0, regd; - int ret; - struct net_device tmp, *dev = NULL; + int ret = -ENOMEM; + struct net_device *dev; #if 0 unsigned long ioaddr = OAKNET_IO_BASE; #else @@ -105,17 +105,14 @@ if (!ioaddr) return -ENOMEM; - /* - * This MUST happen here because of the nic_* macros - * which have an implicit dependency on dev->base_addr. - */ - tmp.base_addr = ioaddr; - dev = &tmp; + dev = alloc_ei_netdev(); + if (!dev) + goto out_unmap; ret = -EBUSY; if (!request_region(OAKNET_IO_BASE, OAKNET_IO_SIZE, name)) - goto out_unmap; + goto out_dev; /* Quick register check to see if the device is really there. */ @@ -144,17 +141,7 @@ goto out_region; } - /* - * We're not using the old-style probing API, so we have to allocate - * our own device structure. - */ - - dev = init_etherdev(NULL, 0); - ret = -ENOMEM; - if (!dev) - goto out_region; SET_MODULE_OWNER(dev); - oaknet_devs = dev; /* * This controller is on an embedded board, so the base address @@ -164,14 +151,6 @@ dev->base_addr = ioaddr; dev->irq = OAKNET_INT; - /* Allocate 8390-specific device-private area and fields. */ - - ret = -ENOMEM; - if (ethdev_init(dev)) { - printk(" unable to get memory for dev->priv.\n"); - goto out_dev; - } - /* * Disable all chip interrupts for now and ACK all pending * interrupts. @@ -186,7 +165,7 @@ if (request_irq(dev->irq, ei_interrupt, 0, name, dev)) { printk("%s: unable to request interrupt %d.\n", dev->name, dev->irq); - goto out_priv; + goto out_region; } /* Tell the world about what and where we've found. */ @@ -215,15 +194,19 @@ dev->stop = oaknet_close; NS8390_init(dev, FALSE); + ret = register_netdev(dev); + if (ret) + goto out_irq; + + oaknet_devs = dev; + return 0; - return (0); -out_priv: - kfree(dev->priv); -out_dev: - unregister_netdev(dev); - kfree(dev); +out_irq; + free_irq(dev->irq, dev); out_region: release_region(OAKNET_IO_BASE, OAKNET_IO_SIZE); +out_dev: + free_netdev(dev); out_unmap: iounmap(ioaddr); return ret; @@ -662,38 +645,18 @@ } /* - * Oak Ethernet module load interface. - */ -static int __init oaknet_init_module (void) -{ - if (oaknet_devs != NULL) - return (-EBUSY); - - return (oaknet_init()); -} - -/* * Oak Ethernet module unload interface. */ static void __exit oaknet_cleanup_module (void) { - if (oaknet_devs == NULL) - return; - - if (oaknet_devs->priv != NULL) { - int ioaddr = oaknet_devs->base_addr; - void *priv = oaknet_devs->priv; - free_irq(oaknet_devs->irq, oaknet_devs); - release_region(ioaddr, OAKNET_IO_SIZE); - iounmap(ioaddr); - unregister_netdev(oaknet_dev); - free_netdev(priv); - } - /* Convert to loop once driver supports multiple devices. */ - kfree(oaknet_devs); + unregister_netdev(oaknet_dev); + free_irq(oaknet_devs->irq, oaknet_devs); + release_region(oaknet_devs->base_addr, OAKNET_IO_SIZE); + iounmap(ioaddr); + free_netdev(oaknet_devs); } -module_init(oaknet_init_module); +module_init(oaknet_init); module_exit(oaknet_cleanup_module); MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/pci-skeleton.c b/drivers/net/pci-skeleton.c --- a/drivers/net/pci-skeleton.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/pci-skeleton.c Tue Feb 17 20:00:05 2004 @@ -730,7 +730,7 @@ #endif pci_release_regions (pdev); err_out: - kfree (dev); + free_netdev (dev); DPRINTK ("EXIT, returning %d\n", rc); return rc; } diff -Nru a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c --- a/drivers/net/pcmcia/3c574_cs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/pcmcia/3c574_cs.c Tue Feb 17 20:00:06 2004 @@ -362,23 +362,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) tc574_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* tc574_detach */ /* @@ -557,21 +551,11 @@ { DEBUG(0, "3c574_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "3c574_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - tc574_detach(link); } /* @@ -1300,8 +1284,7 @@ link->open--; netif_stop_queue(dev); del_timer_sync(&lp->media); - if (link->state & DEV_STALE_CONFIG) - tc574_release(link); + return 0; } diff -Nru a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c --- a/drivers/net/pcmcia/3c589_cs.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/pcmcia/3c589_cs.c Tue Feb 17 20:00:08 2004 @@ -276,23 +276,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) tc589_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* tc589_detach */ /*====================================================================== @@ -433,21 +427,11 @@ { DEBUG(0, "3c589_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "3c589_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - tc589_detach(link); } /*====================================================================== @@ -1076,8 +1060,6 @@ link->open--; netif_stop_queue(dev); del_timer_sync(&lp->media); - if (link->state & DEV_STALE_CONFIG) - tc589_release(link); return 0; } diff -Nru a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c --- a/drivers/net/pcmcia/axnet_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/pcmcia/axnet_cs.c Tue Feb 17 20:00:07 2004 @@ -119,7 +119,7 @@ static dev_info_t dev_info = "axnet_cs"; static dev_link_t *dev_list; -static int axdev_init(struct net_device *dev); +static void axdev_setup(struct net_device *dev); static void AX88190_init(struct net_device *dev, int startp); static int ax_open(struct net_device *dev); static int ax_close(struct net_device *dev); @@ -128,7 +128,6 @@ /*====================================================================*/ typedef struct axnet_dev_t { - struct net_device dev; /* so &dev == &axnet_dev_t */ dev_link_t link; dev_node_t node; caddr_t base; @@ -140,16 +139,10 @@ int flags; } axnet_dev_t; -/*====================================================================== - - We never need to do anything when a axnet device is "initialized" - by the net software, because we only register already-found cards. - -======================================================================*/ - -static int axnet_init(struct net_device *dev) +static inline axnet_dev_t *PRIV(struct net_device *dev) { - return 0; + void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device); + return p; } /*====================================================================== @@ -170,12 +163,15 @@ DEBUG(0, "axnet_attach()\n"); - /* Create new ethernet device */ - info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) return NULL; - memset(info, 0, sizeof(*info)); - link = &info->link; dev = &info->dev; - link->priv = info; + dev = alloc_netdev(sizeof(struct ei_device) + sizeof(axnet_dev_t), + "eth%d", axdev_setup); + + if (!dev) + return NULL; + + info = PRIV(dev); + link = &info->link; + link->priv = dev; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID; if (irq_list[0] == -1) @@ -186,8 +182,6 @@ link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; - axdev_init(dev); - dev->init = &axnet_init; dev->open = &axnet_open; dev->stop = &axnet_close; dev->do_ioctl = &axnet_ioctl; @@ -226,7 +220,7 @@ static void axnet_detach(dev_link_t *link) { - axnet_dev_t *info = link->priv; + struct net_device *dev = link->priv; dev_link_t **linkp; DEBUG(0, "axnet_detach(0x%p)\n", link); @@ -237,23 +231,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) axnet_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { - unregister_netdev(&info->dev); - free_netdev(&info->dev); - } else - kfree(info); - + if (link->dev) + unregister_netdev(dev); + free_netdev(dev); } /* axnet_detach */ /*====================================================================== @@ -349,8 +337,8 @@ static void axnet_config(dev_link_t *link) { client_handle_t handle = link->handle; - axnet_dev_t *info = link->priv; - struct net_device *dev = &info->dev; + struct net_device *dev = link->priv; + axnet_dev_t *info = PRIV(dev); tuple_t tuple; cisparse_t parse; int i, j, last_ret, last_fn; @@ -425,15 +413,10 @@ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n"); - goto failed; - } if (!get_prom(link)) { printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n"); printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n"); - unregister_netdev(dev); goto failed; } @@ -448,7 +431,6 @@ ei_status.block_output = &block_output; strcpy(info->node.dev_name, dev->name); - link->dev = &info->node; if (inb(dev->base_addr + AXNET_TEST) != 0) info->flags |= IS_AX88790; @@ -487,6 +469,12 @@ printk(KERN_NOTICE " No MII transceivers found!\n"); } + if (register_netdev(dev) != 0) { + printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n"); + goto failed; + } + + link->dev = &info->node; link->state &= ~DEV_CONFIG_PENDING; return; @@ -510,21 +498,11 @@ { DEBUG(0, "axnet_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "axnet_cs: release postponed, '%s' still open\n", - ((axnet_dev_t *)(link->priv))->node.dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - axnet_detach(link); } /*====================================================================== @@ -540,7 +518,7 @@ event_callback_args_t *args) { dev_link_t *link = args->client_data; - axnet_dev_t *info = link->priv; + struct net_device *dev = link->priv; DEBUG(2, "axnet_event(0x%06x)\n", event); @@ -548,7 +526,7 @@ case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { - netif_device_detach(&info->dev); + netif_device_detach(dev); axnet_release(link); } break; @@ -562,7 +540,7 @@ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) { if (link->open) - netif_device_detach(&info->dev); + netif_device_detach(dev); pcmcia_release_configuration(link->handle); } break; @@ -573,9 +551,9 @@ if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); if (link->open) { - axnet_reset_8390(&info->dev); - AX88190_init(&info->dev, 1); - netif_device_attach(&info->dev); + axnet_reset_8390(dev); + AX88190_init(dev, 1); + netif_device_attach(dev); } } break; @@ -645,7 +623,7 @@ static int axnet_open(struct net_device *dev) { - axnet_dev_t *info = (axnet_dev_t *)dev; + axnet_dev_t *info = PRIV(dev); dev_link_t *link = &info->link; DEBUG(2, "axnet_open('%s')\n", dev->name); @@ -660,7 +638,7 @@ info->link_status = 0x00; init_timer(&info->watchdog); info->watchdog.function = &ei_watchdog; - info->watchdog.data = (u_long)info; + info->watchdog.data = (u_long)dev; info->watchdog.expires = jiffies + HZ; add_timer(&info->watchdog); @@ -671,7 +649,7 @@ static int axnet_close(struct net_device *dev) { - axnet_dev_t *info = (axnet_dev_t *)dev; + axnet_dev_t *info = PRIV(dev); dev_link_t *link = &info->link; DEBUG(2, "axnet_close('%s')\n", dev->name); @@ -682,8 +660,6 @@ link->open--; netif_stop_queue(dev); del_timer_sync(&info->watchdog); - if (link->state & DEV_STALE_CONFIG) - axnet_release(link); return 0; } /* axnet_close */ @@ -723,15 +699,15 @@ static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) { - axnet_dev_t *info = dev_id; - info->stale = 0; + struct net_device *dev = dev_id; + PRIV(dev)->stale = 0; return ax_interrupt(irq, dev_id, regs); } static void ei_watchdog(u_long arg) { - axnet_dev_t *info = (axnet_dev_t *)(arg); - struct net_device *dev = &info->dev; + struct net_device *dev = (struct net_device *)(arg); + axnet_dev_t *info = PRIV(dev); ioaddr_t nic_base = dev->base_addr; ioaddr_t mii_addr = nic_base + AXNET_MII_EEP; u_short link; @@ -801,7 +777,7 @@ static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - axnet_dev_t *info = (axnet_dev_t *)dev; + axnet_dev_t *info = PRIV(dev); u16 *data = (u16 *)&rq->ifr_data; ioaddr_t mii_addr = dev->base_addr + AXNET_MII_EEP; switch (cmd) { @@ -1050,14 +1026,7 @@ static int ax_open(struct net_device *dev) { unsigned long flags; - struct ei_device *ei_local = (struct ei_device *) dev->priv; - - /* This can't happen unless somebody forgot to call axdev_init(). */ - if (ei_local == NULL) - { - printk(KERN_EMERG "%s: ax_open passed a non-existent device!\n", dev->name); - return -ENXIO; - } + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); #ifdef HAVE_TX_TIMEOUT /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout @@ -1083,7 +1052,7 @@ return 0; } -#define dev_lock(dev) (((struct ei_device *)(dev)->priv)->page_lock) +#define dev_lock(dev) (((struct ei_device *)netdev_priv(dev))->page_lock) /** * ax_close - shut down network device @@ -1117,7 +1086,7 @@ void ei_tx_timeout(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int txsr, isr, tickssofar = jiffies - dev->trans_start; unsigned long flags; @@ -1163,7 +1132,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int length, send_length, output_page; unsigned long flags; u8 packet[ETH_ZLEN]; @@ -1309,7 +1278,7 @@ } e8390_base = dev->base_addr; - ei_local = (struct ei_device *) dev->priv; + ei_local = (struct ei_device *) netdev_priv(dev); /* * Protect the irq test too. @@ -1421,7 +1390,7 @@ static void ei_tx_err(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned char txsr = inb_p(e8390_base+EN0_TSR); unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); @@ -1462,7 +1431,7 @@ static void ei_tx_intr(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int status = inb(e8390_base + EN0_TSR); /* @@ -1543,7 +1512,7 @@ static void ei_receive(struct net_device *dev) { long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned char rxing_page, this_frame, next_frame; unsigned short current_offset; int rx_pkt_count = 0; @@ -1663,7 +1632,7 @@ axnet_dev_t *info = (axnet_dev_t *)dev; long e8390_base = dev->base_addr; unsigned char was_txing, must_resend = 0; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); /* * Record whether a Tx was in progress and then issue the @@ -1730,7 +1699,7 @@ static struct net_device_stats *get_stats(struct net_device *dev) { long ioaddr = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned long flags; /* If the card is stopped, just return the present stats. */ @@ -1783,39 +1752,30 @@ } /** - * axdev_init - init rest of 8390 device struct + * axdev_setup - init rest of 8390 device struct * @dev: network device structure to init * * Initialize the rest of the 8390 device structure. Do NOT __init * this, as it is used by 8390 based modular drivers too. */ -static int axdev_init(struct net_device *dev) +static void axdev_setup(struct net_device *dev) { + struct ei_device *ei_local; if (ei_debug > 1) printk(version_8390); SET_MODULE_OWNER(dev); - if (dev->priv == NULL) - { - struct ei_device *ei_local; - dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct ei_device)); - ei_local = (struct ei_device *)dev->priv; - spin_lock_init(&ei_local->page_lock); - } + ei_local = (struct ei_device *)netdev_priv(dev); + spin_lock_init(&ei_local->page_lock); dev->hard_start_xmit = &ei_start_xmit; dev->get_stats = get_stats; dev->set_multicast_list = &set_multicast_list; ether_setup(dev); - - return 0; } /* This page of functions should be 8390 generic */ @@ -1831,9 +1791,9 @@ static void AX88190_init(struct net_device *dev, int startp) { - axnet_dev_t *info = (axnet_dev_t *)dev; + axnet_dev_t *info = PRIV(dev); long e8390_base = dev->base_addr; - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int i; int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48; @@ -1902,7 +1862,7 @@ int start_page) { long e8390_base = dev->base_addr; - struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv; + struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev); if (inb_p(e8390_base) & E8390_TRANS) { diff -Nru a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c --- a/drivers/net/pcmcia/com20020_cs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/pcmcia/com20020_cs.c Tue Feb 17 20:00:06 2004 @@ -145,20 +145,6 @@ dev_node_t node; } com20020_dev_t; -static void com20020_setup(struct net_device *dev) -{ - struct arcnet_local *lp = dev->priv; - - lp->timeout = timeout; - lp->backplane = backplane; - lp->clockp = clockp; - lp->clockm = clockm & 3; - lp->hw.owner = THIS_MODULE; - - /* fill in our module parameters as defaults */ - dev->dev_addr[0] = node; -} - /*====================================================================== com20020_attach() creates an "instance" of the driver, allocating @@ -187,14 +173,21 @@ if (!info) goto fail_alloc_info; - dev = alloc_netdev(sizeof(struct arcnet_local), "arc%d", - com20020_setup); + dev = alloc_arcdev(""); if (!dev) goto fail_alloc_dev; memset(info, 0, sizeof(struct com20020_dev_t)); memset(link, 0, sizeof(struct dev_link_t)); lp = dev->priv; + lp->timeout = timeout; + lp->backplane = backplane; + lp->clockp = clockp; + lp->clockm = clockm & 3; + lp->hw.owner = THIS_MODULE; + + /* fill in our module parameters as defaults */ + dev->dev_addr[0] = node; link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.NumPorts1 = 16; @@ -270,11 +263,8 @@ dev = info->dev; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) com20020_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); @@ -293,6 +283,8 @@ if (netif_running(dev)) dev->stop(dev); + + unregister_netdev(dev); /* * this is necessary because we register our IRQ separately @@ -300,10 +292,7 @@ */ if (dev->irq) free_irq(dev->irq, dev); - /* ...but I/O ports are done automatically by card services */ - - unregister_netdev(dev); } DEBUG(1,"kfree...\n"); @@ -447,21 +436,11 @@ DEBUG(0, "com20020_release(0x%p)\n", link); - if (link->open) { - DEBUG(1,"postpone...\n"); - DEBUG(1, "com20020_cs: release postponed, device stll open\n"); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING); - - if (link->state & DEV_STALE_CONFIG) - com20020_detach(link); } /*====================================================================== diff -Nru a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c --- a/drivers/net/pcmcia/fmvj18x_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/pcmcia/fmvj18x_cs.c Tue Feb 17 20:00:07 2004 @@ -332,11 +332,8 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) fmvj18x_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } /* Break the link with Card Services */ if (link->handle) @@ -344,12 +341,9 @@ /* Unlink device structure, free pieces */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* fmvj18x_detach */ /*====================================================================*/ @@ -723,17 +717,6 @@ DEBUG(0, "fmvj18x_release(0x%p)\n", link); - /* - If the device is currently in use, we won't release until it - is actually closed. - */ - if (link->open) { - DEBUG(1, "fmvj18x_cs: release postponed, '%s' " - "still open\n", link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - /* Don't bother checking to see if these succeed or not */ pcmcia_release_window(link->win); pcmcia_release_configuration(link->handle); @@ -741,9 +724,6 @@ pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - fmvj18x_detach(link); } /*====================================================================*/ @@ -1251,8 +1231,6 @@ outb(INTR_OFF, ioaddr + LAN_CTRL); link->open--; - if (link->state & DEV_STALE_CONFIG) - fmvj18x_release(link); return 0; } /* fjn_close */ diff -Nru a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c --- a/drivers/net/pcmcia/ibmtr_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/pcmcia/ibmtr_cs.c Tue Feb 17 20:00:07 2004 @@ -125,8 +125,7 @@ static dev_link_t *dev_list; -extern int ibmtr_probe(struct net_device *dev); -extern int trdev_init(struct net_device *dev); +extern int ibmtr_probe_card(struct net_device *dev); extern irqreturn_t tok_interrupt (int irq, void *dev_id, struct pt_regs *regs); /*====================================================================*/ @@ -199,7 +198,6 @@ link->irq.Instance = info->dev = dev; - dev->init = &ibmtr_probe; SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Register with Card Services */ @@ -253,22 +251,22 @@ return; dev = info->dev; + + if (link->dev) + unregister_netdev(dev); + { struct tok_info *ti = (struct tok_info *)dev->priv; del_timer_sync(&(ti->tr_timer)); } - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) ibmtr_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - unregister_netdev(dev); free_netdev(dev); kfree(info); } /* ibmtr_detach */ @@ -369,7 +367,7 @@ Adapters Technical Reference" SC30-3585 for this info. */ ibmtr_hw_setup(dev, mmiobase); - i = register_netdev(dev); + i = ibmtr_probe_card(dev); if (i != 0) { printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); @@ -410,13 +408,6 @@ DEBUG(0, "ibmtr_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "ibmtr_cs: release postponed, '%s' " - "still open\n", info->node.dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); @@ -428,9 +419,6 @@ } link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - ibmtr_detach(link); } /*====================================================================== @@ -482,7 +470,7 @@ if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); if (link->open) { - (dev->init)(dev); + ibmtr_probe(dev); /* really? */ netif_device_attach(dev); } } diff -Nru a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c --- a/drivers/net/pcmcia/nmclan_cs.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/pcmcia/nmclan_cs.c Tue Feb 17 20:00:05 2004 @@ -551,23 +551,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) nmclan_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* nmclan_detach */ /* ---------------------------------------------------------------------------- @@ -812,21 +806,11 @@ DEBUG(0, "nmclan_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "nmclan_cs: release postponed, '%s' " - "still open\n", link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - nmclan_detach(link); } /* ---------------------------------------------------------------------------- @@ -993,8 +977,6 @@ link->open--; netif_stop_queue(dev); - if (link->state & DEV_STALE_CONFIG) - nmclan_release(link); return 0; } /* mace_close */ diff -Nru a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c --- a/drivers/net/pcmcia/pcnet_cs.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/pcmcia/pcnet_cs.c Tue Feb 17 20:00:08 2004 @@ -224,7 +224,6 @@ static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII }; typedef struct pcnet_dev_t { - struct net_device dev; /* so &dev == &pcnet_dev_t */ dev_link_t link; dev_node_t node; u_int flags; @@ -237,16 +236,10 @@ u_long mii_reset; } pcnet_dev_t; -/*====================================================================== - - We never need to do anything when a pcnet device is "initialized" - by the net software, because we only register already-found cards. - -======================================================================*/ - -static int pcnet_init(struct net_device *dev) +static inline pcnet_dev_t *PRIV(struct net_device *dev) { - return 0; + char *p = netdev_priv(dev); + return (pcnet_dev_t *)(p + sizeof(struct ei_device)); } /*====================================================================== @@ -268,11 +261,11 @@ DEBUG(0, "pcnet_attach()\n"); /* Create new ethernet device */ - info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) return NULL; - memset(info, 0, sizeof(*info)); - link = &info->link; dev = &info->dev; - link->priv = info; + dev = __alloc_ei_netdev(sizeof(pcnet_dev_t)); + if (!dev) return NULL; + info = PRIV(dev); + link = &info->link; + link->priv = dev; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID; @@ -284,9 +277,7 @@ link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; - ethdev_init(dev); SET_MODULE_OWNER(dev); - dev->init = &pcnet_init; dev->open = &pcnet_open; dev->stop = &pcnet_close; dev->set_config = &set_config; @@ -324,7 +315,7 @@ static void pcnet_detach(dev_link_t *link) { - pcnet_dev_t *info = link->priv; + struct net_device *dev = link->priv; dev_link_t **linkp; DEBUG(0, "pcnet_detach(0x%p)\n", link); @@ -335,23 +326,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) pcnet_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { - unregister_netdev(&info->dev); - free_netdev(&info->dev); - } else - kfree(info); - + if (link->dev) + unregister_netdev(dev); + free_netdev(dev); } /* pcnet_detach */ /*====================================================================== @@ -579,8 +564,8 @@ static void pcnet_config(dev_link_t *link) { client_handle_t handle = link->handle; - pcnet_dev_t *info = link->priv; - struct net_device *dev = &info->dev; + struct net_device *dev = link->priv; + pcnet_dev_t *info = PRIV(dev); tuple_t tuple; cisparse_t parse; int i, last_ret, last_fn, start_pg, stop_pg, cm_offset; @@ -782,17 +767,10 @@ static void pcnet_release(dev_link_t *link) { - pcnet_dev_t *info = link->priv; + pcnet_dev_t *info = PRIV(link->priv); DEBUG(0, "pcnet_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "pcnet_cs: release postponed, '%s' still open\n", - info->node.dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - if (info->flags & USE_SHMEM) { iounmap(info->base); pcmcia_release_window(link->win); @@ -802,9 +780,6 @@ pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - pcnet_detach(link); } /*====================================================================== @@ -820,7 +795,7 @@ event_callback_args_t *args) { dev_link_t *link = args->client_data; - pcnet_dev_t *info = link->priv; + struct net_device *dev = link->priv; DEBUG(2, "pcnet_event(0x%06x)\n", event); @@ -828,7 +803,7 @@ case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { - netif_device_detach(&info->dev); + netif_device_detach(dev); pcnet_release(link); } break; @@ -842,7 +817,7 @@ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) { if (link->open) - netif_device_detach(&info->dev); + netif_device_detach(dev); pcmcia_release_configuration(link->handle); } break; @@ -853,9 +828,9 @@ if (link->state & DEV_CONFIG) { pcmcia_request_configuration(link->handle, &link->conf); if (link->open) { - pcnet_reset_8390(&info->dev); - NS8390_init(&info->dev, 1); - netif_device_attach(&info->dev); + pcnet_reset_8390(dev); + NS8390_init(dev, 1); + netif_device_attach(dev); } } break; @@ -1035,7 +1010,7 @@ static void set_misc_reg(struct net_device *dev) { ioaddr_t nic_base = dev->base_addr; - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); u_char tmp; if (info->flags & HAS_MISC_REG) { @@ -1065,7 +1040,7 @@ static void mii_phy_probe(struct net_device *dev) { - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); ioaddr_t mii_addr = dev->base_addr + DLINK_GPIO; int i; u_int tmp, phyid; @@ -1089,7 +1064,7 @@ static int pcnet_open(struct net_device *dev) { - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); dev_link_t *link = &info->link; DEBUG(2, "pcnet_open('%s')\n", dev->name); @@ -1106,7 +1081,7 @@ info->link_status = 0x00; init_timer(&info->watchdog); info->watchdog.function = &ei_watchdog; - info->watchdog.data = (u_long)info; + info->watchdog.data = (u_long)dev; info->watchdog.expires = jiffies + HZ; add_timer(&info->watchdog); @@ -1117,7 +1092,7 @@ static int pcnet_close(struct net_device *dev) { - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); dev_link_t *link = &info->link; DEBUG(2, "pcnet_close('%s')\n", dev->name); @@ -1128,8 +1103,6 @@ link->open--; netif_stop_queue(dev); del_timer_sync(&info->watchdog); - if (link->state & DEV_STALE_CONFIG) - pcnet_release(link); return 0; } /* pcnet_close */ @@ -1170,7 +1143,7 @@ static int set_config(struct net_device *dev, struct ifmap *map) { - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { if (!(info->flags & HAS_MISC_REG)) return -EOPNOTSUPP; @@ -1188,7 +1161,8 @@ static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) { - pcnet_dev_t *info = dev_id; + struct net_device *dev = dev_id; + pcnet_dev_t *info = PRIV(dev); info->stale = 0; ei_interrupt(irq, dev_id, regs); /* FIXME! Was it really ours? */ @@ -1197,8 +1171,8 @@ static void ei_watchdog(u_long arg) { - pcnet_dev_t *info = (pcnet_dev_t *)(arg); - struct net_device *dev = &info->dev; + struct net_device *dev = (struct net_device *)arg; + pcnet_dev_t *info = PRIV(dev); ioaddr_t nic_base = dev->base_addr; ioaddr_t mii_addr = nic_base + DLINK_GPIO; u_short link; @@ -1301,7 +1275,7 @@ static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); u16 *data = (u16 *)&rq->ifr_data; ioaddr_t mii_addr = dev->base_addr + DLINK_GPIO; switch (cmd) { @@ -1412,7 +1386,7 @@ const u_char *buf, const int start_page) { ioaddr_t nic_base = dev->base_addr; - pcnet_dev_t *info = (pcnet_dev_t *)dev; + pcnet_dev_t *info = PRIV(dev); #ifdef PCMCIA_DEBUG int retries = 0; #endif @@ -1598,7 +1572,7 @@ int stop_pg, int cm_offset) { struct net_device *dev = link->priv; - pcnet_dev_t *info = link->priv; + pcnet_dev_t *info = PRIV(dev); win_req_t req; memreq_t mem; int i, window_size, offset, last_ret, last_fn; diff -Nru a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c --- a/drivers/net/pcmcia/smc91c92_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/pcmcia/smc91c92_cs.c Tue Feb 17 20:00:07 2004 @@ -411,23 +411,17 @@ if (*linkp == NULL) return; - if (link->state & DEV_CONFIG) { + if (link->state & DEV_CONFIG) smc91c92_release(link); - if (link->state & DEV_STALE_CONFIG) - return; - } if (link->handle) pcmcia_deregister_client(link->handle); /* Unlink device structure, free bits */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* smc91c92_detach */ /*====================================================================*/ @@ -1070,13 +1064,6 @@ DEBUG(0, "smc91c92_release(0x%p)\n", link); - if (link->open) { - DEBUG(1, "smc91c92_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - pcmcia_release_configuration(link->handle); pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); @@ -1088,9 +1075,6 @@ } link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_CONFIG) - smc91c92_detach(link); } /*====================================================================== @@ -1316,8 +1300,6 @@ link->open--; del_timer_sync(&smc->media); - if (link->state & DEV_STALE_CONFIG) - smc91c92_release(link); return 0; } /* smc_close */ diff -Nru a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c --- a/drivers/net/pcmcia/xirc2ps_cs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/pcmcia/xirc2ps_cs.c Tue Feb 17 20:00:06 2004 @@ -683,12 +683,9 @@ /* Unlink device structure, free it */ *linkp = link->next; - if (link->dev) { + if (link->dev) unregister_netdev(dev); - free_netdev(dev); - } else - kfree(dev); - + free_netdev(dev); } /* xirc2ps_detach */ /**************** diff -Nru a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c --- a/drivers/net/pcnet32.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/pcnet32.c Tue Feb 17 20:00:06 2004 @@ -806,11 +806,12 @@ dev->tx_timeout = pcnet32_tx_timeout; dev->watchdog_timeo = (5*HZ); + /* Fill in the generic fields of the device structure. */ + if (register_netdev(dev)) + goto err_free_consistent; + lp->next = pcnet32_dev; pcnet32_dev = dev; - - /* Fill in the generic fields of the device structure. */ - register_netdev(dev); printk(KERN_INFO "%s: registered as %s\n",dev->name, lp->name); cards_found++; return 0; diff -Nru a/drivers/net/plip.c b/drivers/net/plip.c --- a/drivers/net/plip.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/plip.c Tue Feb 17 20:00:08 2004 @@ -277,19 +277,11 @@ then calls us here. */ -static int +static void plip_init_netdev(struct net_device *dev) { struct net_local *nl = dev->priv; - printk(KERN_INFO "%s", version); - if (dev->irq != -1) - printk(KERN_INFO "%s: Parallel port at %#3lx, using IRQ %d.\n", - dev->name, dev->base_addr, dev->irq); - else - printk(KERN_INFO "%s: Parallel port at %#3lx, not using IRQ.\n", - dev->name, dev->base_addr); - /* Then, override parts of it */ dev->hard_start_xmit = plip_tx_packet; dev->open = plip_open; @@ -323,8 +315,6 @@ INIT_WORK(&nl->timer, (void (*)(void *))plip_timer_bh, dev); spin_lock_init(&nl->lock); - - return 0; } /* Bottom half handler for the delayed request. @@ -1282,14 +1272,13 @@ } sprintf(name, "plip%d", unit); - dev = alloc_netdev(sizeof(struct net_local), name, - ether_setup); + dev = alloc_etherdev(sizeof(struct net_local)); if (!dev) { printk(KERN_ERR "plip: memory squeeze\n"); return; } - dev->init = plip_init_netdev; + strcpy(dev->name, name); SET_MODULE_OWNER(dev); dev->irq = port->irq; @@ -1306,17 +1295,35 @@ if (!nl->pardev) { printk(KERN_ERR "%s: parport_register failed\n", name); - kfree(dev); + goto err_free_dev; return; } + plip_init_netdev(dev); + if (register_netdev(dev)) { printk(KERN_ERR "%s: network register failed\n", name); - kfree(dev); - } else { - dev_plip[unit++] = dev; + goto err_parport_unregister; } + + printk(KERN_INFO "%s", version); + if (dev->irq != -1) + printk(KERN_INFO "%s: Parallel port at %#3lx, " + "using IRQ %d.\n", + dev->name, dev->base_addr, dev->irq); + else + printk(KERN_INFO "%s: Parallel port at %#3lx, " + "not using IRQ.\n", + dev->name, dev->base_addr); + dev_plip[unit++] = dev; } + return; + +err_parport_unregister: + parport_unregister_device(nl->pardev); +err_free_dev: + free_netdev(dev); + return; } /* plip_detach() is called (by the parport code) when a port is diff -Nru a/drivers/net/ppp_deflate.c b/drivers/net/ppp_deflate.c --- a/drivers/net/ppp_deflate.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ppp_deflate.c Tue Feb 17 20:00:08 2004 @@ -351,7 +351,7 @@ state->w_size = w_size; state->strm.next_out = NULL; state->strm.workspace = kmalloc(zlib_inflate_workspacesize(), - GFP_KERNEL); + GFP_KERNEL|__GFP_REPEAT); if (state->strm.workspace == NULL) goto out_free; diff -Nru a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c --- a/drivers/net/ppp_generic.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/ppp_generic.c Tue Feb 17 20:00:08 2004 @@ -917,19 +917,14 @@ return err; } -static int -ppp_net_init(struct net_device *dev) +static void ppp_setup(struct net_device *dev) { dev->hard_header_len = PPP_HDRLEN; dev->mtu = PPP_MTU; - dev->hard_start_xmit = ppp_start_xmit; - dev->get_stats = ppp_net_stats; - dev->do_ioctl = ppp_net_ioctl; dev->addr_len = 0; dev->tx_queue_len = 3; dev->type = ARPHRD_PPP; dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - return 0; } /* @@ -2272,23 +2267,13 @@ int i; ppp = kmalloc(sizeof(struct ppp), GFP_KERNEL); - if (ppp == 0) - goto err; - dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); - if (dev == 0) - goto err; + if (!ppp) + goto out; + dev = alloc_netdev(0, "", ppp_setup); + if (!dev) + goto out1; memset(ppp, 0, sizeof(struct ppp)); - memset(dev, 0, sizeof(struct net_device)); - ret = -EEXIST; - down(&all_ppp_sem); - if (unit < 0) - unit = cardmap_find_first_free(all_ppp_units); - else if (cardmap_get(all_ppp_units, unit) != NULL) - goto err_unlock; /* unit already exists */ - - /* Initialize the new ppp unit */ - ppp->file.index = unit; ppp->mru = PPP_MRU; init_ppp_file(&ppp->file, INTERFACE); ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ @@ -2301,20 +2286,29 @@ ppp->minseq = -1; skb_queue_head_init(&ppp->mrq); #endif /* CONFIG_PPP_MULTILINK */ - ppp->dev = dev; - dev->init = ppp_net_init; - sprintf(dev->name, "ppp%d", unit); dev->priv = ppp; - dev->destructor = free_netdev; - rtnl_lock(); - ret = register_netdevice(dev); - rtnl_unlock(); + dev->hard_start_xmit = ppp_start_xmit; + dev->get_stats = ppp_net_stats; + dev->do_ioctl = ppp_net_ioctl; + + ret = -EEXIST; + down(&all_ppp_sem); + if (unit < 0) + unit = cardmap_find_first_free(all_ppp_units); + else if (cardmap_get(all_ppp_units, unit) != NULL) + goto out2; /* unit already exists */ + + /* Initialize the new ppp unit */ + ppp->file.index = unit; + sprintf(dev->name, "ppp%d", unit); + + ret = register_netdev(dev); if (ret != 0) { printk(KERN_ERR "PPP: couldn't register device %s (%d)\n", dev->name, ret); - goto err_unlock; + goto out2; } atomic_inc(&ppp_unit_count); @@ -2323,14 +2317,13 @@ *retp = 0; return ppp; - err_unlock: +out2: up(&all_ppp_sem); - err: + free_netdev(dev); +out1: + kfree(ppp); +out: *retp = ret; - if (ppp) - kfree(ppp); - if (dev) - kfree(dev); return NULL; } @@ -2361,8 +2354,10 @@ ppp->dev = 0; ppp_unlock(ppp); /* This will call dev_close() for us. */ - if (dev) + if (dev) { unregister_netdev(dev); + free_netdev(dev); + } cardmap_set(&all_ppp_units, ppp->file.index, NULL); ppp->file.dead = 1; ppp->owner = NULL; diff -Nru a/drivers/net/pppoe.c b/drivers/net/pppoe.c --- a/drivers/net/pppoe.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/pppoe.c Tue Feb 17 20:00:07 2004 @@ -517,7 +517,7 @@ sk->sk_protocol = PX_PROTO_OE; sk->sk_destruct = pppoe_sk_free; - po = pppox_sk(sk) = kmalloc(sizeof(*po), GFP_KERNEL); + po = sk->sk_protinfo = kmalloc(sizeof(*po), GFP_KERNEL); if (!po) goto frees; memset(po, 0, sizeof(*po)); diff -Nru a/drivers/net/saa9730.c b/drivers/net/saa9730.c --- a/drivers/net/saa9730.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/saa9730.c Tue Feb 17 20:00:07 2004 @@ -996,11 +996,11 @@ struct net_device *dev = pci_get_drvdata(pdev); if (dev) { - + unregister_netdev(dev); + if (dev->priv) kfree(dev->priv); - unregister_netdev(dev); free_netdev(dev); pci_release_regions(pdev); pci_disable_device(pdev); @@ -1015,17 +1015,10 @@ unsigned char ethernet_addr[6]; int ret = 0; - dev = init_etherdev(dev, 0); - - if (!dev) - return -ENOMEM; - dev->open = lan_saa9730_open_fail; - if (get_ethernet_addr(ethernet_addr)) { - ret = -ENODEV; - goto out; - } + if (get_ethernet_addr(ethernet_addr)) + return -ENODEV; memcpy(dev->dev_addr, ethernet_addr, 6); dev->base_addr = ioaddr; @@ -1040,10 +1033,8 @@ GFP_DMA | GFP_KERNEL) + 7) & ~7); - if (!lp) { - ret = -ENOMEM; - goto out; - } + if (!lp) + return -ENOMEM; dev->priv = lp; memset(lp, 0, sizeof(*lp)); @@ -1057,6 +1048,7 @@ SAA9730_EVM_REGS_ADDR); /* Allocate LAN RX/TX frame buffer space. */ + /* FIXME: a leak */ if ((ret = lan_saa9730_allocate_buffers(lp))) goto out; @@ -1095,63 +1087,70 @@ dev->watchdog_timeo = (HZ >> 1); dev->dma = 0; + ret = register_netdev(dev); + if (ret) + goto out; return 0; out: - if (dev) { - if (dev->priv) - kfree(dev->priv); - unregister_netdevice(dev); - free_netdev(dev); - } - + if (dev->priv) + kfree(dev->priv); + free_netdev(dev); return ret; } static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { - struct net_device *dev = NULL; + struct net_device *dev; unsigned int pci_ioaddr; int err; if (lan_saa9730_debug > 1) printk("saa9730.c: PCI bios is present, checking for devices...\n"); + err = -ENOMEM; + dev = alloc_etherdev(0); + if (!dev) + goto out; + + SET_MODULE_OWNER(dev); + err = pci_enable_device(pdev); if (err) { printk(KERN_ERR "Cannot enable PCI device, aborting.\n"); - goto out; + goto out1; } err = pci_request_regions(pdev, DRV_MODULE_NAME); if (err) { printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n"); - goto out_disable_pdev; + goto out2; } pci_irq_line = pdev->irq; /* LAN base address in located at BAR 1. */ - + pci_ioaddr = pci_resource_start(pdev, 1); pci_set_master(pdev); - + printk("Found SAA9730 (PCI) at %#x, irq %d.\n", pci_ioaddr, pci_irq_line); err = lan_saa9730_init(dev, pci_ioaddr, pci_irq_line); if (err) { printk("Lan init failed"); - goto out_disable_pdev; + goto out2; } - + pci_set_drvdata(pdev, dev); return 0; - out_disable_pdev: +out2: pci_disable_device(pdev); - out: - pci_set_drvdata(pdev, NULL); +out1: + free_netdev(dev); +out: return err; } diff -Nru a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c --- a/drivers/net/sb1250-mac.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sb1250-mac.c Tue Feb 17 20:00:08 2004 @@ -2372,6 +2372,7 @@ unsigned char *eaddr; uint64_t ea_reg; int i; + int err; sc = (struct sbmac_softc *)dev->priv; @@ -2430,7 +2431,6 @@ spin_lock_init(&(sc->sbm_lock)); - ether_setup(dev); dev->open = sbmac_open; dev->hard_start_xmit = sbmac_start_tx; dev->stop = sbmac_close; @@ -2444,8 +2444,11 @@ /* This is needed for PASS2 for Rx H/W checksum feature */ sbmac_set_iphdr_offset(sc); - - return 0; + + err = register_netdev(dev); + if (err) + sbmac_uninitctx(sc); + return err; } @@ -2811,13 +2814,12 @@ } #endif -static struct net_device *dev_sbmac[MAX_UNITS] = {0,0,0}; +static struct net_device *dev_sbmac[MAX_UNITS]; static int __init sbmac_init_module(void) { int idx; - int macidx = 0; struct net_device *dev; sbmac_port_t port; int chip_max_units; @@ -2884,26 +2886,24 @@ * Okay, cool. Initialize this MAC. */ - dev = init_etherdev(NULL,sizeof(struct sbmac_softc)); + dev = alloc_etherdev(sizeof(struct sbmac_softc)); if (!dev) - return -ENOMEM; /* return ENOMEM */ + return -ENOMEM; /* return ENOMEM */ printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port); dev->irq = K_INT_MAC_0 + idx; dev->base_addr = port; dev->mem_end = 0; - /*dev->init = sbmac_init;*/ - sbmac_init(dev, macidx); - - dev_sbmac[macidx] = dev; - macidx++; + if (sbmac_init(dev, idx)) { + port = A_MAC_CHANNEL_BASE(idx); + SBMAC_WRITECSR(KSEG1ADDR(port+R_MAC_ETHERNET_ADDR), + sbmac_orig_hwaddr[idx] ); + free_netdev(dev); + continue; + } + dev_sbmac[idx++] = dev; } - - /* - * Should we care, 'macidx' is the total number of enabled MACs. - */ - return 0; } @@ -2916,21 +2916,12 @@ sbmac_port_t port; for (idx = 0; idx < MAX_UNITS; idx++) { dev = dev_sbmac[idx]; - if (dev == NULL) - continue; - if (dev->priv != NULL) { - struct sbmac_softc *sc = (struct sbmac_softc *) dev->priv; - + if (!dev) { + struct sbmac_softc *sc = dev->priv; unregister_netdev(dev); - sbmac_uninitctx(sc); - + free_netdev(dev); } - - port = A_MAC_CHANNEL_BASE(idx); - SBMAC_WRITECSR(KSEG1ADDR(port+R_MAC_ETHERNET_ADDR), sbmac_orig_hwaddr[idx] ); - free_netdev(dev); - dev_sbmac[idx] = NULL; } } diff -Nru a/drivers/net/seeq8005.c b/drivers/net/seeq8005.c --- a/drivers/net/seeq8005.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/seeq8005.c Tue Feb 17 20:00:07 2004 @@ -78,8 +78,6 @@ /* Index to functions, as function prototypes. */ -extern int seeq8005_probe(struct net_device *dev); - static int seeq8005_probe1(struct net_device *dev, int ioaddr); static int seeq8005_open(struct net_device *dev); static void seeq8005_timeout(struct net_device *dev); @@ -102,22 +100,48 @@ If dev->base_addr == 1, always return failure. */ -int __init -seeq8005_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 seeq8005_probe1(dev, base_addr); - else if (base_addr != 0) /* Don't probe at all. */ - return -ENXIO; - - for (i = 0; seeq8005_portlist[i]; i++) - if (seeq8005_probe1(dev, seeq8005_portlist[i]) == 0) - return 0; +static int io = 0x320; +static int irq = 10; - return -ENODEV; +struct net_device * __init seeq8005_probe(int unit) +{ + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); + unsigned *port; + int err = 0; + + if (!dev) + return ERR_PTR(-ENODEV); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + } + + if (io > 0x1ff) { /* Check a single specified location. */ + err = seeq8005_probe1(dev, io); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = seeq8005_portlist; *port; port++) { + if (seeq8005_probe1(dev, *port) == 0) + break; + } + if (!*port) + err = -ENODEV; + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + release_region(dev->base_addr, SEEQ8005_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } /* This is the real probe routine. Linux has a history of friendly device @@ -274,6 +298,7 @@ /* Fill in the 'dev' fields. */ dev->base_addr = ioaddr; + dev->irq = irq; /* Retrieve and print the ethernet address. */ for (i = 0; i < 6; i++) @@ -307,13 +332,6 @@ } } #endif - - /* Initialize the device structure. */ - dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct net_local)); - dev->open = seeq8005_open; dev->stop = seeq8005_close; dev->hard_start_xmit = seeq8005_send_packet; @@ -321,10 +339,6 @@ dev->watchdog_timeo = HZ/20; dev->get_stats = seeq8005_get_stats; dev->set_multicast_list = set_multicast_list; - - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - dev->flags &= ~IFF_MULTICAST; return 0; @@ -721,9 +735,7 @@ #ifdef MODULE -static struct net_device dev_seeq = { .init = seeq8005_probe }; -static int io = 0x320; -static int irq = 10; +static struct net_device *dev_seeq; MODULE_LICENSE("GPL"); MODULE_PARM(io, "i"); MODULE_PARM(irq, "i"); @@ -732,28 +744,17 @@ int init_module(void) { - dev_seeq.irq=irq; - dev_seeq.base_addr=io; - if (register_netdev(&dev_seeq) != 0) - return -EIO; + dev_seeq = seeq8005_probe(-1); + if (IS_ERR(dev_seeq)) + return PTR_ERR(dev_seeq); return 0; } void cleanup_module(void) { - unregister_netdev(&dev_seeq); - - /* - * Free up the private structure, or leak memory :-) - */ - - kfree(dev_seeq.priv); - dev_seeq.priv = NULL; /* gets re-allocated by el1_probe1 */ - - /* - * If we don't do this, we can't re-insmod it later. - */ - release_region(dev_seeq.base_addr, SEEQ8005_IO_EXTENT); + unregister_netdev(dev_seeq); + release_region(dev_seeq->base_addr, SEEQ8005_IO_EXTENT); + free_netdev(dev_seeq); } #endif /* MODULE */ diff -Nru a/drivers/net/sgiseeq.c b/drivers/net/sgiseeq.c --- a/drivers/net/sgiseeq.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sgiseeq.c Tue Feb 17 20:00:08 2004 @@ -600,6 +600,7 @@ { struct net_device *dev; struct sgiseeq_private *sp; + int err = -ENOMEM; int i; sp = (struct sgiseeq_private *) get_zeroed_page(GFP_KERNEL); @@ -609,19 +610,17 @@ return -ENOMEM; } - dev = init_etherdev(NULL, 0); + dev = alloc_etherdev(0); if (!dev) { printk (KERN_ERR "Seeq8003: Could not allocate memory for device.\n"); - free_page((unsigned long) sp); - return -ENOMEM; + goto out; } if (request_irq(irq, sgiseeq_interrupt, 0, sgiseeqstr, dev)) { - printk(KERN_ERR "Seeq8003: Can't get irq %d\n", dev->irq); - free_page((unsigned long) sp); - unregister_netdev(dev); - return -EAGAIN; + printk(KERN_ERR "Seeq8003: Can't get irq %d\n", irq); + err = -EAGAIN; + goto out1; } printk(KERN_INFO "%s: SGI Seeq8003 ", dev->name); @@ -637,6 +636,8 @@ } printk("\n"); + SET_MODULE_OWNER(dev); + dev->priv = sp; #ifdef DEBUG gpriv = sp; @@ -677,12 +678,22 @@ dev->set_multicast_list = sgiseeq_set_multicast; dev->irq = irq; dev->dma = 0; - ether_setup(dev); + + err = register_netdev(dev); + if (err) + goto out2; sp->next_module = root_sgiseeq_dev; root_sgiseeq_dev = dev; return 0; +out2: + free_irq(dev->irq, dev); +out1: + free_netdev(dev); +out: + free_page((unsigned long) sp); + return err; } static int __init sgiseeq_probe(void) @@ -701,9 +712,9 @@ while (dev) { sp = (struct sgiseeq_private *) dev->priv; next = sp->next_module; + unregister_netdev(dev); free_irq(dev->irq, dev); free_page((unsigned long) sp); - unregister_netdev(dev); free_netdev(dev); dev = next; } diff -Nru a/drivers/net/shaper.c b/drivers/net/shaper.c --- a/drivers/net/shaper.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/shaper.c Tue Feb 17 20:00:07 2004 @@ -718,8 +718,10 @@ if (!dev) break; - if (register_netdev(dev)) + if (register_netdev(dev)) { + free_netdev(dev); break; + } devs[i] = dev; shapers_registered++; @@ -737,9 +739,12 @@ { int i; - for (i = 0; i < shapers_registered; i++) - if (devs[i]) + for (i = 0; i < shapers_registered; i++) { + if (devs[i]) { unregister_netdev(devs[i]); + free_netdev(devs[i]); + } + } kfree(devs); devs = NULL; diff -Nru a/drivers/net/sk98lin/h/lm80.h b/drivers/net/sk98lin/h/lm80.h --- a/drivers/net/sk98lin/h/lm80.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/lm80.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: lm80.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.6 $ - * Date: $Date: 2003/05/13 17:26:52 $ * Purpose: Contains all defines for the LM80 Chip * (National Semiconductor). * @@ -20,32 +18,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * $Log: lm80.h,v $ - * Revision 1.6 2003/05/13 17:26:52 mkarl - * Editorial changes. - * - * Revision 1.5 2003/03/31 07:15:18 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.4 2002/04/25 11:04:10 rschmidt - * Editorial changes - * - * Revision 1.3 1999/11/22 13:41:19 cgoos - * Changed license header to GPL. - * - * Revision 1.2 1999/03/12 13:26:51 malthoff - * remove __STDC__. - * - * Revision 1.1 1998/06/19 09:28:31 malthoff - * created. - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skaddr.h b/drivers/net/sk98lin/h/skaddr.h --- a/drivers/net/sk98lin/h/skaddr.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skaddr.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skaddr.h * Project: Gigabit Ethernet Adapters, ADDR-Modul - * Version: $Revision: 1.29 $ - * Date: $Date: 2003/05/13 16:57:24 $ * Purpose: Header file for Address Management (MC, UC, Prom). * ******************************************************************************/ @@ -19,112 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skaddr.h,v $ - * Revision 1.29 2003/05/13 16:57:24 mkarl - * Changes for SLIM driver. - * Editorial changes. - * - * Revision 1.28 2003/04/15 09:33:22 tschilli - * Copyright messages changed. - * - * Revision 1.27 2003/04/14 15:55:11 tschilli - * "#error C++ is not yet supported." removed. - * - * Revision 1.26 2002/11/15 07:24:42 tschilli - * SK_ADDR_EQUAL macro fixed. - * - * Revision 1.25 2002/06/10 13:55:18 tschilli - * Changes for handling YUKON. - * All changes are internally and not visible to the programmer - * using this module. - * - * Revision 1.24 2001/01/22 13:41:34 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.23 2000/08/10 11:27:50 rassmann - * Editorial changes. - * Preserving 32-bit alignment in structs for the adapter context. - * - * Revision 1.22 2000/08/07 11:10:40 rassmann - * Editorial changes. - * - * Revision 1.21 2000/05/04 09:39:59 rassmann - * Editorial changes. - * Corrected multicast address hashing. - * - * Revision 1.20 1999/11/22 13:46:14 cgoos - * Changed license header to GPL. - * Allowing overwrite for SK_ADDR_EQUAL. - * - * Revision 1.19 1999/05/28 10:56:07 rassmann - * Editorial changes. - * - * Revision 1.18 1999/04/06 17:22:04 rassmann - * Added private "ActivePort". - * - * Revision 1.17 1999/01/14 16:18:19 rassmann - * Corrected multicast initialization. - * - * Revision 1.16 1999/01/04 10:30:36 rassmann - * SkAddrOverride only possible after SK_INIT_IO phase. - * - * Revision 1.15 1998/12/29 13:13:11 rassmann - * An address override is now preserved in the SK_INIT_IO phase. - * All functions return an int now. - * Extended parameter checking. - * - * Revision 1.14 1998/11/24 12:39:45 rassmann - * Reserved multicast entry for BPDU address. - * 13 multicast entries left for protocol. - * - * Revision 1.13 1998/11/13 17:24:32 rassmann - * Changed return value of SkAddrOverride to int. - * - * Revision 1.12 1998/11/13 16:56:19 rassmann - * Added macro SK_ADDR_COMPARE. - * Changed return type of SkAddrOverride to SK_BOOL. - * - * Revision 1.11 1998/10/28 18:16:35 rassmann - * Avoiding I/Os before SK_INIT_RUN level. - * Aligning InexactFilter. - * - * Revision 1.10 1998/10/22 11:39:10 rassmann - * Corrected signed/unsigned mismatches. - * - * Revision 1.9 1998/10/15 15:15:49 rassmann - * Changed Flags Parameters from SK_U8 to int. - * Checked with lint. - * - * Revision 1.8 1998/09/24 19:15:12 rassmann - * Code cleanup. - * - * Revision 1.7 1998/09/18 20:22:13 rassmann - * Added HW access. - * - * Revision 1.6 1998/09/04 19:40:20 rassmann - * Interface enhancements. - * - * Revision 1.5 1998/09/04 12:40:57 rassmann - * Interface cleanup. - * - * Revision 1.4 1998/09/04 12:14:13 rassmann - * Interface cleanup. - * - * Revision 1.3 1998/09/02 16:56:40 rassmann - * Updated interface. - * - * Revision 1.2 1998/08/27 14:26:09 rassmann - * Updated interface. - * - * Revision 1.1 1998/08/21 08:31:08 rassmann - * First public version. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h --- a/drivers/net/sk98lin/h/skcsum.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/h/skcsum.h Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skcsum.h * Project: GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx) - * Version: $Revision: 1.10 $ - * Date: $Date: 2003/08/20 13:59:57 $ * Purpose: Store/verify Internet checksum in send/receive packets. * ******************************************************************************/ @@ -18,52 +16,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skcsum.h,v $ - * Revision 1.10 2003/08/20 13:59:57 mschmid - * Changed notation of #ifndef SkCsCalculateChecksum to - * #ifndef SK_CS_CALCULATE_CHECKSUM - * - * Revision 1.9 2001/02/06 11:21:39 rassmann - * Editorial changes. - * - * Revision 1.8 2001/02/06 11:15:36 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.7 2000/06/29 13:17:05 rassmann - * Corrected reception of a packet with UDP checksum == 0 (which means there - * is no UDP checksum). - * - * Revision 1.6 2000/02/28 12:33:44 cgoos - * Changed C++ style comments to C style. - * - * Revision 1.5 2000/02/21 12:10:05 cgoos - * Fixed license comment. - * - * Revision 1.4 2000/02/21 11:08:37 cgoos - * Merged changes back into common source. - * - * Revision 1.1 1999/07/26 14:47:49 mkarl - * changed from common source to windows specific source - * added return SKCS_STATUS_IP_CSUM_ERROR_UDP and - * SKCS_STATUS_IP_CSUM_ERROR_TCP to pass the NidsTester - * changes for Tx csum offload - * - * Revision 1.2 1998/09/04 12:16:34 mhaveman - * Checked in for Stephan to allow compilation. - * -Added definition SK_CSUM_EVENT_CLEAR_PROTO_STATS to clear statistic - * -Added prototype for SkCsEvent() - * - * Revision 1.1 1998/09/01 15:36:53 swolf - * initial revision - * - * 01-Sep-1998 sw Created. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skdebug.h b/drivers/net/sk98lin/h/skdebug.h --- a/drivers/net/sk98lin/h/skdebug.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skdebug.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skdebug.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.14 $ - * Date: $Date: 2003/05/13 17:26:00 $ * Purpose: SK specific DEBUG support * ******************************************************************************/ @@ -19,58 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * $Log: skdebug.h,v $ - * Revision 1.14 2003/05/13 17:26:00 mkarl - * Editorial changes. - * - * Revision 1.13 2003/03/31 07:16:39 mkarl - * Corrected Copyright. - * - * Revision 1.12 2002/07/15 15:37:13 rschmidt - * Power Management support - * Editorial changes - * - * Revision 1.11 2002/04/25 11:04:39 rschmidt - * Editorial changes - * - * Revision 1.10 1999/11/22 13:47:40 cgoos - * Changed license header to GPL. - * - * Revision 1.9 1999/09/14 14:02:43 rwahl - * Added SK_DBGMOD_PECP. - * - * Revision 1.8 1998/11/25 08:31:54 gklug - * fix: no C++ comments allowed in common sources - * - * Revision 1.7 1998/11/24 16:47:24 swolf - * Driver may now define its own SK_DBG_MSG() (eg. in "h/skdrv1st.h"). - * - * Revision 1.6 1998/10/28 10:23:55 rassmann - * ADDED SK_DBGMOD_ADDR. - * - * Revision 1.5 1998/10/22 09:43:55 gklug - * add: CSUM module - * - * Revision 1.4 1998/10/01 07:54:44 gklug - * add: PNMI debug module - * - * Revision 1.3 1998/09/18 08:32:34 afischer - * Macros changed according ssr-spec.: - * SK_DBG_MODCHK -> SK_DBG_CHKMOD - * SK_DBG_CATCHK -> SK_DBG_CHKCAT - * - * Revision 1.2 1998/07/03 14:38:25 malthoff - * Add category SK_DBGCAT_FATAL. - * - * Revision 1.1 1998/06/19 13:39:01 malthoff - * created. - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skdrv1st.h b/drivers/net/sk98lin/h/skdrv1st.h --- a/drivers/net/sk98lin/h/skdrv1st.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/h/skdrv1st.h Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skdrv1st.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.4 $ - * Date: $Date: 2003/11/12 14:28:14 $ * Purpose: First header file for driver and all other modules * ******************************************************************************/ @@ -19,87 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skdrv1st.h,v $ - * Revision 1.4 2003/11/12 14:28:14 rroesler - * Fix: use dedicated ip_fast_csum() on X86_64 systems - * - * Revision 1.3 2003/10/07 08:16:52 mlindner - * Fix: Copyright changes - * - * Revision 1.2 2003/09/29 12:05:59 mlindner - * Fix: Added define SK_CS_CALCULSTE_CHECKSUM - * - * Revision 1.1 2003/07/21 07:22:43 rroesler - * Fix: Re-Enter after CVS crash - * - * Revision 1.15 2003/07/17 14:54:09 rroesler - * Fix: Corrected SK_PNMI_READ macros to copy right amount of bytes - * - * Revision 1.14 2003/06/03 14:36:32 mlindner - * Add: Additions for SK_SLIM - * - * Revision 1.13 2003/05/26 14:03:06 mlindner - * Add: Support for SLIM skaddr - * - * Revision 1.12 2003/05/26 12:56:39 mlindner - * Add: Support for Kernel 2.5/2.6 - * Add: New SkOsGetTimeCurrent function - * Add: SK_PNMI_HUNDREDS_SEC definition - * Fix: SK_TICKS_PER_SEC on Intel Itanium2 - * - * Revision 1.11 2003/02/25 14:16:40 mlindner - * Fix: Copyright statement - * - * Revision 1.10 2002/10/02 12:46:02 mlindner - * Add: Support for Yukon - * - * Revision 1.9.2.2 2001/12/07 12:06:42 mlindner - * Fix: malloc -> slab changes - * - * Revision 1.9.2.1 2001/03/12 16:50:59 mlindner - * chg: kernel 2.4 adaption - * - * Revision 1.9 2001/01/22 14:16:04 mlindner - * added ProcFs functionality - * Dual Net functionality integrated - * Rlmt networks added - * - * Revision 1.8 2000/02/21 12:19:18 cgoos - * Added default for SK_DEBUG_CHKMOD/_CHKCAT - * - * Revision 1.7 1999/11/22 13:50:00 cgoos - * Changed license header to GPL. - * Added overwrite for several functions. - * Removed linux 2.0.x definitions. - * Removed PCI vendor ID definition (now in kernel). - * - * Revision 1.6 1999/07/27 08:03:33 cgoos - * Changed SK_IN/OUT macros to readX/writeX instead of memory - * accesses (necessary for ALPHA). - * - * Revision 1.5 1999/07/23 12:10:21 cgoos - * Removed SK_RLMT_SLOW_LOOKAHEAD define. - * - * Revision 1.4 1999/07/14 12:31:13 cgoos - * Added SK_RLMT_SLOW_LOOKAHEAD define. - * - * Revision 1.3 1999/04/07 10:12:54 cgoos - * Added check for KERNEL and OPTIMIZATION defines. - * - * Revision 1.2 1999/03/01 08:51:47 cgoos - * Fixed pcibios_read/write definitions. - * - * Revision 1.1 1999/02/16 07:40:49 cgoos - * First version. - * - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h --- a/drivers/net/sk98lin/h/skdrv2nd.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/skdrv2nd.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skdrv2nd.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.10 $ - * Date: $Date: 2003/12/11 16:04:45 $ * Purpose: Second header file for driver and all other modules * ******************************************************************************/ @@ -19,122 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skdrv2nd.h,v $ - * Revision 1.10 2003/12/11 16:04:45 mlindner - * Add: New pnmi data backup structure - * - * Revision 1.9 2003/11/10 09:31:37 rroesler - * Add: pnmiBackup structure for DIAG backup restore - * - * Revision 1.8 2003/10/22 14:18:32 rroesler - * Fix: DIAG handling for DualNet cards - * - * Revision 1.7 2003/10/07 09:34:59 mlindner - * Add: New defines for lower and upper range values (interrupt moderation) - * - * Revision 1.6 2003/10/07 08:16:51 mlindner - * Fix: Copyright changes - * - * Revision 1.5 2003/09/01 13:10:39 rroesler - * Add: Prototypes for DIAG Attach/Detach functions - * - * Revision 1.4 2003/09/01 12:33:38 rroesler - * Add: Defines for optimized DIAG interaction - * - * Revision 1.3 2003/08/12 16:51:18 mlindner - * Fix: UDP and TCP Proto checks - * Fix: UDP header offset - * - * Revision 1.2 2003/08/07 10:50:54 mlindner - * Add: Speed and HW-Csum support for Yukon Lite chipset - * - * Revision 1.1 2003/07/21 07:25:29 rroesler - * Fix: Re-Enter after CVS crash - * - * Revision 1.19 2003/07/07 09:53:10 rroesler - * Fix: Removed proprietary RxTx defines and used the ones from skgehw.h instead - * - * Revision 1.18 2003/06/12 07:54:14 mlindner - * Fix: Changed Descriptor Alignment to 64 Byte - * - * Revision 1.17 2003/05/26 12:56:39 mlindner - * Add: Support for Kernel 2.5/2.6 - * Add: New SkOsGetTimeCurrent function - * Add: SK_PNMI_HUNDREDS_SEC definition - * Fix: SK_TICKS_PER_SEC on Intel Itanium2 - * - * Revision 1.16 2003/03/21 14:56:18 rroesler - * Added code regarding interrupt moderation - * - * Revision 1.15 2003/02/25 14:16:40 mlindner - * Fix: Copyright statement - * - * Revision 1.14 2003/02/25 13:26:26 mlindner - * Add: Support for various vendors - * - * Revision 1.13 2002/10/02 12:46:02 mlindner - * Add: Support for Yukon - * - * Revision 1.12.2.2 2001/09/05 12:14:50 mlindner - * add: New hardware revision int - * - * Revision 1.12.2.1 2001/03/12 16:50:59 mlindner - * chg: kernel 2.4 adaption - * - * Revision 1.12 2001/03/01 12:52:15 mlindner - * Fixed ring size - * - * Revision 1.11 2001/02/19 13:28:02 mlindner - * Changed PNMI parameter values - * - * Revision 1.10 2001/01/22 14:16:04 mlindner - * added ProcFs functionality - * Dual Net functionality integrated - * Rlmt networks added - * - * Revision 1.1 2000/10/05 19:46:50 phargrov - * Add directory src/vipk_devs_nonlbl/vipk_sk98lin/ - * This is the SysKonnect SK-98xx Gigabit Ethernet driver, - * contributed by SysKonnect. - * - * Revision 1.9 2000/02/21 10:39:55 cgoos - * Added flag for jumbo support usage. - * - * Revision 1.8 1999/11/22 13:50:44 cgoos - * Changed license header to GPL. - * Fixed two comments. - * - * Revision 1.7 1999/09/28 12:38:21 cgoos - * Added CheckQueue to SK_AC. - * - * Revision 1.6 1999/07/27 08:04:05 cgoos - * Added checksumming variables to SK_AC. - * - * Revision 1.5 1999/03/29 12:33:26 cgoos - * Rreversed to fine lock granularity. - * - * Revision 1.4 1999/03/15 12:14:02 cgoos - * Added DriverLock to SK_AC. - * Removed other locks. - * - * Revision 1.3 1999/03/01 08:52:27 cgoos - * Changed pAC->PciDev declaration. - * - * Revision 1.2 1999/02/18 10:57:14 cgoos - * Removed SkDrvTimeStamp prototype. - * Fixed SkGeOsGetTime prototype. - * - * Revision 1.1 1999/02/16 07:41:01 cgoos - * First version. - * - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skerror.h b/drivers/net/sk98lin/h/skerror.h --- a/drivers/net/sk98lin/h/skerror.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skerror.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skerror.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.7 $ - * Date: $Date: 2003/05/13 17:25:13 $ * Purpose: SK specific Error log support * ******************************************************************************/ @@ -19,38 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * $Log: skerror.h,v $ - * Revision 1.7 2003/05/13 17:25:13 mkarl - * Editorial changes. - * - * Revision 1.6 2003/03/31 07:17:48 mkarl - * Corrected Copyright. - * - * Revision 1.5 2002/04/25 11:05:10 rschmidt - * Editorial changes - * - * Revision 1.4 1999/11/22 13:51:59 cgoos - * Changed license header to GPL. - * - * Revision 1.3 1999/09/14 14:04:42 rwahl - * Added error base SK_ERRBASE_PECP. - * Changed error base for driver. - * - * Revision 1.2 1998/08/11 11:15:41 gklug - * chg: comments - * - * Revision 1.1 1998/08/11 11:09:38 gklug - * add: error bases - * add: error Classes - * first version - * - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgedrv.h b/drivers/net/sk98lin/h/skgedrv.h --- a/drivers/net/sk98lin/h/skgedrv.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skgedrv.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgedrv.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.10 $ - * Date: $Date: 2003/07/04 12:25:01 $ * Purpose: Interface with the driver * ******************************************************************************/ @@ -19,47 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgedrv.h,v $ - * Revision 1.10 2003/07/04 12:25:01 rschmidt - * Added event SK_DRV_DOWNSHIFT_DET for Downshift 4-Pair / 2-Pair - * - * Revision 1.9 2003/05/13 17:24:21 mkarl - * Added events SK_DRV_LINK_UP and SK_DRV_LINK_DOWN for drivers not using - * RLMT (SK_NO_RLMT). - * Editorial changes. - * - * Revision 1.8 2003/03/31 07:18:54 mkarl - * Corrected Copyright. - * - * Revision 1.7 2003/03/18 09:43:47 rroesler - * Added new event for timer - * - * Revision 1.6 2002/07/15 15:38:01 rschmidt - * Power Management support - * Editorial changes - * - * Revision 1.5 2002/04/25 11:05:47 rschmidt - * Editorial changes - * - * Revision 1.4 1999/11/22 13:52:46 cgoos - * Changed license header to GPL. - * - * Revision 1.3 1998/12/01 13:31:39 cgoos - * SWITCH INTERN Event added. - * - * Revision 1.2 1998/11/25 08:28:38 gklug - * rmv: PORT SWITCH Event - * - * Revision 1.1 1998/09/29 06:14:07 gklug - * add: driver events (initial version) - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgehw.h b/drivers/net/sk98lin/h/skgehw.h --- a/drivers/net/sk98lin/h/skgehw.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/skgehw.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skgehw.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.56 $ - * Date: $Date: 2003/09/23 09:01:00 $ * Purpose: Defines and Macros for the Gigabit Ethernet Adapter Product Family * ******************************************************************************/ @@ -19,236 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * $Log: skgehw.h,v $ - * Revision 1.56 2003/09/23 09:01:00 malthoff - * Minor change: Define I2C device size constants as long. - * - * Revision 1.55 2003/09/16 14:03:34 rschmidt - * Added define for YUKON-Lite Rev. A1,A2 Chip Revision - * Moved defines for PHY power down modes to skgeinit.h - * Editorial changes - * - * Revision 1.54 2003/09/16 07:37:58 mschmid - * Added defines for Marvell PHY low power modes - * - * Revision 1.53 2003/07/04 12:39:01 rschmidt - * Added SK_FAR to pointers in XM_IN32() and GM_IN32() macros (for PXE) - * Editorial changes - * - * Revision 1.52 2003/05/13 17:16:36 mkarl - * Added SK_FAR for PXE. - * Editorial changes. - * - * Revision 1.51 2003/04/08 16:31:50 rschmidt - * Added defines for new Chip IDs (YUKON-Lite, YUKON-LP) - * Editorial changes - * - * Revision 1.50 2003/03/31 07:29:45 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.49 2003/01/28 09:43:49 rschmidt - * Added defines for PCI-Spec. 2.3 IRQ - * Added defines for CLK_RUN (YUKON-Lite) - * Editorial changes - * - * Revision 1.48 2002/12/05 10:25:11 rschmidt - * Added defines for Half Duplex Burst Mode On/Off - * Added defines for Rx GMAC FIFO Flush feature - * Editorial changes - * - * Revision 1.47 2002/11/12 17:01:31 rschmidt - * Added defines for WOL_CTL_DEFAULT - * Editorial changes - * - * Revision 1.46 2002/10/14 14:47:57 rschmidt - * Corrected bit mask for HW self test results - * Added defines for WOL Registers - * Editorial changes - * - * Revision 1.45 2002/10/11 09:25:22 mkarl - * Added bit mask for HW self test results. - * - * Revision 1.44 2002/08/16 14:44:36 rschmidt - * Added define GPC_HWCFG_GMII_FIB for YUKON Fiber - * - * Revision 1.43 2002/08/12 13:31:50 rschmidt - * Corrected macros for GMAC Address Registers: GM_INADDR(), - * GM_OUTADDR(), GM_INHASH, GM_OUTHASH. - * Editorial changes - * - * Revision 1.42 2002/08/08 15:37:56 rschmidt - * Added defines for Power Management Capabilities - * Editorial changes - * - * Revision 1.41 2002/07/23 16:02:25 rschmidt - * Added macro WOL_REG() to access WOL reg. (HW-Bug in YUKON 1st rev.) - * - * Revision 1.40 2002/07/15 15:41:37 rschmidt - * Added new defines for Power Management Cap. & Control - * Editorial changes - * - * Revision 1.39 2002/06/10 09:37:07 rschmidt - * Added macros for the ADDR-Module - * - * Revision 1.38 2002/06/05 08:15:19 rschmidt - * Added defines for WOL Registers - * Editorial changes - * - * Revision 1.37 2002/04/25 11:39:23 rschmidt - * Added new defines for PCI Our Register 1 - * Added new registers and defines for YUKON (Rx FIFO, Tx FIFO, - * Time Stamp Timer, GMAC Control, GPHY Control,Link Control, - * GMAC IRQ Source and Mask, Wake-up Frame Pattern Match); - * Added new defines for Control/Status (VAUX available) - * Added Chip ID for YUKON - * Added define for descriptors with UDP ext. for YUKON - * Added macros to access the GMAC - * Added new Phy Type for Marvell 88E1011S (GPHY) - * Editorial changes - * - * Revision 1.36 2000/11/09 12:32:49 rassmann - * Renamed variables. - * - * Revision 1.35 2000/05/19 10:17:13 cgoos - * Added inactivity check in PHY_READ (in DEBUG mode only). - * - * Revision 1.34 1999/11/22 13:53:40 cgoos - * Changed license header to GPL. - * - * Revision 1.33 1999/08/27 11:17:10 malthoff - * It's more savely to put brackets around macro parameters. - * Brackets added for PHY_READ and PHY_WRITE. - * - * Revision 1.32 1999/05/19 07:31:01 cgoos - * Changes for 1000Base-T. - * Added HWAC_LINK_LED macro. - * - * Revision 1.31 1999/03/12 13:27:40 malthoff - * Remove __STDC__. - * - * Revision 1.30 1999/02/09 09:28:20 malthoff - * Add PCI_ERRBITS. - * - * Revision 1.29 1999/01/26 08:55:48 malthoff - * Bugfix: The 16 bit field relations inside the descriptor are - * endianess dependend if the descriptor reversal feature - * (PCI_REV_DESC bit in PCI_OUR_REG_2) is enabled. - * Drivers which use this feature has to set the define - * SK_USE_REV_DESC. - * - * Revision 1.28 1998/12/10 11:10:22 malthoff - * bug fix: IS_IRQ_STAT and IS_IRQ_MST_ERR has been twisted. - * - * Revision 1.27 1998/11/13 14:19:21 malthoff - * Bug Fix: The bit definition of B3_PA_CTRL has completely - * changed from HW Spec v1.3 to v1.5. - * - * Revision 1.26 1998/11/04 08:31:48 cgoos - * Fixed byte ordering in XM_OUTADDR/XM_OUTHASH macros. - * - * Revision 1.25 1998/11/04 07:16:25 cgoos - * Changed byte ordering in XM_INADDR/XM_INHASH again. - * - * Revision 1.24 1998/11/02 11:08:43 malthoff - * RxCtrl and TxCtrl must be volatile. - * - * Revision 1.23 1998/10/28 13:50:45 malthoff - * Fix: Endian support missing in XM_IN/OUT-ADDR/HASH macros. - * - * Revision 1.22 1998/10/26 08:01:36 malthoff - * RX_MFF_CTRL1 is split up into RX_MFF_CTRL1, - * RX_MFF_STAT_TO, and RX_MFF_TIST_TO. - * TX_MFF_CTRL1 is split up TX_MFF_CTRL1 and TX_MFF_WAF. - * - * Revision 1.21 1998/10/20 07:43:10 malthoff - * Fix: XM_IN/OUT/ADDR/HASH macros: - * The pointer must be casted. - * - * Revision 1.20 1998/10/19 15:53:59 malthoff - * Remove ML proto definitions. - * - * Revision 1.19 1998/10/16 14:40:17 gklug - * fix: typo B0_XM_IMSK regs - * - * Revision 1.18 1998/10/16 09:46:54 malthoff - * Remove temp defines for ML diag prototype. - * Fix register definition for B0_XM1_PHY_DATA, B0_XM1_PHY_DATA - * B0_XM2_PHY_DATA, B0_XM2_PHY_ADDR, B0_XA1_CSR, B0_XS1_CSR, - * B0_XS2_CSR, and B0_XA2_CSR. - * - * Revision 1.17 1998/10/14 06:03:14 cgoos - * Changed shifted constant to ULONG. - * - * Revision 1.16 1998/10/09 07:05:41 malthoff - * Rename ALL_PA_ENA_TO to PA_ENA_TO_ALL. - * - * Revision 1.15 1998/10/05 07:54:23 malthoff - * Split up RB_CTRL and it's bit definition into - * RB_CTRL, RB_TST1, and RB_TST2. - * Rename RB_RX_HTPP to RB_RX_LTPP. - * Add ALL_PA_ENA_TO. Modify F_WATER_MARK - * according to HW Spec. v1.5. - * Add MFF_TX_CTRL_DEF. - * - * Revision 1.14 1998/09/28 13:31:16 malthoff - * bug fix: B2_MAC_3 is 0x110 not 0x114 - * - * Revision 1.13 1998/09/24 14:42:56 malthoff - * Split the RX_MFF_TST into RX_MFF_CTRL2, - * RX_MFF_TST1, and RX_MFF_TST2. - * Rename RX_MFF_CTRL to RX_MFF_CTRL1. - * Add BMU bit CSR_SV_IDLE. - * Add macros PHY_READ() and PHY_WRITE(). - * Rename macro SK_ADDR() to SK_HW_ADDR() - * because of conflicts with the Address Module. - * - * Revision 1.12 1998/09/16 07:25:33 malthoff - * Change the parameter order in the XM_INxx and XM_OUTxx macros, - * to have the IoC as first parameter. - * - * Revision 1.11 1998/09/03 09:58:41 malthoff - * Rework the XM_xxx macros. Use {} instead of () to - * be compatible with SK_xxx macros which are defined - * with {}. - * - * Revision 1.10 1998/09/02 11:16:39 malthoff - * Temporary modify B2_I2C_SW to make tests with - * the GE/ML prototype. - * - * Revision 1.9 1998/08/19 09:11:49 gklug - * fix: struct are removed from c-source (see CCC) - * add: typedefs for all structs - * - * Revision 1.8 1998/08/18 08:27:27 malthoff - * Add some temporary workarounds to test GE - * sources with the ML. - * - * Revision 1.7 1998/07/03 14:42:26 malthoff - * bug fix: Correct macro XMA(). - * Add temporary workaround to access the PCI config space over I/O - * - * Revision 1.6 1998/06/23 11:30:36 malthoff - * Remove ';' with ',' in macors. - * - * Revision 1.5 1998/06/22 14:20:57 malthoff - * Add macro SK_ADDR(Base,Addr). - * - * Revision 1.4 1998/06/19 13:35:43 malthoff - * change 'pGec' with 'pAC' - * - * Revision 1.3 1998/06/17 14:58:16 cvs - * Lost keywords reinserted. - * - * Revision 1.1 1998/06/17 14:16:36 cvs - * created - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgehwt.h b/drivers/net/sk98lin/h/skgehwt.h --- a/drivers/net/sk98lin/h/skgehwt.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/h/skgehwt.h Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skhwt.h * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.7 $ - * Date: $Date: 2003/09/16 12:55:08 $ * Purpose: Defines for the hardware timer functions * ******************************************************************************/ @@ -19,34 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgehwt.h,v $ - * Revision 1.7 2003/09/16 12:55:08 rschmidt - * Editorial changes - * - * Revision 1.6 2003/05/13 17:57:48 mkarl - * Editorial changes. - * - * Revision 1.5 1999/11/22 13:54:24 cgoos - * Changed license header to GPL. - * - * Revision 1.4 1998/08/19 09:50:58 gklug - * fix: remove struct keyword from C-code (see CCC) add typedefs - * - * Revision 1.3 1998/08/14 07:09:29 gklug - * fix: chg pAc -> pAC - * - * Revision 1.2 1998/08/07 12:54:21 gklug - * fix: first compiled version - * - * Revision 1.1 1998/08/07 09:32:58 gklug - * first version * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgei2c.h b/drivers/net/sk98lin/h/skgei2c.h --- a/drivers/net/sk98lin/h/skgei2c.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skgei2c.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgei2c.h * Project: Gigabit Ethernet Adapters, TWSI-Module - * Version: $Revision: 1.25 $ - * Date: $Date: 2003/10/20 09:06:05 $ * Purpose: Special defines for TWSI * ******************************************************************************/ @@ -19,100 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgei2c.h,v $ - * Revision 1.25 2003/10/20 09:06:05 rschmidt - * Editorial changes. - * - * Revision 1.24 2003/09/23 09:31:15 malthoff - * Parameter dev_size added to macro definition of SK_I2C_CTL. - * - * Revision 1.23 2002/12/19 14:34:27 rschmidt - * Added cast in macros SK_I2C_SET_BIT() and SK_I2C_CLR_BIT() - * Editorial changes (TWSI) - * - * Revision 1.22 2002/10/14 16:45:56 rschmidt - * Editorial changes (TWSI) - * - * Revision 1.21 2002/08/13 08:42:24 rschmidt - * Changed define for SK_MIN_SENSORS back to 5 - * Merged defines for PHY PLL 3V3 voltage (A and B) - * Editorial changes - * - * Revision 1.20 2002/08/06 09:43:56 jschmalz - * Extensions and changes for Yukon - * - * Revision 1.19 2002/08/02 12:00:08 rschmidt - * Added defines for YUKON sensors - * Editorial changes - * - * Revision 1.18 2001/08/16 12:44:33 afischer - * LM80 sensor init values corrected - * - * Revision 1.17 1999/11/22 13:55:25 cgoos - * Changed license header to GPL. - * - * Revision 1.16 1999/11/12 08:24:10 malthoff - * Change voltage warning and error limits - * (warning +-5%, error +-10%). - * - * Revision 1.15 1999/09/14 14:14:43 malthoff - * The 1000BT Dual Link adapter has got only one Fan. - * The second Fan has been removed. - * - * Revision 1.14 1999/05/27 13:40:50 malthoff - * Fan Divisor = 1. Assuming fan with 6500 rpm. - * - * Revision 1.13 1999/05/20 14:56:55 malthoff - * Bug Fix: Missing brace in SK_LM80_FAN_FAKTOR. - * - * Revision 1.12 1999/05/20 09:22:00 cgoos - * Changes for 1000Base-T (Fan sensors). - * - * Revision 1.11 1998/10/14 05:57:22 cgoos - * Fixed compilation warnings. - * - * Revision 1.10 1998/09/04 08:37:00 malthoff - * bugfix: correct the SK_I2C_GET_CTL() macro. - * - * Revision 1.9 1998/08/25 06:10:03 gklug - * add: thresholds for all sensors - * - * Revision 1.8 1998/08/20 11:37:42 gklug - * chg: change Ioc to IoC - * - * Revision 1.7 1998/08/20 08:53:11 gklug - * fix: compiler errors - * add: Threshold values - * - * Revision 1.6 1998/08/17 11:37:09 malthoff - * Bugfix in SK_I2C_CTL macro. The parameter 'dev' - * has to be shifted 9 bits. - * - * Revision 1.5 1998/08/17 06:52:21 malthoff - * Remove unrequired macros. - * Add macros for accessing TWSI SW register. - * - * Revision 1.4 1998/08/13 08:30:18 gklug - * add: conversion factors for read values - * add: new state SEN_VALEXT to read extension value of temperature sensor - * - * Revision 1.3 1998/08/12 13:37:56 gklug - * rmv: error numbers and messages - * - * Revision 1.2 1998/08/11 07:54:38 gklug - * add: sensor states for GE sensors - * add: Macro to access TWSI hardware register - * chg: Error messages for TWSI errors - * - * Revision 1.1 1998/07/17 11:27:56 gklug - * Created. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgeinit.h b/drivers/net/sk98lin/h/skgeinit.h --- a/drivers/net/sk98lin/h/skgeinit.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skgeinit.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgeinit.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.83 $ - * Date: $Date: 2003/09/16 14:07:37 $ * Purpose: Structures and prototypes for the GE Init Module * ******************************************************************************/ @@ -19,353 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgeinit.h,v $ - * Revision 1.83 2003/09/16 14:07:37 rschmidt - * Moved defines for PHY power down modes from skgehw.h - * Added prototypes for SkMacClearRst() - * Editorial changes - * - * Revision 1.82 2003/09/16 07:18:36 mschmid - * Added members to port structure for MAC control - * - PMacColThres - * - PMacJamLen - * - PMacJamIpgVal - * - PMacJamIpgData - * - PMacIpgData - * - PMacLimit4 - * Added PHY power state to port structure - * - PPhyPowerState - * Added function prototypes to enter and leave low power modes - * - * Revision 1.81 2003/07/04 12:30:38 rschmidt - * Added SK_FAR to pointers in MAC statistic functions (for PXE) - * Editorial changes - * - * Revision 1.80 2003/05/28 15:25:30 rschmidt - * Added SK_FAR to pointers in MAC/PHY read functions (for PXE) - * Minor changes to avoid LINT warnings - * Editorial changes - * - * Revision 1.79 2003/05/06 12:02:33 rschmidt - * Added entry GIYukon in s_GeInit structure - * Editorial changes - * - * Revision 1.78 2003/04/28 08:59:57 rschmidt - * Added entries GIValIrqMask and GITimeStampCnt in s_GeInit structure - * - * Revision 1.77 2003/04/08 16:27:02 rschmidt - * Added entry GILedBlinkCtrl in s_GeInit structure - * Added defines for LED Blink Control - * - * Revision 1.76 2003/03/31 07:21:01 mkarl - * Added PGmANegAdv to SK_GEPORT. - * Corrected Copyright. - * - * Revision 1.75 2003/02/05 13:36:39 rschmidt - * Added define SK_FACT_78 for YUKON's Host Clock of 78.12 MHz - * Editorial changes - * - * Revision 1.74 2003/01/28 09:39:16 rschmidt - * Added entry GIYukonLite in s_GeInit structure - * Editorial changes - * - * Revision 1.73 2002/11/15 12:47:25 rschmidt - * Replaced error message SKERR_HWI_E024 for Cable Diagnostic with - * Rx queue error in SkGeStopPort(). - * - * Revision 1.72 2002/11/12 17:08:35 rschmidt - * Added entries for Cable Diagnostic to Port structure - * Added entries GIPciSlot64 and GIPciClock66 in s_GeInit structure - * Added error message for Cable Diagnostic - * Added prototypes for SkGmCableDiagStatus() - * Editorial changes - * - * Revision 1.71 2002/10/21 11:26:10 mkarl - * Changed interface of SkGeInitAssignRamToQueues(). - * - * Revision 1.70 2002/10/14 08:21:32 rschmidt - * Changed type of GICopperType, GIVauxAvail to SK_BOOL - * Added entry PRxOverCnt to Port structure - * Added entry GIYukon32Bit in s_GeInit structure - * Editorial changes - * - * Revision 1.69 2002/10/09 16:57:15 mkarl - * Added some constants and macros for SkGeInitAssignRamToQueues(). - * - * Revision 1.68 2002/09/12 08:58:51 rwahl - * Retrieve counters needed for XMAC errata workarounds directly because - * PNMI returns corrected counter values (e.g. #10620). - * - * Revision 1.67 2002/08/16 14:40:30 rschmidt - * Added entries GIGenesis and GICopperType in s_GeInit structure - * Added prototypes for SkMacHashing() - * Editorial changes - * - * Revision 1.66 2002/08/12 13:27:21 rschmidt - * Added defines for Link speed capabilities - * Added entry PLinkSpeedCap to Port structure - * Added entry GIVauxAvail in s_GeInit structure - * Added prototypes for SkMacPromiscMode() - * Editorial changes - * - * Revision 1.65 2002/08/08 15:46:18 rschmidt - * Added define SK_PHY_ACC_TO for PHY access timeout - * Added define SK_XM_RX_HI_WM for XMAC Rx High Watermark - * Added define SK_MIN_TXQ_SIZE for Min RAM Buffer Tx Queue Size - * Added entry PhyId1 to Port structure - * - * Revision 1.64 2002/07/23 16:02:56 rschmidt - * Added entry GIWolOffs in s_GeInit struct (HW-Bug in YUKON 1st rev.) - * Added prototypes for: SkGePhyRead(), SkGePhyWrite() - * - * Revision 1.63 2002/07/18 08:17:38 rwahl - * Corrected definitions for SK_LSPEED_xxx & SK_LSPEED_STAT_xxx. - * - * Revision 1.62 2002/07/17 18:21:55 rwahl - * Added SK_LSPEED_INDETERMINATED define. - * - * Revision 1.61 2002/07/17 17:16:03 rwahl - * - MacType now member of GIni struct. - * - Struct alignment to 32bit. - * - Editorial change. - * - * Revision 1.60 2002/07/15 18:23:39 rwahl - * Added GeMacFunc to GE Init structure. - * Added prototypes for SkXmUpdateStats(), SkGmUpdateStats(), - * SkXmMacStatistic(), SkGmMacStatistic(), SkXmResetCounter(), - * SkGmResetCounter(), SkXmOverflowStatus(), SkGmOverflowStatus(). - * Added defines for current link speed state. - * Added ERRMSG defintions for MacUpdateStat() & MacStatistics(). - * - * Revision 1.59 2002/07/15 15:40:22 rschmidt - * Added entry PLinkSpeedUsed to Port structure - * Editorial changes - * - * Revision 1.58 2002/06/10 09:36:30 rschmidt - * Editorial changes. - * - * Revision 1.57 2002/06/05 08:18:00 rschmidt - * Corrected alignment in Port Structure - * Added new prototypes for GMAC - * Editorial changes - * - * Revision 1.56 2002/04/25 11:38:12 rschmidt - * Added defines for Link speed values - * Added defines for Loopback parameters for MAC and PHY - * Removed entry PRxCmd from Port structure - * Added entry PLinkSpeed to Port structure - * Added entries GIChipId and GIChipRev to GE Init structure - * Removed entry GIAnyPortAct from GE Init structure - * Added prototypes for: SkMacInit(), SkMacInitPhy(), - * SkMacRxTxDisable(), SkMacSoftRst(), SkMacHardRst(), SkMacIrq(), - * SkMacIrqDisable(), SkMacFlushTxFifo(), SkMacFlushRxFifo(), - * SkMacAutoNegDone(), SkMacAutoNegLipaPhy(), SkMacSetRxTxEn(), - * SkXmPhyRead(), SkXmPhyRead(), SkGmPhyWrite(), SkGmPhyWrite(); - * Removed prototypes for static functions in SkXmac2.c - * Editorial changes - * - * Revision 1.55 2002/02/26 15:24:53 rwahl - * Fix: no link with manual configuration (#10673). The previous fix for - * #10639 was removed. So for RLMT mode = CLS the RLMT may switch to - * misconfigured port. It should not occur for the other RLMT modes. - * - * Revision 1.54 2002/01/18 16:52:52 rwahl - * Editorial corrections. - * - * Revision 1.53 2001/11/20 09:19:58 rwahl - * Reworked bugfix #10639 (no dependency to RLMT mode). - * - * Revision 1.52 2001/10/26 07:52:23 afischer - * Port switching bug in `check local link` mode - * - * Revision 1.51 2001/02/09 12:26:38 cgoos - * Inserted #ifdef DIAG for half duplex workaround timer. - * - * Revision 1.50 2001/02/07 07:56:40 rassmann - * Corrected copyright. - * - * Revision 1.49 2001/01/31 15:32:18 gklug - * fix: problem with autosensing an SR8800 switch - * add: counter for autoneg timeouts - * - * Revision 1.48 2000/11/09 11:30:10 rassmann - * WA: Waiting after releasing reset until BCom chip is accessible. - * - * Revision 1.47 2000/10/18 12:22:40 cgoos - * Added workaround for half duplex hangup. - * - * Revision 1.46 2000/08/10 11:28:00 rassmann - * Editorial changes. - * Preserving 32-bit alignment in structs for the adapter context. - * - * Revision 1.45 1999/11/22 13:56:19 cgoos - * Changed license header to GPL. - * - * Revision 1.44 1999/10/26 07:34:15 malthoff - * The define SK_LNK_ON has been lost in v1.41. - * - * Revision 1.43 1999/10/06 09:30:16 cgoos - * Changed SK_XM_THR_JUMBO. - * - * Revision 1.42 1999/09/16 12:58:26 cgoos - * Changed SK_LED_STANDY macro to be independent of HW link sync. - * - * Revision 1.41 1999/07/30 06:56:14 malthoff - * Correct comment for SK_MS_STAT_UNSET. - * - * Revision 1.40 1999/05/27 13:38:46 cgoos - * Added SK_BMU_TX_WM. - * Made SK_BMU_TX_WM and SK_BMU_RX_WM user-definable. - * Changed XMAC Tx treshold to max. values. - * - * Revision 1.39 1999/05/20 14:35:26 malthoff - * Remove prototypes for SkGeLinkLED(). - * - * Revision 1.38 1999/05/19 11:59:12 cgoos - * Added SK_MS_CAP_INDETERMINATED define. - * - * Revision 1.37 1999/05/19 07:32:33 cgoos - * Changes for 1000Base-T. - * LED-defines for HWAC_LINK_LED macro. - * - * Revision 1.36 1999/04/08 14:00:24 gklug - * add:Port struct field PLinkResCt - * - * Revision 1.35 1999/03/25 07:43:07 malthoff - * Add error string for SKERR_HWI_E018MSG. - * - * Revision 1.34 1999/03/12 16:25:57 malthoff - * Remove PPollRxD and PPollTxD. - * Add SKERR_HWI_E017MSG. and SK_DPOLL_MAX. - * - * Revision 1.33 1999/03/12 13:34:41 malthoff - * Add Autonegotiation error codes. - * Change defines for parameter Mode in SkXmSetRxCmd(). - * Replace __STDC__ by SK_KR_PROTO. - * - * Revision 1.32 1999/01/25 14:40:20 mhaveman - * Added new return states for the virtual management port if multiple - * ports are active but differently configured. - * - * Revision 1.31 1998/12/11 15:17:02 gklug - * add: Link partnet autoneg states : Unknown Manual and Auto-negotiation - * - * Revision 1.30 1998/12/07 12:17:04 gklug - * add: Link Partner auto-negotiation flag - * - * Revision 1.29 1998/12/01 10:54:42 gklug - * add: variables for XMAC Errata - * - * Revision 1.28 1998/12/01 10:14:15 gklug - * add: PIsave saves the Interrupt status word - * - * Revision 1.27 1998/11/26 15:24:52 mhaveman - * Added link status states SK_LMODE_STAT_AUTOHALF and - * SK_LMODE_STAT_AUTOFULL which are used by PNMI. - * - * Revision 1.26 1998/11/26 14:53:01 gklug - * add:autoNeg Timeout variable - * - * Revision 1.25 1998/11/26 08:58:50 gklug - * add: Link Mode configuration (AUTO Sense mode) - * - * Revision 1.24 1998/11/24 13:30:27 gklug - * add: PCheckPar to port struct - * - * Revision 1.23 1998/11/18 13:23:26 malthoff - * Add SK_PKT_TO_MAX. - * - * Revision 1.22 1998/11/18 13:19:54 gklug - * add: PPrevShorts and PLinkBroken to port struct for WA XMAC Errata #C1 - * - * Revision 1.21 1998/10/26 08:02:57 malthoff - * Add GIRamOffs. - * - * Revision 1.20 1998/10/19 07:28:37 malthoff - * Add prototype for SkGeInitRamIface(). - * - * Revision 1.19 1998/10/14 14:47:48 malthoff - * SK_TIMER should not be defined for Diagnostics. - * Add SKERR_HWI_E015MSG and SKERR_HWI_E016MSG. - * - * Revision 1.18 1998/10/14 14:00:03 gklug - * add: timer to port struct for workaround of Errata #2 - * - * Revision 1.17 1998/10/14 11:23:09 malthoff - * Add prototype for SkXmAutoNegDone(). - * Fix SkXmSetRxCmd() prototype statement. - * - * Revision 1.16 1998/10/14 05:42:29 gklug - * add: HWLinkUp flag to Port struct - * - * Revision 1.15 1998/10/09 08:26:33 malthoff - * Rename SK_RB_ULPP_B to SK_RB_LLPP_B. - * - * Revision 1.14 1998/10/09 07:11:13 malthoff - * bug fix: SK_FACT_53 is 85 not 117. - * Rework time out init values. - * Add GIPortUsage and corresponding defines. - * Add some error log messages. - * - * Revision 1.13 1998/10/06 14:13:14 malthoff - * Add prototype for SkGeLoadLnkSyncCnt(). - * - * Revision 1.12 1998/10/05 11:29:53 malthoff - * bug fix: A comment was not closed. - * - * Revision 1.11 1998/10/05 08:01:59 malthoff - * Add default Timeout- Threshold- and - * Watermark constants. Add QRam start and end - * variables. Also add vars to store the polling - * mode and receive command. Add new Error Log - * Messages and function prototypes. - * - * Revision 1.10 1998/09/28 13:34:48 malthoff - * Add mode bits for LED functions. - * Move Autoneg and Flow Ctrl bits from shgesirq.h - * Add the required Error Log Entries - * and Function Prototypes. - * - * Revision 1.9 1998/09/16 14:38:41 malthoff - * Rework the SK_LNK_xxx defines. - * Add error log message defines. - * Add prototypes for skxmac2.c - * - * Revision 1.8 1998/09/11 05:29:18 gklug - * add: init state of a port - * - * Revision 1.7 1998/09/08 08:35:52 gklug - * add: defines of the Init Levels - * - * Revision 1.6 1998/09/03 13:48:42 gklug - * add: Link strati, capabilities to Port struct - * - * Revision 1.5 1998/09/03 13:30:59 malthoff - * Add SK_LNK_BLINK and SK_LNK_PERM. - * - * Revision 1.4 1998/09/03 09:55:31 malthoff - * Add constants for parameters Dir and RstMode - * when calling SkGeStopPort(). - * Rework the prototype section. - * Add Queue Address offsets PRxQOff, PXsQOff, and PXaQOff. - * Remove Ioc with IoC. - * - * Revision 1.3 1998/08/19 09:11:54 gklug - * fix: struct are removed from c-source (see CCC) - * add: typedefs for all structs - * - * Revision 1.2 1998/07/28 12:38:26 malthoff - * The prototypes got the parameter 'IoC'. - * - * Revision 1.1 1998/07/23 09:50:24 malthoff - * Created. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skgepnm2.h b/drivers/net/sk98lin/h/skgepnm2.h --- a/drivers/net/sk98lin/h/skgepnm2.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skgepnm2.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgepnm2.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.36 $ - * Date: $Date: 2003/05/23 12:45:13 $ * Purpose: Defines for Private Network Management Interface * ****************************************************************************/ @@ -21,144 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/***************************************************************************** - * - * History: - * - * $Log: skgepnm2.h,v $ - * Revision 1.36 2003/05/23 12:45:13 tschilli - * #ifndef SK_PNMI_HUNDREDS_SEC added to SK_PNMI_HUNDREDS_SEC definition - * to allow own time macro defines. - * - * Revision 1.35 2003/03/27 11:27:48 tschilli - * Copyright messages changed. - * - * Revision 1.34 2002/12/16 09:05:18 tschilli - * Code for VCT handling added. - * - * Revision 1.33 2002/09/10 09:00:03 rwahl - * Adapted boolean definitions according sktypes. - * - * Revision 1.32 2002/08/09 09:47:01 rwahl - * Added write-only flag to oid access defines. - * Editorial changes. - * - * Revision 1.31 2002/07/17 19:23:18 rwahl - * - Replaced MAC counter definitions by enumeration. - * - Added definition SK_PNMI_MAC_TYPES. - * - Added chipset defnition for Yukon. - * - * Revision 1.30 2001/02/06 10:03:41 mkunz - * - Pnmi V4 dual net support added. Interface functions and macros extended - * - Vpd bug fixed - * - OID_SKGE_MTU added - * - * Revision 1.29 2001/01/22 13:41:37 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.28 2000/08/03 15:12:48 rwahl - * - Additional comment for MAC statistic data structure. - * - * Revision 1.27 2000/08/01 16:10:18 rwahl - * - Added mac statistic data structure for StatRxLongFrame counter. - * - * Revision 1.26 2000/03/31 13:51:34 rwahl - * Added SK_UPTR cast to offset calculation for PNMI struct fields; - * missing cast caused compiler warnings by Win64 compiler. - * - * Revision 1.25 1999/11/22 13:57:41 cgoos - * Changed license header to GPL. - * Allowing overwrite for SK_PNMI_STORE/_READ defines. - * - * Revision 1.24 1999/04/13 15:11:11 mhaveman - * Changed copyright. - * - * Revision 1.23 1999/01/28 15:07:12 mhaveman - * Changed default threshold for port switches per hour from 10 - * to 240 which means 4 switches per minute. This fits better - * the granularity of 32 for the port switch estimate - * counter. - * - * Revision 1.22 1999/01/05 12:52:30 mhaveman - * Removed macro SK_PNMI_MICRO_SEC. - * - * Revision 1.21 1999/01/05 12:50:34 mhaveman - * Enlarged macro definition SK_PNMI_HUNDREDS_SEC() so that no 64-bit - * arithmetic is necessary if SK_TICKS_PER_SEC is 100. - * - * Revision 1.20 1998/12/09 14:02:53 mhaveman - * Defined macro SK_PNMI_DEF_RLMT_CHG_THRES for default port switch - * threshold. - * - * Revision 1.19 1998/12/03 11:28:41 mhaveman - * Removed SK_PNMI_CHECKPTR macro. - * - * Revision 1.18 1998/12/03 11:21:00 mhaveman - * -Added pointer check macro SK_PNMI_CHECKPTR - * -Added macros SK_PNMI_VPD_ARR_SIZE and SK_PNMI_VPD_STR_SIZE for - * VPD key evaluation. - * - * Revision 1.17 1998/11/20 13:20:33 mhaveman - * Fixed bug in SK_PNMI_SET_STAT macro. ErrorStatus was not correctly set. - * - * Revision 1.16 1998/11/20 08:08:49 mhaveman - * Macro SK_PNMI_CHECKFLAGS has got a if clause. - * - * Revision 1.15 1998/11/03 13:53:40 mhaveman - * Fixed alignment problem in macor SK_PNMI_SET_STAT macro. - * - * Revision 1.14 1998/10/30 15:50:13 mhaveman - * Added macro SK_PNMI_MICRO_SEC() - * - * Revision 1.13 1998/10/30 12:32:20 mhaveman - * Added forgotten cast in SK_PNMI_READ_U32 macro. - * - * Revision 1.12 1998/10/29 15:40:26 mhaveman - * -Changed SK_PNMI_TRAP_SENSOR_LEN because SensorDescr has now - * variable string length. - * -Defined SK_PNMI_CHECKFLAGS macro - * - * Revision 1.11 1998/10/29 08:53:34 mhaveman - * Removed SK_PNMI_RLM_XXX table indexed because these counters need - * not been saved over XMAC resets. - * - * Revision 1.10 1998/10/28 08:48:20 mhaveman - * -Added macros for storage according to alignment - * -Changed type of Instance to SK_U32 because of VPD - * -Removed trap structures. Not needed because of alignment problem - * -Changed type of Action form SK_U8 to int - * - * Revision 1.9 1998/10/21 13:34:45 mhaveman - * Shit, mismatched calculation of SK_PNMI_HUNDREDS_SEC. Corrected. - * - * Revision 1.8 1998/10/21 13:24:58 mhaveman - * Changed calculation of hundreds of seconds. - * - * Revision 1.7 1998/10/20 07:31:41 mhaveman - * Made type changes to unsigned int where possible. - * - * Revision 1.6 1998/09/04 17:04:05 mhaveman - * Added Sync counters to offset storage to provided settled values on - * port switch. - * - * Revision 1.5 1998/09/04 12:45:35 mhaveman - * Removed dummies for SK_DRIVER_ macros. They should be added by driver - * writer in skdrv2nd.h. - * - * Revision 1.4 1998/09/04 11:59:50 mhaveman - * Everything compiles now. Driver Macros for counting still missing. - * - * Revision 1.3 1998/08/24 12:01:35 mhaveman - * Intermediate state. - * - * Revision 1.2 1998/08/17 07:51:40 mhaveman - * Intermediate state. - * - * Revision 1.1 1998/08/11 09:08:40 mhaveman - * Intermediate state. - * - ****************************************************************************/ #ifndef _SKGEPNM2_H_ #define _SKGEPNM2_H_ diff -Nru a/drivers/net/sk98lin/h/skgepnmi.h b/drivers/net/sk98lin/h/skgepnmi.h --- a/drivers/net/sk98lin/h/skgepnmi.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/h/skgepnmi.h Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skgepnmi.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.62 $ - * Date: $Date: 2003/08/15 12:31:52 $ * Purpose: Defines for Private Network Management Interface * ****************************************************************************/ @@ -21,237 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/***************************************************************************** - * - * History: - * - * $Log: skgepnmi.h,v $ - * Revision 1.62 2003/08/15 12:31:52 tschilli - * Added new OIDs: - * OID_SKGE_DRIVER_RELDATE - * OID_SKGE_DRIVER_FILENAME - * OID_SKGE_CHIPID - * OID_SKGE_RAMSIZE - * OID_SKGE_VAUXAVAIL - * OID_SKGE_PHY_TYPE - * OID_SKGE_PHY_LP_MODE - * - * Added new define SK_DIAG_ATTACHED for OID_SKGE_DIAG_MODE handling. - * - * Revision 1.61 2003/05/23 12:53:52 tschilli - * Generic PNMI IOCTL subcommands added. - * Function prototype SkPnmiGenIoctl() added. - * OID_SKGE_BOARDLEVEL added. - * Return value SK_PNMI_ERR_NOT_SUPPORTED added. - * Editorial changes. - * - * Revision 1.60 2003/03/27 11:27:26 tschilli - * Copyright messages changed. - * - * Revision 1.59 2002/12/16 14:03:50 tschilli - * New defines for VCT added. - * - * Revision 1.58 2002/12/16 09:04:59 tschilli - * Code for VCT handling added. - * - * Revision 1.57 2002/09/26 12:41:05 tschilli - * SK_PNMI_PORT BufPort entry in struct SK_PNMI added. - * - * Revision 1.56 2002/08/16 11:10:41 rwahl - * - Replaced c++ comment. - * - * Revision 1.55 2002/08/09 15:40:21 rwahl - * Editorial change (renamed ConfSpeedCap). - * - * Revision 1.54 2002/08/09 11:06:07 rwahl - * Added OID_SKGE_SPEED_CAP. - * - * Revision 1.53 2002/08/09 09:45:28 rwahl - * Added support for NDIS OID_PNP_xxx. - * Editorial changes. - * - * Revision 1.52 2002/08/06 17:54:07 rwahl - * - Added speed cap to PNMI config struct. - * - * Revision 1.51 2002/07/17 19:19:26 rwahl - * - Added OID_SKGE_SPEED_MODE and OID_SKGE_SPEED_STATUS. - * - Added SK_PNMI_CNT_RX_PMACC_ERR() & SK_PNMI_CNT_RX_LONGFRAMES(). - * - Added speed mode & status to PNMI config struct. - * - Editorial changes. - * - * Revision 1.50 2002/05/22 08:59:37 rwahl - * Added string definitions for error msgs. - * - * Revision 1.49 2001/11/20 09:23:50 rwahl - * - pnmi struct: reordered and aligned to 32bit. - * - * Revision 1.48 2001/02/23 14:34:24 mkunz - * Changed macro PHYS2INST. Added pAC to Interface - * - * Revision 1.47 2001/02/07 08:28:23 mkunz - * - Added Oids: OID_SKGE_DIAG_ACTION - * OID_SKGE_DIAG_RESULT - * OID_SKGE_MULTICAST_LIST - * OID_SKGE_CURRENT_PACKET_FILTER - * OID_SKGE_INTERMEDIATE_SUPPORT - * - Changed value of OID_SKGE_MTU - * - * Revision 1.46 2001/02/06 10:01:41 mkunz - * - Pnmi V4 dual net support added. Interface functions and macros extended - * - Vpd bug fixed - * - OID_SKGE_MTU added - * - * Revision 1.45 2001/01/22 13:41:37 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.44 2000/09/07 07:35:27 rwahl - * - removed NDIS counter specific data type. - * - fixed spelling for OID_SKGE_RLMT_PORT_PREFERRED. - * - * Revision 1.43 2000/08/04 11:41:08 rwahl - * - Fixed compiler warning (port is always >= 0) for macros - * SK_PNMI_CNT_RX_LONGFRAMES & SK_PNMI_CNT_SYNC_OCTETS - * - * Revision 1.42 2000/08/03 15:14:07 rwahl - * - Corrected error in driver macros addressing a physical port. - * - * Revision 1.41 2000/08/01 16:22:29 rwahl - * - Changed MDB version to 3.1. - * - Added definitions for StatRxLongFrames counter. - * - Added macro to be used by driver to count long frames received. - * - Added directive to control width (default = 32bit) of NDIS statistic - * counters (SK_NDIS_64BIT_CTR). - * - * Revision 1.40 2000/03/31 13:51:34 rwahl - * Added SK_UPTR cast to offset calculation for PNMI struct fields; - * missing cast caused compiler warnings by Win64 compiler. - * - * Revision 1.39 1999/12/06 10:09:47 rwahl - * Added new error log message. - * - * Revision 1.38 1999/11/22 13:57:55 cgoos - * Changed license header to GPL. - * - * Revision 1.37 1999/09/14 14:25:32 rwahl - * Set MDB version for 1000Base-T (sensors, Master/Slave) changes. - * - * Revision 1.36 1999/05/20 09:24:56 cgoos - * Changes for 1000Base-T (sensors, Master/Slave). - * - * Revision 1.35 1999/04/13 15:10:51 mhaveman - * Replaced RLMT macros SK_RLMT_CHECK_xxx again by those of PNMI to - * grant unified interface. But PNMI macros will store the same - * value as RLMT macros. - * - * Revision 1.34 1999/04/13 15:03:49 mhaveman - * -Changed copyright - * -Removed SK_PNMI_RLMT_MODE_CHK_xxx macros. Those of RLMT should be - * used. - * - * Revision 1.33 1999/03/23 10:41:02 mhaveman - * Changed comments. - * - * Revision 1.32 1999/01/25 15:01:33 mhaveman - * Added support for multiple simultaniously active ports. - * - * Revision 1.31 1999/01/19 10:06:26 mhaveman - * Added new error log message. - * - * Revision 1.30 1999/01/05 10:34:49 mhaveman - * Fixed little error in RlmtChangeEstimate calculation. - * - * Revision 1.29 1999/01/05 09:59:41 mhaveman - * Redesigned port switch average calculation to avoid 64bit - * arithmetic. - * - * Revision 1.28 1998/12/08 10:05:48 mhaveman - * Defined macro SK_PNMI_MIN_STRUCT_SIZE. - * - * Revision 1.27 1998/12/03 14:39:35 mhaveman - * Fixed problem that LSTAT was enumerated wrong. - * - * Revision 1.26 1998/12/03 11:19:51 mhaveman - * Changed contents of errlog message SK_PNMI_ERR016MSG - * - * Revision 1.25 1998/12/01 10:40:04 mhaveman - * Changed size of SensorNumber, ChecksumNumber and RlmtPortNumber in - * SK_PNMI_STRUCT_DATA to be conform with OID definition. - * - * Revision 1.24 1998/11/20 08:09:27 mhaveman - * Added macros to convert between logical, physical port indexes and - * instances. - * - * Revision 1.23 1998/11/10 13:41:13 mhaveman - * Needed to change interface, because NT driver needs a return value - * of needed buffer space on TOO_SHORT errors. Therefore all - * SkPnmiGet/Preset/Set functions now have a pointer to the length - * parameter, where the needed space on error is returned. - * - * Revision 1.22 1998/11/03 12:05:51 mhaveman - * Added pAC parameter to counter macors. - * - * Revision 1.21 1998/11/02 10:47:36 mhaveman - * Added syslog messages for internal errors. - * - * Revision 1.20 1998/10/30 15:49:36 mhaveman - * -Removed unused SK_PNMI_UTILIZATION_BASE and EstOldCnt. - * -Redefined SK_PNMI_CHG_EST_BASE to hundreds of seconds. - * - * Revision 1.19 1998/10/29 15:38:44 mhaveman - * Changed string lengths of PNMI_STRUCT_DATA structure because - * string OIDs are now encoded with leading length ocetet. - * - * Revision 1.18 1998/10/29 08:52:27 mhaveman - * -Added byte to strings in PNMI_STRUCT_DATA structure. - * -Shortened SK_PNMI_RLMT structure to SK_MAX_MACS elements. - * - * Revision 1.17 1998/10/28 08:49:50 mhaveman - * -Changed type of Instance back to SK_U32 because of VPD - * -Changed type from SK_U8 to char of PciBusSpeed, PciBusWidth, PMD, - * and Connector. - * - * Revision 1.16 1998/10/22 10:42:31 mhaveman - * -Removed (SK_U32) casts for OIDs - * -excluded NDIS OIDs when they are already defined with ifndef _NDIS_ - * - * Revision 1.15 1998/10/20 13:56:28 mhaveman - * Headerfile includes now directly other header files to comile correctly. - * - * Revision 1.14 1998/10/20 07:31:09 mhaveman - * Made type changes to unsigned int where possible. - * - * Revision 1.13 1998/10/19 10:53:13 mhaveman - * -Casted OID definitions to SK_U32 - * -Renamed RlmtMAC... to RlmtPort... - * -Changed wrong type of VpdEntriesList from SK_U32 to char * - * - * Revision 1.12 1998/10/13 07:42:27 mhaveman - * -Added OIDs OID_SKGE_TRAP_NUMBER and OID_SKGE_ALL_DATA - * -Removed old cvs history entries - * -Renamed MacNumber to PortNumber - * - * Revision 1.11 1998/10/07 10:55:24 mhaveman - * -Added OID_MDB_VERSION. Therefore was a renumbering of the VPD OIDs - * necessary. - * -Added OID_GEN_ Ids to support the windows driver. - * - * Revision 1.10 1998/09/30 13:41:10 mhaveman - * Renamed some OIDs to reduce usage of 'MAC' which is replaced by 'PORT'. - * - * Revision 1.9 1998/09/04 17:06:17 mhaveman - * -Added SyncCounter as macro. - * -Renamed OID_SKGE_.._NO_DESCR_CTS to OID_SKGE_.._NO_BUF_CTS. - * -Added macros for driver description and version strings. - * - * Revision 1.8 1998/09/04 14:36:52 mhaveman - * Added OIDs and Structure to access value of macro counters which are - * counted by the driver. - * - * Revision 1.7 1998/09/04 11:59:36 mhaveman - * Everything compiles now. Driver Macros for counting still missing. - * - ****************************************************************************/ #ifndef _SKGEPNMI_H_ #define _SKGEPNMI_H_ diff -Nru a/drivers/net/sk98lin/h/skgesirq.h b/drivers/net/sk98lin/h/skgesirq.h --- a/drivers/net/sk98lin/h/skgesirq.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/skgesirq.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skgesirq.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.30 $ - * Date: $Date: 2003/07/04 12:34:13 $ * Purpose: SK specific Gigabit Ethernet special IRQ functions * ******************************************************************************/ @@ -19,111 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * $Log: skgesirq.h,v $ - * Revision 1.30 2003/07/04 12:34:13 rschmidt - * Added SKERR_SIRQ_E025 for Downshift detected (Yukon-Copper) - * - * Revision 1.29 2003/05/28 15:14:49 rschmidt - * Moved defines for return codes of SkGePortCheckUp() to header file. - * Minor changes to avoid LINT warnings. - * - * Revision 1.28 2003/05/13 17:22:43 mkarl - * Editorial changes. - * - * Revision 1.27 2003/03/31 07:32:34 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.26 2002/10/14 09:52:36 rschmidt - * Added SKERR_SIRQ_E023 and SKERR_SIRQ_E024 for GPHY (Yukon) - * Editorial changes - * - * Revision 1.25 2002/07/15 18:15:52 rwahl - * Editorial changes. - * - * Revision 1.24 2002/07/15 15:39:21 rschmidt - * Corrected define for SKERR_SIRQ_E022 - * Editorial changes - * - * Revision 1.23 2002/04/25 11:09:45 rschmidt - * Removed declarations for SkXmInitPhy(), SkXmRxTxEnable() - * Editorial changes - * - * Revision 1.22 2000/11/09 11:30:10 rassmann - * WA: Waiting after releasing reset until BCom chip is accessible. - * - * Revision 1.21 2000/10/18 12:22:40 cgoos - * Added workaround for half duplex hangup. - * - * Revision 1.20 1999/12/06 10:00:44 cgoos - * Added SET event for role. - * - * Revision 1.19 1999/11/22 13:58:26 cgoos - * Changed license header to GPL. - * - * Revision 1.18 1999/05/19 07:32:59 cgoos - * Changes for 1000Base-T. - * - * Revision 1.17 1999/03/12 13:29:31 malthoff - * Move Autonegotiation Error Codes to skgeinit.h. - * - * Revision 1.16 1999/03/08 10:11:28 gklug - * add: AutoNegDone return codes - * - * Revision 1.15 1998/11/18 13:20:53 gklug - * add: different timeouts for active and non-active links - * - * Revision 1.14 1998/11/04 07:18:14 cgoos - * Added prototype for SkXmRxTxEnable. - * - * Revision 1.13 1998/10/21 05:52:23 gklug - * add: parameter DoLoop to InitPhy function - * - * Revision 1.12 1998/10/19 06:45:03 cgoos - * Added prototype for SkXmInitPhy. - * - * Revision 1.11 1998/10/15 14:34:10 gklug - * add: WA_TIME is 500 msec - * - * Revision 1.10 1998/10/14 14:49:41 malthoff - * Remove err log defines E021 and E022. They are - * defined in skgeinit.h now. - * - * Revision 1.9 1998/10/14 14:00:39 gklug - * add: error logs for init phys - * - * Revision 1.8 1998/10/14 05:44:05 gklug - * add: E020 - * - * Revision 1.7 1998/10/02 06:24:58 gklug - * add: error messages - * - * Revision 1.6 1998/10/01 07:54:45 gklug - * add: PNMI debug module - * - * Revision 1.5 1998/09/28 13:36:31 malthoff - * Move the bit definitions for Autonegotiation - * and Flow Control to skgeinit.h. - * - * Revision 1.4 1998/09/15 12:29:34 gklug - * add: error logs - * - * Revision 1.3 1998/09/03 13:54:02 gklug - * add: function prototypes - * - * Revision 1.2 1998/09/03 10:24:36 gklug - * add: Events send by PNMI - * add: parameter definition for Flow Control etc. - * - * Revision 1.1 1998/08/27 11:50:27 gklug - * initial revision - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/ski2c.h b/drivers/net/sk98lin/h/ski2c.h --- a/drivers/net/sk98lin/h/ski2c.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/h/ski2c.h Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: ski2c.h * Project: Gigabit Ethernet Adapters, TWSI-Module - * Version: $Revision: 1.35 $ - * Date: $Date: 2003/10/20 09:06:30 $ * Purpose: Defines to access Voltage and Temperature Sensor * ******************************************************************************/ @@ -19,128 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: ski2c.h,v $ - * Revision 1.35 2003/10/20 09:06:30 rschmidt - * Added prototypes for SkI2cRead() and SkI2cWrite(). - * Editorial changes. - * - * Revision 1.34 2003/01/28 09:11:21 rschmidt - * Editorial changes - * - * Revision 1.33 2002/10/14 16:40:50 rschmidt - * Editorial changes (TWSI) - * - * Revision 1.32 2002/08/13 08:55:07 rschmidt - * Editorial changes - * - * Revision 1.31 2002/08/06 09:44:22 jschmalz - * Extensions and changes for Yukon - * - * Revision 1.30 2001/04/05 11:38:09 rassmann - * Set SenState to idle in SkI2cWaitIrq(). - * Changed error message in SkI2cWaitIrq(). - * - * Revision 1.29 2000/08/03 14:28:17 rassmann - * - Added function to wait for I2C being ready before resetting the board. - * - Replaced one duplicate "out of range" message with correct one. - * - * Revision 1.28 1999/11/22 13:55:46 cgoos - * Changed license header to GPL. - * - * Revision 1.27 1999/05/20 09:23:10 cgoos - * Changes for 1000Base-T (Fan sensors). - * - * Revision 1.26 1998/12/01 13:45:47 gklug - * add: InitLevel to I2c struct - * - * Revision 1.25 1998/11/03 06:55:16 gklug - * add: Dummy Reads to I2c struct - * - * Revision 1.24 1998/10/02 14:28:59 cgoos - * Added prototype for SkI2cIsr. - * - * Revision 1.23 1998/09/08 12:20:11 gklug - * add: prototypes for init and read functions - * - * Revision 1.22 1998/09/08 07:37:56 gklug - * add: log error if PCI_IO voltage sensor could not be initialized - * - * Revision 1.21 1998/09/04 08:38:05 malthoff - * Change the values for I2C_READ and I2C_WRITE - * - * Revision 1.20 1998/08/25 07:52:22 gklug - * chg: Timestamps (last) added for logging - * - * Revision 1.19 1998/08/25 06:09:00 gklug - * rmv: warning and error levels of the individual sensors. - * add: timing definitions for sending traps and logging errors - * - * Revision 1.18 1998/08/20 11:41:15 gklug - * chg: omit STRCPY macro by using char * as Sensor Description - * - * Revision 1.17 1998/08/20 11:37:43 gklug - * chg: change Ioc to IoC - * - * Revision 1.16 1998/08/20 11:30:38 gklug - * fix: SenRead declaration - * - * Revision 1.15 1998/08/20 11:27:53 gklug - * fix: Compile bugs with new awrning constants - * - * Revision 1.14 1998/08/20 08:53:12 gklug - * fix: compiler errors - * add: Threshold values - * - * Revision 1.13 1998/08/19 12:21:16 gklug - * fix: remove struct from C files (see CCC) - * add: typedefs for all structs - * - * Revision 1.12 1998/08/19 10:57:41 gklug - * add: Warning levels - * - * Revision 1.11 1998/08/18 08:37:02 malthoff - * Prototypes not required for SK_DIAG. - * - * Revision 1.10 1998/08/17 13:54:00 gklug - * fix: declaration of event function - * - * Revision 1.9 1998/08/17 06:48:39 malthoff - * Remove some unrequired macros. - * Fix the compiler errors. - * - * Revision 1.8 1998/08/14 06:47:19 gklug - * fix: Values are intergers - * - * Revision 1.7 1998/08/14 06:26:05 gklug - * add: Init error message - * - * Revision 1.6 1998/08/13 08:31:08 gklug - * add: Error message - * - * Revision 1.5 1998/08/12 14:32:04 gklug - * add: new error code/message - * - * Revision 1.4 1998/08/12 13:39:08 gklug - * chg: names of error messages - * add: defines for Sensor type and thresholds - * - * Revision 1.3 1998/08/11 07:57:16 gklug - * add: sensor struct - * add: Timeout defines - * add: I2C control struct for pAC - * - * Revision 1.2 1998/07/17 11:29:02 gklug - * rmv: Microwire and SMTPANIC - * - * Revision 1.1 1998/06/19 14:30:10 malthoff - * Created. Sources taken from ML Project. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/skqueue.h b/drivers/net/sk98lin/h/skqueue.h --- a/drivers/net/sk98lin/h/skqueue.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/skqueue.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skqueue.h * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.16 $ - * Date: $Date: 2003/09/16 12:50:32 $ * Purpose: Defines for the Event queue * ******************************************************************************/ @@ -21,68 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skqueue.h,v $ - * Revision 1.16 2003/09/16 12:50:32 rschmidt - * Editorial changes - * - * Revision 1.15 2003/05/13 17:54:57 mkarl - * Editorial changes. - * - * Revision 1.14 2002/03/15 10:52:13 mkunz - * Added event classes for link aggregation - * - * Revision 1.13 1999/11/22 13:59:05 cgoos - * Changed license header to GPL. - * - * Revision 1.12 1998/09/08 08:48:01 gklug - * add: init level handling - * - * Revision 1.11 1998/09/03 14:15:11 gklug - * add: CSUM and HWAC Eventclass and function. - * fix: pParaPtr according to CCC - * - * Revision 1.10 1998/08/20 12:43:03 gklug - * add: typedef SK_QUEUE - * - * Revision 1.9 1998/08/19 09:50:59 gklug - * fix: remove struct keyword from C-code (see CCC) add typedefs - * - * Revision 1.8 1998/08/18 07:00:01 gklug - * fix: SK_PTR not defined use void * instead. - * - * Revision 1.7 1998/08/17 13:43:19 gklug - * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR - * - * Revision 1.6 1998/08/14 07:09:30 gklug - * fix: chg pAc -> pAC - * - * Revision 1.5 1998/08/11 14:26:44 gklug - * chg: Event Dispatcher returns now int. - * - * Revision 1.4 1998/08/11 12:15:21 gklug - * add: Error numbers of skqueue module - * - * Revision 1.3 1998/08/07 12:54:23 gklug - * fix: first compiled version - * - * Revision 1.2 1998/08/07 09:34:00 gklug - * adapt structure defs to CCC - * add: prototypes for functions - * - * Revision 1.1 1998/07/30 14:52:12 gklug - * Initial version. - * Defines Event Classes, Event structs and queue management variables. - * - ******************************************************************************/ - -/* - * SKQUEUE.H contains all defines and types for the event queue - */ #ifndef _SKQUEUE_H_ #define _SKQUEUE_H_ diff -Nru a/drivers/net/sk98lin/h/skrlmt.h b/drivers/net/sk98lin/h/skrlmt.h --- a/drivers/net/sk98lin/h/skrlmt.h Tue Feb 17 20:00:14 2004 +++ b/drivers/net/sk98lin/h/skrlmt.h Tue Feb 17 20:00:14 2004 @@ -2,8 +2,6 @@ * * Name: skrlmt.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.37 $ - * Date: $Date: 2003/04/15 09:43:43 $ * Purpose: Header file for Redundant Link ManagemenT. * ******************************************************************************/ @@ -20,137 +18,6 @@ * * The information in this file is provided "AS IS" without warranty. * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skrlmt.h,v $ - * Revision 1.37 2003/04/15 09:43:43 tschilli - * Copyright messages changed. - * - * Revision 1.36 2003/04/14 15:56:22 tschilli - * "#error C++ is not yet supported." removed. - * - * Revision 1.35 2003/01/31 14:12:41 mkunz - * single port adapter runs now with two identical MAC addresses - * - * Revision 1.34 2002/09/23 15:13:41 rwahl - * Editorial changes. - * - * Revision 1.33 2001/07/03 12:16:48 mkunz - * New Flag ChgBcPrio (Change priority of last broadcast received) - * - * Revision 1.32 2001/02/14 14:06:31 rassmann - * Editorial changes. - * - * Revision 1.31 2001/02/05 14:25:26 rassmann - * Prepared RLMT for transparent operation. - * - * Revision 1.30 2001/01/22 13:41:39 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.29 2000/11/17 08:58:00 rassmann - * Moved CheckSwitch from SK_RLMT_PACKET_RECEIVED to SK_RLMT_TIM event. - * - * Revision 1.28 2000/11/09 12:24:34 rassmann - * Editorial changes. - * - * Revision 1.27 1999/11/22 13:59:56 cgoos - * Changed license header to GPL. - * - * Revision 1.26 1999/10/04 14:01:19 rassmann - * Corrected reaction to reception of BPDU frames (#10441). - * - * Revision 1.25 1999/07/20 12:53:39 rassmann - * Fixed documentation errors for lookahead macros. - * - * Revision 1.24 1999/05/28 11:15:56 rassmann - * Changed behaviour to reflect Design Spec v1.2. - * Controlling Link LED(s). - * Introduced RLMT Packet Version field in RLMT Packet. - * Newstyle lookahead macros (checking meta-information before looking at - * the packet). - * - * Revision 1.23 1999/01/28 12:50:42 rassmann - * Not using broadcast time stamps in CheckLinkState mode. - * - * Revision 1.22 1999/01/27 14:13:04 rassmann - * Monitoring broadcast traffic. - * Switching more reliably and not too early if switch is - * configured for spanning tree. - * - * Revision 1.21 1998/12/08 13:11:25 rassmann - * Stopping SegTimer at RlmtStop. - * - * Revision 1.20 1998/11/24 12:37:33 rassmann - * Implemented segmentation check. - * - * Revision 1.19 1998/11/17 13:43:06 rassmann - * Handling (logical) tx failure. - * Sending packet on logical address after PORT_SWITCH. - * - * Revision 1.18 1998/11/13 16:56:56 rassmann - * Added macro version of SkRlmtLookaheadPacket. - * - * Revision 1.17 1998/11/06 18:06:05 rassmann - * Corrected timing when RLMT checks fail. - * Clearing tx counter earlier in periodical checks. - * - * Revision 1.16 1998/11/03 13:53:50 rassmann - * RLMT should switch now (at least in mode 3). - * - * Revision 1.15 1998/10/22 11:39:52 rassmann - * Corrected signed/unsigned mismatches. - * Corrected receive list handling and address recognition. - * - * Revision 1.14 1998/10/15 15:16:36 rassmann - * Finished Spanning Tree checking. - * Checked with lint. - * - * Revision 1.13 1998/09/24 19:16:08 rassmann - * Code cleanup. - * Introduced Timer for PORT_DOWN due to no RX. - * - * Revision 1.12 1998/09/16 11:09:52 rassmann - * Syntax corrections. - * - * Revision 1.11 1998/09/15 11:28:50 rassmann - * Syntax corrections. - * - * Revision 1.10 1998/09/14 17:07:38 rassmann - * Added code for port checking via LAN. - * Changed Mbuf definition. - * - * Revision 1.9 1998/09/07 11:14:15 rassmann - * Syntax corrections. - * - * Revision 1.8 1998/09/07 09:06:08 rassmann - * Syntax corrections. - * - * Revision 1.7 1998/09/04 19:41:34 rassmann - * Syntax corrections. - * Started entering code for checking local links. - * - * Revision 1.6 1998/09/04 12:14:28 rassmann - * Interface cleanup. - * - * Revision 1.5 1998/09/02 16:55:29 rassmann - * Updated to reflect new DRV/HWAC/RLMT interface. - * - * Revision 1.4 1998/09/02 07:26:02 afischer - * typedef for SK_RLMT_PORT - * - * Revision 1.3 1998/08/27 14:29:03 rassmann - * Code cleanup. - * - * Revision 1.2 1998/08/27 14:26:25 rassmann - * Updated interface. - * - * Revision 1.1 1998/08/21 08:29:10 rassmann - * First public version. - * ******************************************************************************/ /****************************************************************************** diff -Nru a/drivers/net/sk98lin/h/sktimer.h b/drivers/net/sk98lin/h/sktimer.h --- a/drivers/net/sk98lin/h/sktimer.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/h/sktimer.h Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: sktimer.h * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.11 $ - * Date: $Date: 2003/09/16 12:58:18 $ * Purpose: Defines for the timer functions * ******************************************************************************/ @@ -19,48 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: sktimer.h,v $ - * Revision 1.11 2003/09/16 12:58:18 rschmidt - * Editorial changes - * - * Revision 1.10 2003/05/13 17:56:44 mkarl - * Editorial changes. - * - * Revision 1.9 1999/11/22 14:00:29 cgoos - * Changed license header to GPL. - * - * Revision 1.8 1998/09/08 08:48:02 gklug - * add: init level handling - * - * Revision 1.7 1998/08/20 12:31:29 gklug - * fix: SK_TIMCTRL needs to be defined - * - * Revision 1.6 1998/08/19 09:51:00 gklug - * fix: remove struct keyword from C-code (see CCC) add typedefs - * - * Revision 1.5 1998/08/17 13:43:21 gklug - * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR - * - * Revision 1.4 1998/08/14 07:09:31 gklug - * fix: chg pAc -> pAC - * - * Revision 1.3 1998/08/07 12:54:24 gklug - * fix: first compiled version - * - * Revision 1.2 1998/08/07 09:35:29 gklug - * add: Timer control struct for Adapters context - * add: function prototypes - * - * Revision 1.1 1998/08/05 11:27:01 gklug - * First version: adapted from SMT - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/sktypes.h b/drivers/net/sk98lin/h/sktypes.h --- a/drivers/net/sk98lin/h/sktypes.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/sktypes.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: sktypes.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.2 $ - * Date: $Date: 2003/10/07 08:16:51 $ * Purpose: Define data types for Linux * ******************************************************************************/ @@ -22,31 +20,6 @@ * ******************************************************************************/ - /***************************************************************************** - * - * History: - * - * $Log: sktypes.h,v $ - * Revision 1.2 2003/10/07 08:16:51 mlindner - * Fix: Copyright changes - * - * Revision 1.1 2003/07/21 07:26:01 rroesler - * Fix: Re-Enter after CVS crash - * - * Revision 1.3 2003/02/25 14:16:40 mlindner - * Fix: Copyright statement - * - * Revision 1.2 1999/11/22 14:01:58 cgoos - * Changed license header to GPL. - * Now using Linux' fixed size types instead of standard types. - * - * Revision 1.1 1999/02/16 07:41:40 cgoos - * First version. - * - * - * - *****************************************************************************/ - /****************************************************************************** * * Description: diff -Nru a/drivers/net/sk98lin/h/skversion.h b/drivers/net/sk98lin/h/skversion.h --- a/drivers/net/sk98lin/h/skversion.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/h/skversion.h Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: version.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.5 $ - * Date: $Date: 2003/10/07 08:16:51 $ * Purpose: SK specific Error log support * ******************************************************************************/ @@ -22,42 +20,6 @@ * ******************************************************************************/ -/****************************************************************************** - * - * History: - * $Log: skversion.h,v $ - * Revision 1.5 2003/10/07 08:16:51 mlindner - * Fix: Copyright changes - * - * Revision 1.4 2003/09/22 08:40:10 mlindner - * Add: Added DRIVER_FILE_NAME and DRIVER_REL_DATE - * - * Revision 1.3 2003/08/25 13:34:48 mlindner - * Fix: Lint changes - * - * Revision 1.2 2003/08/13 12:01:01 mlindner - * Add: Changes for Lint - * - * Revision 1.1 2003/07/24 09:29:56 rroesler - * Fix: Re-Enter after CVS crash - * - * Revision 1.4 2003/02/25 14:16:40 mlindner - * Fix: Copyright statement - * - * Revision 1.3 2003/02/25 13:30:18 mlindner - * Add: Support for various vendors - * - * Revision 1.1.2.1 2001/09/05 13:38:30 mlindner - * Removed FILE description - * - * Revision 1.1 2001/03/06 09:25:00 mlindner - * first version - * - * - * - ******************************************************************************/ - - #ifdef lint static const char SysKonnectFileId[] = "@(#) (C) SysKonnect GmbH."; static const char SysKonnectBuildNumber[] = diff -Nru a/drivers/net/sk98lin/h/skvpd.h b/drivers/net/sk98lin/h/skvpd.h --- a/drivers/net/sk98lin/h/skvpd.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/h/skvpd.h Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skvpd.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.15 $ - * Date: $Date: 2003/01/13 10:39:38 $ * Purpose: Defines and Macros for VPD handling * ******************************************************************************/ @@ -18,70 +16,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skvpd.h,v $ - * Revision 1.15 2003/01/13 10:39:38 rschmidt - * Replaced define for PCI device Id for YUKON with GENESIS - * Editorial changes - * - * Revision 1.14 2002/11/14 15:18:10 gheinig - * Added const specifier to key and buf parameters for VpdPara,VpdRead - * and VpdWrite. This is necessary for the Diag 7 GUI API - * - * Revision 1.13 2002/10/14 15:58:18 rschmidt - * Added entry in rom_size struct s_vpd - * Editorial changes - * - * Revision 1.12 2002/09/09 14:43:51 mkarl - * added PCI Id of Yukon for reading VPD in diag before the adapter has - * been initialized - * editorial changes - * - * Revision 1.11 2002/07/26 13:19:16 mkarl - * added support for Yukon - * added vpd_size to VPD struct - * - * Revision 1.10 2000/08/10 11:29:07 rassmann - * Editorial changes. - * Preserving 32-bit alignment in structs for the adapter context. - * Removed unused function VpdWriteDword() (#if 0). - * Made VpdReadKeyword() available for SKDIAG only. - * - * Revision 1.9 1999/11/22 14:02:27 cgoos - * Changed license header to GPL. - * - * Revision 1.8 1999/03/11 14:26:40 malthoff - * Replace __STDC__ with SK_KR_PROTO. - * - * Revision 1.7 1998/10/28 07:27:17 gklug - * rmv: SWAP macros - * add: VPD_IN/OUT8 macros - * chg: interface definition - * - * Revision 1.6 1998/10/22 10:03:44 gklug - * fix: use SK_OUT16 instead of SK_OUTW - * - * Revision 1.5 1998/10/14 07:05:31 cgoos - * Changed constants in SK_SWAP_32 to UL. - * - * Revision 1.4 1998/08/19 08:14:09 gklug - * fix: remove struct keyword as much as possible from the C-code (see CCC) - * - * Revision 1.3 1998/08/18 08:18:56 malthoff - * Modify VPD in and out macros for SK_DIAG - * - * Revision 1.2 1998/07/03 14:49:08 malthoff - * Add VPD_INxx() and VPD_OUTxx() macros for the Diagnostics tool. - * - * Revision 1.1 1998/06/19 14:08:03 malthoff - * Created. - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/h/xmac_ii.h b/drivers/net/sk98lin/h/xmac_ii.h --- a/drivers/net/sk98lin/h/xmac_ii.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/h/xmac_ii.h Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: xmac_ii.h * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.52 $ - * Date: $Date: 2003/10/02 16:35:50 $ * Purpose: Defines and Macros for Gigabit Ethernet Controller * ******************************************************************************/ @@ -19,207 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: xmac_ii.h,v $ - * Revision 1.52 2003/10/02 16:35:50 rschmidt - * Added defines for default values of GMAC parameters - * Changed defines for setting GMAC parameters - * Editorial changes - * - * Revision 1.51 2003/09/23 09:04:27 malthoff - * Add bit definitions for PHY_MARV_EXT_P_STAT. - * - * Revision 1.50 2003/09/16 14:15:07 rschmidt - * Added defines for Extended PHY Specific Control - * Editorial changes - * - * Revision 1.49 2003/09/16 07:22:46 mschmid - * Added defines for Marvell PHY energy detect modes - * Added macros for MAC parameter setting in port structure - * - * Revision 1.48 2003/05/13 17:17:55 mkarl - * Editorial changes. - * - * Revision 1.47 2003/03/31 07:37:25 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.46 2003/01/28 09:47:45 rschmidt - * Added defines for copper MDI/MDIX configuration - * Added defines for LED Control Register - * Editorial changes - * - * Revision 1.45 2002/12/10 14:35:13 rschmidt - * Corrected defines for Extended PHY Specific Control - * Added defines for Ext. PHY Specific Ctrl 2 Reg. (Fiber specific) - * - * Revision 1.44 2002/12/09 14:58:41 rschmidt - * Added defines for Ext. PHY Specific Ctrl Reg. (downshift feature) - * Added 'GMR_FS_UN_SIZE'-Bit to Rx GMAC FIFO Flush Mask - * - * Revision 1.43 2002/12/05 10:14:45 rschmidt - * Added define for GMAC's Half Duplex Burst Mode - * Added define for Rx GMAC FIFO Flush Mask (default) - * - * Revision 1.42 2002/11/12 16:48:19 rschmidt - * Added defines for Cable Diagnostic Register (GPHY) - * Editorial changes - * - * Revision 1.41 2002/10/21 11:20:22 rschmidt - * Added bit GMR_FS_GOOD_FC to GMR_FS_ANY_ERR - * Editorial changes - * - * Revision 1.40 2002/10/14 14:54:14 rschmidt - * Added defines for GPHY Specific Status and GPHY Interrupt Status - * Added bits PHY_M_IS_AN_ERROR and PHY_M_IS_FIFO_ERROR to PHY_M_DEF_MSK - * Editorial changes - * - * Revision 1.39 2002/10/10 15:53:44 mkarl - * added some bit definitions for link speed status and LED's - * - * Revision 1.38 2002/08/21 16:23:46 rschmidt - * Added defines for PHY Specific Ctrl Reg - * Editorial changes - * - * Revision 1.37 2002/08/16 14:50:33 rschmidt - * Added defines for Auto-Neg. Advertisement YUKON Fiber (88E1011S only) - * Changed define PHY_M_DEF_MSK for GPHY IRQ Mask - * Editorial changes - * - * Revision 1.36 2002/08/12 13:21:10 rschmidt - * Added defines for different Broadcom PHY Ids - * - * Revision 1.35 2002/08/08 15:58:01 rschmidt - * Added defines for Manual LED Override register (YUKON) - * Editorial changes - * - * Revision 1.34 2002/07/31 17:23:36 rwahl - * Added define GMR_FS_ANY_ERR (analogous to XMR_FS_ANY_ERR). - * - * Revision 1.33 2002/07/23 16:03:37 rschmidt - * Added defines for GPHY registers - * Editorial changes - * - * Revision 1.32 2002/07/15 18:14:37 rwahl - * Added GMAC MIB counters definitions. - * Editorial changes. - * - * Revision 1.31 2002/07/15 15:42:50 rschmidt - * Removed defines from PHY specific reg. which are - * common to all PHYs - * Added defines for GMAC MIB Counters - * Editorial changes - * - * Revision 1.30 2002/06/05 08:22:12 rschmidt - * Changed defines for GMAC Rx Control Register and Rx Status - * Editorial changes - * - * Revision 1.29 2002/04/25 11:43:56 rschmidt - * Added define PHY_B_AS_PAUSE_MSK for BCom Pause Res. - * Added new registers and defines for YUKON (GMAC, GPHY) - * Added Receive Frame Status Encoding for YUKON - * Editorial changes - * - * Revision 1.28 2000/11/09 12:32:49 rassmann - * Renamed variables. - * - * Revision 1.27 2000/05/17 11:00:46 malthoff - * Add bit for enable/disable power management in BCOM chip. - * - * Revision 1.26 1999/11/22 14:03:00 cgoos - * Changed license header to GPL. - * - * Revision 1.25 1999/08/12 19:19:38 malthoff - * Add PHY_B_AC_TX_TST bit according to BCOM A1 errata sheet. - * - * Revision 1.24 1999/07/30 11:27:21 cgoos - * Fixed a missing end-of-comment. - * - * Revision 1.23 1999/07/30 07:03:31 malthoff - * Cut some long comments. - * Correct the XMAC PHY ID definitions. - * - * Revision 1.22 1999/05/19 07:33:18 cgoos - * Changes for 1000Base-T. - * - * Revision 1.21 1999/03/25 07:46:11 malthoff - * Add XM_HW_CFG, XM_TS_READ, and XM_TS_LOAD registers. - * - * Revision 1.20 1999/03/12 13:36:09 malthoff - * Remove __STDC__. - * - * Revision 1.19 1998/12/10 12:22:54 gklug - * fix: RX_PAGE must be in interrupt mask - * - * Revision 1.18 1998/12/10 10:36:36 gklug - * fix: swap of pause bits - * - * Revision 1.17 1998/11/18 13:21:45 gklug - * fix: Default interrupt mask - * - * Revision 1.16 1998/10/29 15:53:21 gklug - * fix: Default mask uses ASS (GP0) signal - * - * Revision 1.15 1998/10/28 13:52:52 malthoff - * Add new bits in RX_CMD register. - * - * Revision 1.14 1998/10/19 15:34:53 gklug - * fix: typos - * - * Revision 1.13 1998/10/14 07:19:03 malthoff - * bug fix: Every define which describes bit 31 - * must be declared as unsigned long 'UL'. - * fix bit definitions of PHY_AN_RFB and PHY_AN_PAUSE. - * Remove ANP defines. Rework the RFB defines. - * - * Revision 1.12 1998/10/14 06:22:44 cgoos - * Changed shifted constant to ULONG. - * - * Revision 1.11 1998/10/14 05:43:26 gklug - * add: shift pause coding - * fix: PAUSE bits definition - * - * Revision 1.10 1998/10/13 09:19:21 malthoff - * Again change XMR_FS_ANY_ERR because of new info from XaQti. - * - * Revision 1.9 1998/10/09 07:58:30 malthoff - * Add XMR_FS_FCS_ERR to XMR_FS_ANY_ERR. - * - * Revision 1.8 1998/10/09 07:18:17 malthoff - * bug fix of a bug fix: XM_PAUSE_MODE and XM_DEF_MODE - * are not inverted! Bug XM_DEF_MSK is inverted. - * - * Revision 1.7 1998/10/05 08:04:32 malthoff - * bug fix: XM_PAUSE_MODE and XM_DEF_MODE - * must be inverted declarations. - * - * Revision 1.6 1998/09/28 13:38:18 malthoff - * Add default modes and masks XM_DEF_MSK, - * XM_PAUSE_MODE and XM_DEF_MODE - * - * Revision 1.5 1998/09/16 14:42:04 malthoff - * Bug Fix: XM_GP_PORT is a 32 bit (not a 16 bit) register. - * - * Revision 1.4 1998/08/20 14:59:47 malthoff - * Rework this file after reading the XaQti data sheet - * "Differences between Rev. B2 & Rev. C XMAC II". - * This file is now 100% XMAC II Rev. C complained. - * - * Revision 1.3 1998/06/29 12:18:23 malthoff - * Correct XMR_FS_ANY_ERR definition. - * - * Revision 1.2 1998/06/29 12:10:56 malthoff - * Add define XMR_FS_ANY_ERR. - * - * Revision 1.1 1998/06/19 13:37:17 malthoff - * created. - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skaddr.c b/drivers/net/sk98lin/skaddr.c --- a/drivers/net/sk98lin/skaddr.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/skaddr.c Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skaddr.c * Project: Gigabit Ethernet Adapters, ADDR-Module - * Version: $Revision: 1.52 $ - * Date: $Date: 2003/06/02 13:46:15 $ * Purpose: Manage Addresses (Multicast and Unicast) and Promiscuous Mode. * ******************************************************************************/ @@ -19,203 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skaddr.c,v $ - * Revision 1.52 2003/06/02 13:46:15 tschilli - * Editorial changes. - * - * Revision 1.51 2003/05/13 17:12:43 mkarl - * Changes for SLIM Driver via SK_SLIM. - * Changes for driver not using RLMT via SK_NO_RLMT. - * Changes for driver not supporting MAC address override via SK_NO_MAO. - * Separeted GENESIS and YUKON only code to reduce code size. - * Editorial changes. - * - * Revision 1.50 2003/05/08 12:29:31 rschmidt - * Replaced all if(GIChipId == CHIP_ID_GENESIS) with new entry GIGenesis. - * Changed initialisation for Next0[SK_MAX_MACS] to avoid - * compiler errors when SK_MAX_MACS=1. - * Editorial changes. - * - * Revision 1.49 2003/04/15 09:30:51 tschilli - * Copyright messages changed. - * "#error C++ is not yet supported." removed. - * - * Revision 1.48 2003/02/12 17:09:37 tschilli - * Fix in SkAddrOverride() to set both (physical and logical) MAC addresses - * in case that both addresses are identical. - * - * Revision 1.47 2002/09/17 06:31:10 tschilli - * Handling of SK_PROM_MODE_ALL_MC flag in SkAddrGmacMcUpdate() - * and SkAddrGmacPromiscuousChange() fixed. - * Editorial changes. - * - * Revision 1.46 2002/08/22 07:55:41 tschilli - * New function SkGmacMcHash() for GMAC multicast hashing algorithm added. - * Editorial changes. - * - * Revision 1.45 2002/08/15 12:29:35 tschilli - * SkAddrGmacMcUpdate() and SkAddrGmacPromiscuousChange() changed. - * - * Revision 1.44 2002/08/14 12:18:03 rschmidt - * Replaced direct handling of MAC Hashing (XMAC and GMAC) - * with routine SkMacHashing(). - * Replaced wrong 3rd para 'i' with 'PortNumber' in SkMacPromiscMode(). - * - * Revision 1.43 2002/08/13 09:37:43 rschmidt - * Corrected some SK_DBG_MSG outputs. - * Replaced wrong 2nd para pAC with IoC in SkMacPromiscMode(). - * Editorial changes. - * - * Revision 1.42 2002/08/12 11:24:36 rschmidt - * Remove setting of logical MAC address GM_SRC_ADDR_2 in SkAddrInit(). - * Replaced direct handling of MAC Promiscuous Mode (XMAC and GMAC) - * with routine SkMacPromiscMode(). - * Editorial changes. - * - * Revision 1.41 2002/06/10 13:52:18 tschilli - * Changes for handling YUKON. - * All changes are internally and not visible to the programmer - * using this module. - * - * Revision 1.40 2001/02/14 14:04:59 rassmann - * Editorial changes. - * - * Revision 1.39 2001/01/30 10:30:04 rassmann - * Editorial changes. - * - * Revision 1.38 2001/01/25 16:26:52 rassmann - * Ensured that logical address overrides are done on net's active port. - * - * Revision 1.37 2001/01/22 13:41:34 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.36 2000/08/07 11:10:39 rassmann - * Editorial changes. - * - * Revision 1.35 2000/05/04 09:38:41 rassmann - * Editorial changes. - * Corrected multicast address hashing. - * - * Revision 1.34 1999/11/22 13:23:44 cgoos - * Changed license header to GPL. - * - * Revision 1.33 1999/05/28 10:56:06 rassmann - * Editorial changes. - * - * Revision 1.32 1999/03/31 10:59:20 rassmann - * Returning Success instead of DupAddr if address shall be overridden - * with same value. - * - * Revision 1.31 1999/01/14 16:18:17 rassmann - * Corrected multicast initialization. - * - * Revision 1.30 1999/01/04 10:30:35 rassmann - * SkAddrOverride only possible after SK_INIT_IO phase. - * - * Revision 1.29 1998/12/29 13:13:10 rassmann - * An address override is now preserved in the SK_INIT_IO phase. - * All functions return an int now. - * Extended parameter checking. - * - * Revision 1.28 1998/12/01 11:45:53 rassmann - * Code cleanup. - * - * Revision 1.27 1998/12/01 09:22:49 rassmann - * SkAddrMcAdd and SkAddrMcUpdate returned SK_MC_FILTERING_INEXACT - * too often. - * - * Revision 1.26 1998/11/24 12:39:44 rassmann - * Reserved multicast entry for BPDU address. - * 13 multicast entries left for protocol. - * - * Revision 1.25 1998/11/17 16:54:23 rassmann - * Using exact match for up to 14 multicast addresses. - * Still receiving all multicasts if more addresses are added. - * - * Revision 1.24 1998/11/13 17:24:31 rassmann - * Changed return value of SkAddrOverride to int. - * - * Revision 1.23 1998/11/13 16:56:18 rassmann - * Added macro SK_ADDR_COMPARE. - * Changed return type of SkAddrOverride to SK_BOOL. - * - * Revision 1.22 1998/11/04 17:06:17 rassmann - * Corrected McUpdate and PromiscuousChange functions. - * - * Revision 1.21 1998/10/29 14:34:04 rassmann - * Clearing SK_ADDR struct at startup. - * - * Revision 1.20 1998/10/28 18:16:34 rassmann - * Avoiding I/Os before SK_INIT_RUN level. - * Aligning InexactFilter. - * - * Revision 1.19 1998/10/28 11:29:28 rassmann - * Programming physical address in SkAddrMcUpdate. - * Corrected programming of exact match entries. - * - * Revision 1.18 1998/10/28 10:34:48 rassmann - * Corrected reading of physical addresses. - * - * Revision 1.17 1998/10/28 10:26:13 rassmann - * Getting ports' current MAC addresses from EPROM now. - * Added debug output. - * - * Revision 1.16 1998/10/27 16:20:12 rassmann - * Reading MAC address byte by byte. - * - * Revision 1.15 1998/10/22 11:39:09 rassmann - * Corrected signed/unsigned mismatches. - * - * Revision 1.14 1998/10/19 17:12:35 rassmann - * Syntax corrections. - * - * Revision 1.13 1998/10/19 17:02:19 rassmann - * Now reading permanent MAC addresses from CRF. - * - * Revision 1.12 1998/10/15 15:15:48 rassmann - * Changed Flags Parameters from SK_U8 to int. - * Checked with lint. - * - * Revision 1.11 1998/09/24 19:15:12 rassmann - * Code cleanup. - * - * Revision 1.10 1998/09/18 20:18:54 rassmann - * Added HW access. - * Implemented swapping. - * - * Revision 1.9 1998/09/16 11:32:00 rassmann - * Including skdrv1st.h again. :( - * - * Revision 1.8 1998/09/16 11:09:34 rassmann - * Syntax corrections. - * - * Revision 1.7 1998/09/14 17:06:34 rassmann - * Minor changes. - * - * Revision 1.6 1998/09/07 08:45:41 rassmann - * Syntax corrections. - * - * Revision 1.5 1998/09/04 19:40:19 rassmann - * Interface enhancements. - * - * Revision 1.4 1998/09/04 12:14:12 rassmann - * Interface cleanup. - * - * Revision 1.3 1998/09/02 16:56:40 rassmann - * Updated interface. - * - * Revision 1.2 1998/08/27 14:26:09 rassmann - * Updated interface. - * - * Revision 1.1 1998/08/21 08:30:22 rassmann - * First public version. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c --- a/drivers/net/sk98lin/skcsum.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/skcsum.c Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skcsum.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 2003/08/20 13:55:53 $ * Purpose: Store/verify Internet checksum in send/receive packets. * ******************************************************************************/ @@ -18,63 +16,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skcsum.c,v $ - * Revision 1.12 2003/08/20 13:55:53 mschmid - * Changed notation of #ifndef SkCsCalculateChecksum to - * #ifndef SK_CS_CALCULATE_CHECKSUM - * - * Revision 1.11 2003/03/11 14:05:55 rschmidt - * Replaced memset() by macro SK_MEMSET() - * Editorial changes - * - * Revision 1.10 2002/04/11 10:02:04 rwahl - * Fix in SkCsGetSendInfo(): - * - function did not return ProtocolFlags in every case. - * - pseudo header csum calculated wrong for big endian. - * - * Revision 1.9 2001/06/13 07:42:08 gklug - * fix: NetNumber was wrong in CLEAR_STAT event - * add: check for good NetNumber in Clear STAT - * - * Revision 1.8 2001/02/06 11:15:36 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.7 2000/06/29 13:17:05 rassmann - * Corrected reception of a packet with UDP checksum == 0 (which means there - * is no UDP checksum). - * - * Revision 1.6 2000/02/21 12:35:10 cgoos - * Fixed license header comment. - * - * Revision 1.5 2000/02/21 11:05:19 cgoos - * Merged changes back to common source. - * Fixed rx path for BIG ENDIAN architecture. - * - * Revision 1.1 1999/07/26 15:28:12 mkarl - * added return SKCS_STATUS_IP_CSUM_ERROR_UDP and - * SKCS_STATUS_IP_CSUM_ERROR_TCP to pass the NidsTester - * changed from common source to windows specific source - * therefore restarting with v1.0 - * - * Revision 1.3 1999/05/10 08:39:33 mkarl - * prevent overflows in SKCS_HTON16 - * fixed a bug in pseudo header checksum calculation - * added some comments - * - * Revision 1.2 1998/10/22 11:53:28 swolf - * Now using SK_DBG_MSG. - * - * Revision 1.1 1998/09/01 15:35:41 swolf - * initial revision - * - * 13-May-1998 sw Created. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skdim.c b/drivers/net/sk98lin/skdim.c --- a/drivers/net/sk98lin/skdim.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/skdim.c Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skdim.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.5 $ - * Date: $Date: 2003/11/28 12:55:40 $ * Purpose: All functions to maintain interrupt moderation * ******************************************************************************/ @@ -19,40 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skdim.c,v $ - * Revision 1.5 2003/11/28 12:55:40 rroesler - * Fix: support for new process timing interface added - * - * Revision 1.4 2003/10/10 10:58:56 mlindner - * Fix: CPU detection under the kernel 2.6 - * - * Revision 1.3 2003/10/07 08:17:08 mlindner - * Fix: Copyright changes - * - * Revision 1.2 2003/08/21 12:35:05 mlindner - * Fix: Corrected CPU detection and compile errors on single CPU machines - * - * Revision 1.1 2003/07/18 13:39:55 rroesler - * Fix: Re-enter after CVS crash - * - * Revision 1.4 2003/07/07 09:45:47 rroesler - * Fix: Compiler warnings corrected - * - * Revision 1.3 2003/06/10 09:16:40 rroesler - * Adapt GetCurrentSystemLoad() to NOT access the kernels - * kstat-structure in kernel 2.5/2.6. This must be done - * due to a not exported symbol. Instead of evaluating the - * SystemLoad directly, the nbr of interrupts is used as - * a rough basis for the load. - * - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/skge.c Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skge.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.43 $ - * Date: $Date: 2004/01/29 15:47:07 $ * Purpose: The main driver source module * ******************************************************************************/ @@ -38,423 +36,6 @@ /****************************************************************************** * - * History: - * - * $Log: skge.c,v $ - * Revision 1.43 2004/01/29 15:47:07 mlindner - * Fix: Reset Xmac when stopping the port - * - * Revision 1.42 2003/12/12 10:05:43 mlindner - * Fix: Format of error message corrected - * - * Revision 1.41 2003/12/11 16:03:57 mlindner - * Fix: Create backup from pnmi data structure - * - * Revision 1.40 2003/12/11 12:14:48 mlindner - * Fix: Initalize Board before network configuration - * Fix: Change device names to driver name - * - * Revision 1.39 2003/12/10 08:57:38 rroesler - * Fix: Modifications regarding try_module_get() and capable() - * - * Revision 1.38 2003/12/01 17:16:50 mlindner - * Fix: Remove useless register_netdev - * - * Revision 1.37 2003/12/01 17:11:30 mlindner - * Fix: Register net device before SkGeBoardInit - * - * Revision 1.36 2003/11/28 13:04:27 rroesler - * Fix: do not print interface status in case DIAG is used - * - * Revision 1.35 2003/11/17 14:41:06 mlindner - * Fix: Endif command - * - * Revision 1.34 2003/11/17 13:29:05 mlindner - * Fix: Editorial changes - * - * Revision 1.33 2003/11/14 14:56:54 rroesler - * Fix: corrected compilation warnings kernel 2.2 - * - * Revision 1.32 2003/11/13 14:18:47 rroesler - * Fix: added latest changes regarding the use of the proc system - * - * Revision 1.31 2003/11/13 09:28:35 rroesler - * Fix: removed kernel warning 'driver changed get_stats after register' - * - * Revision 1.30 2003/11/11 13:15:27 rroesler - * Fix: use suitables kernel usage count macros when using the diag - * - * Revision 1.29 2003/11/10 09:38:26 rroesler - * Fix: restore PNMI structure backup for DIAG actions - * - * Revision 1.28 2003/11/07 17:28:45 rroesler - * Fix: Additions for the LeaveDiagMode - * - * Revision 1.27 2003/11/03 13:21:14 mlindner - * Add: SkGeBuffPad function for padding to ensure the trailing bytes exist - * - * Revision 1.26 2003/10/30 09:20:40 mlindner - * Fix: Control bit check - * - * Revision 1.25 2003/10/29 07:43:37 rroesler - * Fix: Implemented full None values handling for parameter Moderation - * - * Revision 1.24 2003/10/22 14:18:12 rroesler - * Fix: DIAG handling for DualNet cards - * - * Revision 1.23 2003/10/17 10:05:13 mlindner - * Add: New blinkmode for Morvell cards - * - * Revision 1.22 2003/10/15 12:31:25 rroesler - * Fix: Corrected bugreport #10954 (Linux System crash when using vlans) - * - * Revision 1.21 2003/10/07 12:32:28 mlindner - * Fix: Editorial changes - * - * Revision 1.20 2003/10/07 12:22:40 mlindner - * Fix: Compiler warnings - * - * Revision 1.19 2003/10/07 09:33:40 mlindner - * Fix: No warnings for illegal values of Mod and IntsPerSec - * Fix: Speed 100 in Half Duplex not allowed for Yukon - * Fix: PrefPort=B not allowed on single NICs - * - * Revision 1.18 2003/10/07 08:17:08 mlindner - * Fix: Copyright changes - * - * Revision 1.17 2003/09/29 12:06:59 mlindner - * *** empty log message *** - * - * Revision 1.16 2003/09/23 11:07:35 mlindner - * Fix: IO-control return race condition - * Fix: Interrupt moderation value check - * - * Revision 1.15 2003/09/22 08:40:05 mlindner - * Add: Added DRIVER_FILE_NAME and DRIVER_REL_DATE - * - * Revision 1.14 2003/09/22 08:11:10 mlindner - * Add: New function for PCI initialization (SkGeInitPCI) - * Add: Yukon Plus changes (ChipID, PCI...) - * Fix: TCP and UDP Checksum calculation - * - * Revision 1.13 2003/09/01 13:30:08 rroesler - * Fix: Corrected missing defines - * - * Revision 1.12 2003/09/01 13:12:02 rroesler - * Add: Code for improved DIAG Attach/Detach interface - * - * Revision 1.11 2003/08/26 16:05:19 mlindner - * Fix: Compiler warnings (void *) - * - * Revision 1.10 2003/08/25 09:24:08 mlindner - * Add: Dynamic Interrupt Moderation (DIM) port up message - * - * Revision 1.9 2003/08/21 14:09:43 mlindner - * Fix: Disable Half Duplex with Gigabit-Speed (Yukon). Enable Full Duplex. - * - * Revision 1.8 2003/08/19 15:09:18 mlindner - * Fix: Ignore ConType parameter if empty value - * - * Revision 1.7 2003/08/13 12:00:35 mlindner - * Fix: Removed useless defines - * - * Revision 1.6 2003/08/12 16:49:41 mlindner - * Fix: UDP and TCP HW-CSum calculation (Kernel 2.5/2.6) - * Fix: UDP and TCP Proto checks - * Fix: Build without ProcFS - * Fix: Kernel 2.6 editorial changes - * - * Revision 1.5 2003/08/07 12:25:07 mlindner - * Fix: ConType parameter check and error detection - * Fix: Insert various fixes applied to the kernel tree - * - * Revision 1.4 2003/08/07 10:50:21 mlindner - * Add: Speed and HW-Csum support for Yukon Lite chipset - * - * Revision 1.3 2003/08/06 11:24:08 mlindner - * Add: Kernel updates - * - * Revision 1.2 2003/07/21 08:28:47 rroesler - * Fix: Handle padded bytes using skb_put() - * - * Revision 1.63 2003/07/15 09:26:23 rroesler - * Fix: Removed memory leak when sending short padded frames - * - * Revision 1.62 2003/07/09 11:11:16 rroesler - * Fix: Call of ReceiveIrq() performed with parameter SK_FALSE in - * order not to hang the system with multiple spinlocks - * - * Revision 1.61 2003/07/08 07:32:41 rroesler - * Fix: Correct Kernel-version - * - * Revision 1.60 2003/07/07 15:42:30 rroesler - * Fix: Removed function pci_present() for 2.5/2.6 kernels (deprecated) - * Fix: Corrected warning in GetConfiguration() - * - * Revision 1.59 2003/07/07 09:44:32 rroesler - * Add: HW checksumming on kernel 2.5/2.6 - * Add: padding of short frames (<60 bytes) with 0x00 instead of 0xaa - * Add: ConType parameter combining multiple other parameters into one - * Fix: Corrected bugreport #10721 (warning when changing MTU size) - * Fix: Removed obsolete function SetQueueSize() - * Fix: Function ChangeMtuSize() returns new MTU size in kernel 2.5/2.6 - * - * Revision 1.58 2003/06/17 07:14:29 mlindner - * Add: Disable checksum functionality - * Fix: Unload module (Kernel 2.5) - * - * Revision 1.57 2003/06/05 14:55:27 mlindner - * Fix: ProcFS creation (Kernel 2.2.x) - * Fix: ProcFS OWNER (Kernel 2.2.x) - * - * Revision 1.56 2003/06/03 14:34:29 mlindner - * Add: Additions for SK_SLIM - * Fix: SkGeIoctl SK_IOCTL_GEN - * - * Revision 1.55 2003/05/26 13:00:52 mlindner - * Add: Support for Kernel 2.5/2.6 - * Add: Support for new IO-control MIB data structure - * Add: New SkOsGetTime function - * Fix: Race condition with broken LM80 chip - * Fix: Race condition with padded frames - * - * Revision 1.54 2003/04/28 13:07:27 mlindner - * Fix: Delay race condition with some server machines - * - * Revision 1.53 2003/04/28 12:49:49 mlindner - * Fix: Code optimization - * - * Revision 1.52 2003/04/28 12:24:32 mlindner - * Fix: Disabled HW Error IRQ on 32-bit Yukon if sensor IRQ occurs - * - * Revision 1.51 2003/04/16 08:31:14 mlindner - * Fix: Kernel 2.2 compilation - * - * Revision 1.49 2003/04/10 09:08:51 mlindner - * Add: Blink mode verification - * Fix: Checksum calculation - * - * Revision 1.48 2003/03/21 14:48:38 rroesler - * Added code for interrupt moderation - * - * Revision 1.47 2003/03/12 13:56:15 mlindner - * Fix: Mac update during SK_DRV_NET_UP - * - * Revision 1.46 2003/02/25 14:16:36 mlindner - * Fix: Copyright statement - * - * Revision 1.45 2003/02/25 13:25:55 mlindner - * Add: Performance improvements - * Add: Support for various vendors - * Fix: Init function - * - * Revision 1.44 2003/01/09 09:25:26 mlindner - * Fix: Remove useless init_module/cleanup_module forward declarations - * - * Revision 1.43 2002/11/29 08:42:41 mlindner - * Fix: Boot message - * - * Revision 1.42 2002/11/28 13:30:23 mlindner - * Add: New frame check - * - * Revision 1.41 2002/11/27 13:55:18 mlindner - * Fix: Drop wrong csum packets - * Fix: Initialize proc_entry after hw check - * - * Revision 1.40 2002/10/31 07:50:37 tschilli - * Function SkGeInitAssignRamToQueues() from common module inserted. - * Autonegotiation is set to ON for all adapters. - * LinkSpeedUsed is used in link up status report. - * Role parameter will show up for 1000 Mbps links only. - * GetConfiguration() inserted after init level 1 in SkGeChangeMtu(). - * All return values of SkGeInit() and SkGeInitPort() are checked. - * - * Revision 1.39 2002/10/02 12:56:05 mlindner - * Add: Support for Yukon - * Add: Support for ZEROCOPY, scatter-gather and hw checksum - * Add: New transmit ring function (use SG and TCP/UDP hardware checksumming) - * Add: New init function - * Add: Speed check and setup - * Add: Merge source for kernel 2.2.x and 2.4.x - * Add: Opcode check for tcp - * Add: Frame length check - * Fix: Transmit complete interrupt - * Fix: Interrupt moderation - * - * Revision 1.29.2.13 2002/01/14 12:44:52 mlindner - * Fix: Rlmt modes - * - * Revision 1.29.2.12 2001/12/07 12:06:18 mlindner - * Fix: malloc -> slab changes - * - * Revision 1.29.2.11 2001/12/06 15:19:20 mlindner - * Add: DMA attributes - * Fix: Module initialisation - * Fix: pci_map_single and pci_unmap_single replaced - * - * Revision 1.29.2.10 2001/12/06 09:56:50 mlindner - * Corrected some printk's - * - * Revision 1.29.2.9 2001/09/05 12:15:34 mlindner - * Add: LBFO Changes - * Fix: Counter Errors (Jumbo == to long errors) - * Fix: Changed pAC->PciDev declaration - * Fix: too short counters - * - * Revision 1.29.2.8 2001/06/25 12:10:44 mlindner - * fix: ReceiveIrq() changed. - * - * Revision 1.29.2.7 2001/06/25 08:07:05 mlindner - * fix: RLMT locking in ReceiveIrq() changed. - * - * Revision 1.29.2.6 2001/05/21 07:59:29 mlindner - * fix: MTU init problems - * - * Revision 1.29.2.5 2001/05/08 11:25:08 mlindner - * fix: removed VLAN error message - * - * Revision 1.29.2.4 2001/05/04 13:31:43 gklug - * fix: do not handle eth_copy on bad fragments received. - * - * Revision 1.29.2.3 2001/04/23 08:06:43 mlindner - * Fix: error handling - * - * Revision 1.29.2.2 2001/03/15 12:04:54 mlindner - * Fixed memory problem - * - * Revision 1.29.2.1 2001/03/12 16:41:44 mlindner - * add: procfs function - * add: dual-net function - * add: RLMT networks - * add: extended PNMI features - * - * Kernel 2.4.x specific: - * Revision 1.xx 2000/09/12 13:31:56 cgoos - * Fixed missign "dev=NULL in skge_probe. - * Added counting for jumbo frames (corrects error statistic). - * Removed VLAN tag check (enables VLAN support). - * - * Kernel 2.2.x specific: - * Revision 1.29 2000/02/21 13:31:56 cgoos - * Fixed "unused" warning for UltraSPARC change. - * - * Partially kernel 2.2.x specific: - * Revision 1.28 2000/02/21 10:32:36 cgoos - * Added fixes for UltraSPARC. - * Now printing RlmtMode and PrefPort setting at startup. - * Changed XmitFrame return value. - * Fixed rx checksum calculation for BIG ENDIAN systems. - * Fixed rx jumbo frames counted as ierrors. - * - * - * Revision 1.27 1999/11/25 09:06:28 cgoos - * Changed base_addr to unsigned long. - * - * Revision 1.26 1999/11/22 13:29:16 cgoos - * Changed license header to GPL. - * Changes for inclusion in linux kernel (2.2.13). - * Removed 2.0.x defines. - * Changed SkGeProbe to skge_probe. - * Added checks in SkGeIoctl. - * - * Revision 1.25 1999/10/07 14:47:52 cgoos - * Changed 984x to 98xx. - * - * Revision 1.24 1999/09/30 07:21:01 cgoos - * Removed SK_RLMT_SLOW_LOOKAHEAD option. - * Giving spanning tree packets also to OS now. - * - * Revision 1.23 1999/09/29 07:36:50 cgoos - * Changed assignment for IsBc/IsMc. - * - * Revision 1.22 1999/09/28 12:57:09 cgoos - * Added CheckQueue also to Single-Port-ISR. - * - * Revision 1.21 1999/09/28 12:42:41 cgoos - * Changed parameter strings for RlmtMode. - * - * Revision 1.20 1999/09/28 12:37:57 cgoos - * Added CheckQueue for fast delivery of RLMT frames. - * - * Revision 1.19 1999/09/16 07:57:25 cgoos - * Copperfield changes. - * - * Revision 1.18 1999/09/03 13:06:30 cgoos - * Fixed RlmtMode=CheckSeg bug: wrong DEV_KFREE_SKB in RLMT_SEND caused - * double allocated skb's. - * FrameStat in ReceiveIrq was accessed via wrong Rxd. - * Queue size for async. standby Tx queue was zero. - * FillRxLimit of 0 could cause problems with ReQueue, changed to 1. - * Removed debug output of checksum statistic. - * - * Revision 1.17 1999/08/11 13:55:27 cgoos - * Transmit descriptor polling was not reenabled after SkGePortInit. - * - * Revision 1.16 1999/07/27 15:17:29 cgoos - * Added some "\n" in output strings (removed while debuging...). - * - * Revision 1.15 1999/07/23 12:09:30 cgoos - * Performance optimization, rx checksumming, large frame support. - * - * Revision 1.14 1999/07/14 11:26:27 cgoos - * Removed Link LED settings (now in RLMT). - * Added status output at NET UP. - * Fixed SMP problems with Tx and SWITCH running in parallel. - * Fixed return code problem at RLMT_SEND event. - * - * Revision 1.13 1999/04/07 10:11:42 cgoos - * Fixed Single Port problems. - * Fixed Multi-Adapter problems. - * Always display startup string. - * - * Revision 1.12 1999/03/29 12:26:37 cgoos - * Reversed locking to fine granularity. - * Fixed skb double alloc problem (caused by incorrect xmit return code). - * Enhanced function descriptions. - * - * Revision 1.11 1999/03/15 13:10:51 cgoos - * Changed device identifier in output string to ethX. - * - * Revision 1.10 1999/03/15 12:12:34 cgoos - * Changed copyright notice. - * - * Revision 1.9 1999/03/15 12:10:17 cgoos - * Changed locking to one driver lock. - * Added check of SK_AC-size (for consistency with library). - * - * Revision 1.8 1999/03/08 11:44:02 cgoos - * Fixed missing dev->tbusy in SkGeXmit. - * Changed large frame (jumbo) buffer number. - * Added copying of short frames. - * - * Revision 1.7 1999/03/04 13:26:57 cgoos - * Fixed spinlock calls for SMP. - * - * Revision 1.6 1999/03/02 09:53:51 cgoos - * Added descriptor revertion for big endian machines. - * - * Revision 1.5 1999/03/01 08:50:59 cgoos - * Fixed SkGeChangeMtu. - * Fixed pci config space accesses. - * - * Revision 1.4 1999/02/18 15:48:44 cgoos - * Corrected some printk's. - * - * Revision 1.3 1999/02/18 12:45:55 cgoos - * Changed SK_MAX_CARD_PARAM to default 16 - * - * Revision 1.2 1999/02/18 10:55:32 cgoos - * Removed SkGeDrvTimeStamp function. - * Printing "ethX:" before adapter type at adapter init. - * - * - * 10-Feb-1999 cg Created, based on Linux' acenic.c, 3c59x.c and - * SysKonnects GEnesis Solaris driver - * - ******************************************************************************/ - -/****************************************************************************** - * * Possible compiler options (#define xxx / -Dxxx): * * debugging can be enable by changing SK_DEBUG_CHKMOD and @@ -1256,7 +837,7 @@ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){ unregister_netdev(pAC->dev[1]); - kfree(pAC->dev[1]); + free_netdev(pAC->dev[1]); } FreeResources(SkGeRootDev); diff -Nru a/drivers/net/sk98lin/skgehwt.c b/drivers/net/sk98lin/skgehwt.c --- a/drivers/net/sk98lin/skgehwt.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/skgehwt.c Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skgehwt.c * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.15 $ - * Date: $Date: 2003/09/16 13:41:23 $ * Purpose: Hardware Timer * ******************************************************************************/ @@ -19,60 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgehwt.c,v $ - * Revision 1.15 2003/09/16 13:41:23 rschmidt - * Added (C) Marvell to SysKonnectFileId - * Editorial changes - * - * Revision 1.14 2003/05/13 18:01:58 mkarl - * Editorial changes. - * - * Revision 1.13 1999/11/22 13:31:12 cgoos - * Changed license header to GPL. - * - * Revision 1.12 1998/10/15 15:11:34 gklug - * fix: ID_sccs to SysKonnectFileId - * - * Revision 1.11 1998/10/08 15:27:51 gklug - * chg: correction factor is host clock dependent - * - * Revision 1.10 1998/09/15 14:18:31 cgoos - * Changed more BOOLEANs to SK_xxx - * - * Revision 1.9 1998/09/15 14:16:06 cgoos - * Changed line 107: FALSE to SK_FALSE - * - * Revision 1.8 1998/08/24 13:04:44 gklug - * fix: typo - * - * Revision 1.7 1998/08/19 09:50:49 gklug - * fix: remove struct keyword from c-code (see CCC) add typedefs - * - * Revision 1.6 1998/08/17 09:59:02 gklug - * fix: typos - * - * Revision 1.5 1998/08/14 07:09:10 gklug - * fix: chg pAc -> pAC - * - * Revision 1.4 1998/08/10 14:14:52 gklug - * rmv: unneccessary SK_ADDR macro - * - * Revision 1.3 1998/08/07 12:53:44 gklug - * fix: first compiled version - * - * Revision 1.2 1998/08/07 09:19:29 gklug - * adapt functions to the C coding conventions - * rmv unneccessary functions. - * - * Revision 1.1 1998/08/05 11:28:36 gklug - * first version: adapted from SMT/FDDI * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skgeinit.c b/drivers/net/sk98lin/skgeinit.c --- a/drivers/net/sk98lin/skgeinit.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/skgeinit.c Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgeinit.c * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.97 $ - * Date: $Date: 2003/10/02 16:45:31 $ * Purpose: Contains functions to initialize the adapter * ******************************************************************************/ @@ -22,446 +20,6 @@ * ******************************************************************************/ -/****************************************************************************** - * - * History: - * - * $Log: skgeinit.c,v $ - * Revision 1.97 2003/10/02 16:45:31 rschmidt - * Replaced default values of GMAC parameters with defines. - * Removed hard reset of MACs in SkGeDeInit(). - * Added define SK_PHY_LP_MODE around power saving mode in SkGeDeInit(). - * Added check for VAUX available before switch power to VAUX. - * - * Revision 1.96 2003/09/18 14:02:41 rroesler - * Add: Perform a hardreset of MACs in GeDeInit() - * - * Revision 1.95 2003/09/16 14:26:59 rschmidt - * Added switch power to VCC (WA for VAUX problem) in SkGeInit1(). - * Fixed setting PHY to coma mode and D3 power state in SkGeDeInit(). - * Editorial changes. - * - * Revision 1.94 2003/09/16 07:17:10 mschmid - * Added init for new members in port structure for MAC control - * - PMacColThres - * - PMacJamLen - * - PMacJamIpgVal - * - PMacJamIpgData - * - PMacIpgData - * - PMacLimit4 - * Added init for PHY power state in port structure - * - PPhyPowerState - * Added shutdown handling for Yukon Plus in SkGeDeInit() - * - * Revision 1.93 2003/05/28 15:44:43 rschmidt - * Added check for chip Id on WOL WA for chip Rev. A. - * Added setting of GILevel in SkGeDeInit(). - * Minor changes to avoid LINT warnings. - * Editorial changes. - * - * Revision 1.92 2003/05/13 17:42:26 mkarl - * Added SK_FAR for PXE. - * Separated code pathes not used for SLIM driver to reduce code size. - * Removed calls to I2C for SLIM driver. - * Removed currently unused function SkGeLoadLnkSyncCnt. - * Editorial changes. - * - * Revision 1.91 2003/05/06 12:21:48 rschmidt - * Added use of pAC->GIni.GIYukon for selection of YUKON branches. - * Added defines around GENESIS resp. YUKON branches to reduce - * code size for PXE. - * Editorial changes. - * - * Revision 1.90 2003/04/28 09:12:20 rschmidt - * Added init for GIValIrqMask (common IRQ mask). - * Disabled HW Error IRQ on Yukon if sensor IRQ is set in SkGeInit1() - * by changing the common mask stored in GIValIrqMask. - * Editorial changes. - * - * Revision 1.89 2003/04/10 14:33:10 rschmidt - * Fixed alignement error of patchable configuration parameter - * in struct OemConfig caused by length of recognition string. - * - * Revision 1.88 2003/04/09 12:59:45 rschmidt - * Added define around initialization of patchable OEM specific - * configuration parameter. - * - * Revision 1.87 2003/04/08 16:46:13 rschmidt - * Added configuration variable for OEMs and initialization for - * GILedBlinkCtrl (LED Blink Control). - * Improved detection for YUKON-Lite Rev. A1. - * Editorial changes. - * - * Revision 1.86 2003/03/31 06:53:13 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.85 2003/02/05 15:30:33 rschmidt - * Corrected setting of GIHstClkFact (Host Clock Factor) and - * GIPollTimerVal (Descr. Poll Timer Init Value) for YUKON. - * Editorial changes. - * - * Revision 1.84 2003/01/28 09:57:25 rschmidt - * Added detection of YUKON-Lite Rev. A0 (stored in GIYukonLite). - * Disabled Rx GMAC FIFO Flush for YUKON-Lite Rev. A0. - * Added support for CLK_RUN (YUKON-Lite). - * Added additional check of PME from D3cold for setting GIVauxAvail. - * Editorial changes. - * - * Revision 1.83 2002/12/17 16:15:41 rschmidt - * Added default setting of PhyType (Copper) for YUKON. - * Added define around check for HW self test results. - * Editorial changes. - * - * Revision 1.82 2002/12/05 13:40:21 rschmidt - * Added setting of Rx GMAC FIFO Flush Mask register. - * Corrected PhyType with new define SK_PHY_MARV_FIBER when - * YUKON Fiber board was found. - * Editorial changes. - * - * Revision 1.81 2002/11/15 12:48:35 rschmidt - * Replaced message SKERR_HWI_E018 with SKERR_HWI_E024 for Rx queue error - * in SkGeStopPort(). - * Added init for pAC->GIni.GIGenesis with SK_FALSE in YUKON-branch. - * Editorial changes. - * - * Revision 1.80 2002/11/12 17:28:30 rschmidt - * Initialized GIPciSlot64 and GIPciClock66 in SkGeInit1(). - * Reduced PCI FIFO watermarks for 32bit/33MHz bus in SkGeInitBmu(). - * Editorial changes. - * - * Revision 1.79 2002/10/21 09:31:02 mkarl - * Changed SkGeInitAssignRamToQueues(), removed call to - * SkGeInitAssignRamToQueues in SkGeInit1 and fixed compiler warning in - * SkGeInit1. - * - * Revision 1.78 2002/10/16 15:55:07 mkarl - * Fixed a bug in SkGeInitAssignRamToQueues. - * - * Revision 1.77 2002/10/14 15:07:22 rschmidt - * Corrected timeout handling for Rx queue in SkGeStopPort() (#10748) - * Editorial changes. - * - * Revision 1.76 2002/10/11 09:24:38 mkarl - * Added check for HW self test results. - * - * Revision 1.75 2002/10/09 16:56:44 mkarl - * Now call SkGeInitAssignRamToQueues() in Init Level 1 in order to assign - * the adapter memory to the queues. This default assignment is not suitable - * for dual net mode. - * - * Revision 1.74 2002/09/12 08:45:06 rwahl - * Set defaults for PMSCap, PLinkSpeed & PLinkSpeedCap dependent on PHY. - * - * Revision 1.73 2002/08/16 15:19:45 rschmidt - * Corrected check for Tx queues in SkGeCheckQSize(). - * Added init for new entry GIGenesis and GICopperType - * Replaced all if(GIChipId == CHIP_ID_GENESIS) with new entry GIGenesis. - * Replaced wrong 1st para pAC with IoC in SK_IN/OUT macros. - * - * Revision 1.72 2002/08/12 13:38:55 rschmidt - * Added check if VAUX is available (stored in GIVauxAvail) - * Initialized PLinkSpeedCap in Port struct with SK_LSPEED_CAP_1000MBPS - * Editorial changes. - * - * Revision 1.71 2002/08/08 16:32:58 rschmidt - * Added check for Tx queues in SkGeCheckQSize(). - * Added start of Time Stamp Timer (YUKON) in SkGeInit2(). - * Editorial changes. - * - * Revision 1.70 2002/07/23 16:04:26 rschmidt - * Added init for GIWolOffs (HW-Bug in YUKON 1st rev.) - * Minor changes - * - * Revision 1.69 2002/07/17 17:07:08 rwahl - * - SkGeInit1(): fixed PHY type debug output; corrected init of GIFunc - * table & GIMacType. - * - Editorial changes. - * - * Revision 1.68 2002/07/15 18:38:31 rwahl - * Added initialization for MAC type dependent function table. - * - * Revision 1.67 2002/07/15 15:45:39 rschmidt - * Added Tx Store & Forward for YUKON (GMAC Tx FIFO is only 1 kB) - * Replaced SK_PHY_MARV by SK_PHY_MARV_COPPER - * Editorial changes - * - * Revision 1.66 2002/06/10 09:35:08 rschmidt - * Replaced C++ comments (//) - * Editorial changes - * - * Revision 1.65 2002/06/05 08:33:37 rschmidt - * Changed GIRamSize and Reset sequence for YUKON. - * SkMacInit() replaced by SkXmInitMac() resp. SkGmInitMac() - * - * Revision 1.64 2002/04/25 13:03:20 rschmidt - * Changes for handling YUKON. - * Removed reference to xmac_ii.h (not necessary). - * Moved all defines into header file. - * Replaced all SkXm...() functions with SkMac...() to handle also - * YUKON's GMAC. - * Added handling for GMAC FIFO in SkGeInitMacFifo(), SkGeStopPort(). - * Removed 'goto'-directive from SkGeCfgSync(), SkGeCheckQSize(). - * Replaced all XMAC-access macros by functions: SkMacRxTxDisable(), - * SkMacFlushTxFifo(). - * Optimized timeout handling in SkGeStopPort(). - * Initialized PLinkSpeed in Port struct with SK_LSPEED_AUTO. - * Release of GMAC Link Control reset in SkGeInit1(). - * Initialized GIChipId and GIChipRev in GE Init structure. - * Added GIRamSize and PhyType values for YUKON. - * Removed use of PRxCmd to setup XMAC. - * Moved setting of XM_RX_DIS_CEXT to SkXmInitMac(). - * Use of SkGeXmitLED() only for GENESIS. - * Changes for V-CPU support. - * Editorial changes. - * - * Revision 1.63 2001/04/05 11:02:09 rassmann - * Stop Port check of the STOP bit did not take 2/18 sec as wanted. - * - * Revision 1.62 2001/02/07 07:54:21 rassmann - * Corrected copyright. - * - * Revision 1.61 2001/01/31 15:31:40 gklug - * fix: problem with autosensing an SR8800 switch - * - * Revision 1.60 2000/10/18 12:22:21 cgoos - * Added workaround for half duplex hangup. - * - * Revision 1.59 2000/10/10 11:22:06 gklug - * add: in manual half duplex mode ignore carrier extension errors - * - * Revision 1.58 2000/10/02 14:10:27 rassmann - * Reading BCOM PHY after releasing reset until it returns a valid value. - * - * Revision 1.57 2000/08/03 14:55:28 rassmann - * Waiting for I2C to be ready before de-initializing adapter - * (prevents sensors from hanging up). - * - * Revision 1.56 2000/07/27 12:16:48 gklug - * fix: Stop Port check of the STOP bit does now take 2/18 sec as wanted - * - * Revision 1.55 1999/11/22 13:32:26 cgoos - * Changed license header to GPL. - * - * Revision 1.54 1999/10/26 07:32:54 malthoff - * Initialize PHWLinkUp with SK_FALSE. Required for Diagnostics. - * - * Revision 1.53 1999/08/12 19:13:50 malthoff - * Fix for 1000BT. Do not owerwrite XM_MMU_CMD when - * disabling receiver and transmitter. Other bits - * may be lost. - * - * Revision 1.52 1999/07/01 09:29:54 gklug - * fix: DoInitRamQueue needs pAC - * - * Revision 1.51 1999/07/01 08:42:21 gklug - * chg: use Store & forward for RAM buffer when Jumbos are used - * - * Revision 1.50 1999/05/27 13:19:38 cgoos - * Added Tx PCI watermark initialization. - * Removed Tx RAM queue Store & Forward setting. - * - * Revision 1.49 1999/05/20 14:32:45 malthoff - * SkGeLinkLED() is completly removed now. - * - * Revision 1.48 1999/05/19 07:28:24 cgoos - * SkGeLinkLED no more available for drivers. - * Changes for 1000Base-T. - * - * Revision 1.47 1999/04/08 13:57:45 gklug - * add: Init of new port struct fiels PLinkResCt - * chg: StopPort Timer check - * - * Revision 1.46 1999/03/25 07:42:15 malthoff - * SkGeStopPort(): Add workaround for cache incoherency. - * Create error log entry, disable port, and - * exit loop if it does not terminate. - * Add XM_RX_LENERR_OK to the default value for the - * XMAC receive command register. - * - * Revision 1.45 1999/03/12 16:24:47 malthoff - * Remove PPollRxD and PPollTxD. - * Add check for GIPollTimerVal. - * - * Revision 1.44 1999/03/12 13:40:23 malthoff - * Fix: SkGeXmitLED(), SK_LED_TST mode does not work. - * Add: Jumbo frame support. - * Chg: Resolution of parameter IntTime in SkGeCfgSync(). - * - * Revision 1.43 1999/02/09 10:29:46 malthoff - * Bugfix: The previous modification again also for the second location. - * - * Revision 1.42 1999/02/09 09:35:16 malthoff - * Bugfix: The bits '66 MHz Capable' and 'NEWCAP are reset while - * clearing the error bits in the PCI status register. - * - * Revision 1.41 1999/01/18 13:07:02 malthoff - * Bugfix: Do not use CFG cycles after during Init- or Runtime, because - * they may not be available after Boottime. - * - * Revision 1.40 1999/01/11 12:40:49 malthoff - * Bug fix: PCI_STATUS: clearing error bits sets the UDF bit. - * - * Revision 1.39 1998/12/11 15:17:33 gklug - * chg: Init LipaAutoNeg with Unknown - * - * Revision 1.38 1998/12/10 11:02:57 malthoff - * Disable Error Log Message when calling SkGeInit(level 2) - * more than once. - * - * Revision 1.37 1998/12/07 12:18:25 gklug - * add: refinement of autosense mode: take into account the autoneg cap of LiPa - * - * Revision 1.36 1998/12/07 07:10:39 gklug - * fix: init values of LinkBroken/ Capabilities for management - * - * Revision 1.35 1998/12/02 10:56:20 gklug - * fix: do NOT init LoinkSync Counter. - * - * Revision 1.34 1998/12/01 10:53:21 gklug - * add: init of additional Counters for workaround - * - * Revision 1.33 1998/12/01 10:00:49 gklug - * add: init PIsave var in Port struct - * - * Revision 1.32 1998/11/26 14:50:40 gklug - * chg: Default is autosensing with AUTOFULL mode - * - * Revision 1.31 1998/11/25 15:36:16 gklug - * fix: do NOT stop LED Timer when port should be stopped - * - * Revision 1.30 1998/11/24 13:15:28 gklug - * add: Init PCkeckPar struct member - * - * Revision 1.29 1998/11/18 13:19:27 malthoff - * Disable packet arbiter timeouts on receive side. - * Use maximum timeout value for packet arbiter - * transmit timeouts. - * Add TestStopBit() function to handle stop RX/TX - * problem with active descriptor poll timers. - * Bug Fix: Descriptor Poll Timer not started, because - * GIPollTimerVal was initialized with 0. - * - * Revision 1.28 1998/11/13 14:24:26 malthoff - * Bug Fix: SkGeStopPort() may hang if a Packet Arbiter Timout - * is pending or occurs while waiting for TX_STOP and RX_STOP. - * The PA timeout is cleared now while waiting for TX- or RX_STOP. - * - * Revision 1.27 1998/11/02 11:04:36 malthoff - * fix the last fix - * - * Revision 1.26 1998/11/02 10:37:03 malthoff - * Fix: SkGePollTxD() enables always the synchronounous poll timer. - * - * Revision 1.25 1998/10/28 07:12:43 cgoos - * Fixed "LED_STOP" in SkGeLnkSyncCnt, "== SK_INIT_IO" in SkGeInit. - * Removed: Reset of RAM Interface in SkGeStopPort. - * - * Revision 1.24 1998/10/27 08:13:12 malthoff - * Remove temporary code. - * - * Revision 1.23 1998/10/26 07:45:03 malthoff - * Add Address Calculation Workaround: If the EPROM byte - * Id is 3, the address offset is 512 kB. - * Initialize default values for PLinkMode and PFlowCtrlMode. - * - * Revision 1.22 1998/10/22 09:46:47 gklug - * fix SysKonnectFileId typo - * - * Revision 1.21 1998/10/20 12:11:56 malthoff - * Don't dendy the Queue config if the size of the unused - * Rx qeueu is zero. - * - * Revision 1.20 1998/10/19 07:27:58 malthoff - * SkGeInitRamIface() is public to be called by diagnostics. - * - * Revision 1.19 1998/10/16 13:33:45 malthoff - * Fix: enabling descriptor polling is not allowed until - * the descriptor addresses are set. Descriptor polling - * must be handled by the driver. - * - * Revision 1.18 1998/10/16 10:58:27 malthoff - * Remove temp. code for Diag prototype. - * Remove lint warning for dummy reads. - * Call SkGeLoadLnkSyncCnt() during SkGeInitPort(). - * - * Revision 1.17 1998/10/14 09:16:06 malthoff - * Change parameter LimCount and programming of - * the limit counter in SkGeCfgSync(). - * - * Revision 1.16 1998/10/13 09:21:16 malthoff - * Don't set XM_RX_SELF_RX in RxCmd Reg, because it's - * like a Loopback Mode in half duplex. - * - * Revision 1.15 1998/10/09 06:47:40 malthoff - * SkGeInitMacArb(): set recovery counters init value - * to zero although this counters are not uesd. - * Bug fix in Rx Upper/Lower Pause Threshold calculation. - * Add XM_RX_SELF_RX to RxCmd. - * - * Revision 1.14 1998/10/06 15:15:53 malthoff - * Make sure no pending IRQ is cleared in SkGeLoadLnkSyncCnt(). - * - * Revision 1.13 1998/10/06 14:09:36 malthoff - * Add SkGeLoadLnkSyncCnt(). Modify - * the 'port stopped' condition according - * to the current problem report. - * - * Revision 1.12 1998/10/05 08:17:21 malthoff - * Add functions: SkGePollRxD(), SkGePollTxD(), - * DoCalcAddr(), SkGeCheckQSize(), - * DoInitRamQueue(), and SkGeCfgSync(). - * Add coding for SkGeInitMacArb(), SkGeInitPktArb(), - * SkGeInitMacFifo(), SkGeInitRamBufs(), - * SkGeInitRamIface(), and SkGeInitBmu(). - * - * Revision 1.11 1998/09/29 08:26:29 malthoff - * bug fix: SkGeInit0() 'i' should be increment. - * - * Revision 1.10 1998/09/28 13:19:01 malthoff - * Coding time: Save the done work. - * Modify SkGeLinkLED(), add SkGeXmitLED(), - * define SkGeCheckQSize(), SkGeInitMacArb(), - * SkGeInitPktArb(), SkGeInitMacFifo(), - * SkGeInitRamBufs(), SkGeInitRamIface(), - * and SkGeInitBmu(). Do coding for SkGeStopPort(), - * SkGeInit1(), SkGeInit2(), and SkGeInit3(). - * Do coding for SkGeDinit() and SkGeInitPort(). - * - * Revision 1.9 1998/09/16 14:29:05 malthoff - * Some minor changes. - * - * Revision 1.8 1998/09/11 05:29:14 gklug - * add: init state of a port - * - * Revision 1.7 1998/09/04 09:26:25 malthoff - * Short temporary modification. - * - * Revision 1.6 1998/09/04 08:27:59 malthoff - * Remark the do-while in StopPort() because it never ends - * without a GE adapter. - * - * Revision 1.5 1998/09/03 14:05:45 malthoff - * Change comment for SkGeInitPort(). Do not - * repair the queue sizes if invalid. - * - * Revision 1.4 1998/09/03 10:03:19 malthoff - * Implement the new interface according to the - * reviewed interface specification. - * - * Revision 1.3 1998/08/19 09:11:25 gklug - * fix: struct are removed from c-source (see CCC) - * - * Revision 1.2 1998/07/28 12:33:58 malthoff - * Add 'IoC' parameter in function declaration and SK IO macros. - * - * Revision 1.1 1998/07/23 09:48:57 malthoff - * Creation. First dummy 'C' file. - * SkGeInit(Level 0) is card_start for GE. - * SkGeDeInit() is card_stop for GE. - * - * - ******************************************************************************/ #include "h/skdrv1st.h" #include "h/skdrv2nd.h" diff -Nru a/drivers/net/sk98lin/skgemib.c b/drivers/net/sk98lin/skgemib.c --- a/drivers/net/sk98lin/skgemib.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/skgemib.c Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skgemib.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.11 $ - * Date: $Date: 2003/09/15 13:38:12 $ * Purpose: Private Network Management Interface Management Database * ****************************************************************************/ @@ -21,54 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/***************************************************************************** - * - * History: - * - * $Log: skgemib.c,v $ - * Revision 1.11 2003/09/15 13:38:12 tschilli - * OID_SKGE_PHY_LP_MODE included only after using #define SK_PHY_LP_MODE. - * - * Revision 1.10 2003/08/15 12:28:59 tschilli - * Added new OIDs: - * OID_SKGE_DRIVER_RELDATE - * OID_SKGE_DRIVER_FILENAME - * OID_SKGE_CHIPID - * OID_SKGE_RAMSIZE - * OID_SKGE_VAUXAVAIL - * OID_SKGE_PHY_TYPE - * OID_SKGE_PHY_LP_MODE - * - * Revision 1.9 2003/05/23 12:55:20 tschilli - * OID_SKGE_BOARDLEVEL added. - * - * Revision 1.8 2003/03/27 11:19:15 tschilli - * Copyright messages changed. - * - * Revision 1.7 2002/12/16 09:04:34 tschilli - * Code for VCT handling added. - * - * Revision 1.6 2002/08/09 15:40:21 rwahl - * Editorial change (renamed ConfSpeedCap). - * - * Revision 1.5 2002/08/09 11:05:34 rwahl - * Added oid handling for link speed cap. - * - * Revision 1.4 2002/08/09 09:40:27 rwahl - * Added support for NDIS OID_PNP_xxx. - * - * Revision 1.3 2002/07/17 19:39:54 rwahl - * Added handler for OID_SKGE_SPEED_MODE & OID_SKGE_SPEED_STATUS. - * - * Revision 1.2 2002/05/22 08:59:00 rwahl - * - static functions only for release build. - * - Source file must be included. - * - * Revision 1.1 2002/05/22 08:12:42 rwahl - * Initial version. - * - ****************************************************************************/ /* * PRIVATE OID handler function prototypes diff -Nru a/drivers/net/sk98lin/skgepnmi.c b/drivers/net/sk98lin/skgepnmi.c --- a/drivers/net/sk98lin/skgepnmi.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/skgepnmi.c Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skgepnmi.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.111 $ - * Date: $Date: 2003/09/15 13:35:35 $ * Purpose: Private Network Management Interface * ****************************************************************************/ @@ -21,469 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/***************************************************************************** - * - * History: - * - * $Log: skgepnmi.c,v $ - * Revision 1.111 2003/09/15 13:35:35 tschilli - * Code for OID_SKGE_PHY_LP_MODE completed (using #define SK_PHY_LP_MODE). - * SK_DIAG_ATTACHED handling for OID_SKGE_DIAG_MODE in DiagActions() changed. - * - * Revision 1.110 2003/08/15 12:28:04 tschilli - * Added new OIDs: - * OID_SKGE_DRIVER_RELDATE - * OID_SKGE_DRIVER_FILENAME - * OID_SKGE_CHIPID - * OID_SKGE_RAMSIZE - * OID_SKGE_VAUXAVAIL - * OID_SKGE_PHY_TYPE - * OID_SKGE_PHY_LP_MODE - * - * Added SK_DIAG_ATTACHED handling for OID_SKGE_DIAG_MODE in DiagActions(). - * - * Revision 1.109 2003/07/17 14:15:24 tschilli - * Bug in SkPnmiGenIoctl() fixed. - * - * Revision 1.108 2003/05/27 07:10:11 tschilli - * Bug in SkPnmiGenIoctl() fixed. - * - * Revision 1.107 2003/05/23 13:01:10 tschilli - * Code for DIAG support added (#define SK_DIAG_SUPPORT). - * Code for generic PNMI IOCTL support added. The new function - * SkPnmiGenIoctl() is used for this purpose. - * Handling of OID_SKGE_BOARDLEVEL added. - * Incorrect buffer size handling of OID_SKGE_MTU during GET action fixed. - * Return code handling in PowerManagement() fixed. - * Editorial changes. - * - * Revision 1.106 2003/04/10 14:47:31 rschmidt - * Fixed handling for OID_GEN_RCV_OK and OID_GEN_XMIT_OK for YUKON's GMAC - * in GetPhysStatVal(). - * Replaced macro PHY_READ() with function call SkXmPhyRead(). - * Made optimisations for readability and code size. - * Editorial changes. - * - * Revision 1.105 2003/04/09 12:51:32 rschmidt - * Fixed XMAC only handling for some events in SkPnmiEvent(). - * Fixed return value for OID_GEN_RCV_OK (SK_PNMI_HRX) in GetPhysStatVal(). - * Editorial changes. - * - * Revision 1.104 2003/03/27 11:18:21 tschilli - * BRK statements from DEBUG code removed. - * OID_GEN_XMIT_OK and OID_GEN_RCV_OK work with Yukon now. - * Copyright messages changed. - * - * Revision 1.103 2002/12/20 09:57:13 tschilli - * SK_PNMI_EVT_VCT_RESET event code changed. - * Unused variable from Vct() removed. - * - * Revision 1.102 2002/12/16 14:03:24 tschilli - * VCT code in Vct() changed. - * - * Revision 1.101 2002/12/16 09:04:10 tschilli - * Code for VCT handling added. - * - * Revision 1.100 2002/09/26 14:28:13 tschilli - * For XMAC the values in the SK_PNMI_PORT Port struct are copied to - * the new SK_PNMI_PORT BufPort struct during a MacUpdate() call. - * These values are used when GetPhysStatVal() is called. With this - * mechanism you get the best results when software corrections for - * counters are needed. Example: RX_LONGFRAMES. - * - * Revision 1.99 2002/09/17 12:31:19 tschilli - * OID_SKGE_TX_HW_ERROR_CTS, OID_SKGE_OUT_ERROR_CTS, OID_GEN_XMIT_ERROR: - * Double count of SK_PNMI_HTX_EXCESS_COL in function General() removed. - * OID_PNP_CAPABILITIES: sizeof(SK_PM_WAKE_UP_CAPABILITIES) changed to - * sizeof(SK_PNP_CAPABILITIES) in function PowerManagement(). - * - * Revision 1.98 2002/09/10 09:00:03 rwahl - * Adapted boolean definitions according sktypes. - * - * Revision 1.97 2002/09/05 15:07:03 rwahl - * Editorial changes. - * - * Revision 1.96 2002/09/05 11:04:14 rwahl - * - Rx/Tx packets statistics of virtual port were zero on link down (#10750) - * - For GMAC the overflow IRQ for Rx longframe counter was not counted. - * - Incorrect calculation for oids OID_SKGE_RX_HW_ERROR_CTS, - * OID_SKGE_IN_ERRORS_CTS, OID_GEN_RCV_ERROR. - * - Moved correction for OID_SKGE_STAT_RX_TOO_LONG to GetPhysStatVal(). - * - Editorial changes. - * - * Revision 1.95 2002/09/04 08:53:37 rwahl - * - Incorrect statistics for Rx_too_long counter with jumbo frame (#10751) - * - StatRxFrameTooLong & StatRxPMaccErr counters were not reset. - * - Fixed compiler warning for debug msg arg types. - * - * Revision 1.94 2002/08/09 15:42:14 rwahl - * - Fixed StatAddr table for GMAC. - * - VirtualConf(): returned indeterminated status for speed oids if no - * active port. - * - * Revision 1.93 2002/08/09 11:04:59 rwahl - * Added handler for link speed caps. - * - * Revision 1.92 2002/08/09 09:43:03 rwahl - * - Added handler for NDIS OID_PNP_xxx ids. - * - * Revision 1.91 2002/07/17 19:53:03 rwahl - * - Added StatOvrflwBit table for XMAC & GMAC. - * - Extended StatAddr table for GMAC. Added check of number of counters - * in enumeration and size of StatAddr table on init level. - * - Added use of GIFunc table. - * - ChipSet is not static anymore, - * - Extended SIRQ event handler for both mac types. - * - Fixed rx short counter bug (#10620) - * - Added handler for oids SKGE_SPEED_MODE & SKGE_SPEED_STATUS. - * - Extended GetPhysStatVal() for GMAC. - * - Editorial changes. - * - * Revision 1.90 2002/05/22 08:56:25 rwahl - * - Moved OID table to separate source file. - * - Fix: TX_DEFFERAL counter incremented in full-duplex mode. - * - Use string definitions for error msgs. - * - * Revision 1.89 2001/09/18 10:01:30 mkunz - * some OID's fixed for dualnetmode - * - * Revision 1.88 2001/08/02 07:58:08 rwahl - * - Fixed NetIndex to csum module at ResetCounter(). - * - * Revision 1.87 2001/04/06 13:35:09 mkunz - * -Bugs fixed in handling of OID_SKGE_MTU and the VPD OID's - * - * Revision 1.86 2001/03/09 09:18:03 mkunz - * Changes in SK_DBG_MSG - * - * Revision 1.85 2001/03/08 09:37:31 mkunz - * Bugfix in ResetCounter for Pnmi.Port structure - * - * Revision 1.84 2001/03/06 09:04:55 mkunz - * Made some changes in instance calculation - * - * Revision 1.83 2001/02/15 09:15:32 mkunz - * Necessary changes for dual net mode added - * - * Revision 1.82 2001/02/07 08:24:19 mkunz - * -Made changes in handling of OID_SKGE_MTU - * - * Revision 1.81 2001/02/06 09:58:00 mkunz - * -Vpd bug fixed - * -OID_SKGE_MTU added - * -pnmi support for dual net mode. Interface function and macros extended - * - * Revision 1.80 2001/01/22 13:41:35 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.79 2000/12/05 14:57:40 cgoos - * SetStruct failed before first Link Up (link mode of virtual - * port "INDETERMINATED"). - * - * Revision 1.78 2000/09/12 10:44:58 cgoos - * Fixed SK_PNMI_STORE_U32 calls with typecasted argument. - * - * Revision 1.77 2000/09/07 08:10:19 rwahl - * - Modified algorithm for 64bit NDIS statistic counters; - * returns 64bit or 32bit value depending on passed buffer - * size. Indicate capability for 64bit NDIS counter, if passed - * buffer size is zero. OID_GEN_XMIT_ERROR, OID_GEN_RCV_ERROR, - * and OID_GEN_RCV_NO_BUFFER handled as 64bit counter, too. - * - corrected OID_SKGE_RLMT_PORT_PREFERRED. - * - * Revision 1.76 2000/08/03 15:23:39 rwahl - * - Correction for FrameTooLong counter has to be moved to OID handling - * routines (instead of statistic counter routine). - * - Fix in XMAC Reset Event handling: Only offset counter for hardware - * statistic registers are updated. - * - * Revision 1.75 2000/08/01 16:46:05 rwahl - * - Added StatRxLongFrames counter and correction of FrameTooLong counter. - * - Added directive to control width (default = 32bit) of NDIS statistic - * counters (SK_NDIS_64BIT_CTR). - * - * Revision 1.74 2000/07/04 11:41:53 rwahl - * - Added volition connector type. - * - * Revision 1.73 2000/03/15 16:33:10 rwahl - * Fixed bug 10510; wrong reset of virtual port statistic counters. - * - * Revision 1.72 1999/12/06 16:15:53 rwahl - * Fixed problem of instance range for current and factory MAC address. - * - * Revision 1.71 1999/12/06 10:14:20 rwahl - * Fixed bug 10476; set operation for PHY_OPERATION_MODE. - * - * Revision 1.70 1999/11/22 13:33:34 cgoos - * Changed license header to GPL. - * - * Revision 1.69 1999/10/18 11:42:15 rwahl - * Added typecasts for checking event dependent param (debug only). - * - * Revision 1.68 1999/10/06 09:35:59 cgoos - * Added state check to PHY_READ call (hanged if called during startup). - * - * Revision 1.67 1999/09/22 09:53:20 rwahl - * - Read Broadcom register for updating FCS error counter (1000Base-T). - * - * Revision 1.66 1999/08/26 13:47:56 rwahl - * Added SK_DRIVER_SENDEVENT when queueing RLMT_CHANGE_THRES trap. - * - * Revision 1.65 1999/07/26 07:49:35 cgoos - * Added two typecasts to avoid compiler warnings. - * - * Revision 1.64 1999/05/20 09:24:12 cgoos - * Changes for 1000Base-T (sensors, Master/Slave). - * - * Revision 1.63 1999/04/13 15:11:58 mhaveman - * Moved include of rlmt.h to header skgepnmi.h because some macros - * are needed there. - * - * Revision 1.62 1999/04/13 15:08:07 mhaveman - * Replaced again SK_RLMT_CHECK_LINK with SK_PNMI_RLMT_MODE_CHK_LINK - * to grant unified interface by only using the PNMI header file. - * SK_PNMI_RLMT_MODE_CHK_LINK is defined the same as SK_RLMT_CHECK_LINK. - * - * Revision 1.61 1999/04/13 15:02:48 mhaveman - * Changes caused by review: - * -Changed some comments - * -Removed redundant check for OID_SKGE_PHYS_FAC_ADDR - * -Optimized PRESET check. - * -Meaning of error SK_ADDR_DUPLICATE_ADDRESS changed. Set of same - * address will now not cause this error. Removed corresponding check. - * - * Revision 1.60 1999/03/23 10:41:23 mhaveman - * Added comments. - * - * Revision 1.59 1999/02/19 08:01:28 mhaveman - * Fixed bug 10372 that after counter reset all ports were displayed - * as inactive. - * - * Revision 1.58 1999/02/16 18:04:47 mhaveman - * Fixed problem of twisted OIDs SENSOR_WAR_TIME and SENSOR_ERR_TIME. - * - * Revision 1.56 1999/01/27 12:29:11 mhaveman - * SkTimerStart was called with time value in milli seconds but needs - * micro seconds. - * - * Revision 1.55 1999/01/25 15:00:38 mhaveman - * Added support to allow multiple ports to be active. If this feature in - * future will be used, the Management Data Base variables PORT_ACTIVE - * and PORT_PREFERED should be moved to the port specific part of RLMT. - * Currently they return the values of the first active physical port - * found. A set to the virtual port will actually change all active - * physical ports. A get returns the melted values of all active physical - * ports. If the port values differ a return value INDETERMINATED will - * be returned. This effects especially the CONF group. - * - * Revision 1.54 1999/01/19 10:10:22 mhaveman - * -Fixed bug 10354: Counter values of virtual port were wrong after port - * switches - * -Added check if a switch to the same port is notified. - * - * Revision 1.53 1999/01/07 09:25:21 mhaveman - * Forgot to initialize a variable. - * - * Revision 1.52 1999/01/05 10:34:33 mhaveman - * Fixed little error in RlmtChangeEstimate calculation. - * - * Revision 1.51 1999/01/05 09:59:07 mhaveman - * -Moved timer start to init level 2 - * -Redesigned port switch average calculation to avoid 64bit - * arithmetic. - * - * Revision 1.50 1998/12/10 15:13:59 mhaveman - * -Fixed: PHYS_CUR_ADDR returned wrong addresses - * -Fixed: RLMT_PORT_PREFERED and RLMT_CHANGE_THRES preset returned - * always BAD_VALUE. - * -Fixed: TRAP buffer seemed to sometimes suddenly empty - * - * Revision 1.49 1998/12/09 16:17:07 mhaveman - * Fixed: Couldnot delete VPD keys on UNIX. - * - * Revision 1.48 1998/12/09 14:11:10 mhaveman - * -Add: Debugmessage for XMAC_RESET supressed to minimize output. - * -Fixed: RlmtChangeThreshold will now be initialized. - * -Fixed: VPD_ENTRIES_LIST extended value with unnecessary space char. - * -Fixed: On VPD key creation an invalid key name could be created - * (e.g. A5) - * -Some minor changes in comments and code. - * - * Revision 1.47 1998/12/08 16:00:31 mhaveman - * -Fixed: For RLMT_PORT_ACTIVE will now be returned a 0 if no port - * is active. - * -Fixed: For the RLMT statistics group only the last value was - * returned and the rest of the buffer was filled with 0xff - * -Fixed: Mysteriously the preset on RLMT_MODE still returned - * BAD_VALUE. - * Revision 1.46 1998/12/08 10:04:56 mhaveman - * -Fixed: Preset on RLMT_MODE returned always BAD_VALUE error. - * -Fixed: Alignment error in GetStruct - * -Fixed: If for Get/Preset/SetStruct the buffer size is equal or - * larger than SK_PNMI_MIN_STRUCT_SIZE the return value is stored - * to the buffer. In this case the caller should always return - * ok to its upper routines. Only if the buffer size is less - * than SK_PNMI_MIN_STRUCT_SIZE and the return value is unequal - * to 0, an error should be returned by the caller. - * -Fixed: Wrong number of instances with RLMT statistic. - * -Fixed: Return now SK_LMODE_STAT_UNKNOWN if the LinkModeStatus is 0. - * - * Revision 1.45 1998/12/03 17:17:24 mhaveman - * -Removed for VPD create action the buffer size limitation to 4 bytes. - * -Pass now physical/active physical port to ADDR for CUR_ADDR set - * - * Revision 1.44 1998/12/03 15:14:35 mhaveman - * Another change to Vpd instance evaluation. - * - * Revision 1.43 1998/12/03 14:18:10 mhaveman - * -Fixed problem in PnmiSetStruct. It was impossible to set any value. - * -Removed VPD key evaluation for VPD_FREE_BYTES and VPD_ACTION. - * - * Revision 1.42 1998/12/03 11:31:47 mhaveman - * Inserted cast to satisfy lint. - * - * Revision 1.41 1998/12/03 11:28:16 mhaveman - * Removed SK_PNMI_CHECKPTR - * - * Revision 1.40 1998/12/03 11:19:07 mhaveman - * Fixed problems - * -A set to virtual port will now be ignored. A set with broadcast - * address to any port will be ignored. - * -GetStruct function made VPD instance calculation wrong. - * -Prefered port returned -1 instead of 0. - * - * Revision 1.39 1998/11/26 15:30:29 mhaveman - * Added sense mode to link mode. - * - * Revision 1.38 1998/11/23 15:34:00 mhaveman - * -Fixed bug for RX counters. On an RX overflow interrupt the high - * words of all RX counters were incremented. - * -SET operations on FLOWCTRL_MODE and LINK_MODE accept now the - * value 0, which has no effect. It is usefull for multiple instance - * SETs. - * - * Revision 1.37 1998/11/20 08:02:04 mhaveman - * -Fixed: Ports were compared with MAX_SENSORS - * -Fixed: Crash in GetTrapEntry with MEMSET macro - * -Fixed: Conversions between physical, logical port index and instance - * - * Revision 1.36 1998/11/16 07:48:53 mhaveman - * Casted SK_DRIVER_SENDEVENT with (void) to eleminate compiler warnings - * on Solaris. - * - * Revision 1.35 1998/11/16 07:45:34 mhaveman - * SkAddrOverride now returns value and will be checked. - * - * Revision 1.34 1998/11/10 13:40:37 mhaveman - * Needed to change interface, because NT driver needs a return value - * of needed buffer space on TOO_SHORT errors. Therefore all - * SkPnmiGet/Preset/Set functions now have a pointer to the length - * parameter, where the needed space on error is returned. - * - * Revision 1.33 1998/11/03 13:52:46 mhaveman - * Made file lint conform. - * - * Revision 1.32 1998/11/03 13:19:07 mhaveman - * The events SK_HWEV_SET_LMODE and SK_HWEV_SET_FLOWMODE pass now in - * Para32[0] the physical MAC index and in Para32[1] the new mode. - * - * Revision 1.31 1998/11/03 12:30:40 gklug - * fix: compiler warning memset - * - * Revision 1.30 1998/11/03 12:04:46 mhaveman - * Fixed problem in SENSOR_VALUE, which wrote beyond the buffer end - * Fixed alignment problem with CHIPSET. - * - * Revision 1.29 1998/11/02 11:23:54 mhaveman - * Corrected SK_ERROR_LOG to SK_ERR_LOG. Sorry. - * - * Revision 1.28 1998/11/02 10:47:16 mhaveman - * Added syslog messages for internal errors. - * - * Revision 1.27 1998/10/30 15:48:06 mhaveman - * Fixed problems after simulation of SK_PNMI_EVT_CHG_EST_TIMER and - * RlmtChangeThreshold calculation. - * - * Revision 1.26 1998/10/29 15:36:55 mhaveman - * -Fixed bug in trap buffer handling. - * -OID_SKGE_DRIVER_DESCR, OID_SKGE_DRIVER_VERSION, OID_SKGE_HW_DESCR, - * OID_SKGE_HW_VERSION, OID_SKGE_VPD_ENTRIES_LIST, OID_SKGE_VPD_KEY, - * OID_SKGE_VPD_VALUE, and OID_SKGE_SENSOR_DESCR return values with - * a leading octet before each string storing the string length. - * -Perform a RlmtUpdate during SK_PNMI_EVT_XMAC_RESET to minimize - * RlmtUpdate calls in GetStatVal. - * -Inserted SK_PNMI_CHECKFLAGS macro increase readability. - * - * Revision 1.25 1998/10/29 08:50:36 mhaveman - * Fixed problems after second event simulation. - * - * Revision 1.24 1998/10/28 08:44:37 mhaveman - * -Fixed alignment problem - * -Fixed problems during event simulation - * -Fixed sequence of error return code (INSTANCE -> ACCESS -> SHORT) - * -Changed type of parameter Instance back to SK_U32 because of VPD - * -Updated new VPD function calls - * - * Revision 1.23 1998/10/23 10:16:37 mhaveman - * Fixed bugs after buffer test simulation. - * - * Revision 1.22 1998/10/21 13:23:52 mhaveman - * -Call syntax of SkOsGetTime() changed to SkOsGetTime(pAc). - * -Changed calculation of hundrets of seconds. - * - * Revision 1.20 1998/10/20 07:30:45 mhaveman - * Made type changes to unsigned integer where possible. - * - * Revision 1.19 1998/10/19 10:51:30 mhaveman - * -Made Bug fixes after simulation run - * -Renamed RlmtMAC... to RlmtPort... - * -Marked workarounds with Errata comments - * - * Revision 1.18 1998/10/14 07:50:08 mhaveman - * -For OID_SKGE_LINK_STATUS the link down detection has moved from RLMT - * to HWACCESS. - * -Provided all MEMCPY/MEMSET macros with (char *) pointers, because - * Solaris throwed warnings when mapping to bcopy/bset. - * - * Revision 1.17 1998/10/13 07:42:01 mhaveman - * -Added OIDs OID_SKGE_TRAP_NUMBER and OID_SKGE_ALL_DATA - * -Removed old cvs history entries - * -Renamed MacNumber to PortNumber - * - * Revision 1.16 1998/10/07 10:52:49 mhaveman - * -Inserted handling of some OID_GEN_ Ids for windows - * -Fixed problem with 803.2 statistic. - * - * Revision 1.15 1998/10/01 09:16:29 mhaveman - * Added Debug messages for function call and UpdateFlag tracing. - * - * Revision 1.14 1998/09/30 13:39:09 mhaveman - * -Reduced namings of 'MAC' by replacing them with 'PORT'. - * -Completed counting of OID_SKGE_RX_HW_ERROR_CTS, - * OID_SKGE_TX_HW_ERROR_CTS, - * OID_SKGE_IN_ERRORS_CTS, and OID_SKGE_OUT_ERROR_CTS. - * -SET check for RlmtMode - * - * Revision 1.13 1998/09/28 13:13:08 mhaveman - * Hide strcmp, strlen, and strncpy behind macros SK_STRCMP, SK_STRLEN, - * and SK_STRNCPY. (Same reasons as for mem.. and MEM..) - * - * Revision 1.12 1998/09/16 08:18:36 cgoos - * Fix: XM_INxx and XM_OUTxx called with different parameter order: - * sometimes IoC,Mac,... sometimes Mac,IoC,... Now always first variant. - * Fix: inserted "Pnmi." into some pAC->pDriverDescription / Version. - * Change: memset, memcpy to makros SK_MEMSET, SK_MEMCPY - * - * Revision 1.11 1998/09/04 17:01:45 mhaveman - * Added SyncCounter as macro and OID_SKGE_.._NO_DESCR_CTS to - * OID_SKGE_RX_NO_BUF_CTS. - * - * Revision 1.10 1998/09/04 14:35:35 mhaveman - * Added macro counters, that are counted by driver. - * - ****************************************************************************/ - #ifndef _lint static const char SysKonnectFileId[] = diff -Nru a/drivers/net/sk98lin/skgesirq.c b/drivers/net/sk98lin/skgesirq.c --- a/drivers/net/sk98lin/skgesirq.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/skgesirq.c Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skgesirq.c * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.92 $ - * Date: $Date: 2003/09/16 14:37:07 $ * Purpose: Special IRQ module * ******************************************************************************/ @@ -19,374 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skgesirq.c,v $ - * Revision 1.92 2003/09/16 14:37:07 rschmidt - * Added debug messages in some SkGePortCheckUp...() routines. - * Fixed compiler warnings for different types. - * Avoided port check up in reset state (eg. coma mode). - * Editorial changes. - * - * Revision 1.91 2003/07/04 12:46:22 rschmidt - * Added debug messages in SkGePortCheckUpGmac(). - * Added error log message and new driver event SK_DRV_DOWNSHIFT_DET - * for Downshift detection (Yukon-Copper). - * Editorial changes. - * - * Revision 1.90 2003/05/28 15:35:45 rschmidt - * Added parameter AutoNeg in all SkGePortCheckUp...() to save code. - * Added setting for AutoNeg only once in SkGePortCheckUp(). - * Moved defines for return codes of SkGePortCheckUp() to header file. - * Editorial changes. - * - * Revision 1.89 2003/05/13 17:32:20 mkarl - * Removed links to RLMT and PNMI for SLIM driver (SK_SLIM). - * Separated GENESIS and YUKON only code to reduce code size. - * - * Revision 1.88 2003/05/06 13:20:34 rschmidt - * Changed workaround for Tx hang in half duplex only for Genesis. - * Replaced SkPnmiGetVar() calls for Tx Octets Counter - * with SkXmMacStatistic() in SkGeSirqIsr(). - * Added defines around GENESIS resp. YUKON branches to reduce - * code size for PXE. - * Editorial changes. - * - * Revision 1.87 2003/04/28 09:18:31 rschmidt - * Added increment for GITimeStampCnt (high dword for - * Time Stamp Timer counter), when overflow IRQ occurs. - * Disabled HW Error IRQ on 32-bit Yukon if sensor IRQ occurs - * by changing the common mask stored in GIValIrqMask. - * Changed handling for HW Error IRQ in SkGeSirqIsr(). - * Added clearing of the software forced IRQ in SkGeSirqIsr(). - * Editorial changes. - * - * Revision 1.86 2003/04/09 13:03:24 rschmidt - * Added workaround for configuration of GPHY's Auto-negotiation - * advertisement register after link down event in SkPhyIsrGmac(). - * - * Revision 1.85 2003/04/08 16:39:02 rschmidt - * Changed handling for different PhyTypes for source code - * portability to PXE, UNDI. - * Editorial changes. - * - * Revision 1.84 2003/03/31 07:01:43 mkarl - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.83 2003/02/05 15:10:59 rschmidt - * Fixed setting of PLinkSpeedUsed in SkHWLinkUp() when - * auto-negotiation is disabled. - * Editorial changes. - * - * Revision 1.82 2003/01/29 13:34:33 rschmidt - * Added some typecasts to avoid compiler warnings. - * - * Revision 1.81 2002/12/05 10:49:51 rschmidt - * Fixed missing Link Down Event for fiber (Bug Id #10768) - * Added reading of cable length when link is up - * Removed testing of unused error bits in PHY ISR - * Editorial changes. - * - * Revision 1.80 2002/11/12 17:15:21 rschmidt - * Replaced SkPnmiGetVar() by ...MacStatistic() in SkMacParity(). - * Editorial changes. - * - * Revision 1.79 2002/10/14 15:14:51 rschmidt - * Changed clearing of IS_M1_PAR_ERR (MAC 1 Parity Error) in - * SkMacParity() depending on GIChipRev (HW-Bug #8). - * Added error messages for GPHY Auto-Negotiation Error and - * FIFO Overflow/Underrun in SkPhyIsrGmac(). - * Editorial changes. - * - * Revision 1.78 2002/10/10 15:54:29 mkarl - * changes for PLinkSpeedUsed - * - * Revision 1.77 2002/09/12 08:58:51 rwahl - * Retrieve counters needed for XMAC errata workarounds directly because - * PNMI returns corrected counter values (e.g. #10620). - * - * Revision 1.76 2002/08/16 15:21:54 rschmidt - * Replaced all if(GIChipId == CHIP_ID_GENESIS) with new entry GIGenesis. - * Replaced wrong 1st para pAC with IoC in SK_IN/OUT macros. - * Editorial changes. - * - * Revision 1.75 2002/08/12 13:50:47 rschmidt - * Changed clearing of IS_M1_PAR_ERR (MAC 1 Parity Error) in - * SkMacParity() by GMF_CLI_TX_FC instead of GMF_CLI_TX_PE (HW-Bug #8). - * Added clearing of IS_IRQ_TIST_OV and IS_IRQ_SENSOR in SkGeHwErr(). - * Corrected handling of Link Up and Auto-Negotiation Over for GPHY. - * in SkGePortCheckUpGmac(). - * Editorial changes. - * - * Revision 1.74 2002/08/08 16:17:04 rschmidt - * Added PhyType check for SK_HWEV_SET_ROLE event (copper only) - * Changed Link Up check reading PHY Specific Status (YUKON) - * Editorial changes - * - * Revision 1.73 2002/07/15 18:36:53 rwahl - * Editorial changes. - * - * Revision 1.72 2002/07/15 15:46:26 rschmidt - * Added new event: SK_HWEV_SET_SPEED - * Editorial changes - * - * Revision 1.71 2002/06/10 09:34:19 rschmidt - * Editorial changes - * - * Revision 1.70 2002/06/05 08:29:18 rschmidt - * SkXmRxTxEnable() replaced by SkMacRxTxEnable(). - * Editorial changes. - * - * Revision 1.69 2002/04/25 13:03:49 rschmidt - * Changes for handling YUKON. - * Use of #ifdef OTHER_PHY to eliminate code for unused Phy types. - * Replaced all XMAC-access macros by functions: SkMacRxTxDisable(), - * SkMacIrqDisable(). - * Added handling for GMAC FIFO in SkMacParity(). - * Replaced all SkXm...() functions with SkMac...() to handle also - * YUKON's GMAC. - * Macros for XMAC PHY access PHY_READ(), PHY_WRITE() replaced - * by functions SkXmPhyRead(), SkXmPhyWrite(). - * Disabling all PHY interrupts moved to SkMacIrqDisable(). - * Added handling for GPHY IRQ in SkGeSirqIsr(). - * Removed status parameter from MAC IRQ handler SkMacIrq(). - * Added SkGePortCheckUpGmac(), SkPhyIsrGmac() for GMAC. - * Editorial changes - * - * Revision 1.68 2002/02/26 15:24:53 rwahl - * Fix: no link with manual configuration (#10673). The previous fix for - * #10639 was removed. So for RLMT mode = CLS the RLMT may switch to - * misconfigured port. It should not occur for the other RLMT modes. - * - * Revision 1.67 2001/11/20 09:19:58 rwahl - * Reworked bugfix #10639 (no dependency to RLMT mode). - * - * Revision 1.66 2001/10/26 07:52:53 afischer - * Port switching bug in `check local link` mode - * - * Revision 1.65 2001/02/23 13:41:51 gklug - * fix: PHYS2INST should be used correctly for Dual Net operation - * chg: do no longer work with older PNMI - * - * Revision 1.64 2001/02/15 11:27:04 rassmann - * Working with RLMT v1 if SK_MAX_NETS undefined. - * - * Revision 1.63 2001/02/06 10:44:23 mkunz - * - NetIndex added to interface functions of pnmi V4 with dual net support - * - * Revision 1.62 2001/01/31 15:31:41 gklug - * fix: problem with autosensing an SR8800 switch - * - * Revision 1.61 2000/11/09 11:30:09 rassmann - * WA: Waiting after releasing reset until BCom chip is accessible. - * - * Revision 1.60 2000/10/18 12:37:48 cgoos - * Reinserted the comment for version 1.56. - * - * Revision 1.59 2000/10/18 12:22:20 cgoos - * Added workaround for half duplex hangup. - * - * Revision 1.58 2000/09/28 13:06:04 gklug - * fix: BCom may NOT be touched if XMAC is in RESET state - * - * Revision 1.57 2000/09/08 12:38:39 cgoos - * Added forgotten variable declaration. - * - * Revision 1.56 2000/09/08 08:12:13 cgoos - * Changed handling of parity errors in SkGeHwErr (correct reset of error). - * - * Revision 1.55 2000/06/19 08:36:25 cgoos - * Changed comment. - * - * Revision 1.54 2000/05/22 08:45:57 malthoff - * Fix: #10523 is valid for all BCom PHYs. - * - * Revision 1.53 2000/05/19 10:20:30 cgoos - * Removed Solaris debug output code. - * - * Revision 1.52 2000/05/19 10:19:37 cgoos - * Added PHY state check in HWLinkDown. - * Move PHY interrupt code to IS_EXT_REG case in SkGeSirqIsr. - * - * Revision 1.51 2000/05/18 05:56:20 cgoos - * Fixed typo. - * - * Revision 1.50 2000/05/17 12:49:49 malthoff - * Fixes BCom link bugs (#10523). - * - * Revision 1.49 1999/12/17 11:02:50 gklug - * fix: read PHY_STAT of Broadcom chip more often to assure good status - * - * Revision 1.48 1999/12/06 10:01:17 cgoos - * Added SET function for Role. - * - * Revision 1.47 1999/11/22 13:34:24 cgoos - * Changed license header to GPL. - * - * Revision 1.46 1999/09/16 10:30:07 cgoos - * Removed debugging output statement from Linux. - * - * Revision 1.45 1999/09/16 07:32:55 cgoos - * Fixed dual-port copperfield bug (PHY_READ from resetted port). - * Removed some unused variables. - * - * Revision 1.44 1999/08/03 15:25:04 cgoos - * Removed workaround for disabled interrupts in half duplex mode. - * - * Revision 1.43 1999/08/03 14:27:58 cgoos - * Removed SENSE mode code from SkGePortCheckUpBcom. - * - * Revision 1.42 1999/07/26 09:16:54 cgoos - * Added some typecasts to avoid compiler warnings. - * - * Revision 1.41 1999/05/19 07:28:59 cgoos - * Changes for 1000Base-T. - * - * Revision 1.40 1999/04/08 13:59:39 gklug - * fix: problem with 3Com switches endless RESTARTs - * - * Revision 1.39 1999/03/08 10:10:52 gklug - * fix: AutoSensing did switch to next mode even if LiPa indicated offline - * - * Revision 1.38 1999/03/08 09:49:03 gklug - * fix: Bug using pAC instead of IoC, causing AIX problems - * fix: change compare for Linux compiler bug workaround - * - * Revision 1.37 1999/01/28 14:51:33 gklug - * fix: monitor for autosensing and extra RESETS the RX on wire counters - * - * Revision 1.36 1999/01/22 09:19:55 gklug - * fix: Init DupMode and InitPauseMd are now called in RxTxEnable - * - * Revision 1.35 1998/12/11 15:22:59 gklug - * chg: autosensing: check for receive if manual mode was guessed - * chg: simplified workaround for XMAC errata - * chg: wait additional 100 ms before link goes up. - * chg: autoneg timeout to 600 ms - * chg: restart autoneg even if configured to autonegotiation - * - * Revision 1.34 1998/12/10 10:33:14 gklug - * add: more debug messages - * fix: do a new InitPhy if link went down (AutoSensing problem) - * chg: Check for zero shorts if link is NOT up - * chg: reset Port if link goes down - * chg: wait additional 100 ms when link comes up to check shorts - * fix: dummy read extended autoneg status to prevent link going down immediately - * - * Revision 1.33 1998/12/07 12:18:29 gklug - * add: refinement of autosense mode: take into account the autoneg cap of LiPa - * - * Revision 1.32 1998/12/07 07:11:21 gklug - * fix: compiler warning - * - * Revision 1.31 1998/12/02 09:29:05 gklug - * fix: WA XMAC Errata: FCSCt check was not correct. - * fix: WA XMAC Errata: Prec Counter were NOT updated in case of short checks. - * fix: Clear Stat : now clears the Prev counters of all known Ports - * - * Revision 1.30 1998/12/01 10:54:15 gklug - * dd: workaround for XMAC errata changed. Check RX count and CRC err Count, too. - * - * Revision 1.29 1998/12/01 10:01:53 gklug - * fix: if MAC IRQ occurs during port down, this will be handled correctly - * - * Revision 1.28 1998/11/26 16:22:11 gklug - * fix: bug in autosense if manual modes are used - * - * Revision 1.27 1998/11/26 15:50:06 gklug - * fix: PNMI needs to set PLinkModeConf - * - * Revision 1.26 1998/11/26 14:51:58 gklug - * add: AutoSensing functionalty - * - * Revision 1.25 1998/11/26 07:34:37 gklug - * fix: Init PrevShorts when restarting port due to Link connection - * - * Revision 1.24 1998/11/25 10:57:32 gklug - * fix: remove unreferenced local vars - * - * Revision 1.23 1998/11/25 08:26:40 gklug - * fix: don't do a RESET on a starting or stopping port - * - * Revision 1.22 1998/11/24 13:29:44 gklug - * add: Workaround for MAC parity errata - * - * Revision 1.21 1998/11/18 15:31:06 gklug - * fix: lint bugs - * - * Revision 1.20 1998/11/18 12:58:54 gklug - * fix: use PNMI query instead of hardware access - * - * Revision 1.19 1998/11/18 12:54:55 gklug - * chg: add new workaround for XMAC Errata - * add: short event counter monitoring on active link too - * - * Revision 1.18 1998/11/13 14:27:41 malthoff - * Bug Fix: Packet Arbiter Timeout was not cleared correctly - * for timeout on TX1 and TX2. - * - * Revision 1.17 1998/11/04 07:01:59 cgoos - * Moved HW link poll sequence. - * Added call to SkXmRxTxEnable. - * - * Revision 1.16 1998/11/03 13:46:03 gklug - * add: functionality of SET_LMODE and SET_FLOW_MODE - * fix: send RLMT LinkDown event when Port stop is given with LinkUp - * - * Revision 1.15 1998/11/03 12:56:47 gklug - * fix: Needs more events - * - * Revision 1.14 1998/10/30 07:36:35 gklug - * rmv: unnecessary code - * - * Revision 1.13 1998/10/29 15:21:57 gklug - * add: Poll link feature for activating HW link - * fix: Deactivate HWLink when Port STOP is given - * - * Revision 1.12 1998/10/28 07:38:57 cgoos - * Checking link status at begin of SkHWLinkUp. - * - * Revision 1.11 1998/10/22 09:46:50 gklug - * fix SysKonnectFileId typo - * - * Revision 1.10 1998/10/14 13:57:47 gklug - * add: Port start/stop event - * - * Revision 1.9 1998/10/14 05:48:29 cgoos - * Added definition for Para. - * - * Revision 1.8 1998/10/14 05:40:09 gklug - * add: Hardware Linkup signal used - * - * Revision 1.7 1998/10/09 06:50:20 malthoff - * Remove ID_sccs by SysKonnectFileId. - * - * Revision 1.6 1998/10/08 09:11:49 gklug - * add: clear IRQ commands - * - * Revision 1.5 1998/10/02 14:27:35 cgoos - * Fixed some typos and wrong event names. - * - * Revision 1.4 1998/10/02 06:24:17 gklug - * add: HW error function - * fix: OUT macros - * - * Revision 1.3 1998/10/01 07:03:00 gklug - * add: ISR for the usual interrupt source register - * - * Revision 1.2 1998/09/03 13:50:33 gklug - * add: function prototypes - * - * Revision 1.1 1998/08/27 11:50:21 gklug - * initial revision - * - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/ski2c.c b/drivers/net/sk98lin/ski2c.c --- a/drivers/net/sk98lin/ski2c.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/ski2c.c Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: ski2c.c * Project: Gigabit Ethernet Adapters, TWSI-Module - * Version: $Revision: 1.59 $ - * Date: $Date: 2003/10/20 09:07:25 $ * Purpose: Functions to access Voltage and Temperature Sensor * ******************************************************************************/ @@ -19,219 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: ski2c.c,v $ - * Revision 1.59 2003/10/20 09:07:25 rschmidt - * Added cast SK_U32 in SkI2cWrite() to avoid compiler warning. - * Editorial changes. - * - * Revision 1.58 2003/09/23 09:22:53 malthoff - * Parameter I2cDevSize added in SkI2cRead and SkI2cWrite to - * support larger devices on the TWSI bus. - * - * Revision 1.57 2003/01/28 09:17:38 rschmidt - * Fixed handling for sensors on YUKON Fiber. - * Editorial changes. - * - * Revision 1.56 2002/12/19 14:20:41 rschmidt - * Added debugging code in SkI2cWait(). - * Replaced all I2C-write operations with function SkI2cWrite(). - * Fixed compiler warning because of uninitialized 'Time' in SkI2cEvent(). - * Editorial changes. - * - * Revision 1.55 2002/10/15 07:23:55 rschmidt - * Added setting of the GIYukon32Bit bool variable to distinguish - * 32-bit adapters. - * Editorial changes (TWSI). - * - * Revision 1.54 2002/08/13 09:05:06 rschmidt - * Added new thresholds if VAUX is not available (GIVauxAvail). - * Merged defines for PHY PLL 3V3 voltage (A and B). - * Editorial changes. - * - * Revision 1.53 2002/08/08 11:04:53 rwahl - * Added missing comment for revision 1.51 - * - * Revision 1.52 2002/08/08 10:09:02 jschmalz - * Sensor init state caused wrong error log entry - * - * Revision 1.51 2002/08/06 09:43:03 jschmalz - * Extensions and changes for Yukon - * - * Revision 1.50 2002/08/02 12:09:22 rschmidt - * Added support for YUKON sensors. - * Editorial changes. - * - * Revision 1.49 2002/07/30 11:07:52 rschmidt - * Replaced MaxSens init by update for Copper in SkI2cInit1(), - * because it was already initialized in SkI2cInit0(). - * Editorial changes. - * - * Revision 1.48 2001/08/16 12:44:33 afischer - * LM80 sensor init values corrected - * - * Revision 1.47 2001/04/05 11:38:09 rassmann - * Set SenState to idle in SkI2cWaitIrq(). - * Changed error message in SkI2cWaitIrq(). - * - * Revision 1.46 2001/04/02 14:03:35 rassmann - * Changed pAC to IoC in SK_IN32(). - * - * Revision 1.45 2001/03/21 12:12:49 rassmann - * Resetting I2C_READY interrupt in SkI2cInit1(). - * - * Revision 1.44 2000/08/07 15:49:03 gklug - * Fix: SK_INFAST only in NetWare driver. - * - * Revision 1.43 2000/08/03 14:28:17 rassmann - * Added function to wait for I2C being ready before resetting the board. - * Replaced one duplicate "out of range" message with correct one. - * - * Revision 1.42 1999/11/22 13:35:12 cgoos - * Changed license header to GPL. - * - * Revision 1.41 1999/09/14 14:11:30 malthoff - * The 1000BT Dual Link adapter has got only one Fan. - * The second Fan has been removed. - * - * Revision 1.40 1999/05/27 13:37:27 malthoff - * Set divisor of 1 for fan count calculation. - * - * Revision 1.39 1999/05/20 14:54:43 malthoff - * I2c.DummyReads is not used in Diagnostics. - * - * Revision 1.38 1999/05/20 09:20:56 cgoos - * Changes for 1000Base-T (up to 9 sensors and fans). - * - * Revision 1.37 1999/03/25 15:11:36 gklug - * fix: reset error flag if sensor reads correct value - * - * Revision 1.36 1999/01/07 14:11:16 gklug - * fix: break added - * - * Revision 1.35 1999/01/05 15:31:49 gklug - * fix: CLEAR STAT command is now added correctly - * - * Revision 1.34 1998/12/01 13:45:16 gklug - * fix: introduced Init level, because we don't need reinits - * - * Revision 1.33 1998/11/09 14:54:25 malthoff - * Modify I2C Transfer Timeout handling for Diagnostics. - * - * Revision 1.32 1998/11/03 06:54:35 gklug - * fix: Need dummy reads at the beginning to init sensors - * - * Revision 1.31 1998/11/03 06:42:42 gklug - * fix: select correctVIO range only if between warning levels - * - * Revision 1.30 1998/11/02 07:36:53 gklug - * fix: Error should not include WARNING message - * - * Revision 1.29 1998/10/30 15:07:43 malthoff - * Disable 'I2C does not compelete' error log for diagnostics. - * - * Revision 1.28 1998/10/22 09:48:11 gklug - * fix: SysKonnectFileId typo - * - * Revision 1.27 1998/10/20 09:59:46 gklug - * add: parameter to SkOsGetTime - * - * Revision 1.26 1998/10/09 06:10:59 malthoff - * Remove ID_sccs by SysKonnectFileId. - * - * Revision 1.25 1998/09/08 12:40:26 gklug - * fix: syntax error in if clause - * - * Revision 1.24 1998/09/08 12:19:42 gklug - * chg: INIT Level checking - * - * Revision 1.23 1998/09/08 07:37:20 gklug - * fix: log error if PCI_IO voltage sensor could not be initialized - * - * Revision 1.22 1998/09/04 08:30:03 malthoff - * Bugfixes during SK_DIAG testing: - * - correct NS2BCLK() macro - * - correct SkI2cSndDev() - * - correct SkI2cWait() loop waiting for an event - * - * Revision 1.21 1998/08/27 14:46:01 gklug - * chg: if-then-else replaced by switch - * - * Revision 1.20 1998/08/27 14:40:07 gklug - * test: integral types - * - * Revision 1.19 1998/08/25 07:51:54 gklug - * fix: typos for compiling - * - * Revision 1.18 1998/08/25 06:12:24 gklug - * add: count errors and warnings - * fix: check not the sensor state but the ErrFlag! - * - * Revision 1.17 1998/08/25 05:56:48 gklug - * add: CheckSensor function - * - * Revision 1.16 1998/08/20 11:41:10 gklug - * chg: omit STRCPY macro by using char * as Sensor Description - * - * Revision 1.15 1998/08/20 11:37:35 gklug - * chg: change Ioc to IoC - * - * Revision 1.14 1998/08/20 11:32:52 gklug - * fix: Para compile error - * - * Revision 1.13 1998/08/20 11:27:41 gklug - * fix: Compile bugs with new awrning constants - * - * Revision 1.12 1998/08/20 08:53:05 gklug - * fix: compiler errors - * add: Threshold values - * - * Revision 1.11 1998/08/19 12:39:22 malthoff - * Compiler Fix: Some names have changed. - * - * Revision 1.10 1998/08/19 12:20:56 gklug - * fix: remove struct from C files (see CCC) - * - * Revision 1.9 1998/08/19 06:28:46 malthoff - * SkOsGetTime returns SK_U64 now. - * - * Revision 1.8 1998/08/17 13:53:33 gklug - * fix: Parameter of event function and its result - * - * Revision 1.7 1998/08/17 07:02:15 malthoff - * Modify the functions for accessing the I2C SW Registers. - * Modify SkI2cWait(). - * Put Lm80RcvReg into sklm80.c - * Remove Compiler Errors. - * - * Revision 1.6 1998/08/14 07:13:20 malthoff - * remove pAc with pAC - * remove smc with pAC - * change names to new convention - * - * Revision 1.5 1998/08/14 06:24:49 gklug - * add: init level 1 and 2 - * - * Revision 1.4 1998/08/12 14:31:12 gklug - * add: error log for unknown event - * - * Revision 1.3 1998/08/12 13:37:04 gklug - * add: Init 0 function - * - * Revision 1.2 1998/08/11 07:27:15 gklug - * add: functions of the interface - * adapt rest of source to C coding Conventions - * rmv: unnecessary code taken from Mona Lisa - * - * Revision 1.1 1998/06/19 14:28:43 malthoff - * Created. Sources taken from ML Projekt. - * Sources have to be reworked for GE. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/sklm80.c b/drivers/net/sk98lin/sklm80.c --- a/drivers/net/sk98lin/sklm80.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/sklm80.c Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: sklm80.c * Project: Gigabit Ethernet Adapters, TWSI-Module - * Version: $Revision: 1.22 $ - * Date: $Date: 2003/10/20 09:08:21 $ * Purpose: Functions to access Voltage and Temperature Sensor (LM80) * ******************************************************************************/ @@ -19,86 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: sklm80.c,v $ - * Revision 1.22 2003/10/20 09:08:21 rschmidt - * Editorial changes. - * - * Revision 1.21 2003/09/23 09:29:04 malthoff - * Parameter Dev_Size added to macro SK_I2C_CTL. - * - * Revision 1.20 2002/08/13 09:16:27 rschmidt - * Changed return value for SkLm80ReadSensor() back to 'int' - * Editorial changes. - * - * Revision 1.19 2002/08/06 09:43:31 jschmalz - * Extensions and changes for Yukon. - * - * Revision 1.18 2002/08/02 12:26:57 rschmidt - * Editorial changes. - * - * Revision 1.17 1999/11/22 13:35:51 cgoos - * Changed license header to GPL. - * - * Revision 1.16 1999/05/27 14:05:47 malthoff - * Fans: Set SenVal to 0 if the fan value is 0 or 0xff. Both values - * are outside the limits (0: div zero error, 0xff: value not in - * range, assume 0). - * - * Revision 1.15 1999/05/27 13:38:51 malthoff - * Pervent from Division by zero errors. - * - * Revision 1.14 1999/05/20 09:20:01 cgoos - * Changes for 1000Base-T (Fan sensors). - * - * Revision 1.13 1998/10/22 09:48:14 gklug - * fix: SysKonnectFileId typo - * - * Revision 1.12 1998/10/09 06:12:06 malthoff - * Remove ID_sccs by SysKonnectFileId. - * - * Revision 1.11 1998/09/04 08:33:48 malthoff - * bug fix: SenState = SK_SEN_IDLE when - * leaving SK_SEN_VALEXT state - * - * Revision 1.10 1998/08/20 12:02:10 gklug - * fix: compiler warnings type mismatch - * - * Revision 1.9 1998/08/20 11:37:38 gklug - * chg: change Ioc to IoC - * - * Revision 1.8 1998/08/19 12:20:58 gklug - * fix: remove struct from C files (see CCC) - * - * Revision 1.7 1998/08/17 07:04:57 malthoff - * Take SkLm80RcvReg() function from ski2c.c. - * Add IoC parameter to BREAK_OR_WAIT() macro. - * - * Revision 1.6 1998/08/14 07:11:28 malthoff - * remove pAc with pAC. - * - * Revision 1.5 1998/08/14 06:46:55 gklug - * fix: temperature can get negative - * - * Revision 1.4 1998/08/13 08:27:04 gklug - * add: temperature reading now o.k. - * fix: pSen declaration, SK_ERR_LOG call, ADDR macro - * - * Revision 1.3 1998/08/13 07:28:21 gklug - * fix: pSen was wrong initialized - * add: correct conversion for voltage readings - * - * Revision 1.2 1998/08/11 07:52:14 gklug - * add: Lm80 read sensor function - * - * Revision 1.1 1998/07/17 09:57:12 gklug - * initial version * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c --- a/drivers/net/sk98lin/skproc.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/sk98lin/skproc.c Tue Feb 17 20:00:05 2004 @@ -2,8 +2,6 @@ * * Name: skproc.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.11 $ - * Date: $Date: 2003/12/11 16:03:57 $ * Purpose: Funktions to display statictic data * ******************************************************************************/ @@ -22,98 +20,6 @@ * Author: Mirko Lindner (mlindner@syskonnect.de) * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ -/****************************************************************************** - * - * History: - * - * $Log: skproc.c,v $ - * Revision 1.11 2003/12/11 16:03:57 mlindner - * Fix: Create backup from pnmi data structure - * - * Revision 1.10 2003/11/19 16:25:36 mlindner - * Fix: Print output as 64-bit digit - * - * Revision 1.9 2003/11/17 13:29:05 mlindner - * Fix: Editorial changes - * - * Revision 1.8 2003/11/13 14:18:48 rroesler - * Fix: added latest changes regarding the use of the proc system - * - * Revision 1.7 2003/11/10 09:35:07 rroesler - * Fix: diag backup restore of PNMI structure - * - * Revision 1.6 2003/11/07 17:31:39 rroesler - * Add: security counter for the proc file system - * - * Revision 1.5 2003/10/07 08:17:08 mlindner - * Fix: Copyright changes - * - * Revision 1.4 2003/09/01 15:29:24 mlindner - * Fix: Editorial changes - * - * Revision 1.3 2003/08/29 12:30:58 mlindner - * Add: Version entry in the proc file system - * - * Revision 1.2 2003/08/12 16:45:29 mlindner - * Add: Removed SkNumber and SkDoDiv - * Add: Counter output as (unsigned long long) - * - * Revision 1.1 2003/07/18 13:39:57 rroesler - * Fix: Re-enter after CVS crash - * - * Revision 1.8 2003/06/27 14:41:42 rroesler - * Corrected compiler-warning kernel 2.2 - * - * Revision 1.7 2003/06/27 12:09:51 rroesler - * corrected minor edits - * - * Revision 1.6 2003/05/26 12:58:53 mlindner - * Add: Support for Kernel 2.5/2.6 - * - * Revision 1.5 2003/03/19 14:40:47 mlindner - * Fix: Editorial changes - * - * Revision 1.4 2003/02/25 14:16:37 mlindner - * Fix: Copyright statement - * - * Revision 1.3 2002/10/02 12:59:51 mlindner - * Add: Support for Yukon - * Add: Speed check and setup - * Add: Merge source for kernel 2.2.x and 2.4.x - * Add: Read sensor names directly from VPD - * Fix: Volt values - * - * Revision 1.2.2.7 2002/01/14 12:45:15 mlindner - * Fix: Editorial changes - * - * Revision 1.2.2.6 2001/12/06 15:26:07 mlindner - * Fix: Return value of proc_read - * - * Revision 1.2.2.5 2001/12/06 09:57:39 mlindner - * New ProcFs entries - * - * Revision 1.2.2.4 2001/09/05 12:16:02 mlindner - * Add: New ProcFs entries - * Fix: Counter Errors (Jumbo == to long errors) - * Fix: Kernel error compilation - * Fix: too short counters - * - * Revision 1.2.2.3 2001/06/25 07:26:26 mlindner - * Add: More error messages - * - * Revision 1.2.2.2 2001/03/15 12:50:13 mlindner - * fix: ProcFS owner protection - * - * Revision 1.2.2.1 2001/03/12 16:43:48 mlindner - * chg: 2.4 requirements for procfs - * - * Revision 1.1 2001/01/22 14:15:31 mlindner - * added ProcFs functionality - * Dual Net functionality integrated - * Rlmt networks added - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skqueue.c b/drivers/net/sk98lin/skqueue.c --- a/drivers/net/sk98lin/skqueue.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/skqueue.c Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: skqueue.c * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.20 $ - * Date: $Date: 2003/09/16 13:44:00 $ * Purpose: Management of an event queue. * ******************************************************************************/ @@ -21,77 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skqueue.c,v $ - * Revision 1.20 2003/09/16 13:44:00 rschmidt - * Added (C) Marvell to SysKonnectFileId - * Editorial changes - * - * Revision 1.19 2003/05/13 18:00:07 mkarl - * Removed calls to RLMT, TWSI, and PNMI for SLIM driver (SK_SLIM). - * Editorial changes. - * - * Revision 1.18 2002/05/07 14:11:11 rwahl - * Fixed Watcom Precompiler error. - * - * Revision 1.17 2002/03/25 10:06:41 mkunz - * SkIgnoreEvent deleted - * - * Revision 1.16 2002/03/15 10:51:59 mkunz - * Added event classes for link aggregation - * - * Revision 1.15 1999/11/22 13:36:29 cgoos - * Changed license header to GPL. - * - * Revision 1.14 1998/10/15 15:11:35 gklug - * fix: ID_sccs to SysKonnectFileId - * - * Revision 1.13 1998/09/08 08:47:52 gklug - * add: init level handling - * - * Revision 1.12 1998/09/08 07:43:20 gklug - * fix: Sirq Event function name - * - * Revision 1.11 1998/09/08 05:54:34 gklug - * chg: define SK_CSUM is replaced by SK_USE_CSUM - * - * Revision 1.10 1998/09/03 14:14:49 gklug - * add: CSUM and HWAC Eventclass and function. - * - * Revision 1.9 1998/08/19 09:50:50 gklug - * fix: remove struct keyword from c-code (see CCC) add typedefs - * - * Revision 1.8 1998/08/17 13:43:11 gklug - * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR - * - * Revision 1.7 1998/08/14 07:09:11 gklug - * fix: chg pAc -> pAC - * - * Revision 1.6 1998/08/11 12:13:14 gklug - * add: return code feature of Event service routines - * add: correct Error log calls - * - * Revision 1.5 1998/08/07 12:53:45 gklug - * fix: first compiled version - * - * Revision 1.4 1998/08/07 09:20:48 gklug - * adapt functions to C coding conventions. - * - * Revision 1.3 1998/08/05 11:29:32 gklug - * rmv: Timer event entry. Timer will queue event directly - * - * Revision 1.2 1998/07/31 11:22:40 gklug - * Initial version - * - * Revision 1.1 1998/07/30 15:14:01 gklug - * Initial version. Adapted from SMT - * - ******************************************************************************/ - /* * Event queue and dispatcher diff -Nru a/drivers/net/sk98lin/skrlmt.c b/drivers/net/sk98lin/skrlmt.c --- a/drivers/net/sk98lin/skrlmt.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/skrlmt.c Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skrlmt.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.69 $ - * Date: $Date: 2003/04/15 09:39:22 $ * Purpose: Manage links on SK-NET Adapters, esp. redundant ones. * ******************************************************************************/ @@ -19,254 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skrlmt.c,v $ - * Revision 1.69 2003/04/15 09:39:22 tschilli - * Copyright messages changed. - * "#error C++ is not yet supported." removed. - * - * Revision 1.68 2003/01/31 15:26:56 rschmidt - * Added init for local variables in RlmtInit(). - * - * Revision 1.67 2003/01/31 14:12:41 mkunz - * single port adapter runs now with two identical MAC addresses - * - * Revision 1.66 2002/09/23 15:14:19 rwahl - * - Reset broadcast timestamp on link down. - * - Editorial corrections. - * - * Revision 1.65 2002/07/22 14:29:48 rwahl - * - Removed BRK statement from debug check. - * - * Revision 1.64 2001/11/28 19:36:14 rwahl - * - RLMT Packets sent to an invalid MAC address in CLP/CLPSS mode - * (#10650). - * - Reworked fix for port switching in CLS mode (#10639) - * (no dependency to RLMT module). - * - Enabled dbg output for entry/exit of event functions. - * - Editorial changes. - * - * Revision 1.63 2001/10/26 07:53:18 afischer - * Port switching bug in `check local link` mode - * - * Revision 1.62 2001/07/03 12:16:30 mkunz - * New Flag ChgBcPrio (Change priority of last broadcast received) - * - * Revision 1.61 2001/03/14 12:52:08 rassmann - * Fixed reporting of active port up/down to PNMI. - * - * Revision 1.60 2001/02/21 16:02:25 gklug - * fix: when RLMT starts set Active Port for PNMI - * - * Revision 1.59 2001/02/16 14:38:19 rassmann - * Initializing some pointers earlier in the init phase. - * Rx Mbufs are freed if the net which they belong to is stopped. - * - * Revision 1.58 2001/02/14 14:06:31 rassmann - * Editorial changes. - * - * Revision 1.57 2001/02/05 14:25:26 rassmann - * Prepared RLMT for transparent operation. - * - * Revision 1.56 2001/01/30 10:29:09 rassmann - * Not checking switching befor RlmtStart. - * Editorial changes. - * - * Revision 1.55 2001/01/22 13:41:38 rassmann - * Supporting two nets on dual-port adapters. - * - * Revision 1.54 2000/11/30 13:25:07 rassmann - * Setting SK_TICK_INCR to 1 by default. - * - * Revision 1.53 2000/11/30 10:48:07 cgoos - * Changed definition of SK_RLMT_BC_DELTA. - * - * Revision 1.52 2000/11/27 12:50:03 rassmann - * Checking ports after receiving broadcasts. - * - * Revision 1.51 2000/11/17 08:58:00 rassmann - * Moved CheckSwitch from SK_RLMT_PACKET_RECEIVED to SK_RLMT_TIM event. - * - * Revision 1.50 2000/11/09 12:24:34 rassmann - * Indicating that segmentation check is not running anymore after - * SkRlmtCheckSeg(). - * Restarting segmentation timer after segmentation log. - * Editorial changes. - * - * Revision 1.49 1999/11/22 13:38:02 cgoos - * Changed license header to GPL. - * Added initialization to some variables to avoid compiler warnings. - * - * Revision 1.48 1999/10/04 14:01:17 rassmann - * Corrected reaction to reception of BPDU frames (#10441). - * - * Revision 1.47 1999/07/20 12:53:36 rassmann - * Fixed documentation errors for lookahead macros. - * - * Revision 1.46 1999/05/28 13:29:16 rassmann - * Replaced C++-style comment. - * - * Revision 1.45 1999/05/28 13:28:08 rassmann - * Corrected syntax error (xxx). - * - * Revision 1.44 1999/05/28 11:15:54 rassmann - * Changed behaviour to reflect Design Spec v1.2. - * Controlling Link LED(s). - * Introduced RLMT Packet Version field in RLMT Packet. - * Newstyle lookahead macros (checking meta-information before looking at - * the packet). - * - * Revision 1.43 1999/01/28 13:12:43 rassmann - * Corrected Lookahead (bug introduced in previous Rev.). - * - * Revision 1.42 1999/01/28 12:50:41 rassmann - * Not using broadcast time stamps in CheckLinkState mode. - * - * Revision 1.41 1999/01/27 14:13:02 rassmann - * Monitoring broadcast traffic. - * Switching more reliably and not too early if switch is - * configured for spanning tree. - * - * Revision 1.40 1999/01/22 13:17:30 rassmann - * Informing PNMI of NET_UP. - * Clearing RLMT multicast addresses before setting them for the first time. - * Reporting segmentation earlier, setting a "quiet time" - * after a report. - * - * Revision 1.39 1998/12/10 15:29:53 rassmann - * Corrected SuspectStatus in SkRlmtBuildCheckChain(). - * Corrected CHECK_SEG mode. - * - * Revision 1.38 1998/12/08 13:11:23 rassmann - * Stopping SegTimer at RlmtStop. - * - * Revision 1.37 1998/12/07 16:51:42 rassmann - * Corrected comments. - * - * Revision 1.36 1998/12/04 10:58:56 rassmann - * Setting next pointer to NULL when receiving. - * - * Revision 1.35 1998/12/03 16:12:42 rassmann - * Ignoring/correcting illegal PrefPort values. - * - * Revision 1.34 1998/12/01 11:45:35 rassmann - * Code cleanup. - * - * Revision 1.33 1998/12/01 10:29:32 rassmann - * Starting standby ports before getting the net up. - * Checking if a port is started when the link comes up. - * - * Revision 1.32 1998/11/30 16:19:50 rassmann - * New default for PortNoRx. - * - * Revision 1.31 1998/11/27 19:17:13 rassmann - * Corrected handling of LINK_DOWN coming shortly after LINK_UP. - * - * Revision 1.30 1998/11/24 12:37:31 rassmann - * Implemented segmentation check. - * - * Revision 1.29 1998/11/18 13:04:32 rassmann - * Secured PortUpTimer event. - * Waiting longer before starting standby port(s). - * - * Revision 1.28 1998/11/17 13:43:04 rassmann - * Handling (logical) tx failure. - * Sending packet on logical address after PORT_SWITCH. - * - * Revision 1.27 1998/11/13 17:09:50 rassmann - * Secured some events against being called in wrong state. - * - * Revision 1.26 1998/11/13 16:56:54 rassmann - * Added macro version of SkRlmtLookaheadPacket. - * - * Revision 1.25 1998/11/06 18:06:04 rassmann - * Corrected timing when RLMT checks fail. - * Clearing tx counter earlier in periodical checks. - * - * Revision 1.24 1998/11/05 10:37:27 rassmann - * Checking destination address in Lookahead. - * - * Revision 1.23 1998/11/03 13:53:49 rassmann - * RLMT should switch now (at least in mode 3). - * - * Revision 1.22 1998/10/29 14:34:49 rassmann - * Clearing SK_RLMT struct at startup. - * Initializing PortsUp during SK_RLMT_START. - * - * Revision 1.21 1998/10/28 11:30:17 rassmann - * Default mode is now SK_RLMT_CHECK_LOC_LINK. - * - * Revision 1.20 1998/10/26 16:02:03 rassmann - * Ignoring LINK_DOWN for links that are down. - * - * Revision 1.19 1998/10/22 15:54:01 rassmann - * Corrected EtherLen. - * Starting Link Check when second port comes up. - * - * Revision 1.18 1998/10/22 11:39:50 rassmann - * Corrected signed/unsigned mismatches. - * Corrected receive list handling and address recognition. - * - * Revision 1.17 1998/10/19 17:01:20 rassmann - * More detailed checking of received packets. - * - * Revision 1.16 1998/10/15 15:16:34 rassmann - * Finished Spanning Tree checking. - * Checked with lint. - * - * Revision 1.15 1998/09/24 19:16:07 rassmann - * Code cleanup. - * Introduced Timer for PORT_DOWN due to no RX. - * - * Revision 1.14 1998/09/18 20:27:14 rassmann - * Added address override. - * - * Revision 1.13 1998/09/16 11:31:48 rassmann - * Including skdrv1st.h again. :( - * - * Revision 1.12 1998/09/16 11:09:50 rassmann - * Syntax corrections. - * - * Revision 1.11 1998/09/15 12:32:03 rassmann - * Syntax correction. - * - * Revision 1.10 1998/09/15 11:28:49 rassmann - * Syntax corrections. - * - * Revision 1.9 1998/09/14 17:07:37 rassmann - * Added code for port checking via LAN. - * Changed Mbuf definition. - * - * Revision 1.8 1998/09/07 11:14:14 rassmann - * Syntax corrections. - * - * Revision 1.7 1998/09/07 09:06:07 rassmann - * Syntax corrections. - * - * Revision 1.6 1998/09/04 19:41:33 rassmann - * Syntax corrections. - * Started entering code for checking local links. - * - * Revision 1.5 1998/09/04 12:14:27 rassmann - * Interface cleanup. - * - * Revision 1.4 1998/09/02 16:55:28 rassmann - * Updated to reflect new DRV/HWAC/RLMT interface. - * - * Revision 1.3 1998/08/27 14:29:03 rassmann - * Code cleanup. - * - * Revision 1.2 1998/08/27 14:26:24 rassmann - * Updated interface. - * - * Revision 1.1 1998/08/21 08:26:49 rassmann - * First public version. * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/sktimer.c b/drivers/net/sk98lin/sktimer.c --- a/drivers/net/sk98lin/sktimer.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sk98lin/sktimer.c Tue Feb 17 20:00:06 2004 @@ -2,8 +2,6 @@ * * Name: sktimer.c * Project: Gigabit Ethernet Adapters, Event Scheduler Module - * Version: $Revision: 1.14 $ - * Date: $Date: 2003/09/16 13:46:51 $ * Purpose: High level timer functions. * ******************************************************************************/ @@ -21,60 +19,6 @@ * The information in this file is provided "AS IS" without warranty. * ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: sktimer.c,v $ - * Revision 1.14 2003/09/16 13:46:51 rschmidt - * Added (C) Marvell to SysKonnectFileId - * Editorial changes - * - * Revision 1.13 2003/05/13 18:01:01 mkarl - * Editorial changes. - * - * Revision 1.12 1999/11/22 13:38:51 cgoos - * Changed license header to GPL. - * - * Revision 1.11 1998/12/17 13:24:13 gklug - * fix: restart problem: do NOT destroy timer queue if init 1 is done - * - * Revision 1.10 1998/10/15 15:11:36 gklug - * fix: ID_sccs to SysKonnectFileId - * - * Revision 1.9 1998/09/15 15:15:04 cgoos - * Changed TRUE/FALSE to SK_TRUE/SK_FALSE - * - * Revision 1.8 1998/09/08 08:47:55 gklug - * add: init level handling - * - * Revision 1.7 1998/08/19 09:50:53 gklug - * fix: remove struct keyword from c-code (see CCC) add typedefs - * - * Revision 1.6 1998/08/17 13:43:13 gklug - * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR - * - * Revision 1.5 1998/08/14 07:09:14 gklug - * fix: chg pAc -> pAC - * - * Revision 1.4 1998/08/07 12:53:46 gklug - * fix: first compiled version - * - * Revision 1.3 1998/08/07 09:31:53 gklug - * fix: delta spelling - * - * Revision 1.2 1998/08/07 09:31:02 gklug - * adapt functions to new c coding conventions - * rmv: "fast" handling - * chg: inserting of new timer in queue. - * chg: event queue generation when timer runs out - * - * Revision 1.1 1998/08/05 11:27:55 gklug - * first version: adapted from SMT - * - ******************************************************************************/ - /* * Event queue and dispatcher diff -Nru a/drivers/net/sk98lin/skvpd.c b/drivers/net/sk98lin/skvpd.c --- a/drivers/net/sk98lin/skvpd.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk98lin/skvpd.c Tue Feb 17 20:00:07 2004 @@ -2,8 +2,6 @@ * * Name: skvpd.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.37 $ - * Date: $Date: 2003/01/13 10:42:45 $ * Purpose: Shared software to read and write VPD data * ******************************************************************************/ @@ -18,145 +16,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skvpd.c,v $ - * Revision 1.37 2003/01/13 10:42:45 rschmidt - * Replaced check for PCI device Id from YUKON with GENESIS - * to set the VPD size in VpdInit() - * Editorial changes - * - * Revision 1.36 2002/11/14 15:16:56 gheinig - * Added const specifier to key and buf parameters for VpdPara, VpdRead - * and VpdWrite for Diag 7 GUI - * - * Revision 1.35 2002/10/21 14:31:59 gheinig - * Took out CVS web garbage at head of file - * - * Revision 1.34 2002/10/21 11:47:24 gheinig - * Reverted to version 1.32 due to unwanted commit - * - * Revision 1.32 2002/10/14 16:04:29 rschmidt - * Added saving of VPD ROM Size from PCI_OUR_REG_2 - * Avoid reading of PCI_OUR_REG_2 in VpdTransferBlock() - * Editorial changes - * - * Revision 1.31 2002/09/10 09:21:32 mkarl - * Replaced all if(GIChipId == CHIP_ID_GENESIS) with new entry GIGenesis - * - * Revision 1.30 2002/09/09 14:43:03 mkarl - * changes for diagnostics in order to read VPD data before the adapter - * has been initialized - * editorial changes - * - * Revision 1.29 2002/07/26 13:20:43 mkarl - * added Yukon support - * save size of VPD in pAC->vpd.vpd_size - * - * Revision 1.28 2002/04/02 15:31:47 afischer - * Bug fix in VpdWait() - * - * Revision 1.27 2000/08/10 11:29:06 rassmann - * Editorial changes. - * Preserving 32-bit alignment in structs for the adapter context. - * Removed unused function VpdWriteDword() (#if 0). - * Made VpdReadKeyword() available for SKDIAG only. - * - * Revision 1.26 2000/06/13 08:00:01 mkarl - * additional cast to avoid compile problems in 64 bit environment - * - * Revision 1.25 1999/11/22 13:39:32 cgoos - * Changed license header to GPL. - * - * Revision 1.24 1999/03/11 14:25:49 malthoff - * Replace __STDC__ with SK_KR_PROTO. - * - * Revision 1.23 1999/01/11 15:13:11 gklug - * fix: syntax error - * - * Revision 1.22 1998/10/30 06:41:15 gklug - * rmv: WARNING - * - * Revision 1.21 1998/10/29 07:15:14 gklug - * fix: Write Stream function needs verify. - * - * Revision 1.20 1998/10/28 18:05:08 gklug - * chg: no DEBUG in VpdMayWrite - * - * Revision 1.19 1998/10/28 15:56:11 gklug - * fix: Return len at end of ReadStream - * fix: Write even less than 4 bytes correctly - * - * Revision 1.18 1998/10/28 09:00:47 gklug - * fix: unreferenced local vars - * - * Revision 1.17 1998/10/28 08:25:45 gklug - * fix: WARNING - * - * Revision 1.16 1998/10/28 08:17:30 gklug - * fix: typo - * - * Revision 1.15 1998/10/28 07:50:32 gklug - * fix: typo - * - * Revision 1.14 1998/10/28 07:20:38 gklug - * chg: Interface functions to use IoC as parameter as well - * fix: VpdRead/WriteDWord now returns SK_U32 - * chg: VPD_IN/OUT names conform to SK_IN/OUT - * add: usage of VPD_IN/OUT8 macros - * add: VpdRead/Write Stream functions to r/w a stream of data - * fix: VpdTransferBlock swapped illegal - * add: VpdMayWrite - * - * Revision 1.13 1998/10/22 10:02:37 gklug - * fix: SysKonnectFileId typo - * - * Revision 1.12 1998/10/20 10:01:01 gklug - * fix: parameter to SkOsGetTime - * - * Revision 1.11 1998/10/15 12:51:48 malthoff - * Remove unrequired parameter p in vpd_setup_para(). - * - * Revision 1.10 1998/10/08 14:52:43 malthoff - * Remove CvsId by SysKonnectFileId. - * - * Revision 1.9 1998/09/16 07:33:52 malthoff - * replace memcmp() by SK_MEMCMP and - * memcpy() by SK_MEMCPY() to be - * independent from the 'C' Standard Library. - * - * Revision 1.8 1998/08/19 12:52:35 malthoff - * compiler fix: use SK_VPD_KEY instead of S_VPD. - * - * Revision 1.7 1998/08/19 08:14:01 gklug - * fix: remove struct keyword as much as possible from the C-code (see CCC) - * - * Revision 1.6 1998/08/18 13:03:58 gklug - * SkOsGetTime now returns SK_U64 - * - * Revision 1.5 1998/08/18 08:17:29 malthoff - * Ensure we issue a VPD read in vpd_read_dword(). - * Discard all VPD keywords other than Vx or Yx, where - * x is '0..9' or 'A..Z'. - * - * Revision 1.4 1998/07/03 14:52:19 malthoff - * Add category SK_DBGCAT_FATAL to some debug macros. - * bug fix: correct the keyword name check in vpd_write(). - * - * Revision 1.3 1998/06/26 11:16:53 malthoff - * Correct the modified File Identifier. - * - * Revision 1.2 1998/06/26 11:13:43 malthoff - * Modify the File Identifier. - * - * Revision 1.1 1998/06/19 14:11:08 malthoff - * Created, Tests with AIX were performed successfully - * * ******************************************************************************/ diff -Nru a/drivers/net/sk98lin/skxmac2.c b/drivers/net/sk98lin/skxmac2.c --- a/drivers/net/sk98lin/skxmac2.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sk98lin/skxmac2.c Tue Feb 17 20:00:08 2004 @@ -2,8 +2,6 @@ * * Name: skxmac2.c * Project: Gigabit Ethernet Adapters, Common Modules - * Version: $Revision: 1.102 $ - * Date: $Date: 2003/10/02 16:53:58 $ * Purpose: Contains functions to initialize the MACs and PHYs * ******************************************************************************/ @@ -19,461 +17,6 @@ * (at your option) any later version. * * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ - -/****************************************************************************** - * - * History: - * - * $Log: skxmac2.c,v $ - * Revision 1.102 2003/10/02 16:53:58 rschmidt - * Changed setting of GMAC parameters with new macros. - * Added define SLIM around SkGm...LowPowerMode(). - * Editorial changes. - * - * Revision 1.101 2003/09/16 14:49:07 rschmidt - * Added routines SkGmClearRst(), SkXmClearRst, SkMacClearRst(). - * Added WA code for Yukon-Lite's COMA mode in SkGmHardRst(). - * Replaced PCI-Config R/W through internal access. - * Fixed return from coma mode in SkGmLeaveLowPowerMode(). - * Fixed compiler warnings for different types. - * Editorial changes. - * - * Revision 1.100 2003/09/16 07:09:11 mschmid - * Added functions SkGmEnterLowPowerMode() and - * SkGmLeaveLowPowerMode() - * - * Revision 1.99 2003/07/11 12:19:33 rschmidt - * Reduced init values for Master & Slave downshift counters to - * minimum values. - * Editorial changes. - * - * Revision 1.98 2003/07/04 12:53:56 rschmidt - * Changed setting of downshift feature in SkGmInitPhyMarv(). - * Enabled downshift feature only for para 'Speed' set to 'Auto'. - * Changed init values for Master & Slave downshift counters. - * Editorial changes. - * - * Revision 1.97 2003/05/28 15:53:47 rschmidt - * Removed setting of Yukon PHY's 'force link good' in loopback mode. - * Replaced call pFnMacOverflow() with SkXmOverflowStatus() resp. - * SkGmOverflowStatus(). - * Editorial changes. - * - * Revision 1.96 2003/05/13 17:37:11 mkarl - * Removed calls to PNMI for SLIM driver. - * Added SK_FAR for PXE. - * Separated code pathes not used for SLIM driver. - * Some further separations for YUKON and GENESIS. - * Editorial changes. - * - * Revision 1.95 2003/05/06 13:09:53 rschmidt - * Changed init sequence for auto-negotiation disabled in SkGmInitMac(). - * Added defines around GENESIS resp. YUKON branches to reduce - * code size for PXE. - * Editorial changes. - * - * Revision 1.94 2003/04/10 14:36:40 rschmidt - * Fixed define for debug code in SkGmInitPhyMarv(). - * - * Revision 1.93 2003/04/08 16:58:16 rschmidt - * Changed initialisation of GMAC and GPHY for disabling - * Flow-Control with parameter 'none' (Bug Id #10769). - * Changed init for blinking active LED and normal duplex LED - * depending on value from GILedBlinkCtrl (LED Blink Control). - * Added control for Link100 LED. - * Changed handling for different PhyTypes for source code - * portability to PXE, UNDI. - * Editorial changes. - * - * Revision 1.92 2003/03/31 07:12:33 mkarl - * Restore PHY_MARV_AUNE_ADV after writing to GM_GP_CTRL in order to make - * auto-negotiation of limited flow-control possible. - * Corrected Copyright. - * Editorial changes. - * - * Revision 1.91 2003/02/05 15:09:34 rschmidt - * Removed setting of 'Collision Test'-bit in SkGmInitPhyMarv(). - * Disabled auto-update for speed, duplex and flow-control when - * auto-negotiation is not enabled (Bug Id #10766). - * Editorial changes. - * - * Revision 1.90 2003/01/29 13:35:19 rschmidt - * Increment Rx FIFO Overflow counter only in DEBUG-mode. - * Corrected define for blinking active LED. - * - * Revision 1.89 2003/01/28 16:37:45 rschmidt - * Changed init for blinking active LED - * - * Revision 1.88 2003/01/28 10:09:38 rschmidt - * Added debug outputs in SkGmInitMac(). - * Added customized init of LED registers in SkGmInitPhyMarv(), - * for blinking active LED (#ifdef ACT_LED_BLINK) and - * for normal duplex LED (#ifdef DUP_LED_NORMAL). - * Editorial changes. - * - * Revision 1.87 2002/12/10 14:39:05 rschmidt - * Improved initialization of GPHY in SkGmInitPhyMarv(). - * Editorial changes. - * - * Revision 1.86 2002/12/09 15:01:12 rschmidt - * Added setup of Ext. PHY Specific Ctrl Reg (downshift feature). - * - * Revision 1.85 2002/12/05 14:09:16 rschmidt - * Improved avoiding endless loop in SkGmPhyRead(), SkGmPhyWrite(). - * Added additional advertising for 10Base-T when 100Base-T is selected. - * Added case SK_PHY_MARV_FIBER for YUKON Fiber adapter. - * Editorial changes. - * - * Revision 1.84 2002/11/15 12:50:09 rschmidt - * Changed SkGmCableDiagStatus() when getting results. - * - * Revision 1.83 2002/11/13 10:28:29 rschmidt - * Added some typecasts to avoid compiler warnings. - * - * Revision 1.82 2002/11/13 09:20:46 rschmidt - * Replaced for(..) with do {} while (...) in SkXmUpdateStats(). - * Replaced 2 macros GM_IN16() with 1 GM_IN32() in SkGmMacStatistic(). - * Added SkGmCableDiagStatus() for Virtual Cable Test (VCT). - * Editorial changes. - * - * Revision 1.81 2002/10/28 14:28:08 rschmidt - * Changed MAC address setup for GMAC in SkGmInitMac(). - * Optimized handling of counter overflow IRQ in SkGmOverflowStatus(). - * Editorial changes. - * - * Revision 1.80 2002/10/14 15:29:44 rschmidt - * Corrected disabling of all PHY IRQs. - * Added WA for deviation #16 (address used for pause packets). - * Set Pause Mode in SkMacRxTxEnable() only for Genesis. - * Added IRQ and counter for Receive FIFO Overflow in DEBUG-mode. - * SkXmTimeStamp() replaced by SkMacTimeStamp(). - * Added clearing of GMAC Tx FIFO Underrun IRQ in SkGmIrq(). - * Editorial changes. - * - * Revision 1.79 2002/10/10 15:55:36 mkarl - * changes for PLinkSpeedUsed - * - * Revision 1.78 2002/09/12 09:39:51 rwahl - * Removed deactivate code for SIRQ overflow event separate for TX/RX. - * - * Revision 1.77 2002/09/09 12:26:37 mkarl - * added handling for Yukon to SkXmTimeStamp - * - * Revision 1.76 2002/08/21 16:41:16 rschmidt - * Added bit GPC_ENA_XC (Enable MDI crossover) in HWCFG_MODE. - * Added forced speed settings in SkGmInitPhyMarv(). - * Added settings of full/half duplex capabilities for YUKON Fiber. - * Editorial changes. - * - * Revision 1.75 2002/08/16 15:12:01 rschmidt - * Replaced all if(GIChipId == CHIP_ID_GENESIS) with new entry GIGenesis. - * Added function SkMacHashing() for ADDR-Module. - * Removed functions SkXmClrSrcCheck(), SkXmClrHashAddr() (calls replaced - * with macros). - * Removed functions SkGmGetMuxConfig(). - * Added HWCFG_MODE init for YUKON Fiber. - * Changed initialization of GPHY in SkGmInitPhyMarv(). - * Changed check of parameter in SkXmMacStatistic(). - * Editorial changes. - * - * Revision 1.74 2002/08/12 14:00:17 rschmidt - * Replaced usage of Broadcom PHY Ids with defines. - * Corrected error messages in SkGmMacStatistic(). - * Made SkMacPromiscMode() public for ADDR-Module. - * Editorial changes. - * - * Revision 1.73 2002/08/08 16:26:24 rschmidt - * Improved reset sequence for YUKON in SkGmHardRst() and SkGmInitMac(). - * Replaced XMAC Rx High Watermark init value with SK_XM_RX_HI_WM. - * Editorial changes. - * - * Revision 1.72 2002/07/24 15:11:19 rschmidt - * Fixed wrong placement of parenthesis. - * Editorial changes. - * - * Revision 1.71 2002/07/23 16:05:18 rschmidt - * Added global functions for PHY: SkGePhyRead(), SkGePhyWrite(). - * Fixed Tx Counter Overflow IRQ (Bug ID #10730). - * Editorial changes. - * - * Revision 1.70 2002/07/18 14:27:27 rwahl - * Fixed syntax error. - * - * Revision 1.69 2002/07/17 17:08:47 rwahl - * Fixed check in SkXmMacStatistic(). - * - * Revision 1.68 2002/07/16 07:35:24 rwahl - * Removed check for cleared mib counter in SkGmResetCounter(). - * - * Revision 1.67 2002/07/15 18:35:56 rwahl - * Added SkXmUpdateStats(), SkGmUpdateStats(), SkXmMacStatistic(), - * SkGmMacStatistic(), SkXmResetCounter(), SkGmResetCounter(), - * SkXmOverflowStatus(), SkGmOverflowStatus(). - * Changes to SkXmIrq() & SkGmIrq(): Combined SIRQ Overflow for both - * RX & TX. - * Changes to SkGmInitMac(): call to SkGmResetCounter(). - * Editorial changes. - * - * Revision 1.66 2002/07/15 15:59:30 rschmidt - * Added PHY Address in SkXmPhyRead(), SkXmPhyWrite(). - * Added MIB Clear Counter in SkGmInitMac(). - * Added Duplex and Flow-Control settings. - * Reset all Multicast filtering Hash reg. in SkGmInitMac(). - * Added new function: SkGmGetMuxConfig(). - * Editorial changes. - * - * Revision 1.65 2002/06/10 09:35:39 rschmidt - * Replaced C++ comments (//). - * Added #define VCPU around VCPUwaitTime. - * Editorial changes. - * - * Revision 1.64 2002/06/05 08:41:10 rschmidt - * Added function for XMAC2: SkXmTimeStamp(). - * Added function for YUKON: SkGmSetRxCmd(). - * Changed SkGmInitMac() resp. SkGmHardRst(). - * Fixed wrong variable in SkXmAutoNegLipaXmac() (debug mode). - * SkXmRxTxEnable() replaced by SkMacRxTxEnable(). - * Editorial changes. - * - * Revision 1.63 2002/04/25 13:04:44 rschmidt - * Changes for handling YUKON. - * Use of #ifdef OTHER_PHY to eliminate code for unused Phy types. - * Macros for XMAC PHY access PHY_READ(), PHY_WRITE() replaced - * by functions SkXmPhyRead(), SkXmPhyWrite(); - * Removed use of PRxCmd to setup XMAC. - * Added define PHY_B_AS_PAUSE_MSK for BCom Pause Res. - * Added setting of XM_RX_DIS_CEXT in SkXmInitMac(). - * Removed status parameter from MAC IRQ handler SkMacIrq(), - * SkXmIrq() and SkGmIrq(). - * SkXmAutoNegLipa...() for ext. Phy replaced by SkMacAutoNegLipaPhy(). - * Added SkMac...() functions to handle both XMAC and GMAC. - * Added functions for YUKON: SkGmHardRst(), SkGmSoftRst(), - * SkGmSetRxTxEn(), SkGmIrq(), SkGmInitMac(), SkGmInitPhyMarv(), - * SkGmAutoNegDoneMarv(), SkGmPhyRead(), SkGmPhyWrite(). - * Changes for V-CPU support. - * Editorial changes. - * - * Revision 1.62 2001/08/06 09:50:14 rschmidt - * Workaround BCOM Errata #1 for the C5 type. - * Editorial changes. - * - * Revision 1.61 2001/02/09 15:40:59 rassmann - * Editorial changes. - * - * Revision 1.60 2001/02/07 15:02:01 cgoos - * Added workaround for Fujitsu switch link down. - * - * Revision 1.59 2001/01/10 09:38:06 cgoos - * Fixed Broadcom C0/A1 Id check for workaround. - * - * Revision 1.58 2000/11/29 11:30:38 cgoos - * Changed DEBUG sections with NW output to xDEBUG - * - * Revision 1.57 2000/11/27 12:40:40 rassmann - * Suppressing preamble after first access to BCom, not before (#10556). - * - * Revision 1.56 2000/11/09 12:32:48 rassmann - * Renamed variables. - * - * Revision 1.55 2000/11/09 11:30:10 rassmann - * WA: Waiting after releasing reset until BCom chip is accessible. - * - * Revision 1.54 2000/10/02 14:10:27 rassmann - * Reading BCOM PHY after releasing reset until it returns a valid value. - * - * Revision 1.53 2000/07/27 12:22:11 gklug - * fix: possible endless loop in XmHardRst. - * - * Revision 1.52 2000/05/22 08:48:31 malthoff - * Fix: #10523 errata valid for all BCOM PHYs. - * - * Revision 1.51 2000/05/17 12:52:18 malthoff - * Fixes BCom link errata (#10523). - * - * Revision 1.50 1999/11/22 13:40:14 cgoos - * Changed license header to GPL. - * - * Revision 1.49 1999/11/22 08:12:13 malthoff - * Add workaround for power consumption feature of BCom C0 chip. - * - * Revision 1.48 1999/11/16 08:39:01 malthoff - * Fix: MDIO preamble suppression is port dependent. - * - * Revision 1.47 1999/08/27 08:55:35 malthoff - * 1000BT: Optimizing MDIO transfer by oppressing MDIO preamble. - * - * Revision 1.46 1999/08/13 11:01:12 malthoff - * Fix for 1000BT: pFlowCtrlMode was not set correctly. - * - * Revision 1.45 1999/08/12 19:18:28 malthoff - * 1000BT Fixes: Do not owerwrite XM_MMU_CMD. - * Do not execute BCOM A1 workaround for B1 chips. - * Fix pause frame setting. - * Always set PHY_B_AC_TX_TST in PHY_BCOM_AUX_CTRL. - * - * Revision 1.44 1999/08/03 15:23:48 cgoos - * Fixed setting of PHY interrupt mask in half duplex mode. - * - * Revision 1.43 1999/08/03 15:22:17 cgoos - * Added some debug output. - * Disabled XMac GP0 interrupt for external PHYs. - * - * Revision 1.42 1999/08/02 08:39:23 malthoff - * BCOM PHY: TX LED: To get the mono flop behaviour it is required - * to set the LED Traffic Mode bit in PHY_BCOM_P_EXT_CTRL. - * - * Revision 1.41 1999/07/30 06:54:31 malthoff - * Add temp. workarounds for the BCOM Phy revision A1. - * - * Revision 1.40 1999/06/01 07:43:26 cgoos - * Changed Link Mode Status in SkXmAutoNegDone... from FULL/HALF to - * AUTOFULL/AUTOHALF. - * - * Revision 1.39 1999/05/19 07:29:51 cgoos - * Changes for 1000Base-T. - * - * Revision 1.38 1999/04/08 14:35:10 malthoff - * Add code for enabling signal detect. Enabling signal detect is disabled. - * - * Revision 1.37 1999/03/12 13:42:54 malthoff - * Add: Jumbo Frame Support. - * Add: Receive modes SK_LENERR_OK_ON/OFF and - * SK_BIG_PK_OK_ON/OFF in SkXmSetRxCmd(). - * - * Revision 1.36 1999/03/08 10:10:55 gklug - * fix: AutoSensing did switch to next mode even if LiPa indicated offline - * - * Revision 1.35 1999/02/22 15:16:41 malthoff - * Remove some compiler warnings. - * - * Revision 1.34 1999/01/22 09:19:59 gklug - * fix: Init DupMode and InitPauseMd are now called in RxTxEnable - * - * Revision 1.33 1998/12/11 15:19:11 gklug - * chg: lipa autoneg stati - * chg: debug messages - * chg: do NOT use spurious XmIrq - * - * Revision 1.32 1998/12/10 11:08:44 malthoff - * bug fix: pAC has been used for IOs in SkXmHardRst(). - * SkXmInitPhy() is also called for the Diag in SkXmInitMac(). - * - * Revision 1.31 1998/12/10 10:39:11 gklug - * fix: do 4 RESETS of the XMAC at the beginning - * fix: dummy read interrupt source register BEFORE initializing the Phy - * add: debug messages - * fix: Linkpartners autoneg capability cannot be shown by TX_PAGE interrupt - * - * Revision 1.30 1998/12/07 12:18:32 gklug - * add: refinement of autosense mode: take into account the autoneg cap of LiPa - * - * Revision 1.29 1998/12/07 07:12:29 gklug - * fix: if page is received the link is down. - * - * Revision 1.28 1998/12/01 10:12:47 gklug - * chg: if spurious IRQ from XMAC encountered, save it - * - * Revision 1.27 1998/11/26 07:33:38 gklug - * add: InitPhy call is now in XmInit function - * - * Revision 1.26 1998/11/18 13:38:24 malthoff - * 'Imsk' is also unused in SkXmAutoNegDone. - * - * Revision 1.25 1998/11/18 13:28:01 malthoff - * Remove unused variable 'Reg' in SkXmAutoNegDone(). - * - * Revision 1.24 1998/11/18 13:18:45 gklug - * add: workaround for xmac errata #1 - * add: detect Link Down also when Link partner requested config - * chg: XMIrq is only used when link is up - * - * Revision 1.23 1998/11/04 07:07:04 cgoos - * Added function SkXmRxTxEnable. - * - * Revision 1.22 1998/10/30 07:35:54 gklug - * fix: serve LinkDown interrupt when link is already down - * - * Revision 1.21 1998/10/29 15:32:03 gklug - * fix: Link Down signaling - * - * Revision 1.20 1998/10/29 11:17:27 gklug - * fix: AutoNegDone bug - * - * Revision 1.19 1998/10/29 10:14:43 malthoff - * Add endainesss comment for reading/writing MAC addresses. - * - * Revision 1.18 1998/10/28 07:48:55 cgoos - * Fix: ASS somtimes signaled although link is up. - * - * Revision 1.17 1998/10/26 07:55:39 malthoff - * Fix in SkXmInitPauseMd(): Pause Mode - * was disabled and not enabled. - * Fix in SkXmAutoNegDone(): Checking Mode bits - * always failed, becaues of some missing braces. - * - * Revision 1.16 1998/10/22 09:46:52 gklug - * fix SysKonnectFileId typo - * - * Revision 1.15 1998/10/21 05:51:37 gklug - * add: para DoLoop to InitPhy function for loopback set-up - * - * Revision 1.14 1998/10/16 10:59:23 malthoff - * Remove Lint warning for dummy reads. - * - * Revision 1.13 1998/10/15 14:01:20 malthoff - * Fix: SkXmAutoNegDone() is (int) but does not return a value. - * - * Revision 1.12 1998/10/14 14:45:04 malthoff - * Remove SKERR_SIRQ_E0xx and SKERR_SIRQ_E0xxMSG by - * SKERR_HWI_Exx and SKERR_HWI_E0xxMSG to be independent - * from the Sirq module. - * - * Revision 1.11 1998/10/14 13:59:01 gklug - * add: InitPhy function - * - * Revision 1.10 1998/10/14 11:20:57 malthoff - * Make SkXmAutoNegDone() public, because it's - * used in diagnostics, too. - * The Link Up event to the RLMT is issued in SkXmIrq(). - * SkXmIrq() is not available in diagnostics. - * Use PHY_READ when reading PHY registers. - * - * Revision 1.9 1998/10/14 05:50:10 cgoos - * Added definition for Para. - * - * Revision 1.8 1998/10/14 05:41:28 gklug - * add: Xmac IRQ - * add: auto-negotiation done function - * - * Revision 1.7 1998/10/09 06:55:20 malthoff - * The configuration of the XMACs Tx Request Threshold - * depends from the drivers port usage now. The port - * usage is configured in GIPortUsage. - * - * Revision 1.6 1998/10/05 07:48:00 malthoff - * minor changes - * - * Revision 1.5 1998/10/01 07:03:54 gklug - * add: dummy function for XMAC ISR - * - * Revision 1.4 1998/09/30 12:37:44 malthoff - * Add SkXmSetRxCmd() and related code. - * - * Revision 1.3 1998/09/28 13:26:40 malthoff - * Add SkXmInitMac(), SkXmInitDupMd(), and SkXmInitPauseMd() - * - * Revision 1.2 1998/09/16 14:34:21 malthoff - * Add SkXmClrExactAddr(), SkXmClrSrcCheck(), - * SkXmClrHashAddr(), SkXmFlushTxFifo(), - * SkXmFlushRxFifo(), and SkXmHardRst(). - * Finish Coding of SkXmSoftRst(). - * The sources may be compiled now. - * - * Revision 1.1 1998/09/04 10:05:56 malthoff - * Created. - * * ******************************************************************************/ diff -Nru a/drivers/net/sk_g16.c b/drivers/net/sk_g16.c --- a/drivers/net/sk_g16.c Tue Feb 17 20:00:14 2004 +++ b/drivers/net/sk_g16.c Tue Feb 17 20:00:14 2004 @@ -457,8 +457,6 @@ /* static variables */ static SK_RAM *board; /* pointer to our memory mapped board components */ -static struct net_device *SK_dev; -unsigned long SK_ioaddr; static spinlock_t SK_lock = SPIN_LOCK_UNLOCKED; /* Macros */ @@ -472,7 +470,6 @@ * See for short explanation of each function its definitions header. */ -int SK_init(struct net_device *dev); static int SK_probe(struct net_device *dev, short ioaddr); static void SK_timeout(struct net_device *dev); @@ -530,84 +527,71 @@ * YY/MM/DD uid Description -*/ +static int io; /* 0 == probe */ + /* * Check for a network adaptor 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 SK_init(struct net_device *dev) +struct net_device * __init SK_init(int unit) { - int ioaddr; /* I/O port address used for POS regs */ int *port, ports[] = SK_IO_PORTS; /* SK_G16 supported ports */ static unsigned version_printed; + struct net_device *dev = alloc_etherdev(sizeof(struct priv)); + int err = -ENODEV; - /* get preconfigured base_addr from dev which is done in Space.c */ - int base_addr = dev->base_addr; + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + } if (version_printed++ == 0) PRINTK(("%s: %s", SK_NAME, rcsid)); - if (base_addr > 0x0ff) /* Check a single specified address */ - { - int rc = -ENODEV; - - ioaddr = base_addr; + if (io > 0xff) { /* Check a single specified address */ + err = -EBUSY; + /* Check if on specified address is a SK_G16 */ + if (request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16")) { + err = SK_probe(dev, io); + if (!err) + goto got_it; + release_region(io, ETHERCARD_TOTAL_SIZE); + } + } else if (io > 0) { /* Don't probe at all */ + err = -ENXIO; + } else { + /* Autoprobe base_addr */ + for (port = &ports[0]; *port; port++) { + io = *port; + + /* Check if I/O Port region is used by another board */ + if (!request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16")) + continue; /* Try next Port address */ + + /* Check if at ioaddr is a SK_G16 */ + if (SK_probe(dev, io) == 0) + goto got_it; - /* Check if on specified address is a SK_G16 */ - if (!request_region(ioaddr, ETHERCARD_TOTAL_SIZE, "sk_g16")) - return -EBUSY; - - if ( (inb(SK_POS0) == SK_IDLOW) || - (inb(SK_POS1) == SK_IDHIGH) ) - { - rc = SK_probe(dev, ioaddr); - } - - if (rc) - release_region(ioaddr, ETHERCARD_TOTAL_SIZE); - return rc; - } - else if (base_addr > 0) /* Don't probe at all */ - { - return -ENXIO; + release_region(io, ETHERCARD_TOTAL_SIZE); + } } - - /* Autoprobe base_addr */ - - for (port = &ports[0]; *port; port++) - { - ioaddr = *port; /* we need ioaddr for accessing POS regs */ - - /* Check if I/O Port region is used by another board */ - - if (!request_region(ioaddr, ETHERCARD_TOTAL_SIZE, "sk_g16")) - { - continue; /* Try next Port address */ - } - - /* Check if at ioaddr is a SK_G16 */ - - if ( !(inb(SK_POS0) == SK_IDLOW) || - !(inb(SK_POS1) == SK_IDHIGH) ) - { - release_region(ioaddr, ETHERCARD_TOTAL_SIZE); - continue; /* Try next Port address */ - } - - dev->base_addr = ioaddr; /* Set I/O Port Address */ - - if (SK_probe(dev, ioaddr) == 0) - { - return 0; /* Card found and initialized */ - } - - release_region(ioaddr, ETHERCARD_TOTAL_SIZE); +err_out: + free_netdev(dev); + return ERR_PTR(err); + +got_it: + err = register_netdev(dev); + if (err) { + release_region(dev->base_addr, ETHERCARD_TOTAL_SIZE); + goto err_out; } - - dev->base_addr = base_addr; /* Write back original base_addr */ - - return -ENODEV; /* Failed to find or init driver */ + return dev; } /* End of SK_init */ @@ -620,54 +604,25 @@ #ifdef MODULE -static int io; /* 0 == probe */ + +static struct net_device *SK_dev; static int __init SK_init_module (void) { - int rc; - - SK_dev = init_etherdev (NULL, 0); - if (!SK_dev) - return -ENOMEM; - - SK_dev->base_addr = io; - - rc = SK_init (SK_dev); - if (rc) { - unregister_netdev (SK_dev); - kfree (SK_dev); - SK_dev = NULL; - } - - return rc; + SK_dev = SK_init(-1); + return IS_ERR(SK_dev) ? PTR_ERR(SK_dev) : 0; } -#endif /* MODULE */ - static void __exit SK_cleanup_module (void) { - if (SK_dev) { - if (SK_dev->priv) { - kfree(SK_dev->priv); - SK_dev->priv = NULL; - } - unregister_netdev(SK_dev); - free_netdev(SK_dev); - SK_dev = NULL; - } - if (SK_ioaddr) { - release_region(SK_ioaddr, ETHERCARD_TOTAL_SIZE); - SK_ioaddr = 0; - } - + unregister_netdev(SK_dev); + release_region(SK_dev->base_addr, ETHERCARD_TOTAL_SIZE); + free_netdev(SK_dev); } - -#ifdef MODULE module_init(SK_init_module); -#endif module_exit(SK_cleanup_module); - +#endif /*- @@ -695,7 +650,11 @@ int sk_addr_flag = 0; /* SK ADDR correct? 1 - no, 0 - yes */ unsigned int rom_addr; /* used to store RAM address used for POS_ADDR */ - struct priv *p; /* SK_G16 private structure */ + struct priv *p = dev->priv; /* SK_G16 private structure */ + + if (inb(SK_POS0) != SK_IDLOW || inb(SK_POS1) != SK_IDHIGH) + return -ENODEV; + dev->base_addr = ioaddr; if (SK_ADDR & 0x3fff || SK_ADDR < 0xa0000) { @@ -837,12 +796,6 @@ dev->dev_addr[4], dev->dev_addr[5]); - /* Allocate memory for private structure */ - p = dev->priv = (void *) kmalloc(sizeof(struct priv), GFP_KERNEL); - if (p == NULL) { - printk("%s: ERROR - no memory for driver data!\n", dev->name); - return -ENOMEM; - } memset((char *) dev->priv, 0, sizeof(struct priv)); /* clear memory */ /* Assign our Device Driver functions */ @@ -856,10 +809,6 @@ dev->watchdog_timeo = HZ/7; - /* Set the generic fields of the device structure */ - - ether_setup(dev); - dev->flags &= ~IFF_MULTICAST; /* Initialize private structure */ @@ -884,12 +833,7 @@ SK_print_pos(dev, "End of SK_probe"); SK_print_ram(dev); #endif - - SK_dev = dev; - SK_ioaddr = ioaddr; - return 0; /* Initialization done */ - } /* End of SK_probe() */ @@ -1280,7 +1224,7 @@ memcpy_toio((tmdp->u.buffer & 0x00ffffff), skb->data, skb->len); if (len != skb->len) - memcpy_toio((tmdp->u.buffer & 0x00ffffff) + sb->len, pad, len-skb->len); + memcpy_toio((tmdp->u.buffer & 0x00ffffff) + skb->len, pad, len-skb->len); writew(-len, &tmdp->blen); /* set length to transmit */ diff -Nru a/drivers/net/sk_mca.c b/drivers/net/sk_mca.c --- a/drivers/net/sk_mca.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk_mca.c Tue Feb 17 20:00:07 2004 @@ -1022,18 +1022,39 @@ static int startslot; /* counts through slots when probing multiple devices */ -int __init skmca_probe(struct net_device *dev) +static void cleanup_card(struct net_device *dev) { + skmca_priv *priv = dev->priv; + DeinitBoard(dev); + if (dev->irq != 0) + free_irq(dev->irq, dev); + mca_mark_as_unused(priv->slot); + mca_set_adapter_procfn(priv->slot, NULL, NULL); +} + +struct net_device * __init skmca_probe(int unit) +{ + struct net_device *dev; int force_detect = 0; int junior, slot, i; int base = 0, irq = 0; skmca_priv *priv; skmca_medium medium; + int err; /* can't work without an MCA bus ;-) */ if (MCA_bus == 0) - return -ENODEV; + return ERR_PTR(-ENODEV); + + dev = alloc_etherdev(sizeof(skmca_priv)); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); @@ -1044,37 +1065,24 @@ /* search through slots */ - if (dev != NULL) { - base = dev->mem_start; - irq = dev->irq; - } - slot = dofind(&junior, startslot); - - while (slot != -1) { + base = dev->mem_start; + irq = dev->base_addr; + for (slot = startslot; (slot = dofind(&junior, slot)) != -1; slot++) { /* deduce card addresses */ getaddrs(slot, junior, &base, &irq, &medium); /* slot already in use ? */ - if (mca_is_adapter_used(slot)) { - slot = dofind(&junior, slot + 1); + if (mca_is_adapter_used(slot)) continue; - } /* were we looking for something different ? */ - if ((dev->irq != 0) || (dev->mem_start != 0)) { - if ((dev->irq != 0) && (dev->irq != irq)) { - slot = dofind(&junior, slot + 1); - continue; - } - if ((dev->mem_start != 0) - && (dev->mem_start != base)) { - slot = dofind(&junior, slot + 1); - continue; - } - } + if (dev->irq && dev->irq != irq) + continue; + if (dev->mem_start && dev->mem_start != base) + continue; /* found something that matches */ @@ -1083,8 +1091,10 @@ /* nothing found ? */ - if (slot == -1) - return ((base != 0) || (irq != 0)) ? ENXIO : ENODEV; + if (slot == -1) { + free_netdev(dev); + return (base || irq) ? ERR_PTR(-ENXIO) : ERR_PTR(-ENODEV); + } /* make procfs entries */ @@ -1102,17 +1112,14 @@ junior ? "Junior MC2" : "MC2+", slot + 1); /* allocate structure */ - priv = dev->priv = - (skmca_priv *) kmalloc(sizeof(skmca_priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; + priv = dev->priv; priv->slot = slot; priv->macbase = base + 0x3fc0; priv->ioregaddr = base + 0x3ff0; priv->ctrladdr = base + 0x3ff2; priv->cmdaddr = base + 0x3ff3; priv->medium = medium; - memset(&(priv->stat), 0, sizeof(struct net_device_stats)); + memset(&priv->stat, 0, sizeof(struct net_device_stats)); spin_lock_init(&priv->lock); /* set base + irq for this device (irq not allocated so far) */ @@ -1146,9 +1153,6 @@ dev->set_multicast_list = skmca_set_multicast_list; dev->flags |= IFF_MULTICAST; - /* generic setup */ - ether_setup(dev); - /* copy out MAC address */ for (i = 0; i < 6; i++) dev->dev_addr[i] = SKMCA_READB(priv->macbase + (i << 1)); @@ -1167,7 +1171,13 @@ startslot = slot + 1; - return 0; + err = register_netdev(dev); + if (err) { + cleanup_card(dev); + free_netdev(dev); + dev = ERR_PTR(err); + } + return dev; } /* ------------------------------------------------------------------------ @@ -1179,51 +1189,34 @@ #define DEVMAX 5 -static struct net_device moddevs[DEVMAX] = { - { .name = " ", .init = skmca_probe }, - { .name = " ", .init = skmca_probe }, - { .name = " ", .init = skmca_probe }, - { .name = " ", .init = skmca_probe }, - { .name = " ", .init = skmca_probe } -}; - -int irq; -int io; +static struct net_device *moddevs[DEVMAX]; int init_module(void) { - int z, res; + int z; startslot = 0; for (z = 0; z < DEVMAX; z++) { - strcpy(moddevs[z].name, " "); - res = register_netdev(moddevs + z); - if (res != 0) - return (z > 0) ? 0 : -EIO; + struct net_device *dev = skmca_probe(-1); + if (IS_ERR(dev)) + break; + moddevs[z] = dev; } - + if (!z) + return -EIO; return 0; } void cleanup_module(void) { - struct net_device *dev; - skmca_priv *priv; int z; for (z = 0; z < DEVMAX; z++) { - dev = moddevs + z; - if (dev->priv != NULL) { - priv = (skmca_priv *) dev->priv; - DeinitBoard(dev); - if (dev->irq != 0) - free_irq(dev->irq, dev); - dev->irq = 0; + struct net_device *dev = moddevs[z]; + if (dev) { unregister_netdev(dev); - mca_mark_as_unused(priv->slot); - mca_set_adapter_procfn(priv->slot, NULL, NULL); - kfree(dev->priv); - dev->priv = NULL; + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/sk_mca.h b/drivers/net/sk_mca.h --- a/drivers/net/sk_mca.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sk_mca.h Tue Feb 17 20:00:07 2004 @@ -178,7 +178,4 @@ #endif /* _SK_MCA_DRIVER_ */ -extern int skmca_probe(struct net_device *); - - #endif /* _SK_MCA_INCLUDE_ */ diff -Nru a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c --- a/drivers/net/skfp/skfddi.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/skfp/skfddi.c Tue Feb 17 20:00:05 2004 @@ -39,12 +39,6 @@ * are skfddi.c, h/types.h, h/osdef1st.h, h/targetos.h. * The others belong to the SysKonnect FDDI Hardware Module and * should better not be changed. - * NOTE: - * Compiling this driver produces some warnings, but I did not fix - * this, because the Hardware Module source is used for different - * drivers, and fixing it for Linux might bring problems on other - * projects. To keep the source common for all those drivers (and - * thus simplify fixes to it), please do not clean it up! * * Modification History: * Date Name Description @@ -58,6 +52,7 @@ * 07-May-00 DM 64 bit fixes, new dma interface * 31-Jul-03 DB Audit copy_*_user in skfp_ioctl * Daniele Bellucci + * 03-Dec-03 SH Convert to PCI device model * * Compilation options (-Dxxx): * DRIVERDEBUG print lots of messages to log file @@ -70,7 +65,7 @@ /* Version information string - should be updated prior to */ /* each new release!!! */ -#define VERSION "2.06" +#define VERSION "2.07" static const char *boot_msg = "SysKonnect FDDI PCI Adapter driver v" VERSION " for\n" @@ -80,15 +75,11 @@ #include #include -#include -#include #include #include #include #include #include -#include -#include // isdigit #include #include #include @@ -106,17 +97,7 @@ #include "h/smtstate.h" -// Define global routines -int skfp_probe(struct net_device *dev); - - // Define module-wide (static) routines -static struct net_device *alloc_device(struct net_device *dev, u_long iobase); -static struct net_device *insert_device(struct net_device *dev, - int (*init) (struct net_device *)); -static int fddi_dev_index(unsigned char *s); -static void init_dev(struct net_device *dev, u_long iobase); -static void link_modules(struct net_device *dev, struct net_device *tmp); static int skfp_driver_init(struct net_device *dev); static int skfp_open(struct net_device *dev); static int skfp_close(struct net_device *dev); @@ -193,15 +174,6 @@ // Define module-wide (static) variables static int num_boards; /* total number of adapters configured */ -static int num_fddi; -static int autoprobed; - -#ifdef MODULE -static struct net_device *unlink_modules(struct net_device *p); -static int loading_module = 1; -#else -static int loading_module; -#endif // MODULE #ifdef DRIVERDEBUG #define PRINTK(s, args...) printk(s, ## args) @@ -212,9 +184,9 @@ #define PRIV(dev) (&(((struct s_smc *)dev->priv)->os)) /* - * ============== - * = skfp_probe = - * ============== + * ================= + * = skfp_init_one = + * ================= * * Overview: * Probes for supported FDDI PCI controllers @@ -223,30 +195,11 @@ * Condition code * * Arguments: - * dev - pointer to device information + * pdev - pointer to PCI device information * * Functional Description: - * This routine is called by the OS for each FDDI device name (fddi0, - * fddi1,...,fddi6, fddi7) specified in drivers/net/Space.c. - * If loaded as a module, it will detect and initialize all - * adapters the first time it is called. - * - * Let's say that skfp_probe() is getting called to initialize fddi0. - * Furthermore, let's say there are three supported controllers in the - * system. Before skfp_probe() leaves, devices fddi0, fddi1, and fddi2 - * will be initialized and a global flag will be set to indicate that - * skfp_probe() has already been called. - * - * However...the OS doesn't know that we've already initialized - * devices fddi1 and fddi2 so skfp_probe() gets called again and again - * until it reaches the end of the device list for FDDI (presently, - * fddi7). It's important that the driver "pretend" to probe for - * devices fddi1 and fddi2 and return success. Devices fddi3 - * through fddi7 will return failure since they weren't initialized. - * - * This algorithm seems to work for the time being. As other FDDI - * drivers are written for Linux, a more generic approach (perhaps - * similar to the Ethernet card approach) may need to be implemented. + * This is now called by PCI driver registration process + * for each board found. * * Return Codes: * 0 - This device (fddi0, fddi1, etc) configured successfully @@ -259,374 +212,176 @@ * initialized and the board resources are read and stored in * the device structure. */ -int skfp_probe(struct net_device *dev) +static int skfp_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { - int i; /* used in for loops */ - struct pci_dev *pdev = NULL; /* PCI device structure */ -#ifndef MEM_MAPPED_IO - u16 port; /* temporary I/O (port) address */ - int port_len; /* length of port address range (in bytes) */ -#else - unsigned long port; -#endif - u16 command; /* PCI Configuration space Command register val */ + struct net_device *dev; struct s_smc *smc; /* board pointer */ - struct net_device *tmp = dev; - u8 first_dev_used = 0; - u16 SubSysId; + u32 port, len; + int err; - PRINTK(KERN_INFO "entering skfp_probe\n"); - - /* - * Verify whether we're going through skfp_probe() again - * - * If so, see if we're going through for a subsequent fddi device that - * we've already initialized. If we are, return success (0). If not, - * return failure (-ENODEV). - */ - - if (autoprobed) { - PRINTK(KERN_INFO "Already entered skfp_probe\n"); - if (dev != NULL) { - if ((strncmp(dev->name, "fddi", 4) == 0) && - (dev->base_addr != 0)) { - return (0); - } - return (-ENODEV); - } - } - autoprobed = 1; /* set global flag */ + PRINTK(KERN_INFO "entering skfp_init_one\n"); - printk("%s\n", boot_msg); + if (num_boards == 0) + printk("%s\n", boot_msg); - /* Scan for Syskonnect FDDI PCI controllers */ - for (i = 0; i < SKFP_MAX_NUM_BOARDS; i++) { // scan for PCI cards - PRINTK(KERN_INFO "Check device %d\n", i); - if ((pdev=pci_find_device(PCI_VENDOR_ID_SK, PCI_DEVICE_ID_SK_FP, - pdev)) == 0) { - break; - } - if (pci_enable_device(pdev)) - continue; + err = pci_enable_device(pdev); + if (err) + goto err_out1; -#ifndef MEM_MAPPED_IO - /* Verify that I/O enable bit is set (PCI slot is enabled) */ - pci_read_config_word(pdev, PCI_COMMAND, &command); - if ((command & PCI_COMMAND_IO) == 0) { - PRINTK("I/O enable bit not set!"); - PRINTK(" Verify that slot is enabled\n"); - continue; - } - /* Turn off memory mapped space and enable mastering */ +#ifdef MEM_MAPPED_IO + if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { + printk(KERN_ERR "skfp: region is not an MMIO resource\n"); + err = -EIO; + goto err_out1; + } + port = pci_resource_start(pdev, 0); + len = pci_resource_len(pdev, 0); - PRINTK(KERN_INFO "Command Reg: %04x\n", command); - command |= PCI_COMMAND_MASTER; - command &= ~PCI_COMMAND_MEMORY; - pci_write_config_word(pdev, PCI_COMMAND, command); - - /* Read I/O base address from PCI Configuration Space */ - - pci_read_config_word(pdev, PCI_BASE_ADDRESS_1, &port); - port &= PCI_BASE_ADDRESS_IO_MASK; // clear I/O bit (bit 0) - - /* Verify port address range is not already being used */ - - port_len = FP_IO_LEN; - if (check_region(port, port_len) != 0) { - printk("I/O range allocated to adapter"); - printk(" (0x%X-0x%X) is already being used!\n", port, - (port + port_len - 1)); - continue; - } + if (len < 0x4000) { + printk(KERN_ERR "skfp: Invalid PCI region size: %d\n", len); + err = -EIO; + goto err_out1; + } #else - /* Verify that MEM enable bit is set (PCI slot is enabled) */ - pci_read_config_word(pdev, PCI_COMMAND, &command); - if ((command & PCI_COMMAND_MEMORY) == 0) { - PRINTK("MEMORY-I/O enable bit not set!"); - PRINTK(" Verify that slot is enabled\n"); - continue; - } - - /* Turn off IO mapped space and enable mastering */ - - PRINTK(KERN_INFO "Command Reg: %04x\n", command); - command |= PCI_COMMAND_MASTER; - command &= ~PCI_COMMAND_IO; - pci_write_config_word(pdev, PCI_COMMAND, command); - - port = pci_resource_start(pdev, 0); - - port = (unsigned long)ioremap(port, 0x4000); - if (!port){ - printk("skfp: Unable to map MEMORY register, " - "FDDI adapter will be disabled.\n"); - break; - } -#endif - - if ((!loading_module) || first_dev_used) { - /* Allocate a device structure for this adapter */ - tmp = alloc_device(dev, port); - } - first_dev_used = 1; // only significant first time - - pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &SubSysId); - - if (tmp != NULL) { - if (loading_module) - link_modules(dev, tmp); - dev = tmp; - init_dev(dev, port); - dev->irq = pdev->irq; - - /* Initialize board structure with bus-specific info */ - - smc = (struct s_smc *) dev->priv; - smc->os.dev = dev; - smc->os.bus_type = SK_BUS_TYPE_PCI; - smc->os.pdev = *pdev; - smc->os.QueueSkb = MAX_TX_QUEUE_LEN; - smc->os.MaxFrameSize = MAX_FRAME_SIZE; - smc->os.dev = dev; - smc->hw.slot = -1; - smc->os.ResetRequested = FALSE; - skb_queue_head_init(&smc->os.SendSkbQueue); - - if (skfp_driver_init(dev) == 0) { - // only increment global board - // count on success - num_boards++; - request_region(dev->base_addr, - FP_IO_LEN, dev->name); - if ((SubSysId & 0xff00) == 0x5500 || - (SubSysId & 0xff00) == 0x5800) { - printk("%s: SysKonnect FDDI PCI adapter" - " found (SK-%04X)\n", dev->name, - SubSysId); - } else { - printk("%s: FDDI PCI adapter found\n", - dev->name); - } - } else { - kfree(dev); - i = SKFP_MAX_NUM_BOARDS; // stop search - - } - - } // if (dev != NULL) - - } // for SKFP_MAX_NUM_BOARDS - - /* - * If we're at this point we're going through skfp_probe() for the - * first time. Return success (0) if we've initialized 1 or more - * boards. Otherwise, return failure (-ENODEV). - */ - - if (num_boards > 0) - return (0); - else { - printk("no SysKonnect FDDI adapter found\n"); - return (-ENODEV); + if (!(pci_resource_flags(pdev, 1) & IO_RESOURCE_IO)) { + printk(KERN_ERR "skfp: region is not PIO resource\n"); + err = -EIO; + goto err_out1; } -} // skfp_probe - - -/************************ - * - * Search the entire 'fddi' device list for a fixed probe. If a match isn't - * found then check for an autoprobe or unused device location. If they - * are not available then insert a new device structure at the end of - * the current list. - * - ************************/ -static struct net_device *alloc_device(struct net_device *dev, u_long iobase) -{ - struct net_device *adev = NULL; - int fixed = 0, new_dev = 0; - - PRINTK(KERN_INFO "entering alloc_device\n"); - if (!dev) - return dev; - num_fddi = fddi_dev_index(dev->name); - if (loading_module) { - num_fddi++; - dev = insert_device(dev, skfp_probe); - return dev; + port = pci_resource_start(pdev, 1); + len = pci_resource_len(pdev, 1); + if (len < FP_IO_LEN) { + printk(KERN_ERR "skfp: Invalid PCI region size: %d\n", + io_len); + err = -EIO; + goto err_out1; } - while (1) { - if (((dev->base_addr == NO_ADDRESS) || - (dev->base_addr == 0)) && !adev) { - adev = dev; - } else if ((dev->priv == NULL) && (dev->base_addr == iobase)) { - fixed = 1; - } else { - if (dev->next == NULL) { - new_dev = 1; - } else if (strncmp(dev->next->name, "fddi", 4) != 0) { - new_dev = 1; - } - } - if ((dev->next == NULL) || new_dev || fixed) - break; - dev = dev->next; - num_fddi++; - } // while (1) - - if (adev && !fixed) { - dev = adev; - num_fddi = fddi_dev_index(dev->name); - new_dev = 0; - } - if (((dev->next == NULL) && ((dev->base_addr != NO_ADDRESS) && - (dev->base_addr != 0)) && !fixed) || - new_dev) { - num_fddi++; /* New device */ - dev = insert_device(dev, skfp_probe); - } - if (dev) { - if (!dev->priv) { - /* Allocate space for private board structure */ - dev->priv = (void *) kmalloc(sizeof(struct s_smc), - GFP_KERNEL); - if (dev->priv == NULL) { - printk("%s: Could not allocate memory for", - dev->name); - printk(" private board structure!\n"); - return (NULL); - } - /* clear structure */ - memset(dev->priv, 0, sizeof(struct s_smc)); - } +#endif + err = pci_request_regions(pdev, "skfddi"); + if (err) + goto err_out1; + + pci_set_master(pdev); + + dev = alloc_fddidev(sizeof(struct s_smc)); + if (!dev) { + printk(KERN_ERR "skfp: Unable to allocate fddi device, " + "FDDI adapter will be disabled.\n"); + err = -ENOMEM; + goto err_out2; + } + +#ifdef MEM_MAPPED_IO + dev->base_addr = (unsigned long) ioremap(port, len); + if (!dev->base_addr) { + printk(KERN_ERR "skfp: Unable to map MEMORY register, " + "FDDI adapter will be disabled.\n"); + err = -EIO; + goto err_out3; } - return dev; -} // alloc_device - - - -/************************ - * - * Initialize device structure - * - ************************/ -static void init_dev(struct net_device *dev, u_long iobase) -{ - /* Initialize new device structure */ - - dev->mem_end = 0; /* shared memory isn't used */ - dev->mem_start = 0; /* shared memory isn't used */ - dev->base_addr = iobase; /* save port (I/O) base address */ - dev->if_port = 0; /* not applicable to FDDI adapters */ - dev->dma = 0; /* Bus Master DMA doesn't require channel */ - dev->irq = 0; - - netif_start_queue(dev); +#else + dev->base_addr = port; +#endif + dev->irq = pdev->irq; dev->get_stats = &skfp_ctl_get_stats; dev->open = &skfp_open; dev->stop = &skfp_close; dev->hard_start_xmit = &skfp_send_pkt; - dev->hard_header = NULL; /* set in fddi_setup() */ - dev->rebuild_header = NULL; /* set in fddi_setup() */ dev->set_multicast_list = &skfp_ctl_set_multicast_list; dev->set_mac_address = &skfp_ctl_set_mac_address; dev->do_ioctl = &skfp_ioctl; - dev->set_config = NULL; /* not supported for now &&& */ dev->header_cache_update = NULL; /* not supported */ - dev->change_mtu = NULL; /* set in fddi_setup() */ SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); - /* Initialize remaining device structure information */ - fddi_setup(dev); -} // init_device - - -/************************ - * - * If at end of fddi device list and can't use current entry, malloc - * one up. If memory could not be allocated, print an error message. - * -************************/ -static struct net_device *insert_device(struct net_device *dev, - int (*init) (struct net_device *)) -{ - struct net_device *new; - int len; - - PRINTK(KERN_INFO "entering insert_device\n"); - len = sizeof(struct net_device) + sizeof(struct s_smc); - new = (struct net_device *) kmalloc(len, GFP_KERNEL); - if (new == NULL) { - printk("fddi%d: Device not initialised, insufficient memory\n", - num_fddi); - return NULL; - } else { - memset((char *) new, 0, len); - new->priv = (struct s_smc *) (new + 1); - new->init = init; /* initialisation routine */ - if (!loading_module) { - new->next = dev->next; - dev->next = new; - } - /* create new device name */ - if (num_fddi > 999) { - sprintf(new->name, "fddi????"); - } else { - sprintf(new->name, "fddi%d", num_fddi); - } - } - return new; -} // insert_device - - -/************************ - * - * Get the number of a "fddiX" string - * - ************************/ -static int fddi_dev_index(unsigned char *s) -{ - int i = 0, j = 0; - - for (; *s; s++) { - if (isdigit(*s)) { - j = 1; - i = (i * 10) + (*s - '0'); - } else if (j) - break; - } - return i; -} // fddi_dev_index + /* Initialize board structure with bus-specific info */ + smc = (struct s_smc *) dev->priv; + smc->os.dev = dev; + smc->os.bus_type = SK_BUS_TYPE_PCI; + smc->os.pdev = *pdev; + smc->os.QueueSkb = MAX_TX_QUEUE_LEN; + smc->os.MaxFrameSize = MAX_FRAME_SIZE; + smc->os.dev = dev; + smc->hw.slot = -1; + smc->os.ResetRequested = FALSE; + skb_queue_head_init(&smc->os.SendSkbQueue); + + err = skfp_driver_init(dev); + if (err) + goto err_out4; + + err = register_netdev(dev); + if (err) + goto err_out5; + + ++num_boards; + pci_set_drvdata(pdev, dev); + + if ((pdev->subsystem_device & 0xff00) == 0x5500 || + (pdev->subsystem_device & 0xff00) == 0x5800) + printk("%s: SysKonnect FDDI PCI adapter" + " found (SK-%04X)\n", dev->name, + pdev->subsystem_device); + else + printk("%s: FDDI PCI adapter found\n", dev->name); + return 0; +err_out5: + if (smc->os.SharedMemAddr) + pci_free_consistent(pdev, smc->os.SharedMemSize, + smc->os.SharedMemAddr, + smc->os.SharedMemDMA); + pci_free_consistent(pdev, MAX_FRAME_SIZE, + smc->os.LocalRxBuffer, smc->os.LocalRxBufferDMA); +err_out4: +#ifdef MEM_MAPPED_IO + iounmap((void *) dev->base_addr); +#endif +err_out3: + free_netdev(dev); +err_out2: + pci_release_regions(pdev); +err_out1: + return err; +} -/************************ - * - * Used if loaded as module only. Link the device structures - * together. Needed to release them all at unload. - * -************************/ -static void link_modules(struct net_device *dev, struct net_device *tmp) +/* + * Called for each adapter board from pci_unregister_driver + */ +static void __devexit skfp_remove_one(struct pci_dev *pdev) { - struct net_device *p = dev; + struct net_device *p = pci_get_drvdata(pdev); + struct s_smc *lp = p->priv; - if (p) { - while (((struct s_smc *) (p->priv))->os.next_module) { - p = ((struct s_smc *) (p->priv))->os.next_module; - } + unregister_netdev(p); - if (dev != tmp) { - ((struct s_smc *) (p->priv))->os.next_module = tmp; - } else { - ((struct s_smc *) (p->priv))->os.next_module = NULL; - } + if (lp->os.SharedMemAddr) { + pci_free_consistent(&lp->os.pdev, + lp->os.SharedMemSize, + lp->os.SharedMemAddr, + lp->os.SharedMemDMA); + lp->os.SharedMemAddr = NULL; + } + if (lp->os.LocalRxBuffer) { + pci_free_consistent(&lp->os.pdev, + MAX_FRAME_SIZE, + lp->os.LocalRxBuffer, + lp->os.LocalRxBufferDMA); + lp->os.LocalRxBuffer = NULL; } - return; -} // link_modules - +#ifdef MEM_MAPPED_IO + iounmap((void *) p->base_addr); +#endif + pci_release_regions(pdev); + free_netdev(p); + pci_set_drvdata(pdev, NULL); +} /* * ==================== @@ -653,11 +408,11 @@ * 0 - initialization succeeded * -1 - initialization failed */ -static int skfp_driver_init(struct net_device *dev) +static int skfp_driver_init(struct net_device *dev) { struct s_smc *smc = (struct s_smc *) dev->priv; skfddi_priv *bp = PRIV(dev); - u8 val; /* used for I/O read/writes */ + int err = -EIO; PRINTK(KERN_INFO "entering skfp_driver_init\n"); @@ -666,9 +421,7 @@ smc->hw.iop = dev->base_addr; // Get the interrupt level from the PCI Configuration Table - val = dev->irq; - - smc->hw.irq = val; + smc->hw.irq = dev->irq; spin_lock_init(&bp->DriverLock); @@ -738,7 +491,7 @@ bp->LocalRxBuffer, bp->LocalRxBufferDMA); bp->LocalRxBuffer = NULL; } - return (-1); + return err; } // skfp_driver_init @@ -766,14 +519,15 @@ static int skfp_open(struct net_device *dev) { struct s_smc *smc = (struct s_smc *) dev->priv; + int err; PRINTK(KERN_INFO "entering skfp_open\n"); /* Register IRQ - support shared interrupts by passing device ptr */ - if (request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ, - dev->name, dev)) { - printk("%s: Requested IRQ %d is busy\n", dev->name, dev->irq); - return (-EAGAIN); - } + err = request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ, + dev->name, dev); + if (err) + return err; + /* * Set current address to factory MAC address * @@ -797,6 +551,7 @@ /* Disable promiscuous filter settings */ mac_drv_rx_mode(smc, RX_DISABLE_PROMISC); + netif_start_queue(dev); return (0); } // skfp_open @@ -831,7 +586,6 @@ static int skfp_close(struct net_device *dev) { struct s_smc *smc = (struct s_smc *) dev->priv; - struct sk_buff *skb; skfddi_priv *bp = PRIV(dev); CLI_FBI(); @@ -844,13 +598,8 @@ /* Deregister (free) IRQ */ free_irq(dev->irq, dev); - for (;;) { - skb = skb_dequeue(&bp->SendSkbQueue); - if (skb == NULL) - break; - bp->QueueSkb++; - dev_kfree_skb(skb); - } + skb_queue_purge(&bp->SendSkbQueue); + bp->QueueSkb = MAX_TX_QUEUE_LEN; return (0); } // skfp_close @@ -1285,6 +1034,8 @@ break; default: printk("ioctl for %s: unknow cmd: %04x\n", dev->name, ioc.cmd); + status = -EOPNOTSUPP; + } // switch return status; @@ -2538,63 +2289,21 @@ } // drv_reset_indication - -static struct net_device *mdev; +static struct pci_driver skfddi_pci_driver = { + .name = "skfddi", + .id_table = skfddi_pci_tbl, + .probe = skfp_init_one, + .remove = __devexit_p(skfp_remove_one), +}; static int __init skfd_init(void) { - struct net_device *p; - - if ((mdev = insert_device(NULL, skfp_probe)) == NULL) - return -ENOMEM; - - for (p = mdev; p != NULL; p = ((struct s_smc *)p->priv)->os.next_module) { - if (register_netdev(p) != 0) { - printk("skfddi init_module failed\n"); - return -EIO; - } - } - - return 0; + return pci_module_init(&skfddi_pci_driver); } -static struct net_device *unlink_modules(struct net_device *p) -{ - struct net_device *next = NULL; - - if (p->priv) { /* Private areas allocated? */ - struct s_smc *lp = (struct s_smc *) p->priv; - - next = lp->os.next_module; - - if (lp->os.SharedMemAddr) { - pci_free_consistent(&lp->os.pdev, - lp->os.SharedMemSize, - lp->os.SharedMemAddr, - lp->os.SharedMemDMA); - lp->os.SharedMemAddr = NULL; - } - if (lp->os.LocalRxBuffer) { - pci_free_consistent(&lp->os.pdev, - MAX_FRAME_SIZE, - lp->os.LocalRxBuffer, - lp->os.LocalRxBufferDMA); - lp->os.LocalRxBuffer = NULL; - } - release_region(p->base_addr, - (lp->os.bus_type == SK_BUS_TYPE_PCI ? FP_IO_LEN : 0)); - } - unregister_netdev(p); - printk("%s: unloaded\n", p->name); - free_netdev(p); /* Free the device structure */ - - return next; -} // unlink_modules - static void __exit skfd_exit(void) { - while (mdev) - mdev = unlink_modules(mdev); + pci_unregister_driver(&skfddi_pci_driver); } module_init(skfd_init); diff -Nru a/drivers/net/smc-mca.c b/drivers/net/smc-mca.c --- a/drivers/net/smc-mca.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/smc-mca.c Tue Feb 17 20:00:06 2004 @@ -202,22 +202,18 @@ return -ENXIO; /* Adapter found. */ - dev = alloc_etherdev(0); + dev = alloc_ei_netdev(); if(!dev) return -ENODEV; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, gen_dev); - - rc = register_netdev(dev); - if (rc) - goto err_free_netdev; - - printk(KERN_INFO "%s: %s found in slot %d\n", - dev->name, smc_mca_adapter_names[adapter], slot + 1); - mca_device_set_name(mca_dev, smc_mca_adapter_names[adapter]); mca_device_set_claim(mca_dev, 1); + + printk(KERN_INFO "smc_mca: %s found in slot %d\n", + smc_mca_adapter_names[adapter], slot + 1); + ultra_found++; dev->base_addr = ioaddr = mca_device_transform_ioport(mca_dev, tbase); @@ -266,18 +262,18 @@ /* sanity check, shouldn't happen */ if (dev->mem_start == 0) { rc = -ENODEV; - goto err_unregister_netdev; + goto err_unclaim; } if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) { rc = -ENODEV; - goto err_unregister_netdev; + goto err_unclaim; } reg4 = inb(ioaddr + 4) & 0x7f; outb(reg4, ioaddr + 4); - printk(KERN_INFO "%s: Parameters: %#3x,", dev->name, ioaddr); + printk(KERN_INFO "smc_mca[%d]: Parameters: %#3x,", slot + 1, ioaddr); for (i = 0; i < 6; i++) printk(" %2.2X", dev->dev_addr[i] = inb(ioaddr + 8 + i)); @@ -299,14 +295,6 @@ outb(reg4, ioaddr + 4); - /* Allocate dev->priv and fill in 8390 specific dev fields. - */ - - rc = ethdev_init(dev); - if (rc) { - printk (", no memory for dev->priv.\n"); - goto err_release_region; - } gen_dev->driver_data = dev; /* The 8390 isn't at the base address, so fake the offset @@ -339,13 +327,16 @@ NS8390_init(dev, 0); + rc = register_netdev(dev); + if (rc) + goto err_release_region; + return 0; err_release_region: release_region(ioaddr, ULTRA_IO_EXTENT); -err_unregister_netdev: - unregister_netdev(dev); -err_free_netdev: +err_unclaim: + mca_device_set_claim(mca_dev, 0); free_netdev(dev); return rc; } @@ -463,14 +454,14 @@ struct mca_device *mca_dev = to_mca_device(gen_dev); struct net_device *dev = (struct net_device *)gen_dev->driver_data; - if(dev && dev->priv) { + if (dev) { /* NB: ultra_close_card() does free_irq */ int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; + unregister_netdev(dev); mca_device_set_claim(mca_dev, 0); release_region(ioaddr, ULTRA_IO_EXTENT); - unregister_netdev(dev); - kfree(dev->priv); + free_netdev(dev); } return 0; } diff -Nru a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c --- a/drivers/net/smc-ultra.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/smc-ultra.c Tue Feb 17 20:00:06 2004 @@ -76,7 +76,6 @@ static unsigned int ultra_portlist[] __initdata = {0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380, 0}; -int ultra_probe(struct net_device *dev); static int ultra_probe1(struct net_device *dev, int ioaddr); #ifdef __ISAPNP__ @@ -127,10 +126,11 @@ following. */ -int __init ultra_probe(struct net_device *dev) +static int __init do_ultra_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; + int irq = dev->irq; SET_MODULE_OWNER(dev); @@ -147,13 +147,51 @@ printk(KERN_NOTICE "smc-ultra.c: No ISAPnP cards found, trying standard ones...\n"); #endif - for (i = 0; ultra_portlist[i]; i++) + for (i = 0; ultra_portlist[i]; i++) { + dev->irq = irq; if (ultra_probe1(dev, ultra_portlist[i]) == 0) return 0; + } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + /* NB: ultra_close_card() does free_irq */ +#ifdef __ISAPNP__ + struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; + if (idev) + pnp_device_detach(idev); +#endif + release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT); +} + +struct net_device * __init ultra_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_ultra_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init ultra_probe1(struct net_device *dev, int ioaddr) { int i, retval; @@ -226,13 +264,6 @@ eeprom_irq = 1; } - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (", no memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - /* The 8390 isn't at the base address, so fake the offset */ dev->base_addr = ioaddr+ULTRA_NIC_OFFSET; @@ -500,7 +531,7 @@ #ifdef MODULE #define MAX_ULTRA_CARDS 4 /* Max number of Ultra cards per module */ -static struct net_device dev_ultra[MAX_ULTRA_CARDS]; +static struct net_device *dev_ultra[MAX_ULTRA_CARDS]; static int io[MAX_ULTRA_CARDS]; static int irq[MAX_ULTRA_CARDS]; @@ -516,26 +547,33 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) { - struct net_device *dev = &dev_ultra[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->init = ultra_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "smc-ultra.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) return 0; /* Got at least one. */ - return -ENXIO; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + if (do_ultra_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_ultra[found++] = dev; + continue; + } + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]); + break; } - - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -544,20 +582,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) { - struct net_device *dev = &dev_ultra[this_dev]; - if (dev->priv != NULL) { - /* NB: ultra_close_card() does free_irq */ - int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; - -#ifdef __ISAPNP__ - struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; - if (idev) - pnp_device_detach(idev); -#endif - + struct net_device *dev = dev_ultra[this_dev]; + if (dev) { unregister_netdev(dev); - release_region(ioaddr, ULTRA_IO_EXTENT); - kfree(dev->priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/smc-ultra32.c b/drivers/net/smc-ultra32.c --- a/drivers/net/smc-ultra32.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/smc-ultra32.c Tue Feb 17 20:00:08 2004 @@ -61,7 +61,6 @@ #include "8390.h" -int ultra32_probe(struct net_device *dev); static int ultra32_probe1(struct net_device *dev, int ioaddr); static int ultra32_open(struct net_device *dev); static void ultra32_reset_8390(struct net_device *dev); @@ -98,26 +97,59 @@ #define ULTRA32_CFG6 (-0x15) /* 0xc8b */ #define ULTRA32_CFG7 0x0d /* 0xcad */ +static void cleanup_card(struct net_device *dev) +{ + int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; + /* NB: ultra32_close_card() does free_irq */ + release_region(ioaddr, ULTRA32_IO_EXTENT); +} /* Probe for the Ultra32. This looks like a 8013 with the station address PROM at I/O ports +8 to +13, with a checksum following. */ -int __init ultra32_probe(struct net_device *dev) +struct net_device * __init ultra32_probe(int unit) { - int ioaddr; - - if (!EISA_bus) return -ENODEV; + struct net_device *dev; + int base; + int irq; + int err = -ENODEV; + + if (!EISA_bus) + return ERR_PTR(-ENODEV); + + dev = alloc_ei_netdev(); + + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); - /* EISA spec allows for up to 16 slots, but 8 is typical. */ - for (ioaddr = 0x1000 + ULTRA32_BASE; ioaddr < 0x9000; ioaddr += 0x1000) - if (ultra32_probe1(dev, ioaddr) == 0) - return 0; + irq = dev->irq; - return -ENODEV; + /* EISA spec allows for up to 16 slots, but 8 is typical. */ + for (base = 0x1000 + ULTRA32_BASE; base < 0x9000; base += 0x1000) { + if (ultra32_probe1(dev, base) == 0) + break; + dev->irq = irq; + } + if (base >= 0x9000) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); } static int __init ultra32_probe1(struct net_device *dev, int ioaddr) @@ -210,13 +242,6 @@ dev->irq = irq; } - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (", no memory for dev->priv.\n"); - retval = -ENOMEM; - goto out; - } - /* The 8390 isn't at the base address, so fake the offset */ dev->base_addr = ioaddr + ULTRA32_NIC_OFFSET; @@ -380,7 +405,7 @@ #ifdef MODULE #define MAX_ULTRA32_CARDS 4 /* Max number of Ultra cards per module */ -static struct net_device dev_ultra[MAX_ULTRA32_CARDS]; +static struct net_device *dev_ultra[MAX_ULTRA32_CARDS]; MODULE_DESCRIPTION("SMC Ultra32 EISA ethernet driver"); MODULE_LICENSE("GPL"); @@ -390,18 +415,15 @@ int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) { - struct net_device *dev = &dev_ultra[this_dev]; - dev->init = ultra32_probe; - if (register_netdev(dev) != 0) { - if (found > 0) { /* Got at least one. */ - return 0; - } - printk(KERN_WARNING "smc-ultra32.c: No SMC Ultra32 found.\n"); - return -ENXIO; - } - found++; + struct net_device *dev = ultra32_probe(-1); + if (IS_ERR(dev)) + break; + dev_ultra[found++] = dev; } - return 0; + if (found) + return 0; + printk(KERN_WARNING "smc-ultra32.c: No SMC Ultra32 found.\n"); + return -ENXIO; } void cleanup_module(void) @@ -409,14 +431,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) { - struct net_device *dev = &dev_ultra[this_dev]; - if (dev->priv != NULL) { - int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; - void *priv = dev->priv; - /* NB: ultra32_close_card() does free_irq */ - release_region(ioaddr, ULTRA32_IO_EXTENT); + struct net_device *dev = dev_ultra[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/smc9194.c b/drivers/net/smc9194.c --- a/drivers/net/smc9194.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/smc9194.c Tue Feb 17 20:00:07 2004 @@ -191,7 +191,7 @@ . . NB:This shouldn't be static since it is referred to externally. */ -int smc_init(struct net_device *dev); +struct net_device *smc_init(int unit); /* . The kernel calls this function when someone wants to use the device, @@ -672,7 +672,7 @@ /*------------------------------------------------------------------------- | - | smc_init( struct net_device * dev ) + | smc_init(int unit) | Input parameters: | dev->base_addr == 0, try to find all possible locations | dev->base_addr == 1, return failure code @@ -680,31 +680,56 @@ | dev->base_addr == this is the address to check | | Output: - | 0 --> there is a device - | anything else, error + | pointer to net_device or ERR_PTR(error) | --------------------------------------------------------------------------- */ -int __init smc_init(struct net_device *dev) +static int io; +static int irq; +static int ifport; + +struct net_device * __init smc_init(int unit) { - int i; - int base_addr = dev->base_addr; + struct net_device *dev = alloc_etherdev(sizeof(struct smc_local)); + unsigned *port; + int err = 0; + + if (!dev) + return ERR_PTR(-ENODEV); + + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + io = dev->base_addr; + irq = dev->irq; + } SET_MODULE_OWNER(dev); - /* try a specific location */ - if (base_addr > 0x1ff) - return smc_probe(dev, base_addr); - else if (base_addr != 0) - return -ENXIO; - - /* check every ethernet address */ - for (i = 0; smc_portlist[i]; i++) - if (smc_probe(dev, smc_portlist[i]) == 0) - return 0; - - /* couldn't find anything */ - return -ENODEV; + if (io > 0x1ff) { /* Check a single specified location. */ + err = smc_probe(dev, io); + } else if (io != 0) { /* Don't probe at all. */ + err = -ENXIO; + } else { + for (port = smc_portlist; *port; port++) { + if (smc_probe(dev, *port) == 0) + break; + } + if (!*port) + err = -ENODEV; + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + free_irq(dev->irq, dev); + release_region(dev->base_addr, SMC_IO_EXTENT); +out: + free_netdev(dev); + return ERR_PTR(err); } /*---------------------------------------------------------------------- @@ -821,6 +846,9 @@ if (!request_region(ioaddr, SMC_IO_EXTENT, dev->name)) return -EBUSY; + dev->irq = irq; + dev->if_port = ifport; + /* First, see if the high byte is 0x33 */ bank = inw( ioaddr + BANK_SELECT ); if ( (bank & 0xFF00) != 0x3300 ) { @@ -969,28 +997,14 @@ printk("%2.2x:", dev->dev_addr[i] ); printk("%2.2x \n", dev->dev_addr[5] ); - - /* Initialize the private structure. */ - if (dev->priv == NULL) { - dev->priv = kmalloc(sizeof(struct smc_local), GFP_KERNEL); - if (dev->priv == NULL) { - retval = -ENOMEM; - goto err_out; - } - } /* set the private data to zero by default */ memset(dev->priv, 0, sizeof(struct smc_local)); - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); - /* Grab the IRQ */ retval = request_irq(dev->irq, &smc_interrupt, 0, dev->name, dev); if (retval) { printk("%s: unable to get IRQ %d (irqval=%d).\n", dev->name, dev->irq, retval); - kfree(dev->priv); - dev->priv = NULL; goto err_out; } @@ -1524,10 +1538,7 @@ #ifdef MODULE -static struct net_device devSMC9194; -static int io; -static int irq; -static int ifport; +static struct net_device *devSMC9194; MODULE_LICENSE("GPL"); MODULE_PARM(io, "i"); @@ -1539,32 +1550,23 @@ int init_module(void) { - int result; - if (io == 0) printk(KERN_WARNING CARDNAME": You shouldn't use auto-probing with insmod!\n" ); /* copy the parameters from insmod into the device structure */ - devSMC9194.base_addr = io; - devSMC9194.irq = irq; - devSMC9194.if_port = ifport; - devSMC9194.init = smc_init; - if ((result = register_netdev(&devSMC9194)) != 0) - return result; - + devSMC9194 = smc_init(-1); + if (IS_ERR(devSMC9194)) + return PTR_ERR(devSMC9194); return 0; } void cleanup_module(void) { - unregister_netdev(&devSMC9194); - - free_irq(devSMC9194.irq, &devSMC9194); - release_region(devSMC9194.base_addr, SMC_IO_EXTENT); - - if (devSMC9194.priv) - kfree(devSMC9194.priv); + unregister_netdev(devSMC9194); + free_irq(devSMC9194->irq, devSMC9194); + release_region(devSMC9194->base_addr, SMC_IO_EXTENT); + free_netdev(devSMC9194); } #endif /* MODULE */ diff -Nru a/drivers/net/stnic.c b/drivers/net/stnic.c --- a/drivers/net/stnic.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/stnic.c Tue Feb 17 20:00:07 2004 @@ -98,28 +98,20 @@ STNIC_DELAY (); } -int __init stnic_probe(void) +static int __init stnic_probe(void) { struct net_device *dev; - int i; + int i, err; /* If we are not running on a SolutionEngine, give up now */ if (! MACH_SE) return -ENODEV; /* New style probing API */ - dev = init_etherdev (NULL, 0); + dev = alloc_ei_netdev(); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); - stnic_dev = dev; - - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init (dev)) - { - printk (KERN_EMERG "Unable to get memory for dev->priv.\n"); - return -ENOMEM; - } #ifdef CONFIG_SH_STANDARD_BIOS sh_bios_get_node_addr (stnic_eadr); @@ -135,13 +127,11 @@ /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ - i = request_irq (dev->irq, ei_interrupt, 0, dev->name, dev); - if (i) { + err = request_irq (dev->irq, ei_interrupt, 0, dev->name, dev); + if (err) { printk (KERN_EMERG " unable to get IRQ %d.\n", dev->irq); - unregister_netdev(dev); - kfree(dev->priv); - kfree(dev); - return i; + free_netdev(dev); + return err; } ei_status.name = dev->name; @@ -162,6 +152,14 @@ stnic_init (dev); + err = register_netdev(dev); + if (err) { + free_irq(dev->irq, dev); + free_netdev(dev); + return err; + } + stnic_dev = dev; + printk (KERN_INFO "NS ST-NIC 83902A\n"); return 0; @@ -305,15 +303,13 @@ return; } -/* Hardware interrupt handler. */ -irqreturn_t ei_interrupt (int irq, void *dev_id, struct pt_regs *regs); - -irqreturn_t -do_stnic_intr (int irq, void *dev_id, struct pt_regs *regs) +static void __exit stnic_cleanup(void) { - return ei_interrupt (0, stnic_dev, regs); + unregister_netdev(stnic_dev); + free_irq(stnic_dev->irq, stnic_dev); + free_netdev(stnic_dev); } module_init(stnic_probe); -/* No cleanup routine. */ +module_exit(stnic_cleanup); MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/sun3_82586.c b/drivers/net/sun3_82586.c --- a/drivers/net/sun3_82586.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sun3_82586.c Tue Feb 17 20:00:07 2004 @@ -55,6 +55,7 @@ #define DEBUG /* debug on */ #define SYSBUSVAL 0 /* 16 Bit */ +#define SUN3_82586_TOTAL_SIZE PAGE_SIZE #define sun3_attn586() {*(volatile unsigned char *)(dev->base_addr) |= IEOB_ATTEN; *(volatile unsigned char *)(dev->base_addr) &= ~IEOB_ATTEN;} #define sun3_reset586() {*(volatile unsigned char *)(dev->base_addr) = 0; udelay(100); *(volatile unsigned char *)(dev->base_addr) = IEOB_NORSET;} @@ -277,10 +278,12 @@ memset((char *)p->scb,0,sizeof(struct scb_struct)); } -int __init sun3_82586_probe(struct net_device *dev) +struct net_device * __init sun3_82586_probe(int unit) { + struct net_device *dev; unsigned long ioaddr; static int found = 0; + int err = -ENOMEM; /* check that this machine has an onboard 82586 */ switch(idprom->id_machtype) { @@ -290,31 +293,51 @@ break; default: - return(-ENODEV); + return ERR_PTR(-ENODEV); } - if(found) - return -ENODEV; + if (found) + return ERR_PTR(-ENODEV); - ioaddr = (unsigned long)ioremap(IE_OBIO, PAGE_SIZE); + ioaddr = (unsigned long)ioremap(IE_OBIO, SUN3_82586_TOTAL_SIZE); + if (!ioaddr) + return ERR_PTR(-ENOMEM); found = 1; + dev = alloc_etherdev(sizeof(struct priv)); + if (!dev) + goto out; + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + } SET_MODULE_OWNER(dev); dev->irq = IE_IRQ; dev->base_addr = ioaddr; - if(sun3_82586_probe1(dev, ioaddr) == 0) - return 0; - - return -ENODEV; + err = sun3_82586_probe1(dev, ioaddr); + if (err) + goto out1; + err = register_netdev(dev); + if (err) + goto out2; + return dev; + +out2: + release_region(ioaddr, SUN3_82586_TOTAL_SIZE); +out1: + free_netdev(dev); +out: + iounmap((void *)ioaddr); + return ERR_PTR(err); } static int __init sun3_82586_probe1(struct net_device *dev,int ioaddr) { int i, size, retval; -// if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, dev->name)) -// return -EBUSY; + if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, dev->name)) + return -EBUSY; /* copy in the ethernet address from the prom */ for(i = 0; i < 6 ; i++) @@ -341,16 +364,6 @@ goto out; } - dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL); - if(dev->priv == NULL) { - printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name); - retval = -ENOMEM; - goto out; - } - - /* warning: we don't free it on errors */ - memset((char *) dev->priv,0,sizeof(struct priv)); - ((struct priv *) (dev->priv))->memtop = (char *)dvma_btov(dev->mem_start); ((struct priv *) (dev->priv))->base = (unsigned long) dvma_btov(0); alloc586(dev); @@ -374,11 +387,9 @@ dev->set_multicast_list = set_multicast_list; dev->if_port = 0; - - ether_setup(dev); - return 0; out: + release_region(ioaddr, SUN3_82586_TOTAL_SIZE); return retval; } @@ -1138,21 +1149,23 @@ #ifdef MODULE #error This code is not currently supported as a module -static struct net_device dev_sun3_82586; +static struct net_device *dev_sun3_82586; int init_module(void) { - dev_sun3_82586.init = sun3_82586_probe; - if (register_netdev(&dev_sun3_82586) != 0) - return -EIO; + dev_sun3_82586 = sun3_82586_probe(-1); + if (IS_ERR(dev_sun3_82586)) + return PTR_ERR(dev_sun3_82586); return 0; } void cleanup_module(void) { - unregister_netdev(&dev_sun3_82586); - kfree(dev_sun3_82586.priv); - dev_sun3_82586.priv = NULL; + unsigned long ioaddr = dev_sun3_82586->base_addr; + unregister_netdev(dev_sun3_82586); + release_region(ioaddr, SUN3_82586_TOTAL_SIZE); + iounmap((void *)ioaddr); + free_netdev(dev_sun3_82586); } #endif /* MODULE */ diff -Nru a/drivers/net/sun3lance.c b/drivers/net/sun3lance.c --- a/drivers/net/sun3lance.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sun3lance.c Tue Feb 17 20:00:08 2004 @@ -246,9 +246,11 @@ /************************* End of Prototypes **************************/ -int __init sun3lance_probe( struct net_device *dev ) -{ +struct net_device * __init sun3lance_probe(int unit) +{ + struct net_device *dev; static int found; + int err = -ENODEV; /* check that this machine has an onboard lance */ switch(idprom->id_machtype) { @@ -259,18 +261,37 @@ break; default: - return(-ENODEV); + return ERR_PTR(-ENODEV); } - if(found) - return(-ENODEV); + if (found) + return ERR_PTR(-ENODEV); - if (lance_probe(dev)) { - found = 1; - return( 0 ); + dev = alloc_etherdev(sizeof(struct lance_private)); + if (!dev) + return ERR_PTR(-ENOMEM); + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); } + SET_MODULE_OWNER(dev); + + if (!lance_probe(dev)) + goto out; - return( -ENODEV ); + err = register_netdev(dev); + if (err) + goto out1; + found = 1; + return dev; + +out1: +#ifdef CONFIG_SUN3 + iounmap((void *)dev->base_addr); +#endif +out: + free_netdev(dev); + return ERR_PTR(err); } static int __init lance_probe( struct net_device *dev) @@ -285,6 +306,8 @@ #ifdef CONFIG_SUN3 ioaddr = (unsigned long)ioremap(LANCE_OBIO, PAGE_SIZE); + if (!ioaddr) + return 0; #else ioaddr = SUN3X_LANCE; #endif @@ -303,17 +326,15 @@ ioaddr_probe[0] = tmp1; ioaddr_probe[1] = tmp2; +#ifdef CONFIG_SUN3 + iounmap((void *)ioaddr); +#endif return 0; } - init_etherdev( dev, sizeof(struct lance_private) ); - if (!dev->priv) { - dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL ); - if (!dev->priv) - return 0; - } lp = (struct lance_private *)dev->priv; + /* XXX - leak? */ MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000); lp->iobase = (volatile unsigned short *)ioaddr; @@ -921,32 +942,24 @@ #ifdef MODULE -static char devicename[9]; -static struct net_device sun3lance_dev = -{ - devicename, /* filled in by register_netdev() */ - 0, 0, 0, 0, /* memory */ - 0, 0, /* base, irq */ - 0, 0, 0, NULL, sun3lance_probe, -}; +static struct net_device *sun3lance_dev; int init_module(void) { - int err; - - if ((err = register_netdev( &sun3lance_dev ))) { - if (err == -EIO) { - printk( "SUN3 Lance not detected. Module not loaded.\n"); - } - return( err ); - } - return( 0 ); + sun3lance_dev = sun3lance_probe(-1); + if (IS_ERR(sun3lance_dev)) + return PTR_ERR(sun3lance_dev); + return 0; } void cleanup_module(void) { - unregister_netdev( &sun3lance_dev ); + unregister_netdev(sun3lance_dev); +#ifdef CONFIG_SUN3 + iounmap((void *)sun3lance_dev->base_addr); +#endif + free_netdev(sun3lance_dev); } #endif /* MODULE */ diff -Nru a/drivers/net/sundance.c b/drivers/net/sundance.c --- a/drivers/net/sundance.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sundance.c Tue Feb 17 20:00:07 2004 @@ -986,8 +986,8 @@ { int i; for (i=0; itx_ring_dma + i*sizeof(*np->tx_ring), + printk(KERN_DEBUG "%02x %08llx %08x %08x(%02x) %08x %08x\n", i, + (unsigned long long)np->tx_ring_dma + i*sizeof(*np->tx_ring), le32_to_cpu(np->tx_ring[i].next_desc), le32_to_cpu(np->tx_ring[i].status), (le32_to_cpu(np->tx_ring[i].status) >> 2) & 0xff, @@ -1136,7 +1136,7 @@ static int reset_tx (struct net_device *dev) { - struct netdev_private *np = (struct netdev_private*) dev->priv; + struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; struct sk_buff *skb; int i; @@ -1672,8 +1672,8 @@ switch (cmd) { case SIOCDEVPRIVATE: for (i=0; itx_ring_dma + i*sizeof(*np->tx_ring), + printk(KERN_DEBUG "%02x %08llx %08x %08x(%02x) %08x %08x\n", i, + (unsigned long long)np->tx_ring_dma + i*sizeof(*np->tx_ring), le32_to_cpu(np->tx_ring[i].next_desc), le32_to_cpu(np->tx_ring[i].status), (le32_to_cpu(np->tx_ring[i].status) >> 2) diff -Nru a/drivers/net/sungem.c b/drivers/net/sungem.c --- a/drivers/net/sungem.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/sungem.c Tue Feb 17 20:00:08 2004 @@ -103,6 +103,8 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_GMAC2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_K2_GMAC, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, {0, } }; @@ -778,6 +780,10 @@ struct gem *gp = dev->priv; u32 gem_status = readl(gp->regs + GREG_STAT); + /* Swallow interrupts when shutting the chip down */ + if (gp->hw_running == 0) + goto out; + spin_lock(&gp->lock); if (gem_status & GREG_STAT_ABNORMAL) { @@ -1240,6 +1246,12 @@ gp->lstate = link_force_ok; return 0; case link_aneg: + /* We try forced modes after a failed aneg only on PHYs that don't + * have "magic_aneg" bit set, which means they internally do the + * while forced-mode thingy. On these, we just restart aneg + */ + if (gp->phy_mii.def->magic_aneg) + return 1; if (netif_msg_link(gp)) printk(KERN_INFO "%s: switching to forced 100bt\n", gp->dev->name); @@ -1497,18 +1509,26 @@ * to schedule instead */ pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0); - mdelay(10); for (j = 0; j < 3; j++) { /* Some PHYs used by apple have problem getting back to us, - * we _know_ it's actually at addr 0, that's a hack, but + * we _know_ it's actually at addr 0 or 1, that's a hack, but * it helps to do that reset now. I suspect some motherboards * don't wire the PHY reset line properly, thus the PHY doesn't * come back with the above pmac_call_feature. */ gp->mii_phy_addr = 0; phy_write(gp, MII_BMCR, BMCR_RESET); + gp->mii_phy_addr = 1; + phy_write(gp, MII_BMCR, BMCR_RESET); /* We should probably break some locks here and schedule... */ mdelay(10); + + /* On K2, we only probe the internal PHY at address 1, other + * addresses tend to return garbage. + */ + if (gp->pdev->device == PCI_DEVICE_ID_APPLE_K2_GMAC) + break; + for (i = 0; i < 32; i++) { gp->mii_phy_addr = i; if (phy_read(gp, MII_BMCR) != 0xffff) @@ -1770,6 +1790,8 @@ /* Must be invoked under gp->lock. */ static void gem_init_pause_thresholds(struct gem *gp) { + u32 cfg; + /* Calculate pause thresholds. Setting the OFF threshold to the * full RX fifo size effectively disables PAUSE generation which * is what we do for 10/100 only GEMs which have FIFOs too small @@ -1786,17 +1808,28 @@ gp->rx_pause_on = on; } - { - u32 cfg; - cfg = 0; + /* Configure the chip "burst" DMA mode & enable some + * HW bug fixes on Apple version + */ + cfg = 0; + if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) + cfg |= GREG_CFG_RONPAULBIT | GREG_CFG_ENBUG2FIX; #if !defined(CONFIG_SPARC64) && !defined(CONFIG_ALPHA) - cfg |= GREG_CFG_IBURST; + cfg |= GREG_CFG_IBURST; #endif - cfg |= ((31 << 1) & GREG_CFG_TXDMALIM); - cfg |= ((31 << 6) & GREG_CFG_RXDMALIM); + cfg |= ((31 << 1) & GREG_CFG_TXDMALIM); + cfg |= ((31 << 6) & GREG_CFG_RXDMALIM); + writel(cfg, gp->regs + GREG_CFG); + + /* If Infinite Burst didn't stick, then use different + * thresholds (and Apple bug fixes don't exist) + */ + if (readl(gp->regs + GREG_CFG) & GREG_CFG_IBURST) { + cfg = ((2 << 1) & GREG_CFG_TXDMALIM); + cfg = ((8 << 6) & GREG_CFG_RXDMALIM); writel(cfg, gp->regs + GREG_CFG); - } + } } static int gem_check_invariants(struct gem *gp) @@ -1931,18 +1964,10 @@ u16 cmd; u32 mif_cfg; + mb(); pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 1); - current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout((21 * HZ) / 1000); - - pci_read_config_word(gp->pdev, PCI_COMMAND, &cmd); - cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE; - pci_write_config_word(gp->pdev, PCI_COMMAND, cmd); - pci_write_config_byte(gp->pdev, PCI_LATENCY_TIMER, 6); - pci_write_config_byte(gp->pdev, PCI_CACHE_LINE_SIZE, 8); - - mdelay(1); + udelay(3); mif_cfg = readl(gp->regs + MIF_CFG); mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1); @@ -1950,8 +1975,6 @@ writel(mif_cfg, gp->regs + MIF_CFG); writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE); writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG); - - mdelay(1); } /* Turn off the chip's clock */ @@ -1962,10 +1985,17 @@ #endif /* CONFIG_PPC_PMAC */ -/* Must be invoked under gp->lock. */ +/* Must be invoked with no lock held. */ static void gem_stop_phy(struct gem *gp) { u32 mifcfg; + unsigned long flags; + + /* Let the chip settle down a bit, it seems that helps + * for sleep mode on some models + */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); /* Make sure we aren't polling PHY status change. We * don't currently use that feature though @@ -1976,17 +2006,28 @@ if (gp->wake_on_lan) { /* Setup wake-on-lan */ - } else + } else { writel(0, gp->regs + MAC_RXCFG); + (void)readl(gp->regs + MAC_RXCFG); + /* Machine sleep will die in strange ways if we + * dont wait a bit here, looks like the chip takes + * some time to really shut down + */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); + } + writel(0, gp->regs + MAC_TXCFG); writel(0, gp->regs + MAC_XIFCFG); writel(0, gp->regs + TXDMA_CFG); writel(0, gp->regs + RXDMA_CFG); if (!gp->wake_on_lan) { + spin_lock_irqsave(&gp->lock, flags); gem_stop(gp); writel(MAC_TXRST_CMD, gp->regs + MAC_TXRST); writel(MAC_RXRST_CMD, gp->regs + MAC_RXRST); + spin_unlock_irqrestore(&gp->lock, flags); } if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) @@ -2008,31 +2049,33 @@ /* Shut down the chip, must be called with pm_sem held. */ static void gem_shutdown(struct gem *gp) { - /* Make us not-running to avoid timers respawning */ + /* Make us not-running to avoid timers respawning + * and swallow irqs + */ gp->hw_running = 0; + wmb(); /* Stop the link timer */ del_timer_sync(&gp->link_timer); /* Stop the reset task */ while (gp->reset_task_pending) - schedule(); + yield(); /* Actually stop the chip */ - spin_lock_irq(&gp->lock); if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { gem_stop_phy(gp); - spin_unlock_irq(&gp->lock); - #ifdef CONFIG_PPC_PMAC /* Power down the chip */ gem_apple_powerdown(gp); #endif /* CONFIG_PPC_PMAC */ - } else { - gem_stop(gp); + } else{ + unsigned long flags; - spin_unlock_irq(&gp->lock); + spin_lock_irqsave(&gp->lock, flags); + gem_stop(gp); + spin_unlock_irqrestore(&gp->lock, flags); } } @@ -2692,6 +2735,7 @@ * not have properly shut down the PHY. */ #ifdef CONFIG_PPC_PMAC + gp->of_node = pci_device_to_OF_node(pdev); if (pdev->vendor == PCI_VENDOR_ID_APPLE) gem_apple_powerup(gp); #endif @@ -2725,9 +2769,6 @@ goto err_out_iounmap; } -#ifdef CONFIG_PPC_PMAC - gp->of_node = pci_device_to_OF_node(pdev); -#endif if (gem_get_device_address(gp)) goto err_out_free_consistent; diff -Nru a/drivers/net/sungem.h b/drivers/net/sungem.h --- a/drivers/net/sungem.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/sungem.h Tue Feb 17 20:00:07 2004 @@ -28,6 +28,9 @@ #define GREG_CFG_IBURST 0x00000001 /* Infinite Burst */ #define GREG_CFG_TXDMALIM 0x0000003e /* TX DMA grant limit */ #define GREG_CFG_RXDMALIM 0x000007c0 /* RX DMA grant limit */ +#define GREG_CFG_RONPAULBIT 0x00000800 /* Use mem read multiple for PCI read + * after infinite burst (Apple) */ +#define GREG_CFG_ENBUG2FIX 0x00001000 /* Fix Rx hang after overflow */ /* Global Interrupt Status Register. * diff -Nru a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c --- a/drivers/net/sungem_phy.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/sungem_phy.c Tue Feb 17 20:00:06 2004 @@ -72,7 +72,7 @@ int limit = 10000; val = __phy_read(phy, phy_id, MII_BMCR); - val &= ~BMCR_ISOLATE; + val &= ~(BMCR_ISOLATE | BMCR_PDOWN); val |= BMCR_RESET; __phy_write(phy, phy_id, MII_BMCR, val); @@ -157,7 +157,7 @@ data |= MII_BCM5400_GB_CONTROL_FULLDUPLEXCAP; phy_write(phy, MII_BCM5400_GB_CONTROL, data); - mdelay(10); + udelay(100); /* Reset and configure cascaded 10/100 PHY */ (void)reset_one_mii_phy(phy, 0x1f); @@ -217,7 +217,7 @@ data |= MII_BCM5400_GB_CONTROL_FULLDUPLEXCAP; phy_write(phy, MII_BCM5400_GB_CONTROL, data); - mdelay(10); + udelay(10); /* Reset and configure cascaded 10/100 PHY */ (void)reset_one_mii_phy(phy, 0x1f); @@ -258,7 +258,7 @@ data |= MII_BCM5400_GB_CONTROL_FULLDUPLEXCAP; phy_write(phy, MII_BCM5400_GB_CONTROL, data); - mdelay(10); + udelay(10); /* Reset and configure cascaded 10/100 PHY */ (void)reset_one_mii_phy(phy, 0x1f); @@ -302,6 +302,15 @@ return 0; } +static int bcm5421k2_init(struct mii_phy* phy) +{ + /* Init code borrowed from OF */ + phy_write(phy, 4, 0x01e1); + phy_write(phy, 9, 0x0300); + + return 0; +} + static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise) { u16 ctl, adv; @@ -647,7 +656,7 @@ .phy_id_mask = 0xfffffff0, .name = "BCM5201", .features = MII_BASIC_FEATURES, - .magic_aneg = 0, + .magic_aneg = 1, .ops = &bcm5201_phy_ops }; @@ -666,7 +675,7 @@ .phy_id_mask = 0xfffffff0, .name = "BCM5221", .features = MII_BASIC_FEATURES, - .magic_aneg = 0, + .magic_aneg = 1, .ops = &bcm5221_phy_ops }; @@ -746,6 +755,25 @@ .ops = &bcm5421_phy_ops }; +/* Broadcom BCM 5421 built-in K2 */ +static struct mii_phy_ops bcm5421k2_phy_ops = { + .init = bcm5421k2_init, + .suspend = bcm5411_suspend, + .setup_aneg = bcm54xx_setup_aneg, + .setup_forced = bcm54xx_setup_forced, + .poll_link = genmii_poll_link, + .read_link = bcm54xx_read_link, +}; + +static struct mii_phy_def bcm5421k2_phy_def = { + .phy_id = 0x002062e0, + .phy_id_mask = 0xfffffff0, + .name = "BCM5421-K2", + .features = MII_GBIT_FEATURES, + .magic_aneg = 1, + .ops = &bcm5421k2_phy_ops +}; + /* Marvell 88E1101 (Apple seem to deal with 2 different revs, * I masked out the 8 last bits to get both, but some specs * would be useful here) --BenH. @@ -790,6 +818,7 @@ &bcm5401_phy_def, &bcm5411_phy_def, &bcm5421_phy_def, + &bcm5421k2_phy_def, &marvell_phy_def, &genmii_phy_def, NULL @@ -813,8 +842,8 @@ goto fail; /* Read ID and find matching entry */ - id = (phy_read(phy, MII_PHYSID1) << 16 | phy_read(phy, MII_PHYSID2)) - & 0xfffffff0; + id = (phy_read(phy, MII_PHYSID1) << 16 | phy_read(phy, MII_PHYSID2)); + printk(KERN_DEBUG "PHY ID: %x, addr: %x\n", id, mii_id); for (i=0; (def = mii_phy_table[i]) != NULL; i++) if ((id & def->phy_id_mask) == def->phy_id) break; diff -Nru a/drivers/net/tc35815.c b/drivers/net/tc35815.c --- a/drivers/net/tc35815.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/tc35815.c Tue Feb 17 20:00:05 2004 @@ -463,7 +463,6 @@ static void tc35815_chip_reset(struct net_device *dev); static void tc35815_chip_init(struct net_device *dev); static void tc35815_phy_chip_init(struct net_device *dev); -static int tc35815_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data); /* A list of all installed tc35815 devices. */ static struct net_device *root_tc35815_dev = NULL; @@ -482,78 +481,76 @@ tc35815_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - static int called = 0; int err = 0; int ret; + unsigned long pci_memaddr; + unsigned int pci_irq_line; - if (called) - return -ENODEV; - called++; + printk(KERN_INFO "tc35815_probe: found device %#08x.%#08x\n", ent->vendor, ent->device); - if (pdev) { - unsigned int pci_memaddr; - unsigned int pci_irq_line; + err = pci_enable_device(pdev); + if (err) + return err; - printk(KERN_INFO "tc35815_probe: found device %#08x.%#08x\n", ent->vendor, ent->device); + pci_memaddr = pci_resource_start (pdev, 1); - pci_memaddr = pci_resource_start (pdev, 1); + printk(KERN_INFO " pci_memaddr=%#08lx resource_flags=%#08lx\n", pci_memaddr, pci_resource_flags (pdev, 0)); - printk(KERN_INFO " pci_memaddr=%#08lx resource_flags=%#08lx\n", pci_memaddr, pci_resource_flags (pdev, 0)); + if (!pci_memaddr) { + printk(KERN_WARNING "no PCI MEM resources, aborting\n"); + ret = -ENODEV; + goto err_out; + } + pci_irq_line = pdev->irq; + /* irq disabled. */ + if (pci_irq_line == 0) { + printk(KERN_WARNING "no PCI irq, aborting\n"); + ret = -ENODEV; + goto err_out; + } - if (!pci_memaddr) { - printk(KERN_WARNING "no PCI MEM resources, aborting\n"); - return -ENODEV; - } - pci_irq_line = pdev->irq; - /* irq disabled. */ - if (pci_irq_line == 0) { - printk(KERN_WARNING "no PCI irq, aborting\n"); - return -ENODEV; - } + ret = tc35815_probe1(pdev, pci_memaddr, pci_irq_line); + if (ret) + goto err_out; - ret = tc35815_probe1(pdev, pci_memaddr, pci_irq_line); + pci_set_master(pdev); - if (!ret) { - if ((err = pci_enable_device(pdev)) < 0) { - printk(KERN_ERR "tc35815_probe: failed to enable device -- err=%d\n", err); - return err; - } - pci_set_master(pdev); - } + return 0; - return ret; - } - return -ENODEV; +err_out: + pci_disable_device(pdev); + return ret; } static int __devinit tc35815_probe1(struct pci_dev *pdev, unsigned int base_addr, unsigned int irq) { static unsigned version_printed = 0; - int i; + int i, ret; struct tc35815_local *lp; struct tc35815_regs *tr; struct net_device *dev; /* Allocate a new 'dev' if needed. */ - dev = init_etherdev(NULL, sizeof(struct tc35815_local)); + dev = alloc_etherdev(sizeof(struct tc35815_local)); if (dev == NULL) return -ENOMEM; /* - * init_etherdev allocs and zeros dev->priv + * alloc_etherdev allocs and zeros dev->priv */ lp = dev->priv; if (tc35815_debug && version_printed++ == 0) printk(KERN_DEBUG "%s", version); - printk(KERN_INFO "%s: %s found at %#x, irq %d\n", - dev->name, cardname, base_addr, irq); - /* Fill in the 'dev' fields. */ dev->irq = irq; dev->base_addr = (unsigned long)ioremap(base_addr, sizeof(struct tc35815_regs)); + if (!dev->base_addr) { + ret = -ENOMEM; + goto err_out; + } tr = (struct tc35815_regs*)dev->base_addr; tc35815_chip_reset(dev); @@ -570,9 +567,6 @@ dev->dev_addr[i] = data & 0xff; dev->dev_addr[i+1] = data >> 8; } - for (i = 0; i < 6; i++) - printk(" %2.2x", dev->dev_addr[i]); - printk("\n"); /* Initialize the device structure. */ lp->pdev = pdev; @@ -594,8 +588,6 @@ /* do auto negotiation */ tc35815_phy_chip_init(dev); - printk(KERN_INFO "%s: linkspeed %dMbps, %s Duplex\n", - dev->name, lp->linkspeed, lp->fullduplex ? "Full" : "Half"); dev->open = tc35815_open; dev->stop = tc35815_close; @@ -604,20 +596,34 @@ dev->hard_start_xmit = tc35815_send_packet; dev->get_stats = tc35815_get_stats; dev->set_multicast_list = tc35815_set_multicast_list; + SET_MODULE_OWNER(dev); -#if 0 /* XXX called in init_etherdev */ - /* Fill in the fields of the device structure with ethernet values. */ - ether_setup(dev); -#endif + ret = register_netdev(dev); + if (ret) + goto err_out_iounmap; + + printk(KERN_INFO "%s: %s found at %#x, irq %d, MAC", + dev->name, cardname, base_addr, irq); + for (i = 0; i < 6; i++) + printk(" %2.2x", dev->dev_addr[i]); + printk("\n"); + printk(KERN_INFO "%s: linkspeed %dMbps, %s Duplex\n", + dev->name, lp->linkspeed, lp->fullduplex ? "Full" : "Half"); return 0; + +err_out_iounmap: + iounmap((void *) dev->base_addr); +err_out: + free_netdev(dev); + return ret; } static int tc35815_init_queues(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; int i; unsigned long fd_addr; @@ -702,7 +708,7 @@ static void tc35815_clear_queues(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; int i; for (i = 0; i < TX_FD_NUM; i++) { @@ -719,7 +725,7 @@ static void tc35815_free_queues(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; int i; if (lp->tfd_base) { @@ -805,7 +811,7 @@ static void panic_queues(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; int i; printk("TxFD base %p, start %d, end %d\n", @@ -823,6 +829,7 @@ panic("%s: Illegal queue state.", dev->name); } +#if 0 static void print_buf(char *add, int length) { int i; @@ -839,6 +846,7 @@ } printk("\n"); } +#endif static void print_eth(char *add) { @@ -864,7 +872,7 @@ static int tc35815_open(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; /* * This is used if the interrupt line can turned off (shared). * See 3c503.c for an example of selecting the IRQ at config-time. @@ -888,19 +896,17 @@ lp->tbusy = 0; netif_start_queue(dev); - MOD_INC_USE_COUNT; - return 0; } static void tc35815_tx_timeout(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr; - int flags; + unsigned long flags; spin_lock_irqsave(&lp->lock, flags); - printk(KERN_WARNING "%s: transmit timed out, status %#x\n", + printk(KERN_WARNING "%s: transmit timed out, status %#lx\n", dev->name, tc_readl(&tr->Tx_Stat)); /* Try to restart the adaptor. */ tc35815_chip_reset(dev); @@ -914,7 +920,7 @@ static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr; if (netif_queue_stopped(dev)) { @@ -925,7 +931,7 @@ int tickssofar = jiffies - dev->trans_start; if (tickssofar < 5) return 1; - printk(KERN_WARNING "%s: transmit timed out, status %#x\n", + printk(KERN_WARNING "%s: transmit timed out, status %#lx\n", dev->name, tc_readl(&tr->Tx_Stat)); /* Try to restart the adaptor. */ tc35815_chip_reset(dev); @@ -947,7 +953,7 @@ short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned char *buf = skb->data; struct TxFD *txfd = &lp->tfd_base[lp->tfd_start]; - int flags; + unsigned long flags; lp->stats.tx_bytes += skb->len; @@ -1051,7 +1057,7 @@ } tr = (struct tc35815_regs*)dev->base_addr; - lp = (struct tc35815_local *)dev->priv; + lp = dev->priv; do { status = tc_readl(&tr->Int_Src); @@ -1107,7 +1113,7 @@ static void tc35815_rx(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr; unsigned int fdctl; int i; @@ -1157,7 +1163,9 @@ offset += len; cur_bd++; } - // print_buf(data,pkt_len); +#if 0 + print_buf(data,pkt_len); +#endif if (tc35815_debug > 3) print_eth(data); skb->protocol = eth_type_trans(skb, dev); @@ -1247,7 +1255,7 @@ static void tc35815_check_tx_stat(struct net_device *dev, int status) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; const char *msg = NULL; /* count collisions */ @@ -1304,7 +1312,7 @@ static void tc35815_txdone(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr; struct TxFD *txfd; unsigned int fdctl; @@ -1379,7 +1387,7 @@ static int tc35815_close(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; lp->tbusy = 1; netif_stop_queue(dev); @@ -1391,8 +1399,6 @@ tc35815_free_queues(dev); - MOD_DEC_USE_COUNT; - return 0; } @@ -1402,7 +1408,7 @@ */ static struct net_device_stats *tc35815_get_stats(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr; unsigned long flags; @@ -1456,7 +1462,7 @@ int i; for (i = cam_index / 4; i < cam_index / 4 + 2; i++) { tc_writel(i * 4, &tr->CAM_Adr); - printk("CAM 0x%x: %08x", + printk("CAM 0x%x: %08lx", i * 4, tc_readl(&tr->CAM_Data)); } } @@ -1513,9 +1519,9 @@ static unsigned long tc_phy_read(struct net_device *dev, struct tc35815_regs *tr, int phy, int phy_reg) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; unsigned long data; - int flags; + unsigned long flags; spin_lock_irqsave(&lp->lock, flags); @@ -1529,8 +1535,8 @@ static void tc_phy_write(struct net_device *dev, unsigned long d, struct tc35815_regs *tr, int phy, int phy_reg) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; - int flags; + struct tc35815_local *lp = dev->priv; + unsigned long flags; spin_lock_irqsave(&lp->lock, flags); @@ -1543,7 +1549,7 @@ static void tc35815_phy_chip_init(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr; static int first = 1; unsigned short ctl; @@ -1648,9 +1654,9 @@ static void tc35815_chip_init(struct net_device *dev) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; + struct tc35815_local *lp = dev->priv; struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr; - int flags; + unsigned long flags; unsigned long txctl = TX_CTL_CMD; tc35815_phy_chip_init(dev); @@ -1694,40 +1700,6 @@ tc_writel(virt_to_bus(lp->tfd_base), &tr->TxFrmPtr); /* start DMA transmitter */ #endif spin_unlock_irqrestore(&lp->lock, flags); -} - -static int tc35815_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data) -{ - int len = 0; - off_t pos = 0; - off_t begin = 0; - struct net_device *dev; - - len += sprintf(buffer, "TC35815 statistics:\n"); - for (dev = root_tc35815_dev; dev; dev = ((struct tc35815_local *)dev->priv)->next_module) { - struct tc35815_local *lp = (struct tc35815_local *)dev->priv; - len += sprintf(buffer + len, - "%s: tx_ints %d, rx_ints %d, max_tx_qlen %d\n", - dev->name, - lp->lstats.tx_ints, - lp->lstats.rx_ints, - lp->lstats.max_tx_qlen); - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - - if (pos > offset+length) break; - } - - *start = buffer + (offset - begin); - len -= (offset - begin); - - if (len > length) len = length; - - return len; } /* XXX */ diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c --- a/drivers/net/tg3.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tg3.c Tue Feb 17 20:00:07 2004 @@ -5850,10 +5850,12 @@ return TG3_REGDUMP_LEN; } -static void tg3_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) +static void tg3_get_regs(struct net_device *dev, + struct ethtool_regs *regs, void *_p) { + u32 *p = _p; struct tg3 *tp = dev->priv; - u8 *orig_p = p; + u8 *orig_p = _p; int i; regs->version = 0; @@ -5863,15 +5865,15 @@ spin_lock_irq(&tp->lock); spin_lock(&tp->tx_lock); -#define __GET_REG32(reg) (*((u32 *)(p))++ = tr32(reg)) +#define __GET_REG32(reg) (*(p)++ = tr32(reg)) #define GET_REG32_LOOP(base,len) \ -do { p = orig_p + (base); \ +do { p = (u32 *)(orig_p + (base)); \ for (i = 0; i < len; i += 4) \ __GET_REG32((base) + i); \ } while (0) -#define GET_REG32_1(reg) \ -do { p = orig_p + (reg); \ - __GET_REG32((reg)); \ +#define GET_REG32_1(reg) \ +do { p = (u32 *)(orig_p + (reg)); \ + __GET_REG32((reg)); \ } while (0) GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0); diff -Nru a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c --- a/drivers/net/tokenring/3c359.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tokenring/3c359.c Tue Feb 17 20:00:08 2004 @@ -314,7 +314,6 @@ dev->irq=pdev->irq; dev->base_addr=pci_resource_start(pdev,0) ; - dev->init=NULL ; /* Must be null with new api, otherwise get called twice */ xl_priv->xl_card_name = pci_name(pdev); xl_priv->xl_mmio=ioremap(pci_resource_start(pdev,1), XL_IO_SPACE); xl_priv->pdev = pdev ; @@ -332,7 +331,7 @@ if((i = xl_init(dev))) { iounmap(xl_priv->xl_mmio) ; - kfree(dev) ; + free_netdev(dev) ; pci_release_regions(pdev) ; return i ; } @@ -352,7 +351,7 @@ printk(KERN_ERR "3C359, register netdev failed\n") ; pci_set_drvdata(pdev,NULL) ; iounmap(xl_priv->xl_mmio) ; - kfree(dev) ; + free_netdev(dev) ; pci_release_regions(pdev) ; return i ; } diff -Nru a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c --- a/drivers/net/tokenring/abyss.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/tokenring/abyss.c Tue Feb 17 20:00:06 2004 @@ -181,7 +181,7 @@ err_out_region: release_region(pci_ioaddr, ABYSS_IO_EXTENT); err_out_trdev: - kfree(dev); + free_netdev(dev); return ret; } diff -Nru a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c --- a/drivers/net/tokenring/ibmtr.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tokenring/ibmtr.c Tue Feb 17 20:00:07 2004 @@ -187,7 +187,7 @@ #define TRC_INITV 0x02 /* verbose init trace points */ unsigned char ibmtr_debug_trace = 0; -int ibmtr_probe(struct net_device *dev); +static 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); static int trdev_init(struct net_device *dev); @@ -313,6 +313,39 @@ } } +static void ibmtr_cleanup_card(struct net_device *dev) +{ + if (dev->base_addr) { + outb(0,dev->base_addr+ADAPTRESET); + + schedule_timeout(TR_RST_TIME); /* wait 50ms */ + + outb(0,dev->base_addr+ADAPTRESETREL); + } + +#ifndef PCMCIA + free_irq(dev->irq, dev); + release_region(dev->base_addr, IBMTR_IO_EXTENT); + + { + struct tok_info *ti = (struct tok_info *) dev->priv; + iounmap((u32 *)ti->mmio); + iounmap((u32 *)ti->sram_virt); + } +#endif +} + +int ibmtr_probe_card(struct net_device *dev) +{ + int err = ibmtr_probe(dev); + if (!err) { + err = register_netdev(dev); + if (err) + ibmtr_cleanup_card(dev); + } + return err; +} + /**************************************************************************** * ibmtr_probe(): Routine specified in the network device structure * to probe for an IBM Token Ring Adapter. Routine outline: @@ -325,7 +358,7 @@ * which references it. ****************************************************************************/ -int __devinit ibmtr_probe(struct net_device *dev) +static int ibmtr_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; @@ -1925,23 +1958,24 @@ find_turbo_adapters(io); for (i = 0; io[i] && (i < IBMTR_MAX_ADAPTERS); i++) { + struct net_device *dev; irq[i] = 0; mem[i] = 0; - dev_ibmtr[i] = alloc_trdev(sizeof(struct tok_info)); - if (dev_ibmtr[i] == NULL) { + dev = alloc_trdev(sizeof(struct tok_info)); + if (dev == NULL) { if (i == 0) return -ENOMEM; break; } - 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_netdev(dev_ibmtr[i]) != 0) { - kfree(dev_ibmtr[i]); - dev_ibmtr[i] = NULL; + dev->base_addr = io[i]; + dev->irq = irq[i]; + dev->mem_start = mem[i]; + + if (ibmtr_probe_card(dev)) { + free_netdev(dev); continue; } + dev_ibmtr[i] = dev; count++; } if (count) return 0; @@ -1957,27 +1991,9 @@ for (i = 0; i < IBMTR_MAX_ADAPTERS; i++){ if (!dev_ibmtr[i]) continue; - if (dev_ibmtr[i]->base_addr) { - outb(0,dev_ibmtr[i]->base_addr+ADAPTRESET); - - schedule_timeout(TR_RST_TIME); /* wait 50ms */ - - outb(0,dev_ibmtr[i]->base_addr+ADAPTRESETREL); - } - unregister_netdev(dev_ibmtr[i]); - free_irq(dev_ibmtr[i]->irq, dev_ibmtr[i]); - release_region(dev_ibmtr[i]->base_addr, IBMTR_IO_EXTENT); -#ifndef PCMCIA - { - struct tok_info *ti = (struct tok_info *) - dev_ibmtr[i]->priv; - iounmap((u32 *)ti->mmio); - iounmap((u32 *)ti->sram_virt); - } -#endif + ibmtr_cleanup_card(dev_ibmtr[i]); free_netdev(dev_ibmtr[i]); - dev_ibmtr[i] = NULL; } } module_exit(ibmtr_cleanup); diff -Nru a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c --- a/drivers/net/tokenring/madgemc.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tokenring/madgemc.c Tue Feb 17 20:00:08 2004 @@ -197,7 +197,7 @@ card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL); if (card==NULL) { printk("madgemc: unable to allocate card struct\n"); - kfree(dev); + free_netdev(dev); if (madgemc_card_list) return 0; return -1; @@ -360,7 +360,7 @@ kfree(card); tmsdev_term(dev); - kfree(dev); + free_netdev(dev); if (madgemc_card_list) return 0; return -1; @@ -399,7 +399,7 @@ MADGEMC_IO_EXTENT); getout1: kfree(card); - kfree(dev); + free_netdev(dev); slot++; } diff -Nru a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c --- a/drivers/net/tokenring/olympic.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tokenring/olympic.c Tue Feb 17 20:00:07 2004 @@ -228,7 +228,6 @@ #endif dev->irq=pdev->irq; dev->base_addr=pci_resource_start(pdev, 0); - dev->init=NULL; /* Must be NULL otherwise we get called twice */ olympic_priv->olympic_card_name = pci_name(pdev); olympic_priv->pdev = pdev; olympic_priv->olympic_mmio = ioremap(pci_resource_start(pdev,1),256); diff -Nru a/drivers/net/tokenring/proteon.c b/drivers/net/tokenring/proteon.c --- a/drivers/net/tokenring/proteon.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tokenring/proteon.c Tue Feb 17 20:00:08 2004 @@ -63,7 +63,7 @@ static char cardname[] = "Proteon 1392\0"; -int proteon_probe(struct net_device *dev); +struct net_device *proteon_probe(int unit); static int proteon_open(struct net_device *dev); static int proteon_close(struct net_device *dev); static void proteon_read_eeprom(struct net_device *dev); @@ -89,80 +89,69 @@ outw(val, dev->base_addr + reg); } -struct proteon_card { - struct net_device *dev; - struct proteon_card *next; -}; - -static struct proteon_card *proteon_card_list; - -static int __init proteon_probe1(int ioaddr) +static int __init proteon_probe1(struct net_device *dev, int ioaddr) { unsigned char chk1, chk2; int i; + if (!request_region(ioaddr, PROTEON_IO_EXTENT, cardname)) + return -ENODEV; + + chk1 = inb(ioaddr + 0x1f); /* Get Proteon ID reg 1 */ - if (chk1 != 0x1f) - return (-1); + if (chk1 != 0x1f) + goto nodev; + chk1 = inb(ioaddr + 0x1e) & 0x07; /* Get Proteon ID reg 0 */ for (i=0; i<16; i++) { chk2 = inb(ioaddr + 0x1e) & 0x07; if (((chk1 + 1) & 0x07) != chk2) - return (-1); + goto nodev; chk1 = chk2; } + + dev->base_addr = ioaddr; return (0); +nodev: + release_region(ioaddr, PROTEON_IO_EXTENT); + return -ENODEV; } -int __init proteon_probe(struct net_device *dev) +struct net_device * __init proteon_probe(int unit) { - static int versionprinted; + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); struct net_local *tp; - int i,j; - struct proteon_card *card; - -#ifndef MODULE - netdev_boot_setup_check(dev); - tr_setup(dev); -#endif + static int versionprinted; + const unsigned *port; + int j,err = 0; - SET_MODULE_OWNER(dev); - if (!dev->base_addr) - { - for(i = 0; portlist[i]; i++) - { - if (!request_region(portlist[i], PROTEON_IO_EXTENT, cardname)) - continue; + if (!dev) + return ERR_PTR(-ENOMEM); - if(proteon_probe1(portlist[i])) - { - release_region(dev->base_addr, PROTEON_IO_EXTENT); - continue; - } + if (unit >= 0) { + sprintf(dev->name, "tr%d", unit); + netdev_boot_setup_check(dev); + } - dev->base_addr = portlist[i]; - break; + SET_MODULE_OWNER(dev); + if (dev->base_addr) /* probe specific location */ + err = proteon_probe1(dev, dev->base_addr); + else { + for (port = portlist; *port; port++) { + err = proteon_probe1(dev, *port); + if (!err) + break; } - if(!dev->base_addr) - return -1; } - else - { - if (!request_region(dev->base_addr, PROTEON_IO_EXTENT, cardname)) - return -1; - - if(proteon_probe1(dev->base_addr)) - { - release_region(dev->base_addr, PROTEON_IO_EXTENT); - return -1; - } - } + if (err) + goto out4; /* At this point we have found a valid card. */ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); + err = -EIO; if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) goto out4; @@ -264,14 +253,11 @@ printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); - /* Enlist in the card list */ - card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL); - if (!card) + err = register_netdev(dev); + if (err) goto out; - card->next = proteon_card_list; - proteon_card_list = card; - card->dev = dev; - return 0; + + return dev; out: free_dma(dev->dma); out2: @@ -280,7 +266,8 @@ tmsdev_term(dev); out4: release_region(dev->base_addr, PROTEON_IO_EXTENT); - return -1; + free_netdev(dev); + return ERR_PTR(err); } /* @@ -370,50 +357,50 @@ MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); -static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma) +static struct net_device *proteon_dev[ISATR_MAX_ADAPTERS]; + +static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma) { - int res = -ENOMEM; - struct proteon_card *this_card; - struct net_device *dev = alloc_trdev(0); - - if (dev) { - dev->base_addr = io; - dev->irq = irq; - dev->dma = dma; - res = -ENODEV; - if (proteon_probe(dev) == 0) { - res = register_netdev(dev); - if (!res) - return 0; - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - this_card = proteon_card_list; - proteon_card_list = this_card->next; - kfree(this_card); - } - kfree(dev); - } - return res; + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + dev->irq = irq; + dev->dma = dma; + err = proteon_probe1(dev, io); + if (err) + goto out; + + err = register_netdev(dev); + if (err) + goto out1; + return dev; + out1: + release_region(dev->base_addr, PROTEON_IO_EXTENT); + free_irq(dev->irq, dev); + free_dma(dev->dma); + tmsdev_term(dev); + out: + free_netdev(dev); + return ERR_PTR(err); } int init_module(void) { - int i, num; + struct net_device *dev; + int i, num = 0; - num = 0; - if (io[0]) { /* Only probe addresses from command line */ - for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { - if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0) - num++; - } - } else { - for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) { - if (setup_card(portlist[i], irq[num], dma[num]) == 0) - num++; + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + dev = io[0] ? setup_card(io[i], irq[i], dma[i]) + : proteon_probe(-1); + if (!IS_ERR(dev)) { + proteon_dev[i] = dev; + ++num; } } + printk(KERN_NOTICE "proteon.c: %d cards found.\n", num); /* Probe for cards. */ if (num == 0) { @@ -425,11 +412,13 @@ void cleanup_module(void) { - struct net_device *dev; - struct proteon_card *this_card; + int i; - while (proteon_card_list) { - dev = proteon_card_list->dev; + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + struct net_device *dev = proteon_dev[i]; + + if (!dev) + continue; unregister_netdev(dev); release_region(dev->base_addr, PROTEON_IO_EXTENT); @@ -437,9 +426,6 @@ free_dma(dev->dma); tmsdev_term(dev); free_netdev(dev); - this_card = proteon_card_list; - proteon_card_list = this_card->next; - kfree(this_card); } } #endif /* MODULE */ diff -Nru a/drivers/net/tokenring/skisa.c b/drivers/net/tokenring/skisa.c --- a/drivers/net/tokenring/skisa.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/tokenring/skisa.c Tue Feb 17 20:00:05 2004 @@ -56,7 +56,7 @@ /* 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 irqlist[] = { +static const unsigned short irqlist[] = { 3, 5, 9, 10, 11, 12, 15, 0 }; @@ -69,7 +69,6 @@ static char isa_cardname[] = "SK NET TR 4/16 ISA\0"; -int sk_isa_probe(struct net_device *dev); static int sk_isa_open(struct net_device *dev); static int sk_isa_close(struct net_device *dev); static void sk_isa_read_eeprom(struct net_device *dev); @@ -95,17 +94,14 @@ outw(val, dev->base_addr + reg); } -struct sk_isa_card { - struct net_device *dev; - struct sk_isa_card *next; -}; - -static struct sk_isa_card *sk_isa_card_list; -static int __init sk_isa_probe1(int ioaddr) +static int __init sk_isa_probe1(struct net_device *dev, int ioaddr) { unsigned char old, chk1, chk2; + if (!request_region(ioaddr, SK_ISA_IO_EXTENT, isa_cardname)) + return -ENODEV; + old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ chk1 = 0; /* Begin with check value 0 */ @@ -122,8 +118,10 @@ chk2 = inb(ioaddr + SIFADD); chk2 ^= 0x0FE; - if(chk1 != chk2) - return (-1); /* No adapter */ + if(chk1 != chk2) { + release_region(ioaddr, SK_ISA_IO_EXTENT); + return -ENODEV; + } chk1 -= 2; } while(chk1 != 0); /* Repeat 128 times (all byte values) */ @@ -131,58 +129,45 @@ /* Restore the SIFADR value */ outb(old, ioaddr + SIFADR); - return (0); + dev->base_addr = ioaddr; + return 0; } -int __init sk_isa_probe(struct net_device *dev) +struct net_device * __init sk_isa_probe(int unit) { - static int versionprinted; + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); struct net_local *tp; - int i,j; - struct sk_isa_card *card; + static int versionprinted; + const unsigned *port; + int j, err = 0; -#ifndef MODULE - netdev_boot_setup_check(dev); - tr_setup(dev); -#endif + if (!dev) + return ERR_PTR(-ENOMEM); - SET_MODULE_OWNER(dev); - if (!dev->base_addr) - { - for(i = 0; portlist[i]; i++) - { - if (!request_region(portlist[i], SK_ISA_IO_EXTENT, isa_cardname)) - continue; - - if(sk_isa_probe1(portlist[i])) - { - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - continue; - } + if (unit >= 0) { + sprintf(dev->name, "tr%d", unit); + netdev_boot_setup_check(dev); + } - dev->base_addr = portlist[i]; - break; + SET_MODULE_OWNER(dev); + if (dev->base_addr) /* probe specific location */ + err = sk_isa_probe1(dev, dev->base_addr); + else { + for (port = portlist; *port; port++) { + err = sk_isa_probe1(dev, *port); + if (!err) + break; } - if(!dev->base_addr) - return -1; } - else - { - if (!request_region(dev->base_addr, SK_ISA_IO_EXTENT, isa_cardname)) - return -1; - - if(sk_isa_probe1(dev->base_addr)) - { - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - return -1; - } - } + if (err) + goto out4; /* At this point we have found a valid card. */ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); + err = -EIO; if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) goto out4; @@ -284,14 +269,11 @@ printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); - /* Enlist in the card list */ - card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL); - if (!card) + err = register_netdev(dev); + if (err) goto out; - card->next = sk_isa_card_list; - sk_isa_card_list = card; - card->dev = dev; - return 0; + + return dev; out: free_dma(dev->dma); out2: @@ -300,7 +282,8 @@ tmsdev_term(dev); out4: release_region(dev->base_addr, SK_ISA_IO_EXTENT); - return -1; + free_netdev(dev); + return ERR_PTR(err); } /* @@ -373,6 +356,8 @@ #define ISATR_MAX_ADAPTERS 3 +static struct net_device *sk_isa_dev[ISATR_MAX_ADAPTERS]; + static int io[ISATR_MAX_ADAPTERS]; static int irq[ISATR_MAX_ADAPTERS]; static int dma[ISATR_MAX_ADAPTERS]; @@ -383,50 +368,54 @@ MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); -static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma) +static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma) { - int res = -ENOMEM; - struct sk_isa_card *this_card; - struct net_device *dev = alloc_trdev(0); - - if (dev) { - dev->base_addr = io; - dev->irq = irq; - dev->dma = dma; - res = -ENODEV; - if (sk_isa_probe(dev) == 0) { - res = register_netdev(dev); - if (!res) - return 0; - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - this_card = sk_isa_card_list; - sk_isa_card_list = this_card->next; - kfree(this_card); - } - kfree(dev); - } - return res; + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + dev->base_addr = io; + dev->irq = irq; + dev->dma = dma; + + err = sk_isa_probe1(dev, io); + if (err) + goto out; + + err = register_netdev(dev); + if (err) + goto out1; + return dev; + + out1: + release_region(dev->base_addr, SK_ISA_IO_EXTENT); + free_irq(dev->irq, dev); + free_dma(dev->dma); + tmsdev_term(dev); + out: + free_netdev(dev); + return ERR_PTR(err); } int init_module(void) { + struct net_device *dev; int i, num; num = 0; - if (io[0]) { /* Only probe addresses from command line */ - for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { - if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0) - num++; - } - } else { - for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) { - if (setup_card(portlist[i], irq[num], dma[num]) == 0) - num++; + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + if (io[0]) /* Only probe addresses from command line */ + dev = setup_card(io[i], irq[i], dma[i]); + else + dev = sk_isa_probe(-1); + if (!IS_ERR(dev)) { + sk_isa_dev[i] = dev; + ++num; } } + printk(KERN_NOTICE "skisa.c: %d cards found.\n", num); /* Probe for cards. */ if (num == 0) { @@ -438,11 +427,13 @@ void cleanup_module(void) { - struct net_device *dev; - struct sk_isa_card *this_card; + int i; + + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + struct net_device *dev = sk_isa_dev[i]; - while (sk_isa_card_list) { - dev = sk_isa_card_list->dev; + if (!dev) + continue; unregister_netdev(dev); release_region(dev->base_addr, SK_ISA_IO_EXTENT); @@ -450,9 +441,6 @@ free_dma(dev->dma); tmsdev_term(dev); free_netdev(dev); - this_card = sk_isa_card_list; - sk_isa_card_list = this_card->next; - kfree(this_card); } } #endif /* MODULE */ diff -Nru a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c --- a/drivers/net/tokenring/smctr.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tokenring/smctr.c Tue Feb 17 20:00:07 2004 @@ -69,13 +69,6 @@ #define SMCTR_IO_EXTENT 20 -/* A zero-terminated list of I/O addresses to be probed. */ -static unsigned int smctr_portlist[] __initdata = { - 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300, - 0x320, 0x340, 0x360, 0x380, - 0 -}; - #ifdef CONFIG_MCA static unsigned int smctr_posid = 0x6ec6; #endif @@ -219,7 +212,7 @@ static int smctr_open_tr(struct net_device *dev); /* P */ -int __init smctr_probe (struct net_device *dev); +struct net_device *smctr_probe(int unit); static int __init smctr_probe1(struct net_device *dev, int ioaddr); static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size, struct net_device *dev, __u16 rx_status); @@ -3583,71 +3576,72 @@ return (err); } -/* 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. +/* Check for a network adapter of this type, + * and return device structure if one exists. */ -int __init smctr_probe (struct net_device *dev) +struct net_device __init *smctr_probe(int unit) { - int i; - int base_addr; + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); + static const unsigned ports[] = { + 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300, + 0x320, 0x340, 0x360, 0x380, 0 + }; + const unsigned *port; + int err = 0; -#ifndef MODULE - netdev_boot_setup_check(dev); - tr_setup(dev); -#endif + if (!dev) + return ERR_PTR(-ENOMEM); - base_addr = dev->base_addr; - if(base_addr > 0x1ff) /* Check a single specified location. */ - return (smctr_probe1(dev, base_addr)); - else if(base_addr != 0) /* Don't probe at all. */ - return (-ENXIO); + SET_MODULE_OWNER(dev); - for(i = 0; smctr_portlist[i]; i++) - { - int ioaddr = smctr_portlist[i]; - if (!smctr_probe1(dev, ioaddr)) - return (0); - } - - return (-ENODEV); -} + if (unit >= 0) { + sprintf(dev->name, "tr%d", unit); + netdev_boot_setup_check(dev); + } -static void cleanup_card(struct net_device *dev) -{ + if (dev->base_addr > 0x1ff) /* Check a single specified location. */ + err = smctr_probe1(dev, dev->base_addr); + else if(dev->base_addr != 0) /* Don't probe at all. */ + err =-ENXIO; + else { + for (port = ports; *port; port++) { + err = smctr_probe1(dev, *port); + if (!err) + break; + } + } + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: #ifdef CONFIG_MCA - struct net_local *tp = (struct net_local *)dev->priv; - if (tp->slot_num) + { struct net_local *tp = (struct net_local *)dev->priv; + if (tp->slot_num) mca_mark_as_unused(tp->slot_num); + } #endif release_region(dev->base_addr, SMCTR_IO_EXTENT); - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->priv) - kfree(dev->priv); + free_irq(dev->irq, dev); +out: + free_netdev(dev); + return ERR_PTR(err); } + static int __init smctr_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed; - struct net_local *tp; + struct net_local *tp = dev->priv; int err; __u32 *ram; if(smctr_debug && version_printed++ == 0) printk(version); - /* Setup this devices private information structure */ - tp = (struct net_local *)kmalloc(sizeof(struct net_local), - GFP_KERNEL); - if(tp == NULL) { - err = -ENOMEM; - goto out; - } - memset(tp, 0, sizeof(struct net_local)); spin_lock_init(&tp->lock); - - dev->priv = tp; dev->base_addr = ioaddr; /* Actually detect an adapter now. */ @@ -3656,7 +3650,7 @@ { if ((err = smctr_chk_mca(dev)) < 0) { err = -ENODEV; - goto out_tp; + goto out; } } @@ -3671,7 +3665,6 @@ if(err != UCODE_PRESENT && err != SUCCESS) { printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err); - cleanup_card(dev); err = -EIO; goto out; } @@ -3696,8 +3689,6 @@ dev->set_multicast_list = &smctr_set_multicast_list; return (0); -out_tp: - kfree(tp); out: return err; } @@ -5669,47 +5660,59 @@ static struct net_device* dev_smctr[SMCTR_MAX_ADAPTERS]; static int io[SMCTR_MAX_ADAPTERS]; static int irq[SMCTR_MAX_ADAPTERS]; -static int mem[SMCTR_MAX_ADAPTERS]; MODULE_LICENSE("GPL"); -MODULE_PARM(io, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i"); +MODULE_PARM(io, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i"); MODULE_PARM(irq, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i"); -MODULE_PARM(mem, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i"); -MODULE_PARM(ringspeed, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i"); +MODULE_PARM(ringspeed, "i"); + +static struct net_device *setup_card(int n) +{ + struct net_device *dev = alloc_trdev(sizeof(struct net_local)); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + dev->irq = irq[n]; + err = smctr_probe1(dev, io[n]); + if (err) + goto out; + + err = register_netdev(dev); + if (err) + goto out1; + return dev; + out1: +#ifdef CONFIG_MCA + { struct net_local *tp = (struct net_local *)dev->priv; + if (tp->slot_num) + mca_mark_as_unused(tp->slot_num); + } +#endif + release_region(dev->base_addr, SMCTR_IO_EXTENT); + free_irq(dev->irq, dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + int init_module(void) { - int i; + int i, found = 0; + struct net_device *dev; for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { - struct net_device *dev = alloc_trdev(0); - irq[i] = 0; - mem[i] = 0; - if (!dev) - return -ENOMEM; - dev->base_addr = io[i]; - dev->irq = irq[i]; - dev->mem_start = mem[i]; - - if (smctr_probe(dev) != 0) { - kfree(dev); - if (i == 0) { - printk(KERN_ERR "%s: smctr_probe failed.\n", - cardname); - return -EIO; - } - return 0; - } - if (register_netdev(dev) != 0) { - cleanup_card(dev); - kfree(dev); - continue; - } - dev_smctr[i] = dev; + dev = io[0]? setup_card(i) : smctr_probe(-1); + if (!IS_ERR(dev)) { + ++found; + dev_smctr[i] = dev; + } } - return (0); + return found ? 0 : -ENODEV; } void cleanup_module(void) @@ -5718,9 +5721,20 @@ for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { struct net_device *dev = dev_smctr[i]; + if (dev) { + unregister_netdev(dev); - cleanup_card(dev); +#ifdef CONFIG_MCA + { struct net_local *tp = dev->priv; + if (tp->slot_num) + mca_mark_as_unused(tp->slot_num); + } +#endif + release_region(dev->base_addr, SMCTR_IO_EXTENT); + if (dev->irq) + free_irq(dev->irq, dev); + free_netdev(dev); } } diff -Nru a/drivers/net/tokenring/tms380tr.c b/drivers/net/tokenring/tms380tr.c --- a/drivers/net/tokenring/tms380tr.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tokenring/tms380tr.c Tue Feb 17 20:00:07 2004 @@ -147,7 +147,6 @@ struct net_local* tp); /* "I" */ static int tms380tr_init_adapter(struct net_device *dev); -static int tms380tr_init_card(struct net_device *dev); static void tms380tr_init_ipb(struct net_local *tp); static void tms380tr_init_net_local(struct net_device *dev); static void tms380tr_init_opb(struct net_device *dev); @@ -232,15 +231,6 @@ } #endif -/* Dummy function */ -static int tms380tr_init_card(struct net_device *dev) -{ - if(tms380tr_debug > 3) - printk(KERN_DEBUG "%s: tms380tr_init_card\n", dev->name); - - return (0); -} - /* * Open/initialize the board. This is called sometime after * booting when the 'ifconfig' program is run. @@ -2386,7 +2376,6 @@ } /* These can be overridden by the card driver if needed */ - dev->init = tms380tr_init_card; dev->open = tms380tr_open; dev->stop = tms380tr_close; dev->do_ioctl = NULL; diff -Nru a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c --- a/drivers/net/tokenring/tmspci.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tokenring/tmspci.c Tue Feb 17 20:00:08 2004 @@ -179,7 +179,7 @@ err_out_region: release_region(pci_ioaddr, TMS_PCI_IO_EXTENT); err_out_trdev: - kfree(dev); + free_netdev(dev); return ret; } diff -Nru a/drivers/net/tulip/Kconfig b/drivers/net/tulip/Kconfig --- a/drivers/net/tulip/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tulip/Kconfig Tue Feb 17 20:00:07 2004 @@ -68,6 +68,26 @@ obscure bugs if your mainboard has memory controller timing issues. If in doubt, say N. +config TULIP_NAPI + bool "Use NAPI RX polling " + depends on TULIP + ---help--- + This is of useful for servers and routers dealing with high network loads. + + See . + + If in doubt, say N. + +config TULIP_NAPI_HW_MITIGATION + bool "Use Interrupt Mitigation " + depends on TULIP_NAPI + ---help--- + Use HW to reduce RX interrupts. Not strict necessary since NAPI reduces + RX interrupts but itself. Although this reduces RX interrupts even at + low levels traffic at the cost of a small latency. + + If in doubt, say Y. + config DE4X5 tristate "Generic DECchip & DIGITAL EtherWORKS PCI/EISA" depends on NET_TULIP && (PCI || EISA) diff -Nru a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c --- a/drivers/net/tulip/de2104x.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tulip/de2104x.c Tue Feb 17 20:00:07 2004 @@ -2084,7 +2084,7 @@ err_out_disable: pci_disable_device(pdev); err_out_free: - kfree(dev); + free_netdev(dev); return rc; } diff -Nru a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c --- a/drivers/net/tulip/dmfe.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tulip/dmfe.c Tue Feb 17 20:00:08 2004 @@ -457,7 +457,7 @@ pci_disable_device(pdev); err_out_free: pci_set_drvdata(pdev, NULL); - kfree(dev); + free_netdev(dev); return err; } diff -Nru a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c --- a/drivers/net/tulip/interrupt.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/tulip/interrupt.c Tue Feb 17 20:00:06 2004 @@ -19,13 +19,13 @@ #include #include - int tulip_rx_copybreak; unsigned int tulip_max_interrupt_work; -#ifdef CONFIG_NET_HW_FLOWCONTROL - +#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION #define MIT_SIZE 15 +#define MIT_TABLE 15 /* We use 0 or max */ + unsigned int mit_table[MIT_SIZE+1] = { /* CRS11 21143 hardware Mitigation Control Interrupt @@ -99,16 +99,28 @@ return refilled; } +#ifdef CONFIG_TULIP_NAPI -static int tulip_rx(struct net_device *dev) +void oom_timer(unsigned long data) +{ + struct net_device *dev = (struct net_device *)data; + netif_rx_schedule(dev); +} + +int tulip_poll(struct net_device *dev, int *budget) { struct tulip_private *tp = (struct tulip_private *)dev->priv; int entry = tp->cur_rx % RX_RING_SIZE; - int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx; + int rx_work_limit = *budget; int received = 0; -#ifdef CONFIG_NET_HW_FLOWCONTROL - int drop = 0, mit_sel = 0; + if (!netif_running(dev)) + goto done; + + if (rx_work_limit > dev->quota) + rx_work_limit = dev->quota; + +#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION /* that one buffer is needed for mit activation; or might be a bug in the ring buffer code; check later -- JHS*/ @@ -119,6 +131,237 @@ if (tulip_debug > 4) printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry, tp->rx_ring[entry].status); + + do { + /* Acknowledge current RX interrupt sources. */ + outl((RxIntr | RxNoBuf), dev->base_addr + CSR5); + + + /* If we own the next entry, it is a new packet. Send it up. */ + while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { + s32 status = le32_to_cpu(tp->rx_ring[entry].status); + + + if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx) + break; + + if (tulip_debug > 5) + printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", + dev->name, entry, status); + if (--rx_work_limit < 0) + goto not_done; + + if ((status & 0x38008300) != 0x0300) { + if ((status & 0x38000300) != 0x0300) { + /* Ingore earlier buffers. */ + if ((status & 0xffff) != 0x7fff) { + if (tulip_debug > 1) + printk(KERN_WARNING "%s: Oversized Ethernet frame " + "spanned multiple buffers, status %8.8x!\n", + dev->name, status); + tp->stats.rx_length_errors++; + } + } else if (status & RxDescFatalErr) { + /* There was a fatal error. */ + if (tulip_debug > 2) + printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n", + dev->name, status); + tp->stats.rx_errors++; /* end of a packet.*/ + if (status & 0x0890) tp->stats.rx_length_errors++; + if (status & 0x0004) tp->stats.rx_frame_errors++; + if (status & 0x0002) tp->stats.rx_crc_errors++; + if (status & 0x0001) tp->stats.rx_fifo_errors++; + } + } else { + /* Omit the four octet CRC from the length. */ + short pkt_len = ((status >> 16) & 0x7ff) - 4; + struct sk_buff *skb; + +#ifndef final_version + if (pkt_len > 1518) { + printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n", + dev->name, pkt_len, pkt_len); + pkt_len = 1518; + tp->stats.rx_length_errors++; + } +#endif + /* Check if the packet is long enough to accept without copying + to a minimally-sized skbuff. */ + if (pkt_len < tulip_rx_copybreak + && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { + skb->dev = dev; + skb_reserve(skb, 2); /* 16 byte align the IP header */ + pci_dma_sync_single(tp->pdev, + tp->rx_buffers[entry].mapping, + pkt_len, PCI_DMA_FROMDEVICE); +#if ! defined(__alpha__) + eth_copy_and_sum(skb, tp->rx_buffers[entry].skb->tail, + pkt_len, 0); + skb_put(skb, pkt_len); +#else + memcpy(skb_put(skb, pkt_len), + tp->rx_buffers[entry].skb->tail, + pkt_len); +#endif + } else { /* Pass up the skb already on the Rx ring. */ + char *temp = skb_put(skb = tp->rx_buffers[entry].skb, + pkt_len); + +#ifndef final_version + if (tp->rx_buffers[entry].mapping != + le32_to_cpu(tp->rx_ring[entry].buffer1)) { + printk(KERN_ERR "%s: Internal fault: The skbuff addresses " + "do not match in tulip_rx: %08x vs. %08x %p / %p.\n", + dev->name, + le32_to_cpu(tp->rx_ring[entry].buffer1), + tp->rx_buffers[entry].mapping, + skb->head, temp); + } +#endif + + pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, + PKT_BUF_SZ, PCI_DMA_FROMDEVICE); + + tp->rx_buffers[entry].skb = NULL; + tp->rx_buffers[entry].mapping = 0; + } + skb->protocol = eth_type_trans(skb, dev); + + netif_receive_skb(skb); + + dev->last_rx = jiffies; + tp->stats.rx_packets++; + tp->stats.rx_bytes += pkt_len; + } + received++; + + entry = (++tp->cur_rx) % RX_RING_SIZE; + if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/4) + tulip_refill_rx(dev); + + } + + /* New ack strategy... irq does not ack Rx any longer + hopefully this helps */ + + /* Really bad things can happen here... If new packet arrives + * and an irq arrives (tx or just due to occasionally unset + * mask), it will be acked by irq handler, but new thread + * is not scheduled. It is major hole in design. + * No idea how to fix this if "playing with fire" will fail + * tomorrow (night 011029). If it will not fail, we won + * finally: amount of IO did not increase at all. */ + } while ((inl(dev->base_addr + CSR5) & RxIntr)); + +done: + + #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION + + /* We use this simplistic scheme for IM. It's proven by + real life installations. We can have IM enabled + continuesly but this would cause unnecessary latency. + Unfortunely we can't use all the NET_RX_* feedback here. + This would turn on IM for devices that is not contributing + to backlog congestion with unnecessary latency. + + We monitor the the device RX-ring and have: + + HW Interrupt Mitigation either ON or OFF. + + ON: More then 1 pkt received (per intr.) OR we are dropping + OFF: Only 1 pkt received + + Note. We only use min and max (0, 15) settings from mit_table */ + + + if( tp->flags & HAS_INTR_MITIGATION) { + if( received > 1 ) { + if( ! tp->mit_on ) { + tp->mit_on = 1; + outl(mit_table[MIT_TABLE], dev->base_addr + CSR11); + } + } + else { + if( tp->mit_on ) { + tp->mit_on = 0; + outl(0, dev->base_addr + CSR11); + } + } + } + +#endif /* CONFIG_TULIP_NAPI_HW_MITIGATION */ + + dev->quota -= received; + *budget -= received; + + tulip_refill_rx(dev); + + /* If RX ring is not full we are out of memory. */ + if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom; + + /* Remove us from polling list and enable RX intr. */ + + netif_rx_complete(dev); + outl(tulip_tbl[tp->chip_id].valid_intrs, dev->base_addr+CSR7); + + /* The last op happens after poll completion. Which means the following: + * 1. it can race with disabling irqs in irq handler + * 2. it can race with dise/enabling irqs in other poll threads + * 3. if an irq raised after beginning loop, it will be immediately + * triggered here. + * + * Summarizing: the logic results in some redundant irqs both + * due to races in masking and due to too late acking of already + * processed irqs. But it must not result in losing events. + */ + + return 0; + + not_done: + if (!received) { + + received = dev->quota; /* Not to happen */ + } + dev->quota -= received; + *budget -= received; + + if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 || + tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) + tulip_refill_rx(dev); + + if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom; + + return 1; + + + oom: /* Executed with RX ints disabled */ + + + /* Start timer, stop polling, but do not enable rx interrupts. */ + mod_timer(&tp->oom_timer, jiffies+1); + + /* Think: timer_pending() was an explicit signature of bug. + * Timer can be pending now but fired and completed + * before we did netif_rx_complete(). See? We would lose it. */ + + /* remove ourselves from the polling list */ + netif_rx_complete(dev); + + return 0; +} + +#else /* CONFIG_TULIP_NAPI */ + +static int tulip_rx(struct net_device *dev) +{ + struct tulip_private *tp = (struct tulip_private *)dev->priv; + int entry = tp->cur_rx % RX_RING_SIZE; + int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx; + int received = 0; + + if (tulip_debug > 4) + printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry, + tp->rx_ring[entry].status); /* If we own the next entry, it is a new packet. Send it up. */ while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { s32 status = le32_to_cpu(tp->rx_ring[entry].status); @@ -163,11 +406,6 @@ } #endif -#ifdef CONFIG_NET_HW_FLOWCONTROL - drop = atomic_read(&netdev_dropping); - if (drop) - goto throttle; -#endif /* Check if the packet is long enough to accept without copying to a minimally-sized skbuff. */ if (pkt_len < tulip_rx_copybreak @@ -209,44 +447,9 @@ tp->rx_buffers[entry].mapping = 0; } skb->protocol = eth_type_trans(skb, dev); -#ifdef CONFIG_NET_HW_FLOWCONTROL - mit_sel = -#endif - netif_rx(skb); -#ifdef CONFIG_NET_HW_FLOWCONTROL - switch (mit_sel) { - case NET_RX_SUCCESS: - case NET_RX_CN_LOW: - case NET_RX_CN_MOD: - break; - - case NET_RX_CN_HIGH: - rx_work_limit -= NET_RX_CN_HIGH; /* additional*/ - break; - case NET_RX_DROP: - rx_work_limit = -1; - break; - default: - printk("unknown feedback return code %d\n", mit_sel); - break; - } + netif_rx(skb); - drop = atomic_read(&netdev_dropping); - if (drop) { -throttle: - rx_work_limit = -1; - mit_sel = NET_RX_DROP; - - if (tp->fc_bit) { - long ioaddr = dev->base_addr; - - /* disable Rx & RxNoBuf ints. */ - outl(tulip_tbl[tp->chip_id].valid_intrs&RX_A_NBF_STOP, ioaddr + CSR7); - set_bit(tp->fc_bit, &netdev_fc_xoff); - } - } -#endif dev->last_rx = jiffies; tp->stats.rx_packets++; tp->stats.rx_bytes += pkt_len; @@ -254,42 +457,9 @@ received++; entry = (++tp->cur_rx) % RX_RING_SIZE; } -#ifdef CONFIG_NET_HW_FLOWCONTROL - - /* We use this simplistic scheme for IM. It's proven by - real life installations. We can have IM enabled - continuesly but this would cause unnecessary latency. - Unfortunely we can't use all the NET_RX_* feedback here. - This would turn on IM for devices that is not contributing - to backlog congestion with unnecessary latency. - - We monitor the device RX-ring and have: - - HW Interrupt Mitigation either ON or OFF. - - ON: More then 1 pkt received (per intr.) OR we are dropping - OFF: Only 1 pkt received - - Note. We only use min and max (0, 15) settings from mit_table */ - - - if( tp->flags & HAS_INTR_MITIGATION) { - if((received > 1 || mit_sel == NET_RX_DROP) - && tp->mit_sel != 15 ) { - tp->mit_sel = 15; - tp->mit_change = 1; /* Force IM change */ - } - if((received <= 1 && mit_sel != NET_RX_DROP) && tp->mit_sel != 0 ) { - tp->mit_sel = 0; - tp->mit_change = 1; /* Force IM change */ - } - } - - return RX_RING_SIZE+1; /* maxrx+1 */ -#else return received; -#endif } +#endif /* CONFIG_TULIP_NAPI */ static inline unsigned int phy_interrupt (struct net_device *dev) { @@ -323,7 +493,6 @@ struct tulip_private *tp = (struct tulip_private *)dev->priv; long ioaddr = dev->base_addr; int csr5; - int entry; int missed; int rx = 0; int tx = 0; @@ -331,6 +500,11 @@ int maxrx = RX_RING_SIZE; int maxtx = TX_RING_SIZE; int maxoi = TX_RING_SIZE; +#ifdef CONFIG_TULIP_NAPI + int rxd = 0; +#else + int entry; +#endif unsigned int work_count = tulip_max_interrupt_work; unsigned int handled = 0; @@ -346,22 +520,41 @@ tp->nir++; do { + +#ifdef CONFIG_TULIP_NAPI + + if (!rxd && (csr5 & (RxIntr | RxNoBuf))) { + rxd++; + /* Mask RX intrs and add the device to poll list. */ + outl(tulip_tbl[tp->chip_id].valid_intrs&~RxPollInt, ioaddr + CSR7); + netif_rx_schedule(dev); + + if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass))) + break; + } + + /* Acknowledge the interrupt sources we handle here ASAP + the poll function does Rx and RxNoBuf acking */ + + outl(csr5 & 0x0001ff3f, ioaddr + CSR5); + +#else /* Acknowledge all of the current interrupt sources ASAP. */ outl(csr5 & 0x0001ffff, ioaddr + CSR5); - if (tulip_debug > 4) - printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n", - dev->name, csr5, inl(dev->base_addr + CSR5)); if (csr5 & (RxIntr | RxNoBuf)) { -#ifdef CONFIG_NET_HW_FLOWCONTROL - if ((!tp->fc_bit) || - (!test_bit(tp->fc_bit, &netdev_fc_xoff))) -#endif rx += tulip_rx(dev); tulip_refill_rx(dev); } +#endif /* CONFIG_TULIP_NAPI */ + + if (tulip_debug > 4) + printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n", + dev->name, csr5, inl(dev->base_addr + CSR5)); + + if (csr5 & (TxNoBuf | TxDied | TxIntr | TimerInt)) { unsigned int dirty_tx; @@ -462,15 +655,8 @@ } if (csr5 & RxDied) { /* Missed a Rx frame. */ tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff; -#ifdef CONFIG_NET_HW_FLOWCONTROL - if (tp->fc_bit && !test_bit(tp->fc_bit, &netdev_fc_xoff)) { - tp->stats.rx_errors++; - tulip_start_rxtx(tp); - } -#else tp->stats.rx_errors++; tulip_start_rxtx(tp); -#endif } /* * NB: t21142_lnk_change() does a del_timer_sync(), so be careful if this @@ -504,10 +690,6 @@ if (tulip_debug > 2) printk(KERN_ERR "%s: Re-enabling interrupts, %8.8x.\n", dev->name, csr5); -#ifdef CONFIG_NET_HW_FLOWCONTROL - if (tp->fc_bit && (test_bit(tp->fc_bit, &netdev_fc_xoff))) - if (net_ratelimit()) printk("BUG!! enabling interrupt when FC off (timerintr.) \n"); -#endif outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7); tp->ttimer = 0; oi++; @@ -520,16 +702,9 @@ /* Acknowledge all interrupt sources. */ outl(0x8001ffff, ioaddr + CSR5); if (tp->flags & HAS_INTR_MITIGATION) { -#ifdef CONFIG_NET_HW_FLOWCONTROL - if(tp->mit_change) { - outl(mit_table[tp->mit_sel], ioaddr + CSR11); - tp->mit_change = 0; - } -#else /* Josip Loncaric at ICASE did extensive experimentation to develop a good interrupt mitigation setting.*/ outl(0x8b240000, ioaddr + CSR11); -#endif } else if (tp->chip_id == LC82C168) { /* the LC82C168 doesn't have a hw timer.*/ outl(0x00, ioaddr + CSR7); @@ -537,10 +712,8 @@ } else { /* Mask all interrupting sources, set timer to re-enable. */ -#ifndef CONFIG_NET_HW_FLOWCONTROL outl(((~csr5) & 0x0001ebef) | AbnormalIntr | TimerInt, ioaddr + CSR7); outl(0x0012, ioaddr + CSR11); -#endif } break; } @@ -550,6 +723,21 @@ break; csr5 = inl(ioaddr + CSR5); + +#ifdef CONFIG_TULIP_NAPI + if (rxd) + csr5 &= ~RxPollInt; + } while ((csr5 & (TxNoBuf | + TxDied | + TxIntr | + TimerInt | + /* Abnormal intr. */ + RxDied | + TxFIFOUnderflow | + TxJabber | + TPLnkFail | + SytemError )) != 0); +#else } while ((csr5 & (NormalIntr|AbnormalIntr)) != 0); tulip_refill_rx(dev); @@ -574,6 +762,7 @@ } } } +#endif /* CONFIG_TULIP_NAPI */ if ((missed = inl(ioaddr + CSR8) & 0x1ffff)) { tp->stats.rx_dropped += missed & 0x10000 ? 0x10000 : missed; diff -Nru a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h --- a/drivers/net/tulip/tulip.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/tulip/tulip.h Tue Feb 17 20:00:08 2004 @@ -126,6 +126,7 @@ CFDD_Snooze = (1 << 30), }; +#define RxPollInt (RxIntr|RxNoBuf|RxDied|RxJabber) /* The bits in the CSR5 status registers, mostly interrupt sources. */ enum status_bits { @@ -251,9 +252,9 @@ Making the Tx ring too large decreases the effectiveness of channel bonding and packet priority. There are no ill effects from too-large receive rings. */ -#define TX_RING_SIZE 16 -#define RX_RING_SIZE 32 +#define TX_RING_SIZE 32 +#define RX_RING_SIZE 128 #define MEDIA_MASK 31 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */ @@ -343,17 +344,15 @@ int flags; struct net_device_stats stats; struct timer_list timer; /* Media selection timer. */ + struct timer_list oom_timer; /* Out of memory timer. */ u32 mc_filter[2]; spinlock_t lock; spinlock_t mii_lock; unsigned int cur_rx, cur_tx; /* The next free ring entry */ unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ -#ifdef CONFIG_NET_HW_FLOWCONTROL -#define RX_A_NBF_STOP 0xffffff3f /* To disable RX and RX-NOBUF ints. */ - int fc_bit; - int mit_sel; - int mit_change; /* Signal for Interrupt Mitigtion */ +#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION + int mit_on; #endif unsigned int full_duplex:1; /* Full-duplex operation requested. */ unsigned int full_duplex_lock:1; @@ -415,6 +414,10 @@ extern int tulip_rx_copybreak; irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs); int tulip_refill_rx(struct net_device *dev); +#ifdef CONFIG_TULIP_NAPI +int tulip_poll(struct net_device *dev, int *budget); +#endif + /* media.c */ int tulip_mdio_read(struct net_device *dev, int phy_id, int location); @@ -438,6 +441,7 @@ extern const char * const medianame[]; extern const char tulip_media_cap[]; extern struct tulip_chip_table tulip_tbl[]; +void oom_timer(unsigned long data); extern u8 t21040_csr13[]; #ifndef USE_IO_OPS diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c --- a/drivers/net/tulip/tulip_core.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/tulip/tulip_core.c Tue Feb 17 20:00:07 2004 @@ -14,11 +14,17 @@ */ +#include + #define DRV_NAME "tulip" +#ifdef CONFIG_TULIP_NAPI +#define DRV_VERSION "1.1.13-NAPI" /* Keep at least for test */ +#else #define DRV_VERSION "1.1.13" +#endif #define DRV_RELDATE "May 11, 2002" -#include + #include #include "tulip.h" #include @@ -466,29 +472,16 @@ to an alternate media type. */ tp->timer.expires = RUN_AT(next_tick); add_timer(&tp->timer); -} - -#ifdef CONFIG_NET_HW_FLOWCONTROL -/* Enable receiver */ -void tulip_xon(struct net_device *dev) -{ - struct tulip_private *tp = (struct tulip_private *)dev->priv; - - clear_bit(tp->fc_bit, &netdev_fc_xoff); - if (netif_running(dev)){ - - tulip_refill_rx(dev); - outl(tulip_tbl[tp->chip_id].valid_intrs, dev->base_addr+CSR7); - } -} +#ifdef CONFIG_TULIP_NAPI + init_timer(&tp->oom_timer); + tp->oom_timer.data = (unsigned long)dev; + tp->oom_timer.function = oom_timer; #endif +} static int tulip_open(struct net_device *dev) { -#ifdef CONFIG_NET_HW_FLOWCONTROL - struct tulip_private *tp = (struct tulip_private *)dev->priv; -#endif int retval; if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) @@ -498,10 +491,6 @@ tulip_up (dev); -#ifdef CONFIG_NET_HW_FLOWCONTROL - tp->fc_bit = netdev_register_fc(dev, tulip_xon); -#endif - netif_start_queue (dev); return 0; @@ -582,10 +571,7 @@ #endif /* Stop and restart the chip's Tx processes . */ -#ifdef CONFIG_NET_HW_FLOWCONTROL - if (tp->fc_bit && test_bit(tp->fc_bit,&netdev_fc_xoff)) - printk("BUG tx_timeout restarting rx when fc on\n"); -#endif + tulip_restart_rxtx(tp); /* Trigger an immediate transmit demand. */ outl(0, ioaddr + CSR1); @@ -742,7 +728,9 @@ unsigned long flags; del_timer_sync (&tp->timer); - +#ifdef CONFIG_TULIP_NAPI + del_timer_sync (&tp->oom_timer); +#endif spin_lock_irqsave (&tp->lock, flags); /* Disable interrupts by clearing the interrupt mask. */ @@ -781,13 +769,6 @@ netif_stop_queue (dev); -#ifdef CONFIG_NET_HW_FLOWCONTROL - if (tp->fc_bit) { - int bit = tp->fc_bit; - tp->fc_bit = 0; - netdev_unregister_fc(bit); - } -#endif tulip_down (dev); if (tulip_debug > 1) @@ -1629,6 +1610,10 @@ dev->hard_start_xmit = tulip_start_xmit; dev->tx_timeout = tulip_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; +#ifdef CONFIG_TULIP_NAPI + dev->poll = tulip_poll; + dev->weight = 16; +#endif dev->stop = tulip_close; dev->get_stats = tulip_get_stats; dev->do_ioctl = private_ioctl; @@ -1725,7 +1710,7 @@ pci_release_regions (pdev); err_out_free_netdev: - kfree (dev); + free_netdev (dev); return -ENODEV; } diff -Nru a/drivers/net/tulip/winbond-840.c b/drivers/net/tulip/winbond-840.c --- a/drivers/net/tulip/winbond-840.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/tulip/winbond-840.c Tue Feb 17 20:00:06 2004 @@ -530,7 +530,7 @@ #endif pci_release_regions(pdev); err_out_netdev: - kfree (dev); + free_netdev (dev); return -ENODEV; } diff -Nru a/drivers/net/tulip/xircom_tulip_cb.c b/drivers/net/tulip/xircom_tulip_cb.c --- a/drivers/net/tulip/xircom_tulip_cb.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/tulip/xircom_tulip_cb.c Tue Feb 17 20:00:06 2004 @@ -648,8 +648,7 @@ pci_set_drvdata(pdev, NULL); pci_release_regions(pdev); err_out_free_netdev: - unregister_netdev(dev); - kfree(dev); + free_netdev(dev); return -ENODEV; } diff -Nru a/drivers/net/tun.c b/drivers/net/tun.c --- a/drivers/net/tun.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/tun.c Tue Feb 17 20:00:06 2004 @@ -377,6 +377,7 @@ static int tun_set_iff(struct file *file, struct ifreq *ifr) { struct tun_struct *tun; + struct net_device *dev; int err; tun = tun_get_by_name(ifr->ifr_name); @@ -394,7 +395,6 @@ else { char *name; unsigned long flags = 0; - struct net_device *dev; err = -EINVAL; @@ -424,16 +424,13 @@ if (strchr(dev->name, '%')) { err = dev_alloc_name(dev, dev->name); - if (err < 0) { - kfree(dev); - goto failed; - } + if (err < 0) + goto err_free_dev; } - if ((err = register_netdevice(tun->dev))) { - kfree(dev); - goto failed; - } + err = register_netdevice(tun->dev); + if (err < 0) + goto err_free_dev; list_add(&tun->list, &tun_dev_list); } @@ -451,6 +448,9 @@ strcpy(ifr->ifr_name, tun->dev->name); return 0; + + err_free_dev: + free_netdev(dev); failed: return err; } diff -Nru a/drivers/net/typhoon-firmware.h b/drivers/net/typhoon-firmware.h --- a/drivers/net/typhoon-firmware.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/typhoon-firmware.h Tue Feb 17 20:00:05 2004 @@ -1,7 +1,7 @@ /* - * Copyright 1999-2002 3Com Corporation. All Rights Reserved. + * Copyright 1999-2003 3Com Corporation. All Rights Reserved. * - * Redistribution and use in source and binary forms of the 3CR990img.h + * Redistribution and use in source and binary forms of the 3c990img.h * microcode software are permitted provided that the following conditions * are met: * 1. Redistribution of source code must retain the above copyright @@ -23,385 +23,394 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3CR990img.h + * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3c990img.h * MICROCODE SOFTWARE WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY * IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS * (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) * EMBODIED IN ANY OTHER 3COM HARDWARE OR SOFTWARE EITHER SOLELY OR IN - * COMBINATION WITH THE 3CR990img.h microcode SOFTWARE + * COMBINATION WITH THE 3c990img.h MICROCODE SOFTWARE */ + const u8 typhoon_firmware_image[] = { 0x54, 0x59, 0x50, 0x48, 0x4f, 0x4f, 0x4e, 0x00, 0x02, 0x00, 0x00, 0x00, -0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x01, 0x00, 0x00, -0x6c, 0xef, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0x00, 0x00, 0xea, -0x05, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xea, -0x02, 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0xea, 0x32, 0x02, 0x00, 0xea, -0xa5, 0x14, 0x00, 0xea, 0x07, 0x00, 0x2d, 0xe9, 0x0e, 0x00, 0xa0, 0xe1, -0x00, 0x10, 0x0f, 0xe1, 0xd0, 0x20, 0x9f, 0xe5, 0x12, 0xff, 0x2f, 0xe1, -0xfe, 0xff, 0xff, 0xea, 0x01, 0x00, 0x80, 0xe0, 0x04, 0x20, 0x81, 0xe4, -0x01, 0x00, 0x50, 0xe1, 0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, -0x00, 0xa0, 0xa0, 0xe1, 0x0e, 0xb0, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe3, -0xa8, 0x10, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0xa4, 0x10, 0x9f, 0xe5, -0x00, 0x00, 0x81, 0xe5, 0x01, 0x16, 0xa0, 0xe3, 0x00, 0x00, 0x91, 0xe5, -0x01, 0x00, 0x80, 0xe3, 0x00, 0x00, 0x81, 0xe5, 0xd7, 0x00, 0xa0, 0xe3, -0x00, 0xf0, 0x21, 0xe1, 0x88, 0xd0, 0x9f, 0xe5, 0xdb, 0x00, 0xa0, 0xe3, -0x00, 0xf0, 0x21, 0xe1, 0x7c, 0xd0, 0x9f, 0xe5, 0xd2, 0x00, 0xa0, 0xe3, -0x00, 0xf0, 0x21, 0xe1, 0x74, 0xd0, 0x9f, 0xe5, 0xd1, 0x00, 0xa0, 0xe3, -0x00, 0xf0, 0x21, 0xe1, 0x6c, 0xd0, 0x9f, 0xe5, 0x7b, 0x14, 0x00, 0xeb, -0xd3, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x60, 0xd0, 0x9f, 0xe5, -0x60, 0x00, 0x9f, 0xe5, 0x60, 0x10, 0x9f, 0xe5, 0x60, 0x20, 0x9f, 0xe5, -0xdb, 0xff, 0xff, 0xeb, 0x5c, 0x00, 0x9f, 0xe5, 0x5c, 0x10, 0x9f, 0xe5, -0x00, 0x20, 0xa0, 0xe3, 0xd7, 0xff, 0xff, 0xeb, 0x54, 0x00, 0x9f, 0xe5, -0x54, 0x10, 0x9f, 0xe5, 0xd4, 0xff, 0xff, 0xeb, 0x0a, 0x00, 0xa0, 0xe1, -0x0b, 0xf0, 0xa0, 0xe1, 0xd3, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, -0xd4, 0xff, 0xff, 0xeb, 0x3c, 0xa0, 0x9f, 0xe5, 0x1a, 0xff, 0x2f, 0xe1, -0xc6, 0xff, 0xff, 0xea, 0xbd, 0x20, 0xff, 0xff, 0x0c, 0x00, 0x10, 0x00, -0x1c, 0x00, 0x10, 0x00, 0x3c, 0x38, 0x00, 0x80, 0xfc, 0x37, 0x00, 0x80, -0xfc, 0x3f, 0x00, 0x80, 0x7c, 0x34, 0x00, 0x80, 0x80, 0x0f, 0x00, 0x00, -0x80, 0x30, 0x00, 0x80, 0xad, 0xde, 0xad, 0xde, 0xa8, 0xbc, 0x00, 0x00, -0x24, 0xab, 0x20, 0x40, 0x34, 0x29, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x80, -0x6d, 0xc8, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xd8, 0x56, 0x00, 0x00, 0x06, 0x24, 0x00, 0x00, -0x60, 0x01, 0xff, 0xff, 0xb0, 0xb5, 0x07, 0x1c, 0x12, 0x4c, 0x00, 0x25, -0xe0, 0x6b, 0x00, 0x28, 0x1d, 0xd0, 0x38, 0x1c, 0x10, 0x49, 0x04, 0xf0, -0x37, 0xfd, 0xe1, 0x6b, 0xc0, 0x46, 0x08, 0x60, 0x00, 0x28, 0x14, 0xd0, -0x38, 0x01, 0x0d, 0x49, 0x40, 0x18, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, -0x41, 0x6b, 0x80, 0x29, 0x0b, 0xd2, 0x01, 0x31, 0x41, 0x63, 0xe0, 0x6b, -0xc1, 0x69, 0xc0, 0x46, 0xe1, 0x63, 0x39, 0x07, 0x41, 0x60, 0xc7, 0x62, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x28, 0x1c, 0xfa, 0xe7, 0x00, 0x00, -0x28, 0x17, 0x00, 0x80, 0xee, 0x05, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x80, -0x02, 0x49, 0xca, 0x6b, 0xc0, 0x46, 0xc2, 0x61, 0xc8, 0x63, 0x70, 0x47, -0x28, 0x17, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, -0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe1, -0x00, 0x10, 0xa0, 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x21, 0xe1, -0x1e, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, -0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x21, 0xe1, -0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0xc0, 0xe3, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xcd, 0x57, 0xc3, +0xba, 0x01, 0x2c, 0xe8, 0xcd, 0xef, 0xa9, 0xd9, 0x6f, 0xbb, 0x76, 0x2f, +0x86, 0x49, 0xac, 0x1b, 0x40, 0x01, 0x00, 0x00, 0x8a, 0xe4, 0x00, 0x00, +0x00, 0x00, 0xff, 0xff, 0x39, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xea, +0x04, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, 0xea, +0x01, 0x00, 0x00, 0xea, 0x32, 0x02, 0x00, 0xea, 0xc0, 0x14, 0x00, 0xea, +0x07, 0x00, 0x2d, 0xe9, 0x0e, 0x00, 0xa0, 0xe1, 0x00, 0x10, 0x0f, 0xe1, +0xd0, 0x20, 0x9f, 0xe5, 0x12, 0xff, 0x2f, 0xe1, 0xfe, 0xff, 0xff, 0xea, +0x01, 0x00, 0x80, 0xe0, 0x04, 0x20, 0x81, 0xe4, 0x01, 0x00, 0x50, 0xe1, +0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x00, 0xa0, 0xa0, 0xe1, +0x0e, 0xb0, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe3, 0xa8, 0x10, 0x9f, 0xe5, +0x00, 0x00, 0x81, 0xe5, 0xa4, 0x10, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, +0x01, 0x16, 0xa0, 0xe3, 0x00, 0x00, 0x91, 0xe5, 0x01, 0x00, 0x80, 0xe3, +0x00, 0x00, 0x81, 0xe5, 0xd7, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x88, 0xd0, 0x9f, 0xe5, 0xdb, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x7c, 0xd0, 0x9f, 0xe5, 0xd2, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x74, 0xd0, 0x9f, 0xe5, 0xd1, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x6c, 0xd0, 0x9f, 0xe5, 0x96, 0x14, 0x00, 0xeb, 0xd3, 0x00, 0xa0, 0xe3, +0x00, 0xf0, 0x21, 0xe1, 0x60, 0xd0, 0x9f, 0xe5, 0x60, 0x00, 0x9f, 0xe5, +0x60, 0x10, 0x9f, 0xe5, 0x60, 0x20, 0x9f, 0xe5, 0xdb, 0xff, 0xff, 0xeb, +0x5c, 0x00, 0x9f, 0xe5, 0x5c, 0x10, 0x9f, 0xe5, 0x00, 0x20, 0xa0, 0xe3, +0xd7, 0xff, 0xff, 0xeb, 0x54, 0x00, 0x9f, 0xe5, 0x54, 0x10, 0x9f, 0xe5, +0xd4, 0xff, 0xff, 0xeb, 0x0a, 0x00, 0xa0, 0xe1, 0x0b, 0xf0, 0xa0, 0xe1, +0xd3, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, 0xd4, 0xff, 0xff, 0xeb, +0x3c, 0xa0, 0x9f, 0xe5, 0x1a, 0xff, 0x2f, 0xe1, 0xc6, 0xff, 0xff, 0xea, +0x01, 0x21, 0xff, 0xff, 0x0c, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x10, 0x00, +0x3c, 0x38, 0x00, 0x80, 0xfc, 0x37, 0x00, 0x80, 0xfc, 0x3f, 0x00, 0x80, +0x7c, 0x34, 0x00, 0x80, 0x80, 0x0f, 0x00, 0x00, 0x80, 0x30, 0x00, 0x80, +0xad, 0xde, 0xad, 0xde, 0x5c, 0xbc, 0x00, 0x00, 0x24, 0xab, 0x20, 0x40, +0x48, 0x29, 0x00, 0x00, 0x28, 0x05, 0x00, 0x80, 0x8d, 0xd2, 0x21, 0x40, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x44, 0x57, 0x00, 0x00, 0x71, 0xaf, 0x00, 0x00, 0x60, 0x01, 0xff, 0xff, +0xb0, 0xb5, 0x07, 0x1c, 0x12, 0x4c, 0x00, 0x25, 0x20, 0x68, 0x00, 0x28, +0x1d, 0xd0, 0x38, 0x1c, 0x10, 0x49, 0x04, 0xf0, 0x71, 0xfd, 0x21, 0x68, +0xc0, 0x46, 0x08, 0x60, 0x00, 0x28, 0x14, 0xd0, 0x38, 0x01, 0x0d, 0x49, +0x40, 0x18, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x41, 0x6b, 0x80, 0x29, +0x0b, 0xd2, 0x01, 0x31, 0x41, 0x63, 0x20, 0x68, 0xc1, 0x69, 0xc0, 0x46, +0x21, 0x60, 0x39, 0x07, 0x41, 0x60, 0xc7, 0x62, 0xb0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x28, 0x1c, 0xfa, 0xe7, 0x00, 0x00, 0xe8, 0x17, 0x00, 0x80, +0xee, 0x05, 0x00, 0x00, 0xa0, 0x1c, 0x00, 0x80, 0x02, 0x49, 0x0a, 0x68, +0xc0, 0x46, 0xc2, 0x61, 0x08, 0x60, 0x70, 0x47, +0xe8, 0x17, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, +0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe1, 0x00, 0x10, 0xa0, 0xe1, +0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x0f, 0xe1, -0x40, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, -0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0x10, 0xe3, 0x80, 0x00, 0x80, 0xe3, -0x00, 0xf0, 0x21, 0xe1, 0x00, 0x00, 0x00, 0x12, 0x1e, 0xff, 0x2f, 0xe1, -0x00, 0x00, 0x50, 0xe3, 0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0xc0, 0x13, +0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, +0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0xc0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x0f, 0xe1, 0x40, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x0f, 0xe1, -0x80, 0x00, 0xc0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, -0x91, 0x00, 0x00, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x01, 0x20, 0x80, 0xe0, -0x01, 0x00, 0x80, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x80, 0xb5, 0x08, 0x4f, -0x64, 0x28, 0x04, 0xd3, 0x64, 0x20, 0x38, 0x63, 0x00, 0x20, 0xc0, 0x43, -0x03, 0xe0, 0x38, 0x63, 0x04, 0x49, 0x05, 0xf0, 0xc1, 0xfa, 0x78, 0x63, -0xb8, 0x63, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x88, 0x13, 0x00, 0x00, 0x80, 0xb4, 0x10, 0x4b, 0x00, 0x22, 0x1f, 0x6b, -0x64, 0x2f, 0x03, 0xd2, 0x09, 0x68, 0x09, 0x68, 0x49, 0x08, 0x02, 0xd2, -0x10, 0x1c, 0x80, 0xbc, 0x70, 0x47, 0x19, 0x1c, 0xdb, 0x6b, 0x4f, 0x6b, -0xbb, 0x42, 0x05, 0xd2, 0x40, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x18, 0x18, -0xc8, 0x63, 0xf1, 0xe7, 0x41, 0x68, 0x05, 0x4b, 0x19, 0x43, 0x41, 0x60, -0x04, 0x48, 0xc1, 0x6b, 0x01, 0x31, 0xc1, 0x63, 0x02, 0x20, 0xe8, 0xe7, -0xe8, 0x0d, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x78, 0x2a, 0x00, 0x80, -0x90, 0xb5, 0x07, 0x1c, 0x15, 0x4c, 0x00, 0x20, 0x21, 0x6b, 0x64, 0x29, -0x0b, 0xd2, 0xb9, 0x6e, 0x49, 0x08, 0x08, 0xd3, 0x21, 0x6c, 0xa2, 0x6b, -0x91, 0x42, 0x07, 0xd2, 0xfa, 0x1d, 0x39, 0x32, 0x52, 0x8b, 0x89, 0x18, -0x21, 0x64, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0x6a, 0x39, 0x6b, -0xc0, 0x46, 0x48, 0x62, 0x38, 0x6b, 0x02, 0xf0, 0xe7, 0xfd, 0x38, 0x1c, -0x02, 0xf0, 0xa4, 0xfa, 0x01, 0x20, 0xbb, 0x23, 0x1b, 0x01, 0xe1, 0x18, -0xc8, 0x72, 0x05, 0x49, 0x0a, 0x6c, 0x12, 0x18, 0x0a, 0x64, 0x04, 0x49, -0x8a, 0x6d, 0x12, 0x18, 0x8a, 0x65, 0xe4, 0xe7, 0xe8, 0x0d, 0x00, 0x80, -0x78, 0x2a, 0x00, 0x80, 0x10, 0x2a, 0x00, 0x80, 0x80, 0xb4, 0x0a, 0x48, -0xc0, 0x6d, 0x02, 0x23, 0x18, 0x40, 0x09, 0x4a, 0x00, 0x21, 0x00, 0x28, -0x03, 0xd0, 0xd1, 0x63, 0x11, 0x64, 0x80, 0xbc, 0x70, 0x47, 0x06, 0x48, -0x07, 0x68, 0x7b, 0x1c, 0x03, 0x60, 0x0a, 0x2f, 0xf7, 0xd3, 0x01, 0x60, -0xf3, 0xe7, 0x00, 0x00, 0x10, 0x2a, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, -0x60, 0x01, 0x00, 0x80, 0x70, 0x47, 0x02, 0x04, 0x12, 0x0c, 0x00, 0x0c, -0x10, 0x18, 0x0a, 0x04, 0x12, 0x0c, 0x09, 0x0c, 0x51, 0x18, 0x08, 0x18, -0x01, 0x0c, 0x05, 0xd0, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x0c, 0x08, 0x18, -0x01, 0x0c, 0xf9, 0xd1, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x80, 0xb4, -0x00, 0x22, 0x00, 0x29, 0x18, 0xd0, 0x4f, 0x08, 0x7b, 0x1e, 0x00, 0x2f, +0x80, 0x00, 0x10, 0xe3, 0x80, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x21, 0xe1, +0x00, 0x00, 0x00, 0x12, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x50, 0xe3, +0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0xc0, 0x13, 0x00, 0xf0, 0x21, 0xe1, +0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0xc0, 0xe3, +0x00, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x91, 0x00, 0x00, 0xe0, +0x1e, 0xff, 0x2f, 0xe1, 0x01, 0x20, 0x80, 0xe0, 0x01, 0x00, 0x80, 0xe0, +0x1e, 0xff, 0x2f, 0xe1, 0x80, 0xb5, 0x08, 0x4f, 0x64, 0x28, 0x04, 0xd3, +0x64, 0x20, 0x38, 0x63, 0x00, 0x20, 0xc0, 0x43, 0x03, 0xe0, 0x38, 0x63, +0x04, 0x49, 0x05, 0xf0, 0xf7, 0xfa, 0x78, 0x63, 0xb8, 0x63, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x88, 0x13, 0x00, 0x00, +0x80, 0xb4, 0x10, 0x4b, 0x00, 0x22, 0x1f, 0x6b, 0x64, 0x2f, 0x03, 0xd2, +0x09, 0x68, 0x09, 0x68, 0x49, 0x08, 0x02, 0xd2, 0x10, 0x1c, 0x80, 0xbc, +0x70, 0x47, 0x19, 0x1c, 0xdb, 0x6b, 0x4f, 0x6b, 0xbb, 0x42, 0x05, 0xd2, +0x40, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x18, 0x18, 0xc8, 0x63, 0xf1, 0xe7, +0x41, 0x68, 0x05, 0x4b, 0x19, 0x43, 0x41, 0x60, 0x04, 0x48, 0xc1, 0x6b, +0x01, 0x31, 0xc1, 0x63, 0x02, 0x20, 0xe8, 0xe7, 0x68, 0x0e, 0x00, 0x80, +0x00, 0x00, 0x00, 0x80, 0x0c, 0x2b, 0x00, 0x80, 0x90, 0xb5, 0x07, 0x1c, +0x15, 0x4c, 0x00, 0x20, 0x21, 0x6b, 0x64, 0x29, 0x0b, 0xd2, 0xb9, 0x6e, +0x49, 0x08, 0x08, 0xd3, 0x21, 0x6c, 0xa2, 0x6b, 0x91, 0x42, 0x07, 0xd2, +0xfa, 0x1d, 0x39, 0x32, 0x52, 0x8b, 0x89, 0x18, 0x21, 0x64, 0x90, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x78, 0x6a, 0x39, 0x6b, 0xc0, 0x46, 0x48, 0x62, +0x38, 0x6b, 0x02, 0xf0, 0x23, 0xfe, 0x38, 0x1c, 0x02, 0xf0, 0xde, 0xfa, +0x01, 0x20, 0xbb, 0x23, 0x1b, 0x01, 0xe1, 0x18, 0xc8, 0x73, 0x05, 0x49, +0x0a, 0x6c, 0x12, 0x18, 0x0a, 0x64, 0x04, 0x49, 0x8a, 0x6d, 0x12, 0x18, +0x8a, 0x65, 0xe4, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0x0c, 0x2b, 0x00, 0x80, +0xa4, 0x2a, 0x00, 0x80, 0x80, 0xb4, 0x0a, 0x48, 0xc0, 0x6d, 0x02, 0x23, +0x18, 0x40, 0x09, 0x4a, 0x00, 0x21, 0x00, 0x28, 0x03, 0xd0, 0xd1, 0x63, +0x11, 0x64, 0x80, 0xbc, 0x70, 0x47, 0x06, 0x48, 0x07, 0x68, 0x7b, 0x1c, +0x03, 0x60, 0x0a, 0x2f, 0xf7, 0xd3, 0x01, 0x60, 0xf3, 0xe7, 0x00, 0x00, +0xa4, 0x2a, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, 0xe0, 0x01, 0x00, 0x80, +0x70, 0x47, 0x02, 0x04, 0x12, 0x0c, 0x00, 0x0c, 0x10, 0x18, 0x0a, 0x04, +0x12, 0x0c, 0x09, 0x0c, 0x51, 0x18, 0x08, 0x18, 0x01, 0x0c, 0x05, 0xd0, +0x01, 0x04, 0x09, 0x0c, 0x00, 0x0c, 0x08, 0x18, 0x01, 0x0c, 0xf9, 0xd1, +0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x80, 0xb4, 0x00, 0x22, 0x00, 0x29, +0x18, 0xd0, 0x4f, 0x08, 0x7b, 0x1e, 0x00, 0x2f, 0x06, 0xd0, 0x07, 0x88, 0xba, 0x18, 0x02, 0x30, 0x1f, 0x1c, 0x01, 0x3b, -0x00, 0x2f, 0xf8, 0xd1, 0x49, 0x08, 0x03, 0xd3, -0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x82, 0x18, 0x10, 0x0c, 0x05, 0xd0, -0x10, 0x04, 0x00, 0x0c, 0x11, 0x0c, 0x42, 0x18, 0x10, 0x0c, 0xf9, 0xd1, -0x10, 0x04, 0x00, 0x0c, 0x80, 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x83, 0x89, -0xc7, 0x89, 0xfb, 0x18, 0x07, 0x8a, 0xfb, 0x18, 0x47, 0x8a, 0xfb, 0x18, -0x40, 0x7a, 0x00, 0x02, 0xc7, 0x18, 0x38, 0x0c, 0x05, 0xd0, 0x38, 0x04, -0x00, 0x0c, 0x3b, 0x0c, 0xc7, 0x18, 0x38, 0x0c, 0xf9, 0xd1, 0x08, 0x1c, -0x11, 0x1c, 0xff, 0xf7, 0xc8, 0xff, 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, -0xb0, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x02, 0x23, -0x82, 0x68, 0x1a, 0x40, 0x00, 0x27, 0x00, 0x2a, 0x0f, 0xd0, 0x0a, 0x4a, -0x93, 0x69, 0x01, 0x33, 0x93, 0x61, 0x0a, 0x68, 0x8b, 0x68, 0x9a, 0x18, -0x00, 0x68, 0x1c, 0x18, 0x57, 0x81, 0x09, 0x69, 0x10, 0x1c, 0xff, 0xf7, -0xac, 0xff, 0xc0, 0x43, 0x60, 0x81, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x23, -0x82, 0x68, 0x1a, 0x40, 0x00, 0x27, 0x00, 0x2a, 0x11, 0xd0, 0x4a, 0x68, -0x52, 0x09, 0x0e, 0xd3, 0x09, 0x4a, 0x13, 0x6a, 0x01, 0x33, 0x13, 0x62, -0xcb, 0x68, 0x02, 0x68, 0x9c, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x3a, -0x1a, 0x43, 0x12, 0x68, 0x00, 0xf0, 0x2e, 0xf8, 0x20, 0x82, 0x38, 0x1c, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, -0x90, 0xb5, 0x80, 0x23, 0x82, 0x68, 0x1a, 0x40, 0x00, 0x24, 0x00, 0x2a, -0x15, 0xd0, 0x4a, 0x68, 0x92, 0x09, 0x12, 0xd3, 0x0b, 0x4a, 0xd3, 0x69, -0x01, 0x33, 0xd3, 0x61, 0xcb, 0x68, 0x02, 0x68, 0x9f, 0x18, 0x01, 0x23, -0x9b, 0x07, 0x08, 0x3a, 0x1a, 0x43, 0x12, 0x68, 0x00, 0xf0, 0x0e, 0xf8, -0x00, 0x28, 0x00, 0xd1, 0x04, 0x48, 0xc0, 0x46, 0xf8, 0x80, 0x20, 0x1c, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, -0xff, 0xff, 0x00, 0x00, 0xb0, 0xb5, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0x1c, -0x38, 0x69, 0xb9, 0x68, 0x41, 0x18, 0x38, 0x68, 0xff, 0xf7, 0x53, 0xff, -0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x20, 0x1c, 0xff, 0xf7, 0x39, 0xff, -0x04, 0x1c, 0xb8, 0x68, 0x79, 0x69, 0x40, 0x18, 0x69, 0x68, 0x88, 0x42, -0x0c, 0xd2, 0x2a, 0x68, 0x12, 0x18, 0x09, 0x1a, 0x10, 0x1c, 0x00, 0xf0, -0x05, 0xf9, 0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x20, 0x1c, 0xff, 0xf7, -0x26, 0xff, 0x04, 0x1c, 0xe0, 0x43, 0x00, 0x04, 0x00, 0x0c, 0xb0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0xb8, 0x6b, 0xc0, 0x08, -0x1a, 0xd3, 0xb8, 0x6a, 0xf9, 0x6b, 0x40, 0x18, 0x79, 0x6c, 0x00, 0xf0, -0xed, 0xf8, 0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x0a, 0x48, 0x07, 0xd0, -0x20, 0x23, 0xb9, 0x69, 0x19, 0x43, 0xb9, 0x61, 0x01, 0x6b, 0x01, 0x31, -0x01, 0x63, 0x07, 0xe0, 0xff, 0x23, 0x01, 0x33, 0xb9, 0x69, 0x19, 0x43, -0xb9, 0x61, 0x41, 0x6a, 0x01, 0x31, 0x41, 0x62, 0x00, 0x20, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, 0x80, 0xb5, 0x07, 0x1c, -0xb8, 0x6b, 0x41, 0x09, 0x1c, 0xd3, 0xc0, 0x08, 0x1a, 0xd3, 0xf8, 0x1d, -0x39, 0x30, 0x00, 0x7b, 0x06, 0x28, 0x15, 0xd1, 0x38, 0x1c, 0x00, 0xf0, -0x53, 0xf8, 0x01, 0x1c, 0x0a, 0x48, 0x07, 0xd0, 0x40, 0x23, 0xb9, 0x69, +0x00, 0x2f, 0xf8, 0xd1, 0x49, 0x08, 0x03, 0xd3, 0x00, 0x88, 0x00, 0x06, +0x00, 0x0e, 0x82, 0x18, 0x10, 0x0c, 0x05, 0xd0, 0x10, 0x04, 0x00, 0x0c, +0x11, 0x0c, 0x42, 0x18, 0x10, 0x0c, 0xf9, 0xd1, 0x10, 0x04, 0x00, 0x0c, +0x80, 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x83, 0x89, 0xc7, 0x89, 0xfb, 0x18, +0x07, 0x8a, 0xfb, 0x18, 0x47, 0x8a, 0xfb, 0x18, 0x40, 0x7a, 0x00, 0x02, +0xc7, 0x18, 0x38, 0x0c, 0x05, 0xd0, 0x38, 0x04, 0x00, 0x0c, 0x3b, 0x0c, +0xc7, 0x18, 0x38, 0x0c, 0xf9, 0xd1, 0x08, 0x1c, 0x11, 0x1c, 0xff, 0xf7, +0xc8, 0xff, 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0xb0, 0xff, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x02, 0x23, 0x82, 0x68, 0x1a, 0x40, +0x00, 0x27, 0x00, 0x2a, 0x0f, 0xd0, 0x0a, 0x4a, 0x93, 0x69, 0x01, 0x33, +0x93, 0x61, 0x0a, 0x68, 0x8b, 0x68, 0x9a, 0x18, 0x00, 0x68, 0x1c, 0x18, +0x57, 0x81, 0x09, 0x69, 0x10, 0x1c, 0xff, 0xf7, 0xac, 0xff, 0xc0, 0x43, +0x60, 0x81, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x0c, 0x2b, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x23, 0x82, 0x68, 0x1a, 0x40, +0x00, 0x27, 0x00, 0x2a, 0x11, 0xd0, 0x4a, 0x68, 0x52, 0x09, 0x0e, 0xd3, +0x09, 0x4a, 0x13, 0x6a, 0x01, 0x33, 0x13, 0x62, 0xcb, 0x68, 0x02, 0x68, +0x9c, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x3a, 0x1a, 0x43, 0x12, 0x68, +0x00, 0xf0, 0x2e, 0xf8, 0x20, 0x82, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x80, 0x90, 0xb5, 0x80, 0x23, +0x82, 0x68, 0x1a, 0x40, 0x00, 0x24, 0x00, 0x2a, 0x15, 0xd0, 0x4a, 0x68, +0x92, 0x09, 0x12, 0xd3, 0x0b, 0x4a, 0xd3, 0x69, 0x01, 0x33, 0xd3, 0x61, +0xcb, 0x68, 0x02, 0x68, 0x9f, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x3a, +0x1a, 0x43, 0x12, 0x68, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0x28, 0x00, 0xd1, +0x04, 0x48, 0xc0, 0x46, 0xf8, 0x80, 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, +0xb0, 0xb5, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0x1c, 0x38, 0x69, 0xb9, 0x68, +0x41, 0x18, 0x38, 0x68, 0xff, 0xf7, 0x53, 0xff, 0xc0, 0x43, 0x01, 0x04, +0x09, 0x0c, 0x20, 0x1c, 0xff, 0xf7, 0x39, 0xff, 0x04, 0x1c, 0xb8, 0x68, +0x79, 0x69, 0x40, 0x18, 0x69, 0x68, 0x88, 0x42, 0x0c, 0xd2, 0x2a, 0x68, +0x12, 0x18, 0x09, 0x1a, 0x10, 0x1c, 0x00, 0xf0, 0x05, 0xf9, 0xc0, 0x43, +0x01, 0x04, 0x09, 0x0c, 0x20, 0x1c, 0xff, 0xf7, 0x26, 0xff, 0x04, 0x1c, +0xe0, 0x43, 0x00, 0x04, 0x00, 0x0c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x80, 0xb5, 0x07, 0x1c, 0xb8, 0x6b, 0xc0, 0x08, 0x1a, 0xd3, 0xb8, 0x6a, +0xf9, 0x6b, 0x40, 0x18, 0x79, 0x6c, 0x00, 0xf0, 0xed, 0xf8, 0xc0, 0x43, +0x01, 0x04, 0x09, 0x0c, 0x0a, 0x48, 0x07, 0xd0, 0x20, 0x23, 0xb9, 0x69, +0x19, 0x43, 0xb9, 0x61, 0x01, 0x6b, 0x01, 0x31, 0x01, 0x63, 0x07, 0xe0, +0xff, 0x23, 0x01, 0x33, 0xb9, 0x69, 0x19, 0x43, 0xb9, 0x61, 0x41, 0x6a, +0x01, 0x31, 0x41, 0x62, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x0c, 0x2b, 0x00, 0x80, 0x80, 0xb5, 0x07, 0x1c, 0xb8, 0x6b, 0x41, 0x09, +0x1c, 0xd3, 0xc0, 0x08, 0x1a, 0xd3, 0xf8, 0x1d, 0x39, 0x30, 0x00, 0x7b, +0x06, 0x28, 0x15, 0xd1, 0x38, 0x1c, 0x00, 0xf0, 0x53, 0xf8, 0x01, 0x1c, +0x0a, 0x48, 0x07, 0xd0, 0x40, 0x23, 0xb9, 0x69, 0x19, 0x43, 0xb9, 0x61, 0x81, 0x6b, 0x01, 0x31, 0x81, 0x63, 0x07, 0xe0, -0x01, 0x23, 0x9b, 0x02, 0xb9, 0x69, 0x19, 0x43, -0xb9, 0x61, 0xc1, 0x6a, 0x01, 0x31, 0xc1, 0x62, 0x00, 0x20, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, 0xb0, 0xb5, 0x07, 0x1c, -0xb8, 0x6b, 0x81, 0x09, 0x2c, 0xd3, 0xc0, 0x08, 0x2a, 0xd3, 0xf8, 0x1d, -0x39, 0x30, 0x00, 0x7b, 0x11, 0x28, 0x25, 0xd1, 0xb8, 0x6a, 0x39, 0x6c, -0x40, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x06, 0x30, 0x18, 0x43, 0x00, 0x68, -0x05, 0x04, 0x2d, 0x0c, 0x0f, 0x4c, 0x11, 0xd0, 0x38, 0x1c, 0x00, 0xf0, -0x1f, 0xf8, 0x00, 0x28, 0x0c, 0xd0, 0xa8, 0x42, 0x02, 0xd1, 0x0c, 0x4b, -0x98, 0x42, 0x07, 0xd0, 0x80, 0x23, 0xb8, 0x69, 0x18, 0x43, 0xb8, 0x61, -0x60, 0x6b, 0x01, 0x30, 0x60, 0x63, 0x07, 0xe0, 0x01, 0x23, 0x5b, 0x02, -0xb8, 0x69, 0x18, 0x43, 0xb8, 0x61, 0xa0, 0x6a, 0x01, 0x30, 0xa0, 0x62, -0x00, 0x20, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, -0xff, 0xff, 0x00, 0x00, 0xf0, 0xb5, 0xff, 0xb0, 0x99, 0xb0, 0x04, 0x1c, -0xe0, 0x6b, 0x61, 0x6c, 0x09, 0x18, 0x03, 0xaa, 0x85, 0x18, 0xa3, 0x6a, -0x00, 0x20, 0x8a, 0x08, 0x01, 0x32, 0x97, 0x92, 0x07, 0xd0, 0x82, 0x00, -0x9f, 0x58, 0x03, 0xae, 0xb7, 0x50, 0x97, 0x9a, 0x01, 0x30, 0x82, 0x42, -0xf7, 0xd8, 0x60, 0x6a, 0x01, 0x23, 0x9b, 0x07, 0x04, 0x30, 0x18, 0x43, -0x00, 0x68, 0xc0, 0x46, 0x02, 0x90, 0x02, 0xaf, 0x3f, 0x88, 0x03, 0xa8, -0xff, 0xf7, 0x87, 0xfe, 0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x38, 0x1c, -0xff, 0xf7, 0x6d, 0xfe, 0x07, 0x1c, 0xe0, 0x6b, 0xa1, 0x6c, 0x40, 0x18, -0x61, 0x6a, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x31, 0x19, 0x43, 0x09, 0x68, -0xc0, 0x46, 0x01, 0x91, 0x01, 0xa9, 0x09, 0x88, 0x01, 0x31, 0x88, 0x42, -0x0c, 0xd2, 0xa2, 0x6a, 0x12, 0x18, 0x09, 0x1a, 0x10, 0x1c, 0x00, 0xf0, -0x2f, 0xf8, 0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x38, 0x1c, 0xff, 0xf7, -0x50, 0xfe, 0x07, 0x1c, 0xa8, 0x89, 0xe9, 0x89, 0x08, 0x18, 0x29, 0x8a, -0x08, 0x18, 0x69, 0x8a, 0x08, 0x18, 0x69, 0x7a, 0x09, 0x02, 0x08, 0x18, -0xa1, 0x6c, 0x62, 0x6c, 0x89, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x11, 0x02, -0x12, 0x0a, 0x11, 0x43, 0x09, 0x04, 0x09, 0x0c, 0x09, 0x18, 0x08, 0x0c, -0x05, 0xd0, 0x08, 0x04, 0x00, 0x0c, 0x09, 0x0c, 0x41, 0x18, 0x08, 0x0c, -0xf9, 0xd1, 0x38, 0x1c, 0xff, 0xf7, 0x2f, 0xfe, 0xc0, 0x43, 0x00, 0x04, -0x00, 0x0c, 0x7f, 0xb0, 0x19, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xb0, 0xb4, 0x00, 0x22, 0x00, 0x29, 0x2e, 0xd0, 0x83, 0x07, 0x9b, 0x0f, -0xdc, 0x00, 0x47, 0x18, 0x04, 0x25, 0xef, 0x1b, 0xbf, 0x07, 0xbf, 0x0f, -0xff, 0x00, 0x80, 0x08, 0x80, 0x00, 0x59, 0x18, 0x03, 0x31, 0x89, 0x08, -0x4d, 0x1e, 0x02, 0xc8, 0xe1, 0x40, 0xa1, 0x40, 0x6b, 0x1e, 0x00, 0x2d, -0x09, 0xd0, 0x0c, 0x04, 0x24, 0x0c, 0xa2, 0x18, 0x09, 0x0c, 0x8a, 0x18, -0x02, 0xc8, 0x1c, 0x1c, 0x01, 0x3b, 0x00, 0x2c, 0xf5, 0xd1, 0xb9, 0x40, -0x08, 0x1c, 0xf8, 0x40, 0x01, 0x04, 0x09, 0x0c, 0x89, 0x18, 0x00, 0x0c, -0x42, 0x18, 0x10, 0x0c, 0x05, 0xd0, 0x10, 0x04, 0x00, 0x0c, 0x11, 0x0c, -0x42, 0x18, 0x10, 0x0c, 0xf9, 0xd1, 0x10, 0x04, 0x00, 0x0c, 0xb0, 0xbc, -0x70, 0x47, 0x00, 0x00, 0x90, 0xb4, 0x00, 0x20, 0x01, 0x27, 0x11, 0x49, -0x42, 0x00, 0x12, 0x18, 0xd2, 0x00, 0x53, 0x18, 0x9c, 0x68, 0x01, 0x23, +0x01, 0x23, 0x9b, 0x02, 0xb9, 0x69, 0x19, 0x43, 0xb9, 0x61, 0xc1, 0x6a, +0x01, 0x31, 0xc1, 0x62, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x0c, 0x2b, 0x00, 0x80, 0xb0, 0xb5, 0x07, 0x1c, 0xb8, 0x6b, 0x81, 0x09, +0x2c, 0xd3, 0xc0, 0x08, 0x2a, 0xd3, 0xf8, 0x1d, 0x39, 0x30, 0x00, 0x7b, +0x11, 0x28, 0x25, 0xd1, 0xb8, 0x6a, 0x39, 0x6c, 0x40, 0x18, 0x01, 0x23, +0x9b, 0x07, 0x06, 0x30, 0x18, 0x43, 0x00, 0x68, 0x05, 0x04, 0x2d, 0x0c, +0x0f, 0x4c, 0x11, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x28, +0x0c, 0xd0, 0xa8, 0x42, 0x02, 0xd1, 0x0c, 0x4b, 0x98, 0x42, 0x07, 0xd0, +0x80, 0x23, 0xb8, 0x69, 0x18, 0x43, 0xb8, 0x61, 0x60, 0x6b, 0x01, 0x30, +0x60, 0x63, 0x07, 0xe0, 0x01, 0x23, 0x5b, 0x02, 0xb8, 0x69, 0x18, 0x43, +0xb8, 0x61, 0xa0, 0x6a, 0x01, 0x30, 0xa0, 0x62, 0x00, 0x20, 0xb0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x0c, 0x2b, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, +0xf0, 0xb5, 0xff, 0xb0, 0x99, 0xb0, 0x04, 0x1c, 0xe0, 0x6b, 0x61, 0x6c, +0x09, 0x18, 0x03, 0xaa, 0x85, 0x18, 0xa3, 0x6a, 0x00, 0x20, 0x8a, 0x08, +0x01, 0x32, 0x97, 0x92, 0x07, 0xd0, 0x82, 0x00, 0x9f, 0x58, 0x03, 0xae, +0xb7, 0x50, 0x97, 0x9a, 0x01, 0x30, 0x82, 0x42, 0xf7, 0xd8, 0x60, 0x6a, +0x01, 0x23, 0x9b, 0x07, 0x04, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, +0x02, 0x90, 0x02, 0xaf, 0x3f, 0x88, 0x03, 0xa8, 0xff, 0xf7, 0x87, 0xfe, +0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x38, 0x1c, 0xff, 0xf7, 0x6d, 0xfe, +0x07, 0x1c, 0xe0, 0x6b, 0xa1, 0x6c, 0x40, 0x18, 0x61, 0x6a, 0x01, 0x23, +0x9b, 0x07, 0x08, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x01, 0x91, +0x01, 0xa9, 0x09, 0x88, 0x01, 0x31, 0x88, 0x42, 0x0c, 0xd2, 0xa2, 0x6a, +0x12, 0x18, 0x09, 0x1a, 0x10, 0x1c, 0x00, 0xf0, 0x2f, 0xf8, 0xc0, 0x43, +0x01, 0x04, 0x09, 0x0c, 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0x07, 0x1c, +0xa8, 0x89, 0xe9, 0x89, 0x08, 0x18, 0x29, 0x8a, 0x08, 0x18, 0x69, 0x8a, +0x08, 0x18, 0x69, 0x7a, 0x09, 0x02, 0x08, 0x18, 0xa1, 0x6c, 0x62, 0x6c, +0x89, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x11, 0x02, 0x12, 0x0a, 0x11, 0x43, +0x09, 0x04, 0x09, 0x0c, 0x09, 0x18, 0x08, 0x0c, 0x05, 0xd0, 0x08, 0x04, +0x00, 0x0c, 0x09, 0x0c, 0x41, 0x18, 0x08, 0x0c, 0xf9, 0xd1, 0x38, 0x1c, +0xff, 0xf7, 0x2f, 0xfe, 0xc0, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x7f, 0xb0, +0x19, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb4, 0x00, 0x22, +0x00, 0x29, 0x2e, 0xd0, 0x83, 0x07, 0x9b, 0x0f, 0xdc, 0x00, 0x47, 0x18, +0x04, 0x25, 0xef, 0x1b, 0xbf, 0x07, 0xbf, 0x0f, 0xff, 0x00, 0x80, 0x08, +0x80, 0x00, 0x59, 0x18, 0x03, 0x31, 0x89, 0x08, 0x4d, 0x1e, 0x02, 0xc8, +0xe1, 0x40, 0xa1, 0x40, 0x6b, 0x1e, 0x00, 0x2d, 0x09, 0xd0, 0x0c, 0x04, +0x24, 0x0c, 0xa2, 0x18, 0x09, 0x0c, 0x8a, 0x18, 0x02, 0xc8, 0x1c, 0x1c, +0x01, 0x3b, 0x00, 0x2c, 0xf5, 0xd1, 0xb9, 0x40, 0x08, 0x1c, 0xf8, 0x40, +0x01, 0x04, 0x09, 0x0c, 0x89, 0x18, 0x00, 0x0c, 0x42, 0x18, 0x10, 0x0c, +0x05, 0xd0, 0x10, 0x04, 0x00, 0x0c, 0x11, 0x0c, 0x42, 0x18, 0x10, 0x0c, +0xf9, 0xd1, 0x10, 0x04, 0x00, 0x0c, 0xb0, 0xbc, 0x70, 0x47, 0x00, 0x00, +0x90, 0xb4, 0x00, 0x20, 0x01, 0x27, 0x11, 0x49, 0x42, 0x00, 0x12, 0x18, +0xd2, 0x00, 0x53, 0x18, 0x9c, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, 0x1b, 0x03, 0x1b, 0x0b, 0x8a, 0x58, -0x12, 0x03, 0x12, 0x0b, 0x93, 0x42, 0x0c, 0xd1, -0x01, 0x30, 0x04, 0x28, 0xec, 0xd3, 0x08, 0x48, 0xc0, 0x6a, 0x01, 0x03, -0x09, 0x0b, 0x07, 0x48, 0x00, 0x6f, 0x00, 0x03, 0x00, 0x0b, 0x81, 0x42, -0x02, 0xd0, 0x38, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, -0x28, 0x03, 0x00, 0x80, 0x00, 0x40, 0x14, 0x40, 0xe8, 0x0d, 0x00, 0x80, -0x98, 0xb4, 0x14, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x83, 0x00, 0x13, 0x48, -0xc0, 0x58, 0x07, 0x03, 0x3f, 0x0b, 0x12, 0x48, 0xc0, 0x58, 0x02, 0x03, -0x12, 0x0b, 0x11, 0x48, 0xc0, 0x58, 0x00, 0x03, 0x00, 0x0b, 0x10, 0x4c, -0xe4, 0x58, 0x01, 0x23, 0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, 0x9b, 0x00, -0xcc, 0x00, 0x01, 0x21, 0x98, 0x42, 0x01, 0xd1, 0x08, 0x1c, 0x09, 0xe0, -0x98, 0x42, 0x03, 0xd9, 0x10, 0x1a, 0xda, 0x1b, 0x80, 0x18, 0x00, 0xe0, -0x18, 0x1a, 0x84, 0x42, 0xf4, 0xd3, 0x00, 0x20, 0x98, 0xbc, 0x70, 0x47, -0x55, 0x55, 0x55, 0x55, 0xa0, 0x03, 0x00, 0x80, 0xa8, 0x03, 0x00, 0x80, -0x88, 0x03, 0x00, 0x80, 0x98, 0x03, 0x00, 0x80, 0x80, 0xb4, 0x13, 0x04, -0x00, 0xd0, 0x01, 0x3a, 0x80, 0x00, 0x0b, 0x1c, 0x13, 0x49, 0x0f, 0x58, -0xc0, 0x46, 0x3b, 0x60, 0x0b, 0x58, 0xc0, 0x46, 0x5a, 0x60, 0x0a, 0x58, -0x08, 0x32, 0x10, 0x4b, 0x1b, 0x58, 0x9a, 0x42, 0x01, 0xd3, 0x0f, 0x4a, -0x12, 0x58, 0x0f, 0x4b, 0x1f, 0x58, 0x01, 0x23, 0x9b, 0x07, 0x3b, 0x43, -0x1b, 0x68, 0x9b, 0x00, 0x17, 0x03, 0x3f, 0x0b, 0x9f, 0x42, 0x06, 0xd1, -0x0a, 0x48, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, 0x01, 0x20, 0x80, 0xbc, -0x70, 0x47, 0x08, 0x4b, 0x1b, 0x58, 0xc0, 0x46, 0x1a, 0x60, 0x0a, 0x50, -0x00, 0x20, 0xf6, 0xe7, 0x88, 0x03, 0x00, 0x80, 0xa8, 0x03, 0x00, 0x80, -0xa0, 0x03, 0x00, 0x80, 0x98, 0x03, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0x90, 0x03, 0x00, 0x80, 0xff, 0x5f, 0x2d, 0xe9, 0x48, 0xfe, 0xff, 0xeb, -0x01, 0xb6, 0xa0, 0xe3, 0x01, 0xb1, 0x8b, 0xe2, 0x02, 0x8a, 0xa0, 0xe3, -0x01, 0x7a, 0xa0, 0xe3, 0x01, 0xa9, 0xa0, 0xe3, 0x01, 0x56, 0xa0, 0xe3, -0xc8, 0x60, 0x9f, 0xe5, 0xc8, 0x90, 0x9f, 0xe5, 0x14, 0x40, 0x9b, 0xe5, -0x00, 0x00, 0x54, 0xe3, 0x2c, 0x00, 0x00, 0x0a, 0x03, 0x0a, 0x14, 0xe3, -0x11, 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x96, 0xe5, 0x00, 0x00, 0x50, 0xe3, -0x21, 0x00, 0x00, 0x0a, 0x01, 0x0a, 0x14, 0xe3, 0x05, 0x00, 0x00, 0x0a, -0x1c, 0x00, 0x96, 0xe5, 0x01, 0x0a, 0xc0, 0xe3, 0x1c, 0x00, 0x86, 0xe5, -0x1c, 0x00, 0x85, 0xe5, 0x14, 0x70, 0x85, 0xe5, 0x06, 0x00, 0x00, 0xea, -0x02, 0x0a, 0x14, 0xe3, 0x04, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x96, 0xe5, -0x02, 0x0a, 0xc0, 0xe3, 0x1c, 0x00, 0x86, 0xe5, 0x1c, 0x00, 0x85, 0xe5, -0x14, 0x80, 0x85, 0xe5, 0x01, 0x09, 0x14, 0xe3, 0x04, 0x00, 0x00, 0x0a, -0x1c, 0x00, 0x96, 0xe5, 0x01, 0x09, 0xc0, 0xe3, 0x1c, 0x00, 0x86, 0xe5, -0x1c, 0x00, 0x85, 0xe5, 0x14, 0xa0, 0x85, 0xe5, 0x02, 0x00, 0x14, 0xe3, -0x40, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x14, 0xe3, 0x54, 0x00, 0x00, 0x1b, -0x02, 0x0b, 0x14, 0xe3, 0x67, 0x00, 0x00, 0x1b, 0x01, 0x0b, 0x14, 0xe3, -0x20, 0x00, 0x00, 0x1b, 0x18, 0x00, 0x99, 0xe5, 0x01, 0x00, 0x80, 0xe2, -0x18, 0x00, 0x89, 0xe5, 0xd5, 0xff, 0xff, 0xea, 0x1c, 0x00, 0x96, 0xe5, +0x12, 0x03, 0x12, 0x0b, 0x93, 0x42, 0x0c, 0xd1, 0x01, 0x30, 0x04, 0x28, +0xec, 0xd3, 0x08, 0x48, 0xc0, 0x6a, 0x01, 0x03, 0x09, 0x0b, 0x07, 0x48, +0x00, 0x6f, 0x00, 0x03, 0x00, 0x0b, 0x81, 0x42, 0x02, 0xd0, 0x38, 0x1c, +0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, 0xa8, 0x03, 0x00, 0x80, +0x00, 0x40, 0x14, 0x40, 0x68, 0x0e, 0x00, 0x80, 0x98, 0xb4, 0x14, 0x4a, +0xc0, 0x46, 0x00, 0x92, 0x83, 0x00, 0x13, 0x48, 0xc0, 0x58, 0x07, 0x03, +0x3f, 0x0b, 0x12, 0x48, 0xc0, 0x58, 0x02, 0x03, 0x12, 0x0b, 0x11, 0x48, +0xc0, 0x58, 0x00, 0x03, 0x00, 0x0b, 0x10, 0x4c, 0xe4, 0x58, 0x01, 0x23, +0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, 0x9b, 0x00, 0xcc, 0x00, 0x01, 0x21, +0x98, 0x42, 0x01, 0xd1, 0x08, 0x1c, 0x09, 0xe0, 0x98, 0x42, 0x03, 0xd9, +0x10, 0x1a, 0xda, 0x1b, 0x80, 0x18, 0x00, 0xe0, 0x18, 0x1a, 0x84, 0x42, +0xf4, 0xd3, 0x00, 0x20, 0x98, 0xbc, 0x70, 0x47, 0x55, 0x55, 0x55, 0x55, +0x20, 0x04, 0x00, 0x80, 0x28, 0x04, 0x00, 0x80, 0x08, 0x04, 0x00, 0x80, +0x18, 0x04, 0x00, 0x80, 0x80, 0xb4, 0x13, 0x04, 0x00, 0xd0, 0x01, 0x3a, +0x80, 0x00, 0x0b, 0x1c, 0x13, 0x49, 0x0f, 0x58, 0xc0, 0x46, 0x3b, 0x60, +0x0b, 0x58, 0xc0, 0x46, 0x5a, 0x60, 0x0a, 0x58, 0x08, 0x32, 0x10, 0x4b, +0x1b, 0x58, 0x9a, 0x42, 0x01, 0xd3, 0x0f, 0x4a, 0x12, 0x58, 0x0f, 0x4b, +0x1f, 0x58, 0x01, 0x23, 0x9b, 0x07, 0x3b, 0x43, 0x1b, 0x68, 0x9b, 0x00, +0x17, 0x03, 0x3f, 0x0b, 0x9f, 0x42, 0x06, 0xd1, 0x0a, 0x48, 0xc1, 0x68, +0x01, 0x31, 0xc1, 0x60, 0x01, 0x20, 0x80, 0xbc, 0x70, 0x47, 0x08, 0x4b, +0x1b, 0x58, 0xc0, 0x46, 0x1a, 0x60, 0x0a, 0x50, 0x00, 0x20, 0xf6, 0xe7, +0x08, 0x04, 0x00, 0x80, 0x28, 0x04, 0x00, 0x80, 0x20, 0x04, 0x00, 0x80, +0x18, 0x04, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x10, 0x04, 0x00, 0x80, +0xff, 0x5f, 0x2d, 0xe9, 0x48, 0xfe, 0xff, 0xeb, 0x01, 0xb6, 0xa0, 0xe3, +0x01, 0xb1, 0x8b, 0xe2, 0x02, 0x8a, 0xa0, 0xe3, 0x01, 0x7a, 0xa0, 0xe3, +0x01, 0xa9, 0xa0, 0xe3, 0x01, 0x56, 0xa0, 0xe3, 0xc8, 0x60, 0x9f, 0xe5, +0xc8, 0x90, 0x9f, 0xe5, 0x14, 0x40, 0x9b, 0xe5, 0x00, 0x00, 0x54, 0xe3, +0x2c, 0x00, 0x00, 0x0a, 0x03, 0x0a, 0x14, 0xe3, 0x11, 0x00, 0x00, 0x0a, +0x0c, 0x00, 0x96, 0xe5, 0x00, 0x00, 0x50, 0xe3, 0x21, 0x00, 0x00, 0x0a, +0x01, 0x0a, 0x14, 0xe3, 0x05, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x96, 0xe5, 0x01, 0x0a, 0xc0, 0xe3, 0x1c, 0x00, 0x86, 0xe5, 0x1c, 0x00, 0x85, 0xe5, +0x14, 0x70, 0x85, 0xe5, 0x06, 0x00, 0x00, 0xea, 0x02, 0x0a, 0x14, 0xe3, +0x04, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x96, 0xe5, 0x02, 0x0a, 0xc0, 0xe3, +0x1c, 0x00, 0x86, 0xe5, 0x1c, 0x00, 0x85, 0xe5, 0x14, 0x80, 0x85, 0xe5, +0x01, 0x09, 0x14, 0xe3, 0x04, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x96, 0xe5, +0x01, 0x09, 0xc0, 0xe3, 0x1c, 0x00, 0x86, 0xe5, 0x1c, 0x00, 0x85, 0xe5, +0x14, 0xa0, 0x85, 0xe5, 0x02, 0x00, 0x14, 0xe3, 0x40, 0x00, 0x00, 0x1b, +0x01, 0x00, 0x14, 0xe3, 0x54, 0x00, 0x00, 0x1b, 0x02, 0x0b, 0x14, 0xe3, +0x67, 0x00, 0x00, 0x1b, 0x01, 0x0b, 0x14, 0xe3, 0x20, 0x00, 0x00, 0x1b, +0x18, 0x00, 0x99, 0xe5, 0x01, 0x00, 0x80, 0xe2, 0x18, 0x00, 0x89, 0xe5, +0xd5, 0xff, 0xff, 0xea, 0x1c, 0x00, 0x96, 0xe5, 0x01, 0x0a, 0xc0, 0xe3, +0x1c, 0x00, 0x86, 0xe5, 0x1c, 0x00, 0x85, 0xe5, 0x14, 0x70, 0x85, 0xe5, 0xe1, 0xff, 0xff, 0xea, 0xff, 0x5f, 0xbd, 0xe8, -0x04, 0xf0, 0x5e, 0xe2, 0xe8, 0x0d, 0x00, 0x80, -0x08, 0x83, 0x20, 0x40, 0x10, 0x10, 0x1f, 0xe5, 0x14, 0x30, 0x91, 0xe5, -0x00, 0x20, 0xc3, 0xe1, 0x14, 0x20, 0x81, 0xe5, 0x01, 0x16, 0xa0, 0xe3, -0x0c, 0x20, 0x81, 0xe5, 0x0b, 0x12, 0xa0, 0xe3, 0x00, 0x00, 0x81, 0xe5, -0x18, 0x10, 0x9f, 0xe5, 0xb0, 0x24, 0xd1, 0xe1, 0x01, 0x20, 0x82, 0xe2, -0xb0, 0x24, 0xc1, 0xe1, 0x3c, 0x20, 0x91, 0xe5, 0x00, 0x00, 0x82, 0xe1, -0x3c, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0xa0, 0x82, 0x20, 0x40, -0xff, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x01, 0x0b, 0xa0, 0xe3, -0x01, 0x16, 0xa0, 0xe3, 0x14, 0x00, 0x81, 0xe5, 0x00, 0x1a, 0x81, 0xe1, -0x24, 0x20, 0x91, 0xe5, 0x70, 0x00, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x24, 0x20, 0x80, 0xe5, 0x28, 0x10, 0x91, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x28, 0x10, 0x80, 0xe5, 0x2c, 0x20, 0x90, 0xe5, 0x01, 0x20, 0x82, 0xe2, -0x2c, 0x20, 0x80, 0xe5, 0x3f, 0x00, 0x01, 0xe2, 0x3f, 0x00, 0x50, 0xe3, -0x1e, 0xff, 0x2f, 0x11, 0x18, 0x00, 0x9f, 0xe5, 0x00, 0x10, 0x90, 0xe5, -0x01, 0x10, 0x81, 0xe2, 0x00, 0x10, 0x80, 0xe5, 0x02, 0x18, 0xa0, 0xe3, -0x0b, 0x02, 0xa0, 0xe3, 0x00, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, -0xb0, 0x03, 0x00, 0x80, 0x01, 0x06, 0xa0, 0xe3, 0x01, 0x01, 0x80, 0xe2, -0x00, 0x10, 0x90, 0xe5, 0x01, 0x08, 0x11, 0xe3, 0x0b, 0x10, 0xa0, 0xe3, +0x04, 0xf0, 0x5e, 0xe2, 0x68, 0x0e, 0x00, 0x80, 0x08, 0x83, 0x20, 0x40, +0x10, 0x10, 0x1f, 0xe5, 0x14, 0x30, 0x91, 0xe5, 0x00, 0x20, 0xc3, 0xe1, +0x14, 0x20, 0x81, 0xe5, 0x01, 0x16, 0xa0, 0xe3, 0x0c, 0x20, 0x81, 0xe5, +0x0b, 0x12, 0xa0, 0xe3, 0x00, 0x00, 0x81, 0xe5, 0x18, 0x10, 0x9f, 0xe5, +0xb0, 0x24, 0xd1, 0xe1, 0x01, 0x20, 0x82, 0xe2, 0xb0, 0x24, 0xc1, 0xe1, +0x3c, 0x20, 0x91, 0xe5, 0x00, 0x00, 0x82, 0xe1, 0x3c, 0x00, 0x81, 0xe5, +0x1e, 0xff, 0x2f, 0xe1, 0xa0, 0x82, 0x20, 0x40, 0xff, 0xff, 0xff, 0xea, +0xfe, 0xff, 0xff, 0xea, 0x01, 0x0b, 0xa0, 0xe3, 0x01, 0x16, 0xa0, 0xe3, +0x14, 0x00, 0x81, 0xe5, 0x00, 0x1a, 0x81, 0xe1, 0x24, 0x20, 0x91, 0xe5, +0x70, 0x00, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x24, 0x20, 0x80, 0xe5, +0x28, 0x10, 0x91, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0x80, 0xe5, +0x2c, 0x20, 0x90, 0xe5, 0x01, 0x20, 0x82, 0xe2, 0x2c, 0x20, 0x80, 0xe5, +0x3f, 0x00, 0x01, 0xe2, 0x3f, 0x00, 0x50, 0xe3, 0x1e, 0xff, 0x2f, 0x11, +0x18, 0x00, 0x9f, 0xe5, 0x00, 0x10, 0x90, 0xe5, 0x01, 0x10, 0x81, 0xe2, +0x00, 0x10, 0x80, 0xe5, 0x02, 0x18, 0xa0, 0xe3, 0x0b, 0x02, 0xa0, 0xe3, +0x00, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x30, 0x04, 0x00, 0x80, +0x01, 0x06, 0xa0, 0xe3, 0x01, 0x01, 0x80, 0xe2, 0x00, 0x10, 0x90, 0xe5, +0x01, 0x08, 0x11, 0xe3, 0x0b, 0x10, 0xa0, 0xe3, 0x02, 0x19, 0x81, 0xe2, +0x05, 0x00, 0x00, 0x1a, 0x00, 0x20, 0x90, 0xe5, 0x42, 0x28, 0xb0, 0xe1, +0x05, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x90, 0xe5, 0x02, 0x0c, 0x10, 0xe3, +0x02, 0x00, 0x00, 0x0a, 0x06, 0x07, 0xa0, 0xe3, 0x4c, 0x11, 0x80, 0xe5, +0x03, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x9f, 0xe5, 0x00, 0x00, 0x00, 0x00, +0x40, 0x10, 0x80, 0xe5, 0xff, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, +0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0xa0, 0xe3, 0x01, 0x01, 0x80, 0xe2, +0x00, 0x10, 0x90, 0xe5, 0x01, 0x08, 0x11, 0xe3, 0x0c, 0x10, 0xa0, 0xe3, 0x02, 0x19, 0x81, 0xe2, 0x05, 0x00, 0x00, 0x1a, 0x00, 0x20, 0x90, 0xe5, 0x42, 0x28, 0xb0, 0xe1, 0x05, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x90, 0xe5, 0x02, 0x0c, 0x10, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x06, 0x07, 0xa0, 0xe3, -0x4c, 0x11, 0x80, 0xe5, 0x03, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x9f, 0xe5, +0x4c, 0x11, 0x80, 0xe5, 0x03, 0x00, 0x00, 0xea, 0x4c, 0x00, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x80, 0xe5, 0xff, 0xff, 0xff, 0xea, -0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0xa0, 0xe3, -0x01, 0x01, 0x80, 0xe2, 0x00, 0x10, 0x90, 0xe5, 0x01, 0x08, 0x11, 0xe3, -0x0c, 0x10, 0xa0, 0xe3, 0x02, 0x19, 0x81, 0xe2, 0x05, 0x00, 0x00, 0x1a, -0x00, 0x20, 0x90, 0xe5, 0x42, 0x28, 0xb0, 0xe1, 0x05, 0x00, 0x00, 0x1a, -0x00, 0x00, 0x90, 0xe5, 0x02, 0x0c, 0x10, 0xe3, 0x02, 0x00, 0x00, 0x0a, -0x06, 0x07, 0xa0, 0xe3, 0x4c, 0x11, 0x80, 0xe5, 0x03, 0x00, 0x00, 0xea, -0x4c, 0x00, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x80, 0xe5, -0xff, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0x1b, 0xa0, 0xe3, -0x01, 0x06, 0xa0, 0xe3, 0x14, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, -0x80, 0x21, 0x1f, 0xe5, 0x14, 0x30, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x00, 0x30, 0x80, 0xe5, 0x1c, 0x00, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x81, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x14, 0x10, 0x82, 0xe5, -0x01, 0x06, 0xa0, 0xe3, 0x1c, 0x10, 0x82, 0xe5, 0x0c, 0x10, 0x80, 0xe5, -0x1c, 0x10, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x10, 0x80, 0xe5, -0x1e, 0xff, 0x2f, 0xe1, 0xc0, 0x21, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x1c, 0x10, 0x82, 0xe5, 0x01, 0x16, 0xa0, 0xe3, 0x14, 0x00, 0x82, 0xe5, -0x0c, 0x00, 0x81, 0xe5, 0x1c, 0x00, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, -0x1c, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x80, 0xb5, 0x0f, 0x1c, -0x38, 0x1c, 0x00, 0xf0, 0x17, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x1c, -0x00, 0xf0, 0x76, 0xf8, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x80, 0xb5, 0x0f, 0x1c, 0x38, 0x1c, 0x00, 0xf0, -0x09, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x68, 0xf8, -0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb4, 0x07, 0x68, -0x3a, 0x78, 0xd2, 0x07, 0xd2, 0x0f, 0x00, 0x24, 0x00, 0x2a, 0x03, 0xd0, -0xff, 0x22, 0x01, 0x32, 0x42, 0x60, 0x00, 0xe0, 0x44, 0x60, 0x3a, 0x7b, -0x7b, 0x7b, 0x1b, 0x02, 0x1a, 0x43, 0x81, 0x2a, 0x08, 0xd1, 0x01, 0x23, -0x5b, 0x02, 0x42, 0x68, 0x1a, 0x43, 0x42, 0x60, 0x04, 0x22, 0xbf, 0x18, -0x82, 0x60, 0x00, 0xe0, 0x84, 0x60, 0x3a, 0x7b, 0x7b, 0x7b, 0x1b, 0x02, -0x1a, 0x43, 0x08, 0x2a, 0x06, 0xd1, 0x06, 0x23, 0x41, 0x68, 0x19, 0x43, -0x41, 0x60, 0x81, 0x68, 0x0e, 0x31, 0x2c, 0xe0, 0x13, 0x02, 0x12, 0x0a, -0x12, 0x06, 0x12, 0x0e, 0x1a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x2e, 0x3a, -0x16, 0x4b, 0x9a, 0x42, 0x24, 0xd8, 0x01, 0x25, 0x42, 0x68, 0x15, 0x43, -0x45, 0x60, 0xba, 0x7b, 0xfb, 0x7b, 0x1b, 0x02, 0x1a, 0x43, 0x12, 0x4b, -0x9a, 0x42, 0x19, 0xd1, 0xfb, 0x1d, 0x09, 0x33, 0x44, 0xcb, 0x9b, 0x07, -0xdb, 0x0e, 0xda, 0x40, 0x5b, 0x42, 0x20, 0x33, 0x9e, 0x40, 0x16, 0x43, -0x03, 0x2e, 0x0f, 0xd1, 0x39, 0x7d, 0x7b, 0x7d, 0x1b, 0x02, 0x19, 0x43, -0x08, 0x29, 0x07, 0xd1, 0x04, 0x21, 0x29, 0x43, 0x41, 0x60, 0x81, 0x68, -0x16, 0x31, 0x81, 0x60, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x84, 0x60, -0x08, 0x1c, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, -0xaa, 0xaa, 0x00, 0x00, 0x80, 0xb4, 0x42, 0x68, 0xd1, 0x08, 0x3f, 0xd3, -0x01, 0x68, 0x83, 0x68, 0x59, 0x18, 0x02, 0x39, 0x8f, 0x78, 0x3f, 0x07, -0x3f, 0x0f, 0x05, 0x2f, 0x03, 0xd1, 0xda, 0x1d, 0x0d, 0x32, 0xc2, 0x60, -0x05, 0xe0, 0xbf, 0x00, 0xdb, 0x19, 0xc3, 0x60, 0x08, 0x23, 0x1a, 0x43, -0x42, 0x60, 0x8a, 0x78, 0x12, 0x07, 0x12, 0x0f, 0x92, 0x00, 0x02, 0x61, -0x0a, 0x79, 0x4b, 0x79, 0x1b, 0x02, 0x1a, 0x43, 0x13, 0x02, 0x12, 0x0a, -0x12, 0x06, 0x12, 0x0e, 0x1a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x42, 0x61, -0xca, 0x7a, 0x06, 0x2a, 0x03, 0xd1, 0x10, 0x23, 0x42, 0x68, 0x1a, 0x43, -0x10, 0xe0, 0x11, 0x2a, 0x03, 0xd1, 0x20, 0x23, 0x42, 0x68, 0x1a, 0x43, -0x0a, 0xe0, 0x33, 0x2a, 0x03, 0xd1, 0x40, 0x23, 0x42, 0x68, 0x1a, 0x43, -0x04, 0xe0, 0x32, 0x2a, 0x03, 0xd1, 0x80, 0x23, 0x42, 0x68, 0x1a, 0x43, -0x42, 0x60, 0xc9, 0x7a, 0xc0, 0x46, 0x01, 0x76, 0x80, 0xbc, 0x70, 0x47, -0x0a, 0x78, 0xc0, 0x46, 0x02, 0x60, 0x4b, 0x78, 0x1b, 0x02, 0x1a, 0x43, -0x02, 0x60, 0x8b, 0x78, 0x1b, 0x04, 0x1a, 0x43, 0x02, 0x60, 0xc9, 0x78, -0x09, 0x06, 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, 0x80, 0xb5, 0x07, 0x1c, -0x48, 0x68, 0x80, 0x09, 0x26, 0xd3, 0xb8, 0x6a, 0xc9, 0x68, 0x40, 0x18, -0x01, 0x23, 0x9b, 0x07, 0x02, 0x30, 0x18, 0x43, 0x00, 0x68, 0x00, 0x04, -0x00, 0x0c, 0x11, 0x23, 0x9b, 0x02, 0x98, 0x42, 0x18, 0xd1, 0x78, 0x6a, -0x39, 0x6b, 0xc0, 0x46, 0x48, 0x62, 0x38, 0x6b, 0x02, 0xf0, 0xb0, 0xf8, -0x38, 0x1c, 0x01, 0xf0, 0x6d, 0xfd, 0x01, 0x20, 0x07, 0x49, 0xc0, 0x46, -0xc8, 0x72, 0x07, 0x49, 0x4a, 0x6c, 0x12, 0x18, 0x4a, 0x64, 0x06, 0x49, -0x8a, 0x6d, 0x12, 0x18, 0x8a, 0x65, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x20, 0xfa, 0xe7, 0x98, 0x19, 0x00, 0x80, 0x78, 0x2a, 0x00, 0x80, -0x10, 0x2a, 0x00, 0x80, 0x81, 0x07, 0x19, 0xd0, 0x80, 0x08, 0x80, 0x00, -0x01, 0x23, 0x9b, 0x07, 0x01, 0x1d, 0x18, 0x43, -0x00, 0x68, 0x19, 0x43, 0x09, 0x68, 0x02, 0x02, 0x12, 0x0e, 0x12, 0x06, -0x00, 0x0a, 0xff, 0x23, 0x1b, 0x04, 0x18, 0x40, 0x10, 0x43, 0x0a, 0x0a, -0x12, 0x06, 0x12, 0x0e, 0x10, 0x43, 0x09, 0x02, 0x1b, 0x0a, 0x19, 0x40, -0x08, 0x43, 0x70, 0x47, 0x01, 0x23, 0x9b, 0x07, 0x18, 0x43, 0x00, 0x68, -0x01, 0x06, 0x02, 0x02, 0xff, 0x23, 0x1b, 0x04, 0x1a, 0x40, 0x11, 0x43, -0x02, 0x0a, 0x1b, 0x0a, 0x1a, 0x40, 0x11, 0x43, 0x00, 0x0e, 0x08, 0x43, -0xed, 0xe7, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x23, 0x81, 0x6b, 0x19, 0x40, -0x00, 0x22, 0x00, 0x29, 0x46, 0xd0, 0xc7, 0x1d, 0x39, 0x37, 0x39, 0x7b, -0x33, 0x29, 0x01, 0xd0, 0x32, 0x29, 0x3f, 0xd1, 0x01, 0x6b, 0xc0, 0x46, -0x4a, 0x65, 0xc4, 0x1d, 0x2d, 0x34, 0xcd, 0x1d, 0x2d, 0x35, 0x00, 0x22, -0x93, 0x00, 0xe6, 0x58, 0xc0, 0x46, 0xee, 0x50, 0x01, 0x32, 0x07, 0x2a, -0xf8, 0xd3, 0x82, 0x6a, 0xc0, 0x46, 0x4a, 0x63, 0x82, 0x6a, 0xc0, 0x46, -0x8a, 0x62, 0x7a, 0x8b, 0xcb, 0x1d, 0x39, 0x33, 0x5a, 0x83, 0x40, 0x6a, -0xc0, 0x46, 0x48, 0x62, 0x12, 0x48, 0x01, 0x27, 0x42, 0x68, 0x00, 0x2a, -0x10, 0xd1, 0xc2, 0x68, 0x00, 0x2a, 0x13, 0xd1, 0x42, 0x69, 0x00, 0x2a, -0x0d, 0xd1, 0x01, 0x61, 0xc1, 0x60, 0x01, 0x6a, 0x02, 0x29, 0x02, 0xd3, -0x20, 0x30, 0x07, 0x71, 0x0c, 0xe0, 0x00, 0xf0, 0x13, 0xf8, 0x09, 0xe0, -0xc2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x01, 0x61, 0xc1, 0x60, 0x03, 0xe0, -0x02, 0x69, 0xc0, 0x46, 0x51, 0x65, 0x01, 0x61, 0x38, 0x1c, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x10, 0x1c, 0xfa, 0xe7, 0xec, 0x05, 0x00, 0x80, -0x80, 0xb5, 0x1e, 0x49, 0x00, 0x22, 0xcb, 0x68, 0x00, 0x2b, 0x34, 0xd0, -0xc8, 0x1d, 0xf9, 0x30, 0x83, 0x62, 0xcb, 0x68, 0x9b, 0x6a, 0xc0, 0x46, -0xc3, 0x62, 0xcf, 0x69, 0x7b, 0x00, 0xdf, 0x19, 0x7f, 0x02, 0x17, 0x4b, -0xff, 0x18, 0xff, 0x37, 0x65, 0x37, 0x83, 0x63, 0x07, 0x63, 0xcb, 0x1d, -0xff, 0x33, 0x5a, 0x33, 0x1a, 0x72, 0xcb, 0x69, 0x00, 0x2b, 0x01, 0xd0, -0xca, 0x61, 0x01, 0xe0, 0x01, 0x23, 0xcb, 0x61, 0x0f, 0x1c, 0xc9, 0x68, -0x49, 0x6a, 0x09, 0x89, 0x01, 0x31, 0x41, 0x63, 0xf8, 0x1d, 0xff, 0x30, -0x3a, 0x30, 0x42, 0x60, 0x02, 0x82, 0x82, 0x60, 0xc2, 0x60, 0x38, 0x1c, -0x00, 0xf0, 0xc4, 0xfa, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0x38, 0x1c, -0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x10, 0x1c, -0xfa, 0xe7, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, 0x1c, 0xad, 0x20, 0x40, -0xf0, 0xb5, 0x07, 0x1c, 0xf9, 0x1d, 0xf9, 0x31, 0x88, 0x6a, 0xc2, 0x1d, -0x2d, 0x32, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x32, 0x1a, 0x43, 0xc8, 0x6a, -0x12, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x80, 0x18, 0x82, 0x79, 0xc3, 0x79, -0x1b, 0x02, 0x1a, 0x43, 0x13, 0x02, 0x12, 0x0a, 0x12, 0x06, 0x12, 0x0e, -0x1a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x02, 0x38, 0x92, 0x04, 0x92, 0x0c, -0x00, 0x26, 0x25, 0x4d, 0xec, 0x1d, 0xff, 0x34, 0x3a, 0x34, 0x00, 0x2a, -0x04, 0xd0, 0x20, 0x8a, 0x01, 0x23, 0x9b, 0x02, 0x18, 0x43, 0x2b, 0xe0, -0x01, 0x23, 0x9b, 0x07, 0xc2, 0x1d, 0x0d, 0x32, 0x1a, 0x43, 0x12, 0x68, -0x12, 0x04, 0x12, 0x30, 0x18, 0x43, 0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, -0x10, 0x43, 0x03, 0x1c, 0xf8, 0x1d, 0xff, 0x30, 0x4a, 0x30, 0x82, 0x78, -0xc8, 0x6b, 0x19, 0x1c, 0x01, 0xf0, 0xd8, 0xff, 0x00, 0x28, 0x04, 0xda, -0x20, 0x8a, 0xff, 0x23, 0x01, 0x33, 0x18, 0x43, -0x0e, 0xe0, 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x08, 0x60, 0x01, 0x04, -0x09, 0x0c, 0x38, 0x1c, 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0x28, 0x14, 0xd1, -0x20, 0x8a, 0x01, 0x23, 0x5b, 0x02, 0x18, 0x43, 0x20, 0x82, 0x21, 0x8a, -0x38, 0x1c, 0x00, 0xf0, 0x98, 0xfb, 0xe8, 0x68, 0x01, 0x23, 0x9b, 0x07, -0x54, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xe8, 0x60, 0x30, 0x1c, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, 0xfa, 0xe7, 0x00, 0x00, -0xec, 0x05, 0x00, 0x80, 0xf8, 0xb5, 0x07, 0x1c, 0xfc, 0x1d, 0xf9, 0x34, -0xa0, 0x6b, 0xa6, 0x6a, 0xc5, 0x1d, 0x0d, 0x35, 0x33, 0x48, 0xc0, 0x6a, -0x4b, 0x00, 0x59, 0x18, 0x49, 0x01, 0x42, 0x18, 0x01, 0x20, 0x80, 0x07, -0x10, 0x43, 0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x23, -0x9b, 0x07, 0xd0, 0x1d, 0x05, 0x30, 0x18, 0x43, 0x00, 0x68, 0x38, 0x1c, -0x29, 0x1c, 0x00, 0xf0, 0xb8, 0xfa, 0xa8, 0x88, 0x40, 0x07, 0x01, 0xd0, -0x00, 0x20, 0x47, 0xe0, 0x00, 0x98, 0x01, 0x28, 0x25, 0xd1, 0xe0, 0x6a, +0xfe, 0xff, 0xff, 0xea, 0x02, 0x1b, 0xa0, 0xe3, 0x01, 0x06, 0xa0, 0xe3, +0x14, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x80, 0x21, 0x1f, 0xe5, +0x14, 0x30, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0xe5, +0x1c, 0x00, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xe5, +0x00, 0x10, 0xa0, 0xe3, 0x14, 0x10, 0x82, 0xe5, 0x01, 0x06, 0xa0, 0xe3, +0x1c, 0x10, 0x82, 0xe5, 0x0c, 0x10, 0x80, 0xe5, 0x1c, 0x10, 0x92, 0xe5, +0x00, 0x00, 0x00, 0x00, 0x1c, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, +0xc0, 0x21, 0x1f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x10, 0x82, 0xe5, +0x01, 0x16, 0xa0, 0xe3, 0x14, 0x00, 0x82, 0xe5, 0x0c, 0x00, 0x81, 0xe5, +0x1c, 0x00, 0x92, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x81, 0xe5, +0x1e, 0xff, 0x2f, 0xe1, 0x80, 0xb5, 0x0f, 0x1c, 0x38, 0x1c, 0x00, 0xf0, +0x17, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x1c, +0x00, 0xf0, 0x92, 0xf8, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x80, 0xb5, 0x0f, 0x1c, 0x38, 0x1c, 0x00, 0xf0, 0x09, 0xf8, 0x00, 0x28, +0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x84, 0xf8, 0x00, 0x20, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb4, 0x07, 0x68, 0x3a, 0x78, 0xd2, 0x07, +0xd2, 0x0f, 0x00, 0x24, 0x00, 0x2a, 0x03, 0xd0, 0xff, 0x22, 0x01, 0x32, +0x42, 0x60, 0x00, 0xe0, 0x44, 0x60, 0x3a, 0x7b, 0x7b, 0x7b, 0x1b, 0x02, +0x1a, 0x43, 0x81, 0x2a, 0x08, 0xd1, 0x01, 0x23, 0x5b, 0x02, 0x42, 0x68, +0x1a, 0x43, 0x42, 0x60, 0x04, 0x22, 0xbf, 0x18, 0x82, 0x60, 0x00, 0xe0, +0x84, 0x60, 0x3a, 0x7b, 0x7b, 0x7b, 0x1b, 0x02, 0x1a, 0x43, 0x08, 0x2a, +0x06, 0xd1, 0x06, 0x23, 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, 0x81, 0x68, +0x0e, 0x31, 0x3c, 0xe0, 0xc1, 0x23, 0xdb, 0x00, 0x9a, 0x42, 0x03, 0xd1, +0x41, 0x68, 0x24, 0x4b, 0x19, 0x43, 0x3e, 0xe0, 0x23, 0x4b, 0x9a, 0x42, +0x04, 0xd1, 0x01, 0x23, 0x1b, 0x03, 0x41, 0x68, 0x19, 0x43, 0x36, 0xe0, +0x13, 0x02, 0x12, 0x0a, 0x12, 0x06, 0x12, 0x0e, 0x1a, 0x43, 0x12, 0x04, +0x12, 0x0c, 0x2e, 0x3a, 0x1c, 0x4b, 0x9a, 0x42, 0x2d, 0xd8, 0x01, 0x25, +0x42, 0x68, 0x15, 0x43, 0x45, 0x60, 0xba, 0x7b, 0xfb, 0x7b, 0x1b, 0x02, +0x1a, 0x43, 0x18, 0x4b, 0x9a, 0x42, 0x22, 0xd1, 0xfb, 0x1d, 0x09, 0x33, +0x44, 0xcb, 0x9b, 0x07, 0xdb, 0x0e, 0xda, 0x40, 0x5b, 0x42, 0x20, 0x33, +0x9e, 0x40, 0x16, 0x43, 0x03, 0x2e, 0x18, 0xd1, 0x39, 0x7d, 0x7b, 0x7d, +0x1b, 0x02, 0x19, 0x43, 0x08, 0x29, 0x07, 0xd1, 0x04, 0x21, 0x29, 0x43, +0x41, 0x60, 0x81, 0x68, 0x16, 0x31, 0x81, 0x60, 0x01, 0x21, 0x0a, 0xe0, +0xc1, 0x23, 0xdb, 0x00, 0x99, 0x42, 0x04, 0xd1, 0x01, 0x21, 0x89, 0x03, +0x29, 0x43, 0x41, 0x60, 0x00, 0xe0, 0x84, 0x60, 0x00, 0x21, 0x08, 0x1c, +0xf0, 0xbc, 0x70, 0x47, 0x02, 0x40, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, +0xae, 0x05, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x80, 0xb4, 0x42, 0x68, +0xd1, 0x08, 0x3f, 0xd3, 0x01, 0x68, 0x83, 0x68, 0x59, 0x18, 0x02, 0x39, +0x8f, 0x78, 0x3f, 0x07, 0x3f, 0x0f, 0x05, 0x2f, 0x03, 0xd1, 0xda, 0x1d, +0x0d, 0x32, 0xc2, 0x60, 0x05, 0xe0, 0xbf, 0x00, 0xdb, 0x19, 0xc3, 0x60, +0x08, 0x23, 0x1a, 0x43, 0x42, 0x60, 0x8a, 0x78, 0x12, 0x07, 0x12, 0x0f, +0x92, 0x00, 0x02, 0x61, 0x0a, 0x79, 0x4b, 0x79, 0x1b, 0x02, 0x1a, 0x43, +0x13, 0x02, 0x12, 0x0a, 0x12, 0x06, 0x12, 0x0e, 0x1a, 0x43, 0x12, 0x04, +0x12, 0x0c, 0x42, 0x61, 0xca, 0x7a, 0x06, 0x2a, 0x03, 0xd1, 0x10, 0x23, +0x42, 0x68, 0x1a, 0x43, 0x10, 0xe0, 0x11, 0x2a, 0x03, 0xd1, 0x20, 0x23, +0x42, 0x68, 0x1a, 0x43, 0x0a, 0xe0, 0x33, 0x2a, 0x03, 0xd1, 0x40, 0x23, +0x42, 0x68, 0x1a, 0x43, 0x04, 0xe0, 0x32, 0x2a, 0x03, 0xd1, 0x80, 0x23, +0x42, 0x68, 0x1a, 0x43, 0x42, 0x60, 0xc9, 0x7a, 0xc0, 0x46, 0x01, 0x76, +0x80, 0xbc, 0x70, 0x47, 0x0a, 0x78, 0xc0, 0x46, 0x02, 0x60, 0x4b, 0x78, +0x1b, 0x02, 0x1a, 0x43, 0x02, 0x60, 0x8b, 0x78, 0x1b, 0x04, 0x1a, 0x43, +0x02, 0x60, 0xc9, 0x78, 0x09, 0x06, 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, +0x80, 0xb5, 0x07, 0x1c, 0x48, 0x68, 0x80, 0x09, 0x26, 0xd3, 0xb8, 0x6a, +0xc9, 0x68, 0x40, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x02, 0x30, 0x18, 0x43, +0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x11, 0x23, 0x9b, 0x02, 0x98, 0x42, +0x18, 0xd1, 0x78, 0x6a, 0x39, 0x6b, 0xc0, 0x46, +0x48, 0x62, 0x38, 0x6b, 0x02, 0xf0, 0xd0, 0xf8, 0x38, 0x1c, 0x01, 0xf0, +0x8b, 0xfd, 0x01, 0x20, 0x07, 0x49, 0xc0, 0x46, 0xc8, 0x73, 0x07, 0x49, +0x4a, 0x6c, 0x12, 0x18, 0x4a, 0x64, 0x06, 0x49, 0x8a, 0x6d, 0x12, 0x18, +0x8a, 0x65, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0xfa, 0xe7, +0x18, 0x1a, 0x00, 0x80, 0x0c, 0x2b, 0x00, 0x80, 0xa4, 0x2a, 0x00, 0x80, +0x81, 0x07, 0x19, 0xd0, 0x80, 0x08, 0x80, 0x00, 0x01, 0x23, 0x9b, 0x07, +0x01, 0x1d, 0x18, 0x43, 0x00, 0x68, 0x19, 0x43, 0x09, 0x68, 0x02, 0x02, +0x12, 0x0e, 0x12, 0x06, 0x00, 0x0a, 0xff, 0x23, 0x1b, 0x04, 0x18, 0x40, +0x10, 0x43, 0x0a, 0x0a, 0x12, 0x06, 0x12, 0x0e, 0x10, 0x43, 0x09, 0x02, +0x1b, 0x0a, 0x19, 0x40, 0x08, 0x43, 0x70, 0x47, 0x01, 0x23, 0x9b, 0x07, +0x18, 0x43, 0x00, 0x68, 0x01, 0x06, 0x02, 0x02, 0xff, 0x23, 0x1b, 0x04, +0x1a, 0x40, 0x11, 0x43, 0x02, 0x0a, 0x1b, 0x0a, 0x1a, 0x40, 0x11, 0x43, +0x00, 0x0e, 0x08, 0x43, 0xed, 0xe7, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x23, +0x81, 0x6b, 0x19, 0x40, 0x00, 0x22, 0x00, 0x29, 0x46, 0xd0, 0xc7, 0x1d, +0x39, 0x37, 0x39, 0x7b, 0x33, 0x29, 0x01, 0xd0, 0x32, 0x29, 0x3f, 0xd1, +0x01, 0x6b, 0xc0, 0x46, 0x4a, 0x65, 0xc4, 0x1d, 0x2d, 0x34, 0xcd, 0x1d, +0x2d, 0x35, 0x00, 0x22, 0x93, 0x00, 0xe6, 0x58, 0xc0, 0x46, 0xee, 0x50, +0x01, 0x32, 0x07, 0x2a, 0xf8, 0xd3, 0x82, 0x6a, 0xc0, 0x46, 0x4a, 0x63, +0x82, 0x6a, 0xc0, 0x46, 0x8a, 0x62, 0x7a, 0x8b, 0xcb, 0x1d, 0x39, 0x33, +0x5a, 0x83, 0x40, 0x6a, 0xc0, 0x46, 0x48, 0x62, 0x12, 0x48, 0x01, 0x27, +0x42, 0x68, 0x00, 0x2a, 0x10, 0xd1, 0xc2, 0x68, 0x00, 0x2a, 0x13, 0xd1, +0x42, 0x69, 0x00, 0x2a, 0x0d, 0xd1, 0x01, 0x61, 0xc1, 0x60, 0x01, 0x6a, +0x02, 0x29, 0x02, 0xd3, 0x20, 0x30, 0x07, 0x71, 0x0c, 0xe0, 0x00, 0xf0, +0x13, 0xf8, 0x09, 0xe0, 0xc2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x01, 0x61, +0xc1, 0x60, 0x03, 0xe0, 0x02, 0x69, 0xc0, 0x46, 0x51, 0x65, 0x01, 0x61, +0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x10, 0x1c, 0xfa, 0xe7, +0x6c, 0x06, 0x00, 0x80, 0x80, 0xb5, 0x1e, 0x49, 0x00, 0x22, 0xcb, 0x68, +0x00, 0x2b, 0x34, 0xd0, 0xc8, 0x1d, 0xf9, 0x30, 0x83, 0x62, 0xcb, 0x68, +0x9b, 0x6a, 0xc0, 0x46, 0xc3, 0x62, 0xcf, 0x69, 0x7b, 0x00, 0xdf, 0x19, +0x7f, 0x02, 0x17, 0x4b, 0xff, 0x18, 0xff, 0x37, 0x65, 0x37, 0x83, 0x63, +0x07, 0x63, 0xcb, 0x1d, 0xff, 0x33, 0x5a, 0x33, 0x1a, 0x72, 0xcb, 0x69, +0x00, 0x2b, 0x01, 0xd0, 0xca, 0x61, 0x01, 0xe0, 0x01, 0x23, 0xcb, 0x61, +0x0f, 0x1c, 0xc9, 0x68, 0x49, 0x6a, 0x09, 0x89, 0x01, 0x31, 0x41, 0x63, +0xf8, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x42, 0x60, 0x02, 0x82, 0x82, 0x60, +0xc2, 0x60, 0x38, 0x1c, 0x00, 0xf0, 0xce, 0xfa, 0x38, 0x6a, 0x01, 0x30, +0x38, 0x62, 0x38, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x10, 0x1c, 0xfa, 0xe7, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, +0x1c, 0xad, 0x20, 0x40, 0xf0, 0xb5, 0x07, 0x1c, 0xf9, 0x1d, 0xf9, 0x31, +0x88, 0x6a, 0xc2, 0x1d, 0x2d, 0x32, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x32, +0x1a, 0x43, 0xc8, 0x6a, 0x12, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x80, 0x18, +0x82, 0x79, 0xc3, 0x79, 0x1b, 0x02, 0x1a, 0x43, 0x13, 0x02, 0x12, 0x0a, +0x12, 0x06, 0x12, 0x0e, 0x1a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x02, 0x38, +0x92, 0x04, 0x92, 0x0c, 0x00, 0x26, 0x25, 0x4d, +0xec, 0x1d, 0xff, 0x34, 0x3a, 0x34, 0x00, 0x2a, 0x04, 0xd0, 0x20, 0x8a, +0x01, 0x23, 0x9b, 0x02, 0x18, 0x43, 0x2b, 0xe0, 0x01, 0x23, 0x9b, 0x07, +0xc2, 0x1d, 0x0d, 0x32, 0x1a, 0x43, 0x12, 0x68, 0x12, 0x04, 0x12, 0x30, +0x18, 0x43, 0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x10, 0x43, 0x03, 0x1c, +0xf8, 0x1d, 0xff, 0x30, 0x4a, 0x30, 0x82, 0x78, 0xc8, 0x6b, 0x19, 0x1c, +0x01, 0xf0, 0xf8, 0xff, 0x00, 0x28, 0x04, 0xda, 0x20, 0x8a, 0xff, 0x23, +0x01, 0x33, 0x18, 0x43, 0x0e, 0xe0, 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, +0x08, 0x60, 0x01, 0x04, 0x09, 0x0c, 0x38, 0x1c, 0x00, 0xf0, 0x1c, 0xf8, +0x00, 0x28, 0x14, 0xd1, 0x20, 0x8a, 0x01, 0x23, 0x5b, 0x02, 0x18, 0x43, +0x20, 0x82, 0x21, 0x8a, 0x38, 0x1c, 0x00, 0xf0, 0xa2, 0xfb, 0xe8, 0x68, +0x01, 0x23, 0x9b, 0x07, 0x54, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, +0xe8, 0x60, 0x30, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, +0xfa, 0xe7, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, 0xf8, 0xb5, 0x07, 0x1c, +0xfc, 0x1d, 0xf9, 0x34, 0xa0, 0x6b, 0xa6, 0x6a, 0xc5, 0x1d, 0x0d, 0x35, +0x38, 0x48, 0xc0, 0x6a, 0x4b, 0x00, 0x59, 0x18, 0x49, 0x01, 0x42, 0x18, +0x01, 0x20, 0x80, 0x07, 0x10, 0x43, 0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, +0x00, 0x90, 0x01, 0x23, 0x9b, 0x07, 0xd0, 0x1d, 0x05, 0x30, 0x18, 0x43, +0x00, 0x68, 0x38, 0x1c, 0x29, 0x1c, 0x00, 0xf0, 0xc2, 0xfa, 0xa8, 0x88, +0x41, 0x07, 0x01, 0xd0, 0x00, 0x20, 0x51, 0xe0, 0x29, 0x89, 0x09, 0x18, +0x60, 0x6b, 0x81, 0x42, 0xf8, 0xd8, 0x69, 0x89, 0xea, 0x88, 0x89, 0x18, +0x81, 0x42, 0xf3, 0xd8, 0x00, 0x98, 0x01, 0x28, 0x25, 0xd1, 0xe0, 0x6a, 0xf1, 0x6b, 0x40, 0x18, 0x71, 0x6c, 0xfa, 0x1d, 0xcd, 0x32, 0x01, 0xf0, -0x2b, 0xf9, 0xfa, 0x1d, 0xff, 0x32, 0x3a, 0x32, 0xe0, 0x6a, 0x51, 0x69, +0x29, 0xf9, 0xfa, 0x1d, 0xff, 0x32, 0x3a, 0x32, 0xe0, 0x6a, 0x51, 0x69, 0x40, 0x18, 0xc3, 0x1d, 0x03, 0x33, 0x00, 0x20, 0x81, 0x00, 0x5e, 0x58, 0xc9, 0x19, 0xff, 0x31, 0x01, 0x31, 0x4e, 0x61, 0x01, 0x30, 0x04, 0x28, 0xf6, 0xd3, 0xe0, 0x6a, 0x51, 0x69, 0x40, 0x18, 0xc1, 0x1d, 0x05, 0x31, 0x00, 0x20, 0x00, 0x22, 0x43, 0x00, 0xca, 0x52, 0x01, 0x30, 0x06, 0x28, -0xfa, 0xd3, 0x29, 0x1c, 0x11, 0x4a, 0x00, 0x20, 0xff, 0xf7, 0xd4, 0xfb, +0xfa, 0xd3, 0x29, 0x1c, 0x11, 0x4a, 0x00, 0x20, 0xff, 0xf7, 0xae, 0xfb, 0x01, 0x22, 0x52, 0x04, 0x60, 0x6b, 0x02, 0x43, 0x01, 0x20, 0x21, 0x6b, -0xff, 0xf7, 0xcc, 0xfb, 0x01, 0x22, 0x52, 0x04, 0x60, 0x6b, 0x02, 0x43, -0x00, 0x20, 0xe1, 0x6a, 0xff, 0xf7, 0xc4, 0xfb, 0xa1, 0x6b, 0x08, 0x4a, -0x01, 0x20, 0xff, 0xf7, 0xbf, 0xfb, 0x03, 0x20, 0x06, 0x49, 0xc0, 0x46, +0xff, 0xf7, 0xa6, 0xfb, 0x01, 0x22, 0x52, 0x04, 0x60, 0x6b, 0x02, 0x43, +0x00, 0x20, 0xe1, 0x6a, 0xff, 0xf7, 0x9e, 0xfb, 0xa1, 0x6b, 0x08, 0x4a, +0x01, 0x20, 0xff, 0xf7, 0x99, 0xfb, 0x03, 0x20, 0x06, 0x49, 0xc0, 0x46, 0x48, 0x62, 0x01, 0x20, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0xc8, 0x29, 0x00, 0x80, 0x54, 0x00, 0x03, 0x00, 0x14, 0x00, 0x0f, 0x00, -0xec, 0x06, 0x00, 0x80, 0xf0, 0xb5, 0x8d, 0xb0, 0x00, 0x20, 0xb5, 0x4a, +0x4c, 0x2a, 0x00, 0x80, 0x54, 0x00, 0x03, 0x00, 0x14, 0x00, 0x0f, 0x00, +0x6c, 0x07, 0x00, 0x80, 0xf0, 0xb5, 0x8d, 0xb0, 0x00, 0x20, 0xb5, 0x4a, 0xd5, 0x1d, 0xf9, 0x35, 0x68, 0x62, 0x01, 0x20, 0x00, 0x05, 0xb3, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xa8, 0x6a, 0xc4, 0x1d, 0x2d, 0x34, 0xb1, 0x48, 0xc0, 0x6a, 0xd7, 0x1d, 0xff, 0x37, 0x3a, 0x37, 0x39, 0x68, 0x4b, 0x00, @@ -409,18 +418,18 @@ 0x05, 0x31, 0x19, 0x43, 0x09, 0x68, 0x08, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0x09, 0x90, 0xff, 0x23, 0x1b, 0x02, 0x18, 0x40, 0x00, 0x0a, 0x0a, 0x90, 0x0a, 0x98, 0xa4, 0x4e, 0x01, 0x28, 0x59, 0xd1, 0x28, 0x6b, -0xa2, 0x68, 0x80, 0x18, 0xa2, 0x4a, 0x21, 0x69, 0x09, 0x04, 0x09, 0x0c, -0x01, 0xf0, 0x1e, 0xf9, 0x28, 0x6b, 0x79, 0x69, 0x40, 0x18, 0xc1, 0x1d, -0x05, 0x31, 0x00, 0x20, 0x82, 0x00, 0x98, 0x4b, 0xd3, 0x18, 0xff, 0x33, -0x01, 0x33, 0x5b, 0x69, 0xc0, 0x46, 0x8b, 0x50, 0x01, 0x30, 0x04, 0x28, -0xf4, 0xd3, 0x00, 0x20, 0x31, 0x1c, 0x82, 0x00, 0x56, 0x18, 0x01, 0x23, -0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x04, 0xae, 0xb3, 0x50, 0x01, 0x30, -0x03, 0x28, 0xf4, 0xd3, 0x00, 0x20, 0x08, 0x90, 0x90, 0x49, 0x42, 0x00, -0x8b, 0x5a, 0xb2, 0x5a, 0x93, 0x42, 0x13, 0xd0, 0x8e, 0x48, 0xc1, 0x89, -0x01, 0x31, 0xc1, 0x81, 0xb8, 0x68, 0x00, 0x28, +0xa2, 0x68, 0x80, 0x18, 0xa2, 0x4a, 0x21, 0x69, +0x09, 0x04, 0x09, 0x0c, 0x01, 0xf0, 0x1c, 0xf9, 0x28, 0x6b, 0x79, 0x69, +0x40, 0x18, 0xc1, 0x1d, 0x05, 0x31, 0x00, 0x20, 0x82, 0x00, 0x98, 0x4b, +0xd3, 0x18, 0xff, 0x33, 0x01, 0x33, 0x5b, 0x69, 0xc0, 0x46, 0x8b, 0x50, +0x01, 0x30, 0x04, 0x28, 0xf4, 0xd3, 0x00, 0x20, 0x31, 0x1c, 0x82, 0x00, +0x56, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x04, 0xae, +0xb3, 0x50, 0x01, 0x30, 0x03, 0x28, 0xf4, 0xd3, 0x00, 0x20, 0x08, 0x90, +0x90, 0x49, 0x42, 0x00, 0x8b, 0x5a, 0xb2, 0x5a, 0x93, 0x42, 0x13, 0xd0, +0x8e, 0x48, 0xc1, 0x89, 0x01, 0x31, 0xc1, 0x81, 0xb8, 0x68, 0x00, 0x28, 0x03, 0xd1, 0x38, 0x8a, 0x10, 0x23, 0x18, 0x43, 0x71, 0xe0, 0x38, 0x8a, 0x40, 0x23, 0x18, 0x43, 0x6d, 0xe0, 0x00, 0xf0, 0x11, 0xf9, 0x01, 0xf0, -0x47, 0xff, 0xf5, 0xe0, 0x01, 0x30, 0x06, 0x28, 0xe3, 0xd3, 0x08, 0x98, +0x5d, 0xff, 0xf5, 0xe0, 0x01, 0x30, 0x06, 0x28, 0xe3, 0xd3, 0x08, 0x98, 0x00, 0x28, 0x0c, 0xd1, 0xb8, 0x68, 0x41, 0x1c, 0xb9, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x38, 0x8a, 0x01, 0x23, 0x18, 0x43, 0x02, 0xe0, 0x38, 0x8a, 0x04, 0x23, 0x18, 0x43, 0x38, 0x82, 0x78, 0x68, 0x01, 0x30, 0x78, 0x60, @@ -452,20 +461,20 @@ 0x01, 0x23, 0x9b, 0x07, 0xe0, 0x1d, 0x01, 0x30, 0x18, 0x43, 0x00, 0x68, 0xe1, 0x1d, 0x0d, 0x31, 0x19, 0x43, 0x09, 0x68, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xf9, 0x68, 0x4a, 0x1c, 0xfa, 0x60, 0x00, 0x29, 0xbc, 0xd1, -0xb6, 0xe7, 0x01, 0x23, 0x9b, 0x07, 0xe1, 0x1d, 0x05, 0x31, 0x19, 0x43, -0x09, 0x68, 0x09, 0x06, 0x09, 0x0e, 0xa1, 0x60, 0xe8, 0x6a, 0xc0, 0x46, -0x20, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0x92, 0xfc, 0x20, 0x7e, 0x33, 0x28, -0x01, 0xd0, 0x32, 0x28, 0x11, 0xd1, 0x01, 0x21, 0x14, 0x4c, 0xc0, 0x46, -0xf9, 0x60, 0xb9, 0x60, 0x20, 0x1c, 0x00, 0xf0, 0x85, 0xf8, 0x28, 0x6b, -0xa9, 0x6a, 0xc0, 0x46, 0x88, 0x62, 0x20, 0x1c, 0xff, 0xf7, 0xca, 0xfd, -0x00, 0x28, 0x11, 0xd1, 0x0e, 0xe0, 0x00, 0x20, 0x30, 0x72, 0x11, 0xe0, -0x33, 0x29, 0x01, 0xd0, 0x32, 0x29, 0x0d, 0xd1, 0x07, 0x1c, 0x00, 0xf0, -0x71, 0xf8, 0x38, 0x1c, 0xff, 0xf7, 0xba, 0xfd, -0x00, 0x28, 0x01, 0xd1, 0x01, 0xf0, 0x50, 0xfe, 0x0d, 0xb0, 0xf0, 0xbc, +0xb6, 0xe7, 0x01, 0x23, 0x9b, 0x07, 0xe1, 0x1d, +0x05, 0x31, 0x19, 0x43, 0x09, 0x68, 0x09, 0x06, 0x09, 0x0e, 0xa1, 0x60, +0xe8, 0x6a, 0xc0, 0x46, 0x20, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0x88, 0xfc, +0x20, 0x7e, 0x33, 0x28, 0x01, 0xd0, 0x32, 0x28, 0x11, 0xd1, 0x01, 0x21, +0x14, 0x4c, 0xc0, 0x46, 0xf9, 0x60, 0xb9, 0x60, 0x20, 0x1c, 0x00, 0xf0, +0x85, 0xf8, 0x28, 0x6b, 0xa9, 0x6a, 0xc0, 0x46, 0x88, 0x62, 0x20, 0x1c, +0xff, 0xf7, 0xc0, 0xfd, 0x00, 0x28, 0x11, 0xd1, 0x0e, 0xe0, 0x00, 0x20, +0x30, 0x72, 0x11, 0xe0, 0x33, 0x29, 0x01, 0xd0, 0x32, 0x29, 0x0d, 0xd1, +0x07, 0x1c, 0x00, 0xf0, 0x71, 0xf8, 0x38, 0x1c, 0xff, 0xf7, 0xb0, 0xfd, +0x00, 0x28, 0x01, 0xd1, 0x01, 0xf0, 0x66, 0xfe, 0x0d, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xf0, 0x12, 0xf8, 0xf6, 0xe7, 0x00, 0x00, -0xec, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0xc8, 0x29, 0x00, 0x80, -0x1c, 0xad, 0x20, 0x40, 0xc0, 0x06, 0x00, 0x80, 0x02, 0x07, 0x00, 0x80, -0x78, 0x2a, 0x00, 0x80, 0xec, 0x06, 0x00, 0x80, 0xf0, 0xb5, 0x25, 0x48, +0x6c, 0x06, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0x4c, 0x2a, 0x00, 0x80, +0x1c, 0xad, 0x20, 0x40, 0x40, 0x07, 0x00, 0x80, 0x82, 0x07, 0x00, 0x80, +0x0c, 0x2b, 0x00, 0x80, 0x6c, 0x07, 0x00, 0x80, 0xf0, 0xb5, 0x25, 0x48, 0x41, 0x68, 0x01, 0x31, 0x41, 0x60, 0x24, 0x4f, 0xf9, 0x1d, 0xf9, 0x31, 0x00, 0x24, 0x88, 0x6a, 0xfa, 0x68, 0xc0, 0x46, 0x94, 0x61, 0x04, 0x22, 0xfb, 0x68, 0xc0, 0x46, 0xda, 0x60, 0x10, 0x22, 0xfb, 0x68, 0xc0, 0x46, @@ -476,10 +485,10 @@ 0x4a, 0x6b, 0xfb, 0x68, 0xc0, 0x46, 0xda, 0x81, 0x0a, 0x6b, 0xc0, 0x46, 0x82, 0x62, 0xc4, 0x62, 0xc3, 0x1d, 0x39, 0x33, 0x4a, 0x6b, 0xc0, 0x46, 0x5a, 0x83, 0x04, 0x23, 0x02, 0x68, 0x1a, 0x43, 0x02, 0x60, 0x88, 0x6a, -0x01, 0xf0, 0x14, 0xfa, 0xf8, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x54, 0x30, +0x01, 0xf0, 0x28, 0xfa, 0xf8, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x54, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xf8, 0x60, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, 0xec, 0x05, 0x00, 0x80, -0x2c, 0x07, 0x00, 0x80, 0x80, 0xb5, 0xc1, 0x1d, 0xf9, 0x31, 0x8a, 0x6a, +0x18, 0x47, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x80, 0x6c, 0x06, 0x00, 0x80, +0xac, 0x07, 0x00, 0x80, 0x80, 0xb5, 0xc1, 0x1d, 0xf9, 0x31, 0x8a, 0x6a, 0x01, 0x23, 0x9b, 0x07, 0xd1, 0x1d, 0x45, 0x31, 0x19, 0x43, 0x09, 0x68, 0x0b, 0x06, 0x1b, 0x0e, 0x01, 0x27, 0xc1, 0x1d, 0xff, 0x31, 0x4a, 0x31, 0x33, 0x2b, 0x05, 0xd1, 0x8b, 0x70, 0x01, 0x1c, 0x10, 0x1c, 0x00, 0xf0, @@ -495,15 +504,15 @@ 0xf8, 0x1d, 0x01, 0x30, 0x18, 0x43, 0x00, 0x68, 0x00, 0x04, 0xb9, 0x1d, 0x19, 0x43, 0xd0, 0x63, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x08, 0x43, 0xd0, 0x63, 0x90, 0xbc, 0x70, 0x47, 0xb0, 0xb5, 0xca, 0x1d, 0xf9, 0x32, -0xc5, 0x1d, 0x2d, 0x35, 0x32, 0x20, 0xcf, 0x1d, 0xff, 0x37, 0x4a, 0x37, -0xd3, 0x6a, 0xc0, 0x46, 0xb8, 0x70, 0xcc, 0x1d, 0xff, 0x34, 0x3a, 0x34, -0xe8, 0x68, 0xc0, 0x46, 0x60, 0x61, 0x10, 0x30, 0xe8, 0x60, 0x60, 0x69, -0xc0, 0x18, 0x87, 0x1e, 0x01, 0x23, 0x9b, 0x07, 0x38, 0x1d, 0x18, 0x43, -0x00, 0x68, 0x00, 0x04, 0xb9, 0x1c, 0x19, 0x43, 0xd0, 0x63, 0x09, 0x68, -0x09, 0x04, 0x09, 0x0c, 0x08, 0x43, 0xd0, 0x63, 0xf8, 0x1d, 0x03, 0x30, -0xff, 0xf7, 0x06, 0xfc, 0x20, 0x62, 0xf8, 0x1d, 0x07, 0x30, 0xff, 0xf7, -0x01, 0xfc, 0x60, 0x62, 0x00, 0x20, 0x28, 0x76, 0xb0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0xf7, 0xb5, 0x81, 0xb0, 0x01, 0x98, +0xc5, 0x1d, 0x2d, 0x35, 0x32, 0x20, 0xcf, 0x1d, +0xff, 0x37, 0x4a, 0x37, 0xd3, 0x6a, 0xc0, 0x46, 0xb8, 0x70, 0xcc, 0x1d, +0xff, 0x34, 0x3a, 0x34, 0xe8, 0x68, 0xc0, 0x46, 0x60, 0x61, 0x10, 0x30, +0xe8, 0x60, 0x60, 0x69, 0xc0, 0x18, 0x87, 0x1e, 0x01, 0x23, 0x9b, 0x07, +0x38, 0x1d, 0x18, 0x43, 0x00, 0x68, 0x00, 0x04, 0xb9, 0x1c, 0x19, 0x43, +0xd0, 0x63, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x08, 0x43, 0xd0, 0x63, +0xf8, 0x1d, 0x03, 0x30, 0xff, 0xf7, 0xfc, 0xfb, 0x20, 0x62, 0xf8, 0x1d, +0x07, 0x30, 0xff, 0xf7, 0xf7, 0xfb, 0x60, 0x62, 0x00, 0x20, 0x28, 0x76, +0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, 0x81, 0xb0, 0x01, 0x98, 0xc7, 0x1d, 0xf9, 0x37, 0xb8, 0x6a, 0x01, 0x23, 0x9b, 0x07, 0xd4, 0x1d, 0x05, 0x34, 0x23, 0x43, 0x1c, 0x68, 0xff, 0x23, 0xfe, 0x33, 0x23, 0x40, 0x7f, 0x6b, 0x3f, 0x04, 0x3b, 0x43, 0x0b, 0x60, 0x34, 0x30, 0x1c, 0x1c, @@ -537,86 +546,85 @@ 0x04, 0x23, 0x90, 0x6a, 0xc0, 0x46, 0xc3, 0x60, 0x10, 0x23, 0x83, 0x61, 0xcb, 0x0a, 0x01, 0xd3, 0x18, 0x23, 0x83, 0x61, 0xc1, 0x83, 0x51, 0x6b, 0xc0, 0x46, 0xc1, 0x81, 0x51, 0x6b, 0xc2, 0x1d, 0x39, 0x32, 0x51, 0x83, -0x04, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x01, 0xf0, 0xa4, 0xf8, -0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, 0xb0, 0xb5, 0x1b, 0x4c, -0x20, 0x6a, 0x02, 0x28, 0x1b, 0xd2, 0x00, 0x20, 0xe7, 0x1d, 0x19, 0x37, -0x38, 0x71, 0xe1, 0x68, 0xe0, 0x1d, 0xf9, 0x30, 0x00, 0x29, 0x15, 0xd0, -0x42, 0x6a, 0x00, 0x2a, 0x12, 0xd1, 0x01, 0x25, 0x0a, 0xe0, 0xff, 0xf7, -0x93, 0xfb, 0x00, 0x28, 0x09, 0xd1, 0x20, 0x6a, 0x02, 0x28, 0x00, 0xd3, -0x3d, 0x71, 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x79, 0x00, 0x28, -0xf1, 0xd0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x40, 0x6a, 0x00, 0x28, -0xf9, 0xd1, 0x00, 0x29, 0xf7, 0xd1, 0x60, 0x69, 0x00, 0x28, 0x04, 0xd0, -0x06, 0x48, 0x00, 0x68, 0x03, 0xf0, 0x8e, 0xfc, +0x04, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x01, 0xf0, 0xb8, 0xf8, +0x08, 0xbc, 0x18, 0x47, 0x0c, 0x2b, 0x00, 0x80, +0xb0, 0xb5, 0x1b, 0x4c, 0x20, 0x6a, 0x02, 0x28, 0x1b, 0xd2, 0x00, 0x20, +0xe7, 0x1d, 0x19, 0x37, 0x38, 0x71, 0xe1, 0x68, 0xe0, 0x1d, 0xf9, 0x30, +0x00, 0x29, 0x15, 0xd0, 0x42, 0x6a, 0x00, 0x2a, 0x12, 0xd1, 0x01, 0x25, +0x0a, 0xe0, 0xff, 0xf7, 0x89, 0xfb, 0x00, 0x28, 0x09, 0xd1, 0x20, 0x6a, +0x02, 0x28, 0x00, 0xd3, 0x3d, 0x71, 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, +0x38, 0x79, 0x00, 0x28, 0xf1, 0xd0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x40, 0x6a, 0x00, 0x28, 0xf9, 0xd1, 0x00, 0x29, 0xf7, 0xd1, 0x60, 0x69, +0x00, 0x28, 0x04, 0xd0, 0x06, 0x48, 0x00, 0x68, 0x03, 0xf0, 0x9e, 0xfc, 0xef, 0xe7, 0x60, 0x68, 0x00, 0x28, 0xec, 0xd0, 0x00, 0xf0, 0x50, 0xf8, -0xe9, 0xe7, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, 0xb4, 0x03, 0x00, 0x80, +0xe9, 0xe7, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, 0x34, 0x04, 0x00, 0x80, 0xb0, 0xb5, 0x07, 0x1c, 0x20, 0x23, 0xb8, 0x68, 0x18, 0x40, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd1, 0x28, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xc4, 0x23, 0x48, 0x68, 0x18, 0x40, 0x01, 0x24, 0x00, 0x28, 0x03, 0xd1, -0x38, 0x6a, 0x00, 0xf0, 0x0d, 0xfc, 0x2f, 0xe0, 0x38, 0x1c, 0x00, 0xf0, -0x1d, 0xfc, 0x38, 0x1c, 0x00, 0xf0, 0x7e, 0xfa, 0xb8, 0x68, 0xc0, 0x08, -0x02, 0xd3, 0x38, 0x6a, 0x00, 0xf0, 0xd2, 0xfb, 0xb8, 0x68, 0x39, 0x6a, +0x38, 0x6a, 0x00, 0xf0, 0x09, 0xfc, 0x2f, 0xe0, 0x38, 0x1c, 0x00, 0xf0, +0x19, 0xfc, 0x38, 0x1c, 0x00, 0xf0, 0x78, 0xfa, 0xb8, 0x68, 0xc0, 0x08, +0x02, 0xd3, 0x38, 0x6a, 0x00, 0xf0, 0xce, 0xfb, 0xb8, 0x68, 0x39, 0x6a, 0xc0, 0x46, 0x88, 0x60, 0x38, 0x6a, 0xc0, 0x46, 0xc5, 0x60, 0x0f, 0x48, 0x41, 0x68, 0x00, 0x29, 0x11, 0xd1, 0xc1, 0x68, 0x00, 0x29, 0x09, 0xd1, 0x41, 0x69, 0x00, 0x29, 0x06, 0xd1, 0x39, 0x6a, 0xc0, 0x46, 0x81, 0x60, 0x41, 0x60, 0x00, 0xf0, 0x11, 0xf8, 0x0b, 0xe0, 0x39, 0x6a, 0xc0, 0x46, 0x81, 0x60, 0x41, 0x60, 0x06, 0xe0, 0x39, 0x6a, 0x82, 0x68, 0xc0, 0x46, 0xd1, 0x60, 0x39, 0x6a, 0xc0, 0x46, 0x81, 0x60, 0x20, 0x1c, 0xc0, 0xe7, -0xec, 0x05, 0x00, 0x80, 0x90, 0xb5, 0x0b, 0x4c, 0x67, 0x68, 0x00, 0x2f, +0x6c, 0x06, 0x00, 0x80, 0x90, 0xb5, 0x0b, 0x4c, 0x67, 0x68, 0x00, 0x2f, 0x0f, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x12, 0xf8, 0x00, 0x28, 0x0a, 0xd1, 0x60, 0x68, 0xc0, 0x68, 0xc0, 0x46, 0x60, 0x60, 0x38, 0x1c, 0x00, 0xf0, -0xc7, 0xfb, 0x00, 0x20, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, -0xfa, 0xe7, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, 0xf0, 0xb5, 0x07, 0x1c, +0xc3, 0xfb, 0x00, 0x20, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, +0xfa, 0xe7, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, 0xf0, 0xb5, 0x07, 0x1c, 0xfe, 0x1d, 0x49, 0x36, 0x30, 0x78, 0x40, 0x00, 0xc0, 0x19, 0x85, 0x8b, -0x2d, 0x4b, 0x9d, 0x42, 0x56, 0xd0, 0x2d, 0x4c, 0x38, 0x1c, 0x21, 0x1c, -0x2a, 0x1c, 0x00, 0xf0, 0x23, 0xf9, 0xa0, 0x88, 0x40, 0x07, 0x4d, 0xd1, -0x29, 0x48, 0x80, 0x6a, 0x58, 0x21, 0x69, 0x43, 0x40, 0x18, 0x01, 0x23, -0x9b, 0x07, 0x18, 0x43, 0x00, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x25, 0x4d, -0x01, 0x28, 0x1a, 0xd1, 0x30, 0x78, 0xc0, 0x19, 0xc1, 0x1d, 0x19, 0x31, -0x08, 0x7a, 0x3a, 0x68, 0x80, 0x18, 0x09, 0x7b, 0xea, 0x1d, 0x21, 0x32, -0x00, 0xf0, 0xe2, 0xfc, 0x30, 0x78, 0xc0, 0x19, 0x20, 0x30, 0x00, 0x79, -0x39, 0x68, 0x40, 0x18, 0xc1, 0x1d, 0x05, 0x31, 0x00, 0x20, 0x00, 0x22, -0x43, 0x00, 0xca, 0x52, 0x01, 0x30, 0x06, 0x28, 0xfa, 0xd3, 0x21, 0x1c, -0x16, 0x4a, 0x00, 0x20, 0xfe, 0xf7, 0x9a, 0xff, 0x01, 0x22, 0x52, 0x04, -0x78, 0x68, 0x02, 0x43, 0x01, 0x20, 0x39, 0x68, 0xfe, 0xf7, 0x92, 0xff, -0x01, 0x22, 0x52, 0x04, 0x78, 0x68, 0x02, 0x43, 0x00, 0x20, 0x39, 0x68, -0xfe, 0xf7, 0x8a, 0xff, 0x0d, 0x49, 0x0e, 0x4a, 0x01, 0x20, 0xfe, 0xf7, -0x85, 0xff, 0x01, 0x20, 0xe9, 0x1d, 0x19, 0x31, 0x48, 0x71, 0x02, 0x21, -0xea, 0x1d, 0xf9, 0x32, 0x51, 0x62, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x20, 0xfa, 0xe7, 0xff, 0xff, 0x00, 0x00, 0x98, 0xad, 0x20, 0x40, -0xc8, 0x29, 0x00, 0x80, 0xec, 0x05, 0x00, 0x80, 0x54, 0x00, 0x03, 0x00, -0x84, 0xad, 0x20, 0x40, 0x14, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x83, 0xb0, -0x00, 0x21, 0x58, 0x48, 0xc2, 0x1d, 0xf9, 0x32, 0x51, 0x62, 0x01, 0x21, -0xc9, 0x04, 0x56, 0x4a, 0xc0, 0x46, 0x11, 0x60, 0xc1, 0x1d, 0x19, 0x31, -0x49, 0x79, 0x00, 0x29, 0x04, 0xd1, 0x53, 0x48, 0x00, 0x68, 0x03, 0xf0, -0x97, 0xfb, 0x98, 0xe0, 0x4e, 0x48, 0x47, 0x68, 0xfc, 0x1d, 0x49, 0x34, -0x22, 0x78, 0x50, 0x00, 0xc0, 0x19, 0x80, 0x8b, -0x4d, 0x49, 0x89, 0x6a, 0x58, 0x23, 0x58, 0x43, 0x0d, 0x18, 0x01, 0x23, -0x9b, 0x07, 0xe9, 0x1d, 0x05, 0x31, 0x19, 0x43, 0x09, 0x68, 0x08, 0x35, +0x33, 0x4c, 0x34, 0x4b, 0x9d, 0x42, 0x3c, 0xd0, 0x38, 0x1c, 0x21, 0x1c, +0x2a, 0x1c, 0x00, 0xf0, 0x1d, 0xf9, 0x31, 0x48, 0x80, 0x6a, 0x58, 0x21, +0x69, 0x43, 0x40, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x18, 0x43, 0x00, 0x68, +0x00, 0x04, 0x00, 0x0c, 0x2c, 0x4d, 0x01, 0x28, 0x1a, 0xd1, 0x30, 0x78, +0xc0, 0x19, 0xc1, 0x1d, 0x19, 0x31, 0x08, 0x7a, 0x3a, 0x68, 0x80, 0x18, +0x09, 0x7b, 0xea, 0x1d, 0x21, 0x32, 0x00, 0xf0, 0xe3, 0xfc, 0x30, 0x78, +0xc0, 0x19, 0x20, 0x30, 0x00, 0x79, 0x39, 0x68, 0x40, 0x18, 0xc1, 0x1d, +0x05, 0x31, 0x00, 0x20, 0x00, 0x23, 0x42, 0x00, 0x8b, 0x52, 0x01, 0x30, +0x06, 0x28, 0xfa, 0xd3, 0xa0, 0x88, 0x41, 0x07, 0x0b, 0xd1, 0x21, 0x89, +0x09, 0x18, 0x78, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x81, 0x42, 0x04, 0xd8, +0x61, 0x89, 0xe2, 0x88, 0x89, 0x18, 0x81, 0x42, 0x03, 0xd9, 0x00, 0x20, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x21, 0x1c, 0x14, 0x4a, 0x00, 0x20, +0xfe, 0xf7, 0x64, 0xff, 0x01, 0x22, 0x52, 0x04, 0x78, 0x68, 0x02, 0x43, +0x01, 0x20, 0x39, 0x68, 0xfe, 0xf7, 0x5c, 0xff, 0x01, 0x22, 0x52, 0x04, +0x78, 0x68, 0x02, 0x43, 0x00, 0x20, 0x39, 0x68, +0xfe, 0xf7, 0x54, 0xff, 0x0b, 0x49, 0x0c, 0x4a, 0x01, 0x20, 0xfe, 0xf7, +0x4f, 0xff, 0x01, 0x20, 0xe9, 0x1d, 0x19, 0x31, 0x48, 0x71, 0x02, 0x21, +0xea, 0x1d, 0xf9, 0x32, 0x51, 0x62, 0xd9, 0xe7, 0x98, 0xad, 0x20, 0x40, +0xff, 0xff, 0x00, 0x00, 0x4c, 0x2a, 0x00, 0x80, 0x6c, 0x06, 0x00, 0x80, +0x54, 0x00, 0x03, 0x00, 0x84, 0xad, 0x20, 0x40, 0x14, 0x00, 0x07, 0x00, +0xf0, 0xb5, 0x83, 0xb0, 0x00, 0x21, 0x4f, 0x48, 0xc2, 0x1d, 0xf9, 0x32, +0x51, 0x62, 0x01, 0x21, 0xc9, 0x04, 0x4d, 0x4a, 0xc0, 0x46, 0x11, 0x60, +0xc1, 0x1d, 0x19, 0x31, 0x49, 0x79, 0x00, 0x29, 0x04, 0xd1, 0x4a, 0x48, +0x00, 0x68, 0x03, 0xf0, 0x9b, 0xfb, 0x87, 0xe0, 0x45, 0x48, 0x47, 0x68, +0xfc, 0x1d, 0x49, 0x34, 0x21, 0x78, 0x48, 0x00, 0xc0, 0x19, 0x80, 0x8b, +0x44, 0x4a, 0x92, 0x6a, 0x58, 0x23, 0x58, 0x43, 0x15, 0x18, 0x01, 0x23, +0x9b, 0x07, 0xea, 0x1d, 0x05, 0x32, 0x1a, 0x43, 0x12, 0x68, 0x08, 0x35, 0x2b, 0x43, 0x1d, 0x68, 0xff, 0x23, 0x1b, 0x02, 0x2b, 0x40, 0x1b, 0x0a, -0x45, 0x4d, 0x01, 0x2b, 0x24, 0xd1, 0xd0, 0x19, 0xc1, 0x1d, 0x19, 0x31, -0x08, 0x7a, 0x3a, 0x68, 0x80, 0x18, 0x42, 0x4a, 0x09, 0x7b, 0x00, 0xf0, -0xd3, 0xfc, 0x20, 0x78, 0xc0, 0x19, 0x20, 0x30, 0x00, 0x79, 0x39, 0x68, +0x3c, 0x4d, 0x01, 0x2b, 0x24, 0xd1, 0xc8, 0x19, 0xc1, 0x1d, 0x19, 0x31, +0x08, 0x7a, 0x3a, 0x68, 0x80, 0x18, 0x39, 0x4a, 0x09, 0x7b, 0x00, 0xf0, +0xc5, 0xfc, 0x20, 0x78, 0xc0, 0x19, 0x20, 0x30, 0x00, 0x79, 0x39, 0x68, 0x41, 0x18, 0x00, 0x20, 0x82, 0x00, 0x53, 0x19, 0x9b, 0x6e, 0x6e, 0x46, 0xb3, 0x50, 0x01, 0x30, 0x03, 0x28, 0xf7, 0xd3, 0xca, 0x1d, 0x05, 0x32, 0x69, 0x46, 0x00, 0x20, 0x43, 0x00, 0xcd, 0x5a, 0xc0, 0x46, 0xd5, 0x52, -0x01, 0x30, 0x06, 0x28, 0xf8, 0xd3, 0x3e, 0xe0, 0x02, 0x2b, 0x3c, 0xd1, -0x09, 0x0a, 0x3a, 0xd3, 0x00, 0x21, 0x8a, 0x00, 0x53, 0x19, 0x9b, 0x6e, +0x01, 0x30, 0x06, 0x28, 0xf8, 0xd3, 0x2d, 0xe0, 0x02, 0x2b, 0x2b, 0xd1, +0x11, 0x0a, 0x29, 0xd3, 0x00, 0x21, 0x8a, 0x00, 0x53, 0x19, 0x9b, 0x6e, 0x6e, 0x46, 0xb3, 0x50, 0x01, 0x31, 0x03, 0x29, 0xf7, 0xd3, 0x21, 0x78, 0x49, 0x00, 0xc9, 0x19, 0x09, 0x8f, 0x3a, 0x68, 0x8b, 0x18, 0x6a, 0x46, 0x00, 0x21, 0x4d, 0x00, 0x56, 0x5b, 0xc0, 0x46, 0x5e, 0x53, 0x01, 0x31, -0x06, 0x29, 0xf8, 0xd3, 0x22, 0x49, 0x8a, 0x6a, 0x12, 0x18, 0x01, 0x23, -0x9b, 0x07, 0xd5, 0x1d, 0x49, 0x35, 0x2b, 0x43, 0x6e, 0x46, 0x1d, 0x68, -0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x6b, 0x40, 0x1e, 0x4d, -0xee, 0x68, 0x73, 0x40, 0x13, 0x65, 0x89, 0x6a, 0x08, 0x18, 0x01, 0x23, -0x9b, 0x07, 0xc1, 0x1d, 0x4d, 0x31, 0x19, 0x43, 0x09, 0x68, 0x6a, 0x46, -0x08, 0x32, 0x1a, 0x43, 0x12, 0x68, 0x51, 0x40, 0xaa, 0x69, 0x51, 0x40, -0x41, 0x65, 0x20, 0x78, 0x41, 0x1e, 0x21, 0x70, 0x00, 0x28, 0x0d, 0xd0, -0x38, 0x1c, 0xff, 0xf7, 0xef, 0xfe, 0x00, 0x28, 0x0d, 0xd1, 0x09, 0x4a, -0x50, 0x68, 0xc0, 0x68, 0xc0, 0x46, 0x50, 0x60, 0x38, 0x1c, 0x00, 0xf0, -0xa3, 0xfa, 0x02, 0xe0, 0x38, 0x1c, 0x00, 0xf0, 0x72, 0xfa, 0x01, 0xf0, -0xc3, 0xfa, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0xec, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0xb8, 0x03, 0x00, 0x80, -0xc8, 0x29, 0x00, 0x80, 0x1c, 0xad, 0x20, 0x40, 0x14, 0x06, 0x00, 0x80, +0x06, 0x29, 0xf8, 0xd3, 0x19, 0x49, 0x8a, 0x6a, 0x13, 0x18, 0x1a, 0x6d, +0x00, 0x9d, 0x55, 0x40, 0x19, 0x4a, 0xd6, 0x68, 0x75, 0x40, 0x1d, 0x65, +0x89, 0x6a, 0x08, 0x18, 0x41, 0x6d, 0x02, 0x9b, 0x59, 0x40, 0x92, 0x69, +0x51, 0x40, 0x41, 0x65, 0x20, 0x78, 0x41, 0x1e, 0x21, 0x70, 0x00, 0x28, +0x0d, 0xd0, 0x38, 0x1c, 0xff, 0xf7, 0xf4, 0xfe, 0x00, 0x28, 0x0d, 0xd1, +0x08, 0x4a, 0x50, 0x68, 0xc0, 0x68, 0xc0, 0x46, 0x50, 0x60, 0x38, 0x1c, +0x00, 0xf0, 0xa4, 0xfa, 0x02, 0xe0, 0x38, 0x1c, 0x00, 0xf0, 0x73, 0xfa, +0x01, 0xf0, 0xde, 0xfa, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x6c, 0x06, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0x38, 0x04, 0x00, 0x80, +0x4c, 0x2a, 0x00, 0x80, 0x1c, 0xad, 0x20, 0x40, 0x94, 0x06, 0x00, 0x80, 0x08, 0x83, 0x20, 0x40, 0xf0, 0xb5, 0x82, 0xb0, 0x69, 0x4b, 0x9f, 0x6a, 0x58, 0x23, 0x5a, 0x43, 0xba, 0x18, 0xc3, 0x1d, 0x49, 0x33, 0x1f, 0x78, 0x01, 0x23, 0x9b, 0x07, 0xd4, 0x1d, 0x01, 0x34, 0x23, 0x43, 0x1d, 0x68, @@ -625,14 +633,14 @@ 0xff, 0x26, 0x36, 0x02, 0x2e, 0x40, 0x01, 0x23, 0x5b, 0x02, 0x9e, 0x42, 0x74, 0xd1, 0x6b, 0x0c, 0x2b, 0xd3, 0xc3, 0x19, 0x20, 0x33, 0x1b, 0x79, 0xc0, 0x46, 0x4b, 0x81, 0x7b, 0x00, 0x1b, 0x18, 0x1b, 0x8f, 0x4c, 0x89, -0x1b, 0x1b, 0xcb, 0x80, 0x00, 0x24, 0xa6, 0x00, 0x01, 0x96, 0xb3, 0x18, -0xde, 0x1d, 0x09, 0x36, 0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, -0x01, 0x9e, 0x76, 0x18, 0x73, 0x61, 0x01, 0x34, 0x05, 0x2c, 0xf0, 0xd3, -0x00, 0x24, 0xa6, 0x00, 0x00, 0x96, 0xb3, 0x18, 0xde, 0x1d, 0x1d, 0x36, -0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x00, 0x9e, 0x76, 0x18, -0xb3, 0x62, 0x01, 0x34, 0x05, 0x2c, 0xf0, 0xd3, 0x06, 0xe0, 0x00, 0x23, -0x4b, 0x81, 0xcb, 0x80, 0x40, 0x23, 0x9c, 0x43, 0x0c, 0x60, 0x23, 0x1c, -0x6b, 0x0e, 0x4a, 0xd3, 0xc3, 0x19, 0x20, 0x33, +0x1b, 0x1b, 0xcb, 0x80, 0x00, 0x24, 0xa6, 0x00, +0x01, 0x96, 0xb3, 0x18, 0xde, 0x1d, 0x09, 0x36, 0x01, 0x23, 0x9b, 0x07, +0x33, 0x43, 0x1b, 0x68, 0x01, 0x9e, 0x76, 0x18, 0x73, 0x61, 0x01, 0x34, +0x05, 0x2c, 0xf0, 0xd3, 0x00, 0x24, 0xa6, 0x00, 0x00, 0x96, 0xb3, 0x18, +0xde, 0x1d, 0x1d, 0x36, 0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, +0x00, 0x9e, 0x76, 0x18, 0xb3, 0x62, 0x01, 0x34, 0x05, 0x2c, 0xf0, 0xd3, +0x06, 0xe0, 0x00, 0x23, 0x4b, 0x81, 0xcb, 0x80, 0x40, 0x23, 0x9c, 0x43, +0x0c, 0x60, 0x23, 0x1c, 0x6b, 0x0e, 0x4a, 0xd3, 0xc3, 0x19, 0x20, 0x33, 0x1b, 0x79, 0x10, 0x33, 0x0b, 0x81, 0x7b, 0x00, 0x1b, 0x18, 0x1b, 0x8f, 0x0f, 0x89, 0xdb, 0x1b, 0x8b, 0x80, 0x01, 0x23, 0x9b, 0x07, 0xd4, 0x1d, 0x35, 0x34, 0x23, 0x43, 0x1b, 0x68, 0xc0, 0x46, 0xcb, 0x63, 0x01, 0x23, @@ -653,29 +661,29 @@ 0x05, 0x28, 0xf2, 0xd3, 0x00, 0x20, 0x87, 0x00, 0xbb, 0x18, 0xdc, 0x1d, 0x1d, 0x34, 0x01, 0x23, 0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, 0x7f, 0x18, 0xbb, 0x62, 0x01, 0x30, 0x05, 0x28, 0xf2, 0xd3, 0x02, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xc8, 0x29, 0x00, 0x80, 0x80, 0xb4, 0x1f, 0x1c, +0x08, 0xbc, 0x18, 0x47, 0x4c, 0x2a, 0x00, 0x80, 0x80, 0xb4, 0x1f, 0x1c, 0x3b, 0x0c, 0x18, 0xd2, 0x17, 0x6d, 0x11, 0x4b, 0xc0, 0x46, 0xdf, 0x60, 0x52, 0x6d, 0xc0, 0x46, 0x1a, 0x61, 0xc7, 0x60, 0x1a, 0x69, 0xc0, 0x46, 0x02, 0x61, 0xd8, 0x68, 0xc0, 0x46, 0x08, 0x80, 0xd8, 0x68, 0x00, 0x0c, 0x48, 0x80, 0x18, 0x69, 0xc0, 0x46, 0x88, 0x80, 0x18, 0x69, 0x00, 0x0c, 0xc8, 0x80, 0x80, 0xbc, 0x70, 0x47, 0x4a, 0x88, 0x12, 0x04, 0x0b, 0x88, 0x1a, 0x43, 0xc2, 0x60, 0x8a, 0x88, 0xc9, 0x88, 0x09, 0x04, 0x11, 0x43, -0x01, 0x61, 0xf2, 0xe7, 0xac, 0x06, 0x00, 0x80, 0xf1, 0xb5, 0x88, 0xb0, +0x01, 0x61, 0xf2, 0xe7, 0x2c, 0x07, 0x00, 0x80, 0xf1, 0xb5, 0x88, 0xb0, 0x00, 0x22, 0x08, 0x98, 0x00, 0x6a, 0x08, 0x9b, 0x99, 0x68, 0x49, 0x0a, 0x02, 0xd3, 0x01, 0x27, 0xff, 0x03, 0x00, 0xe0, 0x00, 0x27, 0x03, 0x8b, -0x00, 0x2b, 0x19, 0xd0, 0xa2, 0x49, 0x89, 0x6a, 0x1c, 0x1c, 0x58, 0x23, +0x00, 0x2b, 0x19, 0xd0, 0xa3, 0x49, 0x89, 0x6a, 0x1c, 0x1c, 0x58, 0x23, 0x63, 0x43, 0xc9, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x58, 0x39, 0x19, 0x43, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x02, 0x29, 0x02, 0xd1, 0x08, 0x23, 0x1f, 0x43, 0x07, 0xe0, 0x41, 0x8b, 0x00, 0x29, 0x02, 0xd0, 0x0c, 0x23, 0x1f, 0x43, 0x01, 0xe0, 0x04, 0x23, 0x1f, 0x43, 0x83, 0x8a, 0x00, 0x2b, -0x18, 0xd0, 0x94, 0x49, 0x89, 0x6a, 0x1c, 0x1c, 0x58, 0x23, 0x63, 0x43, -0xc9, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x58, 0x39, 0x19, 0x43, 0x09, 0x68, -0x09, 0x04, 0x09, 0x0c, 0x02, 0x29, 0x01, 0xd1, 0x0f, 0x43, 0x07, 0xe0, -0xc1, 0x8a, 0x00, 0x29, 0x02, 0xd0, 0x03, 0x23, 0x1f, 0x43, 0x01, 0xe0, -0x01, 0x23, 0x1f, 0x43, 0xc1, 0x1d, 0x39, 0x31, 0x07, 0x91, 0x4b, 0x89, -0x0c, 0x89, 0x1c, 0x19, 0x24, 0x04, 0x24, 0x0c, 0x08, 0x9d, 0x2d, 0x68, -0xc0, 0x46, 0x01, 0x95, 0xc9, 0x88, 0x7d, 0x08, 0x1a, 0xd3, 0x1a, 0x1c, -0xc3, 0x1d, 0x19, 0x33, 0x1a, 0x72, 0x07, 0x9a, +0x18, 0xd0, 0x95, 0x49, 0x89, 0x6a, 0x1c, 0x1c, +0x58, 0x23, 0x63, 0x43, 0xc9, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x58, 0x39, +0x19, 0x43, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x02, 0x29, 0x01, 0xd1, +0x0f, 0x43, 0x07, 0xe0, 0xc1, 0x8a, 0x00, 0x29, 0x02, 0xd0, 0x03, 0x23, +0x1f, 0x43, 0x01, 0xe0, 0x01, 0x23, 0x1f, 0x43, 0xc1, 0x1d, 0x39, 0x31, +0x07, 0x91, 0x4b, 0x89, 0x0c, 0x89, 0x1c, 0x19, 0x24, 0x04, 0x24, 0x0c, +0x08, 0x9d, 0x2d, 0x68, 0xc0, 0x46, 0x01, 0x95, 0xc9, 0x88, 0x7d, 0x08, +0x1a, 0xd3, 0x1a, 0x1c, 0xc3, 0x1d, 0x19, 0x33, 0x1a, 0x72, 0x07, 0x9a, 0x92, 0x89, 0xc0, 0x46, 0x1a, 0x73, 0x07, 0x9a, 0x12, 0x89, 0xc0, 0x46, 0x02, 0x86, 0x04, 0x87, 0x82, 0x8a, 0x01, 0x3a, 0x82, 0x83, 0x01, 0x22, 0x19, 0x71, 0x08, 0x9b, 0x1b, 0x68, 0x5b, 0x18, 0x5b, 0x78, 0x9b, 0x00, @@ -684,7 +692,7 @@ 0x07, 0x9b, 0x9b, 0x89, 0xc0, 0x46, 0x2b, 0x73, 0x07, 0x9b, 0x1b, 0x89, 0x2e, 0x1c, 0x55, 0x00, 0x2d, 0x18, 0x05, 0x95, 0x2b, 0x86, 0x00, 0x2a, 0x01, 0xd0, 0xc3, 0x8a, 0x00, 0xe0, 0x83, 0x8a, 0x01, 0x3b, 0x05, 0x9d, -0xc0, 0x46, 0xab, 0x83, 0x31, 0x71, 0x64, 0x4b, 0x9d, 0x6a, 0x05, 0x9b, +0xc0, 0x46, 0xab, 0x83, 0x31, 0x71, 0x65, 0x4b, 0x9d, 0x6a, 0x05, 0x9b, 0x9e, 0x8b, 0x58, 0x23, 0x73, 0x43, 0xeb, 0x18, 0xdd, 0x1d, 0x01, 0x35, 0x01, 0x23, 0x9b, 0x07, 0x2b, 0x43, 0x1d, 0x68, 0x2b, 0x0e, 0x5b, 0x06, 0x01, 0xd1, 0x08, 0x31, 0x00, 0xe0, 0x10, 0x31, 0x81, 0x23, 0x5b, 0x02, @@ -692,7 +700,7 @@ 0x24, 0x0c, 0x05, 0x9b, 0xc0, 0x46, 0x1c, 0x87, 0x08, 0x9b, 0x1b, 0x68, 0x1b, 0x19, 0x10, 0x3b, 0x9b, 0x7b, 0x06, 0x9d, 0x40, 0x35, 0x2b, 0x70, 0x2b, 0x78, 0x02, 0x33, 0xe3, 0x1a, 0x1c, 0x04, 0x24, 0x0c, 0x01, 0x32, -0xbb, 0x08, 0x9b, 0x07, 0x6b, 0xd0, 0x83, 0x18, 0x20, 0x33, 0x04, 0x93, +0xbb, 0x08, 0x9b, 0x07, 0x6d, 0xd0, 0x83, 0x18, 0x20, 0x33, 0x04, 0x93, 0x19, 0x72, 0x01, 0x9b, 0x5d, 0x18, 0x01, 0x23, 0x9b, 0x07, 0x2b, 0x43, 0x1b, 0x68, 0x1b, 0x07, 0x1b, 0x0f, 0x9b, 0x00, 0x04, 0x9e, 0xc0, 0x46, 0x33, 0x73, 0x00, 0x95, 0x2b, 0x78, 0x1b, 0x07, 0x1b, 0x0f, 0x9b, 0x00, @@ -701,102 +709,103 @@ 0x2b, 0x43, 0x55, 0x00, 0x2d, 0x18, 0x2b, 0x86, 0x04, 0x9b, 0xc0, 0x46, 0x59, 0x72, 0x04, 0x9b, 0x1b, 0x7b, 0x2e, 0x1c, 0x04, 0x9d, 0xc0, 0x46, 0x6b, 0x73, 0x33, 0x8e, 0xc0, 0x46, 0x73, 0x86, 0x00, 0x9d, 0x2b, 0x78, -0x1b, 0x07, 0x1b, 0x0f, 0x9b, 0x00, 0x59, 0x18, 0x04, 0x25, 0x3d, 0x40, -0x0e, 0xd0, 0x34, 0x87, 0x03, 0x8b, 0x01, 0x3b, 0xb3, 0x83, 0x13, 0x1c, -0x1b, 0x18, 0x20, 0x33, 0x19, 0x71, 0x01, 0x9b, 0x5b, 0x18, 0x5b, 0x78, -0x9b, 0x00, 0x59, 0x18, 0x08, 0x31, 0x01, 0x32, 0x3b, 0x09, 0x37, 0xd3, -0x00, 0x2d, 0x01, 0xd0, 0x43, 0x8b, 0x00, 0xe0, 0x03, 0x8b, 0x55, 0x00, -0x2d, 0x18, 0x01, 0x3b, 0xab, 0x83, 0x83, 0x18, 0x03, 0x93, 0x20, 0x33, -0x19, 0x71, 0x20, 0x4b, 0x9d, 0x6a, 0x53, 0x00, 0x1b, 0x18, 0x02, 0x93, -0x9e, 0x8b, 0x58, 0x23, 0x73, 0x43, 0xeb, 0x18, 0xdd, 0x1d, 0x01, 0x35, -0x01, 0x23, 0x9b, 0x07, 0x2b, 0x43, 0x1d, 0x68, 0x2b, 0x0e, 0x5b, 0x06, -0x02, 0xd1, 0x08, 0x31, 0x01, 0xe0, 0x15, 0xe0, 0x10, 0x31, 0x81, 0x23, -0x5b, 0x02, 0x1d, 0x40, 0x9d, 0x42, 0x03, 0xd1, 0xe3, 0x1f, 0x05, 0x3b, -0x1c, 0x04, 0x24, 0x0c, 0x02, 0x9b, 0xc0, 0x46, 0x1c, 0x87, 0x08, 0x9b, -0x1b, 0x68, 0x1b, 0x19, 0x10, 0x3b, 0x9b, 0x7b, 0x03, 0x9c, 0x40, 0x34, -0x23, 0x70, 0x01, 0x32, 0x07, 0x9b, 0xc0, 0x46, 0xd9, 0x80, 0x51, 0x1e, -0xc3, 0x1d, 0x49, 0x33, 0x19, 0x70, 0x07, 0x61, 0x04, 0x2a, 0x06, 0xd2, -0x06, 0x49, 0x53, 0x00, 0x1b, 0x18, 0x99, 0x83, 0x01, 0x32, 0x04, 0x2a, -0xf9, 0xd3, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0xc8, 0x29, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, -0x70, 0x47, 0x80, 0xb5, 0x8c, 0xb0, 0x07, 0x1c, 0x12, 0x48, 0x01, 0x68, -0x01, 0x31, 0x01, 0x60, 0x38, 0x68, 0xc0, 0x46, 0x00, 0x90, 0x78, 0x68, -0xc0, 0x46, 0x01, 0x90, 0xb8, 0x68, 0xc0, 0x46, 0x02, 0x90, 0x0d, 0x48, -0x41, 0x68, 0xc9, 0x68, 0xc0, 0x46, 0x41, 0x60, 0x38, 0x1c, 0x00, 0xf0, -0x4f, 0xf8, 0xb8, 0x68, 0x40, 0x09, 0x06, 0xd3, 0x10, 0x23, 0x02, 0x98, -0x18, 0x43, 0x02, 0x90, 0x68, 0x46, 0x02, 0xf0, 0xcd, 0xff, 0x68, 0x46, -0x02, 0xf0, 0x82, 0xfe, 0x0c, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x78, 0x2a, 0x00, 0x80, 0xec, 0x05, 0x00, 0x80, 0x00, 0xb5, 0x8c, 0xb0, -0x01, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x41, 0x68, 0x05, 0x4b, 0x19, 0x43, -0x01, 0x91, 0x00, 0xf0, 0x2f, 0xf8, 0x68, 0x46, 0x02, 0xf0, 0x6c, 0xfe, -0x0c, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, -0x02, 0x6a, 0x03, 0x68, 0xc0, 0x46, 0x13, 0x60, 0x40, 0x68, 0xc0, 0x46, -0x50, 0x60, 0x40, 0x32, 0x48, 0x68, 0xc0, 0x46, 0x90, 0x80, 0xc8, 0x68, -0xc0, 0x46, 0xd0, 0x80, 0x48, 0x69, 0xc0, 0x46, 0x10, 0x81, 0x88, 0x68, -0xc0, 0x46, 0x50, 0x81, 0x08, 0x7e, 0xc0, 0x46, 0x90, 0x73, 0x08, 0x69, -0xc0, 0x46, 0x90, 0x81, 0x70, 0x47, 0x04, 0x49, 0x08, 0x68, 0x00, 0x28, -0x00, 0xd1, 0x70, 0x47, 0xc2, 0x68, 0xc0, 0x46, 0x0a, 0x60, 0xfa, 0xe7, -0xec, 0x05, 0x00, 0x80, 0x02, 0x49, 0x0a, 0x68, 0xc0, 0x46, 0xc2, 0x60, -0x08, 0x60, 0x70, 0x47, 0xec, 0x05, 0x00, 0x80, 0xb0, 0xb4, 0x00, 0x22, -0x12, 0x4f, 0x3b, 0x7f, 0x01, 0x33, 0x3b, 0x77, 0x03, 0x23, 0xfc, 0x1d, -0x19, 0x34, 0x38, 0x62, 0x79, 0x62, 0x23, 0x72, 0x0e, 0x4c, 0x25, 0x68, -0x6b, 0x0c, 0x05, 0xd2, 0x23, 0x68, 0x1b, 0x0c, 0x10, 0xd1, 0x24, 0x68, -0xa3, 0x0a, 0x0d, 0xd3, 0x01, 0x23, 0x0a, 0x4f, 0xc0, 0x46, 0xfb, 0x62, -0x09, 0x4f, 0x0a, 0x4b, 0xc0, 0x46, 0xdf, 0x60, 0x99, 0x60, 0x58, 0x60, -0x10, 0x1c, 0x18, 0x60, 0x01, 0x32, 0xfb, 0xe7, 0x10, 0x1c, 0x38, 0x64, -0x01, 0x32, 0xfb, 0xe7, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, -0xc0, 0x00, 0x18, 0x00, 0x02, 0x81, 0x00, 0x00, 0x40, 0x01, 0x18, 0x00, -0xf0, 0xb5, 0x47, 0x4f, 0x38, 0x68, 0x47, 0x4e, 0x47, 0x4d, 0x07, 0x23, -0x5b, 0x02, 0xec, 0x18, 0x00, 0x28, 0x1d, 0xd1, 0xe0, 0x6a, 0x01, 0x30, -0xe0, 0x62, 0x44, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x43, 0x48, 0x41, 0x69, -0x00, 0x29, 0x13, 0xd0, 0xc1, 0x1d, 0x69, 0x31, 0x09, 0x7b, 0x00, 0x29, -0x0e, 0xd0, 0x01, 0x23, 0x9b, 0x07, 0x01, 0x6d, 0x19, 0x43, 0x09, 0x68, -0xc0, 0x46, 0x81, 0x61, 0xc2, 0x69, 0x91, 0x42, 0x04, 0xd0, 0xf1, 0x6c, -0x01, 0x31, 0xf1, 0x64, 0x01, 0xf0, 0x3a, 0xfe, 0x38, 0x68, 0x01, 0x28, -0x17, 0xd1, 0x37, 0x48, 0x41, 0x69, 0x00, 0x29, 0x13, 0xd0, 0xc1, 0x1d, -0x69, 0x31, 0x09, 0x7b, 0x00, 0x29, 0x0e, 0xd0, 0x01, 0x23, 0x9b, 0x07, -0x01, 0x6d, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x81, 0x61, 0xc2, 0x69, -0x91, 0x42, 0x04, 0xd0, 0xf1, 0x6c, 0x01, 0x31, 0xf1, 0x64, 0x01, 0xf0, -0x1f, 0xfe, 0x38, 0x68, 0x02, 0x28, 0x2f, 0xd1, 0xbb, 0x23, 0x1b, 0x01, -0xee, 0x18, 0x70, 0x7a, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x70, 0x72, -0x00, 0xf0, 0x30, 0xfd, 0x30, 0x7a, 0x00, 0x28, 0x02, 0xd0, 0x78, 0x68, -0x02, 0xf0, 0x96, 0xff, 0x1b, 0x23, 0xdb, 0x01, 0xe8, 0x18, 0x40, 0x8b, -0x04, 0x26, 0x06, 0x40, 0xa0, 0x6a, 0xb0, 0x42, -0x14, 0xd0, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, 0x19, 0x28, 0x11, 0xd3, -0x1b, 0x48, 0x01, 0x7b, 0x00, 0x29, 0x0d, 0xd1, 0xff, 0x30, 0x41, 0x30, -0x40, 0x78, 0x00, 0x28, 0x08, 0xd1, 0xb8, 0x68, 0x02, 0xf0, 0x7c, 0xff, -0x00, 0x20, 0xf8, 0x60, 0xa6, 0x62, 0x01, 0xe0, 0x00, 0x20, 0xf8, 0x60, -0x38, 0x68, 0x03, 0x28, 0x0b, 0xd1, 0xec, 0x1d, 0x79, 0x34, 0xa0, 0x6b, -0x80, 0x08, 0x02, 0xd3, 0x02, 0x20, 0x02, 0xf0, 0xef, 0xfb, 0x02, 0x23, -0xa0, 0x6b, 0x98, 0x43, 0xa0, 0x63, 0x38, 0x68, 0x01, 0x30, 0x38, 0x60, -0x03, 0x28, 0x01, 0xd9, 0x00, 0x20, 0x38, 0x60, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x40, 0x01, 0x18, 0x00, 0xd0, 0x2c, 0x00, 0x80, -0x50, 0x2c, 0x00, 0x80, 0xa8, 0x04, 0x00, 0x80, 0x90, 0xb4, 0x1c, 0x48, -0x02, 0x8a, 0x1c, 0x49, 0x0f, 0x8a, 0x01, 0x23, 0xba, 0x42, 0x03, 0xd1, -0xc2, 0x89, 0x4f, 0x8a, 0xba, 0x42, 0x10, 0xd0, 0x02, 0x7b, 0x00, 0x2a, -0x0d, 0xd0, 0x42, 0x7b, 0x00, 0x2a, 0x0a, 0xd0, 0xc7, 0x8a, 0x8a, 0x8a, -0x97, 0x42, 0x04, 0xdc, 0x13, 0x4a, 0xc0, 0x46, 0x53, 0x60, 0x8b, 0x82, -0x01, 0xe0, 0x01, 0x32, 0x8a, 0x82, 0x42, 0x8b, 0x57, 0x1c, 0x47, 0x83, -0x07, 0x8b, 0xba, 0x42, 0x0e, 0xdb, 0x07, 0x8a, 0x84, 0x8a, 0x00, 0x22, -0xa7, 0x42, 0x05, 0xda, 0xc7, 0x89, 0x44, 0x8a, 0xa7, 0x42, 0x01, 0xda, -0x42, 0x73, 0x00, 0xe0, 0x43, 0x73, 0xc2, 0x81, 0x02, 0x82, 0x42, 0x83, -0xc2, 0x89, 0xc0, 0x46, 0x4a, 0x82, 0x00, 0x8a, 0xc0, 0x46, 0x08, 0x82, -0x90, 0xbc, 0x70, 0x47, 0x68, 0x0e, 0x00, 0x80, 0xbc, 0x03, 0x00, 0x80, -0x40, 0x01, 0x18, 0x00, 0xf7, 0xb5, 0x91, 0xb0, 0x6b, 0x46, 0x84, 0x1e, -0x12, 0x99, 0x14, 0x29, 0x1a, 0xd9, 0x00, 0x20, 0x81, 0x00, 0x67, 0x58, -0xc0, 0x46, 0x57, 0x50, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0x28, -0xf6, 0xd3, 0x00, 0x21, 0x05, 0x20, 0x87, 0x00, 0xd6, 0x59, 0x4f, 0x1c, -0x3d, 0x06, 0x2d, 0x0e, 0x0f, 0x1c, 0xbf, 0x00, 0xde, 0x51, 0x29, 0x1c, -0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0x28, 0xf1, 0xd3, 0x09, 0xe0, -0x00, 0x20, 0x81, 0x00, 0x63, 0x58, 0xc0, 0x46, 0x53, 0x50, 0x01, 0x30, -0x00, 0x06, 0x00, 0x0e, 0x06, 0x28, 0xf6, 0xd3, 0x00, 0x20, 0xe0, 0x70, -0x20, 0x72, 0x60, 0x72, 0xa0, 0x72, 0x20, 0x73, 0x60, 0x73, 0x12, 0x99, -0x14, 0x29, 0x37, 0xd9, 0x69, 0x46, 0x8e, 0x1c, 0x91, 0x78, 0x09, 0x07, -0x09, 0x0f, 0x89, 0x00, 0x14, 0x39, 0x0d, 0x06, 0x2d, 0x16, 0x00, 0x27, -0x00, 0x2d, 0x1b, 0xdd, 0xf0, 0x19, 0x10, 0xa9, 0x00, 0xf0, 0x3d, 0xf8, -0x00, 0x28, 0x0e, 0xd0, 0x00, 0x20, 0x10, 0xa9, 0x09, 0x78, 0x00, 0x29, -0x09, 0xdd, 0x00, 0x22, 0x39, 0x18, 0x72, 0x54, 0x01, 0x30, 0x00, 0x06, +0x1b, 0x07, 0x1b, 0x0f, 0x9b, 0x00, 0x1b, 0x04, 0x1b, 0x0c, 0x59, 0x18, +0x04, 0x25, 0x3d, 0x40, 0x0e, 0xd0, 0x34, 0x87, 0x03, 0x8b, 0x01, 0x3b, +0xb3, 0x83, 0x13, 0x1c, 0x1b, 0x18, 0x20, 0x33, 0x19, 0x71, 0x01, 0x9b, +0x5b, 0x18, 0x5b, 0x78, 0x9b, 0x00, 0x59, 0x18, 0x08, 0x31, 0x01, 0x32, +0x3b, 0x09, 0x37, 0xd3, 0x00, 0x2d, 0x01, 0xd0, 0x43, 0x8b, 0x00, 0xe0, +0x03, 0x8b, 0x55, 0x00, 0x2d, 0x18, 0x01, 0x3b, 0xab, 0x83, 0x83, 0x18, +0x03, 0x93, 0x20, 0x33, 0x19, 0x71, 0x20, 0x4b, 0x9d, 0x6a, 0x53, 0x00, +0x1b, 0x18, 0x02, 0x93, 0x9e, 0x8b, 0x58, 0x23, 0x73, 0x43, 0xeb, 0x18, +0xdd, 0x1d, 0x01, 0x35, 0x01, 0x23, 0x9b, 0x07, 0x2b, 0x43, 0x1d, 0x68, +0x2b, 0x0e, 0x5b, 0x06, 0x02, 0xd1, 0x08, 0x31, 0x01, 0xe0, 0x15, 0xe0, +0x10, 0x31, 0x81, 0x23, 0x5b, 0x02, 0x1d, 0x40, +0x9d, 0x42, 0x03, 0xd1, 0xe3, 0x1f, 0x05, 0x3b, 0x1c, 0x04, 0x24, 0x0c, +0x02, 0x9b, 0xc0, 0x46, 0x1c, 0x87, 0x08, 0x9b, 0x1b, 0x68, 0x1b, 0x19, +0x10, 0x3b, 0x9b, 0x7b, 0x03, 0x9c, 0x40, 0x34, 0x23, 0x70, 0x01, 0x32, +0x07, 0x9b, 0xc0, 0x46, 0xd9, 0x80, 0x51, 0x1e, 0xc3, 0x1d, 0x49, 0x33, +0x19, 0x70, 0x07, 0x61, 0x04, 0x2a, 0x06, 0xd2, 0x06, 0x49, 0x53, 0x00, +0x1b, 0x18, 0x99, 0x83, 0x01, 0x32, 0x04, 0x2a, 0xf9, 0xd3, 0x09, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x2a, 0x00, 0x80, +0xff, 0xff, 0x00, 0x00, 0x70, 0x47, 0x80, 0xb5, 0x8c, 0xb0, 0x07, 0x1c, +0x12, 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x38, 0x68, 0xc0, 0x46, +0x00, 0x90, 0x78, 0x68, 0xc0, 0x46, 0x01, 0x90, 0xb8, 0x68, 0xc0, 0x46, +0x02, 0x90, 0x0d, 0x48, 0x41, 0x68, 0xc9, 0x68, 0xc0, 0x46, 0x41, 0x60, +0x38, 0x1c, 0x00, 0xf0, 0x4f, 0xf8, 0xb8, 0x68, 0x40, 0x09, 0x06, 0xd3, +0x10, 0x23, 0x02, 0x98, 0x18, 0x43, 0x02, 0x90, 0x68, 0x46, 0x02, 0xf0, +0xe1, 0xff, 0x68, 0x46, 0x02, 0xf0, 0x9a, 0xfe, 0x0c, 0xb0, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x0c, 0x2b, 0x00, 0x80, 0x6c, 0x06, 0x00, 0x80, +0x00, 0xb5, 0x8c, 0xb0, 0x01, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x41, 0x68, +0x05, 0x4b, 0x19, 0x43, 0x01, 0x91, 0x00, 0xf0, 0x2f, 0xf8, 0x68, 0x46, +0x02, 0xf0, 0x84, 0xfe, 0x0c, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0xa0, 0x02, 0x6a, 0x03, 0x68, 0xc0, 0x46, 0x13, 0x60, +0x40, 0x68, 0xc0, 0x46, 0x50, 0x60, 0x40, 0x32, 0x48, 0x68, 0xc0, 0x46, +0x90, 0x80, 0xc8, 0x68, 0xc0, 0x46, 0xd0, 0x80, 0x48, 0x69, 0xc0, 0x46, +0x10, 0x81, 0x88, 0x68, 0xc0, 0x46, 0x50, 0x81, 0x08, 0x7e, 0xc0, 0x46, +0x90, 0x73, 0x08, 0x69, 0xc0, 0x46, 0x90, 0x81, 0x70, 0x47, 0x04, 0x49, +0x08, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0xc2, 0x68, 0xc0, 0x46, +0x0a, 0x60, 0xfa, 0xe7, 0x6c, 0x06, 0x00, 0x80, 0x02, 0x49, 0x0a, 0x68, +0xc0, 0x46, 0xc2, 0x60, 0x08, 0x60, 0x70, 0x47, 0x6c, 0x06, 0x00, 0x80, +0xb0, 0xb4, 0x00, 0x22, 0x12, 0x4f, 0x7c, 0x7f, 0x01, 0x34, 0x7c, 0x77, +0x03, 0x23, 0xfc, 0x1d, 0x19, 0x34, 0x38, 0x62, 0x79, 0x62, 0x23, 0x72, +0x0e, 0x4c, 0x25, 0x68, 0x6b, 0x0c, 0x05, 0xd2, 0x23, 0x68, 0x1b, 0x0c, +0x10, 0xd1, 0x24, 0x68, 0xa3, 0x0a, 0x0d, 0xd3, 0x01, 0x23, 0x0a, 0x4f, +0xc0, 0x46, 0xfb, 0x62, 0x09, 0x4f, 0x0a, 0x4b, 0xc0, 0x46, 0xdf, 0x60, +0x99, 0x60, 0x58, 0x60, 0x10, 0x1c, 0x18, 0x60, 0x01, 0x32, 0xfb, 0xe7, +0x10, 0x1c, 0x38, 0x64, 0x01, 0x32, 0xfb, 0xe7, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x10, 0x40, 0xc0, 0x00, 0x18, 0x00, 0x02, 0x81, 0x00, 0x00, +0x40, 0x01, 0x18, 0x00, 0xf0, 0xb5, 0x47, 0x4f, 0x38, 0x68, 0x47, 0x4e, +0x47, 0x4d, 0x07, 0x23, 0x5b, 0x02, 0xec, 0x18, 0x00, 0x28, 0x1d, 0xd1, +0x20, 0x6b, 0x01, 0x30, 0x20, 0x63, 0x44, 0x49, 0xc0, 0x46, 0x08, 0x60, +0x43, 0x48, 0x41, 0x69, 0x00, 0x29, 0x13, 0xd0, 0xc1, 0x1d, 0x69, 0x31, +0x09, 0x7b, 0x00, 0x29, 0x0e, 0xd0, 0x01, 0x23, 0x9b, 0x07, 0x01, 0x6d, +0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x81, 0x61, 0xc2, 0x69, 0x91, 0x42, +0x04, 0xd0, 0xf1, 0x6c, 0x01, 0x31, 0xf1, 0x64, 0x01, 0xf0, 0x50, 0xfe, +0x38, 0x68, 0x01, 0x28, 0x17, 0xd1, 0x37, 0x48, 0x41, 0x69, 0x00, 0x29, +0x13, 0xd0, 0xc1, 0x1d, 0x69, 0x31, 0x09, 0x7b, +0x00, 0x29, 0x0e, 0xd0, 0x01, 0x23, 0x9b, 0x07, 0x01, 0x6d, 0x19, 0x43, +0x09, 0x68, 0xc0, 0x46, 0x81, 0x61, 0xc2, 0x69, 0x91, 0x42, 0x04, 0xd0, +0xf1, 0x6c, 0x01, 0x31, 0xf1, 0x64, 0x01, 0xf0, 0x35, 0xfe, 0x38, 0x68, +0x02, 0x28, 0x2f, 0xd1, 0xbb, 0x23, 0x1b, 0x01, 0xee, 0x18, 0x70, 0x7b, +0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x70, 0x73, 0x00, 0xf0, 0x4a, 0xfd, +0x30, 0x7b, 0x00, 0x28, 0x02, 0xd0, 0x78, 0x68, 0x02, 0xf0, 0xaa, 0xff, +0x1b, 0x23, 0xdb, 0x01, 0xe8, 0x18, 0xc0, 0x8b, 0x04, 0x26, 0x06, 0x40, +0xe0, 0x6a, 0xb0, 0x42, 0x14, 0xd0, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, +0x19, 0x28, 0x11, 0xd3, 0x1b, 0x48, 0x01, 0x7b, 0x00, 0x29, 0x0d, 0xd1, +0xff, 0x30, 0x41, 0x30, 0x40, 0x78, 0x00, 0x28, 0x08, 0xd1, 0xb8, 0x68, +0x02, 0xf0, 0x90, 0xff, 0x00, 0x20, 0xf8, 0x60, 0xe6, 0x62, 0x01, 0xe0, +0x00, 0x20, 0xf8, 0x60, 0x38, 0x68, 0x03, 0x28, 0x0b, 0xd1, 0xec, 0x1d, +0x79, 0x34, 0xe0, 0x6b, 0x80, 0x08, 0x02, 0xd3, 0x02, 0x20, 0x02, 0xf0, +0x07, 0xfc, 0x02, 0x23, 0xe0, 0x6b, 0x98, 0x43, 0xe0, 0x63, 0x38, 0x68, +0x01, 0x30, 0x38, 0x60, 0x03, 0x28, 0x01, 0xd9, 0x00, 0x20, 0x38, 0x60, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x80, +0xa0, 0x82, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, 0x40, 0x01, 0x18, 0x00, +0x64, 0x2d, 0x00, 0x80, 0xe4, 0x2c, 0x00, 0x80, 0x28, 0x05, 0x00, 0x80, +0xb0, 0xb4, 0x1d, 0x48, 0x84, 0x8a, 0x1d, 0x4a, 0x13, 0x8a, 0xc1, 0x1d, +0x09, 0x31, 0x01, 0x27, 0x9c, 0x42, 0x03, 0xd1, 0x43, 0x8a, 0x54, 0x8a, +0xa3, 0x42, 0x10, 0xd0, 0x0b, 0x78, 0x00, 0x2b, 0x0d, 0xd0, 0x4b, 0x78, +0x00, 0x2b, 0x0a, 0xd0, 0x44, 0x8b, 0x93, 0x8a, 0x9c, 0x42, 0x04, 0xdc, +0x13, 0x4b, 0xc0, 0x46, 0x5f, 0x60, 0x97, 0x82, 0x01, 0xe0, 0x01, 0x33, +0x93, 0x82, 0xc3, 0x8b, 0x5c, 0x1c, 0xc4, 0x83, 0x84, 0x8b, 0xa3, 0x42, +0x0e, 0xdb, 0x84, 0x8a, 0x05, 0x8b, 0x00, 0x23, 0xac, 0x42, 0x05, 0xda, +0x44, 0x8a, 0xc5, 0x8a, 0xac, 0x42, 0x01, 0xda, 0x4b, 0x70, 0x00, 0xe0, +0x4f, 0x70, 0x43, 0x82, 0x83, 0x82, 0xc3, 0x83, 0x41, 0x8a, 0xc0, 0x46, +0x51, 0x82, 0x80, 0x8a, 0xc0, 0x46, 0x10, 0x82, 0xb0, 0xbc, 0x70, 0x47, +0xe8, 0x0e, 0x00, 0x80, 0x3c, 0x04, 0x00, 0x80, 0x40, 0x01, 0x18, 0x00, +0xf7, 0xb5, 0x91, 0xb0, 0x6b, 0x46, 0x84, 0x1e, 0x12, 0x99, 0x14, 0x29, +0x1a, 0xd9, 0x00, 0x20, 0x81, 0x00, 0x67, 0x58, 0xc0, 0x46, 0x57, 0x50, +0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0x28, 0xf6, 0xd3, 0x00, 0x21, +0x05, 0x20, 0x87, 0x00, 0xd6, 0x59, 0x4f, 0x1c, 0x3d, 0x06, 0x2d, 0x0e, +0x0f, 0x1c, 0xbf, 0x00, 0xde, 0x51, 0x29, 0x1c, 0x01, 0x30, 0x00, 0x06, +0x00, 0x0e, 0x10, 0x28, 0xf1, 0xd3, 0x09, 0xe0, 0x00, 0x20, 0x81, 0x00, +0x63, 0x58, 0xc0, 0x46, 0x53, 0x50, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, +0x06, 0x28, 0xf6, 0xd3, 0x00, 0x20, 0xe0, 0x70, 0x20, 0x72, 0x60, 0x72, +0xa0, 0x72, 0x20, 0x73, 0x60, 0x73, 0x12, 0x99, 0x14, 0x29, 0x37, 0xd9, +0x69, 0x46, 0x8e, 0x1c, 0x91, 0x78, 0x09, 0x07, 0x09, 0x0f, 0x89, 0x00, +0x14, 0x39, 0x0d, 0x06, 0x2d, 0x16, 0x00, 0x27, 0x00, 0x2d, 0x1b, 0xdd, +0xf0, 0x19, 0x10, 0xa9, 0x00, 0xf0, 0x3d, 0xf8, 0x00, 0x28, 0x0e, 0xd0, +0x00, 0x20, 0x10, 0xa9, 0x09, 0x78, 0x00, 0x29, 0x09, 0xdd, 0x00, 0x22, +0x39, 0x18, 0x72, 0x54, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0xa9, 0x09, 0x78, 0x88, 0x42, 0xf6, 0xdb, 0x10, 0xa8, 0x00, 0x78, 0x38, 0x18, 0x07, 0x06, 0x3f, 0x0e, 0xaf, 0x42, 0xe3, 0xdb, 0x68, 0x46, 0xe2, 0x1d, 0x0d, 0x32, 0x00, 0x21, 0xab, 0x08, 0x5f, 0x1c, @@ -804,257 +813,261 @@ 0x09, 0x06, 0x09, 0x0e, 0x8f, 0x42, 0xf6, 0xd8, 0x14, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb4, 0x87, 0x1e, 0x00, 0x20, 0x89, 0x08, 0x4b, 0x1c, 0x08, 0xd0, 0x81, 0x00, 0x54, 0x58, 0xc0, 0x46, 0x7c, 0x50, -0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x83, 0x42, -0xf6, 0xd8, 0x90, 0xbc, 0x70, 0x47, 0x80, 0xb4, 0x02, 0x78, 0xd2, 0x06, -0xd2, 0x0e, 0x00, 0x23, 0x01, 0x27, 0x01, 0x2a, 0x01, 0xdc, 0x0f, 0x70, -0x11, 0xe0, 0x40, 0x78, 0xc0, 0x46, 0x08, 0x70, 0x14, 0x2a, 0x04, 0xd1, -0x08, 0x48, 0x01, 0x7a, 0x01, 0x31, 0x01, 0x72, 0x07, 0xe0, 0x02, 0x2a, -0x05, 0xd0, 0x05, 0x2a, 0x03, 0xd0, 0x06, 0x2a, 0x01, 0xd0, 0x15, 0x2a, -0x02, 0xd1, 0x18, 0x1c, 0x80, 0xbc, 0x70, 0x47, 0x38, 0x1c, 0xfb, 0xe7, -0xe0, 0x82, 0x20, 0x40, 0x00, 0xb5, 0x0f, 0x48, 0x01, 0x23, 0x1b, 0x06, -0x41, 0x69, 0x99, 0x43, 0x1a, 0x09, 0x41, 0x61, 0xd1, 0x60, 0x00, 0x21, -0xa1, 0x22, 0x52, 0x03, 0x91, 0x61, 0x19, 0x1c, 0x09, 0x4a, 0xc0, 0x46, -0x11, 0x60, 0x1b, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x40, 0x69, 0x00, 0x28, -0x03, 0xd0, 0x02, 0xf0, 0x4f, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x04, 0x48, -0x41, 0x88, 0x01, 0x31, 0x41, 0x80, 0xf8, 0xe7, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x00, 0x00, 0xb0, 0xe0, 0x82, 0x20, 0x40, 0x70, 0x47, 0x00, 0x00, -0xf0, 0xb5, 0x85, 0xb0, 0x94, 0x49, 0xc8, 0x68, 0xcf, 0x1d, 0x79, 0x37, -0x01, 0x28, 0x0b, 0xd1, 0xb8, 0x88, 0x00, 0x28, 0x08, 0xd1, 0xc3, 0x1e, -0xca, 0x6f, 0x1a, 0x40, 0xca, 0x67, 0x8f, 0x48, 0xc0, 0x46, 0x02, 0x60, -0x14, 0x20, 0xb8, 0x80, 0x8d, 0x4c, 0x62, 0x6a, 0x8d, 0x48, 0xc3, 0x6b, -0x9a, 0x18, 0xc2, 0x63, 0xa0, 0x6a, 0x19, 0x23, 0xdb, 0x01, 0xcc, 0x18, -0x60, 0x62, 0xe2, 0x69, 0x12, 0x03, 0x12, 0x0b, 0x82, 0x42, 0x05, 0xd1, -0x01, 0x20, 0x40, 0x04, 0x86, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xef, 0xe0, -0x3b, 0x8a, 0x58, 0x1c, 0x38, 0x82, 0xbd, 0x8a, 0x01, 0x20, 0x00, 0x22, -0xab, 0x42, 0x02, 0xdb, 0x78, 0x73, 0x3a, 0x82, 0x7a, 0x83, 0x33, 0x23, -0x9b, 0x01, 0xcb, 0x18, 0x04, 0x93, 0x1b, 0x69, 0x0f, 0x2b, 0x73, 0xd2, -0x00, 0x22, 0x2f, 0x23, 0x9b, 0x01, 0xcf, 0x18, 0xfa, 0x60, 0xe1, 0x69, -0x8a, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x4b, 0x68, 0x1e, 0x0c, 0x36, 0x04, -0x76, 0x4d, 0x05, 0xd1, 0x3b, 0x2a, 0x03, 0xd3, 0x01, 0x23, 0xdb, 0x02, -0x9a, 0x42, 0x01, 0xd9, 0xa8, 0x72, 0xc7, 0xe0, 0x01, 0x23, 0x9b, 0x07, -0x08, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x03, 0x91, 0x03, 0xa9, -0x09, 0x88, 0x01, 0x31, 0x09, 0x04, 0x09, 0x0c, 0xf9, 0x81, 0x49, 0x09, -0x05, 0x31, 0x09, 0x06, 0x09, 0x0e, 0x6a, 0x4a, 0xc0, 0x46, 0x02, 0x92, -0x06, 0x1c, 0x69, 0x48, 0x43, 0x6a, 0xc0, 0x46, 0x01, 0x93, 0x83, 0x6a, -0xc0, 0x46, 0x00, 0x93, 0xc2, 0x1d, 0x11, 0x32, 0x80, 0x69, 0x00, 0x03, -0x00, 0x0b, 0x92, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x1a, 0x43, 0x12, 0x68, -0x90, 0x42, 0x01, 0xd1, 0x30, 0x1c, 0x0d, 0xe0, 0x90, 0x42, 0x05, 0xd9, -0x00, 0x9b, 0x18, 0x1a, 0x01, 0x9b, 0xd2, 0x1a, 0x82, 0x18, 0x00, 0xe0, -0x12, 0x1a, 0x01, 0x20, 0x09, 0x01, 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, -0x01, 0x28, 0x62, 0xd1, 0xe0, 0x68, 0x00, 0x28, 0x60, 0xd0, 0x04, 0x99, -0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x02, 0x20, 0xe1, 0x69, 0xc0, 0x46, -0x08, 0x60, 0x00, 0xf0, 0x8f, 0xfc, 0x38, 0x63, 0x4e, 0x49, 0xc0, 0x46, -0x79, 0x60, 0xe1, 0x69, 0x62, 0x6b, 0x8a, 0x18, 0x23, 0x6b, 0x9a, 0x42, -0x00, 0xd9, 0xe1, 0x6a, 0xc0, 0x46, 0x79, 0x62, 0x79, 0x6a, 0x0c, 0x31, -0xb9, 0x62, 0x00, 0x21, 0xb9, 0x61, 0x03, 0xa9, 0x49, 0x88, 0xc9, 0x09, -0x03, 0xd3, 0x00, 0xe0, 0x78, 0xe0, 0x31, 0x1c, -0x00, 0xe0, 0x00, 0x21, 0x39, 0x60, 0x39, 0x68, 0xc0, 0x46, 0x01, 0x60, -0xf8, 0x89, 0x41, 0x4e, 0x60, 0x28, 0x04, 0xdc, 0x30, 0x83, 0xf8, 0x89, -0xc0, 0x46, 0x70, 0x83, 0x08, 0xe0, 0x60, 0x20, 0x30, 0x83, 0xf9, 0x89, -0xb8, 0x6a, 0x42, 0x18, 0x23, 0x6b, 0x9a, 0x42, 0x03, 0xd8, 0x71, 0x83, -0x00, 0x21, 0xf9, 0x62, 0x05, 0xe0, 0xe1, 0x6a, 0xc0, 0x46, 0xf9, 0x62, -0x21, 0x6b, 0x08, 0x1a, 0x70, 0x83, 0x38, 0x6b, 0x41, 0x68, 0xc0, 0x46, -0x79, 0x60, 0x81, 0x68, 0xc0, 0x46, 0xb9, 0x60, 0x01, 0x69, 0xc0, 0x46, -0x39, 0x61, 0x40, 0x69, 0xc0, 0x46, 0x78, 0x61, 0x38, 0x1c, 0x00, 0xf0, -0x23, 0xf9, 0x38, 0x1c, 0x00, 0xf0, 0x88, 0xf8, 0x00, 0xf0, 0xe0, 0xfa, -0xf8, 0x89, 0x71, 0x8b, 0x88, 0x42, 0x04, 0xd1, 0xb9, 0x6a, 0x08, 0x18, -0x04, 0xe0, 0x38, 0xe0, 0x32, 0xe0, 0xfa, 0x6a, 0x10, 0x18, 0x40, 0x1a, -0x81, 0x07, 0x02, 0xd0, 0x80, 0x08, 0x80, 0x00, 0x04, 0x30, 0x21, 0x6b, -0x09, 0x1a, 0x62, 0x6b, 0x91, 0x42, 0x00, 0xd2, 0xe0, 0x6a, 0xc0, 0x46, -0xe0, 0x61, 0xe8, 0x7a, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x21, 0xe9, 0x72, -0x04, 0x99, 0x08, 0x69, 0x01, 0x38, 0x08, 0x61, 0x38, 0x6b, 0x00, 0xf0, -0x5d, 0xfa, 0x18, 0x48, 0x80, 0x6a, 0x80, 0x06, 0x80, 0x0e, 0x01, 0x28, -0x0a, 0xd1, 0xe0, 0x69, 0x00, 0x03, 0x00, 0x0b, 0x0c, 0x4c, 0xa1, 0x6a, -0x88, 0x42, 0x03, 0xd0, 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x01, 0x20, 0x40, 0x04, 0x09, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x05, 0xe0, -0xa0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x9f, 0xfa, 0xae, 0x72, -0xee, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, -0x00, 0x40, 0x14, 0x40, 0x10, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, -0x98, 0x19, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x28, 0x03, 0x00, 0x80, -0xe8, 0x19, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, 0x80, 0xb5, 0x07, 0x1c, +0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x83, 0x42, 0xf6, 0xd8, 0x90, 0xbc, +0x70, 0x47, 0x80, 0xb4, 0x02, 0x78, 0xd2, 0x06, 0xd2, 0x0e, 0x00, 0x23, +0x01, 0x27, 0x01, 0x2a, 0x01, 0xdc, 0x0f, 0x70, 0x11, 0xe0, 0x40, 0x78, +0xc0, 0x46, 0x08, 0x70, 0x14, 0x2a, 0x04, 0xd1, 0x08, 0x48, 0x01, 0x7a, +0x01, 0x31, 0x01, 0x72, 0x07, 0xe0, 0x02, 0x2a, 0x05, 0xd0, 0x05, 0x2a, +0x03, 0xd0, 0x06, 0x2a, 0x01, 0xd0, 0x15, 0x2a, 0x02, 0xd1, 0x18, 0x1c, +0x80, 0xbc, 0x70, 0x47, 0x38, 0x1c, 0xfb, 0xe7, 0xe0, 0x82, 0x20, 0x40, +0x00, 0xb5, 0x0f, 0x48, 0x01, 0x23, 0x1b, 0x06, 0x41, 0x69, 0x99, 0x43, +0x1a, 0x09, 0x41, 0x61, 0xd1, 0x60, 0x00, 0x21, 0xa1, 0x22, 0x52, 0x03, +0x91, 0x61, 0x19, 0x1c, 0x09, 0x4a, 0xc0, 0x46, 0x11, 0x60, 0x1b, 0x23, +0xdb, 0x01, 0xc0, 0x18, 0x80, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xf0, +0x61, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x04, 0x48, 0x41, 0x88, 0x01, 0x31, +0x41, 0x80, 0xf8, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, +0xe0, 0x82, 0x20, 0x40, 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x86, 0xb0, +0x95, 0x4a, 0xd0, 0x68, 0xd7, 0x1d, 0x79, 0x37, 0x01, 0x28, 0x09, 0xd1, +0x38, 0x89, 0x00, 0x28, 0x06, 0xd1, 0xd0, 0x6f, 0x02, 0x23, 0x01, 0x68, +0x99, 0x43, 0x01, 0x60, 0x14, 0x20, 0x38, 0x81, 0x8e, 0x4c, 0x61, 0x6a, +0x8e, 0x48, 0xc3, 0x6b, 0x59, 0x18, 0xc1, 0x63, 0xa0, 0x6a, 0x19, 0x23, +0xdb, 0x01, 0xd4, 0x18, 0xa0, 0x62, 0x21, 0x6a, 0x09, 0x03, 0x09, 0x0b, +0x81, 0x42, 0x05, 0xd1, 0x01, 0x20, 0x40, 0x04, 0x87, 0x49, 0xc0, 0x46, +0x08, 0x60, 0xf3, 0xe0, 0xbb, 0x8a, 0x58, 0x1c, 0xb8, 0x82, 0x3d, 0x8b, +0x01, 0x20, 0x00, 0x21, 0xab, 0x42, 0x04, 0xdb, 0xd3, 0x1d, 0x89, 0x33, +0x58, 0x70, 0xb9, 0x82, 0xf9, 0x83, 0x33, 0x23, 0x9b, 0x01, 0xd3, 0x18, +0x05, 0x93, 0x5b, 0x69, 0x0f, 0x2b, 0x73, 0xd2, 0x00, 0x21, 0x7c, 0x4f, +0xc0, 0x46, 0x39, 0x61, 0x21, 0x6a, 0x8a, 0x68, 0x12, 0x04, 0x12, 0x0c, +0x4b, 0x68, 0x1e, 0x0c, 0x36, 0x04, 0xfd, 0x1f, 0x09, 0x3d, 0x00, 0x2e, +0x05, 0xd1, 0x3b, 0x2a, 0x03, 0xd3, 0x01, 0x23, 0xdb, 0x02, 0x9a, 0x42, +0x01, 0xd9, 0xa8, 0x73, 0xc8, 0xe0, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x31, +0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x03, 0x91, 0x03, 0xa9, 0x09, 0x88, +0x01, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x79, 0x82, 0x49, 0x09, 0x05, 0x31, +0x09, 0x06, 0x09, 0x0e, 0x69, 0x4e, 0xc0, 0x46, 0x02, 0x96, 0x69, 0x48, +0x43, 0x6a, 0xc0, 0x46, 0x01, 0x93, 0x83, 0x6a, 0xc0, 0x46, 0x00, 0x93, +0xc2, 0x1d, 0x11, 0x32, 0x80, 0x69, 0x00, 0x03, 0x00, 0x0b, 0x92, 0x68, +0xb3, 0x07, 0x1a, 0x43, 0x12, 0x68, 0x90, 0x42, 0x01, 0xd1, 0x01, 0x20, +0x0d, 0xe0, 0x90, 0x42, 0x05, 0xd9, 0x00, 0x9b, 0x18, 0x1a, 0x01, 0x9b, +0xd2, 0x1a, 0x82, 0x18, 0x00, 0xe0, 0x12, 0x1a, +0x01, 0x20, 0x09, 0x01, 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, 0x01, 0x28, +0x65, 0xd1, 0x51, 0x49, 0x20, 0x69, 0x00, 0x28, 0x62, 0xd0, 0x05, 0x99, +0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x02, 0x20, 0x21, 0x6a, 0xc0, 0x46, +0x08, 0x60, 0x00, 0xf0, 0xa7, 0xfc, 0x78, 0x63, 0xbe, 0x60, 0x49, 0x49, +0x22, 0x6a, 0xa3, 0x6b, 0xd3, 0x18, 0x66, 0x6b, 0xb3, 0x42, 0x00, 0xd9, +0x22, 0x6b, 0xc0, 0x46, 0xba, 0x62, 0xba, 0x6a, 0x0c, 0x32, 0xfa, 0x62, +0x00, 0x22, 0xfa, 0x61, 0x03, 0xaa, 0x52, 0x88, 0xd2, 0x09, 0x03, 0xd3, +0x01, 0x22, 0x00, 0xe0, 0x7b, 0xe0, 0x00, 0xe0, 0x00, 0x22, 0x7a, 0x60, +0x7a, 0x68, 0xc0, 0x46, 0x02, 0x60, 0x78, 0x8a, 0x41, 0x4e, 0x60, 0x28, +0x04, 0xdc, 0xb0, 0x83, 0x78, 0x8a, 0xc0, 0x46, 0xf0, 0x83, 0x08, 0xe0, +0x60, 0x20, 0xb0, 0x83, 0x79, 0x8a, 0xf8, 0x6a, 0x42, 0x18, 0x63, 0x6b, +0x9a, 0x42, 0x03, 0xd8, 0xf1, 0x83, 0x00, 0x22, 0x3a, 0x63, 0x05, 0xe0, +0x21, 0x6b, 0xc0, 0x46, 0x39, 0x63, 0x61, 0x6b, 0x08, 0x1a, 0xf0, 0x83, +0x2d, 0x49, 0x78, 0x6b, 0x42, 0x68, 0xc0, 0x46, 0xba, 0x60, 0x82, 0x68, +0xc0, 0x46, 0xfa, 0x60, 0x02, 0x69, 0xc0, 0x46, 0x7a, 0x61, 0x40, 0x69, +0xc0, 0x46, 0xb8, 0x61, 0x2e, 0x4b, 0xc8, 0x18, 0x04, 0x90, 0x00, 0xf0, +0x37, 0xf9, 0x04, 0x98, 0x00, 0xf0, 0x88, 0xf8, 0x00, 0xf0, 0xf6, 0xfa, +0x78, 0x8a, 0xf1, 0x8b, 0x88, 0x42, 0x04, 0xd1, 0xf9, 0x6a, 0x08, 0x18, +0x04, 0xe0, 0x38, 0xe0, 0x32, 0xe0, 0x3a, 0x6b, 0x10, 0x18, 0x40, 0x1a, +0x81, 0x07, 0x02, 0xd0, 0x80, 0x08, 0x80, 0x00, 0x04, 0x30, 0x61, 0x6b, +0x09, 0x1a, 0xa2, 0x6b, 0x91, 0x42, 0x00, 0xd2, 0x20, 0x6b, 0xc0, 0x46, +0x20, 0x62, 0xe8, 0x7b, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x22, 0xea, 0x73, +0x05, 0x99, 0x48, 0x69, 0x01, 0x38, 0x48, 0x61, 0x78, 0x6b, 0x00, 0xf0, +0x73, 0xfa, 0x18, 0x48, 0x80, 0x6a, 0x80, 0x06, 0x80, 0x0e, 0x01, 0x28, +0x0a, 0xd1, 0x20, 0x6a, 0x00, 0x03, 0x00, 0x0b, 0x0b, 0x4c, 0xa1, 0x6a, +0x88, 0x42, 0x03, 0xd0, 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x01, 0x20, 0x40, 0x04, 0x08, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x06, 0xe0, +0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0xb5, 0xfa, 0x01, 0x20, +0xa8, 0x73, 0xed, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0x00, 0x40, 0x14, 0x40, +0xa4, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0x28, 0x1a, 0x00, 0x80, +0x55, 0x55, 0x55, 0x55, 0xa8, 0x03, 0x00, 0x80, 0x68, 0x1a, 0x00, 0x80, +0xc4, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x80, 0xb5, 0x07, 0x1c, 0x78, 0x6a, 0x40, 0x89, 0xff, 0x21, 0x01, 0x31, 0x01, 0x40, 0x10, 0x48, 0x02, 0xd1, 0x81, 0x6c, 0x01, 0x31, 0x81, 0x64, 0x79, 0x6a, 0x49, 0x89, 0x49, 0x0b, 0x02, 0xd2, 0x41, 0x6c, 0x01, 0x31, 0x41, 0x64, 0x0b, 0x48, 0x41, 0x6a, 0x01, 0x31, 0x41, 0x62, 0x78, 0x6a, 0x39, 0x6b, 0xc0, 0x46, -0x48, 0x62, 0x38, 0x6b, 0x00, 0xf0, 0xe2, 0xfb, 0x38, 0x1c, 0x00, 0xf0, -0x9f, 0xf8, 0x01, 0x20, 0x04, 0x49, 0xc0, 0x46, 0xc8, 0x72, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x10, 0x2a, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0x98, 0x19, 0x00, 0x80, 0xf8, 0xb5, 0x07, 0x1c, 0x00, 0x22, 0xf9, 0x1d, +0x48, 0x62, 0x38, 0x6b, 0x00, 0xf0, 0xf8, 0xfb, 0x38, 0x1c, 0x00, 0xf0, +0xb3, 0xf8, 0x01, 0x20, 0x04, 0x49, 0xc0, 0x46, 0xc8, 0x73, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xa4, 0x2a, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, +0x18, 0x1a, 0x00, 0x80, 0xf8, 0xb5, 0x07, 0x1c, 0x00, 0x22, 0xf9, 0x1d, 0x61, 0x31, 0x0d, 0x1c, 0x78, 0x6a, 0xc0, 0x46, 0x00, 0x90, 0x40, 0x89, 0x03, 0x0c, 0x01, 0xd2, 0x40, 0x0a, 0x03, 0xd2, 0x38, 0x1c, 0xff, 0xf7, -0xc1, 0xff, 0x54, 0xe0, 0x2b, 0x48, 0x80, 0x6b, 0x00, 0x09, 0x1f, 0xd3, -0x08, 0x78, 0x40, 0x08, 0x1c, 0xd2, 0x00, 0x20, 0x43, 0x00, 0xcc, 0x5a, -0x27, 0x4e, 0x9e, 0x19, 0x65, 0x23, 0x5b, 0x01, 0xf3, 0x18, 0x9b, 0x8b, -0x9c, 0x42, 0x0e, 0xd0, 0xb8, 0x69, 0x39, 0x6b, 0xc0, 0x46, 0x88, 0x61, -0xf8, 0x68, 0x39, 0x6b, 0xc0, 0x46, 0xc8, 0x60, 0x38, 0x1c, 0x00, 0xf0, -0x13, 0xf9, 0x38, 0x1c, 0x00, 0xf0, 0x60, 0xf8, 0x33, 0xe0, 0x01, 0x30, -0x03, 0x28, 0xe3, 0xd3, 0x1a, 0x48, 0x0b, 0x23, 0x1b, 0x02, 0xc1, 0x18, -0x09, 0x69, 0x00, 0x29, 0x24, 0xd0, 0x7d, 0x63, 0x00, 0x99, 0x49, 0x89, -0x09, 0x0c, 0x1f, 0xd2, 0x00, 0x24, 0x2d, 0x23, -0x9b, 0x01, 0xc1, 0x18, 0x89, 0x6b, 0x00, 0x29, 0x18, 0xd0, 0x05, 0x1c, -0xfe, 0x1d, 0x2d, 0x36, 0xa2, 0x00, 0x52, 0x19, 0x2d, 0x23, 0x9b, 0x01, -0xd2, 0x18, 0x92, 0x6b, 0x38, 0x1c, 0x31, 0x1c, 0x02, 0xf0, 0x7e, 0xfc, -0x01, 0x28, 0x0e, 0xd0, 0x01, 0x34, 0xa0, 0x00, 0x40, 0x19, 0x2d, 0x23, -0x9b, 0x01, 0xc0, 0x18, 0x80, 0x6b, 0x00, 0x28, 0xea, 0xd1, 0x01, 0xe0, -0x01, 0x2a, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x07, 0xf8, 0xf8, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x68, 0x1a, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, -0x80, 0xb5, 0x07, 0x1c, 0xb8, 0x69, 0x39, 0x6b, 0xc0, 0x46, 0x88, 0x61, -0xf8, 0x68, 0x39, 0x6b, 0xc0, 0x46, 0xc8, 0x60, 0x78, 0x6a, 0x40, 0x89, -0x01, 0x0c, 0x0e, 0xd2, 0x40, 0x0a, 0x0c, 0xd3, 0x38, 0x68, 0x40, 0x08, -0x02, 0xd3, 0x38, 0x1c, 0x02, 0xf0, 0x10, 0xfc, 0x38, 0x1c, 0x00, 0xf0, -0xbb, 0xf8, 0x38, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0x02, 0xe0, 0x38, 0x1c, -0xff, 0xf7, 0x44, 0xff, 0x01, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x01, 0x21, 0x00, 0x6b, 0x40, 0x6a, 0xc0, 0x46, 0x01, 0x60, 0x70, 0x47, -0xb0, 0xb4, 0xc1, 0x1d, 0x39, 0x31, 0x09, 0x8b, 0x89, 0x08, 0x09, 0x04, -0x09, 0x0c, 0x84, 0x6a, 0xc2, 0x1d, 0x61, 0x32, 0x00, 0x20, 0x00, 0x29, -0x0c, 0xdd, 0x87, 0x00, 0x3d, 0x19, 0x01, 0x23, 0x9b, 0x07, 0x2b, 0x43, -0x1b, 0x68, 0xc0, 0x46, 0xd3, 0x51, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, -0x88, 0x42, 0xf2, 0xdb, 0xb0, 0xbc, 0x70, 0x47, 0xf0, 0xb5, 0xa0, 0xb0, -0x01, 0x23, 0x9b, 0x07, 0xc1, 0x1d, 0x21, 0x31, 0x19, 0x43, 0x09, 0x68, -0xc0, 0x46, 0x0b, 0x91, 0xc1, 0x1d, 0x53, 0x31, 0x19, 0x43, 0x1f, 0x91, -0x09, 0x68, 0x01, 0xaf, 0xfa, 0x1d, 0x39, 0x32, 0x1e, 0x92, 0x17, 0xab, -0x59, 0x80, 0x3a, 0x49, 0x01, 0x23, 0x9b, 0x07, 0x0a, 0x6a, 0x13, 0x43, -0xcc, 0x1d, 0x11, 0x34, 0x89, 0x69, 0x09, 0x03, 0x09, 0x0b, 0x22, 0x69, -0xe5, 0x68, 0xc0, 0x46, 0x1d, 0x95, 0xfc, 0x1d, 0x39, 0x34, 0x64, 0x8b, -0x64, 0x09, 0x05, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x1c, 0x94, 0x56, 0x1a, -0x1b, 0x96, 0x1c, 0x9c, 0x2e, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x01, 0x26, -0x1d, 0x9d, 0x1a, 0x68, 0x91, 0x42, 0x01, 0xd1, 0x32, 0x1c, 0x0b, 0xe0, -0x91, 0x42, 0x03, 0xd9, 0x52, 0x1b, 0x1b, 0x9e, 0xb5, 0x18, 0x00, 0xe0, -0x55, 0x1a, 0x01, 0x22, 0x24, 0x01, 0xac, 0x42, 0x00, 0xd3, 0x00, 0x22, -0x01, 0x2a, 0xe6, 0xd1, 0x91, 0x07, 0x01, 0x43, 0x09, 0x68, 0xc0, 0x46, -0x39, 0x60, 0x93, 0x07, 0x01, 0x1d, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, -0x79, 0x60, 0xc1, 0x1d, 0x01, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, -0xb9, 0x60, 0x1f, 0x99, 0x09, 0x68, 0x1e, 0x9a, 0xc0, 0x46, 0x51, 0x83, -0xc1, 0x1d, 0x1d, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x38, 0x63, -0x79, 0x62, 0xc1, 0x1d, 0x11, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, -0xb9, 0x61, 0xc1, 0x1d, 0x05, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, -0xf9, 0x60, 0xc1, 0x1d, 0x17, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, -0xf9, 0x83, 0x0e, 0x30, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xf8, 0x81, -0x38, 0x68, 0x40, 0x08, 0x02, 0xd3, 0x38, 0x1c, 0x02, 0xf0, 0x60, 0xfb, -0x38, 0x1c, 0x00, 0xf0, 0x0b, 0xf8, 0x38, 0x1c, 0xff, 0xf7, 0x58, 0xff, -0x20, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x28, 0x03, 0x00, 0x80, -0x55, 0x55, 0x55, 0x55, 0xf8, 0xb5, 0x07, 0x1c, -0xf8, 0x1d, 0x39, 0x30, 0x41, 0x8b, 0x38, 0x4a, 0x91, 0x42, 0x00, 0xdd, -0x42, 0x83, 0x42, 0x8b, 0xc0, 0x46, 0x00, 0x92, 0x01, 0x20, 0x3a, 0x1d, -0x06, 0xca, 0xbb, 0x6a, 0x02, 0xf0, 0x12, 0xff, 0x32, 0x4a, 0xc0, 0x46, -0x00, 0x92, 0x32, 0x4e, 0x30, 0x6a, 0x32, 0x4c, 0xe1, 0x6d, 0x41, 0x18, -0x38, 0x6b, 0xc3, 0x1d, 0x05, 0x33, 0x01, 0x20, 0x72, 0x6a, 0x02, 0xf0, -0xff, 0xfe, 0xe0, 0x6d, 0x18, 0x30, 0xb1, 0x6a, 0x81, 0x42, 0x00, 0xd8, -0x00, 0x20, 0xe0, 0x65, 0x17, 0x23, 0xdb, 0x01, 0x20, 0x1c, 0xe1, 0x6d, -0xe4, 0x18, 0xe2, 0x6b, 0x92, 0x00, 0x27, 0x4b, 0xc0, 0x46, 0x99, 0x50, -0x26, 0x4d, 0xa8, 0x6b, 0x41, 0x08, 0x05, 0xd3, 0x40, 0x08, 0x40, 0x00, -0xa8, 0x63, 0x01, 0x20, 0x01, 0xf0, 0xd8, 0xff, 0x22, 0x4a, 0x1f, 0x48, -0x29, 0x7b, 0x00, 0x29, 0x02, 0xd0, 0x69, 0x7b, 0x00, 0x29, 0x00, 0xd1, -0x1f, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x05, 0x1c, 0xe0, 0x6b, 0x80, 0x00, -0x19, 0x4b, 0xc3, 0x18, 0x05, 0xce, 0xc1, 0x1d, 0x11, 0x31, 0x01, 0x20, -0x02, 0xf0, 0xce, 0xfe, 0xe0, 0x6b, 0x01, 0x30, 0xe0, 0x63, 0x17, 0x28, -0x01, 0xd3, 0x00, 0x20, 0xe0, 0x63, 0x00, 0x20, 0x39, 0x6b, 0xc0, 0x46, -0x08, 0x65, 0x78, 0x6a, 0x39, 0x6b, 0xc0, 0x46, 0x48, 0x62, 0x33, 0x23, -0x9b, 0x01, 0xe8, 0x18, 0x41, 0x68, 0x00, 0x29, 0x03, 0xd1, 0x39, 0x6b, -0xc0, 0x46, 0x41, 0x60, 0x04, 0xe0, 0x39, 0x6b, 0x82, 0x68, 0xc0, 0x46, -0x11, 0x65, 0x39, 0x6b, 0xc0, 0x46, 0x81, 0x60, 0xf8, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0x18, 0x00, 0x14, 0x02, -0xf8, 0x28, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, 0x44, 0x82, 0x20, 0x40, -0x68, 0x0e, 0x00, 0x80, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x03, -0xf0, 0xb5, 0x11, 0x4e, 0xff, 0x25, 0x01, 0x35, 0x10, 0x4f, 0xc0, 0x46, -0x35, 0x60, 0x38, 0x69, 0x01, 0x38, 0x38, 0x61, 0x7c, 0x68, 0x00, 0x2c, -0x10, 0xd0, 0x20, 0x6d, 0xc0, 0x46, 0x78, 0x60, 0x20, 0x1c, 0x00, 0xf0, -0x21, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x04, 0xfa, 0x08, 0x48, 0x80, 0x6a, -0x00, 0x0c, 0x00, 0x07, 0xe9, 0xd1, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x05, 0x48, 0xc1, 0x79, 0x01, 0x31, 0xc1, 0x71, 0xf7, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x00, 0xb0, 0xa8, 0x1a, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, -0xa0, 0x82, 0x20, 0x40, 0x01, 0x20, 0x80, 0x03, 0x01, 0x49, 0xc0, 0x46, -0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xb0, 0x90, 0xb5, 0x07, 0x1c, +0xc1, 0xff, 0x67, 0xe0, 0x35, 0x48, 0xc0, 0x6b, +0x00, 0x09, 0x1f, 0xd3, 0x08, 0x78, 0x40, 0x08, 0x1c, 0xd2, 0x00, 0x20, +0x43, 0x00, 0xcc, 0x5a, 0x31, 0x4e, 0x9e, 0x19, 0x33, 0x23, 0x9b, 0x01, +0xf3, 0x18, 0x1b, 0x88, 0x9c, 0x42, 0x0e, 0xd0, 0xb8, 0x69, 0x39, 0x6b, +0xc0, 0x46, 0x88, 0x61, 0xf8, 0x68, 0x39, 0x6b, 0xc0, 0x46, 0xc8, 0x60, +0x38, 0x1c, 0x00, 0xf0, 0x27, 0xf9, 0x38, 0x1c, 0x00, 0xf0, 0x74, 0xf8, +0x46, 0xe0, 0x01, 0x30, 0x03, 0x28, 0xe3, 0xdb, 0x02, 0x20, 0x43, 0x00, +0x5c, 0x18, 0xe4, 0x88, 0x22, 0x4e, 0x9e, 0x19, 0x33, 0x23, 0x9b, 0x01, +0xf3, 0x18, 0x1b, 0x88, 0x9c, 0x42, 0x03, 0xd1, 0x01, 0x23, 0x01, 0x38, +0xd8, 0x42, 0xf0, 0xdc, 0x01, 0x23, 0xd8, 0x42, 0xc4, 0xd0, 0x1b, 0x4e, +0x0b, 0x23, 0x1b, 0x02, 0xf0, 0x18, 0x40, 0x69, 0x00, 0x28, 0x24, 0xd0, +0x7d, 0x63, 0x00, 0x98, 0x40, 0x89, 0x00, 0x0c, 0x1f, 0xd2, 0x00, 0x24, +0x2d, 0x23, 0x9b, 0x01, 0xf0, 0x18, 0xc0, 0x6b, 0x35, 0x1c, 0x00, 0x28, +0x17, 0xd0, 0xfe, 0x1d, 0x2d, 0x36, 0xa2, 0x00, 0x52, 0x19, 0x2d, 0x23, +0x9b, 0x01, 0xd2, 0x18, 0xd2, 0x6b, 0x38, 0x1c, 0x31, 0x1c, 0x02, 0xf0, +0x7b, 0xfc, 0x01, 0x28, 0x0e, 0xd0, 0x01, 0x34, 0xa0, 0x00, 0x40, 0x19, +0x2d, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0xc0, 0x6b, 0x00, 0x28, 0xea, 0xd1, +0x01, 0xe0, 0x01, 0x2a, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x08, 0xf8, +0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x1a, 0x00, 0x80, +0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x07, 0x1c, 0xb8, 0x69, 0x39, 0x6b, +0xc0, 0x46, 0x88, 0x61, 0xf8, 0x68, 0x39, 0x6b, 0xc0, 0x46, 0xc8, 0x60, +0x78, 0x6a, 0x40, 0x89, 0x01, 0x0c, 0x0e, 0xd2, 0x40, 0x0a, 0x0c, 0xd3, +0x38, 0x68, 0x40, 0x08, 0x02, 0xd3, 0x38, 0x1c, 0x02, 0xf0, 0x0c, 0xfc, +0x38, 0x1c, 0x00, 0xf0, 0xbb, 0xf8, 0x38, 0x1c, 0x00, 0xf0, 0x08, 0xf8, +0x02, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0x30, 0xff, 0x01, 0x20, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x01, 0x21, 0x00, 0x6b, 0x40, 0x6a, 0xc0, 0x46, +0x01, 0x60, 0x70, 0x47, 0xb0, 0xb4, 0xc1, 0x1d, 0x39, 0x31, 0x09, 0x8b, +0x89, 0x08, 0x09, 0x04, 0x09, 0x0c, 0x84, 0x6a, 0xc2, 0x1d, 0x61, 0x32, +0x00, 0x20, 0x00, 0x29, 0x0c, 0xdd, 0x87, 0x00, 0x3d, 0x19, 0x01, 0x23, +0x9b, 0x07, 0x2b, 0x43, 0x1b, 0x68, 0xc0, 0x46, 0xd3, 0x51, 0x01, 0x30, +0x00, 0x04, 0x00, 0x0c, 0x88, 0x42, 0xf2, 0xdb, 0xb0, 0xbc, 0x70, 0x47, +0xf0, 0xb5, 0xa0, 0xb0, 0x01, 0x23, 0x9b, 0x07, 0xc1, 0x1d, 0x21, 0x31, +0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x0b, 0x91, 0xc1, 0x1d, 0x53, 0x31, +0x19, 0x43, 0x1f, 0x91, 0x09, 0x68, 0x01, 0xaf, 0xfa, 0x1d, 0x39, 0x32, +0x1e, 0x92, 0x17, 0xab, 0x59, 0x80, 0x3a, 0x49, 0x01, 0x23, 0x9b, 0x07, +0x0a, 0x6a, 0x13, 0x43, 0xcc, 0x1d, 0x11, 0x34, 0x89, 0x69, 0x09, 0x03, +0x09, 0x0b, 0x22, 0x69, 0xe5, 0x68, 0xc0, 0x46, 0x1d, 0x95, 0xfc, 0x1d, +0x39, 0x34, 0x64, 0x8b, 0x64, 0x09, 0x05, 0x34, 0x24, 0x06, 0x24, 0x0e, +0x1c, 0x94, 0x56, 0x1a, 0x1b, 0x96, 0x1c, 0x9c, 0x2e, 0x4a, 0xc0, 0x46, +0x00, 0x92, 0x01, 0x26, 0x1d, 0x9d, 0x1a, 0x68, 0x91, 0x42, 0x01, 0xd1, +0x32, 0x1c, 0x0b, 0xe0, 0x91, 0x42, 0x03, 0xd9, 0x52, 0x1b, 0x1b, 0x9e, +0xb5, 0x18, 0x00, 0xe0, 0x55, 0x1a, 0x01, 0x22, 0x24, 0x01, 0xac, 0x42, +0x00, 0xd3, 0x00, 0x22, 0x01, 0x2a, 0xe6, 0xd1, 0x91, 0x07, 0x01, 0x43, +0x09, 0x68, 0xc0, 0x46, 0x39, 0x60, 0x93, 0x07, +0x01, 0x1d, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x79, 0x60, 0xc1, 0x1d, +0x01, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0xb9, 0x60, 0x1f, 0x99, +0x09, 0x68, 0x1e, 0x9a, 0xc0, 0x46, 0x51, 0x83, 0xc1, 0x1d, 0x1d, 0x31, +0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0x38, 0x63, 0x79, 0x62, 0xc1, 0x1d, +0x11, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0xb9, 0x61, 0xc1, 0x1d, +0x05, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0xf9, 0x60, 0xc1, 0x1d, +0x17, 0x31, 0x19, 0x43, 0x09, 0x68, 0xc0, 0x46, 0xf9, 0x83, 0x0e, 0x30, +0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xf8, 0x81, 0x38, 0x68, 0x40, 0x08, +0x02, 0xd3, 0x38, 0x1c, 0x02, 0xf0, 0x5c, 0xfb, 0x38, 0x1c, 0x00, 0xf0, +0x0b, 0xf8, 0x38, 0x1c, 0xff, 0xf7, 0x58, 0xff, 0x20, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xa8, 0x03, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, +0xf8, 0xb5, 0x07, 0x1c, 0xf8, 0x1d, 0x39, 0x30, 0x41, 0x8b, 0x39, 0x4a, +0x91, 0x42, 0x00, 0xdd, 0x42, 0x83, 0x42, 0x8b, 0xc0, 0x46, 0x00, 0x92, +0x01, 0x20, 0x3a, 0x1d, 0x06, 0xca, 0xbb, 0x6a, 0x02, 0xf0, 0x0e, 0xff, +0x33, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x33, 0x4e, 0x30, 0x6a, 0x33, 0x4c, +0xe1, 0x6d, 0x41, 0x18, 0x38, 0x6b, 0xc3, 0x1d, 0x05, 0x33, 0x01, 0x20, +0x72, 0x6a, 0x02, 0xf0, 0xfb, 0xfe, 0xe0, 0x6d, 0x18, 0x30, 0x00, 0x25, +0xb1, 0x6a, 0x81, 0x42, 0x01, 0xd8, 0xe5, 0x65, 0x00, 0xe0, 0xe0, 0x65, +0x2f, 0x23, 0x9b, 0x01, 0x20, 0x1c, 0xe1, 0x6d, 0xe4, 0x18, 0x22, 0x68, +0x92, 0x00, 0x27, 0x4b, 0xc0, 0x46, 0x99, 0x50, 0x26, 0x48, 0xc1, 0x6b, +0x4a, 0x08, 0x05, 0xd3, 0x49, 0x08, 0x49, 0x00, 0xc1, 0x63, 0x01, 0x20, +0x01, 0xf0, 0xd6, 0xff, 0x22, 0x4a, 0x1f, 0x48, 0xc1, 0x1d, 0x89, 0x31, +0x0b, 0x78, 0x00, 0x2b, 0x02, 0xd0, 0x49, 0x78, 0x00, 0x29, 0x00, 0xd1, +0x1e, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x20, 0x68, 0x80, 0x00, 0x19, 0x4b, +0xc3, 0x18, 0x05, 0xce, 0xc1, 0x1d, 0x11, 0x31, 0x01, 0x20, 0x02, 0xf0, +0xc7, 0xfe, 0x14, 0x48, 0x21, 0x68, 0x01, 0x31, 0x21, 0x60, 0x17, 0x29, +0x00, 0xd3, 0x25, 0x60, 0x39, 0x6b, 0xc0, 0x46, 0x0d, 0x65, 0x79, 0x6a, +0x3a, 0x6b, 0xc0, 0x46, 0x51, 0x62, 0x33, 0x23, 0x9b, 0x01, 0xc0, 0x18, +0x81, 0x68, 0x00, 0x29, 0x03, 0xd1, 0x39, 0x6b, 0xc0, 0x46, 0x81, 0x60, +0x04, 0xe0, 0x39, 0x6b, 0xc2, 0x68, 0xc0, 0x46, 0x11, 0x65, 0x39, 0x6b, +0xc0, 0x46, 0xc1, 0x60, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xea, 0x05, 0x00, 0x00, 0x18, 0x00, 0x14, 0x02, 0x7c, 0x29, 0x00, 0x80, +0x68, 0x0e, 0x00, 0x80, 0x44, 0x82, 0x20, 0x40, 0xe8, 0x0e, 0x00, 0x80, +0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x03, 0xf0, 0xb5, 0x11, 0x4e, +0xff, 0x25, 0x01, 0x35, 0x10, 0x4f, 0xc0, 0x46, 0x35, 0x60, 0x78, 0x69, +0x01, 0x38, 0x78, 0x61, 0xbc, 0x68, 0x00, 0x2c, 0x10, 0xd0, 0x20, 0x6d, +0xc0, 0x46, 0xb8, 0x60, 0x20, 0x1c, 0x00, 0xf0, 0x21, 0xf8, 0x20, 0x1c, +0x00, 0xf0, 0x04, 0xfa, 0x08, 0x48, 0x80, 0x6a, 0x00, 0x0c, 0x00, 0x07, +0xe9, 0xd1, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x05, 0x48, 0xc1, 0x79, +0x01, 0x31, 0xc1, 0x71, 0xf7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, +0x28, 0x1b, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, 0xa0, 0x82, 0x20, 0x40, +0x01, 0x20, 0x80, 0x03, 0x01, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x70, 0x47, +0x00, 0x00, 0x00, 0xb0, 0x90, 0xb5, 0x07, 0x1c, 0x38, 0x68, 0xc0, 0x08, 0x09, 0xd3, 0x1d, 0x48, 0x01, 0x6a, 0x01, 0x39, 0x01, 0x62, 0x20, 0x30, 0x00, 0x79, 0x00, 0x28, 0x01, 0xd0, 0xfe, 0xf7, -0x09, 0xfe, 0x01, 0x23, 0x9b, 0x07, 0xf8, 0x1d, 0x1d, 0x30, 0x18, 0x43, -0x00, 0x68, 0x16, 0x4c, 0x21, 0x6a, 0x81, 0x42, 0x21, 0xd1, 0x01, 0x1c, +0xf3, 0xfd, 0x01, 0x23, 0x9b, 0x07, 0xf8, 0x1d, 0x1d, 0x30, 0x18, 0x43, +0x00, 0x68, 0x16, 0x4c, 0x61, 0x6a, 0x81, 0x42, 0x21, 0xd1, 0x01, 0x1c, 0x19, 0x43, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x29, 0x1a, 0xd1, -0x00, 0xf0, 0x22, 0xf8, 0x20, 0x62, 0x20, 0x6a, 0xe1, 0x69, 0x88, 0x42, +0x00, 0xf0, 0x22, 0xf8, 0x60, 0x62, 0x60, 0x6a, 0x21, 0x6a, 0x88, 0x42, 0x05, 0xd0, 0x01, 0x21, 0x89, 0x07, 0x01, 0x43, 0x09, 0x68, 0x09, 0x04, -0xf2, 0xd0, 0x51, 0x21, 0x89, 0x03, 0x22, 0x6a, 0xe3, 0x6a, 0x9a, 0x42, -0x02, 0xd1, 0x20, 0x6b, 0x62, 0x6b, 0x80, 0x1a, 0x04, 0x38, 0xc8, 0x60, +0xf2, 0xd0, 0x51, 0x21, 0x89, 0x03, 0x62, 0x6a, 0x23, 0x6b, 0x9a, 0x42, +0x02, 0xd1, 0x60, 0x6b, 0xa2, 0x6b, 0x80, 0x1a, 0x04, 0x38, 0xc8, 0x60, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0x79, 0x6a, 0xc0, 0x46, -0x08, 0x60, 0xf7, 0xe7, 0xec, 0x05, 0x00, 0x80, 0x68, 0x1a, 0x00, 0x80, -0x01, 0x23, 0x9b, 0x07, 0xc1, 0x1d, 0x01, 0x31, -0x19, 0x43, 0x09, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x08, 0x18, 0x0d, 0x30, -0x81, 0x07, 0x02, 0xd0, 0x80, 0x08, 0x80, 0x00, 0x04, 0x30, 0x04, 0x49, -0x4a, 0x6b, 0x12, 0x18, 0x0b, 0x6b, 0x9a, 0x42, 0x00, 0xd9, 0xc8, 0x6a, -0x70, 0x47, 0x00, 0x00, 0x68, 0x1a, 0x00, 0x80, 0x00, 0xb5, 0x04, 0x48, -0x80, 0x68, 0x10, 0x28, 0x01, 0xd3, 0x00, 0xf0, 0x05, 0xf8, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x68, 0x1a, 0x00, 0x80, 0x88, 0xb5, 0x0c, 0x4f, -0x38, 0x78, 0x00, 0x28, 0x11, 0xd1, 0x0b, 0x49, 0x10, 0x20, 0x02, 0xf0, -0xfb, 0xfd, 0x00, 0x28, 0x0b, 0xd0, 0x01, 0x20, 0x38, 0x70, 0x08, 0x4a, -0xc0, 0x46, 0x00, 0x92, 0x07, 0x48, 0x42, 0x68, 0x07, 0x4b, 0x01, 0x68, -0x00, 0x20, 0x02, 0xf0, 0xe5, 0xfd, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x78, 0x1a, 0x00, 0x80, 0x69, 0x2c, 0xff, 0xff, 0x10, 0x00, 0x35, 0x02, -0xf8, 0x28, 0x00, 0x80, 0x44, 0x80, 0x20, 0x40, 0x90, 0xb5, 0x01, 0x20, -0x40, 0x02, 0x10, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x0f, 0x4f, 0x10, 0x21, -0xf8, 0x1d, 0x3d, 0x30, 0x02, 0xf0, 0x52, 0xfc, 0x19, 0x23, 0xdb, 0x01, -0xfc, 0x18, 0xa0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x14, 0xf8, -0x00, 0x20, 0xc9, 0x23, 0x1b, 0x01, 0xf9, 0x18, 0x08, 0x70, 0xa0, 0x68, -0x10, 0x28, 0x04, 0xd3, 0x01, 0x20, 0xbb, 0x23, 0x1b, 0x01, 0xf9, 0x18, -0x48, 0x72, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, -0xe8, 0x0d, 0x00, 0x80, 0xf8, 0xb5, 0x37, 0x48, 0x19, 0x23, 0xdb, 0x01, -0xc1, 0x18, 0x89, 0x68, 0x35, 0x4d, 0x10, 0x29, 0x00, 0xd9, 0x10, 0x21, -0x29, 0x62, 0x32, 0x48, 0xc1, 0x6c, 0x00, 0x6e, 0x81, 0x42, 0x07, 0xd9, -0x08, 0x1a, 0x07, 0x09, 0x00, 0x24, 0x28, 0x6a, 0xb8, 0x42, 0x12, 0xd2, -0x07, 0x1c, 0x10, 0xe0, 0x81, 0x42, 0x2a, 0xd2, 0x2c, 0x4a, 0x52, 0x6b, -0x10, 0x1a, 0x07, 0x09, 0x28, 0x6a, 0xb8, 0x42, 0x05, 0xd9, 0x0c, 0x09, -0x39, 0x19, 0x88, 0x42, 0x03, 0xd2, 0xc4, 0x1b, 0x01, 0xe0, 0x00, 0x24, -0x07, 0x1c, 0x3e, 0x19, 0x30, 0x01, 0x25, 0x49, 0x02, 0xf0, 0x8a, 0xfd, -0x00, 0x28, 0x3d, 0xd0, 0x23, 0x48, 0x00, 0x2c, 0x1a, 0xd1, 0x1e, 0x49, -0x3a, 0x01, 0x2f, 0x62, 0x09, 0x6e, 0x8c, 0x18, 0x1d, 0x4d, 0x6b, 0x6b, -0xa3, 0x42, 0x00, 0xd8, 0xe4, 0x1a, 0x1e, 0x4b, 0x1a, 0x43, 0x00, 0x92, -0xea, 0x6a, 0x51, 0x18, 0x2a, 0x6b, 0x03, 0x1c, 0x20, 0xe0, 0x1b, 0x48, -0x01, 0x6b, 0x01, 0x31, 0x01, 0x63, 0x00, 0x20, 0x28, 0x62, 0xf8, 0xbc, +0x08, 0x60, 0xf7, 0xe7, 0x6c, 0x06, 0x00, 0x80, 0xe8, 0x1a, 0x00, 0x80, +0x01, 0x23, 0x9b, 0x07, 0xc1, 0x1d, 0x01, 0x31, 0x19, 0x43, 0x09, 0x68, +0x09, 0x04, 0x09, 0x0c, 0x08, 0x18, 0x0d, 0x30, 0x81, 0x07, 0x02, 0xd0, +0x80, 0x08, 0x80, 0x00, 0x04, 0x30, 0x04, 0x49, 0x8a, 0x6b, 0x12, 0x18, +0x4b, 0x6b, 0x9a, 0x42, 0x00, 0xd9, 0x08, 0x6b, 0x70, 0x47, 0x00, 0x00, +0xe8, 0x1a, 0x00, 0x80, 0x00, 0xb5, 0x04, 0x48, 0xc0, 0x68, 0x10, 0x28, +0x01, 0xd3, 0x00, 0xf0, 0x05, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xe8, 0x1a, 0x00, 0x80, 0x88, 0xb5, 0x0c, 0x4f, 0x38, 0x79, 0x00, 0x28, +0x11, 0xd1, 0x0b, 0x49, 0x10, 0x20, 0x02, 0xf0, 0xf5, 0xfd, 0x00, 0x28, +0x0b, 0xd0, 0x01, 0x20, 0x38, 0x71, 0x08, 0x4a, 0xc0, 0x46, 0x00, 0x92, +0x07, 0x48, 0x42, 0x68, 0x07, 0x4b, 0x01, 0x68, 0x00, 0x20, 0x02, 0xf0, +0xdf, 0xfd, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf8, 0x1a, 0x00, 0x80, +0xe1, 0x2c, 0xff, 0xff, 0x10, 0x00, 0x35, 0x02, 0x7c, 0x29, 0x00, 0x80, +0x44, 0x80, 0x20, 0x40, 0x90, 0xb5, 0x01, 0x20, 0x40, 0x02, 0x10, 0x49, +0xc0, 0x46, 0x08, 0x60, 0x0f, 0x4f, 0x10, 0x21, 0xf8, 0x1d, 0x3d, 0x30, +0x02, 0xf0, 0x4c, 0xfc, 0x19, 0x23, 0xdb, 0x01, 0xfc, 0x18, 0xe0, 0x68, +0x00, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x14, 0xf8, 0x00, 0x20, 0xc9, 0x23, +0x1b, 0x01, 0xf9, 0x18, 0x08, 0x71, 0xe0, 0x68, 0x10, 0x28, 0x04, 0xd3, +0x01, 0x20, 0xbb, 0x23, 0x1b, 0x01, 0xf9, 0x18, 0x48, 0x73, 0x90, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, 0x68, 0x0e, 0x00, 0x80, +0xf8, 0xb5, 0x37, 0x48, 0x19, 0x23, 0xdb, 0x01, 0xc1, 0x18, 0xc9, 0x68, +0x35, 0x4d, 0x10, 0x29, 0x00, 0xd9, 0x10, 0x21, 0x69, 0x62, 0x32, 0x48, +0xc1, 0x6c, 0x00, 0x6e, 0x81, 0x42, 0x07, 0xd9, 0x08, 0x1a, 0x07, 0x09, +0x00, 0x24, 0x68, 0x6a, 0xb8, 0x42, 0x12, 0xd2, 0x07, 0x1c, 0x10, 0xe0, +0x81, 0x42, 0x2a, 0xd2, 0x2c, 0x4a, 0x52, 0x6b, 0x10, 0x1a, 0x07, 0x09, +0x68, 0x6a, 0xb8, 0x42, 0x05, 0xd9, 0x0c, 0x09, 0x39, 0x19, 0x88, 0x42, +0x03, 0xd2, 0xc4, 0x1b, 0x01, 0xe0, 0x00, 0x24, 0x07, 0x1c, 0x3e, 0x19, +0x30, 0x01, 0x25, 0x49, 0x02, 0xf0, 0x84, 0xfd, 0x00, 0x28, 0x3d, 0xd0, +0x23, 0x48, 0x00, 0x2c, 0x1a, 0xd1, 0x1e, 0x49, 0x3a, 0x01, 0x6f, 0x62, +0x09, 0x6e, 0x8c, 0x18, 0x1d, 0x4d, 0x6b, 0x6b, 0xa3, 0x42, 0x00, 0xd8, +0xe4, 0x1a, 0x1e, 0x4b, 0x1a, 0x43, 0x00, 0x92, 0xea, 0x6a, 0x51, 0x18, +0x2a, 0x6b, 0x03, 0x1c, 0x20, 0xe0, 0x1b, 0x48, 0x01, 0x6b, 0x01, 0x31, +0x01, 0x63, 0x00, 0x20, 0x68, 0x62, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x10, 0x49, 0x24, 0x01, 0x3f, 0x01, 0x11, 0x22, -0x52, 0x05, 0x3a, 0x43, 0x2e, 0x62, 0x00, 0x92, 0x0e, 0x4d, 0xea, 0x6a, +0x52, 0x05, 0x3a, 0x43, 0x6e, 0x62, 0x00, 0x92, 0x0e, 0x4d, 0xea, 0x6a, 0x09, 0x6e, 0x51, 0x18, 0x03, 0x1c, 0x06, 0x1c, 0x00, 0x20, 0x2a, 0x6b, -0x02, 0xf0, 0x50, 0xfd, 0x0c, 0x4a, 0x22, 0x43, 0x00, 0x92, 0xbb, 0x19, -0xe9, 0x6a, 0x2a, 0x6b, 0x00, 0x20, 0x02, 0xf0, 0x47, 0xfd, 0x03, 0x48, +0x02, 0xf0, 0x4a, 0xfd, 0x0c, 0x4a, 0x22, 0x43, 0x00, 0x92, 0xbb, 0x19, +0xe9, 0x6a, 0x2a, 0x6b, 0x00, 0x20, 0x02, 0xf0, 0x41, 0xfd, 0x03, 0x48, 0xc0, 0x46, 0x04, 0x66, 0x00, 0xf0, 0x10, 0xf8, 0x01, 0x20, 0xda, 0xe7, -0xe8, 0x0d, 0x00, 0x80, 0xa8, 0x1a, 0x00, 0x80, 0xf8, 0x28, 0x00, 0x80, -0xd1, 0x2d, 0xff, 0xff, 0x44, 0x80, 0x20, 0x40, 0x00, 0x00, 0x36, 0x02, +0x68, 0x0e, 0x00, 0x80, 0x28, 0x1b, 0x00, 0x80, 0x7c, 0x29, 0x00, 0x80, +0x49, 0x2e, 0xff, 0xff, 0x44, 0x80, 0x20, 0x40, 0x00, 0x00, 0x36, 0x02, 0xa0, 0x82, 0x20, 0x40, 0x04, 0x48, 0x01, 0x6e, 0x04, 0x4a, 0x80, 0x30, -0xd1, 0x60, 0x02, 0x23, 0x81, 0x6b, 0x19, 0x43, 0x81, 0x63, 0x70, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, 0xf0, 0xb5, 0x84, 0xb0, -0x01, 0x20, 0x80, 0x02, 0x1c, 0x49, 0xc0, 0x46, -0x08, 0x60, 0x00, 0x27, 0x1b, 0x4e, 0x33, 0x23, 0x9b, 0x01, 0xf5, 0x18, -0x28, 0x6a, 0x00, 0x28, 0x1d, 0xd9, 0x19, 0x4c, 0x68, 0x46, 0x10, 0x21, -0x02, 0xf0, 0x96, 0xfb, 0x68, 0x46, 0x00, 0xf0, 0x33, 0xf8, 0x00, 0x28, -0x04, 0xd0, 0x15, 0x49, 0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x0a, 0xe0, -0x13, 0x49, 0x60, 0x7b, 0x01, 0x30, 0x60, 0x73, 0x88, 0x79, 0x01, 0x30, -0x88, 0x71, 0x11, 0x48, 0x00, 0x68, 0x02, 0xf0, 0x6b, 0xf9, 0x28, 0x6a, -0x01, 0x37, 0xb8, 0x42, 0xe2, 0xd8, 0xbb, 0x23, 0x1b, 0x01, 0xf0, 0x18, -0x81, 0x7a, 0x00, 0x29, 0x03, 0xd0, 0x00, 0x21, 0x81, 0x72, 0xff, 0xf7, -0x1d, 0xfb, 0xff, 0xf7, 0xe3, 0xfe, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe8, 0x0d, 0x00, 0x80, -0xb0, 0x82, 0x20, 0x40, 0x08, 0x83, 0x20, 0x40, 0xa0, 0x82, 0x20, 0x40, -0xd8, 0x03, 0x00, 0x80, 0x90, 0xb4, 0x17, 0x4f, 0x19, 0x23, 0xdb, 0x01, -0xf9, 0x18, 0x00, 0x22, 0x8b, 0x68, 0x00, 0x2b, 0x23, 0xd0, 0x01, 0x3b, -0x8b, 0x60, 0x33, 0x23, 0x9b, 0x01, 0xff, 0x18, 0x7b, 0x69, 0x1c, 0x6d, -0xc0, 0x46, 0x7c, 0x61, 0x04, 0x68, 0xc0, 0x46, 0x5c, 0x60, 0x44, 0x68, -0xc0, 0x46, 0x9c, 0x60, 0x84, 0x68, 0xc0, 0x46, 0x1c, 0x61, 0xc0, 0x68, -0xc0, 0x46, 0x58, 0x61, 0x1a, 0x65, 0xc8, 0x68, 0x42, 0x1c, 0xca, 0x60, -0x00, 0x28, 0x03, 0xd0, 0xf8, 0x69, 0xc0, 0x46, 0x03, 0x65, 0x00, 0xe0, -0xbb, 0x61, 0xfb, 0x61, 0x18, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0x10, 0x1c, -0xfb, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x0a, 0x4a, 0x33, 0x23, -0x9b, 0x01, 0xd1, 0x18, 0x88, 0x69, 0x19, 0x23, 0xdb, 0x01, 0xd2, 0x18, -0xd3, 0x68, 0x00, 0x2b, 0x06, 0xd0, 0x01, 0x3b, 0xd3, 0x60, 0x8a, 0x69, -0x12, 0x6d, 0xc0, 0x46, 0x8a, 0x61, 0x70, 0x47, 0x00, 0x21, 0xd1, 0x60, -0xfb, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x06, 0x4a, 0xd1, 0x68, -0x4b, 0x1c, 0xd3, 0x60, 0x40, 0x32, 0x00, 0x29, 0x01, 0xd0, 0x91, 0x69, -0x00, 0xe0, 0x00, 0x21, 0x01, 0x65, 0x90, 0x61, 0x70, 0x47, 0x00, 0x00, -0x68, 0x1a, 0x00, 0x80, 0x06, 0x4a, 0x91, 0x68, 0x4b, 0x1c, 0x93, 0x60, -0x40, 0x32, 0x00, 0x29, 0x01, 0xd0, 0x51, 0x69, 0x00, 0xe0, 0x00, 0x21, -0x01, 0x65, 0x50, 0x61, 0x70, 0x47, 0x00, 0x00, 0x68, 0x1a, 0x00, 0x80, -0x90, 0xb4, 0x00, 0x21, 0x0f, 0x4a, 0x97, 0x89, 0x92, 0x6a, 0x4b, 0x00, -0x1b, 0x18, 0x9b, 0x8a, 0x00, 0x2b, 0x12, 0xd0, 0xbb, 0x42, 0x10, 0xdc, +0xd1, 0x60, 0x02, 0x23, 0xc1, 0x6b, 0x19, 0x43, 0xc1, 0x63, 0x70, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, 0xf0, 0xb5, 0x84, 0xb0, +0x01, 0x20, 0x80, 0x02, 0x1c, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x00, 0x27, +0x1b, 0x4e, 0x33, 0x23, 0x9b, 0x01, 0xf5, 0x18, 0x68, 0x6a, 0x00, 0x28, +0x1d, 0xd9, 0x19, 0x4c, 0x68, 0x46, 0x10, 0x21, 0x02, 0xf0, 0x90, 0xfb, +0x68, 0x46, 0x00, 0xf0, 0x33, 0xf8, 0x00, 0x28, 0x04, 0xd0, 0x15, 0x49, +0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x0a, 0xe0, 0x13, 0x49, 0x60, 0x7b, +0x01, 0x30, 0x60, 0x73, 0x88, 0x79, 0x01, 0x30, 0x88, 0x71, 0x11, 0x48, +0x00, 0x68, 0x02, 0xf0, 0x65, 0xf9, 0x68, 0x6a, 0x01, 0x37, 0xb8, 0x42, +0xe2, 0xd8, 0xbb, 0x23, 0x1b, 0x01, 0xf0, 0x18, 0x81, 0x7b, 0x00, 0x29, +0x03, 0xd0, 0x00, 0x21, 0x81, 0x73, 0xff, 0xf7, 0x05, 0xfb, 0xff, 0xf7, +0xe3, 0xfe, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0xb0, 0x68, 0x0e, 0x00, 0x80, 0xb0, 0x82, 0x20, 0x40, +0x08, 0x83, 0x20, 0x40, 0xa0, 0x82, 0x20, 0x40, 0x58, 0x04, 0x00, 0x80, +0x90, 0xb4, 0x17, 0x4f, 0x19, 0x23, 0xdb, 0x01, 0xf9, 0x18, 0x00, 0x22, +0xcb, 0x68, 0x00, 0x2b, 0x23, 0xd0, 0x01, 0x3b, 0xcb, 0x60, 0x33, 0x23, +0x9b, 0x01, 0xff, 0x18, 0xbb, 0x69, 0x1c, 0x6d, 0xc0, 0x46, 0xbc, 0x61, +0x04, 0x68, 0xc0, 0x46, 0x5c, 0x60, 0x44, 0x68, 0xc0, 0x46, 0x9c, 0x60, +0x84, 0x68, 0xc0, 0x46, 0x1c, 0x61, 0xc0, 0x68, 0xc0, 0x46, 0x58, 0x61, +0x1a, 0x65, 0x08, 0x69, 0x42, 0x1c, 0x0a, 0x61, 0x00, 0x28, 0x03, 0xd0, +0x38, 0x6a, 0xc0, 0x46, 0x03, 0x65, 0x00, 0xe0, 0xfb, 0x61, 0x3b, 0x62, +0x18, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0x10, 0x1c, 0xfb, 0xe7, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x0a, 0x4a, 0x33, 0x23, 0x9b, 0x01, 0xd1, 0x18, +0xc8, 0x69, 0x19, 0x23, 0xdb, 0x01, 0xd2, 0x18, 0x13, 0x69, 0x00, 0x2b, +0x06, 0xd0, 0x01, 0x3b, 0x13, 0x61, 0xca, 0x69, 0x12, 0x6d, 0xc0, 0x46, +0xca, 0x61, 0x70, 0x47, 0x00, 0x21, 0x11, 0x61, 0xfb, 0xe7, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x06, 0x4a, 0x11, 0x69, 0x4b, 0x1c, 0x13, 0x61, +0x40, 0x32, 0x00, 0x29, 0x01, 0xd0, 0xd1, 0x69, 0x00, 0xe0, 0x00, 0x21, +0x01, 0x65, 0xd0, 0x61, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x1a, 0x00, 0x80, +0x06, 0x4a, 0xd1, 0x68, 0x4b, 0x1c, 0xd3, 0x60, 0x40, 0x32, 0x00, 0x29, +0x01, 0xd0, 0x91, 0x69, 0x00, 0xe0, 0x00, 0x21, 0x01, 0x65, 0x90, 0x61, +0x70, 0x47, 0x00, 0x00, 0xe8, 0x1a, 0x00, 0x80, 0x90, 0xb4, 0x00, 0x21, +0x0f, 0x4a, 0x97, 0x89, 0x92, 0x6a, 0x4b, 0x00, 0x1b, 0x18, 0x9b, 0x8a, +0x00, 0x2b, 0x12, 0xd0, 0xbb, 0x42, 0x10, 0xdc, 0x1c, 0x1c, 0x58, 0x23, 0x63, 0x43, 0xd3, 0x18, 0xdc, 0x1f, 0x49, 0x3c, 0x01, 0x23, 0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x03, 0x2b, 0x02, 0xd0, 0x00, 0x20, 0x90, 0xbc, 0x70, 0x47, 0x01, 0x31, -0x04, 0x29, 0xe4, 0xd3, 0x01, 0x20, 0xf8, 0xe7, 0xc8, 0x29, 0x00, 0x80, +0x04, 0x29, 0xe4, 0xd3, 0x01, 0x20, 0xf8, 0xe7, 0x4c, 0x2a, 0x00, 0x80, 0xf7, 0xb5, 0x86, 0xb0, 0x3d, 0x4a, 0x07, 0x1c, 0xd1, 0x69, 0x8f, 0x40, 0x03, 0x1c, 0x14, 0x6a, 0xe3, 0x40, 0x5f, 0x40, 0x07, 0x9e, 0x8e, 0x40, 0x77, 0x40, 0xcf, 0x40, 0x94, 0x69, 0xc0, 0x46, 0x05, 0x94, 0x03, 0x1c, @@ -1062,85 +1075,85 @@ 0x5d, 0xd9, 0x1c, 0x1c, 0x32, 0x4e, 0x26, 0x43, 0x94, 0x69, 0xe6, 0x40, 0x33, 0x1c, 0x03, 0x96, 0x53, 0x6a, 0xc0, 0x46, 0x02, 0x93, 0xd2, 0x6a, 0xc0, 0x46, 0x01, 0x92, 0xbb, 0x00, 0x02, 0x9a, 0xd2, 0x58, 0x13, 0x1c, -0x05, 0x9c, 0xe3, 0x40, 0x03, 0x9c, 0xa3, 0x42, -0x3e, 0xd1, 0x8a, 0x40, 0xca, 0x40, 0x14, 0x1c, 0x63, 0x00, 0x1b, 0x19, -0x5b, 0x01, 0x01, 0x9a, 0xd2, 0x18, 0x01, 0x23, 0x9b, 0x07, 0xd6, 0x1d, -0x01, 0x36, 0x33, 0x43, 0x1b, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x03, 0x2b, -0x2c, 0xd1, 0x01, 0x23, 0x9b, 0x07, 0xd6, 0x1d, 0x51, 0x36, 0x33, 0x43, -0x1b, 0x68, 0x07, 0x9e, 0x1e, 0x40, 0x00, 0x96, 0x01, 0x23, 0x9b, 0x07, -0xd6, 0x1d, 0x49, 0x36, 0x33, 0x43, 0x1b, 0x68, 0x83, 0x42, 0x1b, 0xd1, -0x01, 0x23, 0x9b, 0x07, 0xd6, 0x1d, 0x4d, 0x36, 0x33, 0x43, 0x1b, 0x68, -0x00, 0x9e, 0xb3, 0x42, 0x12, 0xd1, 0x01, 0x23, 0x9b, 0x07, 0x1a, 0x43, -0x12, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x08, 0x9b, 0x32, 0x2b, 0x04, 0xd1, -0x02, 0x2a, 0x07, 0xd1, 0x20, 0x04, 0x00, 0x14, 0x0f, 0xe0, 0x08, 0x9b, -0x33, 0x2b, 0x01, 0xd1, 0x01, 0x2a, 0xf7, 0xd0, 0x04, 0x9a, 0x01, 0x37, -0x97, 0x42, 0x00, 0xd3, 0x00, 0x27, 0x04, 0x9a, 0x01, 0x35, 0xaa, 0x42, -0xae, 0xd8, 0x00, 0x20, 0xc0, 0x43, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xc8, 0x29, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -0xf0, 0xb5, 0x27, 0x4d, 0x68, 0x69, 0x00, 0x28, 0x06, 0xd0, 0x26, 0x48, -0x00, 0x68, 0x02, 0xf0, 0x31, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x23, 0x4c, 0x00, 0x26, 0xa0, 0x68, 0x23, 0x4f, 0x00, 0x28, 0x16, 0xd0, -0x0f, 0xe0, 0x28, 0x6a, 0x02, 0x28, 0x02, 0xd3, 0x01, 0x20, 0x38, 0x71, -0x0f, 0xe0, 0xa6, 0x60, 0xfd, 0xf7, 0x08, 0xff, 0x00, 0x28, 0xea, 0xd1, -0x28, 0x6a, 0x02, 0x28, 0x01, 0xd3, 0x01, 0x20, 0x38, 0x71, 0xe8, 0x68, -0x00, 0x28, 0x02, 0xd0, 0x38, 0x79, 0x00, 0x28, 0xe9, 0xd0, 0x68, 0x68, -0x00, 0x28, 0x1b, 0xd0, 0x01, 0x20, 0xa0, 0x60, 0xfe, 0xf7, 0xd2, 0xfb, -0x00, 0x28, 0xd6, 0xd1, 0x68, 0x68, 0x00, 0x28, 0xf6, 0xd1, 0x11, 0xe0, -0x00, 0x28, 0xd0, 0xd1, 0x28, 0x6a, 0x02, 0x28, 0x02, 0xd3, 0x01, 0x20, -0x38, 0x71, 0xca, 0xe7, 0xa6, 0x60, 0xfd, 0xf7, 0xe3, 0xfe, 0x00, 0x28, -0xc5, 0xd1, 0x28, 0x6a, 0x02, 0x28, 0x01, 0xd3, 0x01, 0x20, 0x38, 0x71, -0xe8, 0x68, 0x00, 0x28, 0xbd, 0xd0, 0x38, 0x79, 0x00, 0x28, 0xe7, 0xd0, -0xb9, 0xe7, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, 0xdc, 0x03, 0x00, 0x80, -0xc8, 0x29, 0x00, 0x80, 0x0c, 0x06, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, -0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x90, 0xb5, 0x40, 0x20, -0x1d, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x01, 0xf0, 0x9f, 0xfc, 0x03, 0x23, +0x05, 0x9c, 0xe3, 0x40, 0x03, 0x9c, 0xa3, 0x42, 0x3e, 0xd1, 0x8a, 0x40, +0xca, 0x40, 0x14, 0x1c, 0x63, 0x00, 0x1b, 0x19, 0x5b, 0x01, 0x01, 0x9a, +0xd2, 0x18, 0x01, 0x23, 0x9b, 0x07, 0xd6, 0x1d, 0x01, 0x36, 0x33, 0x43, +0x1b, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x03, 0x2b, 0x2c, 0xd1, 0x01, 0x23, +0x9b, 0x07, 0xd6, 0x1d, 0x51, 0x36, 0x33, 0x43, 0x1b, 0x68, 0x07, 0x9e, +0x1e, 0x40, 0x00, 0x96, 0x01, 0x23, 0x9b, 0x07, 0xd6, 0x1d, 0x49, 0x36, +0x33, 0x43, 0x1b, 0x68, 0x83, 0x42, 0x1b, 0xd1, 0x01, 0x23, 0x9b, 0x07, +0xd6, 0x1d, 0x4d, 0x36, 0x33, 0x43, 0x1b, 0x68, 0x00, 0x9e, 0xb3, 0x42, +0x12, 0xd1, 0x01, 0x23, 0x9b, 0x07, 0x1a, 0x43, 0x12, 0x68, 0x12, 0x04, +0x12, 0x0c, 0x08, 0x9b, 0x32, 0x2b, 0x04, 0xd1, 0x02, 0x2a, 0x07, 0xd1, +0x20, 0x04, 0x00, 0x14, 0x0f, 0xe0, 0x08, 0x9b, 0x33, 0x2b, 0x01, 0xd1, +0x01, 0x2a, 0xf7, 0xd0, 0x04, 0x9a, 0x01, 0x37, 0x97, 0x42, 0x00, 0xd3, +0x00, 0x27, 0x04, 0x9a, 0x01, 0x35, 0xaa, 0x42, 0xae, 0xd8, 0x00, 0x20, +0xc0, 0x43, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x4c, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xb5, 0x27, 0x4d, +0x68, 0x69, 0x00, 0x28, 0x06, 0xd0, 0x26, 0x48, 0x00, 0x68, 0x02, 0xf0, +0x2b, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x23, 0x4c, 0x00, 0x26, +0xa0, 0x68, 0x23, 0x4f, 0x00, 0x28, 0x16, 0xd0, 0x0f, 0xe0, 0x28, 0x6a, +0x02, 0x28, 0x02, 0xd3, 0x01, 0x20, 0x38, 0x71, 0x0f, 0xe0, 0xa6, 0x60, +0xfd, 0xf7, 0xe8, 0xfe, 0x00, 0x28, 0xea, 0xd1, 0x28, 0x6a, 0x02, 0x28, +0x01, 0xd3, 0x01, 0x20, 0x38, 0x71, 0xe8, 0x68, 0x00, 0x28, 0x02, 0xd0, +0x38, 0x79, 0x00, 0x28, 0xe9, 0xd0, 0x68, 0x68, 0x00, 0x28, 0x1b, 0xd0, +0x01, 0x20, 0xa0, 0x60, 0xfe, 0xf7, 0xbc, 0xfb, 0x00, 0x28, 0xd6, 0xd1, +0x68, 0x68, 0x00, 0x28, 0xf6, 0xd1, 0x11, 0xe0, 0x00, 0x28, 0xd0, 0xd1, +0x28, 0x6a, 0x02, 0x28, 0x02, 0xd3, 0x01, 0x20, 0x38, 0x71, 0xca, 0xe7, +0xa6, 0x60, 0xfd, 0xf7, 0xc3, 0xfe, 0x00, 0x28, 0xc5, 0xd1, 0x28, 0x6a, +0x02, 0x28, 0x01, 0xd3, 0x01, 0x20, 0x38, 0x71, 0xe8, 0x68, 0x00, 0x28, +0xbd, 0xd0, 0x38, 0x79, 0x00, 0x28, 0xe7, 0xd0, 0xb9, 0xe7, 0x00, 0x00, +0x6c, 0x06, 0x00, 0x80, 0x5c, 0x04, 0x00, 0x80, 0x4c, 0x2a, 0x00, 0x80, +0x8c, 0x06, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, +0x70, 0x47, 0x00, 0x00, 0x90, 0xb5, 0x40, 0x20, 0x1d, 0x49, 0xc0, 0x46, +0x08, 0x60, 0x01, 0xf0, 0x9d, 0xfc, 0x03, 0x23, 0x1b, 0x07, 0x41, 0x68, 0x19, 0x40, 0x0c, 0x0f, 0x61, 0x01, 0x09, 0x1b, 0x89, 0x00, 0x18, 0x4a, 0x8f, 0x18, 0x01, 0x21, 0x39, 0x80, 0x81, 0x6a, 0xc0, 0x46, 0x79, 0x65, 0x41, 0x6a, 0xc0, 0x46, 0x79, 0x67, 0xb9, 0x6c, 0xfa, 0x6c, 0x89, 0x18, 0xb9, 0x64, 0x00, 0x21, 0xf9, 0x64, 0xba, 0x6b, 0x3b, 0x6d, 0xd2, 0x18, 0xba, 0x63, 0x39, 0x65, 0x42, 0x6a, 0x20, 0x32, 0x51, 0x71, 0x79, 0x6d, 0x7a, 0x6f, 0xd2, 0x6d, 0xc0, 0x46, 0x11, 0x60, -0xfd, 0xf7, 0x10, 0xf8, 0x20, 0x01, 0x09, 0x49, 0x40, 0x18, 0x19, 0x23, +0xfc, 0xf7, 0xd4, 0xff, 0x20, 0x01, 0x09, 0x49, 0x40, 0x18, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x41, 0x6b, 0x01, 0x39, 0x41, 0x63, 0x78, 0x6f, -0x01, 0xf0, 0xc8, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x00, 0x00, 0x00, 0xb0, 0xc8, 0x2a, 0x00, 0x80, 0x1c, 0x1c, 0x00, 0x80, +0x01, 0xf0, 0xc6, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0xb0, 0x5c, 0x2b, 0x00, 0x80, 0xa0, 0x1c, 0x00, 0x80, 0xf0, 0xb5, 0x40, 0x20, 0x12, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x01, 0xf0, -0x5b, 0xfc, 0x07, 0x1c, 0x40, 0x68, 0x03, 0x23, -0x1b, 0x07, 0x18, 0x40, 0x06, 0x0f, 0x70, 0x01, 0x80, 0x1b, 0x80, 0x00, -0x0c, 0x49, 0x44, 0x18, 0xb8, 0x6a, 0xc0, 0x46, 0x60, 0x65, 0x78, 0x6a, -0xc0, 0x46, 0x60, 0x67, 0x80, 0x6f, 0x05, 0x1d, 0xe5, 0x63, 0xb9, 0x69, -0x28, 0x1c, 0x02, 0xf0, 0x8f, 0xf9, 0x38, 0x1c, 0x21, 0x1c, 0x32, 0x1c, -0x2b, 0x1c, 0x00, 0xf0, 0x20, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x00, 0x00, 0xb0, 0xc8, 0x2a, 0x00, 0x80, 0xf0, 0xb5, 0x4b, 0x6f, -0x9b, 0x6f, 0x1f, 0x1d, 0xcf, 0x63, 0x05, 0x68, 0x00, 0x23, 0x84, 0x69, -0xa4, 0x08, 0x08, 0xd0, 0x9c, 0x00, 0x2e, 0x59, 0xc0, 0x46, 0x3e, 0x51, -0x84, 0x69, 0xa4, 0x08, 0x01, 0x33, 0x9c, 0x42, 0xf6, 0xd8, 0x3b, 0x1c, -0x00, 0xf0, 0x03, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, -0x81, 0xb0, 0x04, 0x1c, 0x1d, 0x1c, 0x0f, 0x1c, 0x46, 0x48, 0x01, 0x69, -0x01, 0x31, 0x01, 0x61, 0xf9, 0x1d, 0x51, 0x31, 0xbd, 0x65, 0x00, 0x91, -0x20, 0x1c, 0xfd, 0xf7, 0xa3, 0xfc, 0xf8, 0x6d, 0x40, 0x09, 0x36, 0xd2, -0xb8, 0x6d, 0x06, 0x7b, 0x43, 0x7b, 0x1b, 0x02, 0x1e, 0x43, 0x17, 0x21, -0x49, 0x02, 0x01, 0x73, 0x0b, 0x0a, 0x43, 0x73, 0x00, 0x99, 0x20, 0x1c, -0xfd, 0xf7, 0x92, 0xfc, 0xb8, 0x6d, 0xc0, 0x46, 0x06, 0x73, 0x33, 0x0a, -0x43, 0x73, 0xf8, 0x6d, 0x40, 0x09, 0x20, 0xd2, 0x60, 0x68, 0x01, 0x04, -0x09, 0x0c, 0x03, 0x98, 0x01, 0xf0, 0xce, 0xfc, 0x60, 0x68, 0x32, 0x4b, -0x18, 0x43, 0x60, 0x60, 0x20, 0x1c, 0x01, 0xf0, 0x37, 0xfd, 0x00, 0x25, -0x7d, 0x60, 0xbd, 0x60, 0x3d, 0x64, 0x7d, 0x64, 0x20, 0x1c, 0xfc, 0xf7, -0x77, 0xff, 0x38, 0x88, 0x40, 0x23, 0x18, 0x43, 0x38, 0x80, 0x7d, 0x62, -0x29, 0x48, 0xc0, 0x46, 0xb8, 0x62, 0x38, 0x1c, 0x00, 0xf0, 0xa0, 0xfb, -0x44, 0xe0, 0x20, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x38, 0x18, 0x43, -0x00, 0x68, 0xc0, 0x46, 0x78, 0x64, 0x60, 0x68, 0x02, 0x04, 0x12, 0x0c, -0x78, 0x6e, 0x01, 0x26, 0xc1, 0x1d, 0x0d, 0x31, 0x8a, 0x42, 0x02, 0xd2, -0x3a, 0x64, 0x08, 0x1c, 0x0e, 0xe0, 0x41, 0x19, 0x89, 0x89, 0xf0, 0x23, -0x19, 0x40, 0x09, 0x09, 0x89, 0x00, 0x40, 0x18, 0xf8, 0x60, 0xf9, 0x61, -0x61, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x81, 0x42, 0x16, 0xd2, 0x39, 0x64, -0x63, 0x68, 0x19, 0x04, 0x09, 0x0c, 0x40, 0x1a, 0x03, 0x30, 0x80, 0x08, -0x82, 0x00, 0xa0, 0x61, 0x20, 0x68, 0x09, 0x18, 0x9b, 0x18, 0x63, 0x60, -0xc3, 0x1f, 0x05, 0x3b, 0x38, 0x1c, 0x00, 0xf0, 0xb6, 0xfa, 0x7e, 0x80, +0x59, 0xfc, 0x07, 0x1c, 0x40, 0x68, 0x03, 0x23, 0x1b, 0x07, 0x18, 0x40, +0x06, 0x0f, 0x70, 0x01, 0x80, 0x1b, 0x80, 0x00, 0x0c, 0x49, 0x44, 0x18, +0xb8, 0x6a, 0xc0, 0x46, 0x60, 0x65, 0x78, 0x6a, 0xc0, 0x46, 0x60, 0x67, +0x80, 0x6f, 0x05, 0x1d, 0xe5, 0x63, 0xb9, 0x69, 0x28, 0x1c, 0x02, 0xf0, +0x89, 0xf9, 0x38, 0x1c, 0x21, 0x1c, 0x32, 0x1c, 0x2b, 0x1c, 0x00, 0xf0, +0x20, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, +0x5c, 0x2b, 0x00, 0x80, 0xf0, 0xb5, 0x4b, 0x6f, 0x9b, 0x6f, 0x1f, 0x1d, +0xcf, 0x63, 0x05, 0x68, 0x00, 0x23, 0x84, 0x69, 0xa4, 0x08, 0x08, 0xd0, +0x9c, 0x00, 0x2e, 0x59, 0xc0, 0x46, 0x3e, 0x51, 0x84, 0x69, 0xa4, 0x08, +0x01, 0x33, 0x9c, 0x42, 0xf6, 0xd8, 0x3b, 0x1c, 0x00, 0xf0, 0x03, 0xf8, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0x81, 0xb0, 0x04, 0x1c, +0x1d, 0x1c, 0x0f, 0x1c, 0x46, 0x48, 0x01, 0x69, 0x01, 0x31, 0x01, 0x61, +0xf9, 0x1d, 0x51, 0x31, 0xbd, 0x65, 0x00, 0x91, 0x20, 0x1c, 0xfd, 0xf7, +0x67, 0xfc, 0xf8, 0x6d, 0x40, 0x09, 0x36, 0xd2, 0xb8, 0x6d, 0x06, 0x7b, +0x43, 0x7b, 0x1b, 0x02, 0x1e, 0x43, 0x17, 0x21, 0x49, 0x02, 0x01, 0x73, +0x0b, 0x0a, 0x43, 0x73, 0x00, 0x99, 0x20, 0x1c, 0xfd, 0xf7, 0x56, 0xfc, +0xb8, 0x6d, 0xc0, 0x46, 0x06, 0x73, 0x33, 0x0a, 0x43, 0x73, 0xf8, 0x6d, +0x40, 0x09, 0x20, 0xd2, 0x60, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x03, 0x98, +0x01, 0xf0, 0xcc, 0xfc, 0x60, 0x68, 0x32, 0x4b, 0x18, 0x43, 0x60, 0x60, +0x20, 0x1c, 0x01, 0xf0, 0x35, 0xfd, 0x00, 0x25, 0x7d, 0x60, 0xbd, 0x60, +0x3d, 0x64, 0x7d, 0x64, 0x20, 0x1c, 0xfc, 0xf7, 0x3b, 0xff, 0x38, 0x88, +0x40, 0x23, 0x18, 0x43, 0x38, 0x80, 0x7d, 0x62, 0x29, 0x48, 0xc0, 0x46, +0xb8, 0x62, 0x38, 0x1c, 0x00, 0xf0, 0xa0, 0xfb, 0x44, 0xe0, 0x20, 0x68, +0x01, 0x23, 0x9b, 0x07, 0x08, 0x38, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, +0x78, 0x64, 0x60, 0x68, 0x02, 0x04, 0x12, 0x0c, 0x78, 0x6e, 0x01, 0x26, +0xc1, 0x1d, 0x0d, 0x31, 0x8a, 0x42, 0x02, 0xd2, 0x3a, 0x64, 0x08, 0x1c, +0x0e, 0xe0, 0x41, 0x19, 0x89, 0x89, 0xf0, 0x23, 0x19, 0x40, 0x09, 0x09, +0x89, 0x00, 0x40, 0x18, 0xf8, 0x60, 0xf9, 0x61, 0x61, 0x68, 0x09, 0x04, +0x09, 0x0c, 0x81, 0x42, 0x16, 0xd2, 0x39, 0x64, 0x63, 0x68, 0x19, 0x04, +0x09, 0x0c, 0x40, 0x1a, 0x03, 0x30, 0x80, 0x08, 0x82, 0x00, 0xa0, 0x61, +0x20, 0x68, 0x09, 0x18, 0x9b, 0x18, 0x63, 0x60, 0xc3, 0x1f, 0x05, 0x3b, +0x38, 0x1c, 0x00, 0xf0, 0xb6, 0xfa, 0x7e, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0xbf, 0xfb, 0x0b, 0xe0, 0xb9, 0x68, 0x08, 0x1a, 0x00, 0x25, 0x78, 0x62, 0xbd, 0x62, 0x38, 0x1c, 0x00, 0xf0, 0x3c, 0xfc, 0x20, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x64, 0xf8, 0x05, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +0x08, 0xbc, 0x18, 0x47, 0x0c, 0x2b, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0xf0, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x38, 0x6c, 0xf9, 0x6b, 0x0d, 0x18, 0x21, 0x68, 0x41, 0x18, 0x00, 0x20, 0xa2, 0x69, 0x00, 0x2a, 0x0b, 0xd9, 0x82, 0x00, 0x56, 0x18, 0x01, 0x23, 0x9b, 0x07, @@ -1148,127 +1161,127 @@ 0x82, 0x42, 0xf3, 0xd8, 0x78, 0x6e, 0xf9, 0x6b, 0x09, 0x18, 0x89, 0x89, 0xf0, 0x23, 0x19, 0x40, 0x09, 0x09, 0x89, 0x00, 0x40, 0x18, 0xf8, 0x60, 0xf9, 0x61, 0x20, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x38, 0x18, 0x43, -0x01, 0x68, 0x78, 0x6c, 0xfc, 0xf7, 0xdb, 0xff, -0x78, 0x64, 0x60, 0x68, 0x01, 0x04, 0x09, 0x0c, 0xf8, 0x68, 0x81, 0x42, -0x19, 0xd2, 0x39, 0x64, 0x63, 0x68, 0x19, 0x04, 0x09, 0x0c, 0x40, 0x1a, -0x03, 0x30, 0x80, 0x08, 0x82, 0x00, 0xa0, 0x61, 0x20, 0x68, 0x09, 0x18, -0x9b, 0x18, 0x63, 0x60, 0xc3, 0x1f, 0x05, 0x3b, 0x38, 0x1c, 0x00, 0xf0, -0x56, 0xfa, 0x01, 0x20, 0x78, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0x5e, 0xfb, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb9, 0x68, 0x08, 0x1a, 0x78, 0x62, -0x00, 0x20, 0xb8, 0x62, 0x38, 0x1c, 0x00, 0xf0, 0xd9, 0xfb, 0x20, 0x1c, -0x39, 0x1c, 0x00, 0xf0, 0x01, 0xf8, 0xef, 0xe7, 0xf0, 0xb5, 0x84, 0xb0, -0x04, 0x1c, 0x0f, 0x1c, 0x8e, 0x48, 0x41, 0x69, 0x01, 0x31, 0x41, 0x61, -0x03, 0x20, 0x00, 0x07, 0x61, 0x68, 0x08, 0x40, 0x06, 0x0f, 0x0a, 0x04, -0x12, 0x0c, 0x20, 0x68, 0x11, 0x18, 0xfb, 0x68, 0xd2, 0x1a, 0x7b, 0x68, -0x9d, 0x1a, 0xc3, 0x1f, 0x05, 0x3b, 0x38, 0x1c, 0x2a, 0x1c, 0x00, 0xf0, -0x26, 0xfa, 0x00, 0x20, 0x78, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0x2e, 0xfb, -0x60, 0x68, 0x40, 0x19, 0x01, 0x04, 0x09, 0x0c, 0x60, 0x60, 0x30, 0x1c, -0x01, 0xf0, 0xe2, 0xfb, 0x7d, 0x4e, 0x0b, 0x23, 0x1b, 0x02, 0xf0, 0x18, -0xc0, 0x68, 0x00, 0x28, 0x19, 0xd0, 0x00, 0x25, 0x2d, 0x23, 0x9b, 0x01, -0xf0, 0x18, 0x80, 0x68, 0x00, 0x28, 0x12, 0xd0, 0xaa, 0x00, 0x92, 0x19, -0x2d, 0x23, 0x9b, 0x01, 0xd2, 0x18, 0x92, 0x68, 0x20, 0x1c, 0x39, 0x1c, -0x01, 0xf0, 0x22, 0xfe, 0x01, 0x35, 0xa8, 0x00, 0x80, 0x19, 0x2d, 0x23, -0x9b, 0x01, 0xc0, 0x18, 0x80, 0x68, 0x00, 0x28, 0xec, 0xd1, 0xf8, 0x6b, -0x01, 0x1f, 0x8a, 0x1c, 0xfa, 0x63, 0xfa, 0x68, 0x7d, 0x6c, 0x00, 0xf0, -0xbb, 0xf9, 0xc0, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, -0x56, 0xff, 0x03, 0x90, 0xf9, 0x6b, 0x3a, 0x6e, 0x8e, 0x18, 0x20, 0x68, -0x12, 0x18, 0x01, 0x92, 0x7a, 0x6e, 0x8d, 0x18, 0x11, 0x18, 0x02, 0x91, -0xc8, 0x1d, 0x09, 0x30, 0xe0, 0x60, 0xb1, 0x88, 0x08, 0x02, 0x09, 0x0a, -0x09, 0x06, 0x09, 0x0e, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x78, 0x61, -0x68, 0x68, 0x01, 0x0e, 0xff, 0x22, 0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, -0x11, 0x43, 0xff, 0x22, 0x12, 0x02, 0x02, 0x40, 0x12, 0x02, 0x11, 0x43, -0x00, 0x06, 0x08, 0x43, 0x38, 0x61, 0xa8, 0x89, 0x09, 0x23, 0x1b, 0x02, -0x18, 0x40, 0xb8, 0x61, 0xa8, 0x89, 0x98, 0x43, 0xa8, 0x81, 0xa8, 0x89, -0x02, 0x99, 0xc0, 0x46, 0x88, 0x81, 0x00, 0x20, 0x70, 0x80, 0xb0, 0x80, +0x01, 0x68, 0x78, 0x6c, 0xfc, 0xf7, 0x9f, 0xff, 0x78, 0x64, 0x60, 0x68, +0x01, 0x04, 0x09, 0x0c, 0xf8, 0x68, 0x81, 0x42, 0x19, 0xd2, 0x39, 0x64, +0x63, 0x68, 0x19, 0x04, 0x09, 0x0c, 0x40, 0x1a, 0x03, 0x30, 0x80, 0x08, +0x82, 0x00, 0xa0, 0x61, 0x20, 0x68, 0x09, 0x18, 0x9b, 0x18, 0x63, 0x60, +0xc3, 0x1f, 0x05, 0x3b, 0x38, 0x1c, 0x00, 0xf0, 0x56, 0xfa, 0x01, 0x20, +0x78, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0x5e, 0xfb, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0xb9, 0x68, 0x08, 0x1a, 0x78, 0x62, 0x00, 0x20, 0xb8, 0x62, +0x38, 0x1c, 0x00, 0xf0, 0xd9, 0xfb, 0x20, 0x1c, 0x39, 0x1c, 0x00, 0xf0, +0x01, 0xf8, 0xef, 0xe7, 0xf0, 0xb5, 0x84, 0xb0, 0x04, 0x1c, 0x0f, 0x1c, +0x8e, 0x48, 0x41, 0x69, 0x01, 0x31, 0x41, 0x61, 0x03, 0x20, 0x00, 0x07, +0x61, 0x68, 0x08, 0x40, 0x06, 0x0f, 0x0a, 0x04, 0x12, 0x0c, 0x20, 0x68, +0x11, 0x18, 0xfb, 0x68, 0xd2, 0x1a, 0x7b, 0x68, 0x9d, 0x1a, 0xc3, 0x1f, +0x05, 0x3b, 0x38, 0x1c, 0x2a, 0x1c, 0x00, 0xf0, 0x26, 0xfa, 0x00, 0x20, +0x78, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0x2e, 0xfb, 0x60, 0x68, 0x40, 0x19, +0x01, 0x04, 0x09, 0x0c, 0x60, 0x60, 0x30, 0x1c, 0x01, 0xf0, 0xe0, 0xfb, +0x7d, 0x4e, 0x0b, 0x23, 0x1b, 0x02, 0xf0, 0x18, 0x00, 0x69, 0x00, 0x28, +0x19, 0xd0, 0x00, 0x25, 0x2d, 0x23, 0x9b, 0x01, 0xf0, 0x18, 0xc0, 0x68, +0x00, 0x28, 0x12, 0xd0, 0xaa, 0x00, 0x92, 0x19, 0x2d, 0x23, 0x9b, 0x01, +0xd2, 0x18, 0xd2, 0x68, 0x20, 0x1c, 0x39, 0x1c, 0x01, 0xf0, 0x1c, 0xfe, +0x01, 0x35, 0xa8, 0x00, 0x80, 0x19, 0x2d, 0x23, 0x9b, 0x01, 0xc0, 0x18, +0xc0, 0x68, 0x00, 0x28, 0xec, 0xd1, 0xf8, 0x6b, 0x01, 0x1f, 0x8a, 0x1c, +0xfa, 0x63, 0xfa, 0x68, 0x7d, 0x6c, 0x00, 0xf0, 0xbb, 0xf9, 0xc0, 0x43, +0x01, 0x04, 0x09, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, 0x1a, 0xff, 0x03, 0x90, +0xf9, 0x6b, 0x3a, 0x6e, 0x8e, 0x18, 0x20, 0x68, 0x12, 0x18, 0x01, 0x92, +0x7a, 0x6e, 0x8d, 0x18, 0x11, 0x18, 0x02, 0x91, 0xc8, 0x1d, 0x09, 0x30, +0xe0, 0x60, 0xb1, 0x88, 0x08, 0x02, 0x09, 0x0a, 0x09, 0x06, 0x09, 0x0e, +0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x78, 0x61, 0x68, 0x68, 0x01, 0x0e, +0xff, 0x22, 0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, 0x11, 0x43, 0xff, 0x22, +0x12, 0x02, 0x02, 0x40, 0x12, 0x02, 0x11, 0x43, 0x00, 0x06, 0x08, 0x43, +0x38, 0x61, 0xa8, 0x89, 0x09, 0x23, 0x1b, 0x02, 0x18, 0x40, 0xb8, 0x61, +0xa8, 0x89, 0x98, 0x43, 0xa8, 0x81, 0xa8, 0x89, 0x02, 0x99, 0xc0, 0x46, +0x88, 0x81, 0x00, 0x20, 0x70, 0x80, 0xb0, 0x80, 0x70, 0x81, 0x68, 0x60, 0x28, 0x82, 0xb9, 0x6e, 0x30, 0x1c, 0xfc, 0xf7, -0x2e, 0xff, 0x38, 0x86, 0xfa, 0x69, 0x30, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, -0x49, 0xff, 0x78, 0x86, 0x3d, 0x8e, 0x78, 0x8e, 0x03, 0x99, 0xfc, 0xf7, -0x0e, 0xff, 0x00, 0x90, 0x60, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x39, 0x6e, +0xf2, 0xfe, 0x38, 0x86, 0xfa, 0x69, 0x30, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, +0x0d, 0xff, 0x78, 0x86, 0x3d, 0x8e, 0x78, 0x8e, 0x03, 0x99, 0xfc, 0xf7, +0xd2, 0xfe, 0x00, 0x90, 0x60, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x39, 0x6e, 0x41, 0x1a, 0x09, 0x04, 0x09, 0x0c, 0x7a, 0x6e, 0x82, 0x1a, 0x13, 0x04, 0x1b, 0x0c, 0x1a, 0x02, 0x1b, 0x0a, 0x1a, 0x43, 0x16, 0x04, 0x36, 0x0c, 0xba, 0x68, 0x82, 0x42, 0x01, 0xd2, 0x00, 0x20, 0x00, 0xe0, 0x10, 0x1a, 0xb8, 0x60, 0x08, 0x02, 0x09, 0x12, 0x09, 0x06, 0x09, 0x0e, 0x08, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x01, 0x98, 0xc0, 0x46, 0x41, 0x80, 0x28, 0x1c, -0xfc, 0xf7, 0xe9, 0xfe, 0x05, 0x1c, 0x00, 0x98, 0x31, 0x1c, 0xfc, 0xf7, -0xe4, 0xfe, 0x06, 0x1c, 0x78, 0x69, 0x00, 0x04, 0x00, 0x0c, 0x01, 0x02, -0x00, 0x0a, 0x08, 0x43, 0x01, 0x04, 0x09, 0x0c, -0x01, 0x98, 0xc0, 0x46, 0x81, 0x80, 0x28, 0x1c, 0xfc, 0xf7, 0xd5, 0xfe, -0x79, 0x69, 0x01, 0x31, 0xc0, 0x43, 0x79, 0x61, 0x01, 0x9a, 0xc0, 0x46, -0x50, 0x81, 0x38, 0x69, 0x01, 0x0e, 0xff, 0x22, 0x12, 0x04, 0x02, 0x40, -0x12, 0x0a, 0x11, 0x43, 0xff, 0x22, 0x12, 0x02, 0x02, 0x40, 0x12, 0x02, -0x11, 0x43, 0x00, 0x06, 0x01, 0x43, 0x30, 0x1c, 0xfc, 0xf7, 0xbd, 0xfe, -0x39, 0x69, 0x7a, 0x68, 0x89, 0x18, 0x39, 0x61, 0xb9, 0x68, 0x00, 0x29, -0x09, 0xd1, 0x02, 0x99, 0x89, 0x89, 0xba, 0x69, 0x11, 0x43, 0x02, 0x9a, -0xc0, 0x46, 0x91, 0x81, 0xb9, 0x69, 0xfc, 0xf7, 0xac, 0xfe, 0x20, 0x82, -0x00, 0x20, 0x60, 0x82, 0xf8, 0x6d, 0x41, 0x08, 0x16, 0xd3, 0x80, 0x0a, -0x0a, 0xd3, 0x60, 0x68, 0x10, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, -0x09, 0x0a, 0x08, 0x43, 0x21, 0x68, 0xc0, 0x46, 0x08, 0x82, 0x09, 0xe0, -0x60, 0x68, 0x0c, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, -0x08, 0x43, 0x21, 0x68, 0xc0, 0x46, 0x88, 0x81, 0x04, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x78, 0x2a, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, -0xf1, 0xb5, 0x84, 0xb0, 0x6e, 0x4d, 0x28, 0x69, 0x01, 0x22, 0x04, 0x99, -0x8a, 0x40, 0x90, 0x43, 0x28, 0x61, 0x04, 0x98, 0x43, 0x01, 0x18, 0x1a, -0x80, 0x00, 0x16, 0x1c, 0x69, 0x49, 0x44, 0x18, 0xe0, 0x6b, 0xc0, 0x46, -0x00, 0x90, 0xa0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x26, 0x26, 0xe0, -0x65, 0x48, 0x41, 0x69, 0x01, 0x31, 0x41, 0x61, 0x04, 0x98, 0xfc, 0xf7, -0x4f, 0xfd, 0x07, 0x1c, 0x03, 0xd1, 0x28, 0x69, 0x30, 0x43, 0x28, 0x61, -0xb5, 0xe0, 0xa0, 0x68, 0x65, 0x68, 0xa8, 0x42, 0x00, 0xd2, 0x05, 0x1c, -0xa1, 0x6c, 0xa9, 0x42, 0x16, 0xd2, 0x40, 0x1a, 0x62, 0x6a, 0x10, 0x1a, -0x00, 0x26, 0x60, 0x62, 0xa6, 0x60, 0xa6, 0x62, 0x20, 0x88, 0x48, 0x23, -0x18, 0x43, 0x20, 0x80, 0x0d, 0x1c, 0x09, 0xd1, 0x38, 0x1c, 0xfc, 0xf7, -0x5f, 0xfd, 0x03, 0x20, 0x60, 0x80, 0x66, 0x60, 0x20, 0x1c, 0x00, 0xf0, -0x8d, 0xf9, 0x96, 0xe0, 0xe1, 0x68, 0x38, 0x68, 0x09, 0x18, 0xc3, 0x1f, -0x05, 0x3b, 0x20, 0x1c, 0x02, 0x39, 0x2a, 0x1c, 0x00, 0xf0, 0xcd, 0xf8, -0x38, 0x1c, 0x00, 0xf0, 0xd7, 0xf9, 0xe0, 0x68, 0x46, 0x19, 0x78, 0x68, -0x30, 0x43, 0x78, 0x60, 0x04, 0x98, 0x31, 0x1c, 0x01, 0xf0, 0x8a, 0xfa, -0x21, 0x6e, 0x00, 0x98, 0x08, 0x18, 0x01, 0x90, 0x70, 0x1a, 0x00, 0x04, -0x00, 0x0c, 0x61, 0x6e, 0x71, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x11, 0x02, +0xfc, 0xf7, 0xad, 0xfe, 0x05, 0x1c, 0x00, 0x98, 0x31, 0x1c, 0xfc, 0xf7, +0xa8, 0xfe, 0x06, 0x1c, 0x78, 0x69, 0x00, 0x04, 0x00, 0x0c, 0x01, 0x02, +0x00, 0x0a, 0x08, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x01, 0x98, 0xc0, 0x46, +0x81, 0x80, 0x28, 0x1c, 0xfc, 0xf7, 0x99, 0xfe, 0x79, 0x69, 0x01, 0x31, +0xc0, 0x43, 0x79, 0x61, 0x01, 0x9a, 0xc0, 0x46, 0x50, 0x81, 0x38, 0x69, +0x01, 0x0e, 0xff, 0x22, 0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, 0x11, 0x43, +0xff, 0x22, 0x12, 0x02, 0x02, 0x40, 0x12, 0x02, 0x11, 0x43, 0x00, 0x06, +0x01, 0x43, 0x30, 0x1c, 0xfc, 0xf7, 0x81, 0xfe, 0x39, 0x69, 0x7a, 0x68, +0x89, 0x18, 0x39, 0x61, 0xb9, 0x68, 0x00, 0x29, 0x09, 0xd1, 0x02, 0x99, +0x89, 0x89, 0xba, 0x69, 0x11, 0x43, 0x02, 0x9a, 0xc0, 0x46, 0x91, 0x81, +0xb9, 0x69, 0xfc, 0xf7, 0x70, 0xfe, 0x20, 0x82, 0x00, 0x20, 0x60, 0x82, +0xf8, 0x6d, 0x41, 0x08, 0x16, 0xd3, 0x80, 0x0a, 0x0a, 0xd3, 0x60, 0x68, +0x10, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, +0x21, 0x68, 0xc0, 0x46, 0x08, 0x82, 0x09, 0xe0, 0x60, 0x68, 0x0c, 0x38, +0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x21, 0x68, +0xc0, 0x46, 0x88, 0x81, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x0c, 0x2b, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, 0xf1, 0xb5, 0x84, 0xb0, +0x6e, 0x4d, 0x28, 0x69, 0x01, 0x22, 0x04, 0x99, 0x8a, 0x40, 0x90, 0x43, +0x28, 0x61, 0x04, 0x98, 0x43, 0x01, 0x18, 0x1a, 0x80, 0x00, 0x16, 0x1c, +0x69, 0x49, 0x44, 0x18, 0xe0, 0x6b, 0xc0, 0x46, 0x00, 0x90, 0xa0, 0x68, +0x00, 0x28, 0x01, 0xd1, 0x00, 0x26, 0x26, 0xe0, 0x65, 0x48, 0x41, 0x69, +0x01, 0x31, 0x41, 0x61, 0x04, 0x98, 0xfc, 0xf7, 0x13, 0xfd, 0x07, 0x1c, +0x03, 0xd1, 0x28, 0x69, 0x30, 0x43, 0x28, 0x61, 0xb5, 0xe0, 0xa0, 0x68, +0x65, 0x68, 0xa8, 0x42, 0x00, 0xd2, 0x05, 0x1c, 0xa1, 0x6c, 0xa9, 0x42, +0x16, 0xd2, 0x40, 0x1a, 0x62, 0x6a, 0x10, 0x1a, 0x00, 0x26, 0x60, 0x62, +0xa6, 0x60, 0xa6, 0x62, 0x20, 0x88, 0x48, 0x23, 0x18, 0x43, 0x20, 0x80, +0x0d, 0x1c, 0x09, 0xd1, 0x38, 0x1c, 0xfc, 0xf7, 0x23, 0xfd, 0x03, 0x20, +0x60, 0x80, 0x66, 0x60, 0x20, 0x1c, 0x00, 0xf0, 0x8d, 0xf9, 0x96, 0xe0, +0xe1, 0x68, 0x38, 0x68, 0x09, 0x18, 0xc3, 0x1f, 0x05, 0x3b, 0x20, 0x1c, +0x02, 0x39, 0x2a, 0x1c, 0x00, 0xf0, 0xcd, 0xf8, 0x38, 0x1c, 0x00, 0xf0, +0xd7, 0xf9, 0xe0, 0x68, 0x46, 0x19, 0x78, 0x68, 0x30, 0x43, 0x78, 0x60, +0x04, 0x98, 0x31, 0x1c, 0x01, 0xf0, 0x88, 0xfa, 0x21, 0x6e, 0x00, 0x98, +0x08, 0x18, 0x01, 0x90, 0x70, 0x1a, 0x00, 0x04, 0x00, 0x0c, 0x61, 0x6e, +0x71, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x11, 0x02, 0x12, 0x0a, 0x11, 0x43, 0x09, 0x04, 0x09, 0x0c, 0x02, 0x91, 0x01, 0x02, 0x00, 0x0a, 0x08, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x01, 0x98, 0xc0, 0x46, -0x41, 0x80, 0x20, 0x8e, 0xfc, 0xf7, 0x11, 0xfe, 0x06, 0x1c, 0x60, 0x8e, -0x02, 0x99, 0xfc, 0xf7, 0x0c, 0xfe, 0x03, 0x90, 0x60, 0x69, 0x01, 0x04, +0x41, 0x80, 0x20, 0x8e, 0xfc, 0xf7, 0xd5, 0xfd, 0x06, 0x1c, 0x60, 0x8e, +0x02, 0x99, 0xfc, 0xf7, 0xd0, 0xfd, 0x03, 0x90, 0x60, 0x69, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x01, 0x04, 0x09, 0x0c, -0x01, 0x98, 0xc0, 0x46, 0x81, 0x80, 0x30, 0x1c, 0xfc, 0xf7, 0xfd, 0xfd, +0x01, 0x98, 0xc0, 0x46, 0x81, 0x80, 0x30, 0x1c, 0xfc, 0xf7, 0xc1, 0xfd, 0x61, 0x69, 0x01, 0x31, 0xc0, 0x43, 0x61, 0x61, 0x01, 0x99, 0xc0, 0x46, 0x48, 0x81, 0x60, 0x6e, 0x00, 0x99, 0x46, 0x18, 0x20, 0x69, 0x01, 0x0e, 0xff, 0x22, 0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, 0x11, 0x43, 0xff, 0x22, 0x12, 0x02, 0x02, 0x40, 0x12, 0x02, 0x11, 0x43, 0x00, 0x06, 0x01, 0x43, -0x71, 0x60, 0x03, 0x98, 0xfc, 0xf7, 0xe1, 0xfd, 0x21, 0x69, 0x49, 0x19, -0x21, 0x61, 0xa1, 0x68, 0x49, 0x1b, 0xa1, 0x60, -0x06, 0xd1, 0xb1, 0x89, 0xa2, 0x69, 0x11, 0x43, 0xb1, 0x81, 0xa1, 0x69, -0xfc, 0xf7, 0xd3, 0xfd, 0x38, 0x82, 0x61, 0x6e, 0x38, 0x68, 0x09, 0x18, -0x0e, 0x31, 0xf9, 0x60, 0xe2, 0x68, 0x00, 0x99, 0x04, 0x38, 0x00, 0xf0, -0x4c, 0xf8, 0x02, 0x20, 0x78, 0x82, 0xe0, 0x6d, 0x41, 0x08, 0x16, 0xd3, -0x80, 0x0a, 0x0a, 0xd3, 0x78, 0x68, 0x10, 0x38, 0x01, 0x04, 0x09, 0x0c, -0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x39, 0x68, 0xc0, 0x46, 0xc8, 0x81, -0x09, 0xe0, 0x78, 0x68, 0x0c, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, -0x09, 0x0a, 0x08, 0x43, 0x39, 0x68, 0xc0, 0x46, 0x48, 0x81, 0x05, 0xb0, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x3c, 0x2c, 0x00, 0x80, -0xc8, 0x2a, 0x00, 0x80, 0x78, 0x2a, 0x00, 0x80, 0xf7, 0xb5, 0x03, 0x1c, -0x0f, 0x1c, 0x00, 0x20, 0x1c, 0x68, 0x26, 0x04, 0x31, 0x1c, 0x1d, 0x1d, -0xfc, 0xf7, 0x97, 0xfd, 0x40, 0xc7, 0x02, 0x9a, 0xd1, 0x1c, 0x89, 0x08, -0x01, 0x39, 0x4a, 0x1e, 0x02, 0x92, 0x00, 0x29, 0x0d, 0xd0, 0x21, 0x0c, -0x10, 0xcd, 0x22, 0x04, 0x0a, 0x43, 0x11, 0x1c, 0x16, 0x1c, 0xfc, 0xf7, -0x86, 0xfd, 0x40, 0xc7, 0x02, 0x99, 0x4a, 0x1e, 0x02, 0x92, 0x00, 0x29, -0xf1, 0xd1, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0x08, -0x80, 0x00, 0x89, 0x08, 0x89, 0x00, 0x03, 0x32, 0x93, 0x08, 0x5a, 0x1e, -0x00, 0x2b, 0x05, 0xd0, 0x08, 0xc9, 0x08, 0xc0, 0x13, 0x1c, 0x01, 0x3a, -0x00, 0x2b, 0xf9, 0xd1, 0x70, 0x47, 0xff, 0xb5, 0x86, 0xb0, 0x17, 0x1c, -0x00, 0x26, 0x06, 0x98, 0x80, 0x6c, 0xc0, 0x1b, 0x06, 0x99, 0xc0, 0x46, -0x88, 0x64, 0x01, 0x20, 0xc0, 0x05, 0x06, 0x99, 0x89, 0x6b, 0xc0, 0x46, -0x01, 0x91, 0x06, 0x99, 0x4c, 0x6b, 0x67, 0xe0, 0x21, 0x68, 0xc0, 0x46, -0x02, 0x91, 0x61, 0x68, 0xc0, 0x46, 0x03, 0x91, 0xa1, 0x68, 0xc0, 0x46, -0x04, 0x91, 0x02, 0xa9, 0x49, 0x88, 0xb9, 0x42, 0x08, 0xd2, 0x02, 0xad, -0x6d, 0x88, 0x02, 0xa9, 0x49, 0x88, 0x7f, 0x1a, 0x00, 0x21, 0x02, 0xab, -0x59, 0x80, 0x19, 0xe0, 0x02, 0xa9, 0x49, 0x88, 0xc9, 0x1b, 0x02, 0xab, -0x59, 0x80, 0x3d, 0x1c, 0x00, 0x27, 0x01, 0x21, 0x49, 0x06, 0x07, 0x9b, -0x9a, 0x07, 0x92, 0x0f, 0x0d, 0xd0, 0xeb, 0x06, 0xdb, 0x0e, 0x08, 0xd0, -0x1e, 0x2b, 0x08, 0xd3, 0x1e, 0x2b, 0x02, 0xd1, 0x03, 0x2a, 0x04, 0xd1, -0x01, 0xe0, 0x02, 0x2a, 0x01, 0xd3, 0x01, 0x26, 0x00, 0x21, 0x29, 0x43, -0x01, 0x43, 0x0a, 0x1c, 0x00, 0x91, 0x00, 0x20, 0x03, 0x99, 0x04, 0x9a, -0x07, 0x9b, 0x01, 0xf0, 0x61, 0xff, 0x07, 0x99, 0x49, 0x19, 0x07, 0x91, +0x71, 0x60, 0x03, 0x98, 0xfc, 0xf7, 0xa5, 0xfd, 0x21, 0x69, 0x49, 0x19, +0x21, 0x61, 0xa1, 0x68, 0x49, 0x1b, 0xa1, 0x60, 0x06, 0xd1, 0xb1, 0x89, +0xa2, 0x69, 0x11, 0x43, 0xb1, 0x81, 0xa1, 0x69, 0xfc, 0xf7, 0x97, 0xfd, +0x38, 0x82, 0x61, 0x6e, 0x38, 0x68, 0x09, 0x18, 0x0e, 0x31, 0xf9, 0x60, +0xe2, 0x68, 0x00, 0x99, 0x04, 0x38, 0x00, 0xf0, 0x4c, 0xf8, 0x02, 0x20, +0x78, 0x82, 0xe0, 0x6d, 0x41, 0x08, 0x16, 0xd3, 0x80, 0x0a, 0x0a, 0xd3, +0x78, 0x68, 0x10, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, +0x08, 0x43, 0x39, 0x68, 0xc0, 0x46, 0xc8, 0x81, 0x09, 0xe0, 0x78, 0x68, +0x0c, 0x38, 0x01, 0x04, 0x09, 0x0c, 0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, +0x39, 0x68, 0xc0, 0x46, 0x48, 0x81, 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0xd0, 0x2c, 0x00, 0x80, 0x5c, 0x2b, 0x00, 0x80, +0x0c, 0x2b, 0x00, 0x80, 0xf7, 0xb5, 0x03, 0x1c, 0x0f, 0x1c, 0x00, 0x20, +0x1c, 0x68, 0x26, 0x04, 0x31, 0x1c, 0x1d, 0x1d, 0xfc, 0xf7, 0x5b, 0xfd, +0x40, 0xc7, 0x02, 0x9a, 0xd1, 0x1c, 0x89, 0x08, 0x01, 0x39, 0x4a, 0x1e, +0x02, 0x92, 0x00, 0x29, 0x0d, 0xd0, 0x21, 0x0c, 0x10, 0xcd, 0x22, 0x04, +0x0a, 0x43, 0x11, 0x1c, 0x16, 0x1c, 0xfc, 0xf7, 0x4a, 0xfd, 0x40, 0xc7, +0x02, 0x99, 0x4a, 0x1e, 0x02, 0x92, 0x00, 0x29, 0xf1, 0xd1, 0x03, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0x08, 0x80, 0x00, 0x89, 0x08, +0x89, 0x00, 0x03, 0x32, 0x93, 0x08, 0x5a, 0x1e, 0x00, 0x2b, 0x05, 0xd0, +0x08, 0xc9, 0x08, 0xc0, 0x13, 0x1c, 0x01, 0x3a, 0x00, 0x2b, 0xf9, 0xd1, +0x70, 0x47, 0xff, 0xb5, 0x86, 0xb0, 0x17, 0x1c, 0x00, 0x26, 0x06, 0x98, +0x80, 0x6c, 0xc0, 0x1b, 0x06, 0x99, 0xc0, 0x46, 0x88, 0x64, 0x01, 0x20, +0xc0, 0x05, 0x06, 0x99, 0x89, 0x6b, 0xc0, 0x46, 0x01, 0x91, 0x06, 0x99, +0x4c, 0x6b, 0x67, 0xe0, 0x21, 0x68, 0xc0, 0x46, 0x02, 0x91, 0x61, 0x68, +0xc0, 0x46, 0x03, 0x91, 0xa1, 0x68, 0xc0, 0x46, 0x04, 0x91, 0x02, 0xa9, +0x49, 0x88, 0xb9, 0x42, 0x08, 0xd2, 0x02, 0xad, 0x6d, 0x88, 0x02, 0xa9, +0x49, 0x88, 0x7f, 0x1a, 0x00, 0x21, 0x02, 0xab, 0x59, 0x80, 0x19, 0xe0, +0x02, 0xa9, 0x49, 0x88, 0xc9, 0x1b, 0x02, 0xab, 0x59, 0x80, 0x3d, 0x1c, +0x00, 0x27, 0x01, 0x21, 0x49, 0x06, 0x07, 0x9b, 0x9a, 0x07, 0x92, 0x0f, +0x0d, 0xd0, 0xeb, 0x06, 0xdb, 0x0e, 0x08, 0xd0, 0x1e, 0x2b, 0x08, 0xd3, +0x1e, 0x2b, 0x02, 0xd1, 0x03, 0x2a, 0x04, 0xd1, 0x01, 0xe0, 0x02, 0x2a, +0x01, 0xd3, 0x01, 0x26, 0x00, 0x21, 0x29, 0x43, 0x01, 0x43, 0x0a, 0x1c, +0x00, 0x91, 0x00, 0x20, 0x03, 0x99, 0x04, 0x9a, +0x07, 0x9b, 0x01, 0xf0, 0x5b, 0xff, 0x07, 0x99, 0x49, 0x19, 0x07, 0x91, 0x00, 0x2e, 0x0a, 0xd0, 0x1d, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x1d, 0x48, -0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x07, 0x9b, 0x01, 0xf0, 0x52, 0xff, +0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x07, 0x9b, 0x01, 0xf0, 0x4c, 0xff, 0x00, 0x26, 0x02, 0xa8, 0x40, 0x88, 0x00, 0x28, 0x0c, 0xd0, 0x03, 0x98, 0x40, 0x19, 0x03, 0x90, 0x02, 0x98, 0xc0, 0x46, 0x20, 0x60, 0x03, 0x98, 0xc0, 0x46, 0x60, 0x60, 0x04, 0x98, 0xc0, 0x46, 0xa0, 0x60, 0x03, 0xe0, @@ -1276,513 +1289,512 @@ 0x44, 0x63, 0x01, 0x98, 0x06, 0x99, 0xc0, 0x46, 0x88, 0x63, 0x00, 0x20, 0x00, 0x2f, 0x02, 0xd0, 0x01, 0x99, 0x00, 0x29, 0x92, 0xd1, 0x09, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x06, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, -0x09, 0x9b, 0x01, 0xf0, 0x25, 0xff, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, -0xf8, 0x28, 0x00, 0x80, 0x04, 0x00, 0x53, 0x02, 0x90, 0xb5, 0x0c, 0x1c, -0x07, 0x1c, 0x38, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x38, 0x18, 0x43, -0x01, 0x68, 0x38, 0x8a, 0xfc, 0xf7, 0xcb, 0xfc, 0xc0, 0x43, 0xf9, 0x68, -0xc0, 0x46, 0x08, 0x80, 0x78, 0x8a, 0x39, 0x68, 0x08, 0x1a, 0x38, 0x60, -0x38, 0x1c, 0x01, 0xf0, 0x8d, 0xf9, 0x38, 0x1c, 0xfc, 0xf7, 0xd2, 0xfb, -0x20, 0x1c, 0xff, 0xf7, 0x33, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x80, 0xb5, 0x01, 0x88, 0x8a, 0x09, 0x21, 0xd3, 0xca, 0x09, 0x1f, 0xd2, -0x8a, 0x08, 0x1d, 0xd3, 0x00, 0x21, 0x01, 0x80, 0x41, 0x80, 0x47, 0x6f, -0x40, 0x6d, 0xfa, 0x1d, 0x19, 0x32, 0x51, 0x71, 0xfa, 0x6d, 0xc0, 0x46, -0x10, 0x60, 0x3a, 0x6e, 0xc0, 0x46, 0x10, 0x60, 0x0c, 0x48, 0xc0, 0x46, -0x41, 0x63, 0x81, 0x6b, 0x49, 0x08, 0x49, 0x00, 0x81, 0x63, 0x01, 0x20, -0x00, 0xf0, 0xce, 0xff, 0x38, 0x1c, 0x00, 0xf0, 0x6d, 0xff, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x80, 0x23, 0x19, 0x43, 0x01, 0x80, 0x01, 0x88, -0x49, 0x09, 0xf6, 0xd2, 0x00, 0xf0, 0xb0, 0xf8, 0xf3, 0xe7, 0x00, 0x00, -0x68, 0x0e, 0x00, 0x80, 0xf0, 0xb5, 0x07, 0x1c, 0x10, 0x1c, 0x0d, 0x1c, -0x00, 0x24, 0x5e, 0x1e, 0x00, 0x2b, 0x19, 0xd0, 0x01, 0x68, 0xc0, 0x46, -0x39, 0x60, 0x41, 0x88, 0x0c, 0x19, 0x41, 0x68, 0xc0, 0x46, 0x79, 0x60, -0x81, 0x68, 0xc0, 0x46, 0xb9, 0x60, 0xc1, 0x68, 0xc0, 0x46, 0xf9, 0x60, -0x10, 0x30, 0x10, 0x37, 0xe9, 0x6a, 0x81, 0x42, 0x02, 0xd8, 0x28, 0x1c, -0x00, 0xf0, 0xee, 0xff, 0x31, 0x1c, 0x01, 0x3e, 0x00, 0x29, 0xe5, 0xd1, -0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, 0xc1, 0x61, -0x05, 0x49, 0x0a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x60, 0x02, 0xe0, -0x4a, 0x68, 0xc0, 0x46, 0xd0, 0x61, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, -0x3c, 0x2c, 0x00, 0x80, 0x03, 0x49, 0x08, 0x68, 0x00, 0x28, 0x02, 0xd0, -0xc2, 0x69, 0xc0, 0x46, 0x0a, 0x60, 0x70, 0x47, 0x3c, 0x2c, 0x00, 0x80, -0x00, 0x21, 0x81, 0x67, 0x05, 0x49, 0x8a, 0x68, 0x00, 0x2a, 0x01, 0xd1, -0x88, 0x60, 0x02, 0xe0, 0xca, 0x68, 0xc0, 0x46, 0x90, 0x67, 0xc8, 0x60, -0x70, 0x47, 0x00, 0x00, 0x3c, 0x2c, 0x00, 0x80, 0x03, 0x49, 0x88, 0x68, -0x00, 0x28, 0x02, 0xd0, 0x82, 0x6f, 0xc0, 0x46, 0x8a, 0x60, 0x70, 0x47, -0x3c, 0x2c, 0x00, 0x80, 0x00, 0xb5, 0x80, 0x20, 0x13, 0x49, 0xc0, 0x46, -0x08, 0x60, 0xff, 0xf7, 0xd5, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x03, 0x23, +0x09, 0x9b, 0x01, 0xf0, 0x1f, 0xff, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x7c, 0x29, 0x00, 0x80, +0x04, 0x00, 0x53, 0x02, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, 0x38, 0x68, +0x01, 0x23, 0x9b, 0x07, 0x08, 0x38, 0x18, 0x43, 0x01, 0x68, 0x38, 0x8a, +0xfc, 0xf7, 0x8f, 0xfc, 0xc0, 0x43, 0xf9, 0x68, 0xc0, 0x46, 0x08, 0x80, +0x78, 0x8a, 0x39, 0x68, 0x08, 0x1a, 0x38, 0x60, 0x38, 0x1c, 0x01, 0xf0, +0x8b, 0xf9, 0x38, 0x1c, 0xfc, 0xf7, 0x96, 0xfb, 0x20, 0x1c, 0xff, 0xf7, +0x33, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x01, 0x88, +0x8a, 0x09, 0x21, 0xd3, 0xca, 0x09, 0x1f, 0xd2, 0x8a, 0x08, 0x1d, 0xd3, +0x00, 0x21, 0x01, 0x80, 0x41, 0x80, 0x47, 0x6f, 0x40, 0x6d, 0xfa, 0x1d, +0x19, 0x32, 0x51, 0x71, 0xfa, 0x6d, 0xc0, 0x46, 0x10, 0x60, 0x3a, 0x6e, +0xc0, 0x46, 0x10, 0x60, 0x0c, 0x48, 0xc0, 0x46, 0x81, 0x63, 0xc1, 0x6b, +0x49, 0x08, 0x49, 0x00, 0xc1, 0x63, 0x01, 0x20, 0x00, 0xf0, 0xcc, 0xff, +0x38, 0x1c, 0x00, 0xf0, 0x6b, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x80, 0x23, 0x19, 0x43, 0x01, 0x80, 0x01, 0x88, 0x49, 0x09, 0xf6, 0xd2, +0x00, 0xf0, 0xb0, 0xf8, 0xf3, 0xe7, 0x00, 0x00, 0xe8, 0x0e, 0x00, 0x80, +0xf0, 0xb5, 0x07, 0x1c, 0x10, 0x1c, 0x0d, 0x1c, 0x00, 0x24, 0x5e, 0x1e, +0x00, 0x2b, 0x19, 0xd0, 0x01, 0x68, 0xc0, 0x46, 0x39, 0x60, 0x41, 0x88, +0x0c, 0x19, 0x41, 0x68, 0xc0, 0x46, 0x79, 0x60, 0x81, 0x68, 0xc0, 0x46, +0xb9, 0x60, 0xc1, 0x68, 0xc0, 0x46, 0xf9, 0x60, 0x10, 0x30, 0x10, 0x37, +0xe9, 0x6a, 0x81, 0x42, 0x02, 0xd8, 0x28, 0x1c, 0x00, 0xf0, 0xec, 0xff, +0x31, 0x1c, 0x01, 0x3e, 0x00, 0x29, 0xe5, 0xd1, 0x20, 0x1c, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, 0xc1, 0x61, 0x05, 0x49, 0x0a, 0x68, +0x00, 0x2a, 0x01, 0xd1, 0x08, 0x60, 0x02, 0xe0, 0x4a, 0x68, 0xc0, 0x46, +0xd0, 0x61, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd0, 0x2c, 0x00, 0x80, +0x03, 0x49, 0x08, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xc2, 0x69, 0xc0, 0x46, +0x0a, 0x60, 0x70, 0x47, 0xd0, 0x2c, 0x00, 0x80, 0x00, 0x21, 0x81, 0x67, +0x05, 0x49, 0x8a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x88, 0x60, 0x02, 0xe0, +0xca, 0x68, 0xc0, 0x46, 0x90, 0x67, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, +0xd0, 0x2c, 0x00, 0x80, 0x03, 0x49, 0x88, 0x68, 0x00, 0x28, 0x02, 0xd0, +0x82, 0x6f, 0xc0, 0x46, 0x8a, 0x60, 0x70, 0x47, 0xd0, 0x2c, 0x00, 0x80, +0x00, 0xb5, 0x80, 0x20, 0x13, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xff, 0xf7, +0xd5, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x03, 0x23, 0x1b, 0x07, 0x41, 0x68, 0x19, 0x40, 0x0a, 0x0f, 0x51, 0x01, 0x89, 0x1a, 0x89, 0x00, 0x0d, 0x4b, 0xc9, 0x18, 0x4b, 0x88, 0x00, 0x2b, 0x04, 0xd1, 0x11, 0x1c, 0xff, 0xf7, 0x3b, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x2b, 0x02, 0xd1, 0xff, 0xf7, 0x05, 0xfc, 0xf8, 0xe7, 0x02, 0x2b, 0xf6, 0xd1, 0xff, 0xf7, 0x4e, 0xfb, 0xf3, 0xe7, 0x04, 0x48, 0x01, 0x6d, 0x01, 0x31, -0x01, 0x65, 0xee, 0xe7, 0x00, 0x00, 0x00, 0xb0, 0xc8, 0x2a, 0x00, 0x80, +0x01, 0x65, 0xee, 0xe7, 0x00, 0x00, 0x00, 0xb0, 0x5c, 0x2b, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x00, 0xb5, 0x20, 0x20, 0x0d, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xff, 0xf7, 0xbf, 0xff, 0x00, 0x28, 0x0e, 0xd0, 0x01, 0x88, 0x20, 0x23, 0x19, 0x43, 0x01, 0x80, 0x01, 0x88, 0x10, 0x23, 0x99, 0x43, 0x01, 0x80, 0x01, 0x88, 0x09, 0x0a, 0x01, 0xd3, 0xff, 0xf7, 0x2e, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x03, 0x48, 0x01, 0x6d, 0x01, 0x31, 0x01, 0x65, -0xf8, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, -0xa0, 0x82, 0x20, 0x40, 0x98, 0xb5, 0x07, 0x1c, 0x22, 0x48, 0xc0, 0x46, -0x00, 0x90, 0x22, 0x48, 0xc3, 0x1d, 0x41, 0x33, 0x41, 0x6d, 0x82, 0x6d, -0x80, 0x6c, 0x00, 0x03, 0x00, 0x0b, 0x9c, 0x68, 0x01, 0x23, 0x9b, 0x07, -0x23, 0x43, 0x1b, 0x68, 0x98, 0x42, 0x00, 0xd1, 0x0c, 0xe0, 0x98, 0x42, -0x03, 0xd9, 0x10, 0x1a, 0x59, 0x1a, 0x41, 0x18, 0x00, 0xe0, 0x19, 0x1a, -0x01, 0x20, 0x10, 0x29, 0x00, 0xd8, 0x00, 0x20, 0x00, 0x28, 0x1f, 0xd0, -0x78, 0x6a, 0xf9, 0x6a, 0xc0, 0x46, 0x08, 0x60, 0xb8, 0x6a, 0xf9, 0x6a, -0xc0, 0x46, 0x48, 0x60, 0x10, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0xfb, 0x6a, -0x0f, 0x48, 0x42, 0x6d, 0x03, 0x20, 0x39, 0x6a, 0x01, 0xf0, 0xe8, 0xfd, -0x38, 0x88, 0x10, 0x23, 0x18, 0x43, 0x38, 0x80, 0x38, 0x88, 0x40, 0x23, -0x98, 0x43, 0x38, 0x80, 0x38, 0x1c, 0xff, 0xf7, 0x55, 0xff, 0x98, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x38, 0x88, 0x40, 0x23, 0x18, 0x43, 0x38, 0x80, -0xf7, 0xe7, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x28, 0x03, 0x00, 0x80, -0x08, 0x00, 0x11, 0x02, 0xf8, 0x28, 0x00, 0x80, 0xb0, 0xb5, 0x40, 0x20, -0x2c, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x00, 0xf0, 0xff, 0xfe, 0x07, 0x1c, -0x40, 0x68, 0x03, 0x23, 0x1b, 0x07, 0x18, 0x40, 0x05, 0x0f, 0x68, 0x01, -0x40, 0x1b, 0x80, 0x00, 0x26, 0x49, 0x44, 0x18, 0x20, 0x88, 0x02, 0x23, -0x18, 0x43, 0x20, 0x80, 0x20, 0x88, 0x41, 0x08, 0x34, 0xd3, 0x40, 0x08, -0x40, 0x00, 0x20, 0x80, 0xa0, 0x6c, 0xe1, 0x6c, 0x40, 0x18, 0xa0, 0x64, -0x00, 0x20, 0xe0, 0x64, 0xa1, 0x6b, 0x22, 0x6d, 0x89, 0x18, 0xa1, 0x63, -0x20, 0x65, 0xb8, 0x6a, 0xc0, 0x46, 0x60, 0x65, 0x03, 0x23, 0x1b, 0x07, -0x78, 0x68, 0x18, 0x40, 0x78, 0x60, 0x61, 0x68, 0x36, 0x31, 0x94, 0x29, -0x04, 0xd8, 0x38, 0x23, 0x18, 0x43, 0x78, 0x60, 0x38, 0x20, 0x03, 0xe0, -0x94, 0x23, 0x18, 0x43, 0x78, 0x60, 0x94, 0x20, 0xb8, 0x61, 0x39, 0x68, -0x78, 0x68, 0x02, 0x04, 0x12, 0x0c, 0x20, 0x1c, 0xcb, 0x1f, 0x05, 0x3b, -0xff, 0xf7, 0xd7, 0xfd, 0x02, 0x20, 0x60, 0x80, 0x38, 0x1c, 0xff, 0xf7, -0xdf, 0xfe, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xfc, 0xf7, -0x4d, 0xfa, 0x28, 0x01, 0x06, 0x49, 0x40, 0x18, 0x19, 0x23, 0xdb, 0x01, -0xc0, 0x18, 0x41, 0x6b, 0x01, 0x39, 0x41, 0x63, 0xef, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x00, 0xb0, 0xc8, 0x2a, 0x00, 0x80, 0x1c, 0x1c, 0x00, 0x80, -0x90, 0xb5, 0x00, 0x27, 0x0f, 0x4c, 0x0d, 0xe0, 0x02, 0x6b, 0x01, 0x3a, -0x02, 0x63, 0x00, 0x2a, 0x05, 0xdc, 0xc2, 0x6a, 0xc0, 0x46, 0x02, 0x63, -0x80, 0x6a, 0x01, 0xf0, 0xcc, 0xf9, 0x01, 0x37, 0x0b, 0x2f, 0x07, 0xd2, -0x38, 0x01, 0x00, 0x19, 0x33, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0x41, 0x6a, +0xf8, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xa0, 0x82, 0x20, 0x40, +0x98, 0xb5, 0x07, 0x1c, 0x22, 0x48, 0xc0, 0x46, 0x00, 0x90, 0x22, 0x48, +0xc3, 0x1d, 0x41, 0x33, 0x41, 0x6d, 0x82, 0x6d, 0x80, 0x6c, 0x00, 0x03, +0x00, 0x0b, 0x9c, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x23, 0x43, 0x1b, 0x68, +0x98, 0x42, 0x00, 0xd1, 0x0c, 0xe0, 0x98, 0x42, 0x03, 0xd9, 0x10, 0x1a, +0x59, 0x1a, 0x41, 0x18, 0x00, 0xe0, 0x19, 0x1a, 0x01, 0x20, 0x10, 0x29, +0x00, 0xd8, 0x00, 0x20, 0x00, 0x28, 0x1f, 0xd0, 0x78, 0x6a, 0xf9, 0x6a, +0xc0, 0x46, 0x08, 0x60, 0xb8, 0x6a, 0xf9, 0x6a, 0xc0, 0x46, 0x48, 0x60, +0x10, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0xfb, 0x6a, 0x0f, 0x48, 0x42, 0x6d, +0x03, 0x20, 0x39, 0x6a, 0x01, 0xf0, 0xe2, 0xfd, 0x38, 0x88, 0x10, 0x23, +0x18, 0x43, 0x38, 0x80, 0x38, 0x88, 0x40, 0x23, 0x98, 0x43, 0x38, 0x80, +0x38, 0x1c, 0xff, 0xf7, 0x55, 0xff, 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x38, 0x88, 0x40, 0x23, 0x18, 0x43, 0x38, 0x80, 0xf7, 0xe7, 0x00, 0x00, +0x55, 0x55, 0x55, 0x55, 0xa8, 0x03, 0x00, 0x80, 0x08, 0x00, 0x11, 0x02, +0x7c, 0x29, 0x00, 0x80, 0xb0, 0xb5, 0x40, 0x20, 0x2c, 0x49, 0xc0, 0x46, +0x08, 0x60, 0x00, 0xf0, 0xfd, 0xfe, 0x07, 0x1c, 0x40, 0x68, 0x03, 0x23, +0x1b, 0x07, 0x18, 0x40, 0x05, 0x0f, 0x68, 0x01, 0x40, 0x1b, 0x80, 0x00, +0x26, 0x49, 0x44, 0x18, 0x20, 0x88, 0x02, 0x23, 0x18, 0x43, 0x20, 0x80, +0x20, 0x88, 0x41, 0x08, 0x34, 0xd3, 0x40, 0x08, 0x40, 0x00, 0x20, 0x80, +0xa0, 0x6c, 0xe1, 0x6c, 0x40, 0x18, 0xa0, 0x64, 0x00, 0x20, 0xe0, 0x64, +0xa1, 0x6b, 0x22, 0x6d, 0x89, 0x18, 0xa1, 0x63, 0x20, 0x65, 0xb8, 0x6a, +0xc0, 0x46, 0x60, 0x65, 0x03, 0x23, 0x1b, 0x07, 0x78, 0x68, 0x18, 0x40, +0x78, 0x60, 0x61, 0x68, 0x36, 0x31, 0x94, 0x29, 0x04, 0xd8, 0x38, 0x23, +0x18, 0x43, 0x78, 0x60, 0x38, 0x20, 0x03, 0xe0, 0x94, 0x23, 0x18, 0x43, +0x78, 0x60, 0x94, 0x20, 0xb8, 0x61, 0x39, 0x68, 0x78, 0x68, 0x02, 0x04, +0x12, 0x0c, 0x20, 0x1c, 0xcb, 0x1f, 0x05, 0x3b, 0xff, 0xf7, 0xd7, 0xfd, +0x02, 0x20, 0x60, 0x80, 0x38, 0x1c, 0xff, 0xf7, 0xdf, 0xfe, 0xb0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xfc, 0xf7, 0x11, 0xfa, 0x28, 0x01, +0x06, 0x49, 0x40, 0x18, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x41, 0x6b, +0x01, 0x39, 0x41, 0x63, 0xef, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, +0x5c, 0x2b, 0x00, 0x80, 0xa0, 0x1c, 0x00, 0x80, 0x90, 0xb5, 0x00, 0x27, +0x0f, 0x4c, 0x0d, 0xe0, 0x42, 0x6b, 0x01, 0x3a, +0x42, 0x63, 0x00, 0x2a, 0x05, 0xdc, 0x02, 0x6b, 0xc0, 0x46, 0x42, 0x63, +0xc0, 0x6a, 0x01, 0xf0, 0xc6, 0xf9, 0x01, 0x37, 0x0b, 0x2f, 0x07, 0xd2, +0x38, 0x01, 0x00, 0x19, 0x33, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0x81, 0x6a, 0x00, 0x29, 0xe9, 0xd1, 0x01, 0x20, 0x40, 0x06, 0x03, 0x49, 0xc0, 0x46, -0x08, 0x60, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x00, 0x00, 0xb0, 0x11, 0x48, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, -0x10, 0x49, 0xc8, 0x68, 0x01, 0x28, 0x19, 0xd1, 0xc8, 0x1d, 0x79, 0x30, -0x82, 0x88, 0x00, 0x2a, 0x14, 0xd0, 0x01, 0x3a, 0x82, 0x80, 0x82, 0x88, -0x00, 0x2a, 0x0f, 0xd1, 0xc2, 0x88, 0x00, 0x2a, 0x0a, 0xd1, 0x02, 0x23, -0xca, 0x6f, 0x1a, 0x43, 0xca, 0x67, 0x07, 0x49, 0xc0, 0x46, 0x0a, 0x60, -0x04, 0x21, 0x81, 0x80, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x80, -0x70, 0x47, 0x00, 0x00, 0x08, 0x83, 0x20, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, 0xb0, 0xb5, 0x07, 0x1c, -0x01, 0x23, 0xf8, 0x1d, 0x69, 0x30, 0x03, 0x73, 0x1d, 0x49, 0xca, 0x1d, -0x79, 0x32, 0xd4, 0x89, 0x60, 0x1c, 0xd0, 0x81, 0x55, 0x8a, 0x00, 0x20, -0xac, 0x42, 0x02, 0xdb, 0x53, 0x73, 0xd0, 0x81, 0x50, 0x83, 0x01, 0x23, -0x9b, 0x07, 0x3a, 0x6d, 0x1a, 0x43, 0x12, 0x68, 0xc0, 0x46, 0xba, 0x61, -0xfb, 0x69, 0x9a, 0x42, 0x06, 0xd1, 0xf8, 0x6c, 0x12, 0x49, 0xc0, 0x46, -0x08, 0x60, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0x61, 0x48, 0x69, -0xfa, 0x6c, 0x90, 0x43, 0x48, 0x61, 0x01, 0x21, 0x09, 0x05, 0xc8, 0x60, -0x38, 0x69, 0x02, 0x28, 0xf1, 0xd0, 0xb8, 0x69, 0xf9, 0x69, 0x41, 0x1a, -0x01, 0xd5, 0x78, 0x6d, 0x41, 0x18, 0x38, 0x1c, 0x00, 0xf0, 0x0e, 0xf8, -0xf9, 0x69, 0x09, 0x18, 0xf9, 0x61, 0x78, 0x6d, 0x81, 0x42, 0xe2, 0xd3, -0x08, 0x1a, 0xf8, 0x61, 0xdf, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x00, 0x00, 0xb0, 0xf8, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0xff, 0x23, -0x21, 0x33, 0x9f, 0x42, 0x01, 0xd9, 0xff, 0x27, 0x21, 0x37, 0xe1, 0x6e, -0x38, 0x1c, 0x01, 0xf0, 0xcf, 0xfc, 0x2d, 0x4d, 0x00, 0x28, 0x13, 0xd1, -0xe0, 0x1d, 0x49, 0x30, 0x01, 0x7a, 0x01, 0x23, 0x19, 0x43, 0x01, 0x72, -0x29, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x29, 0x48, 0x01, 0x6d, 0x42, 0x6d, -0x00, 0x20, 0x2b, 0x1c, 0x01, 0xf0, 0xb4, 0xfc, 0x00, 0x20, 0xf8, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x20, 0x69, 0x01, 0x30, 0x20, 0x61, 0x23, 0x49, -0xc8, 0x1d, 0xb9, 0x30, 0xc2, 0x6a, 0x92, 0x00, 0x51, 0x18, 0xc0, 0x31, -0xcf, 0x60, 0xc1, 0x6a, 0x01, 0x31, 0x89, 0x07, 0x89, 0x0f, 0xc1, 0x62, -0x20, 0x6b, 0xc2, 0x19, 0x61, 0x6d, 0x8a, 0x42, 0x03, 0xd8, 0x23, 0x22, -0x12, 0x05, 0x3a, 0x43, 0x05, 0xe0, 0x09, 0x1a, 0x7e, 0x1a, 0x07, 0xd1, -0x23, 0x22, 0x12, 0x05, 0x0a, 0x43, 0x00, 0x92, 0x61, 0x6e, 0x09, 0x18, -0xa2, 0x6e, 0x10, 0xe0, 0x11, 0x22, 0x52, 0x05, 0x0a, 0x43, 0x00, 0x92, -0x61, 0x6e, 0x09, 0x18, 0x00, 0x20, 0xa2, 0x6e, 0x2b, 0x1c, 0x01, 0xf0, -0x81, 0xfc, 0x23, 0x22, 0x12, 0x05, 0x32, 0x43, 0x00, 0x92, 0x61, 0x6e, -0xa2, 0x6e, 0x00, 0x20, 0x2b, 0x1c, 0x01, 0xf0, 0x77, 0xfc, 0x20, 0x6b, -0xc0, 0x19, 0x00, 0x09, 0x00, 0x01, 0x61, 0x6d, 0x81, 0x42, 0x00, 0xd8, -0x40, 0x1a, 0x20, 0x63, 0x38, 0x1c, 0xb8, 0xe7, 0x44, 0x80, 0x20, 0x40, -0x04, 0x00, 0x1b, 0x02, 0xf8, 0x28, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, -0x80, 0xb5, 0x01, 0x20, 0xc0, 0x03, 0x0d, 0x49, 0xc0, 0x46, 0x08, 0x60, -0x0c, 0x49, 0xc8, 0x1d, 0x49, 0x30, 0x02, 0x7a, 0x00, 0x27, 0x00, 0x2a, -0x03, 0xd0, 0x07, 0x72, 0x08, 0x1c, 0xff, 0xf7, 0x39, 0xff, 0x08, 0x49, -0xc8, 0x1d, 0x49, 0x30, 0x02, 0x7a, 0x00, 0x2a, 0x03, 0xd0, 0x07, 0x72, -0x08, 0x1c, 0xff, 0xf7, 0x2f, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x00, 0x00, 0xb0, 0xd0, 0x2c, 0x00, 0x80, 0x50, 0x2c, 0x00, 0x80, -0x90, 0xb5, 0x07, 0x1c, 0x10, 0x20, 0x18, 0x49, 0xc0, 0x46, 0x08, 0x60, -0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, 0x16, 0x48, 0xc4, 0x1d, 0xb9, 0x34, -0x21, 0x6b, 0x89, 0x00, 0x09, 0x18, 0xc0, 0x31, 0xc9, 0x68, 0x7a, 0x68, -0x92, 0x00, 0xd2, 0x19, 0x51, 0x64, 0x21, 0x6b, 0x89, 0x00, 0x08, 0x18, -0xc0, 0x30, 0xc1, 0x68, 0x78, 0x68, 0x80, 0x00, 0xc0, 0x19, 0xc0, 0x6b, -0x01, 0xf0, 0xa6, 0xfa, 0x01, 0x23, 0x78, 0x68, -0x58, 0x40, 0x78, 0x60, 0x20, 0x6b, 0x01, 0x30, 0x80, 0x07, 0x80, 0x0f, -0x20, 0x63, 0xf8, 0x1d, 0x19, 0x30, 0x40, 0x79, 0x00, 0x28, 0x02, 0xd1, -0x38, 0x1c, 0x00, 0xf0, 0x07, 0xf8, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x00, 0x00, 0xb0, 0xe8, 0x0d, 0x00, 0x80, 0x90, 0xb5, 0x07, 0x1c, -0x39, 0x48, 0x80, 0x68, 0x00, 0x28, 0x05, 0xd0, 0xb8, 0x6a, 0xc0, 0x68, -0x80, 0x09, 0x01, 0xd3, 0x02, 0x20, 0x00, 0xe0, 0x78, 0x6f, 0xfc, 0xf7, -0x9d, 0xf8, 0x04, 0x1c, 0x06, 0xd1, 0x01, 0x20, 0xf9, 0x1d, 0x19, 0x31, -0x08, 0x71, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf8, 0x6c, 0x2f, 0x49, -0xc0, 0x46, 0x08, 0x60, 0xba, 0x6a, 0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, -0x59, 0xf8, 0x67, 0x62, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x00, 0xf0, -0x0b, 0xfd, 0xec, 0xe7, 0xf9, 0x6d, 0x09, 0x68, 0x09, 0x18, 0x09, 0x09, -0x09, 0x01, 0x7a, 0x6d, 0x8a, 0x42, 0x00, 0xd8, 0x89, 0x1a, 0xa1, 0x62, -0xb9, 0x68, 0x89, 0x00, 0xc9, 0x19, 0x4a, 0x6c, 0x00, 0x2a, 0x07, 0xd0, -0x4a, 0x6c, 0x12, 0x1a, 0x4a, 0x64, 0x80, 0x08, 0x80, 0x00, 0xb9, 0x6a, -0x08, 0x18, 0xb8, 0x62, 0x38, 0x68, 0xb9, 0x6a, 0x80, 0x00, 0xc0, 0x19, -0x42, 0x6b, 0x91, 0x42, 0x0e, 0xd3, 0x00, 0x21, 0x41, 0x64, 0xb8, 0x6a, -0x39, 0x68, 0x89, 0x00, 0xc9, 0x19, 0x49, 0x6b, 0x40, 0x1a, 0xb8, 0x62, -0xb9, 0x68, 0x89, 0x00, 0xc9, 0x19, 0xc9, 0x6b, 0x40, 0x18, 0xb8, 0x62, -0xb8, 0x68, 0x81, 0x00, 0xc9, 0x19, 0x49, 0x6c, 0x00, 0x29, 0xb8, 0xd1, -0xb9, 0x6a, 0xfa, 0x6b, 0x91, 0x42, 0xb4, 0xd0, 0x3a, 0x6c, 0x91, 0x42, -0xb1, 0xd0, 0x01, 0x23, 0x58, 0x40, 0xb8, 0x60, 0x80, 0x00, 0xc0, 0x19, -0xc0, 0x6b, 0xc0, 0x46, 0xb8, 0x62, 0xf8, 0x68, 0x00, 0x28, 0x01, 0xd0, -0x01, 0x38, 0xf8, 0x60, 0x38, 0x69, 0x00, 0x28, 0xa1, 0xd0, 0x01, 0x38, -0x38, 0x61, 0x9e, 0xe7, 0xe8, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, -0xf7, 0xb5, 0x90, 0xb0, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0x20, 0x05, 0x90, -0x02, 0x90, 0x00, 0x22, 0x01, 0x92, 0xf9, 0x48, 0x80, 0x6a, 0xc0, 0x46, -0xa8, 0x61, 0xa0, 0x68, 0x81, 0x00, 0x09, 0x19, 0x49, 0x6b, 0xc0, 0x46, -0x20, 0x60, 0xe1, 0x62, 0x12, 0x9a, 0xd0, 0x68, 0xc0, 0x46, 0xa8, 0x60, -0x12, 0x9a, 0x51, 0x78, 0xc0, 0x46, 0x0c, 0x91, 0xf0, 0x48, 0xc0, 0x46, -0x03, 0x90, 0xd7, 0x1d, 0x09, 0x37, 0xe0, 0x6a, 0xc1, 0x1b, 0x09, 0x09, -0xe3, 0x1d, 0x19, 0x33, 0x0c, 0x9a, 0xc0, 0x46, 0x0f, 0x93, 0xeb, 0x4b, -0xc0, 0x46, 0x0e, 0x93, 0x91, 0x42, 0x01, 0xd3, 0xb8, 0x42, 0x21, 0xd8, -0xe1, 0x68, 0x02, 0x29, 0x1e, 0xd2, 0x01, 0x20, 0x0f, 0x99, 0xc0, 0x46, -0x48, 0x71, 0x00, 0x20, 0x03, 0x99, 0x01, 0xf0, 0x5b, 0xfb, 0x00, 0x28, -0x03, 0xd1, 0x0e, 0x9b, 0x98, 0x6b, 0x01, 0x30, 0x98, 0x63, 0x01, 0x20, -0x80, 0x06, 0x00, 0x27, 0x68, 0x60, 0xaf, 0x61, 0xdd, 0x4a, 0xc0, 0x46, -0x00, 0x92, 0xdd, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0xdc, 0x4b, 0x00, 0x20, -0x01, 0xf0, 0x3e, 0xfb, 0x38, 0x1c, 0x5c, 0xe3, 0xb8, 0x42, 0x03, 0xd8, -0x20, 0x1c, 0x00, 0xf0, 0x7b, 0xfc, 0x07, 0x1c, 0xd7, 0x48, 0x80, 0x68, -0x00, 0x28, 0x64, 0xd0, 0x38, 0x78, 0x40, 0x07, 0x40, 0x0f, 0x03, 0x28, -0x60, 0xd1, 0x05, 0x98, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x05, 0x90, -0x38, 0x78, 0xf0, 0x23, 0x18, 0x40, 0x58, 0xd1, 0xe0, 0x6a, 0xc0, 0x1b, -0x00, 0x09, 0x0c, 0x99, 0x88, 0x42, 0x02, 0xd2, -0xe0, 0x68, 0x02, 0x28, 0x05, 0xd3, 0xcb, 0x49, 0x88, 0x68, 0x00, 0xf0, -0x87, 0xff, 0x06, 0x1c, 0x06, 0xd1, 0x03, 0x9b, 0x28, 0x1c, 0x39, 0x1c, -0x22, 0x1c, 0x00, 0xf0, 0x8b, 0xfc, 0x16, 0xe1, 0x2e, 0x62, 0xf8, 0x68, -0x00, 0x28, 0x0d, 0xd0, 0xb8, 0x89, 0x00, 0x28, 0x03, 0xd0, 0xc1, 0x49, -0xc9, 0x68, 0x00, 0xf0, 0x74, 0xff, 0xf8, 0x89, 0x00, 0x28, 0x03, 0xd0, -0xbd, 0x49, 0xc9, 0x68, 0x00, 0xf0, 0x6d, 0xff, 0x7a, 0x68, 0xc0, 0x46, -0x72, 0x61, 0xb9, 0x68, 0xc0, 0x46, 0xb1, 0x61, 0x30, 0x1c, 0xb8, 0x49, -0x09, 0x68, 0x00, 0xf0, 0x62, 0xff, 0x00, 0x28, 0x17, 0xd1, 0x30, 0x1c, -0xb4, 0x49, 0x49, 0x68, 0x00, 0xf0, 0x5b, 0xff, 0x10, 0x37, 0xe0, 0x6a, -0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x27, 0xfc, 0x07, 0x1c, -0x68, 0x68, 0xaf, 0x4b, 0x18, 0x43, 0x68, 0x60, 0x00, 0x20, 0xa8, 0x61, -0xac, 0x23, 0xa8, 0x68, 0x98, 0x43, 0xa8, 0x60, 0xb0, 0xe0, 0xa8, 0x69, -0xa8, 0x28, 0x01, 0xd2, 0xa8, 0x20, 0xa8, 0x61, 0x10, 0x37, 0xe0, 0x6a, -0xb8, 0x42, 0x6c, 0xd8, 0x9c, 0xe0, 0xa5, 0xe0, 0xa4, 0xe0, 0x10, 0x28, -0x68, 0xd1, 0x03, 0x23, 0x1b, 0x07, 0x68, 0x68, 0x18, 0x40, 0x01, 0x0f, -0x48, 0x01, 0x40, 0x1a, 0x80, 0x00, 0xa0, 0x4a, 0x82, 0x18, 0x01, 0x92, -0x78, 0x88, 0x42, 0x0b, 0x31, 0xd3, 0x82, 0x0b, 0x2f, 0xd3, 0x9d, 0x48, -0xc0, 0x46, 0x03, 0x90, 0x02, 0x20, 0x01, 0x9a, 0xc0, 0x46, 0x10, 0x80, -0x78, 0x88, 0x00, 0x05, 0x00, 0x0d, 0x01, 0x9a, 0xc0, 0x46, 0x50, 0x60, -0xb8, 0x68, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x60, 0x78, 0x68, 0x01, 0x9a, -0xc0, 0x46, 0x10, 0x62, 0x00, 0x20, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x64, -0x01, 0x9a, 0xc0, 0x46, 0x90, 0x63, 0x88, 0x02, 0x8f, 0x49, 0x40, 0x18, -0x01, 0x9a, 0xc0, 0x46, 0x50, 0x63, 0x01, 0x9a, 0x50, 0x68, 0x36, 0x30, -0x94, 0x28, 0x01, 0xd8, 0x38, 0x20, 0x00, 0xe0, 0x94, 0x20, 0xa8, 0x61, -0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x28, 0xd8, 0x58, 0xe0, 0x7a, 0x88, -0x92, 0x0b, 0x03, 0xd3, 0x85, 0x48, 0xc0, 0x46, 0x03, 0x90, 0x23, 0xe0, -0x01, 0x22, 0x12, 0x03, 0x02, 0x40, 0x83, 0x4b, 0x1d, 0xd0, 0x03, 0x93, -0x00, 0x05, 0x00, 0x0d, 0x01, 0x9a, 0xc0, 0x46, 0x50, 0x60, 0xb8, 0x68, -0x01, 0x9a, 0xc0, 0x46, 0x90, 0x60, 0x78, 0x68, 0x01, 0x9a, 0xc0, 0x46, -0x10, 0x62, 0x00, 0x20, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x64, 0x01, 0x9a, -0xc0, 0x46, 0x90, 0x63, 0x88, 0x02, 0x75, 0x49, 0x40, 0x18, 0x01, 0x9a, -0xc0, 0x46, 0x50, 0x63, 0x02, 0xe0, 0x33, 0xe0, 0x2a, 0xe0, 0x03, 0x93, -0x01, 0x20, 0x0f, 0x99, 0xc0, 0x46, 0x48, 0x71, 0x12, 0x9a, 0x50, 0x78, -0x05, 0x99, 0x43, 0x1a, 0x0b, 0x93, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, -0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x92, 0xfb, 0x07, 0x1c, 0x01, 0x9a, -0x50, 0x6b, 0x91, 0x6b, 0x09, 0x01, 0x40, 0x18, 0x0b, 0x9b, 0x21, 0x1c, -0x3a, 0x1c, 0xff, 0xf7, 0x7b, 0xfb, 0x01, 0x9a, 0xc0, 0x46, 0xd0, 0x64, -0x01, 0x9a, 0x0b, 0x9b, 0xc0, 0x46, 0x13, 0x65, 0x01, 0x23, 0x5b, 0x06, -0x68, 0x68, 0x18, 0x43, 0x68, 0x60, 0x00, 0x20, 0xa8, 0x61, 0x0d, 0xe0, +0x08, 0x60, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, +0x00, 0x00, 0x00, 0xb0, 0x10, 0x48, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, +0x0f, 0x49, 0xc8, 0x68, 0x01, 0x28, 0x17, 0xd1, 0xc8, 0x1d, 0x79, 0x30, +0x02, 0x89, 0x00, 0x2a, 0x12, 0xd0, 0x01, 0x3a, 0x02, 0x81, 0x02, 0x89, +0x00, 0x2a, 0x0d, 0xd1, 0x42, 0x89, 0x00, 0x2a, 0x08, 0xd1, 0xc9, 0x6f, +0x02, 0x23, 0x0a, 0x68, 0x1a, 0x43, 0x0a, 0x60, 0x04, 0x21, 0x01, 0x81, +0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x41, 0x81, 0x70, 0x47, 0x00, 0x00, +0x08, 0x83, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, 0xb0, 0xb5, 0x07, 0x1c, +0x01, 0x23, 0xf8, 0x1d, 0x69, 0x30, 0x03, 0x73, 0x1e, 0x48, 0xc2, 0x1d, +0x79, 0x32, 0x54, 0x8a, 0x61, 0x1c, 0x51, 0x82, 0xd5, 0x8a, 0x00, 0x21, +0xac, 0x42, 0x04, 0xdb, 0xc4, 0x1d, 0x89, 0x34, 0x63, 0x70, 0x51, 0x82, +0xd1, 0x83, 0x01, 0x23, 0x9b, 0x07, 0x3a, 0x6d, 0x1a, 0x43, 0x12, 0x68, +0xc0, 0x46, 0xba, 0x61, 0xfb, 0x69, 0x9a, 0x42, 0x06, 0xd1, 0xf8, 0x6c, +0x12, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x79, 0x61, 0x41, 0x69, 0xfa, 0x6c, 0x91, 0x43, 0x41, 0x61, 0x01, 0x20, +0x00, 0x05, 0xc1, 0x60, 0x38, 0x69, 0x02, 0x28, 0xf1, 0xd0, 0xb8, 0x69, +0xf9, 0x69, 0x41, 0x1a, 0x01, 0xd5, 0x78, 0x6d, 0x41, 0x18, 0x38, 0x1c, +0x00, 0xf0, 0x0e, 0xf8, 0xf9, 0x69, 0x09, 0x18, 0xf9, 0x61, 0x78, 0x6d, +0x81, 0x42, 0xe2, 0xd3, 0x08, 0x1a, 0xf8, 0x61, 0xdf, 0xe7, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0xf8, 0xb5, 0x04, 0x1c, +0x0f, 0x1c, 0xff, 0x23, 0x21, 0x33, 0x9f, 0x42, 0x01, 0xd9, 0xff, 0x27, +0x21, 0x37, 0xe1, 0x6e, 0x38, 0x1c, 0x01, 0xf0, 0xcb, 0xfc, 0x2d, 0x4d, +0x00, 0x28, 0x13, 0xd1, 0xe0, 0x1d, 0x49, 0x30, 0x01, 0x7a, 0x01, 0x23, +0x19, 0x43, 0x01, 0x72, 0x29, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x29, 0x48, +0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x2b, 0x1c, 0x01, 0xf0, 0xb0, 0xfc, +0x00, 0x20, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x20, 0x69, 0x01, 0x30, +0x20, 0x61, 0x23, 0x49, 0xc8, 0x1d, 0xb9, 0x30, 0x02, 0x6b, 0x92, 0x00, +0x51, 0x18, 0xc0, 0x31, 0x0f, 0x61, 0x01, 0x6b, 0x01, 0x31, 0x89, 0x07, +0x89, 0x0f, 0x01, 0x63, 0x20, 0x6b, 0xc2, 0x19, 0x61, 0x6d, 0x8a, 0x42, +0x03, 0xd8, 0x23, 0x22, 0x12, 0x05, 0x3a, 0x43, 0x05, 0xe0, 0x09, 0x1a, +0x7e, 0x1a, 0x07, 0xd1, 0x23, 0x22, 0x12, 0x05, 0x0a, 0x43, 0x00, 0x92, +0x61, 0x6e, 0x09, 0x18, 0xa2, 0x6e, 0x10, 0xe0, 0x11, 0x22, 0x52, 0x05, +0x0a, 0x43, 0x00, 0x92, 0x61, 0x6e, 0x09, 0x18, 0x00, 0x20, 0xa2, 0x6e, +0x2b, 0x1c, 0x01, 0xf0, 0x7d, 0xfc, 0x23, 0x22, 0x12, 0x05, 0x32, 0x43, +0x00, 0x92, 0x61, 0x6e, 0xa2, 0x6e, 0x00, 0x20, 0x2b, 0x1c, 0x01, 0xf0, +0x73, 0xfc, 0x20, 0x6b, 0xc0, 0x19, 0x00, 0x09, 0x00, 0x01, 0x61, 0x6d, +0x81, 0x42, 0x00, 0xd8, 0x40, 0x1a, 0x20, 0x63, 0x38, 0x1c, 0xb8, 0xe7, +0x44, 0x80, 0x20, 0x40, 0x04, 0x00, 0x1b, 0x02, 0x7c, 0x29, 0x00, 0x80, +0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x01, 0x20, +0xc0, 0x03, 0x0d, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x0c, 0x49, 0xc8, 0x1d, +0x49, 0x30, 0x02, 0x7a, 0x00, 0x27, 0x00, 0x2a, 0x03, 0xd0, 0x07, 0x72, +0x08, 0x1c, 0xff, 0xf7, 0x37, 0xff, 0x08, 0x49, 0xc8, 0x1d, 0x49, 0x30, +0x02, 0x7a, 0x00, 0x2a, 0x03, 0xd0, 0x07, 0x72, 0x08, 0x1c, 0xff, 0xf7, +0x2d, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, +0x64, 0x2d, 0x00, 0x80, 0xe4, 0x2c, 0x00, 0x80, 0x90, 0xb5, 0x07, 0x1c, +0x10, 0x20, 0x18, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xf8, 0x68, 0x01, 0x30, +0xf8, 0x60, 0x16, 0x48, 0xc4, 0x1d, 0xb9, 0x34, 0x61, 0x6b, 0x89, 0x00, +0x09, 0x18, 0xc0, 0x31, 0x09, 0x69, 0x7a, 0x68, 0x92, 0x00, 0xd2, 0x19, +0x51, 0x64, 0x61, 0x6b, 0x89, 0x00, 0x08, 0x18, 0xc0, 0x30, 0x01, 0x69, +0x78, 0x68, 0x80, 0x00, 0xc0, 0x19, 0xc0, 0x6b, 0x01, 0xf0, 0xa2, 0xfa, +0x01, 0x23, 0x78, 0x68, 0x58, 0x40, 0x78, 0x60, 0x60, 0x6b, 0x01, 0x30, +0x80, 0x07, 0x80, 0x0f, 0x60, 0x63, 0xf8, 0x1d, 0x19, 0x30, 0x40, 0x79, +0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0x00, 0xf0, 0x07, 0xf8, 0x90, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, 0x68, 0x0e, 0x00, 0x80, +0x90, 0xb5, 0x07, 0x1c, 0x39, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x05, 0xd0, +0xb8, 0x6a, 0xc0, 0x68, 0x80, 0x09, 0x01, 0xd3, 0x02, 0x20, 0x00, 0xe0, +0x78, 0x6f, 0xfc, 0xf7, 0x63, 0xf8, 0x04, 0x1c, 0x06, 0xd1, 0x01, 0x20, +0xf9, 0x1d, 0x19, 0x31, 0x08, 0x71, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0xf8, 0x6c, 0x2f, 0x49, 0xc0, 0x46, 0x08, 0x60, 0xba, 0x6a, 0x38, 0x1c, +0x21, 0x1c, 0x00, 0xf0, 0x59, 0xf8, 0x67, 0x62, 0x00, 0x28, 0x03, 0xd1, +0x20, 0x1c, 0x00, 0xf0, 0x0b, 0xfd, 0xec, 0xe7, 0xf9, 0x6d, 0x09, 0x68, +0x09, 0x18, 0x09, 0x09, 0x09, 0x01, 0x7a, 0x6d, 0x8a, 0x42, 0x00, 0xd8, +0x89, 0x1a, 0xa1, 0x62, 0xb9, 0x68, 0x89, 0x00, 0xc9, 0x19, 0x4a, 0x6c, +0x00, 0x2a, 0x07, 0xd0, 0x4a, 0x6c, 0x12, 0x1a, 0x4a, 0x64, 0x80, 0x08, +0x80, 0x00, 0xb9, 0x6a, 0x08, 0x18, 0xb8, 0x62, 0x38, 0x68, 0xb9, 0x6a, +0x80, 0x00, 0xc0, 0x19, 0x42, 0x6b, 0x91, 0x42, 0x0e, 0xd3, 0x00, 0x21, +0x41, 0x64, 0xb8, 0x6a, 0x39, 0x68, 0x89, 0x00, 0xc9, 0x19, 0x49, 0x6b, +0x40, 0x1a, 0xb8, 0x62, 0xb9, 0x68, 0x89, 0x00, 0xc9, 0x19, 0xc9, 0x6b, +0x40, 0x18, 0xb8, 0x62, 0xb8, 0x68, 0x81, 0x00, 0xc9, 0x19, 0x49, 0x6c, +0x00, 0x29, 0xb8, 0xd1, 0xb9, 0x6a, 0xfa, 0x6b, 0x91, 0x42, 0xb4, 0xd0, +0x3a, 0x6c, 0x91, 0x42, 0xb1, 0xd0, 0x01, 0x23, 0x58, 0x40, 0xb8, 0x60, +0x80, 0x00, 0xc0, 0x19, 0xc0, 0x6b, 0xc0, 0x46, 0xb8, 0x62, 0xf8, 0x68, +0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0xf8, 0x60, 0x38, 0x69, 0x00, 0x28, +0xa1, 0xd0, 0x01, 0x38, 0x38, 0x61, 0x9e, 0xe7, 0x68, 0x19, 0x00, 0x80, +0x00, 0x00, 0x00, 0xb0, 0xf7, 0xb5, 0x90, 0xb0, 0x04, 0x1c, 0x0d, 0x1c, +0x00, 0x20, 0x05, 0x90, 0x02, 0x90, 0x00, 0x22, 0x01, 0x92, 0xf9, 0x48, +0xc0, 0x6a, 0xc0, 0x46, 0xa8, 0x61, 0xa0, 0x68, 0x81, 0x00, 0x09, 0x19, +0x49, 0x6b, 0xc0, 0x46, 0x20, 0x60, 0xe1, 0x62, 0x12, 0x9a, 0xd0, 0x68, +0xc0, 0x46, 0xa8, 0x60, 0x12, 0x9a, 0x51, 0x78, 0xc0, 0x46, 0x0c, 0x91, +0xf0, 0x48, 0xc0, 0x46, 0x03, 0x90, 0xd7, 0x1d, 0x09, 0x37, 0xe0, 0x6a, +0xc1, 0x1b, 0x09, 0x09, 0xe3, 0x1d, 0x19, 0x33, 0x0c, 0x9a, 0xc0, 0x46, +0x0f, 0x93, 0xeb, 0x4b, 0xc0, 0x46, 0x0e, 0x93, +0x91, 0x42, 0x01, 0xd3, 0xb8, 0x42, 0x21, 0xd8, 0xe1, 0x68, 0x02, 0x29, +0x1e, 0xd2, 0x01, 0x20, 0x0f, 0x99, 0xc0, 0x46, 0x48, 0x71, 0x00, 0x20, +0x03, 0x99, 0x01, 0xf0, 0x57, 0xfb, 0x00, 0x28, 0x03, 0xd1, 0x0e, 0x9b, +0xd8, 0x6b, 0x01, 0x30, 0xd8, 0x63, 0x01, 0x20, 0x80, 0x06, 0x00, 0x27, +0x68, 0x60, 0xaf, 0x61, 0xdd, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0xdd, 0x48, +0x01, 0x6d, 0x42, 0x6d, 0xdc, 0x4b, 0x00, 0x20, 0x01, 0xf0, 0x3a, 0xfb, +0x38, 0x1c, 0x5c, 0xe3, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, +0x7b, 0xfc, 0x07, 0x1c, 0xd7, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x64, 0xd0, +0x38, 0x78, 0x40, 0x07, 0x40, 0x0f, 0x03, 0x28, 0x60, 0xd1, 0x05, 0x98, +0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x05, 0x90, 0x38, 0x78, 0xf0, 0x23, +0x18, 0x40, 0x58, 0xd1, 0xe0, 0x6a, 0xc0, 0x1b, 0x00, 0x09, 0x0c, 0x99, +0x88, 0x42, 0x02, 0xd2, 0xe0, 0x68, 0x02, 0x28, 0x05, 0xd3, 0xcb, 0x49, +0x88, 0x68, 0x00, 0xf0, 0x83, 0xff, 0x06, 0x1c, 0x06, 0xd1, 0x03, 0x9b, +0x28, 0x1c, 0x39, 0x1c, 0x22, 0x1c, 0x00, 0xf0, 0x8b, 0xfc, 0x16, 0xe1, +0x2e, 0x62, 0xf8, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0xb8, 0x89, 0x00, 0x28, +0x03, 0xd0, 0xc1, 0x49, 0xc9, 0x68, 0x00, 0xf0, 0x70, 0xff, 0xf8, 0x89, +0x00, 0x28, 0x03, 0xd0, 0xbd, 0x49, 0xc9, 0x68, 0x00, 0xf0, 0x69, 0xff, +0x7a, 0x68, 0xc0, 0x46, 0x72, 0x61, 0xb9, 0x68, 0xc0, 0x46, 0xb1, 0x61, +0x30, 0x1c, 0xb8, 0x49, 0x09, 0x68, 0x00, 0xf0, 0x5e, 0xff, 0x00, 0x28, +0x17, 0xd1, 0x30, 0x1c, 0xb4, 0x49, 0x49, 0x68, 0x00, 0xf0, 0x57, 0xff, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, -0x71, 0xfb, 0x07, 0x1c, 0x38, 0x78, 0x40, 0x07, 0x40, 0x0f, 0x03, 0x28, -0x00, 0xd1, 0xf8, 0xe6, 0xa8, 0x69, 0x03, 0x99, 0x01, 0xf0, 0x2a, 0xfa, -0x00, 0x28, 0x2a, 0xd1, 0x38, 0x1c, 0x21, 0x1c, -0x00, 0xf0, 0x79, 0xfb, 0xa8, 0x68, 0x80, 0x09, 0x04, 0xd3, 0x30, 0x1c, -0x49, 0x49, 0x49, 0x68, 0x00, 0xf0, 0x85, 0xfe, 0x41, 0x49, 0x00, 0x20, -0x01, 0xf0, 0x18, 0xfa, 0x00, 0x28, 0x04, 0xd1, 0x0e, 0x9b, 0x98, 0x6b, -0x01, 0x30, 0x98, 0x63, 0x11, 0xe0, 0x01, 0x20, 0x0f, 0x99, 0xc0, 0x46, -0x48, 0x71, 0x80, 0x06, 0x00, 0x27, 0x68, 0x60, 0xaf, 0x61, 0x3a, 0x4a, -0xc0, 0x46, 0x00, 0x92, 0x39, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x39, 0x4b, -0x00, 0x20, 0x01, 0xf0, 0xf7, 0xf9, 0x00, 0x20, 0x15, 0xe2, 0x05, 0x98, -0x0c, 0x99, 0x08, 0x1a, 0x00, 0x04, 0x00, 0x0c, 0x0c, 0x90, 0x0b, 0x90, -0x0c, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x20, 0x0f, 0x99, 0xc0, 0x46, -0x48, 0x71, 0x28, 0x68, 0xc0, 0x46, 0x04, 0x90, 0x00, 0x26, 0x00, 0x20, -0x08, 0x90, 0x00, 0x22, 0x0a, 0x92, 0x0c, 0x98, 0x01, 0x38, 0x0d, 0x90, -0xa3, 0xe0, 0x78, 0x88, 0x8a, 0x1b, 0x12, 0x04, 0x12, 0x0c, 0x90, 0x42, -0x05, 0xdd, 0x07, 0x92, 0x80, 0x1a, 0x00, 0x04, 0x00, 0x0c, 0x08, 0x90, -0x00, 0xe0, 0x07, 0x90, 0x08, 0x98, 0x00, 0x28, 0x07, 0xd1, 0x0d, 0x98, -0x0a, 0x9a, 0x90, 0x42, 0x07, 0xdd, 0x07, 0x98, 0x30, 0x18, 0x88, 0x42, -0x03, 0xd8, 0x01, 0x20, 0x40, 0x05, 0x06, 0x90, 0x1c, 0xe0, 0x11, 0x20, -0x40, 0x05, 0x06, 0x90, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, 0x02, 0xd1, -0x20, 0x48, 0xc0, 0x46, 0x06, 0x90, 0xb1, 0x07, 0x89, 0x0f, 0x0f, 0xd0, -0x07, 0x98, 0xc0, 0x06, 0xc0, 0x0e, 0x08, 0xd0, 0x1e, 0x28, 0x09, 0xdb, -0x1e, 0x28, 0x02, 0xd1, 0x03, 0x29, 0x05, 0xd1, 0x01, 0xe0, 0x02, 0x29, -0x02, 0xd3, 0x01, 0x20, 0x02, 0x90, 0xde, 0xe7, 0x0a, 0x9a, 0x00, 0x2a, -0x04, 0xd1, 0x01, 0x23, 0xdb, 0x05, 0x06, 0x98, 0x18, 0x43, 0x06, 0x90, -0x07, 0x98, 0x06, 0x99, 0x08, 0x43, 0x02, 0x1c, 0x00, 0x90, 0x04, 0x98, -0x83, 0x19, 0x1d, 0xe0, 0x68, 0x0e, 0x00, 0x80, 0x79, 0x48, 0xff, 0xff, -0xa8, 0x0e, 0x00, 0x80, 0x04, 0x00, 0x12, 0x02, 0xf8, 0x28, 0x00, 0x80, -0x44, 0x80, 0x20, 0x40, 0xe8, 0x18, 0x00, 0x80, 0xe0, 0x03, 0x00, 0x80, -0x00, 0x00, 0x00, 0x80, 0xc8, 0x2a, 0x00, 0x80, 0xc9, 0x31, 0xff, 0xff, -0x58, 0x5f, 0x21, 0x40, 0x81, 0x3c, 0xff, 0xff, 0x41, 0x31, 0xff, 0xff, -0x00, 0x00, 0x32, 0x02, 0x00, 0x20, 0x3a, 0x1d, 0x06, 0xca, 0x01, 0xf0, -0x6f, 0xf9, 0x07, 0x98, 0x36, 0x18, 0x02, 0x98, 0x00, 0x28, 0x16, 0xd0, -0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, 0x04, 0xd1, 0x09, 0x23, 0x5b, 0x04, -0x06, 0x98, 0x18, 0x43, 0x06, 0x90, 0x06, 0x98, 0xc2, 0x4a, 0x02, 0x43, -0x00, 0x92, 0x04, 0x98, 0x83, 0x19, 0xc1, 0x48, 0x01, 0x6d, 0x42, 0x6d, -0x00, 0x20, 0x01, 0xf0, 0x55, 0xf9, 0x00, 0x20, 0x02, 0x90, 0x08, 0x98, -0x00, 0x28, 0x0b, 0xd1, 0x0b, 0x9b, 0x01, 0x3b, 0x0b, 0x93, 0x10, 0x37, -0xe0, 0x6a, 0xb8, 0x42, 0x0c, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x8a, 0xfa, -0x07, 0x1c, 0x07, 0xe0, 0x78, 0x68, 0x07, 0x9a, 0x80, 0x18, 0x78, 0x60, -0x78, 0x88, 0x07, 0x9a, 0x80, 0x1a, 0x78, 0x80, 0x0a, 0x9a, 0x50, 0x1c, -0x02, 0x04, 0x12, 0x0c, 0x0a, 0x92, 0x0c, 0x98, 0x0a, 0x9a, 0x82, 0x42, -0x03, 0xda, 0xa9, 0x69, 0xb1, 0x42, 0x00, 0xd9, 0x53, 0xe7, 0xa8, 0x69, -0xb0, 0x42, 0x6b, 0xd1, 0xa8, 0x68, 0x01, 0x09, 0x69, 0xd2, 0x08, 0x9a, -0x00, 0x2a, 0x56, 0xd0, 0x0c, 0x99, 0x0a, 0x9a, 0x8a, 0x42, 0x3e, 0xdb, -0xb1, 0x07, 0x89, 0x0f, 0x0c, 0xd0, 0x08, 0x9a, -0xd2, 0x06, 0xd2, 0x0e, 0x0b, 0xd0, 0x1e, 0x2a, 0x06, 0xdb, 0x1e, 0x2a, -0x02, 0xd1, 0x03, 0x29, 0x05, 0xd0, 0x01, 0xe0, 0x02, 0x29, 0x02, 0xd2, -0x02, 0x99, 0x00, 0x29, 0x21, 0xd0, 0x08, 0x9a, 0xc0, 0x46, 0x00, 0x92, -0x04, 0x98, 0x83, 0x19, 0x00, 0x20, 0x3a, 0x1d, 0x06, 0xca, 0x01, 0xf0, -0x05, 0xf9, 0x08, 0x98, 0x36, 0x18, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, -0x02, 0xd0, 0x01, 0x20, 0x40, 0x06, 0x00, 0xe0, 0x92, 0x48, 0x01, 0x22, -0x02, 0x43, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, 0x8e, 0x48, 0x01, 0x6d, -0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, 0xf0, 0xf8, 0x00, 0x20, 0x02, 0x90, -0x15, 0xe0, 0x8c, 0x23, 0x18, 0x40, 0x02, 0xd0, 0x01, 0x20, 0x40, 0x06, -0x00, 0xe0, 0x88, 0x48, 0x08, 0x9a, 0x02, 0x43, 0x00, 0xe0, 0x08, 0x9a, +0x27, 0xfc, 0x07, 0x1c, 0x68, 0x68, 0xaf, 0x4b, 0x18, 0x43, 0x68, 0x60, +0x00, 0x20, 0xa8, 0x61, 0xac, 0x23, 0xa8, 0x68, 0x98, 0x43, 0xa8, 0x60, +0xb0, 0xe0, 0xa8, 0x69, 0xa8, 0x28, 0x01, 0xd2, 0xa8, 0x20, 0xa8, 0x61, +0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x6c, 0xd8, 0x9c, 0xe0, 0xa5, 0xe0, +0xa4, 0xe0, 0x10, 0x28, 0x68, 0xd1, 0x03, 0x23, 0x1b, 0x07, 0x68, 0x68, +0x18, 0x40, 0x01, 0x0f, 0x48, 0x01, 0x40, 0x1a, 0x80, 0x00, 0xa0, 0x4a, +0x82, 0x18, 0x01, 0x92, 0x78, 0x88, 0x42, 0x0b, 0x31, 0xd3, 0x82, 0x0b, +0x2f, 0xd3, 0x9d, 0x48, 0xc0, 0x46, 0x03, 0x90, 0x02, 0x20, 0x01, 0x9a, +0xc0, 0x46, 0x10, 0x80, 0x78, 0x88, 0x00, 0x05, 0x00, 0x0d, 0x01, 0x9a, +0xc0, 0x46, 0x50, 0x60, 0xb8, 0x68, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x60, +0x78, 0x68, 0x01, 0x9a, 0xc0, 0x46, 0x10, 0x62, 0x00, 0x20, 0x01, 0x9a, +0xc0, 0x46, 0x90, 0x64, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x63, 0x88, 0x02, +0x8f, 0x49, 0x40, 0x18, 0x01, 0x9a, 0xc0, 0x46, 0x50, 0x63, 0x01, 0x9a, +0x50, 0x68, 0x36, 0x30, 0x94, 0x28, 0x01, 0xd8, 0x38, 0x20, 0x00, 0xe0, +0x94, 0x20, 0xa8, 0x61, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x28, 0xd8, +0x58, 0xe0, 0x7a, 0x88, 0x92, 0x0b, 0x03, 0xd3, 0x85, 0x48, 0xc0, 0x46, +0x03, 0x90, 0x23, 0xe0, 0x01, 0x22, 0x12, 0x03, 0x02, 0x40, 0x83, 0x4b, +0x1d, 0xd0, 0x03, 0x93, 0x00, 0x05, 0x00, 0x0d, 0x01, 0x9a, 0xc0, 0x46, +0x50, 0x60, 0xb8, 0x68, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x60, 0x78, 0x68, +0x01, 0x9a, 0xc0, 0x46, 0x10, 0x62, 0x00, 0x20, 0x01, 0x9a, 0xc0, 0x46, +0x90, 0x64, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x63, 0x88, 0x02, 0x75, 0x49, +0x40, 0x18, 0x01, 0x9a, 0xc0, 0x46, 0x50, 0x63, +0x02, 0xe0, 0x33, 0xe0, 0x2a, 0xe0, 0x03, 0x93, 0x01, 0x20, 0x0f, 0x99, +0xc0, 0x46, 0x48, 0x71, 0x12, 0x9a, 0x50, 0x78, 0x05, 0x99, 0x43, 0x1a, +0x0b, 0x93, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, +0x00, 0xf0, 0x92, 0xfb, 0x07, 0x1c, 0x01, 0x9a, 0x50, 0x6b, 0x91, 0x6b, +0x09, 0x01, 0x40, 0x18, 0x0b, 0x9b, 0x21, 0x1c, 0x3a, 0x1c, 0xff, 0xf7, +0x7d, 0xfb, 0x01, 0x9a, 0xc0, 0x46, 0xd0, 0x64, 0x01, 0x9a, 0x0b, 0x9b, +0xc0, 0x46, 0x13, 0x65, 0x01, 0x23, 0x5b, 0x06, 0x68, 0x68, 0x18, 0x43, +0x68, 0x60, 0x00, 0x20, 0xa8, 0x61, 0x0d, 0xe0, 0x10, 0x37, 0xe0, 0x6a, +0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x71, 0xfb, 0x07, 0x1c, +0x38, 0x78, 0x40, 0x07, 0x40, 0x0f, 0x03, 0x28, 0x00, 0xd1, 0xf8, 0xe6, +0xa8, 0x69, 0x03, 0x99, 0x01, 0xf0, 0x26, 0xfa, 0x00, 0x28, 0x2a, 0xd1, +0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0x79, 0xfb, 0xa8, 0x68, 0x80, 0x09, +0x04, 0xd3, 0x30, 0x1c, 0x49, 0x49, 0x49, 0x68, 0x00, 0xf0, 0x81, 0xfe, +0x41, 0x49, 0x00, 0x20, 0x01, 0xf0, 0x14, 0xfa, 0x00, 0x28, 0x04, 0xd1, +0x0e, 0x9b, 0xd8, 0x6b, 0x01, 0x30, 0xd8, 0x63, 0x11, 0xe0, 0x01, 0x20, +0x0f, 0x99, 0xc0, 0x46, 0x48, 0x71, 0x80, 0x06, 0x00, 0x27, 0x68, 0x60, +0xaf, 0x61, 0x3a, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x39, 0x48, 0x01, 0x6d, +0x42, 0x6d, 0x39, 0x4b, 0x00, 0x20, 0x01, 0xf0, 0xf3, 0xf9, 0x00, 0x20, +0x15, 0xe2, 0x05, 0x98, 0x0c, 0x99, 0x08, 0x1a, 0x00, 0x04, 0x00, 0x0c, +0x0c, 0x90, 0x0b, 0x90, 0x0c, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x20, +0x0f, 0x99, 0xc0, 0x46, 0x48, 0x71, 0x28, 0x68, 0xc0, 0x46, 0x04, 0x90, +0x00, 0x26, 0x00, 0x20, 0x08, 0x90, 0x00, 0x22, 0x0a, 0x92, 0x0c, 0x98, +0x01, 0x38, 0x0d, 0x90, 0xa3, 0xe0, 0x78, 0x88, 0x8a, 0x1b, 0x12, 0x04, +0x12, 0x0c, 0x90, 0x42, 0x05, 0xdd, 0x07, 0x92, 0x80, 0x1a, 0x00, 0x04, +0x00, 0x0c, 0x08, 0x90, 0x00, 0xe0, 0x07, 0x90, 0x08, 0x98, 0x00, 0x28, +0x07, 0xd1, 0x0d, 0x98, 0x0a, 0x9a, 0x90, 0x42, 0x07, 0xdd, 0x07, 0x98, +0x30, 0x18, 0x88, 0x42, 0x03, 0xd8, 0x01, 0x20, 0x40, 0x05, 0x06, 0x90, +0x1c, 0xe0, 0x11, 0x20, 0x40, 0x05, 0x06, 0x90, 0xa8, 0x68, 0x8c, 0x23, +0x18, 0x40, 0x02, 0xd1, 0x20, 0x48, 0xc0, 0x46, 0x06, 0x90, 0xb1, 0x07, +0x89, 0x0f, 0x0f, 0xd0, 0x07, 0x98, 0xc0, 0x06, 0xc0, 0x0e, 0x08, 0xd0, +0x1e, 0x28, 0x09, 0xdb, 0x1e, 0x28, 0x02, 0xd1, 0x03, 0x29, 0x05, 0xd1, +0x01, 0xe0, 0x02, 0x29, 0x02, 0xd3, 0x01, 0x20, 0x02, 0x90, 0xde, 0xe7, +0x0a, 0x9a, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x23, 0xdb, 0x05, 0x06, 0x98, +0x18, 0x43, 0x06, 0x90, 0x07, 0x98, 0x06, 0x99, 0x08, 0x43, 0x02, 0x1c, +0x00, 0x90, 0x04, 0x98, 0x83, 0x19, 0x1d, 0xe0, 0xe8, 0x0e, 0x00, 0x80, +0xed, 0x48, 0xff, 0xff, 0x28, 0x0f, 0x00, 0x80, 0x04, 0x00, 0x12, 0x02, +0x7c, 0x29, 0x00, 0x80, 0x44, 0x80, 0x20, 0x40, 0x68, 0x19, 0x00, 0x80, +0x60, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x5c, 0x2b, 0x00, 0x80, +0x41, 0x32, 0xff, 0xff, 0x58, 0x5f, 0x21, 0x40, 0xf9, 0x3c, 0xff, 0xff, +0xb9, 0x31, 0xff, 0xff, 0x00, 0x00, 0x32, 0x02, 0x00, 0x20, 0x3a, 0x1d, +0x06, 0xca, 0x01, 0xf0, 0x6b, 0xf9, 0x07, 0x98, 0x36, 0x18, 0x02, 0x98, +0x00, 0x28, 0x16, 0xd0, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, 0x04, 0xd1, +0x09, 0x23, 0x5b, 0x04, 0x06, 0x98, 0x18, 0x43, +0x06, 0x90, 0x06, 0x98, 0xc2, 0x4a, 0x02, 0x43, 0x00, 0x92, 0x04, 0x98, +0x83, 0x19, 0xc1, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, +0x51, 0xf9, 0x00, 0x20, 0x02, 0x90, 0x08, 0x98, 0x00, 0x28, 0x0b, 0xd1, +0x0b, 0x9b, 0x01, 0x3b, 0x0b, 0x93, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, +0x0c, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x8a, 0xfa, 0x07, 0x1c, 0x07, 0xe0, +0x78, 0x68, 0x07, 0x9a, 0x80, 0x18, 0x78, 0x60, 0x78, 0x88, 0x07, 0x9a, +0x80, 0x1a, 0x78, 0x80, 0x0a, 0x9a, 0x50, 0x1c, 0x02, 0x04, 0x12, 0x0c, +0x0a, 0x92, 0x0c, 0x98, 0x0a, 0x9a, 0x82, 0x42, 0x03, 0xda, 0xa9, 0x69, +0xb1, 0x42, 0x00, 0xd9, 0x53, 0xe7, 0xa8, 0x69, 0xb0, 0x42, 0x6b, 0xd1, +0xa8, 0x68, 0x01, 0x09, 0x69, 0xd2, 0x08, 0x9a, 0x00, 0x2a, 0x56, 0xd0, +0x0c, 0x99, 0x0a, 0x9a, 0x8a, 0x42, 0x3e, 0xdb, 0xb1, 0x07, 0x89, 0x0f, +0x0c, 0xd0, 0x08, 0x9a, 0xd2, 0x06, 0xd2, 0x0e, 0x0b, 0xd0, 0x1e, 0x2a, +0x06, 0xdb, 0x1e, 0x2a, 0x02, 0xd1, 0x03, 0x29, 0x05, 0xd0, 0x01, 0xe0, +0x02, 0x29, 0x02, 0xd2, 0x02, 0x99, 0x00, 0x29, 0x21, 0xd0, 0x08, 0x9a, 0xc0, 0x46, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, 0x00, 0x20, 0x3a, 0x1d, -0x06, 0xca, 0x01, 0xf0, 0xd9, 0xf8, 0x08, 0x98, 0x36, 0x18, 0x10, 0x37, -0xe0, 0x6a, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0x14, 0xfa, -0x07, 0x1c, 0x68, 0x68, 0x80, 0x0e, 0x6b, 0xd2, 0x0a, 0x98, 0xc0, 0x46, -0x09, 0x90, 0x0c, 0x99, 0x88, 0x42, 0x5c, 0xda, 0x0d, 0x98, 0x09, 0x99, -0x88, 0x42, 0x03, 0xd0, 0x7a, 0x88, 0x1e, 0xe0, 0x5f, 0xe0, 0x5e, 0xe0, -0x78, 0x88, 0x01, 0x22, 0x52, 0x06, 0x02, 0x43, 0xa9, 0x68, 0x8c, 0x23, -0x19, 0x40, 0x02, 0xd1, 0x09, 0x23, 0x5b, 0x04, 0x1a, 0x43, 0xb1, 0x07, -0x89, 0x0f, 0x0e, 0xd0, 0xc3, 0x06, 0xdb, 0x0e, 0x08, 0xd0, 0x1e, 0x2b, -0x09, 0xdb, 0x1e, 0x2b, 0x02, 0xd1, 0x03, 0x29, 0x05, 0xd1, 0x01, 0xe0, -0x02, 0x29, 0x02, 0xd3, 0x01, 0x21, 0x02, 0x91, 0x02, 0x1c, 0x09, 0x98, -0x00, 0x28, 0x02, 0xd1, 0x01, 0x23, 0xdb, 0x05, 0x1a, 0x43, 0x00, 0x92, -0x04, 0x98, 0x83, 0x19, 0x00, 0x20, 0x3a, 0x1d, 0x06, 0xca, 0x01, 0xf0, -0x93, 0xf8, 0x78, 0x88, 0x86, 0x19, 0x10, 0x37, 0x02, 0x98, 0x00, 0x28, -0x14, 0xd0, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, 0x02, 0xd0, 0x01, 0x20, -0x40, 0x06, 0x00, 0xe0, 0x57, 0x48, 0x01, 0x22, 0x02, 0x43, 0x00, 0x92, -0x04, 0x98, 0x83, 0x19, 0x53, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, -0x01, 0xf0, 0x7a, 0xf8, 0x00, 0x20, 0x02, 0x90, 0xe0, 0x6a, 0xb8, 0x42, -0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, 0x07, 0x1c, 0x09, 0x98, -0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x09, 0x90, 0x0c, 0x99, 0x88, 0x42, -0xa2, 0xdb, 0x68, 0x68, 0x30, 0x43, 0x01, 0x04, 0x09, 0x0c, 0x68, 0x60, -0xe8, 0x6a, 0x00, 0xf0, 0x7b, 0xfa, 0x28, 0xe0, 0x27, 0xe0, 0xa8, 0x68, -0x00, 0x09, 0x14, 0xd3, 0x68, 0x68, 0x80, 0x0e, 0x15, 0xd2, 0x01, 0x9a, -0x00, 0x2a, 0x12, 0xd0, 0x01, 0x9a, 0x50, 0x6b, 0x0b, 0x9b, 0x21, 0x1c, -0x3a, 0x1c, 0xff, 0xf7, 0x87, 0xf9, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x64, -0x01, 0x9a, 0x0b, 0x9b, 0xc0, 0x46, 0x93, 0x63, 0x03, 0xe0, 0xe8, 0x6a, -0x31, 0x1c, 0x00, 0xf0, 0x5d, 0xfa, 0x68, 0x68, 0x30, 0x43, 0x68, 0x60, -0xa8, 0x69, 0xb0, 0x42, 0x05, 0xd9, 0x00, 0x04, 0x00, 0x0c, 0x80, 0x1b, -0x00, 0xf0, 0xee, 0xf9, 0xae, 0x61, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, -0x0b, 0xd0, 0x2f, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x04, 0x98, 0xc3, 0x1f, -0x05, 0x3b, 0x2a, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, -0x27, 0xf8, 0x01, 0x23, 0x9b, 0x07, 0x20, 0x6d, 0x18, 0x43, 0x00, 0x68, -0xc0, 0x46, 0xa0, 0x61, 0xe1, 0x69, 0x81, 0x42, -0x12, 0xd0, 0x22, 0x69, 0x02, 0x2a, 0x0f, 0xd2, 0x41, 0x1a, 0x01, 0xd5, -0x60, 0x6d, 0x41, 0x18, 0x20, 0x1c, 0xff, 0xf7, 0x3f, 0xfb, 0xe1, 0x69, -0x40, 0x18, 0xe0, 0x61, 0x61, 0x6d, 0x88, 0x42, 0x24, 0xd3, 0x40, 0x1a, -0xe0, 0x61, 0x21, 0xe0, 0x81, 0x42, 0x1f, 0xd1, 0x20, 0x69, 0x02, 0x28, -0x1c, 0xd2, 0x01, 0x20, 0x60, 0x61, 0x18, 0x48, 0x41, 0x69, 0xe2, 0x6c, -0x0a, 0x43, 0x42, 0x61, 0x81, 0x69, 0xe3, 0x6c, 0x99, 0x43, 0x81, 0x61, -0x01, 0x21, 0x09, 0x05, 0xca, 0x60, 0x80, 0x69, 0xc0, 0x46, 0x08, 0x61, -0x8b, 0x02, 0x20, 0x6d, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xa0, 0x61, -0xe1, 0x69, 0x81, 0x42, 0x02, 0xd0, 0x20, 0x1c, 0xff, 0xf7, 0xce, 0xfa, -0x28, 0x1c, 0x00, 0xf0, 0x0f, 0xf9, 0x0c, 0x98, 0x05, 0x99, 0x40, 0x18, -0x00, 0x01, 0x10, 0x30, 0x68, 0x61, 0x13, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xf8, 0x28, 0x00, 0x80, -0x00, 0x00, 0x12, 0x02, 0x04, 0x00, 0x52, 0x02, 0xe8, 0x0d, 0x00, 0x80, -0xf0, 0xb5, 0x40, 0x20, 0x2d, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x00, 0xf0, -0x03, 0xf9, 0x07, 0x1c, 0x81, 0x69, 0x44, 0x6a, 0xa0, 0x6f, 0x00, 0xf0, -0x49, 0xfe, 0x00, 0x20, 0xe1, 0x1d, 0x19, 0x31, 0x48, 0x71, 0x79, 0x68, -0xc9, 0x0e, 0x09, 0xd3, 0xf8, 0x6a, 0x00, 0x01, 0x24, 0x49, 0x40, 0x18, -0x24, 0x4b, 0xc0, 0x18, 0x01, 0x68, 0x01, 0x39, 0x01, 0x60, 0x36, 0xe0, -0xe1, 0x6d, 0x09, 0x68, 0x22, 0x6e, 0xc0, 0x46, 0x11, 0x60, 0x20, 0x4e, -0xf5, 0x1d, 0x79, 0x35, 0x01, 0x23, 0xa9, 0x6b, 0x19, 0x43, 0xa9, 0x63, -0xb9, 0x6a, 0xe2, 0x6d, 0xc0, 0x46, 0x11, 0x60, 0xb9, 0x6a, 0x22, 0x6e, -0xc0, 0x46, 0x11, 0x60, 0x61, 0x69, 0x00, 0x29, 0x04, 0xd1, 0x69, 0x6b, -0x01, 0x31, 0x69, 0x63, 0x08, 0x29, 0x07, 0xd3, 0x68, 0x63, 0x01, 0x20, -0x00, 0xf0, 0x86, 0xf8, 0xa8, 0x6b, 0x40, 0x08, 0x40, 0x00, 0xa8, 0x63, -0x78, 0x68, 0x81, 0x0e, 0x0f, 0xd2, 0x0b, 0x23, 0x1b, 0x02, 0xf1, 0x18, -0x89, 0x68, 0x00, 0x29, 0x06, 0xd0, 0x00, 0x08, 0x04, 0xd2, 0x20, 0x1c, -0x39, 0x1c, 0x00, 0xf0, 0x43, 0xf8, 0x02, 0xe0, 0x38, 0x1c, 0x00, 0xf0, -0x05, 0xfa, 0x38, 0x1c, 0xfb, 0xf7, 0x4a, 0xfc, 0x20, 0x1c, 0x00, 0xf0, -0x0b, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb0, -0x1c, 0x1c, 0x00, 0x80, 0xb4, 0x0c, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0x80, 0xb5, 0x07, 0x1c, 0xf8, 0x1d, 0x19, 0x30, 0x01, 0x79, 0x00, 0x29, -0x04, 0xd0, 0x00, 0x21, 0x01, 0x71, 0x38, 0x1c, 0xff, 0xf7, 0x56, 0xfb, -0xf8, 0x68, 0x02, 0x28, 0x0d, 0xd0, 0xb8, 0x68, 0x80, 0x00, 0xc2, 0x19, -0x50, 0x6c, 0x00, 0x28, 0x11, 0xd0, 0xb8, 0x6a, 0x41, 0x78, 0x09, 0x01, -0x10, 0x31, 0x52, 0x6b, 0x10, 0x1a, 0x88, 0x42, 0x05, 0xd3, 0x38, 0x1c, -0xff, 0xf7, 0x42, 0xfb, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, -0xff, 0xf7, 0x2a, 0xfa, 0xf8, 0xe7, 0x78, 0x68, 0x80, 0x00, 0xc0, 0x19, -0xc0, 0x6b, 0xc0, 0x46, 0xb8, 0x62, 0xf1, 0xe7, 0xb0, 0xb5, 0x87, 0xb0, -0x0f, 0x1c, 0x80, 0x6f, 0xc0, 0x46, 0x00, 0x90, 0x00, 0x24, 0x13, 0x4d, -0x0b, 0x23, 0x1b, 0x02, 0xe8, 0x18, 0x40, 0x69, 0x00, 0x28, 0x17, 0xd0, -0x69, 0x46, 0xa2, 0x00, 0x52, 0x19, 0x0b, 0x23, 0x1b, 0x02, 0xd2, 0x18, -0x52, 0x69, 0x38, 0x1c, 0x00, 0xf0, 0x96, 0xfb, 0x00, 0x28, 0x09, 0xd1, -0x01, 0x34, 0xa0, 0x00, 0x40, 0x19, 0x0b, 0x23, -0x1b, 0x02, 0xc0, 0x18, 0x40, 0x69, 0x00, 0x28, 0xea, 0xd1, 0x01, 0xe0, -0x01, 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x9d, 0xf9, 0x07, 0xb0, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0xb8, 0xb5, 0xc2, 0x07, 0xd2, 0x0f, 0x16, 0x4c, 0x16, 0x49, 0x01, 0xd0, -0x08, 0x22, 0x08, 0xe0, 0x82, 0x08, 0x05, 0xd3, 0x0c, 0x22, 0xa4, 0x18, -0x0b, 0x68, 0xdf, 0x1d, 0x15, 0x37, 0x03, 0xe0, 0x1c, 0x22, 0x0b, 0x68, -0xdf, 0x1d, 0x09, 0x37, 0x0f, 0x4b, 0x1d, 0x7b, 0x00, 0x2d, 0x13, 0xd0, -0x5b, 0x7b, 0x00, 0x2b, 0x10, 0xd0, 0x01, 0x23, 0x5b, 0x06, 0x1a, 0x43, -0x00, 0x28, 0x01, 0xd1, 0x5b, 0x08, 0x1a, 0x43, 0x00, 0x92, 0x4a, 0x68, -0x01, 0x20, 0x39, 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0xe3, 0xfe, 0xb8, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x03, 0x23, 0x1b, 0x06, 0x1a, 0x43, 0xf1, 0xe7, -0x3c, 0xef, 0x20, 0x40, 0xf8, 0x28, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, -0x00, 0x21, 0xc1, 0x61, 0x05, 0x49, 0x4a, 0x68, 0x00, 0x2a, 0x01, 0xd1, -0x48, 0x60, 0x02, 0xe0, 0x8a, 0x68, 0xc0, 0x46, 0xd0, 0x61, 0x88, 0x60, -0x70, 0x47, 0x00, 0x00, 0xa8, 0x0e, 0x00, 0x80, 0x03, 0x49, 0x48, 0x68, -0x00, 0x28, 0x02, 0xd0, 0xc2, 0x69, 0xc0, 0x46, 0x4a, 0x60, 0x70, 0x47, -0xa8, 0x0e, 0x00, 0x80, 0x01, 0x1c, 0x01, 0x23, 0x88, 0x68, 0x58, 0x40, -0x88, 0x60, 0xca, 0x68, 0x01, 0x3a, 0xca, 0x60, 0x0a, 0x69, 0x01, 0x3a, -0x80, 0x00, 0x0a, 0x61, 0x42, 0x18, 0xd0, 0x6b, 0x53, 0x6b, 0xc0, 0x46, -0xcb, 0x62, 0x0b, 0x68, 0x9b, 0x00, 0x59, 0x18, 0x49, 0x6c, 0x53, 0x6c, -0xc9, 0x18, 0x51, 0x64, 0x70, 0x47, 0x8a, 0x68, 0x92, 0x00, 0x52, 0x18, -0xd3, 0x6b, 0x83, 0x42, 0x17, 0xd1, 0xd0, 0x1d, 0x3d, 0x30, 0x0a, 0x68, -0x92, 0x00, 0x52, 0x18, 0x52, 0x6c, 0x03, 0x68, 0x9a, 0x1a, 0x02, 0x60, -0x01, 0x23, 0x88, 0x68, 0x58, 0x40, 0x88, 0x60, 0xca, 0x68, 0x01, 0x32, -0xca, 0x60, 0x0a, 0x69, 0x01, 0x32, 0x80, 0x00, 0x40, 0x18, 0x0a, 0x61, -0x40, 0x6b, 0xc0, 0x46, 0xc8, 0x62, 0x70, 0x47, 0xb8, 0xb5, 0x04, 0x1c, -0x1d, 0x1c, 0x17, 0x1c, 0x08, 0x1c, 0x39, 0x1c, 0xff, 0xf7, 0xd9, 0xff, -0x00, 0x20, 0x29, 0x1c, 0x00, 0xf0, 0x80, 0xfe, 0x01, 0x20, 0xf9, 0x1d, -0x19, 0x31, 0x48, 0x71, 0x80, 0x06, 0x60, 0x60, 0x00, 0x20, 0xa0, 0x61, -0x06, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x06, 0x48, 0x01, 0x6d, 0x42, 0x6d, -0x05, 0x4b, 0x00, 0x20, 0x00, 0xf0, 0x66, 0xfe, 0xb8, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x04, 0x00, 0x12, 0x02, 0xf8, 0x28, 0x00, 0x80, -0x44, 0x80, 0x20, 0x40, 0x06, 0x49, 0x0a, 0x68, 0x10, 0x18, 0x08, 0x60, +0x06, 0xca, 0x01, 0xf0, 0x01, 0xf9, 0x08, 0x98, 0x36, 0x18, 0xa8, 0x68, +0x8c, 0x23, 0x18, 0x40, 0x02, 0xd0, 0x01, 0x20, 0x40, 0x06, 0x00, 0xe0, +0x92, 0x48, 0x01, 0x22, 0x02, 0x43, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, +0x8e, 0x48, 0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, 0xec, 0xf8, +0x00, 0x20, 0x02, 0x90, 0x15, 0xe0, 0x8c, 0x23, 0x18, 0x40, 0x02, 0xd0, +0x01, 0x20, 0x40, 0x06, 0x00, 0xe0, 0x88, 0x48, 0x08, 0x9a, 0x02, 0x43, +0x00, 0xe0, 0x08, 0x9a, 0xc0, 0x46, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, +0x00, 0x20, 0x3a, 0x1d, 0x06, 0xca, 0x01, 0xf0, 0xd5, 0xf8, 0x08, 0x98, +0x36, 0x18, 0x10, 0x37, 0xe0, 0x6a, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, +0x00, 0xf0, 0x14, 0xfa, 0x07, 0x1c, 0x68, 0x68, 0x80, 0x0e, 0x6b, 0xd2, +0x0a, 0x98, 0xc0, 0x46, 0x09, 0x90, 0x0c, 0x99, 0x88, 0x42, 0x5c, 0xda, +0x0d, 0x98, 0x09, 0x99, 0x88, 0x42, 0x03, 0xd0, 0x7a, 0x88, 0x1e, 0xe0, +0x5f, 0xe0, 0x5e, 0xe0, 0x78, 0x88, 0x01, 0x22, 0x52, 0x06, 0x02, 0x43, +0xa9, 0x68, 0x8c, 0x23, 0x19, 0x40, 0x02, 0xd1, 0x09, 0x23, 0x5b, 0x04, +0x1a, 0x43, 0xb1, 0x07, 0x89, 0x0f, 0x0e, 0xd0, 0xc3, 0x06, 0xdb, 0x0e, +0x08, 0xd0, 0x1e, 0x2b, 0x09, 0xdb, 0x1e, 0x2b, 0x02, 0xd1, 0x03, 0x29, +0x05, 0xd1, 0x01, 0xe0, 0x02, 0x29, 0x02, 0xd3, 0x01, 0x21, 0x02, 0x91, +0x02, 0x1c, 0x09, 0x98, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x23, 0xdb, 0x05, +0x1a, 0x43, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, 0x00, 0x20, 0x3a, 0x1d, +0x06, 0xca, 0x01, 0xf0, 0x8f, 0xf8, 0x78, 0x88, 0x86, 0x19, 0x10, 0x37, +0x02, 0x98, 0x00, 0x28, 0x14, 0xd0, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, +0x02, 0xd0, 0x01, 0x20, 0x40, 0x06, 0x00, 0xe0, 0x57, 0x48, 0x01, 0x22, +0x02, 0x43, 0x00, 0x92, 0x04, 0x98, 0x83, 0x19, 0x53, 0x48, 0x01, 0x6d, +0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, 0x76, 0xf8, 0x00, 0x20, 0x02, 0x90, +0xe0, 0x6a, 0xb8, 0x42, 0x03, 0xd8, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, +0x07, 0x1c, 0x09, 0x98, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x09, 0x90, +0x0c, 0x99, 0x88, 0x42, 0xa2, 0xdb, 0x68, 0x68, 0x30, 0x43, 0x01, 0x04, +0x09, 0x0c, 0x68, 0x60, 0xe8, 0x6a, 0x00, 0xf0, +0x7b, 0xfa, 0x28, 0xe0, 0x27, 0xe0, 0xa8, 0x68, 0x00, 0x09, 0x14, 0xd3, +0x68, 0x68, 0x80, 0x0e, 0x15, 0xd2, 0x01, 0x9a, 0x00, 0x2a, 0x12, 0xd0, +0x01, 0x9a, 0x50, 0x6b, 0x0b, 0x9b, 0x21, 0x1c, 0x3a, 0x1c, 0xff, 0xf7, +0x89, 0xf9, 0x01, 0x9a, 0xc0, 0x46, 0x90, 0x64, 0x01, 0x9a, 0x0b, 0x9b, +0xc0, 0x46, 0x93, 0x63, 0x03, 0xe0, 0xe8, 0x6a, 0x31, 0x1c, 0x00, 0xf0, +0x5d, 0xfa, 0x68, 0x68, 0x30, 0x43, 0x68, 0x60, 0xa8, 0x69, 0xb0, 0x42, +0x05, 0xd9, 0x00, 0x04, 0x00, 0x0c, 0x80, 0x1b, 0x00, 0xf0, 0xee, 0xf9, +0xae, 0x61, 0xa8, 0x68, 0x8c, 0x23, 0x18, 0x40, 0x0b, 0xd0, 0x2f, 0x4a, +0xc0, 0x46, 0x00, 0x92, 0x04, 0x98, 0xc3, 0x1f, 0x05, 0x3b, 0x2a, 0x48, +0x01, 0x6d, 0x42, 0x6d, 0x00, 0x20, 0x01, 0xf0, 0x23, 0xf8, 0x01, 0x23, +0x9b, 0x07, 0x20, 0x6d, 0x18, 0x43, 0x00, 0x68, 0xc0, 0x46, 0xa0, 0x61, +0xe1, 0x69, 0x81, 0x42, 0x12, 0xd0, 0x22, 0x69, 0x02, 0x2a, 0x0f, 0xd2, +0x41, 0x1a, 0x01, 0xd5, 0x60, 0x6d, 0x41, 0x18, 0x20, 0x1c, 0xff, 0xf7, +0x3f, 0xfb, 0xe1, 0x69, 0x40, 0x18, 0xe0, 0x61, 0x61, 0x6d, 0x88, 0x42, +0x24, 0xd3, 0x40, 0x1a, 0xe0, 0x61, 0x21, 0xe0, 0x81, 0x42, 0x1f, 0xd1, +0x20, 0x69, 0x02, 0x28, 0x1c, 0xd2, 0x01, 0x20, 0x60, 0x61, 0x18, 0x48, +0x41, 0x69, 0xe2, 0x6c, 0x0a, 0x43, 0x42, 0x61, 0x81, 0x69, 0xe3, 0x6c, +0x99, 0x43, 0x81, 0x61, 0x01, 0x21, 0x09, 0x05, 0xca, 0x60, 0x80, 0x69, +0xc0, 0x46, 0x08, 0x61, 0x8b, 0x02, 0x20, 0x6d, 0x18, 0x43, 0x00, 0x68, +0xc0, 0x46, 0xa0, 0x61, 0xe1, 0x69, 0x81, 0x42, 0x02, 0xd0, 0x20, 0x1c, +0xff, 0xf7, 0xcc, 0xfa, 0x28, 0x1c, 0x00, 0xf0, 0x0f, 0xf9, 0x0c, 0x98, +0x05, 0x99, 0x40, 0x18, 0x00, 0x01, 0x10, 0x30, 0x68, 0x61, 0x13, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, +0x7c, 0x29, 0x00, 0x80, 0x00, 0x00, 0x12, 0x02, 0x04, 0x00, 0x52, 0x02, +0x68, 0x0e, 0x00, 0x80, 0xf0, 0xb5, 0x40, 0x20, 0x2d, 0x49, 0xc0, 0x46, +0x08, 0x60, 0x00, 0xf0, 0x03, 0xf9, 0x07, 0x1c, 0x81, 0x69, 0x44, 0x6a, +0xa0, 0x6f, 0x00, 0xf0, 0x45, 0xfe, 0x00, 0x20, 0xe1, 0x1d, 0x19, 0x31, +0x48, 0x71, 0x79, 0x68, 0xc9, 0x0e, 0x09, 0xd3, 0xf8, 0x6a, 0x00, 0x01, +0x24, 0x49, 0x40, 0x18, 0x24, 0x4b, 0xc0, 0x18, 0x01, 0x68, 0x01, 0x39, +0x01, 0x60, 0x36, 0xe0, 0xe1, 0x6d, 0x09, 0x68, 0x22, 0x6e, 0xc0, 0x46, +0x11, 0x60, 0x20, 0x4e, 0xf5, 0x1d, 0x79, 0x35, 0x01, 0x23, 0xe9, 0x6b, +0x19, 0x43, 0xe9, 0x63, 0xb9, 0x6a, 0xe2, 0x6d, 0xc0, 0x46, 0x11, 0x60, +0xb9, 0x6a, 0x22, 0x6e, 0xc0, 0x46, 0x11, 0x60, 0x61, 0x69, 0x00, 0x29, +0x04, 0xd1, 0xa9, 0x6b, 0x01, 0x31, 0xa9, 0x63, 0x08, 0x29, 0x07, 0xd3, +0xa8, 0x63, 0x01, 0x20, 0x00, 0xf0, 0x86, 0xf8, 0xe8, 0x6b, 0x40, 0x08, +0x40, 0x00, 0xe8, 0x63, 0x78, 0x68, 0x81, 0x0e, 0x0f, 0xd2, 0x0b, 0x23, +0x1b, 0x02, 0xf1, 0x18, 0xc9, 0x68, 0x00, 0x29, 0x06, 0xd0, 0x00, 0x08, +0x04, 0xd2, 0x20, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x43, 0xf8, 0x02, 0xe0, +0x38, 0x1c, 0x00, 0xf0, 0x05, 0xfa, 0x38, 0x1c, 0xfb, 0xf7, 0x10, 0xfc, +0x20, 0x1c, 0x00, 0xf0, 0x0b, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x00, 0x00, 0x00, 0xb0, 0xa0, 0x1c, 0x00, 0x80, 0xb4, 0x0c, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x07, 0x1c, 0xf8, 0x1d, 0x19, 0x30, +0x01, 0x79, 0x00, 0x29, 0x04, 0xd0, 0x00, 0x21, +0x01, 0x71, 0x38, 0x1c, 0xff, 0xf7, 0x56, 0xfb, 0xf8, 0x68, 0x02, 0x28, +0x0d, 0xd0, 0xb8, 0x68, 0x80, 0x00, 0xc2, 0x19, 0x50, 0x6c, 0x00, 0x28, +0x11, 0xd0, 0xb8, 0x6a, 0x41, 0x78, 0x09, 0x01, 0x10, 0x31, 0x52, 0x6b, +0x10, 0x1a, 0x88, 0x42, 0x05, 0xd3, 0x38, 0x1c, 0xff, 0xf7, 0x42, 0xfb, +0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xff, 0xf7, 0x28, 0xfa, +0xf8, 0xe7, 0x78, 0x68, 0x80, 0x00, 0xc0, 0x19, 0xc0, 0x6b, 0xc0, 0x46, +0xb8, 0x62, 0xf1, 0xe7, 0xb0, 0xb5, 0x87, 0xb0, 0x0f, 0x1c, 0x80, 0x6f, +0xc0, 0x46, 0x00, 0x90, 0x00, 0x24, 0x13, 0x4d, 0x0b, 0x23, 0x1b, 0x02, +0xe8, 0x18, 0x80, 0x69, 0x00, 0x28, 0x17, 0xd0, 0x69, 0x46, 0xa2, 0x00, +0x52, 0x19, 0x0b, 0x23, 0x1b, 0x02, 0xd2, 0x18, 0x92, 0x69, 0x38, 0x1c, +0x00, 0xf0, 0x92, 0xfb, 0x00, 0x28, 0x09, 0xd1, 0x01, 0x34, 0xa0, 0x00, +0x40, 0x19, 0x0b, 0x23, 0x1b, 0x02, 0xc0, 0x18, 0x80, 0x69, 0x00, 0x28, +0xea, 0xd1, 0x01, 0xe0, 0x01, 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, +0x9d, 0xf9, 0x07, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0xb8, 0xb5, 0xc2, 0x07, 0xd2, 0x0f, 0x16, 0x4c, +0x16, 0x49, 0x01, 0xd0, 0x08, 0x22, 0x08, 0xe0, 0x82, 0x08, 0x05, 0xd3, +0x0c, 0x22, 0xa4, 0x18, 0x0b, 0x68, 0xdf, 0x1d, 0x15, 0x37, 0x03, 0xe0, +0x1c, 0x22, 0x0b, 0x68, 0xdf, 0x1d, 0x09, 0x37, 0x0f, 0x4b, 0x1d, 0x78, +0x00, 0x2d, 0x13, 0xd0, 0x5b, 0x78, 0x00, 0x2b, 0x10, 0xd0, 0x01, 0x23, +0x5b, 0x06, 0x1a, 0x43, 0x00, 0x28, 0x01, 0xd1, 0x5b, 0x08, 0x1a, 0x43, +0x00, 0x92, 0x4a, 0x68, 0x01, 0x20, 0x39, 0x1c, 0x23, 0x1c, 0x00, 0xf0, +0xdf, 0xfe, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x03, 0x23, 0x1b, 0x06, +0x1a, 0x43, 0xf1, 0xe7, 0x3c, 0xef, 0x20, 0x40, 0x7c, 0x29, 0x00, 0x80, +0xf8, 0x0e, 0x00, 0x80, 0x00, 0x21, 0xc1, 0x61, 0x05, 0x49, 0x8a, 0x68, +0x00, 0x2a, 0x01, 0xd1, 0x88, 0x60, 0x02, 0xe0, 0xca, 0x68, 0xc0, 0x46, +0xd0, 0x61, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x28, 0x0f, 0x00, 0x80, +0x03, 0x49, 0x88, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xc2, 0x69, 0xc0, 0x46, +0x8a, 0x60, 0x70, 0x47, 0x28, 0x0f, 0x00, 0x80, 0x01, 0x1c, 0x01, 0x23, +0x88, 0x68, 0x58, 0x40, 0x88, 0x60, 0xca, 0x68, 0x01, 0x3a, 0xca, 0x60, +0x0a, 0x69, 0x01, 0x3a, 0x80, 0x00, 0x0a, 0x61, 0x42, 0x18, 0xd0, 0x6b, +0x53, 0x6b, 0xc0, 0x46, 0xcb, 0x62, 0x0b, 0x68, 0x9b, 0x00, 0x59, 0x18, +0x49, 0x6c, 0x53, 0x6c, 0xc9, 0x18, 0x51, 0x64, 0x70, 0x47, 0x8a, 0x68, +0x92, 0x00, 0x52, 0x18, 0xd3, 0x6b, 0x83, 0x42, 0x17, 0xd1, 0xd0, 0x1d, +0x3d, 0x30, 0x0a, 0x68, 0x92, 0x00, 0x52, 0x18, 0x52, 0x6c, 0x03, 0x68, +0x9a, 0x1a, 0x02, 0x60, 0x01, 0x23, 0x88, 0x68, 0x58, 0x40, 0x88, 0x60, +0xca, 0x68, 0x01, 0x32, 0xca, 0x60, 0x0a, 0x69, 0x01, 0x32, 0x80, 0x00, +0x40, 0x18, 0x0a, 0x61, 0x40, 0x6b, 0xc0, 0x46, 0xc8, 0x62, 0x70, 0x47, +0xb8, 0xb5, 0x04, 0x1c, 0x1d, 0x1c, 0x17, 0x1c, 0x08, 0x1c, 0x39, 0x1c, +0xff, 0xf7, 0xd9, 0xff, 0x00, 0x20, 0x29, 0x1c, 0x00, 0xf0, 0x7c, 0xfe, +0x01, 0x20, 0xf9, 0x1d, 0x19, 0x31, 0x48, 0x71, 0x80, 0x06, 0x60, 0x60, +0x00, 0x20, 0xa0, 0x61, 0x06, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x06, 0x48, +0x01, 0x6d, 0x42, 0x6d, 0x05, 0x4b, 0x00, 0x20, 0x00, 0xf0, 0x62, 0xfe, +0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x04, 0x00, 0x12, 0x02, 0x7c, 0x29, 0x00, 0x80, 0x44, 0x80, 0x20, 0x40, +0x06, 0x49, 0x0a, 0x68, 0x10, 0x18, 0x08, 0x60, 0x01, 0x23, 0x5b, 0x02, +0x98, 0x42, 0x03, 0xd9, 0x03, 0x49, 0x0a, 0x79, 0x01, 0x32, 0x0a, 0x71, +0x70, 0x47, 0x00, 0x00, 0xe4, 0x2d, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, +0x80, 0x08, 0x80, 0x00, 0x06, 0x49, 0x0a, 0x68, 0x10, 0x18, 0x08, 0x60, 0x01, 0x23, 0x5b, 0x02, 0x98, 0x42, 0x03, 0xd9, 0x03, 0x49, 0x0a, 0x79, -0x01, 0x32, 0x0a, 0x71, 0x70, 0x47, 0x00, 0x00, 0x50, 0x2d, 0x00, 0x80, -0xa0, 0x82, 0x20, 0x40, 0x80, 0x08, 0x80, 0x00, 0x06, 0x49, 0x0a, 0x68, -0x10, 0x18, 0x08, 0x60, 0x01, 0x23, 0x5b, 0x02, 0x98, 0x42, 0x03, 0xd9, -0x03, 0x49, 0x0a, 0x79, 0x01, 0x32, 0x0a, 0x71, 0x70, 0x47, 0x00, 0x00, -0x50, 0x2d, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x03, 0x30, 0x80, 0x08, -0x80, 0x00, 0x06, 0x49, 0x0a, 0x68, 0x10, 0x18, 0x08, 0x60, 0x01, 0x23, -0x5b, 0x02, 0x98, 0x42, 0x03, 0xd9, 0x03, 0x49, 0x0a, 0x79, 0x01, 0x32, -0x0a, 0x71, 0x70, 0x47, 0x50, 0x2d, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0x02, 0x48, 0x41, 0x79, 0x01, 0x31, 0x41, 0x71, -0x70, 0x47, 0x00, 0x00, 0xa0, 0x82, 0x20, 0x40, 0x90, 0xb4, 0x82, 0x00, -0x17, 0x4b, 0x9a, 0x58, 0x8b, 0x07, 0x02, 0xd0, 0x89, 0x08, 0x0b, 0x1d, -0x01, 0xe0, 0x89, 0x08, 0xcb, 0x1c, 0x11, 0x69, 0xd7, 0x68, 0x12, 0x4c, -0x80, 0x00, 0x20, 0x58, 0x40, 0x68, 0xb9, 0x42, 0x03, 0xd1, 0x81, 0x42, -0x19, 0xd9, 0x11, 0x68, 0x17, 0xe0, 0x00, 0x24, 0xb9, 0x42, 0x09, 0xd9, -0x81, 0x42, 0x12, 0xd9, 0x11, 0x68, 0x78, 0x1a, 0x00, 0xd5, 0x03, 0x30, -0x80, 0x10, 0x98, 0x42, 0x0b, 0xd8, 0x07, 0xe0, 0x81, 0x42, 0x05, 0xd8, -0x78, 0x1a, 0x00, 0xd5, 0x03, 0x30, 0x80, 0x10, 0x98, 0x42, 0x02, 0xd8, -0x20, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0xc8, 0x1d, 0x05, 0x30, 0xfa, 0xe7, -0xf0, 0x03, 0x00, 0x80, 0x80, 0xb5, 0x80, 0x00, 0x0f, 0x4a, 0x17, 0x58, -0x88, 0x07, 0x02, 0xd0, 0x88, 0x08, 0x04, 0x30, 0x01, 0xe0, 0x88, 0x08, -0x03, 0x30, 0x39, 0x69, 0x7a, 0x68, 0x91, 0x42, 0x09, 0xd9, 0x39, 0x68, -0xc0, 0x46, 0x39, 0x61, 0xf9, 0x68, 0x7a, 0x68, 0x91, 0x42, 0x02, 0xd9, -0x39, 0x68, 0xc0, 0x46, 0xf9, 0x60, 0x81, 0x00, 0x38, 0x69, 0x00, 0xf0, -0xd5, 0xfd, 0x38, 0x61, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0xf0, 0x03, 0x00, 0x80, 0x90, 0xb5, 0x03, 0x21, 0x09, 0x07, 0x01, 0x40, -0x0c, 0x0f, 0x01, 0x04, 0x09, 0x0c, 0x01, 0x22, 0x92, 0x07, 0x02, 0x40, -0xa3, 0x00, 0x1c, 0x4f, 0xff, 0x58, 0x89, 0x07, 0x89, 0x0f, 0x00, 0x04, -0x00, 0x0c, 0x80, 0x08, 0x00, 0x29, 0x00, 0xd0, 0x01, 0x30, 0x00, 0x2a, -0x01, 0xd0, 0x02, 0x30, 0x00, 0xe0, 0x03, 0x30, 0xf9, 0x68, 0x7a, 0x68, +0x01, 0x32, 0x0a, 0x71, 0x70, 0x47, 0x00, 0x00, 0xe4, 0x2d, 0x00, 0x80, +0xa0, 0x82, 0x20, 0x40, 0x03, 0x30, 0x80, 0x08, 0x80, 0x00, 0x06, 0x49, +0x0a, 0x68, 0x10, 0x18, 0x08, 0x60, 0x01, 0x23, 0x5b, 0x02, 0x98, 0x42, +0x03, 0xd9, 0x03, 0x49, 0x0a, 0x79, 0x01, 0x32, 0x0a, 0x71, 0x70, 0x47, +0xe4, 0x2d, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x02, 0x48, 0x41, 0x79, +0x01, 0x31, 0x41, 0x71, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x82, 0x20, 0x40, +0x90, 0xb4, 0x82, 0x00, 0x17, 0x4b, 0x9a, 0x58, 0x8b, 0x07, 0x02, 0xd0, +0x89, 0x08, 0x0b, 0x1d, 0x01, 0xe0, 0x89, 0x08, 0xcb, 0x1c, 0x11, 0x69, +0xd7, 0x68, 0x12, 0x4c, 0x80, 0x00, 0x20, 0x58, 0x40, 0x68, 0xb9, 0x42, +0x03, 0xd1, 0x81, 0x42, 0x19, 0xd9, 0x11, 0x68, 0x17, 0xe0, 0x00, 0x24, +0xb9, 0x42, 0x09, 0xd9, 0x81, 0x42, 0x12, 0xd9, 0x11, 0x68, 0x78, 0x1a, +0x00, 0xd5, 0x03, 0x30, 0x80, 0x10, 0x98, 0x42, 0x0b, 0xd8, 0x07, 0xe0, +0x81, 0x42, 0x05, 0xd8, 0x78, 0x1a, 0x00, 0xd5, 0x03, 0x30, 0x80, 0x10, +0x98, 0x42, 0x02, 0xd8, 0x20, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0xc8, 0x1d, +0x05, 0x30, 0xfa, 0xe7, 0x70, 0x04, 0x00, 0x80, 0x80, 0xb5, 0x80, 0x00, +0x0f, 0x4a, 0x17, 0x58, 0x88, 0x07, 0x02, 0xd0, 0x88, 0x08, 0x04, 0x30, +0x01, 0xe0, 0x88, 0x08, 0x03, 0x30, 0x39, 0x69, 0x7a, 0x68, 0x91, 0x42, +0x09, 0xd9, 0x39, 0x68, 0xc0, 0x46, 0x39, 0x61, 0xf9, 0x68, 0x7a, 0x68, 0x91, 0x42, 0x02, 0xd9, 0x39, 0x68, 0xc0, 0x46, 0xf9, 0x60, 0x81, 0x00, -0xf8, 0x68, 0x00, 0xf0, 0xa9, 0xfd, 0xf8, 0x60, 0x0f, 0x48, 0x00, 0x69, -0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, 0xa0, 0x40, 0x02, 0xd0, 0x20, 0x1c, -0xfe, 0xf7, 0xc8, 0xfc, 0x0b, 0x49, 0xc8, 0x1d, 0x19, 0x30, 0x03, 0x79, -0x00, 0x22, 0x00, 0x2b, 0x05, 0xd1, 0x09, 0x49, 0xc8, 0x1d, 0x19, 0x30, -0x03, 0x79, 0x00, 0x2b, 0x03, 0xd0, 0x02, 0x71, 0x08, 0x1c, 0xff, 0xf7, -0x79, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0x03, 0x00, 0x80, -0x3c, 0x2c, 0x00, 0x80, 0xd0, 0x2c, 0x00, 0x80, 0x50, 0x2c, 0x00, 0x80, -0xb0, 0xb5, 0x2b, 0x49, 0x09, 0x78, 0x00, 0x29, 0x03, 0xd1, 0x41, 0x68, -0x29, 0x4b, 0x19, 0x43, 0x41, 0x60, 0x81, 0x68, 0x49, 0x08, 0x02, 0xd3, -0x09, 0x21, 0x09, 0x04, 0x01, 0xe0, 0x0d, 0x21, 0x09, 0x04, 0x0c, 0xc8, -0x08, 0x38, 0x19, 0x43, 0x87, 0x68, 0xbb, 0x0a, 0x03, 0xd3, 0x43, 0x68, -0x5b, 0x08, 0x00, 0xd3, 0x01, 0x31, 0x40, 0x68, 0x03, 0x23, 0x1b, 0x07, -0x18, 0x40, 0x07, 0x0f, 0xf8, 0x00, 0x1d, 0x4c, 0x00, 0x19, 0x23, 0x68, -0xc0, 0x18, 0x50, 0x30, 0x00, 0x79, 0x01, 0x28, 0x10, 0xd1, 0x60, 0x68, -0x01, 0x28, 0x0d, 0xd0, 0x10, 0x1c, 0x00, 0xf0, 0x71, 0xf8, 0x38, 0x01, -0x00, 0x19, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x41, 0x6b, 0x01, 0x39, -0x41, 0x63, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x01, 0x00, 0x19, -0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x03, 0x6b, 0x5d, 0x1c, 0x05, 0x63, -0xbd, 0x02, 0x2d, 0x19, 0xdb, 0x00, 0xeb, 0x18, 0x80, 0x33, 0x19, 0x63, -0xda, 0x62, 0x81, 0x6b, 0x01, 0x31, 0x81, 0x63, 0x01, 0x21, 0xb9, 0x40, -0x22, 0x68, 0x11, 0x43, 0x21, 0x60, 0x01, 0x6b, 0x80, 0x29, 0xe2, 0xd3, -0x00, 0x21, 0x01, 0x63, 0xdf, 0xe7, 0x00, 0x00, -0xa8, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x1c, 0x1c, 0x00, 0x80, -0xf0, 0xb5, 0x1f, 0x4e, 0x70, 0x68, 0x00, 0x28, 0x36, 0xd1, 0x00, 0x24, -0xb1, 0x68, 0x48, 0x1c, 0xc9, 0x00, 0x89, 0x19, 0xb0, 0x60, 0x32, 0x68, -0x89, 0x18, 0x60, 0x31, 0x0d, 0x7b, 0x08, 0x28, 0x00, 0xd3, 0xb4, 0x60, -0x28, 0x01, 0x80, 0x19, 0x19, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x87, 0x6b, -0x00, 0x2f, 0x21, 0xd0, 0xc1, 0x6a, 0x4b, 0x1c, 0xaa, 0x02, 0x92, 0x19, -0xc9, 0x00, 0x51, 0x18, 0x80, 0x31, 0xc3, 0x62, 0xca, 0x6a, 0x09, 0x6b, -0x01, 0x3f, 0x87, 0x63, 0x80, 0x2b, 0x00, 0xd3, 0xc4, 0x62, 0x00, 0x2f, -0x06, 0xd1, 0x01, 0x27, 0xaf, 0x40, 0x3b, 0x1c, 0xdb, 0x43, 0x37, 0x68, -0x3b, 0x40, 0x33, 0x60, 0x43, 0x6b, 0x01, 0x3b, 0x43, 0x63, 0x10, 0x1c, -0x37, 0x1c, 0x00, 0xf0, 0x09, 0xf8, 0x78, 0x68, 0x00, 0x28, 0xc9, 0xd0, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x80, -0xf0, 0xb5, 0xcd, 0x0f, 0xed, 0x07, 0x01, 0x24, 0x00, 0x27, 0x2f, 0x4b, -0x2f, 0x4a, 0x00, 0x2d, 0x1d, 0xd0, 0xd8, 0x6a, 0x01, 0x30, 0xd8, 0x62, -0x10, 0x1c, 0x52, 0x69, 0x00, 0x2a, 0x12, 0xd0, 0x02, 0x69, 0x53, 0x1c, -0x92, 0x00, 0x12, 0x18, 0x03, 0x61, 0x91, 0x61, 0x41, 0x69, 0x01, 0x31, -0x41, 0x61, 0x02, 0x69, 0x0f, 0x2a, 0x00, 0xd3, 0x07, 0x61, 0x0f, 0x29, -0x00, 0xd3, 0x44, 0x60, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x08, 0x1c, -0xff, 0xf7, 0xee, 0xfe, 0xf8, 0xe7, 0x15, 0x69, 0x6e, 0x1c, 0xad, 0x00, -0xad, 0x18, 0x16, 0x61, 0xa9, 0x61, 0x55, 0x69, 0x01, 0x35, 0x55, 0x61, -0x16, 0x69, 0x0f, 0x2e, 0x00, 0xd3, 0x17, 0x61, 0x0f, 0x2d, 0x00, 0xd3, -0x54, 0x60, 0x8c, 0x02, 0xa4, 0x0a, 0x17, 0x4f, 0x3a, 0x6f, 0xfd, 0x68, -0xf9, 0x1d, 0x79, 0x31, 0x01, 0x2d, 0x0e, 0xd1, 0xdb, 0x6d, 0x5b, 0x08, -0x0b, 0xd3, 0x8b, 0x88, 0x00, 0x2b, 0x08, 0xd1, 0x03, 0x3b, 0xfd, 0x6f, -0x2b, 0x40, 0xfb, 0x67, 0x0f, 0x4d, 0xc0, 0x46, 0x2b, 0x60, 0x14, 0x23, -0x8b, 0x80, 0x10, 0x60, 0x80, 0x07, 0x80, 0x0a, 0x20, 0x43, 0x03, 0x04, -0x00, 0xd0, 0x01, 0x38, 0x50, 0x60, 0xc9, 0x69, 0x08, 0x32, 0x91, 0x42, -0x00, 0xd8, 0x08, 0x4a, 0x00, 0x0d, 0x02, 0xd3, 0x51, 0x20, 0x80, 0x03, -0x82, 0x61, 0x3a, 0x67, 0xbc, 0xe7, 0x00, 0x00, 0x10, 0x2a, 0x00, 0x80, -0x1c, 0x1c, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, -0x24, 0xa7, 0x20, 0x40, 0xb0, 0xb5, 0x00, 0x28, 0x04, 0xd1, 0x01, 0x20, -0xc0, 0x05, 0x16, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x15, 0x4c, 0x00, 0x25, +0x38, 0x69, 0x00, 0xf0, 0xd1, 0xfd, 0x38, 0x61, 0x80, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x70, 0x04, 0x00, 0x80, 0x90, 0xb5, 0x03, 0x21, +0x09, 0x07, 0x01, 0x40, 0x0c, 0x0f, 0x01, 0x04, 0x09, 0x0c, 0x01, 0x22, +0x92, 0x07, 0x02, 0x40, 0xa3, 0x00, 0x1c, 0x4f, 0xff, 0x58, 0x89, 0x07, +0x89, 0x0f, 0x00, 0x04, 0x00, 0x0c, 0x80, 0x08, 0x00, 0x29, 0x00, 0xd0, +0x01, 0x30, 0x00, 0x2a, 0x01, 0xd0, 0x02, 0x30, 0x00, 0xe0, 0x03, 0x30, +0xf9, 0x68, 0x7a, 0x68, 0x91, 0x42, 0x02, 0xd9, 0x39, 0x68, 0xc0, 0x46, +0xf9, 0x60, 0x81, 0x00, 0xf8, 0x68, 0x00, 0xf0, 0xa5, 0xfd, 0xf8, 0x60, +0x0f, 0x48, 0x00, 0x69, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, 0xa0, 0x40, +0x02, 0xd0, 0x20, 0x1c, 0xfe, 0xf7, 0xca, 0xfc, 0x0b, 0x49, 0xc8, 0x1d, +0x19, 0x30, 0x03, 0x79, 0x00, 0x22, 0x00, 0x2b, 0x05, 0xd1, 0x09, 0x49, +0xc8, 0x1d, 0x19, 0x30, 0x03, 0x79, 0x00, 0x2b, 0x03, 0xd0, 0x02, 0x71, +0x08, 0x1c, 0xff, 0xf7, 0x79, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x70, 0x04, 0x00, 0x80, 0xd0, 0x2c, 0x00, 0x80, 0x64, 0x2d, 0x00, 0x80, +0xe4, 0x2c, 0x00, 0x80, 0xb0, 0xb5, 0x2b, 0x49, 0x09, 0x79, 0x00, 0x29, +0x03, 0xd1, 0x41, 0x68, 0x29, 0x4b, 0x19, 0x43, 0x41, 0x60, 0x81, 0x68, +0x49, 0x08, 0x02, 0xd3, 0x09, 0x21, 0x09, 0x04, 0x01, 0xe0, 0x0d, 0x21, +0x09, 0x04, 0x0c, 0xc8, 0x08, 0x38, 0x19, 0x43, +0x87, 0x68, 0xbb, 0x0a, 0x03, 0xd3, 0x43, 0x68, 0x5b, 0x08, 0x00, 0xd3, +0x01, 0x31, 0x40, 0x68, 0x03, 0x23, 0x1b, 0x07, 0x18, 0x40, 0x07, 0x0f, +0xf8, 0x00, 0x1d, 0x4c, 0x00, 0x19, 0x23, 0x68, 0xc0, 0x18, 0x50, 0x30, +0x00, 0x79, 0x01, 0x28, 0x10, 0xd1, 0x60, 0x68, 0x01, 0x28, 0x0d, 0xd0, +0x10, 0x1c, 0x00, 0xf0, 0x71, 0xf8, 0x38, 0x01, 0x00, 0x19, 0x19, 0x23, +0xdb, 0x01, 0xc0, 0x18, 0x41, 0x6b, 0x01, 0x39, 0x41, 0x63, 0xb0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x38, 0x01, 0x00, 0x19, 0x19, 0x23, 0xdb, 0x01, +0xc0, 0x18, 0x03, 0x6b, 0x5d, 0x1c, 0x05, 0x63, 0xbd, 0x02, 0x2d, 0x19, +0xdb, 0x00, 0xeb, 0x18, 0x80, 0x33, 0x19, 0x63, 0xda, 0x62, 0x81, 0x6b, +0x01, 0x31, 0x81, 0x63, 0x01, 0x21, 0xb9, 0x40, 0x22, 0x68, 0x11, 0x43, +0x21, 0x60, 0x01, 0x6b, 0x80, 0x29, 0xe2, 0xd3, 0x00, 0x21, 0x01, 0x63, +0xdf, 0xe7, 0x00, 0x00, 0x28, 0x0f, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +0xa0, 0x1c, 0x00, 0x80, 0xf0, 0xb5, 0x1f, 0x4e, 0x70, 0x68, 0x00, 0x28, +0x36, 0xd1, 0x00, 0x24, 0xb1, 0x68, 0x48, 0x1c, 0xc9, 0x00, 0x89, 0x19, +0xb0, 0x60, 0x32, 0x68, 0x89, 0x18, 0x60, 0x31, 0x0d, 0x7b, 0x08, 0x28, +0x00, 0xd3, 0xb4, 0x60, 0x28, 0x01, 0x80, 0x19, 0x19, 0x23, 0xdb, 0x01, +0xc0, 0x18, 0x87, 0x6b, 0x00, 0x2f, 0x21, 0xd0, 0xc1, 0x6a, 0x4b, 0x1c, +0xaa, 0x02, 0x92, 0x19, 0xc9, 0x00, 0x51, 0x18, 0x80, 0x31, 0xc3, 0x62, +0xca, 0x6a, 0x09, 0x6b, 0x01, 0x3f, 0x87, 0x63, 0x80, 0x2b, 0x00, 0xd3, +0xc4, 0x62, 0x00, 0x2f, 0x06, 0xd1, 0x01, 0x27, 0xaf, 0x40, 0x3b, 0x1c, +0xdb, 0x43, 0x37, 0x68, 0x3b, 0x40, 0x33, 0x60, 0x43, 0x6b, 0x01, 0x3b, +0x43, 0x63, 0x10, 0x1c, 0x37, 0x1c, 0x00, 0xf0, 0x09, 0xf8, 0x78, 0x68, +0x00, 0x28, 0xc9, 0xd0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xa0, 0x1c, 0x00, 0x80, 0xf0, 0xb5, 0xcd, 0x0f, 0xed, 0x07, 0x01, 0x24, +0x00, 0x27, 0x2e, 0x4b, 0x2e, 0x4a, 0x00, 0x2d, 0x1d, 0xd0, 0xd8, 0x6a, +0x01, 0x30, 0xd8, 0x62, 0x10, 0x1c, 0x52, 0x69, 0x00, 0x2a, 0x12, 0xd0, +0x02, 0x69, 0x53, 0x1c, 0x92, 0x00, 0x12, 0x18, 0x03, 0x61, 0x91, 0x61, +0x41, 0x69, 0x01, 0x31, 0x41, 0x61, 0x02, 0x69, 0x0f, 0x2a, 0x00, 0xd3, +0x07, 0x61, 0x0f, 0x29, 0x00, 0xd3, 0x44, 0x60, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x08, 0x1c, 0xff, 0xf7, 0xee, 0xfe, 0xf8, 0xe7, 0x15, 0x69, +0x6e, 0x1c, 0xad, 0x00, 0xad, 0x18, 0x16, 0x61, 0xa9, 0x61, 0x55, 0x69, +0x01, 0x35, 0x55, 0x61, 0x16, 0x69, 0x0f, 0x2e, 0x00, 0xd3, 0x17, 0x61, +0x0f, 0x2d, 0x00, 0xd3, 0x54, 0x60, 0x8c, 0x02, 0xa4, 0x0a, 0x16, 0x4f, +0x3a, 0x6f, 0xfd, 0x68, 0xf9, 0x1d, 0x79, 0x31, 0x01, 0x2d, 0x0c, 0xd1, +0xdb, 0x6d, 0x5b, 0x08, 0x09, 0xd3, 0x0b, 0x89, 0x00, 0x2b, 0x06, 0xd1, +0xfd, 0x6f, 0x03, 0x3b, 0x2e, 0x68, 0x33, 0x40, 0x2b, 0x60, 0x14, 0x23, +0x0b, 0x81, 0x10, 0x60, 0x80, 0x07, 0x80, 0x0a, 0x20, 0x43, 0x03, 0x04, +0x00, 0xd0, 0x01, 0x38, 0x50, 0x60, 0x09, 0x6a, 0x08, 0x32, 0x91, 0x42, +0x00, 0xd8, 0x07, 0x4a, 0x00, 0x0d, 0x02, 0xd3, 0x51, 0x20, 0x80, 0x03, +0x82, 0x61, 0x3a, 0x67, 0xbe, 0xe7, 0x00, 0x00, 0xa4, 0x2a, 0x00, 0x80, +0xa0, 0x1c, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, 0x24, 0xa7, 0x20, 0x40, +0xb0, 0xb5, 0x00, 0x28, 0x04, 0xd1, 0x01, 0x20, 0xc0, 0x05, 0x16, 0x49, +0xc0, 0x46, 0x08, 0x60, 0x15, 0x4c, 0x00, 0x25, 0x67, 0x69, 0x00, 0x2f, 0x16, 0xd0, 0xe0, 0x68, 0x41, 0x1c, 0x80, 0x00, -0x00, 0x19, 0xe1, 0x60, 0x80, 0x69, 0x01, 0x3f, 0xff, 0xf7, 0x90, 0xfe, +0x00, 0x19, 0xe1, 0x60, 0x80, 0x69, 0x01, 0x3f, 0xff, 0xf7, 0x94, 0xfe, 0xe0, 0x68, 0x0f, 0x28, 0x00, 0xd3, 0xe5, 0x60, 0xe0, 0x68, 0x80, 0x00, 0x00, 0x19, 0x80, 0x69, 0x00, 0x08, 0x01, 0xd3, 0x00, 0x2f, 0xea, 0xd1, 0x67, 0x61, 0x03, 0xe0, 0x08, 0x48, 0x01, 0x6d, 0x01, 0x31, 0x01, 0x65, -0x65, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xff, 0xf7, 0x22, 0xff, +0x65, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xff, 0xf7, 0x26, 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, -0x1c, 0x1c, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x00, 0x20, 0x70, 0x47, +0xa0, 0x1c, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x00, 0x20, 0x70, 0x47, 0xb0, 0xb4, 0x10, 0x23, 0x82, 0x68, 0x13, 0x40, 0x00, 0x21, 0x00, 0x2b, 0x15, 0xd0, 0x0c, 0x4b, 0x1a, 0x40, 0x12, 0x01, 0x81, 0x24, 0x14, 0x43, -0x02, 0x68, 0x15, 0x68, 0x13, 0x1d, 0x80, 0xcb, -0x1b, 0x68, 0x04, 0x3a, 0x02, 0x60, 0x20, 0xc2, 0x80, 0xc2, 0x08, 0xc2, -0x14, 0x60, 0x42, 0x68, 0x01, 0x23, 0x9b, 0x07, 0x04, 0x32, 0x1a, 0x43, -0x42, 0x60, 0x08, 0x1c, 0xb0, 0xbc, 0x70, 0x47, 0x00, 0xf0, 0xff, 0x0f, -0xf0, 0xb4, 0x82, 0x68, 0x53, 0x09, 0x34, 0xd3, 0x1b, 0x4b, 0x1a, 0x40, -0x12, 0x01, 0x81, 0x26, 0x16, 0x43, 0x03, 0x68, 0x1d, 0x68, 0x1f, 0x1d, -0x10, 0xcf, 0x3f, 0x68, 0x04, 0x3b, 0x03, 0x60, 0x20, 0xc3, 0x10, 0xc3, -0x80, 0xc3, 0x1e, 0x60, 0x43, 0x68, 0x1f, 0x1d, 0x01, 0x23, 0x9b, 0x07, -0x3b, 0x43, 0x43, 0x60, 0xcb, 0x6b, 0x18, 0x1f, 0xc8, 0x63, 0x80, 0xcb, -0x80, 0xc0, 0x1c, 0x68, 0x1f, 0x1d, 0x03, 0x1d, 0x04, 0x60, 0x38, 0x1c, -0x3f, 0x68, 0xc0, 0x46, 0x1f, 0x60, 0x1f, 0x1d, 0x43, 0x68, 0x1c, 0x04, -0x24, 0x0c, 0x81, 0x23, 0x23, 0x43, 0x3b, 0x60, 0x40, 0x68, 0x00, 0x0c, -0x00, 0x04, 0x10, 0x43, 0x78, 0x60, 0x08, 0x6e, 0x04, 0x30, 0x08, 0x66, -0x48, 0x6e, 0x04, 0x30, 0x48, 0x66, 0x00, 0x20, 0xf0, 0xbc, 0x70, 0x47, -0x00, 0xf0, 0xff, 0x0f, 0x80, 0xb4, 0x81, 0x6a, 0x01, 0x23, 0x9b, 0x07, -0xca, 0x1d, 0x05, 0x32, 0x1a, 0x43, 0x12, 0x68, 0xcf, 0x1d, 0x01, 0x37, -0x3b, 0x43, 0x1b, 0x68, 0xc0, 0x46, 0xcb, 0x60, 0x01, 0x23, 0x9b, 0x07, -0x0f, 0x1d, 0x3b, 0x43, 0x1b, 0x68, 0xc0, 0x46, 0x8b, 0x60, 0x01, 0x23, -0x9b, 0x07, 0x0b, 0x43, 0x1b, 0x68, 0x0c, 0xc1, 0x02, 0x62, 0x01, 0x6b, -0xc0, 0x46, 0x0a, 0x62, 0x04, 0x23, 0x81, 0x69, 0x19, 0x43, 0x81, 0x61, -0x02, 0x6b, 0xc0, 0x46, 0x91, 0x61, 0x81, 0x6a, 0x04, 0x31, 0x81, 0x62, -0x02, 0x6b, 0xc0, 0x46, 0x91, 0x62, 0xc1, 0x1d, 0x39, 0x31, 0x4a, 0x8b, -0x04, 0x3a, 0x4a, 0x83, 0x49, 0x8b, 0x02, 0x6b, 0x40, 0x32, 0x51, 0x83, -0xc1, 0x89, 0x04, 0x39, 0xc1, 0x81, 0xc1, 0x68, 0x00, 0x6b, 0xc0, 0x46, -0xc1, 0x60, 0x00, 0x20, 0x80, 0xbc, 0x70, 0x47, 0x00, 0x47, 0x08, 0x47, -0x10, 0x47, 0x18, 0x47, 0x20, 0x47, 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, -0x30, 0x40, 0x2d, 0xe9, 0x0c, 0xc0, 0x9d, 0xe5, 0x0c, 0x48, 0xa0, 0xe1, -0x24, 0x48, 0xb0, 0xe1, 0x1e, 0x00, 0x00, 0x0a, 0x01, 0xc0, 0x4c, 0xe2, -0x18, 0x40, 0xa0, 0xe3, 0x64, 0x51, 0x9f, 0xe5, 0x94, 0x50, 0x20, 0xe0, -0x00, 0x50, 0x90, 0xe5, 0x14, 0x40, 0x90, 0xe5, 0x00, 0x30, 0x85, 0xe5, -0x04, 0xc0, 0x85, 0xe5, 0x08, 0x10, 0x85, 0xe5, 0x0c, 0x20, 0x85, 0xe5, -0x10, 0x10, 0x90, 0xe5, 0x10, 0x50, 0x85, 0xe2, 0x01, 0x00, 0x55, 0xe1, -0x0c, 0x50, 0x90, 0x55, 0x04, 0x00, 0x55, 0xe1, 0x05, 0x00, 0x00, 0x0a, +0x02, 0x68, 0x15, 0x68, 0x13, 0x1d, 0x80, 0xcb, 0x1b, 0x68, 0x04, 0x3a, +0x02, 0x60, 0x20, 0xc2, 0x80, 0xc2, 0x08, 0xc2, 0x14, 0x60, 0x42, 0x68, +0x01, 0x23, 0x9b, 0x07, 0x04, 0x32, 0x1a, 0x43, 0x42, 0x60, 0x08, 0x1c, +0xb0, 0xbc, 0x70, 0x47, 0x00, 0xf0, 0xff, 0x0f, 0xf0, 0xb4, 0x82, 0x68, +0x53, 0x09, 0x34, 0xd3, 0x1b, 0x4b, 0x1a, 0x40, 0x12, 0x01, 0x81, 0x26, +0x16, 0x43, 0x03, 0x68, 0x1d, 0x68, 0x1f, 0x1d, 0x10, 0xcf, 0x3f, 0x68, +0x04, 0x3b, 0x03, 0x60, 0x20, 0xc3, 0x10, 0xc3, 0x80, 0xc3, 0x1e, 0x60, +0x43, 0x68, 0x1f, 0x1d, 0x01, 0x23, 0x9b, 0x07, 0x3b, 0x43, 0x43, 0x60, +0xcb, 0x6b, 0x18, 0x1f, 0xc8, 0x63, 0x80, 0xcb, 0x80, 0xc0, 0x1c, 0x68, +0x1f, 0x1d, 0x03, 0x1d, 0x04, 0x60, 0x38, 0x1c, 0x3f, 0x68, 0xc0, 0x46, +0x1f, 0x60, 0x1f, 0x1d, 0x43, 0x68, 0x1c, 0x04, 0x24, 0x0c, 0x81, 0x23, +0x23, 0x43, 0x3b, 0x60, 0x40, 0x68, 0x00, 0x0c, 0x00, 0x04, 0x10, 0x43, +0x78, 0x60, 0x08, 0x6e, 0x04, 0x30, 0x08, 0x66, 0x48, 0x6e, 0x04, 0x30, +0x48, 0x66, 0x00, 0x20, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0xf0, 0xff, 0x0f, +0x80, 0xb4, 0x81, 0x6a, 0x01, 0x23, 0x9b, 0x07, 0xca, 0x1d, 0x05, 0x32, +0x1a, 0x43, 0x12, 0x68, 0xcf, 0x1d, 0x01, 0x37, 0x3b, 0x43, 0x1b, 0x68, +0xc0, 0x46, 0xcb, 0x60, 0x01, 0x23, 0x9b, 0x07, 0x0f, 0x1d, 0x3b, 0x43, +0x1b, 0x68, 0xc0, 0x46, 0x8b, 0x60, 0x01, 0x23, 0x9b, 0x07, 0x0b, 0x43, +0x1b, 0x68, 0x0c, 0xc1, 0x02, 0x62, 0x01, 0x6b, 0xc0, 0x46, 0x0a, 0x62, +0x04, 0x23, 0x81, 0x69, 0x19, 0x43, 0x81, 0x61, 0x02, 0x6b, 0xc0, 0x46, +0x91, 0x61, 0x81, 0x6a, 0x04, 0x31, 0x81, 0x62, 0x02, 0x6b, 0xc0, 0x46, +0x91, 0x62, 0xc1, 0x1d, 0x39, 0x31, 0x4a, 0x8b, 0x04, 0x3a, 0x4a, 0x83, +0x49, 0x8b, 0x02, 0x6b, 0x40, 0x32, 0x51, 0x83, 0xc1, 0x89, 0x04, 0x39, +0xc1, 0x81, 0xc1, 0x68, 0x00, 0x6b, 0xc0, 0x46, 0xc1, 0x60, 0x00, 0x20, +0x80, 0xbc, 0x70, 0x47, 0x00, 0x47, 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, +0x20, 0x47, 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, 0x30, 0x40, 0x2d, 0xe9, +0x0c, 0xc0, 0x9d, 0xe5, 0x0c, 0x48, 0xa0, 0xe1, 0x24, 0x48, 0xb0, 0xe1, +0x1e, 0x00, 0x00, 0x0a, 0x01, 0xc0, 0x4c, 0xe2, 0x18, 0x40, 0xa0, 0xe3, +0x64, 0x51, 0x9f, 0xe5, 0x94, 0x50, 0x20, 0xe0, 0x00, 0x50, 0x90, 0xe5, +0x14, 0x40, 0x90, 0xe5, 0x00, 0x30, 0x85, 0xe5, 0x04, 0xc0, 0x85, 0xe5, +0x08, 0x10, 0x85, 0xe5, 0x0c, 0x20, 0x85, 0xe5, 0x10, 0x10, 0x90, 0xe5, +0x10, 0x50, 0x85, 0xe2, 0x01, 0x00, 0x55, 0xe1, 0x0c, 0x50, 0x90, 0x55, +0x04, 0x00, 0x55, 0xe1, 0x05, 0x00, 0x00, 0x0a, 0x04, 0x10, 0x90, 0xe5, 0x00, 0x50, 0x80, 0xe5, 0x00, 0x50, 0x81, 0xe5, 0x00, 0x00, 0xa0, 0xe3, 0x30, 0x40, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x30, 0x93, 0xe5, 0x08, 0x20, 0x90, 0xe5, 0x01, 0x31, 0x83, 0xe3, @@ -1793,39 +1805,39 @@ 0x50, 0x10, 0x91, 0xe5, 0xd9, 0xff, 0xff, 0xea, 0xf0, 0x47, 0x2d, 0xe9, 0x20, 0xc0, 0x9d, 0xe5, 0x0c, 0x68, 0xa0, 0xe1, 0x26, 0x68, 0xb0, 0xe1, 0x25, 0x00, 0x00, 0x0a, 0x18, 0x40, 0xa0, 0xe3, 0xb8, 0x50, 0x9f, 0xe5, -0x94, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x80, 0xe0, -0x08, 0x40, 0x90, 0xe5, 0x04, 0x80, 0x90, 0xe5, 0x00, 0x70, 0xa0, 0xe3, -0x1f, 0xc0, 0xa0, 0xe3, 0x02, 0xc4, 0x8c, 0xe3, 0x00, 0x50, 0x90, 0xe5, -0x10, 0x90, 0x90, 0xe5, 0x14, 0xa0, 0x90, 0xe5, 0x00, 0x30, 0x85, 0xe5, -0x04, 0xc0, 0x85, 0xe5, 0x08, 0x10, 0x85, 0xe5, 0x0c, 0x20, 0x85, 0xe5, -0x10, 0x50, 0x85, 0xe2, 0x09, 0x00, 0x55, 0xe1, 0x0c, 0x50, 0x90, 0x55, -0x0a, 0x00, 0x55, 0xe1, 0x15, 0x00, 0x00, 0x0a, 0x03, 0x70, 0x17, 0xe2, -0x20, 0x10, 0x81, 0xe2, 0x20, 0x30, 0x83, 0xe2, 0x0a, 0x00, 0x00, 0x0a, -0x00, 0x60, 0x96, 0xe2, 0x01, 0x70, 0x87, 0xe2, 0x09, 0x00, 0x00, 0x0a, -0x20, 0x60, 0x46, 0xe2, 0x20, 0x00, 0x56, 0xe3, 0xec, 0xff, 0xff, 0xca, -0x00, 0x70, 0xa0, 0xe3, 0x01, 0xc0, 0x46, 0xe2, 0x02, 0xc4, 0x8c, 0xe3, -0x00, 0x60, 0xa0, 0xe3, 0xe7, 0xff, 0xff, 0xea, 0x00, 0x50, 0x88, 0xe5, -0xf2, 0xff, 0xff, 0xea, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x50, 0x80, 0xe5, -0x01, 0x00, 0xa0, 0xe1, 0xf0, 0x47, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, -0x00, 0xa0, 0x94, 0xe5, 0x0a, 0x00, 0x55, 0xe1, 0x14, 0xa0, 0x80, 0xe5, -0xe5, 0xff, 0xff, 0x1a, 0x01, 0x10, 0xa0, 0xe3, 0xf5, 0xff, 0xff, 0xea, -0x28, 0x03, 0x00, 0x80, 0xf8, 0x28, 0x00, 0x80, 0x00, 0x80, 0x20, 0x40, -0x68, 0x82, 0x9f, 0xe5, 0x0b, 0x92, 0xa0, 0xe3, 0x64, 0xa2, 0x9f, 0xe5, -0x58, 0xb0, 0x9a, 0xe5, 0x0e, 0xf0, 0xa0, 0xe1, 0x54, 0xb0, 0x9a, 0xe5, -0x1e, 0xff, 0x2f, 0xe1, 0x3f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x4f, 0xe1, -0x1f, 0x00, 0x00, 0xe2, 0x12, 0x00, 0x50, 0xe3, 0x54, 0x00, 0x00, 0x0a, -0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0xc0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, -0x04, 0x50, 0xa0, 0xe3, 0x00, 0x40, 0x99, 0xe5, 0x09, 0x00, 0x00, 0xea, -0x02, 0x00, 0x14, 0xe3, 0x53, 0x00, 0x00, 0x1b, 0x80, 0x00, 0x14, 0xe3, -0x59, 0x00, 0x00, 0x1b, 0x20, 0x00, 0x14, 0xe3, 0x59, 0x00, 0x00, 0x1b, -0x02, 0x07, 0x14, 0xe3, 0x59, 0x00, 0x00, 0x1b, 0x01, 0x06, 0x14, 0xe3, -0x59, 0x00, 0x00, 0x1b, 0x08, 0x00, 0x14, 0xe3, 0x45, 0x00, 0x00, 0x1b, -0x02, 0x05, 0x14, 0xe3, 0x4a, 0x00, 0x00, 0x1b, 0x02, 0x08, 0x14, 0xe3, -0x4b, 0x00, 0x00, 0x1b, 0xe5, 0x0e, 0x14, 0xe3, 0x07, 0x00, 0x00, 0x0a, -0x04, 0x20, 0x98, 0xe5, 0x0c, 0x10, 0x98, 0xe5, 0x04, 0x30, 0x52, 0xe2, -0x3c, 0x30, 0xa0, 0xb3, 0x04, 0x30, 0x88, 0xe5, 0x02, 0x00, 0x91, 0xe7, -0x0f, 0xe0, 0xa0, 0xe1, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0x50, 0x55, 0xe2, -0x03, 0x00, 0x00, 0x0a, 0x00, 0x40, 0x99, 0xe5, 0x0c, 0x00, 0x9a, 0xe5, +0x94, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x80, 0xe0, 0x08, 0x40, 0x90, 0xe5, +0x04, 0x80, 0x90, 0xe5, 0x00, 0x70, 0xa0, 0xe3, 0x1f, 0xc0, 0xa0, 0xe3, +0x02, 0xc4, 0x8c, 0xe3, 0x00, 0x50, 0x90, 0xe5, 0x10, 0x90, 0x90, 0xe5, +0x14, 0xa0, 0x90, 0xe5, 0x00, 0x30, 0x85, 0xe5, 0x04, 0xc0, 0x85, 0xe5, +0x08, 0x10, 0x85, 0xe5, 0x0c, 0x20, 0x85, 0xe5, 0x10, 0x50, 0x85, 0xe2, +0x09, 0x00, 0x55, 0xe1, 0x0c, 0x50, 0x90, 0x55, 0x0a, 0x00, 0x55, 0xe1, +0x15, 0x00, 0x00, 0x0a, 0x03, 0x70, 0x17, 0xe2, 0x20, 0x10, 0x81, 0xe2, +0x20, 0x30, 0x83, 0xe2, 0x0a, 0x00, 0x00, 0x0a, 0x00, 0x60, 0x96, 0xe2, +0x01, 0x70, 0x87, 0xe2, 0x09, 0x00, 0x00, 0x0a, 0x20, 0x60, 0x46, 0xe2, +0x20, 0x00, 0x56, 0xe3, 0xec, 0xff, 0xff, 0xca, 0x00, 0x70, 0xa0, 0xe3, +0x01, 0xc0, 0x46, 0xe2, 0x02, 0xc4, 0x8c, 0xe3, 0x00, 0x60, 0xa0, 0xe3, +0xe7, 0xff, 0xff, 0xea, 0x00, 0x50, 0x88, 0xe5, 0xf2, 0xff, 0xff, 0xea, +0x00, 0x10, 0xa0, 0xe3, 0x00, 0x50, 0x80, 0xe5, 0x01, 0x00, 0xa0, 0xe1, +0xf0, 0x47, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0xa0, 0x94, 0xe5, +0x0a, 0x00, 0x55, 0xe1, 0x14, 0xa0, 0x80, 0xe5, 0xe5, 0xff, 0xff, 0x1a, +0x01, 0x10, 0xa0, 0xe3, 0xf5, 0xff, 0xff, 0xea, 0xa8, 0x03, 0x00, 0x80, +0x7c, 0x29, 0x00, 0x80, 0x00, 0x80, 0x20, 0x40, 0x68, 0x82, 0x9f, 0xe5, +0x0b, 0x92, 0xa0, 0xe3, 0x64, 0xa2, 0x9f, 0xe5, 0x58, 0xb0, 0x9a, 0xe5, +0x0e, 0xf0, 0xa0, 0xe1, 0x54, 0xb0, 0x9a, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, +0x3f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x4f, 0xe1, 0x1f, 0x00, 0x00, 0xe2, +0x12, 0x00, 0x50, 0xe3, 0x54, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0f, 0xe1, +0x80, 0x00, 0xc0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x04, 0x50, 0xa0, 0xe3, +0x00, 0x40, 0x99, 0xe5, 0x09, 0x00, 0x00, 0xea, 0x02, 0x00, 0x14, 0xe3, +0x53, 0x00, 0x00, 0x1b, 0x80, 0x00, 0x14, 0xe3, 0x59, 0x00, 0x00, 0x1b, +0x20, 0x00, 0x14, 0xe3, 0x59, 0x00, 0x00, 0x1b, 0x02, 0x07, 0x14, 0xe3, +0x59, 0x00, 0x00, 0x1b, 0x01, 0x06, 0x14, 0xe3, 0x59, 0x00, 0x00, 0x1b, +0x08, 0x00, 0x14, 0xe3, 0x45, 0x00, 0x00, 0x1b, 0x02, 0x05, 0x14, 0xe3, +0x4a, 0x00, 0x00, 0x1b, 0x02, 0x08, 0x14, 0xe3, 0x4b, 0x00, 0x00, 0x1b, +0xe5, 0x0e, 0x14, 0xe3, 0x07, 0x00, 0x00, 0x0a, 0x04, 0x20, 0x98, 0xe5, +0x0c, 0x10, 0x98, 0xe5, 0x04, 0x30, 0x52, 0xe2, 0x3c, 0x30, 0xa0, 0xb3, +0x04, 0x30, 0x88, 0xe5, 0x02, 0x00, 0x91, 0xe7, 0x0f, 0xe0, 0xa0, 0xe1, +0x10, 0xff, 0x2f, 0xe1, 0x01, 0x50, 0x55, 0xe2, 0x03, 0x00, 0x00, 0x0a, +0x00, 0x40, 0x99, 0xe5, 0x0c, 0x00, 0x9a, 0xe5, 0x00, 0x00, 0x14, 0xe1, 0x1b, 0xff, 0x2f, 0x11, 0x08, 0x00, 0x9a, 0xe5, 0x00, 0x00, 0x14, 0xe1, 0x0b, 0x00, 0x00, 0x0a, 0x01, 0x0c, 0x14, 0xe3, 0x98, 0x01, 0x9f, 0x15, 0x0f, 0xe0, 0xa0, 0x11, 0x10, 0xff, 0x2f, 0x11, @@ -1836,38 +1848,39 @@ 0x04, 0x00, 0x14, 0xe3, 0x40, 0x00, 0x9a, 0x15, 0x10, 0xff, 0x2f, 0x11, 0x02, 0x0a, 0x14, 0xe3, 0x44, 0x00, 0x9a, 0x15, 0x10, 0xff, 0x2f, 0x11, 0x02, 0x09, 0x14, 0xe3, 0x48, 0x00, 0x9a, 0x15, 0x10, 0xff, 0x2f, 0x11, -0x01, 0x02, 0x14, 0xe3, 0x4c, 0x00, 0x9a, 0x15, -0x10, 0xff, 0x2f, 0x11, 0x01, 0x04, 0x14, 0xe3, 0x50, 0x00, 0x9a, 0x15, -0x10, 0xff, 0x2f, 0x11, 0x01, 0x0a, 0x14, 0xe3, 0x21, 0x00, 0x00, 0x1b, -0x02, 0x00, 0x14, 0xe3, 0x0e, 0x00, 0x00, 0x1b, 0x10, 0x00, 0x9a, 0xe5, -0x00, 0x00, 0x14, 0xe1, 0x1c, 0x00, 0x00, 0x1b, 0x00, 0x40, 0x99, 0xe5, -0x04, 0x50, 0xa0, 0xe3, 0x00, 0x40, 0x94, 0xe2, 0x1b, 0xff, 0x2f, 0x11, -0x3f, 0x40, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0xc0, 0x00, 0x80, 0xe3, -0x00, 0xf0, 0x61, 0xe1, 0xfa, 0xff, 0xff, 0xea, 0x18, 0x00, 0x9a, 0xe5, -0x1c, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x54, 0xb0, 0x9a, 0xe5, -0x1c, 0x10, 0x9a, 0xe5, 0x14, 0x00, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, -0x20, 0x10, 0x9a, 0xe5, 0x00, 0x00, 0xa0, 0xe3, 0x11, 0xff, 0x2f, 0xe1, -0x24, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x28, 0x10, 0x9a, 0xe5, -0x11, 0xff, 0x2f, 0xe1, 0x2c, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, -0x30, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x34, 0x10, 0x9a, 0xe5, -0x11, 0xff, 0x2f, 0xe1, 0xfe, 0xff, 0xff, 0xea, 0x38, 0xe0, 0x9a, 0xe5, -0x3c, 0x10, 0x9a, 0xe5, 0x18, 0x00, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, -0x38, 0xe0, 0x9a, 0xe5, 0x3c, 0x10, 0x9a, 0xe5, 0x14, 0x00, 0x9a, 0xe5, -0x11, 0xff, 0x2f, 0xe1, 0x64, 0x20, 0x9f, 0xe5, 0x00, 0x30, 0x92, 0xe5, -0x00, 0x30, 0x53, 0xe0, 0x0a, 0x00, 0x00, 0xba, 0x00, 0x30, 0x82, 0xe5, -0x0c, 0x00, 0x92, 0xe5, 0x08, 0x30, 0x92, 0xe5, 0x00, 0x10, 0x91, 0xe2, -0x03, 0x00, 0x00, 0x0a, 0x03, 0x10, 0x80, 0xe7, 0x04, 0x30, 0x53, 0xe2, -0x3c, 0x30, 0xa0, 0xb3, 0x08, 0x30, 0x82, 0xe5, 0x01, 0x00, 0xa0, 0xe3, -0x1e, 0xff, 0x2f, 0xe1, 0x3c, 0x10, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, -0x01, 0x00, 0x80, 0xe2, 0x00, 0x00, 0x81, 0xe5, 0x00, 0x00, 0xa0, 0xe3, -0xf8, 0xff, 0xff, 0xea, 0x10, 0x00, 0x9f, 0xe5, 0x08, 0x10, 0x90, 0xe5, -0x04, 0x10, 0x51, 0xe2, 0x3c, 0x10, 0xa0, 0xb3, 0x08, 0x10, 0x80, 0xe5, -0x1e, 0xff, 0x2f, 0xe1, 0x50, 0x2d, 0x00, 0x80, 0x4c, 0x04, 0x00, 0x80, -0xe5, 0x2a, 0xff, 0xff, 0x45, 0x3d, 0xff, 0xff, 0x3d, 0x2b, 0xff, 0xff, -0xa0, 0x82, 0x20, 0x40, 0xc9, 0x1c, 0x89, 0x08, 0x89, 0x00, 0x01, 0x23, -0x85, 0x4a, 0x5b, 0x07, 0x18, 0x43, 0x13, 0x68, 0x5b, 0x18, 0x13, 0x60, -0x00, 0x1f, 0x81, 0xa3, 0x5b, 0x1a, 0x18, 0x47, 0x04, 0x20, 0xa0, 0xe5, +0x01, 0x02, 0x14, 0xe3, 0x4c, 0x00, 0x9a, 0x15, 0x10, 0xff, 0x2f, 0x11, +0x01, 0x04, 0x14, 0xe3, 0x50, 0x00, 0x9a, 0x15, 0x10, 0xff, 0x2f, 0x11, +0x01, 0x0a, 0x14, 0xe3, 0x21, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x14, 0xe3, +0x0e, 0x00, 0x00, 0x1b, 0x10, 0x00, 0x9a, 0xe5, 0x00, 0x00, 0x14, 0xe1, +0x1c, 0x00, 0x00, 0x1b, 0x00, 0x40, 0x99, 0xe5, 0x04, 0x50, 0xa0, 0xe3, +0x00, 0x40, 0x94, 0xe2, 0x1b, 0xff, 0x2f, 0x11, 0x3f, 0x40, 0xbd, 0xe8, +0x04, 0xf0, 0x5e, 0xe2, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x61, 0xe1, +0xfa, 0xff, 0xff, 0xea, 0x18, 0x00, 0x9a, 0xe5, 0x1c, 0x10, 0x9a, 0xe5, +0x11, 0xff, 0x2f, 0xe1, 0x54, 0xb0, 0x9a, 0xe5, 0x1c, 0x10, 0x9a, 0xe5, +0x14, 0x00, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x20, 0x10, 0x9a, 0xe5, +0x00, 0x00, 0xa0, 0xe3, 0x11, 0xff, 0x2f, 0xe1, 0x24, 0x10, 0x9a, 0xe5, +0x11, 0xff, 0x2f, 0xe1, 0x28, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, +0x2c, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x30, 0x10, 0x9a, 0xe5, +0x11, 0xff, 0x2f, 0xe1, 0x34, 0x10, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, +0xfe, 0xff, 0xff, 0xea, 0x38, 0xe0, 0x9a, 0xe5, 0x3c, 0x10, 0x9a, 0xe5, +0x18, 0x00, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, 0x38, 0xe0, 0x9a, 0xe5, +0x3c, 0x10, 0x9a, 0xe5, 0x14, 0x00, 0x9a, 0xe5, 0x11, 0xff, 0x2f, 0xe1, +0x64, 0x20, 0x9f, 0xe5, 0x00, 0x30, 0x92, 0xe5, 0x00, 0x30, 0x53, 0xe0, +0x0a, 0x00, 0x00, 0xba, 0x00, 0x30, 0x82, 0xe5, 0x0c, 0x00, 0x92, 0xe5, +0x08, 0x30, 0x92, 0xe5, 0x00, 0x10, 0x91, 0xe2, 0x03, 0x00, 0x00, 0x0a, +0x03, 0x10, 0x80, 0xe7, 0x04, 0x30, 0x53, 0xe2, 0x3c, 0x30, 0xa0, 0xb3, +0x08, 0x30, 0x82, 0xe5, 0x01, 0x00, 0xa0, 0xe3, 0x1e, 0xff, 0x2f, 0xe1, +0x3c, 0x10, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x01, 0x00, 0x80, 0xe2, +0x00, 0x00, 0x81, 0xe5, 0x00, 0x00, 0xa0, 0xe3, 0xf8, 0xff, 0xff, 0xea, +0x10, 0x00, 0x9f, 0xe5, 0x08, 0x10, 0x90, 0xe5, 0x04, 0x10, 0x51, 0xe2, +0x3c, 0x10, 0xa0, 0xb3, 0x08, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, +0xe4, 0x2d, 0x00, 0x80, 0xcc, 0x04, 0x00, 0x80, 0x5d, 0x2b, 0xff, 0xff, +0xbd, 0x3d, 0xff, 0xff, 0xb5, 0x2b, 0xff, 0xff, 0xa0, 0x82, 0x20, 0x40, +0xc9, 0x1c, 0x89, 0x08, 0x89, 0x00, 0x01, 0x23, 0x85, 0x4a, 0x5b, 0x07, +0x18, 0x43, 0x13, 0x68, 0x5b, 0x18, 0x13, 0x60, 0x00, 0x1f, 0x81, 0xa3, +0x5b, 0x1a, 0x18, 0x47, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, +0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, @@ -1879,7 +1892,6 @@ 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, -0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, @@ -1909,9 +1921,9 @@ 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, -0x04, 0x20, 0xa0, 0xe5, 0x04, 0x20, 0xa0, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, -0x50, 0x2d, 0x00, 0x80, 0x98, 0x00, 0x9f, 0xe5, 0x98, 0x10, 0x9f, 0xe5, -0x01, 0x20, 0x40, 0xe0, 0x94, 0x30, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, +0x04, 0x20, 0xa0, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0xe4, 0x2d, 0x00, 0x80, +0x98, 0x00, 0x9f, 0xe5, 0x98, 0x10, 0x9f, 0xe5, 0x01, 0x20, 0x40, 0xe0, +0x94, 0x30, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x03, 0x00, 0x50, 0xe1, 0x03, 0x00, 0x00, 0x1a, 0x04, 0x10, 0x81, 0xe2, 0x04, 0x20, 0x52, 0xe2, 0x00, 0x00, 0x00, 0x0a, 0xf8, 0xff, 0xff, 0xea, 0x78, 0x00, 0x9f, 0xe5, 0x00, 0x20, 0x80, 0xe5, 0x74, 0x00, 0x9f, 0xe5, @@ -1922,125 +1934,125 @@ 0x4c, 0x00, 0x9f, 0xe5, 0x4c, 0x10, 0x9f, 0xe5, 0x01, 0x20, 0x40, 0xe0, 0x2c, 0x30, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x03, 0x00, 0x50, 0xe1, 0x03, 0x00, 0x00, 0x1a, 0x04, 0x10, 0x81, 0xe2, 0x04, 0x20, 0x52, 0xe2, -0x00, 0x00, 0x00, 0x0a, 0xf8, 0xff, 0xff, 0xea, -0x28, 0x00, 0x9f, 0xe5, 0x00, 0x20, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, -0x7c, 0x34, 0x00, 0x80, 0x80, 0x30, 0x00, 0x80, 0xad, 0xde, 0xad, 0xde, -0x40, 0x04, 0x00, 0x80, 0xfc, 0x37, 0x00, 0x80, 0x80, 0x34, 0x00, 0x80, -0x44, 0x04, 0x00, 0x80, 0xfc, 0x3f, 0x00, 0x80, 0x40, 0x38, 0x00, 0x80, -0x48, 0x04, 0x00, 0x80, 0x78, 0x47, 0x00, 0x00, 0x91, 0xea, 0xff, 0xea, -0x78, 0x47, 0x00, 0x00, 0x39, 0xfe, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, -0x63, 0xfe, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xea, -0x78, 0x47, 0x00, 0x00, 0x8b, 0xea, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, -0x61, 0x6d, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0xff, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xb9, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, -0xd5, 0x0b, 0xff, 0xff, 0x03, 0xff, 0x06, 0x54, 0x03, 0x00, 0x00, 0x00, -0x75, 0x04, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x05, 0xff, 0xff, -0x04, 0xff, 0x07, 0x54, 0x03, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0xf1, 0x05, 0xff, 0xff, 0x05, 0xff, 0x05, 0x54, -0x03, 0x00, 0x00, 0x00, 0x39, 0x04, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, -0x55, 0x05, 0xff, 0xff, 0x00, 0xff, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, -0xf5, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0e, 0xff, 0xff, -0x01, 0xff, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x02, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0xf1, 0x02, 0xff, 0xff, 0xff, 0xff, 0x01, 0x44, -0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x65, 0x0d, 0xff, 0xff, 0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -0xbd, 0x4f, 0xff, 0xff, 0x01, 0x50, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, +0x00, 0x00, 0x00, 0x0a, 0xf8, 0xff, 0xff, 0xea, 0x28, 0x00, 0x9f, 0xe5, +0x00, 0x20, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x7c, 0x34, 0x00, 0x80, +0x80, 0x30, 0x00, 0x80, 0xad, 0xde, 0xad, 0xde, 0xc0, 0x04, 0x00, 0x80, +0xfc, 0x37, 0x00, 0x80, 0x80, 0x34, 0x00, 0x80, 0xc4, 0x04, 0x00, 0x80, +0xfc, 0x3f, 0x00, 0x80, 0x40, 0x38, 0x00, 0x80, 0xc8, 0x04, 0x00, 0x80, +0x78, 0x47, 0x00, 0x00, 0x76, 0xea, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, +0x39, 0xfe, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x63, 0xfe, 0xff, 0xea, +0x78, 0x47, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, +0x70, 0xea, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x95, 0x22, 0x00, 0x00, +0x00, 0x01, 0x00, 0x80, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xb9, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x0b, 0xff, 0xff, +0x03, 0xff, 0x06, 0x54, 0x03, 0x00, 0x00, 0x00, 0x75, 0x04, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0xa1, 0x05, 0xff, 0xff, 0x04, 0xff, 0x07, 0x54, +0x03, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, +0xf1, 0x05, 0xff, 0xff, 0x05, 0xff, 0x05, 0x54, 0x03, 0x00, 0x00, 0x00, +0x39, 0x04, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x55, 0x05, 0xff, 0xff, +0x01, 0xff, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x41, 0x18, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x61, 0x0e, 0xff, 0xff, 0x02, 0xff, 0x02, 0x08, +0x00, 0x00, 0x00, 0x00, 0xa1, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, +0xf1, 0x02, 0xff, 0xff, 0xff, 0xff, 0x01, 0x44, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x0d, 0xff, 0xff, +0x06, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x50, 0xff, 0xff, +0x6d, 0x50, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x80, -0x19, 0x78, 0x21, 0x40, 0x23, 0x78, 0x21, 0x40, 0x39, 0x78, 0x21, 0x40, -0x51, 0x78, 0x21, 0x40, 0x5d, 0x78, 0x21, 0x40, 0x6b, 0x78, 0x21, 0x40, -0x85, 0x78, 0x21, 0x40, 0xb1, 0x78, 0x21, 0x40, 0x75, 0x79, 0x21, 0x40, +0x00, 0x00, 0x00, 0x00, 0x48, 0x05, 0x00, 0x80, 0x19, 0x78, 0x21, 0x40, +0x23, 0x78, 0x21, 0x40, 0x39, 0x78, 0x21, 0x40, 0x51, 0x78, 0x21, 0x40, +0x5d, 0x78, 0x21, 0x40, 0x6b, 0x78, 0x21, 0x40, 0x85, 0x78, 0x21, 0x40, +0xb1, 0x78, 0x21, 0x40, 0x75, 0x79, 0x21, 0x40, 0xcd, 0x79, 0x21, 0x40, 0xdb, 0x79, 0x21, 0x40, 0xe5, 0x79, 0x21, 0x40, -0xef, 0x79, 0x21, 0x40, 0x81, 0x7a, 0x21, 0x40, 0x8f, 0x7a, 0x21, 0x40, -0x9d, 0x7a, 0x21, 0x40, 0x35, 0x7b, 0x21, 0x40, 0x03, 0x7f, 0x21, 0x40, -0x71, 0x7f, 0x21, 0x40, 0x19, 0x80, 0x21, 0x40, 0x4d, 0x81, 0x21, 0x40, -0x59, 0x81, 0x21, 0x40, 0xb9, 0x81, 0x21, 0x40, 0x1d, 0x82, 0x21, 0x40, -0x49, 0x82, 0x21, 0x40, 0x6d, 0x82, 0x21, 0x40, 0xad, 0x82, 0x21, 0x40, -0xd5, 0x82, 0x21, 0x40, 0x1d, 0x83, 0x21, 0x40, 0x2d, 0x83, 0x21, 0x40, -0x55, 0x83, 0x21, 0x40, 0x65, 0x83, 0x21, 0x40, 0xad, 0x83, 0x21, 0x40, -0xeb, 0x83, 0x21, 0x40, 0x41, 0x84, 0x21, 0x40, 0xa1, 0x84, 0x21, 0x40, -0xab, 0x84, 0x21, 0x40, 0xaf, 0x84, 0x21, 0x40, 0x1d, 0x85, 0x21, 0x40, -0x75, 0x85, 0x21, 0x40, 0xcd, 0x85, 0x21, 0x40, -0x09, 0x86, 0x21, 0x40, 0x6d, 0x86, 0x21, 0x40, 0xa5, 0x86, 0x21, 0x40, -0xb5, 0x86, 0x21, 0x40, 0xed, 0x86, 0x21, 0x40, 0xfd, 0x86, 0x21, 0x40, -0x11, 0x87, 0x21, 0x40, 0x39, 0x87, 0x21, 0x40, 0x43, 0x87, 0x21, 0x40, -0x4d, 0x87, 0x21, 0x40, 0x57, 0x87, 0x21, 0x40, 0xc1, 0x87, 0x21, 0x40, -0xcd, 0x87, 0x21, 0x40, 0x41, 0x88, 0x21, 0x40, 0x4b, 0x88, 0x21, 0x40, -0x55, 0x88, 0x21, 0x40, 0x5f, 0x88, 0x21, 0x40, 0x69, 0x88, 0x21, 0x40, -0x73, 0x88, 0x21, 0x40, 0x7d, 0x88, 0x21, 0x40, 0x87, 0x88, 0x21, 0x40, -0x91, 0x88, 0x21, 0x40, 0x9b, 0x88, 0x21, 0x40, 0xa5, 0x88, 0x21, 0x40, -0xaf, 0x88, 0x21, 0x40, 0xb9, 0x88, 0x21, 0x40, 0xc3, 0x88, 0x21, 0x40, -0xeb, 0x88, 0x21, 0x40, 0xf5, 0x88, 0x21, 0x40, 0x51, 0x89, 0x21, 0x40, -0x5b, 0x89, 0x21, 0x40, 0x65, 0x89, 0x21, 0x40, 0x6f, 0x89, 0x21, 0x40, -0x79, 0x89, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, 0x83, 0x89, 0x21, 0x40, -0xe9, 0x89, 0x21, 0x40, 0x35, 0x8a, 0x21, 0x40, 0x81, 0x8a, 0x21, 0x40, -0x91, 0x8a, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, 0xdd, 0x8a, 0x21, 0x40, -0xe1, 0x8a, 0x21, 0x40, 0xe5, 0x8a, 0x21, 0x40, 0x3d, 0x8b, 0x21, 0x40, -0x65, 0x8b, 0x21, 0x40, 0x71, 0x8b, 0x21, 0x40, 0x75, 0x8b, 0x21, 0x40, -0x79, 0x8b, 0x21, 0x40, 0xe9, 0x8b, 0x21, 0x40, 0xed, 0x8b, 0x21, 0x40, -0xf1, 0x8b, 0x21, 0x40, 0x7d, 0x8b, 0x21, 0x40, 0x05, 0x88, 0x21, 0x40, -0xa5, 0x77, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, 0xf5, 0x8b, 0x21, 0x40, -0xe9, 0xc1, 0x21, 0x40, 0xe9, 0x77, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, -0xa5, 0x77, 0x21, 0x40, 0xcd, 0xc2, 0x21, 0x40, 0x03, 0xc3, 0x21, 0x40, -0x35, 0xc3, 0x21, 0x40, 0x4d, 0x8c, 0x21, 0x40, 0x3f, 0x7b, 0x21, 0x40, -0x99, 0x7e, 0x21, 0x40, 0xd5, 0x7e, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x5c, 0x01, 0x18, 0x40, 0x58, 0x01, 0x18, 0x40, 0x24, 0xa3, 0x20, 0x40, -0x24, 0xa7, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x6c, 0x01, 0x18, 0x40, 0x68, 0x01, 0x18, 0x40, 0x24, 0x83, 0x20, 0x40, -0x24, 0xa3, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x7c, 0x01, 0x18, 0x40, 0x78, 0x01, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x8c, 0x01, 0x18, 0x40, 0x88, 0x01, 0x18, 0x40, 0x24, 0xa9, 0x20, 0x40, -0x24, 0xab, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xef, 0x79, 0x21, 0x40, 0x8d, 0x7a, 0x21, 0x40, 0x9b, 0x7a, 0x21, 0x40, +0xa9, 0x7a, 0x21, 0x40, 0x51, 0x7b, 0x21, 0x40, 0x4f, 0x7f, 0x21, 0x40, +0xc9, 0x7f, 0x21, 0x40, 0x69, 0x80, 0x21, 0x40, 0x9d, 0x81, 0x21, 0x40, +0xa9, 0x81, 0x21, 0x40, 0x09, 0x82, 0x21, 0x40, 0x6d, 0x82, 0x21, 0x40, +0x99, 0x82, 0x21, 0x40, 0xbd, 0x82, 0x21, 0x40, 0xfd, 0x82, 0x21, 0x40, +0x25, 0x83, 0x21, 0x40, 0x6d, 0x83, 0x21, 0x40, 0x7d, 0x83, 0x21, 0x40, +0xa5, 0x83, 0x21, 0x40, 0xb5, 0x83, 0x21, 0x40, 0xfd, 0x83, 0x21, 0x40, +0x3b, 0x84, 0x21, 0x40, 0x91, 0x84, 0x21, 0x40, 0xf1, 0x84, 0x21, 0x40, +0xfb, 0x84, 0x21, 0x40, 0xff, 0x84, 0x21, 0x40, 0x6d, 0x85, 0x21, 0x40, +0xb9, 0x85, 0x21, 0x40, 0x11, 0x86, 0x21, 0x40, 0x4d, 0x86, 0x21, 0x40, +0xb1, 0x86, 0x21, 0x40, 0xe9, 0x86, 0x21, 0x40, 0xf9, 0x86, 0x21, 0x40, +0x31, 0x87, 0x21, 0x40, 0x41, 0x87, 0x21, 0x40, 0x55, 0x87, 0x21, 0x40, +0x7d, 0x87, 0x21, 0x40, 0x87, 0x87, 0x21, 0x40, 0x91, 0x87, 0x21, 0x40, +0xf5, 0x87, 0x21, 0x40, 0x25, 0x88, 0x21, 0x40, 0x31, 0x88, 0x21, 0x40, +0xa5, 0x88, 0x21, 0x40, 0xaf, 0x88, 0x21, 0x40, 0xb9, 0x88, 0x21, 0x40, +0xc3, 0x88, 0x21, 0x40, 0xcd, 0x88, 0x21, 0x40, 0xd7, 0x88, 0x21, 0x40, +0xe1, 0x88, 0x21, 0x40, 0xeb, 0x88, 0x21, 0x40, 0xf5, 0x88, 0x21, 0x40, +0xe9, 0x8b, 0x21, 0x40, 0xff, 0x88, 0x21, 0x40, 0x09, 0x89, 0x21, 0x40, +0x13, 0x89, 0x21, 0x40, 0x1d, 0x89, 0x21, 0x40, 0x45, 0x89, 0x21, 0x40, +0x4f, 0x89, 0x21, 0x40, 0xb1, 0x89, 0x21, 0x40, 0xbb, 0x89, 0x21, 0x40, +0xc5, 0x89, 0x21, 0x40, 0xcf, 0x89, 0x21, 0x40, 0xd9, 0x89, 0x21, 0x40, +0xa5, 0x77, 0x21, 0x40, 0xe3, 0x89, 0x21, 0x40, 0x49, 0x8a, 0x21, 0x40, +0x95, 0x8a, 0x21, 0x40, 0xe1, 0x8a, 0x21, 0x40, 0xf1, 0x8a, 0x21, 0x40, +0xa5, 0x77, 0x21, 0x40, 0x3d, 0x8b, 0x21, 0x40, 0x41, 0x8b, 0x21, 0x40, +0x45, 0x8b, 0x21, 0x40, 0x9d, 0x8b, 0x21, 0x40, 0xc5, 0x8b, 0x21, 0x40, +0xd1, 0x8b, 0x21, 0x40, 0xd5, 0x8b, 0x21, 0x40, 0xd9, 0x8b, 0x21, 0x40, +0xdd, 0x8b, 0x21, 0x40, 0xe1, 0x8b, 0x21, 0x40, 0xe5, 0x8b, 0x21, 0x40, +0x0d, 0x88, 0x21, 0x40, 0x69, 0x88, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, +0xa5, 0x77, 0x21, 0x40, 0xf5, 0x8b, 0x21, 0x40, 0xe1, 0xc9, 0x21, 0x40, +0xe9, 0x77, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, 0xa5, 0x77, 0x21, 0x40, +0xdd, 0xca, 0x21, 0x40, 0x13, 0xcb, 0x21, 0x40, 0x45, 0xcb, 0x21, 0x40, +0x4d, 0x8c, 0x21, 0x40, 0x5b, 0x7b, 0x21, 0x40, 0xe5, 0x7e, 0x21, 0x40, +0x21, 0x7f, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x18, 0x40, +0x58, 0x01, 0x18, 0x40, 0x24, 0xa3, 0x20, 0x40, 0x24, 0xa7, 0x20, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x18, 0x40, +0x68, 0x01, 0x18, 0x40, 0x24, 0x83, 0x20, 0x40, 0x24, 0xa3, 0x20, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x01, 0x18, 0x40, +0x78, 0x01, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x18, 0x40, +0x88, 0x01, 0x18, 0x40, 0x24, 0xa9, 0x20, 0x40, 0x24, 0xab, 0x20, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x24, 0xa8, 0x20, 0x40, 0xa4, 0xa8, 0x20, 0x40, 0xa4, 0xa8, 0x20, 0x40, 0x24, 0xa9, 0x20, 0x40, -0x00, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x21, 0x40, 0x6d, 0xb3, 0x21, 0x40, -0x00, 0x00, 0x00, 0x00, 0x91, 0x73, 0x21, 0x40, 0x89, 0xaa, 0x21, 0x40, +0x00, 0x00, 0x00, 0x00, 0xa5, 0xb9, 0x21, 0x40, 0x01, 0xbb, 0x21, 0x40, +0x00, 0x00, 0x00, 0x00, 0x91, 0x73, 0x21, 0x40, 0x19, 0xb2, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x67, 0x92, 0x21, 0x40, 0x11, 0xb2, 0x21, 0x40, -0x39, 0x2f, 0xff, 0xff, 0xad, 0x20, 0xff, 0xff, 0x97, 0x20, 0xff, 0xff, -0xe9, 0xb0, 0x21, 0x40, 0xa0, 0x2d, 0x00, 0x80, 0xb4, 0x2d, 0x00, 0x80, -0xc8, 0x2d, 0x00, 0x80, 0x30, 0x33, 0x3a, 0x31, 0x31, 0x3a, 0x31, 0x31, -0x00, 0x30, 0x37, 0x2f, 0x32, 0x33, 0x2f, 0x30, -0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x31, 0x35, 0x36, 0x39, 0x00, 0x43, -0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, -0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x33, 0x43, 0x6f, 0x6d, 0x20, 0x43, -0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, -0x17, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0c, 0x53, 0xff, 0xff, 0x27, 0xf0, 0x7d, 0xfd, -0x00, 0x01, 0x00, 0x02, 0xda, 0x0e, 0x82, 0x00, 0x01, 0x40, 0x64, 0x04, -0xd0, 0x2c, 0x00, 0x80, 0x50, 0x2c, 0x00, 0x80, 0xe5, 0x3d, 0xff, 0xff, -0x49, 0x4f, 0xff, 0xff, 0x79, 0x24, 0xff, 0xff, 0x3d, 0x3b, 0xff, 0xff, -0x9d, 0x3b, 0xff, 0xff, 0xa1, 0x19, 0xff, 0xff, 0x19, 0x11, 0xff, 0xff, -0x4c, 0x53, 0xff, 0xff, 0x99, 0x3f, 0xff, 0xff, 0x91, 0x73, 0x21, 0x40, -0x51, 0x75, 0x21, 0x40, 0x51, 0x3f, 0xff, 0xff, 0x11, 0xa3, 0x21, 0x40, -0x29, 0x24, 0xff, 0xff, 0xe4, 0x52, 0xff, 0xff, 0x0c, 0x53, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x30, 0x00, 0x80, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, -0xb8, 0x60, 0x00, 0x00, 0x74, 0x6c, 0x00, 0x00, 0x00, 0x6e, 0x21, 0x40, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, -0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, -0xfd, 0x92, 0x21, 0x40, 0x9b, 0x92, 0x21, 0x40, 0xc1, 0x95, 0x21, 0x40, -0x21, 0x96, 0x21, 0x40, 0xe9, 0x96, 0x21, 0x40, 0xa7, 0x94, 0x21, 0x40, -0xc5, 0x97, 0x21, 0x40, 0x31, 0x98, 0x21, 0x40, 0x85, 0x94, 0x21, 0x40, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xa7, 0x99, 0x21, 0x40, 0xa5, 0xb9, 0x21, 0x40, +0xb1, 0x2f, 0xff, 0xff, 0xf1, 0x20, 0xff, 0xff, 0xdb, 0x20, 0xff, 0xff, +0x2d, 0xb8, 0x21, 0x40, 0x34, 0x2e, 0x00, 0x80, 0x48, 0x2e, 0x00, 0x80, +0x5c, 0x2e, 0x00, 0x80, 0x30, 0x33, 0x3a, 0x31, 0x31, 0x3a, 0x31, 0x31, +0x00, 0x30, 0x37, 0x2f, 0x32, 0x33, 0x2f, 0x30, 0x31, 0x00, 0x30, 0x30, +0x30, 0x30, 0x31, 0x35, 0x36, 0x39, 0x00, 0x43, 0x6f, 0x70, 0x79, 0x72, +0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, +0x31, 0x20, 0x33, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, +0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, 0x02, 0x10, 0x00, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x53, 0xff, 0xff, 0x27, 0xf0, 0x7d, 0xfd, 0x00, 0x01, 0x00, 0x02, +0xda, 0x0e, 0x82, 0x00, 0x01, 0x40, 0x64, 0x04, 0x64, 0x2d, 0x00, 0x80, +0xe4, 0x2c, 0x00, 0x80, 0x55, 0x3e, 0xff, 0xff, 0xb5, 0x4f, 0xff, 0xff, +0xc1, 0x24, 0xff, 0xff, 0xb5, 0x3b, 0xff, 0xff, 0x15, 0x3c, 0xff, 0xff, +0x05, 0x1a, 0xff, 0xff, 0x65, 0x11, 0xff, 0xff, 0xb8, 0x53, 0xff, 0xff, +0x0d, 0x40, 0xff, 0xff, 0x91, 0x73, 0x21, 0x40, 0x51, 0x75, 0x21, 0x40, +0xc5, 0x3f, 0xff, 0xff, 0x71, 0xaa, 0x21, 0x40, 0x71, 0x24, 0xff, 0xff, +0x50, 0x53, 0xff, 0xff, 0x78, 0x53, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0x00, 0x00, 0x80, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0xec, 0x68, 0x00, 0x00, +0x10, 0x5c, 0x00, 0x00, 0x00, 0x6e, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, +0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3d, 0x9a, 0x21, 0x40, +0xdb, 0x99, 0x21, 0x40, 0xf5, 0x9c, 0x21, 0x40, 0x55, 0x9d, 0x21, 0x40, +0x1d, 0x9e, 0x21, 0x40, 0xdb, 0x9b, 0x21, 0x40, 0xf9, 0x9e, 0x21, 0x40, +0x65, 0x9f, 0x21, 0x40, 0xb9, 0x9b, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2051,7 +2063,6 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2084,92 +2095,93 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -0xb5, 0xce, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xc3, 0x21, 0x40, -0x45, 0xc5, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xcc, 0x21, 0x40, -0x59, 0xcd, 0x21, 0x40, 0xc5, 0xcd, 0x21, 0x40, 0x09, 0x29, 0x09, 0xd1, +0xe9, 0xd6, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xcb, 0x21, 0x40, +0x55, 0xcd, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x25, 0xd5, 0x21, 0x40, +0x8d, 0xd5, 0x21, 0x40, 0xf9, 0xd5, 0x21, 0x40, 0x09, 0x29, 0x09, 0xd1, 0x20, 0x28, 0x07, 0xd2, 0x04, 0x48, 0x01, 0x78, 0x00, 0x29, 0x03, 0xd1, 0x01, 0x21, 0x01, 0x70, 0x02, 0x48, 0x70, 0x47, 0x00, 0x20, 0xfc, 0xe7, 0x00, 0x6e, 0x21, 0x40, 0x24, 0xab, 0x20, 0x40, 0x03, 0x49, 0x88, 0x42, 0x03, 0xd1, 0x00, 0x20, 0x02, 0x49, 0xc0, 0x46, 0x08, 0x70, 0x70, 0x47, -0x24, 0xab, 0x20, 0x40, 0x00, 0x6e, 0x21, 0x40, -0x00, 0xb5, 0x00, 0x20, 0x0b, 0x4a, 0x0b, 0x23, 0x1b, 0x02, 0xd1, 0x18, -0x2d, 0x23, 0x9b, 0x01, 0xd3, 0x18, 0x48, 0x61, 0x98, 0x60, 0x98, 0x63, -0x80, 0x32, 0x88, 0x60, 0xc8, 0x60, 0x08, 0x61, 0x90, 0x62, 0x05, 0x48, -0xc0, 0x46, 0x08, 0x60, 0x48, 0x60, 0x05, 0xf0, 0xc3, 0xf9, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0xfe, 0x03, 0x00, 0x00, -0xf0, 0xb5, 0x84, 0xb0, 0x0c, 0x1c, 0x05, 0x1c, 0x00, 0x23, 0x00, 0x93, -0xff, 0xf7, 0xda, 0xff, 0x68, 0x49, 0x0b, 0x23, 0x1b, 0x02, 0xcf, 0x18, -0x38, 0x68, 0x28, 0x40, 0x00, 0x22, 0xb8, 0x60, 0xfa, 0x60, 0x7a, 0x68, -0x22, 0x40, 0x3a, 0x61, 0x0c, 0x1c, 0x41, 0x09, 0x03, 0xd2, 0x51, 0x09, -0x01, 0xd2, 0x80, 0x0a, 0x02, 0xd3, 0x60, 0x48, 0x00, 0xf0, 0xc2, 0xf8, -0x01, 0x20, 0xb9, 0x68, 0x49, 0x09, 0x03, 0xd2, 0x39, 0x69, 0x49, 0x09, -0x00, 0xd2, 0x00, 0x20, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0xf8, 0xfd, -0xb8, 0x68, 0x00, 0x28, 0x70, 0xd0, 0x00, 0x23, 0x02, 0x93, 0x01, 0x93, -0x54, 0x4a, 0x01, 0x23, 0x18, 0x43, 0xb8, 0x60, 0x00, 0x20, 0xd5, 0x1d, -0x79, 0x35, 0x03, 0x95, 0x01, 0x24, 0x00, 0x21, 0x4f, 0x4d, 0xba, 0x68, -0x22, 0x40, 0x39, 0xd0, 0x8a, 0x00, 0x52, 0x18, 0x92, 0x00, 0x4e, 0x4b, -0x9b, 0x5c, 0x1e, 0x1c, 0x83, 0x42, 0x04, 0xd0, 0x4b, 0x4b, 0xd3, 0x18, -0x5b, 0x78, 0x83, 0x42, 0x2c, 0xd1, 0x49, 0x4b, 0xd2, 0x18, 0xd3, 0x78, -0x03, 0x9d, 0xad, 0x6a, 0xab, 0x42, 0x02, 0xd9, 0x03, 0x9d, 0xc0, 0x46, -0xab, 0x62, 0x53, 0x68, 0x5b, 0x08, 0x01, 0xd3, 0x01, 0x23, 0x00, 0x93, -0x86, 0x42, 0x0a, 0xd1, 0x95, 0x68, 0x02, 0x9b, 0x5e, 0x1c, 0x02, 0x96, -0x9b, 0x00, 0x3c, 0x4e, 0x9e, 0x19, 0x0b, 0x23, 0x1b, 0x02, 0xf3, 0x18, -0x5d, 0x61, 0x53, 0x78, 0x83, 0x42, 0x0d, 0xd1, 0xd2, 0x68, 0x01, 0x9b, -0x5d, 0x1c, 0x01, 0x95, 0x9b, 0x00, 0x35, 0x4d, 0x5d, 0x19, 0x2d, 0x23, -0x9b, 0x01, 0xeb, 0x18, 0x9a, 0x60, 0xfa, 0x68, 0x01, 0x32, 0xfa, 0x60, -0x64, 0x00, 0x01, 0x31, 0x0b, 0x29, 0xbd, 0xd3, 0x01, 0x30, 0x09, 0x28, -0xb8, 0xd3, 0x00, 0x20, 0x02, 0x9b, 0x99, 0x00, 0x2b, 0x4a, 0x89, 0x18, -0x0b, 0x23, 0x1b, 0x02, 0xc9, 0x18, 0x48, 0x61, 0x01, 0x9b, 0x99, 0x00, -0x89, 0x18, 0x2d, 0x23, 0x9b, 0x01, 0xc9, 0x18, 0x88, 0x60, 0x00, 0x9b, -0x00, 0x2b, 0x0c, 0xd1, 0x81, 0x00, 0x89, 0x18, 0x0b, 0x23, 0x1b, 0x02, -0xc9, 0x18, 0x8b, 0x69, 0xc0, 0x46, 0x4b, 0x61, 0x01, 0x30, 0x0b, 0x28, -0xf4, 0xd3, 0x08, 0xe0, 0x07, 0xe0, 0x03, 0x9d, 0xa8, 0x6a, 0x30, 0x28, -0x03, 0xd2, 0x30, 0x20, 0x03, 0x9d, 0xc0, 0x46, 0xa8, 0x62, 0x19, 0x4a, -0x38, 0x69, 0x00, 0x28, 0x2a, 0xd0, 0x00, 0x21, 0x01, 0x23, 0x18, 0x43, -0x38, 0x61, 0x00, 0x20, 0x01, 0x24, 0x00, 0x22, 0x13, 0x4e, 0x3b, 0x69, +0x24, 0xab, 0x20, 0x40, 0x00, 0x6e, 0x21, 0x40, 0x00, 0xb5, 0x00, 0x20, +0x0b, 0x4a, 0x0b, 0x23, 0x1b, 0x02, 0xd1, 0x18, 0x2d, 0x23, 0x9b, 0x01, +0xd3, 0x18, 0x88, 0x61, 0xd8, 0x60, 0xd8, 0x63, 0x80, 0x32, 0xc8, 0x60, +0x08, 0x61, 0x48, 0x61, 0xd0, 0x62, 0x05, 0x48, 0xc0, 0x46, 0x48, 0x60, +0x88, 0x60, 0x05, 0xf0, 0xcb, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0xfe, 0x03, 0x00, 0x00, 0xf0, 0xb5, 0x84, 0xb0, +0x0c, 0x1c, 0x05, 0x1c, 0x00, 0x23, 0x00, 0x93, 0xff, 0xf7, 0xda, 0xff, +0x68, 0x49, 0x0b, 0x23, 0x1b, 0x02, 0xcf, 0x18, 0x78, 0x68, 0x28, 0x40, +0x00, 0x22, 0xf8, 0x60, 0x3a, 0x61, 0xba, 0x68, 0x22, 0x40, 0x7a, 0x61, +0x0c, 0x1c, 0x41, 0x09, 0x03, 0xd2, 0x51, 0x09, 0x01, 0xd2, 0x80, 0x0a, +0x02, 0xd3, 0x60, 0x48, 0x00, 0xf0, 0xc2, 0xf8, 0x01, 0x20, 0xf9, 0x68, +0x49, 0x09, 0x03, 0xd2, 0x79, 0x69, 0x49, 0x09, 0x00, 0xd2, 0x00, 0x20, +0x00, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0xc8, 0xf9, 0xf8, 0x68, 0x00, 0x28, +0x70, 0xd0, 0x00, 0x23, 0x02, 0x93, 0x01, 0x93, 0x54, 0x4a, 0x01, 0x23, +0x18, 0x43, 0xf8, 0x60, 0x00, 0x20, 0xd5, 0x1d, 0x79, 0x35, 0x03, 0x95, +0x01, 0x24, 0x00, 0x21, 0x4f, 0x4d, 0xfa, 0x68, 0x22, 0x40, 0x39, 0xd0, +0x8a, 0x00, 0x52, 0x18, 0x92, 0x00, 0x4e, 0x4b, 0x9b, 0x5c, 0x1e, 0x1c, +0x83, 0x42, 0x04, 0xd0, 0x4b, 0x4b, 0xd3, 0x18, 0x5b, 0x78, 0x83, 0x42, +0x2c, 0xd1, 0x49, 0x4b, 0xd2, 0x18, 0xd3, 0x78, 0x03, 0x9d, 0xed, 0x6a, +0xab, 0x42, 0x02, 0xd9, 0x03, 0x9d, 0xc0, 0x46, 0xeb, 0x62, 0x53, 0x68, +0x5b, 0x08, 0x01, 0xd3, 0x01, 0x23, 0x00, 0x93, 0x86, 0x42, 0x0a, 0xd1, +0x95, 0x68, 0x02, 0x9b, 0x5e, 0x1c, 0x02, 0x96, 0x9b, 0x00, 0x3c, 0x4e, +0x9e, 0x19, 0x0b, 0x23, 0x1b, 0x02, 0xf3, 0x18, 0x9d, 0x61, 0x53, 0x78, +0x83, 0x42, 0x0d, 0xd1, 0xd2, 0x68, 0x01, 0x9b, 0x5d, 0x1c, 0x01, 0x95, +0x9b, 0x00, 0x35, 0x4d, 0x5d, 0x19, 0x2d, 0x23, 0x9b, 0x01, 0xeb, 0x18, +0xda, 0x60, 0x3a, 0x69, 0x01, 0x32, 0x3a, 0x61, 0x64, 0x00, 0x01, 0x31, +0x0b, 0x29, 0xbd, 0xd3, 0x01, 0x30, 0x09, 0x28, 0xb8, 0xd3, 0x00, 0x20, +0x02, 0x9b, 0x99, 0x00, 0x2b, 0x4a, 0x89, 0x18, 0x0b, 0x23, 0x1b, 0x02, +0xc9, 0x18, 0x88, 0x61, 0x01, 0x9b, 0x99, 0x00, 0x89, 0x18, 0x2d, 0x23, +0x9b, 0x01, 0xc9, 0x18, 0xc8, 0x60, 0x00, 0x9b, 0x00, 0x2b, 0x0c, 0xd1, +0x81, 0x00, 0x89, 0x18, 0x0b, 0x23, 0x1b, 0x02, 0xc9, 0x18, 0xcb, 0x69, +0xc0, 0x46, 0x8b, 0x61, 0x01, 0x30, 0x0b, 0x28, 0xf4, 0xd3, 0x08, 0xe0, +0x07, 0xe0, 0x03, 0x9d, 0xe8, 0x6a, 0x30, 0x28, +0x03, 0xd2, 0x30, 0x20, 0x03, 0x9d, 0xc0, 0x46, 0xe8, 0x62, 0x19, 0x4a, +0x78, 0x69, 0x00, 0x28, 0x2a, 0xd0, 0x00, 0x21, 0x01, 0x23, 0x18, 0x43, +0x78, 0x61, 0x00, 0x20, 0x01, 0x24, 0x00, 0x22, 0x13, 0x4e, 0x7b, 0x69, 0x23, 0x40, 0x10, 0xd0, 0x93, 0x00, 0x9b, 0x18, 0x9b, 0x00, 0x12, 0x4d, 0x5b, 0x19, 0x9d, 0x78, 0x85, 0x42, 0x08, 0xd1, 0x1d, 0x69, 0x0b, 0x1c, -0x9b, 0x00, 0x9e, 0x19, 0x2d, 0x23, 0x9b, 0x01, 0xf3, 0x18, 0x9d, 0x63, +0x9b, 0x00, 0x9e, 0x19, 0x2d, 0x23, 0x9b, 0x01, 0xf3, 0x18, 0xdd, 0x63, 0x01, 0x31, 0x64, 0x00, 0x01, 0x32, 0x0b, 0x2a, 0xe6, 0xd3, 0x01, 0x30, 0x09, 0x28, 0xe1, 0xd3, 0x00, 0x20, 0x89, 0x00, 0x04, 0x4a, 0x89, 0x18, -0x2d, 0x23, 0x9b, 0x01, 0xc9, 0x18, 0x88, 0x63, 0x04, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0xb0, 0x52, 0xff, 0xff, -0x80, 0x00, 0x00, 0x80, 0x00, 0x47, 0x08, 0x47, -0x10, 0x47, 0x18, 0x47, 0x78, 0x47, 0xc0, 0x46, 0x34, 0xc0, 0x9f, 0xe5, -0x1c, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0xc0, 0x46, 0x2c, 0xc0, 0x9f, 0xe5, -0x1c, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0xc0, 0x46, 0x24, 0xc0, 0x9f, 0xe5, -0x1c, 0xff, 0x2f, 0xe1, 0xc0, 0x46, 0xff, 0xb4, 0x75, 0x46, 0x20, 0xb4, -0x01, 0x21, 0x08, 0x43, 0x01, 0xa4, 0xa6, 0x46, 0x00, 0x47, 0xc0, 0x46, -0x20, 0xbc, 0xae, 0x46, 0xff, 0xbc, 0xf7, 0x46, 0xb8, 0x51, 0xff, 0xff, -0x08, 0x51, 0xff, 0xff, 0xd7, 0xb7, 0x21, 0x40, 0xf0, 0xb5, 0x04, 0x20, -0x1a, 0x49, 0x01, 0x25, 0x08, 0x60, 0x1a, 0x4f, 0xbb, 0x23, 0x1b, 0x01, -0xf8, 0x18, 0x05, 0x72, 0x18, 0x48, 0x41, 0x6b, 0x2c, 0x05, 0x00, 0x20, -0x7a, 0x6e, 0x17, 0x4b, 0x8a, 0x42, 0x1d, 0xd0, 0x19, 0x7b, 0x00, 0x29, -0x17, 0xd1, 0xd9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x49, 0x78, 0x1e, 0x1c, -0x00, 0x29, 0x10, 0xd1, 0xb0, 0x60, 0x10, 0x20, 0x70, 0x60, 0x10, 0x4a, -0x10, 0x49, 0xff, 0xf7, 0xb5, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x35, 0x73, -0x04, 0x23, 0xb8, 0x69, 0x18, 0x43, 0xb8, 0x61, 0x20, 0x61, 0x00, 0xf0, -0x17, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x18, 0x73, 0x04, 0x23, -0xb8, 0x69, 0x98, 0x43, 0xb8, 0x61, 0x20, 0x61, 0xf5, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x00, 0xb0, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x18, 0x40, -0xa8, 0x04, 0x00, 0x80, 0xa0, 0x54, 0xff, 0xff, 0x85, 0x74, 0x21, 0x40, -0xf8, 0xb5, 0x15, 0x4f, 0x39, 0x6c, 0x15, 0x48, 0x40, 0x6e, 0x0c, 0x1a, -0x14, 0x4e, 0x71, 0x68, 0x14, 0x4d, 0xa1, 0x42, 0x06, 0xd8, 0x14, 0x4a, -0x0a, 0x43, 0x00, 0x92, 0xb9, 0x6b, 0x09, 0x18, 0xfa, 0x6b, 0x11, 0xe0, -0x11, 0x22, 0x52, 0x05, 0x22, 0x43, 0x00, 0x92, 0xb9, 0x6b, 0x09, 0x18, -0x00, 0x20, 0xfa, 0x6b, 0x2b, 0x1c, 0xff, 0xf7, 0x7f, 0xff, 0x70, 0x68, -0x00, 0x1b, 0x0a, 0x4a, 0x02, 0x43, 0x00, 0x92, 0xb9, 0x6b, 0xfa, 0x6b, -0x00, 0x20, 0x2b, 0x1c, 0xff, 0xf7, 0x74, 0xff, 0xf8, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xf8, 0x28, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, -0xa8, 0x04, 0x00, 0x80, 0x44, 0x80, 0x20, 0x40, 0x00, 0x00, 0x37, 0x02, -0xf0, 0xb5, 0x2b, 0x4f, 0xb8, 0x68, 0x79, 0x68, 0xc0, 0x19, 0x20, 0x30, -0x29, 0x4a, 0xff, 0xf7, 0x55, 0xff, 0x01, 0x20, 0xc0, 0x02, 0x28, 0x49, -0xc0, 0x46, 0x08, 0x60, 0xb9, 0x68, 0x38, 0x1c, 0x26, 0x4d, 0x00, 0x24, -0x26, 0x4e, 0xef, 0x1d, 0x79, 0x37, 0x00, 0x29, 0x31, 0xd1, 0x31, 0x68, -0x0a, 0x78, 0x12, 0x0a, 0x03, 0xd2, 0x04, 0x73, 0xf0, 0xbc, 0x08, 0xbc, +0x2d, 0x23, 0x9b, 0x01, 0xc9, 0x18, 0xc8, 0x63, 0x04, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x1c, 0x53, 0xff, 0xff, +0x00, 0x01, 0x00, 0x80, 0x00, 0x47, 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, +0x78, 0x47, 0xc0, 0x46, 0x34, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, +0x78, 0x47, 0xc0, 0x46, 0x2c, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, +0x78, 0x47, 0xc0, 0x46, 0x24, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, +0xc0, 0x46, 0xff, 0xb4, 0x75, 0x46, 0x20, 0xb4, 0x01, 0x21, 0x08, 0x43, +0x01, 0xa4, 0xa6, 0x46, 0x00, 0x47, 0xc0, 0x46, 0x20, 0xbc, 0xae, 0x46, +0xff, 0xbc, 0xf7, 0x46, 0x24, 0x52, 0xff, 0xff, 0x74, 0x51, 0xff, 0xff, +0x51, 0xc0, 0x21, 0x40, 0xf0, 0xb5, 0x04, 0x20, 0x1a, 0x49, 0x01, 0x25, +0x08, 0x60, 0x1a, 0x4f, 0xbb, 0x23, 0x1b, 0x01, 0xf8, 0x18, 0x05, 0x73, +0x18, 0x48, 0x41, 0x6b, 0x2c, 0x05, 0x00, 0x20, 0x7a, 0x6e, 0x17, 0x4b, +0x8a, 0x42, 0x1d, 0xd0, 0x19, 0x7b, 0x00, 0x29, 0x17, 0xd1, 0xd9, 0x1d, +0xff, 0x31, 0x3a, 0x31, 0x49, 0x78, 0x1e, 0x1c, 0x00, 0x29, 0x10, 0xd1, +0xb0, 0x60, 0x10, 0x20, 0x70, 0x60, 0x10, 0x4a, 0x10, 0x49, 0xff, 0xf7, +0xb5, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x35, 0x73, 0x04, 0x23, 0xb8, 0x69, +0x18, 0x43, 0xb8, 0x61, 0x20, 0x61, 0x00, 0xf0, 0x17, 0xf8, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x18, 0x73, 0x04, 0x23, 0xb8, 0x69, 0x98, 0x43, +0xb8, 0x61, 0x20, 0x61, 0xf5, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, +0x68, 0x0e, 0x00, 0x80, 0x00, 0x01, 0x18, 0x40, 0x28, 0x05, 0x00, 0x80, +0x0c, 0x55, 0xff, 0xff, 0x85, 0x74, 0x21, 0x40, 0xf8, 0xb5, 0x15, 0x4f, +0x39, 0x6c, 0x15, 0x48, 0x40, 0x6e, 0x0c, 0x1a, 0x14, 0x4e, 0x71, 0x68, +0x14, 0x4d, 0xa1, 0x42, 0x06, 0xd8, 0x14, 0x4a, 0x0a, 0x43, 0x00, 0x92, +0xb9, 0x6b, 0x09, 0x18, 0xfa, 0x6b, 0x11, 0xe0, 0x11, 0x22, 0x52, 0x05, +0x22, 0x43, 0x00, 0x92, 0xb9, 0x6b, 0x09, 0x18, 0x00, 0x20, 0xfa, 0x6b, +0x2b, 0x1c, 0xff, 0xf7, 0x7f, 0xff, 0x70, 0x68, 0x00, 0x1b, 0x0a, 0x4a, +0x02, 0x43, 0x00, 0x92, 0xb9, 0x6b, 0xfa, 0x6b, 0x00, 0x20, 0x2b, 0x1c, +0xff, 0xf7, 0x74, 0xff, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x7c, 0x29, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, 0x28, 0x05, 0x00, 0x80, +0x44, 0x80, 0x20, 0x40, 0x00, 0x00, 0x37, 0x02, 0xf0, 0xb5, 0x2b, 0x4f, +0xb8, 0x68, 0x79, 0x68, 0xc0, 0x19, 0x20, 0x30, 0x29, 0x4a, 0xff, 0xf7, +0x55, 0xff, 0x01, 0x20, 0xc0, 0x02, 0x28, 0x49, 0xc0, 0x46, 0x08, 0x60, +0xb9, 0x68, 0x38, 0x1c, 0x26, 0x4d, 0x00, 0x24, 0x26, 0x4e, 0xef, 0x1d, +0x79, 0x37, 0x00, 0x29, 0x31, 0xd1, 0x31, 0x68, 0x0a, 0x78, 0x12, 0x0a, +0x03, 0xd2, 0x04, 0x73, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x49, 0x78, 0x00, 0x29, 0x0c, 0xd1, 0x05, 0x1c, 0x40, 0x68, 0x00, 0xf0, 0x3e, 0xf9, 0x30, 0x68, 0x00, 0xf0, 0x67, 0xf8, 0x00, 0x28, 0x26, 0xd1, 0x2c, 0x73, 0xff, 0xf7, 0x58, 0xff, 0x22, 0xe0, 0x09, 0x01, @@ -2178,85 +2190,85 @@ 0x98, 0x43, 0x99, 0x04, 0xa8, 0x61, 0x08, 0x61, 0xda, 0xe7, 0x10, 0x20, 0x00, 0xf0, 0x20, 0xf9, 0x10, 0x20, 0xb8, 0x60, 0xff, 0xf7, 0x82, 0xff, 0xd2, 0xe7, 0x05, 0x1c, 0x40, 0x68, 0x00, 0xf0, 0x17, 0xf9, 0x30, 0x68, -0x00, 0xf0, 0x40, 0xf8, 0x00, 0x28, 0xd8, 0xd0, 0x02, 0x23, 0xb8, 0x6b, -0x18, 0x43, 0xb8, 0x63, 0xc4, 0xe7, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x80, -0x25, 0x55, 0xff, 0xff, 0x00, 0x00, 0x00, 0xb0, -0xe8, 0x0d, 0x00, 0x80, 0x64, 0x01, 0x00, 0x80, 0xa0, 0x54, 0xff, 0xff, -0x85, 0x74, 0x21, 0x40, 0x90, 0xb5, 0x01, 0x20, 0x40, 0x03, 0x10, 0x49, -0x00, 0x27, 0x08, 0x60, 0x0f, 0x4c, 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, -0x47, 0x70, 0xe0, 0x69, 0x80, 0x00, 0x00, 0x19, 0x00, 0x69, 0x00, 0xf0, -0xd7, 0xf8, 0xe0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xe7, 0x61, 0x01, 0xe0, -0x01, 0x20, 0xe0, 0x61, 0x07, 0x48, 0x02, 0x23, 0x81, 0x6b, 0x19, 0x43, -0x81, 0x63, 0x27, 0x73, 0xff, 0xf7, 0x00, 0xff, 0x90, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xa8, 0x04, 0x00, 0x80, -0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x78, 0x88, -0x6d, 0x28, 0x03, 0xdb, 0x38, 0x1c, 0x00, 0xf0, 0xf7, 0xf8, 0x17, 0xe0, -0x80, 0x00, 0x0d, 0x49, 0x09, 0x58, 0x38, 0x1c, 0xff, 0xf7, 0xbd, 0xfe, -0x00, 0x28, 0x0f, 0xd1, 0x39, 0x78, 0xc9, 0x09, 0x0c, 0xd3, 0x69, 0x46, -0x38, 0x1c, 0x00, 0xf0, 0xcf, 0xf8, 0x68, 0x46, 0x00, 0x21, 0x00, 0xf0, -0x0b, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, -0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x01, 0x00, 0x80, -0xf0, 0xb5, 0x82, 0xb0, 0x02, 0x1c, 0x41, 0x4b, 0xdd, 0x1d, 0xff, 0x35, -0x3a, 0x35, 0x2f, 0x78, 0x00, 0x2f, 0x01, 0xd0, 0x00, 0x27, 0x00, 0xe0, -0x01, 0x27, 0x2f, 0x70, 0x2f, 0x78, 0xfb, 0x00, 0xdb, 0x19, 0x5b, 0x01, -0x3a, 0x4f, 0xdc, 0x19, 0x40, 0x78, 0x00, 0x01, 0xc7, 0x1d, 0x09, 0x37, -0x00, 0x20, 0x83, 0x00, 0xd6, 0x58, 0xc0, 0x46, 0xe6, 0x50, 0x01, 0x30, -0x04, 0x28, 0xf8, 0xd3, 0x00, 0x29, 0x0f, 0xd0, 0x00, 0x22, 0xbb, 0x08, -0x01, 0x93, 0x83, 0x42, 0x0b, 0xd9, 0x13, 0x1c, 0x9b, 0x00, 0xcb, 0x58, -0x86, 0x00, 0xa3, 0x51, 0x01, 0x9b, 0x01, 0x30, 0x01, 0x32, 0x83, 0x42, -0xf5, 0xd8, 0x00, 0xe0, 0x10, 0x27, 0x2b, 0x48, 0x02, 0x6d, 0x80, 0x6e, -0x2a, 0x49, 0x82, 0x42, 0x03, 0xd8, 0x82, 0x1a, 0xcb, 0x6c, 0x9a, 0x1a, -0x00, 0xe0, 0x12, 0x1a, 0xba, 0x42, 0x05, 0xd8, 0x26, 0x48, 0x81, 0x6b, -0x01, 0x31, 0x81, 0x63, 0x01, 0x20, 0x37, 0xe0, 0xc3, 0x19, 0xca, 0x6c, -0x93, 0x42, 0x08, 0xd8, 0x22, 0x4a, 0x3a, 0x43, 0x00, 0x92, 0x0a, 0x1c, -0x49, 0x6c, 0x09, 0x18, 0x92, 0x6c, 0x23, 0x1c, 0x12, 0xe0, 0x16, 0x1a, -0x00, 0x96, 0x1b, 0x49, 0x49, 0x6c, 0x09, 0x18, 0x19, 0x48, 0x82, 0x6c, -0x03, 0x20, 0x23, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0xb8, 0x1b, 0x18, 0x4a, -0x02, 0x43, 0x00, 0x92, 0xa3, 0x19, 0x14, 0x48, 0x82, 0x6c, 0x41, 0x6c, +0x00, 0xf0, 0x40, 0xf8, 0x00, 0x28, 0xd8, 0xd0, 0x02, 0x23, 0xf8, 0x6b, +0x18, 0x43, 0xf8, 0x63, 0xc4, 0xe7, 0x00, 0x00, 0x28, 0x05, 0x00, 0x80, +0x91, 0x55, 0xff, 0xff, 0x00, 0x00, 0x00, 0xb0, 0x68, 0x0e, 0x00, 0x80, +0xe4, 0x01, 0x00, 0x80, 0x0c, 0x55, 0xff, 0xff, 0x85, 0x74, 0x21, 0x40, +0x90, 0xb5, 0x01, 0x20, 0x40, 0x03, 0x10, 0x49, 0x00, 0x27, 0x08, 0x60, +0x0f, 0x4c, 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x47, 0x70, 0xe0, 0x69, +0x80, 0x00, 0x00, 0x19, 0x00, 0x69, 0x00, 0xf0, 0xd7, 0xf8, 0xe0, 0x69, +0x00, 0x28, 0x01, 0xd0, 0xe7, 0x61, 0x01, 0xe0, 0x01, 0x20, 0xe0, 0x61, +0x07, 0x48, 0x02, 0x23, 0xc1, 0x6b, 0x19, 0x43, 0xc1, 0x63, 0x27, 0x73, +0xff, 0xf7, 0x00, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0xb0, 0x28, 0x05, 0x00, 0x80, 0xe8, 0x0e, 0x00, 0x80, +0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x78, 0x88, 0x6d, 0x28, 0x03, 0xdb, +0x38, 0x1c, 0x00, 0xf0, 0xf7, 0xf8, 0x17, 0xe0, 0x80, 0x00, 0x0d, 0x49, +0x09, 0x58, 0x38, 0x1c, 0xff, 0xf7, 0xbd, 0xfe, 0x00, 0x28, 0x0f, 0xd1, +0x39, 0x78, 0xc9, 0x09, 0x0c, 0xd3, 0x69, 0x46, 0x38, 0x1c, 0x00, 0xf0, +0xcf, 0xf8, 0x68, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0x28, +0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x04, 0xb0, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xe8, 0x01, 0x00, 0x80, 0xf0, 0xb5, 0x82, 0xb0, +0x02, 0x1c, 0x41, 0x4b, 0xdd, 0x1d, 0xff, 0x35, 0x3a, 0x35, 0x2f, 0x78, +0x00, 0x2f, 0x01, 0xd0, 0x00, 0x27, 0x00, 0xe0, 0x01, 0x27, 0x2f, 0x70, +0x2f, 0x78, 0xfb, 0x00, 0xdb, 0x19, 0x5b, 0x01, 0x3a, 0x4f, 0xdc, 0x19, +0x40, 0x78, 0x00, 0x01, 0xc7, 0x1d, 0x09, 0x37, 0x00, 0x20, 0x83, 0x00, +0xd6, 0x58, 0xc0, 0x46, 0xe6, 0x50, 0x01, 0x30, 0x04, 0x28, 0xf8, 0xd3, +0x00, 0x29, 0x0f, 0xd0, 0x00, 0x22, 0xbb, 0x08, 0x01, 0x93, 0x83, 0x42, +0x0b, 0xd9, 0x13, 0x1c, 0x9b, 0x00, 0xcb, 0x58, 0x86, 0x00, 0xa3, 0x51, +0x01, 0x9b, 0x01, 0x30, 0x01, 0x32, 0x83, 0x42, 0xf5, 0xd8, 0x00, 0xe0, +0x10, 0x27, 0x2b, 0x48, 0x02, 0x6d, 0x80, 0x6e, 0x2a, 0x49, 0x82, 0x42, +0x03, 0xd8, 0x82, 0x1a, 0xcb, 0x6c, 0x9a, 0x1a, 0x00, 0xe0, 0x12, 0x1a, +0xba, 0x42, 0x05, 0xd8, 0x26, 0x48, 0x81, 0x6b, 0x01, 0x31, 0x81, 0x63, +0x01, 0x20, 0x37, 0xe0, 0xc3, 0x19, 0xca, 0x6c, 0x93, 0x42, 0x08, 0xd8, +0x22, 0x4a, 0x3a, 0x43, 0x00, 0x92, 0x0a, 0x1c, 0x49, 0x6c, 0x09, 0x18, +0x92, 0x6c, 0x23, 0x1c, 0x12, 0xe0, 0x16, 0x1a, 0x00, 0x96, 0x1b, 0x49, +0x49, 0x6c, 0x09, 0x18, 0x19, 0x48, 0x82, 0x6c, 0x03, 0x20, 0x23, 0x1c, +0xff, 0xf7, 0x50, 0xfe, 0xb8, 0x1b, 0x18, 0x4a, 0x02, 0x43, 0x00, 0x92, +0xa3, 0x19, 0x14, 0x48, 0x82, 0x6c, 0x41, 0x6c, 0x03, 0x20, 0xff, 0xf7, 0x45, 0xfe, 0x01, 0x20, 0x0d, 0x49, 0xc0, 0x46, 0x68, 0x70, 0x8a, 0x69, 0x92, 0x00, 0x52, 0x18, 0x17, 0x61, 0x8a, 0x69, 0x00, 0x2a, 0x02, 0xd0, 0x00, 0x27, 0x8f, 0x61, 0x00, 0xe0, 0x88, 0x61, -0x0c, 0x48, 0x02, 0x23, 0x81, 0x6b, 0x19, 0x43, 0x81, 0x63, 0x00, 0x20, -0x01, 0x27, 0x0a, 0x49, 0xc0, 0x46, 0x4f, 0x72, 0x02, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xa8, 0x04, 0x00, 0x80, 0xfc, 0xba, 0x20, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0xf8, 0x28, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0x00, 0x00, 0x19, 0x02, 0x68, 0x0e, 0x00, 0x80, 0x98, 0x19, 0x00, 0x80, +0x0c, 0x48, 0x02, 0x23, 0xc1, 0x6b, 0x19, 0x43, 0xc1, 0x63, 0x00, 0x20, +0x01, 0x27, 0x0a, 0x49, 0xc0, 0x46, 0x4f, 0x73, 0x02, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x28, 0x05, 0x00, 0x80, 0xfc, 0xba, 0x20, 0x40, +0x68, 0x0e, 0x00, 0x80, 0x7c, 0x29, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, +0x00, 0x00, 0x19, 0x02, 0xe8, 0x0e, 0x00, 0x80, 0x18, 0x1a, 0x00, 0x80, 0x07, 0x49, 0x8a, 0x6e, 0x10, 0x18, 0x07, 0x4a, 0xd2, 0x6c, 0x13, 0x04, 0x1b, 0x0c, 0x83, 0x42, 0x00, 0xd8, 0x80, 0x1a, 0x88, 0x66, 0x88, 0x6e, -0x03, 0x49, 0xc0, 0x46, 0x48, 0x61, 0x70, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0xf8, 0x28, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, -0x06, 0x49, 0x4a, 0x6e, 0x10, 0x18, 0x06, 0x4a, 0x12, 0x6c, 0x82, 0x42, -0x00, 0xd8, 0x80, 0x1a, 0x48, 0x66, 0x48, 0x6e, 0x03, 0x49, 0xc0, 0x46, -0x08, 0x61, 0x70, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0xf8, 0x28, 0x00, 0x80, -0x3c, 0xef, 0x20, 0x40, 0x05, 0x22, 0x0a, 0x60, 0x82, 0x88, 0xc0, 0x46, -0x8a, 0x80, 0x00, 0x22, 0x4a, 0x70, 0x40, 0x88, 0xc0, 0x46, 0x48, 0x80, -0xca, 0x80, 0x8a, 0x60, 0xca, 0x60, 0x70, 0x47, 0x05, 0x22, 0x02, 0x60, -0x00, 0x22, 0x82, 0x80, 0x42, 0x70, 0x41, 0x80, 0xc2, 0x80, 0x82, 0x60, -0xc2, 0x60, 0x70, 0x47, 0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x0e, 0x48, -0x41, 0x6b, 0x01, 0x31, 0x41, 0x63, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, -0xdd, 0xff, 0x38, 0x68, 0xc0, 0x46, 0x00, 0x90, 0x45, 0x20, 0x00, 0xab, -0x18, 0x70, 0x01, 0x27, 0xdf, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, -0x11, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x38, 0x1c, 0x00, 0xe0, 0x00, 0x20, -0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xa0, 0x82, 0x20, 0x40, -0x00, 0xb5, 0x84, 0xb0, 0xc1, 0x88, 0x09, 0x4a, 0xc0, 0x46, 0x11, 0x81, -0x69, 0x46, 0xff, 0xf7, 0xbd, 0xff, 0x01, 0x20, 0x40, 0x02, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xf5, 0xfe, 0x01, 0x20, -0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, -0x00, 0xb5, 0xff, 0xf7, 0xc3, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, -0x03, 0x49, 0xc0, 0x46, 0x08, 0x70, 0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, -0x00, 0x20, 0x70, 0x47, 0xa8, 0x0e, 0x00, 0x80, 0x00, 0x20, 0x04, 0x49, -0xc0, 0x46, 0x08, 0x70, 0xff, 0x21, 0xa1, 0x22, 0x52, 0x03, 0x01, 0x31, -0x91, 0x60, 0x70, 0x47, 0xa8, 0x0e, 0x00, 0x80, 0x02, 0x20, 0xa1, 0x21, -0x49, 0x03, 0x88, 0x60, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x40, 0x02, -0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x88, -0xc0, 0x06, 0xc0, 0x0e, 0xa1, 0x21, 0x49, 0x03, 0x48, 0x61, 0x02, 0x49, -0xc0, 0x46, 0x88, 0x63, 0x00, 0x20, 0x70, 0x47, 0x68, 0x1a, 0x00, 0x80, -0x80, 0xb5, 0x84, 0xb0, 0x08, 0x49, 0x0f, 0x6b, 0x69, 0x46, 0xff, 0xf7, -0x71, 0xff, 0xf8, 0x06, 0xc0, 0x0e, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, -0x00, 0x21, 0xff, 0xf7, 0xa9, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x80, 0x00, 0x14, 0x40, 0x80, 0xb5, 0x85, 0xb0, -0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, 0x5b, 0xff, 0xf8, 0x88, -0x04, 0xa9, 0x04, 0xf0, 0xef, 0xfd, 0x01, 0xab, 0x58, 0x80, 0x01, 0xa8, +0x03, 0x49, 0xc0, 0x46, 0x48, 0x61, 0x70, 0x47, 0x68, 0x0e, 0x00, 0x80, +0x7c, 0x29, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, 0x06, 0x49, 0x4a, 0x6e, +0x10, 0x18, 0x06, 0x4a, 0x12, 0x6c, 0x82, 0x42, 0x00, 0xd8, 0x80, 0x1a, +0x48, 0x66, 0x48, 0x6e, 0x03, 0x49, 0xc0, 0x46, 0x08, 0x61, 0x70, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x7c, 0x29, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, +0x05, 0x22, 0x0a, 0x60, 0x82, 0x88, 0xc0, 0x46, 0x8a, 0x80, 0x00, 0x22, +0x4a, 0x70, 0x40, 0x88, 0xc0, 0x46, 0x48, 0x80, 0xca, 0x80, 0x8a, 0x60, +0xca, 0x60, 0x70, 0x47, 0x05, 0x22, 0x02, 0x60, 0x00, 0x22, 0x82, 0x80, +0x42, 0x70, 0x41, 0x80, 0xc2, 0x80, 0x82, 0x60, 0xc2, 0x60, 0x70, 0x47, +0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x0e, 0x48, 0x41, 0x6b, 0x01, 0x31, +0x41, 0x63, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, 0xdd, 0xff, 0x38, 0x68, +0xc0, 0x46, 0x00, 0x90, 0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x01, 0x27, +0xdf, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x11, 0xff, 0x00, 0x28, +0x01, 0xd1, 0x38, 0x1c, 0x00, 0xe0, 0x00, 0x20, 0x04, 0xb0, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xa0, 0x82, 0x20, 0x40, 0x00, 0xb5, 0x84, 0xb0, +0xc1, 0x88, 0x09, 0x4a, 0xc0, 0x46, 0x91, 0x81, 0x69, 0x46, 0xff, 0xf7, +0xbd, 0xff, 0x01, 0x20, 0x40, 0x02, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, +0x00, 0x21, 0xff, 0xf7, 0xf5, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0xe8, 0x0e, 0x00, 0x80, 0x00, 0xb5, 0xff, 0xf7, +0xc3, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x20, 0x03, 0x49, 0xc0, 0x46, +0x08, 0x71, 0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, 0x00, 0x20, 0x70, 0x47, +0x28, 0x0f, 0x00, 0x80, 0x00, 0x20, 0x04, 0x49, 0xc0, 0x46, 0x08, 0x71, +0xff, 0x21, 0xa1, 0x22, 0x52, 0x03, 0x01, 0x31, 0x91, 0x60, 0x70, 0x47, +0x28, 0x0f, 0x00, 0x80, 0x02, 0x20, 0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, +0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x40, 0x02, 0xa1, 0x21, 0x49, 0x03, +0x88, 0x60, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x88, 0xc0, 0x06, 0xc0, 0x0e, +0xa1, 0x21, 0x49, 0x03, 0x48, 0x61, 0x02, 0x49, 0xc0, 0x46, 0xc8, 0x63, +0x00, 0x20, 0x70, 0x47, 0xe8, 0x1a, 0x00, 0x80, 0x80, 0xb5, 0x84, 0xb0, +0x08, 0x49, 0x0f, 0x6b, 0x69, 0x46, 0xff, 0xf7, 0x71, 0xff, 0xf8, 0x06, +0xc0, 0x0e, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, +0xa9, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x80, 0x00, 0x14, 0x40, 0x80, 0xb5, 0x85, 0xb0, 0x07, 0x1c, 0x69, 0x46, +0x38, 0x1c, 0xff, 0xf7, 0x5b, 0xff, 0xf8, 0x88, +0x04, 0xa9, 0x05, 0xf0, 0xf7, 0xf9, 0x01, 0xab, 0x58, 0x80, 0x01, 0xa8, 0x40, 0x88, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0xa8, 0x40, 0x88, 0x80, 0x08, 0x03, 0x38, 0x80, 0x08, 0x01, 0x30, 0x04, 0x3b, 0x58, 0x70, 0x04, 0x98, 0x01, 0x68, 0xc0, 0x46, 0x02, 0x91, 0x40, 0x68, 0xc0, 0x46, 0x03, 0x90, @@ -2266,52 +2278,54 @@ 0x90, 0xb5, 0x84, 0xb0, 0x14, 0x4f, 0x39, 0x7b, 0x00, 0x29, 0x20, 0xd1, 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x49, 0x78, 0x00, 0x29, 0x1a, 0xd1, 0x10, 0x49, 0x05, 0x22, 0x00, 0x92, 0x08, 0x22, 0x00, 0xab, 0x5a, 0x80, -0x98, 0x80, 0x06, 0x20, 0x00, 0xab, 0x58, 0x70, -0x00, 0x24, 0xdc, 0x80, 0x08, 0x68, 0xc0, 0x46, 0x02, 0x90, 0x48, 0x68, -0xc0, 0x46, 0x03, 0x90, 0x01, 0x20, 0x38, 0x73, 0x68, 0x46, 0x08, 0x31, -0xff, 0xf7, 0x4c, 0xfe, 0x00, 0x28, 0x00, 0xd0, 0x3c, 0x73, 0x04, 0xb0, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x80, -0x10, 0x2a, 0x00, 0x80, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, -0x38, 0x1c, 0xff, 0xf7, 0xf9, 0xfe, 0xba, 0x68, 0x0d, 0x4c, 0x0e, 0x48, -0x00, 0x2a, 0x05, 0xd1, 0x0d, 0x49, 0xff, 0xf7, 0xd6, 0xfc, 0x00, 0x28, -0x0c, 0xda, 0x05, 0xe0, 0xb9, 0x88, 0x0b, 0x4b, 0xff, 0xf7, 0xd1, 0xfc, -0x00, 0x28, 0x05, 0xda, 0x01, 0xab, 0x5c, 0x80, 0x68, 0x46, 0x00, 0x21, -0xff, 0xf7, 0x22, 0xfe, 0x00, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x15, 0x79, 0x21, 0x40, -0x59, 0xcd, 0x21, 0x40, 0xf1, 0xcc, 0x21, 0x40, 0x00, 0xb5, 0xc0, 0x88, -0x04, 0xf0, 0x54, 0xfd, 0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, -0xff, 0xf7, 0xe2, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, -0xdd, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, 0x02, 0x20, -0x00, 0xf0, 0x02, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xc6, 0xb0, -0x04, 0x1c, 0x08, 0x1c, 0x69, 0x46, 0xff, 0xf7, 0xb5, 0xfe, 0x1b, 0x48, -0xff, 0xf7, 0x96, 0xfc, 0x07, 0x1c, 0x00, 0x21, 0x20, 0x1c, 0x03, 0xf0, -0x4f, 0xff, 0x00, 0x28, 0x1c, 0xd0, 0x20, 0x1c, 0x04, 0xa9, 0x03, 0xf0, -0x2d, 0xfe, 0x04, 0x98, 0x04, 0x28, 0x05, 0xd9, 0x04, 0x98, 0x80, 0x08, +0x98, 0x80, 0x06, 0x20, 0x00, 0xab, 0x58, 0x70, 0x00, 0x24, 0xdc, 0x80, +0x08, 0x68, 0xc0, 0x46, 0x02, 0x90, 0x48, 0x68, 0xc0, 0x46, 0x03, 0x90, +0x01, 0x20, 0x38, 0x73, 0x68, 0x46, 0x08, 0x31, 0xff, 0xf7, 0x4c, 0xfe, +0x00, 0x28, 0x00, 0xd0, 0x3c, 0x73, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x28, 0x05, 0x00, 0x80, 0xa4, 0x2a, 0x00, 0x80, +0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, +0xf9, 0xfe, 0xba, 0x68, 0x0d, 0x4c, 0x0e, 0x48, 0x00, 0x2a, 0x05, 0xd1, +0x0d, 0x49, 0xff, 0xf7, 0xd6, 0xfc, 0x00, 0x28, 0x0c, 0xda, 0x05, 0xe0, +0xb9, 0x88, 0x0b, 0x4b, 0xff, 0xf7, 0xd1, 0xfc, 0x00, 0x28, 0x05, 0xda, +0x01, 0xab, 0x5c, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x22, 0xfe, +0x00, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xff, 0xff, 0x00, 0x00, 0x15, 0x79, 0x21, 0x40, 0x8d, 0xd5, 0x21, 0x40, +0x25, 0xd5, 0x21, 0x40, 0x00, 0xb5, 0xc0, 0x88, 0x05, 0xf0, 0x5c, 0xf9, +0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xe2, 0xfe, +0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xdd, 0xfe, 0x08, 0xbc, +0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x02, 0xf8, +0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xc6, 0xb0, 0x04, 0x1c, 0x08, 0x1c, +0x69, 0x46, 0xff, 0xf7, 0xb5, 0xfe, 0x1c, 0x48, 0xff, 0xf7, 0x96, 0xfc, +0x07, 0x1c, 0x1b, 0x4a, 0x00, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x92, 0xfc, +0x00, 0x28, 0x1d, 0xd0, 0x04, 0xa9, 0x18, 0x4a, 0x20, 0x1c, 0xff, 0xf7, +0x8b, 0xfc, 0x04, 0x98, 0x04, 0x28, 0x05, 0xd9, 0x04, 0x98, 0x80, 0x08, 0x03, 0x38, 0x80, 0x08, 0x01, 0x30, 0x00, 0xe0, 0x00, 0x20, 0x00, 0xab, 0x58, 0x70, 0x06, 0xa8, 0x00, 0x78, 0xc0, 0x46, 0xd8, 0x80, 0x04, 0x98, 0xc0, 0x46, 0x02, 0x90, 0x07, 0x98, 0xc0, 0x46, 0x03, 0x90, 0x04, 0x33, -0x08, 0xad, 0x02, 0xe0, 0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x07, 0x49, -0x38, 0x1c, 0xff, 0xf7, 0x6c, 0xfc, 0x68, 0x46, 0x29, 0x1c, 0xff, 0xf7, -0xc3, 0xfd, 0x01, 0x20, 0x46, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, 0x00, 0xb5, 0x01, 0x1c, -0x02, 0x20, 0x00, 0xf0, 0x10, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, -0x01, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0xb2, 0xff, 0x08, 0xbc, 0x18, 0x47, -0x00, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x08, 0xbc, -0x18, 0x47, 0xf3, 0xb5, 0xc6, 0xb0, 0x0f, 0x1c, 0x69, 0x46, 0x38, 0x1c, -0xff, 0xf7, 0x5e, 0xfe, 0x1c, 0x48, 0xff, 0xf7, 0x3f, 0xfc, 0xba, 0x68, -0x04, 0x1c, 0xfc, 0x2a, 0x1f, 0xd8, 0xfd, 0x88, 0xf8, 0x68, 0xc0, 0x46, -0x04, 0x90, 0xf9, 0x1d, 0x09, 0x31, 0x05, 0xab, 0x00, 0x20, 0x7e, 0x78, -0x00, 0x2e, 0x0d, 0xdd, 0x40, 0xc9, 0x40, 0xc3, 0x40, 0xc9, 0x40, 0xc3, -0x40, 0xc9, 0x40, 0xc3, 0x40, 0xc9, 0x40, 0xc3, 0x01, 0x30, 0x00, 0x04, -0x00, 0x0c, 0x7e, 0x78, 0x86, 0x42, 0xf1, 0xdc, 0x46, 0x98, 0x04, 0xa9, -0x2b, 0x1c, 0xff, 0xf7, 0x2d, 0xfc, 0x00, 0x28, 0x05, 0xd0, 0x00, 0xa8, -0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x07, 0x49, -0x20, 0x1c, 0xff, 0xf7, 0x12, 0xfc, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, -0x69, 0xfd, 0x01, 0x20, 0x48, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, 0x00, 0xb5, 0xff, 0xf7, -0x35, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, +0x08, 0xad, 0x02, 0xe0, 0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x09, 0x49, +0x38, 0x1c, 0xff, 0xf7, 0x6a, 0xfc, 0x68, 0x46, 0x29, 0x1c, 0xff, 0xf7, +0xc1, 0xfd, 0x01, 0x20, 0x46, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x24, 0x02, 0xff, 0xff, 0xcd, 0xc0, 0x21, 0x40, 0x29, 0xbf, 0x21, 0x40, +0x3c, 0x02, 0xff, 0xff, 0x00, 0xb5, 0x01, 0x1c, 0x02, 0x20, 0x00, 0xf0, +0x10, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, 0x01, 0x20, +0xff, 0xf7, 0xac, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, +0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0xf3, 0xb5, +0xc6, 0xb0, 0x0f, 0x1c, 0x69, 0x46, 0x38, 0x1c, +0xff, 0xf7, 0x58, 0xfe, 0x20, 0x48, 0xff, 0xf7, 0x39, 0xfc, 0x04, 0x1c, +0x78, 0x78, 0x00, 0x01, 0xba, 0x68, 0x04, 0x30, 0xfc, 0x2a, 0x23, 0xd8, +0xff, 0x23, 0x09, 0x33, 0x98, 0x42, 0x1f, 0xd8, 0xfd, 0x88, 0xf8, 0x68, +0xc0, 0x46, 0x04, 0x90, 0x05, 0xa9, 0xfb, 0x1d, 0x09, 0x33, 0x00, 0x20, +0x7e, 0x78, 0x00, 0x2e, 0x0d, 0xdd, 0x40, 0xcb, 0x40, 0xc1, 0x40, 0xcb, +0x40, 0xc1, 0x40, 0xcb, 0x40, 0xc1, 0x40, 0xcb, 0x40, 0xc1, 0x01, 0x30, +0x00, 0x04, 0x00, 0x0c, 0x7e, 0x78, 0x86, 0x42, 0xf1, 0xdc, 0x46, 0x98, +0x04, 0xa9, 0x2b, 0x1c, 0xff, 0xf7, 0x20, 0xfc, 0x00, 0x28, 0x05, 0xd0, +0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, +0x07, 0x49, 0x20, 0x1c, 0xff, 0xf7, 0x05, 0xfc, 0x68, 0x46, 0x00, 0x21, +0xff, 0xf7, 0x5c, 0xfd, 0x01, 0x20, 0x48, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, +0x00, 0xb5, 0xff, 0xf7, 0x27, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0xc6, 0xb0, 0x07, 0x1c, 0xfc, 0x88, 0x25, 0x4d, 0x68, 0x68, 0x01, 0x30, -0x69, 0x46, 0x68, 0x60, 0x38, 0x1c, 0xff, 0xf7, 0x0f, 0xfe, 0x10, 0x2c, +0x69, 0x46, 0x68, 0x60, 0x38, 0x1c, 0xff, 0xf7, 0x01, 0xfe, 0x10, 0x2c, 0x08, 0xd3, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x17, 0xe0, 0x78, 0x78, 0x82, 0x00, 0xfb, 0x1d, 0x09, 0x33, 0x00, 0x20, 0xb9, 0x68, 0x00, 0x2a, 0x15, 0xd9, @@ -2322,1121 +2336,1275 @@ 0x02, 0x94, 0x69, 0x68, 0xc0, 0x46, 0x03, 0x91, 0xa2, 0x00, 0x00, 0x20, 0x10, 0x33, 0x00, 0x2a, 0x05, 0xd9, 0x0f, 0x1c, 0x80, 0xc3, 0x01, 0x30, 0x01, 0x31, 0x90, 0x42, 0xf9, 0xd3, 0x68, 0x46, 0x04, 0xa9, 0xff, 0xf7, -0x11, 0xfd, 0x01, 0x20, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x1c, 0x03, 0x00, 0x80, 0x90, 0xb4, 0x22, 0x48, 0x00, 0x68, 0x01, 0x21, +0x03, 0xfd, 0x01, 0x20, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x9c, 0x03, 0x00, 0x80, 0x90, 0xb4, 0x23, 0x48, 0x00, 0x68, 0x01, 0x21, 0x42, 0x09, 0x00, 0xd3, 0x00, 0x21, 0x00, 0x27, 0x3a, 0x1c, 0x43, 0x0b, -0x00, 0xd2, 0x02, 0x22, 0x11, 0x43, 0x1d, 0x4a, 0x20, 0x24, 0xd3, 0x68, -0x01, 0x2b, 0x2c, 0xd1, 0x80, 0x0a, 0x00, 0xd2, 0x00, 0x24, 0x0c, 0x43, -0x20, 0x1c, 0x1b, 0x23, 0xdb, 0x01, 0xd1, 0x18, 0x09, 0x8b, 0x09, 0x0b, -0x00, 0xd2, 0x04, 0x27, 0x38, 0x43, 0xd1, 0x6f, 0x09, 0x0a, 0x06, 0xd2, -0xd1, 0x1d, 0x79, 0x31, 0x09, 0x68, 0x09, 0x0a, 0x01, 0xd3, 0x08, 0x23, -0x18, 0x43, 0xe3, 0x23, 0x1b, 0x01, 0xd1, 0x18, 0x89, 0x78, 0x03, 0x29, -0x02, 0xd1, 0xff, 0x23, 0x01, 0x33, 0x18, 0x43, 0x0b, 0x49, 0x09, 0x6a, -0x10, 0x22, 0x4b, 0x0a, 0x00, 0xd2, 0x00, 0x22, 0x10, 0x43, 0x89, 0x07, -0x89, 0x0f, 0x89, 0x01, 0x08, 0x43, 0x90, 0xbc, 0x70, 0x47, 0x40, 0x0c, -0x00, 0xd2, 0x00, 0x24, 0x0c, 0x43, 0x20, 0x1c, 0xec, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x10, 0x40, 0xe8, 0x0d, 0x00, 0x80, 0xc0, 0x00, 0x18, 0x40, -0xf0, 0xb5, 0x33, 0x4d, 0x28, 0x1c, 0x05, 0xf0, 0x6b, 0xf8, 0x32, 0x49, -0xe3, 0x23, 0x1b, 0x01, 0xcf, 0x18, 0xba, 0x78, 0x30, 0x4e, 0x00, 0x20, -0xcc, 0x1d, 0x79, 0x34, 0x05, 0x2a, 0x53, 0xd2, 0x01, 0xa3, 0x9b, 0x5c, -0x5b, 0x00, 0x9f, 0x44, 0x02, 0x0e, 0x23, 0x3c, 0x3e, 0x00, 0x01, 0x21, -0xb9, 0x70, 0xb0, 0x60, 0xff, 0xf7, 0x98, 0xff, 0x04, 0x23, 0x98, 0x43, -0x00, 0xf0, 0x62, 0xf8, 0x14, 0x22, 0x28, 0x1c, 0x0e, 0xe0, 0xff, 0xf7, -0x8f, 0xff, 0xc0, 0x08, 0x06, 0xd3, 0xb1, 0x68, 0x48, 0x1c, 0xb0, 0x60, -0x0a, 0x29, 0x03, 0xd9, 0x04, 0x20, 0x00, 0xe0, 0x02, 0x20, 0xb8, 0x70, -0x02, 0x22, 0x28, 0x1c, 0x00, 0x21, 0x05, 0xf0, 0x07, 0xf8, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x80, 0x23, 0xc8, 0x6f, 0x18, 0x43, 0xc8, 0x67, -0x18, 0x4e, 0xc0, 0x46, 0x30, 0x60, 0x03, 0x20, 0xb8, 0x70, 0x28, 0x1c, -0x16, 0x4a, 0x00, 0x21, 0x04, 0xf0, 0xf6, 0xff, 0x11, 0x48, 0x04, 0x23, -0xc1, 0x6f, 0x99, 0x43, 0xc1, 0x67, 0x31, 0x60, 0x20, 0x68, 0x18, 0x43, -0x20, 0x60, 0x70, 0x60, 0xe3, 0xe7, 0x05, 0x21, 0xb9, 0x70, 0x51, 0x21, -0x89, 0x03, 0x08, 0x62, 0x04, 0x23, 0x20, 0x68, 0x98, 0x43, 0x20, 0x60, -0x09, 0x4e, 0xc0, 0x46, 0x70, 0x60, 0xff, 0xf7, 0x55, 0xff, 0x04, 0x23, -0x18, 0x43, 0x00, 0xf0, 0x1f, 0xf8, 0xd0, 0xe7, -0x06, 0x20, 0xb8, 0x70, 0xcd, 0xe7, 0x00, 0x00, 0x79, 0x7c, 0x21, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x1c, 0x03, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, -0x88, 0x13, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x20, 0x04, 0x49, 0xc0, 0x46, -0x88, 0x70, 0x04, 0x48, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf0, 0xc0, 0xff, -0x08, 0xbc, 0x18, 0x47, 0x18, 0x1c, 0x00, 0x80, 0x79, 0x7c, 0x21, 0x40, -0x90, 0xb5, 0x07, 0x1c, 0x30, 0x48, 0x00, 0x68, 0x01, 0x1c, 0x7a, 0x08, -0x02, 0xd3, 0x10, 0x23, 0x98, 0x43, 0x01, 0xe0, 0x10, 0x23, 0x18, 0x43, -0xba, 0x08, 0x03, 0xd3, 0x01, 0x23, 0x1b, 0x03, 0x98, 0x43, 0x02, 0xe0, -0x01, 0x23, 0x1b, 0x03, 0x18, 0x43, 0x88, 0x42, 0x02, 0xd0, 0x01, 0x21, -0x09, 0x05, 0x08, 0x60, 0x25, 0x4c, 0xe0, 0x68, 0x01, 0x28, 0x1e, 0xd1, -0x1b, 0x23, 0xdb, 0x01, 0xe0, 0x18, 0x00, 0x8b, 0xf9, 0x08, 0x04, 0xd3, -0x01, 0x23, 0xdb, 0x02, 0x01, 0x1c, 0x99, 0x43, 0x01, 0xe0, 0x01, 0x21, -0xc9, 0x02, 0x81, 0x42, 0x02, 0xd0, 0x00, 0x20, 0x02, 0xf0, 0x20, 0xfe, -0x08, 0x21, 0x39, 0x40, 0x1a, 0x48, 0x03, 0xd0, 0x80, 0x23, 0xe1, 0x6f, -0x99, 0x43, 0x02, 0xe0, 0x80, 0x23, 0xe1, 0x6f, 0x19, 0x43, 0xe1, 0x67, -0x01, 0x60, 0x16, 0x48, 0x01, 0x6a, 0x78, 0x09, 0x03, 0xd3, 0xff, 0x20, +0x00, 0xd2, 0x02, 0x22, 0x11, 0x43, 0x1e, 0x4a, 0x20, 0x24, 0xd3, 0x68, +0x01, 0x2b, 0x2e, 0xd1, 0x80, 0x0a, 0x00, 0xd2, 0x00, 0x24, 0x0c, 0x43, +0x20, 0x1c, 0x1b, 0x23, 0xdb, 0x01, 0xd1, 0x18, 0x89, 0x8b, 0x09, 0x0b, +0x00, 0xd2, 0x04, 0x27, 0x38, 0x43, 0xd1, 0x6f, 0x09, 0x68, 0x09, 0x0a, +0x07, 0xd2, 0xd1, 0x1d, 0x79, 0x31, 0x09, 0x68, 0x09, 0x68, 0x09, 0x0a, +0x01, 0xd3, 0x08, 0x23, 0x18, 0x43, 0xe3, 0x23, 0x1b, 0x01, 0xd1, 0x18, +0x89, 0x79, 0x03, 0x29, 0x02, 0xd1, 0xff, 0x23, 0x01, 0x33, 0x18, 0x43, +0x0b, 0x49, 0x09, 0x6a, 0x10, 0x22, 0x4b, 0x0a, 0x00, 0xd2, 0x00, 0x22, +0x10, 0x43, 0x89, 0x07, 0x89, 0x0f, 0x89, 0x01, 0x08, 0x43, 0x90, 0xbc, +0x70, 0x47, 0x40, 0x0c, 0x00, 0xd2, 0x00, 0x24, 0x0c, 0x43, 0x20, 0x1c, +0xec, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x68, 0x0e, 0x00, 0x80, +0xc0, 0x00, 0x18, 0x40, 0xf0, 0xb5, 0x3a, 0x4c, 0x20, 0x1c, 0x05, 0xf0, +0x75, 0xfc, 0x39, 0x48, 0xe3, 0x23, 0x1b, 0x01, 0xc7, 0x18, 0xb9, 0x79, +0x37, 0x4e, 0xc5, 0x1d, 0x79, 0x35, 0x06, 0x29, 0x62, 0xd2, 0x02, 0xa3, +0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, +0x03, 0x0e, 0x1e, 0x37, 0x4e, 0x55, 0x01, 0x20, 0xb8, 0x71, 0x00, 0x20, +0xb0, 0x60, 0xff, 0xf7, 0x95, 0xff, 0x05, 0x23, 0x98, 0x43, 0x00, 0xf0, +0x6f, 0xf8, 0x0c, 0xe0, 0xff, 0xf7, 0x8e, 0xff, 0xc0, 0x08, 0x06, 0xd3, +0xb0, 0x68, 0x41, 0x1c, 0xb1, 0x60, 0x0a, 0x28, 0x03, 0xd9, 0x04, 0x20, +0x00, 0xe0, 0x02, 0x20, 0xb8, 0x71, 0x64, 0x22, 0x20, 0x1c, 0x2b, 0xe0, +0x06, 0x1c, 0xc0, 0x6f, 0x80, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, +0x03, 0x20, 0xb8, 0x71, 0x20, 0x1c, 0x20, 0x4a, 0x00, 0x21, 0x05, 0xf0, +0x07, 0xfc, 0xf0, 0x6f, 0x04, 0x23, 0x01, 0x68, 0x99, 0x43, 0x01, 0x60, +0x28, 0x68, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x05, 0x21, 0xb9, 0x71, 0x29, 0x68, 0x04, 0x23, 0x0a, 0x68, +0x9a, 0x43, 0x0a, 0x60, 0xc0, 0x6f, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, +0xff, 0xf7, 0x5a, 0xff, 0x08, 0x23, 0x18, 0x43, 0x00, 0xf0, 0x34, 0xf8, +0x20, 0x1c, 0x10, 0x4a, 0x00, 0x21, 0x05, 0xf0, 0xe5, 0xfb, 0xe5, 0xe7, +0xff, 0xf7, 0x4e, 0xff, 0x04, 0x23, 0x18, 0x43, 0x00, 0xf0, 0x28, 0xf8, +0xde, 0xe7, 0x00, 0x20, 0x29, 0x68, 0x60, 0x23, 0x0a, 0x68, 0x9a, 0x43, +0x0a, 0x60, 0xff, 0xf7, 0xe1, 0xfa, 0xd5, 0xe7, 0x06, 0x20, 0xb8, 0x71, +0xd2, 0xe7, 0x00, 0x00, 0x99, 0x7c, 0x21, 0x40, 0x68, 0x0e, 0x00, 0x80, +0x9c, 0x03, 0x00, 0x80, 0x30, 0x75, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, +0x00, 0xb5, 0x00, 0x20, 0x04, 0x49, 0xc0, 0x46, 0x88, 0x71, 0x04, 0x48, +0x01, 0x22, 0x00, 0x21, 0x05, 0xf0, 0xbc, 0xfb, 0x08, 0xbc, 0x18, 0x47, +0x98, 0x1c, 0x00, 0x80, 0x99, 0x7c, 0x21, 0x40, 0x90, 0xb5, 0x07, 0x1c, +0x31, 0x48, 0x00, 0x68, 0x79, 0x08, 0x03, 0xd3, 0x10, 0x23, 0x01, 0x1c, +0x99, 0x43, 0x01, 0xe0, 0x10, 0x21, 0x01, 0x43, 0x2d, 0x4c, 0xe2, 0x68, +0x01, 0x2a, 0x05, 0xd1, 0x22, 0x79, 0x00, 0x2a, 0x02, 0xd0, 0x01, 0x23, +0x9b, 0x02, 0x19, 0x43, 0x81, 0x42, 0x02, 0xd0, 0x01, 0x20, 0x00, 0x05, +0x01, 0x60, 0xe0, 0x68, 0x01, 0x28, 0x20, 0xd1, 0x1b, 0x23, 0xdb, 0x01, +0xe0, 0x18, 0x80, 0x8b, 0xf9, 0x08, 0x04, 0xd3, 0x01, 0x23, 0xdb, 0x02, +0x01, 0x1c, 0x99, 0x43, 0x01, 0xe0, 0x01, 0x21, 0xc9, 0x02, 0x81, 0x42, +0x02, 0xd0, 0x00, 0x20, 0x03, 0xf0, 0xca, 0xf9, 0x38, 0x09, 0x07, 0xd3, +0xe0, 0x6f, 0x80, 0x23, 0x01, 0x68, 0x99, 0x43, 0x01, 0x60, 0xe0, 0x18, +0x00, 0x68, 0x00, 0xe0, 0xe0, 0x6f, 0x80, 0x23, 0x01, 0x68, 0x19, 0x43, +0x01, 0x60, 0x15, 0x48, 0x01, 0x6a, 0x78, 0x09, 0x03, 0xd3, 0xff, 0x20, 0x01, 0x30, 0x08, 0x43, 0x03, 0xe0, 0xff, 0x23, 0x08, 0x1c, 0x01, 0x33, 0x98, 0x43, 0x80, 0x08, 0x80, 0x00, 0xba, 0x09, 0x92, 0x07, 0x92, 0x0f, -0x10, 0x43, 0x88, 0x42, 0x02, 0xd0, 0x0d, 0x49, 0xc0, 0x46, 0x08, 0x62, +0x10, 0x43, 0x88, 0x42, 0x02, 0xd0, 0x0c, 0x49, 0xc0, 0x46, 0x08, 0x62, 0xe1, 0x68, 0x01, 0x29, 0x08, 0xd1, 0x79, 0x0a, 0x06, 0xd3, 0xff, 0x23, -0x04, 0x33, 0x18, 0x40, 0x03, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0x90, 0xff, +0x04, 0x33, 0x18, 0x40, 0x03, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0x8e, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, 0xc0, 0x00, 0x18, 0x40, -0xc0, 0x00, 0x18, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xc1, 0xfe, 0x80, 0x09, -0x12, 0xd2, 0x0b, 0x48, 0x41, 0x78, 0x00, 0x29, 0x0e, 0xd1, 0x01, 0x21, -0x41, 0x70, 0x00, 0x27, 0x08, 0x48, 0x06, 0xe0, 0x02, 0x20, 0x03, 0xf0, -0x03, 0xf8, 0x07, 0x20, 0x02, 0xf0, 0xd2, 0xff, 0x38, 0x1c, 0xff, 0xf7, -0x5b, 0xfa, 0xf5, 0xe7, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x18, 0x1c, 0x00, 0x80, 0xf4, 0x01, 0xff, 0xff, 0x00, 0xb5, 0x84, 0xb0, -0x69, 0x46, 0xff, 0xf7, 0x69, 0xfc, 0xff, 0xf7, 0x9d, 0xfe, 0x01, 0xab, -0x58, 0x80, 0x08, 0x48, 0x00, 0x68, 0xc0, 0x46, 0x02, 0x90, 0x07, 0x48, -0x00, 0x6a, 0xc0, 0x46, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, -0x99, 0xfb, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x00, 0x00, 0x10, 0x40, 0xc0, 0x00, 0x18, 0x40, 0x80, 0xb5, 0x84, 0xb0, -0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, 0x49, 0xfc, 0xf8, 0x88, -0xff, 0xf7, 0x4a, 0xff, 0xff, 0xf7, 0x7a, 0xfe, 0x01, 0xab, 0x58, 0x80, -0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x7e, 0xfb, 0x01, 0x20, 0x04, 0xb0, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xc6, 0xb0, 0xc7, 0x88, -0x69, 0x46, 0xff, 0xf7, 0x33, 0xfc, 0x01, 0x24, 0x63, 0x02, 0x9f, 0x42, -0x0a, 0xd3, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, -0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x68, 0x46, 0x00, 0x21, 0x16, 0xe0, -0x0e, 0x48, 0xff, 0xf7, 0x05, 0xfa, 0x05, 0x1c, 0x38, 0x1c, 0x04, 0xa9, -0x03, 0xf0, 0xa2, 0xfb, 0x0b, 0x49, 0x28, 0x1c, -0xff, 0xf7, 0xfd, 0xf9, 0x10, 0x20, 0x00, 0xab, 0x58, 0x70, 0x04, 0x98, -0xc0, 0x46, 0x02, 0x90, 0x05, 0x98, 0xc0, 0x46, 0x03, 0x90, 0x68, 0x46, -0x06, 0xa9, 0xff, 0xf7, 0x4b, 0xfb, 0x20, 0x1c, 0x46, 0xb0, 0xb0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, +0x68, 0x0e, 0x00, 0x80, 0xc0, 0x00, 0x18, 0x40, 0xc0, 0x00, 0x18, 0x00, +0x80, 0xb5, 0xff, 0xf7, 0xb1, 0xfe, 0x80, 0x09, 0x1b, 0xd2, 0x0f, 0x48, +0xe3, 0x23, 0x1b, 0x01, 0xc1, 0x18, 0x4a, 0x79, 0x00, 0x2a, 0x14, 0xd1, +0x01, 0x22, 0x4a, 0x71, 0x00, 0x27, 0x80, 0x30, 0x00, 0x68, 0x60, 0x23, +0x01, 0x68, 0x99, 0x43, 0x01, 0x60, 0x08, 0x48, +0x06, 0xe0, 0x02, 0x20, 0x03, 0xf0, 0x7e, 0xfb, 0x07, 0x20, 0x03, 0xf0, +0x4d, 0xfb, 0x38, 0x1c, 0xff, 0xf7, 0x34, 0xfa, 0xf5, 0xe7, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0xf4, 0x01, 0xff, 0xff, +0x00, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0xff, 0xf7, 0x43, 0xfc, 0xff, 0xf7, +0x85, 0xfe, 0x01, 0xab, 0x58, 0x80, 0x08, 0x48, 0x00, 0x68, 0xc0, 0x46, +0x02, 0x90, 0x07, 0x48, 0x00, 0x6a, 0xc0, 0x46, 0x03, 0x90, 0x68, 0x46, +0x00, 0x21, 0xff, 0xf7, 0x73, 0xfb, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0xc0, 0x00, 0x18, 0x40, +0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, +0x23, 0xfc, 0xf8, 0x88, 0xff, 0xf7, 0x42, 0xff, 0xff, 0xf7, 0x62, 0xfe, +0x01, 0xab, 0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x58, 0xfb, +0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, +0xc6, 0xb0, 0xc7, 0x88, 0x69, 0x46, 0xff, 0xf7, 0x0d, 0xfc, 0x01, 0x24, +0x16, 0x4b, 0x9f, 0x42, 0x0a, 0xd9, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, +0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x68, 0x46, +0x00, 0x21, 0x17, 0xe0, 0x10, 0x48, 0xff, 0xf7, 0xdf, 0xf9, 0x05, 0x1c, +0x0f, 0x4a, 0x38, 0x1c, 0x04, 0xa9, 0xff, 0xf7, 0xdb, 0xf9, 0x0e, 0x49, +0x28, 0x1c, 0xff, 0xf7, 0xd6, 0xf9, 0x10, 0x20, 0x00, 0xab, 0x58, 0x70, +0x04, 0x98, 0xc0, 0x46, 0x02, 0x90, 0x05, 0x98, 0xc0, 0x46, 0x03, 0x90, +0x68, 0x46, 0x06, 0xa9, 0xff, 0xf7, 0x24, 0xfb, 0x20, 0x1c, 0x46, 0xb0, +0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, +0x24, 0x02, 0xff, 0xff, 0x29, 0xbf, 0x21, 0x40, 0x3c, 0x02, 0xff, 0xff, 0xf0, 0xb5, 0xc6, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xff, 0xf7, -0xfb, 0xfb, 0xfc, 0x88, 0x78, 0x78, 0x01, 0x25, 0x10, 0x28, 0x02, 0xd1, +0xcf, 0xfb, 0xfc, 0x88, 0x78, 0x78, 0x01, 0x25, 0x10, 0x28, 0x02, 0xd1, 0x43, 0x01, 0x9c, 0x42, 0x09, 0xd3, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x04, 0x33, -0x2c, 0xe0, 0xb8, 0x68, 0xc0, 0x46, 0x04, 0x90, 0xf8, 0x68, 0xc0, 0x46, +0x27, 0xe0, 0xb8, 0x68, 0xc0, 0x46, 0x04, 0x90, 0xf8, 0x68, 0xc0, 0x46, 0x05, 0x90, 0x06, 0xaa, 0xfb, 0x1d, 0x09, 0x33, 0x00, 0x21, 0x78, 0x78, 0x00, 0x28, 0x0d, 0xdd, 0x00, 0x20, 0x40, 0xcb, 0x40, 0xc2, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x04, 0x28, 0xf8, 0xdb, 0x48, 0x1c, 0x01, 0x04, -0x09, 0x0c, 0x78, 0x78, 0x88, 0x42, 0xf1, 0xdc, 0x0d, 0x48, 0xff, 0xf7, -0xaf, 0xf9, 0x06, 0x1c, 0x20, 0x1c, 0x04, 0xa9, 0x03, 0xf0, 0x76, 0xfb, -0x0a, 0x49, 0x30, 0x1c, 0xff, 0xf7, 0xa7, 0xf9, 0x38, 0x68, 0xc0, 0x46, -0x00, 0x90, 0x00, 0x20, 0x00, 0xab, 0x58, 0x70, 0x68, 0x46, 0x00, 0x21, -0xff, 0xf7, 0xf8, 0xfa, 0x28, 0x1c, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, -0xf0, 0xb5, 0x84, 0xb0, 0x04, 0x1c, 0x00, 0x27, 0xe6, 0x88, 0xa2, 0x68, -0x47, 0x49, 0x08, 0x79, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x2e, 0x01, 0xd0, -0x01, 0x2e, 0x01, 0xd1, 0x01, 0x27, 0x01, 0xe0, 0x04, 0x2e, 0x00, 0xd1, -0x03, 0x26, 0x01, 0x25, 0x41, 0x48, 0x05, 0x2e, 0x66, 0xd2, 0x02, 0xa3, -0x9b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x03, 0x06, 0x08, 0x0c, -0x10, 0x00, 0x85, 0x83, 0x00, 0x23, 0x03, 0xe0, 0x85, 0x83, 0x05, 0xe0, -0x00, 0x23, 0x83, 0x83, 0xc3, 0x83, 0x06, 0xe0, 0x00, 0x23, 0x83, 0x83, -0xc5, 0x83, 0x02, 0xe0, 0xff, 0x23, 0x01, 0x33, 0x83, 0x83, 0xcb, 0x1d, -0x79, 0x33, 0x1e, 0x89, 0x01, 0x23, 0x5b, 0x02, 0x9e, 0x42, 0x02, 0xdb, -0xd2, 0x07, 0xd2, 0x0f, 0x00, 0xe0, 0x01, 0x22, 0x6d, 0x23, 0x5b, 0x01, -0xc9, 0x18, 0x09, 0x88, 0xff, 0x23, 0xe1, 0x33, 0x99, 0x43, 0x01, 0x23, -0x19, 0x43, 0x86, 0x8b, 0xff, 0x33, 0x9e, 0x42, 0x0d, 0xd1, 0xff, 0x20, -0xe1, 0x30, 0x08, 0x43, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x23, 0x9b, 0x02, -0x98, 0x43, 0x01, 0x1c, 0x20, 0xe0, 0x01, 0x21, 0x89, 0x02, 0x01, 0x43, -0x1c, 0xe0, 0x01, 0x2e, 0x0a, 0xd1, 0xc0, 0x8b, 0x01, 0x28, 0x04, 0xd1, -0x60, 0x23, 0x19, 0x43, 0x00, 0x2a, 0x13, 0xd0, 0x0c, 0xe0, 0x20, 0x23, -0x19, 0x43, 0x0f, 0xe0, 0x00, 0x2e, 0x0d, 0xd1, 0xc0, 0x8b, 0x01, 0x28, -0x08, 0xd1, 0xff, 0x23, 0x81, 0x33, 0x19, 0x43, 0x00, 0x2a, 0x05, 0xd0, -0x01, 0x23, 0x9b, 0x02, 0x19, 0x43, 0x01, 0xe0, 0x80, 0x23, 0x19, 0x43, -0x04, 0x20, 0x02, 0xf0, 0x8d, 0xfc, 0x09, 0x21, 0x49, 0x02, 0x00, 0x20, -0x02, 0xf0, 0x88, 0xfc, 0x00, 0x2f, 0x02, 0xd1, 0x00, 0x20, 0x12, 0xe0, -0xff, 0xe7, 0x69, 0x46, 0x20, 0x1c, 0xff, 0xf7, 0x2b, 0xfb, 0x00, 0xa8, -0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, -0xd8, 0x80, 0x68, 0x46, 0x00, 0x21, 0x04, 0x33, 0xff, 0xf7, 0x5e, 0xfa, -0x28, 0x1c, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0xe8, 0x1b, 0x00, 0x80, -0xc0, 0x88, 0x51, 0x21, 0x89, 0x03, 0x08, 0x62, 0x00, 0x20, 0x70, 0x47, -0x80, 0xb5, 0x16, 0x4f, 0xf8, 0x68, 0x01, 0x28, 0x07, 0xd1, 0x37, 0x23, -0x9b, 0x01, 0xf8, 0x18, 0xc0, 0x89, 0x80, 0x21, 0x01, 0x43, 0x1b, 0x20, -0x07, 0xe0, 0x6d, 0x23, 0x5b, 0x01, 0xf8, 0x18, 0x00, 0x8b, 0x01, 0x21, -0x49, 0x03, 0x01, 0x43, 0x10, 0x20, 0x02, 0xf0, 0x4b, 0xfc, 0x01, 0x20, -0x07, 0x23, 0x5b, 0x02, 0xf9, 0x18, 0x88, 0x83, 0xc8, 0x83, 0x1b, 0x23, -0xdb, 0x01, 0xf8, 0x18, 0x00, 0x8b, 0x01, 0x23, 0x1b, 0x03, 0x98, 0x43, -0x41, 0x21, 0x09, 0x02, 0x01, 0x43, 0x00, 0x20, 0x02, 0xf0, 0x38, 0xfc, -0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x80, 0xb5, 0x17, 0x4f, 0xf8, 0x68, 0x01, 0x28, 0x08, 0xd1, 0x37, 0x23, -0x9b, 0x01, 0xf8, 0x18, 0xc0, 0x89, 0x80, 0x23, 0x98, 0x43, 0x01, 0x1c, -0x1b, 0x20, 0x08, 0xe0, 0x6d, 0x23, 0x5b, 0x01, 0xf8, 0x18, 0x00, 0x8b, -0x01, 0x23, 0x5b, 0x03, 0x98, 0x43, 0x01, 0x1c, 0x10, 0x20, 0x02, 0xf0, -0x19, 0xfc, 0xff, 0x20, 0x07, 0x23, 0x5b, 0x02, 0xf9, 0x18, 0x01, 0x30, -0x88, 0x83, 0x1b, 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x00, 0x8b, 0x41, 0x23, -0x1b, 0x02, 0x98, 0x43, 0x09, 0x21, 0x49, 0x02, 0x01, 0x43, 0x00, 0x20, -0x02, 0xf0, 0x06, 0xfc, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0x80, 0xb5, 0x84, 0xb0, 0x08, 0x49, 0xcf, 0x6a, -0x69, 0x46, 0xff, 0xf7, 0xa5, 0xfa, 0xb8, 0x05, 0x80, 0x0d, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xdd, 0xf9, 0x01, 0x20, -0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x40, 0x00, 0x14, 0x40, -0xc0, 0x88, 0x9f, 0x23, 0x18, 0x40, 0x05, 0x49, 0xc9, 0x6a, 0x1b, 0x23, -0x5b, 0x01, 0x19, 0x40, 0x08, 0x43, 0x03, 0x49, 0xc0, 0x46, 0xc8, 0x62, -0x00, 0x20, 0x70, 0x47, 0x40, 0x00, 0x14, 0x40, 0x40, 0x00, 0x14, 0x00, -0x80, 0xb5, 0x84, 0xb0, 0x0d, 0x49, 0x0f, 0x6a, 0x01, 0x2f, 0x01, 0xd1, -0xff, 0x03, 0x07, 0xe0, 0x02, 0x2f, 0x01, 0xd1, 0x3f, 0x03, 0x03, 0xe0, -0x00, 0x2f, 0x01, 0xd1, 0x01, 0x27, 0xff, 0x02, 0x69, 0x46, 0xff, 0xf7, -0x71, 0xfa, 0x01, 0xab, 0x5f, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, -0xab, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x20, 0x14, 0x40, 0xc2, 0x88, 0xa1, 0x20, 0x40, 0x03, 0x00, 0x21, -0x01, 0x23, 0x5b, 0x03, 0x9a, 0x42, 0x01, 0xd1, 0x02, 0x22, 0x04, 0xe0, -0x01, 0x23, 0xdb, 0x03, 0x9a, 0x42, 0x02, 0xd1, 0x01, 0x22, 0x02, 0x62, -0x00, 0xe0, 0x01, 0x62, 0x08, 0x1c, 0x70, 0x47, 0x90, 0xb5, 0x84, 0xb0, -0x07, 0x1c, 0x02, 0xf0, 0xb7, 0xfb, 0x69, 0x46, 0x04, 0x1c, 0x38, 0x1c, -0xff, 0xf7, 0x46, 0xfa, 0x01, 0xab, 0x5c, 0x80, 0x09, 0x4f, 0xf8, 0x6d, -0xc0, 0x46, 0x02, 0x90, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x7c, 0xf9, -0xf8, 0x6d, 0xc0, 0x07, 0xc0, 0x0f, 0x05, 0x49, 0xc0, 0x46, 0x88, 0x62, +0x09, 0x0c, 0x78, 0x78, 0x88, 0x42, 0xf1, 0xdc, 0x0a, 0x48, 0xff, 0xf7, +0x83, 0xf9, 0x07, 0x1c, 0x09, 0x4a, 0x20, 0x1c, 0x04, 0xa9, 0xff, 0xf7, +0x7f, 0xf9, 0x08, 0x49, 0x38, 0x1c, 0xff, 0xf7, 0x7a, 0xf9, 0x68, 0x46, +0x00, 0x21, 0xff, 0xf7, 0xd1, 0xfa, 0x28, 0x1c, 0x46, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x24, 0x02, 0xff, 0xff, 0x51, 0xbf, 0x21, 0x40, +0x3c, 0x02, 0xff, 0xff, 0xf0, 0xb5, 0x84, 0xb0, 0x04, 0x1c, 0x00, 0x27, +0xe6, 0x88, 0xa2, 0x68, 0x47, 0x49, 0x08, 0x79, 0x00, 0x28, 0x08, 0xd0, +0x00, 0x2e, 0x01, 0xd0, 0x01, 0x2e, 0x01, 0xd1, 0x01, 0x27, 0x01, 0xe0, +0x04, 0x2e, 0x00, 0xd1, 0x03, 0x26, 0x01, 0x25, 0x41, 0x48, 0x05, 0x2e, +0x66, 0xd2, 0x02, 0xa3, 0x9b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, +0x03, 0x06, 0x08, 0x0c, 0x10, 0x00, 0x05, 0x80, 0x00, 0x23, 0x03, 0xe0, +0x05, 0x80, 0x05, 0xe0, 0x00, 0x23, 0x03, 0x80, 0x43, 0x80, 0x06, 0xe0, +0x00, 0x23, 0x03, 0x80, 0x45, 0x80, 0x02, 0xe0, +0xff, 0x23, 0x01, 0x33, 0x03, 0x80, 0xcb, 0x1d, 0x79, 0x33, 0x9e, 0x89, +0x01, 0x23, 0x5b, 0x02, 0x9e, 0x42, 0x02, 0xdb, 0xd2, 0x07, 0xd2, 0x0f, +0x00, 0xe0, 0x01, 0x22, 0x6d, 0x23, 0x5b, 0x01, 0xc9, 0x18, 0x89, 0x88, +0xff, 0x23, 0xe1, 0x33, 0x99, 0x43, 0x01, 0x23, 0x19, 0x43, 0x06, 0x88, +0xff, 0x33, 0x9e, 0x42, 0x0d, 0xd1, 0xff, 0x20, 0xe1, 0x30, 0x08, 0x43, +0x00, 0x2a, 0x04, 0xd1, 0x01, 0x23, 0x9b, 0x02, 0x98, 0x43, 0x01, 0x1c, +0x20, 0xe0, 0x01, 0x21, 0x89, 0x02, 0x01, 0x43, 0x1c, 0xe0, 0x01, 0x2e, +0x0a, 0xd1, 0x40, 0x88, 0x01, 0x28, 0x04, 0xd1, 0x60, 0x23, 0x19, 0x43, +0x00, 0x2a, 0x13, 0xd0, 0x0c, 0xe0, 0x20, 0x23, 0x19, 0x43, 0x0f, 0xe0, +0x00, 0x2e, 0x0d, 0xd1, 0x40, 0x88, 0x01, 0x28, 0x08, 0xd1, 0xff, 0x23, +0x81, 0x33, 0x19, 0x43, 0x00, 0x2a, 0x05, 0xd0, 0x01, 0x23, 0x9b, 0x02, +0x19, 0x43, 0x01, 0xe0, 0x80, 0x23, 0x19, 0x43, 0x04, 0x20, 0x03, 0xf0, +0x2d, 0xf8, 0x09, 0x21, 0x49, 0x02, 0x00, 0x20, 0x03, 0xf0, 0x28, 0xf8, +0x00, 0x2f, 0x02, 0xd1, 0x00, 0x20, 0x12, 0xe0, 0xff, 0xe7, 0x69, 0x46, +0x20, 0x1c, 0xff, 0xf7, 0x03, 0xfb, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, +0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x68, 0x46, +0x00, 0x21, 0x04, 0x33, 0xff, 0xf7, 0x36, 0xfa, 0x28, 0x1c, 0x04, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, +0x88, 0x1c, 0x00, 0x80, 0xc0, 0x88, 0x51, 0x21, 0x89, 0x03, 0x08, 0x62, +0x00, 0x20, 0x70, 0x47, 0x80, 0xb5, 0x16, 0x4f, 0xf8, 0x68, 0x01, 0x28, +0x07, 0xd1, 0x37, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x40, 0x8a, 0x80, 0x21, +0x01, 0x43, 0x1b, 0x20, 0x07, 0xe0, 0x6d, 0x23, 0x5b, 0x01, 0xf8, 0x18, +0x80, 0x8b, 0x01, 0x21, 0x49, 0x03, 0x01, 0x43, 0x10, 0x20, 0x02, 0xf0, +0xeb, 0xff, 0x01, 0x20, 0x71, 0x23, 0x5b, 0x01, 0xf9, 0x18, 0x08, 0x80, +0x48, 0x80, 0x1b, 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x80, 0x8b, 0x01, 0x23, +0x1b, 0x03, 0x98, 0x43, 0x41, 0x21, 0x09, 0x02, 0x01, 0x43, 0x00, 0x20, +0x02, 0xf0, 0xd8, 0xff, 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x17, 0x4f, 0xf8, 0x68, 0x01, 0x28, +0x08, 0xd1, 0x37, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x40, 0x8a, 0x80, 0x23, +0x98, 0x43, 0x01, 0x1c, 0x1b, 0x20, 0x08, 0xe0, 0x6d, 0x23, 0x5b, 0x01, +0xf8, 0x18, 0x80, 0x8b, 0x01, 0x23, 0x5b, 0x03, 0x98, 0x43, 0x01, 0x1c, +0x10, 0x20, 0x02, 0xf0, 0xb9, 0xff, 0xff, 0x20, 0x71, 0x23, 0x5b, 0x01, +0xf9, 0x18, 0x01, 0x30, 0x08, 0x80, 0x1b, 0x23, 0xdb, 0x01, 0xf8, 0x18, +0x80, 0x8b, 0x41, 0x23, 0x1b, 0x02, 0x98, 0x43, 0x09, 0x21, 0x49, 0x02, +0x01, 0x43, 0x00, 0x20, 0x02, 0xf0, 0xa6, 0xff, 0x00, 0x20, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0x84, 0xb0, +0x08, 0x49, 0xcf, 0x6a, 0x69, 0x46, 0xff, 0xf7, 0x7d, 0xfa, 0xb8, 0x05, +0x80, 0x0d, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, +0xb5, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x40, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x9f, 0x23, 0x18, 0x40, 0x05, 0x49, +0xc9, 0x6a, 0x1b, 0x23, 0x5b, 0x01, 0x19, 0x40, 0x08, 0x43, 0x03, 0x49, +0xc0, 0x46, 0xc8, 0x62, 0x00, 0x20, 0x70, 0x47, 0x40, 0x00, 0x14, 0x40, +0x40, 0x00, 0x14, 0x00, 0x80, 0xb5, 0x84, 0xb0, +0x0d, 0x49, 0x0f, 0x6a, 0x01, 0x2f, 0x01, 0xd1, 0xff, 0x03, 0x07, 0xe0, +0x02, 0x2f, 0x01, 0xd1, 0x3f, 0x03, 0x03, 0xe0, 0x00, 0x2f, 0x01, 0xd1, +0x01, 0x27, 0xff, 0x02, 0x69, 0x46, 0xff, 0xf7, 0x49, 0xfa, 0x01, 0xab, +0x5f, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x83, 0xf9, 0x01, 0x20, +0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0x14, 0x40, +0xc2, 0x88, 0xa1, 0x20, 0x40, 0x03, 0x00, 0x21, 0x01, 0x23, 0x5b, 0x03, +0x9a, 0x42, 0x01, 0xd1, 0x02, 0x22, 0x04, 0xe0, 0x01, 0x23, 0xdb, 0x03, +0x9a, 0x42, 0x02, 0xd1, 0x01, 0x22, 0x02, 0x62, 0x00, 0xe0, 0x01, 0x62, +0x08, 0x1c, 0x70, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x02, 0xf0, +0x57, 0xff, 0x69, 0x46, 0x04, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x1e, 0xfa, +0x01, 0xab, 0x5c, 0x80, 0x09, 0x4f, 0xf8, 0x6d, 0xc0, 0x46, 0x02, 0x90, +0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x54, 0xf9, 0xf8, 0x6d, 0xc0, 0x07, +0xc0, 0x0f, 0x05, 0x49, 0xc0, 0x46, 0xc8, 0x62, 0x01, 0x20, 0x04, 0xb0, +0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa4, 0x2a, 0x00, 0x80, +0x68, 0x1c, 0x00, 0x80, 0xc0, 0x88, 0x02, 0x49, 0xc0, 0x46, 0x48, 0x61, +0x00, 0x20, 0x70, 0x47, 0x80, 0x00, 0x14, 0x00, 0x00, 0xb5, 0x84, 0xb0, +0x69, 0x46, 0xff, 0xf7, 0xf7, 0xf9, 0x06, 0x48, 0xc0, 0x68, 0x01, 0xab, +0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x2f, 0xf9, 0x01, 0x20, +0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x80, 0x00, 0x14, 0x40, +0xc0, 0x88, 0x02, 0x49, 0xc0, 0x46, 0xc8, 0x60, 0x00, 0x20, 0x70, 0x47, +0x80, 0x00, 0x14, 0x00, 0x80, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0x87, 0x68, +0xff, 0xf7, 0xda, 0xf9, 0x20, 0x2f, 0x07, 0xd2, 0x78, 0x00, 0x0c, 0x49, +0x40, 0x18, 0x1b, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x80, 0x8b, 0x06, 0xe0, +0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, +0x02, 0x20, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, +0x03, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x00, 0xb5, 0x84, 0xb0, 0xc1, 0x88, 0x82, 0x68, +0x20, 0x2a, 0x04, 0xd2, 0x10, 0x1c, 0x02, 0xf0, 0xcf, 0xfe, 0x00, 0x20, +0x10, 0xe0, 0x69, 0x46, 0xff, 0xf7, 0xae, 0xf9, 0x00, 0xa8, 0x00, 0x78, +0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, +0x68, 0x46, 0x00, 0x21, 0x04, 0x33, 0xff, 0xf7, 0xe1, 0xf8, 0x01, 0x20, +0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0xc7, 0x88, +0x69, 0x46, 0xff, 0xf7, 0x97, 0xf9, 0x10, 0x48, 0xfe, 0xf7, 0x78, 0xff, +0x02, 0x20, 0x39, 0x1c, 0x03, 0xf0, 0x3c, 0xfe, 0x00, 0x28, 0x06, 0xd0, +0x02, 0x20, 0x39, 0x1c, 0x03, 0xf0, 0x8c, 0xfd, 0x01, 0xab, 0x58, 0x80, +0x02, 0xe0, 0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x07, 0x49, 0x20, 0x1c, +0xfe, 0xf7, 0x65, 0xff, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xbc, 0xf8, 0x01, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x10, 0x2a, 0x00, 0x80, 0xe8, 0x1b, 0x00, 0x80, 0xc0, 0x88, 0x02, 0x49, -0xc0, 0x46, 0x48, 0x61, 0x00, 0x20, 0x70, 0x47, 0x80, 0x00, 0x14, 0x00, -0x00, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0xff, 0xf7, 0x1f, 0xfa, 0x06, 0x48, -0xc0, 0x68, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, -0x00, 0x21, 0xff, 0xf7, 0x57, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x80, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x02, 0x49, -0xc0, 0x46, 0xc8, 0x60, 0x00, 0x20, 0x70, 0x47, 0x80, 0x00, 0x14, 0x00, -0x80, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0x87, 0x68, 0xff, 0xf7, 0x02, 0xfa, -0x20, 0x2f, 0x07, 0xd2, 0x78, 0x00, 0x0c, 0x49, 0x40, 0x18, 0x1b, 0x23, -0xdb, 0x01, 0xc0, 0x18, 0x00, 0x8b, 0x06, 0xe0, 0x00, 0xa8, 0x00, 0x78, -0x40, 0x23, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x2b, 0xf9, 0x01, 0x20, -0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0xb5, 0x84, 0xb0, 0xc1, 0x88, 0x82, 0x68, 0x20, 0x2a, 0x04, 0xd2, -0x10, 0x1c, 0x02, 0xf0, 0x2f, 0xfb, 0x00, 0x20, 0x10, 0xe0, 0x69, 0x46, -0xff, 0xf7, 0xd6, 0xf9, 0x00, 0xa8, 0x00, 0x78, 0x40, 0x23, 0x18, 0x43, -0x00, 0xab, 0x18, 0x70, 0x02, 0x20, 0xd8, 0x80, 0x68, 0x46, 0x00, 0x21, -0x04, 0x33, 0xff, 0xf7, 0x09, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, -0x18, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0xc7, 0x88, 0x69, 0x46, 0xff, 0xf7, -0xbf, 0xf9, 0x10, 0x48, 0xfe, 0xf7, 0xa0, 0xff, 0x02, 0x20, 0x39, 0x1c, -0x03, 0xf0, 0x5a, 0xfa, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x20, 0x39, 0x1c, -0x03, 0xf0, 0x94, 0xf9, 0x01, 0xab, 0x58, 0x80, 0x02, 0xe0, 0x45, 0x20, -0x00, 0xab, 0x18, 0x70, 0x07, 0x49, 0x20, 0x1c, 0xfe, 0xf7, 0x8d, 0xff, -0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xe4, 0xf8, 0x01, 0x20, 0x04, 0xb0, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x24, 0x02, 0xff, 0xff, -0x3c, 0x02, 0xff, 0xff, 0xb0, 0xb5, 0x84, 0xb0, 0xc7, 0x88, 0x69, 0x46, -0x84, 0x68, 0xff, 0xf7, 0x93, 0xf9, 0x10, 0x48, 0xfe, 0xf7, 0x74, 0xff, -0x0f, 0x4a, 0x02, 0x20, 0x39, 0x1c, 0xfe, 0xf7, 0x71, 0xff, 0x00, 0x28, -0x06, 0xd0, 0x0d, 0x4b, 0x02, 0x20, 0x39, 0x1c, 0x22, 0x1c, 0xfe, 0xf7, -0x6a, 0xff, 0x02, 0xe0, 0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x09, 0x49, -0x28, 0x1c, 0xfe, 0xf7, 0x60, 0xff, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, -0xb7, 0xf8, 0x01, 0x20, 0x04, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x24, 0x02, 0xff, 0xff, 0xb9, 0xb8, 0x21, 0x40, 0x7b, 0xb7, 0x21, 0x40, -0x3c, 0x02, 0xff, 0xff, 0x00, 0xb5, 0xff, 0xf7, 0x7f, 0xf9, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x20, 0x70, 0x47, 0x80, 0xb4, 0xc2, 0x88, 0x19, 0x4b, -0xa1, 0x21, 0x49, 0x03, 0x00, 0x2a, 0x03, 0xd1, 0x18, 0x6b, 0x10, 0x23, -0x98, 0x43, 0x04, 0xe0, 0x01, 0x2a, 0x04, 0xd1, 0x18, 0x6b, 0x10, 0x23, -0x18, 0x43, 0x48, 0x61, 0x1f, 0xe0, 0x02, 0x2a, 0x1d, 0xd1, 0xc2, 0x68, -0x87, 0x68, 0x00, 0x20, 0x3b, 0x1c, 0xc3, 0x40, 0xdb, 0x07, 0xdb, 0x0f, -0x9b, 0x02, 0x03, 0x43, 0x0b, 0x61, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, -0x20, 0x28, 0xf3, 0xdb, 0x00, 0x20, 0x13, 0x1c, 0xc3, 0x40, 0xdb, 0x07, -0xdb, 0x0f, 0x9b, 0x02, 0xc7, 0x1d, 0x19, 0x37, 0x3b, 0x43, 0x0b, 0x61, -0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x28, 0xf1, 0xdb, 0x00, 0x20, -0x80, 0xbc, 0x70, 0x47, 0x80, 0x00, 0x14, 0x40, 0x90, 0xb4, 0xc2, 0x88, -0x81, 0x68, 0x10, 0x02, 0x12, 0x0a, 0x10, 0x43, 0x02, 0x04, 0x12, 0x0c, -0x0f, 0x48, 0xc0, 0x46, 0x02, 0x60, 0x0f, 0x4f, 0x65, 0x23, 0x5b, 0x01, -0xfb, 0x18, 0x9a, 0x83, 0x0a, 0x0c, 0x14, 0x02, -0x12, 0x12, 0x22, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x42, 0x60, 0xda, 0x83, +0x24, 0x02, 0xff, 0xff, 0x3c, 0x02, 0xff, 0xff, 0xb0, 0xb5, 0x84, 0xb0, +0xc7, 0x88, 0x69, 0x46, 0x84, 0x68, 0xff, 0xf7, 0x6b, 0xf9, 0x10, 0x48, +0xfe, 0xf7, 0x4c, 0xff, 0x0f, 0x4a, 0x02, 0x20, 0x39, 0x1c, 0xfe, 0xf7, +0x49, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x0d, 0x4b, 0x02, 0x20, 0x39, 0x1c, +0x22, 0x1c, 0xfe, 0xf7, 0x42, 0xff, 0x02, 0xe0, +0x45, 0x20, 0x00, 0xab, 0x18, 0x70, 0x09, 0x49, 0x28, 0x1c, 0xfe, 0xf7, +0x38, 0xff, 0x68, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x8f, 0xf8, 0x01, 0x20, +0x04, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x24, 0x02, 0xff, 0xff, +0xcd, 0xc0, 0x21, 0x40, 0xd9, 0xbf, 0x21, 0x40, 0x3c, 0x02, 0xff, 0xff, +0x00, 0xb5, 0xff, 0xf7, 0x57, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, +0x70, 0x47, 0x80, 0xb4, 0xc2, 0x88, 0x19, 0x4b, 0xa1, 0x21, 0x49, 0x03, +0x00, 0x2a, 0x03, 0xd1, 0x18, 0x6b, 0x10, 0x23, 0x98, 0x43, 0x04, 0xe0, +0x01, 0x2a, 0x04, 0xd1, 0x18, 0x6b, 0x10, 0x23, 0x18, 0x43, 0x48, 0x61, +0x1f, 0xe0, 0x02, 0x2a, 0x1d, 0xd1, 0xc2, 0x68, 0x87, 0x68, 0x00, 0x20, +0x3b, 0x1c, 0xc3, 0x40, 0xdb, 0x07, 0xdb, 0x0f, 0x9b, 0x02, 0x03, 0x43, +0x0b, 0x61, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x28, 0xf3, 0xdb, +0x00, 0x20, 0x13, 0x1c, 0xc3, 0x40, 0xdb, 0x07, 0xdb, 0x0f, 0x9b, 0x02, +0xc7, 0x1d, 0x19, 0x37, 0x3b, 0x43, 0x0b, 0x61, 0x01, 0x30, 0x00, 0x04, +0x00, 0x0c, 0x20, 0x28, 0xf1, 0xdb, 0x00, 0x20, 0x80, 0xbc, 0x70, 0x47, +0x80, 0x00, 0x14, 0x40, 0x80, 0xb4, 0xc2, 0x88, 0x81, 0x68, 0x10, 0x02, +0x12, 0x0a, 0x10, 0x43, 0x02, 0x04, 0x12, 0x0c, 0x0c, 0x48, 0xc0, 0x46, +0x02, 0x60, 0x0c, 0x4b, 0xc0, 0x46, 0x1a, 0x80, 0x0a, 0x0c, 0x17, 0x02, +0x12, 0x12, 0x3a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x42, 0x60, 0x5a, 0x80, 0x09, 0x04, 0x09, 0x0c, 0x0a, 0x02, 0x09, 0x0a, 0x11, 0x43, 0x09, 0x04, -0x09, 0x0c, 0x81, 0x60, 0x33, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x01, 0x80, -0x00, 0x20, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x40, 0x00, 0x14, 0x00, -0xe8, 0x0d, 0x00, 0x80, 0xb0, 0xb5, 0x84, 0xb0, 0x13, 0x49, 0x0a, 0x68, -0x12, 0x04, 0x12, 0x0c, 0x13, 0x02, 0x12, 0x12, 0x13, 0x43, 0x4a, 0x68, -0x12, 0x04, 0x12, 0x0c, 0x1f, 0x1c, 0x13, 0x02, 0x12, 0x12, 0x13, 0x43, -0x89, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x0a, 0x02, 0x09, 0x12, 0x11, 0x43, -0x0c, 0x04, 0x24, 0x0c, 0x69, 0x46, 0x1d, 0x1c, 0xff, 0xf7, 0xe4, 0xf8, -0x01, 0xab, 0x5f, 0x80, 0x28, 0x04, 0x20, 0x43, 0x02, 0x90, 0x68, 0x46, -0x00, 0x21, 0xff, 0xf7, 0x1b, 0xf8, 0x01, 0x20, 0x04, 0xb0, 0xb0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x40, 0x00, 0x14, 0x40, 0xc1, 0x88, 0x82, 0x68, -0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x0a, 0x49, -0xc0, 0x46, 0xc8, 0x60, 0x10, 0x0c, 0x03, 0x02, 0x00, 0x12, 0x18, 0x43, -0x00, 0x04, 0x00, 0x0c, 0x08, 0x61, 0x10, 0x04, 0x00, 0x0c, 0x02, 0x02, -0x00, 0x0a, 0x10, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x48, 0x61, 0x00, 0x20, -0x70, 0x47, 0x00, 0x00, 0x40, 0x00, 0x14, 0x00, 0x90, 0xb5, 0x84, 0xb0, -0x16, 0x4b, 0xd9, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x0a, 0x02, 0x09, 0x12, -0x11, 0x43, 0x1a, 0x69, 0x12, 0x04, 0x12, 0x0c, 0x17, 0x02, 0x12, 0x12, -0x3a, 0x43, 0x5b, 0x69, 0x1b, 0x04, 0x1b, 0x0c, 0x1f, 0x02, 0x1b, 0x12, -0x3b, 0x43, 0x1f, 0x04, 0x3f, 0x0c, 0x05, 0x23, 0x00, 0x93, 0x84, 0x88, -0x01, 0xab, 0x1c, 0x80, 0x00, 0x24, 0x04, 0x3b, 0x5c, 0x70, 0x40, 0x88, -0x00, 0xab, 0x58, 0x80, 0xd9, 0x80, 0x10, 0x04, 0x38, 0x43, 0x02, 0x90, -0x03, 0x94, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xcb, 0xff, 0x01, 0x20, -0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x40, 0x00, 0x14, 0x40, -0x00, 0xb5, 0x84, 0xb0, 0x0b, 0x49, 0x8a, 0x6a, 0x05, 0x21, 0x00, 0x91, -0x81, 0x88, 0x01, 0xab, 0x19, 0x80, 0x00, 0x21, 0x04, 0x3b, 0x59, 0x70, -0x40, 0x88, 0x00, 0xab, 0x58, 0x80, 0xda, 0x80, 0x02, 0x91, 0x03, 0x91, -0x68, 0x46, 0xfe, 0xf7, 0xaf, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x02, 0x49, -0xc0, 0x46, 0x88, 0x62, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x00, 0x14, 0x00, -0x00, 0xb5, 0x84, 0xb0, 0x0b, 0x49, 0x0a, 0x6a, 0x05, 0x21, 0x00, 0x91, -0x81, 0x88, 0x01, 0xab, 0x19, 0x80, 0x00, 0x21, 0x04, 0x3b, 0x59, 0x70, -0x40, 0x88, 0x00, 0xab, 0x58, 0x80, 0xda, 0x80, 0x02, 0x91, 0x03, 0x91, -0x68, 0x46, 0xfe, 0xf7, 0x8b, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x02, 0x49, -0xc0, 0x46, 0x08, 0x62, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x00, 0x14, 0x00, -0x00, 0xb5, 0xc0, 0x88, 0x02, 0x49, 0xfe, 0xf7, 0x1c, 0xfe, 0x00, 0x20, -0x08, 0xbc, 0x18, 0x47, 0x75, 0x02, 0xff, 0xff, 0x00, 0xb5, 0x84, 0xb0, -0x69, 0x46, 0xff, 0xf7, 0x2d, 0xf8, 0x06, 0x48, 0x00, 0x6b, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x65, 0xff, 0x01, 0x20, -0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0xb5, 0xff, 0xf7, 0x33, 0xf8, 0x08, 0xbc, -0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0x2e, 0xf8, 0x08, 0xbc, 0x18, 0x47, -0x00, 0xb5, 0xff, 0xf7, 0x29, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, -0x01, 0x20, 0x14, 0x4f, 0x71, 0x23, 0x5b, 0x01, 0xf9, 0x18, 0x08, 0x71, -0x12, 0x48, 0xfe, 0xf7, 0xe9, 0xfd, 0x01, 0x20, 0x40, 0x02, 0xa1, 0x21, -0x49, 0x03, 0x88, 0x60, 0x00, 0x20, 0xf9, 0x1d, 0xb9, 0x31, 0x08, 0x70, -0x0d, 0x4a, 0x01, 0x23, 0x1b, 0x04, 0x11, 0x68, 0x0b, 0x40, 0x12, 0x21, -0x00, 0x2b, 0x05, 0xd1, 0x13, 0x68, 0x1b, 0x0c, 0x08, 0xd1, 0x12, 0x68, -0x92, 0x0a, 0x05, 0xd3, 0x07, 0x4a, 0xc0, 0x46, 0xd1, 0x60, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x05, 0x4a, 0xc0, 0x46, 0x11, 0x64, 0xf8, 0xe7, -0xe8, 0x0d, 0x00, 0x80, 0xa9, 0x9d, 0x21, 0x40, 0x00, 0x00, 0x10, 0x40, -0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xb5, 0x02, 0xf0, -0x83, 0xfb, 0x01, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x84, 0xb0, -0x07, 0x1c, 0xf8, 0x88, 0x02, 0xf0, 0x88, 0xfc, 0x00, 0x28, 0x0c, 0xd1, -0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, 0xc8, 0xff, 0x06, 0x48, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x01, 0xff, 0x01, 0x20, +0x09, 0x0c, 0x81, 0x60, 0x99, 0x80, 0x00, 0x20, 0x80, 0xbc, 0x70, 0x47, +0x40, 0x00, 0x14, 0x00, 0x28, 0x1b, 0x00, 0x80, 0xb0, 0xb5, 0x84, 0xb0, +0x13, 0x49, 0x0a, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x13, 0x02, 0x12, 0x12, +0x13, 0x43, 0x4a, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x1f, 0x1c, 0x13, 0x02, +0x12, 0x12, 0x13, 0x43, 0x89, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x0a, 0x02, +0x09, 0x12, 0x11, 0x43, 0x0c, 0x04, 0x24, 0x0c, 0x69, 0x46, 0x1d, 0x1c, +0xff, 0xf7, 0xc2, 0xf8, 0x01, 0xab, 0x5f, 0x80, 0x28, 0x04, 0x20, 0x43, +0x02, 0x90, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xf9, 0xff, 0x01, 0x20, +0x04, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x40, 0x00, 0x14, 0x40, +0xc1, 0x88, 0x82, 0x68, 0x08, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x00, 0x04, +0x00, 0x0c, 0x0a, 0x49, 0xc0, 0x46, 0xc8, 0x60, 0x10, 0x0c, 0x03, 0x02, +0x00, 0x12, 0x18, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x08, 0x61, 0x10, 0x04, +0x00, 0x0c, 0x02, 0x02, 0x00, 0x0a, 0x10, 0x43, 0x00, 0x04, 0x00, 0x0c, +0x48, 0x61, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x40, 0x00, 0x14, 0x00, +0x90, 0xb5, 0x84, 0xb0, 0x16, 0x4b, 0xd9, 0x68, 0x09, 0x04, 0x09, 0x0c, +0x0a, 0x02, 0x09, 0x12, 0x11, 0x43, 0x1a, 0x69, 0x12, 0x04, 0x12, 0x0c, +0x17, 0x02, 0x12, 0x12, 0x3a, 0x43, 0x5b, 0x69, 0x1b, 0x04, 0x1b, 0x0c, +0x1f, 0x02, 0x1b, 0x12, 0x3b, 0x43, 0x1f, 0x04, 0x3f, 0x0c, 0x05, 0x23, +0x00, 0x93, 0x84, 0x88, 0x01, 0xab, 0x1c, 0x80, 0x00, 0x24, 0x04, 0x3b, +0x5c, 0x70, 0x40, 0x88, 0x00, 0xab, 0x58, 0x80, 0xd9, 0x80, 0x10, 0x04, +0x38, 0x43, 0x02, 0x90, 0x03, 0x94, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, +0xa9, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x40, 0x00, 0x14, 0x40, 0x00, 0xb5, 0x84, 0xb0, 0x0b, 0x49, 0x8a, 0x6a, +0x05, 0x21, 0x00, 0x91, 0x81, 0x88, 0x01, 0xab, +0x19, 0x80, 0x00, 0x21, 0x04, 0x3b, 0x59, 0x70, 0x40, 0x88, 0x00, 0xab, +0x58, 0x80, 0xda, 0x80, 0x02, 0x91, 0x03, 0x91, 0x68, 0x46, 0xfe, 0xf7, +0x8d, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xc0, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x02, 0x49, 0xc0, 0x46, 0x88, 0x62, +0x00, 0x20, 0x70, 0x47, 0xc0, 0x00, 0x14, 0x00, 0x00, 0xb5, 0x84, 0xb0, +0x0b, 0x49, 0x0a, 0x6a, 0x05, 0x21, 0x00, 0x91, 0x81, 0x88, 0x01, 0xab, +0x19, 0x80, 0x00, 0x21, 0x04, 0x3b, 0x59, 0x70, 0x40, 0x88, 0x00, 0xab, +0x58, 0x80, 0xda, 0x80, 0x02, 0x91, 0x03, 0x91, 0x68, 0x46, 0xfe, 0xf7, +0x69, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xc0, 0x00, 0x14, 0x40, 0xc0, 0x88, 0x02, 0x49, 0xc0, 0x46, 0x08, 0x62, +0x00, 0x20, 0x70, 0x47, 0xc0, 0x00, 0x14, 0x00, 0x00, 0xb5, 0xc0, 0x88, +0x02, 0x49, 0xfe, 0xf7, 0xfa, 0xfd, 0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, +0x75, 0x02, 0xff, 0xff, 0x00, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0xff, 0xf7, +0x0b, 0xf8, 0x06, 0x48, 0x00, 0x6b, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, +0x00, 0x21, 0xfe, 0xf7, 0x43, 0xff, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x00, 0xb5, 0xff, 0xf7, +0x11, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0x0c, 0xf8, +0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0x07, 0xf8, 0x08, 0xbc, +0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0x10, 0x48, 0xfe, 0xf7, 0xcc, 0xfd, +0x01, 0x20, 0x40, 0x02, 0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, 0x00, 0x21, +0x0c, 0x48, 0xc0, 0x46, 0x01, 0x71, 0x0c, 0x48, 0x02, 0x68, 0x52, 0x0c, +0x05, 0xd2, 0x02, 0x68, 0x12, 0x0c, 0x06, 0xd1, 0x00, 0x68, 0x80, 0x0a, +0x03, 0xd3, 0x08, 0x48, 0xc0, 0x46, 0xc7, 0x60, 0x02, 0xe0, 0x07, 0x48, +0xc0, 0x46, 0x07, 0x64, 0x08, 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x21, 0xa5, 0x21, 0x40, 0x28, 0x0f, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, +0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xb5, 0x01, 0x20, +0x03, 0x49, 0xc0, 0x46, 0x08, 0x72, 0x12, 0x20, 0xff, 0xf7, 0xcb, 0xff, +0x08, 0xbc, 0x18, 0x47, 0x88, 0x1c, 0x00, 0x80, 0x00, 0xb5, 0x01, 0x20, +0x03, 0x49, 0xc0, 0x46, 0x48, 0x72, 0x15, 0x20, 0xff, 0xf7, 0xbf, 0xff, +0x08, 0xbc, 0x18, 0x47, 0x88, 0x1c, 0x00, 0x80, 0x00, 0xb5, 0x02, 0xf0, +0xf3, 0xfe, 0x01, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x84, 0xb0, +0x07, 0x1c, 0xf8, 0x88, 0x02, 0xf0, 0xf8, 0xff, 0x00, 0x28, 0x0c, 0xd1, +0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, 0x96, 0xff, 0x06, 0x48, 0x01, 0xab, +0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xcf, 0xfe, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xff, 0x00, 0x00, 0x00, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0xfe, 0xf7, -0xb3, 0xff, 0x03, 0xf0, 0x71, 0xfe, 0x01, 0xab, 0x58, 0x80, 0x09, 0x48, +0x81, 0xff, 0x04, 0xf0, 0x47, 0xfa, 0x01, 0xab, 0x58, 0x80, 0x09, 0x48, 0x81, 0x89, 0x09, 0x04, 0xc2, 0x89, 0x11, 0x43, 0x02, 0x91, 0x81, 0x88, 0x09, 0x04, 0xc0, 0x88, 0x08, 0x43, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, -0xfe, 0xf7, 0xe0, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, -0xc8, 0x29, 0x00, 0x80, 0x00, 0xb5, 0xfe, 0xf7, 0xaf, 0xff, 0x08, 0xbc, -0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0xaa, 0xff, 0x08, 0xbc, 0x18, 0x47, -0x00, 0xb5, 0xfe, 0xf7, 0xa5, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, -0xfe, 0xf7, 0xa0, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, -0x9b, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x96, 0xff, -0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x91, 0xff, 0x08, 0xbc, -0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x8c, 0xff, 0x08, 0xbc, 0x18, 0x47, -0x00, 0xb5, 0xfe, 0xf7, 0x87, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, -0xfe, 0xf7, 0x82, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, -0x7d, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x78, 0xff, -0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x73, 0xff, 0x08, 0xbc, -0x18, 0x47, 0x00, 0xb5, 0x8c, 0xb0, 0x08, 0xa9, 0xfe, 0xf7, 0x54, 0xff, -0x69, 0x46, 0x08, 0xa8, 0x03, 0xf0, 0xba, 0xfe, 0x02, 0x20, 0x08, 0xab, -0x58, 0x70, 0x69, 0x46, 0x08, 0xa8, 0xfe, 0xf7, 0x89, 0xfe, 0x01, 0x20, -0x0c, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x5a, 0xff, -0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, -0x38, 0x1c, 0xfe, 0xf7, 0x39, 0xff, 0xf9, 0x88, 0x10, 0x48, 0x01, 0x24, -0x00, 0x29, 0x0e, 0xd0, 0x04, 0x73, 0x44, 0x73, 0xb9, 0x68, 0x09, 0x0c, -0x41, 0x82, 0xb9, 0x68, 0xc0, 0x46, 0x81, 0x82, 0xf9, 0x68, 0x09, 0x0c, -0xc1, 0x82, 0xf9, 0x68, 0xc0, 0x46, 0x01, 0x83, 0x02, 0xe0, 0x00, 0x21, -0x01, 0x73, 0x41, 0x73, 0x06, 0x48, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, -0x00, 0x21, 0xfe, 0xf7, 0x5b, 0xfe, 0x20, 0x1c, -0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, -0xff, 0xff, 0x00, 0x00, 0x00, 0xb5, 0xfe, 0xf7, 0x27, 0xff, 0x08, 0xbc, -0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x22, 0xff, 0x08, 0xbc, 0x18, 0x47, -0x00, 0xb5, 0xfe, 0xf7, 0x1d, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, -0xfe, 0xf7, 0x18, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, -0x13, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, -0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, 0xf2, 0xfe, 0xf8, 0x88, 0x03, 0x24, -0xe4, 0x04, 0x04, 0x43, 0x03, 0x23, 0xdb, 0x04, 0x9c, 0x42, 0x02, 0xd3, -0x0f, 0x4b, 0x9c, 0x42, 0x06, 0xd9, 0x0f, 0x48, 0x01, 0xab, 0x58, 0x80, -0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x20, 0xfe, 0x01, 0x20, 0x80, 0x07, -0x20, 0x43, 0x00, 0x68, 0x00, 0x21, 0x00, 0xab, 0x59, 0x70, 0xfa, 0x88, -0xc0, 0x46, 0xda, 0x80, 0x02, 0x90, 0x03, 0x91, 0x68, 0x46, 0x04, 0x33, -0xfe, 0xf7, 0x10, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, +0xfe, 0xf7, 0xae, 0xfe, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, +0x4c, 0x2a, 0x00, 0x80, 0x00, 0xb5, 0xfe, 0xf7, 0x7d, 0xff, 0x08, 0xbc, +0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x78, 0xff, 0x08, 0xbc, 0x18, 0x47, +0x00, 0xb5, 0xfe, 0xf7, 0x73, 0xff, 0x08, 0xbc, +0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x6e, 0xff, 0x08, 0xbc, 0x18, 0x47, +0x00, 0xb5, 0xfe, 0xf7, 0x69, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, +0xfe, 0xf7, 0x64, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, +0x5f, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x5a, 0xff, +0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x55, 0xff, 0x08, 0xbc, +0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0x50, 0xff, 0x08, 0xbc, 0x18, 0x47, +0x00, 0xb5, 0xfe, 0xf7, 0x4b, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, +0xfe, 0xf7, 0x46, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x8c, 0xb0, +0x08, 0xa9, 0xfe, 0xf7, 0x27, 0xff, 0x69, 0x46, 0x08, 0xa8, 0x04, 0xf0, +0x75, 0xfa, 0x02, 0x20, 0x08, 0xab, 0x58, 0x70, 0x69, 0x46, 0x08, 0xa8, +0xfe, 0xf7, 0x5c, 0xfe, 0x01, 0x20, 0x0c, 0xb0, 0x08, 0xbc, 0x18, 0x47, +0x00, 0xb5, 0xfe, 0xf7, 0x2d, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, +0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, 0x0c, 0xff, +0xfa, 0x88, 0x12, 0x49, 0x01, 0x24, 0xc8, 0x1d, 0x89, 0x30, 0x00, 0x2a, +0x0f, 0xd0, 0x04, 0x70, 0x44, 0x70, 0xb8, 0x68, 0x00, 0x0c, 0x80, 0x31, +0xc8, 0x82, 0xb8, 0x68, 0xc0, 0x46, 0x08, 0x83, 0xf8, 0x68, 0x00, 0x0c, +0x48, 0x83, 0xf8, 0x68, 0xc0, 0x46, 0x88, 0x83, 0x02, 0xe0, 0x00, 0x21, +0x01, 0x70, 0x41, 0x70, 0x06, 0x48, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, +0x00, 0x21, 0xfe, 0xf7, 0x2b, 0xfe, 0x20, 0x1c, 0x04, 0xb0, 0x90, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, +0x00, 0xb5, 0xfe, 0xf7, 0xf7, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, +0xfe, 0xf7, 0xf2, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, +0xed, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0xe8, 0xfe, +0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfe, 0xf7, 0xe3, 0xfe, 0x08, 0xbc, +0x18, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, +0xfe, 0xf7, 0xc2, 0xfe, 0xf8, 0x88, 0x03, 0x24, 0xe4, 0x04, 0x04, 0x43, +0x03, 0x23, 0xdb, 0x04, 0x9c, 0x42, 0x02, 0xd3, 0x0f, 0x4b, 0x9c, 0x42, +0x06, 0xd9, 0x0f, 0x48, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, 0x00, 0x21, +0xfe, 0xf7, 0xf0, 0xfd, 0x01, 0x20, 0x80, 0x07, 0x20, 0x43, 0x00, 0x68, +0x00, 0x21, 0x00, 0xab, 0x59, 0x70, 0xfa, 0x88, 0xc0, 0x46, 0xda, 0x80, +0x02, 0x90, 0x03, 0x91, 0x68, 0x46, 0x04, 0x33, 0xfe, 0xf7, 0xe0, 0xfd, +0x01, 0x20, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xe0, 0x00, 0x18, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x84, 0xb0, +0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, 0x8f, 0xfe, 0xf8, 0x88, +0x03, 0x23, 0xdb, 0x04, 0x18, 0x43, 0x98, 0x42, 0x02, 0xd3, 0x0a, 0x4b, +0x98, 0x42, 0x08, 0xd9, 0x09, 0x48, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, +0x00, 0x21, 0xfe, 0xf7, 0xbf, 0xfd, 0x01, 0x20, 0x03, 0xe0, 0xb9, 0x68, +0xc0, 0x46, 0x01, 0x60, 0x00, 0x20, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe0, 0x00, 0x18, 0x00, 0xff, 0xff, 0x00, 0x00, -0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, -0xbf, 0xfe, 0xf8, 0x88, 0x03, 0x23, 0xdb, 0x04, 0x18, 0x43, 0x98, 0x42, -0x02, 0xd3, 0x0a, 0x4b, 0x98, 0x42, 0x08, 0xd9, 0x09, 0x48, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xef, 0xfd, 0x01, 0x20, -0x03, 0xe0, 0xb9, 0x68, 0xc0, 0x46, 0x01, 0x60, 0x00, 0x20, 0x04, 0xb0, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe0, 0x00, 0x18, 0x00, -0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x86, 0xb0, 0x07, 0x1c, 0x03, 0xf0, -0x5b, 0xfd, 0x38, 0x1c, 0x02, 0xa9, 0xfe, 0xf7, 0x97, 0xfe, 0x01, 0x27, -0x02, 0xab, 0x5f, 0x70, 0x00, 0x20, 0xd8, 0x80, 0x0a, 0x48, 0x01, 0x68, -0xc0, 0x46, 0x04, 0x91, 0x41, 0x68, 0xc0, 0x46, 0x05, 0x91, 0x81, 0x68, -0xc0, 0x46, 0x00, 0x91, 0x00, 0x69, 0xc0, 0x46, 0x01, 0x90, 0x69, 0x46, -0x02, 0xa8, 0xfe, 0xf7, 0xc1, 0xfd, 0x38, 0x1c, 0x06, 0xb0, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x18, 0x00, 0x80, 0x00, 0xb5, 0xc1, 0x68, -0x80, 0x68, 0xfe, 0xf7, 0x79, 0xfb, 0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, +0x80, 0xb5, 0x86, 0xb0, 0x07, 0x1c, 0x04, 0xf0, 0x33, 0xf9, 0x38, 0x1c, +0x02, 0xa9, 0xfe, 0xf7, 0x67, 0xfe, 0x01, 0x27, 0x02, 0xab, 0x5f, 0x70, +0x00, 0x20, 0xd8, 0x80, 0x0a, 0x48, 0x41, 0x68, 0xc0, 0x46, 0x04, 0x91, +0x81, 0x68, 0xc0, 0x46, 0x05, 0x91, 0xc1, 0x68, +0xc0, 0x46, 0x00, 0x91, 0x40, 0x69, 0xc0, 0x46, 0x01, 0x90, 0x69, 0x46, +0x02, 0xa8, 0xfe, 0xf7, 0x91, 0xfd, 0x38, 0x1c, 0x06, 0xb0, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x19, 0x00, 0x80, 0x00, 0xb5, 0xc1, 0x68, +0x80, 0x68, 0xfe, 0xf7, 0x49, 0xfb, 0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x04, 0x1c, 0x0f, 0x1c, -0x68, 0x46, 0x50, 0x21, 0xfe, 0xf7, 0x76, 0xfe, 0x01, 0xab, 0x5c, 0x80, -0x02, 0x97, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xa1, 0xfd, 0x04, 0xb0, +0x68, 0x46, 0x50, 0x21, 0xfe, 0xf7, 0x46, 0xfe, 0x01, 0xab, 0x5c, 0x80, +0x02, 0x97, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x71, 0xfd, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x84, 0xb0, 0x07, 0x1c, -0x68, 0x46, 0x51, 0x21, 0xfe, 0xf7, 0x64, 0xfe, 0x01, 0xab, 0x5f, 0x80, -0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x90, 0xfd, 0x04, 0xb0, 0x80, 0xbc, +0x68, 0x46, 0x51, 0x21, 0xfe, 0xf7, 0x34, 0xfe, 0x01, 0xab, 0x5f, 0x80, +0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x60, 0xfd, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x84, 0xb0, 0x00, 0x27, 0x12, 0x49, 0x09, 0x68, 0x12, 0x4a, 0x12, 0x6b, 0x10, 0x23, 0x1a, 0x40, 0x01, 0x24, 0x00, 0x2a, 0x00, 0xd0, 0x01, 0x27, 0x8a, 0x0c, 0x03, 0xd3, 0x3a, 0x04, 0x12, 0x0c, 0x02, 0x27, 0x17, 0x43, 0xc9, 0x0c, 0x03, 0xd3, 0x39, 0x04, 0x09, 0x0c, 0x04, 0x27, -0x0f, 0x43, 0x69, 0x46, 0xfe, 0xf7, 0x2c, 0xfe, 0x01, 0xab, 0x5f, 0x80, -0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x66, 0xfd, 0x20, 0x1c, 0x04, 0xb0, +0x0f, 0x43, 0x69, 0x46, 0xfe, 0xf7, 0xfc, 0xfd, 0x01, 0xab, 0x5f, 0x80, +0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x36, 0xfd, 0x20, 0x1c, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, -0xc0, 0x00, 0x18, 0x40, 0x00, 0xb5, 0x84, 0xb0, -0x69, 0x46, 0xfe, 0xf7, 0x17, 0xfe, 0x06, 0x48, 0xc0, 0x6d, 0x01, 0xab, -0x58, 0x80, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x4f, 0xfd, 0x01, 0x20, -0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x10, 0x2a, 0x00, 0x80, -0x00, 0xb5, 0xfe, 0xf7, 0x1d, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x70, 0x47, -0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, -0x80, 0xb5, 0x01, 0x20, 0x14, 0x4f, 0x71, 0x23, 0x5b, 0x01, 0xf9, 0x18, -0x48, 0x71, 0x13, 0x48, 0xfe, 0xf7, 0xd6, 0xfb, 0x01, 0x20, 0x40, 0x02, -0xa1, 0x21, 0x49, 0x03, 0x88, 0x60, 0x00, 0x20, 0xf9, 0x1d, 0xb9, 0x31, -0x08, 0x70, 0x0e, 0x4a, 0x01, 0x23, 0x1b, 0x04, 0x11, 0x68, 0x0b, 0x40, -0x15, 0x21, 0x00, 0x2b, 0x05, 0xd1, 0x13, 0x68, 0x1b, 0x0c, 0x08, 0xd1, -0x12, 0x68, 0x92, 0x0a, 0x05, 0xd3, 0x08, 0x4a, 0xc0, 0x46, 0xd1, 0x60, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, 0x4a, 0xc0, 0x46, 0x11, 0x64, -0xf8, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0xa9, 0x9d, 0x21, 0x40, -0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, +0xc0, 0x00, 0x18, 0x40, 0x00, 0xb5, 0x84, 0xb0, 0x69, 0x46, 0xfe, 0xf7, +0xe7, 0xfd, 0x06, 0x48, 0xc0, 0x6d, 0x01, 0xab, 0x58, 0x80, 0x68, 0x46, +0x00, 0x21, 0xfe, 0xf7, 0x1f, 0xfd, 0x01, 0x20, 0x04, 0xb0, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0xa4, 0x2a, 0x00, 0x80, 0x00, 0xb5, 0xfe, 0xf7, +0xed, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, -0x80, 0xb5, 0x85, 0xb0, 0x01, 0xa9, 0xfe, 0xf7, 0xbb, 0xfd, 0x00, 0x20, -0x01, 0xab, 0x58, 0x70, 0x10, 0x49, 0xc9, 0x68, 0x01, 0x27, 0x01, 0x29, -0x0a, 0xd1, 0x03, 0xf0, 0xb9, 0xfc, 0x03, 0x90, 0x04, 0x97, 0x03, 0x98, -0x00, 0x28, 0x06, 0xd0, 0x68, 0x46, 0x02, 0xf0, 0x15, 0xf8, 0x04, 0xe0, -0x03, 0x97, 0x04, 0x90, 0xf8, 0xe7, 0x00, 0x20, 0x00, 0x90, 0x02, 0xab, -0x00, 0x98, 0xc0, 0x46, 0x58, 0x80, 0x00, 0x21, 0x01, 0xa8, 0xfe, 0xf7, -0xdb, 0xfc, 0x38, 0x1c, 0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, -0x38, 0x1c, 0xfe, 0xf7, 0x8d, 0xfd, 0x00, 0x20, 0x00, 0xab, 0x58, 0x70, -0x01, 0x24, 0x20, 0x1c, 0x12, 0x49, 0xc9, 0x68, 0x01, 0x29, 0x00, 0xd0, -0x00, 0x20, 0x00, 0x06, 0x00, 0x0e, 0x13, 0xd0, 0xf8, 0x88, 0x0f, 0x4a, -0x90, 0x42, 0x02, 0xd0, 0x0e, 0x4b, 0x98, 0x42, 0x08, 0xd1, 0xb9, 0x68, -0x27, 0x1c, 0x90, 0x42, 0x00, 0xd0, 0x00, 0x27, 0x38, 0x06, 0x00, 0x0e, -0x03, 0xf0, 0xa0, 0xfc, 0x03, 0xf0, 0x76, 0xfc, 0x02, 0x90, 0x00, 0xe0, -0x02, 0x94, 0x68, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0xa7, 0xfc, 0x20, 0x1c, -0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0xed, 0xfe, 0x00, 0x00, 0xfe, 0xca, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, -0x00, 0x24, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xf0, 0x9b, 0xf8, 0x01, 0x34, -0xbc, 0x42, 0xfa, 0xd9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, -0x14, 0x1c, 0x0d, 0x1c, 0x06, 0x1c, 0x1f, 0x1c, 0x1b, 0x4b, 0x32, 0x04, -0x12, 0x0c, 0x3c, 0x21, 0x02, 0x20, 0xfe, 0xf7, 0x2a, 0xfb, 0x32, 0x0c, -0x17, 0x4b, 0x3e, 0x21, 0x02, 0x20, 0xfe, 0xf7, 0x24, 0xfb, 0x15, 0x4b, -0x2a, 0x04, 0x12, 0x0c, 0x40, 0x21, 0x02, 0x20, 0xfe, 0xf7, 0x1d, 0xfb, -0x2a, 0x0c, 0x11, 0x4b, 0x42, 0x21, 0x02, 0x20, 0xfe, 0xf7, 0x17, 0xfb, -0x0e, 0x4b, 0x22, 0x04, 0x12, 0x0c, 0x44, 0x21, 0x02, 0x20, 0xfe, 0xf7, -0x10, 0xfb, 0x22, 0x0c, 0x0a, 0x4b, 0x46, 0x21, 0x02, 0x20, 0xfe, 0xf7, -0x0a, 0xfb, 0x08, 0x4b, 0x3a, 0x04, 0x12, 0x0c, 0x48, 0x21, 0x02, 0x20, -0xfe, 0xf7, 0x03, 0xfb, 0x3a, 0x0c, 0x04, 0x4b, -0x4a, 0x21, 0x02, 0x20, 0xfe, 0xf7, 0xfd, 0xfa, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x7b, 0xb7, 0x21, 0x40, 0x88, 0xb5, 0x11, 0x27, -0x3f, 0x04, 0x38, 0x62, 0x79, 0x62, 0xba, 0x62, 0xfb, 0x62, 0x04, 0x20, -0xff, 0xf7, 0xaa, 0xff, 0x07, 0x48, 0x40, 0x6b, 0xc0, 0x46, 0x00, 0x90, -0x00, 0x98, 0x80, 0x07, 0x80, 0x0f, 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, -0x00, 0xe0, 0x00, 0x20, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x00, 0x00, 0x11, 0x40, 0xf0, 0xb5, 0x8a, 0xb0, 0x00, 0x24, 0x05, 0x94, -0x69, 0x49, 0xc9, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x68, 0x4a, 0x11, 0x68, -0x01, 0x22, 0x12, 0x04, 0x0a, 0x40, 0x17, 0x21, 0x66, 0x4e, 0x00, 0x2a, -0x06, 0xd1, 0x64, 0x4a, 0x13, 0x68, 0x1b, 0x0c, 0x04, 0xd1, 0x12, 0x68, -0x92, 0x0a, 0x01, 0xd3, 0xf1, 0x60, 0x02, 0xe0, 0x61, 0x4a, 0xc0, 0x46, -0x11, 0x64, 0x61, 0x49, 0x89, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x03, 0x29, -0x54, 0xd1, 0xe9, 0x21, 0x01, 0x91, 0x02, 0x99, 0xc0, 0x46, 0xb1, 0x60, -0x06, 0x94, 0x06, 0x99, 0x8a, 0x00, 0x5b, 0x49, 0x8a, 0x58, 0x00, 0x2a, -0x73, 0xd0, 0x80, 0x20, 0x02, 0x90, 0x06, 0x98, 0x81, 0x00, 0x57, 0x48, -0x41, 0x58, 0x02, 0x9a, 0x11, 0x43, 0x02, 0x91, 0x00, 0x24, 0x00, 0x27, -0x25, 0x02, 0x28, 0x1c, 0x38, 0x43, 0x09, 0x90, 0x09, 0x98, 0x00, 0x04, -0x51, 0x4b, 0x18, 0x43, 0x04, 0x90, 0x09, 0x98, 0xef, 0x23, 0xdb, 0x05, -0x18, 0x43, 0x03, 0x90, 0x06, 0x98, 0x80, 0x00, 0x4b, 0x49, 0x08, 0x58, -0x00, 0x04, 0x03, 0x99, 0x08, 0x43, 0x03, 0x90, 0x00, 0x2f, 0x02, 0xd1, -0x03, 0x98, 0xc0, 0x46, 0x70, 0x60, 0x01, 0x9b, 0x03, 0x9a, 0x02, 0x99, -0x04, 0x98, 0xff, 0xf7, 0x89, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x99, -0xc0, 0x46, 0xb1, 0x60, 0x03, 0x99, 0xc0, 0x46, 0x71, 0x60, 0x5c, 0xe0, -0x79, 0x1c, 0x0f, 0x04, 0x3f, 0x0c, 0x17, 0x2f, 0xd1, 0xdd, 0x61, 0x1c, -0x0c, 0x04, 0x24, 0x0c, 0x16, 0x2c, 0xca, 0xdd, 0x06, 0x99, 0x01, 0x31, -0x06, 0x91, 0x06, 0x99, 0x89, 0x00, 0x37, 0x4a, 0x51, 0x58, 0x00, 0x29, -0xb7, 0xd1, 0x48, 0xe0, 0xbf, 0x21, 0xc9, 0x43, 0x04, 0x91, 0xff, 0x21, -0x02, 0x91, 0x97, 0x21, 0x01, 0x91, 0x06, 0x94, 0x06, 0x99, 0x89, 0x00, -0x31, 0x4f, 0x79, 0x58, 0x00, 0x29, 0x1c, 0xd0, 0x09, 0x94, 0x08, 0x94, -0x06, 0x98, 0x80, 0x00, 0x38, 0x58, 0xc0, 0x46, 0x07, 0x90, 0x07, 0x98, -0x00, 0x04, 0x26, 0xe0, 0x05, 0x98, 0x15, 0x23, 0x1b, 0x06, 0x18, 0x43, -0x03, 0x90, 0x01, 0x9b, 0x03, 0x9a, 0x02, 0x99, 0x04, 0x98, 0xff, 0xf7, -0x49, 0xff, 0x00, 0x28, 0x23, 0xd1, 0x09, 0x99, 0x01, 0x31, 0x09, 0x91, -0x17, 0x29, 0x06, 0xd8, 0x00, 0xe0, 0x1c, 0xe0, 0x08, 0x98, 0x00, 0x02, -0x09, 0x99, 0x08, 0x43, 0x07, 0xe0, 0x08, 0x99, 0x01, 0x31, 0x08, 0x91, -0x17, 0x29, 0x0a, 0xd8, 0x09, 0x94, 0x08, 0x98, 0x00, 0x02, 0x07, 0x99, -0x09, 0x04, 0x08, 0x43, 0x15, 0x23, 0x1b, 0x06, 0x18, 0x43, 0x05, 0x90, -0xd6, 0xe7, 0x06, 0x99, 0x01, 0x31, 0x06, 0x91, 0x06, 0x99, 0x89, 0x00, -0x79, 0x58, 0x00, 0x29, 0xc4, 0xd1, 0x0c, 0x4a, 0x11, 0x68, 0x49, 0x0c, -0x05, 0xd2, 0x11, 0x68, 0x09, 0x0c, 0x06, 0xd1, 0x11, 0x68, 0x89, 0x0a, -0x03, 0xd3, 0x00, 0x99, 0xc0, 0x46, 0xf1, 0x60, 0x03, 0xe0, 0x00, 0x99, -0x06, 0x4a, 0xc0, 0x46, 0x11, 0x64, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x40, 0x01, 0x18, 0x40, -0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, -0x00, 0x00, 0x18, 0x40, 0x30, 0x6e, 0x21, 0x40, 0x43, 0xff, 0x00, 0x00, -0x0c, 0x6e, 0x21, 0x40, 0x80, 0xb5, 0x82, 0xb0, 0x00, 0x20, 0x01, 0x90, -0x1e, 0x48, 0xc1, 0x68, 0x01, 0x29, 0x1b, 0xd1, 0x40, 0x88, 0x00, 0x28, -0x18, 0xd1, 0x68, 0x46, 0x01, 0xf0, 0x6a, 0xfe, 0x00, 0x28, 0x13, 0xd1, -0xa8, 0x20, 0x01, 0xf0, 0xab, 0xfe, 0x18, 0x4f, 0x00, 0x28, 0x11, 0xd0, -0x04, 0x20, 0xff, 0xf7, 0x97, 0xfe, 0x78, 0x6b, 0xc0, 0x46, 0x01, 0x90, -0x01, 0x98, 0x80, 0x07, 0x80, 0x0f, 0x03, 0x28, 0x06, 0xd1, 0x00, 0x20, -0x01, 0xf0, 0x9a, 0xfe, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x8f, 0xfe, -0x00, 0x23, 0xdb, 0x43, 0x18, 0x1c, 0x19, 0x1c, 0x1a, 0x1c, 0xff, 0xf7, -0xc7, 0xfe, 0x00, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xdf, 0xfe, 0x00, 0x28, -0xe5, 0xd0, 0x38, 0x6a, 0x79, 0x6a, 0xba, 0x6a, 0xfb, 0x6a, 0xff, 0xf7, -0x7c, 0xfe, 0xde, 0xe7, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x00, 0x11, 0x40, -0xff, 0xb5, 0x85, 0xb0, 0x14, 0x1c, 0x1f, 0x1c, 0x00, 0x20, 0x01, 0x90, -0x01, 0x23, 0x5b, 0x04, 0x9f, 0x42, 0x01, 0xd9, 0x0f, 0x20, 0x82, 0xe0, -0x26, 0x1c, 0x43, 0x4d, 0xaf, 0x42, 0x00, 0xd2, 0x3d, 0x1c, 0x21, 0x0d, -0x09, 0x05, 0x41, 0x48, 0x41, 0x4b, 0x99, 0x42, 0x04, 0xd0, 0x80, 0x25, -0x06, 0x1c, 0x80, 0x2f, 0x00, 0xd8, 0x3d, 0x1c, 0x3e, 0x4a, 0x51, 0x69, -0xc0, 0x46, 0x03, 0x91, 0x92, 0x69, 0xc0, 0x46, 0x02, 0x92, 0xff, 0x23, -0x01, 0x33, 0x19, 0x43, 0x39, 0x4b, 0xc0, 0x46, 0x59, 0x61, 0xff, 0x23, -0x01, 0x33, 0x9a, 0x43, 0x36, 0x4b, 0xc0, 0x46, 0x9a, 0x61, 0x01, 0x22, -0x12, 0x05, 0xd1, 0x60, 0x33, 0x4a, 0x91, 0x69, 0x01, 0x22, 0x12, 0x05, -0x11, 0x61, 0x31, 0x4a, 0xff, 0x23, 0x01, 0x33, 0x91, 0x69, 0x19, 0x43, -0x91, 0x61, 0x01, 0x22, 0x12, 0x05, 0x11, 0x61, 0x85, 0x21, 0x89, 0x04, -0x04, 0x91, 0x00, 0x2f, 0x34, 0xd0, 0x28, 0x48, 0x86, 0x42, 0x04, 0xd1, -0x30, 0x1c, 0x21, 0x1c, 0x2a, 0x1c, 0x03, 0xf0, 0xd5, 0xfe, 0x2a, 0x1c, -0x04, 0x98, 0x02, 0x43, 0x00, 0x92, 0x01, 0x20, 0x06, 0x99, 0x05, 0x9a, -0x33, 0x1c, 0xfe, 0xf7, 0x5d, 0xf9, 0x22, 0x48, 0x22, 0x49, 0x4a, 0x68, -0x52, 0x0a, 0x09, 0xd3, 0xff, 0x21, 0x01, 0x31, 0x20, 0x4a, 0xc0, 0x46, -0x11, 0x60, 0x00, 0x28, 0x05, 0xd1, 0x11, 0x20, 0x01, 0x90, 0x13, 0xe0, -0x01, 0x38, 0xf0, 0xd1, 0xf9, 0xe7, 0x7f, 0x1b, 0x0e, 0xd0, 0x15, 0x48, -0x86, 0x42, 0x01, 0xd1, 0x64, 0x19, 0x00, 0xe0, 0x76, 0x19, 0x06, 0x99, -0x49, 0x19, 0x06, 0x91, 0x38, 0x1c, 0xaf, 0x42, 0x00, 0xd3, 0x28, 0x1c, -0x05, 0x1c, 0xca, 0xe7, 0x0f, 0x48, 0x41, 0x69, 0x03, 0x9b, 0x19, 0x43, -0x41, 0x61, 0x82, 0x69, 0x03, 0x9b, 0x9a, 0x43, 0x82, 0x61, 0x01, 0x22, -0x12, 0x05, 0xd1, 0x60, 0x81, 0x69, 0xc0, 0x46, 0x11, 0x61, 0x81, 0x69, -0x02, 0x9b, 0x19, 0x43, 0x81, 0x61, 0x11, 0x61, 0x01, 0x98, 0x09, 0xb0, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, -0x50, 0xab, 0x20, 0x40, 0x00, 0x00, 0x20, 0x40, 0xe8, 0x0d, 0x00, 0x80, +0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0xfe, 0xf7, +0xdb, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x85, 0xb0, +0x01, 0xa9, 0xfe, 0xf7, 0xbb, 0xfd, 0x00, 0x20, 0x01, 0xab, 0x58, 0x70, +0x10, 0x49, 0xc9, 0x68, 0x01, 0x27, 0x01, 0x29, 0x0a, 0xd1, 0x04, 0xf0, +0xc7, 0xf8, 0x03, 0x90, 0x04, 0x97, 0x03, 0x98, 0x00, 0x28, 0x06, 0xd0, +0x68, 0x46, 0x02, 0xf0, 0xe5, 0xfb, 0x04, 0xe0, 0x03, 0x97, 0x04, 0x90, +0xf8, 0xe7, 0x00, 0x20, 0x00, 0x90, 0x02, 0xab, 0x00, 0x98, 0xc0, 0x46, +0x58, 0x80, 0x00, 0x21, 0x01, 0xa8, 0xfe, 0xf7, 0xdb, 0xfc, 0x38, 0x1c, +0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, +0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfe, 0xf7, +0x8d, 0xfd, 0x00, 0x20, 0x00, 0xab, 0x58, 0x70, 0x01, 0x24, 0x20, 0x1c, +0x12, 0x49, 0xc9, 0x68, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x00, 0x06, +0x00, 0x0e, 0x13, 0xd0, 0xf8, 0x88, 0x0f, 0x4a, 0x90, 0x42, 0x02, 0xd0, +0x0e, 0x4b, 0x98, 0x42, 0x08, 0xd1, 0xb9, 0x68, 0x27, 0x1c, 0x90, 0x42, +0x00, 0xd0, 0x00, 0x27, 0x38, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0x88, 0xf8, +0x04, 0xf0, 0x84, 0xf8, 0x02, 0x90, 0x00, 0xe0, 0x02, 0x94, 0x68, 0x46, +0x00, 0x21, 0xfe, 0xf7, 0xa7, 0xfc, 0x20, 0x1c, 0x04, 0xb0, 0x90, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0xed, 0xfe, 0x00, 0x00, +0xfe, 0xca, 0x00, 0x00, 0xf1, 0xb5, 0xd6, 0xb0, +0x00, 0x20, 0x81, 0x00, 0x56, 0x9c, 0x0a, 0x19, 0x12, 0x6a, 0x6b, 0x46, +0x5a, 0x50, 0x01, 0x30, 0x10, 0x28, 0xf6, 0xdb, 0x10, 0x20, 0x82, 0x00, +0x11, 0x1c, 0x69, 0x44, 0x40, 0x39, 0x4b, 0x6b, 0x0f, 0x6a, 0x7b, 0x40, +0x8f, 0x68, 0x7b, 0x40, 0x09, 0x68, 0x59, 0x40, 0x4b, 0x00, 0xc9, 0x0f, +0x19, 0x43, 0x6b, 0x46, 0x99, 0x50, 0x01, 0x30, 0x50, 0x28, 0xec, 0xdb, +0x56, 0x98, 0x01, 0x68, 0xc0, 0x46, 0x55, 0x91, 0x42, 0x68, 0xc0, 0x46, +0x54, 0x92, 0x86, 0x68, 0xc0, 0x46, 0x53, 0x96, 0xc5, 0x68, 0xc0, 0x46, +0x52, 0x95, 0x04, 0x69, 0xc0, 0x46, 0x51, 0x94, 0x48, 0x01, 0xcb, 0x0e, +0x18, 0x43, 0x13, 0x1c, 0x33, 0x40, 0x07, 0x1c, 0x28, 0x1c, 0x90, 0x43, +0x18, 0x43, 0x38, 0x18, 0x00, 0x19, 0x00, 0x9b, 0xc0, 0x18, 0xcf, 0x4b, +0xc0, 0x18, 0x93, 0x07, 0x92, 0x08, 0x13, 0x43, 0x42, 0x01, 0x1f, 0x1c, +0xc3, 0x0e, 0x1a, 0x43, 0x0b, 0x1c, 0x3b, 0x40, 0x14, 0x1c, 0x32, 0x1c, +0x8a, 0x43, 0x1a, 0x43, 0xa2, 0x18, 0x52, 0x19, 0x01, 0x9b, 0xd2, 0x18, +0xc5, 0x4b, 0xd4, 0x18, 0x8a, 0x07, 0x89, 0x08, 0x11, 0x43, 0x62, 0x01, +0xe3, 0x0e, 0x1a, 0x43, 0x03, 0x1c, 0x0b, 0x40, 0x15, 0x1c, 0x3a, 0x1c, +0x82, 0x43, 0x1a, 0x43, 0xaa, 0x18, 0x92, 0x19, 0x02, 0x9b, 0xd2, 0x18, +0xbc, 0x4b, 0xd2, 0x18, 0x3b, 0x1c, 0x87, 0x07, 0x80, 0x08, 0x38, 0x43, +0x57, 0x01, 0xd5, 0x0e, 0x3d, 0x43, 0x27, 0x1c, 0x07, 0x40, 0x0e, 0x1c, +0xa6, 0x43, 0x37, 0x43, 0xed, 0x19, 0xeb, 0x18, 0x03, 0x9f, 0xdf, 0x19, +0xb3, 0x4b, 0xff, 0x18, 0xa3, 0x07, 0xa4, 0x08, 0x1c, 0x43, 0x7b, 0x01, +0xfd, 0x0e, 0x2b, 0x43, 0x15, 0x1c, 0x25, 0x40, 0x1e, 0x1c, 0x03, 0x1c, +0x93, 0x43, 0x2b, 0x43, 0xf3, 0x18, 0x59, 0x18, 0x04, 0x9b, 0xc9, 0x18, +0xaa, 0x4b, 0xc9, 0x18, 0x93, 0x07, 0x92, 0x08, 0x1a, 0x43, 0x4b, 0x01, +0xcd, 0x0e, 0x1d, 0x43, 0x3e, 0x1c, 0x16, 0x40, 0x23, 0x1c, 0xbb, 0x43, +0x33, 0x43, 0xeb, 0x18, 0x18, 0x18, 0x05, 0x9b, 0xc0, 0x18, 0xa2, 0x4b, +0xc0, 0x18, 0xbb, 0x07, 0xbf, 0x08, 0x1f, 0x43, 0x43, 0x01, 0xc5, 0x0e, +0x2b, 0x43, 0x0d, 0x1c, 0x3d, 0x40, 0x1e, 0x1c, 0x13, 0x1c, 0x8b, 0x43, +0x2b, 0x43, 0xf3, 0x18, 0x1b, 0x19, 0x06, 0x9c, 0x1c, 0x19, 0x99, 0x4b, +0xe4, 0x18, 0x8b, 0x07, 0x89, 0x08, 0x19, 0x43, 0x63, 0x01, 0xe5, 0x0e, +0x1d, 0x43, 0x03, 0x1c, 0x0b, 0x40, 0x3e, 0x1c, 0x86, 0x43, 0x33, 0x43, +0xeb, 0x18, 0x9a, 0x18, 0x07, 0x9b, 0xd2, 0x18, 0x90, 0x4b, 0xd2, 0x18, +0x3b, 0x1c, 0x87, 0x07, 0x80, 0x08, 0x38, 0x43, 0x57, 0x01, 0xd5, 0x0e, +0x2f, 0x43, 0x25, 0x1c, 0x05, 0x40, 0x3e, 0x1c, 0x0f, 0x1c, 0xa7, 0x43, +0x2f, 0x43, 0xf5, 0x19, 0xeb, 0x18, 0x08, 0x9f, 0xdf, 0x19, 0x87, 0x4b, +0xff, 0x18, 0xa3, 0x07, 0xa4, 0x08, 0x1c, 0x43, 0x7b, 0x01, 0xfd, 0x0e, +0x1d, 0x43, 0x16, 0x1c, 0x26, 0x40, 0x03, 0x1c, 0x93, 0x43, 0x33, 0x43, +0xeb, 0x18, 0x59, 0x18, 0x09, 0x9b, 0xc9, 0x18, 0x7e, 0x4b, 0xc9, 0x18, +0x93, 0x07, 0x92, 0x08, 0x1a, 0x43, 0x4b, 0x01, 0xcd, 0x0e, 0x1d, 0x43, +0x3b, 0x1c, 0x13, 0x40, 0x26, 0x1c, 0xbe, 0x43, 0x33, 0x43, 0xeb, 0x18, +0x18, 0x18, 0x0a, 0x9b, 0xc0, 0x18, 0x76, 0x4b, 0xc0, 0x18, 0x23, 0x1c, +0xbc, 0x07, 0xbf, 0x08, 0x27, 0x43, 0x44, 0x01, 0xc5, 0x0e, 0x2c, 0x43, +0x0d, 0x1c, 0x3d, 0x40, 0x26, 0x1c, 0x14, 0x1c, 0x8c, 0x43, 0x2c, 0x43, +0x35, 0x19, 0xeb, 0x18, 0x0b, 0x9c, 0x1c, 0x19, +0x6c, 0x4b, 0xe4, 0x18, 0x8b, 0x07, 0x89, 0x08, 0x19, 0x43, 0x63, 0x01, +0xe5, 0x0e, 0x1d, 0x43, 0x03, 0x1c, 0x0b, 0x40, 0x3e, 0x1c, 0x86, 0x43, +0x33, 0x43, 0xeb, 0x18, 0x9a, 0x18, 0x0c, 0x9b, 0xd2, 0x18, 0x64, 0x4b, +0xd2, 0x18, 0x3b, 0x1c, 0x87, 0x07, 0x80, 0x08, 0x38, 0x43, 0x57, 0x01, +0xd5, 0x0e, 0x3d, 0x43, 0x27, 0x1c, 0x07, 0x40, 0x0e, 0x1c, 0xa6, 0x43, +0x37, 0x43, 0xed, 0x19, 0xeb, 0x18, 0x0d, 0x9f, 0xdf, 0x19, 0x5b, 0x4b, +0xff, 0x18, 0xa3, 0x07, 0xa4, 0x08, 0x1c, 0x43, 0x7b, 0x01, 0xfd, 0x0e, +0x1d, 0x43, 0x13, 0x1c, 0x23, 0x40, 0x06, 0x1c, 0x96, 0x43, 0x33, 0x43, +0xeb, 0x18, 0x59, 0x18, 0x0e, 0x9b, 0xc9, 0x18, 0x52, 0x4b, 0xc9, 0x18, +0x93, 0x07, 0x92, 0x08, 0x1a, 0x43, 0x4b, 0x01, 0xcd, 0x0e, 0x2b, 0x43, +0x3d, 0x1c, 0x15, 0x40, 0x1e, 0x1c, 0x23, 0x1c, 0xbb, 0x43, 0x2b, 0x43, +0xf3, 0x18, 0x18, 0x18, 0x0f, 0x9b, 0xc0, 0x18, 0x49, 0x4b, 0xc0, 0x18, +0x23, 0x1c, 0xbc, 0x07, 0xbf, 0x08, 0x27, 0x43, 0x10, 0x24, 0x50, 0x94, +0x44, 0x01, 0xc5, 0x0e, 0x25, 0x43, 0x0e, 0x1c, 0x3e, 0x40, 0x14, 0x1c, +0x8c, 0x43, 0x34, 0x43, 0x2c, 0x19, 0xe3, 0x18, 0x50, 0x9c, 0xa5, 0x00, +0x6c, 0x46, 0x64, 0x59, 0x1c, 0x19, 0x3e, 0x4b, 0xe4, 0x18, 0x13, 0x1c, +0x3a, 0x1c, 0x8f, 0x07, 0x89, 0x08, 0x0f, 0x43, 0x01, 0x1c, 0x20, 0x1c, +0x50, 0x9c, 0x01, 0x34, 0x50, 0x94, 0x14, 0x2c, 0xe2, 0xdb, 0x14, 0x24, +0x45, 0x01, 0xc6, 0x0e, 0x2e, 0x43, 0x0d, 0x1c, 0x7d, 0x40, 0x55, 0x40, +0x75, 0x19, 0xeb, 0x18, 0xa5, 0x00, 0x6e, 0x46, 0x75, 0x59, 0x5d, 0x19, +0x31, 0x4b, 0xed, 0x18, 0x13, 0x1c, 0x3a, 0x1c, 0x8f, 0x07, 0x89, 0x08, +0x0f, 0x43, 0x01, 0x1c, 0x28, 0x1c, 0x01, 0x34, 0x28, 0x2c, 0xe7, 0xdb, +0x28, 0x24, 0x50, 0x94, 0x44, 0x01, 0xc5, 0x0e, 0x25, 0x43, 0x3c, 0x1c, +0x14, 0x43, 0x0c, 0x40, 0x3e, 0x1c, 0x16, 0x40, 0x34, 0x43, 0x2c, 0x19, +0xe3, 0x18, 0x50, 0x9c, 0xa5, 0x00, 0x6c, 0x46, 0x64, 0x59, 0x1c, 0x19, +0x23, 0x4b, 0xe4, 0x18, 0x13, 0x1c, 0x3a, 0x1c, 0x8f, 0x07, 0x89, 0x08, +0x0f, 0x43, 0x01, 0x1c, 0x20, 0x1c, 0x50, 0x9c, 0x01, 0x34, 0x50, 0x94, +0x3c, 0x2c, 0xe1, 0xdb, 0x3c, 0x24, 0x45, 0x01, 0xc6, 0x0e, 0x2e, 0x43, +0x0d, 0x1c, 0x7d, 0x40, 0x55, 0x40, 0x75, 0x19, 0xeb, 0x18, 0xa6, 0x00, +0x6d, 0x46, 0xad, 0x59, 0x5d, 0x19, 0x17, 0x4b, 0xed, 0x18, 0x13, 0x1c, +0x3a, 0x1c, 0x8f, 0x07, 0x89, 0x08, 0x0f, 0x43, 0x01, 0x1c, 0x28, 0x1c, +0x01, 0x34, 0x50, 0x2c, 0xe7, 0xdb, 0x55, 0x9c, 0x20, 0x18, 0x56, 0x9c, +0xc0, 0x46, 0x20, 0x60, 0x54, 0x98, 0x40, 0x18, 0x56, 0x9c, 0xc0, 0x46, +0x60, 0x60, 0x53, 0x9e, 0xf0, 0x19, 0x56, 0x9c, 0xc0, 0x46, 0xa0, 0x60, +0x52, 0x9d, 0xa8, 0x18, 0x56, 0x9c, 0xc0, 0x46, 0xe0, 0x60, 0x51, 0x9c, +0xe0, 0x18, 0x56, 0x9c, 0xc0, 0x46, 0x20, 0x61, 0x57, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x99, 0x79, 0x82, 0x5a, 0xa1, 0xeb, 0xd9, 0x6e, +0xdc, 0xbc, 0x1b, 0x8f, 0xd6, 0xc1, 0x62, 0xca, 0x88, 0xb4, 0x8a, 0x08, +0x89, 0x07, 0x00, 0xd0, 0x01, 0x32, 0x00, 0x21, 0x00, 0x2a, 0x1e, 0xdd, +0x07, 0x78, 0x00, 0xab, 0x1f, 0x70, 0x47, 0x78, 0xc0, 0x46, 0x5f, 0x70, +0x87, 0x78, 0xc0, 0x46, 0x9f, 0x70, 0xc7, 0x78, 0xc0, 0x46, 0xdf, 0x70, +0xdb, 0x78, 0xc0, 0x46, 0x03, 0x70, 0x00, 0xab, 0x9b, 0x78, 0xc0, 0x46, +0x43, 0x70, 0x00, 0xab, 0x5b, 0x78, 0xc0, 0x46, +0x83, 0x70, 0x00, 0xab, 0x1b, 0x78, 0xc0, 0x46, 0xc3, 0x70, 0x04, 0x30, +0x01, 0x31, 0x91, 0x42, 0xe0, 0xdb, 0x88, 0xbc, 0x70, 0x47, 0x00, 0x21, +0xc1, 0x61, 0x09, 0x4a, 0xc0, 0x46, 0x02, 0x60, 0x08, 0x4a, 0xc0, 0x46, +0x42, 0x60, 0x08, 0x4a, 0xc0, 0x46, 0x82, 0x60, 0x07, 0x4a, 0xc0, 0x46, +0xc2, 0x60, 0x07, 0x4a, 0xc0, 0x46, 0x02, 0x61, 0x41, 0x61, 0x81, 0x61, +0x70, 0x47, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, +0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0xf0, 0xe1, 0xd2, 0xc3, +0xf0, 0xb5, 0x14, 0x1c, 0x0d, 0x1c, 0x07, 0x1c, 0xe1, 0x00, 0x78, 0x69, +0x41, 0x18, 0x81, 0x42, 0x02, 0xd2, 0xb8, 0x69, 0x01, 0x30, 0xb8, 0x61, +0x79, 0x61, 0x61, 0x0f, 0xb8, 0x69, 0x40, 0x18, 0xb8, 0x61, 0x40, 0x2c, +0x14, 0xdb, 0xfe, 0x1d, 0x19, 0x36, 0x00, 0x20, 0x29, 0x78, 0x3a, 0x18, +0x20, 0x32, 0x11, 0x70, 0x01, 0x35, 0x01, 0x30, 0x40, 0x28, 0xf7, 0xd3, +0x40, 0x21, 0x30, 0x1c, 0xff, 0xf7, 0x96, 0xff, 0x38, 0x1c, 0xff, 0xf7, +0xaf, 0xfd, 0x40, 0x3c, 0x40, 0x2c, 0xec, 0xda, 0x00, 0x20, 0x00, 0x2c, +0x07, 0xd9, 0x29, 0x78, 0x3a, 0x18, 0x20, 0x32, 0x11, 0x70, 0x01, 0x35, +0x01, 0x30, 0xa0, 0x42, 0xf7, 0xd3, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0xf8, 0xb5, 0x07, 0x1c, 0xd3, 0x00, 0x78, 0x69, 0xc6, 0x18, 0x86, 0x42, +0x02, 0xd2, 0xb8, 0x69, 0x01, 0x30, 0xb8, 0x61, 0x7e, 0x61, 0x53, 0x0f, +0xb8, 0x69, 0xc0, 0x18, 0xb8, 0x61, 0x00, 0x90, 0x00, 0x20, 0x00, 0x2a, +0x07, 0xdd, 0x0b, 0x78, 0x3c, 0x18, 0x20, 0x34, 0x23, 0x70, 0x01, 0x31, +0x01, 0x30, 0x90, 0x42, 0xf7, 0xdb, 0x80, 0x20, 0xd1, 0x19, 0x20, 0x31, +0x08, 0x70, 0x54, 0x1c, 0xfd, 0x1d, 0x19, 0x35, 0x38, 0x2c, 0x1c, 0xdd, +0x38, 0x19, 0x20, 0x30, 0x00, 0x21, 0x40, 0x22, 0x12, 0x1b, 0x00, 0x2a, +0x05, 0xdd, 0x00, 0x23, 0x03, 0x70, 0x01, 0x30, 0x01, 0x31, 0x8a, 0x42, +0xfa, 0xdc, 0x28, 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0x4d, 0xff, 0x38, 0x1c, +0xff, 0xf7, 0x66, 0xfd, 0x28, 0x1c, 0x00, 0x21, 0x00, 0x23, 0x03, 0x70, +0x01, 0x30, 0x01, 0x31, 0x38, 0x29, 0xfa, 0xdb, 0x0c, 0xe0, 0x38, 0x19, +0x20, 0x30, 0x00, 0x21, 0x38, 0x22, 0x12, 0x1b, 0x00, 0x2a, 0x05, 0xdd, +0x00, 0x23, 0x03, 0x70, 0x01, 0x30, 0x01, 0x31, 0x8a, 0x42, 0xfa, 0xdc, +0x28, 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0x30, 0xff, 0x00, 0x98, 0xc0, 0x46, +0xb8, 0x65, 0xfe, 0x65, 0x38, 0x1c, 0xff, 0xf7, 0x45, 0xfd, 0x01, 0x20, +0xf8, 0x61, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x0c, 0x1c, +0x05, 0x1c, 0x17, 0x1c, 0x38, 0x1c, 0x00, 0x2f, 0x04, 0xda, 0x40, 0x42, +0x80, 0x06, 0x80, 0x0e, 0x40, 0x42, 0x01, 0xe0, 0x80, 0x06, 0x80, 0x0e, +0x00, 0x28, 0x07, 0xd1, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 0x1c, 0xff, 0xf7, +0x57, 0xff, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0x00, 0x2f, +0x00, 0xda, 0x3f, 0x30, 0x80, 0x11, 0x00, 0x28, 0x07, 0xdd, 0x86, 0x01, +0x28, 0x1c, 0x21, 0x1c, 0x32, 0x1c, 0xff, 0xf7, 0x47, 0xff, 0xa4, 0x19, +0xbf, 0x1b, 0x00, 0x2f, 0xeb, 0xd0, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 0x1c, +0xff, 0xf7, 0x74, 0xff, 0xe5, 0xe7, 0x98, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, +0x30, 0x20, 0x00, 0xab, 0x18, 0x70, 0xf8, 0x69, 0x00, 0x28, 0x04, 0xd1, +0x69, 0x46, 0x00, 0x22, 0x38, 0x1c, 0xff, 0xf7, 0x65, 0xff, 0x14, 0x21, +0x38, 0x1c, 0xff, 0xf7, 0xe3, 0xfe, 0x00, 0x20, +0x81, 0x00, 0x79, 0x58, 0x02, 0xc4, 0x01, 0x30, 0x05, 0x28, 0xf9, 0xdb, +0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x98, 0xb0, 0x07, 0x1c, +0x78, 0x68, 0x40, 0x28, 0x10, 0xd9, 0x68, 0x46, 0xff, 0xf7, 0xf9, 0xfe, +0x68, 0x46, 0x06, 0xcf, 0x08, 0x3f, 0xff, 0xf7, 0xa7, 0xff, 0xf8, 0x1d, +0xc5, 0x30, 0x69, 0x46, 0x04, 0x1c, 0xff, 0xf7, 0xd0, 0xff, 0x14, 0x20, +0x78, 0x60, 0x3c, 0x60, 0x00, 0x20, 0x00, 0x24, 0x39, 0x18, 0xca, 0x1d, +0x39, 0x32, 0x14, 0x72, 0x80, 0x31, 0x4c, 0x72, 0x7b, 0x68, 0x83, 0x42, +0x06, 0xd9, 0x3b, 0x68, 0x5d, 0x1c, 0x3d, 0x60, 0x1b, 0x78, 0xc0, 0x46, +0x13, 0x72, 0x4b, 0x72, 0x15, 0x7a, 0x36, 0x23, 0x6b, 0x40, 0x13, 0x72, +0x4a, 0x7a, 0x5c, 0x23, 0x5a, 0x40, 0x4a, 0x72, 0x01, 0x30, 0x40, 0x28, +0xe4, 0xd3, 0x18, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, +0xe0, 0xb0, 0x14, 0x1c, 0x0f, 0x1c, 0x00, 0x25, 0xae, 0x00, 0x01, 0x20, +0xf1, 0x1d, 0x1d, 0x31, 0x02, 0xf0, 0x10, 0xfe, 0x01, 0x04, 0x00, 0x91, +0x01, 0x20, 0xf1, 0x1d, 0x1b, 0x31, 0x02, 0xf0, 0x09, 0xfe, 0x00, 0x99, +0x08, 0x43, 0x19, 0xa9, 0x71, 0x18, 0x88, 0x60, 0x01, 0x35, 0x10, 0x2d, +0xea, 0xd3, 0x1b, 0xa8, 0x19, 0x90, 0x40, 0x20, 0x1a, 0x90, 0x19, 0xa8, +0xff, 0xf7, 0xa7, 0xff, 0x01, 0xa8, 0xff, 0xf7, 0xa6, 0xfe, 0x40, 0x22, +0x01, 0xa8, 0x2b, 0xa9, 0xff, 0xf7, 0x54, 0xff, 0x00, 0x2f, 0x0b, 0xd0, +0x40, 0x2f, 0x01, 0xd9, 0x40, 0x25, 0x00, 0xe0, 0x3d, 0x1c, 0x60, 0x99, +0x01, 0xa8, 0x2a, 0x1c, 0xff, 0xf7, 0x48, 0xff, 0x7f, 0x1b, 0xf3, 0xd1, +0x51, 0xa8, 0x01, 0xa9, 0x07, 0x1c, 0xff, 0xf7, 0x70, 0xff, 0x01, 0xa8, +0xff, 0xf7, 0x8b, 0xfe, 0x40, 0x22, 0x01, 0xa8, 0x3b, 0xa9, 0x01, 0x31, +0xff, 0xf7, 0x38, 0xff, 0x14, 0x22, 0x01, 0xa8, 0x39, 0x1c, 0xff, 0xf7, +0x33, 0xff, 0x56, 0xa8, 0x01, 0xa9, 0xff, 0xf7, 0x5e, 0xff, 0x00, 0x20, +0x82, 0x00, 0x19, 0xa9, 0x51, 0x18, 0xc0, 0x31, 0x49, 0x6b, 0x02, 0xc4, +0x01, 0x30, 0x05, 0x28, 0xf6, 0xd3, 0x63, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x00, 0x24, 0x00, 0x2f, +0x04, 0xd3, 0x04, 0xf0, 0x15, 0xf9, 0x01, 0x34, 0xbc, 0x42, 0xfa, 0xd9, +0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x14, 0x1c, 0x0d, 0x1c, +0x06, 0x1c, 0x1f, 0x1c, 0x1b, 0x4b, 0x32, 0x04, 0x12, 0x0c, 0x3c, 0x21, +0x02, 0x20, 0xfd, 0xf7, 0x8a, 0xff, 0x32, 0x0c, 0x17, 0x4b, 0x3e, 0x21, +0x02, 0x20, 0xfd, 0xf7, 0x84, 0xff, 0x15, 0x4b, 0x2a, 0x04, 0x12, 0x0c, +0x40, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x7d, 0xff, 0x2a, 0x0c, 0x11, 0x4b, +0x42, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x77, 0xff, 0x0e, 0x4b, 0x22, 0x04, +0x12, 0x0c, 0x44, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x70, 0xff, 0x22, 0x0c, +0x0a, 0x4b, 0x46, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x6a, 0xff, 0x08, 0x4b, +0x3a, 0x04, 0x12, 0x0c, 0x48, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x63, 0xff, +0x3a, 0x0c, 0x04, 0x4b, 0x4a, 0x21, 0x02, 0x20, 0xfd, 0xf7, 0x5d, 0xff, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xd9, 0xbf, 0x21, 0x40, +0x88, 0xb5, 0x11, 0x27, 0x3f, 0x04, 0x38, 0x62, 0x79, 0x62, 0xba, 0x62, +0xfb, 0x62, 0x04, 0x20, 0xff, 0xf7, 0xaa, 0xff, 0x07, 0x48, 0x40, 0x6b, +0xc0, 0x46, 0x00, 0x90, 0x00, 0x98, 0x80, 0x07, 0x80, 0x0f, 0x03, 0x28, +0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, +0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x11, 0x40, +0xf0, 0xb5, 0x8a, 0xb0, 0x00, 0x24, 0x05, 0x94, 0x69, 0x49, 0xc9, 0x68, +0xc0, 0x46, 0x00, 0x91, 0x68, 0x4a, 0x11, 0x68, 0x01, 0x22, 0x12, 0x04, +0x0a, 0x40, 0x17, 0x21, 0x66, 0x4e, 0x00, 0x2a, 0x06, 0xd1, 0x64, 0x4a, +0x13, 0x68, 0x1b, 0x0c, 0x04, 0xd1, 0x12, 0x68, 0x92, 0x0a, 0x01, 0xd3, +0xf1, 0x60, 0x02, 0xe0, 0x61, 0x4a, 0xc0, 0x46, 0x11, 0x64, 0x61, 0x49, +0x89, 0x68, 0x09, 0x04, 0x09, 0x0c, 0x03, 0x29, 0x54, 0xd1, 0xe9, 0x21, +0x01, 0x91, 0x02, 0x99, 0xc0, 0x46, 0xb1, 0x60, 0x06, 0x94, 0x06, 0x99, +0x8a, 0x00, 0x5b, 0x49, 0x8a, 0x58, 0x00, 0x2a, 0x73, 0xd0, 0x80, 0x20, +0x02, 0x90, 0x06, 0x98, 0x81, 0x00, 0x57, 0x48, 0x41, 0x58, 0x02, 0x9a, +0x11, 0x43, 0x02, 0x91, 0x00, 0x24, 0x00, 0x27, 0x25, 0x02, 0x28, 0x1c, +0x38, 0x43, 0x09, 0x90, 0x09, 0x98, 0x00, 0x04, 0x51, 0x4b, 0x18, 0x43, +0x04, 0x90, 0x09, 0x98, 0xef, 0x23, 0xdb, 0x05, 0x18, 0x43, 0x03, 0x90, +0x06, 0x98, 0x80, 0x00, 0x4b, 0x49, 0x08, 0x58, 0x00, 0x04, 0x03, 0x99, +0x08, 0x43, 0x03, 0x90, 0x00, 0x2f, 0x02, 0xd1, 0x03, 0x98, 0xc0, 0x46, +0x70, 0x60, 0x01, 0x9b, 0x03, 0x9a, 0x02, 0x99, 0x04, 0x98, 0xff, 0xf7, +0x89, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x99, 0xc0, 0x46, 0xb1, 0x60, +0x03, 0x99, 0xc0, 0x46, 0x71, 0x60, 0x5c, 0xe0, 0x79, 0x1c, 0x0f, 0x04, +0x3f, 0x0c, 0x17, 0x2f, 0xd1, 0xdd, 0x61, 0x1c, 0x0c, 0x04, 0x24, 0x0c, +0x16, 0x2c, 0xca, 0xdd, 0x06, 0x99, 0x01, 0x31, 0x06, 0x91, 0x06, 0x99, +0x89, 0x00, 0x37, 0x4a, 0x51, 0x58, 0x00, 0x29, 0xb7, 0xd1, 0x48, 0xe0, +0xbf, 0x21, 0xc9, 0x43, 0x04, 0x91, 0xff, 0x21, 0x02, 0x91, 0x97, 0x21, +0x01, 0x91, 0x06, 0x94, 0x06, 0x99, 0x89, 0x00, 0x31, 0x4f, 0x79, 0x58, +0x00, 0x29, 0x1c, 0xd0, 0x09, 0x94, 0x08, 0x94, 0x06, 0x98, 0x80, 0x00, +0x38, 0x58, 0xc0, 0x46, 0x07, 0x90, 0x07, 0x98, 0x00, 0x04, 0x26, 0xe0, +0x05, 0x98, 0x15, 0x23, 0x1b, 0x06, 0x18, 0x43, 0x03, 0x90, 0x01, 0x9b, +0x03, 0x9a, 0x02, 0x99, 0x04, 0x98, 0xff, 0xf7, 0x49, 0xff, 0x00, 0x28, +0x23, 0xd1, 0x09, 0x99, 0x01, 0x31, 0x09, 0x91, 0x17, 0x29, 0x06, 0xd8, +0x00, 0xe0, 0x1c, 0xe0, 0x08, 0x98, 0x00, 0x02, 0x09, 0x99, 0x08, 0x43, +0x07, 0xe0, 0x08, 0x99, 0x01, 0x31, 0x08, 0x91, 0x17, 0x29, 0x0a, 0xd8, +0x09, 0x94, 0x08, 0x98, 0x00, 0x02, 0x07, 0x99, 0x09, 0x04, 0x08, 0x43, +0x15, 0x23, 0x1b, 0x06, 0x18, 0x43, 0x05, 0x90, 0xd6, 0xe7, 0x06, 0x99, +0x01, 0x31, 0x06, 0x91, 0x06, 0x99, 0x89, 0x00, 0x79, 0x58, 0x00, 0x29, +0xc4, 0xd1, 0x0c, 0x4a, 0x11, 0x68, 0x49, 0x0c, 0x05, 0xd2, 0x11, 0x68, +0x09, 0x0c, 0x06, 0xd1, 0x11, 0x68, 0x89, 0x0a, 0x03, 0xd3, 0x00, 0x99, +0xc0, 0x46, 0xf1, 0x60, 0x03, 0xe0, 0x00, 0x99, 0x06, 0x4a, 0xc0, 0x46, +0x11, 0x64, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x40, 0x01, 0x18, 0x40, 0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x18, 0x40, 0x30, 0x6e, 0x21, 0x40, +0x43, 0xff, 0x00, 0x00, 0x0c, 0x6e, 0x21, 0x40, 0x80, 0xb5, 0x82, 0xb0, +0x00, 0x20, 0x01, 0x90, 0x1e, 0x48, 0xc1, 0x68, 0x01, 0x29, 0x1b, 0xd1, +0x40, 0x88, 0x00, 0x28, 0x18, 0xd1, 0x68, 0x46, 0x01, 0xf0, 0x9a, 0xfe, +0x00, 0x28, 0x13, 0xd1, 0xa8, 0x20, 0x01, 0xf0, +0xdb, 0xfe, 0x18, 0x4f, 0x00, 0x28, 0x11, 0xd0, 0x04, 0x20, 0xff, 0xf7, +0x97, 0xfe, 0x78, 0x6b, 0xc0, 0x46, 0x01, 0x90, 0x01, 0x98, 0x80, 0x07, +0x80, 0x0f, 0x03, 0x28, 0x06, 0xd1, 0x00, 0x20, 0x01, 0xf0, 0xca, 0xfe, +0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x23, 0x00, 0x22, +0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x8f, 0xfe, 0x00, 0x23, 0xdb, 0x43, +0x18, 0x1c, 0x19, 0x1c, 0x1a, 0x1c, 0xff, 0xf7, 0xc7, 0xfe, 0x00, 0x28, +0x03, 0xd1, 0xff, 0xf7, 0xdf, 0xfe, 0x00, 0x28, 0xe5, 0xd0, 0x38, 0x6a, +0x79, 0x6a, 0xba, 0x6a, 0xfb, 0x6a, 0xff, 0xf7, 0x7c, 0xfe, 0xde, 0xe7, +0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x11, 0x40, 0xff, 0xb5, 0x85, 0xb0, +0x14, 0x1c, 0x1f, 0x1c, 0x00, 0x20, 0x01, 0x90, 0x01, 0x23, 0x5b, 0x04, +0x9f, 0x42, 0x01, 0xd9, 0x0f, 0x20, 0x82, 0xe0, 0x26, 0x1c, 0x43, 0x4d, +0xaf, 0x42, 0x00, 0xd2, 0x3d, 0x1c, 0x21, 0x0d, 0x09, 0x05, 0x41, 0x48, +0x41, 0x4b, 0x99, 0x42, 0x04, 0xd0, 0x80, 0x25, 0x06, 0x1c, 0x80, 0x2f, +0x00, 0xd8, 0x3d, 0x1c, 0x3e, 0x4a, 0x51, 0x69, 0xc0, 0x46, 0x03, 0x91, +0x92, 0x69, 0xc0, 0x46, 0x02, 0x92, 0xff, 0x23, 0x01, 0x33, 0x19, 0x43, +0x39, 0x4b, 0xc0, 0x46, 0x59, 0x61, 0xff, 0x23, 0x01, 0x33, 0x9a, 0x43, +0x36, 0x4b, 0xc0, 0x46, 0x9a, 0x61, 0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, +0x33, 0x4a, 0x91, 0x69, 0x01, 0x22, 0x12, 0x05, 0x11, 0x61, 0x31, 0x4a, +0xff, 0x23, 0x01, 0x33, 0x91, 0x69, 0x19, 0x43, 0x91, 0x61, 0x01, 0x22, +0x12, 0x05, 0x11, 0x61, 0x85, 0x21, 0x89, 0x04, 0x04, 0x91, 0x00, 0x2f, +0x34, 0xd0, 0x28, 0x48, 0x86, 0x42, 0x04, 0xd1, 0x30, 0x1c, 0x21, 0x1c, +0x2a, 0x1c, 0x03, 0xf0, 0x4f, 0xff, 0x2a, 0x1c, 0x04, 0x98, 0x02, 0x43, +0x00, 0x92, 0x01, 0x20, 0x06, 0x99, 0x05, 0x9a, 0x33, 0x1c, 0xfd, 0xf7, +0xbd, 0xfd, 0x22, 0x48, 0x22, 0x49, 0x4a, 0x68, 0x52, 0x0a, 0x09, 0xd3, +0xff, 0x21, 0x01, 0x31, 0x20, 0x4a, 0xc0, 0x46, 0x11, 0x60, 0x00, 0x28, +0x05, 0xd1, 0x11, 0x20, 0x01, 0x90, 0x13, 0xe0, 0x01, 0x38, 0xf0, 0xd1, +0xf9, 0xe7, 0x7f, 0x1b, 0x0e, 0xd0, 0x15, 0x48, 0x86, 0x42, 0x01, 0xd1, +0x64, 0x19, 0x00, 0xe0, 0x76, 0x19, 0x06, 0x99, 0x49, 0x19, 0x06, 0x91, +0x38, 0x1c, 0xaf, 0x42, 0x00, 0xd3, 0x28, 0x1c, 0x05, 0x1c, 0xca, 0xe7, +0x0f, 0x48, 0x41, 0x69, 0x03, 0x9b, 0x19, 0x43, 0x41, 0x61, 0x82, 0x69, +0x03, 0x9b, 0x9a, 0x43, 0x82, 0x61, 0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, +0x81, 0x69, 0xc0, 0x46, 0x11, 0x61, 0x81, 0x69, 0x02, 0x9b, 0x19, 0x43, +0x81, 0x61, 0x11, 0x61, 0x01, 0x98, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x50, 0xab, 0x20, 0x40, +0x00, 0x00, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, +0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0xb0, 0xff, 0xb5, 0x85, 0xb0, +0x04, 0x1c, 0x1f, 0x1c, 0x00, 0x20, 0x01, 0x90, 0x01, 0x23, 0x5b, 0x04, +0x9f, 0x42, 0x01, 0xd9, 0x0f, 0x20, 0x7d, 0xe0, 0x26, 0x1c, 0x40, 0x4d, +0xaf, 0x42, 0x00, 0xd2, 0x3d, 0x1c, 0x21, 0x0d, 0x09, 0x05, 0x3e, 0x48, +0x3e, 0x4b, 0x99, 0x42, 0x04, 0xd0, 0x80, 0x25, 0x06, 0x1c, 0x80, 0x2f, +0x00, 0xd8, 0x3d, 0x1c, 0x3b, 0x4a, 0x51, 0x69, 0xc0, 0x46, 0x03, 0x91, +0x92, 0x69, 0xc0, 0x46, 0x02, 0x92, 0x10, 0x23, 0x19, 0x43, 0x37, 0x4b, +0xc0, 0x46, 0x59, 0x61, 0x10, 0x23, 0x9a, 0x43, +0x34, 0x4b, 0xc0, 0x46, 0x9a, 0x61, 0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, +0x31, 0x4a, 0x91, 0x69, 0x01, 0x22, 0x12, 0x05, 0x11, 0x61, 0x2f, 0x4a, +0x10, 0x23, 0x91, 0x69, 0x19, 0x43, 0x91, 0x61, 0x1a, 0x04, 0x11, 0x61, +0x21, 0x21, 0x09, 0x05, 0x04, 0x91, 0x00, 0x2f, 0x33, 0xd0, 0x2a, 0x1c, +0x04, 0x98, 0x02, 0x43, 0x00, 0x92, 0x00, 0x20, 0x06, 0x99, 0x07, 0x9a, +0x33, 0x1c, 0xfd, 0xf7, 0x27, 0xfd, 0x25, 0x48, 0x25, 0x49, 0x4a, 0x68, +0x52, 0x09, 0x08, 0xd3, 0x10, 0x21, 0x24, 0x4a, 0xc0, 0x46, 0x11, 0x60, +0x00, 0x28, 0x05, 0xd1, 0x11, 0x20, 0x01, 0x90, 0x1b, 0xe0, 0x01, 0x38, +0xf1, 0xd1, 0xf9, 0xe7, 0x19, 0x48, 0x86, 0x42, 0x04, 0xd1, 0x20, 0x1c, +0x31, 0x1c, 0x2a, 0x1c, 0x03, 0xf0, 0x96, 0xfe, 0x7f, 0x1b, 0x0e, 0xd0, +0x14, 0x48, 0x86, 0x42, 0x01, 0xd0, 0x76, 0x19, 0x00, 0xe0, 0x64, 0x19, +0x06, 0x99, 0x49, 0x19, 0x06, 0x91, 0x38, 0x1c, 0xaf, 0x42, 0x00, 0xd3, +0x28, 0x1c, 0x05, 0x1c, 0xcb, 0xe7, 0x0f, 0x48, 0x41, 0x69, 0x03, 0x9b, +0x19, 0x43, 0x41, 0x61, 0x82, 0x69, 0x03, 0x9b, 0x9a, 0x43, 0x82, 0x61, +0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, 0x81, 0x69, 0xc0, 0x46, 0x11, 0x61, +0x81, 0x69, 0x02, 0x9b, 0x19, 0x43, 0x81, 0x61, 0x11, 0x61, 0x01, 0x98, +0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xff, 0x00, 0x00, +0x50, 0xab, 0x20, 0x40, 0x00, 0x00, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0xb0, -0xff, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x1f, 0x1c, 0x00, 0x20, 0x01, 0x90, -0x01, 0x23, 0x5b, 0x04, 0x9f, 0x42, 0x01, 0xd9, -0x0f, 0x20, 0x7d, 0xe0, 0x26, 0x1c, 0x40, 0x4d, 0xaf, 0x42, 0x00, 0xd2, -0x3d, 0x1c, 0x21, 0x0d, 0x09, 0x05, 0x3e, 0x48, 0x3e, 0x4b, 0x99, 0x42, -0x04, 0xd0, 0x80, 0x25, 0x06, 0x1c, 0x80, 0x2f, 0x00, 0xd8, 0x3d, 0x1c, -0x3b, 0x4a, 0x51, 0x69, 0xc0, 0x46, 0x03, 0x91, 0x92, 0x69, 0xc0, 0x46, -0x02, 0x92, 0x10, 0x23, 0x19, 0x43, 0x37, 0x4b, 0xc0, 0x46, 0x59, 0x61, -0x10, 0x23, 0x9a, 0x43, 0x34, 0x4b, 0xc0, 0x46, 0x9a, 0x61, 0x01, 0x22, -0x12, 0x05, 0xd1, 0x60, 0x31, 0x4a, 0x91, 0x69, 0x01, 0x22, 0x12, 0x05, -0x11, 0x61, 0x2f, 0x4a, 0x10, 0x23, 0x91, 0x69, 0x19, 0x43, 0x91, 0x61, -0x1a, 0x04, 0x11, 0x61, 0x21, 0x21, 0x09, 0x05, 0x04, 0x91, 0x00, 0x2f, -0x33, 0xd0, 0x2a, 0x1c, 0x04, 0x98, 0x02, 0x43, 0x00, 0x92, 0x00, 0x20, -0x06, 0x99, 0x07, 0x9a, 0x33, 0x1c, 0xfe, 0xf7, 0xc7, 0xf8, 0x25, 0x48, -0x25, 0x49, 0x4a, 0x68, 0x52, 0x09, 0x08, 0xd3, 0x10, 0x21, 0x24, 0x4a, -0xc0, 0x46, 0x11, 0x60, 0x00, 0x28, 0x05, 0xd1, 0x11, 0x20, 0x01, 0x90, -0x1b, 0xe0, 0x01, 0x38, 0xf1, 0xd1, 0xf9, 0xe7, 0x19, 0x48, 0x86, 0x42, -0x04, 0xd1, 0x20, 0x1c, 0x31, 0x1c, 0x2a, 0x1c, 0x03, 0xf0, 0x1c, 0xfe, -0x7f, 0x1b, 0x0e, 0xd0, 0x14, 0x48, 0x86, 0x42, 0x01, 0xd0, 0x76, 0x19, -0x00, 0xe0, 0x64, 0x19, 0x06, 0x99, 0x49, 0x19, 0x06, 0x91, 0x38, 0x1c, -0xaf, 0x42, 0x00, 0xd3, 0x28, 0x1c, 0x05, 0x1c, 0xcb, 0xe7, 0x0f, 0x48, -0x41, 0x69, 0x03, 0x9b, 0x19, 0x43, 0x41, 0x61, 0x82, 0x69, 0x03, 0x9b, -0x9a, 0x43, 0x82, 0x61, 0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, 0x81, 0x69, -0xc0, 0x46, 0x11, 0x61, 0x81, 0x69, 0x02, 0x9b, 0x19, 0x43, 0x81, 0x61, -0x11, 0x61, 0x01, 0x98, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xf0, 0xff, 0x00, 0x00, 0x50, 0xab, 0x20, 0x40, 0x00, 0x00, 0x20, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, -0x00, 0x00, 0x00, 0xb0, 0x70, 0x47, 0x04, 0x49, 0x00, 0x20, 0x00, 0x22, -0x0a, 0x70, 0x01, 0x30, 0x01, 0x31, 0x68, 0x28, 0xfa, 0xd3, 0x70, 0x47, -0xa0, 0x82, 0x20, 0x40, 0x00, 0x22, 0x88, 0x42, 0x03, 0xd3, 0x40, 0x1a, -0x01, 0x32, 0x88, 0x42, 0xfb, 0xd2, 0x10, 0x1c, 0x70, 0x47, 0x88, 0x42, -0x02, 0xd3, 0x40, 0x1a, 0x88, 0x42, 0xfc, 0xd2, 0x70, 0x47, 0x90, 0xb4, -0x01, 0x1c, 0xff, 0x27, 0x04, 0x29, 0x27, 0xda, 0x00, 0x20, 0x14, 0x4a, -0x43, 0x00, 0x1b, 0x18, 0xdb, 0x00, 0xd4, 0x58, 0x63, 0x0c, 0x1a, 0xd2, -0x4b, 0x00, 0x59, 0x18, 0xc9, 0x00, 0x57, 0x58, 0x43, 0x00, 0x1b, 0x18, -0xdb, 0x00, 0xd7, 0x50, 0x89, 0x18, 0x9a, 0x18, 0x4f, 0x68, 0xc0, 0x46, -0x57, 0x60, 0x8b, 0x68, 0xc0, 0x46, 0x93, 0x60, 0x0b, 0x69, 0xc0, 0x46, -0x13, 0x61, 0x4b, 0x69, 0xc0, 0x46, 0x53, 0x61, 0xc9, 0x68, 0xc0, 0x46, -0xd1, 0x60, 0x90, 0xbc, 0x70, 0x47, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, -0x04, 0x28, 0xd9, 0xdb, 0x38, 0x1c, 0xf6, 0xe7, 0xd0, 0xab, 0x20, 0x40, -0xf7, 0xb5, 0xc5, 0xb0, 0x14, 0x1c, 0x00, 0x20, 0x11, 0x21, 0x21, 0x40, -0x5f, 0xd0, 0x00, 0x27, 0x79, 0x00, 0xc9, 0x19, 0xc9, 0x00, 0x5b, 0x4a, -0x51, 0x58, 0x49, 0x0c, 0x03, 0xd2, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, -0x04, 0xe0, 0x79, 0x1c, 0x0f, 0x06, 0x3f, 0x0e, 0x04, 0x2f, 0xef, 0xdb, -0x00, 0x28, 0x4c, 0xd0, 0x00, 0x22, 0x01, 0x92, 0x00, 0x92, 0x40, 0x23, -0x00, 0x21, 0x00, 0x20, 0x03, 0xaa, 0x00, 0xf0, -0x8f, 0xfa, 0x05, 0xa9, 0x00, 0x20, 0x82, 0x00, 0x8a, 0x58, 0x12, 0x06, -0x12, 0x0e, 0x45, 0x9b, 0x9a, 0x42, 0x05, 0xd1, 0x01, 0x9a, 0x01, 0x32, -0x12, 0x06, 0x12, 0x0e, 0x01, 0x92, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x06, -0x00, 0x0e, 0x10, 0x28, 0xed, 0xdb, 0x01, 0x9a, 0x00, 0x2a, 0x4f, 0xd0, -0x45, 0x9b, 0x04, 0x2b, 0x3e, 0xd1, 0x80, 0x00, 0x08, 0x58, 0x40, 0x01, -0x80, 0x0d, 0x00, 0x22, 0x00, 0x92, 0x10, 0x23, 0x00, 0x21, 0x03, 0xaa, -0x00, 0xf0, 0x6a, 0xfa, 0x00, 0x21, 0x01, 0x91, 0x03, 0xa8, 0x06, 0x99, -0x49, 0x0c, 0x89, 0x05, 0x2a, 0xd0, 0xc1, 0x68, 0x0a, 0x06, 0x12, 0x0e, -0x46, 0x9b, 0x9a, 0x42, 0x12, 0xd1, 0xc0, 0x68, 0x40, 0x01, 0x86, 0x0d, -0x00, 0x22, 0x00, 0x92, 0x0c, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x03, 0xaa, -0x00, 0xf0, 0x52, 0xfa, 0x01, 0x99, 0x03, 0x9d, 0x48, 0x1c, 0x01, 0x06, -0x09, 0x0e, 0x01, 0x91, 0x0f, 0xe0, 0x57, 0xe0, 0x48, 0x01, 0x86, 0x0d, -0x00, 0x22, 0x00, 0x92, 0x10, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x03, 0xaa, -0x00, 0xf0, 0x40, 0xfa, 0x03, 0xa8, 0x06, 0x99, 0x49, 0x0c, 0x89, 0x05, -0xd7, 0xd1, 0x01, 0x99, 0x00, 0x29, 0x11, 0xd1, 0xff, 0x20, 0x3f, 0xe0, +0x70, 0x47, 0x04, 0x49, 0x00, 0x20, 0x00, 0x22, 0x0a, 0x70, 0x01, 0x30, +0x01, 0x31, 0x68, 0x28, 0xfa, 0xd3, 0x70, 0x47, 0xa0, 0x82, 0x20, 0x40, +0x00, 0x22, 0x88, 0x42, 0x03, 0xd3, 0x40, 0x1a, 0x01, 0x32, 0x88, 0x42, +0xfb, 0xd2, 0x10, 0x1c, 0x70, 0x47, 0x88, 0x42, 0x02, 0xd3, 0x40, 0x1a, +0x88, 0x42, 0xfc, 0xd2, 0x70, 0x47, 0x90, 0xb4, 0x01, 0x1c, 0xff, 0x27, +0x04, 0x29, 0x27, 0xda, 0x00, 0x20, 0x14, 0x4a, 0x43, 0x00, 0x1b, 0x18, +0xdb, 0x00, 0xd4, 0x58, 0x63, 0x0c, 0x1a, 0xd2, 0x4b, 0x00, 0x59, 0x18, +0xc9, 0x00, 0x57, 0x58, 0x43, 0x00, 0x1b, 0x18, 0xdb, 0x00, 0xd7, 0x50, +0x89, 0x18, 0x9a, 0x18, 0x4f, 0x68, 0xc0, 0x46, 0x57, 0x60, 0x8b, 0x68, +0xc0, 0x46, 0x93, 0x60, 0x0b, 0x69, 0xc0, 0x46, 0x13, 0x61, 0x4b, 0x69, +0xc0, 0x46, 0x53, 0x61, 0xc9, 0x68, 0xc0, 0x46, 0xd1, 0x60, 0x90, 0xbc, +0x70, 0x47, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x04, 0x28, 0xd9, 0xdb, +0x38, 0x1c, 0xf6, 0xe7, 0xd0, 0xab, 0x20, 0x40, 0xf7, 0xb5, 0xc4, 0xb0, +0x04, 0x1c, 0x00, 0x20, 0x46, 0x9a, 0x11, 0x21, 0x11, 0x40, 0x6e, 0xd0, +0x00, 0x27, 0x79, 0x00, 0xc9, 0x19, 0xc9, 0x00, 0x57, 0x4a, 0x51, 0x58, +0x49, 0x0c, 0x03, 0xd2, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x04, 0xe0, +0x79, 0x1c, 0x0f, 0x06, 0x3f, 0x0e, 0x04, 0x2f, 0xef, 0xdb, 0x00, 0x28, +0x5b, 0xd0, 0x00, 0x26, 0x00, 0x22, 0x00, 0x92, 0x40, 0x23, 0x00, 0x21, +0x00, 0x20, 0x02, 0xaa, 0x00, 0xf0, 0x88, 0xfa, 0x04, 0xa9, 0x00, 0x20, +0x82, 0x00, 0x8a, 0x58, 0x12, 0x06, 0x12, 0x0e, 0xa2, 0x42, 0x03, 0xd1, +0x72, 0x1c, 0x16, 0x06, 0x36, 0x0e, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x06, +0x00, 0x0e, 0x10, 0x28, 0xf0, 0xdb, 0x00, 0x2e, 0x3d, 0xd0, 0x04, 0x2c, +0x3e, 0xd1, 0x80, 0x00, 0x08, 0x58, 0x40, 0x01, 0x80, 0x0d, 0x00, 0x22, +0x00, 0x92, 0x10, 0x23, 0x00, 0x21, 0x02, 0xaa, +0x00, 0xf0, 0x68, 0xfa, 0x00, 0x21, 0x01, 0x91, 0x02, 0xa8, 0x05, 0x99, +0x49, 0x0c, 0x89, 0x05, 0x29, 0xd0, 0xc1, 0x68, 0x0a, 0x06, 0x12, 0x0e, +0x45, 0x9b, 0x9a, 0x42, 0x11, 0xd1, 0xc0, 0x68, 0x40, 0x01, 0x86, 0x0d, +0x00, 0x22, 0x00, 0x92, 0x0c, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x02, 0xaa, +0x00, 0xf0, 0x50, 0xfa, 0x01, 0x99, 0x02, 0x9d, 0x48, 0x1c, 0x01, 0x06, +0x09, 0x0e, 0x01, 0x91, 0x0e, 0xe0, 0x48, 0x01, 0x86, 0x0d, 0x00, 0x22, +0x00, 0x92, 0x10, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x02, 0xaa, 0x00, 0xf0, +0x3f, 0xfa, 0x02, 0xa8, 0x05, 0x99, 0x49, 0x0c, 0x89, 0x05, 0xd8, 0xd1, +0x01, 0x99, 0x00, 0x29, 0x0f, 0xd1, 0xff, 0x20, 0x3d, 0xe0, 0x40, 0xe0, 0x80, 0x00, 0x08, 0x58, 0x40, 0x01, 0x86, 0x0d, 0x00, 0x22, 0x00, 0x92, -0x0c, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x03, 0xaa, 0x00, 0xf0, 0x2a, 0xfa, -0x03, 0x9d, 0x01, 0xe0, 0x20, 0x0a, 0xed, 0xd2, 0x01, 0x20, 0x00, 0x04, -0x20, 0x43, 0x79, 0x00, 0xc9, 0x19, 0xc9, 0x00, 0x17, 0x4a, 0xc0, 0x46, -0x50, 0x50, 0x30, 0x1c, 0x8e, 0x18, 0x70, 0x60, 0x10, 0x20, 0x45, 0x9b, -0x04, 0x2b, 0x00, 0xd0, 0x0c, 0x20, 0x02, 0x90, 0xb0, 0x60, 0x00, 0x20, -0x20, 0x21, 0x21, 0x40, 0x20, 0x29, 0x00, 0xd0, 0x28, 0x1c, 0x30, 0x61, -0x02, 0x98, 0x28, 0x18, 0xff, 0x21, 0xff, 0x30, 0x08, 0x30, 0x09, 0x31, -0xff, 0xf7, 0x12, 0xff, 0x43, 0x01, 0x18, 0x18, 0xc0, 0x00, 0x02, 0x99, -0x40, 0x1a, 0x70, 0x61, 0x00, 0x20, 0x50, 0x21, 0x21, 0x40, 0x50, 0x29, -0x00, 0xd1, 0x28, 0x1c, 0xf0, 0x60, 0x38, 0x1c, 0x48, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xff, 0x20, 0xf9, 0xe7, 0xd0, 0xab, 0x20, 0x40, -0x80, 0xb4, 0x00, 0x23, 0x00, 0x22, 0x00, 0x29, 0x06, 0xd9, 0x87, 0x5c, -0x7b, 0x40, 0x1b, 0x06, 0x1b, 0x0e, 0x01, 0x32, 0x8a, 0x42, 0xf8, 0xd3, -0xd8, 0x43, 0x00, 0x06, 0x00, 0x0e, 0x80, 0xbc, 0x70, 0x47, 0xf0, 0xb5, -0xc6, 0xb0, 0x04, 0x28, 0x07, 0xda, 0x41, 0x00, 0x09, 0x18, 0xc9, 0x00, -0x45, 0x91, 0x41, 0x4a, 0x51, 0x58, 0x4b, 0x0c, 0x02, 0xd2, 0x00, 0x20, -0xc0, 0x43, 0x76, 0xe0, 0x01, 0x23, 0x5b, 0x04, 0x19, 0x40, 0x43, 0x00, -0x18, 0x18, 0xc0, 0x00, 0x3a, 0x4a, 0x14, 0x18, 0x00, 0x29, 0x61, 0xd0, -0x00, 0x21, 0x02, 0x91, 0x20, 0x69, 0xa1, 0x68, 0x45, 0x18, 0x30, 0xd0, -0xff, 0x21, 0x68, 0x1e, 0x09, 0x31, 0xff, 0xf7, 0xc7, 0xfe, 0x61, 0x68, -0x40, 0x18, 0x01, 0x90, 0x01, 0x98, 0x81, 0x42, 0x02, 0xd1, 0xa6, 0x68, -0xaf, 0x1b, 0x09, 0xe0, 0x00, 0x26, 0xff, 0x21, 0x28, 0x1c, 0x09, 0x31, -0xff, 0xf7, 0xc1, 0xfe, 0x07, 0x1c, 0x01, 0xd1, 0xff, 0x27, 0x09, 0x37, -0x00, 0x22, 0x00, 0x92, 0x01, 0x98, 0x31, 0x1c, 0x03, 0xaa, 0x3b, 0x1c, -0x00, 0xf0, 0x9e, 0xf9, 0x03, 0xa8, 0x39, 0x1c, 0xff, 0xf7, 0xac, 0xff, -0xc0, 0x43, 0x02, 0x99, 0x48, 0x40, 0x01, 0x06, 0x09, 0x0e, 0x02, 0x91, -0xed, 0x1b, 0xa0, 0x68, 0xa8, 0x42, 0x00, 0xd1, -0x00, 0x25, 0x00, 0x2d, 0xce, 0xd8, 0x02, 0x99, 0xcf, 0x43, 0x00, 0x22, -0x00, 0x92, 0x0c, 0x23, 0x00, 0x21, 0x60, 0x68, 0x03, 0xaa, 0x00, 0xf0, -0x83, 0xf9, 0x20, 0x69, 0xc0, 0x46, 0x03, 0x90, 0x05, 0x98, 0x00, 0x0a, -0x00, 0x02, 0x39, 0x06, 0x09, 0x0e, 0x08, 0x43, 0x05, 0x90, 0xff, 0x23, -0x1b, 0x02, 0x98, 0x43, 0x05, 0x90, 0x0c, 0x21, 0x03, 0xa8, 0xff, 0xf7, -0x83, 0xff, 0xff, 0x23, 0x1b, 0x02, 0x05, 0x99, 0x99, 0x43, 0x00, 0x06, -0x00, 0x0e, 0x00, 0x02, 0x08, 0x43, 0x05, 0x90, 0x0c, 0x23, 0x00, 0x21, -0x60, 0x68, 0x03, 0xaa, 0x00, 0xf0, 0xbb, 0xf9, 0x00, 0x20, 0x45, 0x99, -0x06, 0x4a, 0xc0, 0x46, 0x50, 0x50, 0xc1, 0x43, 0x61, 0x60, 0xa1, 0x60, -0xe1, 0x60, 0x21, 0x61, 0x61, 0x61, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0xd0, 0xab, 0x20, 0x40, 0xb0, 0xb4, 0x4c, 0x42, -0x00, 0x29, 0x00, 0xdb, 0x0c, 0x1c, 0x00, 0x27, 0xff, 0x43, 0x04, 0x28, -0x21, 0xda, 0x12, 0x4d, 0x43, 0x00, 0x18, 0x18, 0xc0, 0x00, 0x40, 0x19, -0x01, 0x2a, 0x05, 0xd0, 0x02, 0x2a, 0x09, 0xd0, 0x03, 0x2a, 0x16, 0xd1, -0x01, 0x69, 0x0b, 0xe0, 0x00, 0x29, 0x12, 0xdb, 0x02, 0x69, 0x8a, 0x42, -0x0f, 0xd3, 0x05, 0xe0, 0x00, 0x29, 0x07, 0xda, 0xc1, 0x68, 0xa1, 0x42, -0x09, 0xd3, 0x09, 0x1b, 0xc1, 0x60, 0xc0, 0x68, 0xb0, 0xbc, 0x70, 0x47, -0xc1, 0x68, 0x09, 0x19, 0x02, 0x69, 0x91, 0x42, 0xf6, 0xd9, 0x38, 0x1c, -0xf6, 0xe7, 0x00, 0x00, 0xd0, 0xab, 0x20, 0x40, 0xf0, 0xb5, 0x84, 0xb0, -0x17, 0x1c, 0x0d, 0x1c, 0x00, 0x21, 0x02, 0x91, 0x42, 0x00, 0x12, 0x18, -0xd2, 0x00, 0x2c, 0x49, 0x8b, 0x58, 0x1b, 0x06, 0x1b, 0x0e, 0x01, 0x93, -0x00, 0x23, 0xdb, 0x43, 0x04, 0x28, 0x02, 0xda, 0x01, 0x98, 0x40, 0x08, -0x01, 0xd2, 0x18, 0x1c, 0x46, 0xe0, 0x54, 0x18, 0xe0, 0x68, 0xc2, 0x19, -0x21, 0x69, 0x8a, 0x42, 0x00, 0xd9, 0x0f, 0x1a, 0x00, 0x2f, 0x3c, 0xd9, -0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, 0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, -0x07, 0xfe, 0x61, 0x68, 0x46, 0x18, 0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, -0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, 0x07, 0xfe, 0xc2, 0x19, 0xff, 0x21, -0x09, 0x31, 0x8a, 0x42, 0x14, 0xd9, 0x01, 0x9a, 0xc0, 0x46, 0x00, 0x92, -0x0b, 0x1a, 0x03, 0x93, 0x01, 0x1c, 0x30, 0x1c, 0x2a, 0x1c, 0x00, 0xf0, -0xe1, 0xf8, 0xe0, 0x68, 0x03, 0x9b, 0xc0, 0x18, 0xe0, 0x60, 0x03, 0x9b, -0x5d, 0x19, 0xff, 0x1a, 0x02, 0x98, 0x18, 0x18, 0x02, 0x90, 0x10, 0xe0, -0x01, 0x9a, 0xc0, 0x46, 0x00, 0x92, 0x01, 0x1c, 0x30, 0x1c, 0x2a, 0x1c, -0x3b, 0x1c, 0x00, 0xf0, 0xcd, 0xf8, 0xe0, 0x68, 0xc0, 0x19, 0xed, 0x19, -0xe0, 0x60, 0x02, 0x98, 0xc0, 0x19, 0x02, 0x90, 0x00, 0x27, 0x00, 0x2f, -0xc2, 0xd8, 0x02, 0x98, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xd0, 0xab, 0x20, 0x40, 0xf0, 0xb5, 0x83, 0xb0, 0x17, 0x1c, 0x0d, 0x1c, -0x00, 0x21, 0x01, 0x91, 0x42, 0x00, 0x12, 0x18, 0xd2, 0x00, 0x02, 0x92, -0x30, 0x49, 0x8a, 0x58, 0x12, 0x06, 0x12, 0x0e, 0x00, 0x24, 0xe4, 0x43, -0x04, 0x28, 0x01, 0xda, 0x50, 0x09, 0x01, 0xd2, 0x20, 0x1c, 0x51, 0xe0, -0x02, 0x9a, 0x54, 0x18, 0xe0, 0x68, 0xc2, 0x19, 0x60, 0x69, 0x82, 0x42, -0x01, 0xd9, 0x22, 0x69, 0x87, 0x1a, 0x00, 0x2f, 0x45, 0xd9, 0x25, 0x4e, -0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, 0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, -0xa1, 0xfd, 0x61, 0x68, 0x40, 0x18, 0x00, 0x90, -0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, 0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, -0xa0, 0xfd, 0x02, 0x9a, 0xb1, 0x58, 0x01, 0x23, 0x5b, 0x04, 0x19, 0x43, -0xb1, 0x50, 0xc1, 0x19, 0xff, 0x22, 0x09, 0x32, 0x91, 0x42, 0x13, 0xd9, -0x13, 0x1a, 0x01, 0x1c, 0x00, 0x98, 0x2a, 0x1c, 0x1e, 0x1c, 0x00, 0xf0, -0xd0, 0xf8, 0xe0, 0x68, 0x80, 0x19, 0x75, 0x19, 0xe0, 0x60, 0x21, 0x69, -0x88, 0x42, 0x00, 0xd9, 0x20, 0x61, 0xbf, 0x1b, 0x01, 0x98, 0x30, 0x18, -0x01, 0x90, 0x12, 0xe0, 0x01, 0x1c, 0x00, 0x9e, 0x30, 0x1c, 0x2a, 0x1c, -0x3b, 0x1c, 0x00, 0xf0, 0xbc, 0xf8, 0xe0, 0x68, 0xc0, 0x19, 0xed, 0x19, -0xe0, 0x60, 0x21, 0x69, 0x88, 0x42, 0x00, 0xd9, 0x20, 0x61, 0x01, 0x98, -0xc0, 0x19, 0x01, 0x90, 0x00, 0x27, 0x00, 0x2f, 0xb9, 0xd8, 0x01, 0x98, -0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd0, 0xab, 0x20, 0x40, -0xb0, 0xb5, 0xc3, 0xb0, 0x0c, 0x1c, 0x00, 0x27, 0xfa, 0x43, 0x04, 0x28, -0x06, 0xda, 0x41, 0x00, 0x09, 0x18, 0xc9, 0x00, 0x14, 0x48, 0x45, 0x58, -0x6b, 0x0c, 0x04, 0xd2, 0x10, 0x1c, 0x43, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x62, 0x09, 0x1b, 0xd3, 0x00, 0x22, 0x00, 0x92, 0x08, 0x18, -0x40, 0x68, 0x0c, 0x23, 0x00, 0x21, 0x01, 0xaa, 0x00, 0xf0, 0x30, 0xf8, -0x11, 0x2c, 0x0d, 0xd0, 0x12, 0x2c, 0x0d, 0xd0, 0x13, 0x2c, 0x05, 0xd0, -0x14, 0x2c, 0x0a, 0xd1, 0x03, 0x98, 0x00, 0x04, 0x07, 0x0e, 0x06, 0xe0, -0x03, 0x98, 0x07, 0x06, 0x3f, 0x0e, 0x02, 0xe0, 0x01, 0x9f, 0x00, 0xe0, -0x02, 0x9f, 0x38, 0x1c, 0xdb, 0xe7, 0x00, 0x00, 0xd0, 0xab, 0x20, 0x40, -0x03, 0x49, 0x00, 0x20, 0x00, 0x22, 0x0a, 0x54, 0x01, 0x30, 0x60, 0x28, -0xfb, 0xd3, 0x70, 0x47, 0xd0, 0xab, 0x20, 0x40, 0x00, 0xb5, 0x02, 0xf0, -0x9f, 0xf9, 0x57, 0x20, 0x02, 0xf0, 0xfc, 0xf8, 0x02, 0xf0, 0x70, 0xf8, -0x00, 0x0a, 0xfb, 0xd3, 0x02, 0xf0, 0x7e, 0xf9, 0x08, 0xbc, 0x18, 0x47, -0xf0, 0xb5, 0x82, 0xb0, 0x14, 0x1c, 0x07, 0x9a, 0x1f, 0x1c, 0xff, 0x23, -0x01, 0x33, 0x1a, 0x40, 0x40, 0x02, 0x08, 0x43, 0x05, 0x0a, 0x06, 0x1c, -0x00, 0x0c, 0x01, 0x90, 0x00, 0x2a, 0x20, 0xd0, 0x02, 0xf0, 0x82, 0xf9, -0x53, 0x20, 0x02, 0xf0, 0xdf, 0xf8, 0x01, 0x98, 0xc0, 0x46, 0x00, 0x90, -0x02, 0xf0, 0xda, 0xf8, 0x28, 0x1c, 0x02, 0xf0, 0xd7, 0xf8, 0x30, 0x1c, -0x02, 0xf0, 0xd4, 0xf8, 0x02, 0xf0, 0x5a, 0xf9, 0xff, 0xf7, 0xce, 0xff, -0x02, 0xf0, 0x6e, 0xf9, 0x54, 0x20, 0x02, 0xf0, 0xcb, 0xf8, 0x00, 0x98, -0x02, 0xf0, 0xc8, 0xf8, 0x28, 0x1c, 0x02, 0xf0, 0xc5, 0xf8, 0x30, 0x1c, -0x14, 0xe0, 0x02, 0xf0, 0x61, 0xf9, 0x52, 0x20, 0x02, 0xf0, 0xbe, 0xf8, -0x01, 0x98, 0x02, 0xf0, 0xbb, 0xf8, 0x28, 0x1c, 0x02, 0xf0, 0xb8, 0xf8, -0x30, 0x1c, 0x02, 0xf0, 0xb5, 0xf8, 0x00, 0x20, 0x02, 0xf0, 0xb2, 0xf8, -0x00, 0x20, 0x02, 0xf0, 0xaf, 0xf8, 0x00, 0x20, 0x02, 0xf0, 0xac, 0xf8, -0x00, 0x20, 0x02, 0xf0, 0xa9, 0xf8, 0x00, 0x2f, 0x05, 0xd9, 0x02, 0xf0, -0x1b, 0xf8, 0x20, 0x70, 0x01, 0x34, 0x01, 0x3f, 0xf9, 0xd1, 0x02, 0xf0, -0x27, 0xf9, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, -0x82, 0xb0, 0x14, 0x1c, 0x1f, 0x1c, 0x40, 0x02, 0x08, 0x43, 0x05, 0x1c, -0x02, 0xf0, 0x32, 0xf9, 0x53, 0x20, 0x02, 0xf0, 0x8f, 0xf8, 0x28, 0x0c, -0x06, 0x1c, 0x02, 0xf0, 0x8b, 0xf8, 0x28, 0x0a, 0x01, 0x90, 0x00, 0x90, -0x02, 0xf0, 0x86, 0xf8, 0x28, 0x1c, 0x02, 0xf0, -0x83, 0xf8, 0x02, 0xf0, 0x09, 0xf9, 0xff, 0xf7, 0x7d, 0xff, 0x02, 0xf0, -0x1d, 0xf9, 0x84, 0x20, 0x02, 0xf0, 0x7a, 0xf8, 0x30, 0x1c, 0x02, 0xf0, -0x77, 0xf8, 0x00, 0x98, 0x02, 0xf0, 0x74, 0xf8, 0x28, 0x1c, 0x02, 0xf0, -0x71, 0xf8, 0x00, 0x2f, 0x05, 0xd9, 0x20, 0x78, 0x01, 0x34, 0x02, 0xf0, -0x6b, 0xf8, 0x01, 0x3f, 0xf9, 0xd1, 0x02, 0xf0, 0xef, 0xf8, 0x02, 0xf0, -0x05, 0xf9, 0x83, 0x20, 0x02, 0xf0, 0x62, 0xf8, 0x30, 0x1c, 0x02, 0xf0, -0x5f, 0xf8, 0x01, 0x98, 0x02, 0xf0, 0x5c, 0xf8, 0x28, 0x1c, 0x02, 0xf0, -0x59, 0xf8, 0x02, 0xf0, 0xdf, 0xf8, 0xff, 0xf7, 0x53, 0xff, 0x02, 0xb0, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, -0x80, 0xb5, 0x01, 0xf0, 0x89, 0xf8, 0x06, 0x4f, 0xc0, 0x46, 0xf8, 0x60, -0x01, 0xf0, 0xe4, 0xf8, 0x78, 0x80, 0x01, 0xf0, 0xa5, 0xf8, 0x38, 0x71, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0xb5, 0x01, 0xf0, 0xf7, 0xf8, 0x02, 0x49, 0xc0, 0x46, 0x08, 0x80, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x0b, 0x48, 0xc1, 0x68, -0x01, 0x29, 0x11, 0xd1, 0x02, 0x22, 0xc1, 0x6f, 0x0a, 0x43, 0xc2, 0x67, -0x08, 0x49, 0xc0, 0x46, 0x0a, 0x60, 0x80, 0x23, 0xc2, 0x6f, 0x1a, 0x43, -0xc2, 0x67, 0x0a, 0x60, 0x82, 0x22, 0x80, 0x30, 0x02, 0x60, 0x4a, 0x60, -0x00, 0x21, 0x81, 0x80, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x01, 0x11, 0x00, 0xf0, 0xb4, 0x49, 0x49, 0xca, 0x1d, 0x99, 0x32, -0x00, 0x20, 0x00, 0x27, 0x83, 0x00, 0xd7, 0x50, 0x01, 0x30, 0x17, 0x28, -0xfa, 0xd3, 0x45, 0x4c, 0x00, 0x20, 0x82, 0x00, 0xa7, 0x50, 0x01, 0x30, -0x20, 0x28, 0xfa, 0xd3, 0x42, 0x4a, 0x00, 0x20, 0x83, 0x00, 0xd7, 0x50, -0x01, 0x30, 0x20, 0x28, 0xfa, 0xd3, 0xa7, 0x61, 0x97, 0x61, 0x4f, 0x65, -0x8f, 0x65, 0x3e, 0x4d, 0xc0, 0x46, 0x2f, 0x60, 0x6f, 0x60, 0xaf, 0x60, -0xaf, 0x61, 0xef, 0x60, 0x2f, 0x61, 0x6f, 0x61, 0x00, 0x20, 0xc1, 0x00, -0x09, 0x18, 0x49, 0x01, 0x34, 0x4b, 0xc9, 0x18, 0x86, 0x00, 0xcb, 0x1d, -0xf5, 0x33, 0x33, 0x4c, 0x34, 0x19, 0xe3, 0x63, 0x87, 0x23, 0x9b, 0x00, -0xcb, 0x18, 0x63, 0x63, 0xcf, 0x23, 0x9b, 0x00, 0xcb, 0x18, 0xb4, 0x18, -0xe3, 0x63, 0x30, 0x4b, 0xc9, 0x18, 0x61, 0x63, 0x01, 0x30, 0x02, 0x28, -0xe5, 0xdb, 0x29, 0x48, 0xc1, 0x1d, 0xf5, 0x31, 0x28, 0x4c, 0xc0, 0x46, -0xa1, 0x62, 0x61, 0x6b, 0xcf, 0x23, 0x9b, 0x00, 0xe1, 0x62, 0xc1, 0x18, -0x91, 0x62, 0x51, 0x6b, 0xc0, 0x46, 0xd1, 0x62, 0x08, 0x21, 0xe1, 0x64, -0x25, 0x49, 0xc0, 0x46, 0x21, 0x65, 0x25, 0x49, 0x0b, 0x69, 0xc0, 0x46, -0x63, 0x65, 0xc3, 0x1d, 0x4d, 0x33, 0xe3, 0x65, 0x25, 0x66, 0x8b, 0x68, -0xc0, 0x46, 0x63, 0x66, 0xcb, 0x68, 0xc0, 0x46, 0xa3, 0x66, 0x1f, 0x4b, -0xc0, 0x46, 0xe3, 0x66, 0x27, 0x67, 0x67, 0x67, 0x1d, 0x4b, 0xc3, 0x18, -0x01, 0x26, 0xa3, 0x67, 0x66, 0x61, 0xe7, 0x61, 0xe3, 0x1d, 0x69, 0x33, -0x1f, 0x73, 0x02, 0x23, 0xd3, 0x64, 0x19, 0x4b, 0xc0, 0x46, 0x13, 0x65, +0x0c, 0x23, 0x00, 0x21, 0x30, 0x1c, 0x02, 0xaa, 0x00, 0xf0, 0x28, 0xfa, +0x02, 0x9d, 0x01, 0x20, 0x00, 0x04, 0x46, 0x9a, 0x10, 0x43, 0x79, 0x00, +0xc9, 0x19, 0xc9, 0x00, 0x17, 0x4a, 0xc0, 0x46, 0x50, 0x50, 0x30, 0x1c, +0x8e, 0x18, 0x70, 0x60, 0x10, 0x20, 0x04, 0x2c, 0x00, 0xd0, 0x0c, 0x20, +0x04, 0x1c, 0xb0, 0x60, 0x00, 0x20, 0x20, 0x21, 0x46, 0x9a, 0x11, 0x40, +0x20, 0x29, 0x00, 0xd0, 0x28, 0x1c, 0x30, 0x61, 0x28, 0x19, 0xff, 0x21, +0xff, 0x30, 0x08, 0x30, 0x09, 0x31, 0xff, 0xf7, 0x19, 0xff, 0x43, 0x01, +0x18, 0x18, 0xc0, 0x00, 0x00, 0x1b, 0x70, 0x61, 0x00, 0x20, 0x50, 0x21, +0x46, 0x9a, 0x11, 0x40, 0x50, 0x29, 0x00, 0xd1, 0x28, 0x1c, 0xf0, 0x60, +0x38, 0x1c, 0x47, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0x20, +0xf9, 0xe7, 0x00, 0x00, 0xd0, 0xab, 0x20, 0x40, 0x80, 0xb4, 0x00, 0x23, +0x00, 0x22, 0x00, 0x29, 0x06, 0xd9, 0x87, 0x5c, 0x7b, 0x40, 0x1b, 0x06, +0x1b, 0x0e, 0x01, 0x32, 0x8a, 0x42, 0xf8, 0xd3, 0xd8, 0x43, 0x00, 0x06, +0x00, 0x0e, 0x80, 0xbc, 0x70, 0x47, 0xf0, 0xb5, 0xc6, 0xb0, 0x04, 0x28, +0x07, 0xda, 0x41, 0x00, 0x09, 0x18, 0xc9, 0x00, 0x45, 0x91, 0x41, 0x4a, +0x51, 0x58, 0x4b, 0x0c, 0x02, 0xd2, 0x00, 0x20, 0xc0, 0x43, 0x76, 0xe0, +0x01, 0x23, 0x5b, 0x04, 0x19, 0x40, 0x43, 0x00, 0x18, 0x18, 0xc0, 0x00, +0x3a, 0x4a, 0x14, 0x18, 0x00, 0x29, 0x61, 0xd0, 0x00, 0x21, 0x02, 0x91, +0x20, 0x69, 0xa1, 0x68, 0x45, 0x18, 0x30, 0xd0, 0xff, 0x21, 0x68, 0x1e, +0x09, 0x31, 0xff, 0xf7, 0xcd, 0xfe, 0x61, 0x68, 0x40, 0x18, 0x01, 0x90, +0x01, 0x98, 0x81, 0x42, 0x02, 0xd1, 0xa6, 0x68, 0xaf, 0x1b, 0x09, 0xe0, +0x00, 0x26, 0xff, 0x21, 0x28, 0x1c, 0x09, 0x31, 0xff, 0xf7, 0xc7, 0xfe, +0x07, 0x1c, 0x01, 0xd1, 0xff, 0x27, 0x09, 0x37, 0x00, 0x22, 0x00, 0x92, +0x01, 0x98, 0x31, 0x1c, 0x03, 0xaa, 0x3b, 0x1c, 0x00, 0xf0, 0x9e, 0xf9, +0x03, 0xa8, 0x39, 0x1c, 0xff, 0xf7, 0xac, 0xff, 0xc0, 0x43, 0x02, 0x99, +0x48, 0x40, 0x01, 0x06, 0x09, 0x0e, 0x02, 0x91, 0xed, 0x1b, 0xa0, 0x68, +0xa8, 0x42, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x2d, 0xce, 0xd8, 0x02, 0x99, +0xcf, 0x43, 0x00, 0x22, 0x00, 0x92, 0x0c, 0x23, 0x00, 0x21, 0x60, 0x68, +0x03, 0xaa, 0x00, 0xf0, 0x83, 0xf9, 0x20, 0x69, 0xc0, 0x46, 0x03, 0x90, +0x05, 0x98, 0x00, 0x0a, 0x00, 0x02, 0x39, 0x06, 0x09, 0x0e, 0x08, 0x43, +0x05, 0x90, 0xff, 0x23, 0x1b, 0x02, 0x98, 0x43, 0x05, 0x90, 0x0c, 0x21, +0x03, 0xa8, 0xff, 0xf7, 0x83, 0xff, 0xff, 0x23, 0x1b, 0x02, 0x05, 0x99, +0x99, 0x43, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x02, +0x08, 0x43, 0x05, 0x90, 0x0c, 0x23, 0x00, 0x21, 0x60, 0x68, 0x03, 0xaa, +0x00, 0xf0, 0xca, 0xf9, 0x00, 0x20, 0x45, 0x99, 0x06, 0x4a, 0xc0, 0x46, +0x50, 0x50, 0xc1, 0x43, 0x61, 0x60, 0xa1, 0x60, 0xe1, 0x60, 0x21, 0x61, +0x61, 0x61, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xd0, 0xab, 0x20, 0x40, 0xb0, 0xb4, 0x4c, 0x42, 0x00, 0x29, 0x00, 0xdb, +0x0c, 0x1c, 0x00, 0x27, 0xff, 0x43, 0x04, 0x28, 0x21, 0xda, 0x12, 0x4d, +0x43, 0x00, 0x18, 0x18, 0xc0, 0x00, 0x40, 0x19, 0x01, 0x2a, 0x05, 0xd0, +0x02, 0x2a, 0x09, 0xd0, 0x03, 0x2a, 0x16, 0xd1, 0x01, 0x69, 0x0b, 0xe0, +0x00, 0x29, 0x12, 0xdb, 0x02, 0x69, 0x8a, 0x42, 0x0f, 0xd3, 0x05, 0xe0, +0x00, 0x29, 0x07, 0xda, 0xc1, 0x68, 0xa1, 0x42, 0x09, 0xd3, 0x09, 0x1b, +0xc1, 0x60, 0xc0, 0x68, 0xb0, 0xbc, 0x70, 0x47, 0xc1, 0x68, 0x09, 0x19, +0x02, 0x69, 0x91, 0x42, 0xf6, 0xd9, 0x38, 0x1c, 0xf6, 0xe7, 0x00, 0x00, +0xd0, 0xab, 0x20, 0x40, 0xf0, 0xb5, 0x84, 0xb0, 0x17, 0x1c, 0x0d, 0x1c, +0x00, 0x21, 0x02, 0x91, 0x42, 0x00, 0x12, 0x18, 0xd2, 0x00, 0x2c, 0x49, +0x8b, 0x58, 0x1b, 0x06, 0x1b, 0x0e, 0x01, 0x93, 0x00, 0x23, 0xdb, 0x43, +0x04, 0x28, 0x02, 0xda, 0x01, 0x98, 0x40, 0x08, 0x01, 0xd2, 0x18, 0x1c, +0x46, 0xe0, 0x54, 0x18, 0xe0, 0x68, 0xc2, 0x19, 0x21, 0x69, 0x8a, 0x42, +0x00, 0xd9, 0x0f, 0x1a, 0x00, 0x2f, 0x3c, 0xd9, 0xa0, 0x68, 0xe1, 0x68, +0x40, 0x18, 0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, 0x0d, 0xfe, 0x61, 0x68, +0x46, 0x18, 0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, 0xff, 0x21, 0x09, 0x31, +0xff, 0xf7, 0x0d, 0xfe, 0xc2, 0x19, 0xff, 0x21, 0x09, 0x31, 0x8a, 0x42, +0x14, 0xd9, 0x01, 0x9a, 0xc0, 0x46, 0x00, 0x92, 0x0b, 0x1a, 0x03, 0x93, +0x01, 0x1c, 0x30, 0x1c, 0x2a, 0x1c, 0x00, 0xf0, 0xe1, 0xf8, 0xe0, 0x68, +0x03, 0x9b, 0xc0, 0x18, 0xe0, 0x60, 0x03, 0x9b, 0x5d, 0x19, 0xff, 0x1a, +0x02, 0x98, 0x18, 0x18, 0x02, 0x90, 0x10, 0xe0, 0x01, 0x9a, 0xc0, 0x46, +0x00, 0x92, 0x01, 0x1c, 0x30, 0x1c, 0x2a, 0x1c, 0x3b, 0x1c, 0x00, 0xf0, +0xcd, 0xf8, 0xe0, 0x68, 0xc0, 0x19, 0xed, 0x19, 0xe0, 0x60, 0x02, 0x98, +0xc0, 0x19, 0x02, 0x90, 0x00, 0x27, 0x00, 0x2f, 0xc2, 0xd8, 0x02, 0x98, +0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd0, 0xab, 0x20, 0x40, +0xf0, 0xb5, 0x83, 0xb0, 0x17, 0x1c, 0x0d, 0x1c, 0x00, 0x21, 0x01, 0x91, +0x42, 0x00, 0x12, 0x18, 0xd2, 0x00, 0x02, 0x92, 0x30, 0x49, 0x8a, 0x58, +0x12, 0x06, 0x12, 0x0e, 0x00, 0x24, 0xe4, 0x43, 0x04, 0x28, 0x01, 0xda, +0x50, 0x09, 0x01, 0xd2, 0x20, 0x1c, 0x51, 0xe0, 0x02, 0x9a, 0x54, 0x18, +0xe0, 0x68, 0xc2, 0x19, 0x60, 0x69, 0x82, 0x42, 0x01, 0xd9, 0x22, 0x69, +0x87, 0x1a, 0x00, 0x2f, 0x45, 0xd9, 0x25, 0x4e, 0xa0, 0x68, 0xe1, 0x68, +0x40, 0x18, 0xff, 0x21, 0x09, 0x31, 0xff, 0xf7, 0xa7, 0xfd, 0x61, 0x68, +0x40, 0x18, 0x00, 0x90, 0xa0, 0x68, 0xe1, 0x68, 0x40, 0x18, 0xff, 0x21, +0x09, 0x31, 0xff, 0xf7, 0xa6, 0xfd, 0x02, 0x9a, 0xb1, 0x58, 0x01, 0x23, +0x5b, 0x04, 0x19, 0x43, 0xb1, 0x50, 0xc1, 0x19, 0xff, 0x22, 0x09, 0x32, +0x91, 0x42, 0x13, 0xd9, 0x13, 0x1a, 0x01, 0x1c, 0x00, 0x98, 0x2a, 0x1c, +0x1e, 0x1c, 0x00, 0xf0, 0xdf, 0xf8, 0xe0, 0x68, 0x80, 0x19, 0x75, 0x19, +0xe0, 0x60, 0x21, 0x69, 0x88, 0x42, 0x00, 0xd9, 0x20, 0x61, 0xbf, 0x1b, +0x01, 0x98, 0x30, 0x18, 0x01, 0x90, 0x12, 0xe0, +0x01, 0x1c, 0x00, 0x9e, 0x30, 0x1c, 0x2a, 0x1c, 0x3b, 0x1c, 0x00, 0xf0, +0xcb, 0xf8, 0xe0, 0x68, 0xc0, 0x19, 0xed, 0x19, 0xe0, 0x60, 0x21, 0x69, +0x88, 0x42, 0x00, 0xd9, 0x20, 0x61, 0x01, 0x98, 0xc0, 0x19, 0x01, 0x90, +0x00, 0x27, 0x00, 0x2f, 0xb9, 0xd8, 0x01, 0x98, 0x03, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0xd0, 0xab, 0x20, 0x40, 0xb0, 0xb5, 0xc3, 0xb0, +0x0c, 0x1c, 0x00, 0x27, 0xfa, 0x43, 0x04, 0x28, 0x06, 0xda, 0x41, 0x00, +0x09, 0x18, 0xc9, 0x00, 0x14, 0x48, 0x45, 0x58, 0x6b, 0x0c, 0x04, 0xd2, +0x10, 0x1c, 0x43, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x62, 0x09, +0x1b, 0xd3, 0x00, 0x22, 0x00, 0x92, 0x08, 0x18, 0x40, 0x68, 0x0c, 0x23, +0x00, 0x21, 0x01, 0xaa, 0x00, 0xf0, 0x30, 0xf8, 0x11, 0x2c, 0x0d, 0xd0, +0x12, 0x2c, 0x0d, 0xd0, 0x13, 0x2c, 0x05, 0xd0, 0x14, 0x2c, 0x0a, 0xd1, +0x03, 0x98, 0x00, 0x04, 0x07, 0x0e, 0x06, 0xe0, 0x03, 0x98, 0x07, 0x06, +0x3f, 0x0e, 0x02, 0xe0, 0x01, 0x9f, 0x00, 0xe0, 0x02, 0x9f, 0x38, 0x1c, +0xdb, 0xe7, 0x00, 0x00, 0xd0, 0xab, 0x20, 0x40, 0x03, 0x49, 0x00, 0x20, +0x00, 0x22, 0x0a, 0x54, 0x01, 0x30, 0x60, 0x28, 0xfb, 0xd3, 0x70, 0x47, +0xd0, 0xab, 0x20, 0x40, 0x00, 0xb5, 0x02, 0xf0, 0x01, 0xfa, 0x57, 0x20, +0x02, 0xf0, 0x5e, 0xf9, 0x02, 0xf0, 0xd2, 0xf8, 0x00, 0x0a, 0xfb, 0xd3, +0x02, 0xf0, 0xe0, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x82, 0xb0, +0x07, 0x9d, 0x14, 0x1c, 0x1f, 0x1c, 0x30, 0x4a, 0xd2, 0x6f, 0x20, 0x23, +0x16, 0x68, 0x9e, 0x43, 0x16, 0x60, 0x33, 0x1c, 0xff, 0x22, 0x01, 0x32, +0x2a, 0x40, 0x40, 0x02, 0x08, 0x43, 0x05, 0x0a, 0x06, 0x1c, 0x00, 0x0c, +0x01, 0x90, 0x00, 0x2a, 0x20, 0xd0, 0x02, 0xf0, 0xdd, 0xf9, 0x53, 0x20, +0x02, 0xf0, 0x3a, 0xf9, 0x01, 0x98, 0xc0, 0x46, 0x00, 0x90, 0x02, 0xf0, +0x35, 0xf9, 0x28, 0x1c, 0x02, 0xf0, 0x32, 0xf9, 0x30, 0x1c, 0x02, 0xf0, +0x2f, 0xf9, 0x02, 0xf0, 0xb5, 0xf9, 0xff, 0xf7, 0xc7, 0xff, 0x02, 0xf0, +0xc9, 0xf9, 0x54, 0x20, 0x02, 0xf0, 0x26, 0xf9, 0x00, 0x98, 0x02, 0xf0, +0x23, 0xf9, 0x28, 0x1c, 0x02, 0xf0, 0x20, 0xf9, 0x30, 0x1c, 0x14, 0xe0, +0x02, 0xf0, 0xbc, 0xf9, 0x52, 0x20, 0x02, 0xf0, 0x19, 0xf9, 0x01, 0x98, +0x02, 0xf0, 0x16, 0xf9, 0x28, 0x1c, 0x02, 0xf0, 0x13, 0xf9, 0x30, 0x1c, +0x02, 0xf0, 0x10, 0xf9, 0x00, 0x20, 0x02, 0xf0, 0x0d, 0xf9, 0x00, 0x20, +0x02, 0xf0, 0x0a, 0xf9, 0x00, 0x20, 0x02, 0xf0, 0x07, 0xf9, 0x00, 0x20, +0x02, 0xf0, 0x04, 0xf9, 0x00, 0x2f, 0x05, 0xd9, 0x02, 0xf0, 0x76, 0xf8, +0x20, 0x70, 0x01, 0x34, 0x01, 0x3f, 0xf9, 0xd1, 0x02, 0xf0, 0x82, 0xf9, +0x04, 0x4a, 0xd0, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, +0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, +0xf0, 0xb5, 0x82, 0xb0, 0x14, 0x1c, 0x1f, 0x1c, 0x40, 0x02, 0x08, 0x43, +0x05, 0x1c, 0x2c, 0x49, 0xc8, 0x6f, 0x20, 0x23, 0x02, 0x68, 0x9a, 0x43, +0x02, 0x60, 0xc8, 0x6f, 0x40, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, +0x02, 0xf0, 0x7a, 0xf9, 0x53, 0x20, 0x02, 0xf0, 0xd7, 0xf8, 0x28, 0x0c, +0x06, 0x1c, 0x02, 0xf0, 0xd3, 0xf8, 0x28, 0x0a, 0x01, 0x90, 0x00, 0x90, +0x02, 0xf0, 0xce, 0xf8, 0x28, 0x1c, 0x02, 0xf0, 0xcb, 0xf8, 0x02, 0xf0, +0x51, 0xf9, 0xff, 0xf7, 0x63, 0xff, 0x02, 0xf0, 0x65, 0xf9, 0x84, 0x20, +0x02, 0xf0, 0xc2, 0xf8, 0x30, 0x1c, 0x02, 0xf0, +0xbf, 0xf8, 0x00, 0x98, 0x02, 0xf0, 0xbc, 0xf8, 0x28, 0x1c, 0x02, 0xf0, +0xb9, 0xf8, 0x00, 0x2f, 0x05, 0xd9, 0x20, 0x78, 0x01, 0x34, 0x02, 0xf0, +0xb3, 0xf8, 0x01, 0x3f, 0xf9, 0xd1, 0x02, 0xf0, 0x37, 0xf9, 0x02, 0xf0, +0x4d, 0xf9, 0x83, 0x20, 0x02, 0xf0, 0xaa, 0xf8, 0x30, 0x1c, 0x02, 0xf0, +0xa7, 0xf8, 0x01, 0x98, 0x02, 0xf0, 0xa4, 0xf8, 0x28, 0x1c, 0x02, 0xf0, +0xa1, 0xf8, 0x02, 0xf0, 0x27, 0xf9, 0xff, 0xf7, 0x39, 0xff, 0x07, 0x49, +0xc8, 0x6f, 0x40, 0x23, 0x02, 0x68, 0x9a, 0x43, 0x02, 0x60, 0xc8, 0x6f, +0x20, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x02, 0xb0, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, +0x80, 0xb5, 0x01, 0xf0, 0x91, 0xf8, 0x06, 0x4f, 0xc0, 0x46, 0xf8, 0x60, +0x01, 0xf0, 0xf4, 0xf8, 0x78, 0x80, 0x01, 0xf0, 0xb3, 0xf8, 0x38, 0x71, +0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, +0x00, 0xb5, 0x01, 0xf0, 0x07, 0xf9, 0x02, 0x49, 0xc0, 0x46, 0x08, 0x80, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x0b, 0x48, 0xc1, 0x68, +0x01, 0x29, 0x11, 0xd1, 0xc1, 0x6f, 0x02, 0x23, 0x0a, 0x68, 0x1a, 0x43, +0x0a, 0x60, 0xc1, 0x6f, 0x80, 0x23, 0x0a, 0x68, 0x1a, 0x43, 0x0a, 0x60, +0xc1, 0x18, 0x08, 0x68, 0x82, 0x23, 0x02, 0x68, 0x1a, 0x43, 0x02, 0x60, +0x00, 0x20, 0x08, 0x81, 0x70, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, +0xf0, 0xb4, 0x4a, 0x49, 0xca, 0x1d, 0x9d, 0x32, 0x00, 0x20, 0x00, 0x27, +0x83, 0x00, 0xd7, 0x50, 0x01, 0x30, 0x17, 0x28, 0xfa, 0xd3, 0x46, 0x4c, +0x00, 0x20, 0x82, 0x00, 0xa7, 0x50, 0x01, 0x30, 0x20, 0x28, 0xfa, 0xd3, +0x43, 0x4a, 0x00, 0x20, 0x83, 0x00, 0xd7, 0x50, 0x01, 0x30, 0x20, 0x28, +0xfa, 0xd3, 0xa7, 0x61, 0x97, 0x61, 0x4f, 0x65, 0x8f, 0x65, 0x3f, 0x4d, +0xc0, 0x46, 0x2f, 0x60, 0x6f, 0x60, 0xaf, 0x60, 0xaf, 0x61, 0xef, 0x60, +0x2f, 0x61, 0x6f, 0x61, 0x00, 0x20, 0xc1, 0x00, 0x09, 0x18, 0x49, 0x01, +0x35, 0x4b, 0xc9, 0x18, 0x86, 0x00, 0xcb, 0x1d, 0xf9, 0x33, 0x34, 0x4c, +0x34, 0x19, 0xe3, 0x63, 0x11, 0x23, 0x5b, 0x01, 0xcb, 0x18, 0x63, 0x63, +0x0d, 0x23, 0x9b, 0x01, 0xcb, 0x18, 0xb4, 0x18, 0xe3, 0x63, 0x23, 0x23, +0x5b, 0x01, 0xc9, 0x18, 0x61, 0x63, 0x01, 0x30, 0x02, 0x28, 0xe4, 0xdb, +0x29, 0x48, 0xc1, 0x1d, 0xf9, 0x31, 0x29, 0x4c, 0xc0, 0x46, 0xa1, 0x62, +0x61, 0x6b, 0x0d, 0x23, 0x9b, 0x01, 0xe1, 0x62, 0xc1, 0x18, 0x91, 0x62, +0x51, 0x6b, 0xc0, 0x46, 0xd1, 0x62, 0x08, 0x21, 0xe1, 0x64, 0x25, 0x49, +0xc0, 0x46, 0x21, 0x65, 0x24, 0x49, 0x0b, 0x69, 0xc0, 0x46, 0x63, 0x65, +0xc3, 0x1d, 0x4d, 0x33, 0xe3, 0x65, 0x25, 0x66, 0x8b, 0x68, 0xc0, 0x46, +0x63, 0x66, 0xcb, 0x68, 0xc0, 0x46, 0xa3, 0x66, 0x1e, 0x4b, 0xc0, 0x46, +0xe3, 0x66, 0x27, 0x67, 0x0b, 0x23, 0xdb, 0x01, 0xc3, 0x18, 0xa3, 0x67, +0x67, 0x67, 0x01, 0x26, 0xe3, 0x1d, 0x69, 0x33, 0x66, 0x61, 0xe7, 0x61, +0x1f, 0x73, 0x02, 0x23, 0xd3, 0x64, 0x17, 0x4b, 0xc0, 0x46, 0x13, 0x65, 0xcb, 0x69, 0xc0, 0x46, 0x53, 0x65, 0xc3, 0x1d, 0x51, 0x33, 0xd3, 0x65, 0x2b, 0x1d, 0x13, 0x66, 0x4b, 0x69, 0xc0, 0x46, 0x53, 0x66, 0x89, 0x69, -0xc0, 0x46, 0x91, 0x66, 0x11, 0x49, 0xc0, 0x46, 0xd1, 0x66, 0x16, 0x67, -0x56, 0x67, 0x10, 0x4b, 0xc0, 0x18, 0x90, 0x67, 0x56, 0x61, 0xd7, 0x61, -0xd0, 0x1d, 0x69, 0x30, 0x07, 0x73, 0xf0, 0xbc, -0x70, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x50, 0x2c, 0x00, 0x80, -0xd0, 0x2c, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, 0x5c, 0x04, 0x00, 0x00, -0x30, 0x01, 0x18, 0x00, 0xf8, 0x28, 0x00, 0x80, 0x80, 0x54, 0xff, 0xff, -0x7c, 0x05, 0x00, 0x00, 0x38, 0x01, 0x18, 0x00, 0x90, 0x54, 0xff, 0xff, -0x7c, 0x07, 0x00, 0x00, 0x90, 0xb4, 0x00, 0x21, 0x1c, 0x4a, 0xbb, 0x23, -0x1b, 0x01, 0xd7, 0x18, 0xf9, 0x72, 0x19, 0x23, 0xdb, 0x01, 0xd0, 0x18, -0x33, 0x23, 0x9b, 0x01, 0xd3, 0x18, 0x81, 0x61, 0x59, 0x60, 0xb9, 0x72, -0x01, 0x27, 0x1f, 0x73, 0x19, 0x61, 0x17, 0x23, 0xdb, 0x01, 0xd3, 0x18, -0xd9, 0x63, 0x13, 0x4b, 0x51, 0x27, 0xbf, 0x03, 0xc3, 0x62, 0x3b, 0x60, -0x44, 0x69, 0xe4, 0x18, 0x04, 0x63, 0x04, 0x3c, 0x7c, 0x60, 0x01, 0x24, -0xe4, 0x02, 0x44, 0x63, 0x0d, 0x4c, 0xc0, 0x46, 0xbc, 0x60, 0xc4, 0x6a, -0xc0, 0x46, 0x04, 0x62, 0x44, 0x69, 0xe4, 0x18, 0x0a, 0x4b, 0xe3, 0x18, -0xfb, 0x60, 0xc3, 0x6a, 0xc0, 0x46, 0x43, 0x62, 0x03, 0x6a, 0xc0, 0x46, -0xc3, 0x61, 0x81, 0x63, 0x51, 0x64, 0x91, 0x64, 0xd1, 0x65, 0xd1, 0x66, -0x90, 0xbc, 0x70, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, -0xfc, 0x07, 0x00, 0x00, 0xfc, 0xf7, 0xff, 0xff, 0x90, 0xb4, 0x00, 0x22, -0x1c, 0x49, 0xc9, 0x23, 0x1b, 0x01, 0xc8, 0x18, 0x02, 0x70, 0x01, 0x20, -0xbb, 0x23, 0x1b, 0x01, 0xcb, 0x18, 0x58, 0x72, 0x18, 0x48, 0x03, 0x1c, -0x00, 0x27, 0xdc, 0x1d, 0xc1, 0x34, 0x1c, 0x65, 0x23, 0x1c, 0x01, 0x37, -0x3f, 0x2f, 0xf8, 0xd3, 0x1a, 0x65, 0x19, 0x23, 0xdb, 0x01, 0xcf, 0x18, -0x33, 0x23, 0x9b, 0x01, 0xcc, 0x18, 0xfa, 0x60, 0x60, 0x61, 0x40, 0x20, -0xb8, 0x60, 0xa2, 0x61, 0xe2, 0x61, 0xca, 0x64, 0x0a, 0x66, 0x0d, 0x48, -0xc0, 0x46, 0xc2, 0x60, 0x0c, 0x48, 0x00, 0x6b, 0xc0, 0x06, 0xc0, 0x0e, -0xb8, 0x63, 0x0b, 0x48, 0x65, 0x23, 0x5b, 0x01, 0xc9, 0x18, 0x02, 0x68, -0xc0, 0x46, 0x8a, 0x83, 0x42, 0x68, 0xc0, 0x46, 0xca, 0x83, 0x80, 0x68, -0xc0, 0x46, 0x20, 0x80, 0x90, 0xbc, 0x70, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x3c, 0xbd, 0x20, 0x40, 0x3c, 0xef, 0x20, 0x40, 0x80, 0x00, 0x14, 0x40, -0x40, 0x00, 0x14, 0x40, 0x00, 0x20, 0x0a, 0x49, 0xc0, 0x46, 0x08, 0x73, -0xcb, 0x1d, 0xff, 0x33, 0x3a, 0x33, 0x88, 0x61, 0xc8, 0x61, 0x18, 0x70, -0x06, 0x4a, 0xc0, 0x46, 0x10, 0x65, 0x50, 0x66, 0x90, 0x66, 0x08, 0x70, -0x58, 0x70, 0xbb, 0x23, 0x1b, 0x01, 0xd1, 0x18, 0x08, 0x72, 0x70, 0x47, -0xa8, 0x04, 0x00, 0x80, 0xe8, 0x0d, 0x00, 0x80, 0xf0, 0xb4, 0x2f, 0x49, -0x2f, 0x4a, 0xc0, 0x46, 0x11, 0x61, 0x01, 0x23, 0x9b, 0x02, 0xc8, 0x18, -0x50, 0x61, 0x2d, 0x48, 0xc0, 0x46, 0x10, 0x62, 0xdb, 0x00, 0xc3, 0x18, -0x53, 0x62, 0x00, 0x23, 0x13, 0x63, 0x53, 0x63, 0x29, 0x4a, 0x2a, 0x4f, -0xd4, 0x1d, 0xff, 0x34, 0xfa, 0x34, 0x14, 0xc7, 0x08, 0x3f, 0x3b, 0x61, -0x1c, 0x1f, 0x7c, 0x61, 0x26, 0x4f, 0xc0, 0x46, 0x39, 0x60, 0xb8, 0x61, -0x79, 0x61, 0xf8, 0x62, 0x3b, 0x63, 0x7b, 0x64, 0xba, 0x64, 0xfa, 0x65, -0x22, 0x4f, 0xfe, 0x1d, 0xf9, 0x36, 0x22, 0x4d, 0xec, 0x1d, 0x79, 0x34, -0xe6, 0x61, 0x51, 0x26, 0xb6, 0x03, 0x37, 0x61, 0xe4, 0x69, 0xc0, 0x46, -0x74, 0x61, 0x2f, 0x67, 0x1d, 0x4d, 0x09, 0x27, 0x7f, 0x04, 0xec, 0x1d, -0x75, 0x34, 0x7c, 0x60, 0x3d, 0x60, 0x1b, 0x4c, 0xc0, 0x46, 0x3c, 0x61, -0xe6, 0x1d, 0x75, 0x36, 0x7e, 0x61, 0x19, 0x4f, -0xc0, 0x46, 0x7c, 0x60, 0x3d, 0x60, 0x0f, 0x1c, 0x00, 0x21, 0xff, 0x24, -0x01, 0x34, 0x1d, 0x1c, 0x8b, 0x00, 0xfd, 0x50, 0x01, 0x31, 0xa1, 0x42, -0xfa, 0xd3, 0x01, 0x1c, 0x00, 0x20, 0x01, 0x27, 0xff, 0x02, 0x83, 0x00, -0xcd, 0x50, 0x01, 0x30, 0xb8, 0x42, 0xfa, 0xd3, 0x00, 0x20, 0x81, 0x00, -0x55, 0x50, 0x01, 0x30, 0x80, 0x28, 0xfa, 0xd3, 0xf0, 0xbc, 0x70, 0x47, -0x24, 0xa3, 0x20, 0x40, 0x40, 0x01, 0x18, 0x00, 0x24, 0x83, 0x20, 0x40, -0x24, 0xa9, 0x20, 0x40, 0x80, 0x01, 0x18, 0x00, 0x28, 0x03, 0x00, 0x80, -0x24, 0xa7, 0x20, 0x40, 0xe8, 0x0d, 0x00, 0x80, 0x24, 0xa8, 0x20, 0x40, -0xa4, 0xa8, 0x20, 0x40, 0x88, 0x03, 0x00, 0x80, 0xb8, 0xb5, 0x2d, 0x48, -0xfd, 0xf7, 0xc6, 0xfa, 0x01, 0x20, 0x2c, 0x49, 0x0a, 0x68, 0x52, 0x0c, -0x06, 0xd2, 0x0a, 0x68, 0x12, 0x0c, 0x02, 0xd1, 0x0a, 0x68, 0x92, 0x0a, -0x00, 0xd2, 0x00, 0x20, 0x04, 0x06, 0x24, 0x0e, 0x26, 0x4a, 0xd7, 0x1d, -0x0d, 0x37, 0x00, 0x23, 0x00, 0x20, 0x9d, 0x00, 0x78, 0x51, 0x01, 0x33, -0x04, 0x2b, 0xfa, 0xd3, 0x01, 0x27, 0x3f, 0x05, 0x50, 0x61, 0xf8, 0x60, -0xd0, 0x61, 0xf8, 0x61, 0x00, 0x23, 0xdb, 0x43, 0x93, 0x61, 0x3b, 0x61, -0x13, 0x62, 0x3b, 0x62, 0x00, 0x27, 0x1c, 0x4b, 0x8d, 0x68, 0xc0, 0x46, -0x00, 0x95, 0x8d, 0x69, 0xc0, 0x46, 0x00, 0x95, 0x00, 0x2c, 0x0b, 0xd0, -0xdd, 0x6b, 0xc0, 0x46, 0x00, 0x95, 0x9d, 0x6b, 0xc0, 0x46, 0x00, 0x95, -0x5d, 0x6b, 0xc0, 0x46, 0x00, 0x95, 0x1d, 0x6b, 0xc0, 0x46, 0x00, 0x95, -0x01, 0x37, 0x40, 0x2f, 0xe8, 0xd3, 0x00, 0x27, 0x6c, 0x46, 0x01, 0x23, -0x5b, 0x07, 0x1c, 0x43, 0x01, 0xe0, 0x20, 0x60, 0x01, 0x37, 0x0d, 0x68, -0x2b, 0x09, 0x02, 0xd2, 0x80, 0x2f, 0xf8, 0xd3, 0x01, 0xe0, 0x80, 0x2f, -0x03, 0xd3, 0x09, 0x49, 0x4b, 0x6e, 0x01, 0x33, 0x4b, 0x66, 0xd0, 0x62, -0x07, 0x48, 0xfd, 0xf7, 0x71, 0xfa, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xf4, 0x01, 0xff, 0xff, 0x00, 0x00, 0x10, 0x40, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x01, 0x18, 0x40, 0xa0, 0x82, 0x20, 0x40, 0x04, 0x02, 0xff, 0xff, -0x90, 0xb4, 0x00, 0x21, 0x0e, 0x4f, 0x0f, 0x4a, 0x00, 0x20, 0x4c, 0x01, -0x64, 0x1a, 0xa4, 0x00, 0xa3, 0x18, 0x58, 0x60, 0x98, 0x60, 0x18, 0x64, -0x58, 0x64, 0x10, 0x53, 0x58, 0x80, 0xcc, 0x00, 0xe4, 0x19, 0x98, 0x67, -0xdc, 0x62, 0x01, 0x31, 0x03, 0x29, 0xee, 0xd3, 0x06, 0x49, 0xc0, 0x46, -0x08, 0x60, 0x48, 0x60, 0x88, 0x60, 0xc8, 0x60, 0x08, 0x61, 0x90, 0xbc, -0x70, 0x47, 0x00, 0x00, 0x58, 0x67, 0x21, 0x40, 0xc8, 0x2a, 0x00, 0x80, -0x3c, 0x2c, 0x00, 0x80, 0x00, 0xb5, 0x64, 0x21, 0x07, 0x48, 0xc0, 0x46, -0x01, 0x63, 0x00, 0x21, 0xc9, 0x43, 0x41, 0x63, 0x81, 0x63, 0x00, 0x21, -0xc1, 0x63, 0x01, 0x64, 0x03, 0x48, 0x28, 0x22, 0x02, 0xf0, 0x06, 0xff, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x59, 0x03, 0xff, 0xff, -0x80, 0xb4, 0x01, 0x20, 0x40, 0x02, 0x0a, 0x49, 0xc0, 0x46, 0x08, 0x60, -0x3c, 0x20, 0x48, 0x60, 0x88, 0x60, 0x08, 0x48, 0xc0, 0x46, 0xc8, 0x60, -0x00, 0x20, 0x07, 0x4a, 0x87, 0x00, 0xcb, 0x68, 0xc0, 0x46, 0xda, 0x51, -0x01, 0x30, 0x10, 0x28, 0xf8, 0xd3, 0x80, 0xbc, 0x70, 0x47, 0x00, 0x00, -0x50, 0x2d, 0x00, 0x80, 0x60, 0x2d, 0x00, 0x80, 0xd5, 0x4b, 0xff, 0xff, -0x12, 0x49, 0x13, 0x48, 0x67, 0x23, 0x9b, 0x01, 0xca, 0x18, 0x06, 0xc0, -0x08, 0x38, 0x11, 0x4b, 0xca, 0x18, 0xc1, 0x60, +0xc0, 0x46, 0x91, 0x66, 0x0f, 0x49, 0xc0, 0x46, 0xd1, 0x66, 0x16, 0x67, +0x0f, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x90, 0x67, 0x56, 0x67, 0xd7, 0x61, +0xd0, 0x1d, 0x69, 0x30, 0x56, 0x61, 0x07, 0x73, +0xf0, 0xbc, 0x70, 0x47, 0x68, 0x0e, 0x00, 0x80, 0xe4, 0x2c, 0x00, 0x80, +0x64, 0x2d, 0x00, 0x80, 0x3c, 0xef, 0x20, 0x40, 0x30, 0x01, 0x18, 0x00, +0x7c, 0x29, 0x00, 0x80, 0xec, 0x54, 0xff, 0xff, 0x38, 0x01, 0x18, 0x00, +0xfc, 0x54, 0xff, 0xff, 0x90, 0xb4, 0x00, 0x21, 0x1e, 0x4a, 0xbb, 0x23, +0x1b, 0x01, 0xd7, 0x18, 0xf9, 0x73, 0x19, 0x23, 0xdb, 0x01, 0xd0, 0x18, +0x01, 0x24, 0xcd, 0x23, 0x1b, 0x01, 0xd3, 0x18, 0xc1, 0x61, 0x1c, 0x70, +0x33, 0x23, 0x9b, 0x01, 0xd3, 0x18, 0x99, 0x60, 0xb9, 0x73, 0x59, 0x61, +0x2f, 0x23, 0x9b, 0x01, 0xd3, 0x18, 0x19, 0x60, 0x13, 0x4b, 0x51, 0x27, +0xbf, 0x03, 0x03, 0x63, 0x3b, 0x60, 0x84, 0x69, 0xe4, 0x18, 0x44, 0x63, +0x04, 0x3c, 0x7c, 0x60, 0x01, 0x24, 0xe4, 0x02, 0x84, 0x63, 0x0e, 0x4c, +0xc0, 0x46, 0xbc, 0x60, 0x04, 0x6b, 0xc0, 0x46, 0x44, 0x62, 0x84, 0x69, +0xe4, 0x18, 0x0b, 0x4b, 0xe3, 0x18, 0xfb, 0x60, 0x03, 0x6b, 0xc0, 0x46, +0x83, 0x62, 0x43, 0x6a, 0xc0, 0x46, 0x03, 0x62, 0xc1, 0x63, 0x51, 0x64, +0x91, 0x64, 0xd1, 0x65, 0xd1, 0x66, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, 0xfc, 0x07, 0x00, 0x00, +0xfc, 0xf7, 0xff, 0xff, 0x90, 0xb4, 0x00, 0x22, 0x1b, 0x49, 0xc9, 0x23, +0x1b, 0x01, 0xc8, 0x18, 0x02, 0x71, 0x01, 0x20, 0xbb, 0x23, 0x1b, 0x01, +0xcb, 0x18, 0x58, 0x73, 0x17, 0x48, 0x03, 0x1c, 0x00, 0x27, 0xdc, 0x1d, +0xc1, 0x34, 0x1c, 0x65, 0x23, 0x1c, 0x01, 0x37, 0x3f, 0x2f, 0xf8, 0xd3, +0x1a, 0x65, 0x19, 0x23, 0xdb, 0x01, 0xcf, 0x18, 0x33, 0x23, 0x9b, 0x01, +0xcb, 0x18, 0x3a, 0x61, 0x98, 0x61, 0x40, 0x20, 0xf8, 0x60, 0xda, 0x61, +0x1a, 0x62, 0xca, 0x64, 0x0a, 0x66, 0x0c, 0x48, 0xc0, 0x46, 0xc2, 0x60, +0x0b, 0x48, 0x00, 0x6b, 0xc0, 0x06, 0xc0, 0x0e, 0xf8, 0x63, 0x0a, 0x48, +0x01, 0x68, 0xc0, 0x46, 0x19, 0x80, 0x41, 0x68, 0xc0, 0x46, 0x59, 0x80, +0x80, 0x68, 0xc0, 0x46, 0x98, 0x80, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x3c, 0xbd, 0x20, 0x40, 0x3c, 0xef, 0x20, 0x40, +0x80, 0x00, 0x14, 0x40, 0x40, 0x00, 0x14, 0x40, 0x00, 0x20, 0x0a, 0x49, +0xc0, 0x46, 0x08, 0x73, 0xcb, 0x1d, 0xff, 0x33, 0x3a, 0x33, 0x88, 0x61, +0xc8, 0x61, 0x18, 0x70, 0x06, 0x4a, 0xc0, 0x46, 0x10, 0x65, 0x50, 0x66, +0x90, 0x66, 0x08, 0x70, 0x58, 0x70, 0xbb, 0x23, 0x1b, 0x01, 0xd1, 0x18, +0x08, 0x73, 0x70, 0x47, 0x28, 0x05, 0x00, 0x80, 0x68, 0x0e, 0x00, 0x80, +0xf0, 0xb4, 0x2f, 0x49, 0x2f, 0x4a, 0xc0, 0x46, 0x11, 0x61, 0x01, 0x23, +0x9b, 0x02, 0xc8, 0x18, 0x50, 0x61, 0x2d, 0x48, 0xc0, 0x46, 0x10, 0x62, +0xdb, 0x00, 0xc3, 0x18, 0x53, 0x62, 0x00, 0x23, 0x13, 0x63, 0x53, 0x63, +0x29, 0x4a, 0x2a, 0x4f, 0xd4, 0x1d, 0xff, 0x34, 0xfa, 0x34, 0x14, 0xc7, +0x08, 0x3f, 0x3b, 0x61, 0x1c, 0x1f, 0x7c, 0x61, 0x26, 0x4f, 0xc0, 0x46, +0x39, 0x60, 0xb8, 0x61, 0x79, 0x61, 0xf8, 0x62, 0x3b, 0x63, 0x7b, 0x64, +0xba, 0x64, 0xfa, 0x65, 0x22, 0x4f, 0xfe, 0x1d, 0xf9, 0x36, 0x22, 0x4d, +0xec, 0x1d, 0x79, 0x34, 0x26, 0x62, 0x51, 0x26, 0xb6, 0x03, 0x37, 0x61, +0x24, 0x6a, 0xc0, 0x46, 0x74, 0x61, 0x2f, 0x67, 0x1d, 0x4d, 0x09, 0x27, +0x7f, 0x04, 0xec, 0x1d, 0x75, 0x34, 0x7c, 0x60, 0x3d, 0x60, 0x1b, 0x4c, +0xc0, 0x46, 0x3c, 0x61, 0xe6, 0x1d, 0x75, 0x36, 0x7e, 0x61, 0x19, 0x4f, +0xc0, 0x46, 0x7c, 0x60, 0x3d, 0x60, 0x0f, 0x1c, +0x00, 0x21, 0xff, 0x24, 0x01, 0x34, 0x1d, 0x1c, 0x8b, 0x00, 0xfd, 0x50, +0x01, 0x31, 0xa1, 0x42, 0xfa, 0xd3, 0x01, 0x1c, 0x00, 0x20, 0x01, 0x27, +0xff, 0x02, 0x83, 0x00, 0xcd, 0x50, 0x01, 0x30, 0xb8, 0x42, 0xfa, 0xd3, +0x00, 0x20, 0x81, 0x00, 0x55, 0x50, 0x01, 0x30, 0x80, 0x28, 0xfa, 0xd3, +0xf0, 0xbc, 0x70, 0x47, 0x24, 0xa3, 0x20, 0x40, 0x40, 0x01, 0x18, 0x00, +0x24, 0x83, 0x20, 0x40, 0x24, 0xa9, 0x20, 0x40, 0x80, 0x01, 0x18, 0x00, +0xa8, 0x03, 0x00, 0x80, 0x24, 0xa7, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, +0x24, 0xa8, 0x20, 0x40, 0xa4, 0xa8, 0x20, 0x40, 0x08, 0x04, 0x00, 0x80, +0xb8, 0xb5, 0x2c, 0x48, 0xfc, 0xf7, 0x0a, 0xff, 0x01, 0x20, 0x2b, 0x49, +0x0a, 0x68, 0x52, 0x0c, 0x06, 0xd2, 0x0a, 0x68, 0x12, 0x0c, 0x02, 0xd1, +0x0a, 0x68, 0x92, 0x0a, 0x00, 0xd2, 0x00, 0x20, 0x04, 0x06, 0x24, 0x0e, +0x25, 0x4a, 0xd7, 0x1d, 0x0d, 0x37, 0x00, 0x23, 0x00, 0x20, 0x9d, 0x00, +0x78, 0x51, 0x01, 0x33, 0x04, 0x2b, 0xfa, 0xd3, 0x01, 0x27, 0x3f, 0x05, +0x50, 0x61, 0xf8, 0x60, 0xd0, 0x61, 0xf8, 0x61, 0x00, 0x23, 0xdb, 0x43, +0x93, 0x61, 0x3b, 0x61, 0x13, 0x62, 0x3b, 0x62, 0x00, 0x27, 0x1b, 0x4b, +0x8d, 0x68, 0xc0, 0x46, 0x00, 0x95, 0x8d, 0x69, 0xc0, 0x46, 0x00, 0x95, +0x00, 0x2c, 0x0b, 0xd0, 0xdd, 0x6b, 0xc0, 0x46, 0x00, 0x95, 0x9d, 0x6b, +0xc0, 0x46, 0x00, 0x95, 0x5d, 0x6b, 0xc0, 0x46, 0x00, 0x95, 0x1d, 0x6b, +0xc0, 0x46, 0x00, 0x95, 0x01, 0x37, 0x40, 0x2f, 0xe8, 0xd3, 0x00, 0x27, +0x6c, 0x46, 0x01, 0x23, 0x5b, 0x07, 0x1c, 0x43, 0x01, 0xe0, 0x20, 0x60, +0x01, 0x37, 0x0d, 0x68, 0x2b, 0x09, 0x02, 0xd2, 0x80, 0x2f, 0xf8, 0xd3, +0x01, 0xe0, 0x80, 0x2f, 0x03, 0xd3, 0x08, 0x49, 0x4b, 0x6e, 0x01, 0x33, +0x4b, 0x66, 0xd0, 0x62, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0xf4, 0x01, 0xff, 0xff, 0x00, 0x00, 0x10, 0x40, 0x68, 0x0e, 0x00, 0x80, +0x00, 0x01, 0x18, 0x40, 0xa0, 0x82, 0x20, 0x40, 0x90, 0xb4, 0x00, 0x21, +0x0e, 0x4f, 0x0f, 0x4a, 0x00, 0x20, 0x4c, 0x01, 0x64, 0x1a, 0xa4, 0x00, +0xa3, 0x18, 0x58, 0x60, 0x98, 0x60, 0x18, 0x64, 0x58, 0x64, 0x10, 0x53, +0x58, 0x80, 0xcc, 0x00, 0xe4, 0x19, 0x98, 0x67, 0xdc, 0x62, 0x01, 0x31, +0x03, 0x29, 0xee, 0xd3, 0x06, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x48, 0x60, +0x88, 0x60, 0xc8, 0x60, 0x08, 0x61, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, +0x58, 0x67, 0x21, 0x40, 0x5c, 0x2b, 0x00, 0x80, 0xd0, 0x2c, 0x00, 0x80, +0x64, 0x21, 0x05, 0x48, 0xc0, 0x46, 0x01, 0x63, 0x00, 0x21, 0xc9, 0x43, +0x41, 0x63, 0x81, 0x63, 0x00, 0x21, 0xc1, 0x63, 0x01, 0x64, 0x70, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x80, 0xb4, 0x01, 0x20, 0x40, 0x02, 0x0a, 0x49, +0xc0, 0x46, 0x08, 0x60, 0x3c, 0x20, 0x48, 0x60, 0x88, 0x60, 0x08, 0x48, +0xc0, 0x46, 0xc8, 0x60, 0x00, 0x20, 0x07, 0x4a, 0x87, 0x00, 0xcb, 0x68, +0xc0, 0x46, 0xda, 0x51, 0x01, 0x30, 0x10, 0x28, 0xf8, 0xd3, 0x80, 0xbc, +0x70, 0x47, 0x00, 0x00, 0xe4, 0x2d, 0x00, 0x80, 0xf4, 0x2d, 0x00, 0x80, +0x49, 0x4c, 0xff, 0xff, 0x12, 0x49, 0x13, 0x48, 0x67, 0x23, 0x9b, 0x01, +0xca, 0x18, 0x06, 0xc0, 0x08, 0x38, 0x11, 0x4b, 0xca, 0x18, 0xc1, 0x60, 0x82, 0x60, 0x01, 0x61, 0x0f, 0x49, 0x10, 0x48, 0xa7, 0x23, 0x9b, 0x01, 0xca, 0x18, 0x06, 0xc0, 0x08, 0x38, 0x0e, 0x4b, 0xca, 0x18, 0xc1, 0x60, -0x82, 0x60, 0x01, 0x61, 0x0c, 0x48, 0x0d, 0x49, 0x67, 0x23, 0x9b, 0x01, -0xc2, 0x18, 0x05, 0xc1, 0x08, 0x39, 0x05, 0x4b, 0xc2, 0x18, 0xc8, 0x60, -0x8a, 0x60, 0x08, 0x61, 0x70, 0x47, 0x00, 0x00, 0x58, 0x1f, 0x21, 0x40, -0xb4, 0x2d, 0x00, 0x80, 0xfc, 0x1f, 0x00, 0x00, 0x58, 0xef, 0x20, 0x40, -0xa0, 0x2d, 0x00, 0x80, 0xfc, 0x2f, 0x00, 0x00, 0x58, 0x3f, 0x21, 0x40, -0xc8, 0x2d, 0x00, 0x80, 0x90, 0xb4, 0x00, 0x21, 0x40, 0x4c, 0x00, 0x20, -0x0a, 0x01, 0x12, 0x19, 0x19, 0x23, 0xdb, 0x01, 0xd2, 0x18, 0xd0, 0x62, -0x10, 0x63, 0x50, 0x63, 0x90, 0x63, 0x01, 0x31, 0x03, 0x29, 0xf3, 0xd3, -0x3a, 0x49, 0xc0, 0x46, 0xc8, 0x62, 0x08, 0x63, 0x48, 0x63, 0x20, 0x60, -0x01, 0x21, 0xe3, 0x1d, 0x59, 0x33, 0x60, 0x60, 0x19, 0x71, 0x18, 0x72, -0x98, 0x71, 0x98, 0x72, 0x59, 0x71, 0x58, 0x72, 0xd8, 0x71, 0xd8, 0x72, -0xe2, 0x1d, 0x49, 0x32, 0x11, 0x73, 0x19, 0x70, 0x90, 0x73, 0x98, 0x70, -0x51, 0x73, 0x59, 0x70, 0xd0, 0x73, 0xd8, 0x70, 0x11, 0x71, 0x11, 0x72, -0x90, 0x71, 0x90, 0x72, 0x50, 0x71, 0x50, 0x72, 0xd0, 0x71, 0xd0, 0x72, -0x18, 0x73, 0x02, 0x22, 0xe7, 0x1d, 0x69, 0x37, 0x3a, 0x70, 0x99, 0x73, -0xba, 0x70, 0x58, 0x73, 0x78, 0x70, 0xd8, 0x73, 0xf8, 0x70, 0x39, 0x71, -0x3a, 0x72, 0xb9, 0x71, 0xb9, 0x72, 0x78, 0x71, 0x7a, 0x72, 0xf9, 0x71, -0xf9, 0x72, 0x39, 0x73, 0xe3, 0x1d, 0x79, 0x33, 0x1a, 0x70, 0xb9, 0x73, -0x99, 0x70, 0x78, 0x73, 0x5a, 0x70, 0xf9, 0x73, 0xd9, 0x70, 0x1a, 0x71, -0x1a, 0x72, 0x99, 0x71, 0x9a, 0x72, 0x58, 0x71, 0x5a, 0x72, 0xd9, 0x71, -0xda, 0x72, 0x19, 0x73, 0xe7, 0x1d, 0x89, 0x37, 0x3a, 0x70, 0x99, 0x73, -0xb9, 0x70, 0x58, 0x73, 0x7a, 0x70, 0xd9, 0x73, 0xf9, 0x70, 0x39, 0x71, -0x3a, 0x72, 0xb9, 0x71, 0xb9, 0x72, 0x78, 0x71, 0x7a, 0x72, 0xf9, 0x71, -0xf9, 0x72, 0x3a, 0x73, 0xe3, 0x1d, 0x99, 0x33, 0x1a, 0x70, 0xb9, 0x73, -0x9a, 0x70, 0x78, 0x73, 0x5a, 0x70, 0xf9, 0x73, 0xda, 0x70, 0x19, 0x71, -0x1a, 0x72, 0x99, 0x71, 0x99, 0x72, 0x58, 0x71, 0x5a, 0x72, 0xd9, 0x71, -0xd9, 0x72, 0x20, 0x61, 0xe0, 0x60, 0x60, 0x61, 0xa0, 0x60, 0x90, 0xbc, -0x70, 0x47, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x68, 0x19, 0x00, 0x80, -0x81, 0x20, 0x00, 0x02, 0x01, 0x49, 0xc0, 0x46, 0x88, 0x62, 0x70, 0x47, -0xc0, 0x00, 0x14, 0x00, 0x0a, 0x49, 0x13, 0x23, 0xdb, 0x01, 0xc8, 0x18, -0x25, 0x23, 0x9b, 0x01, 0xc9, 0x18, 0xc8, 0x63, 0x00, 0x21, 0xc2, 0x1d, +0x82, 0x60, 0x01, 0x61, 0x0c, 0x48, 0x0d, 0x49, +0x67, 0x23, 0x9b, 0x01, 0xc2, 0x18, 0x05, 0xc1, 0x08, 0x39, 0x05, 0x4b, +0xc2, 0x18, 0xc8, 0x60, 0x8a, 0x60, 0x08, 0x61, 0x70, 0x47, 0x00, 0x00, +0x58, 0x1f, 0x21, 0x40, 0x48, 0x2e, 0x00, 0x80, 0xfc, 0x1f, 0x00, 0x00, +0x58, 0xef, 0x20, 0x40, 0x34, 0x2e, 0x00, 0x80, 0xfc, 0x2f, 0x00, 0x00, +0x58, 0x3f, 0x21, 0x40, 0x5c, 0x2e, 0x00, 0x80, 0x90, 0xb4, 0x00, 0x21, +0x40, 0x4c, 0x00, 0x20, 0x0a, 0x01, 0x12, 0x19, 0x19, 0x23, 0xdb, 0x01, +0xd2, 0x18, 0xd0, 0x62, 0x10, 0x63, 0x50, 0x63, 0x90, 0x63, 0x01, 0x31, +0x03, 0x29, 0xf3, 0xd3, 0x3a, 0x49, 0xc0, 0x46, 0x08, 0x63, 0x48, 0x63, +0x88, 0x63, 0x20, 0x60, 0x01, 0x21, 0xe3, 0x1d, 0x59, 0x33, 0x60, 0x60, +0x19, 0x71, 0x18, 0x72, 0x98, 0x71, 0x98, 0x72, 0x59, 0x71, 0x58, 0x72, +0xd8, 0x71, 0xd8, 0x72, 0xe2, 0x1d, 0x49, 0x32, 0x11, 0x73, 0x19, 0x70, +0x90, 0x73, 0x98, 0x70, 0x51, 0x73, 0x59, 0x70, 0xd0, 0x73, 0xd8, 0x70, +0x11, 0x71, 0x11, 0x72, 0x90, 0x71, 0x90, 0x72, 0x50, 0x71, 0x50, 0x72, +0xd0, 0x71, 0xd0, 0x72, 0x18, 0x73, 0x02, 0x22, 0xe7, 0x1d, 0x69, 0x37, +0x3a, 0x70, 0x99, 0x73, 0xba, 0x70, 0x58, 0x73, 0x78, 0x70, 0xd8, 0x73, +0xf8, 0x70, 0x39, 0x71, 0x3a, 0x72, 0xb9, 0x71, 0xb9, 0x72, 0x78, 0x71, +0x7a, 0x72, 0xf9, 0x71, 0xf9, 0x72, 0x39, 0x73, 0xe3, 0x1d, 0x79, 0x33, +0x1a, 0x70, 0xb9, 0x73, 0x99, 0x70, 0x78, 0x73, 0x5a, 0x70, 0xf9, 0x73, +0xd9, 0x70, 0x1a, 0x71, 0x1a, 0x72, 0x99, 0x71, 0x9a, 0x72, 0x58, 0x71, +0x5a, 0x72, 0xd9, 0x71, 0xda, 0x72, 0x19, 0x73, 0xe7, 0x1d, 0x89, 0x37, +0x3a, 0x70, 0x99, 0x73, 0xb9, 0x70, 0x58, 0x73, 0x7a, 0x70, 0xd9, 0x73, +0xf9, 0x70, 0x39, 0x71, 0x3a, 0x72, 0xb9, 0x71, 0xb9, 0x72, 0x78, 0x71, +0x7a, 0x72, 0xf9, 0x71, 0xf9, 0x72, 0x3a, 0x73, 0xe3, 0x1d, 0x99, 0x33, +0x1a, 0x70, 0xb9, 0x73, 0x9a, 0x70, 0x78, 0x73, 0x5a, 0x70, 0xf9, 0x73, +0xda, 0x70, 0x19, 0x71, 0x1a, 0x72, 0x99, 0x71, 0x99, 0x72, 0x58, 0x71, +0x5a, 0x72, 0xd9, 0x71, 0xd9, 0x72, 0x20, 0x61, 0xe0, 0x60, 0x60, 0x61, +0xa0, 0x60, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x1c, 0x00, 0x80, +0xe8, 0x19, 0x00, 0x80, 0x81, 0x20, 0x00, 0x02, 0x01, 0x49, 0xc0, 0x46, +0x88, 0x62, 0x70, 0x47, 0xc0, 0x00, 0x14, 0x00, 0x09, 0x49, 0x0a, 0x4b, +0xc8, 0x18, 0x04, 0x3b, 0xc9, 0x18, 0x08, 0x60, 0x00, 0x21, 0xc2, 0x1d, 0x29, 0x32, 0xc2, 0x61, 0x10, 0x1c, 0x01, 0x31, 0x08, 0x29, 0xf8, 0xd3, 0xc1, 0x1f, 0x29, 0x39, 0x00, 0x20, 0xc8, 0x61, 0x70, 0x47, 0x00, 0x00, -0xe8, 0x0d, 0x00, 0x80, 0x06, 0x48, 0x07, 0x49, 0xc0, 0x46, 0x08, 0x80, -0x48, 0x80, 0x00, 0x20, 0x88, 0x80, 0xc8, 0x80, 0x88, 0x60, 0x04, 0x49, -0xc0, 0x46, 0x48, 0x61, 0x88, 0x61, 0x70, 0x47, 0xff, 0xff, 0x00, 0x00, -0xc8, 0x29, 0x00, 0x80, 0xec, 0x05, 0x00, 0x80, 0x00, 0x21, 0x06, 0x48, -0xc2, 0x1d, 0x19, 0x32, 0xc1, 0x60, 0x01, 0x61, 0xc1, 0x61, 0x01, 0x62, -0x11, 0x71, 0xff, 0x30, 0x01, 0x30, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, -0xec, 0x05, 0x00, 0x80, 0x09, 0x48, 0x0a, 0x4b, 0xc0, 0x46, 0x18, 0x60, -0x00, 0x21, 0xc2, 0x1d, 0x4d, 0x32, 0xc2, 0x60, +0x68, 0x0e, 0x00, 0x80, 0x84, 0x09, 0x00, 0x00, 0x06, 0x48, 0x07, 0x49, +0xc0, 0x46, 0x08, 0x80, 0x48, 0x80, 0x00, 0x20, 0x88, 0x80, 0xc8, 0x80, +0x88, 0x60, 0x04, 0x49, 0xc0, 0x46, 0x48, 0x61, 0x88, 0x61, 0x70, 0x47, +0xff, 0xff, 0x00, 0x00, 0x4c, 0x2a, 0x00, 0x80, 0x6c, 0x06, 0x00, 0x80, +0x00, 0x21, 0x06, 0x48, 0xc2, 0x1d, 0x19, 0x32, 0xc1, 0x60, 0x01, 0x61, +0xc1, 0x61, 0x01, 0x62, 0x11, 0x71, 0xff, 0x30, 0x01, 0x30, 0x41, 0x62, +0x70, 0x47, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, 0x09, 0x48, 0x0a, 0x4b, +0xc0, 0x46, 0x18, 0x60, 0x00, 0x21, 0xc2, 0x1d, 0x4d, 0x32, 0xc2, 0x60, 0x10, 0x1c, 0x01, 0x31, 0x14, 0x29, 0xf8, 0xd3, 0xc1, 0x1f, 0x4d, 0x39, 0x00, 0x20, 0xc8, 0x60, 0x58, 0x60, 0x98, 0x60, 0x70, 0x47, 0x00, 0x00, -0x58, 0x07, 0x00, 0x80, 0xec, 0x05, 0x00, 0x80, 0x00, 0xb5, 0x0c, 0x49, -0x0c, 0x48, 0xfd, 0xf7, 0xea, 0xf8, 0x0c, 0x48, 0x00, 0x6a, 0x01, 0x23, -0xdb, 0x03, 0x98, 0x43, 0x0a, 0x49, 0xc0, 0x46, 0x08, 0x62, 0x0a, 0x48, -0xc1, 0x68, 0x01, 0x29, 0x06, 0xd1, 0x80, 0x23, 0xc1, 0x6f, 0x19, 0x43, -0xc1, 0x67, 0x07, 0x48, 0xc0, 0x46, 0x01, 0x60, 0x08, 0xbc, 0x18, 0x47, -0x59, 0xcd, 0x21, 0x40, 0x61, 0xa1, 0x21, 0x40, 0xc0, 0x00, 0x18, 0x40, -0xc0, 0x00, 0x18, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x01, 0x11, 0x00, -0x00, 0xb5, 0x10, 0x48, 0xc1, 0x68, 0x01, 0x29, 0x06, 0xd1, 0x80, 0x23, -0xc1, 0x6f, 0x99, 0x43, 0xc1, 0x67, 0x0d, 0x48, 0xc0, 0x46, 0x01, 0x60, -0x0c, 0x4b, 0x0d, 0x48, 0x0d, 0x4a, 0x00, 0x21, 0xfd, 0xf7, 0xb9, 0xf8, -0x0c, 0x48, 0x41, 0x8d, 0x01, 0x31, 0x41, 0x85, 0x00, 0x21, 0xc1, 0x85, -0x0a, 0x48, 0x00, 0x6a, 0x01, 0x23, 0xdb, 0x03, 0x18, 0x43, 0x09, 0x49, -0xc0, 0x46, 0x08, 0x62, 0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, -0x00, 0x01, 0x11, 0x00, 0xf1, 0xcc, 0x21, 0x40, 0x61, 0xa1, 0x21, 0x40, +0xd8, 0x07, 0x00, 0x80, 0x6c, 0x06, 0x00, 0x80, +0x00, 0xb5, 0x0b, 0x49, 0x0b, 0x48, 0xfc, 0xf7, 0x3a, 0xfd, 0x0b, 0x48, +0x00, 0x6a, 0x01, 0x23, 0xdb, 0x03, 0x98, 0x43, 0x09, 0x49, 0xc0, 0x46, +0x08, 0x62, 0x09, 0x48, 0xc1, 0x68, 0x01, 0x29, 0x04, 0xd1, 0xc0, 0x6f, +0x80, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x08, 0xbc, 0x18, 0x47, +0x8d, 0xd5, 0x21, 0x40, 0xc1, 0xa8, 0x21, 0x40, 0xc0, 0x00, 0x18, 0x40, +0xc0, 0x00, 0x18, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x00, 0xb5, 0x0f, 0x48, +0xc1, 0x68, 0x01, 0x29, 0x04, 0xd1, 0xc0, 0x6f, 0x80, 0x23, 0x01, 0x68, +0x99, 0x43, 0x01, 0x60, 0x0b, 0x4b, 0x0c, 0x48, 0x0c, 0x4a, 0x00, 0x21, +0xfc, 0xf7, 0x0f, 0xfd, 0x0b, 0x48, 0x41, 0x8d, 0x01, 0x31, 0x41, 0x85, +0x00, 0x21, 0xc1, 0x85, 0x09, 0x48, 0x00, 0x6a, 0x01, 0x23, 0xdb, 0x03, +0x18, 0x43, 0x08, 0x49, 0xc0, 0x46, 0x08, 0x62, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x25, 0xd5, 0x21, 0x40, 0xc1, 0xa8, 0x21, 0x40, 0xb8, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x18, 0x40, -0xc0, 0x00, 0x18, 0x00, 0xf0, 0xb5, 0xfe, 0xf7, 0xa3, 0xfe, 0x19, 0x4c, -0x10, 0x26, 0xe0, 0x68, 0x01, 0x28, 0x05, 0xd1, 0x60, 0x88, 0x00, 0x28, -0x02, 0xd1, 0x19, 0x20, 0xa0, 0x67, 0x00, 0xe0, 0xa6, 0x67, 0x00, 0x20, -0x07, 0x23, 0x5b, 0x02, 0xe5, 0x18, 0xc1, 0x43, 0xa8, 0x61, 0x29, 0x62, -0x59, 0x08, 0xa1, 0x27, 0x7f, 0x03, 0x79, 0x60, 0x0f, 0x21, 0x79, 0x60, -0xe1, 0x1d, 0xb9, 0x31, 0x08, 0x70, 0x01, 0x20, 0xb8, 0x60, 0x40, 0x02, -0xb8, 0x60, 0x00, 0xf0, 0x47, 0xfa, 0x00, 0xf0, 0xd9, 0xfa, 0x04, 0x20, -0xb8, 0x60, 0x07, 0x20, 0x78, 0x61, 0x7e, 0x60, 0x1b, 0x23, 0xdb, 0x01, -0xe0, 0x18, 0x40, 0x8b, 0x04, 0x23, 0x18, 0x40, 0xa8, 0x62, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x80, 0xb4, 0x02, 0x1c, -0x00, 0x20, 0xff, 0x23, 0x01, 0x33, 0x9a, 0x42, 0x08, 0xd0, 0x01, 0x29, -0x00, 0xd1, 0x01, 0x20, 0x00, 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x18, 0x43, -0x80, 0xbc, 0x70, 0x47, 0x18, 0x49, 0xca, 0x68, 0x18, 0x4b, 0x01, 0x2a, -0x0b, 0xd1, 0x4a, 0x88, 0x00, 0x2a, 0x08, 0xd1, 0xd9, 0x8a, 0x0a, 0x09, -0x00, 0xd3, 0x02, 0x20, 0x49, 0x09, 0xef, 0xd3, 0x01, 0x23, 0x18, 0x43, -0xec, 0xe7, 0x0a, 0x79, 0x00, 0x2a, 0x03, 0xd0, 0x18, 0x8a, 0x80, 0x07, -0x80, 0x0f, 0xe5, 0xe7, 0x6d, 0x23, 0x5b, 0x01, 0xc9, 0x18, 0x0a, 0x88, -0xff, 0x27, 0x01, 0x37, 0x17, 0x40, 0x0b, 0x49, 0x49, 0x88, 0x03, 0xd0, -0x4b, 0x0a, 0x01, 0xd3, 0x03, 0x20, 0xd7, 0xe7, 0x13, 0x0a, 0x03, 0xd3, -0x0b, 0x0a, 0x01, 0xd3, 0x02, 0x20, 0xd1, 0xe7, 0xd2, 0x09, 0xcf, 0xd3, -0xc9, 0x09, 0xcd, 0xd3, 0x01, 0x20, 0xcb, 0xe7, 0xe8, 0x0d, 0x00, 0x80, -0xa8, 0x1b, 0x00, 0x80, 0x88, 0x1b, 0x00, 0x80, 0xf0, 0xb5, 0xc1, 0xb0, -0x01, 0x20, 0x00, 0x07, 0x52, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x52, 0x48, -0x42, 0x69, 0x40, 0x0d, 0xa1, 0x21, 0x49, 0x03, 0x48, 0x60, 0x50, 0x48, -0xc0, 0x6a, 0x50, 0x4b, 0x18, 0x43, 0x00, 0x21, 0x03, 0x03, 0x1b, 0x0b, -0x4e, 0x4c, 0x27, 0x6f, 0x3d, 0x03, 0x2d, 0x0b, +0xc0, 0x00, 0x18, 0x00, 0xf0, 0xb5, 0xfe, 0xf7, 0x9b, 0xfe, 0x1b, 0x4c, +0x10, 0x26, 0xe0, 0x68, 0x01, 0x28, 0x08, 0xd1, 0x60, 0x88, 0x00, 0x28, +0x05, 0xd1, 0x20, 0x79, 0x00, 0x28, 0x02, 0xd1, 0x19, 0x20, 0xa0, 0x67, +0x00, 0xe0, 0xa6, 0x67, 0x00, 0x20, 0x07, 0x23, 0x5b, 0x02, 0xe5, 0x18, +0xc1, 0x43, 0xe8, 0x61, 0x69, 0x62, 0x59, 0x08, 0xa1, 0x27, 0x7f, 0x03, +0x79, 0x60, 0x0f, 0x21, 0x79, 0x60, 0xe1, 0x1d, 0xb9, 0x31, 0x08, 0x71, +0x01, 0x20, 0xb8, 0x60, 0x40, 0x02, 0xb8, 0x60, 0x00, 0xf0, 0x4c, 0xfa, +0x00, 0xf0, 0xf0, 0xfa, 0x04, 0x20, 0xb8, 0x60, 0x07, 0x20, 0x78, 0x61, +0x7e, 0x60, 0x1b, 0x23, 0xdb, 0x01, 0xe0, 0x18, 0xc0, 0x8b, 0x04, 0x23, +0x18, 0x40, 0xe8, 0x62, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0x90, 0xb4, 0x02, 0x1c, 0x00, 0x20, 0xff, 0x23, +0x01, 0x33, 0x9a, 0x42, 0x08, 0xd0, 0x01, 0x29, 0x00, 0xd1, 0x01, 0x20, +0x00, 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x18, 0x43, 0x90, 0xbc, 0x70, 0x47, +0x1b, 0x4a, 0xd7, 0x68, 0x1a, 0x4b, 0x19, 0x79, 0x1c, 0x1c, 0x37, 0x23, +0x9b, 0x01, 0xe3, 0x18, 0x01, 0x2f, 0x0d, 0xd1, 0x57, 0x88, 0x00, 0x2f, +0x0a, 0xd1, 0x00, 0x29, 0x0a, 0xd1, 0x59, 0x8b, 0x0a, 0x09, 0x00, 0xd3, +0x02, 0x20, 0x49, 0x09, 0xe8, 0xd3, 0x01, 0x23, 0x18, 0x43, 0xe5, 0xe7, +0x00, 0x29, 0x03, 0xd0, 0x98, 0x8a, 0x80, 0x07, 0x80, 0x0f, 0xdf, 0xe7, +0x6d, 0x23, 0x5b, 0x01, 0xd1, 0x18, 0x8a, 0x88, 0xff, 0x27, 0x01, 0x37, +0x17, 0x40, 0x0a, 0x49, 0xc9, 0x88, 0x03, 0xd0, 0x4b, 0x0a, 0x01, 0xd3, +0x03, 0x20, 0xd1, 0xe7, 0x13, 0x0a, 0x03, 0xd3, 0x0b, 0x0a, 0x01, 0xd3, +0x02, 0x20, 0xcb, 0xe7, 0xd2, 0x09, 0xc9, 0xd3, 0xc9, 0x09, 0xc7, 0xd3, +0x01, 0x20, 0xc5, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0x08, 0x1c, 0x00, 0x80, +0xf0, 0xb5, 0xc1, 0xb0, 0x01, 0x20, 0x00, 0x07, 0x52, 0x49, 0xc0, 0x46, +0x08, 0x60, 0x52, 0x48, 0x42, 0x69, 0x40, 0x0d, 0xa1, 0x21, 0x49, 0x03, +0x48, 0x60, 0x50, 0x48, 0xc0, 0x6a, 0x50, 0x4b, 0x18, 0x43, 0x00, 0x21, +0x03, 0x03, 0x1b, 0x0b, 0x4e, 0x4c, 0x27, 0x6f, 0x3d, 0x03, 0x2d, 0x0b, 0xe7, 0x1d, 0x79, 0x37, 0xab, 0x42, 0x1c, 0xd0, 0xe3, 0x1d, 0x79, 0x33, -0xdb, 0x69, 0xc0, 0x46, 0x40, 0x93, 0x01, 0x23, 0x9b, 0x07, 0x03, 0x43, -0x1b, 0x68, 0xcc, 0x00, 0x6e, 0x46, 0x33, 0x51, 0x01, 0x23, 0x9b, 0x07, -0x06, 0x1d, 0x33, 0x43, 0x1b, 0x68, 0x6c, 0x44, 0x63, 0x60, 0x08, 0x30, -0x01, 0x31, 0x40, 0x9b, 0x83, 0x42, 0x00, 0xd8, 0x3f, 0x48, 0x03, 0x03, -0x1b, 0x0b, 0xab, 0x42, 0xe7, 0xd1, 0x00, 0x20, 0x01, 0x23, 0x1b, 0x03, -0x13, 0x40, 0x3c, 0x4c, 0x03, 0xd0, 0x63, 0x6a, 0x01, 0x33, 0x63, 0x62, -0x09, 0xe0, 0x13, 0x0b, 0x03, 0xd3, 0x23, 0x6a, 0x01, 0x33, 0x23, 0x62, -0x03, 0xe0, 0x37, 0x4b, 0x5c, 0x6d, 0x01, 0x34, 0x5c, 0x65, 0x00, 0x29, -0x09, 0xd0, 0x03, 0x1c, 0xdc, 0x00, 0x23, 0x1c, 0x6b, 0x44, 0x5c, 0x68, -0x01, 0x30, 0x23, 0x0d, 0x01, 0xd2, 0x88, 0x42, 0xf5, 0xd1, 0x30, 0x4c, -0x25, 0x68, 0x6b, 0x0c, 0x05, 0xd2, 0x23, 0x68, 0x1b, 0x0c, 0x08, 0xd1, -0x24, 0x68, 0xa3, 0x0a, 0x05, 0xd3, 0x20, 0x24, 0x2b, 0x4b, 0xc0, 0x46, -0x5c, 0x62, 0x00, 0x24, 0x5c, 0x62, 0x25, 0x4b, 0x23, 0x4c, 0x51, 0x26, -0xb6, 0x03, 0x23, 0x67, 0x33, 0x61, 0xfd, 0x69, 0xc0, 0x46, 0x75, 0x61, -0x02, 0x25, 0xa1, 0x26, 0x76, 0x03, 0x75, 0x60, 0x01, 0x25, 0xb5, 0x60, -0xe6, 0x1d, 0xb9, 0x36, 0x35, 0x70, 0x88, 0x42, 0x21, 0xd0, 0x25, 0x1c, -0xc3, 0x00, 0x6c, 0x46, 0xe4, 0x58, 0x2e, 0x6f, 0x6b, 0x44, 0x34, 0x60, -0x5b, 0x68, 0x2c, 0x6f, 0xc0, 0x46, 0x63, 0x60, 0x2b, 0x6f, 0x08, 0x33, -0x2b, 0x67, 0xfc, 0x69, 0xa3, 0x42, 0x02, 0xd3, 0x12, 0x4b, 0xc0, 0x46, -0x2b, 0x67, 0x03, 0x1c, 0xdb, 0x00, 0x6b, 0x44, 0x5c, 0x68, 0x01, 0x30, -0x23, 0x0d, 0x04, 0xd3, 0x51, 0x24, 0xa4, 0x03, 0x2b, 0x6f, 0xc0, 0x46, -0xa3, 0x61, 0x88, 0x42, 0xde, 0xd1, 0x10, 0x0b, 0x03, 0xd3, 0x0e, 0x49, -0x01, 0x20, 0xfc, 0xf7, 0x72, 0xff, 0x41, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x01, 0x14, 0x40, -0x00, 0x40, 0x14, 0x40, 0x00, 0x00, 0x20, 0x40, 0xe8, 0x0d, 0x00, 0x80, -0x24, 0xa7, 0x20, 0x40, 0x10, 0x2a, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, -0x00, 0x00, 0x10, 0x40, 0xc0, 0x00, 0x18, 0x00, 0x49, 0x4f, 0xff, 0xff, -0xf0, 0xb4, 0x00, 0x21, 0x00, 0x23, 0x07, 0x22, 0x06, 0x24, 0x47, 0x4f, -0xc0, 0x46, 0x3c, 0x61, 0x3a, 0x61, 0x01, 0x33, 0x20, 0x2b, 0xf9, 0xd3, -0x04, 0x25, 0x3d, 0x61, 0x05, 0x23, 0x3b, 0x61, 0x3c, 0x61, 0x3a, 0x61, -0x3c, 0x61, 0x3a, 0x61, 0x3d, 0x61, 0x3b, 0x61, 0x3f, 0x4d, 0xab, 0x6f, -0xde, 0x08, 0x02, 0x23, 0x1e, 0x40, 0x04, 0x23, 0x33, 0x43, 0x3b, 0x61, -0x05, 0x23, 0x33, 0x43, 0x3b, 0x61, 0xab, 0x6f, 0x9e, 0x08, 0x02, 0x23, +0x1b, 0x6a, 0xc0, 0x46, 0x40, 0x93, 0x01, 0x23, 0x9b, 0x07, 0x03, 0x43, +0x1b, 0x68, 0xcc, 0x00, 0x6e, 0x46, 0x33, 0x51, +0x01, 0x23, 0x9b, 0x07, 0x06, 0x1d, 0x33, 0x43, 0x1b, 0x68, 0x6c, 0x44, +0x63, 0x60, 0x08, 0x30, 0x01, 0x31, 0x40, 0x9b, 0x83, 0x42, 0x00, 0xd8, +0x3f, 0x48, 0x03, 0x03, 0x1b, 0x0b, 0xab, 0x42, 0xe7, 0xd1, 0x00, 0x20, +0x01, 0x23, 0x1b, 0x03, 0x13, 0x40, 0x3c, 0x4c, 0x03, 0xd0, 0x63, 0x6a, +0x01, 0x33, 0x63, 0x62, 0x09, 0xe0, 0x13, 0x0b, 0x03, 0xd3, 0x23, 0x6a, +0x01, 0x33, 0x23, 0x62, 0x03, 0xe0, 0x37, 0x4b, 0x5c, 0x6d, 0x01, 0x34, +0x5c, 0x65, 0x00, 0x29, 0x09, 0xd0, 0x03, 0x1c, 0xdc, 0x00, 0x23, 0x1c, +0x6b, 0x44, 0x5c, 0x68, 0x01, 0x30, 0x23, 0x0d, 0x01, 0xd2, 0x88, 0x42, +0xf5, 0xd1, 0x30, 0x4c, 0x25, 0x68, 0x6b, 0x0c, 0x05, 0xd2, 0x23, 0x68, +0x1b, 0x0c, 0x08, 0xd1, 0x24, 0x68, 0xa3, 0x0a, 0x05, 0xd3, 0x20, 0x24, +0x2b, 0x4b, 0xc0, 0x46, 0x5c, 0x62, 0x00, 0x24, 0x5c, 0x62, 0x25, 0x4b, +0x23, 0x4c, 0x51, 0x26, 0xb6, 0x03, 0x23, 0x67, 0x33, 0x61, 0x3d, 0x6a, +0xc0, 0x46, 0x75, 0x61, 0x02, 0x25, 0xa1, 0x26, 0x76, 0x03, 0x75, 0x60, +0x01, 0x25, 0xb5, 0x60, 0xe6, 0x1d, 0xb9, 0x36, 0x35, 0x71, 0x88, 0x42, +0x21, 0xd0, 0x25, 0x1c, 0xc3, 0x00, 0x6c, 0x46, 0xe4, 0x58, 0x2e, 0x6f, +0x6b, 0x44, 0x34, 0x60, 0x5b, 0x68, 0x2c, 0x6f, 0xc0, 0x46, 0x63, 0x60, +0x2b, 0x6f, 0x08, 0x33, 0x2b, 0x67, 0x3c, 0x6a, 0xa3, 0x42, 0x02, 0xd3, +0x12, 0x4b, 0xc0, 0x46, 0x2b, 0x67, 0x03, 0x1c, 0xdb, 0x00, 0x6b, 0x44, +0x5c, 0x68, 0x01, 0x30, 0x23, 0x0d, 0x04, 0xd3, 0x51, 0x24, 0xa4, 0x03, +0x2b, 0x6f, 0xc0, 0x46, 0xa3, 0x61, 0x88, 0x42, 0xde, 0xd1, 0x10, 0x0b, +0x03, 0xd3, 0x0e, 0x49, 0x01, 0x20, 0xfc, 0xf7, 0xc2, 0xfb, 0x41, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, +0x00, 0x01, 0x14, 0x40, 0x00, 0x40, 0x14, 0x40, 0x00, 0x00, 0x20, 0x40, +0x68, 0x0e, 0x00, 0x80, 0x24, 0xa7, 0x20, 0x40, 0xa4, 0x2a, 0x00, 0x80, +0xa0, 0x82, 0x20, 0x40, 0x00, 0x00, 0x10, 0x40, 0xc0, 0x00, 0x18, 0x00, +0xb5, 0x4f, 0xff, 0xff, 0xf0, 0xb4, 0x00, 0x21, 0x00, 0x23, 0x07, 0x22, +0x06, 0x24, 0x47, 0x4f, 0xc0, 0x46, 0x3c, 0x61, 0x3a, 0x61, 0x01, 0x33, +0x20, 0x2b, 0xf9, 0xd3, 0x04, 0x25, 0x3d, 0x61, 0x05, 0x23, 0x3b, 0x61, +0x3c, 0x61, 0x3a, 0x61, 0x3c, 0x61, 0x3a, 0x61, 0x3d, 0x61, 0x3b, 0x61, +0x3f, 0x4d, 0xab, 0x6f, 0xde, 0x08, 0x02, 0x23, 0x1e, 0x40, 0x04, 0x23, +0x33, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x33, 0x43, 0x3b, 0x61, 0xab, 0x6f, +0x9e, 0x08, 0x02, 0x23, 0x1e, 0x40, 0x04, 0x23, 0x33, 0x43, 0x3b, 0x61, +0x05, 0x23, 0x33, 0x43, 0x3b, 0x61, 0xab, 0x6f, 0x5e, 0x08, 0x02, 0x23, 0x1e, 0x40, 0x04, 0x23, 0x33, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x33, 0x43, -0x3b, 0x61, 0xab, 0x6f, 0x5e, 0x08, 0x02, 0x23, 0x1e, 0x40, 0x04, 0x23, -0x33, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x33, 0x43, 0x3b, 0x61, 0x02, 0x23, -0xae, 0x6f, 0x1e, 0x40, 0x04, 0x23, 0x33, 0x43, 0x3b, 0x61, 0x05, 0x23, -0x33, 0x43, 0x3b, 0x61, 0xab, 0x6f, 0x5d, 0x00, 0x02, 0x23, 0x1d, 0x40, -0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, -0xc5, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, -0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x85, 0x08, 0x02, 0x23, 0x1d, 0x40, -0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, +0x3b, 0x61, 0x02, 0x23, 0xae, 0x6f, 0x1e, 0x40, 0x04, 0x23, 0x33, 0x43, +0x3b, 0x61, 0x05, 0x23, 0x33, 0x43, 0x3b, 0x61, 0xab, 0x6f, 0x5d, 0x00, +0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, +0x2b, 0x43, 0x3b, 0x61, 0xc5, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, +0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x85, 0x08, +0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x45, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x02, 0x25, -0x05, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x2b, 0x43, -0x3b, 0x61, 0x40, 0x00, 0x02, 0x23, 0x18, 0x40, 0x04, 0x23, 0x03, 0x43, -0x3b, 0x61, 0x05, 0x23, 0x18, 0x43, 0x38, 0x61, 0x00, 0x25, 0x3d, 0x61, -0x01, 0x23, 0x3b, 0x61, 0x3d, 0x61, 0x3b, 0x61, 0x00, 0x20, 0x3d, 0x61, -0x0d, 0x4b, 0x1b, 0x69, 0x49, 0x00, 0x1e, 0x1c, 0x02, 0x23, 0x33, 0x40, -0x19, 0x43, 0x01, 0x23, 0x3b, 0x61, 0x01, 0x30, 0x10, 0x28, 0xf2, 0xd3, -0x02, 0x20, 0x38, 0x61, 0x03, 0x20, 0x38, 0x61, 0x3c, 0x61, 0x3a, 0x61, -0x3c, 0x61, 0x3a, 0x61, 0x38, 0x61, 0x48, 0x08, 0xf0, 0xbc, 0x70, 0x47, -0x80, 0x00, 0x14, 0x00, 0xe8, 0x0d, 0x00, 0x80, 0x80, 0x00, 0x14, 0x40, -0xf0, 0xb4, 0x00, 0x24, 0x07, 0x23, 0x06, 0x27, 0x44, 0x4a, 0xc0, 0x46, -0x17, 0x61, 0x13, 0x61, 0x01, 0x34, 0x20, 0x2c, 0xf9, 0xd3, 0x04, 0x26, -0x16, 0x61, 0x05, 0x24, 0x14, 0x61, 0x17, 0x61, 0x07, 0x23, 0x13, 0x61, -0x16, 0x61, 0x14, 0x61, 0x17, 0x61, 0x13, 0x61, 0x3c, 0x4b, 0x9b, 0x6f, -0xdd, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, -0x25, 0x43, 0x15, 0x61, 0x37, 0x4b, 0x9b, 0x6f, 0x9d, 0x08, 0x02, 0x23, +0x05, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x3b, 0x61, +0x05, 0x23, 0x2b, 0x43, 0x3b, 0x61, 0x40, 0x00, 0x02, 0x23, 0x18, 0x40, +0x04, 0x23, 0x03, 0x43, 0x3b, 0x61, 0x05, 0x23, 0x18, 0x43, 0x38, 0x61, +0x00, 0x25, 0x3d, 0x61, 0x01, 0x23, 0x3b, 0x61, 0x3d, 0x61, 0x3b, 0x61, +0x00, 0x20, 0x3d, 0x61, 0x0d, 0x4b, 0x1b, 0x69, 0x49, 0x00, 0x1e, 0x1c, +0x02, 0x23, 0x33, 0x40, 0x19, 0x43, 0x01, 0x23, 0x3b, 0x61, 0x01, 0x30, +0x10, 0x28, 0xf2, 0xd3, 0x02, 0x20, 0x38, 0x61, 0x03, 0x20, 0x38, 0x61, +0x3c, 0x61, 0x3a, 0x61, 0x3c, 0x61, 0x3a, 0x61, 0x38, 0x61, 0x48, 0x08, +0xf0, 0xbc, 0x70, 0x47, 0x80, 0x00, 0x14, 0x00, 0x68, 0x0e, 0x00, 0x80, +0x80, 0x00, 0x14, 0x40, 0xf0, 0xb4, 0x00, 0x24, 0x07, 0x23, 0x06, 0x27, +0x44, 0x4a, 0xc0, 0x46, 0x17, 0x61, 0x13, 0x61, 0x01, 0x34, 0x20, 0x2c, +0xf9, 0xd3, 0x04, 0x26, 0x16, 0x61, 0x05, 0x24, 0x14, 0x61, 0x17, 0x61, +0x07, 0x23, 0x13, 0x61, 0x16, 0x61, 0x14, 0x61, 0x17, 0x61, 0x13, 0x61, +0x3c, 0x4b, 0x9b, 0x6f, 0xdd, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, +0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x37, 0x4b, 0x9b, 0x6f, +0x9d, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, +0x25, 0x43, 0x15, 0x61, 0x32, 0x4b, 0x9b, 0x6f, 0x5d, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, -0x32, 0x4b, 0x9b, 0x6f, 0x5d, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, -0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x2d, 0x4b, 0x9d, 0x6f, +0x2d, 0x4b, 0x9d, 0x6f, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, +0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x29, 0x4b, 0x9b, 0x6f, 0x5d, 0x00, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, -0x15, 0x61, 0x29, 0x4b, 0x9b, 0x6f, 0x5d, 0x00, 0x02, 0x23, 0x1d, 0x40, -0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0xc5, 0x08, +0x15, 0x61, 0xc5, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, +0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x85, 0x08, 0x02, 0x23, 0x1d, 0x40, +0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x45, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, -0x15, 0x61, 0x85, 0x08, 0x02, 0x23, 0x1d, 0x40, 0x2b, 0x1c, 0x33, 0x43, -0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x45, 0x08, 0x02, 0x23, 0x1d, 0x40, -0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, 0x02, 0x25, -0x05, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, 0x25, 0x43, 0x15, 0x61, -0x40, 0x00, 0x02, 0x23, 0x18, 0x40, 0x03, 0x1c, 0x33, 0x43, 0x13, 0x61, -0x20, 0x43, 0x10, 0x61, 0x17, 0x61, 0x07, 0x23, 0x13, 0x61, 0x16, 0x61, -0x14, 0x61, 0x4c, 0x00, 0x00, 0x20, 0x0f, 0x21, 0x25, 0x1c, 0xcd, 0x40, -0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, 0x13, 0x61, 0x05, 0x23, -0x2b, 0x43, 0x13, 0x61, 0x01, 0x30, 0x01, 0x39, 0x10, 0x28, 0xf1, 0xd3, -0x17, 0x61, 0x07, 0x23, 0x13, 0x61, 0x17, 0x61, 0x13, 0x61, 0x03, 0x20, -0x10, 0x61, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, 0x14, 0x00, -0xe8, 0x0d, 0x00, 0x80, 0xf0, 0xb5, 0x47, 0x48, 0x01, 0x89, 0x47, 0x4d, -0x07, 0x23, 0x5b, 0x02, 0xef, 0x18, 0xb9, 0x83, 0x40, 0x8b, 0xc0, 0x46, -0xf8, 0x83, 0x28, 0x79, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0xb8, 0x83, -0xe8, 0x68, 0x01, 0x28, 0x06, 0xd1, 0x68, 0x88, 0x00, 0x28, 0x03, 0xd1, -0xf9, 0x21, 0x12, 0x20, 0xff, 0xf7, 0x54, 0xff, 0x01, 0x21, 0xc9, 0x03, -0x00, 0x20, 0xff, 0xf7, 0x4f, 0xff, 0x00, 0x24, 0x7d, 0x26, 0xf6, 0x00, -0x00, 0xe0, 0x01, 0x34, 0x00, 0x20, 0xff, 0xf7, 0xad, 0xfe, 0x00, 0x0c, -0x01, 0xd3, 0xb4, 0x42, 0xf7, 0xd3, 0x00, 0x24, -0x05, 0xe0, 0x03, 0x21, 0x09, 0x03, 0x00, 0x20, 0xff, 0xf7, 0x3c, 0xff, -0x01, 0x34, 0x00, 0x20, 0xff, 0xf7, 0x9e, 0xfe, 0x40, 0x0b, 0x01, 0xd2, -0xb4, 0x42, 0xf2, 0xd3, 0x04, 0x20, 0xff, 0xf7, 0x97, 0xfe, 0xff, 0x23, -0xe1, 0x33, 0x98, 0x43, 0x01, 0x21, 0x01, 0x43, 0xb8, 0x8b, 0xff, 0x23, -0x01, 0x33, 0x98, 0x42, 0x03, 0xd1, 0x2f, 0x23, 0x5b, 0x01, 0x19, 0x43, -0x16, 0xe0, 0x01, 0x28, 0x09, 0xd1, 0xf8, 0x8b, 0x01, 0x28, 0x03, 0xd1, -0x23, 0x23, 0x5b, 0x01, 0x19, 0x43, 0x0d, 0xe0, 0x20, 0x23, 0x19, 0x43, -0x0a, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0xf8, 0x8b, 0x01, 0x28, 0x03, 0xd1, -0x0b, 0x23, 0xdb, 0x01, 0x19, 0x43, 0x01, 0xe0, 0x80, 0x23, 0x19, 0x43, -0x04, 0x20, 0xff, 0xf7, 0x09, 0xff, 0x09, 0x21, 0x49, 0x02, 0x00, 0x20, -0xff, 0xf7, 0x04, 0xff, 0xe8, 0x68, 0x00, 0x28, 0x0c, 0xd1, 0x00, 0x21, -0x1b, 0x20, 0xff, 0xf7, 0xfd, 0xfe, 0x1a, 0x20, 0xff, 0xf7, 0x60, 0xfe, -0x01, 0x21, 0xc9, 0x03, 0x01, 0x43, 0x1a, 0x20, 0xff, 0xf7, 0xf4, 0xfe, -0x00, 0x27, 0x03, 0xe0, 0x08, 0x2f, 0x01, 0xd3, 0x0f, 0x2f, 0x08, 0xd9, -0x38, 0x1c, 0xff, 0xf7, 0x51, 0xfe, 0x79, 0x00, 0x49, 0x19, 0x1b, 0x23, -0xdb, 0x01, 0xc9, 0x18, 0x08, 0x83, 0x01, 0x37, 0x20, 0x2f, 0xef, 0xd3, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x70, 0x67, 0x21, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x81, 0xb0, 0x13, 0x48, 0x01, 0x68, 0xc0, 0x46, -0x00, 0x91, 0x41, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x81, 0x68, 0xc0, 0x46, -0x00, 0x91, 0xc1, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x01, 0x69, 0xc0, 0x46, -0x00, 0x91, 0x41, 0x69, 0xc0, 0x46, 0x00, 0x91, 0x81, 0x69, 0xc0, 0x46, -0x00, 0x91, 0xc1, 0x69, 0xc0, 0x46, 0x00, 0x91, 0x01, 0x6a, 0xc0, 0x46, -0x00, 0x91, 0x41, 0x6a, 0xc0, 0x46, 0x00, 0x91, 0x81, 0x6a, 0xc0, 0x46, -0x00, 0x91, 0xc0, 0x6a, 0xc0, 0x46, 0x00, 0x90, 0x01, 0xb0, 0x70, 0x47, -0x00, 0x08, 0x14, 0x40, 0xf0, 0xb5, 0x83, 0xb0, 0x66, 0x4e, 0x1b, 0x23, -0xdb, 0x01, 0xf7, 0x18, 0x78, 0x8b, 0x04, 0x22, 0x02, 0x40, 0x02, 0x92, -0x07, 0x23, 0x5b, 0x02, 0xf4, 0x18, 0xa0, 0x8b, 0xc0, 0x46, 0x01, 0x90, -0xe0, 0x8b, 0xc0, 0x46, 0x00, 0x90, 0x00, 0x25, 0x03, 0xe0, 0x08, 0x2d, -0x01, 0xd3, 0x0f, 0x2d, 0x08, 0xd9, 0x28, 0x1c, 0xff, 0xf7, 0xfa, 0xfd, -0x69, 0x00, 0x89, 0x19, 0x1b, 0x23, 0xdb, 0x01, 0xc9, 0x18, 0x08, 0x83, -0x01, 0x35, 0x20, 0x2d, 0xef, 0xd3, 0xa0, 0x69, 0x00, 0x28, 0x15, 0xd0, -0x54, 0x4e, 0x20, 0x25, 0x01, 0x3d, 0x52, 0x49, 0xa0, 0x69, 0x30, 0x40, -0x0b, 0xd0, 0x68, 0x00, 0x40, 0x18, 0x37, 0x23, 0x9b, 0x01, 0xc0, 0x18, -0x01, 0x8b, 0x28, 0x1c, 0xff, 0xf7, 0x78, 0xfe, 0xa0, 0x69, 0xb0, 0x43, -0xa0, 0x61, 0x76, 0x08, 0x00, 0x2d, 0xeb, 0xd1, 0x01, 0x20, 0xff, 0xf7, -0xd5, 0xfd, 0x01, 0x1c, 0x46, 0x48, 0xc0, 0x46, 0x79, 0x83, 0x79, 0x8b, -0xca, 0x08, 0x22, 0xd3, 0xc2, 0x68, 0x01, 0x2a, 0x10, 0xd1, 0x40, 0x88, -0x00, 0x28, 0x1c, 0xd1, 0x01, 0x98, 0x42, 0x4a, 0x00, 0x28, 0x05, 0xd0, -0x01, 0x28, 0x16, 0xd1, 0xd0, 0x8a, 0xc0, 0x08, 0x13, 0xd2, 0x0f, 0xe0, -0xd0, 0x8a, 0x00, 0x09, 0x0f, 0xd2, 0x0b, 0xe0, 0x02, 0x79, 0x00, 0x2a, -0x0b, 0xd1, 0x6d, 0x23, 0x5b, 0x01, 0xc0, 0x18, 0x02, 0x88, 0x40, 0x88, -0x10, 0x40, 0x40, 0x09, 0x00, 0x07, 0x02, 0xd1, 0x04, 0x23, 0x99, 0x43, -0x79, 0x83, 0x78, 0x8b, 0x04, 0x21, 0x01, 0x40, -0x02, 0x9a, 0x1f, 0xd0, 0x39, 0x8b, 0x4a, 0x0b, 0x27, 0xd3, 0x80, 0x09, -0x25, 0xd3, 0xff, 0x23, 0x01, 0x98, 0x01, 0x33, 0x98, 0x42, 0x20, 0xd0, -0x00, 0x25, 0x00, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x02, 0x01, 0x98, -0x00, 0x28, 0x02, 0xd1, 0x01, 0x23, 0x5b, 0x03, 0x1d, 0x43, 0xa9, 0x42, -0x13, 0xd0, 0x00, 0x20, 0x29, 0x1c, 0xff, 0xf7, 0x25, 0xfe, 0x3d, 0x83, -0x00, 0x20, 0xc0, 0x43, 0x20, 0x62, 0x0a, 0xe0, 0x38, 0x8b, 0x40, 0x0b, -0x07, 0xd2, 0x09, 0x21, 0x49, 0x02, 0x00, 0x20, 0xff, 0xf7, 0x18, 0xfe, -0x09, 0x20, 0x40, 0x02, 0x38, 0x83, 0x78, 0x8b, 0xc0, 0x08, 0x2d, 0xd3, -0x1b, 0x48, 0xc7, 0x6a, 0x01, 0x98, 0x00, 0x99, 0xff, 0xf7, 0x6a, 0xfc, -0xc2, 0x07, 0xd2, 0x0f, 0x18, 0x49, 0x03, 0xd0, 0x04, 0x23, 0xcd, 0x6d, -0x2b, 0x43, 0x03, 0xe0, 0x04, 0x23, 0xcd, 0x6d, 0x9d, 0x43, 0x2b, 0x1c, -0xcb, 0x65, 0x83, 0x08, 0x03, 0xd3, 0x02, 0x23, 0xcd, 0x6d, 0x2b, 0x43, -0x03, 0xe0, 0x02, 0x23, 0xcd, 0x6d, 0x9d, 0x43, 0x2b, 0x1c, 0xcb, 0x65, -0x21, 0x6a, 0x81, 0x42, 0x0c, 0xd0, 0x20, 0x62, 0x0c, 0x48, 0x00, 0x2a, -0x03, 0xd0, 0xff, 0x21, 0x21, 0x31, 0x39, 0x43, 0x03, 0xe0, 0xff, 0x23, -0x21, 0x33, 0x9f, 0x43, 0x39, 0x1c, 0xc1, 0x62, 0x03, 0xb0, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -0xa8, 0x1b, 0x00, 0x80, 0x40, 0x00, 0x14, 0x40, 0x10, 0x2a, 0x00, 0x80, -0x40, 0x00, 0x14, 0x00, 0x90, 0xb4, 0x01, 0x22, 0x20, 0x28, 0x0f, 0xd2, -0x43, 0x00, 0x0f, 0x1c, 0x07, 0x49, 0x5c, 0x18, 0x37, 0x23, 0x9b, 0x01, -0xe3, 0x18, 0x1f, 0x83, 0x82, 0x40, 0x07, 0x23, 0x5b, 0x02, 0xc9, 0x18, -0x10, 0x1c, 0x8a, 0x69, 0x10, 0x43, 0x88, 0x61, 0x90, 0xbc, 0x70, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0x0b, 0x48, 0x40, 0x69, 0x0b, 0x49, 0x49, 0x8b, -0x04, 0x22, 0x0a, 0x40, 0x0a, 0x49, 0x06, 0xd0, 0x01, 0x23, 0xdb, 0x02, -0x98, 0x43, 0x01, 0x23, 0xca, 0x6d, 0x1a, 0x43, 0x05, 0xe0, 0x01, 0x23, -0xdb, 0x02, 0x18, 0x43, 0xca, 0x6d, 0x52, 0x08, 0x52, 0x00, 0xca, 0x65, -0x70, 0x47, 0x00, 0x00, 0x80, 0x00, 0x14, 0x40, 0x68, 0x1b, 0x00, 0x80, -0x10, 0x2a, 0x00, 0x80, 0x00, 0xb5, 0x84, 0xb0, 0xff, 0xf7, 0xde, 0xff, -0x01, 0x1c, 0x05, 0x20, 0x00, 0x90, 0x00, 0x20, 0x01, 0xab, 0x18, 0x80, -0x04, 0x3b, 0x58, 0x70, 0x1b, 0x22, 0x00, 0xab, 0x5a, 0x80, 0xd9, 0x80, -0x05, 0x49, 0xc9, 0x6d, 0xc0, 0x46, 0x02, 0x91, 0x03, 0x90, 0x68, 0x46, -0x00, 0x21, 0xfc, 0xf7, 0x9d, 0xfd, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, -0x10, 0x2a, 0x00, 0x80, 0x0d, 0x48, 0x01, 0x68, 0x49, 0x0c, 0x05, 0xd2, -0x01, 0x68, 0x09, 0x0c, 0x06, 0xd1, 0x00, 0x68, 0x80, 0x0a, 0x03, 0xd3, -0x09, 0x48, 0x00, 0x68, 0x00, 0x0c, 0x01, 0xe0, 0x08, 0x48, 0x80, 0x6c, -0x00, 0x04, 0x00, 0x0c, 0x07, 0x4b, 0x98, 0x42, 0x02, 0xd0, 0x02, 0x33, -0x98, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0xfc, 0xe7, +0x15, 0x61, 0x02, 0x25, 0x05, 0x40, 0x2b, 0x1c, 0x33, 0x43, 0x13, 0x61, +0x25, 0x43, 0x15, 0x61, 0x40, 0x00, 0x02, 0x23, 0x18, 0x40, 0x03, 0x1c, +0x33, 0x43, 0x13, 0x61, 0x20, 0x43, 0x10, 0x61, 0x17, 0x61, 0x07, 0x23, +0x13, 0x61, 0x16, 0x61, 0x14, 0x61, 0x4c, 0x00, 0x00, 0x20, 0x0f, 0x21, +0x25, 0x1c, 0xcd, 0x40, 0x02, 0x23, 0x1d, 0x40, 0x04, 0x23, 0x2b, 0x43, +0x13, 0x61, 0x05, 0x23, 0x2b, 0x43, 0x13, 0x61, 0x01, 0x30, 0x01, 0x39, +0x10, 0x28, 0xf1, 0xd3, 0x17, 0x61, 0x07, 0x23, 0x13, 0x61, 0x17, 0x61, +0x13, 0x61, 0x03, 0x20, 0x10, 0x61, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, +0x80, 0x00, 0x14, 0x00, 0x68, 0x0e, 0x00, 0x80, 0xf0, 0xb5, 0x4f, 0x4d, +0x08, 0x21, 0x02, 0x20, 0x2a, 0x1c, 0xfc, 0xf7, 0x75, 0xfa, 0x4d, 0x4c, +0x71, 0x23, 0x5b, 0x01, 0xe7, 0x18, 0x38, 0x80, 0x1a, 0x21, 0x02, 0x20, +0x2a, 0x1c, 0xfc, 0xf7, 0x6b, 0xfa, 0x78, 0x80, 0x20, 0x79, 0x00, 0x28, +0x0b, 0xd0, 0x00, 0x20, 0x38, 0x80, 0xe0, 0x68, 0x01, 0x28, 0x10, 0xd1, +0x44, 0x48, 0x00, 0x68, 0x01, 0x23, 0x9b, 0x02, 0x18, 0x43, 0x99, 0x02, +0x08, 0x60, 0xe0, 0x68, 0x01, 0x28, 0x06, 0xd1, 0x60, 0x88, 0x00, 0x28, +0x03, 0xd1, 0xf9, 0x21, 0x12, 0x20, 0xff, 0xf7, 0x43, 0xff, 0x01, 0x21, +0xc9, 0x03, 0x00, 0x20, 0xff, 0xf7, 0x3e, 0xff, 0x00, 0x25, 0x7d, 0x26, +0xf6, 0x00, 0x00, 0xe0, 0x01, 0x35, 0x00, 0x20, 0xff, 0xf7, 0x9c, 0xfe, +0x00, 0x0c, 0x01, 0xd3, 0xb5, 0x42, 0xf7, 0xd3, +0x00, 0x25, 0x05, 0xe0, 0x03, 0x21, 0x09, 0x03, 0x00, 0x20, 0xff, 0xf7, +0x2b, 0xff, 0x01, 0x35, 0x00, 0x20, 0xff, 0xf7, 0x8d, 0xfe, 0x40, 0x0b, +0x01, 0xd2, 0xb5, 0x42, 0xf2, 0xd3, 0x04, 0x20, 0xff, 0xf7, 0x86, 0xfe, +0xff, 0x23, 0xe1, 0x33, 0x98, 0x43, 0x01, 0x21, 0x01, 0x43, 0x38, 0x88, +0xff, 0x23, 0x01, 0x33, 0x98, 0x42, 0x03, 0xd1, 0x2f, 0x23, 0x5b, 0x01, +0x19, 0x43, 0x16, 0xe0, 0x01, 0x28, 0x09, 0xd1, 0x78, 0x88, 0x01, 0x28, +0x03, 0xd1, 0x23, 0x23, 0x5b, 0x01, 0x19, 0x43, 0x0d, 0xe0, 0x20, 0x23, +0x19, 0x43, 0x0a, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0x78, 0x88, 0x01, 0x28, +0x03, 0xd1, 0x0b, 0x23, 0xdb, 0x01, 0x19, 0x43, 0x01, 0xe0, 0x80, 0x23, +0x19, 0x43, 0x04, 0x20, 0xff, 0xf7, 0xf8, 0xfe, 0x09, 0x21, 0x49, 0x02, +0x00, 0x20, 0xff, 0xf7, 0xf3, 0xfe, 0xe0, 0x68, 0x00, 0x28, 0x0c, 0xd1, +0x00, 0x21, 0x1b, 0x20, 0xff, 0xf7, 0xec, 0xfe, 0x1a, 0x20, 0xff, 0xf7, +0x4f, 0xfe, 0x01, 0x21, 0xc9, 0x03, 0x01, 0x43, 0x1a, 0x20, 0xff, 0xf7, +0xe3, 0xfe, 0x00, 0x27, 0x03, 0xe0, 0x08, 0x2f, 0x01, 0xd3, 0x0f, 0x2f, +0x08, 0xd9, 0x38, 0x1c, 0xff, 0xf7, 0x40, 0xfe, 0x79, 0x00, 0x09, 0x19, +0x1b, 0x23, 0xdb, 0x01, 0xc9, 0x18, 0x88, 0x83, 0x01, 0x37, 0x20, 0x2f, +0xef, 0xd3, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x79, 0xbf, 0x21, 0x40, +0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, 0x81, 0xb0, 0x13, 0x48, +0x01, 0x68, 0xc0, 0x46, 0x00, 0x91, 0x41, 0x68, 0xc0, 0x46, 0x00, 0x91, +0x81, 0x68, 0xc0, 0x46, 0x00, 0x91, 0xc1, 0x68, 0xc0, 0x46, 0x00, 0x91, +0x01, 0x69, 0xc0, 0x46, 0x00, 0x91, 0x41, 0x69, 0xc0, 0x46, 0x00, 0x91, +0x81, 0x69, 0xc0, 0x46, 0x00, 0x91, 0xc1, 0x69, 0xc0, 0x46, 0x00, 0x91, +0x01, 0x6a, 0xc0, 0x46, 0x00, 0x91, 0x41, 0x6a, 0xc0, 0x46, 0x00, 0x91, +0x81, 0x6a, 0xc0, 0x46, 0x00, 0x91, 0xc0, 0x6a, 0xc0, 0x46, 0x00, 0x90, +0x01, 0xb0, 0x70, 0x47, 0x00, 0x08, 0x14, 0x40, 0xf0, 0xb5, 0x83, 0xb0, +0x68, 0x4d, 0x1b, 0x23, 0xdb, 0x01, 0xef, 0x18, 0xf8, 0x8b, 0x04, 0x22, +0x02, 0x40, 0x02, 0x92, 0x71, 0x23, 0x5b, 0x01, 0xe8, 0x18, 0x01, 0x88, +0xc0, 0x46, 0x01, 0x91, 0x40, 0x88, 0xc0, 0x46, 0x00, 0x90, 0x00, 0x24, +0x03, 0xe0, 0x08, 0x2c, 0x01, 0xd3, 0x0f, 0x2c, 0x08, 0xd9, 0x20, 0x1c, +0xff, 0xf7, 0xe8, 0xfd, 0x61, 0x00, 0x49, 0x19, 0x1b, 0x23, 0xdb, 0x01, +0xc9, 0x18, 0x88, 0x83, 0x01, 0x34, 0x20, 0x2c, 0xef, 0xd3, 0x58, 0x4c, +0xe0, 0x69, 0x00, 0x28, 0x15, 0xd0, 0x57, 0x4e, 0x20, 0x25, 0x01, 0x3d, +0x53, 0x49, 0xe0, 0x69, 0x30, 0x40, 0x0b, 0xd0, 0x68, 0x00, 0x40, 0x18, +0x37, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0x81, 0x8b, 0x28, 0x1c, 0xff, 0xf7, +0x65, 0xfe, 0xe0, 0x69, 0xb0, 0x43, 0xe0, 0x61, 0x76, 0x08, 0x00, 0x2d, +0xeb, 0xd1, 0x01, 0x20, 0xff, 0xf7, 0xc2, 0xfd, 0x48, 0x49, 0xc0, 0x46, +0xf8, 0x83, 0xf8, 0x8b, 0xc2, 0x08, 0x25, 0xd3, 0xca, 0x68, 0x01, 0x2a, +0x13, 0xd1, 0x0a, 0x79, 0x00, 0x2a, 0x1f, 0xd1, 0x49, 0x88, 0x00, 0x29, +0x1c, 0xd1, 0x01, 0x99, 0x43, 0x4a, 0x00, 0x29, 0x05, 0xd0, 0x01, 0x29, +0x16, 0xd1, 0x51, 0x8b, 0xc9, 0x08, 0x13, 0xd2, 0x0f, 0xe0, 0x51, 0x8b, +0x09, 0x09, 0x0f, 0xd2, 0x0b, 0xe0, 0x0a, 0x79, 0x00, 0x2a, 0x0b, 0xd1, +0x6d, 0x23, 0x5b, 0x01, 0xc9, 0x18, 0x8a, 0x88, 0xc9, 0x88, 0x11, 0x40, +0x49, 0x09, 0x09, 0x07, 0x02, 0xd1, 0x04, 0x23, +0x98, 0x43, 0xf8, 0x83, 0xf8, 0x8b, 0x04, 0x21, 0x01, 0x40, 0x02, 0x9a, +0x1f, 0xd0, 0xb9, 0x8b, 0x4a, 0x0b, 0x27, 0xd3, 0x80, 0x09, 0x25, 0xd3, +0xff, 0x23, 0x01, 0x98, 0x01, 0x33, 0x98, 0x42, 0x20, 0xd0, 0x00, 0x25, +0x00, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x02, 0x01, 0x98, 0x00, 0x28, +0x02, 0xd1, 0x01, 0x23, 0x5b, 0x03, 0x1d, 0x43, 0xa9, 0x42, 0x13, 0xd0, +0x00, 0x20, 0x29, 0x1c, 0xff, 0xf7, 0x10, 0xfe, 0xbd, 0x83, 0x00, 0x20, +0xc0, 0x43, 0x60, 0x62, 0x0a, 0xe0, 0xb8, 0x8b, 0x40, 0x0b, 0x07, 0xd2, +0x09, 0x21, 0x49, 0x02, 0x00, 0x20, 0xff, 0xf7, 0x03, 0xfe, 0x09, 0x20, +0x40, 0x02, 0xb8, 0x83, 0xf8, 0x8b, 0xc0, 0x08, 0x2d, 0xd3, 0x1d, 0x48, +0xc7, 0x6a, 0x01, 0x98, 0x00, 0x99, 0xff, 0xf7, 0x51, 0xfc, 0xc2, 0x07, +0xd2, 0x0f, 0x1a, 0x49, 0x03, 0xd0, 0x04, 0x23, 0xcd, 0x6d, 0x2b, 0x43, +0x03, 0xe0, 0x04, 0x23, 0xcd, 0x6d, 0x9d, 0x43, 0x2b, 0x1c, 0xcb, 0x65, +0x83, 0x08, 0x03, 0xd3, 0x02, 0x23, 0xcd, 0x6d, 0x2b, 0x43, 0x03, 0xe0, +0x02, 0x23, 0xcd, 0x6d, 0x9d, 0x43, 0x2b, 0x1c, 0xcb, 0x65, 0x61, 0x6a, +0x81, 0x42, 0x0c, 0xd0, 0x60, 0x62, 0x0e, 0x48, 0x00, 0x2a, 0x03, 0xd0, +0xff, 0x21, 0x21, 0x31, 0x39, 0x43, 0x03, 0xe0, 0xff, 0x23, 0x21, 0x33, +0x9f, 0x43, 0x39, 0x1c, 0xc1, 0x62, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x68, 0x1c, 0x00, 0x80, +0x00, 0x00, 0x00, 0x80, 0x28, 0x1c, 0x00, 0x80, 0x40, 0x00, 0x14, 0x40, +0xa4, 0x2a, 0x00, 0x80, 0x40, 0x00, 0x14, 0x00, 0x90, 0xb4, 0x01, 0x22, +0x20, 0x28, 0x0f, 0xd2, 0x43, 0x00, 0x0f, 0x1c, 0x07, 0x49, 0x5c, 0x18, +0x37, 0x23, 0x9b, 0x01, 0xe3, 0x18, 0x9f, 0x83, 0x82, 0x40, 0x07, 0x23, +0x5b, 0x02, 0xc9, 0x18, 0x10, 0x1c, 0xca, 0x69, 0x10, 0x43, 0xc8, 0x61, +0x90, 0xbc, 0x70, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x0b, 0x48, 0x40, 0x69, +0x0b, 0x49, 0xc9, 0x8b, 0x04, 0x22, 0x0a, 0x40, 0x0a, 0x49, 0x06, 0xd0, +0x01, 0x23, 0xdb, 0x02, 0x98, 0x43, 0x01, 0x23, 0xca, 0x6d, 0x1a, 0x43, +0x05, 0xe0, 0x01, 0x23, 0xdb, 0x02, 0x18, 0x43, 0xca, 0x6d, 0x52, 0x08, +0x52, 0x00, 0xca, 0x65, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, 0x14, 0x40, +0xe8, 0x1b, 0x00, 0x80, 0xa4, 0x2a, 0x00, 0x80, 0x00, 0xb5, 0x84, 0xb0, +0xff, 0xf7, 0xde, 0xff, 0x01, 0x1c, 0x05, 0x20, 0x00, 0x90, 0x00, 0x20, +0x01, 0xab, 0x18, 0x80, 0x04, 0x3b, 0x58, 0x70, 0x1b, 0x22, 0x00, 0xab, +0x5a, 0x80, 0xd9, 0x80, 0x05, 0x49, 0xc9, 0x6d, 0xc0, 0x46, 0x02, 0x91, +0x03, 0x90, 0x68, 0x46, 0x00, 0x21, 0xfc, 0xf7, 0xd5, 0xf9, 0x04, 0xb0, +0x08, 0xbc, 0x18, 0x47, 0xa4, 0x2a, 0x00, 0x80, 0x0f, 0x48, 0x01, 0x68, +0x49, 0x0c, 0x05, 0xd2, 0x01, 0x68, 0x09, 0x0c, 0x06, 0xd1, 0x00, 0x68, +0x80, 0x0a, 0x03, 0xd3, 0x0b, 0x48, 0x00, 0x68, 0x00, 0x0c, 0x01, 0xe0, +0x0a, 0x48, 0x80, 0x6c, 0x00, 0x04, 0x00, 0x0c, 0x09, 0x4b, 0x98, 0x42, +0x05, 0xd0, 0x02, 0x33, 0x98, 0x42, 0x02, 0xd0, 0x07, 0x4b, 0x98, 0x42, +0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0xfc, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, -0x04, 0x99, 0x00, 0x00, 0x90, 0xb4, 0x01, 0x24, 0x21, 0x1c, 0x17, 0x48, -0x02, 0x68, 0x52, 0x0c, 0x06, 0xd2, 0x02, 0x68, 0x12, 0x0c, 0x02, 0xd1, -0x00, 0x68, 0x80, 0x0a, 0x00, 0xd2, 0x00, 0x21, 0x09, 0x06, 0x09, 0x0e, -0x11, 0x4f, 0x12, 0x4a, 0x02, 0xd0, 0x38, 0x68, 0x00, 0x0c, 0x00, 0xe0, -0x90, 0x6c, 0x00, 0x04, 0x00, 0x0c, 0x0f, 0x4b, -0x98, 0x42, 0x05, 0xd0, 0x02, 0x33, 0x98, 0x42, 0x02, 0xd0, 0x0d, 0x4b, -0x98, 0x42, 0x0c, 0xd1, 0x00, 0x29, 0x02, 0xd0, 0xf8, 0x6a, 0x00, 0x0c, -0x00, 0xe0, 0xd0, 0x6c, 0x40, 0x0a, 0x00, 0xd2, 0x00, 0x24, 0x20, 0x06, -0x00, 0x0e, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, -0x04, 0x99, 0x00, 0x00, 0x05, 0x99, 0x00, 0x00, 0x0c, 0x48, 0x01, 0x68, -0x49, 0x0c, 0x05, 0xd2, 0x01, 0x68, 0x09, 0x0c, 0x05, 0xd1, 0x00, 0x68, -0x80, 0x0a, 0x02, 0xd3, 0x08, 0x48, 0x80, 0x68, 0x01, 0xe0, 0x08, 0x48, -0x40, 0x6c, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x03, 0x28, 0x03, 0xd0, -0x40, 0x08, 0x01, 0xd3, 0x01, 0x20, 0x70, 0x47, 0x08, 0x1c, 0xfc, 0xe7, -0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, -0xf0, 0xb5, 0x01, 0x27, 0x1a, 0x4c, 0x25, 0x68, 0xff, 0xf7, 0x7a, 0xff, -0x03, 0x1c, 0x19, 0x4a, 0x02, 0x21, 0x01, 0x26, 0x18, 0x48, 0x01, 0x2b, -0x1b, 0xd1, 0xcb, 0x04, 0x1e, 0x60, 0x55, 0x23, 0x03, 0x60, 0x00, 0x23, -0x43, 0x60, 0x06, 0x68, 0x55, 0x2e, 0x1b, 0xd1, 0xaa, 0x26, 0x06, 0x60, -0x43, 0x60, 0x03, 0x68, 0xaa, 0x2b, 0x15, 0xd1, 0x09, 0x23, 0x03, 0x60, -0x05, 0x23, 0x0f, 0x4f, 0xc0, 0x46, 0x3b, 0x60, 0x03, 0x23, 0x0e, 0x4f, -0xc0, 0x46, 0x3b, 0x60, 0x11, 0x60, 0x07, 0x68, 0x08, 0xe0, 0x08, 0x23, -0x23, 0x60, 0x04, 0x23, 0x0a, 0x4f, 0xc0, 0x46, 0x3b, 0x60, 0x11, 0x60, -0x06, 0x60, 0x27, 0x68, 0xc0, 0x46, 0x25, 0x60, 0x38, 0x1c, 0xf0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x24, 0x40, -0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x2a, 0x40, 0x00, 0x00, 0x26, 0x40, -0x00, 0x00, 0x28, 0x40, 0x80, 0xb5, 0x07, 0x1c, 0xff, 0xf7, 0x38, 0xff, -0x01, 0x28, 0x05, 0xd1, 0x19, 0x48, 0x00, 0x68, 0x19, 0x49, 0x49, 0x6b, -0x08, 0x40, 0x22, 0xe0, 0x18, 0x48, 0x01, 0x68, 0x49, 0x0c, 0x05, 0xd2, -0x01, 0x68, 0x09, 0x0c, 0x06, 0xd1, 0x00, 0x68, 0x80, 0x0a, 0x03, 0xd3, -0x14, 0x48, 0x00, 0x68, 0x00, 0x0c, 0x01, 0xe0, 0x13, 0x48, 0x80, 0x6c, -0x00, 0x04, 0x00, 0x0c, 0x12, 0x4b, 0xc0, 0x18, 0x08, 0x28, 0x0b, 0xd2, -0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x05, 0x03, 0x07, 0x03, -0x07, 0x07, 0x05, 0x03, 0x03, 0x20, 0x02, 0xe0, 0x01, 0x20, 0x00, 0xe0, -0x00, 0x20, 0x01, 0x21, 0x38, 0x60, 0x80, 0x07, 0x00, 0xd1, 0x00, 0x21, -0x08, 0x06, 0x00, 0x0e, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x98, 0x6e, 0x21, 0x40, 0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x10, 0x40, -0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x66, 0xff, 0xff, -0xf0, 0xb5, 0x83, 0xb0, 0x07, 0x1c, 0x01, 0x20, 0x02, 0x90, 0x01, 0x25, -0x02, 0x24, 0x10, 0x26, 0x20, 0x21, 0x00, 0x91, 0xff, 0xf7, 0xea, 0xfe, -0x01, 0x28, 0x4d, 0xd1, 0x38, 0x2f, 0x01, 0xd0, 0xa8, 0x2f, 0x3a, 0xd1, -0x2e, 0x4e, 0x3c, 0x21, 0x02, 0x20, 0x32, 0x1c, 0xfc, 0xf7, 0x1c, 0xfb, -0x3e, 0x21, 0x05, 0x1c, 0x02, 0x20, 0x32, 0x1c, 0xfc, 0xf7, 0x16, 0xfb, -0x00, 0x04, 0x05, 0x43, 0x40, 0x21, 0x02, 0x20, 0x32, 0x1c, 0xfc, 0xf7, -0x0f, 0xfb, 0x01, 0x90, 0x42, 0x21, 0x02, 0x20, 0x32, 0x1c, 0xfc, 0xf7, -0x09, 0xfb, 0x00, 0x04, 0x01, 0x99, 0x08, 0x43, 0x06, 0x1c, 0xa8, 0x2f, -0x1b, 0xd1, 0x1f, 0x4a, 0x44, 0x21, 0x02, 0x20, -0xfc, 0xf7, 0xfe, 0xfa, 0x04, 0x1c, 0x1c, 0x4a, 0x46, 0x21, 0x02, 0x20, -0xfc, 0xf7, 0xf8, 0xfa, 0x00, 0x04, 0x04, 0x43, 0x18, 0x4a, 0x48, 0x21, -0x02, 0x20, 0xfc, 0xf7, 0xf1, 0xfa, 0x00, 0x90, 0x15, 0x4a, 0x4a, 0x21, -0x02, 0x20, 0xfc, 0xf7, 0xeb, 0xfa, 0x00, 0x04, 0x00, 0x99, 0x01, 0x43, -0x00, 0x91, 0x28, 0x1c, 0x30, 0x43, 0x20, 0x43, 0x00, 0x99, 0x08, 0x43, -0x00, 0xd1, 0x16, 0xe0, 0x11, 0x20, 0x00, 0x04, 0x05, 0x62, 0x46, 0x62, -0x84, 0x62, 0x00, 0x99, 0xc0, 0x46, 0xc1, 0x62, 0x00, 0x21, 0x0a, 0x48, -0xc0, 0x46, 0x01, 0x60, 0x38, 0x2f, 0x01, 0xd0, 0xa8, 0x2f, 0x05, 0xd1, -0x01, 0x21, 0x01, 0x60, 0xa8, 0x2f, 0x01, 0xd1, 0x03, 0x21, 0x01, 0x60, -0x02, 0x98, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x39, 0xb7, 0x21, 0x40, 0x98, 0x6e, 0x21, 0x40, 0x80, 0xb5, 0x07, 0x1c, -0xff, 0xf7, 0x7e, 0xfe, 0x01, 0x28, 0x19, 0xd1, 0x01, 0x05, 0x11, 0x48, -0x00, 0x2f, 0x18, 0xd0, 0x0b, 0x0a, 0x02, 0x68, 0x9a, 0x43, 0x0a, 0x60, -0x01, 0x68, 0x49, 0x0c, 0x05, 0xd2, 0x01, 0x68, 0x09, 0x0c, 0x0b, 0xd1, -0x00, 0x68, 0x80, 0x0a, 0x08, 0xd3, 0x0a, 0x48, 0x40, 0x6a, 0xff, 0x22, -0x01, 0x32, 0x02, 0x43, 0x08, 0x49, 0xc0, 0x46, 0x4a, 0x62, 0x48, 0x62, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x68, 0x01, 0x23, 0x1b, 0x03, -0x18, 0x43, 0x08, 0x60, 0xf6, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, -0xc0, 0x00, 0x18, 0x40, 0xc0, 0x00, 0x18, 0x00, 0x70, 0x47, 0x00, 0x00, +0x04, 0x99, 0x00, 0x00, 0x07, 0x99, 0x00, 0x00, 0x90, 0xb4, 0x01, 0x24, +0x21, 0x1c, 0x18, 0x48, 0x02, 0x68, 0x52, 0x0c, 0x06, 0xd2, 0x02, 0x68, +0x12, 0x0c, 0x02, 0xd1, 0x00, 0x68, 0x80, 0x0a, +0x00, 0xd2, 0x00, 0x21, 0x09, 0x06, 0x09, 0x0e, 0x12, 0x4f, 0x13, 0x4a, +0x02, 0xd0, 0x38, 0x68, 0x00, 0x0c, 0x00, 0xe0, 0x90, 0x6c, 0x00, 0x04, +0x00, 0x0c, 0x10, 0x4b, 0x98, 0x42, 0x08, 0xd0, 0x02, 0x33, 0x98, 0x42, +0x05, 0xd0, 0x0e, 0x4b, 0x98, 0x42, 0x02, 0xd0, 0x02, 0x3b, 0x98, 0x42, +0x0c, 0xd1, 0x00, 0x29, 0x02, 0xd0, 0xf8, 0x6a, 0x00, 0x0c, 0x00, 0xe0, +0xd0, 0x6c, 0x40, 0x0a, 0x00, 0xd2, 0x00, 0x24, 0x20, 0x06, 0x00, 0x0e, +0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, 0x00, 0x00, 0x10, 0x40, +0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, 0x04, 0x99, 0x00, 0x00, +0x07, 0x99, 0x00, 0x00, 0x0c, 0x48, 0x01, 0x68, 0x49, 0x0c, 0x05, 0xd2, +0x01, 0x68, 0x09, 0x0c, 0x05, 0xd1, 0x00, 0x68, 0x80, 0x0a, 0x02, 0xd3, +0x08, 0x48, 0x80, 0x68, 0x01, 0xe0, 0x08, 0x48, 0x40, 0x6c, 0x00, 0x04, +0x00, 0x0c, 0x00, 0x21, 0x03, 0x28, 0x03, 0xd0, 0x40, 0x08, 0x01, 0xd3, +0x01, 0x20, 0x70, 0x47, 0x08, 0x1c, 0xfc, 0xe7, 0x00, 0x00, 0x10, 0x40, +0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xb5, 0x01, 0x27, +0x1a, 0x4c, 0x25, 0x68, 0xff, 0xf7, 0x72, 0xff, 0x03, 0x1c, 0x19, 0x4a, +0x02, 0x21, 0x01, 0x26, 0x18, 0x48, 0x01, 0x2b, 0x1b, 0xd1, 0xcb, 0x04, +0x1e, 0x60, 0x55, 0x23, 0x03, 0x60, 0x00, 0x23, 0x43, 0x60, 0x06, 0x68, +0x55, 0x2e, 0x1b, 0xd1, 0xaa, 0x26, 0x06, 0x60, 0x43, 0x60, 0x03, 0x68, +0xaa, 0x2b, 0x15, 0xd1, 0x09, 0x23, 0x03, 0x60, 0x05, 0x23, 0x0f, 0x4f, +0xc0, 0x46, 0x3b, 0x60, 0x03, 0x23, 0x0e, 0x4f, 0xc0, 0x46, 0x3b, 0x60, +0x11, 0x60, 0x07, 0x68, 0x08, 0xe0, 0x08, 0x23, 0x23, 0x60, 0x04, 0x23, +0x0a, 0x4f, 0xc0, 0x46, 0x3b, 0x60, 0x11, 0x60, 0x06, 0x60, 0x27, 0x68, +0xc0, 0x46, 0x25, 0x60, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x22, 0x40, +0x00, 0x00, 0x2a, 0x40, 0x00, 0x00, 0x26, 0x40, 0x00, 0x00, 0x28, 0x40, +0x80, 0xb5, 0x07, 0x1c, 0xff, 0xf7, 0x30, 0xff, 0x01, 0x28, 0x05, 0xd1, +0x19, 0x48, 0x00, 0x68, 0x19, 0x49, 0x49, 0x6b, 0x08, 0x40, 0x22, 0xe0, +0x18, 0x48, 0x01, 0x68, 0x49, 0x0c, 0x05, 0xd2, 0x01, 0x68, 0x09, 0x0c, +0x06, 0xd1, 0x00, 0x68, 0x80, 0x0a, 0x03, 0xd3, 0x14, 0x48, 0x00, 0x68, +0x00, 0x0c, 0x01, 0xe0, 0x13, 0x48, 0x80, 0x6c, 0x00, 0x04, 0x00, 0x0c, +0x12, 0x4b, 0xc0, 0x18, 0x08, 0x28, 0x0b, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, +0x5b, 0x00, 0x9f, 0x44, 0x05, 0x03, 0x07, 0x03, 0x07, 0x07, 0x05, 0x03, +0x03, 0x20, 0x02, 0xe0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, 0x21, +0x38, 0x60, 0x80, 0x07, 0x00, 0xd1, 0x00, 0x21, 0x08, 0x06, 0x00, 0x0e, +0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x98, 0x6e, 0x21, 0x40, +0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x18, 0x40, +0x00, 0x00, 0x00, 0x80, 0xfe, 0x66, 0xff, 0xff, 0xf0, 0xb5, 0x83, 0xb0, +0x07, 0x1c, 0x01, 0x20, 0x02, 0x90, 0x01, 0x25, 0x02, 0x24, 0x10, 0x26, +0x20, 0x21, 0x00, 0x91, 0xff, 0xf7, 0xe2, 0xfe, 0x01, 0x28, 0x4d, 0xd1, +0x38, 0x2f, 0x01, 0xd0, 0xa8, 0x2f, 0x3a, 0xd1, 0x2e, 0x4e, 0x3c, 0x21, +0x02, 0x20, 0x32, 0x1c, 0xfb, 0xf7, 0x4c, 0xff, 0x3e, 0x21, 0x05, 0x1c, +0x02, 0x20, 0x32, 0x1c, 0xfb, 0xf7, 0x46, 0xff, 0x00, 0x04, 0x05, 0x43, +0x40, 0x21, 0x02, 0x20, 0x32, 0x1c, 0xfb, 0xf7, +0x3f, 0xff, 0x01, 0x90, 0x42, 0x21, 0x02, 0x20, 0x32, 0x1c, 0xfb, 0xf7, +0x39, 0xff, 0x00, 0x04, 0x01, 0x99, 0x08, 0x43, 0x06, 0x1c, 0xa8, 0x2f, +0x1b, 0xd1, 0x1f, 0x4a, 0x44, 0x21, 0x02, 0x20, 0xfb, 0xf7, 0x2e, 0xff, +0x04, 0x1c, 0x1c, 0x4a, 0x46, 0x21, 0x02, 0x20, 0xfb, 0xf7, 0x28, 0xff, +0x00, 0x04, 0x04, 0x43, 0x18, 0x4a, 0x48, 0x21, 0x02, 0x20, 0xfb, 0xf7, +0x21, 0xff, 0x00, 0x90, 0x15, 0x4a, 0x4a, 0x21, 0x02, 0x20, 0xfb, 0xf7, +0x1b, 0xff, 0x00, 0x04, 0x00, 0x99, 0x01, 0x43, 0x00, 0x91, 0x28, 0x1c, +0x30, 0x43, 0x20, 0x43, 0x00, 0x99, 0x08, 0x43, 0x00, 0xd1, 0x16, 0xe0, +0x11, 0x20, 0x00, 0x04, 0x05, 0x62, 0x46, 0x62, 0x84, 0x62, 0x00, 0x99, +0xc0, 0x46, 0xc1, 0x62, 0x00, 0x21, 0x0a, 0x48, 0xc0, 0x46, 0x01, 0x60, +0x38, 0x2f, 0x01, 0xd0, 0xa8, 0x2f, 0x05, 0xd1, 0x01, 0x21, 0x01, 0x60, +0xa8, 0x2f, 0x01, 0xd1, 0x03, 0x21, 0x01, 0x60, 0x02, 0x98, 0x03, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x79, 0xbf, 0x21, 0x40, +0x98, 0x6e, 0x21, 0x40, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x12, 0x4c, 0x21, 0x68, 0x12, 0x48, 0x81, 0x42, -0x0b, 0xd0, 0x00, 0x23, 0x21, 0x1c, 0xe2, 0x1d, 0x6d, 0x32, 0x00, 0xe0, -0x08, 0xc1, 0x91, 0x42, 0xfc, 0xd3, 0x20, 0x60, 0x74, 0x20, 0xa0, 0x80, +0x0b, 0xd0, 0x00, 0x23, 0x21, 0x1c, 0xe2, 0x1d, 0xc5, 0x32, 0x00, 0xe0, +0x08, 0xc1, 0x91, 0x42, 0xfc, 0xd3, 0x20, 0x60, 0xcc, 0x20, 0xa0, 0x80, 0x67, 0x72, 0x38, 0x01, 0x00, 0xf0, 0x18, 0xf8, 0x27, 0x72, 0x0a, 0x48, -0xc0, 0x46, 0xe0, 0x60, 0x08, 0x2f, 0x00, 0xdb, 0x00, 0x27, 0xe0, 0x19, +0xc0, 0x46, 0xe0, 0x60, 0x09, 0x2f, 0x00, 0xdb, 0x00, 0x27, 0xe0, 0x19, 0x01, 0x7d, 0x01, 0x31, 0x01, 0x75, 0xe0, 0x88, 0x01, 0x30, 0xe0, 0x80, 0x01, 0x20, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x80, -0xfe, 0xca, 0x01, 0x20, 0x17, 0x40, 0x00, 0x02, 0x80, 0xb4, 0x08, 0x4a, -0xd1, 0x1d, 0x49, 0x31, 0x0b, 0x78, 0x20, 0x2b, 0x01, 0xd3, 0x00, 0x23, -0x0b, 0x70, 0x07, 0x1c, 0x08, 0x78, 0x43, 0x1c, 0x0b, 0x70, 0x80, 0x18, -0x50, 0x30, 0x47, 0x70, 0x80, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, +0xee, 0xff, 0xc0, 0xd0, 0x02, 0x10, 0x00, 0x03, 0x80, 0xb4, 0x08, 0x4a, +0xd1, 0x1d, 0x89, 0x31, 0x0b, 0x7b, 0x20, 0x2b, 0x01, 0xd3, 0x00, 0x23, +0x0b, 0x73, 0x07, 0x1c, 0x08, 0x7b, 0x43, 0x1c, 0x0b, 0x73, 0x80, 0x18, +0x90, 0x30, 0x47, 0x73, 0x80, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, 0x07, 0x49, 0x01, 0x22, 0x12, 0x04, 0x08, 0x68, 0x02, 0x40, 0x01, 0x20, 0x00, 0x2a, 0x06, 0xd1, 0x0a, 0x68, 0x12, 0x0c, 0x02, 0xd1, 0x09, 0x68, 0x89, 0x0a, 0x00, 0xd2, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0x40, 0x90, 0xb5, 0x07, 0x1c, 0x09, 0x4c, 0x38, 0x1c, 0x21, 0x1c, 0xfc, 0xf7, -0x4d, 0xfc, 0x38, 0x1c, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x23, 0xd8, 0x42, -0x01, 0xd1, 0x00, 0x0c, 0xe0, 0x80, 0x00, 0x21, 0x20, 0x1c, 0xfc, 0xf7, -0x81, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xbc, 0x67, 0x21, 0x40, +0xab, 0xf8, 0x38, 0x1c, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x23, 0xd8, 0x42, +0x01, 0xd1, 0x00, 0x0c, 0xe0, 0x80, 0x00, 0x21, 0x20, 0x1c, 0xfb, 0xf7, +0xdf, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x70, 0x67, 0x21, 0x40, 0xf8, 0xb5, 0x07, 0x1c, 0x79, 0x7a, 0x76, 0x48, 0x00, 0x23, 0x76, 0x4c, 0x01, 0x29, 0x5d, 0xd1, 0xa2, 0x88, 0xc0, 0x46, 0x00, 0x92, 0xa1, 0x89, 0x8a, 0x42, 0x74, 0xda, 0xfa, 0x7a, 0x00, 0x2a, 0x15, 0xd0, 0x7a, 0x6c, 0x00, 0x2a, 0x12, 0xd0, 0x8a, 0x42, 0x10, 0xd8, 0x00, 0x9a, 0x51, 0x1c, 0xa1, 0x80, 0xa1, 0x88, 0xc0, 0x46, 0x41, 0x81, 0x78, 0x6c, 0x6b, 0x4e, -0xc0, 0x46, 0xf0, 0x80, 0xa0, 0x6a, 0x58, 0x23, -0x79, 0x6c, 0x59, 0x43, 0x40, 0x18, 0xc1, 0x1a, 0x28, 0xe0, 0x22, 0x88, -0x01, 0x32, 0x12, 0x04, 0x12, 0x0c, 0x22, 0x80, 0x8a, 0x42, 0x00, 0xdb, -0x23, 0x80, 0x00, 0x22, 0x00, 0x29, 0x69, 0xdd, 0x5f, 0x4c, 0xa4, 0x6a, -0x5e, 0x4b, 0x1d, 0x88, 0x58, 0x23, 0x6b, 0x43, 0xe3, 0x18, 0xde, 0x1d, -0x01, 0x36, 0x01, 0x23, 0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x1b, 0x06, +0xc0, 0x46, 0xf0, 0x80, 0xa0, 0x6a, 0x58, 0x23, 0x79, 0x6c, 0x59, 0x43, +0x40, 0x18, 0xc1, 0x1a, 0x28, 0xe0, 0x22, 0x88, 0x01, 0x32, 0x12, 0x04, +0x12, 0x0c, 0x22, 0x80, 0x8a, 0x42, 0x00, 0xdb, 0x23, 0x80, 0x00, 0x22, +0x00, 0x29, 0x69, 0xdd, 0x5f, 0x4c, 0xa4, 0x6a, 0x5e, 0x4b, 0x1d, 0x88, +0x58, 0x23, 0x6b, 0x43, 0xe3, 0x18, 0xde, 0x1d, 0x01, 0x36, 0x01, 0x23, +0x9b, 0x07, 0x33, 0x43, 0x1b, 0x68, 0x1b, 0x06, 0x15, 0xd1, 0x58, 0x49, 0x00, 0x9a, 0x01, 0x32, 0x8a, 0x80, 0x8a, 0x88, 0xc0, 0x46, 0x42, 0x81, 0x08, 0x88, 0x01, 0x30, 0x54, 0x4e, 0xc0, 0x46, 0xf0, 0x80, 0x58, 0x20, 0x68, 0x43, 0x21, 0x18, 0x38, 0x1c, 0x00, 0xf0, -0x65, 0xfa, 0xf0, 0x88, 0x00, 0x04, 0x00, 0x14, 0x95, 0xe0, 0x4d, 0x4b, +0x8d, 0xfa, 0xf0, 0x88, 0x00, 0x04, 0x00, 0x14, 0x95, 0xe0, 0x4d, 0x4b, 0x01, 0x35, 0x2d, 0x04, 0x2d, 0x0c, 0x1d, 0x80, 0x8d, 0x42, 0x01, 0xdb, 0x00, 0x25, 0x1d, 0x80, 0x01, 0x32, 0x12, 0x04, 0x12, 0x14, 0x91, 0x42, 0xce, 0xdc, 0x81, 0xe0, 0xe1, 0x88, 0xe2, 0x89, 0x91, 0x42, 0x18, 0xda, @@ -3446,9 +3614,9 @@ 0xdb, 0x03, 0x78, 0x6c, 0x18, 0x43, 0x3a, 0x4e, 0xc0, 0x46, 0xf0, 0x80, 0x00, 0xe0, 0x63, 0xe0, 0xe0, 0x6a, 0x79, 0x6c, 0x4b, 0x00, 0x59, 0x18, 0x49, 0x01, 0x40, 0x18, 0xc1, 0x1f, 0x59, 0x39, 0x38, 0x1c, 0x00, 0xf0, -0x4b, 0xfa, 0xe0, 0x6a, 0x79, 0x6c, 0x4a, 0x00, 0x52, 0x18, 0x52, 0x01, +0x79, 0xfa, 0xe0, 0x6a, 0x79, 0x6c, 0x4a, 0x00, 0x52, 0x18, 0x52, 0x01, 0x80, 0x18, 0x01, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x60, 0x38, 0x00, 0xf0, -0xc5, 0xfa, 0xb6, 0xe7, 0x4a, 0xe0, 0x61, 0x88, 0x01, 0x31, 0x09, 0x04, +0xf3, 0xfa, 0xb6, 0xe7, 0x4a, 0xe0, 0x61, 0x88, 0x01, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x61, 0x80, 0xe2, 0x89, 0x91, 0x42, 0x00, 0xdb, 0x63, 0x80, 0x00, 0x21, 0x00, 0x2a, 0x3e, 0xdd, 0x24, 0x4c, 0xe4, 0x6a, 0x23, 0x4b, 0x5d, 0x88, 0x6b, 0x00, 0x5b, 0x19, 0x5b, 0x01, 0xe3, 0x18, 0xde, 0x1d, @@ -3456,193 +3624,208 @@ 0x20, 0xd1, 0x1c, 0x4e, 0xf1, 0x88, 0x01, 0x31, 0xf1, 0x80, 0xf1, 0x88, 0xc0, 0x46, 0x81, 0x81, 0x70, 0x88, 0x01, 0x23, 0xdb, 0x03, 0x01, 0x30, 0x18, 0x43, 0x17, 0x49, 0xc0, 0x46, 0xc8, 0x80, 0x68, 0x00, 0x40, 0x19, -0x40, 0x01, 0x21, 0x18, 0x38, 0x1c, 0x00, 0xf0, 0x0b, 0xfa, 0x71, 0x88, +0x40, 0x01, 0x21, 0x18, 0x38, 0x1c, 0x00, 0xf0, 0x39, 0xfa, 0x71, 0x88, 0x4a, 0x00, 0x52, 0x18, 0x52, 0x01, 0xf0, 0x6a, 0x80, 0x18, 0x00, 0xf0, -0x89, 0xfa, 0x0e, 0x49, 0xc8, 0x88, 0x79, 0xe7, 0x0b, 0x4b, 0x01, 0x35, +0xb7, 0xfa, 0x0e, 0x49, 0xc8, 0x88, 0x79, 0xe7, 0x0b, 0x4b, 0x01, 0x35, 0x2d, 0x04, 0x2d, 0x0c, 0x5d, 0x80, 0x95, 0x42, 0x01, 0xdb, 0x00, 0x25, 0x5d, 0x80, 0x01, 0x31, 0x09, 0x04, 0x09, 0x14, 0x8a, 0x42, 0xc2, 0xdc, 0x01, 0x89, 0x01, 0x31, 0x01, 0x81, 0x00, 0x20, 0xc0, 0x43, 0xf8, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xb8, 0x2a, 0x00, 0x80, 0xc8, 0x29, 0x00, 0x80, -0xbc, 0x67, 0x21, 0x40, 0xf0, 0xb4, 0x06, 0x1c, 0x01, 0x23, 0xdb, 0x03, -0x33, 0x40, 0x01, 0x24, 0x30, 0x4f, 0x00, 0x20, 0x30, 0x4a, 0x31, 0x4d, -0xd1, 0x1d, 0x39, 0x31, 0x00, 0x2b, 0x2f, 0xd0, 0xe3, 0x03, 0xf3, 0x1a, -0x51, 0xd0, 0xee, 0x89, 0x9e, 0x42, 0x4e, 0xd3, 0xee, 0x88, 0x00, 0x2e, -0x4b, 0xd0, 0xee, 0x6a, 0x5d, 0x1e, 0x6b, 0x00, 0x5d, 0x19, 0x6d, 0x01, -0x73, 0x19, 0x9e, 0x68, 0x36, 0x06, 0x36, 0x0e, 0x03, 0x2e, 0x02, 0xd0, -0xce, 0x89, 0x01, 0x36, 0xce, 0x81, 0x40, 0x33, 0x9b, 0x8b, 0x9b, 0x00, -0x21, 0x4e, 0x76, 0x6a, 0xc0, 0x46, 0xf0, 0x50, -0x53, 0x89, 0x01, 0x33, 0x53, 0x81, 0x1e, 0x4e, 0xf2, 0x6a, 0x52, 0x19, -0x90, 0x60, 0xf0, 0x88, 0x01, 0x38, 0xf0, 0x80, 0xf0, 0x88, 0xc0, 0x46, -0x88, 0x81, 0x19, 0x49, 0x00, 0x28, 0x23, 0xd1, 0x4f, 0x80, 0x21, 0xe0, -0x00, 0x2e, 0x22, 0xd9, 0xab, 0x89, 0xb3, 0x42, 0x1f, 0xd3, 0xab, 0x88, -0x00, 0x2b, 0x1c, 0xd0, 0x53, 0x89, 0x01, 0x33, 0x53, 0x81, 0x58, 0x23, -0x01, 0x3e, 0x73, 0x43, 0xaa, 0x6a, 0xd2, 0x18, 0x93, 0x68, 0x1b, 0x06, -0x1b, 0x0e, 0x03, 0x2b, 0x02, 0xd0, 0xcb, 0x89, 0x01, 0x33, 0xcb, 0x81, -0x90, 0x60, 0xa8, 0x88, 0x01, 0x38, 0xa8, 0x80, 0xa8, 0x88, 0xc0, 0x46, -0x48, 0x81, 0x00, 0x28, 0x00, 0xd1, 0x2f, 0x80, 0x20, 0x1c, 0xf0, 0xbc, -0x70, 0x47, 0xca, 0x89, 0x01, 0x32, 0xca, 0x81, 0xf9, 0xe7, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, 0xc8, 0x29, 0x00, 0x80, -0x00, 0xb5, 0x00, 0x21, 0x41, 0x60, 0x10, 0x49, 0x4a, 0x68, 0x00, 0x2a, -0x10, 0xd1, 0xca, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0xca, 0x1d, 0x19, 0x32, -0x12, 0x79, 0x00, 0x2a, 0x08, 0xd0, 0x4a, 0x69, 0x00, 0x2a, 0x0b, 0xd1, -0x88, 0x61, 0x48, 0x61, 0x00, 0xf0, 0x10, 0xf8, 0x08, 0xbc, 0x18, 0x47, -0x4a, 0x69, 0x00, 0x2a, 0x02, 0xd1, 0x88, 0x61, 0x48, 0x61, 0xf7, 0xe7, -0x8a, 0x69, 0xc0, 0x46, 0x50, 0x60, 0x88, 0x61, 0xf2, 0xe7, 0x00, 0x00, -0xec, 0x05, 0x00, 0x80, 0xb0, 0xb5, 0x2a, 0x48, 0x40, 0x69, 0x00, 0x28, -0x4c, 0xd0, 0x08, 0x22, 0xc1, 0x68, 0x0a, 0x40, 0x00, 0x27, 0x27, 0x4b, -0xd9, 0x1d, 0xb9, 0x31, 0x00, 0x2a, 0x11, 0xd0, 0x04, 0x22, 0x25, 0x4c, -0xc0, 0x46, 0x0c, 0x61, 0x24, 0x4c, 0xc0, 0x46, 0x4c, 0x62, 0x24, 0x4c, -0xc0, 0x46, 0x8c, 0x62, 0x23, 0x4c, 0xc0, 0x46, 0xcc, 0x62, 0x23, 0x4c, -0xc0, 0x46, 0x0c, 0x63, 0x4f, 0x63, 0x12, 0xe0, 0x05, 0x22, 0x21, 0x4c, -0xc0, 0x46, 0x0c, 0x61, 0x20, 0x4c, 0xc0, 0x46, 0x4c, 0x62, 0x20, 0x4c, -0xc0, 0x46, 0x8c, 0x62, 0x1f, 0x4c, 0xc0, 0x46, 0xcc, 0x62, 0x1f, 0x4c, -0xc0, 0x46, 0x0c, 0x63, 0x1e, 0x4c, 0xc0, 0x46, 0x4c, 0x63, 0x40, 0x24, -0xcc, 0x82, 0x4f, 0x83, 0x1c, 0x4f, 0x00, 0x21, 0x00, 0x2a, 0x0c, 0xd9, -0x8c, 0x00, 0x05, 0x19, 0x6d, 0x6a, 0x7d, 0x40, 0xe4, 0x18, 0xff, 0x34, -0x01, 0x34, 0x65, 0x62, 0x01, 0x31, 0x91, 0x42, 0xf4, 0xd3, 0x10, 0x29, -0x07, 0xd2, 0x8a, 0x00, 0xd2, 0x18, 0xff, 0x32, 0x01, 0x32, 0x57, 0x62, -0x01, 0x31, 0x10, 0x29, 0xf7, 0xd3, 0x11, 0x49, 0x00, 0xf0, 0x22, 0xf8, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, -0x1c, 0xad, 0x20, 0x40, 0x28, 0x01, 0x40, 0x00, 0x01, 0x23, 0x45, 0x67, -0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, -0x20, 0x01, 0x40, 0x00, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, -0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0, -0x36, 0x36, 0x36, 0x36, 0x30, 0x80, 0x20, 0x40, 0xb0, 0xb5, 0x0f, 0x1c, -0x15, 0x4d, 0xe9, 0x1d, 0xc9, 0x31, 0x15, 0x4c, 0x23, 0x1c, 0x15, 0x4a, -0x00, 0x20, 0xfc, 0xf7, 0x1a, 0xf8, 0xe9, 0x1d, 0xff, 0x31, 0x1e, 0x31, -0x23, 0x1c, 0x0d, 0x1c, 0x11, 0x4a, 0x01, 0x20, 0xfc, 0xf7, 0x11, 0xf8, -0x29, 0x1c, 0x23, 0x1c, 0x0e, 0x4a, 0x00, 0x20, 0xfc, 0xf7, 0x0b, 0xf8, -0x39, 0x1c, 0x23, 0x1c, 0x0c, 0x4a, 0x01, 0x20, 0xfc, 0xf7, 0x05, 0xf8, -0x00, 0x21, 0x0b, 0x48, 0xc2, 0x1d, 0x19, 0x32, -0x51, 0x71, 0x01, 0x21, 0xff, 0x30, 0x01, 0x30, 0x41, 0x62, 0x08, 0x1c, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x1c, 0xad, 0x20, 0x40, -0x75, 0x08, 0xff, 0xff, 0x28, 0x00, 0x03, 0x00, 0x40, 0x00, 0x02, 0x00, -0x14, 0x00, 0x07, 0x00, 0xec, 0x05, 0x00, 0x80, 0xf0, 0xb5, 0x37, 0x4a, -0x50, 0x69, 0x01, 0x23, 0x9b, 0x07, 0x08, 0x30, 0x18, 0x43, 0x00, 0x68, -0x01, 0x06, 0x09, 0x0e, 0x33, 0x4b, 0x01, 0x29, 0x49, 0xd1, 0x1f, 0x68, -0x19, 0x1c, 0x32, 0x4b, 0x9f, 0x42, 0x04, 0xd1, 0xff, 0xf7, 0x3e, 0xff, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x23, 0x9f, 0x00, 0xcc, 0x59, -0x55, 0x69, 0xef, 0x19, 0x3c, 0x61, 0x01, 0x33, 0x05, 0x2b, 0xf7, 0xd3, -0x00, 0x0a, 0x00, 0x02, 0x02, 0x23, 0x18, 0x43, 0x53, 0x69, 0xc0, 0x46, -0x98, 0x60, 0x50, 0x69, 0x08, 0x23, 0xc2, 0x68, 0x13, 0x40, 0x25, 0x4f, -0xfa, 0x1d, 0xb9, 0x32, 0x00, 0x2b, 0x02, 0xd0, 0x04, 0x23, 0x23, 0x4c, -0x01, 0xe0, 0x05, 0x23, 0x22, 0x4c, 0xc0, 0x46, 0x14, 0x61, 0x40, 0x24, -0xd4, 0x82, 0x00, 0x24, 0x54, 0x83, 0x20, 0x4c, 0x00, 0x22, 0x00, 0x2b, -0x0c, 0xd9, 0x95, 0x00, 0x46, 0x19, 0x76, 0x6a, 0x66, 0x40, 0xed, 0x19, -0xff, 0x35, 0x01, 0x35, 0x6e, 0x62, 0x01, 0x32, 0x9a, 0x42, 0xf4, 0xd3, -0x10, 0x2a, 0x07, 0xd2, 0x93, 0x00, 0xdb, 0x19, 0xff, 0x33, 0x01, 0x33, -0x5c, 0x62, 0x01, 0x32, 0x10, 0x2a, 0xf7, 0xd3, 0xff, 0xf7, 0x70, 0xff, -0xbc, 0xe7, 0x00, 0x21, 0x8f, 0x00, 0xdc, 0x59, 0x55, 0x69, 0xef, 0x19, -0x7c, 0x62, 0x01, 0x31, 0x05, 0x29, 0xf7, 0xd3, 0x00, 0x0a, 0x00, 0x02, -0x03, 0x23, 0x18, 0x43, 0x51, 0x69, 0xc0, 0x46, 0x88, 0x60, 0x50, 0x69, -0x40, 0x68, 0xc0, 0x46, 0x50, 0x61, 0x09, 0x48, 0xfb, 0xf7, 0x7a, 0xff, -0xa4, 0xe7, 0x00, 0x00, 0xec, 0x05, 0x00, 0x80, 0x30, 0x80, 0x20, 0x40, -0x67, 0x45, 0x23, 0x01, 0x1c, 0xad, 0x20, 0x40, 0x28, 0x01, 0x40, 0x00, -0x20, 0x01, 0x40, 0x00, 0x5c, 0x5c, 0x5c, 0x5c, 0x85, 0x30, 0xff, 0xff, -0x80, 0xb5, 0x0f, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x43, 0xf8, 0xb9, 0x6b, -0x0b, 0x48, 0xc2, 0x68, 0x12, 0x04, 0x51, 0x40, 0x82, 0x69, 0x51, 0x40, -0x39, 0x65, 0xf9, 0x6b, 0x82, 0x69, 0x12, 0x04, 0xd2, 0x43, 0x51, 0x40, -0xc0, 0x68, 0xc0, 0x43, 0x48, 0x40, 0x78, 0x65, 0x04, 0x48, 0x01, 0x89, -0x01, 0x31, 0x01, 0x81, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0x08, 0x83, 0x20, 0x40, 0x78, 0x2a, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x1c, -0x0f, 0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0xe0, 0x68, -0x01, 0x0e, 0xff, 0x22, 0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, 0x11, 0x43, -0xff, 0x22, 0x12, 0x02, 0x02, 0x40, 0x12, 0x02, 0x11, 0x43, 0x00, 0x06, -0x08, 0x43, 0x38, 0x65, 0x20, 0x69, 0xc0, 0x46, 0x78, 0x65, 0x60, 0x69, -0xc0, 0x46, 0xb8, 0x65, 0x03, 0x48, 0x01, 0x89, 0x01, 0x31, 0x01, 0x81, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0x2a, 0x00, 0x80, -0x90, 0xb5, 0x00, 0x22, 0x93, 0x00, 0x1f, 0x18, 0xbf, 0x69, 0x5b, 0x18, -0x5f, 0x62, 0x01, 0x32, 0x05, 0x2a, 0xf7, 0xd3, 0x07, 0x7a, 0xfb, 0x08, -0x03, 0xd3, 0x00, 0x23, 0x92, 0x00, 0x52, 0x18, 0x13, 0x62, 0x07, 0x6b, +0x08, 0xbc, 0x18, 0x47, 0x4c, 0x2b, 0x00, 0x80, 0x4c, 0x2a, 0x00, 0x80, +0x70, 0x67, 0x21, 0x40, 0xf0, 0xb4, 0x06, 0x1c, 0x01, 0x23, 0xdb, 0x03, +0x33, 0x40, 0x01, 0x24, 0x44, 0x4f, 0x00, 0x20, 0x44, 0x4a, 0x45, 0x4d, +0xd1, 0x1d, 0x39, 0x31, 0x00, 0x2b, 0x41, 0xd0, 0xe3, 0x03, 0xf3, 0x1a, +0x73, 0xd0, 0xee, 0x89, 0x9e, 0x42, 0x71, 0xd3, 0xee, 0x88, 0x00, 0x2e, +0x6d, 0xd0, 0xed, 0x6a, 0x5e, 0x1e, 0x73, 0x00, 0x9b, 0x19, 0x5b, 0x01, +0xed, 0x18, 0xae, 0x68, 0x36, 0x06, 0x36, 0x0e, 0x03, 0x2e, 0x02, 0xd0, +0xce, 0x89, 0x01, 0x36, 0xce, 0x81, 0x40, 0x35, 0xad, 0x8b, 0xad, 0x00, +0x35, 0x4e, 0x76, 0x6a, 0xc0, 0x46, 0x70, 0x51, 0x55, 0x89, 0x01, 0x35, +0x55, 0x81, 0x32, 0x4e, 0xf2, 0x6a, 0xd2, 0x18, 0x90, 0x60, 0xf2, 0x6a, +0xd2, 0x18, 0x90, 0x63, 0xf2, 0x6a, 0xd2, 0x18, 0xd0, 0x63, 0xf2, 0x6a, +0xd2, 0x18, 0x10, 0x64, 0xf2, 0x6a, 0xd2, 0x18, 0x50, 0x64, 0xf2, 0x6a, +0xd2, 0x18, 0x90, 0x64, 0xf2, 0x6a, 0xd2, 0x18, 0xd0, 0x64, 0xf0, 0x88, +0x01, 0x38, 0xf0, 0x80, 0xf0, 0x88, 0xc0, 0x46, +0x88, 0x81, 0x24, 0x49, 0x00, 0x28, 0x39, 0xd1, 0x4f, 0x80, 0x37, 0xe0, +0x00, 0x2e, 0x38, 0xd9, 0xab, 0x89, 0xb3, 0x42, 0x30, 0xd3, 0xab, 0x88, +0x00, 0x2b, 0x2c, 0xd0, 0x53, 0x89, 0x01, 0x33, 0x53, 0x81, 0x2a, 0x1c, +0xad, 0x6a, 0x58, 0x23, 0x01, 0x3e, 0x73, 0x43, 0xed, 0x18, 0xae, 0x68, +0x36, 0x06, 0x36, 0x0e, 0x03, 0x2e, 0x02, 0xd0, 0xce, 0x89, 0x01, 0x36, +0xce, 0x81, 0xa8, 0x60, 0x95, 0x6a, 0xed, 0x18, 0xa8, 0x63, 0x95, 0x6a, +0xed, 0x18, 0xe8, 0x63, 0x95, 0x6a, 0xed, 0x18, 0x28, 0x64, 0x95, 0x6a, +0xed, 0x18, 0x68, 0x64, 0x95, 0x6a, 0xed, 0x18, 0xa8, 0x64, 0x95, 0x6a, +0xeb, 0x18, 0xd8, 0x64, 0x90, 0x88, 0x01, 0x38, 0x90, 0x80, 0x90, 0x88, +0xc0, 0x46, 0x48, 0x81, 0x00, 0x28, 0x03, 0xd1, 0x01, 0xe0, 0x04, 0xe0, +0x03, 0xe0, 0x17, 0x80, 0x20, 0x1c, 0xf0, 0xbc, 0x70, 0x47, 0xca, 0x89, +0x01, 0x32, 0xca, 0x81, 0xf9, 0xe7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, +0x0c, 0x2b, 0x00, 0x80, 0x4c, 0x2a, 0x00, 0x80, 0x00, 0xb5, 0x00, 0x21, +0x41, 0x60, 0x10, 0x49, 0x4a, 0x68, 0x00, 0x2a, 0x10, 0xd1, 0xca, 0x68, +0x00, 0x2a, 0x04, 0xd0, 0xca, 0x1d, 0x19, 0x32, 0x12, 0x79, 0x00, 0x2a, +0x08, 0xd0, 0x4a, 0x69, 0x00, 0x2a, 0x0b, 0xd1, 0x88, 0x61, 0x48, 0x61, +0x00, 0xf0, 0x10, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x4a, 0x69, 0x00, 0x2a, +0x02, 0xd1, 0x88, 0x61, 0x48, 0x61, 0xf7, 0xe7, 0x8a, 0x69, 0xc0, 0x46, +0x50, 0x60, 0x88, 0x61, 0xf2, 0xe7, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, +0xb0, 0xb5, 0x2a, 0x48, 0x40, 0x69, 0x00, 0x28, 0x4c, 0xd0, 0x08, 0x22, +0xc1, 0x68, 0x0a, 0x40, 0x00, 0x27, 0x27, 0x4b, 0xd9, 0x1d, 0xb9, 0x31, +0x00, 0x2a, 0x11, 0xd0, 0x04, 0x22, 0x25, 0x4c, 0xc0, 0x46, 0x0c, 0x61, +0x24, 0x4c, 0xc0, 0x46, 0x4c, 0x62, 0x24, 0x4c, 0xc0, 0x46, 0x8c, 0x62, +0x23, 0x4c, 0xc0, 0x46, 0xcc, 0x62, 0x23, 0x4c, 0xc0, 0x46, 0x0c, 0x63, +0x4f, 0x63, 0x12, 0xe0, 0x05, 0x22, 0x21, 0x4c, 0xc0, 0x46, 0x0c, 0x61, +0x20, 0x4c, 0xc0, 0x46, 0x4c, 0x62, 0x20, 0x4c, 0xc0, 0x46, 0x8c, 0x62, +0x1f, 0x4c, 0xc0, 0x46, 0xcc, 0x62, 0x1f, 0x4c, 0xc0, 0x46, 0x0c, 0x63, +0x1e, 0x4c, 0xc0, 0x46, 0x4c, 0x63, 0x40, 0x24, 0xcc, 0x82, 0x4f, 0x83, +0x1c, 0x4f, 0x00, 0x21, 0x00, 0x2a, 0x0c, 0xd9, 0x8c, 0x00, 0x05, 0x19, +0x6d, 0x6a, 0x7d, 0x40, 0xe4, 0x18, 0xff, 0x34, 0x01, 0x34, 0x65, 0x62, +0x01, 0x31, 0x91, 0x42, 0xf4, 0xd3, 0x10, 0x29, 0x07, 0xd2, 0x8a, 0x00, +0xd2, 0x18, 0xff, 0x32, 0x01, 0x32, 0x57, 0x62, 0x01, 0x31, 0x10, 0x29, +0xf7, 0xd3, 0x11, 0x49, 0x00, 0xf0, 0x22, 0xf8, 0xb0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x80, 0x1c, 0xad, 0x20, 0x40, +0x28, 0x01, 0x40, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, +0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x20, 0x01, 0x40, 0x00, +0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, 0x98, 0xba, 0xdc, 0xfe, +0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0, 0x36, 0x36, 0x36, 0x36, +0x30, 0x80, 0x20, 0x40, 0xb0, 0xb5, 0x0f, 0x1c, 0x15, 0x4d, 0xe9, 0x1d, +0xc9, 0x31, 0x15, 0x4c, 0x23, 0x1c, 0x15, 0x4a, 0x00, 0x20, 0xfb, 0xf7, +0x50, 0xfc, 0xe9, 0x1d, 0xff, 0x31, 0x1e, 0x31, 0x23, 0x1c, 0x0d, 0x1c, +0x11, 0x4a, 0x01, 0x20, 0xfb, 0xf7, 0x47, 0xfc, 0x29, 0x1c, 0x23, 0x1c, +0x0e, 0x4a, 0x00, 0x20, 0xfb, 0xf7, 0x41, 0xfc, +0x39, 0x1c, 0x23, 0x1c, 0x0c, 0x4a, 0x01, 0x20, 0xfb, 0xf7, 0x3b, 0xfc, +0x00, 0x21, 0x0b, 0x48, 0xc2, 0x1d, 0x19, 0x32, 0x51, 0x71, 0x01, 0x21, +0xff, 0x30, 0x01, 0x30, 0x41, 0x62, 0x08, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x1c, 0xad, 0x20, 0x40, 0x75, 0x08, 0xff, 0xff, +0x28, 0x00, 0x03, 0x00, 0x40, 0x00, 0x02, 0x00, 0x14, 0x00, 0x07, 0x00, +0x6c, 0x06, 0x00, 0x80, 0xf0, 0xb5, 0x37, 0x4a, 0x50, 0x69, 0x01, 0x23, +0x9b, 0x07, 0x08, 0x30, 0x18, 0x43, 0x00, 0x68, 0x01, 0x06, 0x09, 0x0e, +0x33, 0x4b, 0x01, 0x29, 0x49, 0xd1, 0x1f, 0x68, 0x19, 0x1c, 0x32, 0x4b, +0x9f, 0x42, 0x04, 0xd1, 0xff, 0xf7, 0x3e, 0xff, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x23, 0x9f, 0x00, 0xcc, 0x59, 0x55, 0x69, 0xef, 0x19, +0x3c, 0x61, 0x01, 0x33, 0x05, 0x2b, 0xf7, 0xd3, 0x00, 0x0a, 0x00, 0x02, +0x02, 0x23, 0x18, 0x43, 0x53, 0x69, 0xc0, 0x46, 0x98, 0x60, 0x50, 0x69, +0x08, 0x23, 0xc2, 0x68, 0x13, 0x40, 0x25, 0x4f, 0xfa, 0x1d, 0xb9, 0x32, +0x00, 0x2b, 0x02, 0xd0, 0x04, 0x23, 0x23, 0x4c, 0x01, 0xe0, 0x05, 0x23, +0x22, 0x4c, 0xc0, 0x46, 0x14, 0x61, 0x40, 0x24, 0xd4, 0x82, 0x00, 0x24, +0x54, 0x83, 0x20, 0x4c, 0x00, 0x22, 0x00, 0x2b, 0x0c, 0xd9, 0x95, 0x00, +0x46, 0x19, 0x76, 0x6a, 0x66, 0x40, 0xed, 0x19, 0xff, 0x35, 0x01, 0x35, +0x6e, 0x62, 0x01, 0x32, 0x9a, 0x42, 0xf4, 0xd3, 0x10, 0x2a, 0x07, 0xd2, +0x93, 0x00, 0xdb, 0x19, 0xff, 0x33, 0x01, 0x33, 0x5c, 0x62, 0x01, 0x32, +0x10, 0x2a, 0xf7, 0xd3, 0xff, 0xf7, 0x70, 0xff, 0xbc, 0xe7, 0x00, 0x21, +0x8f, 0x00, 0xdc, 0x59, 0x55, 0x69, 0xef, 0x19, 0x7c, 0x62, 0x01, 0x31, +0x05, 0x29, 0xf7, 0xd3, 0x00, 0x0a, 0x00, 0x02, 0x03, 0x23, 0x18, 0x43, +0x51, 0x69, 0xc0, 0x46, 0x88, 0x60, 0x50, 0x69, 0x40, 0x68, 0xc0, 0x46, +0x50, 0x61, 0x09, 0x48, 0xfb, 0xf7, 0xb0, 0xfb, 0xa4, 0xe7, 0x00, 0x00, +0x6c, 0x06, 0x00, 0x80, 0x30, 0x80, 0x20, 0x40, 0x67, 0x45, 0x23, 0x01, +0x1c, 0xad, 0x20, 0x40, 0x28, 0x01, 0x40, 0x00, 0x20, 0x01, 0x40, 0x00, +0x5c, 0x5c, 0x5c, 0x5c, 0xfd, 0x30, 0xff, 0xff, 0x80, 0xb5, 0x87, 0xb0, +0x0f, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x48, 0xf8, 0x0e, 0x49, 0xc8, 0x68, +0x02, 0x04, 0x89, 0x69, 0x4a, 0x40, 0x05, 0x92, 0x09, 0x04, 0xc9, 0x43, +0xc0, 0x43, 0x48, 0x40, 0x06, 0x90, 0x08, 0x21, 0x6a, 0x46, 0x05, 0xa8, +0xfd, 0xf7, 0x8b, 0xfb, 0x00, 0x98, 0xc0, 0x46, 0x38, 0x65, 0x03, 0x98, +0xc0, 0x46, 0x78, 0x65, 0x04, 0x48, 0x01, 0x89, 0x01, 0x31, 0x01, 0x81, +0x07, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x08, 0x83, 0x20, 0x40, +0x0c, 0x2b, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x20, 0x1c, +0x39, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0xe0, 0x68, 0x01, 0x0e, 0xff, 0x22, +0x12, 0x04, 0x02, 0x40, 0x12, 0x0a, 0x11, 0x43, 0xff, 0x22, 0x12, 0x02, +0x02, 0x40, 0x12, 0x02, 0x11, 0x43, 0x00, 0x06, 0x08, 0x43, 0x38, 0x65, +0x20, 0x69, 0xc0, 0x46, 0x78, 0x65, 0x60, 0x69, 0xc0, 0x46, 0xb8, 0x65, +0x03, 0x48, 0x01, 0x89, 0x01, 0x31, 0x01, 0x81, 0x90, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x80, 0x90, 0xb5, 0x00, 0x22, +0x93, 0x00, 0x1f, 0x18, 0xbf, 0x69, 0x5b, 0x18, 0x5f, 0x62, 0x01, 0x32, +0x05, 0x2a, 0xf7, 0xd3, 0x07, 0x7a, 0xfb, 0x08, 0x03, 0xd3, 0x00, 0x23, +0x92, 0x00, 0x52, 0x18, 0x13, 0x62, 0x07, 0x6b, 0xc0, 0x46, 0x8f, 0x63, 0xc7, 0x6a, 0xc0, 0x46, 0xcf, 0x63, 0x87, 0x6b, 0xc0, 0x46, 0x0f, 0x64, 0x47, 0x6b, 0xc0, 0x46, 0x4f, 0x64, 0x07, 0x6c, -0xc0, 0x46, 0x8f, 0x64, 0xc2, 0x6b, 0xc0, 0x46, -0xca, 0x64, 0xc2, 0x88, 0xc0, 0x46, 0x0a, 0x80, 0x82, 0x7a, 0x12, 0x06, -0x03, 0x7a, 0x1b, 0x04, 0x1a, 0x43, 0xc3, 0x88, 0x1b, 0x02, 0x1a, 0x43, -0x43, 0x7a, 0xdb, 0x07, 0x1a, 0x43, 0x8a, 0x60, 0x17, 0x1c, 0x83, 0x7a, -0x5a, 0x08, 0x05, 0xd3, 0x14, 0x22, 0x1c, 0x1c, 0xa3, 0x08, 0x02, 0xd2, -0x15, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x00, 0x7a, 0x43, 0x08, 0x10, 0xd3, -0xc0, 0x08, 0x02, 0xd3, 0x88, 0x20, 0x10, 0x43, 0x01, 0xe0, 0x80, 0x20, -0x10, 0x43, 0x3a, 0x0a, 0x12, 0x02, 0x01, 0x23, 0x1a, 0x43, 0xc8, 0x60, -0x8a, 0x60, 0x08, 0x1c, 0xff, 0xf7, 0x14, 0xfe, 0x05, 0xe0, 0x38, 0x0a, -0x00, 0x02, 0x03, 0x23, 0x18, 0x43, 0x88, 0x60, 0xca, 0x60, 0x03, 0x48, -0x01, 0x89, 0x01, 0x31, 0x01, 0x81, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x78, 0x2a, 0x00, 0x80, 0xf0, 0xb4, 0x02, 0x6d, 0x14, 0x4c, 0x15, 0x1c, -0xe7, 0x69, 0xbd, 0x40, 0x13, 0x1c, 0x26, 0x6a, 0xf3, 0x40, 0x5d, 0x40, -0x2e, 0x1c, 0x45, 0x6d, 0xbd, 0x40, 0x6e, 0x40, 0x2b, 0x1c, 0x35, 0x1c, -0xfd, 0x40, 0x2f, 0x1c, 0xbb, 0x00, 0x65, 0x6a, 0xeb, 0x58, 0x00, 0x2b, -0x08, 0xd0, 0x23, 0x69, 0x01, 0x37, 0x9f, 0x42, 0x00, 0xd3, 0x00, 0x27, -0xbe, 0x00, 0xae, 0x59, 0x00, 0x2e, 0xf7, 0xd1, 0xa4, 0x69, 0xa2, 0x40, -0x11, 0x43, 0x05, 0x4b, 0x19, 0x43, 0xba, 0x00, 0xa9, 0x50, 0x40, 0x30, -0x87, 0x83, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0xc8, 0x29, 0x00, 0x80, -0x00, 0x00, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0xf0, -0xb1, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x0e, 0xfa, 0x38, 0x0c, 0x00, 0xf0, -0x0b, 0xfa, 0x38, 0x0a, 0x00, 0xf0, 0x08, 0xfa, 0x38, 0x1c, 0x00, 0xf0, -0x05, 0xfa, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, -0x00, 0xf0, 0x9e, 0xfa, 0x54, 0x20, 0x00, 0xf0, 0xfb, 0xf9, 0x38, 0x0c, -0x00, 0xf0, 0xf8, 0xf9, 0x38, 0x0a, 0x00, 0xf0, 0xf5, 0xf9, 0x38, 0x1c, -0x00, 0xf0, 0xf2, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0xef, 0xf9, 0x80, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0xf0, 0x89, 0xfa, 0x57, 0x20, -0x00, 0xf0, 0xe6, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0xf3, 0xb5, 0x81, 0xb0, -0x41, 0x02, 0x53, 0x20, 0xff, 0xf7, 0xc8, 0xff, 0x00, 0xf0, 0x64, 0xfa, -0x00, 0xf0, 0xf5, 0xf8, 0x00, 0x24, 0x00, 0x26, 0x00, 0x25, 0x00, 0x27, -0x30, 0x1c, 0x01, 0x36, 0xff, 0xf7, 0xd0, 0xff, 0x00, 0xf0, 0x46, 0xf9, -0x00, 0x90, 0x00, 0xf0, 0x55, 0xfa, 0xf8, 0x00, 0x00, 0x99, 0x81, 0x40, -0x0d, 0x43, 0x01, 0x34, 0x01, 0x37, 0x04, 0x2f, 0xee, 0xd3, 0x02, 0x99, -0x20, 0xc1, 0x02, 0x91, 0xff, 0x23, 0x09, 0x33, 0x9c, 0x42, 0xe5, 0xd3, -0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x04, 0x1c, -0x0f, 0x1c, 0x00, 0x26, 0x20, 0xcf, 0xb1, 0x00, 0x84, 0x20, 0xff, 0xf7, -0x9b, 0xff, 0x28, 0x1c, 0x00, 0xf0, 0xae, 0xf9, 0x28, 0x0a, 0x00, 0xf0, -0xab, 0xf9, 0x28, 0x0c, 0x00, 0xf0, 0xa8, 0xf9, 0x28, 0x0e, 0x00, 0xf0, -0xa5, 0xf9, 0x00, 0xf0, 0x2b, 0xfa, 0x01, 0x36, 0x42, 0x2e, 0xe9, 0xd3, -0x61, 0x02, 0x83, 0x20, 0xff, 0xf7, 0x86, 0xff, 0x00, 0xf0, 0x22, 0xfa, -0x00, 0xf0, 0xb3, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, -0x41, 0x02, 0x60, 0x20, 0xff, 0xf7, 0x7a, 0xff, 0x00, 0xf0, 0x16, 0xfa, -0x00, 0xf0, 0xa7, 0xf8, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x90, 0xb5, 0x0f, 0x1c, 0x41, 0x02, 0x53, 0x20, -0xff, 0xf7, 0x6c, 0xff, 0x00, 0xf0, 0x08, 0xfa, 0x00, 0xf0, 0x99, 0xf8, -0xf8, 0x1d, 0x05, 0x30, 0x44, 0x1c, 0xff, 0xf7, 0x77, 0xff, 0x00, 0xf0, -0xed, 0xf8, 0x07, 0x1c, 0x00, 0xf0, 0xfc, 0xf9, 0x20, 0x1c, 0xff, 0xf7, -0x6f, 0xff, 0x00, 0xf0, 0xe5, 0xf8, 0x04, 0x1c, 0x00, 0xf0, 0xf4, 0xf9, -0x20, 0x02, 0x38, 0x43, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, -0xc2, 0xb0, 0x04, 0x1c, 0x0d, 0x1c, 0x17, 0x1c, 0x61, 0x02, 0x53, 0x20, -0xff, 0xf7, 0x48, 0xff, 0x00, 0xf0, 0xe4, 0xf9, 0x00, 0xf0, 0x75, 0xf8, -0x68, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0x6a, 0x46, 0xe8, 0x1d, 0x05, 0x30, -0x17, 0x54, 0x39, 0x0a, 0x68, 0x44, 0x41, 0x70, 0x68, 0x46, 0x00, 0x99, -0x0c, 0x30, 0x00, 0xf0, 0x73, 0xf8, 0x02, 0xab, 0x18, 0x70, 0x00, 0x20, -0x58, 0x70, 0x68, 0x46, 0x0c, 0x21, 0x00, 0xf0, 0x6b, 0xf8, 0x02, 0xab, -0x58, 0x70, 0x69, 0x46, 0x20, 0x1c, 0xff, 0xf7, 0x83, 0xff, 0x42, 0xb0, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0xc2, 0xb0, 0x04, 0x1c, -0x1f, 0x1c, 0x6b, 0x46, 0x00, 0x20, 0xc5, 0x43, 0x20, 0xc3, 0x01, 0x30, -0x42, 0x28, 0xfb, 0xd3, 0x68, 0x46, 0x0c, 0x30, 0x03, 0x1c, 0x00, 0x25, -0x00, 0x2a, 0x0a, 0xd9, 0x0e, 0x88, 0xc0, 0x46, 0x06, 0x70, 0x0e, 0x88, -0x36, 0x12, 0x46, 0x70, 0x02, 0x30, 0x02, 0x31, 0x02, 0x35, 0x95, 0x42, -0xf4, 0xd3, 0x00, 0x92, 0x18, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x40, 0xf8, -0x00, 0x26, 0x01, 0x96, 0x02, 0xab, 0x18, 0x70, 0x5e, 0x70, 0x9e, 0x70, -0xde, 0x70, 0x05, 0x1c, 0x68, 0x46, 0x0c, 0x21, 0x00, 0xf0, 0x34, 0xf8, -0x02, 0xab, 0x58, 0x70, 0x38, 0x06, 0x00, 0x0e, 0x85, 0x42, 0x05, 0xd1, -0x69, 0x46, 0x20, 0x1c, 0xff, 0xf7, 0x48, 0xff, 0x30, 0x1c, 0x00, 0xe0, -0x01, 0x20, 0x42, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, -0x07, 0x1c, 0x00, 0x24, 0xff, 0x26, 0x09, 0x36, 0x20, 0x1c, 0xff, 0xf7, -0xf1, 0xfe, 0x00, 0xf0, 0x67, 0xf8, 0x05, 0x1c, 0x00, 0xf0, 0x76, 0xf9, -0x3d, 0x70, 0x28, 0x1c, 0x01, 0x37, 0x01, 0x34, 0xb4, 0x42, 0xf1, 0xd3, -0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xff, 0xf7, 0xf6, 0xfe, -0x00, 0xf0, 0x56, 0xf8, 0x07, 0x1c, 0x00, 0xf0, 0x65, 0xf9, 0x38, 0x0a, -0xf6, 0xd3, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb4, 0x00, 0x22, -0x00, 0x23, 0x00, 0x29, 0x05, 0xd9, 0x07, 0x78, 0x7a, 0x40, 0x01, 0x30, -0x01, 0x33, 0x8b, 0x42, 0xf9, 0xd3, 0xd0, 0x43, 0x00, 0x06, 0x00, 0x0e, -0x80, 0xbc, 0x70, 0x47, 0xb0, 0xb5, 0xc2, 0xb0, 0x0f, 0x1c, 0x41, 0x02, -0x53, 0x20, 0xff, 0xf7, 0xab, 0xfe, 0x00, 0xf0, 0x47, 0xf9, 0xff, 0xf7, -0xd8, 0xff, 0x68, 0x46, 0xff, 0xf7, 0xbf, 0xff, 0x02, 0xad, 0x6d, 0x78, -0x00, 0x24, 0x02, 0xab, 0x5c, 0x70, 0x68, 0x46, 0x0c, 0x21, 0xff, 0xf7, -0xd9, 0xff, 0xa8, 0x42, 0x02, 0xd1, 0x00, 0x98, 0x87, 0x42, 0x01, 0xd3, -0x20, 0x1c, 0x00, 0xe0, 0x01, 0x20, 0x42, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x80, 0xb5, 0xc2, 0xb0, 0x69, 0x46, 0x02, 0x20, 0xff, 0xf7, -0xbb, 0xfe, 0x68, 0x46, 0xc1, 0x1d, 0x05, 0x31, 0x00, 0x20, 0x07, 0x4a, -0x0f, 0x88, 0x43, 0x00, 0xd7, 0x52, 0x02, 0x31, 0x01, 0x30, 0x00, 0x04, -0x00, 0x0c, 0x25, 0x28, 0xf6, 0xdb, 0x42, 0xb0, 0x80, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x70, 0x67, 0x21, 0x40, 0xfc, 0x46, 0x60, 0x47, -0x00, 0x00, 0xa0, 0xe3, 0xb4, 0x22, 0x9f, 0xe5, +0xc0, 0x46, 0x8f, 0x64, 0xc2, 0x6b, 0xc0, 0x46, 0xca, 0x64, 0xc2, 0x88, +0xc0, 0x46, 0x0a, 0x80, 0x82, 0x7a, 0x12, 0x06, 0x03, 0x7a, 0x1b, 0x04, +0x1a, 0x43, 0xc3, 0x88, 0x1b, 0x02, 0x1a, 0x43, 0x43, 0x7a, 0xdb, 0x07, +0x1a, 0x43, 0x8a, 0x60, 0x17, 0x1c, 0x83, 0x7a, 0x5a, 0x08, 0x05, 0xd3, +0x14, 0x22, 0x1c, 0x1c, 0xa3, 0x08, 0x02, 0xd2, 0x15, 0x22, 0x00, 0xe0, +0x00, 0x22, 0x00, 0x7a, 0x43, 0x08, 0x10, 0xd3, 0xc0, 0x08, 0x02, 0xd3, +0x88, 0x20, 0x10, 0x43, 0x01, 0xe0, 0x80, 0x20, 0x10, 0x43, 0x3a, 0x0a, +0x12, 0x02, 0x01, 0x23, 0x1a, 0x43, 0xc8, 0x60, 0x8a, 0x60, 0x08, 0x1c, +0xff, 0xf7, 0x0e, 0xfe, 0x05, 0xe0, 0x38, 0x0a, 0x00, 0x02, 0x03, 0x23, +0x18, 0x43, 0x88, 0x60, 0xca, 0x60, 0x03, 0x48, 0x01, 0x89, 0x01, 0x31, +0x01, 0x81, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x0c, 0x2b, 0x00, 0x80, +0xf0, 0xb4, 0x02, 0x6d, 0x14, 0x4c, 0x15, 0x1c, 0xe7, 0x69, 0xbd, 0x40, +0x13, 0x1c, 0x26, 0x6a, 0xf3, 0x40, 0x5d, 0x40, 0x2e, 0x1c, 0x45, 0x6d, +0xbd, 0x40, 0x6e, 0x40, 0x2b, 0x1c, 0x35, 0x1c, 0xfd, 0x40, 0x2f, 0x1c, +0xbb, 0x00, 0x65, 0x6a, 0xeb, 0x58, 0x00, 0x2b, 0x08, 0xd0, 0x23, 0x69, +0x01, 0x37, 0x9f, 0x42, 0x00, 0xd3, 0x00, 0x27, 0xbe, 0x00, 0xae, 0x59, +0x00, 0x2e, 0xf7, 0xd1, 0xa4, 0x69, 0xa2, 0x40, 0x11, 0x43, 0x05, 0x4b, +0x19, 0x43, 0xba, 0x00, 0xa9, 0x50, 0x40, 0x30, 0x87, 0x83, 0xf0, 0xbc, +0x70, 0x47, 0x00, 0x00, 0x4c, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +0x80, 0xb4, 0x00, 0x22, 0x00, 0x23, 0x00, 0x29, 0x05, 0xd9, 0x07, 0x78, +0x7a, 0x40, 0x01, 0x30, 0x01, 0x33, 0x8b, 0x42, 0xf9, 0xd3, 0xd0, 0x43, +0x00, 0x06, 0x00, 0x0e, 0x80, 0xbc, 0x70, 0x47, 0xf0, 0xb5, 0x07, 0x1c, +0x00, 0x24, 0xff, 0x26, 0x09, 0x36, 0x20, 0x1c, 0x00, 0xf0, 0x8c, 0xf8, +0x00, 0xf0, 0x9e, 0xf9, 0x05, 0x1c, 0x00, 0xf0, 0xad, 0xfa, 0x3d, 0x70, +0x28, 0x1c, 0x01, 0x37, 0x01, 0x34, 0xb4, 0x42, 0xf1, 0xd3, 0xf0, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x00, 0xf0, 0x85, 0xf8, 0x00, 0xf0, +0x8d, 0xf9, 0x07, 0x1c, 0x00, 0xf0, 0x9c, 0xfa, 0x38, 0x0a, 0xf6, 0xd3, +0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf3, 0xb5, 0x81, 0xb0, 0x41, 0x02, +0x53, 0x20, 0x00, 0xf0, 0x57, 0xf8, 0x00, 0xf0, 0x8f, 0xfa, 0xff, 0xf7, +0xe9, 0xff, 0x00, 0x24, 0x00, 0x26, 0x00, 0x25, 0x00, 0x27, 0x30, 0x1c, +0x01, 0x36, 0x00, 0xf0, 0x5f, 0xf8, 0x00, 0xf0, 0x71, 0xf9, 0x00, 0x90, +0x00, 0xf0, 0x80, 0xfa, 0xf8, 0x00, 0x00, 0x99, 0x81, 0x40, 0x0d, 0x43, +0x01, 0x34, 0x01, 0x37, 0x04, 0x2f, 0xee, 0xd3, 0x02, 0x99, 0x20, 0xc1, +0x02, 0x91, 0xff, 0x23, 0x09, 0x33, 0x9c, 0x42, 0xe5, 0xd3, 0x03, 0xb0, +0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, +0x16, 0x48, 0xc0, 0x6f, 0x40, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, +0x00, 0x26, 0x20, 0xcf, 0xb1, 0x00, 0x84, 0x20, 0x00, 0xf0, 0x24, 0xf8, +0x28, 0x1c, 0x00, 0xf0, 0xd3, 0xf9, 0x28, 0x0a, 0x00, 0xf0, 0xd0, 0xf9, +0x28, 0x0c, 0x00, 0xf0, 0xcd, 0xf9, 0x28, 0x0e, 0x00, 0xf0, 0xca, 0xf9, +0x00, 0xf0, 0x50, 0xfa, 0x01, 0x36, 0x42, 0x2e, 0xe9, 0xd3, 0x61, 0x02, +0x83, 0x20, 0x00, 0xf0, 0x0f, 0xf8, 0x00, 0xf0, +0x47, 0xfa, 0xff, 0xf7, 0xa1, 0xff, 0x04, 0x48, 0xc0, 0x6f, 0x40, 0x23, +0x01, 0x68, 0x99, 0x43, 0x01, 0x60, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0x90, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0xf0, +0x4d, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0xaa, 0xf9, 0x38, 0x0c, 0x00, 0xf0, +0xa7, 0xf9, 0x38, 0x0a, 0x00, 0xf0, 0xa4, 0xf9, 0x38, 0x1c, 0x00, 0xf0, +0xa1, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, +0x54, 0x20, 0xff, 0xf7, 0xe7, 0xff, 0x00, 0x20, 0x00, 0xf0, 0x96, 0xf9, +0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0xf0, 0x31, 0xfa, 0x57, 0x20, +0x00, 0xf0, 0x8e, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x08, 0x4f, +0xfa, 0x6f, 0x20, 0x23, 0x14, 0x68, 0x9c, 0x43, 0x14, 0x60, 0x23, 0x1c, +0xff, 0xf7, 0x73, 0xff, 0xf8, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, +0x01, 0x60, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, +0x90, 0xb5, 0x08, 0x4f, 0xfa, 0x6f, 0x20, 0x23, 0x14, 0x68, 0x9c, 0x43, +0x14, 0x60, 0x23, 0x1c, 0xff, 0xf7, 0x89, 0xff, 0xf8, 0x6f, 0x20, 0x23, +0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0xb0, 0xb5, 0x0f, 0x1c, 0x15, 0x4d, 0xe9, 0x6f, +0x20, 0x23, 0x0a, 0x68, 0x9a, 0x43, 0x0a, 0x60, 0x41, 0x02, 0x53, 0x20, +0xff, 0xf7, 0xa6, 0xff, 0x00, 0xf0, 0xde, 0xf9, 0xff, 0xf7, 0x38, 0xff, +0xf8, 0x1d, 0x05, 0x30, 0x44, 0x1c, 0xff, 0xf7, 0xb1, 0xff, 0x00, 0xf0, +0xc3, 0xf8, 0x07, 0x1c, 0x00, 0xf0, 0xd2, 0xf9, 0x20, 0x1c, 0xff, 0xf7, +0xa9, 0xff, 0x00, 0xf0, 0xbb, 0xf8, 0x04, 0x1c, 0x00, 0xf0, 0xca, 0xf9, +0xe8, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, 0x01, 0x60, 0x21, 0x02, +0x39, 0x43, 0x08, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0xf0, 0xb5, 0xc2, 0xb0, 0x04, 0x1c, 0x0d, 0x1c, +0x17, 0x1c, 0x61, 0x02, 0x19, 0x4e, 0xf0, 0x6f, 0x20, 0x23, 0x02, 0x68, +0x9a, 0x43, 0x02, 0x60, 0x53, 0x20, 0xff, 0xf7, 0x73, 0xff, 0x00, 0xf0, +0xab, 0xf9, 0xff, 0xf7, 0x05, 0xff, 0x68, 0x46, 0xff, 0xf7, 0xec, 0xfe, +0x6a, 0x46, 0xe8, 0x1d, 0x05, 0x30, 0x17, 0x54, 0x39, 0x0a, 0x68, 0x44, +0x41, 0x70, 0x68, 0x46, 0x00, 0x99, 0x0c, 0x30, 0xff, 0xf7, 0xd0, 0xfe, +0x02, 0xab, 0x18, 0x70, 0x00, 0x20, 0x58, 0x70, 0x68, 0x46, 0x0c, 0x21, +0xff, 0xf7, 0xc8, 0xfe, 0x02, 0xab, 0x58, 0x70, 0x69, 0x46, 0x20, 0x1c, +0xff, 0xf7, 0x1f, 0xff, 0xf0, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, +0x01, 0x60, 0x42, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0xff, 0xb5, 0xc2, 0xb0, 0x07, 0x1c, 0x6b, 0x46, +0x00, 0x20, 0xc4, 0x43, 0x10, 0xc3, 0x01, 0x30, 0x42, 0x28, 0xfb, 0xd3, +0x68, 0x46, 0x0c, 0x30, 0x03, 0x1c, 0x00, 0x24, 0x00, 0x2a, 0x0a, 0xd9, +0x0e, 0x88, 0xc0, 0x46, 0x06, 0x70, 0x0e, 0x88, 0x36, 0x12, 0x46, 0x70, +0x02, 0x30, 0x02, 0x31, 0x02, 0x34, 0x94, 0x42, 0xf4, 0xd3, 0x00, 0x92, +0x18, 0x1c, 0x11, 0x1c, 0xff, 0xf7, 0x96, 0xfe, 0x04, 0x1c, 0x00, 0x20, +0x01, 0x90, 0x02, 0xab, 0x1c, 0x70, 0x58, 0x70, 0x9d, 0x70, 0x68, 0x46, +0x0c, 0x21, 0xff, 0xf7, 0x8b, 0xfe, 0x02, 0xab, 0x58, 0x70, 0x45, 0x9b, +0x1d, 0x06, 0x2d, 0x0e, 0xac, 0x42, 0x03, 0xd1, 0x69, 0x46, 0x38, 0x1c, +0xff, 0xf7, 0x4a, 0xff, 0x01, 0x20, 0xac, 0x42, +0x00, 0xd1, 0x00, 0x20, 0x46, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0xb0, 0xb5, 0xc2, 0xb0, 0x0f, 0x1c, 0x41, 0x02, 0x14, 0x4c, 0xe0, 0x6f, +0x20, 0x23, 0x02, 0x68, 0x9a, 0x43, 0x02, 0x60, 0x53, 0x20, 0xff, 0xf7, +0xfb, 0xfe, 0x00, 0xf0, 0x33, 0xf9, 0xff, 0xf7, 0x8d, 0xfe, 0x68, 0x46, +0xff, 0xf7, 0x74, 0xfe, 0xe0, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, +0x02, 0xad, 0x01, 0x60, 0x6d, 0x78, 0x00, 0x24, 0x02, 0xab, 0x5c, 0x70, +0x68, 0x46, 0x0c, 0x21, 0xff, 0xf7, 0x56, 0xfe, 0xa8, 0x42, 0x02, 0xd1, +0x00, 0x98, 0x87, 0x42, 0x01, 0xd3, 0x20, 0x1c, 0x00, 0xe0, 0x01, 0x20, +0x42, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, +0xfc, 0x46, 0x60, 0x47, 0x00, 0x00, 0xa0, 0xe3, 0xb4, 0x22, 0x9f, 0xe5, 0xb4, 0x32, 0x9f, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x93, 0xe5, 0x81, 0x03, 0x80, 0xe1, @@ -3675,17 +3858,17 @@ 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x20, 0x12, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, +0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, +0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, +0xa0, 0x11, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, -0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0xa0, 0x11, 0xa0, 0xe1, +0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x20, 0x11, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, -0x00, 0x10, 0x82, 0xe5, 0x20, 0x11, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, +0x00, 0x10, 0x82, 0xe5, 0xa0, 0x10, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, -0xa0, 0x10, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, -0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, -0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe1, -0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, +0x00, 0x10, 0xa0, 0xe1, 0x00, 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x10, 0x82, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0xfc, 0x46, 0x60, 0x47, 0xa0, 0x30, 0x9f, 0xe5, 0x01, 0x10, 0xa0, 0xe3, @@ -3714,82 +3897,82 @@ 0x0a, 0x60, 0x70, 0x47, 0xb0, 0x6e, 0x21, 0x40, 0xf0, 0xb5, 0x07, 0x1c, 0x00, 0x24, 0x00, 0x2f, 0x21, 0xd0, 0x00, 0x26, 0xf8, 0x79, 0x00, 0x28, 0x1b, 0xdd, 0x30, 0x01, 0xc0, 0x19, 0xc5, 0x1d, 0x05, 0x35, 0x00, 0x7b, -0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0x92, 0xfb, 0x01, 0x1c, 0x8b, 0x68, +0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0x9e, 0xfb, 0x01, 0x1c, 0x8b, 0x68, 0x00, 0x2b, 0x08, 0xd0, 0x68, 0x68, 0x00, 0x28, 0x05, 0xd0, 0xca, 0x68, -0xa9, 0x68, 0xfb, 0xf7, 0x4a, 0xfb, 0x00, 0x20, 0x68, 0x60, 0x70, 0x1c, +0xa9, 0x68, 0xfa, 0xf7, 0x4e, 0xff, 0x00, 0x20, 0x68, 0x60, 0x70, 0x1c, 0x06, 0x06, 0x36, 0x0e, 0xf8, 0x79, 0xb0, 0x42, 0xe3, 0xdc, 0xff, 0x20, -0x38, 0x72, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf3, 0xb5, -0x81, 0xb0, 0x0f, 0x1c, 0x68, 0x46, 0xff, 0xf7, 0xbd, 0xff, 0x00, 0x28, -0x01, 0xd1, 0x0d, 0x20, 0x37, 0xe0, 0xb9, 0x88, 0xc0, 0x46, 0x01, 0x80, -0xf9, 0x88, 0xc0, 0x46, 0x41, 0x80, 0xb9, 0x7a, 0xc0, 0x46, 0x41, 0x71, -0xf9, 0x7a, 0xc0, 0x46, 0x81, 0x71, 0x8c, 0x21, 0x01, 0x71, 0x3d, 0x7e, -0x00, 0x21, 0x00, 0x23, 0x00, 0x2d, 0x1f, 0xdd, 0x1a, 0x01, 0xd2, 0x19, -0x1c, 0x32, 0x16, 0x78, 0x05, 0x2e, 0x0d, 0xdc, 0x0c, 0x01, 0x24, 0x18, -0x26, 0x73, 0x96, 0x68, 0xc0, 0x46, 0x66, 0x61, 0xd6, 0x68, 0xc0, 0x46, -0x26, 0x61, 0x00, 0x24, 0x01, 0x31, 0x09, 0x06, 0x09, 0x0e, 0xd4, 0x60, -0x5a, 0x1c, 0x13, 0x06, 0x1b, 0x0e, 0xab, 0x42, 0xe6, 0xdb, 0x00, 0x29, -0x04, 0xd0, 0xc1, 0x71, 0x00, 0x99, 0xc0, 0x46, +0x38, 0x72, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0xf3, 0xb5, 0x81, 0xb0, 0x0f, 0x1c, 0x68, 0x46, 0xff, 0xf7, +0xbd, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x20, 0x37, 0xe0, 0xb9, 0x88, +0xc0, 0x46, 0x01, 0x80, 0xf9, 0x88, 0xc0, 0x46, 0x41, 0x80, 0xb9, 0x7a, +0xc0, 0x46, 0x41, 0x71, 0xf9, 0x7a, 0xc0, 0x46, 0x81, 0x71, 0x8c, 0x21, +0x01, 0x71, 0x3d, 0x7e, 0x00, 0x21, 0x00, 0x23, 0x00, 0x2d, 0x1f, 0xdd, +0x1a, 0x01, 0xd2, 0x19, 0x1c, 0x32, 0x16, 0x78, 0x05, 0x2e, 0x0d, 0xdc, +0x0c, 0x01, 0x24, 0x18, 0x26, 0x73, 0x96, 0x68, 0xc0, 0x46, 0x66, 0x61, +0xd6, 0x68, 0xc0, 0x46, 0x26, 0x61, 0x00, 0x24, 0x01, 0x31, 0x09, 0x06, +0x09, 0x0e, 0xd4, 0x60, 0x5a, 0x1c, 0x13, 0x06, 0x1b, 0x0e, 0xab, 0x42, +0xe6, 0xdb, 0x00, 0x29, 0x04, 0xd0, 0xc1, 0x71, 0x00, 0x99, 0xc0, 0x46, 0x01, 0x72, 0x00, 0xe0, 0x00, 0x20, 0x01, 0x99, 0xc0, 0x46, 0x08, 0x60, 0x00, 0x20, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x07, 0x1c, 0x38, 0x7e, 0x00, 0x28, 0x28, 0xd0, 0x01, 0x38, 0x05, 0x06, 0x2d, 0x0e, 0x00, 0x26, 0xff, 0x2d, 0x21, 0xd0, 0x28, 0x01, 0xc0, 0x19, 0xc4, 0x1d, 0x15, 0x34, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, -0x1f, 0xfb, 0x01, 0x1c, 0x11, 0xd0, 0x8a, 0x68, 0x00, 0x2a, 0x0c, 0xd0, +0x2b, 0xfb, 0x01, 0x1c, 0x11, 0xd0, 0x8a, 0x68, 0x00, 0x2a, 0x0c, 0xd0, 0xe0, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x23, 0xcb, 0x56, 0x05, 0x2b, -0x05, 0xdc, 0x13, 0x1c, 0xca, 0x68, 0xa1, 0x68, 0xfb, 0xf7, 0xd1, 0xfa, +0x05, 0xdc, 0x13, 0x1c, 0xca, 0x68, 0xa1, 0x68, 0xfa, 0xf7, 0xd5, 0xfe, 0xe6, 0x60, 0xff, 0x20, 0x20, 0x70, 0x68, 0x1e, 0x05, 0x06, 0x2d, 0x0e, 0xff, 0x2d, 0xdd, 0xd1, 0x3e, 0x76, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x13, 0x20, 0x70, 0x47, 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xf8, 0x1d, 0xd5, 0x30, 0x39, 0x1c, 0xff, 0xf7, 0x7f, 0xff, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x3b, 0xd1, 0x38, 0x7e, 0xc0, 0x46, 0x01, 0x90, 0x00, 0x26, 0x01, 0x98, 0x00, 0x28, 0x2d, 0xdd, 0x30, 0x01, 0xc0, 0x19, 0xc5, 0x1d, -0x15, 0x35, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0xe4, 0xfa, +0x15, 0x35, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0xf0, 0xfa, 0x04, 0x1c, 0x20, 0x69, 0x00, 0x28, 0x17, 0xd0, 0x28, 0x78, 0x05, 0x28, 0x0d, 0xdd, 0xe9, 0x68, 0xaa, 0x68, 0x60, 0x68, 0x40, 0x08, 0x40, 0x00, -0x01, 0xf0, 0x0e, 0xf8, 0x09, 0x22, 0xe8, 0x68, 0xa9, 0x68, 0xfb, 0xf7, -0x87, 0xf9, 0x00, 0x20, 0xe8, 0x60, 0x21, 0x69, 0x28, 0x1c, 0xfb, 0xf7, -0x8c, 0xfa, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, +0x01, 0xf0, 0x2c, 0xf8, 0x09, 0x22, 0xe8, 0x68, 0xa9, 0x68, 0xfa, 0xf7, +0x8b, 0xfd, 0x00, 0x20, 0xe8, 0x60, 0x21, 0x69, 0x28, 0x1c, 0xfa, 0xf7, +0x90, 0xfe, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x0c, 0xd1, 0x70, 0x1c, 0x06, 0x06, 0x36, 0x0e, 0x01, 0x98, 0x86, 0x42, 0xd1, 0xdb, 0x00, 0x20, 0x38, 0x76, 0x00, 0x98, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xff, 0xf7, 0x82, 0xff, 0xf6, 0xe7, 0xc1, 0x1d, 0x79, 0x31, 0x4a, 0x6b, 0xc0, 0x46, 0xca, 0x63, 0xc1, 0x1d, 0xb9, 0x31, 0x0a, 0x60, 0x00, 0x22, 0x8a, 0x60, 0x04, 0x4a, 0xc0, 0x46, 0x4a, 0x61, 0x8a, 0x61, 0x01, 0x21, 0xd0, 0x30, 0x41, 0x70, 0x08, 0x1c, -0x70, 0x47, 0x00, 0x00, 0xb9, 0xbd, 0x21, 0x40, 0xf8, 0xb5, 0x07, 0x1c, +0x70, 0x47, 0x00, 0x00, 0xb1, 0xc5, 0x21, 0x40, 0xf8, 0xb5, 0x07, 0x1c, 0x00, 0x20, 0x00, 0x90, 0xfe, 0x1d, 0xc9, 0x36, 0x30, 0x78, 0x00, 0x01, 0xc0, 0x19, 0xc4, 0x1d, 0x15, 0x34, 0x80, 0x6a, 0x45, 0x08, 0x6d, 0x00, 0x04, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xb2, 0xfe, 0x31, 0x78, 0x40, 0x18, 0x01, 0x06, 0x09, 0x0e, 0x00, 0x20, 0xa2, 0x68, 0x00, 0x2a, 0x0a, 0xd9, 0x2a, 0x78, 0x4a, 0x40, 0x2a, 0x70, 0x01, 0x30, 0x09, 0x18, 0x09, 0x06, -0x09, 0x0e, 0xa2, 0x68, 0x01, 0x35, 0x82, 0x42, 0xf4, 0xd8, 0xe0, 0x68, -0xa1, 0x68, 0x40, 0x08, 0x40, 0x00, 0xff, 0xf7, 0x99, 0xfe, 0x61, 0x78, -0x81, 0x42, 0x0a, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x0f, 0xf8, 0xf8, 0x1d, -0x79, 0x30, 0x80, 0x6b, 0xf9, 0x1d, 0xb9, 0x31, 0xc8, 0x60, 0x0c, 0x20, -0x00, 0x90, 0x30, 0x78, 0x01, 0x30, 0x30, 0x70, 0x00, 0x98, 0xf8, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0xc2, 0x1d, 0xc9, 0x32, 0x11, 0x78, 0x09, 0x01, -0x09, 0x18, 0x09, 0x6a, 0xc3, 0x1d, 0x79, 0x33, 0xd9, 0x63, 0x13, 0x78, -0x1b, 0x01, 0x1b, 0x18, 0x5b, 0x6a, 0xcb, 0x18, 0xc1, 0x1d, 0xb9, 0x31, -0x0b, 0x60, 0x13, 0x78, 0x1b, 0x01, 0x1b, 0x18, 0x9b, 0x6a, 0xc0, 0x46, -0x8b, 0x60, 0x07, 0x4b, 0xc0, 0x46, 0x4b, 0x61, 0x12, 0x78, 0x00, 0x7e, -0x01, 0x32, 0x82, 0x42, 0x01, 0xdb, 0x04, 0x48, +0x09, 0x0e, 0xa2, 0x68, 0x01, 0x35, 0x82, 0x42, +0xf4, 0xd8, 0xe0, 0x68, 0xa1, 0x68, 0x40, 0x08, 0x40, 0x00, 0xff, 0xf7, +0x99, 0xfe, 0x61, 0x78, 0x81, 0x42, 0x0a, 0xd0, 0x38, 0x1c, 0x00, 0xf0, +0x0f, 0xf8, 0xf8, 0x1d, 0x79, 0x30, 0x80, 0x6b, 0xf9, 0x1d, 0xb9, 0x31, +0xc8, 0x60, 0x0c, 0x20, 0x00, 0x90, 0x30, 0x78, 0x01, 0x30, 0x30, 0x70, +0x00, 0x98, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xc2, 0x1d, 0xc9, 0x32, +0x11, 0x78, 0x09, 0x01, 0x09, 0x18, 0x09, 0x6a, 0xc3, 0x1d, 0x79, 0x33, +0xd9, 0x63, 0x13, 0x78, 0x1b, 0x01, 0x1b, 0x18, 0x5b, 0x6a, 0xcb, 0x18, +0xc1, 0x1d, 0xb9, 0x31, 0x0b, 0x60, 0x13, 0x78, 0x1b, 0x01, 0x1b, 0x18, +0x9b, 0x6a, 0xc0, 0x46, 0x8b, 0x60, 0x07, 0x4b, 0xc0, 0x46, 0x4b, 0x61, +0x12, 0x78, 0x00, 0x7e, 0x01, 0x32, 0x82, 0x42, 0x01, 0xdb, 0x04, 0x48, 0x00, 0xe0, 0x04, 0x48, 0xc0, 0x46, 0x88, 0x61, 0x00, 0x20, 0x70, 0x47, -0x81, 0xbe, 0x21, 0x40, 0x55, 0xbe, 0x21, 0x40, 0x01, 0xbf, 0x21, 0x40, +0x79, 0xc6, 0x21, 0x40, 0x4d, 0xc6, 0x21, 0x40, 0xf9, 0xc6, 0x21, 0x40, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x00, 0x90, 0x25, 0x7e, 0x29, 0x01, 0xe0, 0x1d, 0x15, 0x30, 0xff, 0xf7, 0x4e, 0xfe, 0xa1, 0x7e, 0x81, 0x42, 0x0a, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0x61, 0xf8, 0xe0, 0x1d, 0x79, 0x30, 0x80, 0x6b, 0xe1, 0x1d, 0xb9, 0x31, 0xc8, 0x60, 0x0b, 0x20, 0x55, 0xe0, 0x00, 0x27, 0x00, 0x2d, 0x0f, 0xdd, 0x38, 0x01, 0x00, 0x19, 0x00, 0x7f, -0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0x10, 0xfa, 0x00, 0x28, 0x01, 0xd1, +0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, 0x1c, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x20, 0x47, 0xe0, 0x78, 0x1c, 0x07, 0x06, 0x3f, 0x0e, 0xaf, 0x42, 0xef, 0xdb, 0x00, 0x26, 0x00, 0x2d, 0x38, 0xdd, 0x30, 0x01, 0x00, 0x19, 0xc7, 0x1d, 0x15, 0x37, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x16, 0x00, 0xf0, -0xfb, 0xf9, 0x00, 0x23, 0xc1, 0x56, 0x05, 0x29, 0x0c, 0xdc, 0x42, 0x68, -0x00, 0x2a, 0x04, 0xd0, 0xc1, 0x68, 0xb8, 0x68, 0xfb, 0xf7, 0xb2, 0xf9, +0x07, 0xfa, 0x00, 0x23, 0xc1, 0x56, 0x05, 0x29, 0x0c, 0xdc, 0x42, 0x68, +0x00, 0x2a, 0x04, 0xd0, 0xc1, 0x68, 0xb8, 0x68, 0xfa, 0xf7, 0xb6, 0xfd, 0xf8, 0x60, 0xf8, 0x68, 0x00, 0x28, 0x1b, 0xd1, 0x0e, 0x20, 0x17, 0xe0, -0xc0, 0x68, 0x00, 0x28, 0x07, 0xd0, 0xfb, 0xf7, 0xa5, 0xf9, 0x00, 0x28, +0xc0, 0x68, 0x00, 0x28, 0x07, 0xd0, 0xfa, 0xf7, 0xa9, 0xfd, 0x00, 0x28, 0x05, 0xda, 0x40, 0x42, 0xb9, 0x68, 0x81, 0x42, 0x04, 0xd0, 0x05, 0x20, 0x0a, 0xe0, 0xb9, 0x68, 0x81, 0x42, 0xfa, 0xd8, 0x09, 0x21, 0xb8, 0x68, -0xfb, 0xf7, 0x7a, 0xf8, 0xf8, 0x60, 0x00, 0x28, 0x02, 0xd1, 0x06, 0x20, +0xfa, 0xf7, 0x7e, 0xfc, 0xf8, 0x60, 0x00, 0x28, 0x02, 0xd1, 0x06, 0x20, 0x00, 0x90, 0x07, 0xe0, 0x70, 0x1c, 0x06, 0x06, 0x36, 0x0e, 0xae, 0x42, 0xc6, 0xdb, 0x00, 0x98, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x98, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xc2, 0x1d, @@ -3797,25 +3980,25 @@ 0x8a, 0x18, 0xc1, 0x1d, 0xb9, 0x31, 0x0a, 0x60, 0xc2, 0x1d, 0x15, 0x32, 0x8a, 0x60, 0x05, 0x4a, 0xc0, 0x46, 0x4a, 0x61, 0x04, 0x4a, 0xc0, 0x46, 0x8a, 0x61, 0x00, 0x21, 0xd0, 0x30, 0x01, 0x70, 0x08, 0x1c, 0x70, 0x47, -0x59, 0xbf, 0x21, 0x40, 0x01, 0xbf, 0x21, 0x40, 0x90, 0xb5, 0x07, 0x1c, +0x51, 0xc7, 0x21, 0x40, 0xf9, 0xc6, 0x21, 0x40, 0x90, 0xb5, 0x07, 0x1c, 0x38, 0x68, 0x1d, 0x4b, 0x98, 0x42, 0x03, 0xd0, 0x03, 0x20, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x1c, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xbc, 0xfd, 0xfc, 0x1d, 0x79, 0x34, 0x00, 0x28, 0x09, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x2d, 0xf8, 0xf9, 0x1d, 0xb9, 0x31, 0xa0, 0x6b, 0xc0, 0x46, 0xc8, 0x60, 0x0a, 0x20, 0xea, 0xe7, 0x38, 0x7a, 0x1c, 0x28, 0x04, 0xd0, 0x78, 0x7a, 0x10, 0x28, 0x01, 0xd0, 0x04, 0x20, 0xe2, 0xe7, 0xb8, 0x7a, 0x01, 0x28, -0x01, 0xd0, 0x07, 0x20, 0xdd, 0xe7, 0x60, 0x6b, 0xf9, 0x68, 0x88, 0x42, -0x01, 0xd0, 0x05, 0x20, 0xd7, 0xe7, 0x38, 0x69, 0x00, 0x28, 0x04, 0xd0, -0x06, 0x4b, 0x98, 0x42, 0x01, 0xd0, 0x08, 0x20, 0xcf, 0xe7, 0x38, 0x7e, -0x08, 0x28, 0x01, 0xdd, 0x12, 0x20, 0xca, 0xe7, 0x00, 0x20, 0xc8, 0xe7, -0x73, 0x6e, 0x69, 0x70, 0x17, 0x40, 0x00, 0x02, 0xb8, 0xb5, 0x07, 0x1c, -0x38, 0x1c, 0xff, 0xf7, 0x2a, 0xfe, 0x00, 0x25, 0xf8, 0x1d, 0xc9, 0x30, -0x45, 0x70, 0xfc, 0x1d, 0xb9, 0x34, 0xe5, 0x61, 0x68, 0x46, 0xff, 0xf7, -0x9d, 0xfd, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x20, 0x0d, 0xe0, 0xf8, 0x1d, -0x79, 0x30, 0x85, 0x63, 0xc5, 0x63, 0x1b, 0x20, 0x20, 0x60, 0xa7, 0x60, -0x04, 0x48, 0xc0, 0x46, 0x60, 0x61, 0x04, 0x48, 0xc0, 0x46, 0xa0, 0x61, -0x28, 0x1c, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0x75, 0xc0, 0x21, 0x40, 0x3b, 0xc0, 0x21, 0x40, 0xf0, 0xb5, 0x82, 0xb0, +0x01, 0xd0, 0x07, 0x20, 0xdd, 0xe7, 0x60, 0x6b, +0xf9, 0x68, 0x88, 0x42, 0x01, 0xd0, 0x05, 0x20, 0xd7, 0xe7, 0x38, 0x69, +0x00, 0x28, 0x04, 0xd0, 0x06, 0x4b, 0x98, 0x42, 0x01, 0xd0, 0x08, 0x20, +0xcf, 0xe7, 0x38, 0x7e, 0x08, 0x28, 0x01, 0xdd, 0x12, 0x20, 0xca, 0xe7, +0x00, 0x20, 0xc8, 0xe7, 0x73, 0x6e, 0x69, 0x70, 0x02, 0x10, 0x00, 0x03, +0xb8, 0xb5, 0x07, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x2a, 0xfe, 0x00, 0x25, +0xf8, 0x1d, 0xc9, 0x30, 0x45, 0x70, 0xfc, 0x1d, 0xb9, 0x34, 0xe5, 0x61, +0x68, 0x46, 0xff, 0xf7, 0x9d, 0xfd, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x20, +0x0d, 0xe0, 0xf8, 0x1d, 0x79, 0x30, 0x85, 0x63, 0xc5, 0x63, 0x1b, 0x20, +0x20, 0x60, 0xa7, 0x60, 0x04, 0x48, 0xc0, 0x46, 0x60, 0x61, 0x04, 0x48, +0xc0, 0x46, 0xa0, 0x61, 0x28, 0x1c, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x6d, 0xc8, 0x21, 0x40, 0x33, 0xc8, 0x21, 0x40, 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x00, 0x20, 0xfd, 0x1d, 0x79, 0x35, 0xfc, 0x1d, 0xb9, 0x34, 0xe9, 0x6a, 0xc0, 0x46, 0x61, 0x60, 0x62, 0x68, 0xe9, 0x6b, 0x8a, 0x42, 0x03, 0xd2, 0x61, 0x60, 0x2a, 0x6b, 0x91, 0x42, 0x34, 0xd2, 0x66, 0x68, @@ -3823,52 +4006,54 @@ 0x26, 0x68, 0x2a, 0x6b, 0x96, 0x42, 0x00, 0xd2, 0x32, 0x1c, 0x01, 0x9e, 0x96, 0x1b, 0xa2, 0x68, 0xc0, 0x46, 0x00, 0x92, 0x00, 0x2a, 0x09, 0xd0, 0x28, 0x6a, 0x6a, 0x6a, 0x41, 0x18, 0x00, 0x98, 0xc0, 0x18, 0x33, 0x1c, -0xfc, 0xf7, 0xc4, 0xff, 0x00, 0x28, 0x1b, 0xd1, 0x61, 0x68, 0x89, 0x19, +0xfc, 0xf7, 0x68, 0xff, 0x00, 0x28, 0x1b, 0xd1, 0x61, 0x68, 0x89, 0x19, 0x61, 0x60, 0x22, 0x68, 0x91, 0x42, 0x0d, 0xd1, 0x61, 0x69, 0x38, 0x1c, -0xfb, 0xf7, 0xc1, 0xf8, 0x00, 0x06, 0x00, 0x0e, 0x0e, 0xd1, 0xa1, 0x69, -0x38, 0x1c, 0xfb, 0xf7, 0xba, 0xf8, 0x00, 0x06, 0x00, 0x0e, 0x07, 0xd1, +0xfa, 0xf7, 0xc5, 0xfc, 0x00, 0x06, 0x00, 0x0e, 0x0e, 0xd1, 0xa1, 0x69, +0x38, 0x1c, 0xfa, 0xf7, 0xbe, 0xfc, 0x00, 0x06, 0x00, 0x0e, 0x07, 0xd1, 0x61, 0x68, 0x2a, 0x6b, 0x91, 0x42, 0xc2, 0xd3, 0xa9, 0x6b, 0xaa, 0x6a, 0x89, 0x18, 0xa9, 0x63, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xb0, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfb, 0xf7, -0xbf, 0xfa, 0xfa, 0x1d, 0x09, 0x32, 0x32, 0x48, 0x00, 0x21, 0xc9, 0x43, -0xc4, 0x1d, 0xb9, 0x34, 0xe1, 0x60, 0xf9, 0x88, 0xc3, 0x1d, 0x89, 0x33, -0x19, 0x73, 0xc1, 0x1d, 0x79, 0x31, 0xbd, 0x68, 0xc0, 0x46, 0x0d, 0x62, -0xff, 0x68, 0xc0, 0x46, 0x4f, 0x62, 0x17, 0x68, 0xc0, 0x46, 0x8f, 0x62, -0x57, 0x68, 0xc0, 0x46, 0xcf, 0x62, 0x92, 0x68, 0xc0, 0x46, 0x4a, 0x63, -0xca, 0x6a, 0x8f, 0x6a, 0xd2, 0x19, 0x0a, 0x63, 0x1a, 0x7b, 0x01, 0x2a, -0x0d, 0xd0, 0x02, 0x2a, 0x1a, 0xd0, 0x03, 0x2a, 0x2e, 0xd1, 0xc2, 0x1d, -0xc9, 0x32, 0x52, 0x78, 0x00, 0x2a, 0x07, 0xd1, 0x10, 0x20, 0x89, 0x6b, -0xc0, 0x46, 0xe1, 0x60, 0x25, 0xe0, 0xff, 0xf7, 0x4d, 0xff, 0x22, 0xe0, -0xff, 0xf7, 0xac, 0xfd, 0x00, 0x28, 0x1e, 0xd1, 0xe1, 0x69, 0x00, 0x29, -0x1b, 0xd0, 0x09, 0x7a, 0x15, 0x4b, 0xc9, 0x18, 0x02, 0x91, 0x16, 0xe0, -0x8a, 0x6a, 0xcb, 0x6a, 0x9f, 0x18, 0x4d, 0x6b, 0xaf, 0x42, 0x05, 0xd8, -0x00, 0x2a, 0x03, 0xd0, 0x9f, 0x07, 0x01, 0xd1, 0x92, 0x07, 0x01, 0xd0, -0x0f, 0x20, 0x08, 0xe0, 0x89, 0x6b, 0x99, 0x42, 0x01, 0xd0, 0xe1, 0x60, -0xf8, 0xe7, 0xff, 0xf7, 0x53, 0xff, 0x00, 0xe0, 0x10, 0x20, 0x01, 0xab, -0x58, 0x80, 0xe0, 0x68, 0xc0, 0x46, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, -0xfb, 0xf7, 0x9e, 0xf9, 0x01, 0x20, 0x04, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x3c, 0xac, 0x20, 0x40, 0x0d, 0xf0, 0xfe, 0xca, -0x80, 0xb5, 0x85, 0xb0, 0x07, 0x1c, 0x38, 0x1c, 0x01, 0xa9, 0xfb, 0xf7, -0x4d, 0xfa, 0x68, 0x46, 0xb9, 0x68, 0xff, 0xf7, 0xa0, 0xfc, 0x00, 0x28, -0x02, 0xd1, 0x00, 0x98, 0xff, 0xf7, 0xc4, 0xfc, 0x02, 0xab, 0x58, 0x80, -0x00, 0x21, 0x01, 0xa8, 0xfb, 0xf7, 0x7e, 0xf9, 0x01, 0x20, 0x05, 0xb0, -0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x85, 0xb0, 0x07, 0x1c, -0x38, 0x1c, 0x01, 0xa9, 0xfb, 0xf7, 0x32, 0xfa, 0x68, 0x46, 0xb9, 0x68, -0xff, 0xf7, 0x85, 0xfc, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x02, 0xab, -0x58, 0x80, 0x00, 0x21, 0x01, 0xa8, 0xfb, 0xf7, 0x65, 0xf9, 0x01, 0x20, -0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x85, 0xb0, -0x07, 0x1c, 0x38, 0x1c, 0x01, 0xa9, 0xfb, 0xf7, -0x19, 0xfa, 0x3c, 0x69, 0x38, 0x1c, 0x01, 0xa9, 0xfb, 0xf7, 0x14, 0xfa, -0x68, 0x46, 0x21, 0x1c, 0xff, 0xf7, 0x67, 0xfc, 0x8c, 0x24, 0x00, 0x28, +0xf0, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x69, 0x46, 0x38, 0x1c, 0xfa, 0xf7, +0xc3, 0xfe, 0xfa, 0x1d, 0x09, 0x32, 0x37, 0x49, 0x00, 0x20, 0xc0, 0x43, +0xcc, 0x1d, 0xb9, 0x34, 0xe0, 0x60, 0xf8, 0x88, 0xcb, 0x1d, 0x89, 0x33, +0x18, 0x73, 0xc8, 0x1d, 0x79, 0x30, 0xbd, 0x68, 0xc0, 0x46, 0x05, 0x62, +0xff, 0x68, 0xc0, 0x46, 0x47, 0x62, 0x17, 0x68, 0xc0, 0x46, 0x87, 0x62, +0x57, 0x68, 0xc0, 0x46, 0xc7, 0x62, 0x92, 0x68, 0xc0, 0x46, 0x42, 0x63, +0xc2, 0x6a, 0x87, 0x6a, 0xd2, 0x19, 0x02, 0x63, 0x1a, 0x7b, 0x28, 0x4d, +0x01, 0x2a, 0x0d, 0xd0, 0x02, 0x2a, 0x1c, 0xd0, 0x03, 0x2a, 0x35, 0xd1, +0xca, 0x1d, 0xc9, 0x32, 0x52, 0x78, 0x00, 0x2a, 0x08, 0xd1, 0x10, 0x27, +0x80, 0x6b, 0xc0, 0x46, 0xe0, 0x60, 0x2c, 0xe0, 0x08, 0x1c, 0xff, 0xf7, +0x4b, 0xff, 0x22, 0xe0, 0x08, 0x1c, 0xff, 0xf7, 0xa9, 0xfd, 0x07, 0x1c, +0x23, 0xd1, 0xe0, 0x69, 0x00, 0x28, 0x1c, 0xd0, 0x00, 0x7a, 0x1a, 0x4b, +0xc0, 0x18, 0x02, 0x90, 0x17, 0xe0, 0x82, 0x6a, 0xc3, 0x6a, 0x9f, 0x18, +0x46, 0x6b, 0xb7, 0x42, 0x05, 0xd8, 0x00, 0x2a, 0x03, 0xd0, 0x9f, 0x07, +0x01, 0xd1, 0x92, 0x07, 0x01, 0xd0, 0x0f, 0x27, 0x0d, 0xe0, 0x80, 0x6b, +0x98, 0x42, 0x01, 0xd0, 0xe0, 0x60, 0xf8, 0xe7, 0x08, 0x1c, 0xff, 0xf7, +0x4f, 0xff, 0x07, 0x1c, 0x03, 0xd1, 0x00, 0xf0, 0x1f, 0xfe, 0x01, 0xe0, +0x10, 0x27, 0x00, 0x20, 0x28, 0x65, 0x01, 0xab, 0x5f, 0x80, 0xe0, 0x68, +0xc0, 0x46, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, +0xfa, 0xf7, 0x98, 0xfd, 0x01, 0x20, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x3c, 0xac, 0x20, 0x40, 0x00, 0x00, 0x00, 0x80, +0x0d, 0xf0, 0xfe, 0xca, 0x80, 0xb5, 0x85, 0xb0, 0x07, 0x1c, 0x38, 0x1c, +0x01, 0xa9, 0xfa, 0xf7, 0x45, 0xfe, 0x68, 0x46, 0xb9, 0x68, 0xff, 0xf7, +0x94, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x98, 0xff, 0xf7, 0xb8, 0xfc, +0x02, 0xab, 0x58, 0x80, 0x00, 0x21, 0x01, 0xa8, 0xfa, 0xf7, 0x76, 0xfd, +0x01, 0x20, 0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, +0x85, 0xb0, 0x07, 0x1c, 0x38, 0x1c, 0x01, 0xa9, 0xfa, 0xf7, 0x2a, 0xfe, +0x68, 0x46, 0xb9, 0x68, 0xff, 0xf7, 0x79, 0xfc, 0x00, 0x28, 0x00, 0xd1, +0x02, 0x20, 0x02, 0xab, 0x58, 0x80, 0x00, 0x21, 0x01, 0xa8, 0xfa, 0xf7, +0x5d, 0xfd, 0x01, 0x20, 0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x90, 0xb5, 0x85, 0xb0, 0x07, 0x1c, 0x38, 0x1c, 0x01, 0xa9, 0xfa, 0xf7, +0x11, 0xfe, 0x3c, 0x69, 0x38, 0x1c, 0x01, 0xa9, 0xfa, 0xf7, 0x0c, 0xfe, +0x68, 0x46, 0x21, 0x1c, 0xff, 0xf7, 0x5b, 0xfc, 0x8c, 0x24, 0x00, 0x28, 0x0e, 0xd1, 0xb9, 0x68, 0x00, 0x29, 0x02, 0xd1, 0xfa, 0x68, 0x00, 0x2a, 0x08, 0xd0, 0xf8, 0x88, 0x23, 0x1c, 0x8c, 0x28, 0x00, 0xd8, 0x03, 0x1c, -0xf8, 0x68, 0x00, 0x9a, 0xfc, 0xf7, 0x38, 0xfe, 0x02, 0xab, 0x58, 0x80, -0x03, 0x94, 0x00, 0x21, 0x01, 0xa8, 0xfb, 0xf7, 0x37, 0xf9, 0x01, 0x20, +0xf8, 0x68, 0x00, 0x9a, 0xfc, 0xf7, 0xd0, 0xfd, 0x02, 0xab, 0x58, 0x80, +0x03, 0x94, 0x00, 0x21, 0x01, 0xa8, 0xfa, 0xf7, 0x2f, 0xfd, 0x01, 0x20, 0x05, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, 0x04, 0x48, 0xff, 0x22, 0x02, 0x72, 0x8c, 0x30, 0x01, 0x31, 0x04, 0x29, 0xfa, 0xd3, 0x70, 0x47, 0x00, 0x00, 0xb0, 0x6e, 0x21, 0x40, 0x02, 0x48, 0x03, 0x49, -0x40, 0x1a, 0x40, 0x42, 0x70, 0x47, 0x00, 0x00, 0xb9, 0xce, 0x21, 0x40, -0xb5, 0xce, 0x21, 0x40, 0x00, 0x21, 0x08, 0x4a, 0x8b, 0x00, 0x5b, 0x18, +0x40, 0x1a, 0x40, 0x42, 0x70, 0x47, 0x00, 0x00, 0xed, 0xd6, 0x21, 0x40, +0xe9, 0xd6, 0x21, 0x40, 0x00, 0x21, 0x08, 0x4a, 0x8b, 0x00, 0x5b, 0x18, 0x9b, 0x00, 0xd3, 0x56, 0x83, 0x42, 0x04, 0xd1, 0x88, 0x00, 0x40, 0x18, 0x80, 0x00, 0x80, 0x18, 0x70, 0x47, 0x01, 0x31, 0x01, 0x29, 0xf1, 0xd3, 0x00, 0x20, 0xf9, 0xe7, 0xe0, 0x70, 0x21, 0x40, 0x80, 0xb5, 0x00, 0xf0, @@ -3883,212 +4068,215 @@ 0x02, 0x6b, 0xcb, 0x69, 0xd2, 0x18, 0x02, 0x63, 0x4a, 0x6a, 0x43, 0x6b, 0x9b, 0x18, 0x43, 0x63, 0x93, 0x42, 0x02, 0xd2, 0x82, 0x6b, 0x01, 0x32, 0x82, 0x63, 0xc2, 0x6b, 0x4b, 0x69, 0xd2, 0x18, 0xc2, 0x63, 0x02, 0x6c, -0xc9, 0x6a, 0x51, 0x18, 0x01, 0x64, 0x70, 0x47, 0x10, 0x2a, 0x00, 0x80, +0xc9, 0x6a, 0x51, 0x18, 0x01, 0x64, 0x70, 0x47, 0xa4, 0x2a, 0x00, 0x80, 0x00, 0x08, 0x14, 0x40, 0x88, 0xb5, 0x69, 0x46, 0x00, 0xf0, 0x17, 0xf8, 0x81, 0x08, 0x0a, 0xd0, 0x00, 0x20, 0x00, 0x29, 0x07, 0xd9, 0x00, 0x22, 0x83, 0x00, 0x00, 0x9f, 0xc0, 0x46, 0xfa, 0x50, 0x01, 0x30, 0x88, 0x42, 0xf8, 0xd3, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0xf0, -0x04, 0xf8, 0x00, 0x04, 0x00, 0x0c, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x22, -0x00, 0x28, 0x0a, 0xd0, 0x01, 0x28, 0x0a, 0xd0, 0x02, 0x28, 0x0c, 0xd0, -0x03, 0x28, 0x02, 0xd1, 0x07, 0x48, 0x1c, 0x22, 0x08, 0x60, 0x10, 0x1c, -0x70, 0x47, 0x06, 0x48, 0x04, 0xe0, 0x06, 0x48, 0x50, 0x22, 0x08, 0x60, -0xf7, 0xe7, 0x05, 0x48, 0x68, 0x22, 0x08, 0x60, 0xf3, 0xe7, 0x00, 0x00, -0x08, 0x83, 0x20, 0x40, 0x10, 0x2a, 0x00, 0x80, 0x78, 0x2a, 0x00, 0x80, -0xa0, 0x82, 0x20, 0x40, 0x98, 0xb5, 0x00, 0x27, 0x68, 0x46, 0xfe, 0xf7, -0xa7, 0xfb, 0x10, 0x4c, 0x00, 0x28, 0x0b, 0xd0, 0x00, 0xf0, 0x3e, 0xf8, -0x00, 0x28, 0x07, 0xd0, 0x01, 0x27, 0x10, 0x23, 0x20, 0x68, 0x18, 0x43, -0x20, 0x60, 0x60, 0x68, 0x18, 0x43, 0x0b, 0xe0, 0x10, 0x23, 0xa0, 0x68, -0x98, 0x43, 0xa0, 0x60, 0x20, 0x69, 0x98, 0x43, 0x20, 0x61, 0x20, 0x68, -0x98, 0x43, 0x20, 0x60, 0x60, 0x68, 0x98, 0x43, 0x60, 0x60, 0x38, 0x1c, -0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, -0xe8, 0x18, 0x00, 0x80, 0x00, 0xb5, 0x00, 0xf0, 0xb5, 0xfc, 0xfe, 0xf7, -0xc5, 0xfb, 0x00, 0x20, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x14, 0x24, +0x04, 0xf8, 0x00, 0x04, 0x00, 0x0c, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x22, 0x00, 0x28, 0x0a, 0xd0, 0x01, 0x28, 0x0a, 0xd0, +0x02, 0x28, 0x0c, 0xd0, 0x03, 0x28, 0x02, 0xd1, 0x07, 0x48, 0x1c, 0x22, +0x08, 0x60, 0x10, 0x1c, 0x70, 0x47, 0x06, 0x48, 0x04, 0xe0, 0x06, 0x48, +0x50, 0x22, 0x08, 0x60, 0xf7, 0xe7, 0x05, 0x48, 0x68, 0x22, 0x08, 0x60, +0xf3, 0xe7, 0x00, 0x00, 0x08, 0x83, 0x20, 0x40, 0xa4, 0x2a, 0x00, 0x80, +0x0c, 0x2b, 0x00, 0x80, 0xa0, 0x82, 0x20, 0x40, 0x98, 0xb5, 0x00, 0x27, +0x68, 0x46, 0xfe, 0xf7, 0x6f, 0xfb, 0x10, 0x4c, 0x00, 0x28, 0x0b, 0xd0, +0x00, 0xf0, 0x44, 0xf8, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x27, 0x10, 0x23, +0x60, 0x68, 0x18, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x18, 0x43, 0x0b, 0xe0, +0x10, 0x23, 0xe0, 0x68, 0x98, 0x43, 0xe0, 0x60, 0x60, 0x69, 0x98, 0x43, +0x60, 0x61, 0x60, 0x68, 0x98, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x98, 0x43, +0xa0, 0x60, 0x38, 0x1c, 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, +0x68, 0x19, 0x00, 0x80, 0x00, 0xb5, 0x00, 0xf0, 0xc7, 0xfc, 0x04, 0x49, +0x09, 0x6d, 0x08, 0x43, 0xfe, 0xf7, 0x8a, 0xfb, 0x00, 0x20, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xb5, 0x14, 0x24, 0x00, 0x25, 0x00, 0x27, 0x08, 0x4e, 0x02, 0x20, 0x21, 0x1c, 0x32, 0x1c, -0xfa, 0xf7, 0xec, 0xfe, 0x78, 0x40, 0x07, 0x04, 0x3f, 0x0c, 0x02, 0x34, +0xfa, 0xf7, 0xde, 0xfa, 0x78, 0x40, 0x07, 0x04, 0x3f, 0x0c, 0x02, 0x34, 0x01, 0x35, 0x03, 0x2d, 0xf3, 0xd3, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x39, 0xb7, 0x21, 0x40, 0x90, 0xb5, 0x01, 0x24, -0x20, 0x1c, 0x10, 0x49, 0xc9, 0x68, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, -0x00, 0x06, 0x00, 0x0e, 0x16, 0xd0, 0x0d, 0x4a, 0x3a, 0x21, 0x02, 0x20, -0xfa, 0xf7, 0xce, 0xfe, 0x07, 0x04, 0x3f, 0x0c, 0x03, 0xd1, 0x00, 0x20, -0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xf7, 0xcf, 0xff, 0xc0, 0x43, -0x00, 0x04, 0x00, 0x0c, 0xb8, 0x42, 0x00, 0xd0, 0x00, 0x24, 0x20, 0x06, -0x00, 0x0e, 0xf1, 0xe7, 0x20, 0x1c, 0xef, 0xe7, 0xe8, 0x0d, 0x00, 0x80, -0x39, 0xb7, 0x21, 0x40, 0xb0, 0xb5, 0x01, 0x27, 0x3a, 0x1c, 0x18, 0x4b, -0xdb, 0x68, 0x01, 0x2b, 0x00, 0xd0, 0x00, 0x22, 0x12, 0x06, 0x12, 0x0e, -0x00, 0x24, 0x00, 0x2a, 0x23, 0xd0, 0x14, 0x4a, 0x53, 0x68, 0x1b, 0x04, -0x1b, 0x0c, 0x1d, 0x02, 0x1b, 0x12, 0x2b, 0x43, 0x92, 0x68, 0x12, 0x04, -0x12, 0x0c, 0x15, 0x02, 0x12, 0x12, 0x2a, 0x43, 0x12, 0x04, 0x12, 0x0c, -0x1b, 0x04, 0x1a, 0x43, 0x51, 0x40, 0x01, 0x31, 0x0f, 0xd1, 0x00, 0x28, -0x02, 0xd0, 0xff, 0xf7, 0x9b, 0xff, 0xc4, 0x43, 0x22, 0x04, 0x12, 0x0c, -0x07, 0x4b, 0x3a, 0x21, 0x02, 0x20, 0xfa, 0xf7, 0x8a, 0xfe, 0x38, 0x1c, -0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x20, 0x1c, 0xfa, 0xe7, 0x00, 0x00, -0xe8, 0x0d, 0x00, 0x80, 0x40, 0x00, 0x14, 0x40, 0x7b, 0xb7, 0x21, 0x40, -0x80, 0xb4, 0x03, 0x22, 0xc2, 0x80, 0x15, 0x4a, 0xc0, 0x46, 0x82, 0x60, -0x14, 0x4a, 0x12, 0x88, 0x01, 0x32, 0xc2, 0x60, 0x00, 0x20, 0x13, 0x4a, -0x13, 0x5c, 0xc0, 0x46, 0x0b, 0x70, 0x01, 0x30, 0x01, 0x31, 0x08, 0x28, -0xf8, 0xd3, 0x20, 0x22, 0x0a, 0x70, 0x01, 0x31, 0x00, 0x20, 0x0e, 0x4b, -0x1f, 0x5c, 0xc0, 0x46, 0x0f, 0x70, 0x01, 0x30, 0x01, 0x31, 0x08, 0x28, -0xf8, 0xd3, 0x0a, 0x70, 0x01, 0x31, 0x00, 0x20, 0x09, 0x4a, 0x13, 0x5c, -0xc0, 0x46, 0x0b, 0x70, 0x01, 0x30, 0x01, 0x31, 0x08, 0x28, 0xf8, 0xd3, -0x00, 0x20, 0x08, 0x70, 0x80, 0xbc, 0x70, 0x47, 0x17, 0x40, 0x00, 0x02, -0xe8, 0x0d, 0x00, 0x80, 0xfc, 0x03, 0x00, 0x80, 0x05, 0x04, 0x00, 0x80, -0x0e, 0x04, 0x00, 0x80, 0xf0, 0xb5, 0x01, 0x21, 0x45, 0x4d, 0xe8, 0x1d, -0x79, 0x30, 0x41, 0x73, 0x01, 0x73, 0x64, 0x22, 0x42, 0x82, 0x82, 0x82, -0xc1, 0x82, 0x7d, 0x21, 0xc9, 0x00, 0x01, 0x83, 0x00, 0x21, 0x41, 0x83, -0x3f, 0x48, 0x01, 0x22, 0x00, 0xf0, 0x08, 0xfb, 0x00, 0x26, 0xf6, 0x43, -0x3d, 0x4c, 0xe7, 0x1d, 0x39, 0x37, 0xb0, 0x42, 0x07, 0xd1, 0xf8, 0x88, -0x01, 0x30, 0xf8, 0x80, 0xa0, 0x79, 0x01, 0x30, 0xa0, 0x71, 0xfc, 0xf7, -0xb3, 0xfd, 0x38, 0x48, 0x02, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xf4, 0xfa, -0xb0, 0x42, 0x07, 0xd1, 0xf8, 0x88, 0x01, 0x30, 0xf8, 0x80, 0xa0, 0x79, -0x01, 0x30, 0xa0, 0x71, 0xfc, 0xf7, 0xa4, 0xfd, 0xe8, 0x68, 0x2f, 0x1c, -0x01, 0x28, 0x05, 0xd1, 0x2f, 0x48, 0x7d, 0x22, 0xd2, 0x00, 0x00, 0x21, -0x00, 0xf0, 0xe0, 0xfa, 0x2d, 0x4d, 0x28, 0x1c, 0xfa, 0xf7, 0x02, 0xfe, -0x2c, 0x48, 0xfa, 0xf7, 0xff, 0xfd, 0x2c, 0x48, -0xfa, 0xf7, 0xfc, 0xfd, 0x2b, 0x4e, 0x71, 0x23, 0x5b, 0x01, 0xfc, 0x18, -0x2a, 0x4f, 0x20, 0x79, 0x00, 0x28, 0x0f, 0xd0, 0x28, 0x1c, 0xfa, 0xf7, -0xf1, 0xfd, 0x38, 0x1c, 0xfa, 0xf7, 0xee, 0xfd, 0x00, 0x28, 0x04, 0xd0, -0x38, 0x1c, 0xfa, 0xf7, 0xe9, 0xfd, 0x00, 0x28, 0xfa, 0xd1, 0x30, 0x1c, -0xfa, 0xf7, 0xe4, 0xfd, 0x60, 0x79, 0x00, 0x28, 0x23, 0xd0, 0x28, 0x1c, -0xfa, 0xf7, 0xde, 0xfd, 0x38, 0x1c, 0xfa, 0xf7, 0xdb, 0xfd, 0x00, 0x28, -0x04, 0xd0, 0x38, 0x1c, 0xfa, 0xf7, 0xd6, 0xfd, 0x00, 0x28, 0xfa, 0xd1, -0x19, 0x49, 0x01, 0x22, 0x12, 0x04, 0x08, 0x68, 0x02, 0x40, 0x14, 0x20, -0x00, 0x2a, 0x05, 0xd1, 0x0a, 0x68, 0x12, 0x0c, 0x06, 0xd1, 0x09, 0x68, -0x89, 0x0a, 0x03, 0xd3, 0x13, 0x49, 0xc0, 0x46, 0xc8, 0x60, 0x03, 0xe0, -0x12, 0x49, 0xc0, 0x46, 0x08, 0x64, 0xff, 0xe7, 0xfe, 0xe7, 0xff, 0xf7, -0x1e, 0xfe, 0x10, 0x48, 0xfa, 0xf7, 0xb8, 0xfd, 0x0f, 0x48, 0xfa, 0xf7, -0xb5, 0xfd, 0xbc, 0xe7, 0xe8, 0x0d, 0x00, 0x80, 0x5d, 0x22, 0xff, 0xff, -0xa0, 0x82, 0x20, 0x40, 0x21, 0x21, 0xff, 0xff, 0x59, 0x7e, 0x21, 0x40, -0xf4, 0x01, 0xff, 0xff, 0x09, 0x2c, 0xff, 0xff, 0x04, 0x02, 0xff, 0xff, -0x00, 0x00, 0xff, 0xff, 0xb5, 0x07, 0xff, 0xff, 0x00, 0x00, 0x10, 0x40, -0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0xa8, 0x21, 0x40, -0x48, 0x57, 0xff, 0xff, 0x00, 0xb5, 0x10, 0x20, 0x0f, 0x49, 0xc0, 0x46, -0x08, 0x60, 0x0f, 0x4a, 0x0f, 0x48, 0x64, 0x21, 0xfa, 0xf7, 0x8e, 0xfd, -0x0e, 0x48, 0x01, 0x22, 0x12, 0x04, 0x01, 0x68, 0x0a, 0x40, 0x08, 0x21, -0x00, 0x2a, 0x05, 0xd1, 0x02, 0x68, 0x12, 0x0c, 0x07, 0xd1, 0x00, 0x68, -0x80, 0x0a, 0x04, 0xd3, 0x08, 0x48, 0xc0, 0x46, 0xc1, 0x60, 0x08, 0xbc, -0x18, 0x47, 0x07, 0x48, 0xc0, 0x46, 0x01, 0x64, 0xf9, 0xe7, 0x00, 0x00, -0x00, 0x00, 0x00, 0xb0, 0x25, 0x55, 0xff, 0xff, 0xf8, 0x28, 0x00, 0x80, +0x18, 0x47, 0x00, 0x00, 0x79, 0xbf, 0x21, 0x40, 0x01, 0x20, 0x70, 0x47, +0xb0, 0xb5, 0x01, 0x27, 0x3a, 0x1c, 0x18, 0x4b, 0xdb, 0x68, 0x01, 0x2b, +0x00, 0xd0, 0x00, 0x22, 0x12, 0x06, 0x12, 0x0e, 0x00, 0x24, 0x00, 0x2a, +0x23, 0xd0, 0x14, 0x4a, 0x53, 0x68, 0x1b, 0x04, 0x1b, 0x0c, 0x1d, 0x02, +0x1b, 0x12, 0x2b, 0x43, 0x92, 0x68, 0x12, 0x04, 0x12, 0x0c, 0x15, 0x02, +0x12, 0x12, 0x2a, 0x43, 0x12, 0x04, 0x12, 0x0c, 0x1b, 0x04, 0x1a, 0x43, +0x51, 0x40, 0x01, 0x31, 0x0f, 0xd1, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, +0xc1, 0xff, 0xc4, 0x43, 0x22, 0x04, 0x12, 0x0c, 0x07, 0x4b, 0x3a, 0x21, +0x02, 0x20, 0xfa, 0xf7, 0xa2, 0xfa, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x20, 0x1c, 0xfa, 0xe7, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, +0x40, 0x00, 0x14, 0x40, 0xd9, 0xbf, 0x21, 0x40, 0x80, 0xb4, 0x03, 0x22, +0xc2, 0x80, 0x15, 0x4a, 0xc0, 0x46, 0x82, 0x60, 0x14, 0x4a, 0x12, 0x88, +0x01, 0x32, 0xc2, 0x60, 0x00, 0x20, 0x13, 0x4a, 0x13, 0x5c, 0xc0, 0x46, +0x0b, 0x70, 0x01, 0x30, 0x01, 0x31, 0x08, 0x28, 0xf8, 0xd3, 0x20, 0x22, +0x0a, 0x70, 0x01, 0x31, 0x00, 0x20, 0x0e, 0x4b, 0x1f, 0x5c, 0xc0, 0x46, +0x0f, 0x70, 0x01, 0x30, 0x01, 0x31, 0x08, 0x28, 0xf8, 0xd3, 0x0a, 0x70, +0x01, 0x31, 0x00, 0x20, 0x09, 0x4a, 0x13, 0x5c, 0xc0, 0x46, 0x0b, 0x70, +0x01, 0x30, 0x01, 0x31, 0x08, 0x28, 0xf8, 0xd3, 0x00, 0x20, 0x08, 0x70, +0x80, 0xbc, 0x70, 0x47, 0x02, 0x10, 0x00, 0x03, 0x68, 0x0e, 0x00, 0x80, +0x7c, 0x04, 0x00, 0x80, 0x85, 0x04, 0x00, 0x80, 0x8e, 0x04, 0x00, 0x80, +0x00, 0xb5, 0x01, 0x23, 0x0a, 0x48, 0xc1, 0x1d, 0x89, 0x31, 0x4b, 0x70, +0x00, 0x22, 0x0a, 0x70, 0x64, 0x21, 0x80, 0x30, 0xc1, 0x82, 0x01, 0x83, +0x43, 0x83, 0x7d, 0x21, 0xc9, 0x00, 0x81, 0x83, 0xc2, 0x83, 0x04, 0x48, +0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x38, 0xfb, 0x08, 0xbc, 0x18, 0x47, +0x68, 0x0e, 0x00, 0x80, 0xa1, 0x22, 0xff, 0xff, +0x00, 0xb5, 0xff, 0xf7, 0xe1, 0xff, 0x13, 0x48, 0x02, 0x22, 0x00, 0x21, +0x00, 0xf0, 0x2a, 0xfb, 0x01, 0x23, 0xd8, 0x42, 0x0a, 0xd1, 0x10, 0x48, +0xc1, 0x1d, 0x39, 0x31, 0xca, 0x88, 0x01, 0x32, 0xca, 0x80, 0x81, 0x79, +0x01, 0x31, 0x81, 0x71, 0xfc, 0xf7, 0x5c, 0xfd, 0x0b, 0x48, 0xc0, 0x68, +0x01, 0x28, 0x05, 0xd1, 0x0a, 0x48, 0x7d, 0x22, 0xd2, 0x00, 0x00, 0x21, +0x00, 0xf0, 0x12, 0xfb, 0x08, 0x48, 0xfa, 0xf7, 0x1b, 0xfa, 0x08, 0x48, +0x28, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0a, 0xfb, 0x08, 0xbc, 0x18, 0x47, +0x65, 0x21, 0xff, 0xff, 0xa0, 0x82, 0x20, 0x40, 0x68, 0x0e, 0x00, 0x80, +0x95, 0x7e, 0x21, 0x40, 0x81, 0x2c, 0xff, 0xff, 0x59, 0x03, 0xff, 0xff, +0x00, 0xb5, 0x10, 0x20, 0x0f, 0x49, 0xc0, 0x46, 0x08, 0x60, 0x0f, 0x4a, +0x0f, 0x48, 0x64, 0x21, 0xfa, 0xf7, 0x00, 0xfa, 0x0e, 0x48, 0x01, 0x22, +0x12, 0x04, 0x01, 0x68, 0x0a, 0x40, 0x08, 0x21, 0x00, 0x2a, 0x05, 0xd1, +0x02, 0x68, 0x12, 0x0c, 0x07, 0xd1, 0x00, 0x68, 0x80, 0x0a, 0x04, 0xd3, +0x08, 0x48, 0xc0, 0x46, 0xc1, 0x60, 0x08, 0xbc, 0x18, 0x47, 0x07, 0x48, +0xc0, 0x46, 0x01, 0x64, 0xf9, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, +0x91, 0x55, 0xff, 0xff, 0x7c, 0x29, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, +0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf8, 0xb5, 0x27, 0x48, +0x01, 0x22, 0x12, 0x04, 0x01, 0x68, 0x0a, 0x40, 0x07, 0x21, 0x00, 0x2a, +0x05, 0xd1, 0x02, 0x68, 0x12, 0x0c, 0x06, 0xd1, 0x00, 0x68, 0x80, 0x0a, +0x03, 0xd3, 0x21, 0x48, 0xc0, 0x46, 0xc1, 0x60, 0x02, 0xe0, 0x20, 0x48, +0xc0, 0x46, 0x01, 0x64, 0x1f, 0x48, 0xfa, 0xf7, 0xc1, 0xf9, 0x1f, 0x48, +0xc1, 0x6b, 0xff, 0x29, 0xfc, 0xd1, 0x81, 0x6b, 0x42, 0x6b, 0x16, 0x1c, +0x0f, 0x1c, 0x1c, 0x4c, 0x10, 0x23, 0x60, 0x69, 0x18, 0x43, 0x60, 0x61, +0xa1, 0x69, 0x99, 0x43, 0x1d, 0x04, 0xa1, 0x61, 0xe8, 0x60, 0xa0, 0x69, +0xc0, 0x46, 0x28, 0x61, 0x16, 0x4a, 0x17, 0x49, 0x64, 0x20, 0xfa, 0xf7, +0xa9, 0xf9, 0x16, 0x4a, 0xc0, 0x46, 0x00, 0x92, 0x15, 0x4b, 0x00, 0x20, +0x39, 0x1c, 0x32, 0x1c, 0xfa, 0xf7, 0xa8, 0xf9, 0x13, 0x48, 0xc1, 0x68, +0x08, 0x29, 0xfc, 0xd1, 0x12, 0x48, 0xfa, 0xf7, 0x97, 0xf9, 0x10, 0x23, +0x60, 0x69, 0x98, 0x43, 0x60, 0x61, 0xe8, 0x60, 0x01, 0x20, 0xe3, 0x23, +0x1b, 0x01, 0xe1, 0x18, 0xc8, 0x71, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, +0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, +0x04, 0x02, 0xff, 0xff, 0x00, 0x01, 0x18, 0x40, 0x68, 0x0e, 0x00, 0x80, +0x0c, 0x55, 0xff, 0xff, 0x2d, 0xcf, 0x21, 0x40, 0x64, 0x00, 0x30, 0x02, +0x44, 0x80, 0x20, 0x40, 0x40, 0x01, 0x18, 0x40, 0xf4, 0x01, 0xff, 0xff, +0x00, 0xb5, 0xfd, 0xf7, 0xeb, 0xfa, 0x06, 0x48, 0xfa, 0xf7, 0x6c, 0xf9, +0xfd, 0xf7, 0xc0, 0xfa, 0xfd, 0xf7, 0xee, 0xfb, 0xfd, 0xf7, 0x00, 0xfc, +0xfd, 0xf7, 0x0e, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x91, 0x03, 0xff, 0xff, +0x90, 0xb5, 0xfd, 0xf7, 0x55, 0xf8, 0x34, 0x4f, 0x00, 0x24, 0xf9, 0x68, +0xf8, 0x1d, 0x79, 0x30, 0x01, 0x29, 0x0f, 0xd1, 0x31, 0x49, 0xc0, 0x46, +0xf9, 0x67, 0x31, 0x49, 0xc0, 0x46, 0x01, 0x60, 0x30, 0x49, 0xc0, 0x46, +0x0c, 0x60, 0x4c, 0x60, 0x8c, 0x60, 0xcc, 0x60, 0x0c, 0x61, 0x4c, 0x61, +0x8c, 0x61, 0x04, 0xe0, 0xf9, 0x1d, 0x7d, 0x31, 0xf9, 0x67, 0x12, 0xc0, +0x08, 0x38, 0x00, 0x68, 0x60, 0x23, 0x01, 0x68, +0x19, 0x43, 0x01, 0x60, 0xf8, 0x6f, 0x20, 0x23, 0x01, 0x68, 0x19, 0x43, +0x01, 0x60, 0xf8, 0x6f, 0x40, 0x23, 0x01, 0x68, 0x99, 0x43, 0x01, 0x60, +0x00, 0xf0, 0x54, 0xf8, 0xfd, 0xf7, 0x38, 0xf8, 0x00, 0xf0, 0x08, 0xf9, +0xfc, 0xf7, 0x5f, 0xfc, 0xff, 0xf7, 0x84, 0xfd, 0xfd, 0xf7, 0x18, 0xfa, +0xfd, 0xf7, 0xa0, 0xf9, 0xfd, 0xf7, 0xac, 0xfa, 0xfd, 0xf7, 0x3e, 0xf9, +0xfd, 0xf7, 0xf4, 0xf8, 0xfd, 0xf7, 0x7e, 0xf9, 0x00, 0xf0, 0xc4, 0xf9, +0xfd, 0xf7, 0x86, 0xfb, 0xfd, 0xf7, 0xf4, 0xfa, 0xfd, 0xf7, 0xbc, 0xfa, +0xfd, 0xf7, 0x26, 0xf8, 0xfa, 0xf7, 0x12, 0xf8, 0xff, 0xf7, 0x40, 0xfd, +0x00, 0x20, 0xff, 0xf7, 0x17, 0xfe, 0xff, 0xf7, 0x97, 0xff, 0x71, 0x23, +0x5b, 0x01, 0xf8, 0x18, 0x04, 0x72, 0x44, 0x72, 0x07, 0x23, 0x5b, 0x02, +0xf8, 0x18, 0x04, 0x63, 0x09, 0x48, 0xc0, 0x46, 0x44, 0x62, 0x00, 0xf0, +0xc3, 0xf9, 0x08, 0x48, 0xfa, 0xf7, 0xf8, 0xf8, 0x90, 0xbc, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x00, 0x01, 0x11, 0x40, +0x04, 0x01, 0x11, 0x40, 0x00, 0x01, 0x11, 0x00, 0xc0, 0x00, 0x18, 0x00, +0x65, 0x9f, 0x21, 0x40, 0x00, 0xb5, 0x04, 0x48, 0xfa, 0xf7, 0xe4, 0xf8, +0xfd, 0xf7, 0x48, 0xfb, 0xfd, 0xf7, 0x0e, 0xf8, 0x08, 0xbc, 0x18, 0x47, +0x61, 0xa9, 0x21, 0x40, 0xfa, 0x21, 0x03, 0x48, 0xc0, 0x46, 0x41, 0x62, +0x40, 0x21, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x00, +0x07, 0x48, 0x41, 0x69, 0x07, 0x4b, 0x19, 0x43, 0x41, 0x61, 0x82, 0x69, +0x9a, 0x43, 0x82, 0x61, 0x01, 0x22, 0x12, 0x05, 0xd1, 0x60, 0x80, 0x69, +0xc0, 0x46, 0x10, 0x61, 0x70, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, +0xfe, 0xaf, 0x9a, 0x10, 0x00, 0xb5, 0x02, 0x48, 0xfa, 0xf7, 0xba, 0xf8, +0x08, 0xbc, 0x18, 0x47, 0xb4, 0x57, 0xff, 0xff, 0xf0, 0xb5, 0x24, 0x4c, +0x01, 0x21, 0x09, 0x04, 0x20, 0x68, 0x01, 0x40, 0x09, 0x20, 0x22, 0x4e, +0x22, 0x4d, 0x00, 0x29, 0x05, 0xd1, 0x21, 0x68, 0x09, 0x0c, 0x04, 0xd1, +0x21, 0x68, 0x89, 0x0a, 0x01, 0xd3, 0xf0, 0x60, 0x00, 0xe0, 0x28, 0x64, +0x1d, 0x48, 0xfa, 0xf7, 0x9f, 0xf8, 0x1d, 0x4f, 0x1d, 0x49, 0x88, 0x69, +0x01, 0x30, 0x88, 0x61, 0x38, 0x7a, 0x00, 0x28, 0x02, 0xd1, 0x78, 0x7a, +0x00, 0x28, 0x1f, 0xd0, 0x19, 0x48, 0xfa, 0xf7, 0x91, 0xf8, 0x19, 0x48, +0xfa, 0xf7, 0x8e, 0xf8, 0x00, 0x28, 0xfa, 0xd1, 0x38, 0x7a, 0x00, 0x28, +0x02, 0xd0, 0x16, 0x48, 0xfa, 0xf7, 0x86, 0xf8, 0x01, 0x21, 0x09, 0x04, +0x20, 0x68, 0x01, 0x40, 0x14, 0x20, 0x00, 0x29, 0x05, 0xd1, 0x21, 0x68, +0x09, 0x0c, 0x04, 0xd1, 0x21, 0x68, 0x89, 0x0a, 0x01, 0xd3, 0xf0, 0x60, +0x01, 0xe0, 0x28, 0x64, 0xff, 0xe7, 0xfe, 0xe7, 0xff, 0xf7, 0xdd, 0xfc, +0x0b, 0x48, 0xfa, 0xf7, 0x6f, 0xf8, 0xff, 0xf7, 0xaf, 0xff, 0xcd, 0xe7, 0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, -0xb0, 0xb5, 0x24, 0x4f, 0x01, 0x21, 0x09, 0x04, 0x38, 0x68, 0x01, 0x40, -0x06, 0x20, 0x22, 0x4d, 0x22, 0x4c, 0x00, 0x29, 0x05, 0xd1, 0x39, 0x68, -0x09, 0x0c, 0x04, 0xd1, 0x39, 0x68, 0x89, 0x0a, 0x01, 0xd3, 0xe8, 0x60, -0x00, 0xe0, 0x20, 0x64, 0x03, 0x20, 0xfe, 0xf7, 0xc5, 0xfa, 0xfb, 0xf7, -0xa1, 0xf9, 0x01, 0x23, 0x18, 0x43, 0xfb, 0xf7, 0x6b, 0xfa, 0x00, 0xf0, -0x31, 0xf8, 0x01, 0x21, 0x09, 0x04, 0x38, 0x68, 0x01, 0x40, 0x07, 0x20, -0x00, 0x29, 0x05, 0xd1, 0x39, 0x68, 0x09, 0x0c, 0x04, 0xd1, 0x39, 0x68, -0x89, 0x0a, 0x01, 0xd3, 0xe8, 0x60, 0x00, 0xe0, 0x20, 0x64, 0x00, 0xf0, -0x89, 0xf8, 0x00, 0xf0, 0x69, 0xf8, 0x00, 0xf0, 0xd3, 0xf8, 0x01, 0x21, -0x09, 0x04, 0x38, 0x68, 0x01, 0x40, 0x09, 0x20, 0x00, 0x29, 0x05, 0xd1, -0x39, 0x68, 0x09, 0x0c, 0x04, 0xd1, 0x39, 0x68, 0x89, 0x0a, 0x01, 0xd3, -0xe8, 0x60, 0x00, 0xe0, 0x20, 0x64, 0xff, 0xf7, 0xdf, 0xfe, 0xb0, 0xbc, -0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0xb5, 0x21, 0x48, 0xfa, 0xf7, 0x14, 0xfd, -0xfd, 0xf7, 0x4a, 0xf8, 0x00, 0xf0, 0xa6, 0xf8, 0xfd, 0xf7, 0x58, 0xf8, -0x00, 0xf0, 0xc0, 0xf8, 0xfc, 0xf7, 0x9f, 0xfc, 0xff, 0xf7, 0x5c, 0xfd, -0xfd, 0xf7, 0x3c, 0xfa, 0xfd, 0xf7, 0xc4, 0xf9, 0xfd, 0xf7, 0xdc, 0xfa, -0xfd, 0xf7, 0x60, 0xf9, 0xfd, 0xf7, 0x1a, 0xf9, -0xfd, 0xf7, 0xa2, 0xf9, 0x00, 0xf0, 0x8a, 0xf9, 0xfd, 0xf7, 0xb6, 0xfb, -0xfd, 0xf7, 0x24, 0xfb, 0xfd, 0xf7, 0xec, 0xfa, 0xfd, 0xf7, 0x46, 0xf8, -0xfa, 0xf7, 0xf2, 0xfb, 0xff, 0xf7, 0x18, 0xfd, 0x00, 0x20, 0xff, 0xf7, -0xef, 0xfd, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0x20, 0x0a, 0x49, 0x71, 0x23, -0x5b, 0x01, 0xca, 0x18, 0x10, 0x71, 0x50, 0x71, 0x07, 0x23, 0x5b, 0x02, -0xc9, 0x18, 0xc8, 0x62, 0x06, 0x49, 0xc0, 0x46, 0x48, 0x62, 0x00, 0xf0, -0x87, 0xf9, 0x05, 0x48, 0xfa, 0xf7, 0xd6, 0xfc, 0x08, 0xbc, 0x18, 0x47, -0xff, 0xb8, 0x21, 0x40, 0xe8, 0x0d, 0x00, 0x80, 0xc0, 0x00, 0x18, 0x00, -0x31, 0x98, 0x21, 0x40, 0x00, 0xb5, 0x04, 0x48, 0xfa, 0xf7, 0xc8, 0xfc, -0xfd, 0xf7, 0x7c, 0xfb, 0xfd, 0xf7, 0x34, 0xf8, 0x08, 0xbc, 0x18, 0x47, -0x11, 0xa2, 0x21, 0x40, 0x00, 0xb5, 0xfd, 0xf7, 0x81, 0xfa, 0x06, 0x48, -0xfa, 0xf7, 0xba, 0xfc, 0xfd, 0xf7, 0x56, 0xfa, 0xfd, 0xf7, 0x8c, 0xfb, -0xfd, 0xf7, 0x9e, 0xfb, 0xfd, 0xf7, 0xac, 0xfb, 0x08, 0xbc, 0x18, 0x47, -0x91, 0x03, 0xff, 0xff, 0xf8, 0xb5, 0x1a, 0x48, 0xc1, 0x6b, 0xff, 0x29, -0xfc, 0xd1, 0x81, 0x6b, 0x42, 0x6b, 0x0d, 0x1c, 0x16, 0x1c, 0x17, 0x4c, -0x10, 0x23, 0x60, 0x69, 0x18, 0x43, 0x60, 0x61, 0xa1, 0x69, 0x99, 0x43, -0x1f, 0x04, 0xa1, 0x61, 0xf8, 0x60, 0xa0, 0x69, 0xc0, 0x46, 0x38, 0x61, -0x11, 0x4a, 0x12, 0x49, 0x64, 0x20, 0xfa, 0xf7, 0x95, 0xfc, 0x11, 0x4a, -0xc0, 0x46, 0x00, 0x92, 0x10, 0x4b, 0x00, 0x20, 0x29, 0x1c, 0x32, 0x1c, -0xfa, 0xf7, 0x94, 0xfc, 0x0e, 0x48, 0xc1, 0x68, 0x08, 0x29, 0xfc, 0xd1, -0x10, 0x23, 0x60, 0x69, 0x98, 0x43, 0x60, 0x61, 0xf8, 0x60, 0x01, 0x20, -0xe3, 0x23, 0x1b, 0x01, 0xe1, 0x18, 0xc8, 0x70, 0xf8, 0xbc, 0x08, 0xbc, -0x18, 0x47, 0x00, 0x00, 0x00, 0x01, 0x18, 0x40, 0xe8, 0x0d, 0x00, 0x80, -0xa0, 0x54, 0xff, 0xff, 0x11, 0xc8, 0x21, 0x40, 0x64, 0x00, 0x30, 0x02, -0x44, 0x80, 0x20, 0x40, 0x40, 0x01, 0x18, 0x40, 0xfa, 0x21, 0x03, 0x48, -0xc0, 0x46, 0x41, 0x62, 0x40, 0x21, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, -0xc0, 0x00, 0x18, 0x00, 0x07, 0x48, 0x41, 0x69, 0x07, 0x4b, 0x19, 0x43, -0x41, 0x61, 0x82, 0x69, 0x9a, 0x43, 0x82, 0x61, 0x01, 0x22, 0x12, 0x05, -0xd1, 0x60, 0x80, 0x69, 0xc0, 0x46, 0x10, 0x61, 0x70, 0x47, 0x00, 0x00, -0xe8, 0x0d, 0x00, 0x80, 0xfe, 0xaf, 0x9a, 0x10, 0xf0, 0xb4, 0x4b, 0x4a, -0x4b, 0x48, 0x00, 0x68, 0x00, 0x0c, 0x4b, 0x4d, 0x4b, 0x4b, 0x98, 0x42, -0x02, 0xd0, 0x01, 0x33, 0x98, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x28, 0x80, -0x01, 0x21, 0xc9, 0x03, 0x19, 0x23, 0xdb, 0x01, 0xec, 0x18, 0x61, 0x61, -0x28, 0x88, 0x40, 0x04, 0x44, 0x4b, 0xc0, 0x18, 0x87, 0x1a, 0x06, 0x20, -0xaf, 0x60, 0x43, 0x4e, 0xc0, 0x46, 0xb0, 0x61, 0x20, 0x20, 0xc8, 0x23, -0x43, 0x43, 0xbb, 0x42, 0x21, 0xd9, 0x41, 0x00, 0x3e, 0x4e, 0xc0, 0x46, -0x31, 0x61, 0xb6, 0x69, 0x20, 0x23, 0x9b, 0x1b, 0x3b, 0x4e, 0xc0, 0x46, -0xf3, 0x61, 0x10, 0x3b, 0x33, 0x62, 0x8b, 0x00, 0xff, 0x1a, 0x40, 0x08, -0x81, 0x42, 0x17, 0xd3, 0xb8, 0x23, 0x43, 0x43, 0xbb, 0x42, 0x08, 0xd9, -0x41, 0x1e, 0x34, 0x4b, 0xc0, 0x46, 0x99, 0x81, 0xd9, 0x81, 0x40, 0x00, -0x02, 0x38, 0x58, 0x61, 0x0a, 0xe0, 0x01, 0x30, 0x81, 0x42, 0xef, 0xd2, -0x06, 0xe0, 0x2e, 0x4e, 0xb3, 0x69, 0x01, 0x33, 0xb3, 0x61, 0x40, 0x00, -0x88, 0x42, 0xd2, 0xd9, 0x2b, 0x49, 0x00, 0x20, -0x63, 0x69, 0x9b, 0x08, 0x07, 0xd0, 0x2a, 0x4b, 0x87, 0x00, 0xcb, 0x51, -0x67, 0x69, 0xbf, 0x08, 0x01, 0x30, 0x87, 0x42, 0xf8, 0xd8, 0x24, 0x49, -0xc0, 0x46, 0x8a, 0x62, 0x8c, 0x89, 0x58, 0x20, 0x60, 0x43, 0x87, 0x18, -0x00, 0x20, 0x00, 0x22, 0x00, 0x2c, 0x0a, 0xdd, 0x58, 0x23, 0x43, 0x43, -0x8c, 0x6a, 0xe3, 0x18, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x9a, 0x60, -0x8b, 0x89, 0x83, 0x42, 0xf4, 0xdc, 0xcf, 0x62, 0xcc, 0x89, 0x60, 0x00, -0x00, 0x19, 0x40, 0x01, 0xc7, 0x19, 0x00, 0x20, 0x00, 0x2c, 0x0b, 0xdd, -0x43, 0x00, 0x1b, 0x18, 0x5b, 0x01, 0xcc, 0x6a, 0xe3, 0x18, 0x01, 0x30, -0x00, 0x04, 0x00, 0x0c, 0x9a, 0x60, 0xcb, 0x89, 0x83, 0x42, 0xf3, 0xdc, -0x4f, 0x62, 0x00, 0x20, 0x0b, 0x69, 0x00, 0x2b, 0x07, 0xd9, 0x87, 0x00, -0x4b, 0x6a, 0xc0, 0x46, 0xda, 0x51, 0x0b, 0x69, 0x01, 0x30, 0x83, 0x42, -0xf7, 0xd8, 0x49, 0x6a, 0x80, 0x00, 0x08, 0x18, 0x04, 0x38, 0x28, 0x61, -0xf0, 0xbc, 0x70, 0x47, 0xb8, 0xce, 0x21, 0x40, 0x00, 0x00, 0x18, 0x40, -0xe8, 0x0d, 0x00, 0x80, 0x02, 0x99, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, -0xc8, 0x29, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, 0x00, 0xad, 0xde, 0x00, +0x04, 0x02, 0xff, 0xff, 0x88, 0x1c, 0x00, 0x80, 0x08, 0x83, 0x20, 0x40, +0xf4, 0x01, 0xff, 0xff, 0xb5, 0x07, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, +0xe9, 0xaf, 0x21, 0x40, 0x00, 0xb5, 0x16, 0x49, 0x01, 0x22, 0x12, 0x04, +0x08, 0x68, 0x02, 0x40, 0x06, 0x20, 0x00, 0x2a, 0x05, 0xd1, 0x0a, 0x68, +0x12, 0x0c, 0x06, 0xd1, 0x09, 0x68, 0x89, 0x0a, 0x03, 0xd3, 0x10, 0x49, +0xc0, 0x46, 0xc8, 0x60, 0x02, 0xe0, 0x0f, 0x49, 0xc0, 0x46, 0x08, 0x64, +0x03, 0x20, 0xfe, 0xf7, 0x55, 0xf9, 0xfa, 0xf7, +0x9d, 0xfc, 0x01, 0x23, 0x18, 0x43, 0xfa, 0xf7, 0x77, 0xfd, 0xff, 0xf7, +0xd7, 0xfe, 0xff, 0xf7, 0x5b, 0xfe, 0xff, 0xf7, 0x4b, 0xff, 0xff, 0xf7, +0x5f, 0xff, 0xff, 0xf7, 0xf1, 0xfd, 0xff, 0xf7, 0x77, 0xff, 0x08, 0xbc, +0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x40, 0x01, 0x18, 0x00, +0x00, 0x00, 0x00, 0x80, 0xf0, 0xb4, 0x46, 0x4a, 0x01, 0x21, 0xc9, 0x03, +0x45, 0x4d, 0x19, 0x23, 0xdb, 0x01, 0xec, 0x18, 0xa1, 0x61, 0x28, 0x88, +0x40, 0x04, 0x43, 0x4b, 0xc0, 0x18, 0x87, 0x1a, 0x04, 0x20, 0xaf, 0x60, +0x41, 0x4e, 0xc0, 0x46, 0xb0, 0x61, 0x08, 0x20, 0xc8, 0x23, 0x43, 0x43, +0xbb, 0x42, 0x21, 0xd9, 0x41, 0x00, 0x3d, 0x4e, 0xc0, 0x46, 0x31, 0x61, +0xb6, 0x69, 0x20, 0x23, 0x9b, 0x1b, 0x3a, 0x4e, 0xc0, 0x46, 0xf3, 0x61, +0x10, 0x3b, 0x33, 0x62, 0x8b, 0x00, 0xff, 0x1a, 0x40, 0x08, 0x81, 0x42, +0x17, 0xd3, 0xb8, 0x23, 0x43, 0x43, 0xbb, 0x42, 0x08, 0xd9, 0x41, 0x1e, +0x32, 0x4b, 0xc0, 0x46, 0x99, 0x81, 0xd9, 0x81, 0x40, 0x00, 0x02, 0x38, +0x58, 0x61, 0x0a, 0xe0, 0x01, 0x30, 0x81, 0x42, 0xef, 0xd2, 0x06, 0xe0, +0x2c, 0x4e, 0xb3, 0x69, 0x01, 0x33, 0xb3, 0x61, 0x40, 0x00, 0x88, 0x42, +0xd2, 0xd9, 0x2a, 0x49, 0x00, 0x20, 0xa3, 0x69, 0x9b, 0x08, 0x07, 0xd0, +0x28, 0x4b, 0x87, 0x00, 0xcb, 0x51, 0xa7, 0x69, 0xbf, 0x08, 0x01, 0x30, +0x87, 0x42, 0xf8, 0xd8, 0x22, 0x49, 0xc0, 0x46, 0x8a, 0x62, 0x8c, 0x89, +0x58, 0x20, 0x60, 0x43, 0x87, 0x18, 0x00, 0x20, 0x00, 0x22, 0x00, 0x2c, +0x0a, 0xdd, 0x58, 0x23, 0x43, 0x43, 0x8c, 0x6a, 0xe3, 0x18, 0x01, 0x30, +0x00, 0x04, 0x00, 0x0c, 0x9a, 0x60, 0x8b, 0x89, 0x83, 0x42, 0xf4, 0xdc, +0xcf, 0x62, 0xcc, 0x89, 0x60, 0x00, 0x00, 0x19, 0x40, 0x01, 0xc7, 0x19, +0x00, 0x20, 0x00, 0x2c, 0x0b, 0xdd, 0x43, 0x00, 0x1b, 0x18, 0x5b, 0x01, +0xcc, 0x6a, 0xe3, 0x18, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x9a, 0x60, +0xcb, 0x89, 0x83, 0x42, 0xf3, 0xdc, 0x4f, 0x62, 0x00, 0x20, 0x0b, 0x69, +0x00, 0x2b, 0x07, 0xd9, 0x87, 0x00, 0x4b, 0x6a, 0xc0, 0x46, 0xda, 0x51, +0x0b, 0x69, 0x01, 0x30, 0x83, 0x42, 0xf7, 0xd8, 0x49, 0x6a, 0x80, 0x00, +0x08, 0x18, 0x04, 0x38, 0x28, 0x61, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, +0xec, 0xd6, 0x21, 0x40, 0x68, 0x0e, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, +0x4c, 0x2a, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, 0x00, 0xad, 0xde, 0x00, 0x0a, 0x48, 0x01, 0x23, 0x1b, 0x06, 0x41, 0x69, 0x99, 0x43, 0x1a, 0x09, 0x41, 0x61, 0xd1, 0x60, 0x00, 0x21, 0xa1, 0x22, 0x52, 0x03, 0x91, 0x61, -0x1b, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x41, 0x61, 0x01, 0x20, 0x00, 0x06, -0x59, 0x05, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, +0x1b, 0x23, 0xdb, 0x01, 0xc0, 0x18, 0x81, 0x61, 0x01, 0x20, 0x00, 0x06, +0x59, 0x05, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x80, 0xb4, 0x02, 0x1c, 0x0b, 0x48, 0x1b, 0x23, 0xdb, 0x01, 0xc3, 0x18, -0x5a, 0x61, 0x01, 0x23, 0x1b, 0x06, 0x42, 0x69, 0x1a, 0x43, 0x42, 0x61, +0x9a, 0x61, 0x01, 0x23, 0x1b, 0x06, 0x42, 0x69, 0x1a, 0x43, 0x42, 0x61, 0x87, 0x69, 0x9f, 0x43, 0x01, 0x23, 0x1b, 0x05, 0x87, 0x61, 0xda, 0x60, 0x80, 0x69, 0xc0, 0x46, 0x18, 0x61, 0xa1, 0x20, 0x40, 0x03, 0x81, 0x61, -0x80, 0xbc, 0x70, 0x47, 0xe8, 0x0d, 0x00, 0x80, 0x80, 0xb5, 0xff, 0xf7, +0x80, 0xbc, 0x70, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x80, 0xb5, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x20, 0x00, 0xf0, 0x20, 0xf8, 0x00, 0x20, 0x09, 0x49, 0x00, 0x22, 0x03, 0x01, 0x5f, 0x18, 0x33, 0x23, 0x9b, 0x01, 0xfb, 0x18, -0x5a, 0x62, 0x01, 0x30, 0x0b, 0x28, 0xf6, 0xd3, 0x04, 0x48, 0x01, 0x22, -0x00, 0x21, 0x00, 0xf0, 0x33, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, -0xe8, 0x0d, 0x00, 0x80, 0x91, 0x3d, 0xff, 0xff, 0x00, 0xb5, 0x02, 0x48, -0x00, 0xf0, 0x04, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0xa8, 0x61, 0x00, 0x00, -0x80, 0xb4, 0x01, 0x22, 0x12, 0x05, 0x0f, 0x4b, 0xa1, 0x21, 0x49, 0x03, -0x00, 0x28, 0x0e, 0xd0, 0xc8, 0x61, 0x18, 0x1c, 0x59, 0x69, 0x53, 0x01, -0x19, 0x43, 0x41, 0x61, 0x87, 0x69, 0x9f, 0x43, 0x87, 0x61, 0xd1, 0x60, -0x80, 0x69, 0xc0, 0x46, 0x10, 0x61, 0x80, 0xbc, 0x70, 0x47, 0x18, 0x1c, -0x5f, 0x69, 0x01, 0x23, 0x5b, 0x06, 0x9f, 0x43, 0x47, 0x61, 0xd7, 0x60, -0x00, 0x20, 0xc8, 0x61, 0xf3, 0xe7, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, -0xb0, 0xb4, 0x07, 0x1c, 0x00, 0x20, 0x17, 0x4c, 0x03, 0x01, 0x1d, 0x19, -0x33, 0x23, 0x9b, 0x01, 0xeb, 0x18, 0x5d, 0x6a, 0xbd, 0x42, 0x05, 0xd1, -0xdd, 0x6a, 0x95, 0x42, 0x02, 0xd1, 0x9b, 0x6a, 0x8b, 0x42, 0x1c, 0xd0, -0x01, 0x30, 0x0b, 0x28, 0xee, 0xd3, 0x00, 0x20, 0x03, 0x01, 0x1d, 0x19, -0x33, 0x23, 0x9b, 0x01, 0xeb, 0x18, 0x5b, 0x6a, 0x00, 0x2b, 0x09, 0xd1, -0x03, 0x01, 0x1c, 0x19, 0x33, 0x23, 0x9b, 0x01, 0xe3, 0x18, 0xda, 0x62, -0x99, 0x62, 0x1a, 0x63, 0x5f, 0x62, 0x02, 0xe0, +0x9a, 0x62, 0x01, 0x30, 0x0b, 0x28, 0xf6, 0xd3, 0x04, 0x48, 0x01, 0x22, +0x00, 0x21, 0x00, 0xf0, 0x33, 0xf8, 0x80, 0xbc, +0x08, 0xbc, 0x18, 0x47, 0x68, 0x0e, 0x00, 0x80, 0x09, 0x3e, 0xff, 0xff, +0x00, 0xb5, 0x02, 0x48, 0x00, 0xf0, 0x04, 0xf8, 0x08, 0xbc, 0x18, 0x47, +0xa8, 0x61, 0x00, 0x00, 0x80, 0xb4, 0x01, 0x22, 0x12, 0x05, 0x0f, 0x4b, +0xa1, 0x21, 0x49, 0x03, 0x00, 0x28, 0x0e, 0xd0, 0xc8, 0x61, 0x18, 0x1c, +0x59, 0x69, 0x53, 0x01, 0x19, 0x43, 0x41, 0x61, 0x87, 0x69, 0x9f, 0x43, +0x87, 0x61, 0xd1, 0x60, 0x80, 0x69, 0xc0, 0x46, 0x10, 0x61, 0x80, 0xbc, +0x70, 0x47, 0x18, 0x1c, 0x5f, 0x69, 0x01, 0x23, 0x5b, 0x06, 0x9f, 0x43, +0x47, 0x61, 0xd7, 0x60, 0x00, 0x20, 0xc8, 0x61, 0xf3, 0xe7, 0x00, 0x00, +0x68, 0x0e, 0x00, 0x80, 0xb0, 0xb4, 0x07, 0x1c, 0x00, 0x20, 0x17, 0x4c, +0x03, 0x01, 0x1d, 0x19, 0x33, 0x23, 0x9b, 0x01, 0xeb, 0x18, 0x9d, 0x6a, +0xbd, 0x42, 0x05, 0xd1, 0x1d, 0x6b, 0x95, 0x42, 0x02, 0xd1, 0xdb, 0x6a, +0x8b, 0x42, 0x1c, 0xd0, 0x01, 0x30, 0x0b, 0x28, 0xee, 0xd3, 0x00, 0x20, +0x03, 0x01, 0x1d, 0x19, 0x33, 0x23, 0x9b, 0x01, 0xeb, 0x18, 0x9b, 0x6a, +0x00, 0x2b, 0x09, 0xd1, 0x03, 0x01, 0x1c, 0x19, 0x33, 0x23, 0x9b, 0x01, +0xe3, 0x18, 0x1a, 0x63, 0xd9, 0x62, 0x5a, 0x63, 0x9f, 0x62, 0x02, 0xe0, 0x01, 0x30, 0x0b, 0x28, 0xea, 0xd3, 0x0b, 0x28, 0x01, 0xd1, 0x00, 0x20, -0xc0, 0x43, 0xb0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x0d, 0x00, 0x80, +0xc0, 0x43, 0xb0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x68, 0x0e, 0x00, 0x80, 0x90, 0xb4, 0x01, 0x1c, 0x00, 0x22, 0x01, 0x20, 0x16, 0x4f, 0x01, 0xe0, 0x00, 0x2a, 0x07, 0xd1, 0x03, 0x01, 0xdc, 0x19, 0x33, 0x23, 0x9b, 0x01, -0xe3, 0x18, 0x5b, 0x69, 0x8b, 0x42, 0x11, 0xd1, 0x02, 0x01, 0xd2, 0x19, -0x33, 0x23, 0x9b, 0x01, 0xd2, 0x18, 0x53, 0x6a, 0xc0, 0x46, 0x53, 0x61, -0x93, 0x6a, 0xc0, 0x46, 0x93, 0x61, 0xd3, 0x6a, 0xc0, 0x46, 0xd3, 0x61, -0x13, 0x6b, 0xc0, 0x46, 0x13, 0x62, 0x01, 0x22, 0x01, 0x30, 0x0b, 0x28, -0xe0, 0xd3, 0x07, 0x4b, 0x00, 0x2a, 0x02, 0xd1, 0x5a, 0x68, 0x8a, 0x42, -0x03, 0xd1, 0x00, 0x21, 0x59, 0x60, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, -0xc0, 0x43, 0xfa, 0xe7, 0xe8, 0x0d, 0x00, 0x80, 0x68, 0x1b, 0x00, 0x80, +0xe3, 0x18, 0x9b, 0x69, 0x8b, 0x42, 0x11, 0xd1, 0x02, 0x01, 0xd2, 0x19, +0x33, 0x23, 0x9b, 0x01, 0xd2, 0x18, 0x93, 0x6a, 0xc0, 0x46, 0x93, 0x61, +0xd3, 0x6a, 0xc0, 0x46, 0xd3, 0x61, 0x13, 0x6b, 0xc0, 0x46, 0x13, 0x62, +0x53, 0x6b, 0xc0, 0x46, 0x53, 0x62, 0x01, 0x22, 0x01, 0x30, 0x0b, 0x28, +0xe0, 0xd3, 0x07, 0x4b, 0x00, 0x2a, 0x02, 0xd1, 0x9a, 0x68, 0x8a, 0x42, +0x03, 0xd1, 0x00, 0x21, 0x99, 0x60, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x20, +0xc0, 0x43, 0xfa, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0xe8, 0x1b, 0x00, 0x80, 0x0b, 0x28, 0x17, 0xda, 0x0c, 0x49, 0x01, 0x23, 0x5b, 0x06, 0x8a, 0x69, 0x13, 0x43, 0x01, 0x22, 0x12, 0x05, 0x8b, 0x61, 0x13, 0x61, 0x00, 0x01, -0x40, 0x18, 0x33, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0xc3, 0x6a, 0xc0, 0x46, -0x03, 0x63, 0x53, 0x01, 0x88, 0x69, 0x98, 0x43, 0x88, 0x61, 0x10, 0x61, -0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0xfc, 0xe7, 0xe8, 0x0d, 0x00, 0x80, +0x40, 0x18, 0x33, 0x23, 0x9b, 0x01, 0xc0, 0x18, 0x03, 0x6b, 0xc0, 0x46, +0x43, 0x63, 0x53, 0x01, 0x88, 0x69, 0x98, 0x43, 0x88, 0x61, 0x10, 0x61, +0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0xfc, 0xe7, 0x68, 0x0e, 0x00, 0x80, 0x90, 0xb4, 0x08, 0x4a, 0xd0, 0x69, 0x00, 0x21, 0x07, 0x4f, 0xd3, 0x69, 0x83, 0x42, 0x02, 0xd9, 0xfc, 0x1a, 0x20, 0x18, 0x00, 0xe0, 0xc0, 0x1a, 0x09, 0x18, 0x18, 0x1c, 0xb9, 0x42, 0xf4, 0xd9, 0x90, 0xbc, 0x70, 0x47, @@ -4100,9 +4288,9 @@ 0x08, 0xc9, 0x08, 0xc0, 0x12, 0x1f, 0xfb, 0xd2, 0x0a, 0xe0, 0x08, 0xc9, 0x03, 0x70, 0x1b, 0x0a, 0x43, 0x70, 0x1b, 0x0a, 0x83, 0x70, 0x1b, 0x0a, 0xc3, 0x70, 0x00, 0x1d, 0x12, 0x1f, 0xf4, 0xd2, 0xd2, 0x1c, 0x05, 0xd3, -0x0b, 0x78, 0x03, 0x70, 0x49, 0x1c, 0x40, 0x1c, 0x52, 0x1e, 0xf9, 0xd2, -0x60, 0x46, 0x70, 0x47, 0x03, 0x1c, 0x0b, 0x43, 0x13, 0x43, 0x9b, 0x07, -0x04, 0xd1, 0x12, 0x1f, 0x8b, 0x58, 0x83, 0x50, 0xfb, 0xd1, 0x70, 0x47, -0x52, 0x1e, 0x8b, 0x5c, 0x83, 0x54, 0xfb, 0xd1, 0x70, 0x47, 0x00, 0x00, -0x00, 0x20, 0x70, 0x47, +0x0b, 0x78, 0x03, 0x70, 0x49, 0x1c, 0x40, 0x1c, +0x52, 0x1e, 0xf9, 0xd2, 0x60, 0x46, 0x70, 0x47, 0x03, 0x1c, 0x0b, 0x43, +0x13, 0x43, 0x9b, 0x07, 0x04, 0xd1, 0x12, 0x1f, 0x8b, 0x58, 0x83, 0x50, +0xfb, 0xd1, 0x70, 0x47, 0x52, 0x1e, 0x8b, 0x5c, 0x83, 0x54, 0xfb, 0xd1, +0x70, 0x47, 0x00, 0x00, 0x00, 0x20, 0x70, 0x47, }; diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c --- a/drivers/net/typhoon.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/typhoon.c Tue Feb 17 20:00:07 2004 @@ -85,8 +85,8 @@ #define PKT_BUF_SZ 1536 #define DRV_MODULE_NAME "typhoon" -#define DRV_MODULE_VERSION "1.5.2" -#define DRV_MODULE_RELDATE "03/11/25" +#define DRV_MODULE_VERSION "1.5.3" +#define DRV_MODULE_RELDATE "03/12/15" #define PFX DRV_MODULE_NAME ": " #define ERR_PFX KERN_ERR PFX @@ -157,6 +157,7 @@ TYPHOON_TX = 0, TYPHOON_TX95, TYPHOON_TX97, TYPHOON_SVR, TYPHOON_SVR95, TYPHOON_SVR97, TYPHOON_TXM, TYPHOON_BSVR, TYPHOON_FX95, TYPHOON_FX97, TYPHOON_FX95SVR, TYPHOON_FX97SVR, + TYPHOON_FXM, }; /* directly indexed by enum typhoon_cards, above */ @@ -185,6 +186,8 @@ TYPHOON_CRYPTO_DES | TYPHOON_FIBER}, { "3Com Typhoon (3CR990-FX-97 Server)", TYPHOON_CRYPTO_DES | TYPHOON_CRYPTO_3DES | TYPHOON_FIBER}, + { "3Com Typhoon2 (3C990B-FX-97)", + TYPHOON_CRYPTO_VARIABLE | TYPHOON_FIBER}, }; /* Notes on the new subsystem numbering scheme: @@ -203,6 +206,8 @@ { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3CR990B, PCI_ANY_ID, 0x1000, 0, 0, TYPHOON_TXM }, { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3CR990B, + PCI_ANY_ID, 0x1102, 0, 0, TYPHOON_FXM }, + { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3CR990B, PCI_ANY_ID, 0x2000, 0, 0, TYPHOON_BSVR }, { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3CR990_FX, PCI_ANY_ID, 0x1101, 0, 0, TYPHOON_FX95 }, @@ -1363,6 +1368,7 @@ u32 section_len; u32 len; u32 load_addr; + u32 hmac; int i; int err; @@ -1406,6 +1412,16 @@ writel(TYPHOON_INTR_BOOTCMD, ioaddr + TYPHOON_REG_INTR_STATUS); writel(load_addr, ioaddr + TYPHOON_REG_DOWNLOAD_BOOT_ADDR); + hmac = le32_to_cpu(fHdr->hmacDigest[0]); + writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_0); + hmac = le32_to_cpu(fHdr->hmacDigest[1]); + writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_1); + hmac = le32_to_cpu(fHdr->hmacDigest[2]); + writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_2); + hmac = le32_to_cpu(fHdr->hmacDigest[3]); + writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_3); + hmac = le32_to_cpu(fHdr->hmacDigest[4]); + writel(hmac, ioaddr + TYPHOON_REG_DOWNLOAD_HMAC_4); typhoon_post_pci_writes(ioaddr); writel(TYPHOON_BOOTCMD_RUNTIME_IMAGE, ioaddr + TYPHOON_REG_COMMAND); diff -Nru a/drivers/net/typhoon.h b/drivers/net/typhoon.h --- a/drivers/net/typhoon.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/typhoon.h Tue Feb 17 20:00:05 2004 @@ -512,6 +512,7 @@ u32 version; u32 numSections; u32 startAddr; + u32 hmacDigest[5]; } __attribute__ ((packed)); struct typhoon_section_header { @@ -548,6 +549,11 @@ #define TYPHOON_REG_BOOT_LENGTH TYPHOON_REG_HOST2ARM1 #define TYPHOON_REG_DOWNLOAD_BOOT_ADDR TYPHOON_REG_HOST2ARM1 +#define TYPHOON_REG_DOWNLOAD_HMAC_0 TYPHOON_REG_HOST2ARM2 +#define TYPHOON_REG_DOWNLOAD_HMAC_1 TYPHOON_REG_HOST2ARM3 +#define TYPHOON_REG_DOWNLOAD_HMAC_2 TYPHOON_REG_HOST2ARM4 +#define TYPHOON_REG_DOWNLOAD_HMAC_3 TYPHOON_REG_HOST2ARM5 +#define TYPHOON_REG_DOWNLOAD_HMAC_4 TYPHOON_REG_HOST2ARM6 #define TYPHOON_REG_BOOT_RECORD_ADDR_HI TYPHOON_REG_HOST2ARM2 #define TYPHOON_REG_BOOT_RECORD_ADDR_LO TYPHOON_REG_HOST2ARM1 diff -Nru a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig --- a/drivers/net/wan/Kconfig Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wan/Kconfig Tue Feb 17 20:00:06 2004 @@ -382,7 +382,7 @@ config PC300_MLPPP bool "Cyclades-PC300 MLPPP support" - depends on PC300 && PPP_MULTILINK && PPP_SYNC_TTY && HDLC_PPP && BROKEN + depends on PC300 && PPP_MULTILINK && PPP_SYNC_TTY && HDLC_PPP help Say 'Y' to this option if you are planning to use Multilink PPP over the PC300 synchronous communication boards. diff -Nru a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c --- a/drivers/net/wan/cosa.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/wan/cosa.c Tue Feb 17 20:00:05 2004 @@ -594,40 +594,47 @@ /*---------- SPPP/HDLC netdevice ---------- */ +static void cosa_setup(struct net_device *d) +{ + d->open = cosa_sppp_open; + d->stop = cosa_sppp_close; + d->hard_start_xmit = cosa_sppp_tx; + d->do_ioctl = cosa_sppp_ioctl; + d->get_stats = cosa_net_stats; + d->tx_timeout = cosa_sppp_timeout; + d->watchdog_timeo = TX_TIMEOUT; +} + static void sppp_channel_init(struct channel_data *chan) { struct net_device *d; chan->if_ptr = &chan->pppdev; - chan->pppdev.dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); - memset(chan->pppdev.dev, 0, sizeof(struct net_device)); + d = alloc_netdev(0, chan->name, cosa_setup); + if (!d) { + printk(KERN_WARNING "%s: alloc_netdev failed.\n", chan->name); + return; + } + chan->pppdev.dev = d; sppp_attach(&chan->pppdev); - d=chan->pppdev.dev; - strcpy(d->name, chan->name); d->base_addr = chan->cosa->datareg; d->irq = chan->cosa->irq; d->dma = chan->cosa->dma; d->priv = chan; - d->init = NULL; - d->open = cosa_sppp_open; - d->stop = cosa_sppp_close; - d->hard_start_xmit = cosa_sppp_tx; - d->do_ioctl = cosa_sppp_ioctl; - d->get_stats = cosa_net_stats; - d->tx_timeout = cosa_sppp_timeout; - d->watchdog_timeo = TX_TIMEOUT; if (register_netdev(d)) { printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); - sppp_detach(chan->pppdev.dev); - free_netdev(chan->pppdev.dev); + sppp_detach(d); + free_netdev(d); + chan->pppdev.dev = NULL; return; } } static void sppp_channel_delete(struct channel_data *chan) { - sppp_detach(chan->pppdev.dev); unregister_netdev(chan->pppdev.dev); + sppp_detach(chan->pppdev.dev); free_netdev(chan->pppdev.dev); + chan->pppdev.dev = NULL; } static int cosa_sppp_open(struct net_device *d) diff -Nru a/drivers/net/wan/lmc/lmc_debug.h b/drivers/net/wan/lmc/lmc_debug.h --- a/drivers/net/wan/lmc/lmc_debug.h Tue Feb 17 20:00:05 2004 +++ b/drivers/net/wan/lmc/lmc_debug.h Tue Feb 17 20:00:05 2004 @@ -47,6 +47,6 @@ void lmcConsoleLog(char *type, unsigned char *ucData, int iLen); void lmcEventLog (u_int32_t EventNum, u_int32_t arg2, u_int32_t arg3); -inline void lmc_trace(struct net_device *dev, char *msg); +void lmc_trace(struct net_device *dev, char *msg); #endif diff -Nru a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c --- a/drivers/net/wan/lmc/lmc_main.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wan/lmc/lmc_main.c Tue Feb 17 20:00:06 2004 @@ -78,30 +78,22 @@ #include "lmc_debug.h" #include "lmc_proto.h" - -static int Lmc_Count = 0; -static struct net_device *Lmc_root_dev = NULL; -static u8 cards_found = 0; - static int lmc_first_load = 0; -int LMC_PKT_BUF_SZ = 1542; +static int LMC_PKT_BUF_SZ = 1542; -#ifdef MODULE static struct pci_device_id lmc_pci_tbl[] = { - { 0x1011, 0x009, 0x1379, PCI_ANY_ID, 0, 0, 0}, - { 0, } + { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST, + PCI_VENDOR_ID_LMC, PCI_ANY_ID }, + { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST, + PCI_ANY_ID, PCI_VENDOR_ID_LMC }, + { 0 } }; MODULE_DEVICE_TABLE(pci, lmc_pci_tbl); - MODULE_LICENSE("GPL"); -#endif -int lmc_probe_fake(struct net_device *dev); -static struct net_device *lmc_probe1(struct net_device *dev, unsigned long ioaddr, unsigned int irq, - int chip_id, int subdevice, int board_idx); static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev); static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev); static int lmc_rx (struct net_device *dev); @@ -115,12 +107,9 @@ static void lmc_running_reset(struct net_device *dev); static int lmc_ifdown(struct net_device * const); static void lmc_watchdog(unsigned long data); -static int lmc_init(struct net_device * const); static void lmc_reset(lmc_softc_t * const sc); static void lmc_dec_reset(lmc_softc_t * const sc); static void lmc_driver_timeout(struct net_device *dev); -int lmc_setup(void); - /* * linux reserves 16 device specific IOCTLs. We call them @@ -815,67 +804,77 @@ } -static int lmc_init(struct net_device * const dev) /*fold00*/ +static void lmc_setup(struct net_device * const dev) /*fold00*/ { - lmc_trace(dev, "lmc_init in"); - lmc_trace(dev, "lmc_init out"); - - return 0; + lmc_trace(dev, "lmc_setup in"); + + dev->type = ARPHRD_HDLC; + dev->hard_start_xmit = lmc_start_xmit; + dev->open = lmc_open; + dev->stop = lmc_close; + dev->get_stats = lmc_get_stats; + dev->do_ioctl = lmc_ioctl; + dev->set_config = lmc_set_config; + dev->tx_timeout = lmc_driver_timeout; + dev->watchdog_timeo = (HZ); /* 1 second */ + + lmc_trace(dev, "lmc_setup out"); } -/* This initializes each card from lmc_probe() */ -static struct net_device *lmc_probe1 (struct net_device *dev, unsigned long ioaddr, unsigned int irq, /*fold00*/ - int chip_id, int subdevice, int board_idx) + +static int __devinit lmc_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { - lmc_softc_t *sc = NULL; + struct net_device *dev; + lmc_softc_t *sc; + u16 subdevice; u_int16_t AdapModelNum; - - /* - * Allocate our own device structure - */ - - dev = kmalloc (sizeof (struct net_device)+8, GFP_KERNEL); - if (dev == NULL){ - printk (KERN_ERR "lmc: kmalloc for device failed\n"); - return NULL; - } - memset (dev, 0, sizeof (struct net_device)); - + int err = -ENOMEM; + static int cards_found; #ifndef GCOM - /* - * Switch to common hdlc%d naming. We name by type not by vendor - */ - - dev_alloc_name(dev, "hdlc%d"); + /* We name by type not by vendor */ + static const char lmcname[] = "hdlc%d"; #else - /* + /* * GCOM uses LMC vendor name so that clients can know which card * to attach to. */ - dev_alloc_name(dev, "lmc%d"); + static const char lmcname[] = "lmc%d"; #endif - lmc_trace(dev, "lmc_probe1 in"); + + /* + * Allocate our own device structure + */ + dev = alloc_netdev(sizeof(lmc_softc_t), lmcname, lmc_setup); + if (!dev) { + printk (KERN_ERR "lmc:alloc_netdev for device failed\n"); + goto out1; + } + + lmc_trace(dev, "lmc_init_one in"); + + err = pci_enable_device(pdev); + if (err) { + printk(KERN_ERR "lmc: pci enable failed:%d\n", err); + goto out2; + } - Lmc_Count++; + if (pci_request_regions(pdev, "lmc")) { + printk(KERN_ERR "lmc: pci_request_region failed\n"); + err = -EIO; + goto out3; + } + + pci_set_drvdata(pdev, dev); if(lmc_first_load == 0){ - printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n",DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION); + printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n", + DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION); lmc_first_load = 1; } - /* - * Allocate space for the private data structure - */ - - sc = kmalloc (sizeof (lmc_softc_t), GFP_KERNEL); - if (sc == NULL) { - printk (KERN_WARNING "%s: Cannot allocate memory for device state\n", - dev->name); - return (NULL); - } - memset (sc, 0, sizeof (lmc_softc_t)); - dev->priv = sc; + sc = dev->priv; sc->lmc_device = dev; sc->name = dev->name; @@ -883,8 +882,12 @@ /* An ioctl can cause a subsequent detach for raw frame interface */ sc->if_type = LMC_PPP; sc->check = 0xBEAFCAFE; - dev->base_addr = ioaddr; - dev->irq = irq; + dev->base_addr = pci_resource_start(pdev, 0); + dev->irq = pdev->irq; + + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &pdev->dev); + /* * This will get the protocol layer ready and do any 1 time init's * Must have a valid sc and dev structure @@ -893,19 +896,6 @@ lmc_proto_attach(sc); - /* Just fill in the entries for the device */ - - dev->init = lmc_init; - dev->type = ARPHRD_HDLC; - dev->hard_start_xmit = lmc_start_xmit; - dev->open = lmc_open; - dev->stop = lmc_close; - dev->get_stats = lmc_get_stats; - dev->do_ioctl = lmc_ioctl; - dev->set_config = lmc_set_config; - dev->tx_timeout = lmc_driver_timeout; - dev->watchdog_timeo = (HZ); /* 1 second */ - /* * Why were we changing this??? dev->tx_queue_len = 100; @@ -914,44 +904,45 @@ /* Init the spin lock so can call it latter */ spin_lock_init(&sc->lmc_lock); + pci_set_master(pdev); - printk ("%s: detected at %lx, irq %d\n", dev->name, ioaddr, dev->irq); + printk ("%s: detected at %lx, irq %d\n", dev->name, + dev->base_addr, dev->irq); if (register_netdev (dev) != 0) { printk (KERN_ERR "%s: register_netdev failed.\n", dev->name); - lmc_proto_detach(sc); - kfree (dev->priv); - kfree (dev); - return NULL; + goto out4; } - /* - * Request the region of registers we need, so that - * later on, no one else will take our card away from - * us. - */ - request_region (ioaddr, LMC_REG_RANGE, dev->name); - sc->lmc_cardtype = LMC_CARDTYPE_UNKNOWN; sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT; + /* + * + * Check either the subvendor or the subdevice, some systems reverse + * the setting in the bois, seems to be version and arch dependent? + * Fix the error, exchange the two values + */ + if ((subdevice = pdev->subsystem_device) == PCI_VENDOR_ID_LMC) + subdevice = pdev->subsystem_vendor; + switch (subdevice) { - case PCI_PRODUCT_LMC_HSSI: + case PCI_DEVICE_ID_LMC_HSSI: printk ("%s: LMC HSSI\n", dev->name); sc->lmc_cardtype = LMC_CARDTYPE_HSSI; sc->lmc_media = &lmc_hssi_media; break; - case PCI_PRODUCT_LMC_DS3: + case PCI_DEVICE_ID_LMC_DS3: printk ("%s: LMC DS3\n", dev->name); sc->lmc_cardtype = LMC_CARDTYPE_DS3; sc->lmc_media = &lmc_ds3_media; break; - case PCI_PRODUCT_LMC_SSI: + case PCI_DEVICE_ID_LMC_SSI: printk ("%s: LMC SSI\n", dev->name); sc->lmc_cardtype = LMC_CARDTYPE_SSI; sc->lmc_media = &lmc_ssi_media; break; - case PCI_PRODUCT_LMC_T1: + case PCI_DEVICE_ID_LMC_T1: printk ("%s: LMC T1\n", dev->name); sc->lmc_cardtype = LMC_CARDTYPE_T1; sc->lmc_media = &lmc_t1_media; @@ -976,13 +967,13 @@ AdapModelNum = (lmc_mii_readreg (sc, 0, 3) & 0x3f0) >> 4; if ((AdapModelNum == LMC_ADAP_T1 - && subdevice == PCI_PRODUCT_LMC_T1) || /* detect LMC1200 */ + && subdevice == PCI_DEVICE_ID_LMC_T1) || /* detect LMC1200 */ (AdapModelNum == LMC_ADAP_SSI - && subdevice == PCI_PRODUCT_LMC_SSI) || /* detect LMC1000 */ + && subdevice == PCI_DEVICE_ID_LMC_SSI) || /* detect LMC1000 */ (AdapModelNum == LMC_ADAP_DS3 - && subdevice == PCI_PRODUCT_LMC_DS3) || /* detect LMC5245 */ + && subdevice == PCI_DEVICE_ID_LMC_DS3) || /* detect LMC5245 */ (AdapModelNum == LMC_ADAP_HSSI - && subdevice == PCI_PRODUCT_LMC_HSSI)) + && subdevice == PCI_DEVICE_ID_LMC_HSSI)) { /* detect LMC5200 */ } @@ -996,10 +987,7 @@ */ LMC_CSR_WRITE (sc, csr_gp_timer, 0xFFFFFFFFUL); - sc->board_idx = board_idx; - - memset (&sc->stats, 0, sizeof (struct lmc_statistics)); - + sc->board_idx = cards_found++; sc->stats.check = STATCHECK; sc->stats.version_size = (DRIVER_VERSION << 16) + sizeof (struct lmc_statistics); @@ -1008,105 +996,40 @@ sc->lmc_ok = 0; sc->last_link_status = 0; - lmc_trace(dev, "lmc_probe1 out"); - - return dev; -} - - -/* This is the entry point. This is what is called immediately. */ -/* This goes out and finds the card */ + lmc_trace(dev, "lmc_init_one out"); + return 0; -int lmc_probe_fake(struct net_device *dev) /*fold00*/ -{ - lmc_probe(NULL); - /* Return 1 to unloaded bogus device */ - return 1; + out4: + lmc_proto_detach(sc); + out3: + if (pdev) { + pci_release_regions(pdev); + pci_set_drvdata(pdev, NULL); + } + out2: + free_netdev(dev); + out1: + return err; } -int lmc_probe (struct net_device *dev) /*fold00*/ +/* + * Called from pci when removing module. + */ +static void __devexit lmc_remove_one (struct pci_dev *pdev) { - int pci_index = 0; - unsigned long pci_ioaddr; - unsigned int pci_irq_line; - u16 vendor, subvendor, device, subdevice; - u32 foundaddr = 0; - u8 intcf = 0; - struct pci_dev *pdev = NULL; - - /* Loop basically until we don't find anymore. */ - while ((pdev = pci_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) { - if (pci_enable_device(pdev)) - break; - - vendor = pdev->vendor; - device = pdev->device; - pci_irq_line = pdev->irq; - pci_ioaddr = pci_resource_start (pdev, 0); - subvendor = pdev->subsystem_vendor; - subdevice = pdev->subsystem_device; - - pci_set_master (pdev); - - /* - * Make sure it's the correct card. CHECK SUBVENDOR ID! - * There are lots of tulip's out there. - * Also check the region of registers we will soon be - * poking, to make sure no one else has reserved them. - * This prevents taking someone else's device. - * - * Check either the subvendor or the subdevice, some systems reverse - * the setting in the bois, seems to be version and arch dependent? - * Fix the two variables - * - */ - if (!(check_region (pci_ioaddr, LMC_REG_RANGE)) && - (vendor == CORRECT_VENDOR_ID) && - (device == CORRECT_DEV_ID) && - ((subvendor == PCI_VENDOR_LMC) || (subdevice == PCI_VENDOR_LMC))){ - struct net_device *cur, *prev = NULL; - - /* Fix the error, exchange the two values */ - if(subdevice == PCI_VENDOR_LMC){ - subdevice = subvendor; - subvendor = PCI_VENDOR_LMC ; - } - - /* Make the call to actually setup this card */ - dev = lmc_probe1 (dev, pci_ioaddr, pci_irq_line, - device, subdevice, cards_found); - if (dev == NULL) { - printk ("lmc_probe: lmc_probe1 failed\n"); - goto lmc_probe_next_card; - } - /* insert the device into the chain of lmc devices */ - for (cur = Lmc_root_dev; - cur != NULL; - cur = ((lmc_softc_t *) cur->priv)->next_module) { - prev = cur; - } - - if (prev == NULL) - Lmc_root_dev = dev; - else - ((lmc_softc_t *) prev->priv)->next_module = dev; - - ((lmc_softc_t *) dev->priv)->next_module = NULL; - /* end insert */ - - foundaddr = dev->base_addr; - - cards_found++; - intcf++; - } - lmc_probe_next_card: - pci_index++; + struct net_device *dev = pci_get_drvdata(pdev); + + if (dev) { + lmc_softc_t *sc = dev->priv; + + printk("%s: removing...\n", dev->name); + lmc_proto_detach(sc); + unregister_netdev(dev); + free_netdev(dev); + pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); } - - if (cards_found < 1) - return -1; - - return foundaddr; } /* After this is called, packets can be sent. @@ -1181,8 +1104,6 @@ sc->stats.tx_tbusy0++ ; - MOD_INC_USE_COUNT; - /* * select what interrupts we want to get */ @@ -1352,7 +1273,6 @@ lmc_trace(dev, "lmc_ifdown out"); - MOD_DEC_USE_COUNT; return 0; } @@ -1850,12 +1770,11 @@ static struct net_device_stats *lmc_get_stats (struct net_device *dev) /*fold00*/ { - lmc_softc_t *sc; + lmc_softc_t *sc = dev->priv; unsigned long flags; lmc_trace(dev, "lmc_get_stats in"); - sc = dev->priv; spin_lock_irqsave(&sc->lmc_lock, flags); @@ -1868,58 +1787,21 @@ return (struct net_device_stats *) &sc->stats; } +static struct pci_driver lmc_driver = { + .name = "lmc", + .id_table = lmc_pci_tbl, + .probe = lmc_init_one, + .remove = __devexit_p(lmc_remove_one), +}; + static int __init init_lmc(void) { - printk ("lmc: module loaded\n"); - - /* Have lmc_probe search for all the cards, and allocate devices */ - if (lmc_probe (NULL) < 0) - return -EIO; - - return 0; + return pci_module_init(&lmc_driver); } static void __exit exit_lmc(void) { - struct net_device *dev, *next; - lmc_softc_t *sc; - - /* we have no pointer to our devices, since they are all dynamically - * allocated. So, here we loop through all the network devices - * looking for ours. When found, dispose of them properly. - */ - - for (dev = Lmc_root_dev; - dev != NULL; - dev = next ) - { - - next = ((lmc_softc_t *) dev->priv)->next_module; /* get it now before we deallocate it */ - printk ("%s: removing...\n", dev->name); - - /* close the syncppp stuff, and release irq. Close is run on unreg net */ - lmc_close (dev); - sc = dev->priv; - if (sc != NULL) - lmc_proto_detach(sc); - - /* Remove the device from the linked list */ - unregister_netdev (dev); - - /* Let go of the io region */; - release_region (dev->base_addr, LMC_REG_RANGE); - - /* free our allocated structures. */ - kfree (dev->priv); - dev->priv = NULL; - - free_netdev (dev); - dev = NULL; - } - - - Lmc_root_dev = NULL; - printk ("lmc module unloaded\n"); + pci_unregister_driver(&lmc_driver); } module_init(init_lmc); @@ -2326,8 +2208,3 @@ } - -int lmc_setup(void) { /*FOLD00*/ - return lmc_probe(NULL); -} - diff -Nru a/drivers/net/wan/lmc/lmc_var.h b/drivers/net/wan/lmc/lmc_var.h --- a/drivers/net/wan/lmc/lmc_var.h Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wan/lmc/lmc_var.h Tue Feb 17 20:00:06 2004 @@ -390,7 +390,7 @@ struct timer_list timer; lmc_ctl_t ictl; u_int32_t TxDescriptControlInit; - struct net_device *next_module; /* Link to the next module */ + int tx_TimeoutInd; /* additional driver state */ int tx_TimeoutDisplay; unsigned int lastlmc_taint_tx; @@ -519,18 +519,7 @@ #define TULIP_CMD_RECEIVEALL 0x40000000L #endif - -/* PCI register values */ -#define CORRECT_VENDOR_ID 0x1011 -#define CORRECT_DEV_ID 9 - -#define PCI_VENDOR_LMC 0x1376 -#define PCI_PRODUCT_LMC_HSSI 0x0003 -#define PCI_PRODUCT_LMC_DS3 0x0004 -#define PCI_PRODUCT_LMC_SSI 0x0005 -#define PCI_PRODUCT_LMC_T1 0x0006 - -/* Adapcter module number */ +/* Adapter module number */ #define LMC_ADAP_HSSI 2 #define LMC_ADAP_DS3 3 #define LMC_ADAP_SSI 4 diff -Nru a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c --- a/drivers/net/wan/pc300_tty.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wan/pc300_tty.c Tue Feb 17 20:00:06 2004 @@ -124,16 +124,18 @@ const unsigned char *buf, int count); static int cpc_tty_write_room(struct tty_struct *tty); static int cpc_tty_chars_in_buffer(struct tty_struct *tty); -static int cpc_tty_ioctl(struct tty_struct *tty, struct file *file, - unsigned int cmd, unsigned long arg); static void cpc_tty_flush_buffer(struct tty_struct *tty); static void cpc_tty_hangup(struct tty_struct *tty); static void cpc_tty_rx_work(void *data); static void cpc_tty_tx_work(void *data); static int cpc_tty_send_to_card(pc300dev_t *dev,void *buf, int len); static void cpc_tty_trace(pc300dev_t *dev, char* buf, int len, char rxtx); -static void cpc_tty_dtr_off(pc300dev_t *pc300dev); -static void cpc_tty_dtr_on(pc300dev_t *pc300dev); +static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char); +static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char); + +int pc300_tiocmset(struct tty_struct *, struct file *, + unsigned int, unsigned int); +int pc300_tiocmget(struct tty_struct *, struct file *); /* functions called by PC300 driver */ void cpc_tty_init(pc300dev_t *dev); @@ -143,38 +145,38 @@ void cpc_tty_reset_var(void); /* - * PC300 TTY clear DTR signal + * PC300 TTY clear "signal" */ -static void cpc_tty_dtr_off(pc300dev_t *pc300dev) +static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char signal) { pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan; pc300_t *card = (pc300_t *) pc300chan->card; int ch = pc300chan->channel; unsigned long flags; - CPC_TTY_DBG("%s-tty: Clear signal DTR\n", - ((struct net_device*)(pc300dev->hdlc))->name); + CPC_TTY_DBG("%s-tty: Clear signal %x\n", + ((struct net_device*)(pc300dev->hdlc))->name, signal); CPC_TTY_LOCK(card, flags); cpc_writeb(card->hw.scabase + M_REG(CTL,ch), - cpc_readb(card->hw.scabase+M_REG(CTL,ch))& CTL_DTR); + cpc_readb(card->hw.scabase+M_REG(CTL,ch))& signal); CPC_TTY_UNLOCK(card,flags); } /* - * PC300 TTY set DTR signal to ON + * PC300 TTY set "signal" to ON */ -static void cpc_tty_dtr_on(pc300dev_t *pc300dev) +static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char signal) { pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan; pc300_t *card = (pc300_t *) pc300chan->card; int ch = pc300chan->channel; unsigned long flags; - CPC_TTY_DBG("%s-tty: Set signal DTR\n", - ((struct net_device*)(pc300dev->hdlc))->name); + CPC_TTY_DBG("%s-tty: Set signal %x\n", + ((struct net_device*)(pc300dev->hdlc))->name, signal); CPC_TTY_LOCK(card, flags); cpc_writeb(card->hw.scabase + M_REG(CTL,ch), - cpc_readb(card->hw.scabase+M_REG(CTL,ch))& ~CTL_DTR); + cpc_readb(card->hw.scabase+M_REG(CTL,ch))& ~signal); CPC_TTY_UNLOCK(card,flags); } @@ -229,7 +231,8 @@ serial_drv.write = cpc_tty_write; serial_drv.write_room = cpc_tty_write_room; serial_drv.chars_in_buffer = cpc_tty_chars_in_buffer; - serial_drv.ioctl = cpc_tty_ioctl; + serial_drv.tiocmset = pc300_tiocmset; + serial_drv.tiocmget = pc300_tiocmget; serial_drv.flush_buffer = cpc_tty_flush_buffer; serial_drv.hangup = cpc_tty_hangup; @@ -270,7 +273,7 @@ memcpy(&cpc_tty->name[aux], "-tty", 5); cpc_open((struct net_device *)pc300dev->hdlc); - cpc_tty_dtr_off(pc300dev); + cpc_tty_signal_off(pc300dev, CTL_DTR); CPC_TTY_DBG("%s: Initializing TTY Sync Driver, tty major#%d minor#%i\n", cpc_tty->name,CPC_TTY_MAJOR,cpc_tty->tty_minor); @@ -332,7 +335,7 @@ cpc_tty_area[port].tty = tty; tty->driver_data = &cpc_tty_area[port]; - cpc_tty_dtr_on(cpc_tty->pc300dev); + cpc_tty_signal_on(cpc_tty->pc300dev, CTL_DTR); } cpc_tty->num_open++; @@ -379,7 +382,7 @@ return; } - cpc_tty_dtr_off(cpc_tty->pc300dev); + cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); CPC_TTY_LOCK(cpc_tty->pc300dev->chan->card, flags); /* lock irq */ cpc_tty->tty = NULL; @@ -556,18 +559,13 @@ return(0); } -/* - * PC300 TTY IOCTL routine - * - * This routine treats TIOCMBIS (set DTR signal) and TIOCMBIC (clear DTR - * signal)IOCTL commands. - */ -static int cpc_tty_ioctl(struct tty_struct *tty, struct file *file, - unsigned int cmd, unsigned long arg) - +int pc300_tiocmset(struct tty_struct *tty, struct file *file, + unsigned int set, unsigned int clear) { st_cpc_tty_area *cpc_tty; + CPC_TTY_DBG("%s: set:%x clear:%x\n", __FUNCTION__, set, clear); + if (!tty || !tty->driver_data ) { CPC_TTY_DBG("hdlcX-tty: no TTY to chars in buffer\n"); return -ENODEV; @@ -575,26 +573,44 @@ cpc_tty = (st_cpc_tty_area *) tty->driver_data; - if ((cpc_tty->tty != tty) || (cpc_tty->state != CPC_TTY_ST_OPEN)) { - CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); - return -ENODEV; - } + if (set & TIOCM_RTS) + cpc_tty_signal_on(cpc_tty->pc300dev, CTL_RTS); + if (set & TIOCM_DTR) + cpc_tty_signal_on(cpc_tty->pc300dev, CTL_DTR); + + if (clear & TIOCM_RTS) + cpc_tty_signal_off(cpc_tty->pc300dev, CTL_RTS); + if (clear & TIOCM_DTR) + cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); - CPC_TTY_DBG("%s: IOCTL cmd %x\n",cpc_tty->name,cmd); - - switch (cmd) { - case TIOCMBIS : /* set DTR */ - cpc_tty_dtr_on(cpc_tty->pc300dev); - break; - - case TIOCMBIC: /* clear DTR */ - cpc_tty_dtr_off(cpc_tty->pc300dev); - break; - default : - return -ENOIOCTLCMD; - } return 0; -} +} + +int pc300_tiocmget(struct tty_struct *tty, struct file *file) +{ + unsigned int result; + unsigned char status; + unsigned long flags; + st_cpc_tty_area *cpc_tty = (st_cpc_tty_area *) tty->driver_data; + pc300dev_t *pc300dev = cpc_tty->pc300dev; + pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan; + pc300_t *card = (pc300_t *) pc300chan->card; + int ch = pc300chan->channel; + + cpc_tty = (st_cpc_tty_area *) tty->driver_data; + + CPC_TTY_DBG("%s-tty: tiocmget\n", + ((struct net_device*)(pc300dev->hdlc))->name); + + CPC_TTY_LOCK(card, flags); + status = cpc_readb(card->hw.scabase+M_REG(CTL,ch)); + CPC_TTY_UNLOCK(card,flags); + + result = ((status & CTL_DTR) ? TIOCM_DTR : 0) | + ((status & CTL_RTS) ? TIOCM_RTS : 0); + + return result; +} /* * PC300 TTY Flush Buffer routine @@ -660,7 +676,7 @@ cpc_tty->name,res); } } - cpc_tty_dtr_off(cpc_tty->pc300dev); + cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); } /* diff -Nru a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c --- a/drivers/net/wan/x25_asy.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wan/x25_asy.c Tue Feb 17 20:00:06 2004 @@ -94,7 +94,7 @@ return sl; } else { printk("x25_asy_alloc() - register_netdev() failure.\n"); - kfree(dev); + free_netdev(dev); } } return NULL; diff -Nru a/drivers/net/wd.c b/drivers/net/wd.c --- a/drivers/net/wd.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/wd.c Tue Feb 17 20:00:05 2004 @@ -47,7 +47,6 @@ static unsigned int wd_portlist[] __initdata = {0x300, 0x280, 0x380, 0x240, 0}; -int wd_probe(struct net_device *dev); static int wd_probe1(struct net_device *dev, int ioaddr); static int wd_open(struct net_device *dev); @@ -83,11 +82,14 @@ The wd_probe1() routine initializes the card and fills the station address field. */ -int __init wd_probe(struct net_device *dev) +static int __init do_wd_probe(struct net_device *dev) { int i; struct resource *r; int base_addr = dev->base_addr; + int irq = dev->irq; + int mem_start = dev->mem_start; + int mem_end = dev->mem_end; SET_MODULE_OWNER(dev); @@ -115,11 +117,45 @@ return 0; } release_region(ioaddr, WD_IO_EXTENT); + dev->irq = irq; + dev->mem_start = mem_start; + dev->mem_end = mem_end; } return -ENODEV; } +static void cleanup_card(struct net_device *dev) +{ + free_irq(dev->irq, dev); + release_region(dev->base_addr - WD_NIC_OFFSET, WD_IO_EXTENT); +} + +struct net_device * __init wd_probe(int unit) +{ + struct net_device *dev = alloc_ei_netdev(); + int err; + + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + err = do_wd_probe(dev); + if (err) + goto out; + err = register_netdev(dev); + if (err) + goto out1; + return dev; +out1: + cleanup_card(dev); +out: + free_netdev(dev); + return ERR_PTR(err); +} + static int __init wd_probe1(struct net_device *dev, int ioaddr) { int i; @@ -262,19 +298,11 @@ } else if (dev->irq == 2) /* Fixup bogosity: IRQ2 is really IRQ9 */ dev->irq = 9; - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (" unable to get memory for dev->priv.\n"); - return -ENOMEM; - } - /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ i = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); if (i) { printk (" unable to get IRQ %d.\n", dev->irq); - kfree(dev->priv); - dev->priv = NULL; return i; } @@ -446,7 +474,7 @@ #ifdef MODULE #define MAX_WD_CARDS 4 /* Max number of wd cards per module */ -static struct net_device dev_wd[MAX_WD_CARDS]; +static struct net_device *dev_wd[MAX_WD_CARDS]; static int io[MAX_WD_CARDS]; static int irq[MAX_WD_CARDS]; static int mem[MAX_WD_CARDS]; @@ -468,29 +496,35 @@ int init_module(void) { + struct net_device *dev; int this_dev, found = 0; for (this_dev = 0; this_dev < MAX_WD_CARDS; this_dev++) { - struct net_device *dev = &dev_wd[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->mem_start = mem[this_dev]; - dev->mem_end = mem_end[this_dev]; - dev->init = wd_probe; if (io[this_dev] == 0) { if (this_dev != 0) break; /* only autoprobe 1st one */ printk(KERN_NOTICE "wd.c: Presently autoprobing (not recommended) for a single card.\n"); } - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; + dev = alloc_ei_netdev(); + if (!dev) + break; + dev->irq = irq[this_dev]; + dev->base_addr = io[this_dev]; + dev->mem_start = mem[this_dev]; + dev->mem_end = mem_end[this_dev]; + if (do_wd_probe(dev) == 0) { + if (register_netdev(dev) == 0) { + dev_wd[found++] = dev; + continue; } - return -ENXIO; + cleanup_card(dev); } - found++; + free_netdev(dev); + printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]); + break; } - return 0; + if (found) + return 0; + return -ENXIO; } void @@ -499,14 +533,11 @@ int this_dev; for (this_dev = 0; this_dev < MAX_WD_CARDS; this_dev++) { - struct net_device *dev = &dev_wd[this_dev]; - if (dev->priv != NULL) { - void *priv = dev->priv; - int ioaddr = dev->base_addr - WD_NIC_OFFSET; - free_irq(dev->irq, dev); - release_region(ioaddr, WD_IO_EXTENT); + struct net_device *dev = dev_wd[this_dev]; + if (dev) { unregister_netdev(dev); - kfree(priv); + cleanup_card(dev); + free_netdev(dev); } } } diff -Nru a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig --- a/drivers/net/wireless/Kconfig Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wireless/Kconfig Tue Feb 17 20:00:06 2004 @@ -221,6 +221,29 @@ common. Some of the built-in wireless adaptors in laptops are of this variety. +config ATMEL + tristate "Atmel at76c50x chipset 802.11b support" + depends on NET_RADIO && EXPERIMENTAL + enable FW_LOADER + enable CRC32 + ---help--- + A driver 802.11b wireless cards based on the Atmel fast-vnet + chips. This driver supports standard Linux wireless extensions. + + Many cards based on this chipset do not have flash memory + and need their firmware loaded at start-up. If yours is + one of these, you will need to provide a firmware image + to be loaded into the card by the driver. The Atmel + firmware package can be downloaded from + http://www.thekelleys.org.uk/atmel + +config PCI_ATMEL + tristate "Atmel at76c506 PCI cards" + depends on ATMEL && PCI + ---help--- + Enable support for PCI and mini-PCI cards containing the + Atmel at76c506 chip. + # If Pcmcia is compiled in, offer Pcmcia cards... comment "Wireless 802.11b Pcmcia/Cardbus cards support" depends on NET_RADIO && PCMCIA @@ -268,21 +291,13 @@ available from . config PCMCIA_ATMEL - tristate "Atmel at76c502/at76c504 PCMCIA cards" - depends on NET_RADIO && EXPERIMENTAL && PCMCIA - enable FW_LOADER - enable CRC32 - ---help--- - A driver for PCMCIA 802.11 wireless cards based on the - Atmel fast-vnet chips. This driver supports standard - Linux wireless extensions. - - Many cards based on this chipset do not have flash memory - and need their firmware loaded at start-up. If yours is - one of these, you will need to provide a firmware image - to be loaded into the card by the driver. The Atmel - firmware package can be downloaded from - http://www.thekelleys.org.uk/atmel + tristate "Atmel at76c502/at76c504 PCMCIA cards" + depends on NET_RADIO && ATMEL && PCMCIA + select FW_LOADER + select CRC32 + ---help--- + Enable support for PCMCIA cards containing the + Atmel at76c502 and at76c504 chips. config PCMCIA_WL3501 tristate "Planet WL3501 PCMCIA cards" diff -Nru a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile --- a/drivers/net/wireless/Makefile Tue Feb 17 20:00:14 2004 +++ b/drivers/net/wireless/Makefile Tue Feb 17 20:00:14 2004 @@ -22,7 +22,10 @@ obj-$(CONFIG_AIRO) += airo.o obj-$(CONFIG_AIRO_CS) += airo_cs.o airo.o +obj-$(CONFIG_ATMEL) += atmel.o +obj-$(CONFIG_PCI_ATMEL) += atmel_pci.o +obj-$(CONFIG_PCMCIA_ATMEL) += atmel_cs.o + # 16-bit wireless PCMCIA client drivers obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o -obj-$(CONFIG_PCMCIA_ATMEL) += atmel_cs.o atmel.o obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o diff -Nru a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wireless/airo.c Tue Feb 17 20:00:06 2004 @@ -14,6 +14,8 @@ Aironet. Major code contributions were received from Javier Achirica and Jean Tourrilhes . Code was also integrated from the Cisco Aironet driver for Linux. + Support for MPI350 cards was added by Fabrice Bellet + . ======================================================================*/ @@ -51,27 +53,31 @@ { 0x14b9, 0x4800, PCI_ANY_ID, PCI_ANY_ID, }, { 0x14b9, 0x0340, PCI_ANY_ID, PCI_ANY_ID, }, { 0x14b9, 0x0350, PCI_ANY_ID, PCI_ANY_ID, }, + { 0x14b9, 0x5000, PCI_ANY_ID, PCI_ANY_ID, }, + { 0x14b9, 0xa504, PCI_ANY_ID, PCI_ANY_ID, }, { 0, } }; MODULE_DEVICE_TABLE(pci, card_ids); static int airo_pci_probe(struct pci_dev *, const struct pci_device_id *); static void airo_pci_remove(struct pci_dev *); +static int airo_pci_suspend(struct pci_dev *pdev, u32 state); +static int airo_pci_resume(struct pci_dev *pdev); static struct pci_driver airo_driver = { .name = "airo", .id_table = card_ids, .probe = airo_pci_probe, .remove = __devexit_p(airo_pci_remove), + .suspend = airo_pci_suspend, + .resume = airo_pci_resume, }; #endif /* CONFIG_PCI */ /* Include Wireless Extension definition and check version - Jean II */ #include #define WIRELESS_SPY // enable iwspy support -#if WIRELESS_EXT > 12 #include // New driver API -#endif /* WIRELESS_EXT > 12 */ #define CISCO_EXT // enable Cisco extensions #ifdef CISCO_EXT @@ -235,10 +241,10 @@ MODULE_AUTHOR("Benjamin Reed"); MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet \ - cards. Direct support for ISA/PCI cards and support \ + cards. Direct support for ISA/PCI/MPI cards and support \ for PCMCIA when used with airo_cs."); MODULE_LICENSE("Dual BSD/GPL"); -MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340"); +MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340/350"); MODULE_PARM(io,"1-4i"); MODULE_PARM(irq,"1-4i"); MODULE_PARM(basic_rate,"i"); @@ -380,6 +386,16 @@ #define AUXOFF 0x3C #define AUXDATA 0x3E +#define FID_TX 1 +#define FID_RX 2 +/* Offset into aux memory for descriptors */ +#define AUX_OFFSET 0x800 +/* Size of allocated packets */ +#define PKTSIZE 1840 +#define RIDSIZE 2048 +/* Size of the transmit queue */ +#define MAXTXQ 64 + /* BAP selectors */ #define BAP0 0 // Used for receiving packets #define BAP1 2 // Used for xmiting packets and working with RIDS @@ -405,7 +421,8 @@ #define EV_TXCPY 0x400 #define EV_UNKNOWN 0x800 #define EV_MIC 0x1000 /* Message Integrity Check Interrupt */ -#define STATUS_INTS ( EV_AWAKE | EV_LINK | EV_TXEXC | EV_TX | EV_RX | EV_MIC ) +#define EV_AWAKEN 0x2000 +#define STATUS_INTS (EV_AWAKE|EV_LINK|EV_TXEXC|EV_TX|EV_TXCPY|EV_RX|EV_MIC) #ifdef CHECK_UNKNOWN_INTS #define IGNORE_INTS ( EV_CMD | EV_UNKNOWN) @@ -413,6 +430,9 @@ #define IGNORE_INTS (~STATUS_INTS) #endif +/* RID TYPES */ +#define RID_RW 0x20 + /* The RIDs */ #define RID_CAPABILITIES 0xFF00 #define RID_APINFO 0xFF01 @@ -615,7 +635,7 @@ /*---------- Aironet Extensions ----------*/ u8 magicAction; #define MAGIC_ACTION_STSCHG 1 -#define MACIC_ACTION_RESUME 2 +#define MAGIC_ACTION_RESUME 2 #define MAGIC_IGNORE_MCAST (1<<8) #define MAGIC_IGNORE_BCAST (1<<9) #define MAGIC_SWITCH_TO_PSP (0<<10) @@ -869,6 +889,7 @@ #define AIRORESTART AIROFLPUTBUF + 1 #define FLASHSIZE 32768 +#define AUXMEMSIZE (256 * 1024) typedef struct aironet_ioctl { unsigned short command; // What to do @@ -916,6 +937,110 @@ miccntx uCtx; // Unicast context } mic_module; +typedef struct { + unsigned int rid: 16; + unsigned int len: 15; + unsigned int valid: 1; + dma_addr_t host_addr; +} Rid; + +typedef struct { + unsigned int offset: 15; + unsigned int eoc: 1; + unsigned int len: 15; + unsigned int valid: 1; + dma_addr_t host_addr; +} TxFid; + +typedef struct { + unsigned int ctl: 15; + unsigned int rdy: 1; + unsigned int len: 15; + unsigned int valid: 1; + dma_addr_t host_addr; +} RxFid; + +/* + * Host receive descriptor + */ +typedef struct { + unsigned char *card_ram_off; /* offset into card memory of the + desc */ + RxFid rx_desc; /* card receive descriptor */ + char *virtual_host_addr; /* virtual address of host receive + buffer */ + int pending; +} HostRxDesc; + +/* + * Host transmit descriptor + */ +typedef struct { + unsigned char *card_ram_off; /* offset into card memory of the + desc */ + TxFid tx_desc; /* card transmit descriptor */ + char *virtual_host_addr; /* virtual address of host receive + buffer */ + int pending; +} HostTxDesc; + +/* + * Host RID descriptor + */ +typedef struct { + unsigned char *card_ram_off; /* offset into card memory of the + descriptor */ + Rid rid_desc; /* card RID descriptor */ + char *virtual_host_addr; /* virtual address of host receive + buffer */ +} HostRidDesc; + +typedef struct { + u16 sw0; + u16 sw1; + u16 status; + u16 len; +#define HOST_SET (1 << 0) +#define HOST_INT_TX (1 << 1) /* Interrupt on successful TX */ +#define HOST_INT_TXERR (1 << 2) /* Interrupt on unseccessful TX */ +#define HOST_LCC_PAYLOAD (1 << 4) /* LLC payload, 0 = Ethertype */ +#define HOST_DONT_RLSE (1 << 5) /* Don't release buffer when done */ +#define HOST_DONT_RETRY (1 << 6) /* Don't retry trasmit */ +#define HOST_CLR_AID (1 << 7) /* clear AID failure */ +#define HOST_RTS (1 << 9) /* Force RTS use */ +#define HOST_SHORT (1 << 10) /* Do short preamble */ + u16 ctl; + u16 aid; + u16 retries; + u16 fill; +} TxCtlHdr; + +typedef struct { + u16 ctl; + u16 duration; + char addr1[6]; + char addr2[6]; + char addr3[6]; + u16 seq; + char addr4[6]; +} WifiHdr; + + +typedef struct { + TxCtlHdr ctlhdr; + u16 fill1; + u16 fill2; + WifiHdr wifihdr; + u16 gaplen; + u16 status; +} WifiCtlHdr; + +WifiCtlHdr wifictlhdr8023 = { +ctlhdr: { + ctl: HOST_DONT_RLSE, + } +}; + #ifdef WIRELESS_EXT // Frequency list (map channels to frequencies) static const long frequency_list[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, @@ -935,14 +1060,8 @@ #define IW_ENCODE_MODE (IW_ENCODE_DISABLED | IW_ENCODE_RESTRICTED | IW_ENCODE_OPEN) #endif /* IW_ENCODE_NOKEY */ -#if WIRELESS_EXT > 12 /* List of Wireless Handlers (new API) */ static const struct iw_handler_def airo_handler_def; -#else /* WIRELESS_EXT > 12 */ -/* More Wireless Extensions backward compatibility */ -/* Part of iw_handler prototype we need (apart that we don't need it) */ -struct iw_request_info {}; -#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT */ static const char version[] = "airo.c 0.6 (Ben Reed & Javier Achirica)"; @@ -975,6 +1094,11 @@ static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket); static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket); +static int mpi_send_packet (struct net_device *dev); +static void mpi_unmap_card(struct pci_dev *pci); +static void mpi_receive_802_3(struct airo_info *ai); +static int waitbusy (struct airo_info *ai); + static irqreturn_t airo_interrupt( int irq, void* dev_id, struct pt_regs *regs); static int airo_thread(void *data); @@ -1000,26 +1124,23 @@ struct airo_info { struct net_device_stats stats; - int open; struct net_device *dev; /* Note, we can have MAX_FIDS outstanding. FIDs are 16-bits, so we use the high bit to mark whether it is in use. */ #define MAX_FIDS 6 +#define MPI_MAX_FIDS 1 int fids[MAX_FIDS]; - int registered; ConfigRid config; - int need_commit; // Need to set config char keyindex; // Used with auto wep char defindex; // Used with auto wep struct proc_dir_entry *proc_entry; - struct airo_info *next; spinlock_t aux_lock; unsigned long flags; #define FLAG_PROMISC 8 /* IFF_PROMISC 0x100 - include/linux/if.h */ #define FLAG_RADIO_OFF 0 /* User disabling of MAC */ #define FLAG_RADIO_DOWN 1 /* ifup/ifdown disabling of MAC */ #define FLAG_RADIO_MASK 0x03 -#define FLAG_FLASHING 2 +#define FLAG_ENABLED 2 #define FLAG_ADHOC 3 /* Needed by MIC */ #define FLAG_MIC_CAPABLE 4 #define FLAG_UPDATE_MULTI 5 @@ -1027,6 +1148,11 @@ #define FLAG_802_11 7 #define FLAG_PENDING_XMIT 9 #define FLAG_PENDING_XMIT11 10 +#define FLAG_MPI 11 +#define FLAG_REGISTERED 12 +#define FLAG_COMMIT 13 +#define FLAG_RESET 14 +#define FLAG_FLASHING 15 #define JOB_MASK 0x1ff0000 #define JOB_DIE 16 #define JOB_XMIT 17 @@ -1055,15 +1181,7 @@ #ifdef WIRELESS_EXT struct iw_statistics wstats; // wireless stats unsigned long scan_timestamp; /* Time started to scan */ -#if WIRELESS_EXT > 15 struct iw_spy_data spy_data; -#else /* WIRELESS_EXT > 15 */ -#ifdef WIRELESS_SPY - int spy_number; - u_char spy_address[IW_MAX_SPY][ETH_ALEN]; - struct iw_quality spy_stat[IW_MAX_SPY]; -#endif /* WIRELESS_SPY */ -#endif /* WIRELESS_EXT > 15 */ #endif /* WIRELESS_EXT */ #ifdef MICSUPPORT /* MIC stuff */ @@ -1071,6 +1189,20 @@ mic_module mod[2]; mic_statistics micstats; #endif + HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors + HostTxDesc txfids[MPI_MAX_FIDS]; + HostRidDesc config_desc; + unsigned long ridbus; // phys addr of config_desc + struct sk_buff_head txq;// tx queue used by mpi350 code + struct pci_dev *pci; + unsigned char *pcimem; + unsigned char *pciaux; + unsigned char *shared; + dma_addr_t shared_dma; + int power; + SsidRid *SSID; + APListRid *APList; +#define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE }; static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen, @@ -1550,6 +1682,7 @@ Resp rsp; if (first == 1) { + if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_LISTBSS; if (down_interruptible(&ai->sem)) @@ -1647,8 +1780,11 @@ for(s = &cfg.txPower; s <= &cfg.radioSpecific; s++) *s = le16_to_cpu(*s); - for(s = &cfg.arlThreshold; s <= &cfg.autoWake; s++) - *s = le16_to_cpu(*s); + for(s = &cfg.arlThreshold; s <= &cfg._reserved4[0]; s++) + *s = cpu_to_le16(*s); + + for(s = &cfg.autoWake; s <= &cfg.autoWake; s++) + *s = cpu_to_le16(*s); ai->config = cfg; return SUCCESS; @@ -1668,10 +1804,10 @@ u16 *s; ConfigRid cfgr; - if (!ai->need_commit) + if (!test_bit (FLAG_COMMIT, &ai->flags)) return SUCCESS; - ai->need_commit = 0; + clear_bit (FLAG_COMMIT | FLAG_RESET, &ai->flags); checkThrottle(ai); cfgr = ai->config; @@ -1688,7 +1824,10 @@ for(s = &cfgr.txPower; s <= &cfgr.radioSpecific; s++) *s = cpu_to_le16(*s); - for(s = &cfgr.arlThreshold; s <= &cfgr.autoWake; s++) + for(s = &cfgr.arlThreshold; s <= &cfgr._reserved4[0]; s++) + *s = cpu_to_le16(*s); + + for(s = &cfgr.autoWake; s <= &cfgr.autoWake; s++) *s = cpu_to_le16(*s); return PC4500_writerid( ai, RID_CONFIG, &cfgr, sizeof(cfgr), lock); @@ -1749,7 +1888,7 @@ * Wireless Extensions may postpone config changes until the card * is open (to pipeline changes and speed-up card setup). If * those changes are not yet commited, do it now - Jean II */ - if(info->need_commit) { + if (test_bit (FLAG_COMMIT, &info->flags)) { disable_MAC(info, 1); writeConfigRid(info, 1); } @@ -1765,52 +1904,177 @@ return 0; } +static int mpi_start_xmit(struct sk_buff *skb, struct net_device *dev) { + int npacks, pending; + unsigned long flags; + struct airo_info *ai = dev->priv; + + if (!skb) { + printk(KERN_ERR "airo: %s: skb==NULL\n",__FUNCTION__); + return 0; + } + npacks = skb_queue_len (&ai->txq); + + if (npacks >= MAXTXQ - 1) { + netif_stop_queue (dev); + if (npacks > MAXTXQ) { + ai->stats.tx_fifo_errors++; + return 1; + } + skb_queue_tail (&ai->txq, skb); + return 0; + } + + spin_lock_irqsave(&ai->aux_lock, flags); + skb_queue_tail (&ai->txq, skb); + pending = test_bit(FLAG_PENDING_XMIT, &ai->flags); + spin_unlock_irqrestore(&ai->aux_lock,flags); + netif_wake_queue (dev); + + if (pending == 0) { + set_bit(FLAG_PENDING_XMIT, &ai->flags); + mpi_send_packet (dev); + } + return 0; +} + +/* + * @mpi_send_packet + * + * Attempt to transmit a packet. Can be called from interrupt + * or transmit . return number of packets we tried to send + */ + +static int mpi_send_packet (struct net_device *dev) +{ + struct sk_buff *skb; + unsigned char *buffer; + s16 len, *payloadLen; + struct airo_info *ai = dev->priv; + u8 *sendbuf; + + /* get a packet to send */ + + if ((skb = skb_dequeue(&ai->txq)) == 0) { + printk (KERN_ERR + "airo_mpi: %s: Dequeue'd zero in send_packet()\n", + __FUNCTION__); + return 0; + } + + /* check min length*/ + len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; + buffer = skb->data; + + ai->txfids[0].tx_desc.offset = 0; + ai->txfids[0].tx_desc.valid = 1; + ai->txfids[0].tx_desc.eoc = 1; + ai->txfids[0].tx_desc.len =len+sizeof(WifiHdr); + + memcpy((char *)ai->txfids[0].card_ram_off, + (char *)&ai->txfids[0].tx_desc, sizeof(TxFid)); + +/* + * Magic, the cards firmware needs a length count (2 bytes) in the host buffer + * right after TXFID_HDR.The TXFID_HDR contains the status short so payloadlen + * is immediatly after it. ------------------------------------------------ + * |TXFIDHDR+STATUS|PAYLOADLEN|802.3HDR|PACKETDATA| + * ------------------------------------------------ + */ + + memcpy((char *)ai->txfids[0].virtual_host_addr, + (char *)&wifictlhdr8023, sizeof(wifictlhdr8023)); + + payloadLen = (s16 *)(ai->txfids[0].virtual_host_addr + + sizeof(wifictlhdr8023)); + sendbuf = ai->txfids[0].virtual_host_addr + + sizeof(wifictlhdr8023) + 2 ; + + /* + * Firmware automaticly puts 802 header on so + * we don't need to account for it in the length + */ +#ifdef MICSUPPORT + if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && + (ntohs(((u16 *)buffer)[6]) != 0x888E)) { + MICBuffer pMic; + + if (encapsulate(ai, (etherHead *)buffer, &pMic, len - sizeof(etherHead)) != SUCCESS) + return ERROR; + + *payloadLen = cpu_to_le16(len-sizeof(etherHead)+sizeof(pMic)); + /* copy data into airo dma buffer */ + memcpy (sendbuf, buffer, sizeof(etherHead)); + buffer += sizeof(etherHead); + sendbuf += sizeof(etherHead); + memcpy (sendbuf, &pMic, sizeof(pMic)); + sendbuf += sizeof(pMic); + memcpy (sendbuf, buffer, len - sizeof(etherHead)); + } else +#endif + { + *payloadLen = cpu_to_le16(len - sizeof(etherHead)); + + dev->trans_start = jiffies; + + /* copy data into airo dma buffer */ + memcpy(sendbuf, buffer, len); + } + + OUT4500(ai, EVACK, 8); + + dev_kfree_skb_any(skb); + return 1; +} + static void get_tx_error(struct airo_info *ai, u32 fid) { u16 status; - if (bap_setup(ai, ai->fids[fid] & 0xffff, 4, BAP0) == SUCCESS) { + if (fid < 0) + status = ((WifiCtlHdr *)ai->txfids[0].virtual_host_addr)->ctlhdr.status; + else { + if (bap_setup(ai, ai->fids[fid] & 0xffff, 4, BAP0) != SUCCESS) + return; bap_read(ai, &status, 2, BAP0); - if (le16_to_cpu(status) & 2) /* Too many retries */ - ai->stats.tx_aborted_errors++; - if (le16_to_cpu(status) & 4) /* Transmit lifetime exceeded */ - ai->stats.tx_heartbeat_errors++; - if (le16_to_cpu(status) & 8) /* Aid fail */ - { } - if (le16_to_cpu(status) & 0x10) /* MAC disabled */ - ai->stats.tx_carrier_errors++; - if (le16_to_cpu(status) & 0x20) /* Association lost */ - { } -#if WIRELESS_EXT > 13 - /* We produce a TXDROP event only for retry or lifetime - * exceeded, because that's the only status that really mean - * that this particular node went away. - * Other errors means that *we* screwed up. - Jean II */ - if ((le16_to_cpu(status) & 2) || - (le16_to_cpu(status) & 4)) { - union iwreq_data wrqu; - char junk[0x18]; - - /* Faster to skip over useless data than to do - * another bap_setup(). We are at offset 0x6 and - * need to go to 0x18 and read 6 bytes - Jean II */ - bap_read(ai, (u16 *) junk, 0x18, BAP0); - - /* Copy 802.11 dest address. - * We use the 802.11 header because the frame may - * not be 802.3 or may be mangled... - * In Ad-Hoc mode, it will be the node address. - * In managed mode, it will be most likely the AP addr - * User space will figure out how to convert it to - * whatever it needs (IP address or else). - * - Jean II */ - memcpy(wrqu.addr.sa_data, junk + 0x12, ETH_ALEN); - wrqu.addr.sa_family = ARPHRD_ETHER; + } + if (le16_to_cpu(status) & 2) /* Too many retries */ + ai->stats.tx_aborted_errors++; + if (le16_to_cpu(status) & 4) /* Transmit lifetime exceeded */ + ai->stats.tx_heartbeat_errors++; + if (le16_to_cpu(status) & 8) /* Aid fail */ + { } + if (le16_to_cpu(status) & 0x10) /* MAC disabled */ + ai->stats.tx_carrier_errors++; + if (le16_to_cpu(status) & 0x20) /* Association lost */ + { } + /* We produce a TXDROP event only for retry or lifetime + * exceeded, because that's the only status that really mean + * that this particular node went away. + * Other errors means that *we* screwed up. - Jean II */ + if ((le16_to_cpu(status) & 2) || + (le16_to_cpu(status) & 4)) { + union iwreq_data wrqu; + char junk[0x18]; + + /* Faster to skip over useless data than to do + * another bap_setup(). We are at offset 0x6 and + * need to go to 0x18 and read 6 bytes - Jean II */ + bap_read(ai, (u16 *) junk, 0x18, BAP0); + + /* Copy 802.11 dest address. + * We use the 802.11 header because the frame may + * not be 802.3 or may be mangled... + * In Ad-Hoc mode, it will be the node address. + * In managed mode, it will be most likely the AP addr + * User space will figure out how to convert it to + * whatever it needs (IP address or else). + * - Jean II */ + memcpy(wrqu.addr.sa_data, junk + 0x12, ETH_ALEN); + wrqu.addr.sa_family = ARPHRD_ETHER; - /* Send event to user space */ - wireless_send_event(ai->dev, IWEVTXDROP, &wrqu, NULL); - } -#endif /* WIRELESS_EXT > 13 */ + /* Send event to user space */ + wireless_send_event(ai->dev, IWEVTXDROP, &wrqu, NULL); } } @@ -2019,7 +2283,7 @@ readConfigRid(ai, 1); memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len); - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); disable_MAC(ai, 1); writeConfigRid (ai, 1); enable_MAC(ai, &rsp, 1); @@ -2066,25 +2330,49 @@ disable_interrupts(ai); free_irq( dev->irq, dev ); takedown_proc_entry( dev, ai ); - if (ai->registered) { + if (test_bit(FLAG_REGISTERED, &ai->flags)) { unregister_netdev( dev ); if (ai->wifidev) { unregister_netdev(ai->wifidev); free_netdev(ai->wifidev); ai->wifidev = 0; } - ai->registered = 0; + clear_bit(FLAG_REGISTERED, &ai->flags); } set_bit(JOB_DIE, &ai->flags); kill_proc(ai->thr_pid, SIGTERM, 1); wait_for_completion(&ai->thr_exited); + + /* + * Clean out tx queue + */ + if (test_bit(FLAG_MPI, &ai->flags) && skb_queue_len (&ai->txq) > 0) { + struct sk_buff *skb = 0; + for (;(skb = skb_dequeue(&ai->txq));) + dev_kfree_skb(skb); + } + if (ai->flash) kfree(ai->flash); if (ai->rssi) kfree(ai->rssi); + if (ai->APList) + kfree(ai->APList); + if (ai->SSID) + kfree(ai->SSID); if (freeres) { /* PCMCIA frees this stuff, so only for PCI and ISA */ release_region( dev->base_addr, 64 ); + if (test_bit(FLAG_MPI, &ai->flags)) { + if (ai->pci) + mpi_unmap_card(ai->pci); + if (ai->pcimem) + iounmap(ai->pcimem); + if (ai->pciaux) + iounmap(ai->pciaux); + pci_free_consistent(ai->pci, PCI_SHARED_LEN, + ai->shared, ai->shared_dma); + } } #ifdef MICSUPPORT if (ai->tfm) @@ -2104,6 +2392,213 @@ return ETH_ALEN; } +static void mpi_unmap_card(struct pci_dev *pci) +{ + unsigned long mem_start = pci_resource_start(pci, 1); + unsigned long mem_len = pci_resource_len(pci, 1); + unsigned long aux_start = pci_resource_start(pci, 2); + unsigned long aux_len = AUXMEMSIZE; + + release_mem_region(aux_start, aux_len); + release_mem_region(mem_start, mem_len); +} + +/************************************************************* + * This routine assumes that descriptors have been setup . + * Run at insmod time or after reset when the decriptors + * have been initialized . Returns 0 if all is well nz + * otherwise . Does not allocate memory but sets up card + * using previously allocated descriptors. + */ +static int mpi_init_descriptors (struct airo_info *ai) +{ + Cmd cmd; + Resp rsp; + int i; + int rc = SUCCESS; + + /* Alloc card RX descriptors */ + netif_stop_queue(ai->dev); + + memset(&rsp,0,sizeof(rsp)); + memset(&cmd,0,sizeof(cmd)); + + cmd.cmd = CMD_ALLOCATEAUX; + cmd.parm0 = FID_RX; + cmd.parm1 = (ai->rxfids[0].card_ram_off - ai->pciaux); + cmd.parm2 = MPI_MAX_FIDS; + rc=issuecommand(ai, &cmd, &rsp); + if (rc != SUCCESS) { + printk(KERN_ERR "airo: Couldn't allocate RX FID\n"); + return rc; + } + + for (i=0; irxfids[i].card_ram_off, + &ai->rxfids[i].rx_desc, sizeof(RxFid)); + } + + /* Alloc card TX descriptors */ + + memset(&rsp,0,sizeof(rsp)); + memset(&cmd,0,sizeof(cmd)); + + cmd.cmd = CMD_ALLOCATEAUX; + cmd.parm0 = FID_TX; + cmd.parm1 = (ai->txfids[0].card_ram_off - ai->pciaux); + cmd.parm2 = MPI_MAX_FIDS; + rc=issuecommand(ai, &cmd, &rsp); + if (rc != SUCCESS) { + printk(KERN_ERR "airo: Couldn't allocate TX FID\n"); + return rc; + } + + for (i=0; itxfids[i].tx_desc.valid = 1; + memcpy((char *)ai->txfids[i].card_ram_off, + &ai->txfids[i].tx_desc, sizeof(TxFid)); + } + + /* Alloc card Rid descriptor */ + memset(&rsp,0,sizeof(rsp)); + memset(&cmd,0,sizeof(cmd)); + + cmd.cmd = CMD_ALLOCATEAUX; + cmd.parm0 = RID_RW; + cmd.parm1 = (ai->config_desc.card_ram_off - ai->pciaux); + cmd.parm2 = 1; /* Magic number... */ + rc=issuecommand(ai, &cmd, &rsp); + if (rc != SUCCESS) { + printk(KERN_ERR "airo: Couldn't allocate RID\n"); + return rc; + } + + memcpy((char *)ai->config_desc.card_ram_off, + (char *)&ai->config_desc.rid_desc, sizeof(Rid)); + + return rc; +} + +/* + * We are setting up three things here: + * 1) Map AUX memory for descriptors: Rid, TxFid, or RxFid. + * 2) Map PCI memory for issueing commands. + * 3) Allocate memory (shared) to send and receive ethernet frames. + */ +static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci, + const char *name) +{ + unsigned long mem_start, mem_len, aux_start, aux_len; + int rc = -1; + int i; + unsigned char *busaddroff,*vpackoff; + unsigned char *pciaddroff; + + mem_start = pci_resource_start(pci, 1); + mem_len = pci_resource_len(pci, 1); + aux_start = pci_resource_start(pci, 2); + aux_len = AUXMEMSIZE; + + if (!request_mem_region(mem_start, mem_len, name)) { + printk(KERN_ERR "airo: Couldn't get region %x[%x] for %s\n", + (int)mem_start, (int)mem_len, name); + goto out; + } + if (!request_mem_region(aux_start, aux_len, name)) { + printk(KERN_ERR "airo: Couldn't get region %x[%x] for %s\n", + (int)aux_start, (int)aux_len, name); + goto free_region1; + } + + ai->pcimem = ioremap(mem_start, mem_len); + if (!ai->pcimem) { + printk(KERN_ERR "airo: Couldn't map region %x[%x] for %s\n", + (int)mem_start, (int)mem_len, name); + goto free_region2; + } + ai->pciaux = ioremap(aux_start, aux_len); + if (!ai->pciaux) { + printk(KERN_ERR "airo: Couldn't map region %x[%x] for %s\n", + (int)aux_start, (int)aux_len, name); + goto free_memmap; + } + + /* Reserve PKTSIZE for each fid and 2K for the Rids */ + ai->shared = pci_alloc_consistent(pci, PCI_SHARED_LEN, &ai->shared_dma); + if (!ai->shared) { + printk(KERN_ERR "airo: Couldn't alloc_consistent %d\n", + PCI_SHARED_LEN); + goto free_auxmap; + } + + /* + * Setup descriptor RX, TX, CONFIG + */ + busaddroff = (unsigned char *)ai->shared_dma; + pciaddroff = ai->pciaux + AUX_OFFSET; + vpackoff = ai->shared; + + /* RX descriptor setup */ + for(i = 0; i < MPI_MAX_FIDS; i++) { + ai->rxfids[i].pending = 0; + ai->rxfids[i].card_ram_off = pciaddroff; + ai->rxfids[i].virtual_host_addr = vpackoff; + ai->rxfids[i].rx_desc.host_addr = (dma_addr_t) busaddroff; + ai->rxfids[i].rx_desc.valid = 1; + ai->rxfids[i].rx_desc.len = PKTSIZE; + ai->rxfids[i].rx_desc.rdy = 0; + + pciaddroff += sizeof(RxFid); + busaddroff += PKTSIZE; + vpackoff += PKTSIZE; + } + + /* TX descriptor setup */ + for(i = 0; i < MPI_MAX_FIDS; i++) { + ai->txfids[i].card_ram_off = pciaddroff; + ai->txfids[i].virtual_host_addr = vpackoff; + ai->txfids[i].tx_desc.valid = 1; + ai->txfids[i].tx_desc.host_addr = (dma_addr_t) busaddroff; + memcpy(ai->txfids[i].virtual_host_addr, + &wifictlhdr8023, sizeof(wifictlhdr8023)); + + pciaddroff += sizeof(TxFid); + busaddroff += PKTSIZE; + vpackoff += PKTSIZE; + } + ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */ + + /* Rid descriptor setup */ + ai->config_desc.card_ram_off = pciaddroff; + ai->config_desc.virtual_host_addr = vpackoff; + ai->config_desc.rid_desc.host_addr = (dma_addr_t) busaddroff; + ai->ridbus = (dma_addr_t)busaddroff; + ai->config_desc.rid_desc.rid = 0; + ai->config_desc.rid_desc.len = RIDSIZE; + ai->config_desc.rid_desc.valid = 1; + pciaddroff += sizeof(Rid); + busaddroff += RIDSIZE; + vpackoff += RIDSIZE; + + /* Tell card about descriptors */ + if (mpi_init_descriptors (ai) != SUCCESS) + goto free_shared; + + return 0; + free_shared: + pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); + free_auxmap: + iounmap(ai->pciaux); + free_memmap: + iounmap(ai->pcimem); + free_region2: + release_mem_region(aux_start, aux_len); + free_region1: + release_mem_region(mem_start, mem_len); + out: + return rc; +} + static void wifi_setup(struct net_device *dev, struct net_device *ethdev) { struct airo_info *ai = ethdev->priv; @@ -2120,9 +2615,7 @@ dev->do_ioctl = &airo_ioctl; #ifdef WIRELESS_EXT dev->get_wireless_stats = airo_get_wireless_stats; -#if WIRELESS_EXT > 12 dev->wireless_handlers = (struct iw_handler_def *)&airo_handler_def; -#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT */ dev->change_mtu = &airo_change_mtu; dev->open = &airo_open; @@ -2161,7 +2654,24 @@ return dev; } -struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia ) +int reset_mpi_card( struct net_device *dev ) { + struct airo_info *ai = dev->priv; + + if (down_interruptible(&ai->sem)) + return -1; + waitbusy (ai); + OUT4500(ai,COMMAND,CMD_SOFTRESET); + set_current_state (TASK_UNINTERRUPTIBLE); + schedule_timeout (HZ/5); + waitbusy (ai); + set_current_state (TASK_UNINTERRUPTIBLE); + schedule_timeout (HZ/5); + up(&ai->sem); + return 0; +} + +struct net_device *_init_airo_card( unsigned short irq, int port, + int is_pcmcia, struct pci_dev *pci ) { struct net_device *dev; struct airo_info *ai; @@ -2180,12 +2690,16 @@ ai = dev->priv; ai->wifidev = 0; - ai->registered = 0; + ai->flags = 0; + if (pci && (pci->device == 0x5000 || pci->device == 0xa504)) { + printk(KERN_DEBUG "airo: Found an MPI350 card\n"); + set_bit(FLAG_MPI, &ai->flags); + } ai->dev = dev; ai->aux_lock = SPIN_LOCK_UNLOCKED; sema_init(&ai->sem, 1); - ai->need_commit = 0; ai->config.len = 0; + ai->pci = pci; init_waitqueue_head (&ai->thr_wait); init_completion (&ai->thr_exited); ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); @@ -2199,16 +2713,18 @@ goto err_out_thr; /* The Airo-specific entries in the device structure. */ - dev->hard_start_xmit = &airo_start_xmit; + if (test_bit(FLAG_MPI,&ai->flags)) { + skb_queue_head_init (&ai->txq); + dev->hard_start_xmit = &mpi_start_xmit; + } else + dev->hard_start_xmit = &airo_start_xmit; dev->get_stats = &airo_get_stats; dev->set_multicast_list = &airo_set_multicast_list; dev->set_mac_address = &airo_set_mac_address; dev->do_ioctl = &airo_ioctl; #ifdef WIRELESS_EXT dev->get_wireless_stats = airo_get_wireless_stats; -#if WIRELESS_EXT > 12 dev->wireless_handlers = (struct iw_handler_def *)&airo_handler_def; -#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT */ dev->change_mtu = &airo_change_mtu; dev->open = &airo_open; @@ -2216,6 +2732,9 @@ dev->irq = irq; dev->base_addr = port; + if (test_bit(FLAG_MPI,&ai->flags)) + reset_mpi_card (dev); + rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev ); if (rc) { printk(KERN_ERR "airo: register interrupt %d failed, rc %d\n", irq, rc ); @@ -2224,34 +2743,45 @@ if (!is_pcmcia) { if (!request_region( dev->base_addr, 64, dev->name )) { rc = -EBUSY; + printk(KERN_ERR "airo: Couldn't request region\n"); goto err_out_irq; } } + if (test_bit(FLAG_MPI,&ai->flags)) { + if (mpi_map_card(ai, pci, dev->name)) { + printk(KERN_ERR "airo: Could not map memory\n"); + goto err_out_res; + } + } + if (probe) { if ( setup_card( ai, dev->dev_addr ) != SUCCESS ) { printk( KERN_ERR "airo: MAC could not be enabled\n" ); rc = -EIO; - goto err_out_res; + goto err_out_map; } - } else { + } else if (!test_bit(FLAG_MPI,&ai->flags)) { ai->bap_read = fast_bap_read; set_bit(FLAG_FLASHING, &ai->flags); } rc = register_netdev(dev); - if (rc) - goto err_out_res; - ai->wifidev = init_wifidev(ai, dev); + if (rc) { + printk(KERN_ERR "airo: Couldn't register_netdev\n"); + goto err_out_map; + } + if (!test_bit(FLAG_MPI,&ai->flags)) + ai->wifidev = init_wifidev(ai, dev); - ai->registered = 1; + set_bit(FLAG_REGISTERED,&ai->flags); printk( KERN_INFO "airo: MAC enabled %s %x:%x:%x:%x:%x:%x\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] ); /* Allocate the transmit buffers */ - if (probe) + if (probe && !test_bit(FLAG_MPI,&ai->flags)) for( i = 0; i < MAX_FIDS; i++ ) ai->fids[i] = transmit_allocate(ai,2312,i>=MAX_FIDS/2); @@ -2260,6 +2790,13 @@ SET_MODULE_OWNER(dev); return dev; +err_out_map: + if (test_bit(FLAG_MPI,&ai->flags) && pci) { + pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); + iounmap(ai->pciaux); + iounmap(ai->pcimem); + mpi_unmap_card(ai->pci); + } err_out_res: if (!is_pcmcia) release_region( dev->base_addr, 64 ); @@ -2276,59 +2813,50 @@ return NULL; } +struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia ) +{ + return _init_airo_card ( irq, port, is_pcmcia, 0); +} + EXPORT_SYMBOL(init_airo_card); static int waitbusy (struct airo_info *ai) { int delay = 0; while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) & (delay < 10000)) { udelay (10); - if (++delay % 20) + if ((++delay % 20) == 0) OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); } return delay < 10000; } -int reset_airo_card( struct net_device *dev ) { +int reset_airo_card( struct net_device *dev ) +{ int i; struct airo_info *ai = dev->priv; - - if (down_interruptible(&ai->sem)) + if (reset_mpi_card (dev)) return -1; - waitbusy (ai); - OUT4500(ai,COMMAND,CMD_SOFTRESET); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ/5); - waitbusy (ai); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ/5); + if ( setup_card(ai, dev->dev_addr ) != SUCCESS ) { printk( KERN_ERR "airo: MAC could not be enabled\n" ); - up(&ai->sem); return -1; - } else { - printk( KERN_INFO "airo: MAC enabled %s %x:%x:%x:%x:%x:%x\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] - ); - /* Allocate the transmit buffers */ - for( i = 0; i < MAX_FIDS; i++ ) - ai->fids[i] = transmit_allocate(ai,2312,i>=MAX_FIDS/2); } + printk( KERN_INFO "airo: MAC enabled %s %x:%x:%x:%x:%x:%x\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]); + /* Allocate the transmit buffers if needed */ + if (!test_bit(FLAG_MPI,&ai->flags)) + for( i = 0; i < MAX_FIDS; i++ ) + ai->fids[i] = transmit_allocate (ai,2312,i>=MAX_FIDS/2); + enable_interrupts( ai ); netif_wake_queue(dev); - up(&ai->sem); return 0; } EXPORT_SYMBOL(reset_airo_card); -#if WIRELESS_EXT > 13 static void airo_send_event(struct net_device *dev) { struct airo_info *ai = dev->priv; union iwreq_data wrqu; @@ -2345,7 +2873,6 @@ /* Send event to user space */ wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); } -#endif static int airo_thread(void *data) { struct net_device *dev = data; @@ -2405,7 +2932,7 @@ break; } - if (test_bit(FLAG_FLASHING, &ai->flags)) { + if (ai->power || test_bit(FLAG_FLASHING, &ai->flags)) { up(&ai->sem); continue; } @@ -2424,10 +2951,8 @@ else if (test_bit(JOB_MIC, &ai->flags)) micinit(ai); #endif -#if WIRELESS_EXT > 13 else if (test_bit(JOB_EVENT, &ai->flags)) airo_send_event(dev); -#endif else if (test_bit(JOB_AUTOWEP, &ai->flags)) timer_func(dev); } @@ -2471,9 +2996,7 @@ #endif } if ( status & EV_LINK ) { -#if WIRELESS_EXT > 13 union iwreq_data wrqu; -#endif /* WIRELESS_EXT > 13 */ /* The link status has changed, if you want to put a monitor hook in, do it here. (Remember that interrupts are still disabled!) @@ -2523,7 +3046,6 @@ set_bit(FLAG_UPDATE_UNI, &apriv->flags); set_bit(FLAG_UPDATE_MULTI, &apriv->flags); } -#if WIRELESS_EXT > 13 /* Question : is ASSOCIATED the only status * that is valid ? We want to catch handover * and reassociations as valid status @@ -2554,7 +3076,6 @@ /* Send event to user space */ wireless_send_event(dev, SIOCGIWAP, &wrqu,NULL); } -#endif /* WIRELESS_EXT > 13 */ } /* Check to see if there is something to receive */ @@ -2574,6 +3095,12 @@ u16 tmpbuf[4]; u16 *buffer; + if (test_bit(FLAG_MPI,&apriv->flags)) { + mpi_receive_802_3(apriv); + OUT4500(apriv, EVACK, EV_RX); + goto exitrx; + } + fid = IN4500( apriv, RXFID ); /* Get the packet length */ @@ -2672,7 +3199,6 @@ goto exitrx; } } -#if WIRELESS_EXT > 15 #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ if (apriv->spy_data.spy_number > 0) { char *sa; @@ -2694,33 +3220,6 @@ wireless_spy_update(dev, sa, &wstats); } #endif /* IW_WIRELESS_SPY */ -#else /* WIRELESS_EXT > 15 */ -#ifdef WIRELESS_SPY - if (apriv->spy_number > 0) { - int i; - char *sa; - - sa = (char*)buffer + (test_bit(FLAG_802_11, &apriv->flags) ? 10 : 6); - - for (i=0; ispy_number; i++) - if (!memcmp(sa,apriv->spy_address[i],ETH_ALEN)) - { - if (!test_bit(FLAG_802_11, &apriv->flags)) { - bap_setup (apriv, fid, 8, BAP0); - bap_read (apriv, (u16*)hdr.rssi, 2, BAP0); - } - apriv->spy_stat[i].qual = hdr.rssi[0]; - if (apriv->rssi) - apriv->spy_stat[i].level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm; - else - apriv->spy_stat[i].level = (hdr.rssi[1] + 321) / 2; - apriv->spy_stat[i].noise = 0; - apriv->spy_stat[i].updated = 3; - break; - } - } -#endif /* WIRELESS_SPY */ -#endif /* WIRELESS_EXT > 15 */ OUT4500( apriv, EVACK, EV_RX); if (test_bit(FLAG_802_11, &apriv->flags)) { @@ -2740,11 +3239,30 @@ exitrx: /* Check to see if a packet has been transmitted */ - if ( status & ( EV_TX|EV_TXEXC ) ) { + if ( status & ( EV_TX|EV_TXCPY|EV_TXEXC ) ) { int i; int len = 0; int index = -1; + if (test_bit(FLAG_MPI,&apriv->flags)) { + unsigned long flags; + + if (status & EV_TXEXC) + get_tx_error(apriv, -1); + spin_lock_irqsave(&apriv->aux_lock, flags); + if (skb_queue_len (&apriv->txq)) { + spin_unlock_irqrestore(&apriv->aux_lock,flags); + mpi_send_packet (dev); + } else { + clear_bit(FLAG_PENDING_XMIT, &apriv->flags); + spin_unlock_irqrestore(&apriv->aux_lock,flags); + netif_wake_queue (dev); + } + OUT4500( apriv, EVACK, + status & (EV_TX|EV_TXCPY|EV_TXEXC)); + goto exittx; + } + fid = IN4500(apriv, TXCOMPLFID); for( i = 0; i < MAX_FIDS; i++ ) { @@ -2767,10 +3285,11 @@ netif_wake_queue(apriv->wifidev); } } else { - OUT4500( apriv, EVACK, status & (EV_TX | EV_TXEXC)); + OUT4500( apriv, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC)); printk( KERN_ERR "airo: Unallocated FID was used to xmit\n" ); } } +exittx: if ( status & ~STATUS_INTS & ~IGNORE_INTS ) printk( KERN_WARNING "airo: Got weird status %x\n", status & ~STATUS_INTS & ~IGNORE_INTS ); @@ -2793,6 +3312,8 @@ * Why would some one do 8 bit IO in an SMP machine?!? */ static void OUT4500( struct airo_info *ai, u16 reg, u16 val ) { + if (test_bit(FLAG_MPI,&ai->flags)) + reg <<= 1; if ( !do8bitIO ) outw( val, ai->dev->base_addr + reg ); else { @@ -2804,6 +3325,8 @@ static u16 IN4500( struct airo_info *ai, u16 reg ) { unsigned short rc; + if (test_bit(FLAG_MPI,&ai->flags)) + reg <<= 1; if ( !do8bitIO ) rc = inw( ai->dev->base_addr + reg ); else { @@ -2824,15 +3347,25 @@ * open/close functions, and testing both flags together is * "cheaper" - Jean II */ if (ai->flags & FLAG_RADIO_MASK) return SUCCESS; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd = MAC_ENABLE; - if (!lock) - return issuecommand(ai, &cmd, rsp); - if (down_interruptible(&ai->sem)) + if (lock && down_interruptible(&ai->sem)) return -ERESTARTSYS; - rc = issuecommand(ai, &cmd, rsp); - up(&ai->sem); + + if (!test_bit(FLAG_ENABLED, &ai->flags)) { + memset(&cmd, 0, sizeof(cmd)); + cmd.cmd = MAC_ENABLE; + rc = issuecommand(ai, &cmd, rsp); + if (rc == SUCCESS) + set_bit(FLAG_ENABLED, &ai->flags); + } else + rc = SUCCESS; + + if (lock) + up(&ai->sem); + + if (rc) + printk(KERN_ERR "%s: Cannot enable MAC, err=%d\n", + __FUNCTION__,rc); return rc; } @@ -2840,17 +3373,17 @@ Cmd cmd; Resp rsp; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd = MAC_DISABLE; // disable in case already enabled - if (!lock) { - issuecommand(ai, &cmd, &rsp); + if (lock && down_interruptible(&ai->sem)) return; - } - if (down_interruptible(&ai->sem)) - return; - issuecommand(ai, &cmd, &rsp); - up(&ai->sem); + if (test_bit(FLAG_ENABLED, &ai->flags)) { + memset(&cmd, 0, sizeof(cmd)); + cmd.cmd = MAC_DISABLE; // disable in case already enabled + issuecommand(ai, &cmd, &rsp); + clear_bit(FLAG_ENABLED, &ai->flags); + } + if (lock) + up(&ai->sem); } static void enable_interrupts( struct airo_info *ai ) { @@ -2867,6 +3400,84 @@ OUT4500( ai, EVINTEN, 0 ); } +static void mpi_receive_802_3(struct airo_info *ai) +{ + RxFid rxd; + int len = 0; + struct sk_buff *skb; + char *buffer; +#ifdef MICSUPPORT + int off = 0; + MICBuffer micbuf; +#endif + + memcpy ((char *)&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); + /* Make sure we got something */ + if (rxd.rdy && rxd.valid == 0) { + len = rxd.len + 12; + if (len < 12 && len > 2048) + goto badrx; + + skb = dev_alloc_skb(len); + if (!skb) { + ai->stats.rx_dropped++; + goto badrx; + } + buffer = skb_put(skb,len); +#ifdef MICSUPPORT + memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); + if (ai->micstats.enabled) { + memcpy(&micbuf, + ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2, + sizeof(micbuf)); + if (ntohs(micbuf.typelen) <= 0x05DC) { + if (len <= sizeof(micbuf) + ETH_ALEN * 2) + goto badmic; + + off = sizeof(micbuf); + skb_trim (skb, len - off); + } + } + memcpy(buffer + ETH_ALEN * 2, + ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2 + off, + len - ETH_ALEN * 2 - off); + if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off)) { +badmic: + dev_kfree_skb_irq (skb); + goto badrx; + } +#else + memcpy(buffer, ai->rxfids[0].virtual_host_addr, len); +#endif +#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ + if (ai->spy_data.spy_number > 0) { + char *sa; + struct iw_quality wstats; + /* Prepare spy data : addr + qual */ + sa = buffer + ETH_ALEN; + wstats.qual = 0; /* XXX Where do I get that info from ??? */ + wstats.level = 0; + wstats.updated = 0; + /* Update spy records */ + wireless_spy_update(ai->dev, sa, &wstats); + } +#endif /* IW_WIRELESS_SPY */ + + skb->dev = ai->dev; + skb->ip_summed = CHECKSUM_NONE; + skb->protocol = eth_type_trans(skb, ai->dev); + skb->dev->last_rx = jiffies; + netif_rx(skb); + } +badrx: + if (rxd.valid == 0) { + rxd.valid = 1; + rxd.rdy = 0; + rxd.len = PKTSIZE; + memcpy (ai->rxfids[0].card_ram_off, (char *)&rxd, sizeof(rxd)); + } +} + static u16 setup_card(struct airo_info *ai, u8 *mac) { Cmd cmd; @@ -2893,32 +3504,37 @@ up(&ai->sem); return ERROR; } - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd = MAC_DISABLE; // disable in case already enabled - if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) { - up(&ai->sem); - return ERROR; - } + disable_MAC( ai, 0); // Let's figure out if we need to use the AUX port - cmd.cmd = CMD_ENABLEAUX; - if (issuecommand(ai, &cmd, &rsp) != SUCCESS) { - up(&ai->sem); - printk(KERN_ERR "airo: Error checking for AUX port\n"); - return ERROR; - } - if (!aux_bap || rsp.status & 0xff00) { - ai->bap_read = fast_bap_read; - printk(KERN_DEBUG "airo: Doing fast bap_reads\n"); - } else { - ai->bap_read = aux_bap_read; - printk(KERN_DEBUG "airo: Doing AUX bap_reads\n"); + if (!test_bit(FLAG_MPI,&ai->flags)) { + cmd.cmd = CMD_ENABLEAUX; + if (issuecommand(ai, &cmd, &rsp) != SUCCESS) { + up(&ai->sem); + printk(KERN_ERR "airo: Error checking for AUX port\n"); + return ERROR; + } + if (!aux_bap || rsp.status & 0xff00) { + ai->bap_read = fast_bap_read; + printk(KERN_DEBUG "airo: Doing fast bap_reads\n"); + } else { + ai->bap_read = aux_bap_read; + printk(KERN_DEBUG "airo: Doing AUX bap_reads\n"); + } } up(&ai->sem); if (ai->config.len == 0) { tdsRssiRid rssi_rid; CapabilityRid cap_rid; + if (ai->APList) { + kfree(ai->APList); + ai->APList = NULL; + } + if (ai->SSID) { + kfree(ai->SSID); + ai->SSID = NULL; + } // general configuration (read/modify/write) status = readConfigRid(ai, 1); if ( status != SUCCESS ) return ERROR; @@ -2926,6 +3542,12 @@ status = readCapabilityRid(ai, &cap_rid); if ( status != SUCCESS ) return ERROR; + if (test_bit(FLAG_MPI, &ai->flags) && + strcmp (cap_rid.prodVer, "5.00.01") && + strcmp (cap_rid.prodVer, "5.00.03") && + strcmp (cap_rid.prodVer, "5b00.08")) + printk(KERN_ERR "airo: Firmware version %s is not supported. Use it at your own risk!\n", cap_rid.prodVer); + status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),1); if ( status == SUCCESS ) { if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL) @@ -2977,7 +3599,7 @@ } } } - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } /* Setup the SSIDs if present */ @@ -2997,8 +3619,10 @@ if ( status != SUCCESS ) return ERROR; /* Set up the SSID list */ - status = writeSsidRid(ai, &mySsid); - if ( status != SUCCESS ) return ERROR; + if ( ssids[0] ) { + status = writeSsidRid(ai, &mySsid); + if ( status != SUCCESS ) return ERROR; + } status = enable_MAC(ai, &rsp, 1); if ( status != SUCCESS || (rsp.status & 0xFF00) != 0) { @@ -3029,6 +3653,9 @@ int max_tries = 600000; u16 cmd; + if (IN4500(ai, EVSTAT) & EV_CMD) + OUT4500(ai, EVACK, EV_CMD); + OUT4500(ai, PARAM0, pCmd->parm0); OUT4500(ai, PARAM1, pCmd->parm1); OUT4500(ai, PARAM2, pCmd->parm2); @@ -3058,6 +3685,13 @@ pRsp->rsp0 = IN4500(ai, RESP0); pRsp->rsp1 = IN4500(ai, RESP1); pRsp->rsp2 = IN4500(ai, RESP2); + if ((pRsp->status & 0xff00)!=0 && pCmd->cmd != CMD_SOFTRESET) { + printk (KERN_ERR "airo: cmd= %x\n", pCmd->cmd); + printk (KERN_ERR "airo: status= %x\n", pRsp->status); + printk (KERN_ERR "airo: Rsp0= %x\n", pRsp->rsp0); + printk (KERN_ERR "airo: Rsp1= %x\n", pRsp->rsp1); + printk (KERN_ERR "airo: Rsp2= %x\n", pRsp->rsp2); + } // clear stuck command busy if necessary if (IN4500(ai, COMMAND) & COMMAND_BUSY) { @@ -3213,29 +3847,54 @@ if (down_interruptible(&ai->sem)) return ERROR; } - if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != SUCCESS) { - rc = status; - goto done; - } - if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { - rc = ERROR; - goto done; - } - // read the rid length field - bap_read(ai, pBuf, 2, BAP1); - // length for remaining part of rid - len = min(len, (int)le16_to_cpu(*(u16*)pBuf)) - 2; + if (test_bit(FLAG_MPI,&ai->flags)) { + Cmd cmd; + Resp rsp; - if ( len <= 2 ) { - printk( KERN_ERR + memset(&cmd, 0, sizeof(cmd)); + memset(&rsp, 0, sizeof(rsp)); + ai->config_desc.rid_desc.valid = 1; + ai->config_desc.rid_desc.len = RIDSIZE; + ai->config_desc.rid_desc.rid = 0; + ai->config_desc.rid_desc.host_addr = ai->ridbus; + + cmd.cmd = CMD_ACCESS; + cmd.parm0 = rid; + + memcpy((char *)ai->config_desc.card_ram_off, + (char *)&ai->config_desc.rid_desc, sizeof(Rid)); + + rc = issuecommand(ai, &cmd, &rsp); + + if (rsp.status & 0x7f00) + rc = rsp.rsp0; + if (!rc) + memcpy(pBuf, ai->config_desc.virtual_host_addr, len); + goto done; + } else { + if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS))!=SUCCESS) { + rc = status; + goto done; + } + if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { + rc = ERROR; + goto done; + } + // read the rid length field + bap_read(ai, pBuf, 2, BAP1); + // length for remaining part of rid + len = min(len, (int)le16_to_cpu(*(u16*)pBuf)) - 2; + + if ( len <= 2 ) { + printk( KERN_ERR "airo: Rid %x has a length of %d which is too short\n", - (int)rid, - (int)len ); - rc = ERROR; - goto done; + (int)rid, (int)len ); + rc = ERROR; + goto done; + } + // read remainder of the rid + rc = bap_read(ai, ((u16*)pBuf)+1, len, BAP1); } - // read remainder of the rid - rc = bap_read(ai, ((u16*)pBuf)+1, len, BAP1); done: if (lock) up(&ai->sem); @@ -3256,20 +3915,60 @@ if (down_interruptible(&ai->sem)) return ERROR; } - // --- first access so that we can write the rid data - if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) { - rc = status; - goto done; - } - // --- now write the rid data - if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { - rc = ERROR; - goto done; - } - bap_write(ai, pBuf, len, BAP1); - // ---now commit the rid data - rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS); - done: + if (test_bit(FLAG_MPI,&ai->flags)) { + Cmd cmd; + Resp rsp; + + if (test_bit(FLAG_ENABLED, &ai->flags)) + printk(KERN_ERR "%s: MAC should be disabled (rid=%d)\n", + __FUNCTION__, rid); + memset(&cmd, 0, sizeof(cmd)); + memset(&rsp, 0, sizeof(rsp)); + + ai->config_desc.rid_desc.valid = 1; + ai->config_desc.rid_desc.len = RIDSIZE; + ai->config_desc.rid_desc.rid = 0; + + cmd.cmd = CMD_WRITERID; + cmd.parm0 = rid; + + memcpy((char *)ai->config_desc.card_ram_off, + (char *)&ai->config_desc.rid_desc, sizeof(Rid)); + + if (len < 4 || len > 2047) { + printk(KERN_ERR "%s: len=%d\n",__FUNCTION__,len); + rc = -1; + } else { + memcpy((char *)ai->config_desc.virtual_host_addr, + pBuf, len); + + rc = issuecommand(ai, &cmd, &rsp); + if ((rc & 0xff00) != 0) { + printk(KERN_ERR "%s: Write rid Error %d\n", + __FUNCTION__,rc); + printk(KERN_ERR "%s: Cmd=%04x\n", + __FUNCTION__,cmd.cmd); + } + + if ((rsp.status & 0x7f00)) + rc = rsp.rsp0; + } + } else { + // --- first access so that we can write the rid data + if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) { + rc = status; + goto done; + } + // --- now write the rid data + if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { + rc = ERROR; + goto done; + } + bap_write(ai, pBuf, len, BAP1); + // ---now commit the rid data + rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS); + } +done: if (lock) up(&ai->sem); return rc; @@ -3791,7 +4490,7 @@ struct airo_info *apriv = dev->priv; StatsRid stats; int i, j; - int *vals = stats.vals; + u32 *vals = stats.vals; if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; @@ -3813,7 +4512,7 @@ "airo: Potentially disasterous buffer overflow averted!\n"); break; } - j+=sprintf(data->rbuffer+j, "%s: %d\n", statsLabels[i], vals[i]); + j+=sprintf(data->rbuffer+j, "%s: %u\n", statsLabels[i], vals[i]); } if (i*4>=stats.len){ printk(KERN_WARNING @@ -3851,7 +4550,7 @@ if ( !data->writelen ) return; readConfigRid(ai, 1); - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); line = data->wbuffer; while( line[0] ) { @@ -3859,7 +4558,7 @@ if ( !strncmp( line, "Mode: ", 6 ) ) { line += 6; if ((ai->config.rmode & 0xff) >= RXMODE_RFMON) - ai->need_commit = 2; + set_bit (FLAG_RESET, &ai->flags); ai->config.rmode &= 0xfe00; clear_bit (FLAG_802_11, &ai->flags); ai->config.opmode &= 0xFF00; @@ -3879,7 +4578,7 @@ } else if ( line[0] == 'l' ) ai->config.rmode |= RXMODE_LANMON; } - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } /*** Radio status */ @@ -3901,7 +4600,7 @@ for( j = 0; j < 16 && line[j] != '\n'; j++ ) { ai->config.nodeName[j] = line[j]; } - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } /*** PowerMode processing */ @@ -3909,13 +4608,13 @@ line += 11; if ( !strncmp( line, "PSPCAM", 6 ) ) { ai->config.powerSaveMode = POWERSAVE_PSPCAM; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "PSP", 3 ) ) { ai->config.powerSaveMode = POWERSAVE_PSP; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else { ai->config.powerSaveMode = POWERSAVE_CAM; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } } else if ( !strncmp( line, "DataRates: ", 11 ) ) { int v, i = 0, k = 0; /* i is index into line, @@ -3927,14 +4626,14 @@ line += i + 1; i = 0; } - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "Channel: ", 9 ) ) { int v, i = 0; line += 9; v = get_dec_u16(line, &i, i+3); if ( v != -1 ) { ai->config.channelSet = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } } else if ( !strncmp( line, "XmitPower: ", 11 ) ) { int v, i = 0; @@ -3942,7 +4641,7 @@ v = get_dec_u16(line, &i, i+3); if ( v != -1 ) { ai->config.txPower = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } } else if ( !strncmp( line, "WEP: ", 5 ) ) { line += 5; @@ -3957,7 +4656,7 @@ ai->config.authType = (u16)AUTH_OPEN; break; } - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "LongRetryLimit: ", 16 ) ) { int v, i = 0; @@ -3965,7 +4664,7 @@ v = get_dec_u16(line, &i, 3); v = (v<0) ? 0 : ((v>255) ? 255 : v); ai->config.longRetryLimit = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "ShortRetryLimit: ", 17 ) ) { int v, i = 0; @@ -3973,7 +4672,7 @@ v = get_dec_u16(line, &i, 3); v = (v<0) ? 0 : ((v>255) ? 255 : v); ai->config.shortRetryLimit = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "RTSThreshold: ", 14 ) ) { int v, i = 0; @@ -3981,7 +4680,7 @@ v = get_dec_u16(line, &i, 4); v = (v<0) ? 0 : ((v>2312) ? 2312 : v); ai->config.rtsThres = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "TXMSDULifetime: ", 16 ) ) { int v, i = 0; @@ -3989,7 +4688,7 @@ v = get_dec_u16(line, &i, 5); v = (v<0) ? 0 : v; ai->config.txLifetime = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "RXMSDULifetime: ", 16 ) ) { int v, i = 0; @@ -3997,17 +4696,17 @@ v = get_dec_u16(line, &i, 5); v = (v<0) ? 0 : v; ai->config.rxLifetime = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "TXDiversity: ", 13 ) ) { ai->config.txDiversity = (line[13]=='l') ? 1 : ((line[13]=='r')? 2: 3); - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "RXDiversity: ", 13 ) ) { ai->config.rxDiversity = (line[13]=='l') ? 1 : ((line[13]=='r')? 2: 3); - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if ( !strncmp( line, "FragThreshold: ", 15 ) ) { int v, i = 0; @@ -4016,22 +4715,22 @@ v = (v<256) ? 256 : ((v>2312) ? 2312 : v); v = v & 0xfffe; /* Make sure its even */ ai->config.fragThresh = (u16)v; - ai->need_commit = 1; + set_bit (FLAG_COMMIT, &ai->flags); } else if (!strncmp(line, "Modulation: ", 12)) { line += 12; switch(*line) { - case 'd': ai->config.modulation=MOD_DEFAULT; ai->need_commit=1; break; - case 'c': ai->config.modulation=MOD_CCK; ai->need_commit=1; break; - case 'm': ai->config.modulation=MOD_MOK; ai->need_commit=1; break; + case 'd': ai->config.modulation=MOD_DEFAULT; set_bit(FLAG_COMMIT, &ai->flags); break; + case 'c': ai->config.modulation=MOD_CCK; set_bit(FLAG_COMMIT, &ai->flags); break; + case 'm': ai->config.modulation=MOD_MOK; set_bit(FLAG_COMMIT, &ai->flags); break; default: printk( KERN_WARNING "airo: Unknown modulation\n" ); } } else if (!strncmp(line, "Preamble: ", 10)) { line += 10; switch(*line) { - case 'a': ai->config.preamble=PREAMBLE_AUTO; ai->need_commit=1; break; - case 'l': ai->config.preamble=PREAMBLE_LONG; ai->need_commit=1; break; - case 's': ai->config.preamble=PREAMBLE_SHORT; ai->need_commit=1; break; + case 'a': ai->config.preamble=PREAMBLE_AUTO; set_bit(FLAG_COMMIT, &ai->flags); break; + case 'l': ai->config.preamble=PREAMBLE_LONG; set_bit(FLAG_COMMIT, &ai->flags); break; + case 's': ai->config.preamble=PREAMBLE_SHORT; set_bit(FLAG_COMMIT, &ai->flags); break; default: printk(KERN_WARNING "airo: Unknown preamble\n"); } } else { @@ -4255,6 +4954,7 @@ const char *key, u16 keylen, int perm, int lock ) { static const unsigned char macaddr[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 }; WepKeyRid wkr; + Resp rsp; memset(&wkr, 0, sizeof(wkr)); if (keylen == 0) { @@ -4274,7 +4974,9 @@ printk(KERN_INFO "Setting key %d\n", index); } + disable_MAC(ai, lock); writeWepKeyRid(ai, &wkr, perm, lock); + enable_MAC(ai, &rsp, lock); return 0; } @@ -4490,6 +5192,7 @@ Cmd cmd; Resp rsp; + if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_LISTBSS; if (down_interruptible(&ai->sem)) @@ -4577,7 +5280,7 @@ default: /* We'll escalate to SHAREDKEY */ apriv->config.authType = AUTH_SHAREDKEY; } - apriv->need_commit = 1; + set_bit (FLAG_COMMIT, &apriv->flags); writeConfigRid(apriv, 0); enable_MAC(apriv, &rsp, 0); up(&apriv->sem); @@ -4617,7 +5320,10 @@ return -ENODEV; pci_set_master(pdev); - dev = init_airo_card(pdev->irq, pdev->resource[2].start, 0); + if (pdev->device == 0x5000 || pdev->device == 0xa504) + dev = _init_airo_card(pdev->irq, pdev->resource[0].start, 0, pdev); + else + dev = _init_airo_card(pdev->irq, pdev->resource[2].start, 0, pdev); if (!dev) return -ENODEV; @@ -4627,7 +5333,89 @@ static void __devexit airo_pci_remove(struct pci_dev *pdev) { - stop_airo_card(pci_get_drvdata(pdev), 1); +} + +static int airo_pci_suspend(struct pci_dev *pdev, u32 state) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct airo_info *ai = dev->priv; + Cmd cmd; + Resp rsp; + + printk(KERN_DEBUG "%s: airo_mpi entering sleep mode (state=%d)\n", + dev->name, state); + + if ((ai->APList == NULL) && + (ai->APList = kmalloc(sizeof(APListRid), GFP_KERNEL)) == NULL) + return -ENOMEM; + if ((ai->SSID == NULL) && + (ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL)) == NULL) + return -ENOMEM; + readAPListRid(ai, ai->APList); + readSsidRid(ai, ai->SSID); + memset(&cmd, 0, sizeof(cmd)); + if (down_interruptible(&ai->sem)) + return -EAGAIN; + disable_MAC(ai, 0); + netif_device_detach(dev); + ai->power = state; + cmd.cmd=HOSTSLEEP; + issuecommand(ai, &cmd, &rsp); + up(&ai->sem); + return 0; +} + +static int airo_pci_resume(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct airo_info *ai = dev->priv; + Resp rsp; + int err; + + printk(KERN_DEBUG "%s: airo_mpi waking up\n", dev->name); + + if (!ai->power) + return 0; + + if (ai->power > 2) { + err = reset_mpi_card(dev); + if (err) { + printk(KERN_ERR "%s: Error %d resetting on %s()\n", + dev->name, err, __FUNCTION__); + return err; + } + schedule_timeout (HZ/2); + mpi_init_descriptors(ai); + setup_card(ai, dev->dev_addr); + clear_bit(FLAG_RADIO_OFF, &ai->flags); + clear_bit(FLAG_RADIO_DOWN, &ai->flags); + clear_bit(FLAG_PENDING_XMIT, &ai->flags); + } else { + OUT4500(ai, EVACK, EV_AWAKEN); + OUT4500(ai, EVACK, EV_AWAKEN); + schedule_timeout(HZ/10); + } + + set_bit (FLAG_COMMIT, &ai->flags); + disable_MAC(ai, 1); + schedule_timeout (HZ/5); + if (ai->SSID) { + writeSsidRid(ai, ai->SSID); + kfree(ai->SSID); + ai->SSID = NULL; + } + if (ai->APList) { + writeAPListRid(ai, ai->APList); + kfree(ai->APList); + ai->APList = NULL; + } + writeConfigRid(ai, 1); + enable_MAC(ai, &rsp, 1); + ai->power = 0; + netif_device_attach(dev); + netif_wake_queue(dev); + enable_interrupts(ai); + return 0; } #endif @@ -4667,11 +5455,10 @@ printk( KERN_INFO "airo: Unregistering %s\n", airo_devices->dev->name ); stop_airo_card( airo_devices->dev, 1 ); } - remove_proc_entry("aironet", proc_root_driver); - #ifdef CONFIG_PCI pci_unregister_driver(&airo_driver); #endif + remove_proc_entry("aironet", proc_root_driver); } #ifdef WIRELESS_EXT @@ -4736,7 +5523,7 @@ readConfigRid(local, 1); /* Yes ! We can set it !!! */ local->config.channelSet = (u16)(channel - 1); - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); } } return rc; @@ -4811,8 +5598,8 @@ sizeof(SSID_rid.ssids[index].ssid)); memcpy(SSID_rid.ssids[index].ssid, extra, dwrq->length); SSID_rid.ssids[index].len = dwrq->length - 1; - SSID_rid.len = sizeof(SSID_rid); } + SSID_rid.len = sizeof(SSID_rid); /* Write it to the card */ disable_MAC(local, 1); writeSsidRid(local, &SSID_rid); @@ -4924,7 +5711,7 @@ readConfigRid(local, 1); memset(local->config.nodeName, 0, sizeof(local->config.nodeName)); memcpy(local->config.nodeName, extra, dwrq->length); - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5013,7 +5800,7 @@ memset(local->config.rates, 0, 8); local->config.rates[0] = brate; } - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5059,7 +5846,7 @@ } readConfigRid(local, 1); local->config.rtsThres = rthr; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5103,7 +5890,7 @@ fthr &= ~0x1; /* Get an even value - is it really needed ??? */ readConfigRid(local, 1); local->config.fragThresh = (u16)fthr; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5137,11 +5924,11 @@ char *extra) { struct airo_info *local = dev->priv; - int commit = 1; + int reset = 0; readConfigRid(local, 1); if ((local->config.rmode & 0xff) >= RXMODE_RFMON) - commit = 2; + reset = 1; switch(*uwrq) { case IW_MODE_ADHOC: @@ -5183,7 +5970,9 @@ default: return -EINVAL; } - local->need_commit = commit; + if (reset) + set_bit (FLAG_RESET, &local->flags); + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5253,7 +6042,7 @@ return -EINVAL; } /* Check the index (none -> use current) */ - if ((index < 0) || (index>=(cap_rid.softCap&0x80)?4:1)) + if ((index < 0) || (index >= ((cap_rid.softCap & 0x80) ? 4:1))) index = current_index; /* Set the length */ if (dwrq->length > MIN_KEY_SIZE) @@ -5279,12 +6068,12 @@ if((index == current_index) && (key.len > 0) && (local->config.authType == AUTH_OPEN)) { local->config.authType = AUTH_ENCRYPT; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); } } else { /* Do we want to just set the transmit key index ? */ int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; - if ((index>=0) && (index<(cap_rid.softCap&0x80)?4:1)) { + if ((index >= 0) && (index < ((cap_rid.softCap & 0x80)?4:1))) { set_wep_key(local, index, 0, 0, 1, 1); } else /* Don't complain if only change the mode */ @@ -5301,7 +6090,7 @@ local->config.authType = AUTH_ENCRYPT; // Only Wep /* Commit the changes to flags if needed */ if(dwrq->flags & IW_ENCODE_MODE) - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5342,7 +6131,7 @@ memset(extra, 0, 16); /* Which key do we want ? -1 -> tx index */ - if((index < 0) || (index >= (cap_rid.softCap & 0x80) ? 4 : 1)) + if ((index < 0) || (index >= ((cap_rid.softCap & 0x80) ? 4 : 1))) index = get_wep_key(local, 0xffff); dwrq->flags |= index + 1; /* Copy the key to the user buffer */ @@ -5370,8 +6159,7 @@ readCapabilityRid(local, &cap_rid); if (vwrq->disabled) { - set_bit (FLAG_RADIO_OFF, &local->flags); - local->need_commit = 1; + set_bit (FLAG_RADIO_OFF | FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } if (vwrq->flags != IW_TXPOW_MWATT) { @@ -5382,7 +6170,7 @@ if ((vwrq->value==cap_rid.txPowerLevels[i])) { readConfigRid(local, 1); local->config.txPower = vwrq->value; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); rc = -EINPROGRESS; /* Call commit handler */ break; } @@ -5435,12 +6223,12 @@ local->config.longRetryLimit = vwrq->value; local->config.shortRetryLimit = vwrq->value; } - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); rc = -EINPROGRESS; /* Call commit handler */ } if(vwrq->flags & IW_RETRY_LIFETIME) { local->config.txLifetime = vwrq->value / 1024; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); rc = -EINPROGRESS; /* Call commit handler */ } return rc; @@ -5606,17 +6394,17 @@ local->config.powerSaveMode = POWERSAVE_CAM; local->config.rmode &= 0xFF00; local->config.rmode |= RXMODE_BC_MC_ADDR; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { local->config.fastListenDelay = (vwrq->value + 500) / 1024; local->config.powerSaveMode = POWERSAVE_PSPCAM; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); } else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) { local->config.fastListenInterval = local->config.listenInterval = (vwrq->value + 500) / 1024; local->config.powerSaveMode = POWERSAVE_PSPCAM; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); } switch (vwrq->flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: @@ -5625,7 +6413,7 @@ } local->config.rmode &= 0xFF00; local->config.rmode |= RXMODE_ADDR; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); break; case IW_POWER_ALL_R: if ((local->config.rmode & 0xFF) >= RXMODE_RFMON) { @@ -5633,7 +6421,7 @@ } local->config.rmode &= 0xFF00; local->config.rmode |= RXMODE_BC_MC_ADDR; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); case IW_POWER_ON: break; default: @@ -5688,7 +6476,7 @@ readConfigRid(local, 1); local->config.rssiThreshold = vwrq->disabled ? RSSI_DEFAULT : vwrq->value; - local->need_commit = 1; + set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } @@ -5776,7 +6564,6 @@ return 0; } -#if WIRELESS_EXT > 13 /*------------------------------------------------------------------*/ /* * Wireless Handler : Initiate Scan @@ -5796,6 +6583,7 @@ * This is not an error, while the device perform scanning, * traffic doesn't flow, so it's a perfect DoS... * Jean II */ + if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; /* Initiate a scan command */ memset(&cmd, 0, sizeof(cmd)); @@ -5964,72 +6752,6 @@ return 0; } -#endif /* WIRELESS_EXT > 13 */ - -#if WIRELESS_EXT <= 15 -#ifdef WIRELESS_SPY -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : set Spy List - */ -static int airo_set_spy(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *dwrq, - char *extra) -{ - struct airo_info *local = dev->priv; - struct sockaddr *address = (struct sockaddr *) extra; - - /* Disable spy while we copy the addresses. - * As we don't disable interrupts, we need to do this to avoid races */ - local->spy_number = 0; - - if (dwrq->length > 0) { - int i; - - /* Copy addresses */ - for (i = 0; i < dwrq->length; i++) - memcpy(local->spy_address[i], address[i].sa_data, ETH_ALEN); - /* Reset stats */ - memset(local->spy_stat, 0, sizeof(struct iw_quality) * IW_MAX_SPY); - } - /* Enable addresses */ - local->spy_number = dwrq->length; - - return 0; -} - -/*------------------------------------------------------------------*/ -/* - * Wireless Handler : get Spy List - */ -static int airo_get_spy(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *dwrq, - char *extra) -{ - struct airo_info *local = dev->priv; - struct sockaddr *address = (struct sockaddr *) extra; - int i; - - dwrq->length = local->spy_number; - - /* Copy addresses. */ - for(i = 0; i < local->spy_number; i++) { - memcpy(address[i].sa_data, local->spy_address[i], ETH_ALEN); - address[i].sa_family = AF_UNIX; - } - /* Copy stats to the user buffer (just after). */ - if(local->spy_number > 0) - memcpy(extra + (sizeof(struct sockaddr) * local->spy_number), - local->spy_stat, sizeof(struct iw_quality) * local->spy_number); - /* Reset updated flags. */ - for (i=0; ispy_number; i++) - local->spy_stat[i].updated = 0; - return 0; -} -#endif /* WIRELESS_SPY */ -#endif /* WIRELESS_EXT <= 15 */ /*------------------------------------------------------------------*/ /* @@ -6043,13 +6765,13 @@ struct airo_info *local = dev->priv; Resp rsp; - if (!local->need_commit) + if (!test_bit (FLAG_COMMIT, &local->flags)) return 0; /* Some of the "SET" function may have modified some of the * parameters. It's now time to commit them in the card */ disable_MAC(local, 1); - if (local->need_commit > 1) { + if (test_bit (FLAG_RESET, &local->flags)) { APListRid APList_rid; SsidRid SSID_rid; @@ -6064,7 +6786,7 @@ return -ERESTARTSYS; writeConfigRid(local, 0); enable_MAC(local, &rsp, 0); - if (local->need_commit > 1) + if (test_bit (FLAG_RESET, &local->flags)) airo_set_promisc(local); else up(&local->sem); @@ -6085,7 +6807,6 @@ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "airoidifc" }, }; -#if WIRELESS_EXT > 12 static const iw_handler airo_handler[] = { (iw_handler) airo_config_commit, /* SIOCSIWCOMMIT */ @@ -6104,33 +6825,16 @@ (iw_handler) NULL, /* SIOCGIWPRIV */ (iw_handler) NULL, /* SIOCSIWSTATS */ (iw_handler) NULL, /* SIOCGIWSTATS */ -#if WIRELESS_EXT > 15 iw_handler_set_spy, /* SIOCSIWSPY */ iw_handler_get_spy, /* SIOCGIWSPY */ iw_handler_set_thrspy, /* SIOCSIWTHRSPY */ iw_handler_get_thrspy, /* SIOCGIWTHRSPY */ -#else /* WIRELESS_EXT > 15 */ -#ifdef WIRELESS_SPY - (iw_handler) airo_set_spy, /* SIOCSIWSPY */ - (iw_handler) airo_get_spy, /* SIOCGIWSPY */ -#else /* WIRELESS_SPY */ - (iw_handler) NULL, /* SIOCSIWSPY */ - (iw_handler) NULL, /* SIOCGIWSPY */ -#endif /* WIRELESS_SPY */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ -#endif /* WIRELESS_EXT > 15 */ (iw_handler) airo_set_wap, /* SIOCSIWAP */ (iw_handler) airo_get_wap, /* SIOCGIWAP */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) airo_get_aplist, /* SIOCGIWAPLIST */ -#if WIRELESS_EXT > 13 (iw_handler) airo_set_scan, /* SIOCSIWSCAN */ (iw_handler) airo_get_scan, /* SIOCGIWSCAN */ -#else /* WIRELESS_EXT > 13 */ - (iw_handler) NULL, /* SIOCSIWSCAN */ - (iw_handler) NULL, /* SIOCGIWSCAN */ -#endif /* WIRELESS_EXT > 13 */ (iw_handler) airo_set_essid, /* SIOCSIWESSID */ (iw_handler) airo_get_essid, /* SIOCGIWESSID */ (iw_handler) airo_set_nick, /* SIOCSIWNICKN */ @@ -6173,14 +6877,11 @@ .standard = (iw_handler *) airo_handler, .private = (iw_handler *) airo_private_handler, .private_args = (struct iw_priv_args *) airo_private_args, -#if WIRELESS_EXT > 15 .spy_offset = ((void *) (&((struct airo_info *) NULL)->spy_data) - (void *) NULL), -#endif /* WIRELESS_EXT > 15 */ }; -#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT */ /* @@ -6199,290 +6900,12 @@ static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { int rc = 0; -#if defined(WIRELESS_EXT) && WIRELESS_EXT < 13 - struct iwreq *wrq = (struct iwreq *) rq; -#endif /* WIRELESS_EXT < 13 */ - - switch (cmd) { -/* WE 13 and higher will use airo_handler_def */ -#if defined(WIRELESS_EXT) && WIRELESS_EXT < 13 - case SIOCGIWNAME: // Get name - airo_get_name(dev, NULL, (char *) &(wrq->u.name), NULL); - break; - - case SIOCSIWFREQ: // Set frequency/channel - rc = airo_set_freq(dev, NULL, &(wrq->u.freq), NULL); - break; - - case SIOCGIWFREQ: // Get frequency/channel - rc = airo_get_freq(dev, NULL, &(wrq->u.freq), NULL); - break; - - case SIOCSIWESSID: // Set desired network name (ESSID) - { - char essidbuf[IW_ESSID_MAX_SIZE+1]; - if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) { - rc = -E2BIG; - break; - } - if (copy_from_user(essidbuf, wrq->u.essid.pointer, - wrq->u.essid.length)) { - rc = -EFAULT; - break; - } - rc = airo_set_essid(dev, NULL, - &(wrq->u.essid), essidbuf); - } - break; - - case SIOCGIWESSID: // Get current network name (ESSID) - { - char essidbuf[IW_ESSID_MAX_SIZE+1]; - if (wrq->u.essid.pointer) - rc = airo_get_essid(dev, NULL, - &(wrq->u.essid), essidbuf); - if ( copy_to_user(wrq->u.essid.pointer, - essidbuf, - wrq->u.essid.length) ) - rc = -EFAULT; - } - break; - - case SIOCSIWAP: - rc = airo_set_wap(dev, NULL, &(wrq->u.ap_addr), NULL); - break; - - case SIOCGIWAP: // Get current Access Point (BSSID) - rc = airo_get_wap(dev, NULL, &(wrq->u.ap_addr), NULL); - break; - - case SIOCSIWNICKN: // Set desired station name - { - char nickbuf[IW_ESSID_MAX_SIZE+1]; - if (wrq->u.data.length > IW_ESSID_MAX_SIZE) { - rc = -E2BIG; - break; - } - if (copy_from_user(nickbuf, wrq->u.data.pointer, - wrq->u.data.length)) { - rc = -EFAULT; - break; - } - rc = airo_set_nick(dev, NULL, - &(wrq->u.data), nickbuf); - } - break; - - case SIOCGIWNICKN: // Get current station name - { - char nickbuf[IW_ESSID_MAX_SIZE+1]; - if (wrq->u.data.pointer) - rc = airo_get_nick(dev, NULL, - &(wrq->u.data), nickbuf); - if ( copy_to_user(wrq->u.data.pointer, - nickbuf, - wrq->u.data.length) ) - rc = -EFAULT; - } - break; - - case SIOCSIWRATE: // Set the desired bit-rate - rc = airo_set_rate(dev, NULL, &(wrq->u.bitrate), NULL); - break; - - case SIOCGIWRATE: // Get the current bit-rate - rc = airo_get_rate(dev, NULL, &(wrq->u.bitrate), NULL); - break; - - case SIOCSIWRTS: // Set the desired RTS threshold - rc = airo_set_rts(dev, NULL, &(wrq->u.rts), NULL); - break; - - case SIOCGIWRTS: // Get the current RTS threshold - rc = airo_get_rts(dev, NULL, &(wrq->u.rts), NULL); - break; + struct airo_info *ai = (struct airo_info *)dev->priv; - case SIOCSIWFRAG: // Set the desired fragmentation threshold - rc = airo_set_frag(dev, NULL, &(wrq->u.frag), NULL); - break; - - case SIOCGIWFRAG: // Get the current fragmentation threshold - rc = airo_get_frag(dev, NULL, &(wrq->u.frag), NULL); - break; - - case SIOCSIWMODE: // Set mode of operation - rc = airo_set_mode(dev, NULL, &(wrq->u.mode), NULL); - break; - - case SIOCGIWMODE: // Get mode of operation - rc = airo_get_mode(dev, NULL, &(wrq->u.mode), NULL); - break; - - case SIOCSIWENCODE: // Set WEP keys and mode - { - char keybuf[MAX_KEY_SIZE]; - if (wrq->u.encoding.pointer) { - /* We actually have a key to set */ - if (wrq->u.encoding.length > MAX_KEY_SIZE) { - rc = -E2BIG; - break; - } - if (copy_from_user(keybuf, - wrq->u.encoding.pointer, - wrq->u.encoding.length)) { - rc = -EFAULT; - break; - } - } else if (wrq->u.encoding.length != 0) { - rc = -EINVAL; - break; - } - rc = airo_set_encode(dev, NULL, - &(wrq->u.encoding), keybuf); - } - break; - - case SIOCGIWENCODE: // Get the WEP keys and mode - // Only super-user can see WEP key - // Note : this is needed only for very old versions of WE - if (!capable(CAP_NET_ADMIN)) { - rc = -EPERM; - break; - } - { - char keybuf[MAX_KEY_SIZE]; - rc = airo_get_encode(dev, NULL, - &(wrq->u.encoding), keybuf); - if (wrq->u.encoding.pointer) { - if (copy_to_user(wrq->u.encoding.pointer, - keybuf, - wrq->u.encoding.length)) - rc = -EFAULT; - } - } - break; - - case SIOCGIWTXPOW: // Get the current Tx-Power - rc=airo_get_txpow(dev, NULL, &(wrq->u.txpower), NULL); - break; - case SIOCSIWTXPOW: - rc=airo_set_txpow(dev, NULL, &(wrq->u.txpower), NULL); - break; - - case SIOCSIWRETRY: - rc=airo_set_retry(dev, NULL, &(wrq->u.retry), NULL); - break; - case SIOCGIWRETRY: - rc=airo_get_retry(dev, NULL, &(wrq->u.retry), NULL); - break; - - case SIOCGIWRANGE: // Get range of parameters - { - struct iw_range range; - rc = airo_get_range(dev, NULL, - &(wrq->u.data), (char *) &range); - if (copy_to_user(wrq->u.data.pointer, &range, - sizeof(struct iw_range))) - rc = -EFAULT; - } - break; - - case SIOCGIWPOWER: - rc=airo_get_power(dev, NULL, &(wrq->u.power), NULL); - break; - - case SIOCSIWPOWER: - rc=airo_set_power(dev, NULL, &(wrq->u.power), NULL); - break; - - case SIOCGIWSENS: - rc = airo_get_sens(dev, NULL, &(wrq->u.sens), NULL); - break; - - case SIOCSIWSENS: - rc = airo_set_sens(dev, NULL, &(wrq->u.sens), NULL); - break; - - case SIOCGIWAPLIST: - { - char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + - sizeof(struct iw_quality))]; - if (wrq->u.data.pointer) { - rc = airo_get_aplist(dev, NULL, - &(wrq->u.data), buffer); - if (copy_to_user(wrq->u.data.pointer, - buffer, - (wrq->u.data.length * - (sizeof(struct sockaddr) + - sizeof(struct iw_quality))) - )) - rc = -EFAULT; - } - } - break; - -#ifdef WIRELESS_SPY - case SIOCSIWSPY: // Set the spy list - { - struct sockaddr address[IW_MAX_SPY]; - /* Check the number of addresses */ - if (wrq->u.data.length > IW_MAX_SPY) { - rc = -E2BIG; - break; - } - /* Get the data in the driver */ - if (wrq->u.data.pointer) { - if (copy_from_user((char *) address, - wrq->u.data.pointer, - sizeof(struct sockaddr) * - wrq->u.data.length)) { - rc = -EFAULT; - break; - } - } else if (wrq->u.data.length != 0) { - rc = -EINVAL; - break; - } - rc=airo_set_spy(dev, NULL, &(wrq->u.data), - (char *) address); - } - break; - - case SIOCGIWSPY: // Get the spy list - { - char buffer[IW_MAX_SPY * (sizeof(struct sockaddr) + - sizeof(struct iw_quality))]; - if (wrq->u.data.pointer) { - rc = airo_get_spy(dev, NULL, - &(wrq->u.data), buffer); - if (copy_to_user(wrq->u.data.pointer, - buffer, - (wrq->u.data.length * - (sizeof(struct sockaddr) + - sizeof(struct iw_quality))) - )) - rc = -EFAULT; - } - } - break; -#endif /* WIRELESS_SPY */ - -#ifdef CISCO_EXT - case SIOCGIWPRIV: - if(wrq->u.data.pointer) { - /* Set the number of ioctl available */ - wrq->u.data.length = sizeof(airo_private_args) / sizeof( airo_private_args[0]); - - /* Copy structure to the user buffer */ - if(copy_to_user(wrq->u.data.pointer, - (u_char *) airo_private_args, - sizeof(airo_private_args))) - rc = -EFAULT; - } - break; -#endif /* CISCO_EXT */ -#endif /* WIRELESS_EXT < 13 */ + if (ai->power) + return 0; + switch (cmd) { #ifdef CISCO_EXT case AIROIDIFC: #ifdef AIROOLDIDIFC @@ -6530,16 +6953,6 @@ default: rc = -EOPNOTSUPP; } - -#if defined(WIRELESS_EXT) && WIRELESS_EXT < 13 - /* WE 13 and higher will use airo_config_commit */ - /* Some of the "SET" function may have modified some of the - * parameters. It's now time to commit them in the card */ - airo_config_commit(dev, NULL, NULL, NULL); - if (rc == -EINPROGRESS) - return 0; -#endif /* WIRELESS_EXT < 13 */ - return rc; } @@ -6561,6 +6974,10 @@ /* Get stats out of the card */ clear_bit(JOB_WSTATS, &local->flags); + if (local->power) { + up(&local->sem); + return; + } readStatusRid(local, &status_rid, 0); readStatsRid(local, &stats_rid, RID_STATS, 0); up(&local->sem); @@ -6608,7 +7025,6 @@ #endif /* WIRELESS_EXT */ #ifdef CISCO_EXT -#define RIDS_SIZE 2048 /* * This just translates from driver IOCTL codes to the command codes to * feed to the radio's host interface. Things can be added/deleted @@ -6659,10 +7075,10 @@ break; } - if ((iobuf = kmalloc(RIDS_SIZE, GFP_KERNEL)) == NULL) + if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) return -ENOMEM; - PC4500_readrid(ai,ridcode,iobuf,RIDS_SIZE, 1); + PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); /* get the count of bytes in the rid docs say 1st 2 bytes is it. * then return it to the user * 9/22/2000 Honor user given length @@ -6672,7 +7088,7 @@ else len = comp->len; - if (copy_to_user(comp->data, iobuf, min(len, (int)RIDS_SIZE))) { + if (copy_to_user(comp->data, iobuf, min(len, (int)RIDSIZE))) { kfree (iobuf); return -EFAULT; } @@ -6735,10 +7151,10 @@ * writerid routines. */ case AIROPSTCLR: - if ((iobuf = kmalloc(RIDS_SIZE, GFP_KERNEL)) == NULL) + if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) return -ENOMEM; - PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDS_SIZE, 1); + PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); #ifdef MICSUPPORT enabled = ai->micstats.enabled; @@ -6747,7 +7163,7 @@ #endif if (copy_to_user(comp->data, iobuf, - min((int)comp->len, (int)RIDS_SIZE))) { + min((int)comp->len, (int)RIDSIZE))) { kfree (iobuf); return -EFAULT; } @@ -6757,10 +7173,10 @@ default: return -EOPNOTSUPP; /* Blarg! */ } - if(comp->len > RIDS_SIZE) + if(comp->len > RIDSIZE) return -EINVAL; - if ((iobuf = kmalloc(RIDS_SIZE, GFP_KERNEL)) == NULL) + if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) return -ENOMEM; if (copy_from_user(iobuf,comp->data,comp->len)) { @@ -6990,13 +7406,16 @@ int nwords; /* Write stuff */ - OUT4500(ai,AUXPAGE,0x100); - OUT4500(ai,AUXOFF,0); + if (test_bit(FLAG_MPI,&ai->flags)) + memcpy(ai->pciaux + 0x8000, ai->flash, FLASHSIZE); + else { + OUT4500(ai,AUXPAGE,0x100); + OUT4500(ai,AUXOFF,0); - for(nwords=0;nwords != FLASHSIZE / 2;nwords++){ - OUT4500(ai,AUXDATA,ai->flash[nwords] & 0xffff); + for(nwords=0;nwords != FLASHSIZE / 2;nwords++){ + OUT4500(ai,AUXDATA,ai->flash[nwords] & 0xffff); + } } - OUT4500(ai,SWS0,0x8000); return 0; @@ -7013,9 +7432,11 @@ clear_bit (FLAG_FLASHING, &ai->flags); status = setup_card(ai, dev->dev_addr); - for( i = 0; i < MAX_FIDS; i++ ) { - ai->fids[i] = transmit_allocate( ai, 2312, i >= MAX_FIDS / 2 ); - } + if (!test_bit(FLAG_MPI,&ai->flags)) + for( i = 0; i < MAX_FIDS; i++ ) { + ai->fids[i] = transmit_allocate + ( ai, 2312, i >= MAX_FIDS / 2 ); + } set_current_state (TASK_UNINTERRUPTIBLE); schedule_timeout (HZ); /* Added 12/7/00 */ diff -Nru a/drivers/net/wireless/airport.c b/drivers/net/wireless/airport.c --- a/drivers/net/wireless/airport.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/wireless/airport.c Tue Feb 17 20:00:08 2004 @@ -40,7 +40,7 @@ #define AIRPORT_IO_LEN (0x1000) /* one page */ struct airport { - struct device_node *node; + struct macio_dev *mdev; void *vaddr; int irq_requested; int ndev_registered; @@ -51,7 +51,6 @@ { struct net_device *dev = dev_get_drvdata(&mdev->ofdev.dev); struct orinoco_private *priv = dev->priv; - struct airport *card = priv->card; unsigned long flags; int err; @@ -76,7 +75,7 @@ orinoco_unlock(priv, &flags); disable_irq(dev->irq); - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 0); + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(mdev), 0, 0); return 0; } @@ -86,14 +85,14 @@ { struct net_device *dev = dev_get_drvdata(&mdev->ofdev.dev); struct orinoco_private *priv = dev->priv; - struct airport *card = priv->card; unsigned long flags; int err; printk(KERN_DEBUG "%s: Airport waking up\n", dev->name); - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 1); - mdelay(200); + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(mdev), 0, 1); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/5); enable_irq(dev->irq); @@ -142,15 +141,13 @@ iounmap(card->vaddr); card->vaddr = 0; - dev->base_addr = 0; + macio_release_resource(mdev, 0); - release_OF_resource(card->node, 0); - - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 0); - current->state = TASK_UNINTERRUPTIBLE; + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(mdev), 0, 0); + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ); - dev_set_drvdata(&mdev->ofdev.dev, NULL); + macio_set_drvdata(mdev, NULL); free_netdev(dev); return 0; @@ -173,11 +170,11 @@ * off. */ disable_irq(dev->irq); - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 0); - current->state = TASK_UNINTERRUPTIBLE; + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(card->mdev), 0, 0); + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ); - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 1); - current->state = TASK_UNINTERRUPTIBLE; + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(card->mdev), 0, 1); + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ); enable_irq(dev->irq); @@ -194,10 +191,9 @@ struct net_device *dev; struct airport *card; unsigned long phys_addr; - struct device_node *of_node = mdev->ofdev.node; hermes_t *hw; - if (of_node->n_addrs < 1 || of_node->n_intrs < 1) { + if (macio_resource_count(mdev) < 1 || macio_irq_count(mdev) < 1) { printk(KERN_ERR "airport: wrong interrupt/addresses in OF tree\n"); return -ENODEV; } @@ -212,27 +208,26 @@ card = priv->card; hw = &priv->hw; - card->node = of_node; + card->mdev = mdev; - if (! request_OF_resource(of_node, 0, " (airport)")) { + if (macio_request_resource(mdev, 0, "airport")) { printk(KERN_ERR "airport: can't request IO resource !\n"); - kfree(dev); - return -ENODEV; + free_netdev(dev); + return -EBUSY; } - dev->name[0] = '\0'; /* register_netdev will give us an ethX name */ SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &mdev->ofdev.dev); - dev_set_drvdata(&mdev->ofdev.dev, dev); + macio_set_drvdata(mdev, dev); /* Setup interrupts & base address */ - dev->irq = of_node->intrs[0].line; - phys_addr = of_node->addrs[0].address; /* Physical address */ + dev->irq = macio_irq(mdev, 0); + phys_addr = macio_resource_start(mdev, 0); /* Physical address */ printk(KERN_DEBUG "Airport at physical address %lx\n", phys_addr); dev->base_addr = phys_addr; card->vaddr = ioremap(phys_addr, AIRPORT_IO_LEN); - if (! card->vaddr) { + if (!card->vaddr) { printk("airport: ioremap() failed\n"); goto failed; } @@ -241,8 +236,8 @@ HERMES_MEM, HERMES_16BIT_REGSPACING); /* Power up card */ - pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, card->node, 0, 1); - current->state = TASK_UNINTERRUPTIBLE; + pmac_call_feature(PMAC_FTR_AIRPORT_ENABLE, macio_get_of_node(mdev), 0, 1); + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ); /* Reset it before we get the interrupt */ diff -Nru a/drivers/net/wireless/arlan-main.c b/drivers/net/wireless/arlan-main.c --- a/drivers/net/wireless/arlan-main.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/arlan-main.c Tue Feb 17 20:00:07 2004 @@ -19,9 +19,7 @@ static int SID = SIDUNKNOWN; static int radioNodeId = radioNodeIdUNKNOWN; static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; -static int mem = memUNKNOWN; int arlan_debug = debugUNKNOWN; -static int numDevices = numDevicesUNKNOWN; static int spreadingCode = spreadingCodeUNKNOWN; static int channelNumber = channelNumberUNKNOWN; static int channelSet = channelSetUNKNOWN; @@ -45,9 +43,7 @@ MODULE_PARM(irq, "i"); MODULE_PARM(mem, "i"); -MODULE_PARM(probe, "i"); MODULE_PARM(arlan_debug, "i"); -MODULE_PARM(numDevices, "i"); MODULE_PARM(testMemory, "i"); MODULE_PARM(spreadingCode, "i"); MODULE_PARM(channelNumber, "i"); @@ -69,9 +65,7 @@ MODULE_PARM(arlan_EEPROM_bad, "i"); MODULE_PARM_DESC(irq, "(unused)"); MODULE_PARM_DESC(mem, "Arlan memory address for single device probing"); -MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)"); MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)"); -MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1"); MODULE_PARM_DESC(testMemory, "(unused)"); MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)"); MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions"); @@ -88,7 +82,6 @@ struct arlan_conf_stru arlan_conf[MAX_ARLANS]; static int arlans_found; -static int arlan_probe_here(struct net_device *dev, int ioaddr); static int arlan_open(struct net_device *dev); static int arlan_tx(struct sk_buff *skb, struct net_device *dev); static irqreturn_t arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs); @@ -975,24 +968,27 @@ * probes on the ISA bus. A good device probes avoids doing writes, and * verifies that the correct device exists and functions. */ - -static int __init arlan_check_fingerprint(int memaddr) +#define ARLAN_SHMEM_SIZE 0x2000 +static int __init arlan_check_fingerprint(unsigned long memaddr) { - static char probeText[] = "TELESYSTEM SLW INC. ARLAN \0"; - char tempBuf[49]; + static const char probeText[] = "TELESYSTEM SLW INC. ARLAN \0"; volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr; + unsigned long paddr = virt_to_phys((void *) memaddr); + char tempBuf[49]; ARLAN_DEBUG_ENTRY("arlan_check_fingerprint"); - if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){ - // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",virt_to_phys((void*)memaddr)); + + if (!request_mem_region(paddr, ARLAN_SHMEM_SIZE, "arlan")) { + // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",paddr); return -ENODEV; } + memcpy_fromio(tempBuf, arlan->textRegion, 29); tempBuf[30] = 0; /* check for card at this address */ if (0 != strncmp(tempBuf, probeText, 29)){ -// not release_mem_region(virt_to_phys((void*)memaddr),0x2000); + release_mem_region(paddr, ARLAN_SHMEM_SIZE); return -ENODEV; } @@ -1000,51 +996,8 @@ ARLAN_DEBUG_EXIT("arlan_check_fingerprint"); return 0; - - -} - -static int __init arlan_probe_everywhere(struct net_device *dev) -{ - int m; - int probed = 0; - int found = 0; - - SET_MODULE_OWNER(dev); - - ARLAN_DEBUG_ENTRY("arlan_probe_everywhere"); - if (mem != 0 && numDevices == 1) /* Check a single specified location. */ - { - if (arlan_probe_here(dev, (int) phys_to_virt( mem) ) == 0) - return 0; - else - return -ENODEV; - } - for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000) - { - if (arlan_probe_here(dev, m) == 0) - { - found++; - lastFoundAt = (int)virt_to_phys((void*)m); - break; - } - probed++; - } - if (found == 0 && probed != 0) - { - if (lastFoundAt == 0xbe000) - printk(KERN_ERR "arlan: No Arlan devices found \n"); - return -ENODEV; - } - else - return 0; - - ARLAN_DEBUG_EXIT("arlan_probe_everywhere"); - - return -ENODEV; } - static int arlan_change_mtu(struct net_device *dev, int new_mtu) { struct arlan_private *priv = dev->priv; @@ -1085,47 +1038,15 @@ - -static int __init - arlan_allocate_device(int num, struct net_device *devs) +static int __init arlan_setup_device(struct net_device *dev, int num) { + struct arlan_private *ap = dev->priv; + int err; - struct net_device *dev; - struct arlan_private *ap; + ARLAN_DEBUG_ENTRY("arlan_setup_device"); - ARLAN_DEBUG_ENTRY("arlan_allocate_device"); + ap->conf = (struct arlan_shmem *)(ap+1); - if (!devs) { - dev = init_etherdev(0, sizeof(struct arlan_private) + sizeof(struct arlan_shmem)); - if (!dev) { - printk(KERN_ERR "ARLAN: init_etherdev failed\n"); - return 0; - } - ap = dev->priv; - ap->conf = dev->priv + sizeof(struct arlan_private); - ap->init_etherdev_alloc = 1; - } else { - dev = devs; - dev->priv = kmalloc(sizeof(struct arlan_private) + sizeof(struct arlan_shmem), GFP_KERNEL); - if (!dev->priv) { - printk(KERN_ERR "ARLAN: kmalloc of dev->priv failed\n"); - return 0; - } - ap = dev->priv; - ap->conf = dev->priv + sizeof(struct arlan_private); - memset(ap, 0, sizeof(*ap)); - } - - /* Fill in the 'dev' fields. */ - dev->base_addr = 0; - dev->mem_start = 0; - dev->mem_end = 0; - dev->mtu = 1500; - dev->flags = 0; /* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */ - dev->irq = 0; - dev->dma = 0; - dev->tx_queue_len = tx_queue_len; - ether_setup(dev); dev->tx_queue_len = tx_queue_len; dev->open = arlan_open; dev->stop = arlan_close; @@ -1138,41 +1059,45 @@ dev->watchdog_timeo = 3*HZ; ap->irq_test_done = 0; - arlan_device[num] = dev; ap->Conf = &arlan_conf[num]; ap->Conf->pre_Command_Wait = 40; ap->Conf->rx_tweak1 = 30; ap->Conf->rx_tweak2 = 0; - ARLAN_DEBUG_EXIT("arlan_allocate_device"); - return (int) dev; -} + err = register_netdev(dev); + if (err) { + release_mem_region(virt_to_phys((void *) dev->mem_start), + ARLAN_SHMEM_SIZE); + free_netdev(dev); + return err; + } + arlan_device[num] = dev; + ARLAN_DEBUG_EXIT("arlan_setup_device"); + return 0; +} -static int __init arlan_probe_here(struct net_device *dev, int memaddr) +static int __init arlan_probe_here(struct net_device *dev, + unsigned long memaddr) { - volatile struct arlan_shmem *arlan; + struct arlan_private *ap = dev->priv; ARLAN_DEBUG_ENTRY("arlan_probe_here"); if (arlan_check_fingerprint(memaddr)) return -ENODEV; - printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, (int) virt_to_phys((void*)memaddr)); - - if (!arlan_allocate_device(arlans_found, dev)) - return -1; - - ((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr; - arlan = (void *) memaddr; + printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, + (int) virt_to_phys((void*)memaddr)); + ap->card = (void *) memaddr; dev->mem_start = memaddr; - dev->mem_end = memaddr + 0x1FFF; + dev->mem_end = memaddr + ARLAN_SHMEM_SIZE-1; if (dev->irq < 2) { - READSHM(dev->irq, arlan->irqLevel, u_char); + READSHM(dev->irq, ap->card->irqLevel, u_char); } else if (dev->irq == 2) dev->irq = 9; @@ -1183,8 +1108,6 @@ } - - static int arlan_open(struct net_device *dev) { struct arlan_private *priv = dev->priv; @@ -1193,12 +1116,6 @@ ARLAN_DEBUG_ENTRY("arlan_open"); - if (dev->mem_start == 0) - ret = arlan_probe_everywhere(dev); - if (ret != 0) - return ret; - - arlan = priv->card; ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev); if (ret) { @@ -1768,14 +1685,9 @@ { struct arlan_private *priv = dev->priv; - if (!priv) - { - printk(KERN_CRIT "arlan: No Device priv \n"); - return 0; - } ARLAN_DEBUG_ENTRY("arlan_close"); - del_timer(&priv->timer); + del_timer_sync(&priv->timer); arlan_command(dev, ARLAN_COMMAND_POWERDOWN); @@ -1867,39 +1779,70 @@ } -int __init arlan_probe(struct net_device *dev) +struct net_device * __init arlan_probe(int unit) { - printk("Arlan driver %s\n", arlan_version); + struct net_device *dev; + int err; + int m; - if (arlan_probe_everywhere(dev)) - return -ENODEV; + ARLAN_DEBUG_ENTRY("arlan_probe"); - arlans_found++; - return 0; -} + if (arlans_found == MAX_ARLANS) + return ERR_PTR(-ENODEV); -#ifdef MODULE + /* + * Reserve space for local data and a copy of the shared memory + * that is used by the /proc interface. + */ + dev = alloc_etherdev(sizeof(struct arlan_private) + + sizeof(struct arlan_shmem)); + if (!dev) + return ERR_PTR(-ENOMEM); -static int probe = probeUNKNOWN; + SET_MODULE_OWNER(dev); -static int __init arlan_find_devices(void) -{ - int m; - int found = 0; + if (unit >= 0) { + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); + + if (dev->mem_start) { + if (arlan_probe_here(dev, dev->mem_start) == 0) + goto found; + goto not_found; + } + + } - ARLAN_DEBUG_ENTRY("arlan_find_devices"); - if (mem != 0 && numDevices == 1) /* Check a single specified location. */ - return 1; - for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000) + + for (m = (int)phys_to_virt(lastFoundAt) + ARLAN_SHMEM_SIZE; + m <= (int)phys_to_virt(0xDE000); + m += ARLAN_SHMEM_SIZE) { - if (arlan_check_fingerprint(m) == 0) - found++; + if (arlan_probe_here(dev, m) == 0) + { + lastFoundAt = (int)virt_to_phys((void*)m); + goto found; + } } - ARLAN_DEBUG_EXIT("arlan_find_devices"); - return found; + if (lastFoundAt == 0xbe000) + printk(KERN_ERR "arlan: No Arlan devices found \n"); + + not_found: + free_netdev(dev); + return ERR_PTR(-ENODEV); + + found: + err = arlan_setup_device(dev, arlans_found); + if (err) + dev = ERR_PTR(err); + else if (!arlans_found++) + printk(KERN_INFO "Arlan driver %s\n", arlan_version); + + return dev; } +#ifdef MODULE int init_module(void) { int i = 0; @@ -1909,21 +1852,11 @@ if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN) return -EINVAL; - numDevices = arlan_find_devices(); - if (numDevices == 0) - return -ENODEV; - - for (i = 0; i < numDevices && i < MAX_ARLANS; i++) - { - if (!arlan_allocate_device(i, NULL)) - return -ENOMEM; + for (i = 0; i < MAX_ARLANS; i++) { + struct net_device *dev = arlan_probe(i); - if (arlan_device[i] == NULL) - return -ENOMEM; - - if (probe) - arlan_probe_everywhere(arlan_device[i]); -// arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); + if (IS_ERR(dev)) + return PTR_ERR(dev); } init_arlan_proc(); printk(KERN_INFO "Arlan driver %s\n", arlan_version); @@ -1935,7 +1868,7 @@ void cleanup_module(void) { int i = 0; - struct arlan_private *ap; + struct net_device *dev; ARLAN_DEBUG_ENTRY("cleanup_module"); @@ -1946,22 +1879,18 @@ for (i = 0; i < MAX_ARLANS; i++) { - if (arlan_device[i]) - { - arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); - -// release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 ); - unregister_netdev(arlan_device[i]); - ap = arlan_device[i]->priv; - if (ap->init_etherdev_alloc) { - free_netdev(arlan_device[i]); - arlan_device[i] = NULL; - } else { - kfree(ap); - ap = NULL; - } + dev = arlan_device[i]; + if (dev) { + arlan_command(dev, ARLAN_COMMAND_POWERDOWN ); + + unregister_netdev(dev); + release_mem_region(virt_to_phys((void *) dev->mem_start), + ARLAN_SHMEM_SIZE); + free_netdev(dev); + arlan_device[i] = NULL; } } + ARLAN_DEBUG_EXIT("cleanup_module"); } diff -Nru a/drivers/net/wireless/arlan.h b/drivers/net/wireless/arlan.h --- a/drivers/net/wireless/arlan.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/arlan.h Tue Feb 17 20:00:07 2004 @@ -57,12 +57,8 @@ #define SIDUNKNOWN -1 #define radioNodeIdUNKNOWN -1 -#define encryptionKeyUNKNOWN '\0'; #define irqUNKNOWN 0 -#define memUNKNOWN 0 #define debugUNKNOWN 0 -#define probeUNKNOWN 1 -#define numDevicesUNKNOWN 1 #define testMemoryUNKNOWN 1 #define spreadingCodeUNKNOWN 0 #define channelNumberUNKNOWN 0 @@ -81,6 +77,8 @@ #else #define ARLAN_DEBUG(a,b) #endif + +#define ARLAN_SHMEM_SIZE 0x2000 struct arlan_shmem { diff -Nru a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c --- a/drivers/net/wireless/atmel.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wireless/atmel.c Tue Feb 17 20:00:06 2004 @@ -17,9 +17,6 @@ This file contains the module in binary form and, under the terms of the GPL, in source form. The source is located at the end of the file. - For all queries about this code, please contact the current author, - Simon Kelley and not Atmel Corporation. - This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -34,6 +31,12 @@ along with Atmel wireless lan drivers; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + For all queries about this code, please contact the current author, + Simon Kelley and not Atmel Corporation. + + Credit is due to HP UK and Cambridge Online Systems Ltd for supplying + hardware used during development of this driver. + ******************************************************************************/ #include @@ -67,7 +70,7 @@ #include "ieee802_11.h" #define DRIVER_MAJOR 0 -#define DRIVER_MINOR 9 +#define DRIVER_MINOR 91 MODULE_AUTHOR("Simon Kelley"); MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); @@ -469,7 +472,6 @@ CARD_TYPE_SPI_FLASH, CARD_TYPE_EEPROM } card_type; - int is3com; /* is this a 3com card? they are uniquely borken */ int do_rx_crc; /* If we need to CRC incoming packets */ int probe_crc; /* set if we don't yet know */ int crc_ok_cnt, crc_ko_cnt; /* counters for probing */ @@ -484,7 +486,7 @@ u8 group_cipher_suite, pairwise_cipher_suite; u8 wep_keys[MAX_ENCRYPTION_KEYS][MAX_ENCRYPTION_KEY_SIZE]; int wep_key_len[MAX_ENCRYPTION_KEYS]; - int use_wpa; + int use_wpa, radio_on_broken; /* firmware dependent stuff. */ u16 host_info_base; struct host_info_struct { @@ -1386,7 +1388,7 @@ return len; } -struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware_id, int is3com, +struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware_id, struct device *sys_dev, int (*card_present)(void *), void *card) { struct net_device *dev; @@ -1418,7 +1420,6 @@ strcpy(priv->firmware_template, firmware_id); priv->bus_type = card_present ? BUS_TYPE_PCCARD : BUS_TYPE_PCI; priv->station_state = STATION_STATE_DOWN; - priv->is3com = is3com; priv->do_rx_crc = 0; /* For PCMCIA cards, some chips need CRC, some don't so we have to probe. */ @@ -1525,16 +1526,15 @@ void stop_atmel_card(struct net_device *dev, int freeres) { struct atmel_private *priv = dev->priv; - unregister_netdev(dev); - + /* put a brick on it... */ - if (priv->bus_type == BUS_TYPE_PCCARD) atmel_write16(dev, GCR, 0x0060); atmel_write16(dev, GCR, 0x0040); - - remove_proc_entry("driver/atmel", NULL); + del_timer_sync(&priv->management_timer); + unregister_netdev(dev); + remove_proc_entry("driver/atmel", NULL); free_irq(dev->irq, dev); if (priv->firmware) kfree(priv->firmware); @@ -1995,8 +1995,8 @@ /* If setting by frequency, convert to a channel */ if((fwrq->e == 1) && - (fwrq->m >= (int) 2.412e8) && - (fwrq->m <= (int) 2.487e8)) { + (fwrq->m >= (int) 241200000) && + (fwrq->m <= (int) 248700000)) { int f = fwrq->m / 100000; int c = 0; while((c < 14) && (f != frequency_list[c])) @@ -3594,8 +3594,12 @@ return 0; /* Check the version and set the correct flag for wpa stuff, - old and new firmware is incompatible. */ - priv->use_wpa = (priv->host_info.major_version >= 4); + old and new firmware is incompatible. + The pre-wpa 3com firmware reports major version 5, + the wpa 3com firmware is major version 4 and doesn't need + the 3com broken-ness filter. */ + priv->use_wpa = (priv->host_info.major_version == 4); + priv->radio_on_broken = (priv->host_info.major_version == 5); /* unmask all irq sources */ atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_MASK_OFFSET), 0xff); @@ -3640,7 +3644,7 @@ if ((channel = atmel_validate_channel(priv, priv->channel))) priv->channel = channel; - if (!priv->is3com) { + if (!priv->radio_on_broken) { if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) == CMD_STATUS_REJECTED_RADIO_OFF) { printk(KERN_INFO @@ -3853,7 +3857,6 @@ atmel_write16(priv->dev, DR, data); /* card is little-endian */ atmel_write16(priv->dev, DR, data >> 16); } - /***************************************************************************/ /* There follows the source form of the MAC address reading firmware */ diff -Nru a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c --- a/drivers/net/wireless/atmel_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/atmel_cs.c Tue Feb 17 20:00:07 2004 @@ -101,7 +101,7 @@ event handler. */ -struct net_device *init_atmel_card(int, int, char *, int, struct device *, +struct net_device *init_atmel_card(int, int, char *, struct device *, int (*present_func)(void *), void * ); void stop_atmel_card( struct net_device *, int ); int reset_atmel_card( struct net_device * ); @@ -332,15 +332,20 @@ { 0, 0, "ATMEL/AT76C502AR_D", "atmel_at76c502d%s.bin", "NoName-revD" }, { 0, 0, "ATMEL/AT76C502AR_E", "atmel_at76c502e%s.bin", "NoName-revE" }, { 0, 0, "ATMEL/AT76C504", "atmel_at76c504%s.bin", "NoName-504" }, + { 0, 0, "ATMEL/AT76C504A", "atmel_at76c504a_2958%s.bin", "NoName-504a-2958" }, + { 0, 0, "ATMEL/AT76C504_R", "atmel_at76c504_2958%s.bin", "NoName-504-2958" }, { MANFID_3COM, 0x0620, NULL, "atmel_at76c502_3com%s.bin", "3com 3CRWE62092B" }, { MANFID_3COM, 0x0696, NULL, "atmel_at76c502_3com%s.bin", "3com 3CRSHPW_96" }, { 0, 0, "SMC/2632W-V2", "atmel_at76c502%s.bin", "SMC 2632W-V2" }, { 0, 0, "SMC/2632W", "atmel_at76c502d%s.bin", "SMC 2632W-V3" }, - { 0xd601, 0x0007, NULL, "atmel_at76c502%s.bin", "Sitecom WLAN-011"}, /* suspect - from a usenet posting. */ - { 0x01bf, 0x3302, NULL, "atmel_at76c502d%s.bin", "Belkin F5D6060u"}, /* " " " " " */ - { 0, 0, "BT/Voyager 1020 Laptop Adapter", "atmel_at76c502%s.bin", "BT Voyager 1020"}, + { 0xd601, 0x0007, NULL, "atmel_at76c502%s.bin", "Sitecom WLAN-011" }, + { 0x01bf, 0x3302, NULL, "atmel_at76c502e%s.bin", "Belkin F5D6020-V2" }, + { 0, 0, "BT/Voyager 1020 Laptop Adapter", "atmel_at76c502%s.bin", "BT Voyager 1020" }, { 0, 0, "IEEE 802.11b/Wireless LAN PC Card", "atmel_at76c502%s.bin", "Siemens Gigaset PC Card II" }, - { 0, 0, "CNet/CNWLC 11Mbps Wireless PC Card V-5", "atmel_at76c502e%s.bin", "CNet CNWLC-811ARL" } + { 0, 0, "CNet/CNWLC 11Mbps Wireless PC Card V-5", "atmel_at76c502e%s.bin", "CNet CNWLC-811ARL" }, + { 0, 0, "Wireless/PC_CARD", "atmel_at76c502d%s.bin", "Planet WL-3552" }, + { 0, 0, "OEM/11Mbps Wireless LAN PC Card V-3", "atmel_at76c502%s.bin", "OEM 11Mbps WLAN PCMCIA Card" }, + { 0, 0, "11WAVE/11WP611AL-E", "atmel_at76c502e%s.bin", "11WAVE WaveBuddy" } }; /* This is strictly temporary, until PCMCIA devices get integrated into the device model. */ @@ -538,7 +543,6 @@ init_atmel_card(link->irq.AssignedIRQ, link->io.BasePort1, card_index == -1 ? NULL : card_table[card_index].firmware, - card_index == -1 ? 0 : (card_table[card_index].manf == MANFID_3COM), &atmel_device, card_present, link); diff -Nru a/drivers/net/wireless/atmel_pci.c b/drivers/net/wireless/atmel_pci.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/atmel_pci.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,91 @@ +/*** -*- linux-c -*- ********************************************************** + + Driver for Atmel at76c502 at76c504 and at76c506 wireless cards. + + Copyright 2004 Simon Kelley. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Atmel wireless lan drivers; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +******************************************************************************/ +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Simon Kelley"); +MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); +MODULE_LICENSE("GPL"); +MODULE_SUPPORTED_DEVICE("Atmel at76c506 PCI wireless cards"); + +static struct pci_device_id card_ids[] = { + { 0x1114, 0x0506, PCI_ANY_ID, PCI_ANY_ID }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, card_ids); + +static int atmel_pci_probe(struct pci_dev *, const struct pci_device_id *); +static void atmel_pci_remove(struct pci_dev *); +struct net_device *init_atmel_card(int, int, char *, struct device *, + int (*present_func)(void *), void * ); +void stop_atmel_card( struct net_device *, int ); + +static struct pci_driver atmel_driver = { + .name = "atmel", + .id_table = card_ids, + .probe = atmel_pci_probe, + .remove = __devexit_p(atmel_pci_remove), +}; + + +static int __devinit atmel_pci_probe(struct pci_dev *pdev, + const struct pci_device_id *pent) +{ + struct net_device *dev; + + if (pci_enable_device(pdev)) + return -ENODEV; + + pci_set_master(pdev); + + dev = init_atmel_card(pdev->irq, pdev->resource[1].start, + "atmel_at76c506%s.bin", + &pdev->dev, NULL, NULL); + if (!dev) + return -ENODEV; + + pci_set_drvdata(pdev, dev); + return 0; +} + +static void __devexit atmel_pci_remove(struct pci_dev *pdev) +{ + stop_atmel_card(pci_get_drvdata(pdev), 1); +} + +static int __init atmel_init_module(void) +{ + return pci_module_init(&atmel_driver); +} + +static void __exit atmel_cleanup_module(void) +{ + pci_unregister_driver(&atmel_driver); +} + +module_init(atmel_init_module); +module_exit(atmel_cleanup_module); diff -Nru a/drivers/net/wireless/orinoco_pci.c b/drivers/net/wireless/orinoco_pci.c --- a/drivers/net/wireless/orinoco_pci.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/orinoco_pci.c Tue Feb 17 20:00:07 2004 @@ -261,7 +261,7 @@ if (dev->irq) free_irq(dev->irq, dev); - kfree(dev); + free_netdev(dev); } if (pci_ioaddr) diff -Nru a/drivers/net/wireless/orinoco_plx.c b/drivers/net/wireless/orinoco_plx.c --- a/drivers/net/wireless/orinoco_plx.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/wireless/orinoco_plx.c Tue Feb 17 20:00:08 2004 @@ -263,7 +263,7 @@ if (dev->irq) free_irq(dev->irq, dev); - kfree(dev); + free_netdev(dev); } if (pccard_ioaddr) diff -Nru a/drivers/net/wireless/orinoco_tmd.c b/drivers/net/wireless/orinoco_tmd.c --- a/drivers/net/wireless/orinoco_tmd.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wireless/orinoco_tmd.c Tue Feb 17 20:00:06 2004 @@ -157,7 +157,7 @@ if (dev->irq) free_irq(dev->irq, dev); - kfree(dev); + free_netdev(dev); } if (pccard_ioaddr) diff -Nru a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c --- a/drivers/net/wireless/ray_cs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/wireless/ray_cs.c Tue Feb 17 20:00:06 2004 @@ -344,19 +344,14 @@ return NULL; /* Allocate space for private device-specific data */ - dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + dev = alloc_etherdev(sizeof(ray_dev_t)); if (!dev) goto fail_alloc_dev; - local = kmalloc(sizeof(ray_dev_t), GFP_KERNEL); - - if (!local) - goto fail_alloc_local; + local = dev->priv; memset(link, 0, sizeof(struct dev_link_t)); - memset(dev, 0, sizeof(struct net_device)); - memset(local, 0, sizeof(ray_dev_t)); /* The io structure describes IO port mapping. None used here */ link->io.NumPorts1 = 0; @@ -379,7 +374,6 @@ link->priv = dev; link->irq.Instance = dev; - dev->priv = local; local->finder = link; local->card_status = CARD_INSERTED; local->authentication_state = UNAUTHENTICATED; @@ -401,7 +395,6 @@ DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n"); SET_MODULE_OWNER(dev); - ether_setup(dev); dev->init = &ray_dev_init; dev->open = &ray_open; dev->stop = &ray_dev_close; @@ -434,8 +427,6 @@ DEBUG(2,"ray_cs ray_attach ending\n"); return link; -fail_alloc_local: - kfree(dev); fail_alloc_dev: kfree(link); return NULL; @@ -478,9 +469,7 @@ if (link->priv) { struct net_device *dev = link->priv; if (link->dev) unregister_netdev(dev); - if (dev->priv) - kfree(dev->priv); - kfree(link->priv); + free_netdev(dev); } kfree(link); DEBUG(2,"ray_cs ray_detach ending\n"); diff -Nru a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c --- a/drivers/net/wireless/strip.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/strip.c Tue Feb 17 20:00:07 2004 @@ -2564,7 +2564,7 @@ strip_info->magic = 0; - kfree(strip_info->dev); + free_netdev(strip_info->dev); } diff -Nru a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c --- a/drivers/net/wireless/wavelan.c Tue Feb 17 20:00:08 2004 +++ b/drivers/net/wireless/wavelan.c Tue Feb 17 20:00:08 2004 @@ -153,7 +153,7 @@ * Disable interrupts on the WaveLAN hardware. * (called by wv_82586_stop()) */ -static inline void wv_ints_off(device * dev) +static inline void wv_ints_off(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -167,7 +167,7 @@ * Enable interrupts on the WaveLAN hardware. * (called by wv_hw_reset()) */ -static inline void wv_ints_on(device * dev) +static inline void wv_ints_on(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -268,7 +268,7 @@ /* * update the checksum field in the Wavelan's PSA */ -static void update_psa_checksum(device * dev, unsigned long ioaddr, u16 hacr) +static void update_psa_checksum(struct net_device * dev, unsigned long ioaddr, u16 hacr) { #ifdef SET_PSA_CRC psa_t psa; @@ -547,7 +547,7 @@ /* * Acknowledge the reading of the status issued by the i82586. */ -static void wv_ack(device * dev) +static void wv_ack(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -589,7 +589,7 @@ * Set channel attention bit and busy wait until command has * completed, then acknowledge completion of the command. */ -static inline int wv_synchronous_cmd(device * dev, const char *str) +static inline int wv_synchronous_cmd(struct net_device * dev, const char *str) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -636,7 +636,7 @@ * Check if done, and if OK. */ static inline int -wv_config_complete(device * dev, unsigned long ioaddr, net_local * lp) +wv_config_complete(struct net_device * dev, unsigned long ioaddr, net_local * lp) { unsigned short mcs_addr; unsigned short status; @@ -703,7 +703,7 @@ * (called in wavelan_interrupt()). * Note : the spinlock is already grabbed for us. */ -static int wv_complete(device * dev, unsigned long ioaddr, net_local * lp) +static int wv_complete(struct net_device * dev, unsigned long ioaddr, net_local * lp) { int nreaped = 0; @@ -845,7 +845,7 @@ * wavelan_interrupt is not an option), so you may experience * delays sometimes. */ -static inline void wv_82586_reconfig(device * dev) +static inline void wv_82586_reconfig(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long flags; @@ -954,7 +954,7 @@ * Print the formatted status of the Modem Management Controller. * This function needs to be completed. */ -static void wv_mmc_show(device * dev) +static void wv_mmc_show(struct net_device * dev) { unsigned long ioaddr = dev->base_addr; net_local *lp = (net_local *) dev->priv; @@ -1137,7 +1137,7 @@ /* * Print the formatted status of the i82586's receive unit. */ -static void wv_ru_show(device * dev) +static void wv_ru_show(struct net_device * dev) { /* net_local *lp = (net_local *) dev->priv; */ @@ -1154,7 +1154,7 @@ /* * Display info about one control block of the i82586 memory. */ -static void wv_cu_show_one(device * dev, net_local * lp, int i, u16 p) +static void wv_cu_show_one(struct net_device * dev, net_local * lp, int i, u16 p) { unsigned long ioaddr; ac_tx_t actx; @@ -1183,7 +1183,7 @@ /* * Print status of the command unit of the i82586. */ -static void wv_cu_show(device * dev) +static void wv_cu_show(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned int i; @@ -1209,7 +1209,7 @@ /* * Print the formatted status of the WaveLAN PCMCIA device driver. */ -static void wv_dev_show(device * dev) +static void wv_dev_show(struct net_device * dev) { printk(KERN_DEBUG "dev:"); printk(" state=%lX,", dev->state); @@ -1223,7 +1223,7 @@ * Print the formatted status of the WaveLAN PCMCIA device driver's * private information. */ -static void wv_local_show(device * dev) +static void wv_local_show(struct net_device * dev) { net_local *lp; @@ -1285,7 +1285,7 @@ * This is the information which is displayed by the driver at startup. * There are lots of flags for configuring it to your liking. */ -static inline void wv_init_info(device * dev) +static inline void wv_init_info(struct net_device * dev) { short ioaddr = dev->base_addr; net_local *lp = (net_local *) dev->priv; @@ -1395,7 +1395,7 @@ * card open or closed. * Used when the user read /proc/net/dev */ -static en_stats *wavelan_get_stats(device * dev) +static en_stats *wavelan_get_stats(struct net_device * dev) { #ifdef DEBUG_IOCTL_TRACE printk(KERN_DEBUG "%s: <>wavelan_get_stats()\n", dev->name); @@ -1412,7 +1412,7 @@ * num_addrs > 0 Multicast mode, receive normal and MC packets, * and do best-effort filtering. */ -static void wavelan_set_multicast_list(device * dev) +static void wavelan_set_multicast_list(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; @@ -1485,7 +1485,7 @@ * (Note : it was a nice way to test the reconfigure stuff...) */ #ifdef SET_MAC_ADDRESS -static int wavelan_set_mac_address(device * dev, void *addr) +static int wavelan_set_mac_address(struct net_device * dev, void *addr) { struct sockaddr *mac = addr; @@ -1724,7 +1724,7 @@ * address with our list, and if they match, get the statistics. * Sorry, but this function really needs the wireless extensions. */ -static inline void wl_spy_gather(device * dev, +static inline void wl_spy_gather(struct net_device * dev, u8 * mac, /* MAC address */ u8 * stats) /* Statistics to gather */ { @@ -1750,7 +1750,7 @@ * With this histogram you may detect if one WaveLAN is really weak, * or you may also calculate the mean and standard deviation of the level. */ -static inline void wl_his_gather(device * dev, u8 * stats) +static inline void wl_his_gather(struct net_device * dev, u8 * stats) { /* Statistics to gather */ net_local *lp = (net_local *) dev->priv; u8 level = stats[0] & MMR_SIGNAL_LVL; @@ -2415,7 +2415,7 @@ * Get wireless statistics. * Called by /proc/net/wireless */ -static iw_stats *wavelan_get_wireless_stats(device * dev) +static iw_stats *wavelan_get_wireless_stats(struct net_device * dev) { unsigned long ioaddr = dev->base_addr; net_local *lp = (net_local *) dev->priv; @@ -2492,7 +2492,7 @@ * (called by wv_packet_rcv()) */ static inline void -wv_packet_read(device * dev, u16 buf_off, int sksize) +wv_packet_read(struct net_device * dev, u16 buf_off, int sksize) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -2587,7 +2587,7 @@ * (called in wavelan_interrupt()). * Note : the spinlock is already grabbed for us. */ -static inline void wv_receive(device * dev) +static inline void wv_receive(struct net_device * dev) { unsigned long ioaddr = dev->base_addr; net_local *lp = (net_local *) dev->priv; @@ -2770,7 +2770,7 @@ * * (called in wavelan_packet_xmit()) */ -static inline int wv_packet_write(device * dev, void *buf, short length) +static inline int wv_packet_write(struct net_device * dev, void *buf, short length) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -2901,7 +2901,7 @@ * the packet. We also prevent reentrance. Then we call the function * to send the packet. */ -static int wavelan_packet_xmit(struct sk_buff *skb, device * dev) +static int wavelan_packet_xmit(struct sk_buff *skb, struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long flags; @@ -2966,7 +2966,7 @@ * Routine to initialize the Modem Management Controller. * (called by wv_hw_reset()) */ -static inline int wv_mmc_init(device * dev) +static inline int wv_mmc_init(struct net_device * dev) { unsigned long ioaddr = dev->base_addr; net_local *lp = (net_local *) dev->priv; @@ -3138,7 +3138,7 @@ * Start the receive unit. * (called by wv_hw_reset()) */ -static inline int wv_ru_start(device * dev) +static inline int wv_ru_start(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3230,7 +3230,7 @@ * * (called by wv_hw_reset()) */ -static inline int wv_cu_start(device * dev) +static inline int wv_cu_start(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3331,7 +3331,7 @@ * * (called by wv_hw_reset()) */ -static inline int wv_82586_start(device * dev) +static inline int wv_82586_start(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3463,7 +3463,7 @@ * * (called by wv_hw_reset(), wv_82586_reconfig(), wavelan_packet_xmit()) */ -static void wv_82586_config(device * dev) +static void wv_82586_config(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3643,7 +3643,7 @@ * WaveLAN controller (i82586). * (called by wavelan_close()) */ -static inline void wv_82586_stop(device * dev) +static inline void wv_82586_stop(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3680,7 +3680,7 @@ * 5. Start the LAN controller's receive unit * (called by wavelan_interrupt(), wavelan_watchdog() & wavelan_open()) */ -static int wv_hw_reset(device * dev) +static int wv_hw_reset(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long ioaddr = dev->base_addr; @@ -3770,7 +3770,7 @@ */ static irqreturn_t wavelan_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - device *dev; + struct net_device *dev; unsigned long ioaddr; net_local *lp; u16 hasr; @@ -3923,7 +3923,7 @@ * kernel. If the transmission completes, this timer is disabled. If * the timer expires, we are called and we try to unlock the hardware. */ -static void wavelan_watchdog(device * dev) +static void wavelan_watchdog(struct net_device * dev) { net_local * lp = (net_local *)dev->priv; u_long ioaddr = dev->base_addr; @@ -4003,7 +4003,7 @@ * Configure and start up the WaveLAN PCMCIA adaptor. * Called by NET3 when it "opens" the device. */ -static int wavelan_open(device * dev) +static int wavelan_open(struct net_device * dev) { net_local * lp = (net_local *)dev->priv; unsigned long flags; @@ -4058,7 +4058,7 @@ * Shut down the WaveLAN ISA card. * Called by NET3 when it "closes" the device. */ -static int wavelan_close(device * dev) +static int wavelan_close(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long flags; @@ -4091,12 +4091,24 @@ * device structure * (called by wavelan_probe() and via init_module()). */ -static int __init wavelan_config(device * dev) +static int __init wavelan_config(struct net_device *dev, unsigned short ioaddr) { - unsigned long ioaddr = dev->base_addr; u8 irq_mask; int irq; net_local *lp; + mac_addr mac; + int err; + + if (!request_region(ioaddr, sizeof(ha_t), "wavelan")) + return -EADDRINUSE; + + err = wv_check_ioaddr(ioaddr, mac); + if (err) + goto out; + + memcpy(dev->dev_addr, mac, 6); + + dev->base_addr = ioaddr; #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "%s: ->wavelan_config(dev=0x%x, ioaddr=0x%lx)\n", @@ -4136,25 +4148,18 @@ "%s: wavelan_config(): could not wavelan_map_irq(%d).\n", dev->name, irq_mask); #endif - return -EAGAIN; + err = -EAGAIN; + goto out; } dev->irq = irq; - if (!request_region(ioaddr, sizeof(ha_t), "wavelan")) - return -EBUSY; - dev->mem_start = 0x0000; dev->mem_end = 0x0000; dev->if_port = 0; /* Initialize device structures */ - dev->priv = kmalloc(sizeof(net_local), GFP_KERNEL); - if (dev->priv == NULL) { - release_region(ioaddr, sizeof(ha_t)); - return -ENOMEM; - } - memset(dev->priv, 0x00, sizeof(net_local)); + memset(dev->priv, 0, sizeof(net_local)); lp = (net_local *) dev->priv; /* Back link to the device structure. */ @@ -4172,12 +4177,6 @@ /* Init spinlock */ spin_lock_init(&lp->spinlock); - /* - * Fill in the fields of the device structure - * with generic Ethernet values. - */ - ether_setup(dev); - SET_MODULE_OWNER(dev); dev->open = wavelan_open; dev->stop = wavelan_close; @@ -4204,6 +4203,9 @@ printk(KERN_DEBUG "%s: <-wavelan_config()\n", dev->name); #endif return 0; +out: + release_region(ioaddr, sizeof(ha_t)); + return err; } /*------------------------------------------------------------------*/ @@ -4214,19 +4216,13 @@ * We follow the example in drivers/net/ne.c. * (called in "Space.c") */ -int __init wavelan_probe(device * dev) +struct net_device * __init wavelan_probe(int unit) { + struct net_device *dev; short base_addr; - mac_addr mac; /* MAC address (check existence of WaveLAN) */ + int def_irq; int i; - int r; - -#ifdef DEBUG_CALLBACK_TRACE - printk(KERN_DEBUG - "%s: ->wavelan_probe(dev=0x%x (base_addr=0x%x))\n", - dev->name, (unsigned int) dev, - (unsigned int) dev->base_addr); -#endif + int r = 0; #ifdef STRUCT_CHECK if (wv_struct_check() != (char *) NULL) { @@ -4237,8 +4233,20 @@ } #endif /* STRUCT_CHECK */ - /* Check the value of the command line parameter for base address. */ + dev = alloc_etherdev(sizeof(net_local)); + if (!dev) + return ERR_PTR(-ENOMEM); + + sprintf(dev->name, "eth%d", unit); + netdev_boot_setup_check(dev); base_addr = dev->base_addr; + def_irq = dev->irq; + +#ifdef DEBUG_CALLBACK_TRACE + printk(KERN_DEBUG + "%s: ->wavelan_probe(dev=%p (base_addr=0x%x))\n", + dev->name, dev, (unsigned int) dev->base_addr); +#endif /* Don't probe at all. */ if (base_addr < 0) { @@ -4247,16 +4255,9 @@ "%s: wavelan_probe(): invalid base address\n", dev->name); #endif - return -ENXIO; - } - - /* Check a single specified location. */ - if (base_addr > 0x100) { - /* Check if there is something at this base address */ - if ((r = wv_check_ioaddr(base_addr, mac)) == 0) { - memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */ - r = wavelan_config(dev); - } + r = -ENXIO; + } else if (base_addr > 0x100) { /* Check a single specified location. */ + r = wavelan_config(dev, base_addr); #ifdef DEBUG_CONFIG_INFO if (r != 0) printk(KERN_DEBUG @@ -4267,35 +4268,33 @@ #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "%s: <-wavelan_probe()\n", dev->name); #endif - return r; - } - - /* Scan all possible addresses of the WaveLAN hardware. */ - for (i = 0; i < NELS(iobase); i++) { - /* Check whether there is something at this base address. */ - if (wv_check_ioaddr(iobase[i], mac) == 0) { - dev->base_addr = iobase[i]; /* Copy base address. */ - memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */ - if (wavelan_config(dev) == 0) { + } else { /* Scan all possible addresses of the WaveLAN hardware. */ + for (i = 0; i < NELS(iobase); i++) { + dev->irq = def_irq; + if (wavelan_config(dev, iobase[i]) == 0) { #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "%s: <-wavelan_probe()\n", dev->name); #endif - return 0; + break; } } + if (i == NELS(iobase)) + r = -ENODEV; } - - /* We may have touched base_addr. Another driver may not like it. */ - dev->base_addr = base_addr; - -#ifdef DEBUG_CONFIG_INFO - printk(KERN_DEBUG "%s: wavelan_probe(): no device found\n", - dev->name); -#endif - - return -ENODEV; + if (r) + goto out; + r = register_netdev(dev); + if (r) + goto out1; + return dev; +out1: + release_region(dev->base_addr, sizeof(ha_t)); + wavelan_list = wavelan_list->next; +out: + free_netdev(dev); + return ERR_PTR(r); } /****************************** MODULE ******************************/ @@ -4311,7 +4310,6 @@ */ int init_module(void) { - mac_addr mac; /* MAC address (check WaveLAN existence) */ int ret = -EIO; /* Return error if no cards found */ int i; @@ -4337,38 +4335,28 @@ /* Loop on all possible base addresses. */ i = -1; while ((io[++i] != 0) && (i < NELS(io))) { - /* Check if there is something at this base address. */ - if (wv_check_ioaddr(io[i], mac) == 0) { - device *dev; - - /* Create device and set basic arguments. */ - dev = - kmalloc(sizeof(struct net_device), GFP_KERNEL); - if (dev == NULL) { - ret = -ENOMEM; - break; - } - memset(dev, 0x00, sizeof(struct net_device)); - memcpy(dev->name, name[i], IFNAMSIZ); /* Copy name */ - dev->base_addr = io[i]; - dev->irq = irq[i]; - dev->init = &wavelan_config; - memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */ + struct net_device *dev = alloc_etherdev(sizeof(net_local)); + if (!dev) + break; + memcpy(dev->name, name[i], IFNAMSIZ); /* Copy name */ + dev->base_addr = io[i]; + dev->irq = irq[i]; - /* Try to create the device. */ + /* Check if there is something at this base address. */ + if (wavelan_config(dev, io[i]) == 0) { if (register_netdev(dev) != 0) { - /* Deallocate everything. */ - /* Note: if dev->priv is mallocated, there is no way to fail. */ - kfree(dev); + release_region(dev->base_addr, sizeof(ha_t)); + wavelan_list = wavelan_list->next; } else { - /* If at least one device OK, we do not fail */ ret = 0; + continue; } - } /* if there is something at the address */ - } /* Loop on all addresses. */ + } + free_netdev(dev); + } #ifdef DEBUG_CONFIG_ERROR - if (wavelan_list == (net_local *) NULL) + if (!wavelan_list) printk(KERN_WARNING "WaveLAN init_module(): no device found\n"); #endif @@ -4390,26 +4378,19 @@ #endif /* Loop on all devices and release them. */ - while (wavelan_list != (net_local *) NULL) { - device *dev = wavelan_list->dev; + while (wavelan_list) { + struct net_device *dev = wavelan_list->dev; #ifdef DEBUG_CONFIG_INFO printk(KERN_DEBUG "%s: cleanup_module(): removing device at 0x%x\n", dev->name, (unsigned int) dev); #endif - - /* Release the ioport region. */ - release_region(dev->base_addr, sizeof(ha_t)); - - /* Definitely remove the device. */ unregister_netdev(dev); - /* Unlink the device. */ + release_region(dev->base_addr, sizeof(ha_t)); wavelan_list = wavelan_list->next; - /* Free pieces. */ - kfree(dev->priv); free_netdev(dev); } diff -Nru a/drivers/net/wireless/wavelan.p.h b/drivers/net/wireless/wavelan.p.h --- a/drivers/net/wireless/wavelan.p.h Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/wavelan.p.h Tue Feb 17 20:00:07 2004 @@ -469,7 +469,6 @@ /****************************** TYPES ******************************/ /* Shortcuts */ -typedef struct net_device device; typedef struct net_device_stats en_stats; typedef struct iw_statistics iw_stats; typedef struct iw_quality iw_qual; @@ -492,7 +491,7 @@ struct net_local { net_local * next; /* linked list of the devices */ - device * dev; /* reverse link */ + struct net_device * dev; /* reverse link */ spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ en_stats stats; /* Ethernet interface statistics */ int nresets; /* number of hardware resets */ @@ -542,8 +541,8 @@ u_short), /* hacr */ wv_16_on(u_long, /* ioaddr */ u_short), /* hacr */ - wv_ints_off(device *), - wv_ints_on(device *); + wv_ints_off(struct net_device *), + wv_ints_on(struct net_device *); /* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */ static void psa_read(u_long, /* Read the Parameter Storage Area. */ @@ -592,57 +591,57 @@ u_char *, /* b */ int); /* n */ static void - wv_ack(device *); + wv_ack(struct net_device *); static inline int - wv_synchronous_cmd(device *, + wv_synchronous_cmd(struct net_device *, const char *), - wv_config_complete(device *, + wv_config_complete(struct net_device *, u_long, net_local *); static int - wv_complete(device *, + wv_complete(struct net_device *, u_long, net_local *); static inline void - wv_82586_reconfig(device *); + wv_82586_reconfig(struct net_device *); /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */ #ifdef DEBUG_I82586_SHOW static void wv_scb_show(unsigned short); #endif static inline void - wv_init_info(device *); /* display startup info */ + wv_init_info(struct net_device *); /* display startup info */ /* ------------------- IOCTL, STATS & RECONFIG ------------------- */ static en_stats * - wavelan_get_stats(device *); /* Give stats /proc/net/dev */ + wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */ static void - wavelan_set_multicast_list(device *); + wavelan_set_multicast_list(struct net_device *); /* ----------------------- PACKET RECEPTION ----------------------- */ static inline void - wv_packet_read(device *, /* Read a packet from a frame. */ + wv_packet_read(struct net_device *, /* Read a packet from a frame. */ u_short, int), - wv_receive(device *); /* Read all packets waiting. */ + wv_receive(struct net_device *); /* Read all packets waiting. */ /* --------------------- PACKET TRANSMISSION --------------------- */ static inline int - wv_packet_write(device *, /* Write a packet to the Tx buffer. */ + wv_packet_write(struct net_device *, /* Write a packet to the Tx buffer. */ void *, short); static int wavelan_packet_xmit(struct sk_buff *, /* Send a packet. */ - device *); + struct net_device *); /* -------------------- HARDWARE CONFIGURATION -------------------- */ static inline int - wv_mmc_init(device *), /* Initialize the modem. */ - wv_ru_start(device *), /* Start the i82586 receiver unit. */ - wv_cu_start(device *), /* Start the i82586 command unit. */ - wv_82586_start(device *); /* Start the i82586. */ + wv_mmc_init(struct net_device *), /* Initialize the modem. */ + wv_ru_start(struct net_device *), /* Start the i82586 receiver unit. */ + wv_cu_start(struct net_device *), /* Start the i82586 command unit. */ + wv_82586_start(struct net_device *); /* Start the i82586. */ static void - wv_82586_config(device *); /* Configure the i82586. */ + wv_82586_config(struct net_device *); /* Configure the i82586. */ static inline void - wv_82586_stop(device *); + wv_82586_stop(struct net_device *); static int - wv_hw_reset(device *), /* Reset the WaveLAN hardware. */ + wv_hw_reset(struct net_device *), /* Reset the WaveLAN hardware. */ wv_check_ioaddr(u_long, /* ioaddr */ u_char *); /* mac address (read) */ /* ---------------------- INTERRUPT HANDLING ---------------------- */ @@ -651,14 +650,13 @@ void *, struct pt_regs *); static void - wavelan_watchdog(device *); /* transmission watchdog */ + wavelan_watchdog(struct net_device *); /* transmission watchdog */ /* ------------------- CONFIGURATION CALLBACKS ------------------- */ static int - wavelan_open(device *), /* Open the device. */ - wavelan_close(device *), /* Close the device. */ - wavelan_config(device *); /* Configure one device. */ -extern int - wavelan_probe(device *); /* See Space.c. */ + wavelan_open(struct net_device *), /* Open the device. */ + wavelan_close(struct net_device *), /* Close the device. */ + wavelan_config(struct net_device *, unsigned short);/* Configure one device. */ +extern struct net_device *wavelan_probe(int unit); /* See Space.c. */ /**************************** VARIABLES ****************************/ diff -Nru a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c --- a/drivers/net/wireless/wavelan_cs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/wireless/wavelan_cs.c Tue Feb 17 20:00:07 2004 @@ -131,7 +131,7 @@ * Read the Parameter Storage Area from the WaveLAN card's memory */ static void -psa_read(device * dev, +psa_read(struct net_device * dev, int o, /* offset in PSA */ u_char * b, /* buffer to fill */ int n) /* size to read */ @@ -155,7 +155,7 @@ * Write the Paramter Storage Area to the WaveLAN card's memory */ static void -psa_write(device * dev, +psa_write(struct net_device * dev, int o, /* Offset in psa */ u_char * b, /* Buffer in memory */ int n) /* Length of buffer */ @@ -229,7 +229,7 @@ * update the checksum field in the Wavelan's PSA */ static void -update_psa_checksum(device * dev) +update_psa_checksum(struct net_device * dev) { #ifdef SET_PSA_CRC psa_t psa; @@ -753,7 +753,7 @@ } /* Called when a WavePoint beacon is received */ -static inline void wl_roam_gather(device * dev, +static inline void wl_roam_gather(struct net_device * dev, u_char * hdr, /* Beacon header */ u_char * stats) /* SNR, Signal quality of packet */ @@ -831,7 +831,7 @@ * wv_82593_config() & wv_diag()) */ static int -wv_82593_cmd(device * dev, +wv_82593_cmd(struct net_device * dev, char * str, int cmd, int result) @@ -942,7 +942,7 @@ * status for the WaveLAN. */ static inline int -wv_diag(device * dev) +wv_diag(struct net_device * dev) { int ret = FALSE; @@ -963,7 +963,7 @@ * The return value is the address to use for next the call. */ static int -read_ringbuf(device * dev, +read_ringbuf(struct net_device * dev, int addr, char * buf, int len) @@ -1004,10 +1004,10 @@ * some delay sometime... */ static inline void -wv_82593_reconfig(device * dev) +wv_82593_reconfig(struct net_device * dev) { net_local * lp = (net_local *)dev->priv; - dev_link_t * link = ((net_local *) dev->priv)->link; + dev_link_t * link = lp->link; unsigned long flags; /* Arm the flag, will be cleard in wv_82593_config() */ @@ -1132,7 +1132,7 @@ * This function need to be completed... */ static void -wv_mmc_show(device * dev) +wv_mmc_show(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *)dev->priv; @@ -1222,7 +1222,7 @@ * Print the formatted status of the i82593's receive unit. */ static void -wv_ru_show(device * dev) +wv_ru_show(struct net_device * dev) { net_local *lp = (net_local *) dev->priv; @@ -1241,7 +1241,7 @@ * Print the formatted status of the WaveLAN PCMCIA device driver. */ static void -wv_dev_show(device * dev) +wv_dev_show(struct net_device * dev) { printk(KERN_DEBUG "dev:"); printk(" state=%lX,", dev->state); @@ -1256,7 +1256,7 @@ * private information. */ static void -wv_local_show(device * dev) +wv_local_show(struct net_device * dev) { net_local *lp; @@ -1314,7 +1314,7 @@ * There is a lot of flag to configure it at your will... */ static inline void -wv_init_info(device * dev) +wv_init_info(struct net_device * dev) { ioaddr_t base = dev->base_addr; psa_t psa; @@ -1412,7 +1412,7 @@ * Used when the user read /proc/net/dev */ static en_stats * -wavelan_get_stats(device * dev) +wavelan_get_stats(struct net_device * dev) { #ifdef DEBUG_IOCTL_TRACE printk(KERN_DEBUG "%s: <>wavelan_get_stats()\n", dev->name); @@ -1431,7 +1431,7 @@ */ static void -wavelan_set_multicast_list(device * dev) +wavelan_set_multicast_list(struct net_device * dev) { net_local * lp = (net_local *) dev->priv; @@ -1529,7 +1529,7 @@ */ #ifdef SET_MAC_ADDRESS static int -wavelan_set_mac_address(device * dev, +wavelan_set_mac_address(struct net_device * dev, void * addr) { struct sockaddr * mac = addr; @@ -1796,7 +1796,7 @@ * Sorry, but this function really need wireless extensions... */ static inline void -wl_spy_gather(device * dev, +wl_spy_gather(struct net_device * dev, u_char * mac, /* MAC address */ u_char * stats) /* Statistics to gather */ { @@ -1823,7 +1823,7 @@ * or you may also calculate the mean and standard deviation of the level... */ static inline void -wl_his_gather(device * dev, +wl_his_gather(struct net_device * dev, u_char * stats) /* Statistics to gather */ { net_local * lp = (net_local *) dev->priv; @@ -2785,7 +2785,7 @@ * Called by /proc/net/wireless... */ static iw_stats * -wavelan_get_wireless_stats(device * dev) +wavelan_get_wireless_stats(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *) dev->priv; @@ -2847,7 +2847,7 @@ * (called by wv_packet_rcv()) */ static inline int -wv_start_of_frame(device * dev, +wv_start_of_frame(struct net_device * dev, int rfp, /* end of frame */ int wrap) /* start of buffer */ { @@ -2909,7 +2909,7 @@ * (called by wv_packet_rcv()) */ static inline void -wv_packet_read(device * dev, +wv_packet_read(struct net_device * dev, int fd_p, int sksize) { @@ -3012,7 +3012,7 @@ * Note : the spinlock is already grabbed for us and irq are disabled. */ static inline void -wv_packet_rcv(device * dev) +wv_packet_rcv(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *) dev->priv; @@ -3146,7 +3146,7 @@ * (called in wavelan_packet_xmit()) */ static inline void -wv_packet_write(device * dev, +wv_packet_write(struct net_device * dev, void * buf, short length) { @@ -3209,7 +3209,7 @@ */ static int wavelan_packet_xmit(struct sk_buff * skb, - device * dev) + struct net_device * dev) { net_local * lp = (net_local *)dev->priv; unsigned long flags; @@ -3273,7 +3273,7 @@ * (called by wv_hw_config()) */ static inline int -wv_mmc_init(device * dev) +wv_mmc_init(struct net_device * dev) { ioaddr_t base = dev->base_addr; psa_t psa; @@ -3467,7 +3467,7 @@ * (called in wv_ru_start() and wavelan_close() and wavelan_event()) */ static int -wv_ru_stop(device * dev) +wv_ru_stop(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *) dev->priv; @@ -3530,7 +3530,7 @@ * (called in wv_hw_reset() & wavelan_open()) */ static int -wv_ru_start(device * dev) +wv_ru_start(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *) dev->priv; @@ -3618,7 +3618,7 @@ * (called by wv_hw_config(), wv_82593_reconfig() & wavelan_packet_xmit()) */ static int -wv_82593_config(device * dev) +wv_82593_config(struct net_device * dev) { ioaddr_t base = dev->base_addr; net_local * lp = (net_local *) dev->priv; @@ -3792,7 +3792,7 @@ * (called by wv_config()) */ static inline int -wv_pcmcia_reset(device * dev) +wv_pcmcia_reset(struct net_device * dev) { int i; conf_reg_t reg = { 0, CS_READ, CISREG_COR, 0 }; @@ -3854,7 +3854,7 @@ * (called by wavelan_event() & wv_hw_reset()) */ static int -wv_hw_config(device * dev) +wv_hw_config(struct net_device * dev) { net_local * lp = (net_local *) dev->priv; ioaddr_t base = dev->base_addr; @@ -3961,7 +3961,7 @@ * (called by wavelan_event(), wavelan_watchdog() and wavelan_open()) */ static inline void -wv_hw_reset(device * dev) +wv_hw_reset(struct net_device * dev) { net_local * lp = (net_local *) dev->priv; @@ -4004,7 +4004,7 @@ memreq_t mem; handle = link->handle; - dev = (device *) link->priv; + dev = (struct net_device *) link->priv; #ifdef DEBUG_CONFIG_TRACE printk(KERN_DEBUG "->wv_pcmcia_config(0x%p)\n", link); @@ -4149,7 +4149,7 @@ static void wv_pcmcia_release(dev_link_t *link) { - device * dev = (device *) link->priv; + struct net_device * dev = (struct net_device *) link->priv; #ifdef DEBUG_CONFIG_TRACE printk(KERN_DEBUG "%s: -> wv_pcmcia_release(0x%p)\n", dev->name, link); @@ -4199,13 +4199,13 @@ void * dev_id, struct pt_regs * regs) { - device * dev; + struct net_device * dev; net_local * lp; ioaddr_t base; int status0; u_int tx_status; - if((dev = (device *)dev_id) == (device *) NULL) + if ((dev = dev_id) == NULL) { #ifdef DEBUG_INTERRUPT_ERROR printk(KERN_WARNING "wavelan_interrupt(): irq %d for unknown device.\n", @@ -4466,7 +4466,7 @@ * deal with the multiple Tx buffers... */ static void -wavelan_watchdog(device * dev) +wavelan_watchdog(struct net_device * dev) { net_local * lp = (net_local *) dev->priv; ioaddr_t base = dev->base_addr; @@ -4541,7 +4541,7 @@ * Called by NET3 when it "open" the device. */ static int -wavelan_open(device * dev) +wavelan_open(struct net_device * dev) { dev_link_t * link = ((net_local *) dev->priv)->link; net_local * lp = (net_local *)dev->priv; @@ -4596,7 +4596,7 @@ * Called by NET3 when it "close" the device. */ static int -wavelan_close(device * dev) +wavelan_close(struct net_device * dev) { dev_link_t * link = ((net_local *) dev->priv)->link; ioaddr_t base = dev->base_addr; @@ -4660,7 +4660,7 @@ { client_reg_t client_reg; /* Register with cardmgr */ dev_link_t * link; /* Info for cardmgr */ - device * dev; /* Interface generic data */ + struct net_device * dev; /* Interface generic data */ net_local * lp; /* Interface specific data */ int i, ret; @@ -4698,22 +4698,14 @@ dev_list = link; /* Allocate the generic data structure */ - dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + dev = alloc_etherdev(sizeof(net_local)); if (!dev) { kfree(link); return NULL; } - memset(dev, 0x00, sizeof(struct net_device)); link->priv = link->irq.Instance = dev; - /* Allocate the wavelan-specific data structure. */ - dev->priv = lp = (net_local *) kmalloc(sizeof(net_local), GFP_KERNEL); - if (!lp) { - kfree(link); - kfree(dev); - return NULL; - } - memset(lp, 0x00, sizeof(net_local)); + lp = dev->priv; /* Init specific data */ lp->configured = 0; @@ -4731,9 +4723,6 @@ lp->link = link; lp->dev = dev; - /* Standard setup for generic data */ - ether_setup(dev); - /* wavelan NET3 callbacks */ SET_MODULE_OWNER(dev); dev->open = &wavelan_open; @@ -4851,22 +4840,16 @@ /* Free pieces */ if(link->priv) { - device * dev = (device *) link->priv; + struct net_device * dev = (struct net_device *) link->priv; /* Remove ourselves from the kernel list of ethernet devices */ /* Warning : can't be called from interrupt, timer or wavelan_close() */ - if(link->dev != NULL) + if (link->dev) unregister_netdev(dev); link->dev = NULL; - - if(dev->priv) - { - /* Sound strange, but safe... */ - ((net_local *) dev->priv)->link = (dev_link_t *) NULL; - ((net_local *) dev->priv)->dev = (device *) NULL; - kfree(dev->priv); - } - kfree(link->priv); + ((net_local *) dev->priv)->link = NULL; + ((net_local *) dev->priv)->dev = NULL; + free_netdev(dev); } kfree(link); @@ -4888,7 +4871,7 @@ event_callback_args_t * args) { dev_link_t * link = (dev_link_t *) args->client_data; - device * dev = (device *) link->priv; + struct net_device * dev = (struct net_device *) link->priv; #ifdef DEBUG_CALLBACK_TRACE printk(KERN_DEBUG "->wavelan_event(): %s\n", diff -Nru a/drivers/net/wireless/wavelan_cs.p.h b/drivers/net/wireless/wavelan_cs.p.h --- a/drivers/net/wireless/wavelan_cs.p.h Tue Feb 17 20:00:08 2004 +++ b/drivers/net/wireless/wavelan_cs.p.h Tue Feb 17 20:00:08 2004 @@ -588,7 +588,6 @@ /****************************** TYPES ******************************/ /* Shortcuts */ -typedef struct net_device device; typedef struct net_device_stats en_stats; typedef struct iw_statistics iw_stats; typedef struct iw_quality iw_qual; @@ -611,7 +610,7 @@ struct net_local { dev_node_t node; /* ???? What is this stuff ???? */ - device * dev; /* Reverse link... */ + struct net_device * dev; /* Reverse link... */ spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ dev_link_t * link; /* pcmcia structure */ en_stats stats; /* Ethernet interface statistics */ @@ -673,11 +672,11 @@ hacr_write_slow(u_long, u_char); static void - psa_read(device *, /* Read the Parameter Storage Area */ + psa_read(struct net_device *, /* Read the Parameter Storage Area */ int, /* offset in PSA */ u_char *, /* buffer to fill */ int), /* size to read */ - psa_write(device *, /* Write to the PSA */ + psa_write(struct net_device *, /* Write to the PSA */ int, /* Offset in psa */ u_char *, /* Buffer in memory */ int); /* Length of buffer */ @@ -707,57 +706,57 @@ int); /* number of registers */ /* ---------------------- I82593 SUBROUTINES ----------------------- */ static int - wv_82593_cmd(device *, /* synchronously send a command to i82593 */ + wv_82593_cmd(struct net_device *, /* synchronously send a command to i82593 */ char *, int, int); static inline int - wv_diag(device *); /* Diagnostique the i82593 */ + wv_diag(struct net_device *); /* Diagnostique the i82593 */ static int - read_ringbuf(device *, /* Read a receive buffer */ + read_ringbuf(struct net_device *, /* Read a receive buffer */ int, char *, int); static inline void - wv_82593_reconfig(device *); /* Reconfigure the controller */ + wv_82593_reconfig(struct net_device *); /* Reconfigure the controller */ /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */ static inline void - wv_init_info(device *); /* display startup info */ + wv_init_info(struct net_device *); /* display startup info */ /* ------------------- IOCTL, STATS & RECONFIG ------------------- */ static en_stats * - wavelan_get_stats(device *); /* Give stats /proc/net/dev */ + wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */ /* ----------------------- PACKET RECEPTION ----------------------- */ static inline int - wv_start_of_frame(device *, /* Seek beggining of current frame */ + wv_start_of_frame(struct net_device *, /* Seek beggining of current frame */ int, /* end of frame */ int); /* start of buffer */ static inline void - wv_packet_read(device *, /* Read a packet from a frame */ + wv_packet_read(struct net_device *, /* Read a packet from a frame */ int, int), - wv_packet_rcv(device *); /* Read all packets waiting */ + wv_packet_rcv(struct net_device *); /* Read all packets waiting */ /* --------------------- PACKET TRANSMISSION --------------------- */ static inline void - wv_packet_write(device *, /* Write a packet to the Tx buffer */ + wv_packet_write(struct net_device *, /* Write a packet to the Tx buffer */ void *, short); static int wavelan_packet_xmit(struct sk_buff *, /* Send a packet */ - device *); + struct net_device *); /* -------------------- HARDWARE CONFIGURATION -------------------- */ static inline int - wv_mmc_init(device *); /* Initialize the modem */ + wv_mmc_init(struct net_device *); /* Initialize the modem */ static int - wv_ru_stop(device *), /* Stop the i82593 receiver unit */ - wv_ru_start(device *); /* Start the i82593 receiver unit */ + wv_ru_stop(struct net_device *), /* Stop the i82593 receiver unit */ + wv_ru_start(struct net_device *); /* Start the i82593 receiver unit */ static int - wv_82593_config(device *); /* Configure the i82593 */ + wv_82593_config(struct net_device *); /* Configure the i82593 */ static inline int - wv_pcmcia_reset(device *); /* Reset the pcmcia interface */ + wv_pcmcia_reset(struct net_device *); /* Reset the pcmcia interface */ static int - wv_hw_config(device *); /* Reset & configure the whole hardware */ + wv_hw_config(struct net_device *); /* Reset & configure the whole hardware */ static inline void - wv_hw_reset(device *); /* Same, + start receiver unit */ + wv_hw_reset(struct net_device *); /* Same, + start receiver unit */ static inline int wv_pcmcia_config(dev_link_t *); /* Configure the pcmcia interface */ static void @@ -768,11 +767,11 @@ void *, struct pt_regs *); static void - wavelan_watchdog(device *); /* Transmission watchdog */ + wavelan_watchdog(struct net_device *); /* Transmission watchdog */ /* ------------------- CONFIGURATION CALLBACKS ------------------- */ static int - wavelan_open(device *), /* Open the device */ - wavelan_close(device *); /* Close the device */ + wavelan_open(struct net_device *), /* Open the device */ + wavelan_close(struct net_device *); /* Close the device */ static dev_link_t * wavelan_attach(void); /* Create a new device */ static void diff -Nru a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c --- a/drivers/net/wireless/wl3501_cs.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/wireless/wl3501_cs.c Tue Feb 17 20:00:05 2004 @@ -1449,18 +1449,6 @@ goto out; } -/** - * wl3501_init - "initialize" board - * @dev - network device - * - * We never need to do anything when a wl3501 device is "initialized" by the net - * software, because we only register already-found cards. - */ -static int wl3501_init(struct net_device *dev) -{ - return 0; -} - struct net_device_stats *wl3501_get_stats(struct net_device *dev) { struct wl3501_card *this = dev->priv; @@ -2056,7 +2044,6 @@ dev = alloc_etherdev(sizeof(struct wl3501_card)); if (!dev) goto out_link; - dev->init = wl3501_init; dev->open = wl3501_open; dev->stop = wl3501_close; dev->hard_start_xmit = wl3501_hard_start_xmit; diff -Nru a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c --- a/drivers/net/yellowfin.c Tue Feb 17 20:00:06 2004 +++ b/drivers/net/yellowfin.c Tue Feb 17 20:00:06 2004 @@ -1286,7 +1286,8 @@ #if defined(__i386__) if (yellowfin_debug > 2) { - printk("\n"KERN_DEBUG" Tx ring at %8.8x:\n", yp->tx_ring_dma); + printk("\n"KERN_DEBUG" Tx ring at %8.8llx:\n", + (unsigned long long)yp->tx_ring_dma); for (i = 0; i < TX_RING_SIZE*2; i++) printk(" %c #%d desc. %8.8x %8.8x %8.8x %8.8x.\n", inl(ioaddr + TxPtr) == (long)&yp->tx_ring[i] ? '>' : ' ', @@ -1298,7 +1299,8 @@ i, yp->tx_status[i].tx_cnt, yp->tx_status[i].tx_errs, yp->tx_status[i].total_tx_cnt, yp->tx_status[i].paused); - printk("\n"KERN_DEBUG " Rx ring %8.8x:\n", yp->rx_ring_dma); + printk("\n"KERN_DEBUG " Rx ring %8.8llx:\n", + (unsigned long long)yp->rx_ring_dma); for (i = 0; i < RX_RING_SIZE; i++) { printk(KERN_DEBUG " %c #%d desc. %8.8x %8.8x %8.8x\n", inl(ioaddr + RxPtr) == (long)&yp->rx_ring[i] ? '>' : ' ', diff -Nru a/drivers/net/znet.c b/drivers/net/znet.c --- a/drivers/net/znet.c Tue Feb 17 20:00:05 2004 +++ b/drivers/net/znet.c Tue Feb 17 20:00:05 2004 @@ -372,10 +372,8 @@ struct znet_private *znet; struct net_device *dev; char *p; + int err = -ENOMEM; - if (znet_dev) /* Only look for a single adaptor */ - return -ENODEV; - /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */ for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++) if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0) @@ -387,12 +385,14 @@ return -ENODEV; } - if (!(znet_dev = dev = init_etherdev(0, sizeof(struct znet_private)))) - return -ENOMEM; + dev = alloc_etherdev(sizeof(struct znet_private)); + if (!dev) + return -ENOMEM; + + SET_MODULE_OWNER (dev); znet = dev->priv; - SET_MODULE_OWNER (dev); netinfo = (struct netidblk *)p; dev->base_addr = netinfo->iobase1; dev->irq = netinfo->irq1; @@ -430,7 +430,7 @@ znet->io_size = 2; if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) - goto free_netdev; + goto free_dev; if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) goto free_rx; @@ -452,19 +452,19 @@ dev->set_multicast_list = &znet_set_multicast_list; dev->tx_timeout = znet_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - + err = register_netdev(dev); + if (err) + goto free_tx; + znet_dev = dev; return 0; free_tx: - kfree (znet->tx_start); + kfree(znet->tx_start); free_rx: - kfree (znet->rx_start); - free_netdev: - unregister_netdev (dev); - kfree (dev); - znet_dev = NULL; - - return -ENOMEM; + kfree(znet->rx_start); + free_dev: + free_netdev(dev); + return err; } @@ -934,16 +934,14 @@ static __exit void znet_cleanup (void) { -#ifdef MODULE if (znet_dev) { struct znet_private *znet = znet_dev->priv; + unregister_netdev (znet_dev); kfree (znet->rx_start); kfree (znet->tx_start); - unregister_netdev (znet_dev); free_netdev (znet_dev); } -#endif } module_init (znet_probe); diff -Nru a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c --- a/drivers/net/zorro8390.c Tue Feb 17 20:00:07 2004 +++ b/drivers/net/zorro8390.c Tue Feb 17 20:00:07 2004 @@ -103,18 +103,18 @@ continue; board = z->resource.start; ioaddr = board+cards[i].offset; - dev = init_etherdev(0, 0); - SET_MODULE_OWNER(dev); + dev = alloc_ei_netdev(); if (!dev) return -ENOMEM; + SET_MODULE_OWNER(dev); if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, dev->name)) { - kfree(dev); + free_netdev(dev); continue; } if ((err = zorro8390_init(dev, board, cards[i].name, ZTWO_VADDR(ioaddr)))) { release_mem_region(ioaddr, NE_IO_EXTENT*2); - kfree(dev); + free_netdev(dev); return err; } err = 0; @@ -129,6 +129,7 @@ const char *name, unsigned long ioaddr) { int i; + int err; unsigned char SA_prom[32]; int start_page, stop_page; static u32 zorro8390_offsets[16] = { @@ -195,12 +196,6 @@ i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk("Unable to get memory for dev->priv.\n"); - return -ENOMEM; - } - for(i = 0; i < ETHER_ADDR_LEN; i++) { #ifdef DEBUG printk(" %2.2x", SA_prom[i]); @@ -232,7 +227,10 @@ root_zorro8390_dev = dev; #endif NS8390_init(dev, 0); - return 0; + err = register_netdev(dev); + if (err) + free_irq(IRQ_AMIGA_PORTS, dev); + return err; } static int zorro8390_open(struct net_device *dev) diff -Nru a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c --- a/drivers/oprofile/cpu_buffer.c Tue Feb 17 20:00:05 2004 +++ b/drivers/oprofile/cpu_buffer.c Tue Feb 17 20:00:05 2004 @@ -86,9 +86,9 @@ unsigned long tail = b->tail_pos; if (tail > head) - return tail - head; + return (tail - head) - 1; - return tail + (b->buffer_size - head); + return tail + (b->buffer_size - head) - 1; } diff -Nru a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig --- a/drivers/parisc/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/parisc/Kconfig Tue Feb 17 20:00:07 2004 @@ -106,6 +106,9 @@ #config PCI_EPIC # bool "EPIC/SAGA PCI support" # depends on PCI +# default y +# help +# Say Y here for V-class PCI, DMA/IOMMU, IRQ subsystem support. config SUPERIO bool "SuperIO (SuckyIO) support" diff -Nru a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c --- a/drivers/parisc/ccio-dma.c Tue Feb 17 20:00:06 2004 +++ b/drivers/parisc/ccio-dma.c Tue Feb 17 20:00:06 2004 @@ -364,11 +364,11 @@ CCIO_FIND_FREE_MAPPING(ioc, res_idx, mask, 64); #endif } else { - panic(__FILE__ ": %s() Too many pages to map. pages_needed: %ld\n", - __FUNCTION__, pages_needed); + panic("%s: %s() Too many pages to map. pages_needed: %ld\n", + __FILE__, __FUNCTION__, pages_needed); } - panic(__FILE__ ": %s() I/O MMU is out of mapping resources.\n", + panic("%s: %s() I/O MMU is out of mapping resources.\n", __FILE__, __FUNCTION__); resource_found: @@ -441,7 +441,7 @@ CCIO_FREE_MAPPINGS(ioc, res_idx, mask, 64); #endif } else { - panic(__FILE__ ":%s() Too many pages to unmap.\n", + panic("%s:%s() Too many pages to unmap.\n", __FILE__, __FUNCTION__); } } @@ -1447,7 +1447,8 @@ ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL, get_order(ioc->pdir_size)); if(NULL == ioc->pdir_base) { - panic(__FILE__ ":%s() could not allocate I/O Page Table\n", __FUNCTION__); + panic("%s:%s() could not allocate I/O Page Table\n", __FILE__, + __FUNCTION__); } memset(ioc->pdir_base, 0, ioc->pdir_size); @@ -1461,7 +1462,8 @@ ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL, get_order(ioc->res_size)); if(NULL == ioc->res_map) { - panic(__FILE__ ":%s() could not allocate resource map\n", __FUNCTION__); + panic("%s:%s() could not allocate resource map\n", __FILE__, + __FUNCTION__); } memset(ioc->res_map, 0, ioc->res_size); @@ -1627,11 +1629,11 @@ if (!ioc) { parent = &iomem_resource; - } else if ((ioc->mmio_region->start <= dev->hpa) && - (dev->hpa < ioc->mmio_region->end)) { + } else if ((ioc->mmio_region->start <= res->start) && + (res->end <= ioc->mmio_region->end)) { parent = ioc->mmio_region; - } else if (((ioc->mmio_region + 1)->start <= dev->hpa) && - (dev->hpa < (ioc->mmio_region + 1)->end)) { + } else if (((ioc->mmio_region + 1)->start <= res->start) && + (res->end <= (ioc->mmio_region + 1)->end)) { parent = ioc->mmio_region + 1; } else { return -EBUSY; diff -Nru a/drivers/parisc/dino.c b/drivers/parisc/dino.c --- a/drivers/parisc/dino.c Tue Feb 17 20:00:05 2004 +++ b/drivers/parisc/dino.c Tue Feb 17 20:00:05 2004 @@ -175,7 +175,7 @@ static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val) { - struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->dev)); + struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->bridge)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 v = DINO_CFG_TOK(local_bus, devfn, where & ~3); unsigned long base_addr = d->hba.base_addr; @@ -209,7 +209,7 @@ static int dino_cfg_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val) { - struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->dev)); + struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->bridge)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 v = DINO_CFG_TOK(local_bus, devfn, where & ~3); unsigned long base_addr = d->hba.base_addr; @@ -468,14 +468,14 @@ dino_card_setup(struct pci_bus *bus, unsigned long base_addr) { int i; - struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->dev)); + struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); struct resource *res; char name[128]; int size; res = &dino_dev->hba.lmmio_space; res->flags = IORESOURCE_MEM; - size = snprintf(name, sizeof(name), "Dino LMMIO (%s)", bus->dev->bus_id); + size = snprintf(name, sizeof(name), "Dino LMMIO (%s)", bus->bridge->bus_id); res->name = kmalloc(size+1, GFP_KERNEL); if(res->name) strcpy((char *)res->name, name); @@ -489,7 +489,7 @@ struct list_head *ln, *tmp_ln; printk(KERN_ERR "Dino: cannot attach bus %s\n", - bus->dev->bus_id); + bus->bridge->bus_id); /* kill the bus, we can't do anything with it */ list_for_each_safe(ln, tmp_ln, &bus->devices) { struct pci_dev *dev = pci_dev_b(ln); @@ -560,11 +560,11 @@ { struct list_head *ln; struct pci_dev *dev; - struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->dev)); + struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); int port_base = HBA_PORT_BASE(dino_dev->hba.hba_num); DBG(KERN_WARNING "%s(0x%p) bus %d sysdata 0x%p\n", - __FUNCTION__, bus, bus->secondary, bus->dev->platform_data); + __FUNCTION__, bus, bus->secondary, bus->bridge->platform_data); /* Firmware doesn't set up card-mode dino, so we have to */ if (is_card_dino(&dino_dev->hba.dev->id)) { @@ -572,15 +572,23 @@ } else if(bus->parent == NULL) { /* must have a dino above it, reparent the resources * into the dino window */ + int i; + struct resource *res = &dino_dev->hba.lmmio_space; + bus->resource[0] = &(dino_dev->hba.io_space); - bus->resource[1] = &(dino_dev->hba.lmmio_space); + for(i = 0; i < DINO_MAX_LMMIO_RESOURCES; i++) { + if(res[i].flags == 0) + break; + bus->resource[i+1] = &res[i]; + } + } else if(bus->self) { int i; pci_read_bridge_bases(bus); - for(i = 0; i < PCI_NUM_RESOURCES; i++) { + for(i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) { if((bus->self->resource[i].flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0) continue; @@ -642,11 +650,10 @@ * care about an expansion rom on parisc, since it * usually contains (x86) bios code) */ dev->resource[PCI_ROM_RESOURCE].flags = 0; - dev->resource[PCI_ROM_RESOURCE].start = 0; - dev->resource[PCI_ROM_RESOURCE].end = 0; if(dev->irq == 255) { +#define DINO_FIX_UNASSIGNED_INTERRUPTS #ifdef DINO_FIX_UNASSIGNED_INTERRUPTS /* This code tries to assign an unassigned @@ -660,7 +667,7 @@ dino_cfg_read(dev->bus, dev->devfn, PCI_INTERRUPT_PIN, 1, &irq_pin); dev->irq = (irq_pin + PCI_SLOT(dev->devfn) - 1) % 4 ; dino_cfg_write(dev->bus, dev->devfn, PCI_INTERRUPT_LINE, 1, dev->irq); - dev->irq += dino_dev->dino_region->data.irqbase + dev->irq += dino_dev->dino_region->data.irqbase; printk(KERN_WARNING "Device %s has undefined IRQ, setting to %d\n", dev->slot_name, irq_pin); #else dev->irq = 65535; @@ -741,9 +748,9 @@ static int __init dino_bridge_init(struct dino_device *dino_dev, const char *name) { - unsigned long io_addr, bpos; - int result; - struct resource *res; + unsigned long io_addr; + int result, i, count=0; + struct resource *res, *prevres = NULL; /* * Decoding IO_ADDR_EN only works for Built-in Dino * since PDC has already initialized this. @@ -755,21 +762,51 @@ return -ENODEV; } - for (bpos = 0; (io_addr & (1 << bpos)) == 0; bpos++) - ; - res = &dino_dev->hba.lmmio_space; - res->flags = IORESOURCE_MEM; + for (i = 0; i < 32; i++) { + unsigned long start, end; + + if((io_addr & (1 << i)) == 0) + continue; - res->start = (unsigned long)(signed int)(0xf0000000 | (bpos << 23)); - res->end = res->start + 8 * 1024 * 1024 - 1; + start = (unsigned long)(signed int)(0xf0000000 | (i << 23)); + end = start + 8 * 1024 * 1024 - 1; - result = ccio_request_resource(dino_dev->hba.dev, res); - if (result < 0) { - printk(KERN_ERR "%s: failed to claim PCI Bus address space!\n", name); - return result; + DBG("DINO RANGE %d is at 0x%lx-0x%lx\n", count, + start, end); + + if(prevres && prevres->end + 1 == start) { + prevres->end = end; + } else { + if(count >= DINO_MAX_LMMIO_RESOURCES) { + printk(KERN_ERR "%s is out of resource windows for range %d (0x%lx-0x%lx)\n", name, count, start, end); + break; + } + prevres = res; + res->start = start; + res->end = end; + res->flags = IORESOURCE_MEM; + res->name = kmalloc(64, GFP_KERNEL); + if(res->name) + snprintf((char *)res->name, 64, "%s LMMIO %d", + name, count); + res++; + count++; + } } + res = &dino_dev->hba.lmmio_space; + + for(i = 0; i < DINO_MAX_LMMIO_RESOURCES; i++) { + if(res[i].flags == 0) + break; + + result = ccio_request_resource(dino_dev->hba.dev, &res[i]); + if (result < 0) { + printk(KERN_ERR "%s: failed to claim PCI Bus address space %d (0x%lx-0x%lx)!\n", name, i, res[i].start, res[i].end); + return result; + } + } return 0; } @@ -850,10 +887,8 @@ res = &dino_dev->hba.io_space; if (dev->id.hversion == 0x680 || is_card_dino(&dev->id)) { res->name = "Dino I/O Port"; - dino_dev->hba.lmmio_space.name = "Dino LMMIO"; } else { res->name = "Cujo I/O Port"; - dino_dev->hba.lmmio_space.name = "Cujo LMMIO"; } res->start = HBA_PORT_BASE(dino_dev->hba.hba_num); res->end = res->start + (HBA_PORT_SPACE_SIZE - 1); diff -Nru a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c --- a/drivers/parisc/eisa_eeprom.c Tue Feb 17 20:00:08 2004 +++ b/drivers/parisc/eisa_eeprom.c Tue Feb 17 20:00:08 2004 @@ -1,3 +1,24 @@ +/* + * EISA "eeprom" support routines + * + * Copyright (C) 2001 Thomas Bogendoerfer + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include diff -Nru a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c --- a/drivers/parisc/iosapic.c Tue Feb 17 20:00:06 2004 +++ b/drivers/parisc/iosapic.c Tue Feb 17 20:00:06 2004 @@ -610,19 +610,19 @@ { struct vector_info *vi = (struct vector_info *)dev_id; extern void do_irq(struct irqaction *a, int i, struct pt_regs *p); - int irq_num = vi->vi_ios->isi_region->data.irqbase + vi->vi_irqline; + int irq_num = vi->iosapic->isi_region->data.irqbase + vi->irqline; DBG("iosapic_interrupt(): irq %d line %d eoi %p\n", - irq, vi->vi_irqline, vi->vi_eoi_addr); + irq, vi->irqline, vi->eoi_addr); /* FIXME: Need to mask/unmask? processor IRQ is already masked... */ - do_irq(&vi->vi_ios->isi_region->action[vi->vi_irqline], irq_num, regs); + do_irq(&vi->iosapic->isi_region->action[vi->irqline], irq_num, regs); /* ** PCI only supports level triggered in order to share IRQ lines. ** I/O SAPIC must always issue EOI. */ - IOSAPIC_EOI(vi->vi_eoi_addr, vi->vi_eoi_data); + IOSAPIC_EOI(vi->eoi_addr, vi->eoi_data); return IRQ_HANDLED; } @@ -636,10 +636,6 @@ struct vector_info *vi; int isi_line; /* line used by device */ int tmp; - int return_irq; -#ifdef CONFIG_SUPERIO - int superio_irq = -1; -#endif if (NULL == isi) { printk(KERN_WARNING MODULE_NAME ": hpa not registered for %s\n", @@ -648,30 +644,29 @@ } #ifdef CONFIG_SUPERIO + /* + * HACK ALERT! (non-compliant PCI device support) + * + * All SuckyIO interrupts are routed through the PIC's on function 1. + * But SuckyIO OHCI USB controller gets an IRT entry anyway because + * it advertises INT D for INT_PIN. Use that IRT entry to get the + * SuckyIO interrupt routing for PICs on function 1 (*BLEECCHH*). + */ if (is_superio_device(pcidev)) { - superio_irq = superio_fixup_irq(pcidev); - if (superio_irq == -1) - return(-1); - - if (PCI_FUNC(pcidev->devfn) != SUPERIO_USB_FN) { - - /* - * SuperIO USB controller has an irt entry. - * Only let the USB controller hookup the rest - * of the interrupt routing when it comes through. - * Note that interrupts for all three functions - * actually come through the PIC's on function 1! - */ - - pcidev->irq = superio_irq; - return superio_irq; - } + /* We must call superio_fixup_irq() to register the pdev */ + pcidev->irq = superio_fixup_irq(pcidev); + + /* Don't return if need to program the IOSAPIC's IRT... */ + if (PCI_FUNC(pcidev->devfn) != SUPERIO_USB_FN) + return pcidev->irq; } #endif /* CONFIG_SUPERIO */ /* lookup IRT entry for isi/slot/pin set */ irte = iosapic_xlate_pin(isi, pcidev); if (NULL == irte) { + printk("iosapic: no IRTE for %s (IRQ not connected?)\n", + pci_name(pcidev)); return(-1); } DBG_IRT("iosapic_fixup_irq(): irte %p %x %x %x %x %x %x %x %x\n", @@ -685,15 +680,21 @@ irte->dest_iosapic_intin, (u32) irte->dest_iosapic_addr); isi_line = irte->dest_iosapic_intin; + pcidev->irq = isi->isi_region->data.irqbase + isi_line; /* get vector info for this input line */ ASSERT(NULL != isi->isi_vector); vi = &(isi->isi_vector[isi_line]); DBG_IRT("iosapic_fixup_irq: line %d vi 0x%p\n", isi_line, vi); - vi->vi_irte = irte; + + /* If this IRQ line has already been setup, skip it */ + if (vi->irte) + return pcidev->irq; + + vi->irte = irte; /* Allocate processor IRQ */ - vi->vi_txn_irq = txn_alloc_irq(); + vi->txn_irq = txn_alloc_irq(); /* XXX/FIXME The txn_alloc_irq() code and related code should be moved ** to enable_irq(). That way we only allocate processor IRQ bits @@ -701,47 +702,36 @@ ** Right now we assign an IRQ to every PCI device present regardless ** of whether it's used or not. */ - if (vi->vi_txn_irq < 0) + if (vi->txn_irq < 0) panic("I/O sapic: couldn't get TXN IRQ\n"); /* enable_irq() will use txn_* to program IRdT */ - vi->vi_txn_addr = txn_alloc_addr(vi->vi_txn_irq); - vi->vi_txn_data = txn_alloc_data(vi->vi_txn_irq, 8); - ASSERT(vi->vi_txn_data < 256); /* matches 8 above */ + vi->txn_addr = txn_alloc_addr(vi->txn_irq); + vi->txn_data = txn_alloc_data(vi->txn_irq, 8); + ASSERT(vi->txn_data < 256); /* matches 8 above */ - tmp = request_irq(vi->vi_txn_irq, iosapic_interrupt, 0, - vi->vi_name, vi); + tmp = request_irq(vi->txn_irq, iosapic_interrupt, 0, + vi->name, vi); ASSERT(tmp == 0); - vi->vi_eoi_addr = (u32 *) (isi->isi_hpa + IOSAPIC_REG_EOI); - vi->vi_eoi_data = cpu_to_le32(vi->vi_irqline); + vi->eoi_addr = (u32 *) (isi->isi_hpa + IOSAPIC_REG_EOI); + vi->eoi_data = cpu_to_le32(vi->irqline); ASSERT(NULL != isi->isi_region); - /* pcidev->irq still needs to be virtualized. */ - - return_irq = isi->isi_region->data.irqbase + isi_line; - -#ifdef CONFIG_SUPERIO - if (superio_irq != -1) { - superio_inform_irq(return_irq); - return_irq = superio_irq; - } -#endif - pcidev->irq = return_irq; DBG_IRT("iosapic_fixup_irq() %d:%d %x %x line %d irq %d\n", - PCI_SLOT(pcidev->devfn), - PCI_FUNC(pcidev->devfn), pcidev->vendor, pcidev->device, isi_line, return_irq); + PCI_SLOT(pcidev->devfn), PCI_FUNC(pcidev->irq), + pcidev->vendor, pcidev->device, isi_line, pcidev->irq); - return return_irq; + return pcidev->irq; } static void iosapic_rd_irt_entry(struct vector_info *vi , u32 *dp0, u32 *dp1) { - struct iosapic_info *isp = vi->vi_ios; - u8 idx = vi->vi_irqline; + struct iosapic_info *isp = vi->iosapic; + u8 idx = vi->irqline; /* point the window register to the lower word */ WRITE_U32(IOSAPIC_IRDT_ENTRY(idx), isp->isi_hpa+IOSAPIC_REG_SELECT); @@ -756,24 +746,24 @@ static void iosapic_wr_irt_entry(struct vector_info *vi, u32 dp0, u32 dp1) { - struct iosapic_info *isp = vi->vi_ios; + struct iosapic_info *isp = vi->iosapic; ASSERT(NULL != isp); ASSERT(0 != isp->isi_hpa); DBG_IRT("iosapic_wr_irt_entry(): irq %d hpa %p WINDOW %p 0x%x 0x%x\n", - vi->vi_irqline, + vi->irqline, isp->isi_hpa, isp->isi_hpa+IOSAPIC_REG_WINDOW, dp0, dp1); /* point the window register to the lower word */ - WRITE_U32(IOSAPIC_IRDT_ENTRY(vi->vi_irqline), isp->isi_hpa+IOSAPIC_REG_SELECT); + WRITE_U32(IOSAPIC_IRDT_ENTRY(vi->irqline), isp->isi_hpa+IOSAPIC_REG_SELECT); WRITE_U32( dp0, isp->isi_hpa+IOSAPIC_REG_WINDOW); /* Read the window register to flush the writes down to HW */ dp0 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW); /* point the window register to the higher word */ - WRITE_U32(IOSAPIC_IRDT_ENTRY_HI(vi->vi_irqline), isp->isi_hpa+IOSAPIC_REG_SELECT); + WRITE_U32(IOSAPIC_IRDT_ENTRY_HI(vi->irqline), isp->isi_hpa+IOSAPIC_REG_SELECT); WRITE_U32( dp1, isp->isi_hpa+IOSAPIC_REG_WINDOW); /* Read the window register to flush the writes down to HW */ @@ -790,8 +780,8 @@ iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1) { u32 mode = 0; - struct irt_entry *p = vi->vi_irte; - ASSERT(NULL != vi->vi_irte); + struct irt_entry *p = vi->irte; + ASSERT(NULL != vi->irte); if ((p->polarity_trigger & IRT_PO_MASK) == IRT_ACTIVE_LO) mode |= IOSAPIC_IRDT_PO_LOW; @@ -804,8 +794,8 @@ ** PA doesn't support EXTINT or LPRIO bits. */ - ASSERT(vi->vi_txn_data); - *dp0 = mode | (u32) vi->vi_txn_data; + ASSERT(vi->txn_data); + *dp0 = mode | (u32) vi->txn_data; /* ** Extracting id_eid isn't a real clean way of getting it. @@ -814,9 +804,9 @@ if (is_pdc_pat()) { /* ** PAT PDC just hands it to us "right". - ** vi_txn_addr comes from cpu_data[x].txn_addr. + ** txn_addr comes from cpu_data[x].txn_addr. */ - *dp1 = (u32) (vi->vi_txn_addr); + *dp1 = (u32) (vi->txn_addr); } else { /* ** eg if base_addr == 0xfffa0000), @@ -825,8 +815,8 @@ ** eid 0x0ff00000 -> 0x00ff0000 ** id 0x000ff000 -> 0xff000000 */ - *dp1 = (((u32)vi->vi_txn_addr & 0x0ff00000) >> 4) | - (((u32)vi->vi_txn_addr & 0x000ff000) << 12); + *dp1 = (((u32)vi->txn_addr & 0x0ff00000) >> 4) | + (((u32)vi->txn_addr & 0x000ff000) << 12); } DBG_IRT("iosapic_set_irt_data(): 0x%x 0x%x\n", *dp0, *dp1); } @@ -872,7 +862,7 @@ IOSAPIC_UNLOCK(&iosapic_lock); /* disable ISR for parent */ - disable_irq(vi->vi_txn_irq); + disable_irq(vi->txn_irq); } @@ -883,11 +873,11 @@ u32 d0, d1; ASSERT(NULL != vi); - ASSERT(NULL != vi->vi_irte); + ASSERT(NULL != vi->irte); /* data is initialized by fixup_irq */ - ASSERT(0 < vi->vi_txn_irq); - ASSERT(0UL != vi->vi_txn_data); + ASSERT(0 < vi->txn_irq); + ASSERT(0UL != vi->txn_data); iosapic_set_irt_data(vi, &d0, &d1); iosapic_wr_irt_entry(vi, d0, d1); @@ -895,15 +885,15 @@ #ifdef DEBUG_IOSAPIC_IRT { - u32 *t = (u32 *) ((ulong) vi->vi_eoi_addr & ~0xffUL); - printk("iosapic_enable_irq(): regs %p", vi->vi_eoi_addr); - while (t < vi->vi_eoi_addr) printk(" %x", READ_U32(t++)); + u32 *t = (u32 *) ((ulong) vi->eoi_addr & ~0xffUL); + printk("iosapic_enable_irq(): regs %p", vi->eoi_addr); + while (t < vi->eoi_addr) printk(" %x", READ_U32(t++)); printk("\n"); } printk("iosapic_enable_irq(): sel "); { - struct iosapic_info *isp = vi->vi_ios; + struct iosapic_info *isp = vi->iosapic; for (d0=0x10; d0<0x1e; d0++) { /* point the window register to the lower word */ @@ -924,7 +914,7 @@ ** Issueing I/O SAPIC an EOI causes an interrupt iff IRQ line is ** asserted. */ - IOSAPIC_EOI(vi->vi_eoi_addr, vi->vi_eoi_data); + IOSAPIC_EOI(vi->eoi_addr, vi->eoi_data); } @@ -1034,9 +1024,9 @@ ** Initialize vector array */ for (cnt=0; cnt < isi->isi_num_vectors; cnt++, vip++) { - vip->vi_irqline = (unsigned char) cnt; - vip->vi_ios = isi; - sprintf(vip->vi_name, "%s-L%d", isi->isi_name, cnt); + vip->irqline = (unsigned char) cnt; + vip->iosapic = isi; + sprintf(vip->name, "%s-L%d", isi->isi_name, cnt); } isi->isi_region = alloc_irq_region(isi->isi_num_vectors, @@ -1071,13 +1061,13 @@ { ASSERT(NULL != vi); - printk(KERN_DEBUG MODULE_NAME ": vector_info[%d] is at %p\n", vi->vi_irqline, vi); - printk(KERN_DEBUG "\t\tvi_status: %.4x\n", vi->vi_status); - printk(KERN_DEBUG "\t\tvi_txn_irq: %d\n", vi->vi_txn_irq); - printk(KERN_DEBUG "\t\tvi_txn_addr: %lx\n", vi->vi_txn_addr); - printk(KERN_DEBUG "\t\tvi_txn_data: %lx\n", vi->vi_txn_data); - printk(KERN_DEBUG "\t\tvi_eoi_addr: %p\n", vi->vi_eoi_addr); - printk(KERN_DEBUG "\t\tvi_eoi_data: %x\n", vi->vi_eoi_data); + printk(KERN_DEBUG MODULE_NAME ": vector_info[%d] is at %p\n", vi->irqline, vi); + printk(KERN_DEBUG "\t\tstatus: %.4x\n", vi->status); + printk(KERN_DEBUG "\t\ttxn_irq: %d\n", vi->txn_irq); + printk(KERN_DEBUG "\t\ttxn_addr: %lx\n", vi->txn_addr); + printk(KERN_DEBUG "\t\ttxn_data: %lx\n", vi->txn_data); + printk(KERN_DEBUG "\t\teoi_addr: %p\n", vi->eoi_addr); + printk(KERN_DEBUG "\t\teoi_data: %x\n", vi->eoi_data); } diff -Nru a/drivers/parisc/iosapic_private.h b/drivers/parisc/iosapic_private.h --- a/drivers/parisc/iosapic_private.h Tue Feb 17 20:00:06 2004 +++ b/drivers/parisc/iosapic_private.h Tue Feb 17 20:00:06 2004 @@ -1,3 +1,26 @@ +/* + * Private structs/constants for PARISC IOSAPIC support + * + * Copyright (C) 2000 Hewlett Packard (Grant Grundler) + * Copyright (C) 2000,2003 Grant Grundler (grundler at parisc-linux.org) + * Copyright (C) 2002 Matthew Wilcox (willy at parisc-linux.org) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /* ** This file is private to iosapic driver. ** If stuff needs to be used by another driver, move it to a common file. @@ -107,16 +130,16 @@ #endif struct vector_info { - struct iosapic_info *vi_ios; /* I/O SAPIC this vector is on */ - struct irt_entry *vi_irte; /* IRT entry */ - u32 *vi_eoi_addr; /* precalculate EOI reg address */ - u32 vi_eoi_data; /* IA64: ? PA: swapped txn_data */ - int vi_txn_irq; /* virtual IRQ number for processor */ - ulong vi_txn_addr; /* IA64: id_eid PA: partial HPA */ - ulong vi_txn_data; /* IA64: vector PA: EIR bit */ - u8 vi_status; /* status/flags */ - u8 vi_irqline; /* INTINn(IRQ) */ - char vi_name[32]; /* user visible identity */ + struct iosapic_info *iosapic; /* I/O SAPIC this vector is on */ + struct irt_entry *irte; /* IRT entry */ + u32 *eoi_addr; /* precalculate EOI reg address */ + u32 eoi_data; /* IA64: ? PA: swapped txn_data */ + int txn_irq; /* virtual IRQ number for processor */ + ulong txn_addr; /* IA64: id_eid PA: partial HPA */ + ulong txn_data; /* IA64: vector PA: EIR bit */ + u8 status; /* status/flags */ + u8 irqline; /* INTINn(IRQ) */ + char name[32]; /* user visible identity */ }; diff -Nru a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c --- a/drivers/parisc/lba_pci.c Tue Feb 17 20:00:07 2004 +++ b/drivers/parisc/lba_pci.c Tue Feb 17 20:00:07 2004 @@ -185,8 +185,6 @@ void *iosapic_obj; #ifdef __LP64__ - unsigned long lmmio_base; /* PA_VIEW - fixup MEM addresses */ - unsigned long gmmio_base; /* PA_VIEW - Not used (yet) */ unsigned long iop_base; /* PA_VIEW - for IO port accessor funcs */ #endif @@ -508,7 +506,7 @@ static int lba_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data) { - struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->dev)); + struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 tok = LBA_CFG_TOK(local_bus, devfn); @@ -518,7 +516,7 @@ with risk we will miss PCI bus errors. */ *data = lba_rd_cfg(d, tok, pos, size); DBG_CFG("%s(%x+%2x) -> 0x%x (a)\n", __FUNCTION__, tok, pos, *data); - return(*data == ~0UL); + return(*data == ~0U); } if (LBA_SKIP_PROBE(d) && (!lba_device_present(bus->secondary, devfn, d))) @@ -592,7 +590,7 @@ static int lba_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data) { - struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->dev)); + struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 tok = LBA_CFG_TOK(local_bus,devfn); @@ -695,20 +693,23 @@ { struct list_head *ln; #ifdef FBB_SUPPORT - u16 fbb_enable = PCI_STATUS_FAST_BACK; u16 status; #endif - struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->dev)); + struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge)); int lba_portbase = HBA_PORT_BASE(ldev->hba.hba_num); DBG("lba_fixup_bus(0x%p) bus %d sysdata 0x%p\n", - bus, bus->secondary, bus->dev->platform_data); + bus, bus->secondary, bus->bridge->platform_data); /* ** Properly Setup MMIO resources for this bus. ** pci_alloc_primary_bus() mangles this. */ - if (NULL == bus->self) { + if (bus->self) { + /* PCI-PCI Bridge */ + pci_read_bridge_bases(bus); + } else { + /* Host-PCI Bridge */ int err; DBG("lba_fixup_bus() %s [%lx/%lx]/%x\n", @@ -725,59 +726,29 @@ BUG(); lba_dump_res(&ioport_resource, 2); } + err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); if (err < 0) { BUG(); lba_dump_res(&iomem_resource, 2); } - bus->resource[0] = &(ldev->hba.io_space); - bus->resource[1] = &(ldev->hba.lmmio_space); - } else { - /* KLUGE ALERT! - ** PCI-PCI Bridge resource munging. - ** This hack should go away in the near future. - ** It's based on the Alpha port. - */ - int i; - u16 cmd; - - for (i = 0; i < 4; i++) { - bus->resource[i] = - &bus->self->resource[PCI_BRIDGE_RESOURCES+i]; - bus->resource[i]->name = bus->name; +#ifdef __LP64__ + if (ldev->hba.gmmio_space.flags) { + err = request_resource(&iomem_resource, &(ldev->hba.gmmio_space)); + if (err < 0) { + BUG(); + lba_dump_res(&iomem_resource, 2); + } + bus->resource[2] = &(ldev->hba.gmmio_space); } -#if 0 - bus->resource[0]->flags |= pci_bridge_check_io(bus->self); -#else - bus->resource[0]->flags |= IORESOURCE_IO; #endif - bus->resource[1]->flags |= IORESOURCE_MEM; - bus->resource[2]->flags = 0; /* Don't support prefetchable */ - bus->resource[3]->flags = 0; /* not used */ - - /* - ** If the PPB is enabled (ie already configured) then - ** just read those values. - */ - (void) pci_read_config_word(bus->self, PCI_COMMAND, &cmd); - if (cmd & (PCI_COMMAND_MEMORY | PCI_COMMAND_IO)) { - pci_read_bridge_bases(bus); - } else { - /* Not configured. - ** For now, propagate HBA limits to the bus; - ** PCI will adjust them later. - */ - bus->resource[0]->end = ldev->hba.io_space.end; - bus->resource[1]->end = ldev->hba.lmmio_space.end; - } - /* Turn off downstream PF memory address range by default */ - bus->resource[2]->start = 1024*1024; - bus->resource[2]->end = bus->resource[2]->start - 1; + /* advertize Host bridge resources to PCI bus */ + bus->resource[0] = &(ldev->hba.io_space); + bus->resource[1] = &(ldev->hba.lmmio_space); } - list_for_each(ln, &bus->devices) { int i; struct pci_dev *dev = pci_dev_b(ln); @@ -785,7 +756,7 @@ DBG("lba_fixup_bus() %s\n", pci_name(dev)); /* Virtualize Device/Bridge Resources. */ - for (i = 0; i < PCI_NUM_RESOURCES; i++) { + for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) { struct resource *res = &dev->resource[i]; /* If resource not allocated - skip it */ @@ -817,7 +788,7 @@ ** No one on the bus can be allowed to use them. */ (void) pci_read_config_word(dev, PCI_STATUS, &status); - fbb_enable &= status; + bus->bridge_ctl &= ~(status & PCI_STATUS_FAST_BACK); #endif #ifdef __LP64__ @@ -1069,6 +1040,7 @@ lba_dev->hba.bus_num.start = p->start; lba_dev->hba.bus_num.end = p->end; break; + case PAT_LMMIO: /* used to fix up pre-initialized MEM BARs */ lba_dev->hba.lmmio_space_offset = p->start - io->start; @@ -1080,23 +1052,28 @@ r->flags = IORESOURCE_MEM; r->parent = r->sibling = r->child = NULL; break; + case PAT_GMMIO: - printk(KERN_WARNING MODULE_NAME - " range[%d] : ignoring GMMIO (0x%lx)\n", - i, p->start); - lba_dev->gmmio_base = p->start; + /* MMIO space > 4GB phys addr; for 64-bit BAR */ + r = &(lba_dev->hba.gmmio_space); + r->name = "LBA GMMIO"; + r->start = p->start; + r->end = p->end; + r->flags = IORESOURCE_MEM; + r->parent = r->sibling = r->child = NULL; break; + case PAT_NPIOP: printk(KERN_WARNING MODULE_NAME " range[%d] : ignoring NPIOP (0x%lx)\n", i, p->start); break; + case PAT_PIOP: /* ** Postable I/O port space is per PCI host adapter. + ** base of 64MB PIOP region */ - - /* save base of 64MB PIOP region */ lba_dev->iop_base = p->start; r = &(lba_dev->hba.io_space); @@ -1106,6 +1083,7 @@ r->flags = IORESOURCE_IO; r->parent = r->sibling = r->child = NULL; break; + default: printk(KERN_WARNING MODULE_NAME " range[%d] : unknown pat range type (0x%lx)\n", @@ -1259,7 +1237,11 @@ #endif /* DEBUG_LBA_PAT */ #ifdef __LP64__ -#warning FIXME add support for PDC_PAT_IO "Get slot status" - OLAR support +/* + * FIXME add support for PDC_PAT_IO "Get slot status" - OLAR support + * Only N-Class and up can really make use of Get slot status. + * maybe L-class too but I've never played with it there. + */ #endif /* PDC_PAT_BUG: exhibited in rev 40.48 on L2000 */ diff -Nru a/drivers/parisc/led.c b/drivers/parisc/led.c --- a/drivers/parisc/led.c Tue Feb 17 20:00:06 2004 +++ b/drivers/parisc/led.c Tue Feb 17 20:00:06 2004 @@ -3,7 +3,7 @@ * * (c) Copyright 2000 Red Hat Software * (c) Copyright 2000 Helge Deller - * (c) Copyright 2001-2003 Helge Deller + * (c) Copyright 2001-2004 Helge Deller * (c) Copyright 2001 Randolph Chung * * This program is free software; you can redistribute it and/or modify @@ -56,6 +56,7 @@ static int led_diskio = 1; static int led_lanrxtx = 1; static char lcd_text[32]; +static char lcd_text_default[] = "Linux " UTS_RELEASE; #if 0 #define DPRINTK(x) printk x @@ -196,19 +197,11 @@ break; case LED_HASLCD: + while (*cur && cur[strlen(cur)-1] == '\n') + cur[strlen(cur)-1] = 0; if (*cur == 0) - { - /* reset to default */ - lcd_print("Linux " UTS_RELEASE); - } - else - { - /* chop off trailing \n.. if the user gives multiple - * \n then it's all their fault.. */ - if (*cur && cur[strlen(cur)-1] == '\n') - cur[strlen(cur)-1] = 0; - lcd_print(cur); - } + cur = lcd_text_default; + lcd_print(cur); break; default: return 0; @@ -438,11 +431,7 @@ #define HEARTBEAT_2ND_RANGE_START (HZ*22/100) #define HEARTBEAT_2ND_RANGE_END (HEARTBEAT_2ND_RANGE_START + HEARTBEAT_LEN) -#if HZ==100 - #define NORMALIZED_COUNT(count) (count) -#else - #define NORMALIZED_COUNT(count) (count/(HZ/100)) -#endif +#define NORMALIZED_COUNT(count) (count/(HZ/100)) static void led_tasklet_func(unsigned long unused) { @@ -567,7 +556,7 @@ printk(KERN_INFO "LCD display at %p,%p registered\n", LCD_CMD_REG , LCD_DATA_REG); led_func_ptr = led_LCD_driver; - lcd_print( "Linux " UTS_RELEASE ); + lcd_print( lcd_text_default ); led_type = LED_HASLCD; break; diff -Nru a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c --- a/drivers/parisc/sba_iommu.c Tue Feb 17 20:00:07 2004 +++ b/drivers/parisc/sba_iommu.c Tue Feb 17 20:00:07 2004 @@ -44,6 +44,11 @@ #define MODULE_NAME "SBA" +#ifdef CONFIG_PROC_FS +/* depends on proc fs support. But costs CPU performance */ +#undef SBA_COLLECT_STATS +#endif + /* ** The number of debug flags is a clue - this code is fragile. ** Don't even think about messing with it unless you have @@ -217,7 +222,7 @@ } saved[DELAYED_RESOURCE_CNT]; #endif -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS #define SBA_SEARCH_SAMPLE 0x100 unsigned long avg_search[SBA_SEARCH_SAMPLE]; unsigned long avg_idx; /* current index into avg_search */ @@ -560,7 +565,7 @@ sba_alloc_range(struct ioc *ioc, size_t size) { unsigned int pages_needed = size >> IOVP_SHIFT; -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS unsigned long cr_start = mfctl(16); #endif unsigned long pide; @@ -579,7 +584,8 @@ if (pide >= (ioc->res_size << 3)) { pide = sba_search_bitmap(ioc, pages_needed); if (pide >= (ioc->res_size << 3)) - panic(__FILE__ ": I/O MMU @ %lx is out of mapping resources\n", ioc->ioc_hpa); + panic("%s: I/O MMU @ %lx is out of mapping resources\n", + __FILE__, ioc->ioc_hpa); } #ifdef ASSERT_PDIR_SANITY @@ -594,7 +600,7 @@ (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map), ioc->res_bitshift ); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS { unsigned long cr_end = mfctl(16); unsigned long tmp = cr_end - cr_start; @@ -636,7 +642,7 @@ __FUNCTION__, (uint) iova, size, bits_not_wanted, m, pide, res_ptr, *res_ptr); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->used_pages -= bits_not_wanted; #endif @@ -854,7 +860,7 @@ sba_check_pdir(ioc,"Check before sba_map_single()"); #endif -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->msingle_calls++; ioc->msingle_pages += size >> IOVP_SHIFT; #endif @@ -929,7 +935,7 @@ spin_lock_irqsave(&ioc->res_lock, flags); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->usingle_calls++; ioc->usingle_pages += size >> IOVP_SHIFT; #endif @@ -1057,7 +1063,7 @@ printk(KERN_DEBUG " %2d : %08lx/%05x %p/%05x\n", nents, (unsigned long) sg_dma_address(startsg), cnt, - sg_virt_address(startsg), startsg->length + sg_virt_addr(startsg), startsg->length ); #else DBG_RUN_SG(" %d : %08lx/%05x %p/%05x\n", @@ -1093,7 +1099,7 @@ cnt += dma_offset; dma_offset=0; /* only want offset on first chunk */ cnt = ROUNDUP(cnt, IOVP_SIZE); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->msg_pages += cnt >> IOVP_SHIFT; #endif do { @@ -1300,7 +1306,7 @@ } #endif -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->msg_calls++; #endif @@ -1365,7 +1371,7 @@ ioc = GET_IOC(dev); ASSERT(ioc); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->usg_calls++; #endif @@ -1378,7 +1384,7 @@ while (sg_dma_len(sglist) && nents--) { sba_unmap_single(dev, sg_dma_address(sglist), sg_dma_len(sglist), direction); -#ifdef CONFIG_PROC_FS +#ifdef SBA_COLLECT_STATS ioc->usg_pages += ((sg_dma_address(sglist) & ~IOVP_MASK) + sg_dma_len(sglist) + IOVP_SIZE - 1) >> PAGE_SHIFT; ioc->usingle_calls--; /* kluge since call is unmap_sg() */ #endif @@ -1680,6 +1686,21 @@ int num_ioc; u64 ioc_ctl; + if (!is_pdc_pat()) { + /* Shutdown the USB controller on Astro-based workstations. + ** Once we reprogram the IOMMU, the next DMA performed by + ** USB will HPMC the box. + */ + pdc_io_reset_devices(); + + /* + ** XXX May need something more sophisticated to deal + ** with DMA from LAN. Maybe use page zero boot device + ** as a handle to talk to PDC about which device to + ** shutdown. This also needs to work for is_pdc_pat(). + */ + } + ioc_ctl = READ_REG(sba_dev->sba_hpa+IOC_CTRL); DBG_INIT("%s() hpa 0x%lx ioc_ctl 0x%Lx ->", __FUNCTION__, sba_dev->sba_hpa, ioc_ctl); @@ -1766,7 +1787,8 @@ if (NULL == sba_dev->ioc[i].res_map) { - panic(__FILE__ ":%s() could not allocate resource map\n", __FUNCTION__ ); + panic("%s:%s() could not allocate resource map\n", + __FILE__, __FUNCTION__ ); } memset(sba_dev->ioc[i].res_map, 0, res_size); @@ -1829,7 +1851,9 @@ struct sba_device *sba_dev = sba_list; struct ioc *ioc = &sba_dev->ioc[0]; /* FIXME: Multi-IOC support! */ int total_pages = (int) (ioc->res_size << 3); /* 8 bits per byte */ +#ifdef SBA_COLLECT_STATS unsigned long i = 0, avg = 0, min, max; +#endif sprintf(buf, "%s rev %d.%d\n", sba_dev->name, @@ -1841,12 +1865,13 @@ (int) ((ioc->res_size << 3) * sizeof(u64)), /* 8 bits/byte */ total_pages); + sprintf(buf, "%sResource bitmap : %d bytes (%d pages)\n", + buf, ioc->res_size, ioc->res_size << 3); /* 8 bits per byte */ + +#ifdef SBA_COLLECT_STATS sprintf(buf, "%sIO PDIR entries : %ld free %ld used (%d%%)\n", buf, total_pages - ioc->used_pages, ioc->used_pages, (int) (ioc->used_pages * 100 / total_pages)); - - sprintf(buf, "%sResource bitmap : %d bytes (%d pages)\n", - buf, ioc->res_size, ioc->res_size << 3); /* 8 bits per byte */ min = max = ioc->avg_search[0]; for (i = 0; i < SBA_SEARCH_SAMPLE; i++) { @@ -1876,6 +1901,7 @@ sprintf(buf, "%spci_unmap_sg() : %12ld calls %12ld pages (avg %d/1000)\n", buf, ioc->usg_calls, ioc->usg_pages, (int) ((ioc->usg_pages * 1000)/ioc->usg_calls)); +#endif return strlen(buf); } diff -Nru a/drivers/parisc/superio.c b/drivers/parisc/superio.c --- a/drivers/parisc/superio.c Tue Feb 17 20:00:07 2004 +++ b/drivers/parisc/superio.c Tue Feb 17 20:00:07 2004 @@ -9,7 +9,8 @@ * (C) Copyright 2000 Linuxcare Canada, Inc. * (C) Copyright 2000 Martin K. Petersen * (C) Copyright 2000 Alex deVries - * (C) Copyright 2001 John Marvin + * (C) Copyright 2001 John Marvin + * (C) Copyright 2003 Grant Grundler * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -73,24 +74,16 @@ #include #include -static struct superio_device sio_dev = { - .iosapic_irq = -1 -}; - +static struct superio_device sio_dev; -#undef DEBUG_INIT -void -superio_inform_irq(int irq) -{ - if (sio_dev.iosapic_irq != -1) { - printk(KERN_ERR "SuperIO: superio_inform_irq called twice! (more than one SuperIO?)\n"); - BUG(); - return; - } +#undef DEBUG_SUPERIO_INIT - sio_dev.iosapic_irq = irq; -} +#ifdef DEBUG_SUPERIO_INIT +#define DBG_INIT(x...) printk(x) +#else +#define DBG_INIT(x...) +#endif static irqreturn_t superio_interrupt(int irq, void *devp, struct pt_regs *regs) @@ -135,7 +128,6 @@ } /* Call the appropriate device's interrupt */ - do_irq(&sio->irq_region->action[local_irq], sio->irq_region->data.irqbase + local_irq, regs); @@ -153,34 +145,39 @@ { struct pci_dev *pdev = sio->lio_pdev; u16 word; - u8 i; - if (!pdev || sio->iosapic_irq == -1) { - printk(KERN_ERR "All SuperIO functions not found!\n"); - BUG(); + if (sio->suckyio_irq_enabled) return; - } + + if (!pdev) BUG(); + if (!sio->usb_pdev) BUG(); + + /* use the IRQ iosapic found for USB INT D... */ + pdev->irq = sio->usb_pdev->irq; + + /* ...then properly fixup the USB to point at suckyio PIC */ + sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", - pci_name(pdev),sio->iosapic_irq); + pci_name(pdev),pdev->irq); /* Find our I/O devices */ - pci_read_config_word (pdev, SIO_SP1BAR, &sio->sp1_base); + pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); sio->sp1_base &= ~1; printk (KERN_INFO "SuperIO: Serial port 1 at 0x%x\n", sio->sp1_base); - pci_read_config_word (pdev, SIO_SP2BAR, &sio->sp2_base); + pci_read_config_dword (pdev, SIO_SP2BAR, &sio->sp2_base); sio->sp2_base &= ~1; printk (KERN_INFO "SuperIO: Serial port 2 at 0x%x\n", sio->sp2_base); - pci_read_config_word (pdev, SIO_PPBAR, &sio->pp_base); + pci_read_config_dword (pdev, SIO_PPBAR, &sio->pp_base); sio->pp_base &= ~1; printk (KERN_INFO "SuperIO: Parallel port at 0x%x\n", sio->pp_base); - pci_read_config_word (pdev, SIO_FDCBAR, &sio->fdc_base); + pci_read_config_dword (pdev, SIO_FDCBAR, &sio->fdc_base); sio->fdc_base &= ~1; printk (KERN_INFO "SuperIO: Floppy controller at 0x%x\n", sio->fdc_base); - pci_read_config_word (pdev, SIO_ACPIBAR, &sio->acpi_base); + pci_read_config_dword (pdev, SIO_ACPIBAR, &sio->acpi_base); sio->acpi_base &= ~1; printk (KERN_INFO "SuperIO: ACPI at 0x%x\n", sio->acpi_base); @@ -192,24 +189,53 @@ pci_read_config_word (pdev, PCI_COMMAND, &word); word |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY | PCI_COMMAND_IO; pci_write_config_word (pdev, PCI_COMMAND, word); + pci_set_master (pdev); + pci_enable_device(pdev); - /* Next project is programming the onboard interrupt - * controllers. PDC hasn't done this for us, since it's using - * polled I/O. + /* + * Next project is programming the onboard interrupt controllers. + * PDC hasn't done this for us, since it's using polled I/O. + * + * XXX Use dword writes to avoid bugs in Elroy or Suckyio Config + * space access. PCI is by nature a 32-bit bus and config + * space can be sensitive to that. */ - /* Set PIC interrupts to edge triggered */ - pci_write_config_byte (pdev, TRIGGER_1, 0x0); - pci_write_config_byte (pdev, TRIGGER_2, 0x0); - - /* Disable all interrupt routing */ - for (i = IR_LOW ; i < IR_HIGH ; i++) - pci_write_config_byte (pdev, i, 0x0); + /* 0x64 - 0x67 : + DMA Rtg 2 + DMA Rtg 3 + DMA Chan Ctl + TRIGGER_1 == 0x82 USB & IDE level triggered, rest to edge + */ + pci_write_config_dword (pdev, 0x64, 0x82000000U); + + /* 0x68 - 0x6b : + TRIGGER_2 == 0x00 all edge triggered (not used) + CFG_IR_SER == 0x43 SerPort1 = IRQ3, SerPort2 = IRQ4 + CFG_IR_PF == 0x65 ParPort = IRQ5, FloppyCtlr = IRQ6 + CFG_IR_IDE == 0x07 IDE1 = IRQ7, reserved + */ + pci_write_config_dword (pdev, TRIGGER_2, 0x07654300U); + + /* 0x6c - 0x6f : + CFG_IR_INTAB == 0x00 + CFG_IR_INTCD == 0x10 USB = IRQ1 + CFG_IR_PS2 == 0x00 + CFG_IR_FXBUS == 0x00 + */ + pci_write_config_dword (pdev, CFG_IR_INTAB, 0x00001000U); + + /* 0x70 - 0x73 : + CFG_IR_USB == 0x00 not used. USB is connected to INTD. + CFG_IR_ACPI == 0x00 not used. + DMA Priority == 0x4c88 Power on default value. NFC. + */ + pci_write_config_dword (pdev, CFG_IR_USB, 0x4c880000U); /* PIC1 Initialization Command Word register programming */ outb (0x11,IC_PIC1+0); /* ICW1: ICW4 write req | ICW1 */ - outb (0x00,IC_PIC1+1); /* ICW2: N/A */ + outb (0x00,IC_PIC1+1); /* ICW2: interrupt vector table - not used */ outb (0x04,IC_PIC1+1); /* ICW3: Cascade */ outb (0x01,IC_PIC1+1); /* ICW4: x86 mode */ @@ -228,19 +254,8 @@ outb (0x68,IC_PIC1+0); /* OCW3: OCW3 select | ESMM | SMM */ /* Write master mask reg */ - outb (0xff,IC_PIC1+1); - /* Set up interrupt routing */ - - pci_write_config_byte (pdev, IR_USB, 0x10); /* USB on IRQ1 */ - pci_write_config_byte (pdev, IR_SER, 0x43); /* SP1 on IRQ3, SP2 on IRQ4 */ - pci_write_config_byte (pdev, IR_PFD, 0x65); /* PAR on IRQ5, FDC on IRQ6 */ - pci_write_config_byte (pdev, IR_IDE, 0x07); /* IDE1 on IRQ7 */ - - /* Set USB and IDE to level triggered interrupts, rest to edge */ - pci_write_config_byte (pdev, TRIGGER_1, 0x82); /* IRQ 1 and 7 */ - /* Setup USB power regulation */ outb(1, sio->acpi_base + USB_REG_CR); if (inb(sio->acpi_base + USB_REG_CR) & 1) @@ -248,20 +263,18 @@ else printk(KERN_ERR "USB regulator not initialized!\n"); - pci_enable_device(pdev); - - if (request_irq(sio->iosapic_irq,superio_interrupt,SA_INTERRUPT, - "SuperIO",(void *)sio)) { + if (request_irq(pdev->irq, superio_interrupt, SA_INTERRUPT, + "SuperIO", (void *)sio)) { printk(KERN_ERR "SuperIO: could not get irq\n"); BUG(); return; } - sio->iosapic_irq_enabled = 1; - + sio->suckyio_irq_enabled = 1; } + static void superio_disable_irq(void *dev, int local_irq) { @@ -283,30 +296,21 @@ static void superio_enable_irq(void *dev, int local_irq) { - struct superio_device *sio = (struct superio_device *)dev; u8 r8; if ((local_irq < 1) || (local_irq == 2) || (local_irq > 7)) { - printk(KERN_ERR "SuperIO: Illegal irq number.\n"); + printk(KERN_ERR "SuperIO: Illegal irq number (%d).\n", local_irq); BUG(); return; } - /* - * It's possible that we haven't initialized the legacy IO - * function yet. If not, do it now. - */ - - if (!sio->iosapic_irq_enabled) - superio_init(sio); - /* Unmask interrupt */ - r8 = inb(IC_PIC1+1); r8 &= ~(1 << local_irq); outb (r8,IC_PIC1+1); } + static void superio_mask_irq(void *dev, int local_irq) { @@ -326,7 +330,7 @@ .unmask_irq = superio_unmask_irq }; -#ifdef DEBUG_INIT +#ifdef DEBUG_SUPERIO_INIT static unsigned short expected_device[3] = { PCI_DEVICE_ID_NS_87415, PCI_DEVICE_ID_NS_87560_LIO, @@ -338,7 +342,7 @@ { int local_irq; -#ifdef DEBUG_INIT +#ifdef DEBUG_SUPERIO_INIT int fn; fn = PCI_FUNC(pcidev->devfn); @@ -375,9 +379,10 @@ local_irq = IDE_IRQ; break; case PCI_DEVICE_ID_NS_87560_LIO: /* Function 1 */ - sio_dev.lio_pdev = pcidev; /* save for later initialization */ + sio_dev.lio_pdev = pcidev; /* save for superio_init() */ return -1; case PCI_DEVICE_ID_NS_87560_USB: /* Function 2 */ + sio_dev.usb_pdev = pcidev; /* save for superio_init() */ local_irq = USB_IRQ; break; default: @@ -411,20 +416,29 @@ { #ifdef CONFIG_SERIAL_8250 int retval; + extern void serial8250_console_init(void); /* drivers/serial/8250.c */ if (!sio_dev.irq_region) return; /* superio not present */ - if (!sio_dev.iosapic_irq_enabled) - superio_init(&sio_dev); + if (!serial) { + printk(KERN_WARNING "SuperIO: Could not get memory for serial struct.\n"); + return; + } serial[0].iobase = sio_dev.sp1_base; - retval = early_serial_setup(&serial[0]); + serial[0].irq = sio_dev.irq_region->data.irqbase + SP1_IRQ; - if (retval < 0) + retval = early_serial_setup(&serial[0]); + if (retval < 0) { printk(KERN_WARNING "SuperIO: Register Serial #0 failed.\n"); + return; + } + + serial8250_console_init(); serial[1].iobase = sio_dev.sp2_base; + serial[1].irq = sio_dev.irq_region->data.irqbase + SP2_IRQ; retval = early_serial_setup(&serial[1]); if (retval < 0) @@ -432,30 +446,20 @@ #endif /* CONFIG_SERIAL_8250 */ } -EXPORT_SYMBOL(superio_serial_init); - -#ifdef CONFIG_PARPORT_PC -void __devinit +static void __devinit superio_parport_init(void) { - if (!sio_dev.irq_region) - return; /* superio not present */ - - if (!sio_dev.iosapic_irq_enabled) - superio_init(&sio_dev); - - if (!parport_pc_probe_port(sio_dev.pp_base, - 0 /*base_hi*/, - sio_dev.irq_region->data.irqbase + PAR_IRQ, - PARPORT_DMA_NONE /* dma */, - NULL /*struct pci_dev* */)) +#ifdef CONFIG_PARPORT_PC + if (!parport_pc_probe_port(sio_dev.pp_base, + 0 /*base_hi*/, + sio_dev.irq_region->data.irqbase + PAR_IRQ, + PARPORT_DMA_NONE /* dma */, + NULL /*struct pci_dev* */) ) printk(KERN_WARNING "SuperIO: Probing parallel port failed.\n"); -} - -EXPORT_SYMBOL(superio_parport_init); #endif /* CONFIG_PARPORT_PC */ +} int @@ -471,36 +475,35 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id) { -#ifdef DEBUG_INIT - printk("superio_probe(%s) ven 0x%x dev 0x%x sv 0x%x sd 0x%x class 0x%x\n", + + /* + ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a + ** superio_probe(00:0e.1) ven 0x100b dev 0xe sv 0x0 sd 0x0 class 0x68000 + ** superio_probe(00:0e.2) ven 0x100b dev 0x12 sv 0x0 sd 0x0 class 0xc0310 + */ + DBG_INIT("superio_probe(%s) ven 0x%x dev 0x%x sv 0x%x sd 0x%x class 0x%x\n", pci_name(dev), dev->vendor, dev->device, dev->subsystem_vendor, dev->subsystem_device, dev->class); -/* -** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a -** superio_probe(00:0e.1) ven 0x100b dev 0xe sv 0x0 sd 0x0 class 0x68000 -** superio_probe(00:0e.2) ven 0x100b dev 0x12 sv 0x0 sd 0x0 class 0xc0310 -*/ -#endif - /* superio_fixup_irq(dev); */ + superio_init(&sio_dev); - if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { -#ifdef CONFIG_PARPORT_PC + if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ superio_parport_init(); -#endif -#ifdef CONFIG_SERIAL_8250 superio_serial_init(); -#endif - /* REVISIT : superio_fdc_init() ? */ + /* REVISIT XXX : superio_fdc_init() ? */ return 0; + } else if (dev->device == PCI_DEVICE_ID_NS_87415) { /* Function 0 */ + DBG_INIT("superio_probe: ignoring IDE 87415\n"); + } else if (dev->device == PCI_DEVICE_ID_NS_87560_USB) { /* Function 2 */ + DBG_INIT("superio_probe: ignoring USB OHCI controller\n"); } else { - /* don't claim this device; let whatever either driver - * do it - */ - return -1; + DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); } + + /* Let appropriate other driver claim this device. */ + return -ENODEV; } static struct pci_device_id superio_tbl[] = { @@ -524,10 +527,6 @@ pci_unregister_driver(&superio_driver); } -/* Make late initcall to ensure the serial and tty layers are initialised - * before we start superio. - * - * FIXME: does this break the superio console? - */ + module_init(superio_modinit); module_exit(superio_exit); diff -Nru a/drivers/parport/daisy.c b/drivers/parport/daisy.c --- a/drivers/parport/daisy.c Tue Feb 17 20:00:06 2004 +++ b/drivers/parport/daisy.c Tue Feb 17 20:00:06 2004 @@ -40,6 +40,7 @@ int daisy; int devnum; } *topology = NULL; +static spinlock_t topology_lock = SPIN_LOCK_UNLOCKED; static int numdevs = 0; @@ -52,22 +53,18 @@ /* Add a device to the discovered topology. */ static void add_dev (int devnum, struct parport *port, int daisy) { - struct daisydev *newdev; + struct daisydev *newdev, **p; newdev = kmalloc (sizeof (struct daisydev), GFP_KERNEL); if (newdev) { newdev->port = port; newdev->daisy = daisy; newdev->devnum = devnum; - newdev->next = topology; - if (!topology || topology->devnum >= devnum) - topology = newdev; - else { - struct daisydev *prev = topology; - while (prev->next && prev->next->devnum < devnum) - prev = prev->next; - newdev->next = prev->next; - prev->next = newdev; - } + spin_lock(&topology_lock); + for (p = &topology; *p && (*p)->devnumnext) + ; + newdev->next = *p; + *p = newdev; + spin_unlock(&topology_lock); } } @@ -157,26 +154,25 @@ /* Forget about devices on a physical port. */ void parport_daisy_fini (struct parport *port) { - struct daisydev *dev, *prev = topology; - while (prev && prev->port == port) { - topology = topology->next; - kfree (prev); - prev = topology; - } + struct daisydev **p; - while (prev) { - dev = prev->next; - if (dev && dev->port == port) { - prev->next = dev->next; - kfree (dev); + spin_lock(&topology_lock); + p = &topology; + while (*p) { + struct daisydev *dev = *p; + if (dev->port != port) { + p = &dev->next; + continue; } - prev = prev->next; + *p = dev->next; + kfree(dev); } /* Gaps in the numbering could be handled better. How should someone enumerate through all IEEE1284.3 devices in the topology?. */ if (!topology) numdevs = 0; + spin_unlock(&topology_lock); return; } @@ -205,30 +201,34 @@ void (*irqf) (int, void *, struct pt_regs *), int flags, void *handle) { - struct parport *port = parport_enumerate (); + struct daisydev *p = topology; + struct parport *port; struct pardevice *dev; - int portnum; - int muxnum; - int daisynum; + int daisy; - if (parport_device_coords (devnum, &portnum, &muxnum, &daisynum)) - return NULL; + spin_lock(&topology_lock); + while (p && p->devnum != devnum) + p = p->next; - while (port && ((port->portnum != portnum) || - (port->muxport != muxnum))) - port = port->next; - - if (!port) - /* No corresponding parport. */ + if (!p) { + spin_unlock(&topology_lock); return NULL; + } + + daisy = p->daisy; + port = parport_get_port(p->port); + spin_unlock(&topology_lock); dev = parport_register_device (port, name, pf, kf, irqf, flags, handle); - if (dev) - dev->daisy = daisynum; + parport_put_port(port); + if (!dev) + return NULL; + + dev->daisy = daisy; /* Check that there really is a device to select. */ - if (daisynum >= 0) { + if (daisy >= 0) { int selected; parport_claim_or_block (dev); selected = port->daisy; @@ -271,16 +271,19 @@ int parport_device_num (int parport, int mux, int daisy) { - struct daisydev *dev = topology; + int res = -ENXIO; + struct daisydev *dev; + spin_lock(&topology_lock); + dev = topology; while (dev && dev->port->portnum != parport && dev->port->muxport != mux && dev->daisy != daisy) dev = dev->next; + if (dev) + res = dev->devnum; + spin_unlock(&topology_lock); - if (!dev) - return -ENXIO; - - return dev->devnum; + return res; } /** @@ -310,17 +313,23 @@ int parport_device_coords (int devnum, int *parport, int *mux, int *daisy) { - struct daisydev *dev = topology; + struct daisydev *dev; + spin_lock(&topology_lock); + + dev = topology; while (dev && dev->devnum != devnum) dev = dev->next; - if (!dev) + if (!dev) { + spin_unlock(&topology_lock); return -ENXIO; + } if (parport) *parport = dev->port->portnum; if (mux) *mux = dev->port->muxport; if (daisy) *daisy = dev->daisy; + spin_unlock(&topology_lock); return 0; } @@ -557,9 +566,13 @@ int parport_find_device (const char *mfg, const char *mdl, int from) { - struct daisydev *d = topology; /* sorted by devnum */ + struct daisydev *d; + int res = -1; /* Find where to start. */ + + spin_lock(&topology_lock); + d = topology; /* sorted by devnum */ while (d && d->devnum <= from) d = d->next; @@ -575,9 +588,10 @@ } if (d) - return d->devnum; + res = d->devnum; - return -1; + spin_unlock(&topology_lock); + return res; } /** @@ -601,8 +615,11 @@ int parport_find_class (parport_device_class cls, int from) { - struct daisydev *d = topology; /* sorted by devnum */ + struct daisydev *d; + int res = -1; + spin_lock(&topology_lock); + d = topology; /* sorted by devnum */ /* Find where to start. */ while (d && d->devnum <= from) d = d->next; @@ -612,7 +629,8 @@ d = d->next; if (d) - return d->devnum; + res = d->devnum; - return -1; + spin_unlock(&topology_lock); + return res; } diff -Nru a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c --- a/drivers/parport/parport_gsc.c Tue Feb 17 20:00:08 2004 +++ b/drivers/parport/parport_gsc.c Tue Feb 17 20:00:08 2004 @@ -445,6 +445,7 @@ static int __devinit parport_init_chip(struct parisc_device *dev) { + struct parport *p; unsigned long port; if (!dev->irq) { @@ -467,13 +468,36 @@ printk("%s: enhanced parport-modes not supported.\n", __FUNCTION__); } - if (parport_gsc_probe_port(port, 0, dev->irq, - /* PARPORT_IRQ_NONE */ PARPORT_DMA_NONE, NULL)) + p = parport_gsc_probe_port(port, 0, dev->irq, + /* PARPORT_IRQ_NONE */ PARPORT_DMA_NONE, NULL); + if (p) parport_count++; + dev->dev.driver_data = p; return 0; } +static void __devexit parport_remove_chip(struct parisc_device *dev) +{ + struct parport *p = dev->dev.driver_data; + if (p) { + struct parport_gsc_private *priv = p->private_data; + struct parport_operations *ops = p->ops; + if (p->dma != PARPORT_DMA_NONE) + free_dma(p->dma); + if (p->irq != PARPORT_IRQ_NONE) + free_irq(p->irq, p); + parport_proc_unregister(p); + if (priv->dma_buf) + pci_free_consistent(priv->dev, PAGE_SIZE, + priv->dma_buf, + priv->dma_handle); + kfree (p->private_data); + parport_unregister_port(p); + kfree (ops); /* hope no-one cached it */ + } +} + static struct parisc_device_id parport_tbl[] = { { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x74 }, { 0, } @@ -485,6 +509,7 @@ .name = "Parallel", .id_table = parport_tbl, .probe = parport_init_chip, + .remove = parport_remove_chip, }; int __devinit parport_gsc_init(void) @@ -494,27 +519,6 @@ static void __devexit parport_gsc_exit(void) { - struct parport *p = parport_enumerate(), *tmp; - while (p) { - tmp = p->next; - if (p->modes & PARPORT_MODE_PCSPP) { - struct parport_gsc_private *priv = p->private_data; - struct parport_operations *ops = p->ops; - if (p->dma != PARPORT_DMA_NONE) - free_dma(p->dma); - if (p->irq != PARPORT_IRQ_NONE) - free_irq(p->irq, p); - parport_proc_unregister(p); - if (priv->dma_buf) - pci_free_consistent(priv->dev, PAGE_SIZE, - priv->dma_buf, - priv->dma_handle); - kfree (p->private_data); - parport_unregister_port(p); - kfree (ops); /* hope no-one cached it */ - } - p = tmp; - } unregister_parisc_driver(&parport_driver); } diff -Nru a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c --- a/drivers/parport/parport_pc.c Tue Feb 17 20:00:08 2004 +++ b/drivers/parport/parport_pc.c Tue Feb 17 20:00:08 2004 @@ -270,95 +270,6 @@ return IRQ_HANDLED; } -void parport_pc_write_data(struct parport *p, unsigned char d) -{ - outb (d, DATA (p)); -} - -unsigned char parport_pc_read_data(struct parport *p) -{ - return inb (DATA (p)); -} - -void parport_pc_write_control(struct parport *p, unsigned char d) -{ - const unsigned char wm = (PARPORT_CONTROL_STROBE | - PARPORT_CONTROL_AUTOFD | - PARPORT_CONTROL_INIT | - PARPORT_CONTROL_SELECT); - - /* Take this out when drivers have adapted to the newer interface. */ - if (d & 0x20) { - printk (KERN_DEBUG "%s (%s): use data_reverse for this!\n", - p->name, p->cad->name); - parport_pc_data_reverse (p); - } - - __parport_pc_frob_control (p, wm, d & wm); -} - -unsigned char parport_pc_read_control(struct parport *p) -{ - const unsigned char wm = (PARPORT_CONTROL_STROBE | - PARPORT_CONTROL_AUTOFD | - PARPORT_CONTROL_INIT | - PARPORT_CONTROL_SELECT); - const struct parport_pc_private *priv = p->physport->private_data; - return priv->ctr & wm; /* Use soft copy */ -} - -unsigned char parport_pc_frob_control (struct parport *p, unsigned char mask, - unsigned char val) -{ - const unsigned char wm = (PARPORT_CONTROL_STROBE | - PARPORT_CONTROL_AUTOFD | - PARPORT_CONTROL_INIT | - PARPORT_CONTROL_SELECT); - - /* Take this out when drivers have adapted to the newer interface. */ - if (mask & 0x20) { - printk (KERN_DEBUG "%s (%s): use data_%s for this!\n", - p->name, p->cad->name, - (val & 0x20) ? "reverse" : "forward"); - if (val & 0x20) - parport_pc_data_reverse (p); - else - parport_pc_data_forward (p); - } - - /* Restrict mask and val to control lines. */ - mask &= wm; - val &= wm; - - return __parport_pc_frob_control (p, mask, val); -} - -unsigned char parport_pc_read_status(struct parport *p) -{ - return inb (STATUS (p)); -} - -void parport_pc_disable_irq(struct parport *p) -{ - __parport_pc_frob_control (p, 0x10, 0); -} - -void parport_pc_enable_irq(struct parport *p) -{ - if (p->irq != PARPORT_IRQ_NONE) - __parport_pc_frob_control (p, 0x10, 0x10); -} - -void parport_pc_data_forward (struct parport *p) -{ - __parport_pc_frob_control (p, 0x20, 0); -} - -void parport_pc_data_reverse (struct parport *p) -{ - __parport_pc_frob_control (p, 0x20, 0x20); -} - void parport_pc_init_state(struct pardevice *dev, struct parport_state *s) { s->u.pc.ctr = 0xc; @@ -418,7 +329,8 @@ left -= 16; } else { /* grab single byte from the warp fifo */ - *((char *)buf)++ = inb (EPPDATA (port)); + *((char *)buf) = inb (EPPDATA (port)); + buf++; got++; left--; } @@ -445,7 +357,8 @@ return length; } for (; got < length; got++) { - *((char*)buf)++ = inb (EPPDATA(port)); + *((char*)buf) = inb (EPPDATA(port)); + buf++; if (inb (STATUS (port)) & 0x01) { /* EPP timeout */ clear_epp_timeout (port); @@ -474,7 +387,8 @@ return length; } for (; written < length; written++) { - outb (*((char*)buf)++, EPPDATA(port)); + outb (*((char*)buf), EPPDATA(port)); + buf++; if (inb (STATUS(port)) & 0x01) { clear_epp_timeout (port); break; @@ -498,7 +412,8 @@ return length; } for (; got < length; got++) { - *((char*)buf)++ = inb (EPPADDR (port)); + *((char*)buf) = inb (EPPADDR (port)); + buf++; if (inb (STATUS (port)) & 0x01) { clear_epp_timeout (port); break; @@ -523,7 +438,8 @@ return length; } for (; written < length; written++) { - outb (*((char*)buf)++, EPPADDR (port)); + outb (*((char*)buf), EPPADDR (port)); + buf++; if (inb (STATUS (port)) & 0x01) { clear_epp_timeout (port); break; @@ -1235,6 +1151,8 @@ * ****************************************** */ +/* GCC is not inlining extern inline function later overwriten to non-inline, + so we use outlined_ variants here. */ struct parport_operations parport_pc_ops = { .write_data = parport_pc_write_data, @@ -2686,25 +2604,10 @@ enum parport_pc_pci_cards { - siig_1s1p_10x_550 = last_sio, - siig_1s1p_10x_650, - siig_1s1p_10x_850, - siig_1p_10x, + siig_1p_10x = last_sio, siig_2p_10x, - siig_2s1p_10x_550, - siig_2s1p_10x_650, - siig_2s1p_10x_850, siig_1p_20x, siig_2p_20x, - siig_2p1s_20x_550, - siig_2p1s_20x_650, - siig_2p1s_20x_850, - siig_1s1p_20x_550, - siig_1s1p_20x_650, - siig_1s1p_20x_850, - siig_2s1p_20x_550, - siig_2s1p_20x_650, - siig_2s1p_20x_850, lava_parallel, lava_parallel_dual_a, lava_parallel_dual_b, @@ -2766,25 +2669,10 @@ * is non-zero we couldn't use any of the ports. */ void (*postinit_hook) (struct pci_dev *pdev, int failed); } cards[] __devinitdata = { - /* siig_1s1p_10x_550 */ { 1, { { 3, 4 }, } }, - /* siig_1s1p_10x_650 */ { 1, { { 3, 4 }, } }, - /* siig_1s1p_10x_850 */ { 1, { { 3, 4 }, } }, /* siig_1p_10x */ { 1, { { 2, 3 }, } }, /* siig_2p_10x */ { 2, { { 2, 3 }, { 4, 5 }, } }, - /* siig_2s1p_10x_550 */ { 1, { { 4, 5 }, } }, - /* siig_2s1p_10x_650 */ { 1, { { 4, 5 }, } }, - /* siig_2s1p_10x_850 */ { 1, { { 4, 5 }, } }, /* siig_1p_20x */ { 1, { { 0, 1 }, } }, /* siig_2p_20x */ { 2, { { 0, 1 }, { 2, 3 }, } }, - /* siig_2p1s_20x_550 */ { 2, { { 1, 2 }, { 3, 4 }, } }, - /* siig_2p1s_20x_650 */ { 2, { { 1, 2 }, { 3, 4 }, } }, - /* siig_2p1s_20x_850 */ { 2, { { 1, 2 }, { 3, 4 }, } }, - /* siig_1s1p_20x_550 */ { 1, { { 1, 2 }, } }, - /* siig_1s1p_20x_650 */ { 1, { { 1, 2 }, } }, - /* siig_1s1p_20x_850 */ { 1, { { 1, 2 }, } }, - /* siig_2s1p_20x_550 */ { 1, { { 2, 3 }, } }, - /* siig_2s1p_20x_650 */ { 1, { { 2, 3 }, } }, - /* siig_2s1p_20x_850 */ { 1, { { 2, 3 }, } }, /* lava_parallel */ { 1, { { 0, -1 }, } }, /* lava_parallel_dual_a */ { 1, { { 0, -1 }, } }, /* lava_parallel_dual_b */ { 1, { { 0, -1 }, } }, @@ -2836,44 +2724,14 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_ite_8872 }, /* PCI cards */ - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_550 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_650 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_850 }, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1p_10x }, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p_10x }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_550 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_650 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_850 }, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1p_20x }, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p_20x }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_550 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_650 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_850 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_550 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x_650 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x_850 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_550 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_650 }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_850 }, { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL, PCI_ANY_ID, PCI_ANY_ID, 0, 0, lava_parallel }, { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A, diff -Nru a/drivers/parport/share.c b/drivers/parport/share.c --- a/drivers/parport/share.c Tue Feb 17 20:00:07 2004 +++ b/drivers/parport/share.c Tue Feb 17 20:00:07 2004 @@ -44,8 +44,13 @@ static struct parport *portlist = NULL, *portlist_tail = NULL; static spinlock_t parportlist_lock = SPIN_LOCK_UNLOCKED; +/* list of all allocated ports, sorted by ->number */ +static LIST_HEAD(all_ports); +static spinlock_t full_list_lock = SPIN_LOCK_UNLOCKED; + static struct parport_driver *driver_chain = NULL; -static spinlock_t driverlist_lock = SPIN_LOCK_UNLOCKED; + +static DECLARE_MUTEX(registration_lock); /* What you can do to a port that's gone away.. */ static void dead_write_lines (struct parport *p, unsigned char b){} @@ -98,55 +103,19 @@ /* Call attach(port) for each registered driver. */ static void attach_driver_chain(struct parport *port) { + /* caller has exclusive registration_lock */ struct parport_driver *drv; - void (**attach) (struct parport *); - int count = 0, i; - - /* This is complicated because attach() must be able to block, - * but we can't let it do that while we're holding a - * spinlock. */ - - spin_lock (&driverlist_lock); for (drv = driver_chain; drv; drv = drv->next) - count++; - spin_unlock (&driverlist_lock); - - /* Drivers can unregister here; that's okay. If they register - * they'll be given an attach during parport_register_driver, - * so that's okay too. The only worry is that someone might - * get given an attach twice if they registered just before - * this function gets called. */ - - /* Hmm, this could be fixed with a generation number.. - * FIXME */ - - attach = kmalloc (sizeof (void(*)(struct parport *)) * count, - GFP_KERNEL); - if (!attach) { - printk (KERN_WARNING "parport: not enough memory to attach\n"); - return; - } - - spin_lock (&driverlist_lock); - for (i = 0, drv = driver_chain; drv && i < count; drv = drv->next) - attach[i++] = drv->attach; - spin_unlock (&driverlist_lock); - - for (count = 0; count < i; count++) - (*attach[count]) (port); - - kfree (attach); + drv->attach(port); } /* Call detach(port) for each registered driver. */ static void detach_driver_chain(struct parport *port) { + /* caller has exclusive registration_lock */ struct parport_driver *drv; - - spin_lock (&driverlist_lock); for (drv = driver_chain; drv; drv = drv->next) drv->detach (port); - spin_unlock (&driverlist_lock); } /* Ask kmod for some lowlevel drivers. */ @@ -174,7 +143,7 @@ * pointer it must call parport_get_port() to do so. Calling * parport_register_device() on that port will do this for you. * - * The driver's detach() function may not block. The port that + * The driver's detach() function may block. The port that * detach() is given will be valid for the duration of the * callback, but if the driver wants to take a copy of the * pointer it must call parport_get_port() to do so. @@ -185,8 +154,6 @@ int parport_register_driver (struct parport_driver *drv) { struct parport *port; - struct parport **ports; - int count = 0, i; if (!portlist) get_lowlevel_driver (); @@ -199,31 +166,12 @@ * it. But we need to hold a spinlock to iterate over the * list of ports.. */ - spin_lock (&parportlist_lock); + down(®istration_lock); for (port = portlist; port; port = port->next) - count++; - spin_unlock (&parportlist_lock); - - ports = kmalloc (sizeof (struct parport *) * count, GFP_KERNEL); - if (!ports) - printk (KERN_WARNING "parport: not enough memory to attach\n"); - else { - spin_lock (&parportlist_lock); - for (i = 0, port = portlist; port && i < count; - port = port->next) - ports[i++] = port; - spin_unlock (&parportlist_lock); - - for (count = 0; count < i; count++) - drv->attach (ports[count]); - - kfree (ports); - } - - spin_lock (&driverlist_lock); + drv->attach(port); drv->next = driver_chain; driver_chain = drv; - spin_unlock (&driverlist_lock); + up(®istration_lock); return 0; } @@ -241,49 +189,46 @@ * be called, and for each port that attach() was called for, the * detach() routine will have been called. * - * If the caller's attach() function can block, it is their - * responsibility to make sure to wait for it to exit before - * unloading. - * - * All the driver's detach() calls are guaranteed to have + * All the driver's attach() and detach() calls are guaranteed to have * finished by the time this function returns. - * - * The driver's detach() call is not allowed to block. **/ void parport_unregister_driver (struct parport_driver *arg) { - struct parport_driver *drv = driver_chain, *olddrv = NULL; + struct parport_driver *drv, *olddrv = NULL; + down(®istration_lock); + drv = driver_chain; while (drv) { if (drv == arg) { struct parport *port; - spin_lock (&driverlist_lock); if (olddrv) olddrv->next = drv->next; else driver_chain = drv->next; - spin_unlock (&driverlist_lock); /* Call the driver's detach routine for each * port to clean up any resources that the * attach routine acquired. */ - spin_lock (&parportlist_lock); for (port = portlist; port; port = port->next) drv->detach (port); - spin_unlock (&parportlist_lock); + up(®istration_lock); return; } olddrv = drv; drv = drv->next; } + up(®istration_lock); } static void free_port (struct parport *port) { int d; + spin_lock(&full_list_lock); + list_del(&port->full_list); + spin_unlock(&full_list_lock); for (d = 0; d < 5; d++) { if (port->probe_info[d].class_name) kfree (port->probe_info[d].class_name); @@ -386,8 +331,9 @@ struct parport *parport_register_port(unsigned long base, int irq, int dma, struct parport_operations *ops) { + struct list_head *l; struct parport *tmp; - int portnum; + int num; int device; char *name; @@ -418,6 +364,7 @@ init_MUTEX_LOCKED (&tmp->ieee1284.irq); /* actually a semaphore at 0 */ tmp->spintime = parport_default_spintime; atomic_set (&tmp->ref_count, 1); + INIT_LIST_HEAD(&tmp->full_list); name = kmalloc(15, GFP_KERNEL); if (!name) { @@ -427,53 +374,22 @@ } /* Search for the lowest free parport number. */ - spin_lock_irq (&parportlist_lock); - for (portnum = 0; ; portnum++) { - struct parport *itr = portlist; - while (itr) { - if (itr->number == portnum) - /* No good, already used. */ - break; - else - itr = itr->next; - } - - if (itr == NULL) - /* Got to the end of the list. */ + spin_lock(&full_list_lock); + for (l = all_ports.next, num = 0; l != &all_ports; l = l->next, num++) { + struct parport *p = list_entry(l, struct parport, full_list); + if (p->number != num) break; } + tmp->portnum = tmp->number = num; + list_add_tail(&tmp->full_list, l); + spin_unlock(&full_list_lock); /* * Now that the portnum is known finish doing the Init. */ - tmp->portnum = tmp->number = portnum; - sprintf(name, "parport%d", portnum); + sprintf(name, "parport%d", tmp->portnum = tmp->number); tmp->name = name; - - /* - * Chain the entry to our list. - * - * This function must not run from an irq handler so we don' t need - * to clear irq on the local CPU. -arca - */ - - /* We are locked against anyone else performing alterations, but - * because of parport_enumerate people can still _read_ the list - * while we are changing it; so be careful.. - * - * It's okay to have portlist_tail a little bit out of sync - * since it's only used for changing the list, not for reading - * from it. - */ - - if (portlist_tail) - portlist_tail->next = tmp; - portlist_tail = tmp; - if (!portlist) - portlist = tmp; - spin_unlock_irq(&parportlist_lock); - for (device = 0; device < 5; device++) /* assume the worst */ tmp->probe_info[device].class = PARPORT_CLASS_LEGACY; @@ -497,6 +413,7 @@ void parport_announce_port (struct parport *port) { + #ifdef CONFIG_PARPORT_1284 /* Analyse the IEEE1284.3 topology of the port. */ if (parport_daisy_init (port) == 0) { @@ -514,8 +431,27 @@ } #endif + down(®istration_lock); + /* We are locked against anyone else performing alterations, but + * because of parport_enumerate people can still _read_ the list + * while we are changing it; so be careful.. + * + * It's okay to have portlist_tail a little bit out of sync + * since it's only used for changing the list, not for reading + * from it. + */ + + spin_lock_irq(&parportlist_lock); + if (portlist_tail) + portlist_tail->next = port; + portlist_tail = port; + if (!portlist) + portlist = port; + spin_unlock_irq(&parportlist_lock); + /* Let drivers know that a new port has arrived. */ attach_driver_chain (port); + up(®istration_lock); } /** @@ -541,6 +477,7 @@ { struct parport *p; + down(®istration_lock); port->ops = &dead_ops; /* Spread the word. */ @@ -570,6 +507,7 @@ "%s not found in port list!\n", port->name); } spin_unlock(&parportlist_lock); + up(®istration_lock); /* Yes, parport_enumerate _is_ unsafe. Don't use it. */ parport_put_port (port); diff -Nru a/drivers/pci/Makefile b/drivers/pci/Makefile --- a/drivers/pci/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/pci/Makefile Tue Feb 17 20:00:08 2004 @@ -2,7 +2,7 @@ # Makefile for the PCI bus specific drivers. # -obj-y += access.o bus.o probe.o remove.o pci.o pool.o quirks.o \ +obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \ names.o pci-driver.o search.o pci-sysfs.o obj-$(CONFIG_PROC_FS) += proc.o diff -Nru a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c --- a/drivers/pci/hotplug/acpiphp_core.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pci/hotplug/acpiphp_core.c Tue Feb 17 20:00:07 2004 @@ -374,7 +374,7 @@ } -static int init_acpi (void) +static int __init init_acpi (void) { int retval; @@ -426,7 +426,7 @@ * init_slots - initialize 'struct slot' structures for each slot * */ -static int init_slots (void) +static int __init init_slots (void) { struct slot *slot; int retval = 0; @@ -492,7 +492,7 @@ } -static void cleanup_slots (void) +static void __exit cleanup_slots (void) { struct list_head *tmp, *n; struct slot *slot; diff -Nru a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c --- a/drivers/pci/hotplug/acpiphp_glue.c Tue Feb 17 20:00:06 2004 +++ b/drivers/pci/hotplug/acpiphp_glue.c Tue Feb 17 20:00:06 2004 @@ -87,7 +87,7 @@ /* callback routine to check the existence of ejectable slots */ static acpi_status -is_ejectable_slot (acpi_handle handle, u32 lvl, void *context, void **rv) +is_ejectable_slot(acpi_handle handle, u32 lvl, void *context, void **rv) { int *count = (int *)context; @@ -103,7 +103,7 @@ /* callback routine to register each ACPI PCI slot object */ static acpi_status -register_slot (acpi_handle handle, u32 lvl, void *context, void **rv) +register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) { struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context; struct acpiphp_slot *slot; @@ -212,7 +212,7 @@ /* see if it's worth looking at this bridge */ -static int detect_ejectable_slots (acpi_handle *bridge_handle) +static int detect_ejectable_slots(acpi_handle *bridge_handle) { acpi_status status; int count; @@ -231,7 +231,7 @@ * TBD: _TRA, etc. */ static acpi_status -decode_acpi_resource (struct acpi_resource *resource, void *context) +decode_acpi_resource(struct acpi_resource *resource, void *context) { struct acpiphp_bridge *bridge = (struct acpiphp_bridge *) context; struct acpi_resource_address64 address; @@ -339,7 +339,7 @@ /* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */ -static void init_bridge_misc (struct acpiphp_bridge *bridge) +static void init_bridge_misc(struct acpiphp_bridge *bridge) { acpi_status status; @@ -371,7 +371,7 @@ /* allocate and initialize host bridge data structure */ -static void add_host_bridge (acpi_handle *handle, int seg, int bus) +static void add_host_bridge(acpi_handle *handle, int seg, int bus) { acpi_status status; struct acpiphp_bridge *bridge; @@ -423,7 +423,7 @@ /* allocate and initialize PCI-to-PCI bridge data structure */ -static void add_p2p_bridge (acpi_handle *handle, int seg, int bus, int dev, int fn) +static void add_p2p_bridge(acpi_handle *handle, int seg, int bus, int dev, int fn) { struct acpiphp_bridge *bridge; u8 tmp8; @@ -573,7 +573,7 @@ /* callback routine to find P2P bridges */ static acpi_status -find_p2p_bridge (acpi_handle handle, u32 lvl, void *context, void **rv) +find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) { acpi_status status; acpi_handle dummy_handle; @@ -673,13 +673,13 @@ } -static void remove_bridge (acpi_handle handle) +static void remove_bridge(acpi_handle handle) { /* No-op for now .. */ } -static int power_on_slot (struct acpiphp_slot *slot) +static int power_on_slot(struct acpiphp_slot *slot) { acpi_status status; struct acpiphp_func *func; @@ -714,7 +714,7 @@ } -static int power_off_slot (struct acpiphp_slot *slot) +static int power_off_slot(struct acpiphp_slot *slot) { acpi_status status; struct acpiphp_func *func; @@ -778,7 +778,7 @@ * not per each slot object in ACPI namespace. * */ -static int enable_device (struct acpiphp_slot *slot) +static int enable_device(struct acpiphp_slot *slot) { u8 bus; struct pci_dev *dev; @@ -852,7 +852,7 @@ /** * disable_device - disable a slot */ -static int disable_device (struct acpiphp_slot *slot) +static int disable_device(struct acpiphp_slot *slot) { int retval = 0; struct acpiphp_func *func; @@ -894,7 +894,7 @@ * * otherwise return 0 */ -static unsigned int get_slot_status (struct acpiphp_slot *slot) +static unsigned int get_slot_status(struct acpiphp_slot *slot) { acpi_status status; unsigned long sta = 0; @@ -939,7 +939,7 @@ * handles ACPI event notification on {host,p2p} bridges * */ -static void handle_hotplug_event_bridge (acpi_handle handle, u32 type, void *context) +static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *context) { struct acpiphp_bridge *bridge; char objname[64]; @@ -1005,7 +1005,7 @@ * handles ACPI event notification on slots * */ -static void handle_hotplug_event_func (acpi_handle handle, u32 type, void *context) +static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context) { struct acpiphp_func *func; char objname[64]; @@ -1056,7 +1056,7 @@ * acpiphp_glue_init - initializes all PCI hotplug - ACPI glue data structures * */ -int acpiphp_glue_init (void) +int __init acpiphp_glue_init(void) { int num; @@ -1077,7 +1077,7 @@ * * This function frees all data allocated in acpiphp_glue_init() */ -void acpiphp_glue_exit (void) +void __exit acpiphp_glue_exit(void) { struct list_head *l1, *l2, *n1, *n2; struct acpiphp_bridge *bridge; @@ -1124,7 +1124,7 @@ /** * acpiphp_get_num_slots - count number of slots in a system */ -int acpiphp_get_num_slots (void) +int __init acpiphp_get_num_slots(void) { struct list_head *node; struct acpiphp_bridge *bridge; @@ -1171,7 +1171,7 @@ /* search matching slot from id */ -struct acpiphp_slot *get_slot_from_id (int id) +struct acpiphp_slot *get_slot_from_id(int id) { struct list_head *node; struct acpiphp_bridge *bridge; @@ -1193,7 +1193,7 @@ /** * acpiphp_enable_slot - power on slot */ -int acpiphp_enable_slot (struct acpiphp_slot *slot) +int acpiphp_enable_slot(struct acpiphp_slot *slot) { int retval; @@ -1217,7 +1217,7 @@ /** * acpiphp_disable_slot - power off slot */ -int acpiphp_disable_slot (struct acpiphp_slot *slot) +int acpiphp_disable_slot(struct acpiphp_slot *slot) { int retval = 0; @@ -1249,7 +1249,7 @@ /** * acpiphp_check_bridge - re-enumerate devices */ -int acpiphp_check_bridge (struct acpiphp_bridge *bridge) +int acpiphp_check_bridge(struct acpiphp_bridge *bridge) { struct acpiphp_slot *slot; unsigned int sta; @@ -1296,7 +1296,7 @@ * slot enabled: 1 * slot disabled: 0 */ -u8 acpiphp_get_power_status (struct acpiphp_slot *slot) +u8 acpiphp_get_power_status(struct acpiphp_slot *slot) { unsigned int sta; @@ -1314,7 +1314,7 @@ * no direct attention led status information via ACPI * */ -u8 acpiphp_get_attention_status (struct acpiphp_slot *slot) +u8 acpiphp_get_attention_status(struct acpiphp_slot *slot) { return 0; } @@ -1324,7 +1324,7 @@ * latch closed: 1 * latch open: 0 */ -u8 acpiphp_get_latch_status (struct acpiphp_slot *slot) +u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) { unsigned int sta; @@ -1338,7 +1338,7 @@ * adapter presence : 1 * absence : 0 */ -u8 acpiphp_get_adapter_status (struct acpiphp_slot *slot) +u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot) { unsigned int sta; @@ -1351,7 +1351,7 @@ /* * pci address (seg/bus/dev) */ -u32 acpiphp_get_address (struct acpiphp_slot *slot) +u32 acpiphp_get_address(struct acpiphp_slot *slot) { u32 address; diff -Nru a/drivers/pci/hotplug/cpqphp_ctrl.c b/drivers/pci/hotplug/cpqphp_ctrl.c --- a/drivers/pci/hotplug/cpqphp_ctrl.c Tue Feb 17 20:00:06 2004 +++ b/drivers/pci/hotplug/cpqphp_ctrl.c Tue Feb 17 20:00:06 2004 @@ -2446,7 +2446,7 @@ u8 behind_bridge, struct resource_lists * resources) { int cloop; - u8 IRQ; + u8 IRQ = 0; u8 temp_byte; u8 device; u8 class_code; @@ -3021,6 +3021,7 @@ } } // End of base register loop +#if !defined(CONFIG_X86_IO_APIC) // Figure out which interrupt pin this function uses rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_INTERRUPT_PIN, &temp_byte); @@ -3045,6 +3046,7 @@ // IRQ Line rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_INTERRUPT_LINE, IRQ); +#endif if (!behind_bridge) { rc = cpqhp_set_irq(func->bus, func->device, temp_byte + 0x09, IRQ); diff -Nru a/drivers/pci/hotplug/cpqphp_pci.c b/drivers/pci/hotplug/cpqphp_pci.c --- a/drivers/pci/hotplug/cpqphp_pci.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pci/hotplug/cpqphp_pci.c Tue Feb 17 20:00:08 2004 @@ -123,7 +123,7 @@ dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function); for (j=0; j<8 ; j++) { - struct pci_dev* temp = pci_find_slot(func->bus, (func->device << 3) | j); + struct pci_dev* temp = pci_find_slot(func->bus, PCI_DEVFN(func->device, j)); if (temp) pci_remove_bus_device(temp); } @@ -151,6 +151,7 @@ */ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num) { +#if !defined(CONFIG_X86_IO_APIC) int rc; u16 temp_word; struct pci_dev fakedev; @@ -175,6 +176,7 @@ // This should only be for x86 as it sets the Edge Level Control Register outb((u8) (temp_word & 0xFF), 0x4d0); outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1); +#endif return 0; } @@ -545,10 +547,10 @@ } while (function < max_functions); } // End of IF (device in slot?) else { - return(2); + return 2; } - return(0); + return 0; } @@ -594,9 +596,8 @@ while (next != NULL) { rc = cpqhp_save_base_addr_length(ctrl, next); - if (rc) - return(rc); + return rc; next = next->next; } @@ -979,7 +980,6 @@ while (next != NULL) { rc = cpqhp_configure_board(ctrl, next); - if (rc) return rc; @@ -1076,9 +1076,8 @@ while (next != NULL) { rc = cpqhp_valid_replace(ctrl, next); - if (rc) - return(rc); + return rc; next = next->next; } @@ -1144,7 +1143,7 @@ } - return(0); + return 0; } @@ -1229,9 +1228,8 @@ i = readb(rom_resource_table + NUMBER_OF_ENTRIES); dbg("number_of_entries = %d\n", i); - if (!readb(one_slot + SECONDARY_BUS)) { - return(1); - } + if (!readb(one_slot + SECONDARY_BUS)) + return 1; dbg("dev|IO base|length|Mem base|length|Pre base|length|PB SB MB\n"); @@ -1391,7 +1389,7 @@ rc &= cpqhp_resource_sort_and_combine(&(ctrl->io_head)); rc &= cpqhp_resource_sort_and_combine(&(ctrl->bus_head)); - return(rc); + return rc; } @@ -1411,7 +1409,7 @@ dbg("%s\n", __FUNCTION__); if (!func) - return(1); + return 1; node = func->io_head; func->io_head = NULL; @@ -1450,7 +1448,7 @@ rc |= cpqhp_resource_sort_and_combine(&(resources->io_head)); rc |= cpqhp_resource_sort_and_combine(&(resources->bus_head)); - return(rc); + return rc; } diff -Nru a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c --- a/drivers/pci/hotplug/ibmphp_core.c Tue Feb 17 20:00:14 2004 +++ b/drivers/pci/hotplug/ibmphp_core.c Tue Feb 17 20:00:14 2004 @@ -104,7 +104,7 @@ if (rc) return rc; if (!init_flag) - return get_cur_bus_info (sl); + rc = get_cur_bus_info(sl); return rc; } @@ -116,7 +116,7 @@ list_for_each (tmp, &ibmphp_slot_head) { slot_cur = list_entry (tmp, struct slot, ibm_slot_list); - /* sometimes the hot-pluggable slots start with 4 (not always from 1 */ + /* sometimes the hot-pluggable slots start with 4 (not always from 1) */ slot_count = max (slot_count, slot_cur->number); } return slot_count; @@ -187,7 +187,7 @@ return retval; } if (CTLR_RESULT (slot_cur->ctrl->status)) { - err ("command not completed successfully in power_on \n"); + err ("command not completed successfully in power_on\n"); return -EIO; } long_delay (3 * HZ); /* For ServeRAID cards, and some 66 PCI */ @@ -201,14 +201,14 @@ retval = ibmphp_hpc_writeslot (slot_cur, cmd); if (retval) { - err ("power off failed \n"); + err ("power off failed\n"); return retval; } if (CTLR_RESULT (slot_cur->ctrl->status)) { - err ("command not completed successfully in power_off \n"); - return -EIO; + err ("command not completed successfully in power_off\n"); + retval = -EIO; } - return 0; + return retval; } static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value) @@ -216,7 +216,6 @@ int rc = 0; struct slot *pslot; u8 cmd; - int hpcrc = 0; debug ("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n", (ulong) hotplug_slot, value); ibmphp_lock_operations (); @@ -241,16 +240,13 @@ if (rc == 0) { pslot = (struct slot *) hotplug_slot->private; if (pslot) - hpcrc = ibmphp_hpc_writeslot (pslot, cmd); + rc = ibmphp_hpc_writeslot(pslot, cmd); else rc = -ENODEV; } } else rc = -ENODEV; - if (hpcrc) - rc = hpcrc; - ibmphp_unlock_operations (); debug ("set_attention_status - Exit rc[%d]\n", rc); @@ -261,7 +257,6 @@ { int rc = -ENODEV; struct slot *pslot; - int hpcrc = 0; struct slot myslot; debug ("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); @@ -271,22 +266,16 @@ pslot = (struct slot *) hotplug_slot->private; if (pslot) { memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); - hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); - if (!hpcrc) - hpcrc = ibmphp_hpc_readslot (pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); - if (!hpcrc) { + rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status)); + if (!rc) + rc = ibmphp_hpc_readslot(pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); + if (!rc) *value = SLOT_ATTN (myslot.status, myslot.ext_status); - rc = 0; - } } - } else - rc = -ENODEV; - - if (hpcrc) - rc = hpcrc; + } ibmphp_unlock_operations (); - debug ("get_attention_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); + debug("get_attention_status - Exit rc[%d] value[%x]\n", rc, *value); return rc; } @@ -294,7 +283,6 @@ { int rc = -ENODEV; struct slot *pslot; - int hpcrc = 0; struct slot myslot; debug ("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); @@ -303,20 +291,14 @@ pslot = (struct slot *) hotplug_slot->private; if (pslot) { memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); - hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); - if (!hpcrc) { + rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status)); + if (!rc) *value = SLOT_LATCH (myslot.status); - rc = 0; - } } - } else - rc = -ENODEV; - - if (hpcrc) - rc = hpcrc; + } ibmphp_unlock_operations (); - debug ("get_latch_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); + debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n", rc, rc, *value); return rc; } @@ -325,7 +307,6 @@ { int rc = -ENODEV; struct slot *pslot; - int hpcrc = 0; struct slot myslot; debug ("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); @@ -334,20 +315,14 @@ pslot = (struct slot *) hotplug_slot->private; if (pslot) { memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); - hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); - if (!hpcrc) { + rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status)); + if (!rc) *value = SLOT_PWRGD (myslot.status); - rc = 0; - } } - } else - rc = -ENODEV; - - if (hpcrc) - rc = hpcrc; + } ibmphp_unlock_operations (); - debug ("get_power_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); + debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n", rc, rc, *value); return rc; } @@ -356,7 +331,6 @@ int rc = -ENODEV; struct slot *pslot; u8 present; - int hpcrc = 0; struct slot myslot; debug ("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); @@ -365,23 +339,19 @@ pslot = (struct slot *) hotplug_slot->private; if (pslot) { memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); - hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); - if (!hpcrc) { + rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status)); + if (!rc) { present = SLOT_PRESENT (myslot.status); if (present == HPC_SLOT_EMPTY) *value = 0; else *value = 1; - rc = 0; } } - } else - rc = -ENODEV; - if (hpcrc) - rc = hpcrc; + } ibmphp_unlock_operations (); - debug ("get_adapter_present - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); + debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc, *value); return rc; } @@ -418,8 +388,7 @@ rc = -ENODEV; } } - } else - rc = -ENODEV; + } ibmphp_unlock_operations (); debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value); @@ -465,8 +434,7 @@ } } } - } else - rc = -ENODEV; + } ibmphp_unlock_operations (); debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value); @@ -477,7 +445,6 @@ { int rc = -ENODEV; struct slot *pslot; - int hpcrc = 0; struct slot myslot; debug ("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong)hotplug_slot, (ulong) value); @@ -489,29 +456,21 @@ pslot = (struct slot *) hotplug_slot->private; if (pslot) { memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); - hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); + rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status)); if (!(SLOT_LATCH (myslot.status)) && (SLOT_PRESENT (myslot.status))) { - hpcrc = ibmphp_hpc_readslot (pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); - if (!hpcrc) { + rc = ibmphp_hpc_readslot(pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); + if (!rc) *value = SLOT_SPEED (myslot.ext_status); - rc = 0; - } - } else { + } else *value = MAX_ADAPTER_NONE; - rc = 0; - } } - } else - rc = -ENODEV; - - if (hpcrc) - rc = hpcrc; + } if (flag) ibmphp_unlock_operations (); - debug ("get_max_adapter_speed_1 - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); + debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value); return rc; } @@ -520,7 +479,7 @@ int rc = -ENODEV; struct slot *pslot = NULL; - debug ("get_bus_name - Entry hotplug_slot[%lx] \n", (ulong)hotplug_slot); + debug ("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot); ibmphp_lock_operations (); @@ -654,7 +613,7 @@ info = kmalloc (sizeof (struct hotplug_slot_info), GFP_KERNEL); if (!info) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } @@ -745,21 +704,20 @@ debug ("%s -- exit\n", __FUNCTION__); } -static int ibm_unconfigure_device (struct pci_func *func) +static void ibm_unconfigure_device(struct pci_func *func) { struct pci_dev *temp; u8 j; - debug ("inside %s\n", __FUNCTION__); - debug ("func->device = %x, func->function = %x\n", func->device, func->function); - debug ("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0); + debug("inside %s\n", __FUNCTION__); + debug("func->device = %x, func->function = %x\n", func->device, func->function); + debug("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0); for (j = 0; j < 0x08; j++) { - temp = pci_find_slot (func->busno, (func->device << 3) | j); + temp = pci_find_slot(func->busno, (func->device << 3) | j); if (temp) pci_remove_bus_device(temp); } - return 0; } /* @@ -794,7 +752,7 @@ dev->bus = bus; for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) { if (!pci_read_config_word (dev, PCI_VENDOR_ID, &l) && l != 0x0000 && l != 0xffff) { - debug ("%s - Inside bus_struture_fixup() \n", __FUNCTION__); + debug ("%s - Inside bus_struture_fixup()\n", __FUNCTION__); pci_scan_bus (busno, ibmphp_pci_bus->ops, NULL); break; } @@ -829,7 +787,7 @@ func->dev = pci_find_slot(func->busno, PCI_DEVFN(func->device, func->function)); if (func->dev == NULL) { - err ("ERROR... : pci_dev still NULL \n"); + err ("ERROR... : pci_dev still NULL\n"); return 0; } } @@ -883,7 +841,7 @@ struct pci_dev *dev = NULL; int retval; - debug ("%s - entry slot # %d \n", __FUNCTION__, slot_cur->number); + debug ("%s - entry slot # %d\n", __FUNCTION__, slot_cur->number); if (SET_BUS_STATUS (slot_cur->ctrl) && is_bus_empty (slot_cur)) { rc = slot_update (&slot_cur); if (rc) @@ -934,12 +892,12 @@ cmd = HPC_BUS_133PCIXMODE; break; default: - err ("Wrong bus speed \n"); + err ("Wrong bus speed\n"); return -ENODEV; } break; default: - err ("wrong slot speed \n"); + err ("wrong slot speed\n"); return -ENODEV; } debug ("setting bus speed for slot %d, cmd %x\n", slot_cur->number, cmd); @@ -949,14 +907,14 @@ return retval; } if (CTLR_RESULT (slot_cur->ctrl->status)) { - err ("command not completed successfully in set_bus \n"); + err ("command not completed successfully in set_bus\n"); return -EIO; } } /* This is for x440, once Brandon fixes the firmware, will not need this delay */ long_delay (1 * HZ); - debug ("%s -Exit \n", __FUNCTION__); + debug ("%s -Exit\n", __FUNCTION__); return 0; } @@ -1009,13 +967,13 @@ { info ("capability of the card is "); if ((slot_cur->ext_status & CARD_INFO) == PCIX133) - info (" 133 MHz PCI-X \n"); + info (" 133 MHz PCI-X\n"); else if ((slot_cur->ext_status & CARD_INFO) == PCIX66) - info (" 66 MHz PCI-X \n"); + info (" 66 MHz PCI-X\n"); else if ((slot_cur->ext_status & CARD_INFO) == PCI66) - info (" 66 MHz PCI \n"); + info (" 66 MHz PCI\n"); else - info (" 33 MHz PCI \n"); + info (" 33 MHz PCI\n"); } @@ -1033,11 +991,11 @@ ibmphp_lock_operations (); - debug ("ENABLING SLOT........ \n"); + debug ("ENABLING SLOT........\n"); slot_cur = (struct slot *) hs->private; if ((rc = validate (slot_cur, ENABLE))) { - err ("validate function failed \n"); + err ("validate function failed\n"); goto error_nopower; } @@ -1045,13 +1003,13 @@ rc = set_bus (slot_cur); if (rc) { - err ("was not able to set the bus \n"); + err ("was not able to set the bus\n"); goto error_nopower; } /*-----------------debugging------------------------------*/ get_cur_bus_info (&slot_cur); - debug ("the current bus speed right after set_bus = %x \n", slot_cur->bus_on->current_speed); + debug ("the current bus speed right after set_bus = %x\n", slot_cur->bus_on->current_speed); /*----------------------------------------------------------*/ rc = check_limitations (slot_cur); @@ -1059,7 +1017,7 @@ err ("Adding this card exceeds the limitations of this bus.\n"); err ("(i.e., >1 133MHz cards running on same bus, or " ">2 66 PCI cards running on same bus\n."); - err ("Try hot-adding into another bus \n"); + err ("Try hot-adding into another bus\n"); rc = -EINVAL; goto error_nopower; } @@ -1079,12 +1037,12 @@ } /* Check to see the error of why it failed */ if ((SLOT_POWER (slot_cur->status)) && !(SLOT_PWRGD (slot_cur->status))) - err ("power fault occurred trying to power up \n"); + err ("power fault occurred trying to power up\n"); else if (SLOT_BUS_SPEED (slot_cur->status)) { - err ("bus speed mismatch occurred. please check current bus speed and card capability \n"); + err ("bus speed mismatch occurred. please check current bus speed and card capability\n"); print_card_capability (slot_cur); } else if (SLOT_BUS_MODE (slot_cur->ext_status)) { - err ("bus mode mismatch occurred. please check current bus mode and card capability \n"); + err ("bus mode mismatch occurred. please check current bus mode and card capability\n"); print_card_capability (slot_cur); } ibmphp_update_slot_info (slot_cur); @@ -1093,7 +1051,7 @@ debug ("after power_on\n"); /*-----------------------debugging---------------------------*/ get_cur_bus_info (&slot_cur); - debug ("the current bus speed right after power_on = %x \n", slot_cur->bus_on->current_speed); + debug ("the current bus speed right after power_on = %x\n", slot_cur->bus_on->current_speed); /*----------------------------------------------------------*/ rc = slot_update (&slot_cur); @@ -1102,17 +1060,17 @@ rc = -EINVAL; if (SLOT_POWER (slot_cur->status) && !(SLOT_PWRGD (slot_cur->status))) { - err ("power fault occurred trying to power up... \n"); + err ("power fault occurred trying to power up...\n"); goto error_power; } if (SLOT_POWER (slot_cur->status) && (SLOT_BUS_SPEED (slot_cur->status))) { - err ("bus speed mismatch occurred. please check current bus speed and card capability \n"); + err ("bus speed mismatch occurred. please check current bus speed and card capability\n"); print_card_capability (slot_cur); goto error_power; } /* Don't think this case will happen after above checks... but just in case, for paranoia sake */ if (!(SLOT_POWER (slot_cur->status))) { - err ("power on failed... \n"); + err ("power on failed...\n"); goto error_power; } @@ -1120,7 +1078,7 @@ if (!slot_cur->func) { /* We cannot do update_slot_info here, since no memory for * kmalloc n.e.ways, and update_slot_info allocates some */ - err ("out of system memory \n"); + err ("out of system memory\n"); rc = -ENOMEM; goto error_power; } @@ -1133,7 +1091,7 @@ debug ("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n", slot_cur->bus, slot_cur->device); if (ibmphp_configure_card (slot_cur->func, slot_cur->number)) { - err ("configure_card was unsuccessful... \n"); + err ("configure_card was unsuccessful...\n"); ibmphp_unconfigure_card (&slot_cur, 1); /* true because don't need to actually deallocate resources, just remove references */ debug ("after unconfigure_card\n"); slot_cur->func = NULL; @@ -1204,7 +1162,7 @@ int rc; u8 flag; - debug ("DISABLING SLOT... \n"); + debug ("DISABLING SLOT...\n"); if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) { return -ENODEV; @@ -1224,7 +1182,7 @@ /* We need this for fncs's that were there on bootup */ slot_cur->func = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); if (!slot_cur->func) { - err ("out of system memory \n"); + err ("out of system memory\n"); rc = -ENOMEM; goto error; } @@ -1233,12 +1191,7 @@ slot_cur->func->device = slot_cur->device; } - if ((rc = ibm_unconfigure_device (slot_cur->func))) { - err ("removing from kernel failed... \n"); - err ("Please check to see if it was statically linked or is " - "in use otherwise. (perhaps the driver is not 'hot-removable')\n"); - goto error; - } + ibm_unconfigure_device(slot_cur->func); /* If we got here from latch suddenly opening on operating card or a power fault, there's no power to the card, so cannot @@ -1306,15 +1259,15 @@ static void ibmphp_unload (void) { free_slots (); - debug ("after slots \n"); + debug ("after slots\n"); ibmphp_free_resources (); - debug ("after resources \n"); + debug ("after resources\n"); ibmphp_free_bus_info_queue (); - debug ("after bus info \n"); + debug ("after bus info\n"); ibmphp_free_ebda_hpc_queue (); - debug ("after ebda hpc \n"); + debug ("after ebda hpc\n"); ibmphp_free_ebda_pci_rsrc_queue (); - debug ("after ebda pci rsrc \n"); + debug ("after ebda pci rsrc\n"); kfree (ibmphp_pci_bus); } diff -Nru a/drivers/pci/hotplug/ibmphp_ebda.c b/drivers/pci/hotplug/ibmphp_ebda.c --- a/drivers/pci/hotplug/ibmphp_ebda.c Tue Feb 17 20:00:06 2004 +++ b/drivers/pci/hotplug/ibmphp_ebda.c Tue Feb 17 20:00:06 2004 @@ -89,36 +89,34 @@ controller = kmalloc (sizeof (struct controller), GFP_KERNEL); if (!controller) - return NULL; + goto error; memset (controller, 0, sizeof (*controller)); slots = kmalloc (sizeof (struct ebda_hpc_slot) * slot_count, GFP_KERNEL); - if (!slots) { - kfree (controller); - return NULL; - } + if (!slots) + goto error_contr; memset (slots, 0, sizeof (*slots) * slot_count); controller->slots = slots; buses = kmalloc (sizeof (struct ebda_hpc_bus) * bus_count, GFP_KERNEL); - if (!buses) { - kfree (controller->slots); - kfree (controller); - return NULL; - } + if (!buses) + goto error_slots; memset (buses, 0, sizeof (*buses) * bus_count); controller->buses = buses; return controller; +error_slots: + kfree(controller->slots); +error_contr: + kfree(controller); +error: + return NULL; } static void free_ebda_hpc (struct controller *controller) { kfree (controller->slots); - controller->slots = NULL; kfree (controller->buses); - controller->buses = NULL; - controller->ctrl_dev = NULL; kfree (controller); } @@ -171,7 +169,7 @@ { struct rio_detail *ptr; struct list_head *ptr1; - debug ("print_lo_info ---- \n"); + debug ("print_lo_info ----\n"); list_for_each (ptr1, &rio_lo_head) { ptr = list_entry (ptr1, struct rio_detail, rio_detail_list); debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id); @@ -188,7 +186,7 @@ { struct rio_detail *ptr; struct list_head *ptr1; - debug ("%s --- \n", __FUNCTION__); + debug ("%s ---\n", __FUNCTION__); list_for_each (ptr1, &rio_vg_head) { ptr = list_entry (ptr1, struct rio_detail, rio_detail_list); debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id); @@ -220,7 +218,7 @@ list_for_each (ptr1, &ibmphp_slot_head) { ptr = list_entry (ptr1, struct slot, ibm_slot_list); - debug ("%s - slot_number: %x \n", __FUNCTION__, ptr->number); + debug ("%s - slot_number: %x\n", __FUNCTION__, ptr->number); } } @@ -228,13 +226,13 @@ { struct opt_rio *ptr; struct list_head *ptr1; - debug ("%s --- \n", __FUNCTION__); + debug ("%s ---\n", __FUNCTION__); list_for_each (ptr1, &opt_vg_head) { ptr = list_entry (ptr1, struct opt_rio, opt_rio_list); - debug ("%s - rio_type %x \n", __FUNCTION__, ptr->rio_type); - debug ("%s - chassis_num: %x \n", __FUNCTION__, ptr->chassis_num); - debug ("%s - first_slot_num: %x \n", __FUNCTION__, ptr->first_slot_num); - debug ("%s - middle_num: %x \n", __FUNCTION__, ptr->middle_num); + debug ("%s - rio_type %x\n", __FUNCTION__, ptr->rio_type); + debug ("%s - chassis_num: %x\n", __FUNCTION__, ptr->chassis_num); + debug ("%s - first_slot_num: %x\n", __FUNCTION__, ptr->first_slot_num); + debug ("%s - middle_num: %x\n", __FUNCTION__, ptr->middle_num); } } @@ -286,7 +284,8 @@ int __init ibmphp_access_ebda (void) { u8 format, num_ctlrs, rio_complete, hs_complete; - u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, rc, re, rc_id, re_id, base; + u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, re, rc_id, re_id, base; + int rc = 0; rio_complete = 0; @@ -324,10 +323,8 @@ format = readb (io_mem + offset); offset += 1; - if (format != 4) { - iounmap (io_mem); - return -ENODEV; - } + if (format != 4) + goto error_nodev; debug ("hot blk format: %x\n", format); /* hot swap sub blk */ base = offset; @@ -339,18 +336,16 @@ rc_id = readw (io_mem + sub_addr); /* sub blk id */ sub_addr += 2; - if (rc_id != 0x5243) { - iounmap (io_mem); - return -ENODEV; - } + if (rc_id != 0x5243) + goto error_nodev; /* rc sub blk signature */ num_ctlrs = readb (io_mem + sub_addr); sub_addr += 1; hpc_list_ptr = alloc_ebda_hpc_list (); if (!hpc_list_ptr) { - iounmap (io_mem); - return -ENOMEM; + rc = -ENOMEM; + goto out; } hpc_list_ptr->format = format; hpc_list_ptr->num_ctlrs = num_ctlrs; @@ -361,16 +356,15 @@ debug ("offset of hpc data structure enteries: %x\n ", sub_addr); sub_addr = base + re; /* re sub blk */ + /* FIXME: rc is never used/checked */ rc = readw (io_mem + sub_addr); /* next sub blk */ sub_addr += 2; re_id = readw (io_mem + sub_addr); /* sub blk id */ sub_addr += 2; - if (re_id != 0x5245) { - iounmap (io_mem); - return -ENODEV; - } + if (re_id != 0x5245) + goto error_nodev; /* signature of re */ num_entries = readw (io_mem + sub_addr); @@ -378,8 +372,8 @@ sub_addr += 2; /* offset of RSRC_ENTRIES blk */ rsrc_list_ptr = alloc_ebda_rsrc_list (); if (!rsrc_list_ptr ) { - iounmap (io_mem); - return -ENOMEM; + rc = -ENOMEM; + goto out; } rsrc_list_ptr->format = format; rsrc_list_ptr->num_entries = num_entries; @@ -391,9 +385,8 @@ debug ("offset of rsrc data structure enteries: %x\n ", sub_addr); hs_complete = 1; - } - /* found rio table */ - else if (blk_id == 0x4752) { + } else { + /* found rio table, blk_id == 0x4752 */ debug ("now enter io table ---\n"); debug ("rio blk id: %x\n", blk_id); @@ -406,41 +399,36 @@ rio_table_ptr->riodev_count = readb (io_mem + offset + 2); rio_table_ptr->offset = offset +3 ; - debug ("info about rio table hdr ---\n"); - debug ("ver_num: %x\nscal_count: %x\nriodev_count: %x\noffset of rio table: %x\n ", rio_table_ptr->ver_num, rio_table_ptr->scal_count, rio_table_ptr->riodev_count, rio_table_ptr->offset); + debug("info about rio table hdr ---\n"); + debug("ver_num: %x\nscal_count: %x\nriodev_count: %x\noffset of rio table: %x\n ", + rio_table_ptr->ver_num, rio_table_ptr->scal_count, + rio_table_ptr->riodev_count, rio_table_ptr->offset); rio_complete = 1; } } - if (!hs_complete && !rio_complete) { - iounmap (io_mem); - return -ENODEV; - } + if (!hs_complete && !rio_complete) + goto error_nodev; if (rio_table_ptr) { - if (rio_complete == 1 && rio_table_ptr->ver_num == 3) { + if (rio_complete && rio_table_ptr->ver_num == 3) { rc = ebda_rio_table (); - if (rc) { - iounmap (io_mem); - return rc; - } + if (rc) + goto out; } } rc = ebda_rsrc_controller (); - if (rc) { - iounmap (io_mem); - return rc; - } + if (rc) + goto out; rc = ebda_rsrc_rsrc (); - if (rc) { - iounmap (io_mem); - return rc; - } - + goto out; +error_nodev: + rc = -ENODEV; +out: iounmap (io_mem); - return 0; + return rc; } /* @@ -670,7 +658,7 @@ u8 flag = 0; if (!slot_cur) { - err ("Structure passed is empty \n"); + err ("Structure passed is empty\n"); return NULL; } @@ -1269,14 +1257,14 @@ struct controller *ctrl; struct list_head *tmp; - debug ("inside ibmphp_probe \n"); + debug ("inside ibmphp_probe\n"); list_for_each (tmp, &ebda_hpc_head) { ctrl = list_entry (tmp, struct controller, ebda_hpc_list); if (ctrl->ctlr_type == 1) { if ((dev->devfn == ctrl->u.pci_ctlr.dev_fun) && (dev->bus->number == ctrl->u.pci_ctlr.bus)) { ctrl->ctrl_dev = dev; - debug ("found device!!! \n"); + debug ("found device!!!\n"); debug ("dev->device = %x, dev->subsystem_device = %x\n", dev->device, dev->subsystem_device); return 0; } diff -Nru a/drivers/pci/hotplug/ibmphp_pci.c b/drivers/pci/hotplug/ibmphp_pci.c --- a/drivers/pci/hotplug/ibmphp_pci.c Tue Feb 17 20:00:05 2004 +++ b/drivers/pci/hotplug/ibmphp_pci.c Tue Feb 17 20:00:05 2004 @@ -49,7 +49,7 @@ */ static void assign_alt_irq (struct pci_func * cur_func, u8 class_code) { - int j = 0; + int j; for (j = 0; j < 4; j++) { if (cur_func->irq[j] == 0xff) { switch (class_code) { @@ -92,7 +92,7 @@ u8 flag; u8 valid_device = 0x00; /* to see if we are able to read from card any device info at all */ - debug ("inside configure_card, func->busno = %x \n", func->busno); + debug ("inside configure_card, func->busno = %x\n", func->busno); device = func->device; cur_func = func; @@ -130,7 +130,7 @@ pci_bus_read_config_dword (ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class); class_code = class >> 24; - debug ("hrd_type = %x, class = %x, class_code %x \n", hdr_type, class, class_code); + debug ("hrd_type = %x, class = %x, class_code %x\n", hdr_type, class, class_code); class >>= 8; /* to take revision out, class = class.subclass.prog i/f */ if (class == PCI_CLASS_NOT_DEFINED_VGA) { err ("The device %x is VGA compatible and as is not supported for hot plugging. " @@ -147,7 +147,7 @@ assign_alt_irq (cur_func, class_code); if ((rc = configure_device (cur_func)) < 0) { /* We need to do this in case some other BARs were properly inserted */ - err ("was not able to configure devfunc %x on bus %x. \n", + err ("was not able to configure devfunc %x on bus %x.\n", cur_func->device, cur_func->busno); cleanup_count = 6; goto error; @@ -166,7 +166,7 @@ } newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); if (!newfunc) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (newfunc, 0, sizeof (struct pci_func)); @@ -188,7 +188,7 @@ rc = configure_bridge (&cur_func, slotno); if (rc == -ENODEV) { err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n"); - err ("Bus %x, devfunc %x \n", cur_func->busno, cur_func->device); + err ("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device); return rc; } if (rc) { @@ -205,7 +205,7 @@ if (func->devices[i]) { newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); if (!newfunc) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (newfunc, 0, sizeof (struct pci_func)); @@ -234,7 +234,7 @@ newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); if (!newfunc) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (newfunc, 0, sizeof (struct pci_func)); @@ -261,7 +261,7 @@ rc = configure_bridge (&cur_func, slotno); if (rc == -ENODEV) { err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n"); - err ("Bus %x, devfunc %x \n", cur_func->busno, cur_func->device); + err ("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device); return rc; } if (rc) { @@ -281,7 +281,7 @@ debug ("inside for loop, device is %x\n", i); newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); if (!newfunc) { - err (" out of system memory \n"); + err (" out of system memory\n"); return -ENOMEM; } memset (newfunc, 0, sizeof (struct pci_func)); @@ -408,7 +408,7 @@ io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!io[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (io[count], 0, sizeof (struct resource_node)); @@ -446,7 +446,7 @@ pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!pfmem[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (pfmem[count], 0, sizeof (struct resource_node)); @@ -461,7 +461,7 @@ } else { mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem_tmp) { - err ("out of system memory \n"); + err ("out of system memory\n"); kfree (pfmem[count]); return -ENOMEM; } @@ -513,7 +513,7 @@ mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (mem[count], 0, sizeof (struct resource_node)); @@ -620,7 +620,7 @@ /* in EBDA, only get allocated 1 additional bus # per slot */ sec_number = find_sec_number (func->busno, slotno); if (sec_number == 0xff) { - err ("cannot allocate secondary bus number for the bridged device \n"); + err ("cannot allocate secondary bus number for the bridged device\n"); return -EINVAL; } @@ -678,7 +678,7 @@ bus_io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_io[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -710,7 +710,7 @@ bus_pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_pfmem[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -726,7 +726,7 @@ } else { mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem_tmp) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -768,7 +768,7 @@ bus_mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!bus_mem[count]) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -813,7 +813,7 @@ debug ("amount_needed->pfmem = %x\n", amount_needed->pfmem); if (amount_needed->not_correct) { - debug ("amount_needed is not correct \n"); + debug ("amount_needed is not correct\n"); for (count = 0; address[count]; count++) { /* for 2 BARs */ if (bus_io[count]) { @@ -835,11 +835,11 @@ debug ("it doesn't want IO?\n"); flag_io = TRUE; } else { - debug ("it wants %x IO behind the bridge \n", amount_needed->io); + debug ("it wants %x IO behind the bridge\n", amount_needed->io); io = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!io) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -862,7 +862,7 @@ debug ("it wants %x memory behind the bridge\n", amount_needed->mem); mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -885,7 +885,7 @@ debug ("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem); pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!pfmem) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -901,7 +901,7 @@ } else { mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem_tmp) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -933,7 +933,7 @@ if (!bus) { bus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); if (!bus) { - err ("out of system memory \n"); + err ("out of system memory\n"); retval = -ENOMEM; goto error; } @@ -944,7 +944,7 @@ } else if (!(bus->rangeIO) && !(bus->rangeMem) && !(bus->rangePFMem)) rc = add_new_bus (bus, io, mem, pfmem, 0xFF); else { - err ("expected bus structure not empty? \n"); + err ("expected bus structure not empty?\n"); retval = -EIO; goto error; } @@ -1050,7 +1050,7 @@ kfree (amount_needed); return 0; } else { - err ("Configuring bridge was unsuccessful... \n"); + err ("Configuring bridge was unsuccessful...\n"); mem_tmp = NULL; retval = -EIO; goto error; @@ -1171,7 +1171,7 @@ //tmp_bar = bar[count]; - debug ("count %d device %x function %x wants %x resources \n", count, device, function, bar[count]); + debug ("count %d device %x function %x wants %x resources\n", count, device, function, bar[count]); if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) { /* This is IO */ @@ -1522,7 +1522,7 @@ case PCI_HEADER_TYPE_NORMAL: rc = unconfigure_boot_device (busno, device, function); if (rc) { - err ("was not able to unconfigure device %x func %x on bus %x. bailing out... \n", + err ("was not able to unconfigure device %x func %x on bus %x. bailing out...\n", device, function, busno); return rc; } @@ -1531,7 +1531,7 @@ case PCI_HEADER_TYPE_MULTIDEVICE: rc = unconfigure_boot_device (busno, device, function); if (rc) { - err ("was not able to unconfigure device %x func %x on bus %x. bailing out... \n", + err ("was not able to unconfigure device %x func %x on bus %x. bailing out...\n", device, function, busno); return rc; } @@ -1567,7 +1567,7 @@ } break; default: - err ("MAJOR PROBLEM!!!! Cannot read device's header \n"); + err ("MAJOR PROBLEM!!!! Cannot read device's header\n"); return -1; break; } /* end of switch */ @@ -1575,7 +1575,7 @@ } /* end of for */ if (!valid_device) { - err ("Could not find device to unconfigure. Or could not read the card. \n"); + err ("Could not find device to unconfigure. Or could not read the card.\n"); return -1; } return 0; @@ -1623,19 +1623,19 @@ for (i = 0; i < count; i++) { if (cur_func->io[i]) { - debug ("io[%d] exists \n", i); + debug ("io[%d] exists\n", i); if (the_end > 0) ibmphp_remove_resource (cur_func->io[i]); cur_func->io[i] = NULL; } if (cur_func->mem[i]) { - debug ("mem[%d] exists \n", i); + debug ("mem[%d] exists\n", i); if (the_end > 0) ibmphp_remove_resource (cur_func->mem[i]); cur_func->mem[i] = NULL; } if (cur_func->pfmem[i]) { - debug ("pfmem[%d] exists \n", i); + debug ("pfmem[%d] exists\n", i); if (the_end > 0) ibmphp_remove_resource (cur_func->pfmem[i]); cur_func->pfmem[i] = NULL; @@ -1682,7 +1682,7 @@ if (io) { io_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!io_range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (io_range, 0, sizeof (struct range_node)); @@ -1695,7 +1695,7 @@ if (mem) { mem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!mem_range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (mem_range, 0, sizeof (struct range_node)); @@ -1708,7 +1708,7 @@ if (pfmem) { pfmem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!pfmem_range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (pfmem_range, 0, sizeof (struct range_node)); diff -Nru a/drivers/pci/hotplug/ibmphp_res.c b/drivers/pci/hotplug/ibmphp_res.c --- a/drivers/pci/hotplug/ibmphp_res.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pci/hotplug/ibmphp_res.c Tue Feb 17 20:00:08 2004 @@ -52,13 +52,13 @@ struct bus_node * newbus; if (!(curr) && !(flag)) { - err ("NULL pointer passed \n"); + err ("NULL pointer passed\n"); return NULL; } newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); if (!newbus) { - err ("out of system memory \n"); + err ("out of system memory\n"); return NULL; } @@ -76,13 +76,13 @@ struct resource_node *rs; if (!curr) { - err ("NULL passed to allocate \n"); + err ("NULL passed to allocate\n"); return NULL; } rs = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!rs) { - err ("out of system memory \n"); + err ("out of system memory\n"); return NULL; } memset (rs, 0, sizeof (struct resource_node)); @@ -103,7 +103,7 @@ if (first_bus) { newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); if (!newbus) { - err ("out of system memory. \n"); + err ("out of system memory.\n"); return -ENOMEM; } memset (newbus, 0, sizeof (struct bus_node)); @@ -127,7 +127,7 @@ if (!newrange) { if (first_bus) kfree (newbus); - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (newrange, 0, sizeof (struct range_node)); @@ -607,7 +607,7 @@ debug ("%s - enter\n", __FUNCTION__); if (!res) { - err ("NULL passed to add \n"); + err ("NULL passed to add\n"); return -ENODEV; } @@ -634,7 +634,7 @@ res_start = bus_cur->firstPFMem; break; default: - err ("cannot read the type of the resource to add... problem \n"); + err ("cannot read the type of the resource to add... problem\n"); return -EINVAL; } while (range_cur) { @@ -787,7 +787,7 @@ char * type = ""; if (!res) { - err ("resource to remove is NULL \n"); + err ("resource to remove is NULL\n"); return -ENODEV; } @@ -813,7 +813,7 @@ type = "pfmem"; break; default: - err ("unknown type for resource to remove \n"); + err ("unknown type for resource to remove\n"); return -EINVAL; } res_prev = NULL; @@ -954,7 +954,7 @@ range = bus_cur->rangePFMem; break; default: - err ("cannot read resource type in find_range \n"); + err ("cannot read resource type in find_range\n"); } while (range) { @@ -1002,7 +1002,7 @@ if (!bus_cur) { /* didn't find a bus, smth's wrong!!! */ - debug ("no bus in the system, either pci_dev's wrong or allocation failed \n"); + debug ("no bus in the system, either pci_dev's wrong or allocation failed\n"); return -EINVAL; } @@ -1027,7 +1027,7 @@ noranges = bus_cur->noPFMemRanges; break; default: - err ("wrong type of resource to check \n"); + err ("wrong type of resource to check\n"); return -EINVAL; } res_prev = NULL; @@ -1496,7 +1496,7 @@ char * type = ""; if (!bus) { - err ("The bus passed in NULL to find resource \n"); + err ("The bus passed in NULL to find resource\n"); return -ENODEV; } @@ -1514,7 +1514,7 @@ type = "pfmem"; break; default: - err ("wrong type of flag \n"); + err ("wrong type of flag\n"); return -EINVAL; } @@ -1540,17 +1540,17 @@ res_cur = res_cur->next; } if (!res_cur) { - debug ("SOS...cannot find %s resource in the bus. \n", type); + debug ("SOS...cannot find %s resource in the bus.\n", type); return -EINVAL; } } else { - debug ("SOS... cannot find %s resource in the bus. \n", type); + debug ("SOS... cannot find %s resource in the bus.\n", type); return -EINVAL; } } if (*res) - debug ("*res->start = %x \n", (*res)->start); + debug ("*res->start = %x\n", (*res)->start); return 0; } @@ -1708,7 +1708,7 @@ mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (mem, 0, sizeof (struct resource_node)); @@ -1792,7 +1792,7 @@ list_for_each (tmp, &gbuses) { bus_cur = list_entry (tmp, struct bus_node, bus_list); - debug_pci ("This is bus # %d. There are \n", bus_cur->busno); + debug_pci ("This is bus # %d. There are\n", bus_cur->busno); debug_pci ("IORanges = %d\t", bus_cur->noIORanges); debug_pci ("MemRanges = %d\t", bus_cur->noMemRanges); debug_pci ("PFMemRanges = %d\n", bus_cur->noPFMemRanges); @@ -1903,7 +1903,7 @@ range_cur = bus_cur->rangePFMem; break; default: - err ("wrong type passed to find out if range already exists \n"); + err ("wrong type passed to find out if range already exists\n"); return -ENODEV; } @@ -1948,7 +1948,7 @@ return -ENODEV; ibmphp_pci_bus->number = bus_cur->busno; - debug ("inside %s \n", __FUNCTION__); + debug ("inside %s\n", __FUNCTION__); debug ("bus_cur->busno = %x\n", bus_cur->busno); for (device = 0; device < 32; device++) { @@ -1997,7 +1997,7 @@ if ((start_address) && (start_address <= end_address)) { range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (range, 0, sizeof (struct range_node)); @@ -2024,7 +2024,7 @@ io = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!io) { kfree (range); - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (io, 0, sizeof (struct resource_node)); @@ -2048,7 +2048,7 @@ range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (range, 0, sizeof (struct range_node)); @@ -2076,7 +2076,7 @@ mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!mem) { kfree (range); - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (mem, 0, sizeof (struct resource_node)); @@ -2104,7 +2104,7 @@ range = kmalloc (sizeof (struct range_node), GFP_KERNEL); if (!range) { - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (range, 0, sizeof (struct range_node)); @@ -2131,7 +2131,7 @@ pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); if (!pfmem) { kfree (range); - err ("out of system memory \n"); + err ("out of system memory\n"); return -ENOMEM; } memset (pfmem, 0, sizeof (struct resource_node)); diff -Nru a/drivers/pci/hotplug.c b/drivers/pci/hotplug.c --- a/drivers/pci/hotplug.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pci/hotplug.c Tue Feb 17 20:00:08 2004 @@ -116,7 +116,7 @@ } bus = wrapped_dev->dev->subordinate; - if(bus) { + if (bus) { memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped)); wrapped_bus.bus = bus; @@ -130,8 +130,8 @@ * Every bus and every function is presented to a custom * function that can act upon it. */ -int pci_visit_dev (struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev, - struct pci_bus_wrapped *wrapped_parent) +int pci_visit_dev(struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev, + struct pci_bus_wrapped *wrapped_parent) { struct pci_dev* dev = wrapped_dev ? wrapped_dev->dev : NULL; int result = 0; diff -Nru a/drivers/pci/msi.c b/drivers/pci/msi.c --- a/drivers/pci/msi.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pci/msi.c Tue Feb 17 20:00:08 2004 @@ -19,9 +19,8 @@ #include #include -#include +#include "msi.h" -_DEFINE_DBG_BUFFER static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED; static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; diff -Nru a/drivers/pci/msi.h b/drivers/pci/msi.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/pci/msi.h Tue Feb 17 20:00:07 2004 @@ -0,0 +1,168 @@ +/* + * msi.h + * + */ + +#ifndef MSI_H +#define MSI_H + +#define MSI_AUTO -1 +#define NR_REPEATS 23 +#define NR_RESERVED_VECTORS 3 /*FIRST_DEVICE_VECTOR,FIRST_SYSTEM_VECTOR,0x80 */ + +/* + * Assume the maximum number of hot plug slots supported by the system is about + * ten. The worstcase is that each of these slots is hot-added with a device, + * which has two MSI/MSI-X capable functions. To avoid any MSI-X driver, which + * attempts to request all available vectors, NR_HP_RESERVED_VECTORS is defined + * as below to ensure at least one message is assigned to each detected MSI/ + * MSI-X device function. + */ +#define NR_HP_RESERVED_VECTORS 20 + +extern int vector_irq[NR_IRQS]; +extern cpumask_t pending_irq_balance_cpumask[NR_IRQS]; +extern void (*interrupt[NR_IRQS])(void); + +#ifdef CONFIG_SMP +#define set_msi_irq_affinity set_msi_affinity +#else +#define set_msi_irq_affinity NULL +static inline void move_msi(int vector) {} +#endif + +#ifndef CONFIG_X86_IO_APIC +static inline int get_ioapic_vector(struct pci_dev *dev) { return -1;} +static inline void restore_ioapic_irq_handler(int irq) {} +#else +extern void restore_ioapic_irq_handler(int irq); +#endif + +/* + * MSI-X Address Register + */ +#define PCI_MSIX_FLAGS_QSIZE 0x7FF +#define PCI_MSIX_FLAGS_ENABLE (1 << 15) +#define PCI_MSIX_FLAGS_BIRMASK (7 << 0) +#define PCI_MSIX_FLAGS_BITMASK (1 << 0) + +#define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0 +#define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4 +#define PCI_MSIX_ENTRY_DATA_OFFSET 8 +#define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET 12 +#define PCI_MSIX_ENTRY_SIZE 16 + +#define msi_control_reg(base) (base + PCI_MSI_FLAGS) +#define msi_lower_address_reg(base) (base + PCI_MSI_ADDRESS_LO) +#define msi_upper_address_reg(base) (base + PCI_MSI_ADDRESS_HI) +#define msi_data_reg(base, is64bit) \ + ( (is64bit == 1) ? base+PCI_MSI_DATA_64 : base+PCI_MSI_DATA_32 ) +#define msi_mask_bits_reg(base, is64bit) \ + ( (is64bit == 1) ? base+PCI_MSI_MASK_BIT : base+PCI_MSI_MASK_BIT-4) +#define msi_disable(control) control &= ~PCI_MSI_FLAGS_ENABLE +#define multi_msi_capable(control) \ + (1 << ((control & PCI_MSI_FLAGS_QMASK) >> 1)) +#define multi_msi_enable(control, num) \ + control |= (((num >> 1) << 4) & PCI_MSI_FLAGS_QSIZE); +#define is_64bit_address(control) (control & PCI_MSI_FLAGS_64BIT) +#define is_mask_bit_support(control) (control & PCI_MSI_FLAGS_MASKBIT) +#define msi_enable(control, num) multi_msi_enable(control, num); \ + control |= PCI_MSI_FLAGS_ENABLE + +#define msix_control_reg msi_control_reg +#define msix_table_offset_reg(base) (base + 0x04) +#define msix_pba_offset_reg(base) (base + 0x08) +#define msix_enable(control) control |= PCI_MSIX_FLAGS_ENABLE +#define msix_disable(control) control &= ~PCI_MSIX_FLAGS_ENABLE +#define msix_table_size(control) ((control & PCI_MSIX_FLAGS_QSIZE)+1) +#define multi_msix_capable msix_table_size +#define msix_unmask(address) (address & ~PCI_MSIX_FLAGS_BITMASK) +#define msix_mask(address) (address | PCI_MSIX_FLAGS_BITMASK) +#define msix_is_pending(address) (address & PCI_MSIX_FLAGS_PENDMASK) + + +/* + * MSI Defined Data Structures + */ +#define MSI_ADDRESS_HEADER 0xfee +#define MSI_ADDRESS_HEADER_SHIFT 12 +#define MSI_ADDRESS_HEADER_MASK 0xfff000 +#define MSI_TARGET_CPU_SHIFT 4 +#define MSI_TARGET_CPU_MASK 0xff +#define MSI_DELIVERY_MODE 0 +#define MSI_LEVEL_MODE 1 /* Edge always assert */ +#define MSI_TRIGGER_MODE 0 /* MSI is edge sensitive */ +#define MSI_LOGICAL_MODE 1 +#define MSI_REDIRECTION_HINT_MODE 0 +#ifdef CONFIG_SMP +#define MSI_TARGET_CPU logical_smp_processor_id() +#else +#define MSI_TARGET_CPU TARGET_CPUS +#endif + +struct msg_data { +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u32 vector : 8; + __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */ + __u32 reserved_1 : 3; + __u32 level : 1; /* 0: deassert | 1: assert */ + __u32 trigger : 1; /* 0: edge | 1: level */ + __u32 reserved_2 : 16; +#elif defined(__BIG_ENDIAN_BITFIELD) + __u32 reserved_2 : 16; + __u32 trigger : 1; /* 0: edge | 1: level */ + __u32 level : 1; /* 0: deassert | 1: assert */ + __u32 reserved_1 : 3; + __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */ + __u32 vector : 8; +#else +#error "Bitfield endianness not defined! Check your byteorder.h" +#endif +} __attribute__ ((packed)); + +struct msg_address { + union { + struct { +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u32 reserved_1 : 2; + __u32 dest_mode : 1; /*0:physic | 1:logic */ + __u32 redirection_hint: 1; /*0: dedicated CPU + 1: lowest priority */ + __u32 reserved_2 : 4; + __u32 dest_id : 24; /* Destination ID */ +#elif defined(__BIG_ENDIAN_BITFIELD) + __u32 dest_id : 24; /* Destination ID */ + __u32 reserved_2 : 4; + __u32 redirection_hint: 1; /*0: dedicated CPU + 1: lowest priority */ + __u32 dest_mode : 1; /*0:physic | 1:logic */ + __u32 reserved_1 : 2; +#else +#error "Bitfield endianness not defined! Check your byteorder.h" +#endif + }u; + __u32 value; + }lo_address; + __u32 hi_address; +} __attribute__ ((packed)); + +struct msi_desc { + struct { + __u8 type : 5; /* {0: unused, 5h:MSI, 11h:MSI-X} */ + __u8 maskbit : 1; /* mask-pending bit supported ? */ + __u8 reserved: 2; /* reserved */ + __u8 entry_nr; /* specific enabled entry */ + __u8 default_vector; /* default pre-assigned vector */ + __u8 current_cpu; /* current destination cpu */ + }msi_attrib; + + struct { + __u16 head; + __u16 tail; + }link; + + unsigned long mask_base; + struct pci_dev *dev; +}; + +#endif /* MSI_H */ diff -Nru a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c --- a/drivers/pci/pci-driver.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pci/pci-driver.c Tue Feb 17 20:00:07 2004 @@ -241,7 +241,7 @@ error = drv->probe(pci_dev, id); if (error >= 0) { pci_dev->driver = drv; - return 0; + error = 0; } return error; } diff -Nru a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c --- a/drivers/pci/pci-sysfs.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pci/pci-sysfs.c Tue Feb 17 20:00:07 2004 @@ -180,4 +180,7 @@ device_create_file (dev, &dev_attr_irq); device_create_file (dev, &dev_attr_resource); sysfs_create_bin_file(&dev->kobj, &pci_config_attr); + + /* add platform-specific attributes */ + pcibios_add_platform_entries(pdev); } diff -Nru a/drivers/pci/pci.ids b/drivers/pci/pci.ids --- a/drivers/pci/pci.ids Tue Feb 17 20:00:07 2004 +++ b/drivers/pci/pci.ids Tue Feb 17 20:00:07 2004 @@ -5871,6 +5871,11 @@ 14f1 2004 Dynalink 56PMi 8234 RS8234 ATM SAR Controller [ServiceSAR Plus] 14f2 MOBILITY Electronics + 0120 EV1000 bridge + 0121 EV1000 Parallel port + 0122 EV1000 Serial port + 0123 EV1000 Keyboard controller + 0124 EV1000 Mouse controller 14f3 BROADLOGIC 14f4 TOKYO Electronic Industry CO Ltd 14f5 SOPAC Ltd @@ -6667,6 +6672,9 @@ 1040 536EP Data Fax Modem 16be 1040 V.9X DSP Data Fax Modem 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter + 1048 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE LR Server Adapter + 8086 a11f PRO/10GbE LR Server Adapter 1059 82551QM Ethernet Controller 1130 82815 815 Chipset Host Bridge and Memory Controller Hub 1025 1016 Travelmate 612 TX diff -Nru a/drivers/pci/pool.c b/drivers/pci/pool.c --- a/drivers/pci/pool.c Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,404 +0,0 @@ -#include -#include -#include - -/* - * Pool allocator ... wraps the pci_alloc_consistent page allocator, so - * small blocks are easily used by drivers for bus mastering controllers. - * This should probably be sharing the guts of the slab allocator. - */ - -struct pci_pool { /* the pool */ - struct list_head page_list; - spinlock_t lock; - size_t blocks_per_page; - size_t size; - struct pci_dev *dev; - size_t allocation; - char name [32]; - wait_queue_head_t waitq; - struct list_head pools; -}; - -struct pci_page { /* cacheable header for 'allocation' bytes */ - struct list_head page_list; - void *vaddr; - dma_addr_t dma; - unsigned in_use; - unsigned long bitmap [0]; -}; - -#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) -#define POOL_POISON_FREED 0xa7 /* !inuse */ -#define POOL_POISON_ALLOCATED 0xa9 /* !initted */ - -static DECLARE_MUTEX (pools_lock); - -static ssize_t -show_pools (struct device *dev, char *buf) -{ - struct pci_dev *pdev; - unsigned temp, size; - char *next; - struct list_head *i, *j; - - pdev = container_of (dev, struct pci_dev, dev); - next = buf; - size = PAGE_SIZE; - - temp = snprintf (next, size, "poolinfo - 0.1\n"); - size -= temp; - next += temp; - - down (&pools_lock); - list_for_each (i, &pdev->pools) { - struct pci_pool *pool; - unsigned pages = 0, blocks = 0; - - pool = list_entry (i, struct pci_pool, pools); - - list_for_each (j, &pool->page_list) { - struct pci_page *page; - - page = list_entry (j, struct pci_page, page_list); - pages++; - blocks += page->in_use; - } - - /* per-pool info, no real statistics yet */ - temp = snprintf (next, size, "%-16s %4u %4Zu %4Zu %2u\n", - pool->name, - blocks, pages * pool->blocks_per_page, - pool->size, pages); - size -= temp; - next += temp; - } - up (&pools_lock); - - return PAGE_SIZE - size; -} -static DEVICE_ATTR (pools, S_IRUGO, show_pools, NULL); - -/** - * pci_pool_create - Creates a pool of pci consistent memory blocks, for dma. - * @name: name of pool, for diagnostics - * @pdev: pci device that will be doing the DMA - * @size: size of the blocks in this pool. - * @align: alignment requirement for blocks; must be a power of two - * @allocation: returned blocks won't cross this boundary (or zero) - * Context: !in_interrupt() - * - * Returns a pci allocation pool with the requested characteristics, or - * null if one can't be created. Given one of these pools, pci_pool_alloc() - * may be used to allocate memory. Such memory will all have "consistent" - * DMA mappings, accessible by the device and its driver without using - * cache flushing primitives. The actual size of blocks allocated may be - * larger than requested because of alignment. - * - * If allocation is nonzero, objects returned from pci_pool_alloc() won't - * cross that size boundary. This is useful for devices which have - * addressing restrictions on individual DMA transfers, such as not crossing - * boundaries of 4KBytes. - */ -struct pci_pool * -pci_pool_create (const char *name, struct pci_dev *pdev, - size_t size, size_t align, size_t allocation) -{ - struct pci_pool *retval; - - if (align == 0) - align = 1; - if (size == 0) - return 0; - else if (size < align) - size = align; - else if ((size % align) != 0) { - size += align + 1; - size &= ~(align - 1); - } - - if (allocation == 0) { - if (PAGE_SIZE < size) - allocation = size; - else - allocation = PAGE_SIZE; - // FIXME: round up for less fragmentation - } else if (allocation < size) - return 0; - - if (!(retval = kmalloc (sizeof *retval, SLAB_KERNEL))) - return retval; - - strlcpy (retval->name, name, sizeof retval->name); - - retval->dev = pdev; - - INIT_LIST_HEAD (&retval->page_list); - spin_lock_init (&retval->lock); - retval->size = size; - retval->allocation = allocation; - retval->blocks_per_page = allocation / size; - init_waitqueue_head (&retval->waitq); - - if (pdev) { - down (&pools_lock); - if (list_empty (&pdev->pools)) - device_create_file (&pdev->dev, &dev_attr_pools); - /* note: not currently insisting "name" be unique */ - list_add (&retval->pools, &pdev->pools); - up (&pools_lock); - } else - INIT_LIST_HEAD (&retval->pools); - - return retval; -} - - -static struct pci_page * -pool_alloc_page (struct pci_pool *pool, int mem_flags) -{ - struct pci_page *page; - int mapsize; - - mapsize = pool->blocks_per_page; - mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG; - mapsize *= sizeof (long); - - page = (struct pci_page *) kmalloc (mapsize + sizeof *page, mem_flags); - if (!page) - return 0; - page->vaddr = pci_alloc_consistent (pool->dev, - pool->allocation, - &page->dma); - if (page->vaddr) { - memset (page->bitmap, 0xff, mapsize); // bit set == free -#ifdef CONFIG_DEBUG_SLAB - memset (page->vaddr, POOL_POISON_FREED, pool->allocation); -#endif - list_add (&page->page_list, &pool->page_list); - page->in_use = 0; - } else { - kfree (page); - page = 0; - } - return page; -} - - -static inline int -is_page_busy (int blocks, unsigned long *bitmap) -{ - while (blocks > 0) { - if (*bitmap++ != ~0UL) - return 1; - blocks -= BITS_PER_LONG; - } - return 0; -} - -static void -pool_free_page (struct pci_pool *pool, struct pci_page *page) -{ - dma_addr_t dma = page->dma; - -#ifdef CONFIG_DEBUG_SLAB - memset (page->vaddr, POOL_POISON_FREED, pool->allocation); -#endif - pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma); - list_del (&page->page_list); - kfree (page); -} - - -/** - * pci_pool_destroy - destroys a pool of pci memory blocks. - * @pool: pci pool that will be destroyed - * Context: !in_interrupt() - * - * Caller guarantees that no more memory from the pool is in use, - * and that nothing will try to use the pool after this call. - */ -void -pci_pool_destroy (struct pci_pool *pool) -{ - down (&pools_lock); - list_del (&pool->pools); - if (pool->dev && list_empty (&pool->dev->pools)) - device_remove_file (&pool->dev->dev, &dev_attr_pools); - up (&pools_lock); - - while (!list_empty (&pool->page_list)) { - struct pci_page *page; - page = list_entry (pool->page_list.next, - struct pci_page, page_list); - if (is_page_busy (pool->blocks_per_page, page->bitmap)) { - printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n", - pool->dev ? pci_name(pool->dev) : NULL, - pool->name, page->vaddr); - /* leak the still-in-use consistent memory */ - list_del (&page->page_list); - kfree (page); - } else - pool_free_page (pool, page); - } - - kfree (pool); -} - - -/** - * pci_pool_alloc - get a block of consistent memory - * @pool: pci pool that will produce the block - * @mem_flags: SLAB_KERNEL or SLAB_ATOMIC - * @handle: pointer to dma address of block - * - * This returns the kernel virtual address of a currently unused block, - * and reports its dma address through the handle. - * If such a memory block can't be allocated, null is returned. - */ -void * -pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle) -{ - unsigned long flags; - struct list_head *entry; - struct pci_page *page; - int map, block; - size_t offset; - void *retval; - -restart: - spin_lock_irqsave (&pool->lock, flags); - list_for_each (entry, &pool->page_list) { - int i; - page = list_entry (entry, struct pci_page, page_list); - /* only cachable accesses here ... */ - for (map = 0, i = 0; - i < pool->blocks_per_page; - i += BITS_PER_LONG, map++) { - if (page->bitmap [map] == 0) - continue; - block = ffz (~ page->bitmap [map]); - if ((i + block) < pool->blocks_per_page) { - clear_bit (block, &page->bitmap [map]); - offset = (BITS_PER_LONG * map) + block; - offset *= pool->size; - goto ready; - } - } - } - if (!(page = pool_alloc_page (pool, SLAB_ATOMIC))) { - if (mem_flags == SLAB_KERNEL) { - DECLARE_WAITQUEUE (wait, current); - - current->state = TASK_INTERRUPTIBLE; - add_wait_queue (&pool->waitq, &wait); - spin_unlock_irqrestore (&pool->lock, flags); - - schedule_timeout (POOL_TIMEOUT_JIFFIES); - - remove_wait_queue (&pool->waitq, &wait); - goto restart; - } - retval = 0; - goto done; - } - - clear_bit (0, &page->bitmap [0]); - offset = 0; -ready: - page->in_use++; - retval = offset + page->vaddr; - *handle = offset + page->dma; -#ifdef CONFIG_DEBUG_SLAB - memset (retval, POOL_POISON_ALLOCATED, pool->size); -#endif -done: - spin_unlock_irqrestore (&pool->lock, flags); - return retval; -} - - -static struct pci_page * -pool_find_page (struct pci_pool *pool, dma_addr_t dma) -{ - unsigned long flags; - struct list_head *entry; - struct pci_page *page; - - spin_lock_irqsave (&pool->lock, flags); - list_for_each (entry, &pool->page_list) { - page = list_entry (entry, struct pci_page, page_list); - if (dma < page->dma) - continue; - if (dma < (page->dma + pool->allocation)) - goto done; - } - page = 0; -done: - spin_unlock_irqrestore (&pool->lock, flags); - return page; -} - - -/** - * pci_pool_free - put block back into pci pool - * @pool: the pci pool holding the block - * @vaddr: virtual address of block - * @dma: dma address of block - * - * Caller promises neither device nor driver will again touch this block - * unless it is first re-allocated. - */ -void -pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) -{ - struct pci_page *page; - unsigned long flags; - int map, block; - - if ((page = pool_find_page (pool, dma)) == 0) { - printk (KERN_ERR "pci_pool_free %s/%s, %p/%lx (bad dma)\n", - pool->dev ? pci_name(pool->dev) : NULL, - pool->name, vaddr, (unsigned long) dma); - return; - } - - block = dma - page->dma; - block /= pool->size; - map = block / BITS_PER_LONG; - block %= BITS_PER_LONG; - -#ifdef CONFIG_DEBUG_SLAB - if (((dma - page->dma) + (void *)page->vaddr) != vaddr) { - printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%Lx\n", - pool->dev ? pci_name(pool->dev) : NULL, - pool->name, vaddr, (unsigned long long) dma); - return; - } - if (page->bitmap [map] & (1UL << block)) { - printk (KERN_ERR "pci_pool_free %s/%s, dma %Lx already free\n", - pool->dev ? pci_name(pool->dev) : NULL, - pool->name, (unsigned long long)dma); - return; - } - memset (vaddr, POOL_POISON_FREED, pool->size); -#endif - - spin_lock_irqsave (&pool->lock, flags); - page->in_use--; - set_bit (block, &page->bitmap [map]); - if (waitqueue_active (&pool->waitq)) - wake_up (&pool->waitq); - /* - * Resist a temptation to do - * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); - * it is not interrupt safe. Better have empty pages hang around. - */ - spin_unlock_irqrestore (&pool->lock, flags); -} - - -EXPORT_SYMBOL (pci_pool_create); -EXPORT_SYMBOL (pci_pool_destroy); -EXPORT_SYMBOL (pci_pool_alloc); -EXPORT_SYMBOL (pci_pool_free); diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c --- a/drivers/pci/probe.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pci/probe.c Tue Feb 17 20:00:07 2004 @@ -214,7 +214,7 @@ limit |= (io_limit_hi << 16); } - if (base && base <= limit) { + if (base <= limit) { res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO; res->start = base; res->end = limit + 0xfff; @@ -225,7 +225,7 @@ pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo); base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16; limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16; - if (base && base <= limit) { + if (base <= limit) { res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; res->start = base; res->end = limit + 0xfffff; @@ -251,7 +251,7 @@ } #endif } - if (base && base <= limit) { + if (base <= limit) { res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; res->start = base; res->end = limit + 0xfffff; @@ -456,8 +456,6 @@ sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - INIT_LIST_HEAD(&dev->pools); - pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); class >>= 8; /* upper 3 bytes */ dev->class = class; @@ -620,6 +618,9 @@ int __devinit pci_scan_slot(struct pci_bus *bus, int devfn) { int func, nr = 0; + int scan_all_fns; + + scan_all_fns = pcibios_scan_all_fns(bus, devfn); for (func = 0; func < 8; func++, devfn++) { struct pci_dev *dev; @@ -640,7 +641,7 @@ } } } else { - if (func == 0) + if (func == 0 && !scan_all_fns) break; } } diff -Nru a/drivers/pci/remove.c b/drivers/pci/remove.c --- a/drivers/pci/remove.c Tue Feb 17 20:00:06 2004 +++ b/drivers/pci/remove.c Tue Feb 17 20:00:06 2004 @@ -83,7 +83,7 @@ list_del(&b->node); spin_unlock(&pci_bus_lock); - kfree(b); + class_device_unregister(&b->class_dev); dev->subordinate = NULL; } diff -Nru a/drivers/pcmcia/bulkmem.c b/drivers/pcmcia/bulkmem.c --- a/drivers/pcmcia/bulkmem.c Tue Feb 17 20:00:14 2004 +++ b/drivers/pcmcia/bulkmem.c Tue Feb 17 20:00:14 2004 @@ -298,7 +298,7 @@ { window_handle_t w; int ret = pcmcia_request_window(a1, a2, &w); - (window_handle_t *)a1 = w; + a1 = w; return ret; } break; diff -Nru a/drivers/pnp/Kconfig b/drivers/pnp/Kconfig --- a/drivers/pnp/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/pnp/Kconfig Tue Feb 17 20:00:07 2004 @@ -31,33 +31,9 @@ comment "Protocols" depends on PNP -config ISAPNP - bool "ISA Plug and Play support (EXPERIMENTAL)" - depends on PNP && EXPERIMENTAL - help - Say Y here if you would like support for ISA Plug and Play devices. - Some information is in . +source "drivers/pnp/isapnp/Kconfig" - If unsure, say Y. - -config PNPBIOS - bool "Plug and Play BIOS support (EXPERIMENTAL)" - depends on PNP && EXPERIMENTAL - ---help--- - Linux uses the PNPBIOS as defined in "Plug and Play BIOS - Specification Version 1.0A May 5, 1994" to autodetect built-in - mainboard resources (e.g. parallel port resources). - - Some features (e.g. event notification, docking station information, - ISAPNP services) are not used. - - Note: ACPI is expected to supersede PNPBIOS some day, currently it - co-exists nicely. - - See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools, - or have a look at /proc/bus/pnp. - - If unsure, say Y. +source "drivers/pnp/pnpbios/Kconfig" endmenu diff -Nru a/drivers/pnp/card.c b/drivers/pnp/card.c --- a/drivers/pnp/card.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pnp/card.c Tue Feb 17 20:00:08 2004 @@ -26,8 +26,25 @@ { const struct pnp_card_device_id * drv_id = drv->id_table; while (*drv_id->id){ - if (compare_pnp_id(card->id,drv_id->id)) - return drv_id; + if (compare_pnp_id(card->id,drv_id->id)) { + int i = 0; + for (;;) { + int found; + struct pnp_dev *dev; + if (i == PNP_MAX_DEVICES || ! *drv_id->devs[i].id) + return drv_id; + found = 0; + card_for_each_dev(card, dev) { + if (compare_pnp_id(dev->id, drv_id->devs[i].id)) { + found = 1; + break; + } + } + if (! found) + break; + i++; + } + } drv_id++; } return NULL; @@ -122,6 +139,39 @@ kfree(card); } + +static ssize_t pnp_show_card_name(struct device *dmdev, char *buf) +{ + char *str = buf; + struct pnp_card *card = to_pnp_card(dmdev); + str += sprintf(str,"%s\n", card->name); + return (str - buf); +} + +static DEVICE_ATTR(name,S_IRUGO,pnp_show_card_name,NULL); + +static ssize_t pnp_show_card_ids(struct device *dmdev, char *buf) +{ + char *str = buf; + struct pnp_card *card = to_pnp_card(dmdev); + struct pnp_id * pos = card->id; + + while (pos) { + str += sprintf(str,"%s\n", pos->id); + pos = pos->next; + } + return (str - buf); +} + +static DEVICE_ATTR(card_id,S_IRUGO,pnp_show_card_ids,NULL); + +static int pnp_interface_attach_card(struct pnp_card *card) +{ + device_create_file(&card->dev,&dev_attr_name); + device_create_file(&card->dev,&dev_attr_card_id); + return 0; +} + /** * pnp_add_card - adds a PnP card to the PnP Layer * @card: pointer to the card to add @@ -141,6 +191,7 @@ error = device_register(&card->dev); if (error == 0) { + pnp_interface_attach_card(card); spin_lock(&pnp_lock); list_add_tail(&card->global_list, &pnp_cards); list_add_tail(&card->protocol_list, &card->protocol->cards); diff -Nru a/drivers/pnp/isapnp/Kconfig b/drivers/pnp/isapnp/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/pnp/isapnp/Kconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,11 @@ +# +# ISA Plug and Play configuration +# +config ISAPNP + bool "ISA Plug and Play support (EXPERIMENTAL)" + depends on PNP && EXPERIMENTAL + help + Say Y here if you would like support for ISA Plug and Play devices. + Some information is in . + + If unsure, say Y. diff -Nru a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c --- a/drivers/pnp/isapnp/core.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pnp/isapnp/core.c Tue Feb 17 20:00:07 2004 @@ -1039,17 +1039,17 @@ isapnp_cfg_begin(dev->card->number, dev->number); dev->active = 1; - for (tmp = 0; tmp < PNP_MAX_PORT && res->port_resource[tmp].flags & IORESOURCE_IO; tmp++) + for (tmp = 0; tmp < PNP_MAX_PORT && (res->port_resource[tmp].flags & (IORESOURCE_IO | IORESOURCE_UNSET)) == IORESOURCE_IO; tmp++) isapnp_write_word(ISAPNP_CFG_PORT+(tmp<<1), res->port_resource[tmp].start); - for (tmp = 0; tmp < PNP_MAX_IRQ && res->irq_resource[tmp].flags & IORESOURCE_IRQ; tmp++) { + for (tmp = 0; tmp < PNP_MAX_IRQ && (res->irq_resource[tmp].flags & (IORESOURCE_IRQ | IORESOURCE_UNSET)) == IORESOURCE_IRQ; tmp++) { int irq = res->irq_resource[tmp].start; if (irq == 2) irq = 9; isapnp_write_byte(ISAPNP_CFG_IRQ+(tmp<<1), irq); } - for (tmp = 0; tmp < PNP_MAX_DMA && res->dma_resource[tmp].flags & IORESOURCE_DMA; tmp++) + for (tmp = 0; tmp < PNP_MAX_DMA && (res->dma_resource[tmp].flags & (IORESOURCE_DMA | IORESOURCE_UNSET)) == IORESOURCE_DMA; tmp++) isapnp_write_byte(ISAPNP_CFG_DMA+tmp, res->dma_resource[tmp].start); - for (tmp = 0; tmp < PNP_MAX_MEM && res->mem_resource[tmp].flags & IORESOURCE_MEM; tmp++) + for (tmp = 0; tmp < PNP_MAX_MEM && (res->mem_resource[tmp].flags & (IORESOURCE_MEM | IORESOURCE_UNSET)) == IORESOURCE_MEM; tmp++) isapnp_write_word(ISAPNP_CFG_MEM+(tmp<<2), (res->mem_resource[tmp].start >> 8) & 0xffff); /* FIXME: We aren't handling 32bit mems properly here */ isapnp_activate(dev->number); diff -Nru a/drivers/pnp/manager.c b/drivers/pnp/manager.c --- a/drivers/pnp/manager.c Tue Feb 17 20:00:08 2004 +++ b/drivers/pnp/manager.c Tue Feb 17 20:00:08 2004 @@ -223,25 +223,25 @@ table->irq_resource[idx].name = NULL; table->irq_resource[idx].start = -1; table->irq_resource[idx].end = -1; - table->irq_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + table->irq_resource[idx].flags = IORESOURCE_IRQ | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_DMA; idx++) { table->dma_resource[idx].name = NULL; table->dma_resource[idx].start = -1; table->dma_resource[idx].end = -1; - table->dma_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + table->dma_resource[idx].flags = IORESOURCE_DMA | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_PORT; idx++) { table->port_resource[idx].name = NULL; table->port_resource[idx].start = 0; table->port_resource[idx].end = 0; - table->port_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + table->port_resource[idx].flags = IORESOURCE_IO | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_MEM; idx++) { table->mem_resource[idx].name = NULL; table->mem_resource[idx].start = 0; table->mem_resource[idx].end = 0; - table->mem_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + table->mem_resource[idx].flags = IORESOURCE_MEM | IORESOURCE_AUTO | IORESOURCE_UNSET; } } @@ -258,28 +258,28 @@ continue; res->irq_resource[idx].start = -1; res->irq_resource[idx].end = -1; - res->irq_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + res->irq_resource[idx].flags = IORESOURCE_IRQ | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_DMA; idx++) { if (!(res->dma_resource[idx].flags & IORESOURCE_AUTO)) continue; res->dma_resource[idx].start = -1; res->dma_resource[idx].end = -1; - res->dma_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + res->dma_resource[idx].flags = IORESOURCE_DMA | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_PORT; idx++) { if (!(res->port_resource[idx].flags & IORESOURCE_AUTO)) continue; res->port_resource[idx].start = 0; res->port_resource[idx].end = 0; - res->port_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + res->port_resource[idx].flags = IORESOURCE_IO | IORESOURCE_AUTO | IORESOURCE_UNSET; } for (idx = 0; idx < PNP_MAX_MEM; idx++) { if (!(res->mem_resource[idx].flags & IORESOURCE_AUTO)) continue; res->mem_resource[idx].start = 0; res->mem_resource[idx].end = 0; - res->mem_resource[idx].flags = IORESOURCE_AUTO | IORESOURCE_UNSET; + res->mem_resource[idx].flags = IORESOURCE_MEM | IORESOURCE_AUTO | IORESOURCE_UNSET; } } @@ -550,7 +550,7 @@ { if (resource == NULL) return; - resource->flags &= ~IORESOURCE_AUTO; + resource->flags &= ~(IORESOURCE_AUTO | IORESOURCE_UNSET); resource->start = start; resource->end = start + size - 1; } diff -Nru a/drivers/pnp/pnpbios/Kconfig b/drivers/pnp/pnpbios/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/pnp/pnpbios/Kconfig Tue Feb 17 20:00:14 2004 @@ -0,0 +1,41 @@ +# +# Plug and Play BIOS configuration +# +config PNPBIOS + bool "Plug and Play BIOS support (EXPERIMENTAL)" + depends on PNP && EXPERIMENTAL + ---help--- + Linux uses the PNPBIOS as defined in "Plug and Play BIOS + Specification Version 1.0A May 5, 1994" to autodetect built-in + mainboard resources (e.g. parallel port resources). + + Some features (e.g. event notification, docking station information, + ISAPNP services) are not currently implemented. + + If you would like the kernel to detect and allocate resources to + your mainboard devices (on some systems they are disabled by the + BIOS) say Y here. Also the PNPBIOS can help prevent resource + conflicts between mainboard devices and other bus devices. + + Note: ACPI is expected to supersede PNPBIOS some day, currently it + co-exists nicely. If you have a non-ISA system that supports ACPI, + you probably don't need PNPBIOS support. + +config PNPBIOS_PROC_FS + bool "Plug and Play BIOS /proc interface" + depends on PNPBIOS && PROC_FS + ---help--- + If you say Y here and to "/proc file system support", you will be + able to directly access the PNPBIOS. This includes resource + allocation, ESCD, and other PNPBIOS services. Using this + interface is potentially dangerous because the PNPBIOS driver will + not be notified of any resource changes made by writting directly. + Also some buggy systems will fault when accessing certain features + in the PNPBIOS /proc interface (e.g. "boot" configs). + + See the latest pcmcia-cs (stand-alone package) for a nice set of + PNPBIOS /proc interface tools (lspnp and setpnp). + + Unless you are debugging or have other specific reasons, it is + recommended that you say N here. + diff -Nru a/drivers/pnp/pnpbios/Makefile b/drivers/pnp/pnpbios/Makefile --- a/drivers/pnp/pnpbios/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/pnp/pnpbios/Makefile Tue Feb 17 20:00:08 2004 @@ -2,6 +2,6 @@ # Makefile for the kernel PNPBIOS driver. # -pnpbios-proc-$(CONFIG_PROC_FS) = proc.o +pnpbios-proc-$(CONFIG_PNPBIOS_PROC_FS) = proc.o obj-y := core.o bioscalls.o rsparser.o $(pnpbios-proc-y) diff -Nru a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c --- a/drivers/pnp/pnpbios/core.c Tue Feb 17 20:00:05 2004 +++ b/drivers/pnp/pnpbios/core.c Tue Feb 17 20:00:05 2004 @@ -251,7 +251,7 @@ node = pnpbios_kmalloc(node_info.max_node_size, GFP_KERNEL); if (!node) return -1; - if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_STATIC, node)) + if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node)) return -ENODEV; if(pnpbios_write_resources_to_node(res, node)<0) { kfree(node); @@ -264,19 +264,49 @@ return ret; } +static void pnpbios_zero_data_stream(struct pnp_bios_node * node) +{ + unsigned char * p = (char *)node->data; + unsigned char * end = (char *)(node->data + node->size); + unsigned int len; + int i; + while ((char *)p < (char *)end) { + if(p[0] & 0x80) { /* large tag */ + len = (p[2] << 8) | p[1]; + p += 3; + } else { + if (((p[0]>>3) & 0x0f) == 0x0f) + return; + len = p[0] & 0x07; + p += 1; + } + for (i = 0; i < len; i++) + p[i] = 0; + p += len; + } + printk(KERN_ERR "PnPBIOS: Resource structure did not contain an end tag.\n"); +} + static int pnpbios_disable_resources(struct pnp_dev *dev) { struct pnp_bios_node * node; + u8 nodenum = dev->number; int ret; /* just in case */ if(dev->flags & PNPBIOS_NO_DISABLE || !pnpbios_is_dynamic(dev)) return -EPERM; - /* the value of this will be zero */ node = pnpbios_kmalloc(node_info.max_node_size, GFP_KERNEL); if (!node) return -ENOMEM; + + if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node)) { + kfree(node); + return -ENODEV; + } + pnpbios_zero_data_stream(node); + ret = pnp_bios_set_dev_node(dev->number, (char)PNPMODE_DYNAMIC, node); kfree(node); if (ret > 0) @@ -435,7 +465,7 @@ */ for (check = (union pnp_bios_install_struct *) __va(0xf0000); check < (union pnp_bios_install_struct *) __va(0xffff0); - ((void *) (check)) += 16) { + check = (void *)check + 16) { if (check->fields.signature != PNP_SIGNATURE) continue; printk(KERN_INFO "PnPBIOS: Found PnP BIOS installation structure at 0x%p\n", check); diff -Nru a/drivers/pnp/pnpbios/pnpbios.h b/drivers/pnp/pnpbios/pnpbios.h --- a/drivers/pnp/pnpbios/pnpbios.h Tue Feb 17 20:00:06 2004 +++ b/drivers/pnp/pnpbios/pnpbios.h Tue Feb 17 20:00:06 2004 @@ -36,7 +36,7 @@ extern void pnpbios_print_status(const char * module, u16 status); extern void pnpbios_calls_init(union pnp_bios_install_struct * header); -#ifdef CONFIG_PROC_FS +#ifdef CONFIG_PNPBIOS_PROC_FS extern int pnpbios_interface_attach_device(struct pnp_bios_node * node); extern int pnpbios_proc_init (void); extern void pnpbios_proc_exit (void); @@ -44,4 +44,4 @@ static inline int pnpbios_interface_attach_device(struct pnp_bios_node * node) { return 0; } static inline int pnpbios_proc_init (void) { return 0; } static inline void pnpbios_proc_exit (void) { ; } -#endif /* CONFIG_PROC */ +#endif /* CONFIG_PNPBIOS_PROC_FS */ diff -Nru a/drivers/pnp/pnpbios/rsparser.c b/drivers/pnp/pnpbios/rsparser.c --- a/drivers/pnp/pnpbios/rsparser.c Tue Feb 17 20:00:06 2004 +++ b/drivers/pnp/pnpbios/rsparser.c Tue Feb 17 20:00:06 2004 @@ -49,7 +49,7 @@ pnpbios_parse_allocated_irqresource(struct pnp_resource_table * res, int irq) { int i = 0; - while ((res->irq_resource[i].flags & IORESOURCE_IRQ) && i < PNP_MAX_IRQ) i++; + while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_IRQ) i++; if (i < PNP_MAX_IRQ) { res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag if (irq == -1) { @@ -65,7 +65,7 @@ pnpbios_parse_allocated_dmaresource(struct pnp_resource_table * res, int dma) { int i = 0; - while ((res->dma_resource[i].flags & IORESOURCE_DMA) && i < PNP_MAX_DMA) i++; + while (!(res->dma_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_DMA) i++; if (i < PNP_MAX_DMA) { res->dma_resource[i].flags = IORESOURCE_DMA; // Also clears _UNSET flag if (dma == -1) { @@ -81,7 +81,7 @@ pnpbios_parse_allocated_ioresource(struct pnp_resource_table * res, int io, int len) { int i = 0; - while ((res->port_resource[i].flags & IORESOURCE_IO) && i < PNP_MAX_PORT) i++; + while (!(res->port_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_PORT) i++; if (i < PNP_MAX_PORT) { res->port_resource[i].flags = IORESOURCE_IO; // Also clears _UNSET flag if (len <= 0 || (io + len -1) >= 0x10003) { @@ -97,7 +97,7 @@ pnpbios_parse_allocated_memresource(struct pnp_resource_table * res, int mem, int len) { int i = 0; - while ((res->mem_resource[i].flags & IORESOURCE_MEM) && i < PNP_MAX_MEM) i++; + while (!(res->mem_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_MEM) i++; if (i < PNP_MAX_MEM) { res->mem_resource[i].flags = IORESOURCE_MEM; // Also clears _UNSET flag if (len <= 0) { diff -Nru a/drivers/pnp/resource.c b/drivers/pnp/resource.c --- a/drivers/pnp/resource.c Tue Feb 17 20:00:07 2004 +++ b/drivers/pnp/resource.c Tue Feb 17 20:00:07 2004 @@ -241,6 +241,9 @@ (*(enda) >= *(startb) && *(enda) <= *(endb)) || \ (*(starta) < *(startb) && *(enda) > *(endb))) +#define cannot_compare(flags) \ +((flags) & (IORESOURCE_UNSET | IORESOURCE_DISABLED)) + int pnp_check_port(struct pnp_dev * dev, int idx) { int tmp; @@ -250,7 +253,7 @@ end = &dev->res.port_resource[idx].end; /* if the resource doesn't exist, don't complain about it */ - if (dev->res.port_resource[idx].flags & IORESOURCE_UNSET) + if (cannot_compare(dev->res.port_resource[idx].flags)) return 1; /* check if the resource is already in use, skip if the @@ -284,7 +287,7 @@ continue; for (tmp = 0; tmp < PNP_MAX_PORT; tmp++) { if (tdev->res.port_resource[tmp].flags & IORESOURCE_IO) { - if (pnp_port_flags(dev, tmp) & IORESOURCE_DISABLED) + if (cannot_compare(tdev->res.port_resource[tmp].flags)) continue; tport = &tdev->res.port_resource[tmp].start; tend = &tdev->res.port_resource[tmp].end; @@ -306,7 +309,7 @@ end = &dev->res.mem_resource[idx].end; /* if the resource doesn't exist, don't complain about it */ - if (dev->res.mem_resource[idx].flags & IORESOURCE_UNSET) + if (cannot_compare(dev->res.mem_resource[idx].flags)) return 1; /* check if the resource is already in use, skip if the @@ -340,7 +343,7 @@ continue; for (tmp = 0; tmp < PNP_MAX_MEM; tmp++) { if (tdev->res.mem_resource[tmp].flags & IORESOURCE_MEM) { - if (pnp_mem_flags(dev, tmp) & IORESOURCE_DISABLED) + if (cannot_compare(tdev->res.mem_resource[tmp].flags)) continue; taddr = &tdev->res.mem_resource[tmp].start; tend = &tdev->res.mem_resource[tmp].end; @@ -365,7 +368,7 @@ unsigned long * irq = &dev->res.irq_resource[idx].start; /* if the resource doesn't exist, don't complain about it */ - if (dev->res.irq_resource[idx].flags & IORESOURCE_UNSET) + if (cannot_compare(dev->res.irq_resource[idx].flags)) return 1; /* check if the resource is valid */ @@ -411,7 +414,7 @@ continue; for (tmp = 0; tmp < PNP_MAX_IRQ; tmp++) { if (tdev->res.irq_resource[tmp].flags & IORESOURCE_IRQ) { - if (pnp_irq_flags(dev, tmp) & IORESOURCE_DISABLED) + if (cannot_compare(tdev->res.irq_resource[tmp].flags)) continue; if ((tdev->res.irq_resource[tmp].start == *irq)) return 0; @@ -429,7 +432,7 @@ unsigned long * dma = &dev->res.dma_resource[idx].start; /* if the resource doesn't exist, don't complain about it */ - if (dev->res.dma_resource[idx].flags & IORESOURCE_UNSET) + if (cannot_compare(dev->res.dma_resource[idx].flags)) return 1; /* check if the resource is valid */ @@ -464,7 +467,7 @@ continue; for (tmp = 0; tmp < PNP_MAX_DMA; tmp++) { if (tdev->res.dma_resource[tmp].flags & IORESOURCE_DMA) { - if (pnp_dma_flags(dev, tmp) & IORESOURCE_DISABLED) + if (cannot_compare(tdev->res.dma_resource[tmp].flags)) continue; if ((tdev->res.dma_resource[tmp].start == *dma)) return 0; diff -Nru a/drivers/s390/net/qeth.c b/drivers/s390/net/qeth.c --- a/drivers/s390/net/qeth.c Tue Feb 17 20:00:14 2004 +++ b/drivers/s390/net/qeth.c Tue Feb 17 20:00:14 2004 @@ -9802,28 +9802,28 @@ qeth_get_internal_functions(void) { struct net_device *dev; - - dev = (struct net_device *) kmalloc(sizeof (struct net_device), - GFP_KERNEL); +#ifdef CONFIG_NET_ETHERNET + dev = alloc_etherdev(0); if (!dev) { PRINT_ERR("Not enough memory for internal functions.\n"); return -ENOMEM; } -#ifdef CONFIG_NET_ETHERNET - ether_setup(dev); qeth_my_eth_header = dev->hard_header; qeth_my_eth_rebuild_header = dev->rebuild_header; qeth_my_eth_header_cache = dev->hard_header_cache; qeth_my_eth_header_cache_update = dev->header_cache_update; + free_netdev(dev); #endif #ifdef CONFIG_TR - tr_setup(dev); + dev = alloc_trdev(0); + if (!dev) { + PRINT_ERR("Not enough memory for internal functions.\n"); + return -ENOMEM; + } qeth_my_tr_header = dev->hard_header; qeth_my_tr_rebuild_header = dev->rebuild_header; + free_netdev(dev); #endif - - kfree(dev); - return 0; } diff -Nru a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h --- a/drivers/scsi/53c700.h Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/53c700.h Tue Feb 17 20:00:05 2004 @@ -103,8 +103,8 @@ static inline void NCR_700_set_SXFER(Scsi_Device *SDp, __u8 sxfer) { - ((unsigned long)SDp->hostdata) &= 0xffffff00; - ((unsigned long)SDp->hostdata) |= sxfer & 0xff; + SDp->hostdata = (void *)(((long)SDp->hostdata & 0xffffff00) | + (sxfer & 0xff)); } static inline __u8 NCR_700_get_SXFER(Scsi_Device *SDp) { @@ -113,8 +113,11 @@ static inline void NCR_700_set_depth(Scsi_Device *SDp, __u8 depth) { - ((unsigned long)SDp->hostdata) &= 0xffff00ff; - ((unsigned long)SDp->hostdata) |= (0xff00 & (depth << 8)); + long l = (long)SDp->hostdata; + + l &= 0xffff00ff; + l |= 0xff00 & (depth << 8); + SDp->hostdata = (void *)l; } static inline __u8 NCR_700_get_depth(Scsi_Device *SDp) @@ -134,12 +137,12 @@ static inline void NCR_700_set_flag(Scsi_Device *SDp, __u32 flag) { - ((unsigned long)SDp->hostdata) |= (flag & 0xffff0000); + SDp->hostdata = (void *)((long)SDp->hostdata | (flag & 0xffff0000)); } static inline void NCR_700_clear_flag(Scsi_Device *SDp, __u32 flag) { - ((unsigned long)SDp->hostdata) &= ~(flag & 0xffff0000); + SDp->hostdata = (void *)((long)SDp->hostdata & ~(flag & 0xffff0000)); } struct NCR_700_command_slot { diff -Nru a/drivers/scsi/AM53C974.c b/drivers/scsi/AM53C974.c --- a/drivers/scsi/AM53C974.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,2463 +0,0 @@ -#error Please convert me to Documentation/DMA-mapping.txt - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "scsi.h" -#include "hosts.h" -#include "AM53C974.h" - -/* AM53/79C974 (PCscsi) driver release 0.5 - - * The architecture and much of the code of this device - * driver was originally developed by Drew Eckhardt for - * the NCR5380. The following copyrights apply: - * For the architecture and all pieces of code which can also be found - * in the NCR5380 device driver: - * Copyright 1993, Drew Eckhardt - * Visionary Computing - * (Unix and Linux consulting and custom programming) - * drew@colorado.edu - * +1 (303) 666-5836 - * - * The AM53C974_nobios_detect code was originally developed by - * Robin Cutshaw (robin@xfree86.org) and is used here in a - * slightly modified form. - * - * PCI detection rewritten by Martin Mares - * - * For the remaining code: - * Copyright 1994, D. Frieauff - * EMail: fri@rsx42sun0.dofn.de - * Phone: x49-7545-8-2256 , x49-7541-42305 - */ - -/* - * $Log: AM53C974.c,v $ - */ - -#ifdef AM53C974_DEBUG -#define DEB(x) x -#ifdef AM53C974_DEBUG_KEYWAIT -#define KEYWAIT() AM53C974_keywait() -#else -#define KEYWAIT() -#endif -#ifdef AM53C974_DEBUG_INIT -#define DEB_INIT(x) x -#else -#define DEB_INIT(x) -#endif -#ifdef AM53C974_DEBUG_MSG -#define DEB_MSG(x) x -#else -#define DEB_MSG(x) -#endif -#ifdef AM53C974_DEB_RESEL -#define DEB_RESEL(x) x -#else -#define DEB_RESEL(x) -#endif -#ifdef AM53C974_DEBUG_QUEUE -#define DEB_QUEUE(x) x -#define LIST(x,y) {printk("LINE:%d Adding %p to %p\n", __LINE__, (void*)(x), (void*)(y)); if ((x)==(y)) udelay(5); } -#define REMOVE(w,x,y,z) {printk("LINE:%d Removing: %p->%p %p->%p \n", __LINE__, (void*)(w), (void*)(x), (void*)(y), (void*)(z)); if ((x)==(y)) udelay(5); } -#else -#define DEB_QUEUE(x) -#define LIST(x,y) -#define REMOVE(w,x,y,z) -#endif -#ifdef AM53C974_DEBUG_INFO -#define DEB_INFO(x) x -#else -#define DEB_INFO(x) -#endif -#ifdef AM53C974_DEBUG_LINKED -#define DEB_LINKED(x) x -#else -#define DEB_LINKED(x) -#endif -#ifdef AM53C974_DEBUG_INTR -#define DEB_INTR(x) x -#else -#define DEB_INTR(x) -#endif -#else -#define DEB_INIT(x) -#define DEB(x) -#define DEB_QUEUE(x) -#define LIST(x,y) -#define REMOVE(w,x,y,z) -#define DEB_INFO(x) -#define DEB_LINKED(x) -#define DEB_INTR(x) -#define DEB_MSG(x) -#define DEB_RESEL(x) -#define KEYWAIT() -#endif -#ifdef AM53C974_DEBUG_ABORT -#define DEB_ABORT(x) x -#else -#define DEB_ABORT(x) -#endif - -#ifdef VERBOSE_AM53C974_DEBUG -#define VDEB(x) x -#else -#define VDEB(x) -#endif - -#define INSIDE(x,l,h) ( ((x) >= (l)) && ((x) <= (h)) ) - - -#include - -/*************************************************************************************** -* Default setting of the controller's SCSI id. Edit and uncomment this only if your * -* BIOS does not correctly initialize the controller's SCSI id. * -* If you don't get a warning during boot, it is correctly initialized. * -****************************************************************************************/ -/* #define AM53C974_SCSI_ID 7 */ - -/*************************************************************************************** -* Default settings for sync. negotiation enable, transfer rate and sync. offset. * -* These settings can be replaced by LILO overrides (append) with the following syntax: * -* AM53C974=host-scsi-id, target-scsi-id, max-rate, max-offset * -* Sync. negotiation is disabled by default and will be enabled for those targets which * -* are specified in the LILO override * -****************************************************************************************/ -#define DEFAULT_SYNC_NEGOTIATION_ENABLED 0 /* 0 or 1 */ -#define DEFAULT_RATE 5 /* MHz, min: 3; max: 10 */ -#define DEFAULT_SYNC_OFFSET 0 /* bytes, min: 0; max: 15; use 0 for async. mode */ - -/*************************************************************************************** -* If defined, don't allow targets to disconnect during commands. This will reduce * -* performance, but may be worthwhile if you suspect the driver of corrupting data when * -* a disconnect happens. * -***************************************************************************************/ -#define AM53C974_PROHIBIT_DISCONNECT - -/* --------------------- don't edit below here --------------------- */ - -#define AM53C974_DRIVER_REVISION_MAJOR 0 -#define AM53C974_DRIVER_REVISION_MINOR 5 -#define SEPARATOR_LINE \ -"--------------------------------------------------------------------------\n" - -/* debug control */ -/* #define AM53C974_DEBUG */ -/* #define AM53C974_DEBUG_MSG */ -/* #define AM53C974_DEBUG_KEYWAIT */ -/* #define AM53C974_DEBUG_INIT */ -/* #define AM53C974_DEBUG_QUEUE */ -/* #define AM53C974_DEBUG_INFO */ -/* #define AM53C974_DEBUG_LINKED */ -/* #define VERBOSE_AM53C974_DEBUG */ -/* #define AM53C974_DEBUG_INTR */ -/* #define AM53C974_DEB_RESEL */ -#define AM53C974_DEBUG_ABORT -/* #define AM53C974_OPTION_DEBUG_PROBE_ONLY */ - -/* special options/constants */ -#define DEF_CLK 40 /* chip clock freq. in MHz */ -#define MIN_PERIOD 4 /* for negotiation: min. number of clocks per cycle */ -#define MAX_PERIOD 13 /* for negotiation: max. number of clocks per cycle */ -#define MAX_OFFSET 15 /* for negotiation: max. offset (0=async) */ - -#define DEF_SCSI_TIMEOUT 245 /* STIMREG value, 40 Mhz */ -#define DEF_STP 8 /* STPREG value assuming 5.0 MB/sec, FASTCLK, FASTSCSI */ -#define DEF_SOF_RAD 0 /* REQ/ACK deassertion delay */ -#define DEF_SOF_RAA 0 /* REQ/ACK assertion delay */ -#define DEF_ETM 0 /* CNTLREG1, ext. timing mode */ -#define DEF_PERE 1 /* CNTLREG1, parity error reporting */ -#define DEF_CLKF 0 /* CLKFREG, 0=40 Mhz */ -#define DEF_ENF 1 /* CNTLREG2, enable features */ -#define DEF_ADIDCHK 0 /* CNTLREG3, additional ID check */ -#define DEF_FASTSCSI 1 /* CNTLREG3, fast SCSI */ -#define DEF_FASTCLK 1 /* CNTLREG3, fast clocking, 5 MB/sec at 40MHz chip clk */ -#define DEF_GLITCH 1 /* CNTLREG4, glitch eater, 0=12ns, 1=35ns, 2=25ns, 3=off */ -#define DEF_PWD 0 /* CNTLREG4, reduced power feature */ -#define DEF_RAE 0 /* CNTLREG4, RAE active negation on REQ, ACK only */ -#define DEF_RADE 1 /* 1CNTLREG4, active negation on REQ, ACK and data */ - -/*** SCSI block ***/ -#define CTCLREG 0x00 /* r current transf. count, low byte */ -#define CTCMREG 0x04 /* r current transf. count, middle byte */ -#define CTCHREG 0x38 /* r current transf. count, high byte */ -#define STCLREG 0x00 /* w start transf. count, low byte */ -#define STCMREG 0x04 /* w start transf. count, middle byte */ -#define STCHREG 0x38 /* w start transf. count, high byte */ -#define FFREG 0x08 /* rw SCSI FIFO reg. */ -#define STIMREG 0x14 /* w SCSI timeout reg. */ - -#define SDIDREG 0x10 /* w SCSI destination ID reg. */ -#define SDIREG_MASK 0x07 /* mask */ - -#define STPREG 0x18 /* w synchronous transf. period reg. */ -#define STPREG_STP 0x1F /* synchr. transfer period */ - -#define CLKFREG 0x24 /* w clock factor reg. */ -#define CLKFREG_MASK 0x07 /* mask */ - -#define CMDREG 0x0C /* rw SCSI command reg. */ -#define CMDREG_DMA 0x80 /* set DMA mode (set together with opcodes below) */ -#define CMDREG_IT 0x10 /* information transfer */ -#define CMDREG_ICCS 0x11 /* initiator command complete steps */ -#define CMDREG_MA 0x12 /* message accepted */ -#define CMDREG_TPB 0x98 /* transfer pad bytes, DMA mode only */ -#define CMDREG_SATN 0x1A /* set ATN */ -#define CMDREG_RATN 0x1B /* reset ATN */ -#define CMDREG_SOAS 0x41 /* select without ATN steps */ -#define CMDREG_SAS 0x42 /* select with ATN steps (1 msg byte) */ -#define CMDREG_SASS 0x43 /* select with ATN and stop steps */ -#define CMDREG_ESR 0x44 /* enable selection/reselection */ -#define CMDREG_DSR 0x45 /* disable selection/reselection */ -#define CMDREG_SA3S 0x46 /* select with ATN 3 steps (3 msg bytes) */ -#define CMDREG_NOP 0x00 /* no operation */ -#define CMDREG_CFIFO 0x01 /* clear FIFO */ -#define CMDREG_RDEV 0x02 /* reset device */ -#define CMDREG_RBUS 0x03 /* reset SCSI bus */ - -#define STATREG 0x10 /* r SCSI status reg. */ -#define STATREG_INT 0x80 /* SCSI interrupt condition detected */ -#define STATREG_IOE 0x40 /* SCSI illegal operation error detected */ -#define STATREG_PE 0x20 /* SCSI parity error detected */ -#define STATREG_CTZ 0x10 /* CTC reg decremented to zero */ -#define STATREG_MSG 0x04 /* SCSI MSG phase (latched?) */ -#define STATREG_CD 0x02 /* SCSI C/D phase (latched?) */ -#define STATREG_IO 0x01 /* SCSI I/O phase (latched?) */ -#define STATREG_PHASE 0x07 /* SCSI phase mask */ - -#define INSTREG 0x14 /* r interrupt status reg. */ -#define INSTREG_SRST 0x80 /* SCSI reset detected */ -#define INSTREG_ICMD 0x40 /* SCSI invalid command detected */ -#define INSTREG_DIS 0x20 /* target disconnected or sel/resel timeout */ -#define INSTREG_SR 0x10 /* device on bus has service request */ -#define INSTREG_SO 0x08 /* successful operation */ -#define INSTREG_RESEL 0x04 /* device reselected as initiator */ - -#define ISREG 0x18 /* r internal state reg. */ -#define ISREG_SOF 0x08 /* synchronous offset flag (act. low) */ -#define ISREG_IS 0x07 /* status of intermediate op. */ -#define ISREG_OK_NO_STOP 0x04 /* selection successful */ -#define ISREG_OK_STOP 0x01 /* selection successful */ - -#define CFIREG 0x1C /* r current FIFO/internal state reg. */ -#define CFIREG_IS 0xE0 /* status of intermediate op. */ -#define CFIREG_CF 0x1F /* number of bytes in SCSI FIFO */ - -#define SOFREG 0x1C /* w synchr. offset reg. */ -#define SOFREG_RAD 0xC0 /* REQ/ACK deassertion delay (sync.) */ -#define SOFREG_RAA 0x30 /* REQ/ACK assertion delay (sync.) */ -#define SOFREG_SO 0x0F /* synch. offset (sync.) */ - -#define CNTLREG1 0x20 /* rw control register one */ -#define CNTLREG1_ETM 0x80 /* set extended timing mode */ -#define CNTLREG1_DISR 0x40 /* disable interrupt on SCSI reset */ -#define CNTLREG1_PERE 0x10 /* enable parity error reporting */ -#define CNTLREG1_SID 0x07 /* host adapter SCSI ID */ - -#define CNTLREG2 0x2C /* rw control register two */ -#define CNTLREG2_ENF 0x40 /* enable features */ - -#define CNTLREG3 0x30 /* rw control register three */ -#define CNTLREG3_ADIDCHK 0x80 /* additional ID check */ -#define CNTLREG3_FASTSCSI 0x10 /* fast SCSI */ -#define CNTLREG3_FASTCLK 0x08 /* fast SCSI clocking */ - -#define CNTLREG4 0x34 /* rw control register four */ -#define CNTLREG4_GLITCH 0xC0 /* glitch eater */ -#define CNTLREG4_PWD 0x20 /* reduced power feature */ -#define CNTLREG4_RAE 0x08 /* write only, active negot. ctrl. */ -#define CNTLREG4_RADE 0x04 /* active negot. ctrl. */ -#define CNTLREG4_RES 0x10 /* reserved bit, must be 1 */ - -/*** DMA block ***/ -#define DMACMD 0x40 /* rw command */ -#define DMACMD_DIR 0x80 /* transfer direction (1=read from device) */ -#define DMACMD_INTE_D 0x40 /* DMA transfer interrupt enable */ -#define DMACMD_INTE_P 0x20 /* page transfer interrupt enable */ -#define DMACMD_MDL 0x10 /* map to memory descriptor list */ -#define DMACMD_DIAG 0x04 /* diagnostics, set to 0 */ -#define DMACMD_IDLE 0x00 /* idle cmd */ -#define DMACMD_BLAST 0x01 /* flush FIFO to memory */ -#define DMACMD_ABORT 0x02 /* terminate DMA */ -#define DMACMD_START 0x03 /* start DMA */ - -#define DMASTATUS 0x54 /* r status register */ -#define DMASTATUS_BCMPLT 0x20 /* BLAST complete */ -#define DMASTATUS_SCSIINT 0x10 /* SCSI interrupt pending */ -#define DMASTATUS_DONE 0x08 /* DMA transfer terminated */ -#define DMASTATUS_ABORT 0x04 /* DMA transfer aborted */ -#define DMASTATUS_ERROR 0x02 /* DMA transfer error */ -#define DMASTATUS_PWDN 0x02 /* power down indicator */ - -#define DMASTC 0x44 /* rw starting transfer count */ -#define DMASPA 0x48 /* rw starting physical address */ -#define DMAWBC 0x4C /* r working byte counter */ -#define DMAWAC 0x50 /* r working address counter */ -#define DMASMDLA 0x58 /* rw starting MDL address */ -#define DMAWMAC 0x5C /* r working MDL counter */ - -/*** SCSI phases ***/ -#define PHASE_MSGIN 0x07 -#define PHASE_MSGOUT 0x06 -#define PHASE_RES_1 0x05 -#define PHASE_RES_0 0x04 -#define PHASE_STATIN 0x03 -#define PHASE_CMDOUT 0x02 -#define PHASE_DATAIN 0x01 -#define PHASE_DATAOUT 0x00 - - -#define AM53C974_local_declare() unsigned long io_port -#define AM53C974_setio(instance) io_port = instance->io_port -#define AM53C974_read_8(addr) inb(io_port + (addr)) -#define AM53C974_write_8(addr,x) outb((x), io_port + (addr)) -#define AM53C974_read_16(addr) inw(io_port + (addr)) -#define AM53C974_write_16(addr,x) outw((x), io_port + (addr)) -#define AM53C974_read_32(addr) inl(io_port + (addr)) -#define AM53C974_write_32(addr,x) outl((x), io_port + (addr)) - -#define AM53C974_poll_int() { do { statreg = AM53C974_read_8(STATREG); } \ - while (!(statreg & STATREG_INT)) ; \ - AM53C974_read_8(INSTREG) ; } /* clear int */ -#define AM53C974_cfifo() (AM53C974_read_8(CFIREG) & CFIREG_CF) - -/* These are "special" values for the tag parameter passed to AM53C974_select. */ -#define TAG_NEXT -1 /* Use next free tag */ -#define TAG_NONE -2 /* Establish I_T_L nexus instead of I_T_L_Q - * even on SCSI-II devices */ - -/************ LILO overrides *************/ -typedef struct _override_t { - int host_scsi_id; /* SCSI id of the bus controller */ - int target_scsi_id; /* SCSI id of target */ - int max_rate; /* max. transfer rate */ - int max_offset; /* max. sync. offset, 0 = asynchronous */ -} override_t; - - -#ifdef AM53C974_DEBUG -static void AM53C974_print_phase(struct Scsi_Host *instance); -static void AM53C974_print_queues(struct Scsi_Host *instance); -#endif /* AM53C974_DEBUG */ -static void AM53C974_print(struct Scsi_Host *instance); -static void AM53C974_keywait(void); -static __inline__ int AM53C974_pci_detect(Scsi_Host_Template * tpnt); -static int AM53C974_init(Scsi_Host_Template * tpnt, struct pci_dev *pdev); -static void AM53C974_config_after_reset(struct Scsi_Host *instance); -static __inline__ void initialize_SCp(Scsi_Cmnd * cmd); -static __inline__ void run_main(void); -static void AM53C974_main(void); -static void AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs); -static void do_AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs); -static void AM53C974_intr_disconnect(struct Scsi_Host *instance); -static int AM53C974_sync_neg(struct Scsi_Host *instance, int target, unsigned char *msg); -static __inline__ void AM53C974_set_async(struct Scsi_Host *instance, int target); -static __inline__ void AM53C974_set_sync(struct Scsi_Host *instance, int target); -static void AM53C974_information_transfer(struct Scsi_Host *instance, - unsigned char statreg, unsigned char isreg, - unsigned char instreg, unsigned char cfifo, - unsigned char dmastatus); -static int AM53C974_message(struct Scsi_Host *instance, Scsi_Cmnd * cmd, unsigned char msg); -static void AM53C974_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag); -static void AM53C974_intr_reselect(struct Scsi_Host *instance, unsigned char statreg); -static __inline__ void AM53C974_transfer_dma(struct Scsi_Host *instance, short dir, - unsigned long length, char *data); -static void AM53C974_dma_blast(struct Scsi_Host *instance, unsigned char dmastatus, - unsigned char statreg); -static void AM53C974_intr_bus_reset(struct Scsi_Host *instance); - -static struct Scsi_Host *first_instance; -static Scsi_Host_Template *the_template; -static struct Scsi_Host *first_host; /* Head of list of AMD boards */ -static volatile int main_running; -static int commandline_current; -override_t overrides[7] = -{ - {-1, 0, 0, 0},}; /* LILO overrides */ - -#ifdef AM53C974_DEBUG -static int deb_stop = 1; - -static struct { - unsigned char value; - char *name; -} phases[] = { - - { - PHASE_DATAOUT, "DATAOUT" - }, { - PHASE_DATAIN, "DATAIN" - }, { - PHASE_CMDOUT, "CMDOUT" - }, - { - PHASE_STATIN, "STATIN" - }, { - PHASE_MSGOUT, "MSGOUT" - }, { - PHASE_MSGIN, "MSGIN" - }, - { - PHASE_RES_0, "RESERVED 0" - }, { - PHASE_RES_1, "RESERVED 1" - } -}; - -/************************************************************************** - * Function : void AM53C974_print_phase(struct Scsi_Host *instance) - * - * Purpose : print the current SCSI phase for debugging purposes - * - * Input : instance - which AM53C974 - **************************************************************************/ -static void AM53C974_print_phase(struct Scsi_Host *instance) -{ - AM53C974_local_declare(); - unsigned char statreg, latched; - int i; - AM53C974_setio(instance); - - latched = (AM53C974_read_8(CNTLREG2)) & CNTLREG2_ENF; - statreg = AM53C974_read_8(STATREG); - for (i = 0; (phases[i].value != PHASE_RES_1) && - (phases[i].value != (statreg & STATREG_PHASE)); ++i); - if (latched) - printk("scsi%d : phase %s, latched at end of last command\n", instance->host_no, phases[i].name); - else - printk("scsi%d : phase %s, real time\n", instance->host_no, phases[i].name); -} - -/************************************************************************** - * Function : void AM53C974_print_queues(struct Scsi_Host *instance) - * - * Purpose : print commands in the various queues - * - * Inputs : instance - which AM53C974 - **************************************************************************/ -static void AM53C974_print_queues(struct Scsi_Host *instance) -{ - unsigned long flags; - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - Scsi_Cmnd *ptr; - - printk("AM53C974: coroutine is%s running.\n", main_running ? "" : "n't"); - - save_flags(flags); - cli(); - - if (!hostdata->connected) { - printk("scsi%d: no currently connected command\n", instance->host_no); - } else { - print_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected); - } - if (!hostdata->sel_cmd) { - printk("scsi%d: no currently arbitrating command\n", instance->host_no); - } else { - print_Scsi_Cmnd((Scsi_Cmnd *) hostdata->sel_cmd); - } - - printk("scsi%d: issue_queue ", instance->host_no); - if (!hostdata->issue_queue) - printk("empty\n"); - else { - printk(":\n"); - for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) - print_Scsi_Cmnd(ptr); - } - - printk("scsi%d: disconnected_queue ", instance->host_no); - if (!hostdata->disconnected_queue) - printk("empty\n"); - else { - printk(":\n"); - for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) - print_Scsi_Cmnd(ptr); - } - - restore_flags(flags); -} - -#endif /* AM53C974_DEBUG */ - -/************************************************************************** - * Function : void AM53C974_print(struct Scsi_Host *instance) - * - * Purpose : dump the chip registers for debugging purposes - * - * Input : instance - which AM53C974 - **************************************************************************/ -static void AM53C974_print(struct Scsi_Host *instance) -{ - AM53C974_local_declare(); - unsigned long flags; - unsigned long ctcreg, dmastc, dmaspa, dmawbc, dmawac; - unsigned char cmdreg, statreg, isreg, cfireg, cntlreg[4], dmacmd, - dmastatus; - AM53C974_setio(instance); - - save_flags(flags); - cli(); - ctcreg = AM53C974_read_8(CTCHREG) << 16; - ctcreg |= AM53C974_read_8(CTCMREG) << 8; - ctcreg |= AM53C974_read_8(CTCLREG); - cmdreg = AM53C974_read_8(CMDREG); - statreg = AM53C974_read_8(STATREG); - isreg = AM53C974_read_8(ISREG); - cfireg = AM53C974_read_8(CFIREG); - cntlreg[0] = AM53C974_read_8(CNTLREG1); - cntlreg[1] = AM53C974_read_8(CNTLREG2); - cntlreg[2] = AM53C974_read_8(CNTLREG3); - cntlreg[3] = AM53C974_read_8(CNTLREG4); - dmacmd = AM53C974_read_8(DMACMD); - dmastc = AM53C974_read_32(DMASTC); - dmaspa = AM53C974_read_32(DMASPA); - dmawbc = AM53C974_read_32(DMAWBC); - dmawac = AM53C974_read_32(DMAWAC); - dmastatus = AM53C974_read_8(DMASTATUS); - restore_flags(flags); - - printk("AM53C974 register dump:\n"); - printk("IO base: 0x%04lx; CTCREG: 0x%04lx; CMDREG: 0x%02x; STATREG: 0x%02x; ISREG: 0x%02x\n", - io_port, ctcreg, cmdreg, statreg, isreg); - printk("CFIREG: 0x%02x; CNTLREG1-4: 0x%02x; 0x%02x; 0x%02x; 0x%02x\n", - cfireg, cntlreg[0], cntlreg[1], cntlreg[2], cntlreg[3]); - printk("DMACMD: 0x%02x; DMASTC: 0x%04lx; DMASPA: 0x%04lx\n", dmacmd, dmastc, dmaspa); - printk("DMAWBC: 0x%04lx; DMAWAC: 0x%04lx; DMASTATUS: 0x%02x\n", dmawbc, dmawac, dmastatus); - printk("---------------------------------------------------------\n"); -} - -/************************************************************************** -* Function : void AM53C974_keywait(void) -* -* Purpose : wait until a key is pressed, if it was the 'r' key leave singlestep mode; -* this function is used for debugging only -* -* Input : none -**************************************************************************/ -static void AM53C974_keywait(void) -{ - unsigned long flags; -#ifdef AM53C974_DEBUG - int key; - - if (!deb_stop) - return; -#endif - - save_flags(flags); - cli(); - while ((inb_p(0x64) & 0x01) != 0x01); -#ifdef AM53C974_DEBUG - key = inb(0x60); - if (key == 0x93) - deb_stop = 0; /* don't stop if 'r' was pressed */ -#endif - restore_flags(flags); -} - -#ifndef MODULE -/************************************************************************** -* Function : AM53C974_setup(char *str) -* -* Purpose : LILO command line initialization of the overrides array, -* -* Input : str - parameter string. -* -* Returns : 1. -* -* NOTE : this function needs to be declared as an external function -* in init/main.c and included there in the bootsetups list -***************************************************************************/ -static int AM53C974_setup(char *str) -{ - int ints[5]; - - get_options(str, ARRAY_SIZE(ints), ints); - - if (ints[0] < 4) - printk("AM53C974_setup: wrong number of parameters;\n correct syntax is: AM53C974=host-scsi-id, target-scsi-id, max-rate, max-offset\n"); - else { - if (commandline_current < (sizeof(overrides) / sizeof(override_t))) { - if ((ints[1] < 0) || (ints[1] > 7) || - (ints[2] < 0) || (ints[2] > 7) || - (ints[1] == ints[2]) || - (ints[3] < (DEF_CLK / MAX_PERIOD)) || (ints[3] > (DEF_CLK / MIN_PERIOD)) || - (ints[4] < 0) || (ints[4] > MAX_OFFSET)) - printk("AM53C974_setup: invalid parameter\n"); - else { - overrides[commandline_current].host_scsi_id = ints[1]; - overrides[commandline_current].target_scsi_id = ints[2]; - overrides[commandline_current].max_rate = ints[3]; - overrides[commandline_current].max_offset = ints[4]; - commandline_current++; - } - } else - printk("AM53C974_setup: too many overrides\n"); - } - - return 1; -} -__setup("AM53C974=", AM53C974_setup); - -#endif /* !MODULE */ - -/************************************************************************** -* Function : int AM53C974_pci_detect(Scsi_Host_Template *tpnt) -* -* Purpose : detects and initializes AM53C974 SCSI chips with PCI Bios -* -* Inputs : tpnt - host template -* -* Returns : number of host adapters detected -**************************************************************************/ -static int __init AM53C974_pci_detect(Scsi_Host_Template * tpnt) -{ - int count = 0; /* number of boards detected */ - struct pci_dev *pdev = NULL; - unsigned short command; - - while ((pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SCSI, pdev))) { - if (pci_enable_device(pdev)) - continue; - pci_read_config_word(pdev, PCI_COMMAND, &command); - - /* check whether device is I/O mapped -- should be */ - if (!(command & PCI_COMMAND_IO)) - continue; - - pci_set_master (pdev); - - /* everything seems OK now, so initialize */ - if (AM53C974_init(tpnt, pdev)) - count++; - } - return (count); -} - -/************************************************************************** -* Function : int AM53C974_init(Scsi_Host_Template *tpnt, struct pci_dev *pdev) -* -* Purpose : initializes instance and corresponding AM53/79C974 chip, -* -* Inputs : tpnt - template, pci_config - PCI configuration, -* -* Returns : 1 on success, 0 on failure. -* -* NOTE: If no override for the controller's SCSI id is given and AM53C974_SCSI_ID -* is not defined we assume that the SCSI address of this controller is correctly -* set up by the BIOS (as reflected by contents of register CNTLREG1). -* This is the only BIOS assistance we need. -**************************************************************************/ -static int __init AM53C974_init(Scsi_Host_Template * tpnt, struct pci_dev *pdev) -{ - AM53C974_local_declare(); - int i, j; - struct Scsi_Host *instance, *search; - struct AM53C974_hostdata *hostdata; - -#ifdef AM53C974_OPTION_DEBUG_PROBE_ONLY - printk("AM53C974: probe only enabled, aborting initialization\n"); - return 0; -#endif - - instance = scsi_register(tpnt, sizeof(struct AM53C974_hostdata)); - if (!instance) { - printk(KERN_WARNING "AM53C974: Unable to register host, aborting.\n"); - return 0; - } - scsi_set_device(instance, &pdev->dev); - hostdata = (struct AM53C974_hostdata *) instance->hostdata; - instance->base = 0; - instance->io_port = pci_resource_start(pdev, 0); - instance->irq = pdev->irq; - instance->dma_channel = -1; - AM53C974_setio(instance); - -#ifdef AM53C974_SCSI_ID - instance->this_id = AM53C974_SCSI_ID; - AM53C974_write_8(CNTLREG1, instance->this_id & CNTLREG1_SID); -#else - instance->this_id = AM53C974_read_8(CNTLREG1) & CNTLREG1_SID; - if (instance->this_id != 7) - printk("scsi%d: WARNING: unusual hostadapter SCSI id %d; please verify!\n", - instance->host_no, instance->this_id); -#endif - - for (i = 0; i < sizeof(hostdata->msgout); i++) { - hostdata->msgout[i] = NOP; - hostdata->last_message[i] = NOP; - } - for (i = 0; i < 8; i++) { - hostdata->busy[i] = 0; - hostdata->sync_per[i] = DEF_STP; - hostdata->sync_off[i] = 0; - hostdata->sync_neg[i] = 0; - hostdata->sync_en[i] = DEFAULT_SYNC_NEGOTIATION_ENABLED; - hostdata->max_rate[i] = DEFAULT_RATE; - hostdata->max_offset[i] = DEFAULT_SYNC_OFFSET; - } - -/* overwrite defaults by LILO overrides */ - for (i = 0; i < commandline_current; i++) { - if (overrides[i].host_scsi_id == instance->this_id) { - j = overrides[i].target_scsi_id; - hostdata->sync_en[j] = 1; - hostdata->max_rate[j] = overrides[i].max_rate; - hostdata->max_offset[j] = overrides[i].max_offset; - } - } - - hostdata->sel_cmd = NULL; - hostdata->connected = NULL; - hostdata->issue_queue = NULL; - hostdata->disconnected_queue = NULL; - hostdata->in_reset = 0; - hostdata->aborted = 0; - hostdata->selecting = 0; - hostdata->disconnecting = 0; - hostdata->dma_busy = 0; - - if (!request_region (instance->io_port, 128, "AM53C974")) { - printk ("AM53C974 (scsi%d): Could not get IO region %04lx.\n", - instance->host_no, instance->io_port); - scsi_unregister(instance); - return 0; - } -/* Set up an interrupt handler if we aren't already sharing an IRQ with another board */ - for (search = first_host; - search && (((the_template != NULL) && (search->hostt != the_template)) || - (search->irq != instance->irq) || (search == instance)); - search = search->next); - if (!search) { - if (request_irq(instance->irq, do_AM53C974_intr, SA_SHIRQ, "AM53C974", instance)) { - printk("scsi%d: IRQ%d not free, detaching\n", instance->host_no, instance->irq); - scsi_unregister(instance); - return 0; - } - } else { - printk("scsi%d: using interrupt handler previously installed for scsi%d\n", - instance->host_no, search->host_no); - } - - if (!the_template) { - the_template = instance->hostt; - first_instance = instance; - } -/* do hard reset */ - AM53C974_write_8(CMDREG, CMDREG_RDEV); /* reset device */ - udelay(5); - AM53C974_write_8(CMDREG, CMDREG_NOP); - AM53C974_write_8(CNTLREG1, CNTLREG1_DISR | instance->this_id); - AM53C974_write_8(CMDREG, CMDREG_RBUS); /* reset SCSI bus */ - udelay(10); - AM53C974_config_after_reset(instance); - mdelay(500); - return (1); -} - -/********************************************************************* -* Function : AM53C974_config_after_reset(struct Scsi_Host *instance) * -* * -* Purpose : initializes chip registers after reset * -* * -* Inputs : instance - which AM53C974 * -* * -* Returns : nothing * -**********************************************************************/ -static void AM53C974_config_after_reset(struct Scsi_Host *instance) -{ - AM53C974_local_declare(); - AM53C974_setio(instance); - -/* clear SCSI FIFO */ - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - -/* configure device */ - AM53C974_write_8(STIMREG, DEF_SCSI_TIMEOUT); - AM53C974_write_8(STPREG, DEF_STP & STPREG_STP); - AM53C974_write_8(SOFREG, (DEF_SOF_RAD << 6) | (DEF_SOF_RAA << 4)); - AM53C974_write_8(CLKFREG, DEF_CLKF & CLKFREG_MASK); - AM53C974_write_8(CNTLREG1, (DEF_ETM << 7) | CNTLREG1_DISR | (DEF_PERE << 4) | instance->this_id); - AM53C974_write_8(CNTLREG2, (DEF_ENF << 6)); - AM53C974_write_8(CNTLREG3, (DEF_ADIDCHK << 7) | (DEF_FASTSCSI << 4) | (DEF_FASTCLK << 3)); - AM53C974_write_8(CNTLREG4, (DEF_GLITCH << 6) | (DEF_PWD << 5) | (DEF_RAE << 3) | (DEF_RADE << 2) | CNTLREG4_RES); -} - -/*********************************************************************** -* Function : const char *AM53C974_info(struct Scsi_Host *instance) * -* * -* Purpose : return device driver information * -* * -* Inputs : instance - which AM53C974 * -* * -* Returns : info string * -************************************************************************/ -static const char *AM53C974_info(struct Scsi_Host *instance) -{ - static char info[100]; - - sprintf(info, "AM53/79C974 PCscsi driver rev. %d.%d; host I/O address: 0x%lx; irq: %d\n", - AM53C974_DRIVER_REVISION_MAJOR, AM53C974_DRIVER_REVISION_MINOR, - instance->io_port, instance->irq); - return (info); -} - -/************************************************************************** -* Function : void initialize_SCp(Scsi_Cmnd *cmd) * -* * -* Purpose : initialize the saved data pointers for cmd to point to the * -* start of the buffer. * -* * -* Inputs : cmd - Scsi_Cmnd structure to have pointers reset. * -* * -* Returns : nothing * -**************************************************************************/ -static __inline__ void initialize_SCp(Scsi_Cmnd * cmd) -{ - if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; - cmd->SCp.buffers_residual = cmd->use_sg - 1; - cmd->SCp.ptr = (char *) cmd->SCp.buffer->address; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - } else { - cmd->SCp.buffer = NULL; - cmd->SCp.buffers_residual = 0; - cmd->SCp.ptr = (char *) cmd->request_buffer; - cmd->SCp.this_residual = cmd->request_bufflen; - } -} - -/************************************************************************** -* Function : run_main(void) * -* * -* Purpose : insure that the coroutine is running and will process our * -* request. main_running is checked/set here (in an inline * -* function rather than in AM53C974_main itself to reduce the * -* chances of stack overflow. * -* * -* * -* Inputs : none * -* * -* Returns : nothing * -**************************************************************************/ -static __inline__ void run_main(void) -{ - unsigned long flags; - save_flags(flags); - cli(); - if (!main_running) { - /* main_running is cleared in AM53C974_main once it can't do - more work, and AM53C974_main exits with interrupts disabled. */ - main_running = 1; - AM53C974_main(); - } - restore_flags(flags); -} - -/************************************************************************** -* Function : int AM53C974_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) -* -* Purpose : writes SCSI command into AM53C974 FIFO -* -* Inputs : cmd - SCSI command, done - function called on completion, with -* a pointer to the command descriptor. -* -* Returns : status, see hosts.h for details -* -* Side effects : -* cmd is added to the per instance issue_queue, with minor -* twiddling done to the host specific fields of cmd. If the -* main coroutine is not running, it is restarted. -**************************************************************************/ -static int AM53C974_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) -{ - unsigned long flags; - struct Scsi_Host *instance = cmd->device->host; - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - Scsi_Cmnd *tmp; - - save_flags(flags); - cli(); - DEB_QUEUE(printk(SEPARATOR_LINE)); - DEB_QUEUE(printk("scsi%d: AM53C974_queue_command called\n", instance->host_no)); - DEB_QUEUE(printk("cmd=%02x target=%02x lun=%02x bufflen=%d use_sg = %02x\n", - cmd->cmnd[0], cmd->target, cmd->device->lun, cmd->request_bufflen, cmd->use_sg)); - -/* We use the host_scribble field as a pointer to the next command in a queue */ - cmd->host_scribble = NULL; - cmd->scsi_done = done; - cmd->result = 0; - cmd->device->disconnect = 0; - -/* Insert the cmd into the issue queue. Note that REQUEST SENSE - * commands are added to the head of the queue since any command will - * clear the contingent allegiance condition that exists and the - * sense data is only guaranteed to be valid while the condition exists. */ - if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) { - LIST(cmd, hostdata->issue_queue); - cmd->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = cmd; - } else { - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp->host_scribble; - tmp = (Scsi_Cmnd *) tmp->host_scribble); - LIST(cmd, tmp); - tmp->host_scribble = (unsigned char *) cmd; - } - - DEB_QUEUE(printk("scsi%d : command added to %s of queue\n", instance->host_no, - (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail")); - -/* Run the coroutine if it isn't already running. */ - run_main(); - restore_flags(flags); - return 0; -} - -/************************************************************************** - * Function : AM53C974_main (void) - * - * Purpose : AM53C974_main is a coroutine that runs as long as more work can - * be done on the AM53C974 host adapters in a system. Both - * AM53C974_queue_command() and AM53C974_intr() will try to start it - * in case it is not running. - * - * NOTE : AM53C974_main exits with interrupts *disabled*, the caller should - * reenable them. This prevents reentrancy and kernel stack overflow. - **************************************************************************/ -static void AM53C974_main(void) -{ - AM53C974_local_declare(); - unsigned long flags; - Scsi_Cmnd *tmp, *prev; - struct Scsi_Host *instance; - struct AM53C974_hostdata *hostdata; - int done; - -/* We run (with interrupts disabled) until we're sure that none of - * the host adapters have anything that can be done, at which point - * we set main_running to 0 and exit. */ - - save_flags(flags); - cli(); /* Freeze request queues */ - do { - done = 1; - for (instance = first_instance; instance && instance->hostt == the_template; - instance = instance->next) { - hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - /* start to select target if we are not connected and not in the - selection process */ - if (!hostdata->connected && !hostdata->sel_cmd) { - /* Search through the issue_queue for a command destined for a target - that is not busy. */ - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; - prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) { - /* When we find one, remove it from the issue queue. */ - if (!(hostdata->busy[tmp->device->id] & (1 << tmp->device->lun))) { - if (prev) { - REMOVE(prev, (Scsi_Cmnd *) (prev->host_scribble), tmp, - (Scsi_Cmnd *) (tmp->host_scribble)); - prev->host_scribble = tmp->host_scribble; - } else { - REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble); - hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble; - } - tmp->host_scribble = NULL; - - /* go into selection mode, disable reselection and wait for - SO interrupt which will continue with the selection process */ - hostdata->selecting = 1; - hostdata->sel_cmd = tmp; - AM53C974_write_8(CMDREG, CMDREG_DSR); - break; - } /* if target/lun is not busy */ - } /* for */ - } - /* if (!hostdata->connected) */ - else { - DEB(printk("main: connected; cmd = 0x%lx, sel_cmd = 0x%lx\n", - (long) hostdata->connected, (long) hostdata->sel_cmd)); - } - } /* for instance */ - } while (!done); - main_running = 0; - restore_flags(flags); -} - -/************************************************************************ -* Function : AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs) * -* * -* Purpose : interrupt handler * -* * -* Inputs : irq - interrupt line, regs - ? * -* * -* Returns : nothing * -************************************************************************/ -static void do_AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs) -{ - unsigned long flags; - struct Scsi_Host *dev = dev_id; - - spin_lock_irqsave(dev->host_lock, flags); - AM53C974_intr(irq, dev_id, regs); - spin_unlock_irqrestore(dev->host_lock, flags); -} - -/************************************************************************ -* Function : AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs) * -* * -* Purpose : interrupt handler * -* * -* Inputs : irq - interrupt line, regs - ? * -* * -* Returns : nothing * -************************************************************************/ -static void AM53C974_intr(int irq, void *dev_id, struct pt_regs *regs) -{ - AM53C974_local_declare(); - struct Scsi_Host *instance; - struct AM53C974_hostdata *hostdata; - unsigned char cmdreg, dmastatus, statreg, isreg, instreg, cfifo; - -/* find AM53C974 hostadapter responsible for this interrupt */ - for (instance = first_instance; instance; instance = instance->next) - if ((instance->irq == irq) && (instance->hostt == the_template)) - goto FOUND; - return; - -/* found; now decode and process */ - FOUND: - hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - dmastatus = AM53C974_read_8(DMASTATUS); - - DEB_INTR(printk(SEPARATOR_LINE)); - DEB_INTR(printk("AM53C974 interrupt; dmastatus=0x%02x\n", dmastatus)); - KEYWAIT(); - -/*** DMA related interrupts ***/ - if (hostdata->connected && (dmastatus & (DMASTATUS_ERROR | DMASTATUS_PWDN | - DMASTATUS_ABORT))) { - /* DMA error or POWERDOWN */ - printk("scsi%d: DMA error or powerdown; dmastatus: 0x%02x\n", - instance->host_no, dmastatus); -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - panic("scsi%d: cannot recover\n", instance->host_no); - } - if (hostdata->connected && (dmastatus & DMASTATUS_DONE)) { - /* DMA transfer done */ - unsigned long residual; - unsigned long flags; - save_flags(flags); - cli(); - if (!(AM53C974_read_8(DMACMD) & DMACMD_DIR)) { - do { - dmastatus = AM53C974_read_8(DMASTATUS); - residual = AM53C974_read_8(CTCLREG) | (AM53C974_read_8(CTCMREG) << 8) | - (AM53C974_read_8(CTCHREG) << 16); - residual += AM53C974_read_8(CFIREG) & CFIREG_CF; - } while (!(dmastatus & DMASTATUS_SCSIINT) && residual); - residual = AM53C974_read_8(CTCLREG) | (AM53C974_read_8(CTCMREG) << 8) | - (AM53C974_read_8(CTCHREG) << 16); - residual += AM53C974_read_8(CFIREG) & CFIREG_CF; - } else - residual = 0; - hostdata->connected->SCp.ptr += hostdata->connected->SCp.this_residual - residual; - hostdata->connected->SCp.this_residual = residual; - - AM53C974_write_8(DMACMD, DMACMD_IDLE); - - /* if service request missed before, process it now (ugly) */ - if (hostdata->dma_busy) { - hostdata->dma_busy = 0; - cmdreg = AM53C974_read_8(CMDREG); - statreg = AM53C974_read_8(STATREG); - isreg = AM53C974_read_8(ISREG); - instreg = AM53C974_read_8(INSTREG); - cfifo = AM53C974_cfifo(); - AM53C974_information_transfer(instance, statreg, isreg, instreg, cfifo, - dmastatus); - } - restore_flags(flags); - } - if (!(dmastatus & DMASTATUS_SCSIINT)) { - return; - } -/*** SCSI related interrupts ***/ - cmdreg = AM53C974_read_8(CMDREG); - statreg = AM53C974_read_8(STATREG); - isreg = AM53C974_read_8(ISREG); - instreg = AM53C974_read_8(INSTREG); - cfifo = AM53C974_cfifo(); - - DEB_INTR(printk("scsi%d: statreg: 0x%02x; isreg: 0x%02x; instreg: 0x%02x; cfifo: 0x%02x\n", - instance->host_no, statreg, isreg, instreg, cfifo)); - - if (statreg & STATREG_PE) { - /* parity error */ -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - printk("scsi%d : PARITY error\n", instance->host_no); - if (hostdata->connected) - hostdata->sync_off[hostdata->connected->device->id] = 0; /* setup asynchronous transfer */ - hostdata->aborted = 1; - } - if (statreg & STATREG_IOE) { - /* illegal operation error */ -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - printk("scsi%d : ILLEGAL OPERATION error\n", instance->host_no); - printk("cmdreg: 0x%02x; dmacmd: 0x%02x; statreg: 0x%02x; \n" - "isreg: 0x%02x; instreg: 0x%02x; cfifo: 0x%02x\n", - cmdreg, AM53C974_read_8(DMACMD), statreg, isreg, instreg, cfifo); - } - if (hostdata->in_reset && (instreg & INSTREG_SRST)) { - unsigned long flags; - /* RESET INTERRUPT */ -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - DEB(printk("Bus reset interrupt received\n")); - AM53C974_intr_bus_reset(instance); - save_flags(flags); - cli(); - if (hostdata->connected) { - hostdata->connected->result = DID_RESET << 16; - hostdata->connected->scsi_done((Scsi_Cmnd *) hostdata->connected); - hostdata->connected = NULL; - } else { - if (hostdata->sel_cmd) { - hostdata->sel_cmd->result = DID_RESET << 16; - hostdata->sel_cmd->scsi_done((Scsi_Cmnd *) hostdata->sel_cmd); - hostdata->sel_cmd = NULL; - } - } - restore_flags(flags); - if (hostdata->in_reset == 1) - goto EXIT; - else - return; - } - if (instreg & INSTREG_ICMD) { - /* INVALID COMMAND INTERRUPT */ -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - printk("scsi%d: Invalid command interrupt\n", instance->host_no); - printk("cmdreg: 0x%02x; dmacmd: 0x%02x; statreg: 0x%02x; dmastatus: 0x%02x; \n" - "isreg: 0x%02x; instreg: 0x%02x; cfifo: 0x%02x\n", - cmdreg, AM53C974_read_8(DMACMD), statreg, dmastatus, isreg, instreg, cfifo); - panic("scsi%d: cannot recover\n", instance->host_no); - } - if (instreg & INSTREG_DIS) { - unsigned long flags; - /* DISCONNECT INTERRUPT */ - DEB_INTR(printk("Disconnect interrupt received; ")); - save_flags(flags); - cli(); - AM53C974_intr_disconnect(instance); - restore_flags(flags); - goto EXIT; - } - if (instreg & INSTREG_RESEL) { - unsigned long flags; - /* RESELECTION INTERRUPT */ - DEB_INTR(printk("Reselection interrupt received\n")); - save_flags(flags); - cli(); - AM53C974_intr_reselect(instance, statreg); - restore_flags(flags); - goto EXIT; - } - if (instreg & INSTREG_SO) { - DEB_INTR(printk("Successful operation interrupt received\n")); - if (hostdata->selecting) { - unsigned long flags; - DEB_INTR(printk("DSR completed, starting select\n")); - save_flags(flags); - cli(); - AM53C974_select(instance, (Scsi_Cmnd *) hostdata->sel_cmd, - (hostdata->sel_cmd->cmnd[0] == REQUEST_SENSE) ? - TAG_NONE : TAG_NEXT); - hostdata->selecting = 0; - AM53C974_set_sync(instance, hostdata->sel_cmd->device->id); - restore_flags(flags); - return; - } - if (hostdata->sel_cmd != NULL) { - if (((isreg & ISREG_IS) != ISREG_OK_NO_STOP) && - ((isreg & ISREG_IS) != ISREG_OK_STOP)) { - unsigned long flags; - /* UNSUCCESSFUL SELECTION */ - DEB_INTR(printk("unsuccessful selection\n")); - save_flags(flags); - cli(); - hostdata->dma_busy = 0; - LIST(hostdata->sel_cmd, hostdata->issue_queue); - hostdata->sel_cmd->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = hostdata->sel_cmd; - hostdata->sel_cmd = NULL; - hostdata->selecting = 0; - restore_flags(flags); - goto EXIT; - } else { - unsigned long flags; - /* SUCCESSFUL SELECTION */ - DEB(printk("successful selection; cmd=0x%02lx\n", (long) hostdata->sel_cmd)); - save_flags(flags); - cli(); - hostdata->dma_busy = 0; - hostdata->disconnecting = 0; - hostdata->connected = hostdata->sel_cmd; - hostdata->sel_cmd = NULL; - hostdata->selecting = 0; -#ifdef SCSI2 - if (!hostdata->conneted->device->simple_tags) -#else - hostdata->busy[hostdata->connected->device->id] |= (1 << hostdata->connected->device->lun); - /* very strange -- use_sg is sometimes nonzero for request sense commands !! */ - if ((hostdata->connected->cmnd[0] == REQUEST_SENSE) && hostdata->connected->use_sg) { - DEB(printk("scsi%d: REQUEST_SENSE command with nonzero use_sg\n", instance->host_no)); - KEYWAIT(); - hostdata->connected->use_sg = 0; - } - initialize_SCp((Scsi_Cmnd *) hostdata->connected); - hostdata->connected->SCp.phase = PHASE_CMDOUT; - AM53C974_information_transfer(instance, statreg, isreg, instreg, cfifo, dmastatus); - restore_flags(flags); - return; - } - } else { - unsigned long flags; - save_flags(flags); - cli(); - AM53C974_information_transfer(instance, statreg, isreg, instreg, cfifo, dmastatus); - restore_flags(flags); - return; - } - } - if (instreg & INSTREG_SR) { - DEB_INTR(printk("Service request interrupt received, ")); - if (hostdata->connected) { - unsigned long flags; - DEB_INTR(printk("calling information_transfer\n")); - save_flags(flags); - cli(); - AM53C974_information_transfer(instance, statreg, isreg, instreg, cfifo, dmastatus); - restore_flags(flags); - } else { - printk("scsi%d: weird: service request when no command connected\n", instance->host_no); - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - } /* clear FIFO */ - return; - } - EXIT: - DEB_INTR(printk("intr: starting main\n")); - run_main(); - DEB_INTR(printk("end of intr\n")); -} - -/************************************************************************** -* Function : AM53C974_intr_disconnect(struct Scsi_Host *instance) -* -* Purpose : manage target disconnection -* -* Inputs : instance -- which AM53C974 -* -* Returns : nothing -**************************************************************************/ -static void AM53C974_intr_disconnect(struct Scsi_Host *instance) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - Scsi_Cmnd *cmd; - AM53C974_setio(instance); - - if (hostdata->sel_cmd != NULL) { - /* normal selection timeout, typical for nonexisting targets */ - cmd = (Scsi_Cmnd *) hostdata->sel_cmd; - DEB_INTR(printk("bad target\n")); - cmd->result = DID_BAD_TARGET << 16; - goto EXIT_FINISHED; - } - if (!hostdata->connected) { - /* can happen if controller was reset, a device tried to reconnect, - failed and disconnects now */ - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - return; - } - if (hostdata->disconnecting) { - /* target sent disconnect message, so we are prepared */ - cmd = (Scsi_Cmnd *) hostdata->connected; - AM53C974_set_async(instance, cmd->device->id); - DEB_INTR(printk("scsi%d : disc. from cmnd %d for ta %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->target, cmd->device->lun)); - if (cmd->device->disconnect) { - /* target wants to reselect later */ - DEB_INTR(printk("ok, re-enabling selection\n")); - LIST(cmd, hostdata->disconnected_queue); - cmd->host_scribble = (unsigned char *) hostdata->disconnected_queue; - hostdata->disconnected_queue = cmd; - DEB_QUEUE(printk("scsi%d : command for target %d lun %d this %d was moved from connected to" - " the disconnected_queue\n", instance->host_no, cmd->target, - cmd->device->lun, hostdata->disconnected_queue->SCp.this_residual)); - DEB_QUEUE(AM53C974_print_queues(instance)); - goto EXIT_UNFINISHED; - } else { - /* target does not want to reselect later, we are really finished */ -#ifdef AM53C974_DEBUG - if (cmd->cmnd[0] == REQUEST_SENSE) { - int i; - printk("Request sense data dump:\n"); - for (i = 0; i < cmd->request_bufflen; i++) { - printk("%02x ", *((char *) (cmd->request_buffer) + i)); - if (i && !(i % 16)) - printk("\n"); - } - printk("\n"); - } -#endif - goto EXIT_FINISHED; - } /* !cmd->device->disconnect */ - } /* if (hostdata->disconnecting) */ - /* no disconnect message received; unexpected disconnection */ - cmd = (Scsi_Cmnd *) hostdata->connected; - if (cmd) { -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - AM53C974_set_async(instance, cmd->device->id); - printk("scsi%d: Unexpected disconnect; phase: %d; target: %d; this_residual: %d; buffers_residual: %d; message: %d\n", - instance->host_no, cmd->SCp.phase, cmd->device->id, cmd->SCp.this_residual, cmd->SCp.buffers_residual, - cmd->SCp.Message); - printk("cmdreg: 0x%02x; statreg: 0x%02x; isreg: 0x%02x; cfifo: 0x%02x\n", - AM53C974_read_8(CMDREG), AM53C974_read_8(STATREG), AM53C974_read_8(ISREG), - AM53C974_read_8(CFIREG) & CFIREG_CF); - - if ((hostdata->last_message[0] == EXTENDED_MESSAGE) && - (hostdata->last_message[2] == EXTENDED_SDTR)) { - /* sync. negotiation was aborted, setup asynchronous transfer with target */ - hostdata->sync_off[cmd->device->id] = 0; - } - if (hostdata->aborted || hostdata->msgout[0] == ABORT) - cmd->result = DID_ABORT << 16; - else - cmd->result = DID_ERROR << 16; - goto EXIT_FINISHED; - } - EXIT_FINISHED: - hostdata->aborted = 0; - hostdata->msgout[0] = NOP; - hostdata->sel_cmd = NULL; - hostdata->connected = NULL; - hostdata->selecting = 0; - hostdata->disconnecting = 0; - hostdata->dma_busy = 0; - hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun); - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - DEB(printk("disconnect; issue_queue: 0x%lx, disconnected_queue: 0x%lx\n", - (long) hostdata->issue_queue, (long) hostdata->disconnected_queue)); - cmd->scsi_done(cmd); - - if (!hostdata->selecting) { - AM53C974_set_async(instance, cmd->device->id); - AM53C974_write_8(CMDREG, CMDREG_ESR); - } /* allow reselect */ - return; - - EXIT_UNFINISHED: - hostdata->msgout[0] = NOP; - hostdata->sel_cmd = NULL; - hostdata->connected = NULL; - hostdata->aborted = 0; - hostdata->selecting = 0; - hostdata->disconnecting = 0; - hostdata->dma_busy = 0; - DEB(printk("disconnect; issue_queue: 0x%lx, disconnected_queue: 0x%lx\n", - (long) hostdata->issue_queue, (long) hostdata->disconnected_queue)); - if (!hostdata->selecting) { - AM53C974_set_async(instance, cmd->device->id); - AM53C974_write_8(CMDREG, CMDREG_ESR); - } /* allow reselect */ - return; -} - -/************************************************************************** -* Function : int AM53C974_sync_neg(struct Scsi_Host *instance, int target, unsigned char *msg) -* -* Purpose : setup message string for sync. negotiation -* -* Inputs : instance -- which AM53C974 -* target -- which SCSI target to deal with -* msg -- input message string -* -* Returns : 0 if parameters accepted or 1 if not accepted -* -* Side effects: hostdata is changed -* -* Note: we assume here that fastclk is enabled -**************************************************************************/ -static int AM53C974_sync_neg(struct Scsi_Host *instance, int target, unsigned char *msg) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - int period, offset, i, rate, rate_rem; - AM53C974_setio(instance); - - period = (DEF_CLK * msg[3] * 8 + 1000) / 2000; - if (period < MIN_PERIOD) { - period = MIN_PERIOD; - hostdata->msgout[3] = period / 4; - } else if (period > MAX_PERIOD) { - period = MAX_PERIOD; - hostdata->msgout[3] = period / 4; - } else - hostdata->msgout[3] = msg[3]; - offset = msg[4]; - if (offset > MAX_OFFSET) - offset = MAX_OFFSET; - hostdata->msgout[4] = offset; - hostdata->sync_per[target] = period; - hostdata->sync_off[target] = offset; - for (i = 0; i < 3; i++) - hostdata->msgout[i] = msg[i]; - if ((hostdata->msgout[3] != msg[3]) || (msg[4] != offset)) - return (1); - - rate = DEF_CLK / period; - rate_rem = 10 * (DEF_CLK - period * rate) / period; - - if (offset) - printk("\ntarget %d: rate=%d.%d Mhz, synchronous, sync offset=%d bytes\n", - target, rate, rate_rem, offset); - else - printk("\ntarget %d: rate=%d.%d Mhz, asynchronous\n", target, rate, rate_rem); - - return (0); -} - -/************************************************************************** -* Function : AM53C974_set_async(struct Scsi_Host *instance, int target) -* -* Purpose : put controller into async. mode -* -* Inputs : instance -- which AM53C974 -* target -- which SCSI target to deal with -* -* Returns : nothing -**************************************************************************/ -static __inline__ void AM53C974_set_async(struct Scsi_Host *instance, int target) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - - AM53C974_write_8(STPREG, hostdata->sync_per[target]); - AM53C974_write_8(SOFREG, (DEF_SOF_RAD << 6) | (DEF_SOF_RAA << 4)); -} - -/************************************************************************** -* Function : AM53C974_set_sync(struct Scsi_Host *instance, int target) -* -* Purpose : put controller into sync. mode -* -* Inputs : instance -- which AM53C974 -* target -- which SCSI target to deal with -* -* Returns : nothing -**************************************************************************/ -static __inline__ void AM53C974_set_sync(struct Scsi_Host *instance, int target) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - - AM53C974_write_8(STPREG, hostdata->sync_per[target]); - AM53C974_write_8(SOFREG, (SOFREG_SO & hostdata->sync_off[target]) | - (DEF_SOF_RAD << 6) | (DEF_SOF_RAA << 4)); -} - -/*********************************************************************** -* Function : AM53C974_information_transfer(struct Scsi_Host *instance, * -* unsigned char statreg, unsigned char isreg, * -* unsigned char instreg, unsigned char cfifo, * -* unsigned char dmastatus) * -* * -* Purpose : handle phase changes * -* * -* Inputs : instance - which AM53C974 * -* statreg - status register * -* isreg - internal state register * -* instreg - interrupt status register * -* cfifo - number of bytes in FIFO * -* dmastatus - dma status register * -* * -* Returns : nothing * -************************************************************************/ -static void AM53C974_information_transfer(struct Scsi_Host *instance, - unsigned char statreg, unsigned char isreg, - unsigned char instreg, unsigned char cfifo, - unsigned char dmastatus) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected; - int ret, i, len, residual = -1; - AM53C974_setio(instance); - - DEB_INFO(printk(SEPARATOR_LINE)); - switch (statreg & STATREG_PHASE) { /* scsi phase */ - case PHASE_DATAOUT: - DEB_INFO(printk("Dataout phase; cmd=0x%lx, sel_cmd=0x%lx, this_residual=%d, buffers_residual=%d\n", - (long) hostdata->connected, (long) hostdata->sel_cmd, cmd->SCp.this_residual, cmd->SCp.buffers_residual)); - cmd->SCp.phase = PHASE_DATAOUT; - goto PHASE_DATA_IO; - - case PHASE_DATAIN: - DEB_INFO(printk("Datain phase; cmd=0x%lx, sel_cmd=0x%lx, this_residual=%d, buffers_residual=%d\n", - (long) hostdata->connected, (long) hostdata->sel_cmd, cmd->SCp.this_residual, cmd->SCp.buffers_residual)); - cmd->SCp.phase = PHASE_DATAIN; - PHASE_DATA_IO: - if (hostdata->aborted) { - AM53C974_write_8(DMACMD, DMACMD_IDLE); - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - AM53C974_write_8(CMDREG, CMDREG_SATN); - return; - } - if ((!cmd->SCp.this_residual) && cmd->SCp.buffers_residual) { - cmd->SCp.buffer++; - cmd->SCp.buffers_residual--; - cmd->SCp.ptr = (unsigned char *) cmd->SCp.buffer->address; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - } - if (cmd->SCp.this_residual) { - if (!(AM53C974_read_8(DMACMD) & DMACMD_START)) { - hostdata->dma_busy = 0; - AM53C974_transfer_dma(instance, statreg & STATREG_IO, - (unsigned long) cmd->SCp.this_residual, - cmd->SCp.ptr); - } else - hostdata->dma_busy = 1; - } - return; - - case PHASE_MSGIN: - DEB_INFO(printk("Message-In phase; cmd=0x%lx, sel_cmd=0x%lx\n", - (long) hostdata->connected, (long) hostdata->sel_cmd)); - AM53C974_set_async(instance, cmd->device->id); - if (cmd->SCp.phase == PHASE_DATAIN) - AM53C974_dma_blast(instance, dmastatus, statreg); - if ((cmd->SCp.phase == PHASE_DATAOUT) && (AM53C974_read_8(DMACMD) & DMACMD_START)) { - AM53C974_write_8(DMACMD, DMACMD_IDLE); - residual = cfifo + (AM53C974_read_8(CTCLREG) | (AM53C974_read_8(CTCMREG) << 8) | - (AM53C974_read_8(CTCHREG) << 16)); - cmd->SCp.ptr += cmd->SCp.this_residual - residual; - cmd->SCp.this_residual = residual; - if (cfifo) { - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - cfifo = 0; - } - } - if (cmd->SCp.phase == PHASE_STATIN) { - while ((AM53C974_read_8(CFIREG) & CFIREG_CF) < 2); - cmd->SCp.Status = AM53C974_read_8(FFREG); - cmd->SCp.Message = AM53C974_read_8(FFREG); - DEB_INFO(printk("Message-In phase; status=0x%02x, message=0x%02x\n", - cmd->SCp.Status, cmd->SCp.Message)); - ret = AM53C974_message(instance, cmd, cmd->SCp.Message); - } else { - if (!cfifo) { - AM53C974_write_8(CMDREG, CMDREG_IT); - AM53C974_poll_int(); - cmd->SCp.Message = AM53C974_read_8(FFREG); - } - ret = AM53C974_message(instance, cmd, cmd->SCp.Message); - } - cmd->SCp.phase = PHASE_MSGIN; - AM53C974_set_sync(instance, cmd->device->id); - break; - case PHASE_MSGOUT: - DEB_INFO(printk("Message-Out phase; cfifo=%d; msgout[0]=0x%02x\n", - AM53C974_read_8(CFIREG) & CFIREG_CF, hostdata->msgout[0])); - AM53C974_write_8(DMACMD, DMACMD_IDLE); - AM53C974_set_async(instance, cmd->device->id); - for (i = 0; i < sizeof(hostdata->last_message); i++) - hostdata->last_message[i] = hostdata->msgout[i]; - if ((hostdata->msgout[0] == 0) || INSIDE(hostdata->msgout[0], 0x02, 0x1F) || - INSIDE(hostdata->msgout[0], 0x80, 0xFF)) - len = 1; - else { - if (hostdata->msgout[0] == EXTENDED_MESSAGE) { -#ifdef AM53C974_DEBUG_INFO - printk("Extended message dump:\n"); - for (i = 0; i < hostdata->msgout[1] + 2; i++) { - printk("%02x ", hostdata->msgout[i]); - if (i && !(i % 16)) - printk("\n"); - } - printk("\n"); -#endif - len = hostdata->msgout[1] + 2; - } else - len = 2; - } - for (i = 0; i < len; i++) - AM53C974_write_8(FFREG, hostdata->msgout[i]); - AM53C974_write_8(CMDREG, CMDREG_IT); - cmd->SCp.phase = PHASE_MSGOUT; - hostdata->msgout[0] = NOP; - AM53C974_set_sync(instance, cmd->device->id); - break; - - case PHASE_CMDOUT: - DEB_INFO(printk("Command-Out phase\n")); - AM53C974_set_async(instance, cmd->device->id); - for (i = 0; i < cmd->cmd_len; i++) - AM53C974_write_8(FFREG, cmd->cmnd[i]); - AM53C974_write_8(CMDREG, CMDREG_IT); - cmd->SCp.phase = PHASE_CMDOUT; - AM53C974_set_sync(instance, cmd->device->id); - break; - - case PHASE_STATIN: - DEB_INFO(printk("Status phase\n")); - if (cmd->SCp.phase == PHASE_DATAIN) - AM53C974_dma_blast(instance, dmastatus, statreg); - AM53C974_set_async(instance, cmd->device->id); - if (cmd->SCp.phase == PHASE_DATAOUT) { - unsigned long residual; - - if (AM53C974_read_8(DMACMD) & DMACMD_START) { - AM53C974_write_8(DMACMD, DMACMD_IDLE); - residual = cfifo + (AM53C974_read_8(CTCLREG) | (AM53C974_read_8(CTCMREG) << 8) | - (AM53C974_read_8(CTCHREG) << 16)); - cmd->SCp.ptr += cmd->SCp.this_residual - residual; - cmd->SCp.this_residual = residual; - } - if (cfifo) { - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - cfifo = 0; - } - } - cmd->SCp.phase = PHASE_STATIN; - AM53C974_write_8(CMDREG, CMDREG_ICCS); /* command complete */ - break; - - case PHASE_RES_0: - case PHASE_RES_1: -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - DEB_INFO(printk("Reserved phase\n")); - break; - } - KEYWAIT(); -} - -/****************************************************************************** -* Function : int AM53C974_message(struct Scsi_Host *instance, Scsi_Cmnd *cmd, -* unsigned char msg) -* -* Purpose : handle SCSI messages -* -* Inputs : instance -- which AM53C974 -* cmd -- SCSI command the message belongs to -* msg -- message id byte -* -* Returns : 1 on success, 0 on failure. -**************************************************************************/ -static int AM53C974_message(struct Scsi_Host *instance, Scsi_Cmnd * cmd, - unsigned char msg) -{ - AM53C974_local_declare(); - static unsigned char extended_msg[10]; - unsigned char statreg; - int len, ret = 0; - unsigned char *p; -#ifdef AM53C974_DEBUG_MSG - int j; -#endif - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - - DEB_MSG(printk(SEPARATOR_LINE)); - -/* Linking lets us reduce the time required to get the - * next command out to the device, hopefully this will - * mean we don't waste another revolution due to the delays - * required by ARBITRATION and another SELECTION. - * In the current implementation proposal, low level drivers - * merely have to start the next command, pointed to by - * next_link, done() is called as with unlinked commands. */ - switch (msg) { -#ifdef LINKED - case LINKED_CMD_COMPLETE: - case LINKED_FLG_CMD_COMPLETE: - /* Accept message by releasing ACK */ - DEB_LINKED(printk("scsi%d : target %d lun %d linked command complete.\n", - instance->host_no, cmd->device->id, cmd->device->lun)); - /* Sanity check : A linked command should only terminate with - * one of these messages if there are more linked commands available. */ - if (!cmd->next_link) { - printk("scsi%d : target %d lun %d linked command complete, no next_link\n" - instance->host_no, cmd->device->id, cmd->device->lun); - hostdata->aborted = 1; - AM53C974_write_8(CMDREG, CMDREG_SATN); - AM53C974_write_8(CMDREG, CMDREG_MA); - break; - } - if (hostdata->aborted) { - DEB_ABORT(printk("ATN set for cmnd %d upon reception of LINKED_CMD_COMPLETE or" - "LINKED_FLG_CMD_COMPLETE message\n", cmd->cmnd[0])); - AM53C974_write_8(CMDREG, CMDREG_SATN); - } - AM53C974_write_8(CMDREG, CMDREG_MA); - - initialize_SCp(cmd->next_link); - /* The next command is still part of this process */ - cmd->next_link->tag = cmd->tag; - cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8); - DEB_LINKED(printk("scsi%d : target %d lun %d linked request done, calling scsi_done().\n", - instance->host_no, cmd->device->id, cmd->device->lun)); - cmd->scsi_done(cmd); - cmd = hostdata->connected; - break; - -#endif /* def LINKED */ - - case ABORT: - case COMMAND_COMPLETE: - DEB_MSG(printk("scsi%d: command complete message received; cmd %d for target %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->device->id, cmd->device->lun)); - hostdata->disconnecting = 1; - cmd->device->disconnect = 0; - - /* I'm not sure what the correct thing to do here is : - - * If the command that just executed is NOT a request - * sense, the obvious thing to do is to set the result - * code to the values of the stored parameters. - * If it was a REQUEST SENSE command, we need some way - * to differentiate between the failure code of the original - * and the failure code of the REQUEST sense - the obvious - * case is success, where we fall through and leave the result - * code unchanged. - * - * The non-obvious place is where the REQUEST SENSE failed */ - if (cmd->cmnd[0] != REQUEST_SENSE) - cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8); - else if (cmd->SCp.Status != GOOD) - cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16); - if (hostdata->aborted) { - AM53C974_write_8(CMDREG, CMDREG_SATN); - AM53C974_write_8(CMDREG, CMDREG_MA); - DEB_ABORT(printk("ATN set for cmnd %d upon reception of ABORT or" - "COMMAND_COMPLETE message\n", cmd->cmnd[0])); - break; - } - if ((cmd->cmnd[0] != REQUEST_SENSE) && (cmd->SCp.Status == CHECK_CONDITION)) { - DEB_MSG(printk("scsi%d : performing request sense\n", instance->host_no)); - cmd->cmnd[0] = REQUEST_SENSE; - cmd->cmnd[1] &= 0xe0; - cmd->cmnd[2] = 0; - cmd->cmnd[3] = 0; - cmd->cmnd[4] = sizeof(cmd->sense_buffer); - cmd->cmnd[5] = 0; - cmd->SCp.buffer = NULL; - cmd->SCp.buffers_residual = 0; - cmd->SCp.ptr = (char *) cmd->sense_buffer; - cmd->SCp.this_residual = sizeof(cmd->sense_buffer); - LIST(cmd, hostdata->issue_queue); - cmd->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = (Scsi_Cmnd *) cmd; - DEB_MSG(printk("scsi%d : REQUEST SENSE added to head of issue queue\n", instance->host_no)); - } - /* Accept message by clearing ACK */ - AM53C974_write_8(CMDREG, CMDREG_MA); - break; - - case MESSAGE_REJECT: - DEB_MSG(printk("scsi%d: reject message received; cmd %d for target %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->device->id, cmd->device->lun)); - switch (hostdata->last_message[0]) { - case EXTENDED_MESSAGE: - if (hostdata->last_message[2] == EXTENDED_SDTR) { - /* sync. negotiation was rejected, setup asynchronous transfer with target */ - printk("\ntarget %d: rate=%d Mhz, asynchronous (sync. negotiation rejected)\n", - cmd->device->id, DEF_CLK / DEF_STP); - hostdata->sync_off[cmd->device->id] = 0; - hostdata->sync_per[cmd->device->id] = DEF_STP; - } - break; - case HEAD_OF_QUEUE_TAG: - case ORDERED_QUEUE_TAG: - case SIMPLE_QUEUE_TAG: - cmd->device->simple_tags = 0; - hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun); - break; - default: - break; - } - if (hostdata->aborted) - AM53C974_write_8(CMDREG, CMDREG_SATN); - AM53C974_write_8(CMDREG, CMDREG_MA); - break; - - case DISCONNECT: - DEB_MSG(printk("scsi%d: disconnect message received; cmd %d for target %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->device->id, cmd->device->lun)); - cmd->device->disconnect = 1; - hostdata->disconnecting = 1; - AM53C974_write_8(CMDREG, CMDREG_MA); /* Accept message by clearing ACK */ - break; - - case SAVE_POINTERS: - case RESTORE_POINTERS: - DEB_MSG(printk("scsi%d: save/restore pointers message received; cmd %d for target %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->device->id, cmd->device->lun)); - /* The SCSI data pointer is *IMPLICITLY* saved on a disconnect - * operation, in violation of the SCSI spec so we can safely - * ignore SAVE/RESTORE pointers calls. - * - * Unfortunately, some disks violate the SCSI spec and - * don't issue the required SAVE_POINTERS message before - * disconnecting, and we have to break spec to remain - * compatible. */ - if (hostdata->aborted) { - DEB_ABORT(printk("ATN set for cmnd %d upon reception of SAVE/REST. POINTERS message\n", - cmd->cmnd[0])); - AM53C974_write_8(CMDREG, CMDREG_SATN); - } - AM53C974_write_8(CMDREG, CMDREG_MA); - break; - - case EXTENDED_MESSAGE: - DEB_MSG(printk("scsi%d: extended message received; cmd %d for target %d, lun %d\n", - instance->host_no, cmd->cmnd[0], cmd->device->id, cmd->device->lun)); - /* Extended messages are sent in the following format : - * Byte - * 0 EXTENDED_MESSAGE == 1 - * 1 length (includes one byte for code, doesn't include first two bytes) - * 2 code - * 3..length+1 arguments - */ - /* BEWARE!! THIS CODE IS EXTREMELY UGLY */ - extended_msg[0] = EXTENDED_MESSAGE; - AM53C974_read_8(INSTREG); /* clear int */ - AM53C974_write_8(CMDREG, CMDREG_MA); /* ack. msg byte, then wait for SO */ - AM53C974_poll_int(); - /* get length */ - AM53C974_write_8(CMDREG, CMDREG_IT); - AM53C974_poll_int(); - AM53C974_write_8(CMDREG, CMDREG_MA); /* ack. msg byte, then wait for SO */ - AM53C974_poll_int(); - extended_msg[1] = len = AM53C974_read_8(FFREG); /* get length */ - p = extended_msg + 2; - /* read the remaining (len) bytes */ - while (len) { - AM53C974_write_8(CMDREG, CMDREG_IT); - AM53C974_poll_int(); - if (len > 1) { - AM53C974_write_8(CMDREG, CMDREG_MA); /* ack. msg byte, then wait for SO */ - AM53C974_poll_int(); - } - *p = AM53C974_read_8(FFREG); - p++; - len--; - } - -#ifdef AM53C974_DEBUG_MSG - printk("scsi%d: received extended message: ", instance->host_no); - for (j = 0; j < extended_msg[1] + 2; j++) { - printk("0x%02x ", extended_msg[j]); - if (j && !(j % 16)) - printk("\n"); - } - printk("\n"); -#endif - - /* check message */ - if (extended_msg[2] == EXTENDED_SDTR) - ret = AM53C974_sync_neg(instance, cmd->device->id, extended_msg); - if (ret || hostdata->aborted) - AM53C974_write_8(CMDREG, CMDREG_SATN); - - AM53C974_write_8(CMDREG, CMDREG_MA); - break; - - default: - printk("scsi%d: unknown message 0x%02x received\n", instance->host_no, msg); -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - /* reject message */ - hostdata->msgout[0] = MESSAGE_REJECT; - AM53C974_write_8(CMDREG, CMDREG_SATN); - AM53C974_write_8(CMDREG, CMDREG_MA); - return (0); - break; - - } /* switch (msg) */ - KEYWAIT(); - return (1); -} - -/************************************************************************** -* Function : AM53C974_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag) -* -* Purpose : try to establish nexus for the command; -* start sync negotiation via start stop and transfer the command in -* cmdout phase in case of an inquiry or req. sense command with no -* sync. neg. performed yet -* -* Inputs : instance -- which AM53C974 -* cmd -- command which requires the selection -* tag -- tagged queueing -* -* Returns : nothing -* -* Note: this function initializes the selection process, which is continued -* in the interrupt handler -**************************************************************************/ -static void AM53C974_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - unsigned char cfifo, tmp[3]; - unsigned int i, len, cmd_size = COMMAND_SIZE(cmd->cmnd[0]); - AM53C974_setio(instance); - - cfifo = AM53C974_cfifo(); - if (cfifo) { - printk("scsi%d: select error; %d residual bytes in FIFO\n", instance->host_no, cfifo); - AM53C974_write_8(CMDREG, CMDREG_CFIFO); /* clear FIFO */ - } -#ifdef AM53C974_PROHIBIT_DISCONNECT - tmp[0] = IDENTIFY(0, cmd->device->lun); -#else - tmp[0] = IDENTIFY(1, cmd->device->lun); -#endif - -#ifdef SCSI2 - if (cmd->device->simple_tags && (tag != TAG_NONE)) { - tmp[1] = SIMPLE_QUEUE_TAG; - if (tag == TAG_NEXT) { - /* 0 is TAG_NONE, used to imply no tag for this command */ - if (cmd->device->current_tag == 0) - cmd->device->current_tag = 1; - cmd->tag = cmd->device->current_tag; - cmd->device->current_tag++; - } else - cmd->tag = (unsigned char) tag; - tmp[2] = cmd->tag; - hostdata->last_message[0] = SIMPLE_QUEUE_TAG; - len = 3; - AM53C974_write_8(FFREG, tmp[0]); - AM53C974_write_8(FFREG, tmp[1]); - AM53C974_write_8(FFREG, tmp[2]); - } else -#endif /* def SCSI2 */ - { - len = 1; - AM53C974_write_8(FFREG, tmp[0]); - cmd->tag = 0; - } - -/* in case of an inquiry or req. sense command with no sync. neg performed yet, we start - sync negotiation via start stops and transfer the command in cmdout phase */ - if (((cmd->cmnd[0] == INQUIRY) || (cmd->cmnd[0] == REQUEST_SENSE)) && - !(hostdata->sync_neg[cmd->device->id]) && hostdata->sync_en[cmd->device->id]) { - hostdata->sync_neg[cmd->device->id] = 1; - hostdata->msgout[0] = EXTENDED_MESSAGE; - hostdata->msgout[1] = 3; - hostdata->msgout[2] = EXTENDED_SDTR; - hostdata->msgout[3] = 250 / (int) hostdata->max_rate[cmd->device->id]; - hostdata->msgout[4] = hostdata->max_offset[cmd->device->id]; - len += 5; - } - AM53C974_write_8(SDIDREG, SDIREG_MASK & cmd->device->id); /* setup dest. id */ - AM53C974_write_8(STIMREG, DEF_SCSI_TIMEOUT); /* setup timeout reg */ - switch (len) { - case 1: - for (i = 0; i < cmd_size; i++) - AM53C974_write_8(FFREG, cmd->cmnd[i]); - AM53C974_write_8(CMDREG, CMDREG_SAS); /* select with ATN, 1 msg byte */ - hostdata->msgout[0] = NOP; - break; - case 3: - for (i = 0; i < cmd_size; i++) - AM53C974_write_8(FFREG, cmd->cmnd[i]); - AM53C974_write_8(CMDREG, CMDREG_SA3S); /* select with ATN, 3 msg bytes */ - hostdata->msgout[0] = NOP; - break; - default: - AM53C974_write_8(CMDREG, CMDREG_SASS); /* select with ATN, stop steps; continue in message out phase */ - break; - } -} - -/************************************************************************** -* Function : AM53C974_intr_select(struct Scsi_Host *instance, unsigned char statreg) -* -* Purpose : handle reselection -* -* Inputs : instance -- which AM53C974 -* statreg -- status register -* -* Returns : nothing -* -* side effects: manipulates hostdata -**************************************************************************/ -static void AM53C974_intr_reselect(struct Scsi_Host *instance, unsigned char statreg) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - unsigned char cfifo, msg[3], lun, t, target = 0; -#ifdef SCSI2 - unsigned char tag; -#endif - Scsi_Cmnd *tmp = NULL, *prev; - AM53C974_setio(instance); - - cfifo = AM53C974_cfifo(); - - if (hostdata->selecting) { - /* caught reselect interrupt in selection process; - put selecting command back into the issue queue and continue with the - reselecting command */ - DEB_RESEL(printk("AM53C974_intr_reselect: in selection process\n")); - LIST(hostdata->sel_cmd, hostdata->issue_queue); - hostdata->sel_cmd->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = hostdata->sel_cmd; - hostdata->sel_cmd = NULL; - hostdata->selecting = 0; - } -/* 2 bytes must be in the FIFO now */ - if (cfifo != 2) { - printk("scsi %d: error: %d bytes in fifo, 2 expected\n", instance->host_no, cfifo); - hostdata->aborted = 1; - goto EXIT_ABORT; - } -/* determine target which reselected */ - t = AM53C974_read_8(FFREG); - if (!(t & (1 << instance->this_id))) { - printk("scsi %d: error: invalid host id\n", instance->host_no); - hostdata->aborted = 1; - goto EXIT_ABORT; - } - t ^= (1 << instance->this_id); - target = 0; - while (t != 1) { - t >>= 1; - target++; - } - DEB_RESEL(printk("scsi %d: reselect; target: %d\n", instance->host_no, target)); - - if (hostdata->aborted) - goto EXIT_ABORT; - - if ((statreg & STATREG_PHASE) != PHASE_MSGIN) { - printk("scsi %d: error: upon reselection interrupt not in MSGIN\n", instance->host_no); - hostdata->aborted = 1; - goto EXIT_ABORT; - } - msg[0] = AM53C974_read_8(FFREG); - if (!(msg[0] & 0x80)) { - printk("scsi%d: error: expecting IDENTIFY message, got ", instance->host_no); - print_msg(msg); - hostdata->aborted = 1; - goto EXIT_ABORT; - } - lun = (msg[0] & 0x07); - -/* We need to add code for SCSI-II to track which devices have - * I_T_L_Q nexuses established, and which have simple I_T_L - * nexuses so we can chose to do additional data transfer. */ -#ifdef SCSI2 -#error "SCSI-II tagged queueing is not supported yet" -#endif - -/* Find the command corresponding to the I_T_L or I_T_L_Q nexus we - * just reestablished, and remove it from the disconnected queue. */ - for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; - tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) - if ((target == tmp->device->id) && (lun == tmp->device->lun) -#ifdef SCSI2 - && (tag == tmp->tag) -#endif - ) { - if (prev) { - REMOVE(prev, (Scsi_Cmnd *) (prev->host_scribble), tmp, - (Scsi_Cmnd *) (tmp->host_scribble)); - prev->host_scribble = tmp->host_scribble; - } else { - REMOVE(-1, hostdata->disconnected_queue, tmp, tmp->host_scribble); - hostdata->disconnected_queue = (Scsi_Cmnd *) tmp->host_scribble; - } - tmp->host_scribble = NULL; - hostdata->connected = tmp; - break; - } - if (!tmp) { -#ifdef SCSI2 - printk("scsi%d: warning : target %d lun %d tag %d not in disconnect_queue.\n", - instance->host_no, target, lun, tag); -#else - printk("scsi%d: warning : target %d lun %d not in disconnect_queue.\n", - instance->host_no, target, lun); -#endif - /* Since we have an established nexus that we can't do anything with, we must abort it. */ - hostdata->aborted = 1; - DEB(AM53C974_keywait()); - goto EXIT_ABORT; - } else - goto EXIT_OK; - - EXIT_ABORT: - AM53C974_write_8(CMDREG, CMDREG_SATN); - AM53C974_write_8(CMDREG, CMDREG_MA); - return; - - EXIT_OK: - DEB_RESEL(printk("scsi%d: nexus established, target = %d, lun = %d, tag = %d\n", - instance->host_no, target, tmp->lun, tmp->tag)); - AM53C974_set_sync(instance, target); - AM53C974_write_8(SDIDREG, SDIREG_MASK & target); /* setup dest. id */ - AM53C974_write_8(CMDREG, CMDREG_MA); - hostdata->dma_busy = 0; - hostdata->connected->SCp.phase = PHASE_CMDOUT; -} - -/************************************************************************** -* Function : AM53C974_transfer_dma(struct Scsi_Host *instance, short dir, -* unsigned long length, char *data) -* -* Purpose : setup DMA transfer -* -* Inputs : instance -- which AM53C974 -* dir -- direction flag, 0: write to device, read from memory; -* 1: read from device, write to memory -* length -- number of bytes to transfer to from buffer -* data -- pointer to data buffer -* -* Returns : nothing -**************************************************************************/ -static __inline__ void AM53C974_transfer_dma(struct Scsi_Host *instance, short dir, - unsigned long length, char *data) -{ - AM53C974_local_declare(); - AM53C974_setio(instance); - - AM53C974_write_8(CMDREG, CMDREG_NOP); - AM53C974_write_8(DMACMD, (dir << 7) | DMACMD_INTE_D); /* idle command */ - AM53C974_write_8(STCLREG, (unsigned char) (length & 0xff)); - AM53C974_write_8(STCMREG, (unsigned char) ((length & 0xff00) >> 8)); - AM53C974_write_8(STCHREG, (unsigned char) ((length & 0xff0000) >> 16)); - AM53C974_write_32(DMASTC, length & 0xffffff); - AM53C974_write_32(DMASPA, virt_to_bus(data)); - AM53C974_write_8(CMDREG, CMDREG_IT | CMDREG_DMA); - AM53C974_write_8(DMACMD, (dir << 7) | DMACMD_INTE_D | DMACMD_START); -} - -/************************************************************************** -* Function : AM53C974_dma_blast(struct Scsi_Host *instance, unsigned char dmastatus, -* unsigned char statreg) -* -* Purpose : cleanup DMA transfer -* -* Inputs : instance -- which AM53C974 -* dmastatus -- dma status register -* statreg -- status register -* -* Returns : nothing -**************************************************************************/ -static void AM53C974_dma_blast(struct Scsi_Host *instance, unsigned char dmastatus, - unsigned char statreg) -{ - AM53C974_local_declare(); - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - unsigned long ctcreg; - int dir = statreg & STATREG_IO; - int cfifo, pio, i = 0; - AM53C974_setio(instance); - - do { - cfifo = AM53C974_cfifo(); - i++; - } while (cfifo && (i < 50000)); - pio = (i == 50000) ? 1 : 0; - - if (statreg & STATREG_CTZ) { - AM53C974_write_8(DMACMD, DMACMD_IDLE); - return; - } - if (dmastatus & DMASTATUS_DONE) { - AM53C974_write_8(DMACMD, DMACMD_IDLE); - return; - } - AM53C974_write_8(DMACMD, ((dir << 7) & DMACMD_DIR) | DMACMD_BLAST); - while (!(AM53C974_read_8(DMASTATUS) & DMASTATUS_BCMPLT)); - AM53C974_write_8(DMACMD, DMACMD_IDLE); - - if (pio) { - /* transfer residual bytes via PIO */ - unsigned char *wac = (unsigned char *) AM53C974_read_32(DMAWAC); - printk("pio mode, residual=%d\n", AM53C974_read_8(CFIREG) & CFIREG_CF); - while (AM53C974_read_8(CFIREG) & CFIREG_CF) - *(wac++) = AM53C974_read_8(FFREG); - } - ctcreg = AM53C974_read_8(CTCLREG) | (AM53C974_read_8(CTCMREG) << 8) | - (AM53C974_read_8(CTCHREG) << 16); - - hostdata->connected->SCp.ptr += hostdata->connected->SCp.this_residual - ctcreg; - hostdata->connected->SCp.this_residual = ctcreg; -} - -/************************************************************************** -* Function : AM53C974_intr_bus_reset(struct Scsi_Host *instance) -* -* Purpose : handle bus reset interrupt -* -* Inputs : instance -- which AM53C974 -* -* Returns : nothing -**************************************************************************/ -static void AM53C974_intr_bus_reset(struct Scsi_Host *instance) -{ - AM53C974_local_declare(); - unsigned char cntlreg1; - AM53C974_setio(instance); - - AM53C974_write_8(CMDREG, CMDREG_CFIFO); - AM53C974_write_8(CMDREG, CMDREG_NOP); - - cntlreg1 = AM53C974_read_8(CNTLREG1); - AM53C974_write_8(CNTLREG1, cntlreg1 | CNTLREG1_DISR); -} - -/************************************************************************** -* Function : int AM53C974_abort(Scsi_Cmnd *cmd) -* -* Purpose : abort a command -* -* Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the -* host byte of the result field to, if zero DID_ABORTED is -* used. -* -* Returns : 0 - success, -1 on failure. - **************************************************************************/ -static int AM53C974_abort(Scsi_Cmnd * cmd) -{ - AM53C974_local_declare(); - unsigned long flags; - struct Scsi_Host *instance = cmd->device->host; - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - Scsi_Cmnd *tmp, **prev; - -#ifdef AM53C974_DEBUG - deb_stop = 1; -#endif - save_flags(flags); - cli(); - AM53C974_setio(instance); - - DEB_ABORT(printk(SEPARATOR_LINE)); - DEB_ABORT(printk("scsi%d : AM53C974_abort called -- trouble starts!!\n", instance->host_no)); - DEB_ABORT(AM53C974_print(instance)); - DEB_ABORT(AM53C974_keywait()); - -/* Case 1 : If the command is the currently executing command, - we'll set the aborted flag and return control so that the - information transfer routine can exit cleanly. */ - if ((hostdata->connected == cmd) || (hostdata->sel_cmd == cmd)) { - DEB_ABORT(printk("scsi%d: aborting connected command\n", instance->host_no)); - hostdata->aborted = 1; - hostdata->msgout[0] = ABORT; - restore_flags(flags); - return (SCSI_ABORT_PENDING); - } -/* Case 2 : If the command hasn't been issued yet, - we simply remove it from the issue queue. */ - for (prev = (Scsi_Cmnd **) & (hostdata->issue_queue), - tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp; - prev = (Scsi_Cmnd **) & (tmp->host_scribble), - tmp = (Scsi_Cmnd *) tmp->host_scribble) { - if (cmd == tmp) { - DEB_ABORT(printk("scsi%d : abort removed command from issue queue.\n", instance->host_no)); - REMOVE(5, *prev, tmp, tmp->host_scribble); - (*prev) = (Scsi_Cmnd *) tmp->host_scribble; - tmp->host_scribble = NULL; - tmp->result = DID_ABORT << 16; - restore_flags(flags); - tmp->done(tmp); - return (SCSI_ABORT_SUCCESS); - } -#ifdef AM53C974_DEBUG_ABORT - else { - if (prev == (Scsi_Cmnd **) tmp) - printk("scsi%d : LOOP\n", instance->host_no); - } -#endif - } - -/* Case 3 : If any commands are connected, we're going to fail the abort - * and let the high level SCSI driver retry at a later time or - * issue a reset. - * - * Timeouts, and therefore aborted commands, will be highly unlikely - * and handling them cleanly in this situation would make the common - * case of noresets less efficient, and would pollute our code. So, - * we fail. */ - if (hostdata->connected || hostdata->sel_cmd) { - DEB_ABORT(printk("scsi%d : abort failed, other command connected.\n", instance->host_no)); - restore_flags(flags); - return (SCSI_ABORT_NOT_RUNNING); - } -/* Case 4: If the command is currently disconnected from the bus, and - * there are no connected commands, we reconnect the I_T_L or - * I_T_L_Q nexus associated with it, go into message out, and send - * an abort message. */ - for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; - tmp = (Scsi_Cmnd *) tmp->host_scribble) { - if (cmd == tmp) { - DEB_ABORT(printk("scsi%d: aborting disconnected command\n", instance->host_no)); - hostdata->aborted = 1; - hostdata->msgout[0] = ABORT; - hostdata->selecting = 1; - hostdata->sel_cmd = tmp; - AM53C974_write_8(CMDREG, CMDREG_DSR); - restore_flags(flags); - return (SCSI_ABORT_PENDING); - } - } - -/* Case 5 : If we reached this point, the command was not found in any of - * the queues. - * - * We probably reached this point because of an unlikely race condition - * between the command completing successfully and the abortion code, - * so we won't panic, but we will notify the user in case something really - * broke. */ - DEB_ABORT(printk("scsi%d : abort failed, command not found.\n", instance->host_no)); - restore_flags(flags); - return (SCSI_ABORT_NOT_RUNNING); -} - -/************************************************************************** -* Function : int AM53C974_reset(Scsi_Cmnd *cmd) -* -* Purpose : reset the SCSI controller and bus -* -* Inputs : cmd -- which command within the command block was responsible for the reset -* -* Returns : status (SCSI_ABORT_SUCCESS) -* -* FIXME(eric) the reset_flags are ignored. -**************************************************************************/ -static int AM53C974_reset(Scsi_Cmnd * cmd, unsigned int reset_flags) -{ - AM53C974_local_declare(); - unsigned long flags; - int i; - struct Scsi_Host *instance = cmd->device->host; - struct AM53C974_hostdata *hostdata = (struct AM53C974_hostdata *) instance->hostdata; - AM53C974_setio(instance); - - save_flags(flags); - cli(); - DEB(printk("AM53C974_reset called; ")); - - printk("AM53C974_reset called\n"); - AM53C974_print(instance); - AM53C974_keywait(); - -/* do hard reset */ - AM53C974_write_8(CMDREG, CMDREG_RDEV); - AM53C974_write_8(CMDREG, CMDREG_NOP); - hostdata->msgout[0] = NOP; - for (i = 0; i < 8; i++) { - hostdata->busy[i] = 0; - hostdata->sync_per[i] = DEF_STP; - hostdata->sync_off[i] = 0; - hostdata->sync_neg[i] = 0; - } - hostdata->last_message[0] = NOP; - hostdata->sel_cmd = NULL; - hostdata->connected = NULL; - hostdata->issue_queue = NULL; - hostdata->disconnected_queue = NULL; - hostdata->in_reset = 0; - hostdata->aborted = 0; - hostdata->selecting = 0; - hostdata->disconnecting = 0; - hostdata->dma_busy = 0; - -/* reset bus */ - AM53C974_write_8(CNTLREG1, CNTLREG1_DISR | instance->this_id); /* disable interrupt upon SCSI RESET */ - AM53C974_write_8(CMDREG, CMDREG_RBUS); /* reset SCSI bus */ - udelay(40); - AM53C974_config_after_reset(instance); - - restore_flags(flags); - cmd->result = DID_RESET << 16; - cmd->scsi_done(cmd); - return SCSI_ABORT_SUCCESS; -} - - -/* - * AM53C974_release() - * - * Release resources allocated for a single AM53C974 adapter. - */ -static int AM53C974_release(struct Scsi_Host *shp) -{ - free_irq(shp->irq, shp); - release_region(shp->io_port, 128); - scsi_unregister(shp); - return 0; -} - - -/* You can specify overrides=a,b,c,d in the same format at AM53C974=a,b,c,d - on boot up */ -MODULE_PARM(overrides, "1-32i"); -MODULE_LICENSE("GPL"); - - -static Scsi_Host_Template driver_template = { - .proc_name = "am53c974", - .name = "AM53C974", - .detect = AM53C974_pci_detect, - .release = AM53C974_release, - .info = AM53C974_info, - .queuecommand = AM53C974_queue_command, - .abort = AM53C974_abort, - .reset = AM53C974_reset, - .can_queue = 12, - .this_id = -1, - .sg_tablesize = SG_ALL, - .cmd_per_lun = 1, - .use_clustering = DISABLE_CLUSTERING, -}; - -#include "scsi_module.c" diff -Nru a/drivers/scsi/AM53C974.h b/drivers/scsi/AM53C974.h --- a/drivers/scsi/AM53C974.h Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,61 +0,0 @@ -/* AM53/79C974 (PCscsi) driver release 0.5 - - * The architecture and much of the code of this device - * driver was originally developed by Drew Eckhardt for - * the NCR5380. The following copyrights apply: - * For the architecture and all parts similar to the NCR5380: - * Copyright 1993, Drew Eckhardt - * Visionary Computing - * (Unix and Linux consulting and custom programming) - * drew@colorado.edu - * +1 (303) 666-5836 - * - * The AM53C974_nobios_detect code was originally developed by - * Robin Cutshaw (robin@xfree86.org) and is used here in a - * modified form. - * - * For the other parts: - * Copyright 1994, D. Frieauff - * EMail: fri@rsx42sun0.dofn.de - * Phone: x49-7545-8-2256 , x49-7541-42305 - */ - -/* - * $Log: AM53C974.h,v $ - */ - -#ifndef AM53C974_H -#define AM53C974_H - -#include - -struct AM53C974_hostdata { - volatile unsigned in_reset:1; /* flag, says bus reset pending */ - volatile unsigned aborted:1; /* flag, says aborted */ - volatile unsigned selecting:1; /* selection started, but not yet finished */ - volatile unsigned disconnecting: 1; /* disconnection started, but not yet finished */ - volatile unsigned dma_busy:1; /* dma busy when service request for info transfer received */ - volatile unsigned char msgout[10]; /* message to output in MSGOUT_PHASE */ - volatile unsigned char last_message[10]; /* last message OUT */ - volatile Scsi_Cmnd *issue_queue; /* waiting to be issued */ - volatile Scsi_Cmnd *disconnected_queue; /* waiting for reconnect */ - volatile Scsi_Cmnd *sel_cmd; /* command for selection */ - volatile Scsi_Cmnd *connected; /* currently connected command */ - volatile unsigned char busy[8]; /* index = target, bit = lun */ - unsigned char sync_per[8]; /* synchronous transfer period (in effect) */ - unsigned char sync_off[8]; /* synchronous offset (in effect) */ - unsigned char sync_neg[8]; /* sync. negotiation performed (in effect) */ - unsigned char sync_en[8]; /* sync. negotiation performed (in effect) */ - unsigned char max_rate[8]; /* max. transfer rate (setup) */ - unsigned char max_offset[8]; /* max. sync. offset (setup), only valid if corresponding sync_en is nonzero */ -}; - -static int AM53C974_pci_detect(Scsi_Host_Template * tpnt); -static int AM53C974_release(struct Scsi_Host *shp); -static const char *AM53C974_info(struct Scsi_Host *); -static int AM53C974_command(Scsi_Cmnd * SCpnt); -static int AM53C974_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); -static int AM53C974_abort(Scsi_Cmnd * cmd); -static int AM53C974_reset(Scsi_Cmnd * cmd, unsigned int); - -#endif /* AM53C974_H */ diff -Nru a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c --- a/drivers/scsi/BusLogic.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/BusLogic.c Tue Feb 17 20:00:08 2004 @@ -26,7 +26,6 @@ */ - #define BusLogic_DriverVersion "2.1.16" #define BusLogic_DriverDate "18 July 2002" @@ -42,7 +41,7 @@ #include #include #include -/* #include This include file is currently busted */ +#include #include #include @@ -53,6 +52,9 @@ #include "BusLogic.h" #include "FlashPoint.c" +#ifndef FAILURE +#define FAILURE (-1) +#endif /* BusLogic_DriverOptionsCount is a count of the number of BusLogic Driver @@ -60,8 +62,7 @@ the Loadable Kernel Module Installation Facility. */ -static int - BusLogic_DriverOptionsCount; +static int BusLogic_DriverOptionsCount; /* @@ -70,14 +71,14 @@ Line or via the Loadable Kernel Module Installation Facility. */ -static BusLogic_DriverOptions_T - BusLogic_DriverOptions[BusLogic_MaxHostAdapters]; +static struct BusLogic_DriverOptions BusLogic_DriverOptions[BusLogic_MaxHostAdapters]; /* BusLogic can be assigned a string by insmod. */ +MODULE_LICENSE("GPL"); #ifdef MODULE static char *BusLogic; MODULE_PARM(BusLogic, "s"); @@ -89,8 +90,7 @@ all BusLogic Host Adapters. */ -static BusLogic_ProbeOptions_T - BusLogic_ProbeOptions; +static struct BusLogic_ProbeOptions BusLogic_ProbeOptions; /* @@ -98,8 +98,7 @@ all BusLogic Host Adapters. */ -static BusLogic_GlobalOptions_T - BusLogic_GlobalOptions; +static struct BusLogic_GlobalOptions BusLogic_GlobalOptions; /* @@ -107,17 +106,15 @@ are pointers to the first and last registered BusLogic Host Adapters. */ -static BusLogic_HostAdapter_T - *BusLogic_FirstRegisteredHostAdapter, - *BusLogic_LastRegisteredHostAdapter; +static struct BusLogic_HostAdapter *BusLogic_FirstRegisteredHostAdapter; +static struct BusLogic_HostAdapter *BusLogic_LastRegisteredHostAdapter; /* BusLogic_ProbeInfoCount is the number of entries in BusLogic_ProbeInfoList. */ -static int - BusLogic_ProbeInfoCount; +static int BusLogic_ProbeInfoCount; /* @@ -127,8 +124,7 @@ list of standard BusLogic I/O Addresses. */ -static BusLogic_ProbeInfo_T - *BusLogic_ProbeInfoList; +static struct BusLogic_ProbeInfo *BusLogic_ProbeInfoList; /* @@ -137,15 +133,14 @@ returns a failure code. */ -static char - *BusLogic_CommandFailureReason; +static char *BusLogic_CommandFailureReason; /* BusLogic_AnnounceDriver announces the Driver Version and Date, Author's Name, Copyright Notice, and Electronic Mail Address. */ -static void BusLogic_AnnounceDriver(BusLogic_HostAdapter_T *HostAdapter) +static void __init BusLogic_AnnounceDriver(struct BusLogic_HostAdapter *HostAdapter) { BusLogic_Announce("***** BusLogic SCSI Driver Version " BusLogic_DriverVersion " of " @@ -160,10 +155,10 @@ Driver and Host Adapter. */ -const char *BusLogic_DriverInfo(SCSI_Host_T *Host) +static const char *BusLogic_DriverInfo(struct Scsi_Host *Host) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Host->hostdata; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) Host->hostdata; return HostAdapter->FullModelName; } @@ -173,7 +168,7 @@ BusLogic Host Adapters. */ -static void BusLogic_RegisterHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +static void __init BusLogic_RegisterHostAdapter(struct BusLogic_HostAdapter *HostAdapter) { HostAdapter->Next = NULL; if (BusLogic_FirstRegisteredHostAdapter == NULL) @@ -194,7 +189,7 @@ registered BusLogic Host Adapters. */ -static void BusLogic_UnregisterHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +static void __init BusLogic_UnregisterHostAdapter(struct BusLogic_HostAdapter *HostAdapter) { if (HostAdapter == BusLogic_FirstRegisteredHostAdapter) { @@ -205,7 +200,7 @@ } else { - BusLogic_HostAdapter_T *PreviousHostAdapter = + struct BusLogic_HostAdapter *PreviousHostAdapter = BusLogic_FirstRegisteredHostAdapter; while (PreviousHostAdapter != NULL && PreviousHostAdapter->Next != HostAdapter) @@ -223,20 +218,20 @@ created CCBs are added to Host Adapter's free list. */ -static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter, +static void BusLogic_InitializeCCBs(struct BusLogic_HostAdapter *HostAdapter, void *BlockPointer, int BlockSize, dma_addr_t BlockPointerHandle) { - BusLogic_CCB_T *CCB = (BusLogic_CCB_T *) BlockPointer; + struct BusLogic_CCB *CCB = (struct BusLogic_CCB *) BlockPointer; unsigned int offset = 0; memset(BlockPointer, 0, BlockSize); CCB->AllocationGroupHead = BlockPointerHandle; CCB->AllocationGroupSize = BlockSize; - while ((BlockSize -= sizeof(BusLogic_CCB_T)) >= 0) + while ((BlockSize -= sizeof(struct BusLogic_CCB)) >= 0) { CCB->Status = BusLogic_CCB_Free; CCB->HostAdapter = HostAdapter; - CCB->DMA_Handle = (BusLogic_BusAddress_T)BlockPointerHandle + offset; + CCB->DMA_Handle = (u32)BlockPointerHandle + offset; if (BusLogic_FlashPointHostAdapterP(HostAdapter)) { CCB->CallbackFunction = BusLogic_QueueCompletedCCB; @@ -248,7 +243,7 @@ HostAdapter->All_CCBs = CCB; HostAdapter->AllocatedCCBs++; CCB++; - offset += sizeof(BusLogic_CCB_T); + offset += sizeof(struct BusLogic_CCB); } } @@ -257,9 +252,9 @@ BusLogic_CreateInitialCCBs allocates the initial CCBs for Host Adapter. */ -static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *HostAdapter) +static boolean __init BusLogic_CreateInitialCCBs(struct BusLogic_HostAdapter *HostAdapter) { - int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T); + int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB); void *BlockPointer; dma_addr_t BlockPointerHandle; while (HostAdapter->AllocatedCCBs < HostAdapter->InitialCCBs) @@ -283,9 +278,9 @@ BusLogic_DestroyCCBs deallocates the CCBs for Host Adapter. */ -static void BusLogic_DestroyCCBs(BusLogic_HostAdapter_T *HostAdapter) +static void BusLogic_DestroyCCBs(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_CCB_T *NextCCB = HostAdapter->All_CCBs, *CCB, *Last_CCB = NULL; + struct BusLogic_CCB *NextCCB = HostAdapter->All_CCBs, *CCB, *Last_CCB = NULL; HostAdapter->All_CCBs = NULL; HostAdapter->Free_CCBs = NULL; while ((CCB = NextCCB) != NULL) @@ -314,11 +309,11 @@ multiple host adapters share the same IRQ Channel. */ -static void BusLogic_CreateAdditionalCCBs(BusLogic_HostAdapter_T *HostAdapter, +static void BusLogic_CreateAdditionalCCBs(struct BusLogic_HostAdapter *HostAdapter, int AdditionalCCBs, boolean SuccessMessageP) { - int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T); + int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB); int PreviouslyAllocated = HostAdapter->AllocatedCCBs; void *BlockPointer; dma_addr_t BlockPointerHandle; @@ -350,18 +345,17 @@ } } - /* BusLogic_AllocateCCB allocates a CCB from Host Adapter's free list, allocating more memory from the Kernel if necessary. The Host Adapter's Lock should already have been acquired by the caller. */ -static BusLogic_CCB_T *BusLogic_AllocateCCB(BusLogic_HostAdapter_T +static struct BusLogic_CCB *BusLogic_AllocateCCB(struct BusLogic_HostAdapter *HostAdapter) { static unsigned long SerialNumber = 0; - BusLogic_CCB_T *CCB; + struct BusLogic_CCB *CCB; CCB = HostAdapter->Free_CCBs; if (CCB != NULL) { @@ -392,13 +386,13 @@ caller. */ -static void BusLogic_DeallocateCCB(BusLogic_CCB_T *CCB) +static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB) { - BusLogic_HostAdapter_T *HostAdapter = CCB->HostAdapter; + struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter; if (CCB->Command->use_sg != 0) { pci_unmap_sg(HostAdapter->PCI_Device, - (SCSI_ScatterList_T *)CCB->Command->request_buffer, + (struct scatterlist *)CCB->Command->request_buffer, CCB->Command->use_sg, scsi_to_pci_dma_dir(CCB->Command->sc_data_direction)); } @@ -435,8 +429,8 @@ waiting for the Host Adapter Ready bit to be set in the Status Register. */ -static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter, - BusLogic_OperationCode_T OperationCode, +static int BusLogic_Command(struct BusLogic_HostAdapter *HostAdapter, + enum BusLogic_OperationCode OperationCode, void *ParameterData, int ParameterLength, void *ReplyData, @@ -444,9 +438,9 @@ { unsigned char *ParameterPointer = (unsigned char *) ParameterData; unsigned char *ReplyPointer = (unsigned char *) ReplyData; - BusLogic_StatusRegister_T StatusRegister; - BusLogic_InterruptRegister_T InterruptRegister; - ProcessorFlags_T ProcessorFlags = 0; + union BusLogic_StatusRegister StatusRegister; + union BusLogic_InterruptRegister InterruptRegister; + unsigned long ProcessorFlags = 0; int ReplyBytes = 0, Result; long TimeoutCounter; /* @@ -473,8 +467,8 @@ while (--TimeoutCounter >= 0) { StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (StatusRegister.Bits.HostAdapterReady && - !StatusRegister.Bits.CommandParameterRegisterBusy) + if (StatusRegister.sr.HostAdapterReady && + !StatusRegister.sr.CommandParameterRegisterBusy) break; udelay(100); } @@ -510,10 +504,10 @@ udelay(100); InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (InterruptRegister.Bits.CommandComplete) break; + if (InterruptRegister.ir.CommandComplete) break; if (HostAdapter->HostAdapterCommandCompleted) break; - if (StatusRegister.Bits.DataInRegisterReady) break; - if (StatusRegister.Bits.CommandParameterRegisterBusy) continue; + if (StatusRegister.sr.DataInRegisterReady) break; + if (StatusRegister.sr.CommandParameterRegisterBusy) continue; BusLogic_WriteCommandParameterRegister(HostAdapter, *ParameterPointer++); ParameterLength--; } @@ -530,7 +524,7 @@ if (OperationCode == BusLogic_ModifyIOAddress) { StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (StatusRegister.Bits.CommandInvalid) + if (StatusRegister.sr.CommandInvalid) { BusLogic_CommandFailureReason = "Modify I/O Address Invalid"; Result = -1; @@ -568,16 +562,16 @@ { InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (InterruptRegister.Bits.CommandComplete) break; + if (InterruptRegister.ir.CommandComplete) break; if (HostAdapter->HostAdapterCommandCompleted) break; - if (StatusRegister.Bits.DataInRegisterReady) + if (StatusRegister.sr.DataInRegisterReady) { if (++ReplyBytes <= ReplyLength) *ReplyPointer++ = BusLogic_ReadDataInRegister(HostAdapter); else BusLogic_ReadDataInRegister(HostAdapter); } if (OperationCode == BusLogic_FetchHostAdapterLocalRAM && - StatusRegister.Bits.HostAdapterReady) break; + StatusRegister.sr.HostAdapterReady) break; udelay(100); } if (TimeoutCounter < 0) @@ -608,7 +602,7 @@ /* Process Command Invalid conditions. */ - if (StatusRegister.Bits.CommandInvalid) + if (StatusRegister.sr.CommandInvalid) { /* Some early BusLogic Host Adapters may not recover properly from @@ -620,14 +614,14 @@ */ udelay(1000); StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (StatusRegister.Bits.CommandInvalid || - StatusRegister.Bits.Reserved || - StatusRegister.Bits.DataInRegisterReady || - StatusRegister.Bits.CommandParameterRegisterBusy || - !StatusRegister.Bits.HostAdapterReady || - !StatusRegister.Bits.InitializationRequired || - StatusRegister.Bits.DiagnosticActive || - StatusRegister.Bits.DiagnosticFailure) + if (StatusRegister.sr.CommandInvalid || + StatusRegister.sr.Reserved || + StatusRegister.sr.DataInRegisterReady || + StatusRegister.sr.CommandParameterRegisterBusy || + !StatusRegister.sr.HostAdapterReady || + !StatusRegister.sr.InitializationRequired || + StatusRegister.sr.DiagnosticActive || + StatusRegister.sr.DiagnosticFailure) { BusLogic_SoftReset(HostAdapter); udelay(1000); @@ -666,9 +660,9 @@ Host Adapters. */ -static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T IO_Address) +static void __init BusLogic_AppendProbeAddressISA(unsigned long IO_Address) { - BusLogic_ProbeInfo_T *ProbeInfo; + struct BusLogic_ProbeInfo *ProbeInfo; if (BusLogic_ProbeInfoCount >= BusLogic_MaxHostAdapters) return; ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++]; ProbeInfo->HostAdapterType = BusLogic_MultiMaster; @@ -684,8 +678,8 @@ only from the list of standard BusLogic MultiMaster ISA I/O Addresses. */ -static void BusLogic_InitializeProbeInfoListISA(BusLogic_HostAdapter_T - *PrototypeHostAdapter) +static void __init BusLogic_InitializeProbeInfoListISA(struct BusLogic_HostAdapter + *PrototypeHostAdapter) { /* If BusLogic Driver Options specifications requested that ISA Bus Probes @@ -730,8 +724,8 @@ of increasing PCI Bus and Device Number. */ -static void BusLogic_SortProbeInfo(BusLogic_ProbeInfo_T *ProbeInfoList, - int ProbeInfoCount) +static void __init BusLogic_SortProbeInfo(struct BusLogic_ProbeInfo *ProbeInfoList, + int ProbeInfoCount) { int LastInterchange = ProbeInfoCount-1, Bound, j; while (LastInterchange > 0) @@ -740,16 +734,16 @@ LastInterchange = 0; for (j = 0; j < Bound; j++) { - BusLogic_ProbeInfo_T *ProbeInfo1 = &ProbeInfoList[j]; - BusLogic_ProbeInfo_T *ProbeInfo2 = &ProbeInfoList[j+1]; + struct BusLogic_ProbeInfo *ProbeInfo1 = &ProbeInfoList[j]; + struct BusLogic_ProbeInfo *ProbeInfo2 = &ProbeInfoList[j+1]; if (ProbeInfo1->Bus > ProbeInfo2->Bus || (ProbeInfo1->Bus == ProbeInfo2->Bus && (ProbeInfo1->Device > ProbeInfo2->Device))) { - BusLogic_ProbeInfo_T TempProbeInfo; - memcpy(&TempProbeInfo, ProbeInfo1, sizeof(BusLogic_ProbeInfo_T)); - memcpy(ProbeInfo1, ProbeInfo2, sizeof(BusLogic_ProbeInfo_T)); - memcpy(ProbeInfo2, &TempProbeInfo, sizeof(BusLogic_ProbeInfo_T)); + struct BusLogic_ProbeInfo TempProbeInfo; + memcpy(&TempProbeInfo, ProbeInfo1, sizeof(struct BusLogic_ProbeInfo)); + memcpy(ProbeInfo1, ProbeInfo2, sizeof(struct BusLogic_ProbeInfo)); + memcpy(ProbeInfo2, &TempProbeInfo, sizeof(struct BusLogic_ProbeInfo)); LastInterchange = j; } } @@ -765,17 +759,17 @@ I/O Addresses. It returns the number of PCI MultiMaster Host Adapters found. */ -static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T - *PrototypeHostAdapter) +static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAdapter + *PrototypeHostAdapter) { - BusLogic_ProbeInfo_T *PrimaryProbeInfo = + struct BusLogic_ProbeInfo *PrimaryProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount]; int NonPrimaryPCIMultiMasterIndex = BusLogic_ProbeInfoCount + 1; int NonPrimaryPCIMultiMasterCount = 0, PCIMultiMasterCount = 0; boolean ForceBusDeviceScanningOrder = false; boolean ForceBusDeviceScanningOrderChecked = false; boolean StandardAddressSeen[6]; - PCI_Device_T *PCI_Device = NULL; + struct pci_dev *PCI_Device = NULL; int i; if (BusLogic_ProbeInfoCount >= BusLogic_MaxHostAdapters) return 0; BusLogic_ProbeInfoCount++; @@ -798,16 +792,16 @@ PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER, PCI_Device)) != NULL) { - BusLogic_HostAdapter_T *HostAdapter = PrototypeHostAdapter; - BusLogic_PCIHostAdapterInformation_T PCIHostAdapterInformation; - BusLogic_ModifyIOAddressRequest_T ModifyIOAddressRequest; + struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter; + struct BusLogic_PCIHostAdapterInformation PCIHostAdapterInformation; + enum BusLogic_ISACompatibleIOPort ModifyIOAddressRequest; unsigned char Bus; unsigned char Device; unsigned int IRQ_Channel; unsigned long BaseAddress0; unsigned long BaseAddress1; - BusLogic_IO_Address_T IO_Address; - BusLogic_PCI_Address_T PCI_Address; + unsigned long IO_Address; + unsigned long PCI_Address; if (pci_enable_device(PCI_Device)) continue; @@ -874,9 +868,12 @@ else PCIHostAdapterInformation.ISACompatibleIOPort = BusLogic_IO_Disable; /* - Issue the Modify I/O Address command to disable the ISA Compatible - I/O Port. - */ + * Issue the Modify I/O Address command to disable the ISA Compatible + * I/O Port. On PCI Host Adapters, the Modify I/O Address command + * allows modification of the ISA compatible I/O Address that the Host + * Adapter responds to; it does not affect the PCI compliant I/O Address + * assigned at system initialization. + */ ModifyIOAddressRequest = BusLogic_IO_Disable; BusLogic_Command(HostAdapter, BusLogic_ModifyIOAddress, &ModifyIOAddressRequest, @@ -890,10 +887,10 @@ */ if (!ForceBusDeviceScanningOrderChecked) { - BusLogic_FetchHostAdapterLocalRAMRequest_T + struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest; - BusLogic_AutoSCSIByte45_T AutoSCSIByte45; - BusLogic_BoardID_T BoardID; + struct BusLogic_AutoSCSIByte45 AutoSCSIByte45; + struct BusLogic_BoardID BoardID; FetchHostAdapterLocalRAMRequest.ByteOffset = BusLogic_AutoSCSI_BaseOffset + 45; FetchHostAdapterLocalRAMRequest.ByteCount = @@ -931,7 +928,7 @@ } else if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters) { - BusLogic_ProbeInfo_T *ProbeInfo = + struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++]; ProbeInfo->HostAdapterType = BusLogic_MultiMaster; ProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus; @@ -1020,7 +1017,7 @@ unsigned char Bus; unsigned char Device; unsigned int IRQ_Channel; - BusLogic_IO_Address_T IO_Address; + unsigned long IO_Address; if (pci_enable_device(PCI_Device)) continue; @@ -1036,7 +1033,7 @@ if (IO_Address == 0 || IRQ_Channel == 0) continue; for (i = 0; i < BusLogic_ProbeInfoCount; i++) { - BusLogic_ProbeInfo_T *ProbeInfo = &BusLogic_ProbeInfoList[i]; + struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[i]; if (ProbeInfo->IO_Address == IO_Address && ProbeInfo->HostAdapterType == BusLogic_MultiMaster) { @@ -1061,11 +1058,11 @@ number of FlashPoint Host Adapters found. */ -static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T - *PrototypeHostAdapter) +static int __init BusLogic_InitializeFlashPointProbeInfo(struct BusLogic_HostAdapter + *PrototypeHostAdapter) { int FlashPointIndex = BusLogic_ProbeInfoCount, FlashPointCount = 0; - PCI_Device_T *PCI_Device = NULL; + struct pci_dev *PCI_Device = NULL; /* Interrogate PCI Configuration Space for any FlashPoint Host Adapters. */ @@ -1078,8 +1075,8 @@ unsigned int IRQ_Channel; unsigned long BaseAddress0; unsigned long BaseAddress1; - BusLogic_IO_Address_T IO_Address; - BusLogic_PCI_Address_T PCI_Address; + unsigned long IO_Address; + unsigned long PCI_Address; if (pci_enable_device(PCI_Device)) continue; @@ -1127,7 +1124,7 @@ } if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters) { - BusLogic_ProbeInfo_T *ProbeInfo = + struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++]; ProbeInfo->HostAdapterType = BusLogic_FlashPoint; ProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus; @@ -1174,8 +1171,8 @@ a particular probe order. */ -static void BusLogic_InitializeProbeInfoList(BusLogic_HostAdapter_T - *PrototypeHostAdapter) +static void __init BusLogic_InitializeProbeInfoList(struct BusLogic_HostAdapter + *PrototypeHostAdapter) { /* If a PCI BIOS is present, interrogate it for MultiMaster and FlashPoint @@ -1201,12 +1198,12 @@ BusLogic_InitializeMultiMasterProbeInfo(PrototypeHostAdapter); if (FlashPointCount > 0 && PCIMultiMasterCount > 0) { - BusLogic_ProbeInfo_T *ProbeInfo = + struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[FlashPointCount]; - BusLogic_HostAdapter_T *HostAdapter = PrototypeHostAdapter; - BusLogic_FetchHostAdapterLocalRAMRequest_T + struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter; + struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest; - BusLogic_BIOSDriveMapByte_T Drive0MapByte; + struct BusLogic_BIOSDriveMapByte Drive0MapByte; while (ProbeInfo->HostAdapterBusType != BusLogic_PCI_Bus) ProbeInfo++; HostAdapter->IO_Address = ProbeInfo->IO_Address; @@ -1228,20 +1225,20 @@ if (Drive0MapByte.DiskGeometry != BusLogic_BIOS_Disk_Not_Installed) { - BusLogic_ProbeInfo_T + struct BusLogic_ProbeInfo SavedProbeInfo[BusLogic_MaxHostAdapters]; int MultiMasterCount = BusLogic_ProbeInfoCount - FlashPointCount; memcpy(SavedProbeInfo, BusLogic_ProbeInfoList, BusLogic_ProbeInfoCount - * sizeof(BusLogic_ProbeInfo_T)); + * sizeof(struct BusLogic_ProbeInfo)); memcpy(&BusLogic_ProbeInfoList[0], &SavedProbeInfo[FlashPointCount], - MultiMasterCount * sizeof(BusLogic_ProbeInfo_T)); + MultiMasterCount * sizeof(struct BusLogic_ProbeInfo)); memcpy(&BusLogic_ProbeInfoList[MultiMasterCount], &SavedProbeInfo[0], - FlashPointCount * sizeof(BusLogic_ProbeInfo_T)); + FlashPointCount * sizeof(struct BusLogic_ProbeInfo)); } } } @@ -1257,7 +1254,7 @@ BusLogic_Failure prints a standardized error message, and then returns false. */ -static boolean BusLogic_Failure(BusLogic_HostAdapter_T *HostAdapter, +static boolean BusLogic_Failure(struct BusLogic_HostAdapter *HostAdapter, char *ErrorMessage) { BusLogic_AnnounceDriver(HostAdapter); @@ -1284,19 +1281,19 @@ BusLogic_ProbeHostAdapter probes for a BusLogic Host Adapter. */ -static boolean BusLogic_ProbeHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +static boolean __init BusLogic_ProbeHostAdapter(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_StatusRegister_T StatusRegister; - BusLogic_InterruptRegister_T InterruptRegister; - BusLogic_GeometryRegister_T GeometryRegister; + union BusLogic_StatusRegister StatusRegister; + union BusLogic_InterruptRegister InterruptRegister; + union BusLogic_GeometryRegister GeometryRegister; /* FlashPoint Host Adapters are Probed by the FlashPoint SCCB Manager. */ if (BusLogic_FlashPointHostAdapterP(HostAdapter)) { - FlashPoint_Info_T *FlashPointInfo = &HostAdapter->FlashPointInfo; + struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo; FlashPointInfo->BaseAddress = - (BusLogic_Base_Address_T) HostAdapter->IO_Address; + (u32) HostAdapter->IO_Address; FlashPointInfo->IRQ_Channel = HostAdapter->IRQ_Channel; FlashPointInfo->Present = false; if (!(FlashPoint_ProbeHostAdapter(FlashPointInfo) == 0 && @@ -1336,11 +1333,11 @@ HostAdapter->IO_Address, StatusRegister.All, InterruptRegister.All, GeometryRegister.All); if (StatusRegister.All == 0 || - StatusRegister.Bits.DiagnosticActive || - StatusRegister.Bits.CommandParameterRegisterBusy || - StatusRegister.Bits.Reserved || - StatusRegister.Bits.CommandInvalid || - InterruptRegister.Bits.Reserved != 0) + StatusRegister.sr.DiagnosticActive || + StatusRegister.sr.CommandParameterRegisterBusy || + StatusRegister.sr.Reserved || + StatusRegister.sr.CommandInvalid || + InterruptRegister.ir.Reserved != 0) return false; /* Check the undocumented Geometry Register to test if there is an I/O port @@ -1372,18 +1369,18 @@ SCSI Bus Reset. */ -static boolean BusLogic_HardwareResetHostAdapter(BusLogic_HostAdapter_T +static boolean BusLogic_HardwareResetHostAdapter(struct BusLogic_HostAdapter *HostAdapter, boolean HardReset) { - BusLogic_StatusRegister_T StatusRegister; + union BusLogic_StatusRegister StatusRegister; int TimeoutCounter; /* FlashPoint Host Adapters are Hard Reset by the FlashPoint SCCB Manager. */ if (BusLogic_FlashPointHostAdapterP(HostAdapter)) { - FlashPoint_Info_T *FlashPointInfo = &HostAdapter->FlashPointInfo; + struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo; FlashPointInfo->HostSoftReset = !HardReset; FlashPointInfo->ReportDataUnderrun = true; HostAdapter->CardHandle = @@ -1408,7 +1405,7 @@ while (--TimeoutCounter >= 0) { StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (StatusRegister.Bits.DiagnosticActive) break; + if (StatusRegister.sr.DiagnosticActive) break; udelay(100); } if (BusLogic_GlobalOptions.TraceHardwareReset) @@ -1429,7 +1426,7 @@ while (--TimeoutCounter >= 0) { StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (!StatusRegister.Bits.DiagnosticActive) break; + if (!StatusRegister.sr.DiagnosticActive) break; udelay(100); } if (BusLogic_GlobalOptions.TraceHardwareReset) @@ -1445,9 +1442,9 @@ while (--TimeoutCounter >= 0) { StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); - if (StatusRegister.Bits.DiagnosticFailure || - StatusRegister.Bits.HostAdapterReady || - StatusRegister.Bits.DataInRegisterReady) + if (StatusRegister.sr.DiagnosticFailure || + StatusRegister.sr.HostAdapterReady || + StatusRegister.sr.DataInRegisterReady) break; udelay(100); } @@ -1461,14 +1458,14 @@ error occurred during the Host Adapter diagnostics. If Data In Register Ready is set, then there is an Error Code available. */ - if (StatusRegister.Bits.DiagnosticFailure || - !StatusRegister.Bits.HostAdapterReady) + if (StatusRegister.sr.DiagnosticFailure || + !StatusRegister.sr.HostAdapterReady) { BusLogic_CommandFailureReason = NULL; BusLogic_Failure(HostAdapter, "HARD RESET DIAGNOSTICS"); BusLogic_Error("HOST ADAPTER STATUS REGISTER = %02X\n", HostAdapter, StatusRegister.All); - if (StatusRegister.Bits.DataInRegisterReady) + if (StatusRegister.sr.DataInRegisterReady) { unsigned char ErrorCode = BusLogic_ReadDataInRegister(HostAdapter); BusLogic_Error("HOST ADAPTER ERROR CODE = %d\n", @@ -1488,10 +1485,10 @@ Host Adapter. */ -static boolean BusLogic_CheckHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +static boolean __init BusLogic_CheckHostAdapter(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation; - BusLogic_RequestedReplyLength_T RequestedReplyLength; + struct BusLogic_ExtendedSetupInformation ExtendedSetupInformation; + unsigned char RequestedReplyLength; boolean Result = true; /* FlashPoint Host Adapters do not require this protection. @@ -1527,21 +1524,21 @@ from Host Adapter and initializes the Host Adapter structure. */ -static boolean BusLogic_ReadHostAdapterConfiguration(BusLogic_HostAdapter_T - *HostAdapter) +static boolean __init BusLogic_ReadHostAdapterConfiguration(struct BusLogic_HostAdapter + *HostAdapter) { - BusLogic_BoardID_T BoardID; - BusLogic_Configuration_T Configuration; - BusLogic_SetupInformation_T SetupInformation; - BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation; - BusLogic_HostAdapterModelNumber_T HostAdapterModelNumber; - BusLogic_FirmwareVersion3rdDigit_T FirmwareVersion3rdDigit; - BusLogic_FirmwareVersionLetter_T FirmwareVersionLetter; - BusLogic_PCIHostAdapterInformation_T PCIHostAdapterInformation; - BusLogic_FetchHostAdapterLocalRAMRequest_T FetchHostAdapterLocalRAMRequest; - BusLogic_AutoSCSIData_T AutoSCSIData; - BusLogic_GeometryRegister_T GeometryRegister; - BusLogic_RequestedReplyLength_T RequestedReplyLength; + struct BusLogic_BoardID BoardID; + struct BusLogic_Configuration Configuration; + struct BusLogic_SetupInformation SetupInformation; + struct BusLogic_ExtendedSetupInformation ExtendedSetupInformation; + unsigned char HostAdapterModelNumber[5]; + unsigned char FirmwareVersion3rdDigit; + unsigned char FirmwareVersionLetter; + struct BusLogic_PCIHostAdapterInformation PCIHostAdapterInformation; + struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest; + struct BusLogic_AutoSCSIData AutoSCSIData; + union BusLogic_GeometryRegister GeometryRegister; + unsigned char RequestedReplyLength; unsigned char *TargetPointer, Character; int TargetID, i; /* @@ -1552,7 +1549,7 @@ */ if (BusLogic_FlashPointHostAdapterP(HostAdapter)) { - FlashPoint_Info_T *FlashPointInfo = &HostAdapter->FlashPointInfo; + struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo; TargetPointer = HostAdapter->ModelName; *TargetPointer++ = 'B'; *TargetPointer++ = 'T'; @@ -1759,7 +1756,7 @@ */ GeometryRegister.All = BusLogic_ReadGeometryRegister(HostAdapter); HostAdapter->ExtendedTranslationEnabled = - GeometryRegister.Bits.ExtendedTranslationEnabled; + GeometryRegister.gr.ExtendedTranslationEnabled; /* Save the Scatter Gather Limits, Level Sensitive Interrupt flag, Wide SCSI flag, Differential SCSI flag, SCAM Supported flag, and @@ -2024,17 +2021,7 @@ HostAdapter->DriverOptions->TaggedQueuingPermittedMask) | (HostAdapter->TaggedQueuingPermitted & ~HostAdapter->DriverOptions->TaggedQueuingPermittedMask); - /* - Select appropriate values for the Error Recovery Strategy array - either from a BusLogic Driver Options specification, or using - BusLogic_ErrorRecovery_Default. - */ - for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++) - if (HostAdapter->DriverOptions != NULL) - HostAdapter->ErrorRecoveryStrategy[TargetID] = - HostAdapter->DriverOptions->ErrorRecoveryStrategy[TargetID]; - else HostAdapter->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_Default; + /* Select an appropriate value for Bus Settle Time either from a BusLogic Driver Options specification, or from BusLogic_DefaultBusSettleTime. @@ -2055,25 +2042,22 @@ Host Adapter. */ -static boolean BusLogic_ReportHostAdapterConfiguration(BusLogic_HostAdapter_T - *HostAdapter) +static boolean __init BusLogic_ReportHostAdapterConfiguration(struct BusLogic_HostAdapter + *HostAdapter) { unsigned short AllTargetsMask = (1 << HostAdapter->MaxTargetDevices) - 1; unsigned short SynchronousPermitted, FastPermitted; unsigned short UltraPermitted, WidePermitted; unsigned short DisconnectPermitted, TaggedQueuingPermitted; boolean CommonSynchronousNegotiation, CommonTaggedQueueDepth; - boolean CommonErrorRecovery; char SynchronousString[BusLogic_MaxTargetDevices+1]; char WideString[BusLogic_MaxTargetDevices+1]; char DisconnectString[BusLogic_MaxTargetDevices+1]; char TaggedQueuingString[BusLogic_MaxTargetDevices+1]; - char ErrorRecoveryString[BusLogic_MaxTargetDevices+1]; char *SynchronousMessage = SynchronousString; char *WideMessage = WideString; char *DisconnectMessage = DisconnectString; char *TaggedQueuingMessage = TaggedQueuingString; - char *ErrorRecoveryMessage = ErrorRecoveryString; int TargetID; BusLogic_Info("Configuring BusLogic Model %s %s%s%s%s SCSI Host Adapter\n", HostAdapter, HostAdapter->ModelName, @@ -2241,30 +2225,6 @@ else BusLogic_Info("Individual", HostAdapter); BusLogic_Info(", Untagged Queue Depth: %d\n", HostAdapter, HostAdapter->UntaggedQueueDepth); - CommonErrorRecovery = true; - for (TargetID = 1; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - if (HostAdapter->ErrorRecoveryStrategy[TargetID] != - HostAdapter->ErrorRecoveryStrategy[0]) - { - CommonErrorRecovery = false; - break; - } - if (CommonErrorRecovery) - ErrorRecoveryMessage = - BusLogic_ErrorRecoveryStrategyNames[ - HostAdapter->ErrorRecoveryStrategy[0]]; - else - { - for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - ErrorRecoveryString[TargetID] = - BusLogic_ErrorRecoveryStrategyLetters[ - HostAdapter->ErrorRecoveryStrategy[TargetID]]; - ErrorRecoveryString[HostAdapter->SCSI_ID] = '#'; - ErrorRecoveryString[HostAdapter->MaxTargetDevices] = '\0'; - } - BusLogic_Info(" Error Recovery Strategy: %s, SCSI Bus Reset: %s\n", - HostAdapter, ErrorRecoveryMessage, - (HostAdapter->BusResetEnabled ? "Enabled" : "Disabled")); if (HostAdapter->TerminationInfoValid) { if (HostAdapter->HostWideSCSI) @@ -2297,7 +2257,7 @@ Host Adapter. */ -static boolean BusLogic_AcquireResources(BusLogic_HostAdapter_T *HostAdapter) +static boolean __init BusLogic_AcquireResources(struct BusLogic_HostAdapter *HostAdapter) { if (HostAdapter->IRQ_Channel == 0) { @@ -2344,7 +2304,7 @@ by BusLogic_AcquireResources. */ -static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *HostAdapter) +static void BusLogic_ReleaseResources(struct BusLogic_HostAdapter *HostAdapter) { /* Release shared access to the IRQ Channel. @@ -2375,12 +2335,12 @@ of the Host Adapter from its initial power on or hard reset state. */ -static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T +static boolean BusLogic_InitializeHostAdapter(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ExtendedMailboxRequest_T ExtendedMailboxRequest; - BusLogic_RoundRobinModeRequest_T RoundRobinModeRequest; - BusLogic_SetCCBFormatRequest_T SetCCBFormatRequest; + struct BusLogic_ExtendedMailboxRequest ExtendedMailboxRequest; + enum BusLogic_RoundRobinModeRequest RoundRobinModeRequest; + enum BusLogic_SetCCBFormatRequest SetCCBFormatRequest; int TargetID; /* Initialize the pointers to the first and last CCBs that are queued for @@ -2409,18 +2369,18 @@ Initialize the Outgoing and Incoming Mailbox pointers. */ HostAdapter->MailboxSize = HostAdapter->MailboxCount * - (sizeof(BusLogic_OutgoingMailbox_T) + sizeof(BusLogic_IncomingMailbox_T)); + (sizeof(struct BusLogic_OutgoingMailbox) + sizeof(struct BusLogic_IncomingMailbox)); HostAdapter->MailboxSpace = pci_alloc_consistent(HostAdapter->PCI_Device, HostAdapter->MailboxSize, &HostAdapter->MailboxSpaceHandle); if (HostAdapter->MailboxSpace == NULL) return BusLogic_Failure(HostAdapter, "MAILBOX ALLOCATION"); HostAdapter->FirstOutgoingMailbox = - (BusLogic_OutgoingMailbox_T *) HostAdapter->MailboxSpace; + (struct BusLogic_OutgoingMailbox *) HostAdapter->MailboxSpace; HostAdapter->LastOutgoingMailbox = HostAdapter->FirstOutgoingMailbox + HostAdapter->MailboxCount - 1; HostAdapter->NextOutgoingMailbox = HostAdapter->FirstOutgoingMailbox; HostAdapter->FirstIncomingMailbox = - (BusLogic_IncomingMailbox_T *) (HostAdapter->LastOutgoingMailbox + 1); + (struct BusLogic_IncomingMailbox *) (HostAdapter->LastOutgoingMailbox + 1); HostAdapter->LastIncomingMailbox = HostAdapter->FirstIncomingMailbox + HostAdapter->MailboxCount - 1; HostAdapter->NextIncomingMailbox = HostAdapter->FirstIncomingMailbox; @@ -2429,15 +2389,15 @@ Initialize the Outgoing and Incoming Mailbox structures. */ memset(HostAdapter->FirstOutgoingMailbox, 0, - HostAdapter->MailboxCount * sizeof(BusLogic_OutgoingMailbox_T)); + HostAdapter->MailboxCount * sizeof(struct BusLogic_OutgoingMailbox)); memset(HostAdapter->FirstIncomingMailbox, 0, - HostAdapter->MailboxCount * sizeof(BusLogic_IncomingMailbox_T)); + HostAdapter->MailboxCount * sizeof(struct BusLogic_IncomingMailbox)); /* Initialize the Host Adapter's Pointer to the Outgoing/Incoming Mailboxes. */ ExtendedMailboxRequest.MailboxCount = HostAdapter->MailboxCount; ExtendedMailboxRequest.BaseMailboxAddress = - (BusLogic_BusAddress_T) HostAdapter->MailboxSpaceHandle; + (u32) HostAdapter->MailboxSpaceHandle; if (BusLogic_Command(HostAdapter, BusLogic_InitializeExtendedMailbox, &ExtendedMailboxRequest, sizeof(ExtendedMailboxRequest), NULL, 0) < 0) @@ -2494,14 +2454,14 @@ through Host Adapter. */ -static boolean BusLogic_TargetDeviceInquiry(BusLogic_HostAdapter_T - *HostAdapter) +static boolean __init BusLogic_TargetDeviceInquiry(struct BusLogic_HostAdapter + *HostAdapter) { - BusLogic_InstalledDevices_T InstalledDevices; - BusLogic_InstalledDevices8_T InstalledDevicesID0to7; - BusLogic_SetupInformation_T SetupInformation; - BusLogic_SynchronousPeriod_T SynchronousPeriod; - BusLogic_RequestedReplyLength_T RequestedReplyLength; + u16 InstalledDevices; + u8 InstalledDevicesID0to7[8]; + struct BusLogic_SetupInformation SetupInformation; + u8 SynchronousPeriod[BusLogic_MaxTargetDevices]; + unsigned char RequestedReplyLength; int TargetID; /* Wait a few seconds between the Host Adapter Hard Reset which initiates @@ -2530,6 +2490,15 @@ */ if (strcmp(HostAdapter->FirmwareVersion, "4.25") >= 0) { + + /* + * Issue a Inquire Target Devices command. Inquire Target Devices only + * tests Logical Unit 0 of each Target Device unlike the Inquire Installed + * Devices commands which test Logical Units 0 - 7. Two bytes are + * returned, where byte 0 bit 0 set indicates that Target Device 0 exists, + * and so on. + */ + if (BusLogic_Command(HostAdapter, BusLogic_InquireTargetDevices, NULL, 0, &InstalledDevices, sizeof(InstalledDevices)) != sizeof(InstalledDevices)) @@ -2540,6 +2509,13 @@ } else { + + /* + * Issue an Inquire Installed Devices command. For each Target Device, + * a byte is returned where bit 0 set indicates that Logical Unit 0 + * exists, bit 1 set indicates that Logical Unit 1 exists, and so on. + */ + if (BusLogic_Command(HostAdapter, BusLogic_InquireInstalledDevicesID0to7, NULL, 0, &InstalledDevicesID0to7, sizeof(InstalledDevicesID0to7)) @@ -2577,6 +2553,12 @@ */ if (HostAdapter->FirmwareVersion[0] >= '3') { + + /* Issue a Inquire Synchronous Period command. For each Target Device, + * a byte is returned which represents the Synchronous Transfer Period + * in units of 10 nanoseconds. + */ + RequestedReplyLength = sizeof(SynchronousPeriod); if (BusLogic_Command(HostAdapter, BusLogic_InquireSynchronousPeriod, &RequestedReplyLength, sizeof(RequestedReplyLength), @@ -2598,84 +2580,6 @@ return true; } - -/* - BusLogic_ReportTargetDeviceInfo reports about the Target Devices accessible - through Host Adapter. -*/ - -/*static void BusLogic_ReportTargetDeviceInfo(BusLogic_HostAdapter_T - *HostAdapter) -{ - int TargetID; -*/ /* - Inhibit the Target Device Inquiry and Reporting if requested. - */ -/* if (BusLogic_MultiMasterHostAdapterP(HostAdapter) && - HostAdapter->DriverOptions != NULL && - HostAdapter->DriverOptions->LocalOptions.InhibitTargetInquiry) - return; -*/ /* - Report on the Target Devices found. - */ -/* for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; - if (TargetFlags->TargetExists && !TargetFlags->TargetInfoReported) - { - int SynchronousTransferRate = 0; - if (BusLogic_FlashPointHostAdapterP(HostAdapter)) - { - unsigned char WideTransfersActive; - FlashPoint_InquireTargetInfo( - HostAdapter->CardHandle, TargetID, - &HostAdapter->SynchronousPeriod[TargetID], - &HostAdapter->SynchronousOffset[TargetID], - &WideTransfersActive); - TargetFlags->WideTransfersActive = WideTransfersActive; - } - else if (TargetFlags->WideTransfersSupported && - (HostAdapter->WidePermitted & (1 << TargetID)) && - strcmp(HostAdapter->FirmwareVersion, "5.06L") < 0) - TargetFlags->WideTransfersActive = true; - if (HostAdapter->SynchronousPeriod[TargetID] > 0) - SynchronousTransferRate = - 100000 / HostAdapter->SynchronousPeriod[TargetID]; - if (TargetFlags->WideTransfersActive) - SynchronousTransferRate <<= 1; - if (SynchronousTransferRate >= 9950) - { - SynchronousTransferRate = (SynchronousTransferRate + 50) / 100; - BusLogic_Info("Target %d: Queue Depth %d, %sSynchronous at " - "%d.%01d MB/sec, offset %d\n", - HostAdapter, TargetID, - HostAdapter->QueueDepth[TargetID], - (TargetFlags->WideTransfersActive ? "Wide " : ""), - SynchronousTransferRate / 10, - SynchronousTransferRate % 10, - HostAdapter->SynchronousOffset[TargetID]); - } - else if (SynchronousTransferRate > 0) - { - SynchronousTransferRate = (SynchronousTransferRate + 5) / 10; - BusLogic_Info("Target %d: Queue Depth %d, %sSynchronous at " - "%d.%02d MB/sec, offset %d\n", - HostAdapter, TargetID, - HostAdapter->QueueDepth[TargetID], - (TargetFlags->WideTransfersActive ? "Wide " : ""), - SynchronousTransferRate / 100, - SynchronousTransferRate % 100, - HostAdapter->SynchronousOffset[TargetID]); - } - else BusLogic_Info("Target %d: Queue Depth %d, Asynchronous\n", - HostAdapter, TargetID, - HostAdapter->QueueDepth[TargetID]); - TargetFlags->TargetInfoReported = true; - } - } -} -*/ - /* BusLogic_InitializeHostStructure initializes the fields in the SCSI Host structure. The base, io_port, n_io_ports, irq, and dma_channel fields in the @@ -2685,9 +2589,9 @@ through explicit acquisition and release of the Host Adapter's Lock. */ -static void BusLogic_InitializeHostStructure(BusLogic_HostAdapter_T - *HostAdapter, - SCSI_Host_T *Host) +static void __init BusLogic_InitializeHostStructure(struct BusLogic_HostAdapter + *HostAdapter, + struct Scsi_Host *Host) { Host->max_id = HostAdapter->MaxTargetDevices; Host->max_lun = HostAdapter->MaxLogicalUnits; @@ -2708,10 +2612,10 @@ but instead get called for each device, we have to do things a bit differently. */ -int BusLogic_SlaveConfigure(SCSI_Device_T *Device) +static int BusLogic_SlaveConfigure(struct scsi_device *Device) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Device->host->hostdata; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) Device->host->hostdata; int TargetID = Device->id; int QueueDepth = HostAdapter->QueueDepth[TargetID]; @@ -2745,85 +2649,6 @@ } /* - BusLogic_SelectQueueDepths selects Queue Depths for each Target Device based - on the Host Adapter's Total Queue Depth and the number, type, speed, and - capabilities of the Target Devices. When called for the last Host Adapter, - it reports on the Target Device Information for all BusLogic Host Adapters - since all the Target Devices have now been probed. -*/ - -/* static void BusLogic_SelectQueueDepths(SCSI_Host_T *Host, - SCSI_Device_T *DeviceList) -{ - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Host->hostdata; - int TaggedDeviceCount = 0, AutomaticTaggedDeviceCount = 0; - int UntaggedDeviceCount = 0, AutomaticTaggedQueueDepth = 0; - int AllocatedQueueDepth = 0; - SCSI_Device_T *Device; - int TargetID; - for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - if (HostAdapter->TargetFlags[TargetID].TargetExists) - { - int QueueDepth = HostAdapter->QueueDepth[TargetID]; - if (HostAdapter->TargetFlags[TargetID].TaggedQueuingSupported && - (HostAdapter->TaggedQueuingPermitted & (1 << TargetID))) - { - TaggedDeviceCount++; - if (QueueDepth == 0) AutomaticTaggedDeviceCount++; - } - else - { - UntaggedDeviceCount++; - if (QueueDepth == 0 || - QueueDepth > HostAdapter->UntaggedQueueDepth) - { - QueueDepth = HostAdapter->UntaggedQueueDepth; - HostAdapter->QueueDepth[TargetID] = QueueDepth; - } - } - AllocatedQueueDepth += QueueDepth; - if (QueueDepth == 1) - HostAdapter->TaggedQueuingPermitted &= ~(1 << TargetID); - } - HostAdapter->TargetDeviceCount = TaggedDeviceCount + UntaggedDeviceCount; - if (AutomaticTaggedDeviceCount > 0) - { - AutomaticTaggedQueueDepth = - (HostAdapter->HostAdapterQueueDepth - AllocatedQueueDepth) - / AutomaticTaggedDeviceCount; - if (AutomaticTaggedQueueDepth > BusLogic_MaxAutomaticTaggedQueueDepth) - AutomaticTaggedQueueDepth = BusLogic_MaxAutomaticTaggedQueueDepth; - if (AutomaticTaggedQueueDepth < BusLogic_MinAutomaticTaggedQueueDepth) - AutomaticTaggedQueueDepth = BusLogic_MinAutomaticTaggedQueueDepth; - for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - if (HostAdapter->TargetFlags[TargetID].TargetExists && - HostAdapter->QueueDepth[TargetID] == 0) - { - AllocatedQueueDepth += AutomaticTaggedQueueDepth; - HostAdapter->QueueDepth[TargetID] = AutomaticTaggedQueueDepth; - } - } - for (Device = DeviceList; Device != NULL; Device = Device->next) - if (Device->host == Host) - Device->queue_depth = HostAdapter->QueueDepth[Device->id]; -*/ /* Allocate an extra CCB for each Target Device for a Bus Device Reset. */ -/* AllocatedQueueDepth += HostAdapter->TargetDeviceCount; - if (AllocatedQueueDepth > HostAdapter->DriverQueueDepth) - AllocatedQueueDepth = HostAdapter->DriverQueueDepth; - BusLogic_CreateAdditionalCCBs(HostAdapter, - AllocatedQueueDepth - - HostAdapter->AllocatedCCBs, - false); - if (HostAdapter == BusLogic_LastRegisteredHostAdapter) - for (HostAdapter = BusLogic_FirstRegisteredHostAdapter; - HostAdapter != NULL; - HostAdapter = HostAdapter->Next) - BusLogic_ReportTargetDeviceInfo(HostAdapter); -} -*/ - -/* BusLogic_DetectHostAdapter probes for BusLogic Host Adapters at the standard I/O Addresses where they may be located, initializing, registering, and reporting the configuration of each BusLogic Host Adapter it finds. It @@ -2831,13 +2656,13 @@ registered. */ -int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *HostTemplate) +static int __init BusLogic_DetectHostAdapter(struct scsi_host_template *HostTemplate) { int BusLogicHostAdapterCount = 0, DriverOptionsIndex = 0, ProbeIndex; - BusLogic_HostAdapter_T *PrototypeHostAdapter; + struct BusLogic_HostAdapter *PrototypeHostAdapter; if (BusLogic_ProbeOptions.NoProbe) return 0; - BusLogic_ProbeInfoList = (BusLogic_ProbeInfo_T *) - kmalloc(BusLogic_MaxHostAdapters * sizeof(BusLogic_ProbeInfo_T), + BusLogic_ProbeInfoList = (struct BusLogic_ProbeInfo *) + kmalloc(BusLogic_MaxHostAdapters * sizeof(struct BusLogic_ProbeInfo), GFP_ATOMIC); if (BusLogic_ProbeInfoList == NULL) { @@ -2845,9 +2670,9 @@ return 0; } memset(BusLogic_ProbeInfoList, 0, - BusLogic_MaxHostAdapters * sizeof(BusLogic_ProbeInfo_T)); - PrototypeHostAdapter = (BusLogic_HostAdapter_T *) - kmalloc(sizeof(BusLogic_HostAdapter_T), GFP_ATOMIC); + BusLogic_MaxHostAdapters * sizeof(struct BusLogic_ProbeInfo)); + PrototypeHostAdapter = (struct BusLogic_HostAdapter *) + kmalloc(sizeof(struct BusLogic_HostAdapter), GFP_ATOMIC); if (PrototypeHostAdapter == NULL) { kfree(BusLogic_ProbeInfoList); @@ -2855,7 +2680,7 @@ "Host Adapter\n", NULL); return 0; } - memset(PrototypeHostAdapter, 0, sizeof(BusLogic_HostAdapter_T)); + memset(PrototypeHostAdapter, 0, sizeof(struct BusLogic_HostAdapter)); #ifdef MODULE if (BusLogic != NULL) BusLogic_Setup(BusLogic); @@ -2863,11 +2688,11 @@ BusLogic_InitializeProbeInfoList(PrototypeHostAdapter); for (ProbeIndex = 0; ProbeIndex < BusLogic_ProbeInfoCount; ProbeIndex++) { - BusLogic_ProbeInfo_T *ProbeInfo = &BusLogic_ProbeInfoList[ProbeIndex]; - BusLogic_HostAdapter_T *HostAdapter = PrototypeHostAdapter; - SCSI_Host_T *Host; + struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[ProbeIndex]; + struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter; + struct Scsi_Host *Host; if (ProbeInfo->IO_Address == 0) continue; - memset(HostAdapter, 0, sizeof(BusLogic_HostAdapter_T)); + memset(HostAdapter, 0, sizeof(struct BusLogic_HostAdapter)); HostAdapter->HostAdapterType = ProbeInfo->HostAdapterType; HostAdapter->HostAdapterBusType = ProbeInfo->HostAdapterBusType; HostAdapter->IO_Address = ProbeInfo->IO_Address; @@ -2914,21 +2739,18 @@ /* Register the SCSI Host structure. */ - Host = scsi_register(HostTemplate, sizeof(BusLogic_HostAdapter_T)); + + Host = scsi_host_alloc(HostTemplate, sizeof(struct BusLogic_HostAdapter)); if(Host==NULL) { release_region(HostAdapter->IO_Address, HostAdapter->AddressCount); continue; } - HostAdapter = (BusLogic_HostAdapter_T *) Host->hostdata; - memcpy(HostAdapter, PrototypeHostAdapter, sizeof(BusLogic_HostAdapter_T)); + HostAdapter = (struct BusLogic_HostAdapter *) Host->hostdata; + memcpy(HostAdapter, PrototypeHostAdapter, sizeof(struct BusLogic_HostAdapter)); HostAdapter->SCSI_Host = Host; HostAdapter->HostNumber = Host->host_no; /* - * This function is deprecated - Host->select_queue_depths = BusLogic_SelectQueueDepths; - */ - /* Add Host Adapter to the end of the list of registered BusLogic Host Adapters. */ @@ -2963,10 +2785,12 @@ BusLogic_DestroyCCBs(HostAdapter); BusLogic_ReleaseResources(HostAdapter); BusLogic_UnregisterHostAdapter(HostAdapter); - scsi_unregister(Host); + scsi_host_put(Host); } else { BusLogic_InitializeHostStructure(HostAdapter, Host); + scsi_add_host(Host, NULL); + scsi_scan_host(Host); BusLogicHostAdapterCount++; } } @@ -2983,7 +2807,7 @@ BusLogic_DestroyCCBs(HostAdapter); BusLogic_ReleaseResources(HostAdapter); BusLogic_UnregisterHostAdapter(HostAdapter); - scsi_unregister(Host); + scsi_host_put(Host); } } kfree(PrototypeHostAdapter); @@ -2999,10 +2823,10 @@ unregisters the BusLogic Host Adapter. */ -int BusLogic_ReleaseHostAdapter(SCSI_Host_T *Host) +static int __exit BusLogic_ReleaseHostAdapter(struct Scsi_Host *Host) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Host->hostdata; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) Host->hostdata; /* FlashPoint Host Adapters must first be released by the FlashPoint SCCB Manager. @@ -3031,9 +2855,9 @@ BusLogic_QueueCompletedCCB queues CCB for completion processing. */ -static void BusLogic_QueueCompletedCCB(BusLogic_CCB_T *CCB) +static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *CCB) { - BusLogic_HostAdapter_T *HostAdapter = CCB->HostAdapter; + struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter; CCB->Status = BusLogic_CCB_Completed; CCB->Next = NULL; if (HostAdapter->FirstCompletedCCB == NULL) @@ -3055,10 +2879,10 @@ the Host Adapter Status and Target Device Status. */ -static int BusLogic_ComputeResultCode(BusLogic_HostAdapter_T *HostAdapter, - BusLogic_HostAdapterStatus_T +static int BusLogic_ComputeResultCode(struct BusLogic_HostAdapter *HostAdapter, + enum BusLogic_HostAdapterStatus HostAdapterStatus, - BusLogic_TargetDeviceStatus_T + enum BusLogic_TargetDeviceStatus TargetDeviceStatus) { int HostStatus; @@ -3114,7 +2938,7 @@ Incoming Mailbox entries for completion processing. */ -static void BusLogic_ScanIncomingMailboxes(BusLogic_HostAdapter_T *HostAdapter) +static void BusLogic_ScanIncomingMailboxes(struct BusLogic_HostAdapter *HostAdapter) { /* Scan through the Incoming Mailboxes in Strict Round Robin fashion, saving @@ -3128,9 +2952,9 @@ was processed, and so completion processing has already occurred and no further action should be taken. */ - BusLogic_IncomingMailbox_T *NextIncomingMailbox = + struct BusLogic_IncomingMailbox *NextIncomingMailbox = HostAdapter->NextIncomingMailbox; - BusLogic_CompletionCode_T CompletionCode; + enum BusLogic_CompletionCode CompletionCode; while ((CompletionCode = NextIncomingMailbox->CompletionCode) != BusLogic_IncomingMailboxFree) { @@ -3141,7 +2965,7 @@ replace bus_to_virt() or else this code is going to become very innefficient. */ - BusLogic_CCB_T *CCB = (BusLogic_CCB_T *) + struct BusLogic_CCB *CCB = (struct BusLogic_CCB *) Bus_to_Virtual(NextIncomingMailbox->CCB); if (CompletionCode != BusLogic_AbortedCommandNotFound) { @@ -3182,14 +3006,14 @@ should already have been acquired by the caller. */ -static void BusLogic_ProcessCompletedCCBs(BusLogic_HostAdapter_T *HostAdapter) +static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapter) { if (HostAdapter->ProcessCompletedCCBsActive) return; HostAdapter->ProcessCompletedCCBsActive = true; while (HostAdapter->FirstCompletedCCB != NULL) { - BusLogic_CCB_T *CCB = HostAdapter->FirstCompletedCCB; - SCSI_Command_T *Command = CCB->Command; + struct BusLogic_CCB *CCB = HostAdapter->FirstCompletedCCB; + struct scsi_cmnd *Command = CCB->Command; HostAdapter->FirstCompletedCCB = CCB->Next; if (HostAdapter->FirstCompletedCCB == NULL) HostAdapter->LastCompletedCCB = NULL; @@ -3221,7 +3045,7 @@ */ while (Command != NULL) { - SCSI_Command_T *NextCommand = Command->reset_chain; + struct scsi_cmnd *NextCommand = Command->reset_chain; Command->reset_chain = NULL; Command->result = DID_RESET << 16; Command->scsi_done(Command); @@ -3312,10 +3136,10 @@ if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) { - BusLogic_TargetFlags_T *TargetFlags = + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID]; - SCSI_Inquiry_T *InquiryResult = - (SCSI_Inquiry_T *) Command->request_buffer; + struct SCSI_Inquiry *InquiryResult = + (struct SCSI_Inquiry *) Command->request_buffer; TargetFlags->TargetExists = true; TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue; TargetFlags->WideTransfersSupported = InquiryResult->WBus16; @@ -3341,11 +3165,11 @@ static irqreturn_t BusLogic_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, - Registers_T *InterruptRegisters) + struct pt_regs *InterruptRegisters) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) DeviceIdentifier; - ProcessorFlags_T ProcessorFlags; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) DeviceIdentifier; + unsigned long ProcessorFlags; /* Acquire exclusive access to Host Adapter. */ @@ -3355,12 +3179,12 @@ */ if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) { - BusLogic_InterruptRegister_T InterruptRegister; + union BusLogic_InterruptRegister InterruptRegister; /* Read the Host Adapter Interrupt Register. */ InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); - if (InterruptRegister.Bits.InterruptValid) + if (InterruptRegister.ir.InterruptValid) { /* Acknowledge the interrupt and reset the Host Adapter @@ -3373,11 +3197,11 @@ and Outgoing Mailbox Available Interrupts are ignored, as they are never enabled. */ - if (InterruptRegister.Bits.ExternalBusReset) + if (InterruptRegister.ir.ExternalBusReset) HostAdapter->HostAdapterExternalReset = true; - else if (InterruptRegister.Bits.IncomingMailboxLoaded) + else if (InterruptRegister.ir.IncomingMailboxLoaded) BusLogic_ScanIncomingMailboxes(HostAdapter); - else if (InterruptRegister.Bits.CommandComplete) + else if (InterruptRegister.ir.CommandComplete) HostAdapter->HostAdapterCommandCompleted = true; } } @@ -3409,11 +3233,20 @@ /* Reset the Host Adapter if requested. */ - if (HostAdapter->HostAdapterExternalReset || - HostAdapter->HostAdapterInternalError) + if (HostAdapter->HostAdapterExternalReset) { - BusLogic_ResetHostAdapter(HostAdapter, NULL, 0); + BusLogic_Warning("Resetting %s due to External SCSI Bus Reset\n", + HostAdapter, HostAdapter->FullModelName); + BusLogic_IncrementErrorCounter(&HostAdapter->ExternalHostAdapterResets); + BusLogic_ResetHostAdapter(HostAdapter, false); HostAdapter->HostAdapterExternalReset = false; + } + else if (HostAdapter->HostAdapterInternalError) + { + BusLogic_Warning("Resetting %s due to Host Adapter Internal Error\n", + HostAdapter, HostAdapter->FullModelName); + BusLogic_IncrementErrorCounter(&HostAdapter->HostAdapterInternalErrors); + BusLogic_ResetHostAdapter(HostAdapter, true); HostAdapter->HostAdapterInternalError = false; } /* @@ -3430,12 +3263,12 @@ already have been acquired by the caller. */ -static boolean BusLogic_WriteOutgoingMailbox(BusLogic_HostAdapter_T +static boolean BusLogic_WriteOutgoingMailbox(struct BusLogic_HostAdapter *HostAdapter, - BusLogic_ActionCode_T ActionCode, - BusLogic_CCB_T *CCB) + enum BusLogic_ActionCode ActionCode, + struct BusLogic_CCB *CCB) { - BusLogic_OutgoingMailbox_T *NextOutgoingMailbox; + struct BusLogic_OutgoingMailbox *NextOutgoingMailbox; NextOutgoingMailbox = HostAdapter->NextOutgoingMailbox; if (NextOutgoingMailbox->ActionCode == BusLogic_OutgoingMailboxFree) { @@ -3466,13 +3299,14 @@ static int BusLogic_host_reset(Scsi_Cmnd *SCpnt) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) SCpnt->device->host->hostdata; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) SCpnt->device->host->hostdata; - /* printk("BusLogic_host_reset\n"); */ - HostAdapter->HostAdapterExternalReset = 1; - BusLogic_ResetHostAdapter(HostAdapter, NULL, 0); - return SUCCESS; + unsigned int id = SCpnt->device->id; + struct BusLogic_TargetStatistics *stats = &HostAdapter->TargetStatistics[id]; + BusLogic_IncrementErrorCounter(&stats->HostAdapterResetsRequested); + + return BusLogic_ResetHostAdapter(HostAdapter, false); } /* @@ -3480,14 +3314,14 @@ Outgoing Mailbox for execution by the associated Host Adapter. */ -int BusLogic_QueueCommand(SCSI_Command_T *Command, - void (*CompletionRoutine)(SCSI_Command_T *)) +static int BusLogic_QueueCommand(struct scsi_cmnd *Command, + void (*CompletionRoutine)(struct scsi_cmnd *)) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Command->device->host->hostdata; - BusLogic_TargetFlags_T *TargetFlags = + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) Command->device->host->hostdata; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[Command->device->id]; - BusLogic_TargetStatistics_T *TargetStatistics = + struct BusLogic_TargetStatistics *TargetStatistics = HostAdapter->TargetStatistics; unsigned char *CDB = Command->cmnd; int CDB_Length = Command->cmd_len; @@ -3496,7 +3330,7 @@ void *BufferPointer = Command->request_buffer; int BufferLength = Command->request_bufflen; int SegmentCount = Command->use_sg; - BusLogic_CCB_T *CCB; + struct BusLogic_CCB *CCB; /* SCSI REQUEST_SENSE commands will be executed automatically by the Host Adapter for any errors, so they should not be executed explicitly unless @@ -3541,13 +3375,13 @@ } else if (SegmentCount != 0) { - SCSI_ScatterList_T *ScatterList = (SCSI_ScatterList_T *) BufferPointer; + struct scatterlist *ScatterList = (struct scatterlist *) BufferPointer; int Segment, Count; Count = pci_map_sg(HostAdapter->PCI_Device, ScatterList, SegmentCount, scsi_to_pci_dma_dir(Command->sc_data_direction)); CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather; - CCB->DataLength = Count * sizeof(BusLogic_ScatterGatherSegment_T); + CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment); if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) CCB->DataPointer = (unsigned int)CCB->DMA_Handle + ((unsigned long)&CCB->ScatterGatherList - @@ -3625,7 +3459,7 @@ } if (TargetFlags->TaggedQueuingActive) { - BusLogic_QueueTag_T QueueTag = BusLogic_SimpleQueueTag; + enum BusLogic_QueueTag QueueTag = BusLogic_SimpleQueueTag; /* When using Tagged Queuing with Simple Queue Tags, it appears that disk drive controllers do not guarantee that a queued command will not @@ -3718,14 +3552,13 @@ BusLogic_AbortCommand aborts Command if possible. */ -int BusLogic_AbortCommand(SCSI_Command_T *Command) +static int BusLogic_AbortCommand(struct scsi_cmnd *Command) { - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Command->device->host->hostdata; + struct BusLogic_HostAdapter *HostAdapter = + (struct BusLogic_HostAdapter *) Command->device->host->hostdata; int TargetID = Command->device->id; - BusLogic_CCB_T *CCB; - int Result; + struct BusLogic_CCB *CCB; BusLogic_IncrementErrorCounter( &HostAdapter->TargetStatistics[TargetID].CommandAbortsRequested); /* @@ -3735,7 +3568,7 @@ { BusLogic_Warning("Unable to Abort Command to Target %d - " "Already Completed\n", HostAdapter, TargetID); - return SCSI_ABORT_NOT_RUNNING; + return SUCCESS; } /* Attempt to find an Active CCB for this Command. If no Active CCB for this @@ -3747,19 +3580,19 @@ { BusLogic_Warning("Unable to Abort Command to Target %d - " "No CCB Found\n", HostAdapter, TargetID); - return SCSI_ABORT_NOT_RUNNING; + return SUCCESS; } else if (CCB->Status == BusLogic_CCB_Completed) { BusLogic_Warning("Unable to Abort Command to Target %d - " "CCB Completed\n", HostAdapter, TargetID); - return SCSI_ABORT_NOT_RUNNING; + return SUCCESS; } else if (CCB->Status == BusLogic_CCB_Reset) { BusLogic_Warning("Unable to Abort Command to Target %d - " "CCB Reset\n", HostAdapter, TargetID); - return SCSI_ABORT_PENDING; + return SUCCESS; } if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) { @@ -3779,7 +3612,7 @@ BusLogic_Warning("Unable to Abort CCB #%ld to Target %d - " "Abort Tag Not Supported\n", HostAdapter, CCB->SerialNumber, TargetID); - Result = SCSI_ABORT_SNOOZE; + return FAILURE; } else if (BusLogic_WriteOutgoingMailbox( HostAdapter, BusLogic_MailboxAbortCommand, CCB)) @@ -3788,14 +3621,14 @@ HostAdapter, CCB->SerialNumber, TargetID); BusLogic_IncrementErrorCounter( &HostAdapter->TargetStatistics[TargetID].CommandAbortsAttempted); - Result = SCSI_ABORT_PENDING; + return SUCCESS; } else { BusLogic_Warning("Unable to Abort CCB #%ld to Target %d - " "No Outgoing Mailboxes\n", HostAdapter, CCB->SerialNumber, TargetID); - Result = SCSI_ABORT_BUSY; + return FAILURE; } } else @@ -3813,413 +3646,63 @@ BusLogic_QueueCompletedCCB been called, or it may still be pending. */ - Result = SCSI_ABORT_PENDING; if (CCB->Status == BusLogic_CCB_Completed) { BusLogic_ProcessCompletedCCBs(HostAdapter); - Result = SCSI_ABORT_SUCCESS; } + return SUCCESS; } - return Result; + return SUCCESS; } - /* BusLogic_ResetHostAdapter resets Host Adapter if possible, marking all currently executing SCSI Commands as having been Reset. */ -static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, - SCSI_Command_T *Command, - unsigned int ResetFlags) -{ - BusLogic_CCB_T *CCB; - int TargetID, Result; - boolean HardReset; - if (HostAdapter->HostAdapterExternalReset) - { - BusLogic_IncrementErrorCounter(&HostAdapter->ExternalHostAdapterResets); - HardReset = false; - } - else if (HostAdapter->HostAdapterInternalError) - { - BusLogic_IncrementErrorCounter(&HostAdapter->HostAdapterInternalErrors); - HardReset = true; - } - else - { - BusLogic_IncrementErrorCounter( - &HostAdapter->TargetStatistics[Command->device->id] - .HostAdapterResetsRequested); - HardReset = true; - } - /* - If this is an Asynchronous Reset and this Command has already completed, - then no Reset is necessary. - */ - if (ResetFlags & SCSI_RESET_ASYNCHRONOUS) - { - TargetID = Command->device->id; - if (Command->serial_number != Command->serial_number_at_timeout) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "Already Completed or Reset\n", - HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll) - if (CCB->Command == Command) break; - if (CCB == NULL) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "No CCB Found\n", HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - else if (CCB->Status == BusLogic_CCB_Completed) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "CCB Completed\n", HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - else if (CCB->Status == BusLogic_CCB_Reset && - HostAdapter->BusDeviceResetPendingCCB[TargetID] == NULL) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "Reset Pending\n", HostAdapter, TargetID); - Result = SCSI_RESET_PENDING; - goto Done; - } - } - if (Command == NULL) - { - if (HostAdapter->HostAdapterInternalError) - BusLogic_Warning("Resetting %s due to Host Adapter Internal Error\n", - HostAdapter, HostAdapter->FullModelName); - else BusLogic_Warning("Resetting %s due to External SCSI Bus Reset\n", - HostAdapter, HostAdapter->FullModelName); - } - else - { - BusLogic_Warning("Resetting %s due to Target %d\n", HostAdapter, - HostAdapter->FullModelName, Command->device->id); - BusLogic_IncrementErrorCounter( - &HostAdapter->TargetStatistics[Command->device->id] - .HostAdapterResetsAttempted); - } - /* - Attempt to Reset and Reinitialize the Host Adapter. - */ - if (!(BusLogic_HardwareResetHostAdapter(HostAdapter, HardReset) && - BusLogic_InitializeHostAdapter(HostAdapter))) - { - BusLogic_Error("Resetting %s Failed\n", HostAdapter, - HostAdapter->FullModelName); - Result = SCSI_RESET_ERROR; - goto Done; - } - if (Command != NULL) - BusLogic_IncrementErrorCounter( - &HostAdapter->TargetStatistics[Command->device->id] - .HostAdapterResetsCompleted); - /* - Mark all currently executing CCBs as having been Reset. - */ - for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll) - if (CCB->Status == BusLogic_CCB_Active) - CCB->Status = BusLogic_CCB_Reset; - /* - Wait a few seconds between the Host Adapter Hard Reset which initiates - a SCSI Bus Reset and issuing any SCSI Commands. Some SCSI devices get - confused if they receive SCSI Commands too soon after a SCSI Bus Reset. - Note that a timer interrupt may occur here, but all active CCBs have - already been marked Reset and so a reentrant call will return Pending. - */ - if (HardReset) - { - BusLogic_ReleaseHostAdapterLock(HostAdapter); - BusLogic_Delay(HostAdapter->BusSettleTime); - BusLogic_AcquireHostAdapterLock(HostAdapter); - } - /* - If this is a Synchronous Reset, perform completion processing for - the Command being Reset. - */ - if (ResetFlags & SCSI_RESET_SYNCHRONOUS) - { - Command->result = DID_RESET << 16; - Command->scsi_done(Command); - } - /* - Perform completion processing for all CCBs marked as Reset. - */ - for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll) - if (CCB->Status == BusLogic_CCB_Reset) - { - Command = CCB->Command; - BusLogic_DeallocateCCB(CCB); -#if 0 /* this needs to be redone different for new EH */ - while (Command != NULL) - { - SCSI_Command_T *NextCommand = Command->reset_chain; - Command->reset_chain = NULL; - Command->result = DID_RESET << 16; - Command->scsi_done(Command); - Command = NextCommand; - } -#endif - } - for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) - { - HostAdapter->LastResetAttempted[TargetID] = jiffies; - HostAdapter->LastResetCompleted[TargetID] = jiffies; - } - Result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET; -Done: - return Result; -} - -#if 0 /* old-style EH code references a dead struct scsi_cmnd member */ -/* - BusLogic_SendBusDeviceReset sends a Bus Device Reset to the Target - Device associated with Command. -*/ - -static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter, - SCSI_Command_T *Command, - unsigned int ResetFlags) +static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *HostAdapter, + boolean HardReset) { - int TargetID = Command->device->id; - BusLogic_CCB_T *CCB, *XCCB; - int Result = -1; - BusLogic_IncrementErrorCounter( - &HostAdapter->TargetStatistics[TargetID].BusDeviceResetsRequested); - /* - If this is an Asynchronous Reset and this Command has already completed, - then no Reset is necessary. - */ - if (ResetFlags & SCSI_RESET_ASYNCHRONOUS) - { - if (Command->serial_number != Command->serial_number_at_timeout) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "Already Completed\n", HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll) - if (CCB->Command == Command) break; - if (CCB == NULL) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "No CCB Found\n", HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - else if (CCB->Status == BusLogic_CCB_Completed) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "CCB Completed\n", HostAdapter, TargetID); - Result = SCSI_RESET_NOT_RUNNING; - goto Done; - } - else if (CCB->Status == BusLogic_CCB_Reset) - { - BusLogic_Warning("Unable to Reset Command to Target %d - " - "Reset Pending\n", HostAdapter, TargetID); - Result = SCSI_RESET_PENDING; - goto Done; - } - else if (HostAdapter->BusDeviceResetPendingCCB[TargetID] != NULL) - { - BusLogic_Warning("Bus Device Reset already pending to Target %d\n", - HostAdapter, TargetID); - goto Done; - } - } - /* - If this is a Synchronous Reset and a Bus Device Reset is already pending - for this Target Device, do not send a second one. Add this Command to - the list of Commands for which completion processing must be performed - when the Bus Device Reset CCB completes. - */ - if (ResetFlags & SCSI_RESET_SYNCHRONOUS) - if ((CCB = HostAdapter->BusDeviceResetPendingCCB[TargetID]) != NULL) - { - Command->reset_chain = CCB->Command; - CCB->Command = Command; - BusLogic_Warning("Unable to Reset Command to Target %d - " - "Reset Pending\n", HostAdapter, TargetID); - Result = SCSI_RESET_PENDING; - goto Done; - } - if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) - { - /* - MultiMaster Firmware versions prior to 5.xx treat a Bus Device Reset as - a non-tagged command. Since non-tagged commands are not sent by the - Host Adapter until the queue of outstanding tagged commands has - completed, it is effectively impossible to send a Bus Device Reset - while there are tagged commands outstanding. Therefore, in that case a - full Host Adapter Hard Reset and SCSI Bus Reset must be done. - */ - if (HostAdapter->TargetFlags[TargetID].TaggedQueuingActive && - HostAdapter->ActiveCommands[TargetID] > 0 && - HostAdapter->FirmwareVersion[0] < '5') - goto Done; - } - /* - Allocate a CCB from the Host Adapter's free list. In the unlikely event - that there are none available and memory allocation fails, attempt a full - Host Adapter Hard Reset and SCSI Bus Reset. - */ - CCB = BusLogic_AllocateCCB(HostAdapter); - if (CCB == NULL) goto Done; - BusLogic_Warning("Sending Bus Device Reset CCB #%ld to Target %d\n", - HostAdapter, CCB->SerialNumber, TargetID); - CCB->Opcode = BusLogic_BusDeviceReset; - CCB->TargetID = TargetID; - /* - For Synchronous Resets, arrange for the interrupt handler to perform - completion processing for the Command being Reset. - */ - if (ResetFlags & SCSI_RESET_SYNCHRONOUS) - { - Command->reset_chain = NULL; - CCB->Command = Command; - } - if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) - { - /* - Attempt to write an Outgoing Mailbox with the Bus Device Reset CCB. - If sending a Bus Device Reset is impossible, attempt a full Host - Adapter Hard Reset and SCSI Bus Reset. - */ - if (!(BusLogic_WriteOutgoingMailbox( - HostAdapter, BusLogic_MailboxStartCommand, CCB))) - { - BusLogic_Warning("Unable to write Outgoing Mailbox for " - "Bus Device Reset\n", HostAdapter); - BusLogic_DeallocateCCB(CCB); - goto Done; - } - } - else - { - /* - Call the FlashPoint SCCB Manager to start execution of the CCB. - */ - CCB->Status = BusLogic_CCB_Active; - HostAdapter->ActiveCommands[TargetID]++; - FlashPoint_StartCCB(HostAdapter->CardHandle, CCB); - } - /* - If there is a currently executing CCB in the Host Adapter for this Command - (i.e. this is an Asynchronous Reset), then an Incoming Mailbox entry may be - made with a completion code of BusLogic_HostAdapterAssertedBusDeviceReset. - If there is no active CCB for this Command (i.e. this is a Synchronous - Reset), then the Bus Device Reset CCB's Command field will have been set - to the Command so that the interrupt for the completion of the Bus Device - Reset can call the Completion Routine for the Command. On successful - execution of a Bus Device Reset, older firmware versions did return the - pending CCBs with the appropriate completion code, but more recent firmware - versions only return the Bus Device Reset CCB itself. This driver handles - both cases by marking all the currently executing CCBs to this Target - Device as Reset. When the Bus Device Reset CCB is processed by the - interrupt handler, any remaining CCBs marked as Reset will have completion - processing performed. - */ - BusLogic_IncrementErrorCounter( - &HostAdapter->TargetStatistics[TargetID].BusDeviceResetsAttempted); - HostAdapter->BusDeviceResetPendingCCB[TargetID] = CCB; - HostAdapter->LastResetAttempted[TargetID] = jiffies; - for (XCCB = HostAdapter->All_CCBs; XCCB != NULL; XCCB = XCCB->NextAll) - if (XCCB->Status == BusLogic_CCB_Active && XCCB->TargetID == TargetID) - XCCB->Status = BusLogic_CCB_Reset; - /* - FlashPoint Host Adapters may have already completed the Bus Device - Reset and BusLogic_QueueCompletedCCB been called, or it may still be - pending. - */ - Result = SCSI_RESET_PENDING; - if (BusLogic_FlashPointHostAdapterP(HostAdapter)) - if (CCB->Status == BusLogic_CCB_Completed) - { - BusLogic_ProcessCompletedCCBs(HostAdapter); - Result = SCSI_RESET_SUCCESS; - } - /* - If a Bus Device Reset was not possible for some reason, force a full - Host Adapter Hard Reset and SCSI Bus Reset. - */ -Done: - if (Result < 0) - Result = BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags); - return Result; -} - - -/* - BusLogic_ResetCommand takes appropriate action to reset Command. -*/ + struct BusLogic_CCB *CCB; + int TargetID; -int BusLogic_ResetCommand(SCSI_Command_T *Command, unsigned int ResetFlags) -{ - BusLogic_HostAdapter_T *HostAdapter = - (BusLogic_HostAdapter_T *) Command->device->host->hostdata; - int TargetID = Command->device->id; - BusLogic_ErrorRecoveryStrategy_T - ErrorRecoveryStrategy = HostAdapter->ErrorRecoveryStrategy[TargetID]; - /* - Disable Tagged Queuing if it is active for this Target Device and if - it has been less than 10 minutes since the last reset occurred, or since - the system was initialized if no prior resets have occurred. - */ - if (HostAdapter->TargetFlags[TargetID].TaggedQueuingActive && - jiffies - HostAdapter->LastResetCompleted[TargetID] < 10*60*HZ) - { - HostAdapter->TaggedQueuingPermitted &= ~(1 << TargetID); - HostAdapter->TargetFlags[TargetID].TaggedQueuingActive = false; - BusLogic_Warning("Tagged Queuing now disabled for Target %d\n", - HostAdapter, TargetID); - } - switch (ErrorRecoveryStrategy) - { - case BusLogic_ErrorRecovery_Default: - if (ResetFlags & SCSI_RESET_SUGGEST_HOST_RESET) - return BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags); - else if (ResetFlags & SCSI_RESET_SUGGEST_BUS_RESET) - return BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags); - /* Fall through to Bus Device Reset case. */ - case BusLogic_ErrorRecovery_BusDeviceReset: - /* - The Bus Device Reset Error Recovery Strategy only graduates to a Hard - Reset when no commands have completed successfully since the last Bus - Device Reset and it has been at least 100 milliseconds. This prevents - a sequence of commands that all timeout together from immediately - forcing a Hard Reset before the Bus Device Reset has had a chance to - clear the error condition. - */ - if (HostAdapter->TargetFlags[TargetID].CommandSuccessfulFlag || - jiffies - HostAdapter->LastResetAttempted[TargetID] < HZ/10) - { - HostAdapter->TargetFlags[TargetID].CommandSuccessfulFlag = false; - return BusLogic_SendBusDeviceReset(HostAdapter, Command, ResetFlags); + /* + * Attempt to Reset and Reinitialize the Host Adapter. + */ + + if (!(BusLogic_HardwareResetHostAdapter(HostAdapter, HardReset) && + BusLogic_InitializeHostAdapter(HostAdapter))) { + BusLogic_Error("Resetting %s Failed\n", HostAdapter, + HostAdapter->FullModelName); + return FAILURE; + } + + /* + * Deallocate all currently executing CCBs. + */ + + for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll) + if (CCB->Status == BusLogic_CCB_Active) + BusLogic_DeallocateCCB(CCB); + /* + * Wait a few seconds between the Host Adapter Hard Reset which + * initiates a SCSI Bus Reset and issuing any SCSI Commands. Some + * SCSI devices get confused if they receive SCSI Commands too soon + * after a SCSI Bus Reset. + */ + + if (HardReset) { + BusLogic_ReleaseHostAdapterLock(HostAdapter); + BusLogic_Delay(HostAdapter->BusSettleTime); + BusLogic_AcquireHostAdapterLock(HostAdapter); + } + + for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { + HostAdapter->LastResetAttempted[TargetID] = jiffies; + HostAdapter->LastResetCompleted[TargetID] = jiffies; } - /* Fall through to Hard Reset case. */ - case BusLogic_ErrorRecovery_HardReset: - return BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags); - case BusLogic_ErrorRecovery_None: - BusLogic_Warning("Error Recovery for Target %d Suppressed\n", - HostAdapter, TargetID); - break; - } - return SCSI_RESET_PUNT; + return SUCCESS; } -#endif - /* BusLogic_BIOSDiskParameters returns the Heads/Sectors/Cylinders BIOS Disk @@ -4237,12 +3720,12 @@ table, then the translation inferred from the partition table will be used by the BIOS, and a warning may be displayed. */ -unsigned char *scsi_bios_ptable(struct block_device *); -int BusLogic_BIOSDiskParameters(struct scsi_device *sdev, struct block_device *Device, - sector_t capacity, int *Parameters) + +static int BusLogic_BIOSDiskParameters(struct scsi_device *sdev, struct block_device *Device, + sector_t capacity, int *Parameters) { - BusLogic_HostAdapter_T *HostAdapter = (BusLogic_HostAdapter_T *) sdev->host->hostdata; - BIOS_DiskParameters_T *DiskParameters = (BIOS_DiskParameters_T *) Parameters; + struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) sdev->host->hostdata; + struct BIOS_DiskParameters *DiskParameters = (struct BIOS_DiskParameters *) Parameters; unsigned char *buf; if (HostAdapter->ExtendedTranslationEnabled && capacity >= 2*1024*1024 /* 1 GB in 512 byte sectors */) @@ -4274,8 +3757,8 @@ */ if (*(unsigned short *) (buf+64) == 0xAA55) { - PartitionTable_T *FirstPartitionEntry = (PartitionTable_T *) buf; - PartitionTable_T *PartitionEntry = FirstPartitionEntry; + struct partition *FirstPartitionEntry = (struct partition *) buf; + struct partition *PartitionEntry = FirstPartitionEntry; int SavedCylinders = DiskParameters->Cylinders, PartitionNumber; unsigned char PartitionEntryEndHead=0, PartitionEntryEndSector=0; for (PartitionNumber = 0; PartitionNumber < 4; PartitionNumber++) @@ -4337,12 +3820,12 @@ BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/. */ -int BusLogic_ProcDirectoryInfo(struct Scsi_Host *shost, char *ProcBuffer, char **StartPointer, - off_t Offset, int BytesAvailable, - int WriteFlag) +static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *shost, char *ProcBuffer, + char **StartPointer, off_t Offset, + int BytesAvailable, int WriteFlag) { - BusLogic_HostAdapter_T *HostAdapter; - BusLogic_TargetStatistics_T *TargetStatistics; + struct BusLogic_HostAdapter *HostAdapter; + struct BusLogic_TargetStatistics *TargetStatistics; int TargetID, Length; char *Buffer; for (HostAdapter = BusLogic_FirstRegisteredHostAdapter; @@ -4361,7 +3844,7 @@ HostAdapter->ExternalHostAdapterResets = 0; HostAdapter->HostAdapterInternalErrors = 0; memset(TargetStatistics, 0, - BusLogic_MaxTargetDevices * sizeof(BusLogic_TargetStatistics_T)); + BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics)); return 0; } Buffer = HostAdapter->MessageBuffer; @@ -4378,7 +3861,7 @@ ====== ============== =========== ====== ========= =========\n"); for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; if (!TargetFlags->TargetExists) continue; Length += sprintf(&Buffer[Length], " %2d %s", TargetID, @@ -4400,7 +3883,7 @@ ====== ============= ============== =================== ===================\n"); for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; if (!TargetFlags->TargetExists) continue; Length += sprintf(&Buffer[Length], " %2d %9u %9u", TargetID, @@ -4430,7 +3913,7 @@ ====== ======= ========= ========= ========= ========= =========\n"); for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; if (!TargetFlags->TargetExists) continue; Length += sprintf(&Buffer[Length], @@ -4454,7 +3937,7 @@ ====== ======= ========= ========= ========= ========= =========\n"); for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; if (!TargetFlags->TargetExists) continue; Length += sprintf(&Buffer[Length], @@ -4482,7 +3965,7 @@ ====== ===== ===== ===== ===== ===== ===== ===== ===== =====\n"); for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { - BusLogic_TargetFlags_T *TargetFlags = &HostAdapter->TargetFlags[TargetID]; + struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; if (!TargetFlags->TargetExists) continue; Length += sprintf(&Buffer[Length], "\ @@ -4516,9 +3999,9 @@ BusLogic_Message prints Driver Messages. */ -static void BusLogic_Message(BusLogic_MessageLevel_T MessageLevel, +static void BusLogic_Message(enum BusLogic_MessageLevel MessageLevel, char *Format, - BusLogic_HostAdapter_T *HostAdapter, + struct BusLogic_HostAdapter *HostAdapter, ...) { static char Buffer[BusLogic_LineBufferSize]; @@ -4570,7 +4053,7 @@ and updates the pointer if the keyword is recognized and false otherwise. */ -static boolean BusLogic_ParseKeyword(char **StringPointer, char *Keyword) +static boolean __init BusLogic_ParseKeyword(char **StringPointer, char *Keyword) { char *Pointer = *StringPointer; while (*Keyword != '\0') @@ -4609,19 +4092,16 @@ { while (true) { - BusLogic_DriverOptions_T *DriverOptions = + struct BusLogic_DriverOptions *DriverOptions = &BusLogic_DriverOptions[BusLogic_DriverOptionsCount++]; int TargetID; - memset(DriverOptions, 0, sizeof(BusLogic_DriverOptions_T)); - for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++) - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_Default; + memset(DriverOptions, 0, sizeof(struct BusLogic_DriverOptions)); while (*OptionsString != '\0' && *OptionsString != ';') { /* Probing Options. */ if (BusLogic_ParseKeyword(&OptionsString, "IO:")) { - BusLogic_IO_Address_T IO_Address = + unsigned long IO_Address = simple_strtoul(OptionsString, &OptionsString, 0); BusLogic_ProbeOptions.LimitedProbeISA = true; switch (IO_Address) @@ -4763,62 +4243,6 @@ } } } - /* Error Recovery Option. */ - else if (BusLogic_ParseKeyword(&OptionsString, "ErrorRecovery:") || - BusLogic_ParseKeyword(&OptionsString, "ER:")) - { - if (BusLogic_ParseKeyword(&OptionsString, "Default")) - for (TargetID = 0; - TargetID < BusLogic_MaxTargetDevices; - TargetID++) - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_Default; - else if (BusLogic_ParseKeyword(&OptionsString, "HardReset")) - for (TargetID = 0; - TargetID < BusLogic_MaxTargetDevices; - TargetID++) - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_HardReset; - else if (BusLogic_ParseKeyword(&OptionsString, "BusDeviceReset")) - for (TargetID = 0; - TargetID < BusLogic_MaxTargetDevices; - TargetID++) - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_BusDeviceReset; - else if (BusLogic_ParseKeyword(&OptionsString, "None")) - for (TargetID = 0; - TargetID < BusLogic_MaxTargetDevices; - TargetID++) - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_None; - else - for (TargetID = 0; - TargetID < BusLogic_MaxTargetDevices; - TargetID++) - switch (*OptionsString++) - { - case 'D': - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_Default; - break; - case 'H': - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_HardReset; - break; - case 'B': - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_BusDeviceReset; - break; - case 'N': - DriverOptions->ErrorRecoveryStrategy[TargetID] = - BusLogic_ErrorRecovery_None; - break; - default: - OptionsString--; - TargetID = BusLogic_MaxTargetDevices; - break; - } - } /* Miscellaneous Options. */ else if (BusLogic_ParseKeyword(&OptionsString, "BusSettleTime:") || BusLogic_ParseKeyword(&OptionsString, "BST:")) @@ -4887,13 +4311,33 @@ return 1; } +/* + Get it all started +*/ + +static struct scsi_host_template driver_template = { + .module = THIS_MODULE, + .proc_name = "BusLogic", + .proc_info = BusLogic_ProcDirectoryInfo, + .name = "BusLogic", + .info = BusLogic_DriverInfo, + .queuecommand = BusLogic_QueueCommand, + .slave_configure = BusLogic_SlaveConfigure, + .bios_param = BusLogic_BIOSDiskParameters, + .eh_host_reset_handler = BusLogic_host_reset, +#if 0 + .eh_abort_handler = BusLogic_AbortCommand, +#endif + .unchecked_isa_dma = 1, + .max_sectors = 128, + .use_clustering = ENABLE_CLUSTERING, +}; /* BusLogic_Setup handles processing of Kernel Command Line Arguments. */ -static int __init -BusLogic_Setup(char *str) +static int __init BusLogic_Setup(char *str) { int ints[3]; @@ -4909,27 +4353,41 @@ return BusLogic_ParseDriverOptions(str); } -__setup("BusLogic=", BusLogic_Setup); +/* + * Initialization function + */ + +static int __init BusLogic_init(void) { + +#ifdef MODULE + if (BusLogic) + BusLogic_Setup(BusLogic); +#endif + + return BusLogic_DetectHostAdapter(&driver_template) ? 0 : -ENODEV; +} /* - Get it all started -*/ -MODULE_LICENSE("GPL"); + * Exit function. Deletes all hosts associated with this driver. + */ -static SCSI_Host_Template_T driver_template = { - .proc_name = "BusLogic", - .proc_info = BusLogic_ProcDirectoryInfo, - .name = "BusLogic", - .detect = BusLogic_DetectHostAdapter, - .release = BusLogic_ReleaseHostAdapter, - .info = BusLogic_DriverInfo, - .queuecommand = BusLogic_QueueCommand, - .slave_configure = BusLogic_SlaveConfigure, - .bios_param = BusLogic_BIOSDiskParameters, - .eh_host_reset_handler = BusLogic_host_reset, - .unchecked_isa_dma = 1, - .max_sectors = 128, - .use_clustering = ENABLE_CLUSTERING, -}; -#include "scsi_module.c" +static void __exit BusLogic_exit(void) +{ + struct BusLogic_HostAdapter *HostAdapter; + for (HostAdapter = BusLogic_FirstRegisteredHostAdapter; + HostAdapter != NULL; HostAdapter = HostAdapter->Next) { + struct Scsi_Host *host = HostAdapter->SCSI_Host; + scsi_remove_host(host); + + } + for (HostAdapter = BusLogic_FirstRegisteredHostAdapter; + HostAdapter != NULL; HostAdapter = HostAdapter->Next) { + struct Scsi_Host *host = HostAdapter->SCSI_Host; + BusLogic_ReleaseHostAdapter(host); + } +} + +__setup("BusLogic=", BusLogic_Setup); +module_init(BusLogic_init); +module_exit(BusLogic_exit); diff -Nru a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h --- a/drivers/scsi/BusLogic.h Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/BusLogic.h Tue Feb 17 20:00:06 2004 @@ -25,42 +25,14 @@ */ +#ifndef _BUSLOGIC_H +#define _BUSLOGIC_H #include - -/* - Define types for some of the structures that interface with the rest - of the Linux Kernel and SCSI Subsystem. -*/ - -typedef unsigned long ProcessorFlags_T; -typedef struct pt_regs Registers_T; -typedef struct partition PartitionTable_T; -typedef struct pci_dev PCI_Device_T; -typedef Scsi_Host_Template SCSI_Host_Template_T; -typedef struct Scsi_Host SCSI_Host_T; -typedef struct scsi_device SCSI_Device_T; -typedef struct scsi_cmnd SCSI_Command_T; -typedef struct scatterlist SCSI_ScatterList_T; - - -/* - Define prototypes for the BusLogic Driver Interface Functions. -*/ - -extern const char *BusLogic_DriverInfo(SCSI_Host_T *); -extern int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *); -extern int BusLogic_ReleaseHostAdapter(SCSI_Host_T *); -extern int BusLogic_QueueCommand(SCSI_Command_T *, - void (*CompletionRoutine)(SCSI_Command_T *)); -extern int BusLogic_BIOSDiskParameters(struct scsi_device *, - struct block_device *, sector_t, int *); -extern int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int); -extern int BusLogic_SlaveConfigure(SCSI_Device_T *); - -#ifdef BusLogic_DriverVersion - +#ifndef PACKED +#define PACKED __attribute__((packed)) +#endif /* FlashPoint support is only available for the Intel x86 Architecture with @@ -75,8 +47,7 @@ #ifndef CONFIG_PCI #undef CONFIG_SCSI_OMIT_FLASHPOINT #define CONFIG_SCSI_OMIT_FLASHPOINT -#define BusLogic_InitializeProbeInfoListISA \ - BusLogic_InitializeProbeInfoList +#define BusLogic_InitializeProbeInfoListISA BusLogic_InitializeProbeInfoList #endif @@ -157,18 +128,16 @@ Define the Driver Message Levels. */ -typedef enum BusLogic_MessageLevel +enum BusLogic_MessageLevel { BusLogic_AnnounceLevel = 0, BusLogic_InfoLevel = 1, BusLogic_NoticeLevel = 2, BusLogic_WarningLevel = 3, BusLogic_ErrorLevel = 4 -} -BusLogic_MessageLevel_T; +}; -static char - *BusLogic_MessageLevelMap[] = +static char *BusLogic_MessageLevelMap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR }; @@ -197,19 +166,16 @@ of I/O Addresses required by each type. */ -typedef enum +enum BusLogic_HostAdapterType { BusLogic_MultiMaster = 1, BusLogic_FlashPoint = 2 -} -__attribute__ ((packed)) -BusLogic_HostAdapterType_T; +} PACKED; #define BusLogic_MultiMasterAddressCount 4 #define BusLogic_FlashPointAddressCount 256 -static int - BusLogic_HostAdapterAddressCount[3] = +static int BusLogic_HostAdapterAddressCount[3] = { 0, BusLogic_MultiMasterAddressCount, BusLogic_FlashPointAddressCount }; @@ -240,7 +206,7 @@ Define the possible Host Adapter Bus Types. */ -typedef enum +enum BusLogic_HostAdapterBusType { BusLogic_Unknown_Bus = 0, BusLogic_ISA_Bus = 1, @@ -248,116 +214,75 @@ BusLogic_PCI_Bus = 3, BusLogic_VESA_Bus = 4, BusLogic_MCA_Bus = 5 -} -__attribute__ ((packed)) -BusLogic_HostAdapterBusType_T; +} PACKED; -static char - *BusLogic_HostAdapterBusNames[] = +static char *BusLogic_HostAdapterBusNames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" }; -static BusLogic_HostAdapterBusType_T - BusLogic_HostAdapterBusTypes[] = - { BusLogic_VESA_Bus, /* BT-4xx */ - BusLogic_ISA_Bus, /* BT-5xx */ - BusLogic_MCA_Bus, /* BT-6xx */ - BusLogic_EISA_Bus, /* BT-7xx */ - BusLogic_Unknown_Bus, /* BT-8xx */ - BusLogic_PCI_Bus }; /* BT-9xx */ - +static enum BusLogic_HostAdapterBusType BusLogic_HostAdapterBusTypes[] = +{ + BusLogic_VESA_Bus, /* BT-4xx */ + BusLogic_ISA_Bus, /* BT-5xx */ + BusLogic_MCA_Bus, /* BT-6xx */ + BusLogic_EISA_Bus, /* BT-7xx */ + BusLogic_Unknown_Bus, /* BT-8xx */ + BusLogic_PCI_Bus /* BT-9xx */ +}; /* Define the possible Host Adapter BIOS Disk Geometry Translations. */ -typedef enum BusLogic_BIOS_DiskGeometryTranslation +enum BusLogic_BIOS_DiskGeometryTranslation { BusLogic_BIOS_Disk_Not_Installed = 0, BusLogic_BIOS_Disk_Installed_64x32 = 1, BusLogic_BIOS_Disk_Installed_128x32 = 2, BusLogic_BIOS_Disk_Installed_255x63 = 3 -} -__attribute__ ((packed)) -BusLogic_BIOS_DiskGeometryTranslation_T; +} PACKED; /* Define a Boolean data type. */ -typedef enum { false, true } __attribute__ ((packed)) boolean; - - -/* - Define a 32 bit I/O Address data type. -*/ - -typedef unsigned int BusLogic_IO_Address_T; - - -/* - Define a 32 bit PCI Bus Address data type. -*/ - -typedef unsigned int BusLogic_PCI_Address_T; - - -/* - Define a 32 bit Base Address data type. -*/ - -typedef unsigned int BusLogic_Base_Address_T; - - -/* - Define a 32 bit Bus Address data type. -*/ - -typedef unsigned int BusLogic_BusAddress_T; - - -/* - Define a 32 bit Byte Count data type. -*/ - -typedef unsigned int BusLogic_ByteCount_T; - +typedef enum { + false, + true +} PACKED boolean; /* Define a 10^18 Statistics Byte Counter data type. */ -typedef struct BusLogic_ByteCounter +struct BusLogic_ByteCounter { unsigned int Units; unsigned int Billions; -} -BusLogic_ByteCounter_T; +}; /* Define the structure for I/O Address and Bus Probing Information. */ -typedef struct BusLogic_ProbeInfo +struct BusLogic_ProbeInfo { - BusLogic_HostAdapterType_T HostAdapterType; - BusLogic_HostAdapterBusType_T HostAdapterBusType; - BusLogic_IO_Address_T IO_Address; - BusLogic_PCI_Address_T PCI_Address; - PCI_Device_T *PCI_Device; + enum BusLogic_HostAdapterType HostAdapterType; + enum BusLogic_HostAdapterBusType HostAdapterBusType; + unsigned long IO_Address; + unsigned long PCI_Address; + struct pci_dev *PCI_Device; unsigned char Bus; unsigned char Device; unsigned char IRQ_Channel; -} -BusLogic_ProbeInfo_T; - +}; /* Define the Probe Options. */ -typedef struct BusLogic_ProbeOptions +struct BusLogic_ProbeOptions { boolean NoProbe:1; /* Bit 0 */ boolean NoProbeISA:1; /* Bit 1 */ @@ -372,55 +297,28 @@ boolean Probe234:1; /* Bit 10 */ boolean Probe130:1; /* Bit 11 */ boolean Probe134:1; /* Bit 12 */ -} -BusLogic_ProbeOptions_T; - +}; /* Define the Global Options. */ -typedef struct BusLogic_GlobalOptions +struct BusLogic_GlobalOptions { boolean TraceProbe:1; /* Bit 0 */ boolean TraceHardwareReset:1; /* Bit 1 */ boolean TraceConfiguration:1; /* Bit 2 */ boolean TraceErrors:1; /* Bit 3 */ -} -BusLogic_GlobalOptions_T; - +}; /* Define the Local Options. */ -typedef struct BusLogic_LocalOptions +struct BusLogic_LocalOptions { boolean InhibitTargetInquiry:1; /* Bit 0 */ -} -BusLogic_LocalOptions_T; - - -/* - Define the Error Recovery Strategy Options. -*/ - -typedef enum -{ - BusLogic_ErrorRecovery_Default = 0, - BusLogic_ErrorRecovery_BusDeviceReset = 1, - BusLogic_ErrorRecovery_HardReset = 2, - BusLogic_ErrorRecovery_None = 3 -} -__attribute__ ((packed)) -BusLogic_ErrorRecoveryStrategy_T; - -static char - *BusLogic_ErrorRecoveryStrategyNames[] = - { "Default", "Bus Device Reset", "Hard Reset", "None" }, - BusLogic_ErrorRecoveryStrategyLetters[] = - { 'D', 'B', 'H', 'N' }; - +}; /* Define the BusLogic SCSI Host Adapter I/O Register Offsets. @@ -433,12 +331,11 @@ #define BusLogic_InterruptRegisterOffset 2 /* RO register */ #define BusLogic_GeometryRegisterOffset 3 /* RO register */ - /* Define the structure of the write-only Control Register. */ -typedef union BusLogic_ControlRegister +union BusLogic_ControlRegister { unsigned char All; struct { @@ -447,16 +344,14 @@ boolean InterruptReset:1; /* Bit 5 */ boolean SoftReset:1; /* Bit 6 */ boolean HardReset:1; /* Bit 7 */ - } Bits; -} -BusLogic_ControlRegister_T; - + } cr; +}; /* Define the structure of the read-only Status Register. */ -typedef union BusLogic_StatusRegister +union BusLogic_StatusRegister { unsigned char All; struct { @@ -468,16 +363,14 @@ boolean InitializationRequired:1; /* Bit 5 */ boolean DiagnosticFailure:1; /* Bit 6 */ boolean DiagnosticActive:1; /* Bit 7 */ - } Bits; -} -BusLogic_StatusRegister_T; - + } sr; +}; /* Define the structure of the read-only Interrupt Register. */ -typedef union BusLogic_InterruptRegister +union BusLogic_InterruptRegister { unsigned char All; struct { @@ -487,121 +380,93 @@ boolean ExternalBusReset:1; /* Bit 3 */ unsigned char Reserved:3; /* Bits 4-6 */ boolean InterruptValid:1; /* Bit 7 */ - } Bits; -} -BusLogic_InterruptRegister_T; - + } ir; +}; /* Define the structure of the read-only Geometry Register. */ -typedef union BusLogic_GeometryRegister +union BusLogic_GeometryRegister { unsigned char All; struct { - BusLogic_BIOS_DiskGeometryTranslation_T Drive0Geometry:2; /* Bits 0-1 */ - BusLogic_BIOS_DiskGeometryTranslation_T Drive1Geometry:2; /* Bits 2-3 */ - unsigned char :3; /* Bits 4-6 */ - boolean ExtendedTranslationEnabled:1; /* Bit 7 */ - } Bits; -} -BusLogic_GeometryRegister_T; - + enum BusLogic_BIOS_DiskGeometryTranslation Drive0Geometry:2;/* Bits 0-1 */ + enum BusLogic_BIOS_DiskGeometryTranslation Drive1Geometry:2;/* Bits 2-3 */ + unsigned char :3; /* Bits 4-6 */ + boolean ExtendedTranslationEnabled:1; /* Bit 7 */ + } gr; +}; /* Define the BusLogic SCSI Host Adapter Command Register Operation Codes. */ -typedef enum +enum BusLogic_OperationCode { - BusLogic_TestCommandCompleteInterrupt = 0x00, - BusLogic_InitializeMailbox = 0x01, - BusLogic_ExecuteMailboxCommand = 0x02, - BusLogic_ExecuteBIOSCommand = 0x03, - BusLogic_InquireBoardID = 0x04, - BusLogic_EnableOutgoingMailboxAvailableInt = 0x05, - BusLogic_SetSCSISelectionTimeout = 0x06, - BusLogic_SetPreemptTimeOnBus = 0x07, - BusLogic_SetTimeOffBus = 0x08, - BusLogic_SetBusTransferRate = 0x09, - BusLogic_InquireInstalledDevicesID0to7 = 0x0A, - BusLogic_InquireConfiguration = 0x0B, - BusLogic_EnableTargetMode = 0x0C, - BusLogic_InquireSetupInformation = 0x0D, - BusLogic_WriteAdapterLocalRAM = 0x1A, - BusLogic_ReadAdapterLocalRAM = 0x1B, - BusLogic_WriteBusMasterChipFIFO = 0x1C, - BusLogic_ReadBusMasterChipFIFO = 0x1D, - BusLogic_EchoCommandData = 0x1F, - BusLogic_HostAdapterDiagnostic = 0x20, - BusLogic_SetAdapterOptions = 0x21, - BusLogic_InquireInstalledDevicesID8to15 = 0x23, - BusLogic_InquireTargetDevices = 0x24, - BusLogic_DisableHostAdapterInterrupt = 0x25, - BusLogic_InitializeExtendedMailbox = 0x81, - BusLogic_ExecuteSCSICommand = 0x83, - BusLogic_InquireFirmwareVersion3rdDigit = 0x84, - BusLogic_InquireFirmwareVersionLetter = 0x85, - BusLogic_InquirePCIHostAdapterInformation = 0x86, - BusLogic_InquireHostAdapterModelNumber = 0x8B, - BusLogic_InquireSynchronousPeriod = 0x8C, - BusLogic_InquireExtendedSetupInformation = 0x8D, - BusLogic_EnableStrictRoundRobinMode = 0x8F, - BusLogic_StoreHostAdapterLocalRAM = 0x90, - BusLogic_FetchHostAdapterLocalRAM = 0x91, - BusLogic_StoreLocalDataInEEPROM = 0x92, - BusLogic_UploadAutoSCSICode = 0x94, - BusLogic_ModifyIOAddress = 0x95, - BusLogic_SetCCBFormat = 0x96, - BusLogic_WriteInquiryBuffer = 0x9A, - BusLogic_ReadInquiryBuffer = 0x9B, - BusLogic_FlashROMUploadDownload = 0xA7, - BusLogic_ReadSCAMData = 0xA8, - BusLogic_WriteSCAMData = 0xA9 -} -BusLogic_OperationCode_T; - + BusLogic_TestCommandCompleteInterrupt = 0x00, + BusLogic_InitializeMailbox = 0x01, + BusLogic_ExecuteMailboxCommand = 0x02, + BusLogic_ExecuteBIOSCommand = 0x03, + BusLogic_InquireBoardID = 0x04, + BusLogic_EnableOutgoingMailboxAvailableInt = 0x05, + BusLogic_SetSCSISelectionTimeout = 0x06, + BusLogic_SetPreemptTimeOnBus = 0x07, + BusLogic_SetTimeOffBus = 0x08, + BusLogic_SetBusTransferRate = 0x09, + BusLogic_InquireInstalledDevicesID0to7 = 0x0A, + BusLogic_InquireConfiguration = 0x0B, + BusLogic_EnableTargetMode = 0x0C, + BusLogic_InquireSetupInformation = 0x0D, + BusLogic_WriteAdapterLocalRAM = 0x1A, + BusLogic_ReadAdapterLocalRAM = 0x1B, + BusLogic_WriteBusMasterChipFIFO = 0x1C, + BusLogic_ReadBusMasterChipFIFO = 0x1D, + BusLogic_EchoCommandData = 0x1F, + BusLogic_HostAdapterDiagnostic = 0x20, + BusLogic_SetAdapterOptions = 0x21, + BusLogic_InquireInstalledDevicesID8to15 = 0x23, + BusLogic_InquireTargetDevices = 0x24, + BusLogic_DisableHostAdapterInterrupt = 0x25, + BusLogic_InitializeExtendedMailbox = 0x81, + BusLogic_ExecuteSCSICommand = 0x83, + BusLogic_InquireFirmwareVersion3rdDigit = 0x84, + BusLogic_InquireFirmwareVersionLetter = 0x85, + BusLogic_InquirePCIHostAdapterInformation = 0x86, + BusLogic_InquireHostAdapterModelNumber = 0x8B, + BusLogic_InquireSynchronousPeriod = 0x8C, + BusLogic_InquireExtendedSetupInformation = 0x8D, + BusLogic_EnableStrictRoundRobinMode = 0x8F, + BusLogic_StoreHostAdapterLocalRAM = 0x90, + BusLogic_FetchHostAdapterLocalRAM = 0x91, + BusLogic_StoreLocalDataInEEPROM = 0x92, + BusLogic_UploadAutoSCSICode = 0x94, + BusLogic_ModifyIOAddress = 0x95, + BusLogic_SetCCBFormat = 0x96, + BusLogic_WriteInquiryBuffer = 0x9A, + BusLogic_ReadInquiryBuffer = 0x9B, + BusLogic_FlashROMUploadDownload = 0xA7, + BusLogic_ReadSCAMData = 0xA8, + BusLogic_WriteSCAMData = 0xA9 +}; /* Define the Inquire Board ID reply structure. */ -typedef struct BusLogic_BoardID +struct BusLogic_BoardID { unsigned char BoardType; /* Byte 0 */ unsigned char CustomFeatures; /* Byte 1 */ unsigned char FirmwareVersion1stDigit; /* Byte 2 */ unsigned char FirmwareVersion2ndDigit; /* Byte 3 */ -} -BusLogic_BoardID_T; - - -/* - Define the Inquire Installed Devices ID 0 to 7 and Inquire Installed - Devices ID 8 to 15 reply type. For each Target Device, a byte is returned - where bit 0 set indicates that Logical Unit 0 exists, bit 1 set indicates - that Logical Unit 1 exists, and so on. -*/ - -typedef unsigned char BusLogic_InstalledDevices8_T[8]; - - -/* - Define the Inquire Target Devices reply type. Inquire Target Devices only - tests Logical Unit 0 of each Target Device unlike the Inquire Installed - Devices commands which test Logical Units 0 - 7. Two bytes are returned, - where byte 0 bit 0 set indicates that Target Device 0 exists, and so on. -*/ - -typedef unsigned short BusLogic_InstalledDevices_T; - +}; /* Define the Inquire Configuration reply structure. */ -typedef struct BusLogic_Configuration +struct BusLogic_Configuration { unsigned char :5; /* Byte 0 Bits 0-4 */ boolean DMA_Channel5:1; /* Byte 0 Bit 5 */ @@ -617,29 +482,20 @@ unsigned char :1; /* Byte 1 Bit 7 */ unsigned char HostAdapterID:4; /* Byte 2 Bits 0-3 */ unsigned char :4; /* Byte 2 Bits 4-7 */ -} -BusLogic_Configuration_T; - +}; /* Define the Inquire Setup Information reply structure. */ -typedef struct BusLogic_SynchronousValue +struct BusLogic_SynchronousValue { unsigned char Offset:4; /* Bits 0-3 */ unsigned char TransferPeriod:3; /* Bits 4-6 */ boolean Synchronous:1; /* Bit 7 */ -} -BusLogic_SynchronousValue_T; +}; -typedef BusLogic_SynchronousValue_T - BusLogic_SynchronousValues8_T[8]; - -typedef BusLogic_SynchronousValue_T - BusLogic_SynchronousValues_T[BusLogic_MaxTargetDevices]; - -typedef struct BusLogic_SetupInformation +struct BusLogic_SetupInformation { boolean SynchronousInitiationEnabled:1; /* Byte 0 Bit 0 */ boolean ParityCheckingEnabled:1; /* Byte 0 Bit 1 */ @@ -649,47 +505,29 @@ unsigned char TimeOffBus; /* Byte 3 */ unsigned char MailboxCount; /* Byte 4 */ unsigned char MailboxAddress[3]; /* Bytes 5-7 */ - BusLogic_SynchronousValues8_T SynchronousValuesID0to7; /* Bytes 8-15 */ + struct BusLogic_SynchronousValue SynchronousValuesID0to7[8];/* Bytes 8-15 */ unsigned char DisconnectPermittedID0to7; /* Byte 16 */ unsigned char Signature; /* Byte 17 */ unsigned char CharacterD; /* Byte 18 */ unsigned char HostBusType; /* Byte 19 */ unsigned char WideTransfersPermittedID0to7; /* Byte 20 */ unsigned char WideTransfersActiveID0to7; /* Byte 21 */ - BusLogic_SynchronousValues8_T SynchronousValuesID8to15; /* Bytes 22-29 */ + struct BusLogic_SynchronousValue SynchronousValuesID8to15[8]; /* Bytes 22-29 */ unsigned char DisconnectPermittedID8to15; /* Byte 30 */ unsigned char :8; /* Byte 31 */ unsigned char WideTransfersPermittedID8to15; /* Byte 32 */ unsigned char WideTransfersActiveID8to15; /* Byte 33 */ -} -BusLogic_SetupInformation_T; - +}; /* Define the Initialize Extended Mailbox request structure. */ -typedef struct BusLogic_ExtendedMailboxRequest +struct BusLogic_ExtendedMailboxRequest { unsigned char MailboxCount; /* Byte 0 */ - BusLogic_BusAddress_T BaseMailboxAddress; /* Bytes 1-4 */ -} -__attribute__ ((packed)) -BusLogic_ExtendedMailboxRequest_T; - - -/* - Define the Inquire Firmware Version 3rd Digit reply type. -*/ - -typedef unsigned char BusLogic_FirmwareVersion3rdDigit_T; - - -/* - Define the Inquire Firmware Version Letter reply type. -*/ - -typedef unsigned char BusLogic_FirmwareVersionLetter_T; + u32 BaseMailboxAddress; /* Bytes 1-4 */ +} PACKED; /* @@ -698,7 +536,7 @@ the Modify I/O Address command. */ -typedef enum BusLogic_ISACompatibleIOPort +enum BusLogic_ISACompatibleIOPort { BusLogic_IO_330 = 0, BusLogic_IO_334 = 1, @@ -708,13 +546,11 @@ BusLogic_IO_134 = 5, BusLogic_IO_Disable = 6, BusLogic_IO_Disable2 = 7 -} -__attribute__ ((packed)) -BusLogic_ISACompatibleIOPort_T; +} PACKED; -typedef struct BusLogic_PCIHostAdapterInformation +struct BusLogic_PCIHostAdapterInformation { - BusLogic_ISACompatibleIOPort_T ISACompatibleIOPort; /* Byte 0 */ + enum BusLogic_ISACompatibleIOPort ISACompatibleIOPort;/* Byte 0 */ unsigned char PCIAssignedIRQChannel; /* Byte 1 */ boolean LowByteTerminated:1; /* Byte 2 Bit 0 */ boolean HighByteTerminated:1; /* Byte 2 Bit 1 */ @@ -724,42 +560,26 @@ boolean JP3:1; /* Byte 2 Bit 6 */ boolean GenericInfoValid:1; /* Byte 2 Bit 7 */ unsigned char :8; /* Byte 3 */ -} -BusLogic_PCIHostAdapterInformation_T; - - -/* - Define the Inquire Host Adapter Model Number reply type. -*/ - -typedef unsigned char BusLogic_HostAdapterModelNumber_T[5]; - - -/* - Define the Inquire Synchronous Period reply type. For each Target Device, - a byte is returned which represents the Synchronous Transfer Period in units - of 10 nanoseconds. -*/ - -typedef unsigned char BusLogic_SynchronousPeriod_T[BusLogic_MaxTargetDevices]; - +}; /* Define the Inquire Extended Setup Information reply structure. */ -typedef struct BusLogic_ExtendedSetupInformation +struct BusLogic_ExtendedSetupInformation { unsigned char BusType; /* Byte 0 */ unsigned char BIOS_Address; /* Byte 1 */ unsigned short ScatterGatherLimit; /* Bytes 2-3 */ unsigned char MailboxCount; /* Byte 4 */ - BusLogic_BusAddress_T BaseMailboxAddress; /* Bytes 5-8 */ - struct { unsigned char :2; /* Byte 9 Bits 0-1 */ + u32 BaseMailboxAddress; /* Bytes 5-8 */ + struct { + unsigned char :2; /* Byte 9 Bits 0-1 */ boolean FastOnEISA:1; /* Byte 9 Bit 2 */ unsigned char :3; /* Byte 9 Bits 3-5 */ boolean LevelSensitiveInterrupt:1; /* Byte 9 Bit 6 */ - unsigned char :1; } Misc; /* Byte 9 Bit 7 */ + unsigned char :1; /* Byte 9 Bit 7 */ + } Misc; unsigned char FirmwareRevision[3]; /* Bytes 10-12 */ boolean HostWideSCSI:1; /* Byte 13 Bit 0 */ boolean HostDifferentialSCSI:1; /* Byte 13 Bit 1 */ @@ -767,22 +587,17 @@ boolean HostUltraSCSI:1; /* Byte 13 Bit 3 */ boolean HostSmartTermination:1; /* Byte 13 Bit 4 */ unsigned char :3; /* Byte 13 Bits 5-7 */ -} -__attribute__ ((packed)) -BusLogic_ExtendedSetupInformation_T; - +} PACKED; /* Define the Enable Strict Round Robin Mode request type. */ -typedef enum BusLogic_RoundRobinModeRequest +enum BusLogic_RoundRobinModeRequest { BusLogic_AggressiveRoundRobinMode = 0, BusLogic_StrictRoundRobinMode = 1 -} -__attribute__ ((packed)) -BusLogic_RoundRobinModeRequest_T; +} PACKED; /* @@ -792,19 +607,17 @@ #define BusLogic_BIOS_BaseOffset 0 #define BusLogic_AutoSCSI_BaseOffset 64 -typedef struct BusLogic_FetchHostAdapterLocalRAMRequest +struct BusLogic_FetchHostAdapterLocalRAMRequest { unsigned char ByteOffset; /* Byte 0 */ unsigned char ByteCount; /* Byte 1 */ -} -BusLogic_FetchHostAdapterLocalRAMRequest_T; - +}; /* Define the Host Adapter Local RAM AutoSCSI structure. */ -typedef struct BusLogic_AutoSCSIData +struct BusLogic_AutoSCSIData { unsigned char InternalFactorySignature[2]; /* Bytes 0-1 */ unsigned char InformationByteCount; /* Byte 2 */ @@ -874,22 +687,17 @@ unsigned char Reserved[10]; /* Bytes 50-59 */ unsigned char ManufacturingDiagnostic[2]; /* Bytes 60-61 */ unsigned short Checksum; /* Bytes 62-63 */ -} -__attribute__ ((packed)) -BusLogic_AutoSCSIData_T; - +} PACKED; /* Define the Host Adapter Local RAM Auto SCSI Byte 45 structure. */ -typedef struct BusLogic_AutoSCSIByte45 +struct BusLogic_AutoSCSIByte45 { unsigned char ForceBusDeviceScanningOrder:1; /* Bit 0 */ unsigned char :7; /* Bits 1-7 */ -} -BusLogic_AutoSCSIByte45_T; - +}; /* Define the Host Adapter Local RAM BIOS Drive Map Byte structure. @@ -897,61 +705,35 @@ #define BusLogic_BIOS_DriveMapOffset 17 -typedef struct BusLogic_BIOSDriveMapByte +struct BusLogic_BIOSDriveMapByte { unsigned char TargetIDBit3:1; /* Bit 0 */ unsigned char :2; /* Bits 1-2 */ - BusLogic_BIOS_DiskGeometryTranslation_T DiskGeometry:2; /* Bits 3-4 */ + enum BusLogic_BIOS_DiskGeometryTranslation DiskGeometry:2; /* Bits 3-4 */ unsigned char TargetID:3; /* Bits 5-7 */ -} -BusLogic_BIOSDriveMapByte_T; - - -/* - Define the Modify I/O Address request type. On PCI Host Adapters, the - Modify I/O Address command allows modification of the ISA compatible I/O - Address that the Host Adapter responds to; it does not affect the PCI - compliant I/O Address assigned at system initialization. -*/ - -typedef BusLogic_ISACompatibleIOPort_T BusLogic_ModifyIOAddressRequest_T; - +}; /* Define the Set CCB Format request type. Extended LUN Format CCBs are necessary to support more than 8 Logical Units per Target Device. */ -typedef enum BusLogic_SetCCBFormatRequest +enum BusLogic_SetCCBFormatRequest { BusLogic_LegacyLUNFormatCCB = 0, BusLogic_ExtendedLUNFormatCCB = 1 -} -__attribute__ ((packed)) -BusLogic_SetCCBFormatRequest_T; - - -/* - Define the Requested Reply Length type used by the Inquire Setup Information, - Inquire Host Adapter Model Number, Inquire Synchronous Period, and Inquire - Extended Setup Information commands. -*/ - -typedef unsigned char BusLogic_RequestedReplyLength_T; - +} PACKED; /* Define the Outgoing Mailbox Action Codes. */ -typedef enum +enum BusLogic_ActionCode { BusLogic_OutgoingMailboxFree = 0x00, BusLogic_MailboxStartCommand = 0x01, BusLogic_MailboxAbortCommand = 0x02 -} -__attribute__ ((packed)) -BusLogic_ActionCode_T; +} PACKED; /* @@ -960,7 +742,7 @@ completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5. */ -typedef enum +enum BusLogic_CompletionCode { BusLogic_IncomingMailboxFree = 0x00, BusLogic_CommandCompletedWithoutError = 0x01, @@ -968,16 +750,13 @@ BusLogic_AbortedCommandNotFound = 0x03, BusLogic_CommandCompletedWithError = 0x04, BusLogic_InvalidCCB = 0x05 -} -__attribute__ ((packed)) -BusLogic_CompletionCode_T; - +} PACKED; /* Define the Command Control Block (CCB) Opcodes. */ -typedef enum +enum BusLogic_CCB_Opcode { BusLogic_InitiatorCCB = 0x00, BusLogic_TargetCCB = 0x01, @@ -985,23 +764,20 @@ BusLogic_InitiatorCCB_ResidualDataLength = 0x03, BusLogic_InitiatorCCB_ScatterGatherResidual = 0x04, BusLogic_BusDeviceReset = 0x81 -} -__attribute__ ((packed)) -BusLogic_CCB_Opcode_T; +} PACKED; /* Define the CCB Data Direction Codes. */ -typedef enum +enum BusLogic_DataDirection { BusLogic_UncheckedDataTransfer = 0, BusLogic_DataInLengthChecked = 1, BusLogic_DataOutLengthChecked = 2, BusLogic_NoDataTransfer = 3 -} -BusLogic_DataDirection_T; +}; /* @@ -1009,7 +785,7 @@ return status code 0x0C; it uses 0x12 for both overruns and underruns. */ -typedef enum +enum BusLogic_HostAdapterStatus { BusLogic_CommandCompletedNormally = 0x00, BusLogic_LinkedCommandCompleted = 0x0A, @@ -1036,38 +812,31 @@ BusLogic_HostAdapterSoftwareError = 0x27, BusLogic_HostAdapterHardwareTimeoutError = 0x30, BusLogic_SCSIParityErrorDetected = 0x34 -} -__attribute__ ((packed)) -BusLogic_HostAdapterStatus_T; +} PACKED; /* Define the SCSI Target Device Status Codes. */ -typedef enum +enum BusLogic_TargetDeviceStatus { BusLogic_OperationGood = 0x00, BusLogic_CheckCondition = 0x02, BusLogic_DeviceBusy = 0x08 -} -__attribute__ ((packed)) -BusLogic_TargetDeviceStatus_T; - +} PACKED; /* Define the Queue Tag Codes. */ -typedef enum +enum BusLogic_QueueTag { BusLogic_SimpleQueueTag = 0, BusLogic_HeadOfQueueTag = 1, BusLogic_OrderedQueueTag = 2, BusLogic_ReservedQT = 3 -} -BusLogic_QueueTag_T; - +}; /* Define the SCSI Command Descriptor Block (CDB). @@ -1083,27 +852,23 @@ Firmware Interface and the FlashPoint SCCB Manager. */ -typedef struct BusLogic_ScatterGatherSegment +struct BusLogic_ScatterGatherSegment { - BusLogic_ByteCount_T SegmentByteCount; /* Bytes 0-3 */ - BusLogic_BusAddress_T SegmentDataPointer; /* Bytes 4-7 */ -} -BusLogic_ScatterGatherSegment_T; - + u32 SegmentByteCount; /* Bytes 0-3 */ + u32 SegmentDataPointer; /* Bytes 4-7 */ +}; /* Define the Driver CCB Status Codes. */ -typedef enum +enum BusLogic_CCB_Status { BusLogic_CCB_Free = 0, BusLogic_CCB_Active = 1, BusLogic_CCB_Completed = 2, BusLogic_CCB_Reset = 3 -} -__attribute__ ((packed)) -BusLogic_CCB_Status_T; +} PACKED; /* @@ -1125,39 +890,39 @@ 32 Logical Units per Target Device. */ -typedef struct BusLogic_CCB +struct BusLogic_CCB { /* MultiMaster Firmware and FlashPoint SCCB Manager Common Portion. */ - BusLogic_CCB_Opcode_T Opcode; /* Byte 0 */ + enum BusLogic_CCB_Opcode Opcode; /* Byte 0 */ unsigned char :3; /* Byte 1 Bits 0-2 */ - BusLogic_DataDirection_T DataDirection:2; /* Byte 1 Bits 3-4 */ + enum BusLogic_DataDirection DataDirection:2; /* Byte 1 Bits 3-4 */ boolean TagEnable:1; /* Byte 1 Bit 5 */ - BusLogic_QueueTag_T QueueTag:2; /* Byte 1 Bits 6-7 */ + enum BusLogic_QueueTag QueueTag:2; /* Byte 1 Bits 6-7 */ unsigned char CDB_Length; /* Byte 2 */ unsigned char SenseDataLength; /* Byte 3 */ - BusLogic_ByteCount_T DataLength; /* Bytes 4-7 */ - BusLogic_BusAddress_T DataPointer; /* Bytes 8-11 */ + u32 DataLength; /* Bytes 4-7 */ + u32 DataPointer; /* Bytes 8-11 */ unsigned char :8; /* Byte 12 */ unsigned char :8; /* Byte 13 */ - BusLogic_HostAdapterStatus_T HostAdapterStatus; /* Byte 14 */ - BusLogic_TargetDeviceStatus_T TargetDeviceStatus; /* Byte 15 */ + enum BusLogic_HostAdapterStatus HostAdapterStatus; /* Byte 14 */ + enum BusLogic_TargetDeviceStatus TargetDeviceStatus; /* Byte 15 */ unsigned char TargetID; /* Byte 16 */ unsigned char LogicalUnit:5; /* Byte 17 Bits 0-4 */ boolean LegacyTagEnable:1; /* Byte 17 Bit 5 */ - BusLogic_QueueTag_T LegacyQueueTag:2; /* Byte 17 Bits 6-7 */ + enum BusLogic_QueueTag LegacyQueueTag:2; /* Byte 17 Bits 6-7 */ SCSI_CDB_T CDB; /* Bytes 18-29 */ unsigned char :8; /* Byte 30 */ unsigned char :8; /* Byte 31 */ unsigned int :32; /* Bytes 32-35 */ - BusLogic_BusAddress_T SenseDataPointer; /* Bytes 36-39 */ + u32 SenseDataPointer; /* Bytes 36-39 */ /* FlashPoint SCCB Manager Defined Portion. */ void (*CallbackFunction)(struct BusLogic_CCB *); /* Bytes 40-43 */ - BusLogic_Base_Address_T BaseAddress; /* Bytes 44-47 */ - BusLogic_CompletionCode_T CompletionCode; /* Byte 48 */ + u32 BaseAddress; /* Bytes 44-47 */ + enum BusLogic_CompletionCode CompletionCode; /* Byte 48 */ #ifndef CONFIG_SCSI_OMIT_FLASHPOINT unsigned char :8; /* Byte 49 */ unsigned short OS_Flags; /* Bytes 50-51 */ @@ -1168,70 +933,61 @@ */ dma_addr_t AllocationGroupHead; unsigned int AllocationGroupSize; - BusLogic_BusAddress_T DMA_Handle; - BusLogic_CCB_Status_T Status; + u32 DMA_Handle; + enum BusLogic_CCB_Status Status; unsigned long SerialNumber; - SCSI_Command_T *Command; + struct scsi_cmnd *Command; struct BusLogic_HostAdapter *HostAdapter; struct BusLogic_CCB *Next; struct BusLogic_CCB *NextAll; - BusLogic_ScatterGatherSegment_T + struct BusLogic_ScatterGatherSegment ScatterGatherList[BusLogic_ScatterGatherLimit]; -} -BusLogic_CCB_T; - +}; /* Define the 32 Bit Mode Outgoing Mailbox structure. */ -typedef struct BusLogic_OutgoingMailbox +struct BusLogic_OutgoingMailbox { - BusLogic_BusAddress_T CCB; /* Bytes 0-3 */ + u32 CCB; /* Bytes 0-3 */ unsigned int :24; /* Bytes 4-6 */ - BusLogic_ActionCode_T ActionCode; /* Byte 7 */ -} -BusLogic_OutgoingMailbox_T; - + enum BusLogic_ActionCode ActionCode; /* Byte 7 */ +}; /* Define the 32 Bit Mode Incoming Mailbox structure. */ -typedef struct BusLogic_IncomingMailbox +struct BusLogic_IncomingMailbox { - BusLogic_BusAddress_T CCB; /* Bytes 0-3 */ - BusLogic_HostAdapterStatus_T HostAdapterStatus; /* Byte 4 */ - BusLogic_TargetDeviceStatus_T TargetDeviceStatus; /* Byte 5 */ + u32 CCB; /* Bytes 0-3 */ + enum BusLogic_HostAdapterStatus HostAdapterStatus; /* Byte 4 */ + enum BusLogic_TargetDeviceStatus TargetDeviceStatus; /* Byte 5 */ unsigned char :8; /* Byte 6 */ - BusLogic_CompletionCode_T CompletionCode; /* Byte 7 */ -} -BusLogic_IncomingMailbox_T; + enum BusLogic_CompletionCode CompletionCode; /* Byte 7 */ +}; /* Define the BusLogic Driver Options structure. */ -typedef struct BusLogic_DriverOptions +struct BusLogic_DriverOptions { unsigned short TaggedQueuingPermitted; unsigned short TaggedQueuingPermittedMask; unsigned short BusSettleTime; - BusLogic_LocalOptions_T LocalOptions; + struct BusLogic_LocalOptions LocalOptions; unsigned char CommonQueueDepth; unsigned char QueueDepth[BusLogic_MaxTargetDevices]; - BusLogic_ErrorRecoveryStrategy_T - ErrorRecoveryStrategy[BusLogic_MaxTargetDevices]; -} -BusLogic_DriverOptions_T; - +}; /* Define the Host Adapter Target Flags structure. */ -typedef struct BusLogic_TargetFlags +struct BusLogic_TargetFlags { boolean TargetExists:1; boolean TaggedQueuingSupported:1; @@ -1240,9 +996,7 @@ boolean WideTransfersActive:1; boolean CommandSuccessfulFlag:1; boolean TargetInfoReported:1; -} -BusLogic_TargetFlags_T; - +}; /* Define the Host Adapter Target Statistics structure. @@ -1252,14 +1006,14 @@ typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets]; -typedef struct BusLogic_TargetStatistics +struct BusLogic_TargetStatistics { unsigned int CommandsAttempted; unsigned int CommandsCompleted; unsigned int ReadCommands; unsigned int WriteCommands; - BusLogic_ByteCounter_T TotalBytesRead; - BusLogic_ByteCounter_T TotalBytesWritten; + struct BusLogic_ByteCounter TotalBytesRead; + struct BusLogic_ByteCounter TotalBytesWritten; BusLogic_CommandSizeBuckets_T ReadCommandSizeBuckets; BusLogic_CommandSizeBuckets_T WriteCommandSizeBuckets; unsigned short CommandAbortsRequested; @@ -1271,9 +1025,7 @@ unsigned short HostAdapterResetsRequested; unsigned short HostAdapterResetsAttempted; unsigned short HostAdapterResetsCompleted; -} -BusLogic_TargetStatistics_T; - +}; /* Define the FlashPoint Card Handle data type. @@ -1289,9 +1041,9 @@ by the FlashPoint SCCB Manager. */ -typedef struct FlashPoint_Info +struct FlashPoint_Info { - BusLogic_Base_Address_T BaseAddress; /* Bytes 0-3 */ + u32 BaseAddress; /* Bytes 0-3 */ boolean Present; /* Byte 4 */ unsigned char IRQ_Channel; /* Byte 5 */ unsigned char SCSI_ID; /* Byte 6 */ @@ -1321,22 +1073,20 @@ unsigned char TranslationInfo[4]; /* Bytes 36-39 */ unsigned int Reserved2[5]; /* Bytes 40-59 */ unsigned int SecondaryRange; /* Bytes 60-63 */ -} -FlashPoint_Info_T; - +}; /* Define the BusLogic Driver Host Adapter structure. */ -typedef struct BusLogic_HostAdapter +struct BusLogic_HostAdapter { - SCSI_Host_T *SCSI_Host; - PCI_Device_T *PCI_Device; - BusLogic_HostAdapterType_T HostAdapterType; - BusLogic_HostAdapterBusType_T HostAdapterBusType; - BusLogic_IO_Address_T IO_Address; - BusLogic_PCI_Address_T PCI_Address; + struct Scsi_Host *SCSI_Host; + struct pci_dev *PCI_Device; + enum BusLogic_HostAdapterType HostAdapterType; + enum BusLogic_HostAdapterBusType HostAdapterBusType; + unsigned long IO_Address; + unsigned long PCI_Address; unsigned short AddressCount; unsigned char HostNumber; unsigned char ModelName[9]; @@ -1393,19 +1143,17 @@ unsigned short HostAdapterInternalErrors; unsigned short TargetDeviceCount; unsigned short MessageBufferLength; - BusLogic_BusAddress_T BIOS_Address; - BusLogic_DriverOptions_T *DriverOptions; - FlashPoint_Info_T FlashPointInfo; + u32 BIOS_Address; + struct BusLogic_DriverOptions *DriverOptions; + struct FlashPoint_Info FlashPointInfo; FlashPoint_CardHandle_T CardHandle; struct BusLogic_HostAdapter *Next; - BusLogic_CCB_T *All_CCBs; - BusLogic_CCB_T *Free_CCBs; - BusLogic_CCB_T *FirstCompletedCCB; - BusLogic_CCB_T *LastCompletedCCB; - BusLogic_CCB_T *BusDeviceResetPendingCCB[BusLogic_MaxTargetDevices]; - BusLogic_ErrorRecoveryStrategy_T - ErrorRecoveryStrategy[BusLogic_MaxTargetDevices]; - BusLogic_TargetFlags_T TargetFlags[BusLogic_MaxTargetDevices]; + struct BusLogic_CCB *All_CCBs; + struct BusLogic_CCB *Free_CCBs; + struct BusLogic_CCB *FirstCompletedCCB; + struct BusLogic_CCB *LastCompletedCCB; + struct BusLogic_CCB *BusDeviceResetPendingCCB[BusLogic_MaxTargetDevices]; + struct BusLogic_TargetFlags TargetFlags[BusLogic_MaxTargetDevices]; unsigned char QueueDepth[BusLogic_MaxTargetDevices]; unsigned char SynchronousPeriod[BusLogic_MaxTargetDevices]; unsigned char SynchronousOffset[BusLogic_MaxTargetDevices]; @@ -1414,43 +1162,36 @@ unsigned long LastSequencePoint[BusLogic_MaxTargetDevices]; unsigned long LastResetAttempted[BusLogic_MaxTargetDevices]; unsigned long LastResetCompleted[BusLogic_MaxTargetDevices]; - BusLogic_OutgoingMailbox_T *FirstOutgoingMailbox; - BusLogic_OutgoingMailbox_T *LastOutgoingMailbox; - BusLogic_OutgoingMailbox_T *NextOutgoingMailbox; - BusLogic_IncomingMailbox_T *FirstIncomingMailbox; - BusLogic_IncomingMailbox_T *LastIncomingMailbox; - BusLogic_IncomingMailbox_T *NextIncomingMailbox; - BusLogic_TargetStatistics_T TargetStatistics[BusLogic_MaxTargetDevices]; + struct BusLogic_OutgoingMailbox *FirstOutgoingMailbox; + struct BusLogic_OutgoingMailbox *LastOutgoingMailbox; + struct BusLogic_OutgoingMailbox *NextOutgoingMailbox; + struct BusLogic_IncomingMailbox *FirstIncomingMailbox; + struct BusLogic_IncomingMailbox *LastIncomingMailbox; + struct BusLogic_IncomingMailbox *NextIncomingMailbox; + struct BusLogic_TargetStatistics TargetStatistics[BusLogic_MaxTargetDevices]; unsigned char *MailboxSpace; - dma_addr_t MailboxSpaceHandle; + dma_addr_t MailboxSpaceHandle; unsigned int MailboxSize; unsigned long CCB_Offset; -/* [BusLogic_MaxMailboxes - * (sizeof(BusLogic_OutgoingMailbox_T) - + sizeof(BusLogic_IncomingMailbox_T))]; */ char MessageBuffer[BusLogic_MessageBufferSize]; -} -BusLogic_HostAdapter_T; - +}; /* Define a structure for the BIOS Disk Parameters. */ -typedef struct BIOS_DiskParameters +struct BIOS_DiskParameters { int Heads; int Sectors; int Cylinders; -} -BIOS_DiskParameters_T; - +}; /* Define a structure for the SCSI Inquiry command results. */ -typedef struct SCSI_Inquiry +struct SCSI_Inquiry { unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */ unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */ @@ -1477,27 +1218,22 @@ unsigned char VendorIdentification[8]; /* Bytes 8-15 */ unsigned char ProductIdentification[16]; /* Bytes 16-31 */ unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */ -} -SCSI_Inquiry_T; - +}; /* BusLogic_AcquireHostAdapterLock acquires exclusive access to Host Adapter. */ -static inline -void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_AcquireHostAdapterLock(struct BusLogic_HostAdapter *HostAdapter) { spin_lock_irq(HostAdapter->SCSI_Host->host_lock); } - /* BusLogic_ReleaseHostAdapterLock releases exclusive access to Host Adapter. */ -static inline -void BusLogic_ReleaseHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_ReleaseHostAdapterLock(struct BusLogic_HostAdapter *HostAdapter) { spin_unlock_irq(HostAdapter->SCSI_Host->host_lock); } @@ -1508,9 +1244,8 @@ but is only called from the interrupt handler. */ -static inline -void BusLogic_AcquireHostAdapterLockIH(BusLogic_HostAdapter_T *HostAdapter, - ProcessorFlags_T *ProcessorFlags) +static inline void BusLogic_AcquireHostAdapterLockIH(struct BusLogic_HostAdapter *HostAdapter, + unsigned long *ProcessorFlags) { spin_lock_irqsave(HostAdapter->SCSI_Host->host_lock, *ProcessorFlags); } @@ -1521,9 +1256,8 @@ but is only called from the interrupt handler. */ -static inline -void BusLogic_ReleaseHostAdapterLockIH(BusLogic_HostAdapter_T *HostAdapter, - ProcessorFlags_T *ProcessorFlags) +static inline void BusLogic_ReleaseHostAdapterLockIH(struct BusLogic_HostAdapter *HostAdapter, + unsigned long *ProcessorFlags) { spin_unlock_irqrestore(HostAdapter->SCSI_Host->host_lock, *ProcessorFlags); } @@ -1534,96 +1268,80 @@ Host Adapter I/O Registers. */ -static inline -void BusLogic_SCSIBusReset(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_SCSIBusReset(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ControlRegister_T ControlRegister; + union BusLogic_ControlRegister ControlRegister; ControlRegister.All = 0; - ControlRegister.Bits.SCSIBusReset = true; + ControlRegister.cr.SCSIBusReset = true; outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset); } -static inline -void BusLogic_InterruptReset(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_InterruptReset(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ControlRegister_T ControlRegister; + union BusLogic_ControlRegister ControlRegister; ControlRegister.All = 0; - ControlRegister.Bits.InterruptReset = true; + ControlRegister.cr.InterruptReset = true; outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset); } -static inline -void BusLogic_SoftReset(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_SoftReset(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ControlRegister_T ControlRegister; + union BusLogic_ControlRegister ControlRegister; ControlRegister.All = 0; - ControlRegister.Bits.SoftReset = true; + ControlRegister.cr.SoftReset = true; outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset); } -static inline -void BusLogic_HardReset(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_HardReset(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_ControlRegister_T ControlRegister; + union BusLogic_ControlRegister ControlRegister; ControlRegister.All = 0; - ControlRegister.Bits.HardReset = true; + ControlRegister.cr.HardReset = true; outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset); } -static inline -unsigned char BusLogic_ReadStatusRegister(BusLogic_HostAdapter_T *HostAdapter) +static inline unsigned char BusLogic_ReadStatusRegister(struct BusLogic_HostAdapter *HostAdapter) { return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset); } -static inline -void BusLogic_WriteCommandParameterRegister(BusLogic_HostAdapter_T - *HostAdapter, - unsigned char Value) +static inline void BusLogic_WriteCommandParameterRegister(struct BusLogic_HostAdapter + *HostAdapter, + unsigned char Value) { - outb(Value, - HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset); + outb(Value, HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset); } -static inline -unsigned char BusLogic_ReadDataInRegister(BusLogic_HostAdapter_T *HostAdapter) +static inline unsigned char BusLogic_ReadDataInRegister(struct BusLogic_HostAdapter *HostAdapter) { return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset); } -static inline -unsigned char BusLogic_ReadInterruptRegister(BusLogic_HostAdapter_T - *HostAdapter) +static inline unsigned char BusLogic_ReadInterruptRegister(struct BusLogic_HostAdapter *HostAdapter) { return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset); } -static inline -unsigned char BusLogic_ReadGeometryRegister(BusLogic_HostAdapter_T - *HostAdapter) +static inline unsigned char BusLogic_ReadGeometryRegister(struct BusLogic_HostAdapter *HostAdapter) { return inb(HostAdapter->IO_Address + BusLogic_GeometryRegisterOffset); } - /* BusLogic_StartMailboxCommand issues an Execute Mailbox Command, which notifies the Host Adapter that an entry has been made in an Outgoing Mailbox. */ -static inline -void BusLogic_StartMailboxCommand(BusLogic_HostAdapter_T *HostAdapter) +static inline void BusLogic_StartMailboxCommand(struct BusLogic_HostAdapter *HostAdapter) { - BusLogic_WriteCommandParameterRegister(HostAdapter, - BusLogic_ExecuteMailboxCommand); + BusLogic_WriteCommandParameterRegister(HostAdapter, BusLogic_ExecuteMailboxCommand); } - /* BusLogic_Delay waits for Seconds to elapse. */ @@ -1633,36 +1351,32 @@ mdelay(1000 * Seconds); } - /* Virtual_to_Bus and Bus_to_Virtual map between Kernel Virtual Addresses and PCI/VLB/EISA/ISA Bus Addresses. */ -static inline BusLogic_BusAddress_T Virtual_to_Bus(void *VirtualAddress) +static inline u32 Virtual_to_Bus(void *VirtualAddress) { - return (BusLogic_BusAddress_T) virt_to_bus(VirtualAddress); + return (u32) virt_to_bus(VirtualAddress); } -static inline void *Bus_to_Virtual(BusLogic_BusAddress_T BusAddress) +static inline void *Bus_to_Virtual(u32 BusAddress) { return (void *) bus_to_virt(BusAddress); } - /* Virtual_to_32Bit_Virtual maps between Kernel Virtual Addresses and 32 bit Kernel Virtual Addresses. This avoids compilation warnings on 64 bit architectures. */ -static inline -BusLogic_BusAddress_T Virtual_to_32Bit_Virtual(void *VirtualAddress) +static inline u32 Virtual_to_32Bit_Virtual(void *VirtualAddress) { - return (BusLogic_BusAddress_T) (unsigned long) VirtualAddress; + return (u32) (unsigned long) VirtualAddress; } - /* BusLogic_IncrementErrorCounter increments Error Counter by 1, stopping at 65535 rather than wrapping around to 0. @@ -1673,13 +1387,12 @@ if (*ErrorCounter < 65535) (*ErrorCounter)++; } - /* BusLogic_IncrementByteCounter increments Byte Counter by Amount. */ -static inline void BusLogic_IncrementByteCounter(BusLogic_ByteCounter_T - *ByteCounter, +static inline void BusLogic_IncrementByteCounter(struct BusLogic_ByteCounter + *ByteCounter, unsigned int Amount) { ByteCounter->Units += Amount; @@ -1690,13 +1403,12 @@ } } - /* BusLogic_IncrementSizeBucket increments the Bucket for Amount. */ static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T - CommandSizeBuckets, + CommandSizeBuckets, unsigned int Amount) { int Index = 0; @@ -1716,14 +1428,12 @@ CommandSizeBuckets[Index]++; } - /* Define the version number of the FlashPoint Firmware (SCCB Manager). */ #define FlashPoint_FirmwareVersion "5.02" - /* Define the possible return values from FlashPoint_HandleInterrupt. */ @@ -1732,54 +1442,28 @@ #define FlashPoint_InternalError 0xFE #define FlashPoint_ExternalBusReset 0xFF - /* Define prototypes for the forward referenced BusLogic Driver Internal Functions. */ -static void BusLogic_QueueCompletedCCB(BusLogic_CCB_T *); -static irqreturn_t BusLogic_InterruptHandler(int, void *, Registers_T *); -static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *, - SCSI_Command_T *, unsigned int); -static void BusLogic_Message(BusLogic_MessageLevel_T, char *, - BusLogic_HostAdapter_T *, ...); - -/* - Declare the Initialization Functions. -*/ - -static void BusLogic_AnnounceDriver(BusLogic_HostAdapter_T *) __init; -static void BusLogic_RegisterHostAdapter(BusLogic_HostAdapter_T *) __init; -static void BusLogic_UnregisterHostAdapter(BusLogic_HostAdapter_T *) __init; -static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *) __init; -static void BusLogic_DestroyCCBs(BusLogic_HostAdapter_T *) __init; -static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T) __init; -static void -BusLogic_InitializeProbeInfoListISA(BusLogic_HostAdapter_T *) __init; -static void BusLogic_SortProbeInfo(BusLogic_ProbeInfo_T *, int) __init; -static int -BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T *) __init; -static int -BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T *) __init; -static void BusLogic_InitializeProbeInfoList(BusLogic_HostAdapter_T *) __init; -static boolean BusLogic_Failure(BusLogic_HostAdapter_T *, char *) __init; -static boolean BusLogic_ProbeHostAdapter(BusLogic_HostAdapter_T *) __init; -static boolean BusLogic_CheckHostAdapter(BusLogic_HostAdapter_T *) __init; -static boolean -BusLogic_ReadHostAdapterConfiguration(BusLogic_HostAdapter_T *) __init; -static boolean -BusLogic_ReportHostAdapterConfiguration(BusLogic_HostAdapter_T *) __init; -static boolean BusLogic_AcquireResources(BusLogic_HostAdapter_T *) __init; -static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *) __init; -static boolean BusLogic_TargetDeviceInquiry(BusLogic_HostAdapter_T *) __init; -static void BusLogic_InitializeHostStructure(BusLogic_HostAdapter_T *, - SCSI_Host_T *) __init; -int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *) __init; -int BusLogic_ReleaseHostAdapter(SCSI_Host_T *) __init; -static boolean BusLogic_ParseKeyword(char **, char *) __init; -static int BusLogic_ParseDriverOptions(char *) __init; -static int BusLogic_Setup(char *) __init; - +static const char *BusLogic_DriverInfo(struct Scsi_Host *); +static int BusLogic_DetectHostAdapter(struct scsi_host_template *); +static int BusLogic_ReleaseHostAdapter(struct Scsi_Host *); +static int BusLogic_QueueCommand(struct scsi_cmnd *, + void (*CompletionRoutine)(struct scsi_cmnd *)); +static int BusLogic_BIOSDiskParameters(struct scsi_device *, + struct block_device *, + sector_t, int *); +static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, + char **, off_t, int, int); +static int BusLogic_SlaveConfigure(struct scsi_device *); +static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *); +static irqreturn_t BusLogic_InterruptHandler(int, void *, struct pt_regs *); +static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, + boolean HardReset); +static void BusLogic_Message(enum BusLogic_MessageLevel, char *, + struct BusLogic_HostAdapter *, ...); +static int __init BusLogic_Setup(char *); -#endif /* BusLogic_DriverVersion */ +#endif /* _BUSLOGIC_H */ diff -Nru a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c --- a/drivers/scsi/FlashPoint.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/FlashPoint.c Tue Feb 17 20:00:06 2004 @@ -12053,14 +12053,14 @@ */ static inline unsigned char -FlashPoint__ProbeHostAdapter(FlashPoint_Info_T *FlashPointInfo) +FlashPoint__ProbeHostAdapter(struct FlashPoint_Info *FlashPointInfo) { return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo); } static inline FlashPoint_CardHandle_T -FlashPoint__HardwareResetHostAdapter(FlashPoint_Info_T *FlashPointInfo) +FlashPoint__HardwareResetHostAdapter(struct FlashPoint_Info *FlashPointInfo) { return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo); } @@ -12073,14 +12073,14 @@ static inline void -FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB) +FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB) { FlashPoint_StartCCB(CardHandle, (PSCCB) CCB); } static inline void -FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB) +FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB) { FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB); } @@ -12143,11 +12143,11 @@ Define prototypes for the FlashPoint SCCB Manager Functions. */ -extern unsigned char FlashPoint_ProbeHostAdapter(FlashPoint_Info_T *); +extern unsigned char FlashPoint_ProbeHostAdapter(struct FlashPoint_Info *); extern FlashPoint_CardHandle_T - FlashPoint_HardwareResetHostAdapter(FlashPoint_Info_T *); -extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *); -extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *); + FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *); +extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *); +extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *); extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T); extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T); extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T); diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig --- a/drivers/scsi/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/Kconfig Tue Feb 17 20:00:08 2004 @@ -376,23 +376,6 @@ To compile this driver as a module, choose M here: the module will be called in2000. -# does not use pci dma and seems to be onboard only for old machines -config SCSI_AM53C974 - tristate "AM53/79C974 PCI SCSI support" - depends on X86 && PCI && SCSI && BROKEN - ---help--- - This is support for the AM53/79C974 SCSI host adapters. Please read - for details. Also, the - SCSI-HOWTO, available from - , is for you. - - Note that there is another driver for AM53C974 based adapters: - "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above. You - can pick either one. - - To compile this driver as a module, choose M here: the - module will be called AM53C974. - config SCSI_MEGARAID tristate "AMI MegaRAID support" depends on PCI && SCSI @@ -903,7 +886,7 @@ language. It does not support LSI53C10XX Ultra-320 PCI-X SCSI controllers; you need to use the Fusion MPT driver for that. - Please read for more + Please read for more information. config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE diff -Nru a/drivers/scsi/Makefile b/drivers/scsi/Makefile --- a/drivers/scsi/Makefile Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/Makefile Tue Feb 17 20:00:07 2004 @@ -87,7 +87,6 @@ obj-$(CONFIG_SCSI_EATA) += eata.o obj-$(CONFIG_SCSI_DC395x) += dc395x.o obj-$(CONFIG_SCSI_DC390T) += tmscsim.o -obj-$(CONFIG_SCSI_AM53C974) += AM53C974.o obj-$(CONFIG_SCSI_MEGARAID) += megaraid.o obj-$(CONFIG_SCSI_ACARD) += atp870u.o obj-$(CONFIG_SCSI_SUNESP) += esp.o diff -Nru a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c --- a/drivers/scsi/advansys.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/advansys.c Tue Feb 17 20:00:06 2004 @@ -6018,8 +6018,8 @@ } else { /* Append to 'done_scp' at the end with 'last_scp'. */ ASC_ASSERT(last_scp != NULL); - REQPNEXT(last_scp) = asc_dequeue_list(&boardp->active, - &new_last_scp, ASC_TID_ALL); + last_scp->host_scribble = (unsigned char *)asc_dequeue_list( + &boardp->active, &new_last_scp, ASC_TID_ALL); if (new_last_scp != NULL) { ASC_ASSERT(REQPNEXT(last_scp) != NULL); for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) { @@ -6041,8 +6041,8 @@ } else { /* Append to 'done_scp' at the end with 'last_scp'. */ ASC_ASSERT(last_scp != NULL); - REQPNEXT(last_scp) = asc_dequeue_list(&boardp->waiting, - &new_last_scp, ASC_TID_ALL); + last_scp->host_scribble = (unsigned char *)asc_dequeue_list( + &boardp->waiting, &new_last_scp, ASC_TID_ALL); if (new_last_scp != NULL) { ASC_ASSERT(REQPNEXT(last_scp) != NULL); for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) { @@ -6310,8 +6310,8 @@ ASC_TID_ALL); } else { ASC_ASSERT(last_scp != NULL); - REQPNEXT(last_scp) = asc_dequeue_list(&boardp->done, - &new_last_scp, ASC_TID_ALL); + last_scp->host_scribble = (unsigned char *)asc_dequeue_list( + &boardp->done, &new_last_scp, ASC_TID_ALL); if (new_last_scp != NULL) { ASC_ASSERT(REQPNEXT(last_scp) != NULL); last_scp = new_last_scp; @@ -6383,7 +6383,7 @@ while (scp != NULL) { ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong) scp); tscp = REQPNEXT(scp); - REQPNEXT(scp) = NULL; + scp->host_scribble = NULL; ASC_STATS(scp->device->host, done); ASC_ASSERT(scp->scsi_done != NULL); if (from_isr) @@ -7434,7 +7434,7 @@ tid = REQPTID(reqp); ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID); if (flag == ASC_FRONT) { - REQPNEXT(reqp) = ascq->q_first[tid]; + reqp->host_scribble = (unsigned char *)ascq->q_first[tid]; ascq->q_first[tid] = reqp; /* If the queue was empty, set the last pointer. */ if (ascq->q_last[tid] == NULL) { @@ -7442,10 +7442,10 @@ } } else { /* ASC_BACK */ if (ascq->q_last[tid] != NULL) { - REQPNEXT(ascq->q_last[tid]) = reqp; + ascq->q_last[tid]->host_scribble = (unsigned char *)reqp; } ascq->q_last[tid] = reqp; - REQPNEXT(reqp) = NULL; + reqp->host_scribble = NULL; /* If the queue was empty, set the first pointer. */ if (ascq->q_first[tid] == NULL) { ascq->q_first[tid] = reqp; @@ -7566,7 +7566,7 @@ lastp = ascq->q_last[i]; } else { ASC_ASSERT(lastp != NULL); - REQPNEXT(lastp) = ascq->q_first[i]; + lastp->host_scribble = (unsigned char *)ascq->q_first[i]; lastp = ascq->q_last[i]; } ascq->q_first[i] = ascq->q_last[i] = NULL; @@ -7644,8 +7644,8 @@ currp; prevp = currp, currp = REQPNEXT(currp)) { if (currp == reqp) { ret = ASC_TRUE; - REQPNEXT(prevp) = REQPNEXT(currp); - REQPNEXT(reqp) = NULL; + prevp->host_scribble = (unsigned char *)REQPNEXT(currp); + reqp->host_scribble = NULL; if (ascq->q_last[tid] == reqp) { ascq->q_last[tid] = prevp; } diff -Nru a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c --- a/drivers/scsi/aha152x.c Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/aha152x.c Tue Feb 17 20:00:05 2004 @@ -1,6 +1,6 @@ /* aha152x.c -- Adaptec AHA-152x driver * Author: Jürgen E. Fischer, fischer@norbit.de - * Copyright 1993-2000 Jürgen E. Fischer + * Copyright 1993-2004 Jürgen E. Fischer * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -13,9 +13,17 @@ * General Public License for more details. * * - * $Id: aha152x.c,v 2.6 2003/10/30 20:52:47 fischer Exp $ + * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $ * * $Log: aha152x.c,v $ + * Revision 2.7 2004/01/24 11:42:59 fischer + * - gather code that is not used by PCMCIA at the end + * - move request_region for !PCMCIA case to detection + * - migration to new scsi host api (remove legacy code) + * - free host scribble before scsi_done + * - fix error handling + * - one isapnp device added to id_table + * * Revision 2.6 2003/10/30 20:52:47 fischer * - interfaces changes for kernel 2.6 * - aha152x_probe_one introduced for pcmcia stub @@ -344,7 +352,8 @@ MODULE_DESCRIPTION(AHA152X_REVID); MODULE_LICENSE("GPL"); -#if defined(MODULE) && !defined(PCMCIA) +#if !defined(PCMCIA) +#if defined(MODULE) MODULE_PARM(io, "1-2i"); MODULE_PARM_DESC(io,"base io address of controller"); static int io[] = {0, 0}; @@ -398,21 +407,23 @@ MODULE_PARM_DESC(aha152x1, "parameters for second controller"); static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT}; #endif /* !defined(AHA152X_DEBUG) */ -#endif /* MODULE && !PCMCIA */ +#endif /* MODULE */ #ifdef __ISAPNP__ static struct isapnp_device_id id_table[] __devinitdata = { - { ISAPNP_DEVICE_SINGLE('A','D','P',0x1505, 'A','D','P',0x1505), }, + { ISAPNP_ANY_ID, ISAPNP_ANY_ID, + ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 }, + { ISAPNP_ANY_ID, ISAPNP_ANY_ID, + ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 }, { ISAPNP_DEVICE_SINGLE_END, } }; MODULE_DEVICE_TABLE(isapnp, id_table); #endif /* ISAPNP */ -/* set by aha152x_setup according to the command line */ -static int setup_count; -static int registered_count; -static struct aha152x_setup setup[2]; -static struct Scsi_Host *aha152x_host[2]; +#endif /* !PCMCIA */ + +static int registered_count=0; +static struct Scsi_Host *aha152x_host[2] = {0, 0}; static Scsi_Host_Template aha152x_driver_template; /* @@ -658,7 +669,6 @@ static void reset_ports(struct Scsi_Host *shpnt); static void aha152x_error(struct Scsi_Host *shpnt, char *msg); static void done(struct Scsi_Host *shpnt, int error); -static int checksetup(struct aha152x_setup *setup); /* diagnostics */ static void disp_ports(struct Scsi_Host *shpnt); @@ -666,66 +676,6 @@ static void show_queues(struct Scsi_Host *shpnt); static void disp_enintr(struct Scsi_Host *shpnt); -/* possible i/o addresses for the AIC-6260; default first */ -static unsigned short ports[] = { 0x340, 0x140 }; - -#if !defined(SKIP_BIOSTEST) -/* possible locations for the Adaptec BIOS; defaults first */ -static unsigned int addresses[] = -{ - 0xdc000, /* default first */ - 0xc8000, - 0xcc000, - 0xd0000, - 0xd4000, - 0xd8000, - 0xe0000, - 0xeb800, /* VTech Platinum SMP */ - 0xf0000, -}; - -/* signatures for various AIC-6[23]60 based controllers. - The point in detecting signatures is to avoid useless and maybe - harmful probes on ports. I'm not sure that all listed boards pass - auto-configuration. For those which fail the BIOS signature is - obsolete, because user intervention to supply the configuration is - needed anyway. May be an information whether or not the BIOS supports - extended translation could be also useful here. */ -static struct signature { - unsigned char *signature; - int sig_offset; - int sig_length; -} signatures[] = -{ - { "Adaptec AHA-1520 BIOS", 0x102e, 21 }, - /* Adaptec 152x */ - { "Adaptec AHA-1520B", 0x000b, 17 }, - /* Adaptec 152x rev B */ - { "Adaptec AHA-1520B", 0x0026, 17 }, - /* Iomega Jaz Jet ISA (AIC6370Q) */ - { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, - /* on-board controller */ - { "Adaptec BIOS: ASW-B626", 0x000f, 22 }, - /* on-board controller */ - { "Adaptec ASW-B626 S2", 0x2e6c, 19 }, - /* on-board controller */ - { "Adaptec BIOS:AIC-6360", 0x000c, 21 }, - /* on-board controller */ - { "ScsiPro SP-360 BIOS", 0x2873, 19 }, - /* ScsiPro-Controller */ - { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 }, - /* Gigabyte Local-Bus-SCSI */ - { "Adaptec BIOS:AVA-282X", 0x000c, 21 }, - /* Adaptec 282x */ - { "Adaptec IBM Dock II SCSI", 0x2edd, 24 }, - /* IBM Thinkpad Dock II */ - { "Adaptec BIOS:AHA-1532P", 0x001c, 22 }, - /* IBM Thinkpad Dock II SCSI */ - { "DTC3520A Host Adapter BIOS", 0x318a, 26 }, - /* DTC 3520A ISA SCSI */ -}; -#endif - /* * queue services: @@ -799,141 +749,6 @@ return ptr; } -#if defined(PCMCIA) || !defined(MODULE) -static void aha152x_setup(char *str, int *ints) -{ - if(setup_count>=ARRAY_SIZE(setup)) { - printk(KERN_ERR "aha152x: you can only configure up to two controllers\n"); - return; - } - - setup[setup_count].conf = str; - setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340; - setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11; - setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7; - setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1; - setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1; - setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1; - setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT; - setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0; -#if defined(AHA152X_DEBUG) - setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT; - if (ints[0] > 9) { - printk(KERN_NOTICE "aha152x: usage: aha152x=[,[," - "[,[,[,[,[,[,]]]]]]]]\n"); -#else - if (ints[0] > 8) { /*}*/ - printk(KERN_NOTICE "aha152x: usage: aha152x=[,[," - "[,[,[,[,[,]]]]]]]\n"); -#endif - } else { - setup_count++; - } -} -#endif - -#if !defined(MODULE) -static int __init do_setup(char *str) -{ - -#if defined(AHA152X_DEBUG) - int ints[11]; -#else - int ints[10]; -#endif - int count=setup_count; - - get_options(str, ARRAY_SIZE(ints), ints); - aha152x_setup(str,ints); - - return countio_port)) { - setup->tc1550=0; - } else if(tc1550_porttest(setup->io_port)) { - setup->tc1550=1; - } else { - release_region(setup->io_port, IO_RANGE); - return 0; - } - - release_region(setup->io_port, IO_RANGE); - - - if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX)) - return 0; - - if ((setup->scsiid < 0) || (setup->scsiid > 7)) - return 0; - - if ((setup->reconnect < 0) || (setup->reconnect > 1)) - return 0; - - if ((setup->parity < 0) || (setup->parity > 1)) - return 0; - - if ((setup->synchronous < 0) || (setup->synchronous > 1)) - return 0; - - if ((setup->ext_trans < 0) || (setup->ext_trans > 1)) - return 0; - - - return 1; -} - static inline struct Scsi_Host *lookup_irq(int irqno) { int i; @@ -950,7 +765,6 @@ struct Scsi_Host *shpnt = lookup_irq(irqno); if (!shpnt) { - /* no point using HOSTNO here! */ printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno); return IRQ_NONE; } @@ -961,17 +775,19 @@ return IRQ_HANDLED; } - struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) { struct Scsi_Host *shpnt; shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata)); if (!shpnt) { - printk(KERN_ERR "aha152x: scsi_register failed\n"); + printk(KERN_ERR "aha152x: scsi_host_alloc failed\n"); return NULL; } + /* need to have host registered before triggering any interrupt */ + aha152x_host[registered_count] = shpnt; + memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt)); shpnt->io_port = setup->io_port; @@ -1034,24 +850,19 @@ DELAY, EXT_TRANS ? "enabled" : "disabled"); - if (!request_region(shpnt->io_port, IO_RANGE, "aha152x")) - goto out_unregister; - /* not expecting any interrupts */ SETPORT(SIMODE0, 0); SETPORT(SIMODE1, 0); - if (request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) { - printk(KERN_ERR "aha152x%d: driver needs an IRQ.\n", shpnt->host_no); - goto out_release_region; + if( request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { + printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq); + goto out_host_put; } HOSTDATA(shpnt)->swint = 0; printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no); - /* need to have host registered before triggering any interrupt */ - aha152x_host[registered_count] = shpnt; mb(); SETPORT(DMACNTRL0, SWINT|INTEN); mdelay(1000); @@ -1066,9 +877,9 @@ SETPORT(DMACNTRL0, INTEN); - printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong. " + printk(KERN_ERR "aha152x%d: irq %d possibly wrong. " "Please verify.\n", shpnt->host_no, shpnt->irq); - goto out_unregister_host; + goto out_host_put; } printk("ok.\n"); @@ -1077,322 +888,50 @@ SETPORT(SSTAT0, 0x7f); SETPORT(SSTAT1, 0xef); - if (request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) { - printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n", shpnt->host_no); - goto out_unregister_host; - } - - scsi_add_host(shpnt, 0); - scsi_scan_host(shpnt); - return shpnt; /* the pcmcia stub needs the return value; */ - -out_unregister_host: - aha152x_host[registered_count] = NULL; -out_release_region: - release_region(shpnt->io_port, IO_RANGE); -out_unregister: - scsi_host_put(shpnt); - return NULL; -} - -static int __init aha152x_init(void) -{ - int i, j, ok; -#if defined(AUTOCONF) - aha152x_config conf; -#endif -#ifdef __ISAPNP__ - struct pnp_dev *dev=0, *pnpdev[2] = {0, 0}; -#endif - - if (setup_count) { - printk(KERN_INFO "aha152x: processing commandline: "); - - for (i = 0; i < setup_count; i++) - if (!checksetup(&setup[i])) { - printk(KERN_ERR "\naha152x: %s\n", setup[i].conf); - printk(KERN_ERR "aha152x: invalid line\n"); - } - printk("ok\n"); - } - -#if defined(SETUP0) - if (setup_count < ARRAY_SIZE(setup)) { - struct aha152x_setup override = SETUP0; - - if (setup_count == 0 || (override.io_port != setup[0].io_port)) { - if (!checksetup(&override)) { - printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n", - override.io_port, - override.irq, - override.scsiid, - override.reconnect, - override.parity, - override.synchronous, - override.delay, - override.ext_trans); - } else - setup[setup_count++] = override; - } - } -#endif - -#if defined(SETUP1) - if (setup_count < ARRAY_SIZE(setup)) { - struct aha152x_setup override = SETUP1; - - if (setup_count == 0 || (override.io_port != setup[0].io_port)) { - if (!checksetup(&override)) { - printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n", - override.io_port, - override.irq, - override.scsiid, - override.reconnect, - override.parity, - override.synchronous, - override.delay, - override.ext_trans); - } else - setup[setup_count++] = override; - } - } -#endif - -#if defined(MODULE) && !defined(PCMCIA) - if (setup_countirq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { + printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq); + goto out_host_put; } -#endif -#ifdef __ISAPNP__ - while ( setup_countirq, shpnt); + printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no); + goto out_host_put; } -#endif - -#if defined(AUTOCONF) - if (setup_countpnpdev=pnpdev[i]; -#endif - registered_count++; - } - } +out_host_put: + aha152x_host[registered_count]=0; + scsi_host_put(shpnt); - return registered_count>0; + return 0; } -static int aha152x_release(struct Scsi_Host *shpnt) +void aha152x_release(struct Scsi_Host *shpnt) { + if(!shpnt) + return; + if (shpnt->irq) free_irq(shpnt->irq, shpnt); +#if !defined(PCMCIA) if (shpnt->io_port) release_region(shpnt->io_port, IO_RANGE); +#endif #ifdef __ISAPNP__ if (HOSTDATA(shpnt)->pnpdev) pnp_device_detach(HOSTDATA(shpnt)->pnpdev); #endif + scsi_remove_host(shpnt); scsi_host_put(shpnt); - - return 0; -} - -static void __exit aha152x_exit(void) -{ - int i; - - for(i=0; idebug & debug_queue) { - printk(INFO_LEAD "queue: cmd_len=%d pieces=%d size=%u cmnd=", - CMDINFO(SCpnt), SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen); + printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=", + CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen); print_command(SCpnt->cmnd); } #endif @@ -1466,7 +1005,7 @@ return FAILED; } } else { - SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); + SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); if(SCpnt->host_scribble==0) { printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt)); return FAILED; @@ -1561,11 +1100,6 @@ Scsi_Cmnd *ptr; unsigned long flags; - if(!shpnt) { - printk(ERR_LEAD "abort(%p): no host structure\n", CMDINFO(SCpnt), SCpnt); - return FAILED; - } - #if defined(AHA152X_DEBUG) if(HOSTDATA(shpnt)->debug & debug_eh) { printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt); @@ -1610,15 +1144,12 @@ Scsi_Cmnd *SCp = (Scsi_Cmnd *)p; struct semaphore *sem = SCSEM(SCp); struct Scsi_Host *shpnt = SCp->device->host; + unsigned long flags; /* remove command from issue queue */ - if(remove_SC(&ISSUE_SC, SCp)) { - printk(KERN_INFO "aha152x: ABORT timed out - removed from issue queue\n"); - kfree(SCp->host_scribble); - SCp->host_scribble=0; - } else { - printk(KERN_INFO "aha152x: ABORT timed out - not on issue queue\n"); - } + DO_LOCK(flags); + remove_SC(&ISSUE_SC, SCp); + DO_UNLOCK(flags); up(sem); } @@ -1626,15 +1157,14 @@ /* * Reset a device * - * FIXME: never seen this live. might lockup... - * */ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) { struct Scsi_Host *shpnt = SCpnt->device->host; DECLARE_MUTEX_LOCKED(sem); struct timer_list timer; - int ret; + int ret, issued, disconnected; + unsigned long flags; #if defined(AHA152X_DEBUG) if(HOSTDATA(shpnt)->debug & debug_eh) { @@ -1648,13 +1178,18 @@ return FAILED; } + DO_LOCK(flags); + issued = remove_SC(&ISSUE_SC, SCpnt)==0; + disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt); + DO_UNLOCK(flags); + SCpnt->cmd_len = 0; SCpnt->use_sg = 0; SCpnt->request_buffer = 0; SCpnt->request_bufflen = 0; init_timer(&timer); - timer.data = (unsigned long) cmd; + timer.data = (unsigned long) SCpnt; timer.expires = jiffies + 100*HZ; /* 10s */ timer.function = (void (*)(unsigned long)) timer_expired; @@ -1662,18 +1197,35 @@ add_timer(&timer); down(&sem); del_timer(&timer); - + SCpnt->cmd_len = SCpnt->old_cmd_len; SCpnt->use_sg = SCpnt->old_use_sg; SCpnt->request_buffer = SCpnt->buffer; SCpnt->request_bufflen = SCpnt->bufflen; + DO_LOCK(flags); + if(SCpnt->SCp.phase & resetted) { + HOSTDATA(shpnt)->commands--; + if (!HOSTDATA(shpnt)->commands) + SETPORT(PORTA, 0); + kfree(SCpnt->host_scribble); + SCpnt->host_scribble=0; + ret = SUCCESS; } else { + /* requeue */ + if(!issued) { + append_SC(&ISSUE_SC, SCpnt); + } else if(disconnected) { + append_SC(&DISCONNECTED_SC, SCpnt); + } + ret = FAILED; } + DO_UNLOCK(flags); + spin_lock_irq(shpnt->host_lock); return ret; } @@ -1681,13 +1233,17 @@ static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs) { Scsi_Cmnd *ptr; - unsigned long flags; - - DO_LOCK(flags); ptr=*SCs; while(ptr) { - Scsi_Cmnd *next = SCNEXT(ptr); + Scsi_Cmnd *next; + + if(SCDATA(ptr)) { + next = SCNEXT(ptr); + } else { + printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr); + next = 0; + } if (!ptr->device->soft_reset) { DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr); @@ -1699,8 +1255,6 @@ ptr = next; } - - DO_UNLOCK(flags); } /* @@ -1712,6 +1266,8 @@ struct Scsi_Host *shpnt = SCpnt->device->host; unsigned long flags; + DO_LOCK(flags); + #if defined(AHA152X_DEBUG) if(HOSTDATA(shpnt)->debug & debug_eh) { printk(DEBUG_LEAD "aha152x_bus_reset(%p)", CMDINFO(SCpnt), SCpnt); @@ -1729,12 +1285,12 @@ SETPORT(SCSISEQ, 0); mdelay(DELAY); - DPRINTK(debug_eh, DEBUG_LEAD "bus reset returns\n", CMDINFO(SCpnt)); + DPRINTK(debug_eh, DEBUG_LEAD "bus resetted\n", CMDINFO(SCpnt)); - DO_LOCK(flags); setup_expected_interrupts(shpnt); if(HOSTDATA(shpnt)->commands==0) SETPORT(PORTA, 0); + DO_UNLOCK(flags); return SUCCESS; @@ -2000,6 +1556,7 @@ #if defined(AHA152X_STAT) action++; #endif + if(DONE_SC->SCp.phase & check_condition) { #if 0 if(HOSTDATA(shpnt)->debug & debug_eh) { @@ -2029,47 +1586,57 @@ #endif if(!(DONE_SC->SCp.Status & not_issued)) { + Scsi_Cmnd *ptr = DONE_SC; + DONE_SC=0; #if 0 - DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(DONE_SC)); + DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr)); #endif - DONE_SC->cmnd[0] = REQUEST_SENSE; - DONE_SC->cmnd[1] = 0; - DONE_SC->cmnd[2] = 0; - DONE_SC->cmnd[3] = 0; - DONE_SC->cmnd[4] = sizeof(DONE_SC->sense_buffer); - DONE_SC->cmnd[5] = 0; - DONE_SC->cmd_len = 6; - DONE_SC->use_sg = 0; - DONE_SC->request_buffer = DONE_SC->sense_buffer; - DONE_SC->request_bufflen = sizeof(DONE_SC->sense_buffer); + ptr->cmnd[0] = REQUEST_SENSE; + ptr->cmnd[1] = 0; + ptr->cmnd[2] = 0; + ptr->cmnd[3] = 0; + ptr->cmnd[4] = sizeof(ptr->sense_buffer); + ptr->cmnd[5] = 0; + ptr->cmd_len = 6; + ptr->use_sg = 0; + ptr->request_buffer = ptr->sense_buffer; + ptr->request_bufflen = sizeof(ptr->sense_buffer); DO_UNLOCK(flags); - aha152x_internal_queue(DONE_SC, 0, check_condition, DONE_SC->scsi_done); + aha152x_internal_queue(ptr, 0, check_condition, ptr->scsi_done); DO_LOCK(flags); - - DONE_SC=0; - } else { #if 0 + } else { DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC)); #endif } } if(DONE_SC && DONE_SC->scsi_done) { +#if defined(AHA152X_DEBUG) + int hostno=DONE_SC->device->host->host_no; + int id=DONE_SC->device->id & 0xf; + int lun=DONE_SC->device->lun & 0x7; +#endif + Scsi_Cmnd *ptr = DONE_SC; + DONE_SC=0; + /* turn led off, when no commands are in the driver */ HOSTDATA(shpnt)->commands--; if (!HOSTDATA(shpnt)->commands) SETPORT(PORTA, 0); /* turn led off */ + if(ptr->scsi_done != reset_done) { + kfree(ptr->host_scribble); + ptr->host_scribble=0; + } + DO_UNLOCK(flags); - DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", CMDINFO(DONE_SC), DONE_SC); - DONE_SC->scsi_done(DONE_SC); - DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", CMDINFO(DONE_SC), DONE_SC); + DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr); + ptr->scsi_done(ptr); + DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr); DO_LOCK(flags); - - kfree(DONE_SC->host_scribble); - DONE_SC->host_scribble=0; } DONE_SC=0; @@ -2936,11 +2503,11 @@ if (!ptr->device->soft_reset) { remove_SC(&DISCONNECTED_SC, ptr); - ptr->result = DID_RESET << 16; - ptr->scsi_done(ptr); - kfree(ptr->host_scribble); ptr->host_scribble=0; + + ptr->result = DID_RESET << 16; + ptr->scsi_done(ptr); } ptr = next; @@ -3382,7 +2949,11 @@ printk("aborted|"); if (ptr->SCp.phase & resetted) printk("resetted|"); - printk("; next=0x%p\n", SCNEXT(ptr)); + if( SCDATA(ptr) ) { + printk("; next=0x%p\n", SCNEXT(ptr)); + } else { + printk("; next=(host scribble NULL)\n"); + } } /* @@ -3406,7 +2977,7 @@ printk(KERN_DEBUG "none\n"); printk(KERN_DEBUG "disconnected_SC:\n"); - for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr)) + for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : 0) show_command(ptr); disp_ports(shpnt); @@ -3914,7 +3485,494 @@ .use_clustering = DISABLE_CLUSTERING, }; -#ifndef PCMCIA +#if !defined(PCMCIA) +static int setup_count; +static struct aha152x_setup setup[2]; + +/* possible i/o addresses for the AIC-6260; default first */ +static unsigned short ports[] = { 0x340, 0x140 }; + +#if !defined(SKIP_BIOSTEST) +/* possible locations for the Adaptec BIOS; defaults first */ +static unsigned int addresses[] = +{ + 0xdc000, /* default first */ + 0xc8000, + 0xcc000, + 0xd0000, + 0xd4000, + 0xd8000, + 0xe0000, + 0xeb800, /* VTech Platinum SMP */ + 0xf0000, +}; + +/* signatures for various AIC-6[23]60 based controllers. + The point in detecting signatures is to avoid useless and maybe + harmful probes on ports. I'm not sure that all listed boards pass + auto-configuration. For those which fail the BIOS signature is + obsolete, because user intervention to supply the configuration is + needed anyway. May be an information whether or not the BIOS supports + extended translation could be also useful here. */ +static struct signature { + unsigned char *signature; + int sig_offset; + int sig_length; +} signatures[] = +{ + { "Adaptec AHA-1520 BIOS", 0x102e, 21 }, + /* Adaptec 152x */ + { "Adaptec AHA-1520B", 0x000b, 17 }, + /* Adaptec 152x rev B */ + { "Adaptec AHA-1520B", 0x0026, 17 }, + /* Iomega Jaz Jet ISA (AIC6370Q) */ + { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, + /* on-board controller */ + { "Adaptec BIOS: ASW-B626", 0x000f, 22 }, + /* on-board controller */ + { "Adaptec ASW-B626 S2", 0x2e6c, 19 }, + /* on-board controller */ + { "Adaptec BIOS:AIC-6360", 0x000c, 21 }, + /* on-board controller */ + { "ScsiPro SP-360 BIOS", 0x2873, 19 }, + /* ScsiPro-Controller */ + { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 }, + /* Gigabyte Local-Bus-SCSI */ + { "Adaptec BIOS:AVA-282X", 0x000c, 21 }, + /* Adaptec 282x */ + { "Adaptec IBM Dock II SCSI", 0x2edd, 24 }, + /* IBM Thinkpad Dock II */ + { "Adaptec BIOS:AHA-1532P", 0x001c, 22 }, + /* IBM Thinkpad Dock II SCSI */ + { "DTC3520A Host Adapter BIOS", 0x318a, 26 }, + /* DTC 3520A ISA SCSI */ +}; +#endif /* !SKIP_BIOSTEST */ + +/* + * Test, if port_base is valid. + * + */ +static int aha152x_porttest(int io_port) +{ + int i; + + SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */ + for (i = 0; i < 16; i++) + SETPORT(io_port + O_STACK, i); + + SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */ + for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++) + ; + + return (i == 16); +} + +static int tc1550_porttest(int io_port) +{ + int i; + + SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */ + for (i = 0; i < 16; i++) + SETPORT(io_port + O_STACK, i); + + SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */ + for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++) + ; + + return (i == 16); +} + + +static int checksetup(struct aha152x_setup *setup) +{ + int i; + for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++) + ; + + if (i == ARRAY_SIZE(ports)) + return 0; + + if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) { + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port); + return 0; + } + + if( aha152x_porttest(setup->io_port) ) { + setup->tc1550=0; + } else if( tc1550_porttest(setup->io_port) ) { + setup->tc1550=1; + } else { + release_region(setup->io_port, IO_RANGE); + return 0; + } + + release_region(setup->io_port, IO_RANGE); + + if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX)) + return 0; + + if ((setup->scsiid < 0) || (setup->scsiid > 7)) + return 0; + + if ((setup->reconnect < 0) || (setup->reconnect > 1)) + return 0; + + if ((setup->parity < 0) || (setup->parity > 1)) + return 0; + + if ((setup->synchronous < 0) || (setup->synchronous > 1)) + return 0; + + if ((setup->ext_trans < 0) || (setup->ext_trans > 1)) + return 0; + + + return 1; +} + + +static int __init aha152x_init(void) +{ + int i, j, ok; +#if defined(AUTOCONF) + aha152x_config conf; +#endif +#ifdef __ISAPNP__ + struct pnp_dev *dev=0, *pnpdev[2] = {0, 0}; +#endif + + if ( setup_count ) { + printk(KERN_INFO "aha152x: processing commandline: "); + + for (i = 0; ipnpdev=pnpdev[i]; + pnpdev[i]=0; +#endif + } + } else { + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port); + } + +#if defined(__ISAPNP__) + if( pnpdev[i] ) + pnp_device_detach(pnpdev[i]); +#endif + } + + return registered_count>0; +} + +static void __exit aha152x_exit(void) +{ + int i; + + for(i=0; i=ARRAY_SIZE(setup)) { + printk(KERN_ERR "aha152x: you can only configure up to two controllers\n"); + return 1; + } + + setup[setup_count].conf = str; + setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340; + setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11; + setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7; + setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1; + setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1; + setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1; + setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT; + setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0; +#if defined(AHA152X_DEBUG) + setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT; + if (ints[0] > 9) { + printk(KERN_NOTICE "aha152x: usage: aha152x=[,[," + "[,[,[,[,[,[,]]]]]]]]\n"); +#else + if (ints[0] > 8) { /*}*/ + printk(KERN_NOTICE "aha152x: usage: aha152x=[,[," + "[,[,[,[,[,]]]]]]]\n"); +#endif + } else { + setup_count++; + return 0; + } + + return 1; +} +__setup("aha152x=", aha152x_setup); #endif + +#endif /* !PCMCIA */ diff -Nru a/drivers/scsi/aha152x.h b/drivers/scsi/aha152x.h --- a/drivers/scsi/aha152x.h Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/aha152x.h Tue Feb 17 20:00:07 2004 @@ -2,14 +2,14 @@ #define _AHA152X_H /* - * $Id: aha152x.h,v 2.5 2002/04/14 11:24:12 fischer Exp $ + * $Id: aha152x.h,v 2.7 2004/01/24 11:39:03 fischer Exp $ */ /* number of queueable commands (unless we support more than 1 cmd_per_lun this should do) */ #define AHA152X_MAXQUEUE 7 -#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.5 $" +#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.7 $" /* port addresses */ #define SCSISEQ (HOSTIOPORT0+0x00) /* SCSI sequence control */ @@ -331,6 +331,7 @@ }; struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *); -int aha152x_host_reset(struct scsi_cmnd *); +void aha152x_release(struct Scsi_Host *); +int aha152x_host_reset(Scsi_Cmnd *); #endif /* _AHA152X_H */ diff -Nru a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c --- a/drivers/scsi/aha1542.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/aha1542.c Tue Feb 17 20:00:07 2004 @@ -704,11 +704,14 @@ #endif int i; ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */ - SCpnt->host_scribble = (unsigned char *) kmalloc(512, GFP_DMA); + SCpnt->host_scribble = (unsigned char *) kmalloc(512, GFP_KERNEL | GFP_DMA); sgpnt = (struct scatterlist *) SCpnt->request_buffer; cptr = (struct chain *) SCpnt->host_scribble; - if (cptr == NULL) - panic("aha1542.c: unable to allocate DMA memory\n"); + if (cptr == NULL) { + /* free the claimed mailbox slot */ + HOSTDATA(SCpnt->device->host)->SCint[mbo] = NULL; + return SCSI_MLQUEUE_HOST_BUSY; + } for (i = 0; i < SCpnt->use_sg; i++) { if (sgpnt[i].length == 0 || SCpnt->use_sg > 16 || (((int) sgpnt[i].offset) & 1) || (sgpnt[i].length & 1)) { diff -Nru a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c --- a/drivers/scsi/arm/acornscsi.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/arm/acornscsi.c Tue Feb 17 20:00:07 2004 @@ -216,7 +216,7 @@ static inline int sbic_arm_read(unsigned int io_port, int reg) { - if(reg == ASR) + if(reg == SBIC_ASR) return __raw_readl(io_port) & 255; __raw_writeb(reg, io_port); return __raw_readl(io_port + 4) & 255; @@ -238,9 +238,9 @@ static inline unsigned int dmac_address(unsigned int io_port) { - return dmac_read(io_port, TXADRHI) << 16 | - dmac_read(io_port, TXADRMD) << 8 | - dmac_read(io_port, TXADRLO); + return dmac_read(io_port, DMAC_TXADRHI) << 16 | + dmac_read(io_port, DMAC_TXADRMD) << 8 | + dmac_read(io_port, DMAC_TXADRLO); } static @@ -248,15 +248,15 @@ { unsigned int mode, addr, len; - mode = dmac_read(host->dma.io_port, MODECON); + mode = dmac_read(host->dma.io_port, DMAC_MODECON); addr = dmac_address(host->dma.io_port); - len = dmac_read(host->dma.io_port, TXCNTHI) << 8 | - dmac_read(host->dma.io_port, TXCNTLO); + len = dmac_read(host->dma.io_port, DMAC_TXCNTHI) << 8 | + dmac_read(host->dma.io_port, DMAC_TXCNTLO); printk("scsi%d: %s: DMAC %02x @%06x+%04x msk %02x, ", host->host->host_no, where, mode, addr, (len + 1) & 0xffff, - dmac_read(host->dma.io_port, MASKREG)); + dmac_read(host->dma.io_port, DMAC_MASKREG)); printk("DMA @%06x, ", host->dma.start_addr); printk("BH @%p +%04x, ", host->scsi.SCp.ptr, @@ -272,7 +272,7 @@ { unsigned long length; - length = sbic_arm_read(host->scsi.io_port, TRANSCNTH) << 16; + length = sbic_arm_read(host->scsi.io_port, SBIC_TRANSCNTH) << 16; length |= sbic_arm_readnext(host->scsi.io_port) << 8; length |= sbic_arm_readnext(host->scsi.io_port); @@ -285,7 +285,7 @@ int asr; do { - asr = sbic_arm_read(host->scsi.io_port, ASR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); if ((asr & stat_mask) == stat) return 0; @@ -304,7 +304,7 @@ if (acornscsi_sbic_wait(host, ASR_CIP, 0, 1000, "issuing command")) return -1; - sbic_arm_write(host->scsi.io_port, CMND, command); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, command); return 0; } @@ -353,12 +353,12 @@ printk("scsi%d: timeout while resetting card\n", host->host->host_no); - sbic_arm_read(host->scsi.io_port, ASR); - sbic_arm_read(host->scsi.io_port, SSR); + sbic_arm_read(host->scsi.io_port, SBIC_ASR); + sbic_arm_read(host->scsi.io_port, SBIC_SSR); /* setup sbic - WD33C93A */ - sbic_arm_write(host->scsi.io_port, OWNID, OWNID_EAF | host->host->this_id); - sbic_arm_write(host->scsi.io_port, CMND, CMND_RESET); + sbic_arm_write(host->scsi.io_port, SBIC_OWNID, OWNID_EAF | host->host->this_id); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, CMND_RESET); /* * Command should cause a reset interrupt @@ -374,26 +374,26 @@ printk("scsi%d: timeout while resetting card\n", host->host->host_no); - sbic_arm_read(host->scsi.io_port, ASR); - if (sbic_arm_read(host->scsi.io_port, SSR) != 0x01) + sbic_arm_read(host->scsi.io_port, SBIC_ASR); + if (sbic_arm_read(host->scsi.io_port, SBIC_SSR) != 0x01) printk(KERN_CRIT "scsi%d: WD33C93A didn't give enhanced reset interrupt\n", host->host->host_no); - sbic_arm_write(host->scsi.io_port, CTRL, INIT_SBICDMA | CTRL_IDI); - sbic_arm_write(host->scsi.io_port, TIMEOUT, TIMEOUT_TIME); - sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, SYNCHTRANSFER_2DBA); - sbic_arm_write(host->scsi.io_port, SOURCEID, SOURCEID_ER | SOURCEID_DSP); + sbic_arm_write(host->scsi.io_port, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); + sbic_arm_write(host->scsi.io_port, SBIC_TIMEOUT, TIMEOUT_TIME); + sbic_arm_write(host->scsi.io_port, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); + sbic_arm_write(host->scsi.io_port, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); host->card.page_reg = 0x40; outb(host->card.page_reg, host->card.io_page); /* setup dmac - uPC71071 */ - dmac_write(host->dma.io_port, INIT, 0); + dmac_write(host->dma.io_port, DMAC_INIT, 0); #ifdef USE_DMAC - dmac_write(host->dma.io_port, INIT, INIT_8BIT); - dmac_write(host->dma.io_port, CHANNEL, CHANNEL_0); - dmac_write(host->dma.io_port, DEVCON0, INIT_DEVCON0); - dmac_write(host->dma.io_port, DEVCON1, INIT_DEVCON1); + dmac_write(host->dma.io_port, DMAC_INIT, INIT_8BIT); + dmac_write(host->dma.io_port, DMAC_CHANNEL, CHANNEL_0); + dmac_write(host->dma.io_port, DMAC_DEVCON0, INIT_DEVCON0); + dmac_write(host->dma.io_port, DMAC_DEVCON1, INIT_DEVCON1); #endif host->SCpnt = NULL; @@ -741,9 +741,9 @@ * If we have an interrupt pending, then we may have been reselected. * In this case, we don't want to write to the registers */ - if (!(sbic_arm_read(host->scsi.io_port, ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { - sbic_arm_write(host->scsi.io_port, DESTID, SCpnt->device->id); - sbic_arm_write(host->scsi.io_port, CMND, CMND_SELWITHATN); + if (!(sbic_arm_read(host->scsi.io_port, SBIC_ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { + sbic_arm_write(host->scsi.io_port, SBIC_DESTID, SCpnt->device->id); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, CMND_SELWITHATN); } /* @@ -807,7 +807,7 @@ Scsi_Cmnd *SCpnt = *SCpntp; /* clean up */ - sbic_arm_write(host->scsi.io_port, SOURCEID, SOURCEID_ER | SOURCEID_DSP); + sbic_arm_write(host->scsi.io_port, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); host->stats.fins += 1; @@ -1008,7 +1008,7 @@ static inline void acornscsi_dma_stop(AS_Host *host) { - dmac_write(host->dma.io_port, MASKREG, MASK_ON); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_ON); dmac_clearintr(host->dma.io_intr_clear); #if (DEBUG & DEBUG_DMA) @@ -1031,7 +1031,7 @@ host->dma.direction = direction; - dmac_write(host->dma.io_port, MASKREG, MASK_ON); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_ON); if (direction == DMA_OUT) { #if (DEBUG & DEBUG_NO_WRITE) @@ -1062,13 +1062,13 @@ length); length -= 1; - dmac_write(host->dma.io_port, TXCNTLO, length); - dmac_write(host->dma.io_port, TXCNTHI, length >> 8); - dmac_write(host->dma.io_port, TXADRLO, address); - dmac_write(host->dma.io_port, TXADRMD, address >> 8); - dmac_write(host->dma.io_port, TXADRHI, 0); - dmac_write(host->dma.io_port, MODECON, mode); - dmac_write(host->dma.io_port, MASKREG, MASK_OFF); + dmac_write(host->dma.io_port, DMAC_TXCNTLO, length); + dmac_write(host->dma.io_port, DMAC_TXCNTHI, length >> 8); + dmac_write(host->dma.io_port, DMAC_TXADRLO, address); + dmac_write(host->dma.io_port, DMAC_TXADRMD, address >> 8); + dmac_write(host->dma.io_port, DMAC_TXADRHI, 0); + dmac_write(host->dma.io_port, DMAC_MODECON, mode); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_OFF); #if (DEBUG & DEBUG_DMA) DBG(host->SCpnt, acornscsi_dumpdma(host, "strt")); @@ -1088,7 +1088,7 @@ static void acornscsi_dma_cleanup(AS_Host *host) { - dmac_write(host->dma.io_port, MASKREG, MASK_ON); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_ON); dmac_clearintr(host->dma.io_intr_clear); /* @@ -1152,7 +1152,7 @@ DBG(host->SCpnt, acornscsi_dumpdma(host, "inti")); #endif - dmac_write(host->dma.io_port, MASKREG, MASK_ON); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_ON); dmac_clearintr(host->dma.io_intr_clear); /* @@ -1190,12 +1190,12 @@ length); length -= 1; - dmac_write(host->dma.io_port, TXCNTLO, length); - dmac_write(host->dma.io_port, TXCNTHI, length >> 8); - dmac_write(host->dma.io_port, TXADRLO, address); - dmac_write(host->dma.io_port, TXADRMD, address >> 8); - dmac_write(host->dma.io_port, TXADRHI, 0); - dmac_write(host->dma.io_port, MASKREG, MASK_OFF); + dmac_write(host->dma.io_port, DMAC_TXCNTLO, length); + dmac_write(host->dma.io_port, DMAC_TXCNTHI, length >> 8); + dmac_write(host->dma.io_port, DMAC_TXADRLO, address); + dmac_write(host->dma.io_port, DMAC_TXADRMD, address >> 8); + dmac_write(host->dma.io_port, DMAC_TXADRHI, 0); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_OFF); #if (DEBUG & DEBUG_DMA) DBG(host->SCpnt, acornscsi_dumpdma(host, "into")); @@ -1209,15 +1209,15 @@ * attention condition. We continue giving one byte until * the device recognises the attention. */ - if (dmac_read(host->dma.io_port, STATUS) & STATUS_RQ0) { + if (dmac_read(host->dma.io_port, DMAC_STATUS) & STATUS_RQ0) { acornscsi_abortcmd(host, host->SCpnt->tag); - dmac_write(host->dma.io_port, TXCNTLO, 0); - dmac_write(host->dma.io_port, TXCNTHI, 0); - dmac_write(host->dma.io_port, TXADRLO, 0); - dmac_write(host->dma.io_port, TXADRMD, 0); - dmac_write(host->dma.io_port, TXADRHI, 0); - dmac_write(host->dma.io_port, MASKREG, MASK_OFF); + dmac_write(host->dma.io_port, DMAC_TXCNTLO, 0); + dmac_write(host->dma.io_port, DMAC_TXCNTHI, 0); + dmac_write(host->dma.io_port, DMAC_TXADRLO, 0); + dmac_write(host->dma.io_port, DMAC_TXADRMD, 0); + dmac_write(host->dma.io_port, DMAC_TXADRHI, 0); + dmac_write(host->dma.io_port, DMAC_MASKREG, MASK_OFF); } #endif } @@ -1271,9 +1271,9 @@ host->dma.xfer_setup = 0; else { transferred += host->dma.start_addr; - dmac_write(host->dma.io_port, TXADRLO, transferred); - dmac_write(host->dma.io_port, TXADRMD, transferred >> 8); - dmac_write(host->dma.io_port, TXADRHI, transferred >> 16); + dmac_write(host->dma.io_port, DMAC_TXADRLO, transferred); + dmac_write(host->dma.io_port, DMAC_TXADRMD, transferred >> 8); + dmac_write(host->dma.io_port, DMAC_TXADRHI, transferred >> 16); #if (DEBUG & (DEBUG_DMA|DEBUG_WRITE)) DBG(host->SCpnt, acornscsi_dumpdma(host, "adjo")); #endif @@ -1292,12 +1292,12 @@ int my_ptr = *ptr; while (my_ptr < len) { - asr = sbic_arm_read(host->scsi.io_port, ASR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); if (asr & ASR_DBR) { timeout = max_timeout; - sbic_arm_write(host->scsi.io_port, DATA, bytes[my_ptr++]); + sbic_arm_write(host->scsi.io_port, SBIC_DATA, bytes[my_ptr++]); } else if (asr & ASR_INT) break; else if (--timeout == 0) @@ -1320,7 +1320,7 @@ { Scsi_Cmnd *SCpnt = host->SCpnt; - sbic_arm_write(host->scsi.io_port, TRANSCNTH, 0); + sbic_arm_write(host->scsi.io_port, SBIC_TRANSCNTH, 0); sbic_arm_writenext(host->scsi.io_port, 0); sbic_arm_writenext(host->scsi.io_port, SCpnt->cmd_len - host->scsi.SCp.sent_command); @@ -1351,7 +1351,7 @@ acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 1"); - sbic_arm_write(host->scsi.io_port, DATA, NOP); + sbic_arm_write(host->scsi.io_port, SBIC_DATA, NOP); host->scsi.last_message = NOP; #if (DEBUG & DEBUG_MESSAGES) @@ -1365,7 +1365,7 @@ acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 2"); - sbic_arm_write(host->scsi.io_port, DATA, msg->msg[0]); + sbic_arm_write(host->scsi.io_port, SBIC_DATA, msg->msg[0]); host->scsi.last_message = msg->msg[0]; #if (DEBUG & DEBUG_MESSAGES) @@ -1382,7 +1382,7 @@ * initiator. This provides an interlock so that the * initiator can determine which message byte is rejected. */ - sbic_arm_write(host->scsi.io_port, TRANSCNTH, 0); + sbic_arm_write(host->scsi.io_port, SBIC_TRANSCNTH, 0); sbic_arm_writenext(host->scsi.io_port, 0); sbic_arm_writenext(host->scsi.io_port, message_length); acornscsi_sbic_issuecmd(host, CMND_XFERINFO); @@ -1421,7 +1421,7 @@ { acornscsi_sbic_issuecmd(host, CMND_XFERINFO|CMND_SBT); acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "reading status byte"); - host->scsi.SCp.Status = sbic_arm_read(host->scsi.io_port, DATA); + host->scsi.SCp.Status = sbic_arm_read(host->scsi.io_port, SBIC_DATA); } /* @@ -1438,12 +1438,12 @@ acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "for message byte"); - message = sbic_arm_read(host->scsi.io_port, DATA); + message = sbic_arm_read(host->scsi.io_port, SBIC_DATA); /* wait for MSGIN-XFER-PAUSED */ acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after message byte"); - sbic_arm_read(host->scsi.io_port, SSR); + sbic_arm_read(host->scsi.io_port, SBIC_SSR); return message; } @@ -1480,7 +1480,7 @@ /* wait for next msg-in */ acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after negate ack"); - sbic_arm_read(host->scsi.io_port, SSR); + sbic_arm_read(host->scsi.io_port, SBIC_SSR); } } while (msgidx < msglen); @@ -1602,7 +1602,7 @@ host->host->host_no, acornscsi_target(host)); host->device[host->SCpnt->device->id].sync_xfer = SYNCHTRANSFER_2DBA; host->device[host->SCpnt->device->id].sync_state = SYNC_ASYNCHRONOUS; - sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); + sbic_arm_write(host->scsi.io_port, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); break; default: @@ -1652,7 +1652,7 @@ host->device[host->SCpnt->device->id].sync_xfer = calc_sync_xfer(period * 4, length); } - sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); + sbic_arm_write(host->scsi.io_port, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); break; #else /* We do not accept synchronous transfers. Respond with a @@ -1792,7 +1792,7 @@ residual = host->SCpnt->request_bufflen - host->scsi.SCp.scsi_xferred; - sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); + sbic_arm_write(host->scsi.io_port, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); sbic_arm_writenext(host->scsi.io_port, residual >> 16); sbic_arm_writenext(host->scsi.io_port, residual >> 8); sbic_arm_writenext(host->scsi.io_port, residual); @@ -1816,7 +1816,7 @@ { unsigned int target, lun, ok = 0; - target = sbic_arm_read(host->scsi.io_port, SOURCEID); + target = sbic_arm_read(host->scsi.io_port, SBIC_SOURCEID); if (!(target & 8)) printk(KERN_ERR "scsi%d: invalid source id after reselection " @@ -1832,7 +1832,7 @@ host->SCpnt = NULL; } - lun = sbic_arm_read(host->scsi.io_port, DATA) & 7; + lun = sbic_arm_read(host->scsi.io_port, SBIC_DATA) & 7; host->scsi.reconnected.target = target; host->scsi.reconnected.lun = lun; @@ -1952,7 +1952,7 @@ void acornscsi_abortcmd(AS_Host *host, unsigned char tag) { host->scsi.phase = PHASE_ABORTED; - sbic_arm_write(host->scsi.io_port, CMND, CMND_ASSERTATN); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, CMND_ASSERTATN); msgqueue_flush(&host->scsi.msgs); #ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE @@ -1979,11 +1979,11 @@ { unsigned int asr, ssr; - asr = sbic_arm_read(host->scsi.io_port, ASR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); if (!(asr & ASR_INT)) return INTR_IDLE; - ssr = sbic_arm_read(host->scsi.io_port, SSR); + ssr = sbic_arm_read(host->scsi.io_port, SBIC_SSR); #if (DEBUG & DEBUG_PHASES) print_sbic_status(asr, ssr, host->scsi.phase); @@ -1999,15 +1999,15 @@ printk(KERN_ERR "scsi%d: reset in standard mode but wanted advanced mode.\n", host->host->host_no); /* setup sbic - WD33C93A */ - sbic_arm_write(host->scsi.io_port, OWNID, OWNID_EAF | host->host->this_id); - sbic_arm_write(host->scsi.io_port, CMND, CMND_RESET); + sbic_arm_write(host->scsi.io_port, SBIC_OWNID, OWNID_EAF | host->host->this_id); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, CMND_RESET); return INTR_IDLE; case 0x01: /* reset state - advanced */ - sbic_arm_write(host->scsi.io_port, CTRL, INIT_SBICDMA | CTRL_IDI); - sbic_arm_write(host->scsi.io_port, TIMEOUT, TIMEOUT_TIME); - sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, SYNCHTRANSFER_2DBA); - sbic_arm_write(host->scsi.io_port, SOURCEID, SOURCEID_ER | SOURCEID_DSP); + sbic_arm_write(host->scsi.io_port, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); + sbic_arm_write(host->scsi.io_port, SBIC_TIMEOUT, TIMEOUT_TIME); + sbic_arm_write(host->scsi.io_port, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); + sbic_arm_write(host->scsi.io_port, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); msgqueue_flush(&host->scsi.msgs); return INTR_IDLE; @@ -2025,10 +2025,10 @@ msgqueue_flush(&host->scsi.msgs); host->dma.transferred = host->scsi.SCp.scsi_xferred; /* 33C93 gives next interrupt indicating bus phase */ - asr = sbic_arm_read(host->scsi.io_port, ASR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); if (!(asr & ASR_INT)) break; - ssr = sbic_arm_read(host->scsi.io_port, SSR); + ssr = sbic_arm_read(host->scsi.io_port, SBIC_SSR); ADD_STATUS(8, ssr, host->scsi.phase, 1); ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1); goto connected; @@ -2655,7 +2655,7 @@ * busylun bit. */ case PHASE_CONNECTED: - sbic_arm_write(host->scsi.io_port, CMND, CMND_DISCONNECT); + sbic_arm_write(host->scsi.io_port, SBIC_CMND, CMND_DISCONNECT); host->SCpnt = NULL; res = res_success_clear; break; @@ -2699,8 +2699,8 @@ #if (DEBUG & DEBUG_ABORT) { int asr, ssr; - asr = sbic_arm_read(host->scsi.io_port, ASR); - ssr = sbic_arm_read(host->scsi.io_port, SSR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); + ssr = sbic_arm_read(host->scsi.io_port, SBIC_SSR); printk(KERN_WARNING "acornscsi_abort: "); print_sbic_status(asr, ssr, host->scsi.phase); @@ -2787,8 +2787,8 @@ { int asr, ssr; - asr = sbic_arm_read(host->scsi.io_port, ASR); - ssr = sbic_arm_read(host->scsi.io_port, SSR); + asr = sbic_arm_read(host->scsi.io_port, SBIC_ASR); + ssr = sbic_arm_read(host->scsi.io_port, SBIC_SSR); printk(KERN_WARNING "acornscsi_reset: "); print_sbic_status(asr, ssr, host->scsi.phase); diff -Nru a/drivers/scsi/arm/acornscsi.h b/drivers/scsi/arm/acornscsi.h --- a/drivers/scsi/arm/acornscsi.h Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/arm/acornscsi.h Tue Feb 17 20:00:06 2004 @@ -13,13 +13,13 @@ #define ACORNSCSI_H /* SBIC registers */ -#define OWNID 0 +#define SBIC_OWNID 0 #define OWNID_FS1 (1<<7) #define OWNID_FS2 (1<<6) #define OWNID_EHP (1<<4) #define OWNID_EAF (1<<3) -#define CTRL 1 +#define SBIC_CTRL 1 #define CTRL_DMAMODE (1<<7) #define CTRL_DMADBAMODE (1<<6) #define CTRL_DMABURST (1<<5) @@ -30,25 +30,25 @@ #define CTRL_HA (1<<1) #define CTRL_HSP (1<<0) -#define TIMEOUT 2 -#define TOTSECTS 3 -#define TOTHEADS 4 -#define TOTCYLH 5 -#define TOTCYLL 6 -#define LOGADDRH 7 -#define LOGADDRM2 8 -#define LOGADDRM1 9 -#define LOGADDRL 10 -#define SECTORNUM 11 -#define HEADNUM 12 -#define CYLH 13 -#define CYLL 14 -#define TARGETLUN 15 +#define SBIC_TIMEOUT 2 +#define SBIC_TOTSECTS 3 +#define SBIC_TOTHEADS 4 +#define SBIC_TOTCYLH 5 +#define SBIC_TOTCYLL 6 +#define SBIC_LOGADDRH 7 +#define SBIC_LOGADDRM2 8 +#define SBIC_LOGADDRM1 9 +#define SBIC_LOGADDRL 10 +#define SBIC_SECTORNUM 11 +#define SBIC_HEADNUM 12 +#define SBIC_CYLH 13 +#define SBIC_CYLL 14 +#define SBIC_TARGETLUN 15 #define TARGETLUN_TLV (1<<7) #define TARGETLUN_DOK (1<<6) -#define CMNDPHASE 16 -#define SYNCHTRANSFER 17 +#define SBIC_CMNDPHASE 16 +#define SBIC_SYNCHTRANSFER 17 #define SYNCHTRANSFER_OF0 0x00 #define SYNCHTRANSFER_OF1 0x01 #define SYNCHTRANSFER_OF2 0x02 @@ -70,21 +70,21 @@ #define SYNCHTRANSFER_6DBA 0x60 #define SYNCHTRANSFER_7DBA 0x70 -#define TRANSCNTH 18 -#define TRANSCNTM 19 -#define TRANSCNTL 20 -#define DESTID 21 +#define SBIC_TRANSCNTH 18 +#define SBIC_TRANSCNTM 19 +#define SBIC_TRANSCNTL 20 +#define SBIC_DESTID 21 #define DESTID_SCC (1<<7) #define DESTID_DPD (1<<6) -#define SOURCEID 22 +#define SBIC_SOURCEID 22 #define SOURCEID_ER (1<<7) #define SOURCEID_ES (1<<6) #define SOURCEID_DSP (1<<5) #define SOURCEID_SIV (1<<4) -#define SSR 23 -#define CMND 24 +#define SBIC_SSR 23 +#define SBIC_CMND 24 #define CMND_RESET 0x00 #define CMND_ABORT 0x01 #define CMND_ASSERTATN 0x02 @@ -113,8 +113,8 @@ #define CMND_XFERINFO 0x20 #define CMND_SBT (1<<7) -#define DATA 25 -#define ASR 26 +#define SBIC_DATA 25 +#define SBIC_ASR 26 #define ASR_INT (1<<7) #define ASR_LCI (1<<6) #define ASR_BSY (1<<5) @@ -123,22 +123,22 @@ #define ASR_DBR (1<<0) /* DMAC registers */ -#define INIT 0x00 +#define DMAC_INIT 0x00 #define INIT_8BIT (1) -#define CHANNEL 0x80 +#define DMAC_CHANNEL 0x80 #define CHANNEL_0 0x00 #define CHANNEL_1 0x01 #define CHANNEL_2 0x02 #define CHANNEL_3 0x03 -#define TXCNTLO 0x01 -#define TXCNTHI 0x81 -#define TXADRLO 0x02 -#define TXADRMD 0x82 -#define TXADRHI 0x03 +#define DMAC_TXCNTLO 0x01 +#define DMAC_TXCNTHI 0x81 +#define DMAC_TXADRLO 0x02 +#define DMAC_TXADRMD 0x82 +#define DMAC_TXADRHI 0x03 -#define DEVCON0 0x04 +#define DMAC_DEVCON0 0x04 #define DEVCON0_AKL (1<<7) #define DEVCON0_RQL (1<<6) #define DEVCON0_EXW (1<<5) @@ -148,11 +148,11 @@ #define DEVCON0_AHLD (1<<1) #define DEVCON0_MTM (1<<0) -#define DEVCON1 0x84 +#define DMAC_DEVCON1 0x84 #define DEVCON1_WEV (1<<1) #define DEVCON1_BHLD (1<<0) -#define MODECON 0x05 +#define DMAC_MODECON 0x05 #define MODECON_WOED 0x01 #define MODECON_VERIFY 0x00 #define MODECON_READ 0x04 @@ -164,14 +164,14 @@ #define MODECON_BLOCK 0x80 #define MODECON_CASCADE 0xC0 -#define STATUS 0x85 +#define DMAC_STATUS 0x85 #define STATUS_TC0 (1<<0) #define STATUS_RQ0 (1<<4) -#define TEMPLO 0x06 -#define TEMPHI 0x86 -#define REQREG 0x07 -#define MASKREG 0x87 +#define DMAC_TEMPLO 0x06 +#define DMAC_TEMPHI 0x86 +#define DMAC_REQREG 0x07 +#define DMAC_MASKREG 0x87 #define MASKREG_M0 0x01 #define MASKREG_M1 0x02 #define MASKREG_M2 0x04 diff -Nru a/drivers/scsi/arm/arxescsi.c b/drivers/scsi/arm/arxescsi.c --- a/drivers/scsi/arm/arxescsi.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/arm/arxescsi.c Tue Feb 17 20:00:07 2004 @@ -300,7 +300,7 @@ goto out_region; } - host = scsi_register(&arxescsi_template, sizeof(struct arxescsi_info)); + host = scsi_host_alloc(&arxescsi_template, sizeof(struct arxescsi_info)); if (!host) { ret = -ENOMEM; goto out_unmap; @@ -341,7 +341,7 @@ fas216_release(host); out_unregister: - scsi_unregister(host); + scsi_host_put(host); out_unmap: iounmap(base); out_region: @@ -366,7 +366,7 @@ release_mem_region(resbase, reslen); fas216_release(host); - scsi_unregister(host); + scsi_host_put(host); } static const struct ecard_id arxescsi_cids[] = { diff -Nru a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c --- a/drivers/scsi/arm/cumana_2.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/arm/cumana_2.c Tue Feb 17 20:00:07 2004 @@ -422,8 +422,8 @@ goto out_region; } - host = scsi_register(&cumanascsi2_template, - sizeof(struct cumanascsi2_info)); + host = scsi_host_alloc(&cumanascsi2_template, + sizeof(struct cumanascsi2_info)); if (!host) { ret = -ENOMEM; goto out_unmap; @@ -498,7 +498,7 @@ fas216_release(host); out_free: - scsi_unregister(host); + scsi_host_put(host); out_unmap: iounmap(base); @@ -531,7 +531,7 @@ release_mem_region(resbase, reslen); fas216_release(host); - scsi_unregister(host); + scsi_host_put(host); } static const struct ecard_id cumanascsi2_cids[] = { diff -Nru a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c --- a/drivers/scsi/arm/eesox.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/arm/eesox.c Tue Feb 17 20:00:08 2004 @@ -529,8 +529,8 @@ goto out_region; } - host = scsi_register(&eesox_template, - sizeof(struct eesoxscsi_info)); + host = scsi_host_alloc(&eesox_template, + sizeof(struct eesoxscsi_info)); if (!host) { ret = -ENOMEM; goto out_unmap; @@ -606,7 +606,7 @@ out_free: device_remove_file(&ec->dev, &dev_attr_bus_term); - scsi_unregister(host); + scsi_host_put(host); out_unmap: iounmap(base); @@ -641,7 +641,7 @@ release_mem_region(resbase, reslen); fas216_release(host); - scsi_unregister(host); + scsi_host_put(host); } static const struct ecard_id eesoxscsi_cids[] = { diff -Nru a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c --- a/drivers/scsi/arm/powertec.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/arm/powertec.c Tue Feb 17 20:00:07 2004 @@ -332,8 +332,8 @@ goto out_region; } - host = scsi_register(&powertecscsi_template, - sizeof (struct powertec_info)); + host = scsi_host_alloc(&powertecscsi_template, + sizeof (struct powertec_info)); if (!host) { ret = -ENOMEM; goto out_unmap; @@ -407,7 +407,7 @@ out_free: device_remove_file(&ec->dev, &dev_attr_bus_term); - scsi_unregister(host); + scsi_host_put(host); out_unmap: iounmap(base); @@ -442,7 +442,7 @@ release_mem_region(resbase, reslen); fas216_release(host); - scsi_unregister(host); + scsi_host_put(host); } static const struct ecard_id powertecscsi_cids[] = { diff -Nru a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c --- a/drivers/scsi/ata_piix.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/ata_piix.c Tue Feb 17 20:00:07 2004 @@ -3,8 +3,8 @@ ata_piix.c - Intel PATA/SATA controllers - Copyright 2003 Red Hat Inc - Copyright 2003 Jeff Garzik + Copyright 2003-2004 Red Hat Inc + Copyright 2003-2004 Jeff Garzik Copyright header from piix.c: @@ -28,7 +28,7 @@ #include #define DRV_NAME "ata_piix" -#define DRV_VERSION "0.95" +#define DRV_VERSION "1.00" enum { PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ diff -Nru a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c --- a/drivers/scsi/atp870u.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/atp870u.c Tue Feb 17 20:00:06 2004 @@ -703,19 +703,19 @@ bttl = sg_dma_address(&sgpnt[j]); l = sg_dma_len(&sgpnt[j]); while (l > 0x10000) { - (u16) (((u16 *) (prd))[i + 3]) = 0x0000; - (u16) (((u16 *) (prd))[i + 2]) = 0x0000; - (u32) (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); + (((u16 *) (prd))[i + 3]) = 0x0000; + (((u16 *) (prd))[i + 2]) = 0x0000; + (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); l -= 0x10000; bttl += 0x10000; i += 0x04; } - (u32) (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); - (u16) (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); - (u16) (((u16 *) (prd))[i + 3]) = 0; + (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); + (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); + (((u16 *) (prd))[i + 3]) = 0; i += 0x04; } - (u16) (((u16 *) (prd))[i - 1]) = cpu_to_le16(0x8000); + (((u16 *) (prd))[i - 1]) = cpu_to_le16(0x8000); } else { /* * For a linear request write a chain of blocks @@ -724,16 +724,16 @@ l = workrequ->request_bufflen; i = 0; while (l > 0x10000) { - (u16) (((u16 *) (prd))[i + 3]) = 0x0000; - (u16) (((u16 *) (prd))[i + 2]) = 0x0000; - (u32) (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); + (((u16 *) (prd))[i + 3]) = 0x0000; + (((u16 *) (prd))[i + 2]) = 0x0000; + (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); l -= 0x10000; bttl += 0x10000; i += 0x04; } - (u16) (((u16 *) (prd))[i + 3]) = cpu_to_le16(0x8000); - (u16) (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); - (u32) (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); + (((u16 *) (prd))[i + 3]) = cpu_to_le16(0x8000); + (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); + (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); } tmpcip = tmpcip + 4; dev->id[target_id].prdaddru = dev->id[target_id].prd_phys; diff -Nru a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c --- a/drivers/scsi/gdth.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/gdth.c Tue Feb 17 20:00:07 2004 @@ -264,7 +264,6 @@ * Initial revision * ************************************************************************/ -#ident "$Id: gdth.c,v 1.64 2003/09/17 08:30:26 achim Exp $" /* All GDT Disk Array Controllers are fully supported by this driver. * This includes the PCI/EISA/ISA SCSI Disk Array Controllers and the diff -Nru a/drivers/scsi/imm.c b/drivers/scsi/imm.c --- a/drivers/scsi/imm.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/imm.c Tue Feb 17 20:00:08 2004 @@ -14,16 +14,15 @@ #include /* The following #define is to avoid a clash with hosts.c */ -#define IMM_CODE 1 #define IMM_PROBE_SPP 0x0001 #define IMM_PROBE_PS2 0x0002 #define IMM_PROBE_ECR 0x0010 #define IMM_PROBE_EPP17 0x0100 #define IMM_PROBE_EPP19 0x0200 -void imm_reset_pulse(unsigned int base); -static int device_check(int host_no); - +#include +#include +#include #include #include #include @@ -32,205 +31,86 @@ #include "hosts.h" typedef struct { - struct pardevice *dev; /* Parport device entry */ - int base; /* Actual port address */ - int base_hi; /* Hi Base address for ECP-ISA chipset */ - int mode; /* Transfer mode */ - int host; /* Host number (for proc) */ - Scsi_Cmnd *cur_cmd; /* Current queued command */ - struct work_struct imm_tq; /* Polling interrupt stuff */ - unsigned long jstart; /* Jiffies at start */ - unsigned failed:1; /* Failure flag */ - unsigned dp:1; /* Data phase present */ - unsigned rd:1; /* Read data in data phase */ - unsigned p_busy:1; /* Parport sharing busy flag */ + struct pardevice *dev; /* Parport device entry */ + int base; /* Actual port address */ + int base_hi; /* Hi Base address for ECP-ISA chipset */ + int mode; /* Transfer mode */ + Scsi_Cmnd *cur_cmd; /* Current queued command */ + struct work_struct imm_tq; /* Polling interrupt stuff */ + unsigned long jstart; /* Jiffies at start */ + unsigned failed:1; /* Failure flag */ + unsigned dp:1; /* Data phase present */ + unsigned rd:1; /* Read data in data phase */ + unsigned wanted:1; /* Parport sharing busy flag */ + wait_queue_head_t *waiting; + struct Scsi_Host *host; + struct list_head list; } imm_struct; -#define IMM_EMPTY \ -{ .base = -1, \ - .mode = IMM_AUTODETECT, \ - .host = -1, \ -} +static void imm_reset_pulse(unsigned int base); +static int device_check(imm_struct *dev); #include "imm.h" -#define NO_HOSTS 4 -static imm_struct imm_hosts[NO_HOSTS] = -{IMM_EMPTY, IMM_EMPTY, IMM_EMPTY, IMM_EMPTY}; - -#define IMM_BASE(x) imm_hosts[(x)].base -#define IMM_BASE_HI(x) imm_hosts[(x)].base_hi -int parbus_base[NO_HOSTS] = -{0x03bc, 0x0378, 0x0278, 0x0000}; - -void imm_wakeup(void *ref) +static inline imm_struct *imm_dev(struct Scsi_Host *host) { - imm_struct *imm_dev = (imm_struct *) ref; + return *(imm_struct **)&host->hostdata; +} - if (!imm_dev->p_busy) - return; +static spinlock_t arbitration_lock = SPIN_LOCK_UNLOCKED; - if (parport_claim(imm_dev->dev)) { - printk("imm: bug in imm_wakeup\n"); - return; - } - imm_dev->p_busy = 0; - imm_dev->base = imm_dev->dev->port->base; - if (imm_dev->cur_cmd) - imm_dev->cur_cmd->SCp.phase++; - return; +static void got_it(imm_struct *dev) +{ + dev->base = dev->dev->port->base; + if (dev->cur_cmd) + dev->cur_cmd->SCp.phase = 1; + else + wake_up(dev->waiting); } -int imm_release(struct Scsi_Host *host) +static void imm_wakeup(void *ref) { - int host_no = host->unique_id; + imm_struct *dev = (imm_struct *) ref; + unsigned long flags; - printk("Releasing imm%i\n", host_no); - scsi_unregister(host); - parport_unregister_device(imm_hosts[host_no].dev); - return 0; + spin_lock_irqsave(&arbitration_lock, flags); + if (dev->wanted) { + parport_claim(dev->dev); + got_it(dev); + dev->wanted = 0; + } + spin_unlock_irqrestore(&arbitration_lock, flags); } -static int imm_pb_claim(int host_no) +static int imm_pb_claim(imm_struct *dev) { - if (parport_claim(imm_hosts[host_no].dev)) { - imm_hosts[host_no].p_busy = 1; - return 1; - } - if (imm_hosts[host_no].cur_cmd) - imm_hosts[host_no].cur_cmd->SCp.phase++; - return 0; + unsigned long flags; + int res = 1; + spin_lock_irqsave(&arbitration_lock, flags); + if (parport_claim(dev->dev) == 0) { + got_it(dev); + res = 0; + } + dev->wanted = res; + spin_unlock_irqrestore(&arbitration_lock, flags); + return res; } -#define imm_pb_release(x) parport_release(imm_hosts[(x)].dev) - -/*************************************************************************** - * Parallel port probing routines * - ***************************************************************************/ - -static Scsi_Host_Template driver_template = { - .proc_name = "imm", - .proc_info = imm_proc_info, - .name = "Iomega VPI2 (imm) interface", - .detect = imm_detect, - .release = imm_release, - .queuecommand = imm_queuecommand, - .eh_abort_handler = imm_abort, - .eh_bus_reset_handler = imm_reset, - .eh_host_reset_handler = imm_reset, - .bios_param = imm_biosparam, - .this_id = 7, - .sg_tablesize = SG_ALL, - .cmd_per_lun = 1, - .use_clustering = ENABLE_CLUSTERING, -}; -#include "scsi_module.c" - -int imm_detect(Scsi_Host_Template * host) +static void imm_pb_dismiss(imm_struct *dev) { - struct Scsi_Host *hreg; - int ports; - int i, nhosts, try_again; - struct parport *pb; - - pb = parport_enumerate(); - - printk("imm: Version %s\n", IMM_VERSION); - nhosts = 0; - try_again = 0; - - if (!pb) { - printk("imm: parport reports no devices.\n"); - return 0; - } - retry_entry: - for (i = 0; pb; i++, pb = pb->next) { - int modes, ppb; - - imm_hosts[i].dev = - parport_register_device(pb, "imm", NULL, imm_wakeup, - NULL, 0, (void *) &imm_hosts[i]); - - if (!imm_hosts[i].dev) - continue; - - /* Claim the bus so it remembers what we do to the control - * registers. [ CTR and ECP ] - */ - if (imm_pb_claim(i)) { - unsigned long now = jiffies; - while (imm_hosts[i].p_busy) { - schedule(); /* We are safe to schedule here */ - if (time_after(jiffies, now + 3 * HZ)) { - printk(KERN_ERR "imm%d: failed to claim parport because a " - "pardevice is owning the port for too longtime!\n", - i); - parport_unregister_device (imm_hosts[i].dev); - return 0; - } - } - } - ppb = IMM_BASE(i) = imm_hosts[i].dev->port->base; - IMM_BASE_HI(i) = imm_hosts[i].dev->port->base_hi; - w_ctr(ppb, 0x0c); - modes = imm_hosts[i].dev->port->modes; - - /* Mode detection works up the chain of speed - * This avoids a nasty if-then-else-if-... tree - */ - imm_hosts[i].mode = IMM_NIBBLE; - - if (modes & PARPORT_MODE_TRISTATE) - imm_hosts[i].mode = IMM_PS2; - - /* Done configuration */ - imm_pb_release(i); - - if (imm_init(i)) { - parport_unregister_device(imm_hosts[i].dev); - continue; - } + unsigned long flags; + int wanted; + spin_lock_irqsave(&arbitration_lock, flags); + wanted = dev->wanted; + dev->wanted = 0; + spin_unlock_irqrestore(&arbitration_lock, flags); + if (!wanted) + parport_release(dev->dev); +} - /* now the glue ... */ - switch (imm_hosts[i].mode) { - case IMM_NIBBLE: - ports = 3; - break; - case IMM_PS2: - ports = 3; - break; - case IMM_EPP_8: - case IMM_EPP_16: - case IMM_EPP_32: - ports = 8; - break; - default: /* Never gets here */ - continue; - } - - INIT_WORK(&imm_hosts[i].imm_tq, imm_interrupt, &imm_hosts[i]); - - host->can_queue = IMM_CAN_QUEUE; - host->sg_tablesize = imm_sg; - hreg = scsi_register(host, 0); - if(hreg == NULL) - continue; - hreg->io_port = pb->base; - hreg->n_io_port = ports; - hreg->dma_channel = -1; - hreg->unique_id = i; - imm_hosts[i].host = hreg->host_no; - nhosts++; - } - if (nhosts == 0) { - if (try_again == 1) { - return 0; - } - try_again = 1; - goto retry_entry; - } else { - return 1; /* return number of hosts detected */ - } +static inline void imm_pb_release(imm_struct *dev) +{ + parport_release(dev->dev); } /* This is to give the imm driver a way to modify the timings (and other @@ -240,60 +120,62 @@ * testing... * Also gives a method to use a script to obtain optimum timings (TODO) */ -static inline int imm_proc_write(int hostno, char *buffer, int length) +static inline int imm_proc_write(imm_struct *dev, char *buffer, int length) { - unsigned long x; + unsigned long x; - if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { - x = simple_strtoul(buffer + 5, NULL, 0); - imm_hosts[hostno].mode = x; - return length; - } - printk("imm /proc: invalid variable\n"); - return (-EINVAL); + if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { + x = simple_strtoul(buffer + 5, NULL, 0); + dev->mode = x; + return length; + } + printk("imm /proc: invalid variable\n"); + return (-EINVAL); } -int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, - int length, int inout) +static int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start, + off_t offset, int length, int inout) { - int i; - int len = 0; - - for (i = 0; i < 4; i++) - if (imm_hosts[i].host == host->host_no) - break; + imm_struct *dev = imm_dev(host); + int len = 0; - if (inout) - return imm_proc_write(i, buffer, length); + if (inout) + return imm_proc_write(dev, buffer, length); - len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION); - len += sprintf(buffer + len, "Parport : %s\n", imm_hosts[i].dev->port->name); - len += sprintf(buffer + len, "Mode : %s\n", IMM_MODE_STRING[imm_hosts[i].mode]); + len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION); + len += + sprintf(buffer + len, "Parport : %s\n", + dev->dev->port->name); + len += + sprintf(buffer + len, "Mode : %s\n", + IMM_MODE_STRING[dev->mode]); - /* Request for beyond end of buffer */ - if (offset > len) - return 0; + /* Request for beyond end of buffer */ + if (offset > len) + return 0; - *start = buffer + offset; - len -= offset; - if (len > length) - len = length; - return len; + *start = buffer + offset; + len -= offset; + if (len > length) + len = length; + return len; } #if IMM_DEBUG > 0 #define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %d\n",\ y, __FUNCTION__, __LINE__); imm_fail_func(x,y); -static inline void imm_fail_func(int host_no, int error_code) +static inline void +imm_fail_func(imm_struct *dev, int error_code) #else -static inline void imm_fail(int host_no, int error_code) +static inline void +imm_fail(imm_struct *dev, int error_code) #endif { - /* If we fail a device then we trash status / message bytes */ - if (imm_hosts[host_no].cur_cmd) { - imm_hosts[host_no].cur_cmd->result = error_code << 16; - imm_hosts[host_no].failed = 1; - } + /* If we fail a device then we trash status / message bytes */ + if (dev->cur_cmd) { + dev->cur_cmd->result = error_code << 16; + dev->failed = 1; + } } /* @@ -303,96 +185,97 @@ * doesn't appear to be designed to support interrupts. We spin on * the 0x80 ready bit. */ -static unsigned char imm_wait(int host_no) +static unsigned char imm_wait(imm_struct *dev) { - int k; - unsigned short ppb = IMM_BASE(host_no); - unsigned char r; - - w_ctr(ppb, 0x0c); - - k = IMM_SPIN_TMO; - do { - r = r_str(ppb); - k--; - udelay(1); - } - while (!(r & 0x80) && (k)); + int k; + unsigned short ppb = dev->base; + unsigned char r; - /* - * STR register (LPT base+1) to SCSI mapping: - * - * STR imm imm - * =================================== - * 0x80 S_REQ S_REQ - * 0x40 !S_BSY (????) - * 0x20 !S_CD !S_CD - * 0x10 !S_IO !S_IO - * 0x08 (????) !S_BSY - * - * imm imm meaning - * ================================== - * 0xf0 0xb8 Bit mask - * 0xc0 0x88 ZIP wants more data - * 0xd0 0x98 ZIP wants to send more data - * 0xe0 0xa8 ZIP is expecting SCSI command data - * 0xf0 0xb8 end of transfer, ZIP is sending status - */ - w_ctr(ppb, 0x04); - if (k) - return (r & 0xb8); - - /* Counter expired - Time out occurred */ - imm_fail(host_no, DID_TIME_OUT); - printk("imm timeout in imm_wait\n"); - return 0; /* command timed out */ + w_ctr(ppb, 0x0c); + + k = IMM_SPIN_TMO; + do { + r = r_str(ppb); + k--; + udelay(1); + } + while (!(r & 0x80) && (k)); + + /* + * STR register (LPT base+1) to SCSI mapping: + * + * STR imm imm + * =================================== + * 0x80 S_REQ S_REQ + * 0x40 !S_BSY (????) + * 0x20 !S_CD !S_CD + * 0x10 !S_IO !S_IO + * 0x08 (????) !S_BSY + * + * imm imm meaning + * ================================== + * 0xf0 0xb8 Bit mask + * 0xc0 0x88 ZIP wants more data + * 0xd0 0x98 ZIP wants to send more data + * 0xe0 0xa8 ZIP is expecting SCSI command data + * 0xf0 0xb8 end of transfer, ZIP is sending status + */ + w_ctr(ppb, 0x04); + if (k) + return (r & 0xb8); + + /* Counter expired - Time out occurred */ + imm_fail(dev, DID_TIME_OUT); + printk("imm timeout in imm_wait\n"); + return 0; /* command timed out */ } static int imm_negotiate(imm_struct * tmp) { - /* - * The following is supposedly the IEEE 1284-1994 negotiate - * sequence. I have yet to obtain a copy of the above standard - * so this is a bit of a guess... - * - * A fair chunk of this is based on the Linux parport implementation - * of IEEE 1284. - * - * Return 0 if data available - * 1 if no data available - */ - - unsigned short base = tmp->base; - unsigned char a, mode; - - switch (tmp->mode) { - case IMM_NIBBLE: - mode = 0x00; - break; - case IMM_PS2: - mode = 0x01; - break; - default: - return 0; - } + /* + * The following is supposedly the IEEE 1284-1994 negotiate + * sequence. I have yet to obtain a copy of the above standard + * so this is a bit of a guess... + * + * A fair chunk of this is based on the Linux parport implementation + * of IEEE 1284. + * + * Return 0 if data available + * 1 if no data available + */ + + unsigned short base = tmp->base; + unsigned char a, mode; - w_ctr(base, 0x04); - udelay(5); - w_dtr(base, mode); - udelay(100); - w_ctr(base, 0x06); - udelay(5); - a = (r_str(base) & 0x20) ? 0 : 1; - udelay(5); - w_ctr(base, 0x07); - udelay(5); - w_ctr(base, 0x06); - - if (a) { - printk("IMM: IEEE1284 negotiate indicates no data available.\n"); - imm_fail(tmp->host, DID_ERROR); - } - return a; + switch (tmp->mode) { + case IMM_NIBBLE: + mode = 0x00; + break; + case IMM_PS2: + mode = 0x01; + break; + default: + return 0; + } + + w_ctr(base, 0x04); + udelay(5); + w_dtr(base, mode); + udelay(100); + w_ctr(base, 0x06); + udelay(5); + a = (r_str(base) & 0x20) ? 0 : 1; + udelay(5); + w_ctr(base, 0x07); + udelay(5); + w_ctr(base, 0x06); + + if (a) { + printk + ("IMM: IEEE1284 negotiate indicates no data available.\n"); + imm_fail(tmp, DID_ERROR); + } + return a; } /* @@ -400,364 +283,346 @@ */ static inline void epp_reset(unsigned short ppb) { - int i; + int i; - i = r_str(ppb); - w_str(ppb, i); - w_str(ppb, i & 0xfe); + i = r_str(ppb); + w_str(ppb, i); + w_str(ppb, i & 0xfe); } /* * Wait for empty ECP fifo (if we are in ECP fifo mode only) */ -static inline void ecp_sync(unsigned short hostno) +static inline void ecp_sync(imm_struct *dev) { - int i, ppb_hi=IMM_BASE_HI(hostno); + int i, ppb_hi = dev->base_hi; - if (ppb_hi == 0) return; + if (ppb_hi == 0) + return; - if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */ - for (i = 0; i < 100; i++) { - if (r_ecr(ppb_hi) & 0x01) - return; - udelay(5); + if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */ + for (i = 0; i < 100; i++) { + if (r_ecr(ppb_hi) & 0x01) + return; + udelay(5); + } + printk("imm: ECP sync failed as data still present in FIFO.\n"); } - printk("imm: ECP sync failed as data still present in FIFO.\n"); - } } static int imm_byte_out(unsigned short base, const char *buffer, int len) { - int i; + int i; - w_ctr(base, 0x4); /* apparently a sane mode */ - for (i = len >> 1; i; i--) { - w_dtr(base, *buffer++); - w_ctr(base, 0x5); /* Drop STROBE low */ - w_dtr(base, *buffer++); - w_ctr(base, 0x0); /* STROBE high + INIT low */ - } - w_ctr(base, 0x4); /* apparently a sane mode */ - return 1; /* All went well - we hope! */ + w_ctr(base, 0x4); /* apparently a sane mode */ + for (i = len >> 1; i; i--) { + w_dtr(base, *buffer++); + w_ctr(base, 0x5); /* Drop STROBE low */ + w_dtr(base, *buffer++); + w_ctr(base, 0x0); /* STROBE high + INIT low */ + } + w_ctr(base, 0x4); /* apparently a sane mode */ + return 1; /* All went well - we hope! */ } static int imm_nibble_in(unsigned short base, char *buffer, int len) { - unsigned char l; - int i; + unsigned char l; + int i; - /* - * The following is based on documented timing signals - */ - w_ctr(base, 0x4); - for (i = len; i; i--) { - w_ctr(base, 0x6); - l = (r_str(base) & 0xf0) >> 4; - w_ctr(base, 0x5); - *buffer++ = (r_str(base) & 0xf0) | l; + /* + * The following is based on documented timing signals + */ w_ctr(base, 0x4); - } - return 1; /* All went well - we hope! */ + for (i = len; i; i--) { + w_ctr(base, 0x6); + l = (r_str(base) & 0xf0) >> 4; + w_ctr(base, 0x5); + *buffer++ = (r_str(base) & 0xf0) | l; + w_ctr(base, 0x4); + } + return 1; /* All went well - we hope! */ } static int imm_byte_in(unsigned short base, char *buffer, int len) { - int i; + int i; - /* - * The following is based on documented timing signals - */ - w_ctr(base, 0x4); - for (i = len; i; i--) { - w_ctr(base, 0x26); - *buffer++ = r_dtr(base); - w_ctr(base, 0x25); - } - return 1; /* All went well - we hope! */ -} - -static int imm_out(int host_no, char *buffer, int len) -{ - int r; - unsigned short ppb = IMM_BASE(host_no); - - r = imm_wait(host_no); - - /* - * Make sure that: - * a) the SCSI bus is BUSY (device still listening) - * b) the device is listening - */ - if ((r & 0x18) != 0x08) { - imm_fail(host_no, DID_ERROR); - printk("IMM: returned SCSI status %2x\n", r); - return 0; - } - switch (imm_hosts[host_no].mode) { - case IMM_EPP_32: - case IMM_EPP_16: - case IMM_EPP_8: - epp_reset(ppb); - w_ctr(ppb, 0x4); + /* + * The following is based on documented timing signals + */ + w_ctr(base, 0x4); + for (i = len; i; i--) { + w_ctr(base, 0x26); + *buffer++ = r_dtr(base); + w_ctr(base, 0x25); + } + return 1; /* All went well - we hope! */ +} + +static int imm_out(imm_struct *dev, char *buffer, int len) +{ + unsigned short ppb = dev->base; + int r = imm_wait(dev); + + /* + * Make sure that: + * a) the SCSI bus is BUSY (device still listening) + * b) the device is listening + */ + if ((r & 0x18) != 0x08) { + imm_fail(dev, DID_ERROR); + printk("IMM: returned SCSI status %2x\n", r); + return 0; + } + switch (dev->mode) { + case IMM_EPP_32: + case IMM_EPP_16: + case IMM_EPP_8: + epp_reset(ppb); + w_ctr(ppb, 0x4); #ifdef CONFIG_SCSI_IZIP_EPP16 - if (!(((long) buffer | len) & 0x01)) - outsw(ppb + 4, buffer, len >> 1); + if (!(((long) buffer | len) & 0x01)) + outsw(ppb + 4, buffer, len >> 1); #else - if (!(((long) buffer | len) & 0x03)) - outsl(ppb + 4, buffer, len >> 2); + if (!(((long) buffer | len) & 0x03)) + outsl(ppb + 4, buffer, len >> 2); #endif - else - outsb(ppb + 4, buffer, len); - w_ctr(ppb, 0xc); - r = !(r_str(ppb) & 0x01); - w_ctr(ppb, 0xc); - ecp_sync(host_no); - break; + else + outsb(ppb + 4, buffer, len); + w_ctr(ppb, 0xc); + r = !(r_str(ppb) & 0x01); + w_ctr(ppb, 0xc); + ecp_sync(dev); + break; - case IMM_NIBBLE: - case IMM_PS2: - /* 8 bit output, with a loop */ - r = imm_byte_out(ppb, buffer, len); - break; - - default: - printk("IMM: bug in imm_out()\n"); - r = 0; - } - return r; -} - -static int imm_in(int host_no, char *buffer, int len) -{ - int r; - unsigned short ppb = IMM_BASE(host_no); - - r = imm_wait(host_no); - - /* - * Make sure that: - * a) the SCSI bus is BUSY (device still listening) - * b) the device is sending data - */ - if ((r & 0x18) != 0x18) { - imm_fail(host_no, DID_ERROR); - return 0; - } - switch (imm_hosts[host_no].mode) { - case IMM_NIBBLE: - /* 4 bit input, with a loop */ - r = imm_nibble_in(ppb, buffer, len); - w_ctr(ppb, 0xc); - break; + case IMM_NIBBLE: + case IMM_PS2: + /* 8 bit output, with a loop */ + r = imm_byte_out(ppb, buffer, len); + break; + + default: + printk("IMM: bug in imm_out()\n"); + r = 0; + } + return r; +} - case IMM_PS2: - /* 8 bit input, with a loop */ - r = imm_byte_in(ppb, buffer, len); - w_ctr(ppb, 0xc); - break; +static int imm_in(imm_struct *dev, char *buffer, int len) +{ + unsigned short ppb = dev->base; + int r = imm_wait(dev); - case IMM_EPP_32: - case IMM_EPP_16: - case IMM_EPP_8: - epp_reset(ppb); - w_ctr(ppb, 0x24); + /* + * Make sure that: + * a) the SCSI bus is BUSY (device still listening) + * b) the device is sending data + */ + if ((r & 0x18) != 0x18) { + imm_fail(dev, DID_ERROR); + return 0; + } + switch (dev->mode) { + case IMM_NIBBLE: + /* 4 bit input, with a loop */ + r = imm_nibble_in(ppb, buffer, len); + w_ctr(ppb, 0xc); + break; + + case IMM_PS2: + /* 8 bit input, with a loop */ + r = imm_byte_in(ppb, buffer, len); + w_ctr(ppb, 0xc); + break; + + case IMM_EPP_32: + case IMM_EPP_16: + case IMM_EPP_8: + epp_reset(ppb); + w_ctr(ppb, 0x24); #ifdef CONFIG_SCSI_IZIP_EPP16 - if (!(((long) buffer | len) & 0x01)) - insw(ppb + 4, buffer, len >> 1); + if (!(((long) buffer | len) & 0x01)) + insw(ppb + 4, buffer, len >> 1); #else - if (!(((long) buffer | len) & 0x03)) - insl(ppb + 4, buffer, len >> 2); + if (!(((long) buffer | len) & 0x03)) + insl(ppb + 4, buffer, len >> 2); #endif - else - insb(ppb + 4, buffer, len); - w_ctr(ppb, 0x2c); - r = !(r_str(ppb) & 0x01); - w_ctr(ppb, 0x2c); - ecp_sync(host_no); - break; - - default: - printk("IMM: bug in imm_ins()\n"); - r = 0; - break; - } - return r; + else + insb(ppb + 4, buffer, len); + w_ctr(ppb, 0x2c); + r = !(r_str(ppb) & 0x01); + w_ctr(ppb, 0x2c); + ecp_sync(dev); + break; + + default: + printk("IMM: bug in imm_ins()\n"); + r = 0; + break; + } + return r; } static int imm_cpp(unsigned short ppb, unsigned char b) { - /* - * Comments on udelay values refer to the - * Command Packet Protocol (CPP) timing diagram. - */ - - unsigned char s1, s2, s3; - w_ctr(ppb, 0x0c); - udelay(2); /* 1 usec - infinite */ - w_dtr(ppb, 0xaa); - udelay(10); /* 7 usec - infinite */ - w_dtr(ppb, 0x55); - udelay(10); /* 7 usec - infinite */ - w_dtr(ppb, 0x00); - udelay(10); /* 7 usec - infinite */ - w_dtr(ppb, 0xff); - udelay(10); /* 7 usec - infinite */ - s1 = r_str(ppb) & 0xb8; - w_dtr(ppb, 0x87); - udelay(10); /* 7 usec - infinite */ - s2 = r_str(ppb) & 0xb8; - w_dtr(ppb, 0x78); - udelay(10); /* 7 usec - infinite */ - s3 = r_str(ppb) & 0x38; - /* - * Values for b are: - * 0000 00aa Assign address aa to current device - * 0010 00aa Select device aa in EPP Winbond mode - * 0010 10aa Select device aa in EPP mode - * 0011 xxxx Deselect all devices - * 0110 00aa Test device aa - * 1101 00aa Select device aa in ECP mode - * 1110 00aa Select device aa in Compatible mode - */ - w_dtr(ppb, b); - udelay(2); /* 1 usec - infinite */ - w_ctr(ppb, 0x0c); - udelay(10); /* 7 usec - infinite */ - w_ctr(ppb, 0x0d); - udelay(2); /* 1 usec - infinite */ - w_ctr(ppb, 0x0c); - udelay(10); /* 7 usec - infinite */ - w_dtr(ppb, 0xff); - udelay(10); /* 7 usec - infinite */ - - /* - * The following table is electrical pin values. - * (BSY is inverted at the CTR register) - * - * BSY ACK POut SEL Fault - * S1 0 X 1 1 1 - * S2 1 X 0 1 1 - * S3 L X 1 1 S - * - * L => Last device in chain - * S => Selected - * - * Observered values for S1,S2,S3 are: - * Disconnect => f8/58/78 - * Connect => f8/58/70 - */ - if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x30)) - return 1; /* Connected */ - if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x38)) - return 0; /* Disconnected */ - - return -1; /* No device present */ -} - -static inline int imm_connect(int host_no, int flag) -{ - unsigned short ppb = IMM_BASE(host_no); - - imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */ - imm_cpp(ppb, 0x30); /* Disconnect all devices */ - - if ((imm_hosts[host_no].mode == IMM_EPP_8) || - (imm_hosts[host_no].mode == IMM_EPP_16) || - (imm_hosts[host_no].mode == IMM_EPP_32)) - return imm_cpp(ppb, 0x28); /* Select device 0 in EPP mode */ - return imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */ -} - -static void imm_disconnect(int host_no) -{ - unsigned short ppb = IMM_BASE(host_no); - - imm_cpp(ppb, 0x30); /* Disconnect all devices */ -} - -static int imm_select(int host_no, int target) -{ - int k; - unsigned short ppb = IMM_BASE(host_no); - - /* - * Firstly we want to make sure there is nothing - * holding onto the SCSI bus. - */ - w_ctr(ppb, 0xc); - - k = IMM_SELECT_TMO; - do { - k--; - } while ((r_str(ppb) & 0x08) && (k)); + /* + * Comments on udelay values refer to the + * Command Packet Protocol (CPP) timing diagram. + */ - if (!k) - return 0; + unsigned char s1, s2, s3; + w_ctr(ppb, 0x0c); + udelay(2); /* 1 usec - infinite */ + w_dtr(ppb, 0xaa); + udelay(10); /* 7 usec - infinite */ + w_dtr(ppb, 0x55); + udelay(10); /* 7 usec - infinite */ + w_dtr(ppb, 0x00); + udelay(10); /* 7 usec - infinite */ + w_dtr(ppb, 0xff); + udelay(10); /* 7 usec - infinite */ + s1 = r_str(ppb) & 0xb8; + w_dtr(ppb, 0x87); + udelay(10); /* 7 usec - infinite */ + s2 = r_str(ppb) & 0xb8; + w_dtr(ppb, 0x78); + udelay(10); /* 7 usec - infinite */ + s3 = r_str(ppb) & 0x38; + /* + * Values for b are: + * 0000 00aa Assign address aa to current device + * 0010 00aa Select device aa in EPP Winbond mode + * 0010 10aa Select device aa in EPP mode + * 0011 xxxx Deselect all devices + * 0110 00aa Test device aa + * 1101 00aa Select device aa in ECP mode + * 1110 00aa Select device aa in Compatible mode + */ + w_dtr(ppb, b); + udelay(2); /* 1 usec - infinite */ + w_ctr(ppb, 0x0c); + udelay(10); /* 7 usec - infinite */ + w_ctr(ppb, 0x0d); + udelay(2); /* 1 usec - infinite */ + w_ctr(ppb, 0x0c); + udelay(10); /* 7 usec - infinite */ + w_dtr(ppb, 0xff); + udelay(10); /* 7 usec - infinite */ - /* - * Now assert the SCSI ID (HOST and TARGET) on the data bus - */ - w_ctr(ppb, 0x4); - w_dtr(ppb, 0x80 | (1 << target)); - udelay(1); - - /* - * Deassert SELIN first followed by STROBE - */ - w_ctr(ppb, 0xc); - w_ctr(ppb, 0xd); - - /* - * ACK should drop low while SELIN is deasserted. - * FAULT should drop low when the SCSI device latches the bus. - */ - k = IMM_SELECT_TMO; - do { - k--; - } - while (!(r_str(ppb) & 0x08) && (k)); - - /* - * Place the interface back into a sane state (status mode) - */ - w_ctr(ppb, 0xc); - return (k) ? 1 : 0; -} - -static int imm_init(int host_no) -{ - int retv; - -#if defined(CONFIG_PARPORT) || defined(CONFIG_PARPORT_MODULE) - if (imm_pb_claim(host_no)) - while (imm_hosts[host_no].p_busy) - schedule(); /* We can safe schedule here */ -#endif - retv = imm_connect(host_no, 0); + /* + * The following table is electrical pin values. + * (BSY is inverted at the CTR register) + * + * BSY ACK POut SEL Fault + * S1 0 X 1 1 1 + * S2 1 X 0 1 1 + * S3 L X 1 1 S + * + * L => Last device in chain + * S => Selected + * + * Observered values for S1,S2,S3 are: + * Disconnect => f8/58/78 + * Connect => f8/58/70 + */ + if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x30)) + return 1; /* Connected */ + if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x38)) + return 0; /* Disconnected */ + + return -1; /* No device present */ +} + +static inline int imm_connect(imm_struct *dev, int flag) +{ + unsigned short ppb = dev->base; + + imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */ + imm_cpp(ppb, 0x30); /* Disconnect all devices */ - if (retv == 1) { - imm_reset_pulse(IMM_BASE(host_no)); - udelay(1000); /* Delay to allow devices to settle */ - imm_disconnect(host_no); - udelay(1000); /* Another delay to allow devices to settle */ - retv = device_check(host_no); - imm_pb_release(host_no); - return retv; - } - imm_pb_release(host_no); - return 1; -} - -static inline int imm_send_command(Scsi_Cmnd * cmd) -{ - int host_no = cmd->device->host->unique_id; - int k; - - /* NOTE: IMM uses byte pairs */ - for (k = 0; k < cmd->cmd_len; k += 2) - if (!imm_out(host_no, &cmd->cmnd[k], 2)) - return 0; - return 1; + if ((dev->mode == IMM_EPP_8) || + (dev->mode == IMM_EPP_16) || + (dev->mode == IMM_EPP_32)) + return imm_cpp(ppb, 0x28); /* Select device 0 in EPP mode */ + return imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */ +} + +static void imm_disconnect(imm_struct *dev) +{ + imm_cpp(dev->base, 0x30); /* Disconnect all devices */ +} + +static int imm_select(imm_struct *dev, int target) +{ + int k; + unsigned short ppb = dev->base; + + /* + * Firstly we want to make sure there is nothing + * holding onto the SCSI bus. + */ + w_ctr(ppb, 0xc); + + k = IMM_SELECT_TMO; + do { + k--; + } while ((r_str(ppb) & 0x08) && (k)); + + if (!k) + return 0; + + /* + * Now assert the SCSI ID (HOST and TARGET) on the data bus + */ + w_ctr(ppb, 0x4); + w_dtr(ppb, 0x80 | (1 << target)); + udelay(1); + + /* + * Deassert SELIN first followed by STROBE + */ + w_ctr(ppb, 0xc); + w_ctr(ppb, 0xd); + + /* + * ACK should drop low while SELIN is deasserted. + * FAULT should drop low when the SCSI device latches the bus. + */ + k = IMM_SELECT_TMO; + do { + k--; + } + while (!(r_str(ppb) & 0x08) && (k)); + + /* + * Place the interface back into a sane state (status mode) + */ + w_ctr(ppb, 0xc); + return (k) ? 1 : 0; +} + +static int imm_init(imm_struct *dev) +{ + if (imm_connect(dev, 0) != 1) + return -EIO; + imm_reset_pulse(dev->base); + udelay(1000); /* Delay to allow devices to settle */ + imm_disconnect(dev); + udelay(1000); /* Another delay to allow devices to settle */ + return device_check(dev); +} + +static inline int imm_send_command(Scsi_Cmnd *cmd) +{ + imm_struct *dev = imm_dev(cmd->device->host); + int k; + + /* NOTE: IMM uses byte pairs */ + for (k = 0; k < cmd->cmd_len; k += 2) + if (!imm_out(dev, &cmd->cmnd[k], 2)) + return 0; + return 1; } /* @@ -768,94 +633,99 @@ * The driver appears to remain stable if we speed up the parallel port * i/o in this function, but not elsewhere. */ -static int imm_completion(Scsi_Cmnd * cmd) +static int imm_completion(Scsi_Cmnd *cmd) { - /* Return codes: - * -1 Error - * 0 Told to schedule - * 1 Finished data transfer - */ - int host_no = cmd->device->host->unique_id; - unsigned short ppb = IMM_BASE(host_no); - unsigned long start_jiffies = jiffies; - - unsigned char r, v; - int fast, bulk, status; - - v = cmd->cmnd[0]; - bulk = ((v == READ_6) || - (v == READ_10) || - (v == WRITE_6) || - (v == WRITE_10)); - - /* - * We only get here if the drive is ready to comunicate, - * hence no need for a full imm_wait. - */ - w_ctr(ppb, 0x0c); - r = (r_str(ppb) & 0xb8); - - /* - * while (device is not ready to send status byte) - * loop; - */ - while (r != (unsigned char) 0xb8) { + /* Return codes: + * -1 Error + * 0 Told to schedule + * 1 Finished data transfer + */ + imm_struct *dev = imm_dev(cmd->device->host); + unsigned short ppb = dev->base; + unsigned long start_jiffies = jiffies; + + unsigned char r, v; + int fast, bulk, status; + + v = cmd->cmnd[0]; + bulk = ((v == READ_6) || + (v == READ_10) || (v == WRITE_6) || (v == WRITE_10)); + /* - * If we have been running for more than a full timer tick - * then take a rest. + * We only get here if the drive is ready to comunicate, + * hence no need for a full imm_wait. */ - if (time_after(jiffies, start_jiffies + 1)) - return 0; + w_ctr(ppb, 0x0c); + r = (r_str(ppb) & 0xb8); /* - * FAIL if: - * a) Drive status is screwy (!ready && !present) - * b) Drive is requesting/sending more data than expected - */ - if (((r & 0x88) != 0x88) || (cmd->SCp.this_residual <= 0)) { - imm_fail(host_no, DID_ERROR); - return -1; /* ERROR_RETURN */ - } - /* determine if we should use burst I/O */ - if (imm_hosts[host_no].rd == 0) { - fast = (bulk && (cmd->SCp.this_residual >= IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 2; - status = imm_out(host_no, cmd->SCp.ptr, fast); - } else { - fast = (bulk && (cmd->SCp.this_residual >= IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 1; - status = imm_in(host_no, cmd->SCp.ptr, fast); - } - - cmd->SCp.ptr += fast; - cmd->SCp.this_residual -= fast; - - if (!status) { - imm_fail(host_no, DID_BUS_BUSY); - return -1; /* ERROR_RETURN */ - } - if (cmd->SCp.buffer && !cmd->SCp.this_residual) { - /* if scatter/gather, advance to the next segment */ - if (cmd->SCp.buffers_residual--) { - cmd->SCp.buffer++; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; + * while (device is not ready to send status byte) + * loop; + */ + while (r != (unsigned char) 0xb8) { + /* + * If we have been running for more than a full timer tick + * then take a rest. + */ + if (time_after(jiffies, start_jiffies + 1)) + return 0; /* - * Make sure that we transfer even number of bytes - * otherwise it makes imm_byte_out() messy. + * FAIL if: + * a) Drive status is screwy (!ready && !present) + * b) Drive is requesting/sending more data than expected */ - if (cmd->SCp.this_residual & 0x01) - cmd->SCp.this_residual++; - } - } - /* Now check to see if the drive is ready to comunicate */ - w_ctr(ppb, 0x0c); - r = (r_str(ppb) & 0xb8); + if (((r & 0x88) != 0x88) || (cmd->SCp.this_residual <= 0)) { + imm_fail(dev, DID_ERROR); + return -1; /* ERROR_RETURN */ + } + /* determine if we should use burst I/O */ + if (dev->rd == 0) { + fast = (bulk + && (cmd->SCp.this_residual >= + IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 2; + status = imm_out(dev, cmd->SCp.ptr, fast); + } else { + fast = (bulk + && (cmd->SCp.this_residual >= + IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 1; + status = imm_in(dev, cmd->SCp.ptr, fast); + } + + cmd->SCp.ptr += fast; + cmd->SCp.this_residual -= fast; - /* If not, drop back down to the scheduler and wait a timer tick */ - if (!(r & 0x80)) - return 0; - } - return 1; /* FINISH_RETURN */ + if (!status) { + imm_fail(dev, DID_BUS_BUSY); + return -1; /* ERROR_RETURN */ + } + if (cmd->SCp.buffer && !cmd->SCp.this_residual) { + /* if scatter/gather, advance to the next segment */ + if (cmd->SCp.buffers_residual--) { + cmd->SCp.buffer++; + cmd->SCp.this_residual = + cmd->SCp.buffer->length; + cmd->SCp.ptr = + page_address(cmd->SCp.buffer->page) + + cmd->SCp.buffer->offset; + + /* + * Make sure that we transfer even number of bytes + * otherwise it makes imm_byte_out() messy. + */ + if (cmd->SCp.this_residual & 0x01) + cmd->SCp.this_residual++; + } + } + /* Now check to see if the drive is ready to comunicate */ + w_ctr(ppb, 0x0c); + r = (r_str(ppb) & 0xb8); + + /* If not, drop back down to the scheduler and wait a timer tick */ + if (!(r & 0x80)) + return 0; + } + return 1; /* FINISH_RETURN */ } /* @@ -865,226 +735,229 @@ */ static void imm_interrupt(void *data) { - imm_struct *tmp = (imm_struct *) data; - Scsi_Cmnd *cmd = tmp->cur_cmd; - struct Scsi_Host *host = cmd->device->host; - unsigned long flags; - - if (!cmd) { - printk("IMM: bug in imm_interrupt\n"); - return; - } - if (imm_engine(tmp, cmd)) { - INIT_WORK(&tmp->imm_tq, imm_interrupt, (void *)tmp); - schedule_delayed_work(&tmp->imm_tq, 1); - return; - } - /* Command must of completed hence it is safe to let go... */ + imm_struct *dev = (imm_struct *) data; + Scsi_Cmnd *cmd = dev->cur_cmd; + struct Scsi_Host *host = cmd->device->host; + unsigned long flags; + + if (!cmd) { + printk("IMM: bug in imm_interrupt\n"); + return; + } + if (imm_engine(dev, cmd)) { + INIT_WORK(&dev->imm_tq, imm_interrupt, (void *) dev); + schedule_delayed_work(&dev->imm_tq, 1); + return; + } + /* Command must of completed hence it is safe to let go... */ #if IMM_DEBUG > 0 - switch ((cmd->result >> 16) & 0xff) { - case DID_OK: - break; - case DID_NO_CONNECT: - printk("imm: no device at SCSI ID %i\n", cmd->target); - break; - case DID_BUS_BUSY: - printk("imm: BUS BUSY - EPP timeout detected\n"); - break; - case DID_TIME_OUT: - printk("imm: unknown timeout\n"); - break; - case DID_ABORT: - printk("imm: told to abort\n"); - break; - case DID_PARITY: - printk("imm: parity error (???)\n"); - break; - case DID_ERROR: - printk("imm: internal driver error\n"); - break; - case DID_RESET: - printk("imm: told to reset device\n"); - break; - case DID_BAD_INTR: - printk("imm: bad interrupt (???)\n"); - break; - default: - printk("imm: bad return code (%02x)\n", (cmd->result >> 16) & 0xff); - } + switch ((cmd->result >> 16) & 0xff) { + case DID_OK: + break; + case DID_NO_CONNECT: + printk("imm: no device at SCSI ID %i\n", cmd->target); + break; + case DID_BUS_BUSY: + printk("imm: BUS BUSY - EPP timeout detected\n"); + break; + case DID_TIME_OUT: + printk("imm: unknown timeout\n"); + break; + case DID_ABORT: + printk("imm: told to abort\n"); + break; + case DID_PARITY: + printk("imm: parity error (???)\n"); + break; + case DID_ERROR: + printk("imm: internal driver error\n"); + break; + case DID_RESET: + printk("imm: told to reset device\n"); + break; + case DID_BAD_INTR: + printk("imm: bad interrupt (???)\n"); + break; + default: + printk("imm: bad return code (%02x)\n", + (cmd->result >> 16) & 0xff); + } #endif - if (cmd->SCp.phase > 1) - imm_disconnect(cmd->device->host->unique_id); - if (cmd->SCp.phase > 0) - imm_pb_release(cmd->device->host->unique_id); - - spin_lock_irqsave(host->host_lock, flags); - tmp->cur_cmd = 0; - cmd->scsi_done(cmd); - spin_unlock_irqrestore(host->host_lock, flags); - return; -} - -static int imm_engine(imm_struct * tmp, Scsi_Cmnd * cmd) -{ - int host_no = cmd->device->host->unique_id; - unsigned short ppb = IMM_BASE(host_no); - unsigned char l = 0, h = 0; - int retv, x; - - /* First check for any errors that may have occurred - * Here we check for internal errors - */ - if (tmp->failed) - return 0; + if (cmd->SCp.phase > 1) + imm_disconnect(dev); - switch (cmd->SCp.phase) { - case 0: /* Phase 0 - Waiting for parport */ - if ((jiffies - tmp->jstart) > HZ) { - /* - * We waited more than a second - * for parport to call us - */ - imm_fail(host_no, DID_BUS_BUSY); - return 0; - } - return 1; /* wait until imm_wakeup claims parport */ - /* Phase 1 - Connected */ - case 1: - imm_connect(host_no, CONNECT_EPP_MAYBE); - cmd->SCp.phase++; - - /* Phase 2 - We are now talking to the scsi bus */ - case 2: - if (!imm_select(host_no, cmd->device->id)) { - imm_fail(host_no, DID_NO_CONNECT); - return 0; - } - cmd->SCp.phase++; + imm_pb_dismiss(dev); - /* Phase 3 - Ready to accept a command */ - case 3: - w_ctr(ppb, 0x0c); - if (!(r_str(ppb) & 0x80)) - return 1; - - if (!imm_send_command(cmd)) - return 0; - cmd->SCp.phase++; - - /* Phase 4 - Setup scatter/gather buffers */ - case 4: - if (cmd->use_sg) { - /* if many buffers are available, start filling the first */ - cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; - } else { - /* else fill the only available buffer */ - cmd->SCp.buffer = NULL; - cmd->SCp.this_residual = cmd->request_bufflen; - cmd->SCp.ptr = cmd->request_buffer; - } - cmd->SCp.buffers_residual = cmd->use_sg - 1; - cmd->SCp.phase++; - if (cmd->SCp.this_residual & 0x01) - cmd->SCp.this_residual++; - /* Phase 5 - Pre-Data transfer stage */ - case 5: - /* Spin lock for BUSY */ - w_ctr(ppb, 0x0c); - if (!(r_str(ppb) & 0x80)) - return 1; + spin_lock_irqsave(host->host_lock, flags); + dev->cur_cmd = 0; + cmd->scsi_done(cmd); + spin_unlock_irqrestore(host->host_lock, flags); + return; +} - /* Require negotiation for read requests */ - x = (r_str(ppb) & 0xb8); - tmp->rd = (x & 0x10) ? 1 : 0; - tmp->dp = (x & 0x20) ? 0 : 1; +static int imm_engine(imm_struct *dev, Scsi_Cmnd *cmd) +{ + unsigned short ppb = dev->base; + unsigned char l = 0, h = 0; + int retv, x; - if ((tmp->dp) && (tmp->rd)) - if (imm_negotiate(tmp)) + /* First check for any errors that may have occurred + * Here we check for internal errors + */ + if (dev->failed) return 0; - cmd->SCp.phase++; - /* Phase 6 - Data transfer stage */ - case 6: - /* Spin lock for BUSY */ - w_ctr(ppb, 0x0c); - if (!(r_str(ppb) & 0x80)) - return 1; + switch (cmd->SCp.phase) { + case 0: /* Phase 0 - Waiting for parport */ + if (time_after(jiffies, dev->jstart + HZ)) { + /* + * We waited more than a second + * for parport to call us + */ + imm_fail(dev, DID_BUS_BUSY); + return 0; + } + return 1; /* wait until imm_wakeup claims parport */ + /* Phase 1 - Connected */ + case 1: + imm_connect(dev, CONNECT_EPP_MAYBE); + cmd->SCp.phase++; + + /* Phase 2 - We are now talking to the scsi bus */ + case 2: + if (!imm_select(dev, cmd->device->id)) { + imm_fail(dev, DID_NO_CONNECT); + return 0; + } + cmd->SCp.phase++; - if (tmp->dp) { - retv = imm_completion(cmd); - if (retv == -1) - return 0; - if (retv == 0) - return 1; - } - cmd->SCp.phase++; + /* Phase 3 - Ready to accept a command */ + case 3: + w_ctr(ppb, 0x0c); + if (!(r_str(ppb) & 0x80)) + return 1; + + if (!imm_send_command(cmd)) + return 0; + cmd->SCp.phase++; + + /* Phase 4 - Setup scatter/gather buffers */ + case 4: + if (cmd->use_sg) { + /* if many buffers are available, start filling the first */ + cmd->SCp.buffer = + (struct scatterlist *) cmd->request_buffer; + cmd->SCp.this_residual = cmd->SCp.buffer->length; + cmd->SCp.ptr = + page_address(cmd->SCp.buffer->page) + + cmd->SCp.buffer->offset; + } else { + /* else fill the only available buffer */ + cmd->SCp.buffer = NULL; + cmd->SCp.this_residual = cmd->request_bufflen; + cmd->SCp.ptr = cmd->request_buffer; + } + cmd->SCp.buffers_residual = cmd->use_sg - 1; + cmd->SCp.phase++; + if (cmd->SCp.this_residual & 0x01) + cmd->SCp.this_residual++; + /* Phase 5 - Pre-Data transfer stage */ + case 5: + /* Spin lock for BUSY */ + w_ctr(ppb, 0x0c); + if (!(r_str(ppb) & 0x80)) + return 1; + + /* Require negotiation for read requests */ + x = (r_str(ppb) & 0xb8); + dev->rd = (x & 0x10) ? 1 : 0; + dev->dp = (x & 0x20) ? 0 : 1; + + if ((dev->dp) && (dev->rd)) + if (imm_negotiate(dev)) + return 0; + cmd->SCp.phase++; + + /* Phase 6 - Data transfer stage */ + case 6: + /* Spin lock for BUSY */ + w_ctr(ppb, 0x0c); + if (!(r_str(ppb) & 0x80)) + return 1; + + if (dev->dp) { + retv = imm_completion(cmd); + if (retv == -1) + return 0; + if (retv == 0) + return 1; + } + cmd->SCp.phase++; - /* Phase 7 - Post data transfer stage */ - case 7: - if ((tmp->dp) && (tmp->rd)) { - if ((tmp->mode == IMM_NIBBLE) || (tmp->mode == IMM_PS2)) { - w_ctr(ppb, 0x4); - w_ctr(ppb, 0xc); - w_ctr(ppb, 0xe); - w_ctr(ppb, 0x4); - } - } - cmd->SCp.phase++; + /* Phase 7 - Post data transfer stage */ + case 7: + if ((dev->dp) && (dev->rd)) { + if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) { + w_ctr(ppb, 0x4); + w_ctr(ppb, 0xc); + w_ctr(ppb, 0xe); + w_ctr(ppb, 0x4); + } + } + cmd->SCp.phase++; + + /* Phase 8 - Read status/message */ + case 8: + /* Check for data overrun */ + if (imm_wait(dev) != (unsigned char) 0xb8) { + imm_fail(dev, DID_ERROR); + return 0; + } + if (imm_negotiate(dev)) + return 0; + if (imm_in(dev, &l, 1)) { /* read status byte */ + /* Check for optional message byte */ + if (imm_wait(dev) == (unsigned char) 0xb8) + imm_in(dev, &h, 1); + cmd->result = (DID_OK << 16) + (l & STATUS_MASK); + } + if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) { + w_ctr(ppb, 0x4); + w_ctr(ppb, 0xc); + w_ctr(ppb, 0xe); + w_ctr(ppb, 0x4); + } + return 0; /* Finished */ + break; - /* Phase 8 - Read status/message */ - case 8: - /* Check for data overrun */ - if (imm_wait(host_no) != (unsigned char) 0xb8) { - imm_fail(host_no, DID_ERROR); - return 0; - } - if (imm_negotiate(tmp)) - return 0; - if (imm_in(host_no, &l, 1)) { /* read status byte */ - /* Check for optional message byte */ - if (imm_wait(host_no) == (unsigned char) 0xb8) - imm_in(host_no, &h, 1); - cmd->result = (DID_OK << 16) + (l & STATUS_MASK); - } - if ((tmp->mode == IMM_NIBBLE) || (tmp->mode == IMM_PS2)) { - w_ctr(ppb, 0x4); - w_ctr(ppb, 0xc); - w_ctr(ppb, 0xe); - w_ctr(ppb, 0x4); - } - return 0; /* Finished */ - break; - - default: - printk("imm: Invalid scsi phase\n"); - } - return 0; + default: + printk("imm: Invalid scsi phase\n"); + } + return 0; } -int imm_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +static int imm_queuecommand(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) { - int host_no = cmd->device->host->unique_id; + imm_struct *dev = imm_dev(cmd->device->host); - if (imm_hosts[host_no].cur_cmd) { - printk("IMM: bug in imm_queuecommand\n"); - return 0; - } - imm_hosts[host_no].failed = 0; - imm_hosts[host_no].jstart = jiffies; - imm_hosts[host_no].cur_cmd = cmd; - cmd->scsi_done = done; - cmd->result = DID_ERROR << 16; /* default return code */ - cmd->SCp.phase = 0; /* bus free */ + if (dev->cur_cmd) { + printk("IMM: bug in imm_queuecommand\n"); + return 0; + } + dev->failed = 0; + dev->jstart = jiffies; + dev->cur_cmd = cmd; + cmd->scsi_done = done; + cmd->result = DID_ERROR << 16; /* default return code */ + cmd->SCp.phase = 0; /* bus free */ - imm_pb_claim(host_no); + INIT_WORK(&dev->imm_tq, imm_interrupt, dev); + schedule_work(&dev->imm_tq); - INIT_WORK(&imm_hosts[host_no].imm_tq, imm_interrupt, imm_hosts + host_no); - schedule_work(&imm_hosts[host_no].imm_tq); + imm_pb_claim(dev); - return 0; + return 0; } /* @@ -1093,150 +966,320 @@ * be done in sd.c. Even if it gets fixed there, this will still * work. */ -int imm_biosparam(struct scsi_device *sdev, struct block_device *dev, - sector_t capacity, int ip[]) +static int imm_biosparam(struct scsi_device *sdev, struct block_device *dev, + sector_t capacity, int ip[]) { - ip[0] = 0x40; - ip[1] = 0x20; - ip[2] = ((unsigned long)capacity + 1) / (ip[0] * ip[1]); - if (ip[2] > 1024) { - ip[0] = 0xff; - ip[1] = 0x3f; - ip[2] = ((unsigned long)capacity + 1) / (ip[0] * ip[1]); - } - return 0; -} - -int imm_abort(Scsi_Cmnd * cmd) -{ - int host_no = cmd->device->host->unique_id; - /* - * There is no method for aborting commands since Iomega - * have tied the SCSI_MESSAGE line high in the interface - */ - - switch (cmd->SCp.phase) { - case 0: /* Do not have access to parport */ - case 1: /* Have not connected to interface */ - imm_hosts[host_no].cur_cmd = NULL; /* Forget the problem */ - return SUCCESS; - break; - default: /* SCSI command sent, can not abort */ - return FAILED; - break; - } + ip[0] = 0x40; + ip[1] = 0x20; + ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]); + if (ip[2] > 1024) { + ip[0] = 0xff; + ip[1] = 0x3f; + ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]); + } + return 0; } -void imm_reset_pulse(unsigned int base) +static int imm_abort(Scsi_Cmnd *cmd) { - w_ctr(base, 0x04); - w_dtr(base, 0x40); - udelay(1); - w_ctr(base, 0x0c); - w_ctr(base, 0x0d); - udelay(50); - w_ctr(base, 0x0c); - w_ctr(base, 0x04); + imm_struct *dev = imm_dev(cmd->device->host); + /* + * There is no method for aborting commands since Iomega + * have tied the SCSI_MESSAGE line high in the interface + */ + + switch (cmd->SCp.phase) { + case 0: /* Do not have access to parport */ + case 1: /* Have not connected to interface */ + dev->cur_cmd = NULL; /* Forget the problem */ + return SUCCESS; + break; + default: /* SCSI command sent, can not abort */ + return FAILED; + break; + } } -int imm_reset(Scsi_Cmnd * cmd) +static void imm_reset_pulse(unsigned int base) { - int host_no = cmd->device->host->unique_id; + w_ctr(base, 0x04); + w_dtr(base, 0x40); + udelay(1); + w_ctr(base, 0x0c); + w_ctr(base, 0x0d); + udelay(50); + w_ctr(base, 0x0c); + w_ctr(base, 0x04); +} + +static int imm_reset(Scsi_Cmnd *cmd) +{ + imm_struct *dev = imm_dev(cmd->device->host); + + if (cmd->SCp.phase) + imm_disconnect(dev); + dev->cur_cmd = NULL; /* Forget the problem */ + + imm_connect(dev, CONNECT_NORMAL); + imm_reset_pulse(dev->base); + udelay(1000); /* device settle delay */ + imm_disconnect(dev); + udelay(1000); /* device settle delay */ + return SUCCESS; +} - if (cmd->SCp.phase) - imm_disconnect(host_no); - imm_hosts[host_no].cur_cmd = NULL; /* Forget the problem */ +static int device_check(imm_struct *dev) +{ + /* This routine looks for a device and then attempts to use EPP + to send a command. If all goes as planned then EPP is available. */ + + static char cmd[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + int loop, old_mode, status, k, ppb = dev->base; + unsigned char l; + + old_mode = dev->mode; + for (loop = 0; loop < 8; loop++) { + /* Attempt to use EPP for Test Unit Ready */ + if ((ppb & 0x0007) == 0x0000) + dev->mode = IMM_EPP_32; + + second_pass: + imm_connect(dev, CONNECT_EPP_MAYBE); + /* Select SCSI device */ + if (!imm_select(dev, loop)) { + imm_disconnect(dev); + continue; + } + printk("imm: Found device at ID %i, Attempting to use %s\n", + loop, IMM_MODE_STRING[dev->mode]); - imm_connect(host_no, CONNECT_NORMAL); - imm_reset_pulse(IMM_BASE(host_no)); - udelay(1000); /* device settle delay */ - imm_disconnect(host_no); - udelay(1000); /* device settle delay */ - return SUCCESS; + /* Send SCSI command */ + status = 1; + w_ctr(ppb, 0x0c); + for (l = 0; (l < 3) && (status); l++) + status = imm_out(dev, &cmd[l << 1], 2); + + if (!status) { + imm_disconnect(dev); + imm_connect(dev, CONNECT_EPP_MAYBE); + imm_reset_pulse(dev->base); + udelay(1000); + imm_disconnect(dev); + udelay(1000); + if (dev->mode == IMM_EPP_32) { + dev->mode = old_mode; + goto second_pass; + } + printk("imm: Unable to establish communication\n"); + return -EIO; + } + w_ctr(ppb, 0x0c); + + k = 1000000; /* 1 Second */ + do { + l = r_str(ppb); + k--; + udelay(1); + } while (!(l & 0x80) && (k)); + + l &= 0xb8; + + if (l != 0xb8) { + imm_disconnect(dev); + imm_connect(dev, CONNECT_EPP_MAYBE); + imm_reset_pulse(dev->base); + udelay(1000); + imm_disconnect(dev); + udelay(1000); + if (dev->mode == IMM_EPP_32) { + dev->mode = old_mode; + goto second_pass; + } + printk + ("imm: Unable to establish communication\n"); + return -EIO; + } + imm_disconnect(dev); + printk + ("imm: Communication established at 0x%x with ID %i using %s\n", + ppb, loop, IMM_MODE_STRING[dev->mode]); + imm_connect(dev, CONNECT_EPP_MAYBE); + imm_reset_pulse(dev->base); + udelay(1000); + imm_disconnect(dev); + udelay(1000); + return 0; + } + printk("imm: No devices found\n"); + return -ENODEV; } -static int device_check(int host_no) +static Scsi_Host_Template imm_template = { + .module = THIS_MODULE, + .proc_name = "imm", + .proc_info = imm_proc_info, + .name = "Iomega VPI2 (imm) interface", + .queuecommand = imm_queuecommand, + .eh_abort_handler = imm_abort, + .eh_bus_reset_handler = imm_reset, + .eh_host_reset_handler = imm_reset, + .bios_param = imm_biosparam, + .this_id = 7, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 1, + .use_clustering = ENABLE_CLUSTERING, + .can_queue = 1, +}; + +/*************************************************************************** + * Parallel port probing routines * + ***************************************************************************/ + +static LIST_HEAD(imm_hosts); + +static int __imm_attach(struct parport *pb) { - /* This routine looks for a device and then attempts to use EPP - to send a command. If all goes as planned then EPP is available. */ + struct Scsi_Host *host; + imm_struct *dev; + DECLARE_WAIT_QUEUE_HEAD(waiting); + DEFINE_WAIT(wait); + int ports; + int modes, ppb; + int err = -ENOMEM; - static char cmd[6] = - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - int loop, old_mode, status, k, ppb = IMM_BASE(host_no); - unsigned char l; + init_waitqueue_head(&waiting); - old_mode = imm_hosts[host_no].mode; - for (loop = 0; loop < 8; loop++) { - /* Attempt to use EPP for Test Unit Ready */ - if ((ppb & 0x0007) == 0x0000) - imm_hosts[host_no].mode = IMM_EPP_32; + dev = kmalloc(sizeof(imm_struct), GFP_KERNEL); + if (!dev) + return -ENOMEM; - second_pass: - imm_connect(host_no, CONNECT_EPP_MAYBE); - /* Select SCSI device */ - if (!imm_select(host_no, loop)) { - imm_disconnect(host_no); - continue; - } - printk("imm: Found device at ID %i, Attempting to use %s\n", loop, - IMM_MODE_STRING[imm_hosts[host_no].mode]); + memset(dev, 0, sizeof(imm_struct)); + + dev->base = -1; + dev->mode = IMM_AUTODETECT; + INIT_LIST_HEAD(&dev->list); + + dev->dev = parport_register_device(pb, "imm", NULL, imm_wakeup, + NULL, 0, dev); + + if (!dev->dev) + goto out; - /* Send SCSI command */ - status = 1; - w_ctr(ppb, 0x0c); - for (l = 0; (l < 3) && (status); l++) - status = imm_out(host_no, &cmd[l << 1], 2); - if (!status) { - imm_disconnect(host_no); - imm_connect(host_no, CONNECT_EPP_MAYBE); - imm_reset_pulse(IMM_BASE(host_no)); - udelay(1000); - imm_disconnect(host_no); - udelay(1000); - if (imm_hosts[host_no].mode == IMM_EPP_32) { - imm_hosts[host_no].mode = old_mode; - goto second_pass; - } - printk("imm: Unable to establish communication, aborting driver load.\n"); - return 1; + /* Claim the bus so it remembers what we do to the control + * registers. [ CTR and ECP ] + */ + err = -EBUSY; + dev->waiting = &waiting; + prepare_to_wait(&waiting, &wait, TASK_UNINTERRUPTIBLE); + if (imm_pb_claim(dev)) + schedule_timeout(3 * HZ); + if (dev->wanted) { + printk(KERN_ERR "imm%d: failed to claim parport because " + "a pardevice is owning the port for too long " + "time!\n", pb->number); + imm_pb_dismiss(dev); + dev->waiting = NULL; + finish_wait(&waiting, &wait); + goto out1; } + dev->waiting = NULL; + finish_wait(&waiting, &wait); + ppb = dev->base = dev->dev->port->base; + dev->base_hi = dev->dev->port->base_hi; w_ctr(ppb, 0x0c); + modes = dev->dev->port->modes; - k = 1000000; /* 1 Second */ - do { - l = r_str(ppb); - k--; - udelay(1); - } while (!(l & 0x80) && (k)); - - l &= 0xb8; - - if (l != 0xb8) { - imm_disconnect(host_no); - imm_connect(host_no, CONNECT_EPP_MAYBE); - imm_reset_pulse(IMM_BASE(host_no)); - udelay(1000); - imm_disconnect(host_no); - udelay(1000); - if (imm_hosts[host_no].mode == IMM_EPP_32) { - imm_hosts[host_no].mode = old_mode; - goto second_pass; - } - printk("imm: Unable to establish communication, aborting driver load.\n"); - return 1; - } - imm_disconnect(host_no); - printk("imm: Communication established at 0x%x with ID %i using %s\n", ppb, loop, - IMM_MODE_STRING[imm_hosts[host_no].mode]); - imm_connect(host_no, CONNECT_EPP_MAYBE); - imm_reset_pulse(IMM_BASE(host_no)); - udelay(1000); - imm_disconnect(host_no); - udelay(1000); + /* Mode detection works up the chain of speed + * This avoids a nasty if-then-else-if-... tree + */ + dev->mode = IMM_NIBBLE; + + if (modes & PARPORT_MODE_TRISTATE) + dev->mode = IMM_PS2; + + /* Done configuration */ + + err = imm_init(dev); + + imm_pb_release(dev); + + if (err) + goto out1; + + /* now the glue ... */ + if (dev->mode == IMM_NIBBLE || dev->mode == IMM_PS2) + ports = 3; + else + ports = 8; + + INIT_WORK(&dev->imm_tq, imm_interrupt, dev); + + err = -ENOMEM; + host = scsi_host_alloc(&imm_template, sizeof(imm_struct *)); + if (!host) + goto out1; + host->io_port = pb->base; + host->n_io_port = ports; + host->dma_channel = -1; + host->unique_id = pb->number; + *(imm_struct **)&host->hostdata = dev; + dev->host = host; + list_add_tail(&dev->list, &imm_hosts); + err = scsi_add_host(host, NULL); + if (err) + goto out2; + scsi_scan_host(host); return 0; - } - printk("imm: No devices found, aborting driver load.\n"); - return 1; + +out2: + list_del_init(&dev->list); + scsi_host_put(host); +out1: + parport_unregister_device(dev->dev); +out: + kfree(dev); + return err; +} + +static void imm_attach(struct parport *pb) +{ + __imm_attach(pb); +} + +static void imm_detach(struct parport *pb) +{ + imm_struct *dev; + list_for_each_entry(dev, &imm_hosts, list) { + if (dev->dev->port == pb) { + list_del_init(&dev->list); + scsi_remove_host(dev->host); + scsi_host_put(dev->host); + parport_unregister_device(dev->dev); + kfree(dev); + break; + } + } +} + +static struct parport_driver imm_driver = { + .name = "imm", + .attach = imm_attach, + .detach = imm_detach, +}; + +static int __init imm_driver_init(void) +{ + printk("imm: Version %s\n", IMM_VERSION); + return parport_register_driver(&imm_driver); } + +static void __exit imm_driver_exit(void) +{ + parport_unregister_driver(&imm_driver); +} + +module_init(imm_driver_init); +module_exit(imm_driver_exit); + MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/imm.h b/drivers/scsi/imm.h --- a/drivers/scsi/imm.h Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/imm.h Tue Feb 17 20:00:05 2004 @@ -66,7 +66,6 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ -#ifdef IMM_CODE #include #include #include @@ -109,11 +108,7 @@ [IMM_UNKNOWN] = "Unknown", }; -/* This is a global option */ -int imm_sg = SG_ALL; /* enable/disable scatter-gather. */ - /* other options */ -#define IMM_CAN_QUEUE 1 /* use "queueing" interface */ #define IMM_BURST_SIZE 512 /* data burst size */ #define IMM_SELECT_TMO 500 /* 500 how long to wait for target ? */ #define IMM_SPIN_TMO 5000 /* 50000 imm_wait loop limiter */ @@ -145,23 +140,5 @@ #endif static int imm_engine(imm_struct *, Scsi_Cmnd *); -static int imm_in(int, char *, int); -static int imm_init(int); -static void imm_interrupt(void *); -static int imm_out(int, char *, int); - -#else -#define imm_release 0 -#endif - -int imm_detect(Scsi_Host_Template *); -const char *imm_info(struct Scsi_Host *); -int imm_command(Scsi_Cmnd *); -int imm_queuecommand(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); -int imm_abort(Scsi_Cmnd *); -int imm_reset(Scsi_Cmnd *); -int imm_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); -int imm_biosparam(struct scsi_device *, struct block_device *, - sector_t, int *); #endif /* _IMM_H */ diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c --- a/drivers/scsi/libata-core.c Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/libata-core.c Tue Feb 17 20:00:05 2004 @@ -1,8 +1,8 @@ /* libata-core.c - helper library for ATA - Copyright 2003 Red Hat, Inc. All rights reserved. - Copyright 2003 Jeff Garzik + Copyright 2003-2004 Red Hat, Inc. All rights reserved. + Copyright 2003-2004 Jeff Garzik The contents of this file are subject to the Open Software License version 1.1 that can be found at @@ -969,7 +969,7 @@ printk(KERN_INFO "ata%u: dev %u ATA, max %s, %Lu sectors%s\n", ap->id, device, ata_udma_string(udma_modes), - dev->n_sectors, + (unsigned long long)dev->n_sectors, dev->flags & ATA_DFLAG_LBA48 ? " (lba48)" : ""); } diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c --- a/drivers/scsi/libata-scsi.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/libata-scsi.c Tue Feb 17 20:00:06 2004 @@ -1,8 +1,8 @@ /* libata-scsi.c - helper library for ATA - Copyright 2003 Red Hat, Inc. All rights reserved. - Copyright 2003 Jeff Garzik + Copyright 2003-2004 Red Hat, Inc. All rights reserved. + Copyright 2003-2004 Jeff Garzik The contents of this file are subject to the Open Software License version 1.1 that can be found at diff -Nru a/drivers/scsi/libata.h b/drivers/scsi/libata.h --- a/drivers/scsi/libata.h Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/libata.h Tue Feb 17 20:00:06 2004 @@ -1,8 +1,8 @@ /* libata.h - helper library for ATA - Copyright 2003 Red Hat, Inc. All rights reserved. - Copyright 2003 Jeff Garzik + Copyright 2003-2004 Red Hat, Inc. All rights reserved. + Copyright 2003-2004 Jeff Garzik The contents of this file are subject to the Open Software License version 1.1 that can be found at @@ -26,7 +26,7 @@ #define __LIBATA_H__ #define DRV_NAME "libata" -#define DRV_VERSION "0.81" /* must be exactly four chars */ +#define DRV_VERSION "1.00" /* must be exactly four chars */ struct ata_scsi_args { struct ata_port *ap; diff -Nru a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c --- a/drivers/scsi/mac53c94.c Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/mac53c94.c Tue Feb 17 20:00:05 2004 @@ -23,6 +23,7 @@ #include #include #include +#include #include "scsi.h" #include "hosts.h" @@ -37,13 +38,12 @@ }; struct fsc_state { - volatile struct mac53c94_regs *regs; + struct mac53c94_regs *regs; int intr; - volatile struct dbdma_regs *dma; + struct dbdma_regs *dma; int dmaintr; int clk_freq; struct Scsi_Host *host; - struct fsc_state *next; Scsi_Cmnd *request_q; Scsi_Cmnd *request_qtail; Scsi_Cmnd *current_req; /* req we're currently working on */ @@ -52,151 +52,23 @@ void *dma_cmd_space; struct pci_dev *pdev; dma_addr_t dma_addr; + struct macio_dev *mdev; }; -static struct fsc_state *all_53c94s; - static void mac53c94_init(struct fsc_state *); static void mac53c94_start(struct fsc_state *); static void mac53c94_interrupt(int, void *, struct pt_regs *); static irqreturn_t do_mac53c94_interrupt(int, void *, struct pt_regs *); static void cmd_done(struct fsc_state *, int result); static void set_dma_cmds(struct fsc_state *, Scsi_Cmnd *); -static int data_goes_out(Scsi_Cmnd *); - -int -mac53c94_detect(Scsi_Host_Template *tp) -{ - struct device_node *node; - int nfscs; - struct fsc_state *state, **prev_statep; - struct Scsi_Host *host; - void *dma_cmd_space; - unsigned char *clkprop; - int proplen; - struct pci_dev *pdev; - u8 pbus, devfn; - - nfscs = 0; - prev_statep = &all_53c94s; - for (node = find_devices("53c94"); node != 0; node = node->next) { - if (node->n_addrs != 2 || node->n_intrs != 2) { - printk(KERN_ERR "mac53c94: expected 2 addrs and intrs" - " (got %d/%d) for node %s\n", - node->n_addrs, node->n_intrs, node->full_name); - continue; - } - - pdev = NULL; - if (node->parent != NULL - && !pci_device_from_OF_node(node->parent, &pbus, &devfn)) - pdev = pci_find_slot(pbus, devfn); - if (pdev == NULL) { - printk(KERN_ERR "mac53c94: can't find PCI device " - "for %s\n", node->full_name); - continue; - } - - host = scsi_register(tp, sizeof(struct fsc_state)); - if (host == NULL) - break; - host->unique_id = nfscs; - - state = (struct fsc_state *) host->hostdata; - if (state == 0) { - /* "can't happen" */ - printk(KERN_ERR "mac53c94: no state for %s?!\n", - node->full_name); - scsi_unregister(host); - break; - } - state->host = host; - state->pdev = pdev; - - state->regs = (volatile struct mac53c94_regs *) - ioremap(node->addrs[0].address, 0x1000); - state->intr = node->intrs[0].line; - state->dma = (volatile struct dbdma_regs *) - ioremap(node->addrs[1].address, 0x1000); - state->dmaintr = node->intrs[1].line; - if (state->regs == NULL || state->dma == NULL) { - printk(KERN_ERR "mac53c94: ioremap failed for %s\n", - node->full_name); - if (state->dma != NULL) - iounmap(state->dma); - if (state->regs != NULL) - iounmap(state->regs); - scsi_unregister(host); - break; - } - - clkprop = get_property(node, "clock-frequency", &proplen); - if (clkprop == NULL || proplen != sizeof(int)) { - printk(KERN_ERR "%s: can't get clock frequency, " - "assuming 25MHz\n", node->full_name); - state->clk_freq = 25000000; - } else - state->clk_freq = *(int *)clkprop; - - /* Space for dma command list: +1 for stop command, - +1 to allow for aligning. */ - dma_cmd_space = kmalloc((host->sg_tablesize + 2) * - sizeof(struct dbdma_cmd), GFP_KERNEL); - if (dma_cmd_space == 0) { - printk(KERN_ERR "mac53c94: couldn't allocate dma " - "command space for %s\n", node->full_name); - goto err_cleanup; - } - state->dma_cmds = (struct dbdma_cmd *) - DBDMA_ALIGN(dma_cmd_space); - memset(state->dma_cmds, 0, (host->sg_tablesize + 1) - * sizeof(struct dbdma_cmd)); - state->dma_cmd_space = dma_cmd_space; - - *prev_statep = state; - prev_statep = &state->next; - - if (request_irq(state->intr, do_mac53c94_interrupt, 0, - "53C94", state)) { - printk(KERN_ERR "mac53C94: can't get irq %d for %s\n", - state->intr, node->full_name); - err_cleanup: - iounmap(state->dma); - iounmap(state->regs); - scsi_unregister(host); - break; - } - - mac53c94_init(state); - - ++nfscs; - } - return nfscs; -} - -int -mac53c94_release(struct Scsi_Host *host) -{ - struct fsc_state *fp = (struct fsc_state *) host->hostdata; - if (fp == 0) - return 0; - if (fp->regs) - iounmap((void *) fp->regs); - if (fp->dma) - iounmap((void *) fp->dma); - kfree(fp->dma_cmd_space); - free_irq(fp->intr, fp); - return 0; -} -int -mac53c94_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) +static int mac53c94_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) { struct fsc_state *state; #if 0 - if (data_goes_out(cmd)) { + if (cmd->sc_data_direction == SCSI_DATA_WRITE) { int i; printk(KERN_DEBUG "mac53c94_queue %p: command is", cmd); for (i = 0; i < cmd->cmd_len; ++i) @@ -223,60 +95,52 @@ return 0; } -int -mac53c94_abort(Scsi_Cmnd *cmd) +static int mac53c94_abort(Scsi_Cmnd *cmd) { return SCSI_ABORT_SNOOZE; } -int -mac53c94_host_reset(Scsi_Cmnd *cmd) +static int mac53c94_host_reset(Scsi_Cmnd *cmd) { struct fsc_state *state = (struct fsc_state *) cmd->device->host->hostdata; - volatile struct mac53c94_regs *regs = state->regs; - volatile struct dbdma_regs *dma = state->dma; + struct mac53c94_regs *regs = state->regs; + struct dbdma_regs *dma = state->dma; st_le32(&dma->control, (RUN|PAUSE|FLUSH|WAKE) << 16); - regs->command = CMD_SCSI_RESET; /* assert RST */ - eieio(); + writeb(CMD_SCSI_RESET, ®s->command); /* assert RST */ udelay(100); /* leave it on for a while (>= 25us) */ - regs->command = CMD_RESET; - eieio(); + writeb(CMD_RESET, ®s->command); udelay(20); mac53c94_init(state); - regs->command = CMD_NOP; - eieio(); + writeb(CMD_NOP, ®s->command); return SUCCESS; } -static void -mac53c94_init(struct fsc_state *state) +static void mac53c94_init(struct fsc_state *state) { - volatile struct mac53c94_regs *regs = state->regs; - volatile struct dbdma_regs *dma = state->dma; + struct mac53c94_regs *regs = state->regs; + struct dbdma_regs *dma = state->dma; int x; - regs->config1 = state->host->this_id | CF1_PAR_ENABLE; - regs->sel_timeout = TIMO_VAL(250); /* 250ms */ - regs->clk_factor = CLKF_VAL(state->clk_freq); - regs->config2 = CF2_FEATURE_EN; - regs->config3 = 0; - regs->sync_period = 0; - regs->sync_offset = 0; - eieio(); - x = regs->interrupt; - st_le32(&dma->control, (RUN|PAUSE|FLUSH|WAKE) << 16); + writeb(state->host->this_id | CF1_PAR_ENABLE, ®s->config1); + writeb(TIMO_VAL(250), ®s->sel_timeout); /* 250ms */ + writeb(CLKF_VAL(state->clk_freq), ®s->clk_factor); + writeb(CF2_FEATURE_EN, ®s->config2); + writeb(0, ®s->config3); + writeb(0, ®s->sync_period); + writeb(0, ®s->sync_offset); + x = readb(®s->interrupt); + writel((RUN|PAUSE|FLUSH|WAKE) << 16, &dma->control); } /* * Start the next command for a 53C94. * Should be called with interrupts disabled. */ -static void -mac53c94_start(struct fsc_state *state) +static void mac53c94_start(struct fsc_state *state) { Scsi_Cmnd *cmd; - volatile struct mac53c94_regs *regs = state->regs; + struct mac53c94_regs *regs = state->regs; int i; if (state->phase != idle || state->current_req != NULL) @@ -287,37 +151,30 @@ state->request_q = (Scsi_Cmnd *) cmd->host_scribble; /* Off we go */ - regs->count_lo = 0; - regs->count_mid = 0; - regs->count_hi = 0; - eieio(); - regs->command = CMD_NOP + CMD_DMA_MODE; + writeb(0, ®s->count_lo); + writeb(0, ®s->count_mid); + writeb(0, ®s->count_hi); + writeb(CMD_NOP + CMD_DMA_MODE, ®s->command); udelay(1); - eieio(); - regs->command = CMD_FLUSH; + writeb(CMD_FLUSH, ®s->command); udelay(1); - eieio(); - regs->dest_id = cmd->device->id; - regs->sync_period = 0; - regs->sync_offset = 0; - eieio(); + writeb(cmd->device->id, ®s->dest_id); + writeb(0, ®s->sync_period); + writeb(0, ®s->sync_offset); /* load the command into the FIFO */ - for (i = 0; i < cmd->cmd_len; ++i) { - regs->fifo = cmd->cmnd[i]; - eieio(); - } + for (i = 0; i < cmd->cmd_len; ++i) + writeb(cmd->cmnd[i], ®s->fifo); /* do select without ATN XXX */ - regs->command = CMD_SELECT; + writeb(CMD_SELECT, ®s->command); state->phase = selecting; if (cmd->use_sg > 0 || cmd->request_bufflen != 0) set_dma_cmds(state, cmd); } -static irqreturn_t -do_mac53c94_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t do_mac53c94_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) { unsigned long flags; struct Scsi_Host *dev = ((struct fsc_state *) dev_id)->current_req->device->host; @@ -328,12 +185,11 @@ return IRQ_HANDLED; } -static void -mac53c94_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) +static void mac53c94_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) { struct fsc_state *state = (struct fsc_state *) dev_id; - volatile struct mac53c94_regs *regs = state->regs; - volatile struct dbdma_regs *dma = state->dma; + struct mac53c94_regs *regs = state->regs; + struct dbdma_regs *dma = state->dma; Scsi_Cmnd *cmd = state->current_req; int nb, stat, seq, intr; static int mac53c94_errors; @@ -343,9 +199,9 @@ * Apparently, reading the interrupt register unlatches * the status and sequence step registers. */ - seq = regs->seqstep; - stat = regs->status; - intr = regs->interrupt; + seq = readb(®s->seqstep); + stat = readb(®s->status); + intr = readb(®s->interrupt); #if 0 printk(KERN_DEBUG "mac53c94_intr, intr=%x stat=%x seq=%x phase=%d\n", @@ -355,8 +211,8 @@ if (intr & INTR_RESET) { /* SCSI bus was reset */ printk(KERN_INFO "external SCSI bus reset detected\n"); - regs->command = CMD_NOP; - st_le32(&dma->control, RUN << 16); /* stop dma */ + writeb(CMD_NOP, ®s->command); + writel(RUN << 16, &dma->control); /* stop dma */ cmd_done(state, DID_RESET << 16); return; } @@ -373,8 +229,7 @@ intr, stat, seq, state->phase); #endif ++mac53c94_errors; - regs->command = CMD_NOP + CMD_DMA_MODE; - eieio(); + writeb(CMD_NOP + CMD_DMA_MODE, ®s->command); } if (cmd == 0) { printk(KERN_DEBUG "53c94: interrupt with no command active?\n"); @@ -402,7 +257,7 @@ cmd_done(state, DID_ERROR << 16); return; } - regs->command = CMD_NOP; + writeb(CMD_NOP, ®s->command); /* set DMA controller going if any data to transfer */ if ((stat & (STAT_MSG|STAT_CD)) == 0 && (cmd->use_sg > 0 || cmd->request_bufflen != 0)) { @@ -410,20 +265,17 @@ if (nb > 0xfff0) nb = 0xfff0; cmd->SCp.this_residual -= nb; - regs->count_lo = nb; - regs->count_mid = nb >> 8; - eieio(); - regs->command = CMD_DMA_MODE + CMD_NOP; - eieio(); - st_le32(&dma->cmdptr, virt_to_phys(state->dma_cmds)); - st_le32(&dma->control, (RUN << 16) | RUN); - eieio(); - regs->command = CMD_DMA_MODE + CMD_XFER_DATA; + writeb(nb, ®s->count_lo); + writeb(nb >> 8, ®s->count_mid); + writeb(CMD_DMA_MODE + CMD_NOP, ®s->command); + writel(virt_to_phys(state->dma_cmds), &dma->cmdptr); + writel((RUN << 16) | RUN, &dma->control); + writeb(CMD_DMA_MODE + CMD_XFER_DATA, ®s->command); state->phase = dataing; break; } else if ((stat & STAT_PHASE) == STAT_CD + STAT_IO) { /* up to status phase already */ - regs->command = CMD_I_COMPLETE; + writeb(CMD_I_COMPLETE, ®s->command); state->phase = completing; } else { printk(KERN_DEBUG "in unexpected phase %x after cmd\n", @@ -446,18 +298,16 @@ if (nb > 0xfff0) nb = 0xfff0; cmd->SCp.this_residual -= nb; - regs->count_lo = nb; - regs->count_mid = nb >> 8; - eieio(); - regs->command = CMD_DMA_MODE + CMD_NOP; - eieio(); - regs->command = CMD_DMA_MODE + CMD_XFER_DATA; + writeb(nb, ®s->count_lo); + writeb(nb >> 8, ®s->count_mid); + writeb(CMD_DMA_MODE + CMD_NOP, ®s->command); + writeb(CMD_DMA_MODE + CMD_XFER_DATA, ®s->command); break; } if ((stat & STAT_PHASE) != STAT_CD + STAT_IO) { printk(KERN_DEBUG "intr %x before data xfer complete\n", intr); } - out_le32(&dma->control, RUN << 16); /* stop dma */ + writel(RUN << 16, &dma->control); /* stop dma */ dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); if (cmd->use_sg != 0) { pci_unmap_sg(state->pdev, @@ -468,7 +318,7 @@ cmd->request_bufflen, dma_dir); } /* should check dma status */ - regs->command = CMD_I_COMPLETE; + writeb(CMD_I_COMPLETE, ®s->command); state->phase = completing; break; case completing: @@ -477,10 +327,10 @@ cmd_done(state, DID_ERROR << 16); return; } - cmd->SCp.Status = regs->fifo; eieio(); - cmd->SCp.Message = regs->fifo; eieio(); - cmd->result = - regs->command = CMD_ACCEPT_MSG; + cmd->SCp.Status = readb(®s->fifo); + cmd->SCp.Message = readb(®s->fifo); + cmd->result = CMD_ACCEPT_MSG; + writeb(CMD_ACCEPT_MSG, ®s->command); state->phase = busfreeing; break; case busfreeing: @@ -495,8 +345,7 @@ } } -static void -cmd_done(struct fsc_state *state, int result) +static void cmd_done(struct fsc_state *state, int result) { Scsi_Cmnd *cmd; @@ -513,8 +362,7 @@ /* * Set up DMA commands for transferring data. */ -static void -set_dma_cmds(struct fsc_state *state, Scsi_Cmnd *cmd) +static void set_dma_cmds(struct fsc_state *state, Scsi_Cmnd *cmd) { int i, dma_cmd, total; struct scatterlist *scl; @@ -523,7 +371,8 @@ u32 dma_len; int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); - dma_cmd = data_goes_out(cmd)? OUTPUT_MORE: INPUT_MORE; + dma_cmd = cmd->sc_data_direction == SCSI_DATA_WRITE? OUTPUT_MORE: + INPUT_MORE; dcmds = state->dma_cmds; if (cmd->use_sg > 0) { int nseg; @@ -562,63 +411,9 @@ cmd->SCp.this_residual = total; } -/* - * Work out whether data will be going out from the host adaptor or into it. - */ -static int -data_goes_out(Scsi_Cmnd *cmd) -{ - switch (cmd->sc_data_direction) { - case SCSI_DATA_WRITE: - return 1; - case SCSI_DATA_READ: - return 0; - } - - /* for SCSI_DATA_UNKNOWN or SCSI_DATA_NONE, fall back on the - old method for now... */ - switch (cmd->cmnd[0]) { - case CHANGE_DEFINITION: - case COMPARE: - case COPY: - case COPY_VERIFY: - case FORMAT_UNIT: - case LOG_SELECT: - case MEDIUM_SCAN: - case MODE_SELECT: - case MODE_SELECT_10: - case REASSIGN_BLOCKS: - case RESERVE: - case SEARCH_EQUAL: - case SEARCH_EQUAL_12: - case SEARCH_HIGH: - case SEARCH_HIGH_12: - case SEARCH_LOW: - case SEARCH_LOW_12: - case SEND_DIAGNOSTIC: - case SEND_VOLUME_TAG: - case SET_WINDOW: - case UPDATE_BLOCK: - case WRITE_BUFFER: - case WRITE_6: - case WRITE_10: - case WRITE_12: - case WRITE_LONG: - case WRITE_LONG_2: /* alternate code for WRITE_LONG */ - case WRITE_SAME: - case WRITE_VERIFY: - case WRITE_VERIFY_12: - return 1; - default: - return 0; - } -} - -static Scsi_Host_Template driver_template = { +static Scsi_Host_Template mac53c94_template = { .proc_name = "53c94", .name = "53C94", - .detect = mac53c94_detect, - .release = mac53c94_release, .queuecommand = mac53c94_queue, .eh_abort_handler = mac53c94_abort, .eh_host_reset_handler = mac53c94_host_reset, @@ -629,4 +424,158 @@ .use_clustering = DISABLE_CLUSTERING, }; -#include "scsi_module.c" +static int mac53c94_probe(struct macio_dev *mdev, const struct of_match *match) +{ + struct device_node *node = macio_get_of_node(mdev); + struct pci_dev *pdev = macio_get_pci_dev(mdev); + struct fsc_state *state; + struct Scsi_Host *host; + void *dma_cmd_space; + unsigned char *clkprop; + int proplen; + + if (macio_resource_count(mdev) != 2 || macio_irq_count(mdev) != 2) { + printk(KERN_ERR "mac53c94: expected 2 addrs and intrs (got %d/%d)\n", + node->n_addrs, node->n_intrs); + return -ENODEV; + } + + if (macio_request_resources(mdev, "mac53c94") != 0) { + printk(KERN_ERR "mac53c94: unable to request memory resources"); + return -EBUSY; + } + + host = scsi_host_alloc(&mac53c94_template, sizeof(struct fsc_state)); + if (host == NULL) { + printk(KERN_ERR "mac53c94: couldn't register host"); + goto out_release; + } + + state = (struct fsc_state *) host->hostdata; + macio_set_drvdata(mdev, state); + state->host = host; + state->pdev = pdev; + state->mdev = mdev; + + state->regs = (struct mac53c94_regs *) + ioremap(macio_resource_start(mdev, 0), 0x1000); + state->intr = macio_irq(mdev, 0); + state->dma = (struct dbdma_regs *) + ioremap(macio_resource_start(mdev, 1), 0x1000); + state->dmaintr = macio_irq(mdev, 1); + if (state->regs == NULL || state->dma == NULL) { + printk(KERN_ERR "mac53c94: ioremap failed for %s\n", + node->full_name); + goto out_free; + } + + clkprop = get_property(node, "clock-frequency", &proplen); + if (clkprop == NULL || proplen != sizeof(int)) { + printk(KERN_ERR "%s: can't get clock frequency, " + "assuming 25MHz\n", node->full_name); + state->clk_freq = 25000000; + } else + state->clk_freq = *(int *)clkprop; + + /* Space for dma command list: +1 for stop command, + * +1 to allow for aligning. + * XXX FIXME: Use DMA consistent routines + */ + dma_cmd_space = kmalloc((host->sg_tablesize + 2) * + sizeof(struct dbdma_cmd), GFP_KERNEL); + if (dma_cmd_space == 0) { + printk(KERN_ERR "mac53c94: couldn't allocate dma " + "command space for %s\n", node->full_name); + goto out_free; + } + state->dma_cmds = (struct dbdma_cmd *)DBDMA_ALIGN(dma_cmd_space); + memset(state->dma_cmds, 0, (host->sg_tablesize + 1) + * sizeof(struct dbdma_cmd)); + state->dma_cmd_space = dma_cmd_space; + + mac53c94_init(state); + + if (request_irq(state->intr, do_mac53c94_interrupt, 0, "53C94", state)) { + printk(KERN_ERR "mac53C94: can't get irq %d for %s\n", + state->intr, node->full_name); + goto out_free_dma; + } + + /* XXX FIXME: handle failure */ + scsi_add_host(host, &mdev->ofdev.dev); + scsi_scan_host(host); + + return 0; + + out_free_dma: + kfree(state->dma_cmd_space); + out_free: + if (state->dma != NULL) + iounmap(state->dma); + if (state->regs != NULL) + iounmap(state->regs); + scsi_host_put(host); + out_release: + macio_release_resources(mdev); + + return -ENODEV; +} + +static int mac53c94_remove(struct macio_dev *mdev) +{ + struct fsc_state *fp = (struct fsc_state *)macio_get_drvdata(mdev); + struct Scsi_Host *host = fp->host; + + scsi_remove_host(host); + + free_irq(fp->intr, fp); + + if (fp->regs) + iounmap((void *) fp->regs); + if (fp->dma) + iounmap((void *) fp->dma); + kfree(fp->dma_cmd_space); + + scsi_host_put(host); + + macio_release_resources(mdev); + + return 0; +} + + +static struct of_match mac53c94_match[] = +{ + { + .name = "53c94", + .type = OF_ANY_MATCH, + .compatible = OF_ANY_MATCH + }, + {}, +}; + +static struct macio_driver mac53c94_driver = +{ + .name = "mac53c94", + .match_table = mac53c94_match, + .probe = mac53c94_probe, + .remove = mac53c94_remove, +}; + + +static int __init init_mac53c94(void) +{ + return macio_register_driver(&mac53c94_driver); +} + +static void __exit exit_mac53c94(void) +{ + return macio_unregister_driver(&mac53c94_driver); +} + +module_init(init_mac53c94); +module_exit(exit_mac53c94); + +MODULE_DESCRIPTION("PowerMac 53c94 SCSI driver"); +MODULE_AUTHOR("Paul Mackerras "); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/mac_NCR5380.c b/drivers/scsi/mac_NCR5380.c --- a/drivers/scsi/mac_NCR5380.c Tue Feb 17 20:00:07 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,3127 +0,0 @@ -/* - * NCR 5380 generic driver routines. These should make it *trivial* - * to implement 5380 SCSI drivers under Linux with a non-trantor - * architecture. - * - * Note that these routines also work with NR53c400 family chips. - * - * Copyright 1993, Drew Eckhardt - * Visionary Computing - * (Unix and Linux consulting and custom programming) - * drew@colorado.edu - * +1 (303) 666-5836 - * - * DISTRIBUTION RELEASE 6. - * - * For more information, please consult - * - * NCR 5380 Family - * SCSI Protocol Controller - * Databook - * - * NCR Microelectronics - * 1635 Aeroplaza Drive - * Colorado Springs, CO 80916 - * 1+ (719) 578-3400 - * 1+ (800) 334-5454 - */ - -/* - * ++roman: To port the 5380 driver to the Atari, I had to do some changes in - * this file, too: - * - * - Some of the debug statements were incorrect (undefined variables and the - * like). I fixed that. - * - * - In information_transfer(), I think a #ifdef was wrong. Looking at the - * possible DMA transfer size should also happen for REAL_DMA. I added this - * in the #if statement. - * - * - When using real DMA, information_transfer() should return in a DATAOUT - * phase after starting the DMA. It has nothing more to do. - * - * - The interrupt service routine should run main after end of DMA, too (not - * only after RESELECTION interrupts). Additionally, it should _not_ test - * for more interrupts after running main, since a DMA process may have - * been started and interrupts are turned on now. The new int could happen - * inside the execution of NCR5380_intr(), leading to recursive - * calls. - * - * - I've added a function merge_contiguous_buffers() that tries to - * merge scatter-gather buffers that are located at contiguous - * physical addresses and can be processed with the same DMA setup. - * Since most scatter-gather operations work on a page (4K) of - * 4 buffers (1K), in more than 90% of all cases three interrupts and - * DMA setup actions are saved. - * - * - I've deleted all the stuff for AUTOPROBE_IRQ, REAL_DMA_POLL, PSEUDO_DMA - * and USLEEP, because these were messing up readability and will never be - * needed for Atari SCSI. - * - * - I've revised the NCR5380_main() calling scheme (relax the 'main_running' - * stuff), and 'main' is executed in a bottom half if awoken by an - * interrupt. - * - * - The code was quite cluttered up by "#if (NDEBUG & NDEBUG_*) printk..." - * constructs. In my eyes, this made the source rather unreadable, so I - * finally replaced that by the *_PRINTK() macros. - * - */ - -/* - * Further development / testing that should be done : - * 1. Test linked command handling code after Eric is ready with - * the high level code. - */ - -/* - * Michael: To port Romans driver to the Macintosh, I've left most of the code - * unchanged, in order to make later implemantation of REAL_DMA easier. - * - * Alan: In order to make it easier to read and as the 5380 based Mac's never - * have DMA I took the real DMA out of mac_scsi.c but not this file. - * - * With luck we can merge this back with the ST folks in time. - * - * Changes: - * - * - all Falcon-specific stuff (ST-DMA locking) was removed - * - * - */ - -#if (NDEBUG & NDEBUG_LISTS) -#define LIST(x,y) \ - { printk("LINE:%d Adding %p to %p\n", __LINE__, (void*)(x), (void*)(y)); \ - if ((x)==(y)) udelay(5); } -#define REMOVE(w,x,y,z) \ - { printk("LINE:%d Removing: %p->%p %p->%p \n", __LINE__, \ - (void*)(w), (void*)(x), (void*)(y), (void*)(z)); \ - if ((x)==(y)) udelay(5); } -#else -#define LIST(x,y) -#define REMOVE(w,x,y,z) -#endif - -#ifndef notyet -#undef LINKED -#endif - -/* - * Design - * Issues : - * - * The other Linux SCSI drivers were written when Linux was Intel PC-only, - * and specifically for each board rather than each chip. This makes their - * adaptation to platforms like the Mac (Some of which use NCR5380's) - * more difficult than it has to be. - * - * Also, many of the SCSI drivers were written before the command queuing - * routines were implemented, meaning their implementations of queued - * commands were hacked on rather than designed in from the start. - * - * When I designed the Linux SCSI drivers I figured that - * while having two different SCSI boards in a system might be useful - * for debugging things, two of the same type wouldn't be used. - * Well, I was wrong and a number of users have mailed me about running - * multiple high-performance SCSI boards in a server. - * - * Finally, when I get questions from users, I have no idea what - * revision of my driver they are running. - * - * This driver attempts to address these problems : - * This is a generic 5380 driver. To use it on a different platform, - * one simply writes appropriate system specific macros (ie, data - * transfer - some PC's will use the I/O bus, 68K's must use - * memory mapped) and drops this file in their 'C' wrapper. - * - * As far as command queueing, two queues are maintained for - * each 5380 in the system - commands that haven't been issued yet, - * and commands that are currently executing. This means that an - * unlimited number of commands may be queued, letting - * more commands propagate from the higher driver levels giving higher - * throughput. Note that both I_T_L and I_T_L_Q nexuses are supported, - * allowing multiple commands to propagate all the way to a SCSI-II device - * while a command is already executing. - * - * To solve the multiple-boards-in-the-same-system problem, - * there is a separate instance structure for each instance - * of a 5380 in the system. So, multiple NCR5380 drivers will - * be able to coexist with appropriate changes to the high level - * SCSI code. - * - * A NCR5380_PUBLIC_REVISION macro is provided, with the release - * number (updated for each public release) printed by the - * NCR5380_print_options command, which should be called from the - * wrapper detect function, so that I know what release of the driver - * users are using. - * - * Issues specific to the NCR5380 : - * - * When used in a PIO or pseudo-dma mode, the NCR5380 is a braindead - * piece of hardware that requires you to sit in a loop polling for - * the REQ signal as long as you are connected. Some devices are - * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect - * while doing long seek operations. - * - * The workaround for this is to keep track of devices that have - * disconnected. If the device hasn't disconnected, for commands that - * should disconnect, we do something like - * - * while (!REQ is asserted) { sleep for N usecs; poll for M usecs } - * - * Some tweaking of N and M needs to be done. An algorithm based - * on "time to data" would give the best results as long as short time - * to datas (ie, on the same track) were considered, however these - * broken devices are the exception rather than the rule and I'd rather - * spend my time optimizing for the normal case. - * - * Architecture : - * - * At the heart of the design is a coroutine, NCR5380_main, - * which is started when not running by the interrupt handler, - * timer, and queue command function. It attempts to establish - * I_T_L or I_T_L_Q nexuses by removing the commands from the - * issue queue and calling NCR5380_select() if a nexus - * is not established. - * - * Once a nexus is established, the NCR5380_information_transfer() - * phase goes through the various phases as instructed by the target. - * if the target goes into MSG IN and sends a DISCONNECT message, - * the command structure is placed into the per instance disconnected - * queue, and NCR5380_main tries to find more work. If USLEEP - * was defined, and the target is idle for too long, the system - * will try to sleep. - * - * If a command has disconnected, eventually an interrupt will trigger, - * calling NCR5380_intr() which will in turn call NCR5380_reselect - * to reestablish a nexus. This will run main if necessary. - * - * On command termination, the done function will be called as - * appropriate. - * - * SCSI pointers are maintained in the SCp field of SCSI command - * structures, being initialized after the command is connected - * in NCR5380_select, and set as appropriate in NCR5380_information_transfer. - * Note that in violation of the standard, an implicit SAVE POINTERS operation - * is done, since some BROKEN disks fail to issue an explicit SAVE POINTERS. - */ - -/* - * Using this file : - * This file a skeleton Linux SCSI driver for the NCR 5380 series - * of chips. To use it, you write a architecture specific functions - * and macros and include this file in your driver. - * - * These macros control options : - * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically - * for commands that return with a CHECK CONDITION status. - * - * LINKED - if defined, linked commands are supported. - * - * PSEUDO_DMA - if defined, PSEUDO DMA is used during the data transfer phases. - * - * REAL_DMA - if defined, REAL DMA is used during the data transfer phases. - * - * SUPPORT_TAGS - if defined, SCSI-2 tagged queuing is used where possible - * - * These macros MUST be defined : - * - * NCR5380_read(register) - read from the specified register - * - * NCR5380_write(register, value) - write to the specific register - * - * Either real DMA *or* pseudo DMA may be implemented - * REAL functions : - * NCR5380_REAL_DMA should be defined if real DMA is to be used. - * Note that the DMA setup functions should return the number of bytes - * that they were able to program the controller for. - * - * Also note that generic i386/PC versions of these macros are - * available as NCR5380_i386_dma_write_setup, - * NCR5380_i386_dma_read_setup, and NCR5380_i386_dma_residual. - * - * NCR5380_dma_write_setup(instance, src, count) - initialize - * NCR5380_dma_read_setup(instance, dst, count) - initialize - * NCR5380_dma_residual(instance); - residual count - * - * PSEUDO functions : - * NCR5380_pwrite(instance, src, count) - * NCR5380_pread(instance, dst, count); - * - * If nothing specific to this implementation needs doing (ie, with external - * hardware), you must also define - * - * NCR5380_queue_command - * NCR5380_reset - * NCR5380_abort - * NCR5380_proc_info - * - * to be the global entry points into the specific driver, ie - * #define NCR5380_queue_command t128_queue_command. - * - * If this is not done, the routines will be defined as static functions - * with the NCR5380* names and the user must provide a globally - * accessible wrapper function. - * - * The generic driver is initialized by calling NCR5380_init(instance), - * after setting the appropriate host specific fields and ID. If the - * driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance, - * possible) function may be used. Before the specific driver initialization - * code finishes, NCR5380_print_options should be called. - */ - -static struct Scsi_Host *first_instance = NULL; -static Scsi_Host_Template *the_template = NULL; - -/* Macros ease life... :-) */ -#define SETUP_HOSTDATA(in) \ - struct NCR5380_hostdata *hostdata = \ - (struct NCR5380_hostdata *)(in)->hostdata -#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata) - -#define NEXT(cmd) ((Scsi_Cmnd *)((cmd)->host_scribble)) -#define NEXTADDR(cmd) ((Scsi_Cmnd **)&((cmd)->host_scribble)) - -#define HOSTNO instance->host_no -#define H_NO(cmd) (cmd)->host->host_no - -#ifdef SUPPORT_TAGS - -/* - * Functions for handling tagged queuing - * ===================================== - * - * ++roman (01/96): Now I've implemented SCSI-2 tagged queuing. Some notes: - * - * Using consecutive numbers for the tags is no good idea in my eyes. There - * could be wrong re-usings if the counter (8 bit!) wraps and some early - * command has been preempted for a long time. My solution: a bitfield for - * remembering used tags. - * - * There's also the problem that each target has a certain queue size, but we - * cannot know it in advance :-( We just see a QUEUE_FULL status being - * returned. So, in this case, the driver internal queue size assumption is - * reduced to the number of active tags if QUEUE_FULL is returned by the - * target. The command is returned to the mid-level, but with status changed - * to BUSY, since --as I've seen-- the mid-level can't handle QUEUE_FULL - * correctly. - * - * We're also not allowed running tagged commands as long as an untagged - * command is active. And REQUEST SENSE commands after a contingent allegiance - * condition _must_ be untagged. To keep track whether an untagged command has - * been issued, the host->busy array is still employed, as it is without - * support for tagged queuing. - * - * One could suspect that there are possible race conditions between - * is_lun_busy(), cmd_get_tag() and cmd_free_tag(). But I think this isn't the - * case: is_lun_busy() and cmd_get_tag() are both called from NCR5380_main(), - * which already guaranteed to be running at most once. It is also the only - * place where tags/LUNs are allocated. So no other allocation can slip - * between that pair, there could only happen a reselection, which can free a - * tag, but that doesn't hurt. Only the sequence in cmd_free_tag() becomes - * important: the tag bit must be cleared before 'nr_allocated' is decreased. - */ - -/* -1 for TAG_NONE is not possible with unsigned char cmd->tag */ -#undef TAG_NONE -#define TAG_NONE 0xff - -/* For the m68k, the number of bits in 'allocated' must be a multiple of 32! */ -#if (MAX_TAGS % 32) != 0 -#error "MAX_TAGS must be a multiple of 32!" -#endif - -typedef struct { - char allocated[MAX_TAGS/8]; - int nr_allocated; - int queue_size; -} TAG_ALLOC; - -static TAG_ALLOC TagAlloc[8][8]; /* 8 targets and 8 LUNs */ - - -static void init_tags( void ) -{ - int target, lun; - TAG_ALLOC *ta; - - if (!setup_use_tagged_queuing) - return; - - for( target = 0; target < 8; ++target ) { - for( lun = 0; lun < 8; ++lun ) { - ta = &TagAlloc[target][lun]; - memset( &ta->allocated, 0, MAX_TAGS/8 ); - ta->nr_allocated = 0; - /* At the beginning, assume the maximum queue size we could - * support (MAX_TAGS). This value will be decreased if the target - * returns QUEUE_FULL status. - */ - ta->queue_size = MAX_TAGS; - } - } -} - - -/* Check if we can issue a command to this LUN: First see if the LUN is marked - * busy by an untagged command. If the command should use tagged queuing, also - * check that there is a free tag and the target's queue won't overflow. This - * function should be called with interrupts disabled to avoid race - * conditions. - */ - -static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged ) -{ - SETUP_HOSTDATA(cmd->host); - - if (hostdata->busy[cmd->target] & (1 << cmd->lun)) - return( 1 ); - if (!should_be_tagged || - !setup_use_tagged_queuing || !cmd->device->tagged_supported) - return( 0 ); - if (TagAlloc[cmd->target][cmd->lun].nr_allocated >= - TagAlloc[cmd->target][cmd->lun].queue_size ) { - TAG_PRINTK( "scsi%d: target %d lun %d: no free tags\n", - H_NO(cmd), cmd->target, cmd->lun ); - return( 1 ); - } - return( 0 ); -} - - -/* Allocate a tag for a command (there are no checks anymore, check_lun_busy() - * must be called before!), or reserve the LUN in 'busy' if the command is - * untagged. - */ - -static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) -{ - SETUP_HOSTDATA(cmd->host); - - /* If we or the target don't support tagged queuing, allocate the LUN for - * an untagged command. - */ - if (!should_be_tagged || - !setup_use_tagged_queuing || !cmd->device->tagged_supported) { - cmd->tag = TAG_NONE; - hostdata->busy[cmd->target] |= (1 << cmd->lun); - TAG_PRINTK( "scsi%d: target %d lun %d now allocated by untagged " - "command\n", H_NO(cmd), cmd->target, cmd->lun ); - } - else { - TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun]; - - cmd->tag = find_first_zero_bit( &ta->allocated, MAX_TAGS ); - set_bit( cmd->tag, &ta->allocated ); - ta->nr_allocated++; - TAG_PRINTK( "scsi%d: using tag %d for target %d lun %d " - "(now %d tags in use)\n", - H_NO(cmd), cmd->tag, cmd->target, cmd->lun, - ta->nr_allocated ); - } -} - - -/* Mark the tag of command 'cmd' as free, or in case of an untagged command, - * unlock the LUN. - */ - -static void cmd_free_tag( Scsi_Cmnd *cmd ) -{ - SETUP_HOSTDATA(cmd->host); - - if (cmd->tag == TAG_NONE) { - hostdata->busy[cmd->target] &= ~(1 << cmd->lun); - TAG_PRINTK( "scsi%d: target %d lun %d untagged cmd finished\n", - H_NO(cmd), cmd->target, cmd->lun ); - } - else if (cmd->tag >= MAX_TAGS) { - printk(KERN_NOTICE "scsi%d: trying to free bad tag %d!\n", - H_NO(cmd), cmd->tag ); - } - else { - TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun]; - clear_bit( cmd->tag, &ta->allocated ); - ta->nr_allocated--; - TAG_PRINTK( "scsi%d: freed tag %d for target %d lun %d\n", - H_NO(cmd), cmd->tag, cmd->target, cmd->lun ); - } -} - - -static void free_all_tags( void ) -{ - int target, lun; - TAG_ALLOC *ta; - - if (!setup_use_tagged_queuing) - return; - - for( target = 0; target < 8; ++target ) { - for( lun = 0; lun < 8; ++lun ) { - ta = &TagAlloc[target][lun]; - memset( &ta->allocated, 0, MAX_TAGS/8 ); - ta->nr_allocated = 0; - } - } -} - -#endif /* SUPPORT_TAGS */ - - -/* - * Function: void merge_contiguous_buffers( Scsi_Cmnd *cmd ) - * - * Purpose: Try to merge several scatter-gather requests into one DMA - * transfer. This is possible if the scatter buffers lie on - * physical contiguous addresses. - * - * Parameters: Scsi_Cmnd *cmd - * The command to work on. The first scatter buffer's data are - * assumed to be already transfered into ptr/this_residual. - */ - -static void merge_contiguous_buffers( Scsi_Cmnd *cmd ) -{ - unsigned long endaddr; -#if (NDEBUG & NDEBUG_MERGING) - unsigned long oldlen = cmd->SCp.this_residual; - int cnt = 1; -#endif - - for (endaddr = virt_to_phys(cmd->SCp.ptr + cmd->SCp.this_residual - 1) + 1; - cmd->SCp.buffers_residual && - virt_to_phys(cmd->SCp.buffer[1].address) == endaddr; ) { - - MER_PRINTK("VTOP(%p) == %08lx -> merging\n", - cmd->SCp.buffer[1].address, endaddr); -#if (NDEBUG & NDEBUG_MERGING) - ++cnt; -#endif - ++cmd->SCp.buffer; - --cmd->SCp.buffers_residual; - cmd->SCp.this_residual += cmd->SCp.buffer->length; - endaddr += cmd->SCp.buffer->length; - } -#if (NDEBUG & NDEBUG_MERGING) - if (oldlen != cmd->SCp.this_residual) - MER_PRINTK("merged %d buffers from %p, new length %08x\n", - cnt, cmd->SCp.ptr, cmd->SCp.this_residual); -#endif -} - -/* - * Function : void initialize_SCp(Scsi_Cmnd *cmd) - * - * Purpose : initialize the saved data pointers for cmd to point to the - * start of the buffer. - * - * Inputs : cmd - Scsi_Cmnd structure to have pointers reset. - */ - -static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) -{ - /* - * Initialize the Scsi Pointer field so that all of the commands in the - * various queues are valid. - */ - - if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; - cmd->SCp.buffers_residual = cmd->use_sg - 1; - cmd->SCp.ptr = (char *) cmd->SCp.buffer->address; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - /* ++roman: Try to merge some scatter-buffers if they are at - * contiguous physical addresses. - */ - merge_contiguous_buffers( cmd ); - } else { - cmd->SCp.buffer = NULL; - cmd->SCp.buffers_residual = 0; - cmd->SCp.ptr = (char *) cmd->request_buffer; - cmd->SCp.this_residual = cmd->request_bufflen; - } -} - -#include -#include - -#if 1 -static struct { - unsigned char mask; - const char * name;} -signals[] = {{ SR_DBP, "PARITY"}, { SR_RST, "RST" }, { SR_BSY, "BSY" }, - { SR_REQ, "REQ" }, { SR_MSG, "MSG" }, { SR_CD, "CD" }, { SR_IO, "IO" }, - { SR_SEL, "SEL" }, {0, NULL}}, -basrs[] = {{BASR_ATN, "ATN"}, {BASR_ACK, "ACK"}, {0, NULL}}, -icrs[] = {{ICR_ASSERT_RST, "ASSERT RST"},{ICR_ASSERT_ACK, "ASSERT ACK"}, - {ICR_ASSERT_BSY, "ASSERT BSY"}, {ICR_ASSERT_SEL, "ASSERT SEL"}, - {ICR_ASSERT_ATN, "ASSERT ATN"}, {ICR_ASSERT_DATA, "ASSERT DATA"}, - {0, NULL}}, -mrs[] = {{MR_BLOCK_DMA_MODE, "MODE BLOCK DMA"}, {MR_TARGET, "MODE TARGET"}, - {MR_ENABLE_PAR_CHECK, "MODE PARITY CHECK"}, {MR_ENABLE_PAR_INTR, - "MODE PARITY INTR"}, {MR_ENABLE_EOP_INTR,"MODE EOP INTR"}, - {MR_MONITOR_BSY, "MODE MONITOR BSY"}, - {MR_DMA_MODE, "MODE DMA"}, {MR_ARBITRATE, "MODE ARBITRATION"}, - {0, NULL}}; - -/* - * Function : void NCR5380_print(struct Scsi_Host *instance) - * - * Purpose : print the SCSI bus signals for debugging purposes - * - * Input : instance - which NCR5380 - */ - -static void NCR5380_print(struct Scsi_Host *instance) { - unsigned char status, data, basr, mr, icr, i; - unsigned long flags; - - local_irq_save(flags); - data = NCR5380_read(CURRENT_SCSI_DATA_REG); - status = NCR5380_read(STATUS_REG); - mr = NCR5380_read(MODE_REG); - icr = NCR5380_read(INITIATOR_COMMAND_REG); - basr = NCR5380_read(BUS_AND_STATUS_REG); - local_irq_restore(flags); - printk("STATUS_REG: %02x ", status); - for (i = 0; signals[i].mask ; ++i) - if (status & signals[i].mask) - printk(",%s", signals[i].name); - printk("\nBASR: %02x ", basr); - for (i = 0; basrs[i].mask ; ++i) - if (basr & basrs[i].mask) - printk(",%s", basrs[i].name); - printk("\nICR: %02x ", icr); - for (i = 0; icrs[i].mask; ++i) - if (icr & icrs[i].mask) - printk(",%s", icrs[i].name); - printk("\nMODE: %02x ", mr); - for (i = 0; mrs[i].mask; ++i) - if (mr & mrs[i].mask) - printk(",%s", mrs[i].name); - printk("\n"); -} - -static struct { - unsigned char value; - const char *name; -} phases[] = { - {PHASE_DATAOUT, "DATAOUT"}, {PHASE_DATAIN, "DATAIN"}, {PHASE_CMDOUT, "CMDOUT"}, - {PHASE_STATIN, "STATIN"}, {PHASE_MSGOUT, "MSGOUT"}, {PHASE_MSGIN, "MSGIN"}, - {PHASE_UNKNOWN, "UNKNOWN"}}; - -/* - * Function : void NCR5380_print_phase(struct Scsi_Host *instance) - * - * Purpose : print the current SCSI phase for debugging purposes - * - * Input : instance - which NCR5380 - */ - -static void NCR5380_print_phase(struct Scsi_Host *instance) -{ - unsigned char status; - int i; - - status = NCR5380_read(STATUS_REG); - if (!(status & SR_REQ)) - printk(KERN_DEBUG "scsi%d: REQ not asserted, phase unknown.\n", HOSTNO); - else { - for (i = 0; (phases[i].value != PHASE_UNKNOWN) && - (phases[i].value != (status & PHASE_MASK)); ++i); - printk(KERN_DEBUG "scsi%d: phase %s\n", HOSTNO, phases[i].name); - } -} - -#else /* !NDEBUG */ - -/* dummies... */ -__inline__ void NCR5380_print(struct Scsi_Host *instance) { }; -__inline__ void NCR5380_print_phase(struct Scsi_Host *instance) { }; - -#endif - -/* - * ++roman: New scheme of calling NCR5380_main() - * - * If we're not in an interrupt, we can call our main directly, it cannot be - * already running. Else, we queue it on a task queue, if not 'main_running' - * tells us that a lower level is already executing it. This way, - * 'main_running' needs not be protected in a special way. - * - * queue_main() is a utility function for putting our main onto the task - * queue, if main_running is false. It should be called only from a - * interrupt or bottom half. - */ - -#include -#include - -static volatile int main_running = 0; -static DECLARE_WORK(NCR5380_tqueue, (void (*)(void*))NCR5380_main, NULL); - -static __inline__ void queue_main(void) -{ - if (!main_running) { - /* If in interrupt and NCR5380_main() not already running, - queue it on the 'immediate' task queue, to be processed - immediately after the current interrupt processing has - finished. */ - schedule_work(&NCR5380_tqueue); - } - /* else: nothing to do: the running NCR5380_main() will pick up - any newly queued command. */ -} - - -static void NCR5380_all_init (void) -{ - static int done = 0; - if (!done) { - INI_PRINTK("scsi : NCR5380_all_init()\n"); - done = 1; - } -} - - -/* - * Function : void NCR58380_print_options (struct Scsi_Host *instance) - * - * Purpose : called by probe code indicating the NCR5380 driver - * options that were selected. - * - * Inputs : instance, pointer to this instance. Unused. - */ - -static void NCR5380_print_options (struct Scsi_Host *instance) -{ - printk(" generic options" -#ifdef AUTOSENSE - " AUTOSENSE" -#endif -#ifdef REAL_DMA - " REAL DMA" -#endif -#ifdef PSEUDO_DMA - " PSEUDO DMA" -#endif -#ifdef PARITY - " PARITY" -#endif -#ifdef SUPPORT_TAGS - " SCSI-2 TAGGED QUEUING" -#endif - ); - printk(" generic release=%d", NCR5380_PUBLIC_RELEASE); -} - -/* - * Function : void NCR5380_print_status (struct Scsi_Host *instance) - * - * Purpose : print commands in the various queues, called from - * NCR5380_abort and NCR5380_debug to aid debugging. - * - * Inputs : instance, pointer to this instance. - */ - -static void NCR5380_print_status (struct Scsi_Host *instance) -{ - char *pr_bfr; - char *start; - int len; - - NCR_PRINT(NDEBUG_ANY); - NCR_PRINT_PHASE(NDEBUG_ANY); - - pr_bfr = (char *) __get_free_page(GFP_ATOMIC); - if (!pr_bfr) { - printk("NCR5380_print_status: no memory for print buffer\n"); - return; - } - len = NCR5380_proc_info(instance, pr_bfr, &start, 0, PAGE_SIZE, 0); - pr_bfr[len] = 0; - printk("\n%s\n", pr_bfr); - free_page((unsigned long) pr_bfr); -} - - -/******************************************/ -/* - * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED] - * - * *buffer: I/O buffer - * **start: if inout == FALSE pointer into buffer where user read should start - * offset: current offset - * length: length of buffer - * hostno: Scsi_Host host_no - * inout: TRUE - user is writing; FALSE - user is reading - * - * Return the number of bytes read from or written -*/ - -#undef SPRINTF -#define SPRINTF(fmt,args...) \ - do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ - pos += sprintf(pos, fmt , ## args); } while(0) -static -char *lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length); - -static -int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **start, off_t offset, - int length, int inout) -{ - char *pos = buffer; - struct NCR5380_hostdata *hostdata; - Scsi_Cmnd *ptr; - unsigned long flags; - off_t begin = 0; -#define check_offset() \ - do { \ - if (pos - buffer < offset - begin) { \ - begin += pos - buffer; \ - pos = buffer; \ - } \ - } while (0) - - if (inout) { /* Has data been written to the file ? */ - return(-ENOSYS); /* Currently this is a no-op */ - } - SPRINTF("NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); - check_offset(); - local_irq_save(flags); - SPRINTF("NCR5380: coroutine is%s running.\n", main_running ? "" : "n't"); - check_offset(); - if (!hostdata->connected) - SPRINTF("scsi%d: no currently connected command\n", HOSTNO); - else - pos = lprint_Scsi_Cmnd ((Scsi_Cmnd *) hostdata->connected, - pos, buffer, length); - SPRINTF("scsi%d: issue_queue\n", HOSTNO); - check_offset(); - for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) { - pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); - check_offset(); - } - - SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); - check_offset(); - for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; - ptr = NEXT(ptr)) { - pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); - check_offset(); - } - - local_irq_restore(flags); - *start = buffer + (offset - begin); - if (pos - buffer < offset - begin) - return 0; - else if (pos - buffer - (offset - begin) < length) - return pos - buffer - (offset - begin); - return length; -} - -static char * -lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length) -{ - int i, s; - unsigned char *command; - SPRINTF("scsi%d: destination target %d, lun %d\n", - H_NO(cmd), cmd->target, cmd->lun); - SPRINTF(" command = "); - command = cmd->cmnd; - SPRINTF("%2d (0x%02x)", command[0], command[0]); - for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) - SPRINTF(" %02x", command[i]); - SPRINTF("\n"); - return pos; -} - - -/* - * Function : void NCR5380_init (struct Scsi_Host *instance, int flags) - * - * Purpose : initializes *instance and corresponding 5380 chip. - * - * Inputs : instance - instantiation of the 5380 driver. - * - * Notes : I assume that the host, hostno, and id bits have been - * set correctly. I don't care about the irq and other fields. - * - */ - -static int NCR5380_init (struct Scsi_Host *instance, int flags) -{ - int i; - SETUP_HOSTDATA(instance); - - NCR5380_all_init(); - - hostdata->aborted = 0; - hostdata->id_mask = 1 << instance->this_id; - hostdata->id_higher_mask = 0; - for (i = hostdata->id_mask; i <= 0x80; i <<= 1) - if (i > hostdata->id_mask) - hostdata->id_higher_mask |= i; - for (i = 0; i < 8; ++i) - hostdata->busy[i] = 0; -#ifdef SUPPORT_TAGS - init_tags(); -#endif -#if defined (REAL_DMA) - hostdata->dma_len = 0; -#endif - hostdata->targets_present = 0; - hostdata->connected = NULL; - hostdata->issue_queue = NULL; - hostdata->disconnected_queue = NULL; - hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT; - - if (!the_template) { - the_template = instance->hostt; - first_instance = instance; - } - - -#ifndef AUTOSENSE - if ((instance->cmd_per_lun > 1) || (instance->can_queue > 1)) - printk("scsi%d: WARNING : support for multiple outstanding commands enabled\n" - " without AUTOSENSE option, contingent allegiance conditions may\n" - " be incorrectly cleared.\n", HOSTNO); -#endif /* def AUTOSENSE */ - - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(TARGET_COMMAND_REG, 0); - NCR5380_write(SELECT_ENABLE_REG, 0); - - return 0; -} - -/* - * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd, - * void (*done)(Scsi_Cmnd *)) - * - * Purpose : enqueues a SCSI command - * - * Inputs : cmd - SCSI command, done - function called on completion, with - * a pointer to the command descriptor. - * - * Returns : 0 - * - * Side effects : - * cmd is added to the per instance issue_queue, with minor - * twiddling done to the host specific fields of cmd. If the - * main coroutine is not running, it is restarted. - * - */ - -static -int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) -{ - SETUP_HOSTDATA(cmd->host); - Scsi_Cmnd *tmp; - int oldto; - unsigned long flags; - -#if (NDEBUG & NDEBUG_NO_WRITE) - switch (cmd->cmnd[0]) { - case WRITE_6: - case WRITE_10: - printk(KERN_NOTICE "scsi%d: WRITE attempted with NO_WRITE debugging flag set\n", - H_NO(cmd)); - cmd->result = (DID_ERROR << 16); - done(cmd); - return 0; - } -#endif /* (NDEBUG & NDEBUG_NO_WRITE) */ - - -#ifdef NCR5380_STATS -# if 0 - if (!hostdata->connected && !hostdata->issue_queue && - !hostdata->disconnected_queue) { - hostdata->timebase = jiffies; - } -# endif -# ifdef NCR5380_STAT_LIMIT - if (cmd->request_bufflen > NCR5380_STAT_LIMIT) -# endif - switch (cmd->cmnd[0]) - { - case WRITE: - case WRITE_6: - case WRITE_10: - hostdata->time_write[cmd->target] -= (jiffies - hostdata->timebase); - hostdata->bytes_write[cmd->target] += cmd->request_bufflen; - hostdata->pendingw++; - break; - case READ: - case READ_6: - case READ_10: - hostdata->time_read[cmd->target] -= (jiffies - hostdata->timebase); - hostdata->bytes_read[cmd->target] += cmd->request_bufflen; - hostdata->pendingr++; - break; - } -#endif - - /* - * We use the host_scribble field as a pointer to the next command - * in a queue - */ - - NEXT(cmd) = NULL; - cmd->scsi_done = done; - - cmd->result = 0; - - - /* - * Insert the cmd into the issue queue. Note that REQUEST SENSE - * commands are added to the head of the queue since any command will - * clear the contingent allegiance condition that exists and the - * sense data is only guaranteed to be valid while the condition exists. - */ - - local_irq_save(flags); - - if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) { - LIST(cmd, hostdata->issue_queue); - NEXT(cmd) = hostdata->issue_queue; - hostdata->issue_queue = cmd; - } else { - for (tmp = (Scsi_Cmnd *)hostdata->issue_queue; - NEXT(tmp); tmp = NEXT(tmp)) - ; - LIST(cmd, tmp); - NEXT(tmp) = cmd; - } - local_irq_restore(flags); - - QU_PRINTK("scsi%d: command added to %s of queue\n", H_NO(cmd), - (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail"); - - /* If queue_command() is called from an interrupt (real one or bottom - * half), we let queue_main() do the job of taking care about main. If it - * is already running, this is a no-op, else main will be queued. - * - * If we're not in an interrupt, we can call NCR5380_main() - * unconditionally, because it cannot be already running. - */ - if (in_interrupt() > 0 || ((flags >> 8) & 7) >= 6) - queue_main(); - else - NCR5380_main(NULL); - return 0; -} - -/* - * Function : NCR5380_main (void *bl) - * - * Purpose : NCR5380_main is a coroutine that runs as long as more work can - * be done on the NCR5380 host adapters in a system. Both - * NCR5380_queue_command() and NCR5380_intr() will try to start it - * in case it is not running. - * - * NOTE : NCR5380_main exits with interrupts *disabled*, the caller should - * reenable them. This prevents reentrancy and kernel stack overflow. - */ - -static void NCR5380_main (void *bl) -{ - Scsi_Cmnd *tmp, *prev; - struct Scsi_Host *instance = first_instance; - struct NCR5380_hostdata *hostdata = HOSTDATA(instance); - int done; - unsigned long flags; - - /* - * We run (with interrupts disabled) until we're sure that none of - * the host adapters have anything that can be done, at which point - * we set main_running to 0 and exit. - * - * Interrupts are enabled before doing various other internal - * instructions, after we've decided that we need to run through - * the loop again. - * - * this should prevent any race conditions. - * - * ++roman: Just disabling the NCR interrupt isn't sufficient here, - * because also a timer int can trigger an abort or reset, which can - * alter queues and touch the Falcon lock. - */ - - /* Tell int handlers main() is now already executing. Note that - no races are possible here. If an int comes in before - 'main_running' is set here, and queues/executes main via the - task queue, it doesn't do any harm, just this instance of main - won't find any work left to do. */ - if (main_running) - return; - main_running = 1; - - local_save_flags(flags); - do { - local_irq_disable(); /* Freeze request queues */ - done = 1; - - if (!hostdata->connected) { - MAIN_PRINTK( "scsi%d: not connected\n", HOSTNO ); - /* - * Search through the issue_queue for a command destined - * for a target that's not busy. - */ -#if (NDEBUG & NDEBUG_LISTS) - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; - tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp)) - ; - /*printk("%p ", tmp);*/ - if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/ -#endif - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, - prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) { - -#if (NDEBUG & NDEBUG_LISTS) - if (prev != tmp) - printk("MAIN tmp=%p target=%d busy=%d lun=%d\n", - tmp, tmp->target, hostdata->busy[tmp->target], - tmp->lun); -#endif - /* When we find one, remove it from the issue queue. */ - if ( -#ifdef SUPPORT_TAGS - !is_lun_busy( tmp, tmp->cmnd[0] != REQUEST_SENSE) -#else - !(hostdata->busy[tmp->target] & (1 << tmp->lun)) -#endif - ) { - /* ++guenther: just to be sure, this must be atomic */ - local_irq_disable(); - if (prev) { - REMOVE(prev, NEXT(prev), tmp, NEXT(tmp)); - NEXT(prev) = NEXT(tmp); - } else { - REMOVE(-1, hostdata->issue_queue, tmp, NEXT(tmp)); - hostdata->issue_queue = NEXT(tmp); - } - NEXT(tmp) = NULL; - - /* reenable interrupts after finding one */ - local_irq_restore(flags); - - /* - * Attempt to establish an I_T_L nexus here. - * On success, instance->hostdata->connected is set. - * On failure, we must add the command back to the - * issue queue so we can keep trying. - */ - MAIN_PRINTK("scsi%d: main(): command for target %d " - "lun %d removed from issue_queue\n", - HOSTNO, tmp->target, tmp->lun); - /* - * REQUEST SENSE commands are issued without tagged - * queueing, even on SCSI-II devices because the - * contingent allegiance condition exists for the - * entire unit. - */ - /* ++roman: ...and the standard also requires that - * REQUEST SENSE command are untagged. - */ - -#ifdef SUPPORT_TAGS - cmd_get_tag( tmp, tmp->cmnd[0] != REQUEST_SENSE ); -#endif - if (!NCR5380_select(instance, tmp, - (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : - TAG_NEXT)) { - break; - } else { - local_irq_disable(); - LIST(tmp, hostdata->issue_queue); - NEXT(tmp) = hostdata->issue_queue; - hostdata->issue_queue = tmp; -#ifdef SUPPORT_TAGS - cmd_free_tag( tmp ); -#endif - local_irq_restore(flags); - MAIN_PRINTK("scsi%d: main(): select() failed, " - "returned to issue_queue\n", HOSTNO); - if (hostdata->connected) - break; - } - } /* if target/lun/target queue is not busy */ - } /* for issue_queue */ - } /* if (!hostdata->connected) */ - - if (hostdata->connected -#ifdef REAL_DMA - && !hostdata->dma_len -#endif - ) { - local_irq_restore(flags); - MAIN_PRINTK("scsi%d: main: performing information transfer\n", - HOSTNO); - NCR5380_information_transfer(instance); - MAIN_PRINTK("scsi%d: main: done set false\n", HOSTNO); - done = 0; - } - } while (!done); - - /* Better allow ints _after_ 'main_running' has been cleared, else - an interrupt could believe we'll pick up the work it left for - us, but we won't see it anymore here... */ - main_running = 0; - local_irq_restore(flags); -} - - -#ifdef REAL_DMA -/* - * Function : void NCR5380_dma_complete (struct Scsi_Host *instance) - * - * Purpose : Called by interrupt handler when DMA finishes or a phase - * mismatch occurs (which would finish the DMA transfer). - * - * Inputs : instance - this instance of the NCR5380. - * - */ - -static void NCR5380_dma_complete( struct Scsi_Host *instance ) -{ - SETUP_HOSTDATA(instance); - int transfered, saved_data = 0, overrun = 0, cnt, toPIO; - unsigned char **data, p; - volatile int *count; - - if (!hostdata->connected) { - printk(KERN_WARNING "scsi%d: received end of DMA interrupt with " - "no connected cmd\n", HOSTNO); - return; - } - - if (mac_read_overruns) { - p = hostdata->connected->SCp.phase; - if (p & SR_IO) { - udelay(10); - if ((((NCR5380_read(BUS_AND_STATUS_REG)) & - (BASR_PHASE_MATCH|BASR_ACK)) == - (BASR_PHASE_MATCH|BASR_ACK))) { - saved_data = NCR5380_read(INPUT_DATA_REG); - overrun = 1; - DMA_PRINTK("scsi%d: read overrun handled\n", HOSTNO); - } - } - } - - DMA_PRINTK("scsi%d: real DMA transfer complete, basr 0x%X, sr 0x%X\n", - HOSTNO, NCR5380_read(BUS_AND_STATUS_REG), - NCR5380_read(STATUS_REG)); - - (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG); - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - transfered = hostdata->dma_len - NCR5380_dma_residual(instance); - hostdata->dma_len = 0; - - data = (unsigned char **) &(hostdata->connected->SCp.ptr); - count = &(hostdata->connected->SCp.this_residual); - *data += transfered; - *count -= transfered; - - if (mac_read_overruns) { - if ((NCR5380_read(STATUS_REG) & PHASE_MASK) == p && (p & SR_IO)) { - cnt = toPIO = mac_read_overruns; - if (overrun) { - DMA_PRINTK("Got an input overrun, using saved byte\n"); - *(*data)++ = saved_data; - (*count)--; - cnt--; - toPIO--; - } - DMA_PRINTK("Doing %d-byte PIO to 0x%08lx\n", cnt, (long)*data); - NCR5380_transfer_pio(instance, &p, &cnt, data); - *count -= toPIO - cnt; - } - } -} -#endif /* REAL_DMA */ - - -/* - * Function : void NCR5380_intr (int irq) - * - * Purpose : handle interrupts, reestablishing I_T_L or I_T_L_Q nexuses - * from the disconnected queue, and restarting NCR5380_main() - * as required. - * - * Inputs : int irq, irq that caused this interrupt. - * - */ - -static void NCR5380_intr (int irq, void *dev_id, struct pt_regs *regs) -{ - struct Scsi_Host *instance = first_instance; - int done = 1, handled = 0; - unsigned char basr; - - INT_PRINTK("scsi%d: NCR5380 irq triggered\n", HOSTNO); - - /* Look for pending interrupts */ - basr = NCR5380_read(BUS_AND_STATUS_REG); - INT_PRINTK("scsi%d: BASR=%02x\n", HOSTNO, basr); - /* dispatch to appropriate routine if found and done=0 */ - if (basr & BASR_IRQ) { - NCR_PRINT(NDEBUG_INTR); - if ((NCR5380_read(STATUS_REG) & (SR_SEL|SR_IO)) == (SR_SEL|SR_IO)) { - done = 0; - ENABLE_IRQ(); - INT_PRINTK("scsi%d: SEL interrupt\n", HOSTNO); - NCR5380_reselect(instance); - (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } - else if (basr & BASR_PARITY_ERROR) { - INT_PRINTK("scsi%d: PARITY interrupt\n", HOSTNO); - (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } - else if ((NCR5380_read(STATUS_REG) & SR_RST) == SR_RST) { - INT_PRINTK("scsi%d: RESET interrupt\n", HOSTNO); - (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } - else { - /* - * The rest of the interrupt conditions can occur only during a - * DMA transfer - */ - -#if defined(REAL_DMA) - /* - * We should only get PHASE MISMATCH and EOP interrupts if we have - * DMA enabled, so do a sanity check based on the current setting - * of the MODE register. - */ - - if ((NCR5380_read(MODE_REG) & MR_DMA_MODE) && - ((basr & BASR_END_DMA_TRANSFER) || - !(basr & BASR_PHASE_MATCH))) { - - INT_PRINTK("scsi%d: PHASE MISM or EOP interrupt\n", HOSTNO); - NCR5380_dma_complete( instance ); - done = 0; - ENABLE_IRQ(); - } else -#endif /* REAL_DMA */ - { -/* MS: Ignore unknown phase mismatch interrupts (caused by EOP interrupt) */ - if (basr & BASR_PHASE_MATCH) - printk(KERN_NOTICE "scsi%d: unknown interrupt, " - "BASR 0x%x, MR 0x%x, SR 0x%x\n", - HOSTNO, basr, NCR5380_read(MODE_REG), - NCR5380_read(STATUS_REG)); - (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } - } /* if !(SELECTION || PARITY) */ - handled = 1; - } /* BASR & IRQ */ - else { - printk(KERN_NOTICE "scsi%d: interrupt without IRQ bit set in BASR, " - "BASR 0x%X, MR 0x%X, SR 0x%x\n", HOSTNO, basr, - NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG)); - (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } - - if (!done) { - INT_PRINTK("scsi%d: in int routine, calling main\n", HOSTNO); - /* Put a call to NCR5380_main() on the queue... */ - queue_main(); - } - return IRQ_RETVAL(handled); -} - -#ifdef NCR5380_STATS -static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) -{ -# ifdef NCR5380_STAT_LIMIT - if (cmd->request_bufflen > NCR5380_STAT_LIMIT) -# endif - switch (cmd->cmnd[0]) - { - case WRITE: - case WRITE_6: - case WRITE_10: - hostdata->time_write[cmd->target] += (jiffies - hostdata->timebase); - /*hostdata->bytes_write[cmd->target] += cmd->request_bufflen;*/ - hostdata->pendingw--; - break; - case READ: - case READ_6: - case READ_10: - hostdata->time_read[cmd->target] += (jiffies - hostdata->timebase); - /*hostdata->bytes_read[cmd->target] += cmd->request_bufflen;*/ - hostdata->pendingr--; - break; - } -} -#endif - -/* - * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, - * int tag); - * - * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, - * including ARBITRATION, SELECTION, and initial message out for - * IDENTIFY and queue messages. - * - * Inputs : instance - instantiation of the 5380 driver on which this - * target lives, cmd - SCSI command to execute, tag - set to TAG_NEXT for - * new tag, TAG_NONE for untagged queueing, otherwise set to the tag for - * the command that is presently connected. - * - * Returns : -1 if selection could not execute for some reason, - * 0 if selection succeeded or failed because the target - * did not respond. - * - * Side effects : - * If bus busy, arbitration failed, etc, NCR5380_select() will exit - * with registers as they should have been on entry - ie - * SELECT_ENABLE will be set appropriately, the NCR5380 - * will cease to drive any SCSI bus signals. - * - * If successful : I_T_L or I_T_L_Q nexus will be established, - * instance->connected will be set to cmd. - * SELECT interrupt will be disabled. - * - * If failed (no target) : cmd->scsi_done() will be called, and the - * cmd->result host byte set to DID_BAD_TARGET. - */ - -static int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag) -{ - SETUP_HOSTDATA(instance); - unsigned char tmp[3], phase; - unsigned char *data; - int len; - unsigned long timeout; - unsigned long flags; - - hostdata->restart_select = 0; - NCR_PRINT(NDEBUG_ARBITRATION); - ARB_PRINTK("scsi%d: starting arbitration, id = %d\n", HOSTNO, - instance->this_id); - - /* - * Set the phase bits to 0, otherwise the NCR5380 won't drive the - * data bus during SELECTION. - */ - - local_irq_save(flags); - if (hostdata->connected) { - local_irq_restore(flags); - return -1; - } - NCR5380_write(TARGET_COMMAND_REG, 0); - - - /* - * Start arbitration. - */ - - NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask); - NCR5380_write(MODE_REG, MR_ARBITRATE); - - local_irq_restore(flags); - - /* Wait for arbitration logic to complete */ -#if NCR_TIMEOUT - { - unsigned long timeout = jiffies + 2*NCR_TIMEOUT; - - while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS) - && time_before(jiffies, timeout) && !hostdata->connected) - ; - if (time_after_eq(jiffies, timeout)) - { - printk("scsi : arbitration timeout at %d\n", __LINE__); - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return -1; - } - } -#else /* NCR_TIMEOUT */ - while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS) - && !hostdata->connected); -#endif - - ARB_PRINTK("scsi%d: arbitration complete\n", HOSTNO); - - if (hostdata->connected) { - NCR5380_write(MODE_REG, MR_BASE); - return -1; - } - /* - * The arbitration delay is 2.2us, but this is a minimum and there is - * no maximum so we can safely sleep for ceil(2.2) usecs to accommodate - * the integral nature of udelay(). - * - */ - - udelay(3); - - /* Check for lost arbitration */ - if ((NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) || - (NCR5380_read(CURRENT_SCSI_DATA_REG) & hostdata->id_higher_mask) || - (NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) || - hostdata->connected) { - NCR5380_write(MODE_REG, MR_BASE); - ARB_PRINTK("scsi%d: lost arbitration, deasserting MR_ARBITRATE\n", - HOSTNO); - return -1; - } - - /* after/during arbitration, BSY should be asserted. - IBM DPES-31080 Version S31Q works now */ - /* Tnx to Thomas_Roesch@m2.maus.de for finding this! (Roman) */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_SEL | - ICR_ASSERT_BSY ) ; - - if ((NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) || - hostdata->connected) { - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - ARB_PRINTK("scsi%d: lost arbitration, deasserting ICR_ASSERT_SEL\n", - HOSTNO); - return -1; - } - - /* - * Again, bus clear + bus settle time is 1.2us, however, this is - * a minimum so we'll udelay ceil(1.2) - */ - -#ifdef CONFIG_ATARI_SCSI_TOSHIBA_DELAY - /* ++roman: But some targets (see above :-) seem to need a bit more... */ - udelay(15); -#else - udelay(2); -#endif - - if (hostdata->connected) { - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - return -1; - } - - ARB_PRINTK("scsi%d: won arbitration\n", HOSTNO); - - /* - * Now that we have won arbitration, start Selection process, asserting - * the host and target ID's on the SCSI bus. - */ - - NCR5380_write(OUTPUT_DATA_REG, (hostdata->id_mask | (1 << cmd->target))); - - /* - * Raise ATN while SEL is true before BSY goes false from arbitration, - * since this is the only way to guarantee that we'll get a MESSAGE OUT - * phase immediately after selection. - */ - - NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_BSY | - ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_SEL )); - NCR5380_write(MODE_REG, MR_BASE); - - /* - * Reselect interrupts must be turned off prior to the dropping of BSY, - * otherwise we will trigger an interrupt. - */ - - if (hostdata->connected) { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - return -1; - } - - NCR5380_write(SELECT_ENABLE_REG, 0); - - /* - * The initiator shall then wait at least two deskew delays and release - * the BSY signal. - */ - udelay(1); /* wingel -- wait two bus deskew delay >2*45ns */ - - /* Reset BSY */ - NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_DATA | - ICR_ASSERT_ATN | ICR_ASSERT_SEL)); - - /* - * Something weird happens when we cease to drive BSY - looks - * like the board/chip is letting us do another read before the - * appropriate propagation delay has expired, and we're confusing - * a BSY signal from ourselves as the target's response to SELECTION. - * - * A small delay (the 'C++' frontend breaks the pipeline with an - * unnecessary jump, making it work on my 386-33/Trantor T128, the - * tighter 'C' code breaks and requires this) solves the problem - - * the 1 us delay is arbitrary, and only used because this delay will - * be the same on other platforms and since it works here, it should - * work there. - * - * wingel suggests that this could be due to failing to wait - * one deskew delay. - */ - - udelay(1); - - SEL_PRINTK("scsi%d: selecting target %d\n", HOSTNO, cmd->target); - - /* - * The SCSI specification calls for a 250 ms timeout for the actual - * selection. - */ - - timeout = jiffies + 25; - - /* - * XXX very interesting - we're seeing a bounce where the BSY we - * asserted is being reflected / still asserted (propagation delay?) - * and it's detecting as true. Sigh. - */ - -#if 0 - /* ++roman: If a target conformed to the SCSI standard, it wouldn't assert - * IO while SEL is true. But again, there are some disks out the in the - * world that do that nevertheless. (Somebody claimed that this announces - * reselection capability of the target.) So we better skip that test and - * only wait for BSY... (Famous german words: Der Klügere gibt nach :-) - */ - - while (time_before(jiffies, timeout) && !(NCR5380_read(STATUS_REG) & - (SR_BSY | SR_IO))); - - if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) == - (SR_SEL | SR_IO)) { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - NCR5380_reselect(instance); - printk (KERN_ERR "scsi%d: reselection after won arbitration?\n", - HOSTNO); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return -1; - } -#else - while (time_before(jiffies, timeout) && !(NCR5380_read(STATUS_REG) & SR_BSY)); -#endif - - /* - * No less than two deskew delays after the initiator detects the - * BSY signal is true, it shall release the SEL signal and may - * change the DATA BUS. -wingel - */ - - udelay(1); - - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN); - - if (!(NCR5380_read(STATUS_REG) & SR_BSY)) { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - if (hostdata->targets_present & (1 << cmd->target)) { - printk(KERN_ERR "scsi%d: weirdness\n", HOSTNO); - if (hostdata->restart_select) - printk(KERN_NOTICE "\trestart select\n"); - NCR_PRINT(NDEBUG_ANY); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return -1; - } - cmd->result = DID_BAD_TARGET << 16; -#ifdef NCR5380_STATS - collect_stats(hostdata, cmd); -#endif -#ifdef SUPPORT_TAGS - cmd_free_tag( cmd ); -#endif - cmd->scsi_done(cmd); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - SEL_PRINTK("scsi%d: target did not respond within 250ms\n", HOSTNO); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return 0; - } - - hostdata->targets_present |= (1 << cmd->target); - - /* - * Since we followed the SCSI spec, and raised ATN while SEL - * was true but before BSY was false during selection, the information - * transfer phase should be a MESSAGE OUT phase so that we can send the - * IDENTIFY message. - * - * If SCSI-II tagged queuing is enabled, we also send a SIMPLE_QUEUE_TAG - * message (2 bytes) with a tag ID that we increment with every command - * until it wraps back to 0. - * - * XXX - it turns out that there are some broken SCSI-II devices, - * which claim to support tagged queuing but fail when more than - * some number of commands are issued at once. - */ - - /* Wait for start of REQ/ACK handshake */ - while (!(NCR5380_read(STATUS_REG) & SR_REQ)); - - SEL_PRINTK("scsi%d: target %d selected, going into MESSAGE OUT phase.\n", - HOSTNO, cmd->target); - tmp[0] = IDENTIFY(1, cmd->lun); - -#ifdef SUPPORT_TAGS - if (cmd->tag != TAG_NONE) { - tmp[1] = hostdata->last_message = SIMPLE_QUEUE_TAG; - tmp[2] = cmd->tag; - len = 3; - } else - len = 1; -#else - len = 1; - cmd->tag=0; -#endif /* SUPPORT_TAGS */ - - /* Send message(s) */ - data = tmp; - phase = PHASE_MSGOUT; - NCR5380_transfer_pio(instance, &phase, &len, &data); - SEL_PRINTK("scsi%d: nexus established.\n", HOSTNO); - /* XXX need to handle errors here */ - hostdata->connected = cmd; -#ifndef SUPPORT_TAGS - hostdata->busy[cmd->target] |= (1 << cmd->lun); -#endif - - initialize_SCp(cmd); - - - return 0; -} - -/* - * Function : int NCR5380_transfer_pio (struct Scsi_Host *instance, - * unsigned char *phase, int *count, unsigned char **data) - * - * Purpose : transfers data in given phase using polled I/O - * - * Inputs : instance - instance of driver, *phase - pointer to - * what phase is expected, *count - pointer to number of - * bytes to transfer, **data - pointer to data pointer. - * - * Returns : -1 when different phase is entered without transferring - * maximum number of bytes, 0 if all bytes are transfered or exit - * is in same phase. - * - * Also, *phase, *count, *data are modified in place. - * - * XXX Note : handling for bus free may be useful. - */ - -/* - * Note : this code is not as quick as it could be, however it - * IS 100% reliable, and for the actual data transfer where speed - * counts, we will always do a pseudo DMA or DMA transfer. - */ - -static int NCR5380_transfer_pio( struct Scsi_Host *instance, - unsigned char *phase, int *count, - unsigned char **data) -{ - register unsigned char p = *phase, tmp; - register int c = *count; - register unsigned char *d = *data; - - /* - * The NCR5380 chip will only drive the SCSI bus when the - * phase specified in the appropriate bits of the TARGET COMMAND - * REGISTER match the STATUS REGISTER - */ - - NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p)); - - do { - /* - * Wait for assertion of REQ, after which the phase bits will be - * valid - */ - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ)); - - HSH_PRINTK("scsi%d: REQ detected\n", HOSTNO); - - /* Check for phase mismatch */ - if ((tmp & PHASE_MASK) != p) { - PIO_PRINTK("scsi%d: phase mismatch\n", HOSTNO); - NCR_PRINT_PHASE(NDEBUG_PIO); - break; - } - - /* Do actual transfer from SCSI bus to / from memory */ - if (!(p & SR_IO)) - NCR5380_write(OUTPUT_DATA_REG, *d); - else - *d = NCR5380_read(CURRENT_SCSI_DATA_REG); - - ++d; - - /* - * The SCSI standard suggests that in MSGOUT phase, the initiator - * should drop ATN on the last byte of the message phase - * after REQ has been asserted for the handshake but before - * the initiator raises ACK. - */ - - if (!(p & SR_IO)) { - if (!((p & SR_MSG) && c > 1)) { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_DATA); - NCR_PRINT(NDEBUG_PIO); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_DATA | ICR_ASSERT_ACK); - } else { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_DATA | ICR_ASSERT_ATN); - NCR_PRINT(NDEBUG_PIO); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_ACK); - } - } else { - NCR_PRINT(NDEBUG_PIO); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK); - } - - while (NCR5380_read(STATUS_REG) & SR_REQ); - - HSH_PRINTK("scsi%d: req false, handshake complete\n", HOSTNO); - -/* - * We have several special cases to consider during REQ/ACK handshaking : - * 1. We were in MSGOUT phase, and we are on the last byte of the - * message. ATN must be dropped as ACK is dropped. - * - * 2. We are in a MSGIN phase, and we are on the last byte of the - * message. We must exit with ACK asserted, so that the calling - * code may raise ATN before dropping ACK to reject the message. - * - * 3. ACK and ATN are clear and the target may proceed as normal. - */ - if (!(p == PHASE_MSGIN && c == 1)) { - if (p == PHASE_MSGOUT && c > 1) - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN); - else - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - } - } while (--c); - - PIO_PRINTK("scsi%d: residual %d\n", HOSTNO, c); - - *count = c; - *data = d; - tmp = NCR5380_read(STATUS_REG); - /* The phase read from the bus is valid if either REQ is (already) - * asserted or if ACK hasn't been released yet. The latter is the case if - * we're in MSGIN and all wanted bytes have been received. */ - if ((tmp & SR_REQ) || (p == PHASE_MSGIN && c == 0)) - *phase = tmp & PHASE_MASK; - else - *phase = PHASE_UNKNOWN; - - if (!c || (*phase == p)) - return 0; - else - return -1; -} - -/* - * Function : do_abort (Scsi_Host *host) - * - * Purpose : abort the currently established nexus. Should only be - * called from a routine which can drop into a - * - * Returns : 0 on success, -1 on failure. - */ - -static int do_abort (struct Scsi_Host *host) -{ - unsigned char tmp, *msgptr, phase; - int len; - - /* Request message out phase */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN); - - /* - * Wait for the target to indicate a valid phase by asserting - * REQ. Once this happens, we'll have either a MSGOUT phase - * and can immediately send the ABORT message, or we'll have some - * other phase and will have to source/sink data. - * - * We really don't care what value was on the bus or what value - * the target sees, so we just handshake. - */ - - while (!(tmp = NCR5380_read(STATUS_REG)) & SR_REQ); - - NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp)); - - if ((tmp & PHASE_MASK) != PHASE_MSGOUT) { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN | - ICR_ASSERT_ACK); - while (NCR5380_read(STATUS_REG) & SR_REQ); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN); - } - - tmp = ABORT; - msgptr = &tmp; - len = 1; - phase = PHASE_MSGOUT; - NCR5380_transfer_pio (host, &phase, &len, &msgptr); - - /* - * If we got here, and the command completed successfully, - * we're about to go into bus free state. - */ - - return len ? -1 : 0; -} - -#if defined(REAL_DMA) || defined(PSEUDO_DMA) -/* - * Function : int NCR5380_transfer_dma (struct Scsi_Host *instance, - * unsigned char *phase, int *count, unsigned char **data) - * - * Purpose : transfers data in given phase using either real - * or pseudo DMA. - * - * Inputs : instance - instance of driver, *phase - pointer to - * what phase is expected, *count - pointer to number of - * bytes to transfer, **data - pointer to data pointer. - * - * Returns : -1 when different phase is entered without transferring - * maximum number of bytes, 0 if all bytes or transfered or exit - * is in same phase. - * - * Also, *phase, *count, *data are modified in place. - * - */ - - -static int NCR5380_transfer_dma( struct Scsi_Host *instance, - unsigned char *phase, int *count, - unsigned char **data) -{ - SETUP_HOSTDATA(instance); - register int c = *count; - register unsigned char p = *phase; - register unsigned char *d = *data; - register int foo; - unsigned char tmp; - unsigned long flags; - - - if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) { - *phase = tmp; - return -1; - } - - if (mac_read_overruns && (p & SR_IO)) { - c -= mac_read_overruns; - } - - DMA_PRINTK("scsi%d: initializing DMA for %s, %d bytes %s %p\n", - HOSTNO, (p & SR_IO) ? "reading" : "writing", - c, (p & SR_IO) ? "to" : "from", d); - - NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p)); - -#ifdef REAL_DMA - NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_ENABLE_EOP_INTR | MR_MONITOR_BSY); -#else /* PSEUDO_DMA! */ -#if defined(PSEUDO_DMA) && !defined(UNSAFE) - local_irq_save(flags); -#endif - /* KLL May need eop and parity in 53c400 */ - if (hostdata->flags & FLAG_NCR53C400) - NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_ENABLE_PAR_CHECK - | MR_ENABLE_PAR_INTR | MR_ENABLE_EOP_INTR | MR_DMA_MODE - | MR_MONITOR_BSY); - else -#ifndef EMULATE_PSEUDO_DMA - NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE); -#else - NCR5380_write(MODE_REG, MR_BASE); -#endif -#endif /* def REAL_DMA */ - -#ifdef REAL_DMA - /* On the Medusa, it is a must to initialize the DMA before - * starting the NCR. This is also the cleaner way for the TT. - */ - local_irq_save(flags); - hostdata->dma_len = (p & SR_IO) ? - NCR5380_dma_read_setup(instance, d, c) : - NCR5380_dma_write_setup(instance, d, c); - local_irq_restore(flags); -#endif /* def REAL_DMA */ - -#ifndef EMULATE_PSEUDO_DMA - if (p & SR_IO) - NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0); - else { - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA); - NCR5380_write(START_DMA_SEND_REG, 0); - } -#else - hostdata->dma_len = c; -#endif - -#if defined(REAL_DMA) - return 0; -#else /* defined(PSEUDO_DMA) */ - if (p & SR_IO) { -#ifdef DMA_WORKS_RIGHT - foo = NCR5380_pread(instance, d, c); -#else - int diff = 1; - if (hostdata->flags & FLAG_NCR53C400) { - diff=0; - } - - if (!(foo = NCR5380_pread(instance, d, c - diff))) { - /* - * We can't disable DMA mode after successfully transferring - * what we plan to be the last byte, since that would open up - * a race condition where if the target asserted REQ before - * we got the DMA mode reset, the NCR5380 would have latched - * an additional byte into the INPUT DATA register and we'd - * have dropped it. - * - * The workaround was to transfer one fewer bytes than we - * intended to with the pseudo-DMA read function, wait for - * the chip to latch the last byte, read it, and then disable - * pseudo-DMA mode. - * - * After REQ is asserted, the NCR5380 asserts DRQ and ACK. - * REQ is deasserted when ACK is asserted, and not reasserted - * until ACK goes false. Since the NCR5380 won't lower ACK - * until DACK is asserted, which won't happen unless we twiddle - * the DMA port or we take the NCR5380 out of DMA mode, we - * can guarantee that we won't handshake another extra - * byte. - */ - - if (!(hostdata->flags & FLAG_NCR53C400)) { - while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ)); - /* Wait for clean handshake */ - while (NCR5380_read(STATUS_REG) & SR_REQ); - d[c - 1] = NCR5380_read(INPUT_DATA_REG); - } - } -#endif - } else { -#ifdef DMA_WORKS_RIGHT - foo = NCR5380_pwrite(instance, d, c); -#else - int timeout; -#if (NDEBUG & NDEBUG_C400_PWRITE) - printk("About to pwrite %d bytes\n", c); -#endif - if (!(foo = NCR5380_pwrite(instance, d, c))) { - /* - * Wait for the last byte to be sent. If REQ is being asserted for - * the byte we're interested, we'll ACK it and it will go false. - */ - if (!(hostdata->flags & FLAG_HAS_LAST_BYTE_SENT)) { - timeout = 20000; -#if 1 -#if 1 - while (!(NCR5380_read(BUS_AND_STATUS_REG) & - BASR_DRQ) && (NCR5380_read(BUS_AND_STATUS_REG) & - BASR_PHASE_MATCH)); -#else - if (NCR5380_read(STATUS_REG) & SR_REQ) { - for (; timeout && - !(NCR5380_read(BUS_AND_STATUS_REG) & BASR_ACK); - --timeout); - for (; timeout && (NCR5380_read(STATUS_REG) & SR_REQ); - --timeout); - } -#endif - - -#if (NDEBUG & NDEBUG_LAST_BYTE_SENT) - if (!timeout) - printk("scsi%d : timed out on last byte\n", - instance->host_no); -#endif - - - if (hostdata->flags & FLAG_CHECK_LAST_BYTE_SENT) { - hostdata->flags &= ~FLAG_CHECK_LAST_BYTE_SENT; - if (NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT) { - hostdata->flags |= FLAG_HAS_LAST_BYTE_SENT; -#if (NDEBUG & NDEBUG_LAST_BYTE_SENT) - printk("scsi%d : last bit sent works\n", - instance->host_no); -#endif - } - } - } else { -#if (NDEBUG & NDEBUG_C400_PWRITE) - printk("Waiting for LASTBYTE\n"); -#endif - while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT)); -#if (NDEBUG & NDEBUG_C400_PWRITE) - printk("Got LASTBYTE\n"); -#endif - } -#else - udelay (5); -#endif - } -#endif - } - - NCR5380_write(MODE_REG, MR_BASE); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - if ((!(p & SR_IO)) && (hostdata->flags & FLAG_NCR53C400)) { -#if (NDEBUG & NDEBUG_C400_PWRITE) - printk("53C400w: Checking for IRQ\n"); -#endif - if (NCR5380_read(BUS_AND_STATUS_REG) & BASR_IRQ) { -#if (NDEBUG & NDEBUG_C400_PWRITE) - printk("53C400w: got it, reading reset interrupt reg\n"); -#endif - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - } else { - printk("53C400w: IRQ NOT THERE!\n"); - } - } - - *data = d + c; - *count = 0; - *phase = NCR5380_read(STATUS_REG) & PHASE_MASK; -#if 0 - NCR5380_print_phase(instance); -#endif -#if defined(PSEUDO_DMA) && !defined(UNSAFE) - local_irq_restore(flags); -#endif /* defined(REAL_DMA_POLL) */ - return foo; -#endif /* def REAL_DMA */ -} -#endif /* defined(REAL_DMA) || defined(PSEUDO_DMA) */ - - -/* - * Function : NCR5380_information_transfer (struct Scsi_Host *instance) - * - * Purpose : run through the various SCSI phases and do as the target - * directs us to. Operates on the currently connected command, - * instance->connected. - * - * Inputs : instance, instance for which we are doing commands - * - * Side effects : SCSI things happen, the disconnected queue will be - * modified if a command disconnects, *instance->connected will - * change. - * - * XXX Note : we need to watch for bus free or a reset condition here - * to recover from an unexpected bus free condition. - */ - -static void NCR5380_information_transfer (struct Scsi_Host *instance) -{ - SETUP_HOSTDATA(instance); - unsigned long flags; - unsigned char msgout = NOP; - int sink = 0; - int len; -#if defined(PSEUDO_DMA) || defined(REAL_DMA_POLL) - int transfersize; -#endif - unsigned char *data; - unsigned char phase, tmp, extended_msg[10], old_phase=0xff; - Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected; - - while (1) { - tmp = NCR5380_read(STATUS_REG); - /* We only have a valid SCSI phase when REQ is asserted */ - if (tmp & SR_REQ) { - phase = (tmp & PHASE_MASK); - if (phase != old_phase) { - old_phase = phase; - NCR_PRINT_PHASE(NDEBUG_INFORMATION); - } - - if (sink && (phase != PHASE_MSGOUT)) { - NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp)); - - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN | - ICR_ASSERT_ACK); - while (NCR5380_read(STATUS_REG) & SR_REQ); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_ATN); - sink = 0; - continue; - } - - switch (phase) { - case PHASE_DATAOUT: -#if (NDEBUG & NDEBUG_NO_DATAOUT) - printk("scsi%d: NDEBUG_NO_DATAOUT set, attempted DATAOUT " - "aborted\n", HOSTNO); - sink = 1; - do_abort(instance); - cmd->result = DID_ERROR << 16; - cmd->done(cmd); - return; -#endif - case PHASE_DATAIN: - /* - * If there is no room left in the current buffer in the - * scatter-gather list, move onto the next one. - */ - - if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) { - ++cmd->SCp.buffer; - --cmd->SCp.buffers_residual; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - cmd->SCp.ptr = cmd->SCp.buffer->address; - /* ++roman: Try to merge some scatter-buffers if - * they are at contiguous physical addresses. - */ - merge_contiguous_buffers( cmd ); - INF_PRINTK("scsi%d: %d bytes and %d buffers left\n", - HOSTNO, cmd->SCp.this_residual, - cmd->SCp.buffers_residual); - } - - /* - * The preferred transfer method is going to be - * PSEUDO-DMA for systems that are strictly PIO, - * since we can let the hardware do the handshaking. - * - * For this to work, we need to know the transfersize - * ahead of time, since the pseudo-DMA code will sit - * in an unconditional loop. - */ - -/* ++roman: I suggest, this should be - * #if def(REAL_DMA) - * instead of leaving REAL_DMA out. - */ - -#if defined(REAL_DMA) || defined(PSEUDO_DMA) - if (!cmd->device->borken && - !(hostdata->flags & FLAG_NO_PSEUDO_DMA) && - (transfersize = NCR5380_dma_xfer_len(instance,cmd,phase)) > 31) { - - len = transfersize; - cmd->SCp.phase = phase; - if (NCR5380_transfer_dma(instance, &phase, - &len, (unsigned char **) &cmd->SCp.ptr)) { - /* - * If the watchdog timer fires, all future - * accesses to this device will use the - * polled-IO. */ - printk(KERN_NOTICE "scsi%d: switching target %d " - "lun %d to slow handshake\n", HOSTNO, - cmd->target, cmd->lun); - cmd->device->borken = 1; - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_ATN); - sink = 1; - do_abort(instance); - cmd->result = DID_ERROR << 16; - cmd->done(cmd); - /* XXX - need to source or sink data here, as appropriate */ - } else { -#ifdef REAL_DMA - /* ++roman: When using real DMA, - * information_transfer() should return after - * starting DMA since it has nothing more to - * do. - */ - return; -#else - /* Michael: When using pseudo-DMA emulation, we must - * take care to take into account the residual from - * the current transfer as determined by either the - * interrupt routine ot the pseudo-transfer functions - * (whichever notices it first). - */ - if (mac_pdma_residual) - len -= mac_pdma_residual; - cmd->SCp.this_residual -= transfersize - len; -#endif - } - } else -#endif /* defined(REAL_DMA) || defined(PSEUDO_DMA) */ - NCR5380_transfer_pio(instance, &phase, - (int *) &cmd->SCp.this_residual, (unsigned char **) - &cmd->SCp.ptr); - break; - case PHASE_MSGIN: - len = 1; - data = &tmp; - NCR5380_write(SELECT_ENABLE_REG, 0); /* disable reselects */ - NCR5380_transfer_pio(instance, &phase, &len, &data); - cmd->SCp.Message = tmp; - - switch (tmp) { - /* - * Linking lets us reduce the time required to get the - * next command out to the device, hopefully this will - * mean we don't waste another revolution due to the delays - * required by ARBITRATION and another SELECTION. - * - * In the current implementation proposal, low level drivers - * merely have to start the next command, pointed to by - * next_link, done() is called as with unlinked commands. - */ -#ifdef LINKED - case LINKED_CMD_COMPLETE: - case LINKED_FLG_CMD_COMPLETE: - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - LNK_PRINTK("scsi%d: target %d lun %d linked command " - "complete.\n", HOSTNO, cmd->target, cmd->lun); - - /* Enable reselect interrupts */ - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - /* - * Sanity check : A linked command should only terminate - * with one of these messages if there are more linked - * commands available. - */ - - if (!cmd->next_link) { - printk(KERN_NOTICE "scsi%d: target %d lun %d " - "linked command complete, no next_link\n", - HOSTNO, cmd->target, cmd->lun); - sink = 1; - do_abort (instance); - return; - } - - initialize_SCp(cmd->next_link); - /* The next command is still part of this process; copy it - * and don't free it! */ - cmd->next_link->tag = cmd->tag; - cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8); - LNK_PRINTK("scsi%d: target %d lun %d linked request " - "done, calling scsi_done().\n", - HOSTNO, cmd->target, cmd->lun); -#ifdef NCR5380_STATS - collect_stats(hostdata, cmd); -#endif - cmd->scsi_done(cmd); - cmd = hostdata->connected; - break; -#endif /* def LINKED */ - case ABORT: - case COMMAND_COMPLETE: - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - hostdata->connected = NULL; - QU_PRINTK("scsi%d: command for target %d, lun %d " - "completed\n", HOSTNO, cmd->target, cmd->lun); -#ifdef SUPPORT_TAGS - cmd_free_tag( cmd ); - if (status_byte(cmd->SCp.Status) == QUEUE_FULL) { - /* Turn a QUEUE FULL status into BUSY, I think the - * mid level cannot handle QUEUE FULL :-( (The - * command is retried after BUSY). Also update our - * queue size to the number of currently issued - * commands now. - */ - /* ++Andreas: the mid level code knows about - QUEUE_FULL now. */ - TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun]; - TAG_PRINTK("scsi%d: target %d lun %d returned " - "QUEUE_FULL after %d commands\n", - HOSTNO, cmd->target, cmd->lun, - ta->nr_allocated); - if (ta->queue_size > ta->nr_allocated) - ta->nr_allocated = ta->queue_size; - } -#else - hostdata->busy[cmd->target] &= ~(1 << cmd->lun); -#endif - /* Enable reselect interrupts */ - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - - /* - * I'm not sure what the correct thing to do here is : - * - * If the command that just executed is NOT a request - * sense, the obvious thing to do is to set the result - * code to the values of the stored parameters. - * - * If it was a REQUEST SENSE command, we need some way to - * differentiate between the failure code of the original - * and the failure code of the REQUEST sense - the obvious - * case is success, where we fall through and leave the - * result code unchanged. - * - * The non-obvious place is where the REQUEST SENSE failed - */ - - if (cmd->cmnd[0] != REQUEST_SENSE) - cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8); - else if (status_byte(cmd->SCp.Status) != GOOD) - cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16); - -#ifdef AUTOSENSE - if ((cmd->cmnd[0] != REQUEST_SENSE) && - (status_byte(cmd->SCp.Status) == CHECK_CONDITION)) { - ASEN_PRINTK("scsi%d: performing request sense\n", - HOSTNO); - cmd->cmnd[0] = REQUEST_SENSE; - cmd->cmnd[1] &= 0xe0; - cmd->cmnd[2] = 0; - cmd->cmnd[3] = 0; - cmd->cmnd[4] = sizeof(cmd->sense_buffer); - cmd->cmnd[5] = 0; - cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]); - - cmd->use_sg = 0; - /* this is initialized from initialize_SCp - cmd->SCp.buffer = NULL; - cmd->SCp.buffers_residual = 0; - */ - cmd->request_buffer = (char *) cmd->sense_buffer; - cmd->request_bufflen = sizeof(cmd->sense_buffer); - - local_irq_save(flags); - LIST(cmd,hostdata->issue_queue); - NEXT(cmd) = hostdata->issue_queue; - hostdata->issue_queue = (Scsi_Cmnd *) cmd; - local_irq_restore(flags); - QU_PRINTK("scsi%d: REQUEST SENSE added to head of " - "issue queue\n", H_NO(cmd)); - } else -#endif /* def AUTOSENSE */ - { -#ifdef NCR5380_STATS - collect_stats(hostdata, cmd); -#endif - cmd->scsi_done(cmd); - } - - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - /* - * Restore phase bits to 0 so an interrupted selection, - * arbitration can resume. - */ - NCR5380_write(TARGET_COMMAND_REG, 0); - - while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected) - barrier(); - - return; - case MESSAGE_REJECT: - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - /* Enable reselect interrupts */ - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - switch (hostdata->last_message) { - case HEAD_OF_QUEUE_TAG: - case ORDERED_QUEUE_TAG: - case SIMPLE_QUEUE_TAG: - /* The target obviously doesn't support tagged - * queuing, even though it announced this ability in - * its INQUIRY data ?!? (maybe only this LUN?) Ok, - * clear 'tagged_supported' and lock the LUN, since - * the command is treated as untagged further on. - */ - cmd->device->tagged_supported = 0; - hostdata->busy[cmd->target] |= (1 << cmd->lun); - cmd->tag = TAG_NONE; - TAG_PRINTK("scsi%d: target %d lun %d rejected " - "QUEUE_TAG message; tagged queuing " - "disabled\n", - HOSTNO, cmd->target, cmd->lun); - break; - } - break; - case DISCONNECT: - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - local_irq_save(flags); - cmd->device->disconnect = 1; - LIST(cmd,hostdata->disconnected_queue); - NEXT(cmd) = hostdata->disconnected_queue; - hostdata->connected = NULL; - hostdata->disconnected_queue = cmd; - local_irq_restore(flags); - QU_PRINTK("scsi%d: command for target %d lun %d was " - "moved from connected to the " - "disconnected_queue\n", HOSTNO, - cmd->target, cmd->lun); - /* - * Restore phase bits to 0 so an interrupted selection, - * arbitration can resume. - */ - NCR5380_write(TARGET_COMMAND_REG, 0); - - /* Enable reselect interrupts */ - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - /* Wait for bus free to avoid nasty timeouts */ - while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected) - barrier(); - return; - /* - * The SCSI data pointer is *IMPLICITLY* saved on a disconnect - * operation, in violation of the SCSI spec so we can safely - * ignore SAVE/RESTORE pointers calls. - * - * Unfortunately, some disks violate the SCSI spec and - * don't issue the required SAVE_POINTERS message before - * disconnecting, and we have to break spec to remain - * compatible. - */ - case SAVE_POINTERS: - case RESTORE_POINTERS: - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - /* Enable reselect interrupts */ - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - break; - case EXTENDED_MESSAGE: -/* - * Extended messages are sent in the following format : - * Byte - * 0 EXTENDED_MESSAGE == 1 - * 1 length (includes one byte for code, doesn't - * include first two bytes) - * 2 code - * 3..length+1 arguments - * - * Start the extended message buffer with the EXTENDED_MESSAGE - * byte, since print_msg() wants the whole thing. - */ - extended_msg[0] = EXTENDED_MESSAGE; - /* Accept first byte by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - EXT_PRINTK("scsi%d: receiving extended message\n", HOSTNO); - - len = 2; - data = extended_msg + 1; - phase = PHASE_MSGIN; - NCR5380_transfer_pio(instance, &phase, &len, &data); - EXT_PRINTK("scsi%d: length=%d, code=0x%02x\n", HOSTNO, - (int)extended_msg[1], (int)extended_msg[2]); - - if (!len && extended_msg[1] <= - (sizeof (extended_msg) - 1)) { - /* Accept third byte by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - len = extended_msg[1] - 1; - data = extended_msg + 3; - phase = PHASE_MSGIN; - - NCR5380_transfer_pio(instance, &phase, &len, &data); - EXT_PRINTK("scsi%d: message received, residual %d\n", - HOSTNO, len); - - switch (extended_msg[2]) { - case EXTENDED_SDTR: - case EXTENDED_WDTR: - case EXTENDED_MODIFY_DATA_POINTER: - case EXTENDED_EXTENDED_IDENTIFY: - tmp = 0; - } - } else if (len) { - printk(KERN_NOTICE "scsi%d: error receiving " - "extended message\n", HOSTNO); - tmp = 0; - } else { - printk(KERN_NOTICE "scsi%d: extended message " - "code %02x length %d is too long\n", - HOSTNO, extended_msg[2], extended_msg[1]); - tmp = 0; - } - /* Fall through to reject message */ - - /* - * If we get something weird that we aren't expecting, - * reject it. - */ - default: - if (!tmp) { - printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO); - print_msg (extended_msg); - printk("\n"); - } else if (tmp != EXTENDED_MESSAGE) - printk(KERN_DEBUG "scsi%d: rejecting unknown " - "message %02x from target %d, lun %d\n", - HOSTNO, tmp, cmd->target, cmd->lun); - else - printk(KERN_DEBUG "scsi%d: rejecting unknown " - "extended message " - "code %02x, length %d from target %d, lun %d\n", - HOSTNO, extended_msg[1], extended_msg[0], - cmd->target, cmd->lun); - - - msgout = MESSAGE_REJECT; - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | - ICR_ASSERT_ATN); - break; - } /* switch (tmp) */ - break; - case PHASE_MSGOUT: - len = 1; - data = &msgout; - hostdata->last_message = msgout; - NCR5380_transfer_pio(instance, &phase, &len, &data); - if (msgout == ABORT) { -#ifdef SUPPORT_TAGS - cmd_free_tag( cmd ); -#else - hostdata->busy[cmd->target] &= ~(1 << cmd->lun); -#endif - hostdata->connected = NULL; - cmd->result = DID_ERROR << 16; -#ifdef NCR5380_STATS - collect_stats(hostdata, cmd); -#endif - cmd->scsi_done(cmd); - NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return; - } - msgout = NOP; - break; - case PHASE_CMDOUT: - len = cmd->cmd_len; - data = cmd->cmnd; - /* - * XXX for performance reasons, on machines with a - * PSEUDO-DMA architecture we should probably - * use the dma transfer function. - */ - NCR5380_transfer_pio(instance, &phase, &len, - &data); - break; - case PHASE_STATIN: - len = 1; - data = &tmp; - NCR5380_transfer_pio(instance, &phase, &len, &data); - cmd->SCp.Status = tmp; - break; - default: - printk("scsi%d: unknown phase\n", HOSTNO); - NCR_PRINT(NDEBUG_ANY); - } /* switch(phase) */ - } /* if (tmp * SR_REQ) */ - } /* while (1) */ -} - -/* - * Function : void NCR5380_reselect (struct Scsi_Host *instance) - * - * Purpose : does reselection, initializing the instance->connected - * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q - * nexus has been reestablished, - * - * Inputs : instance - this instance of the NCR5380. - * - */ - - -static void NCR5380_reselect (struct Scsi_Host *instance) -{ - SETUP_HOSTDATA(instance); - unsigned char target_mask; - unsigned char lun, phase; - int len; -#ifdef SUPPORT_TAGS - unsigned char tag; -#endif - unsigned char msg[3]; - unsigned char *data; - Scsi_Cmnd *tmp = NULL, *prev; -/* unsigned long flags; */ - - /* - * Disable arbitration, etc. since the host adapter obviously - * lost, and tell an interrupted NCR5380_select() to restart. - */ - - NCR5380_write(MODE_REG, MR_BASE); - hostdata->restart_select = 1; - - target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask); - - RSL_PRINTK("scsi%d: reselect\n", HOSTNO); - - /* - * At this point, we have detected that our SCSI ID is on the bus, - * SEL is true and BSY was false for at least one bus settle delay - * (400 ns). - * - * We must assert BSY ourselves, until the target drops the SEL - * signal. - */ - - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_BSY); - - while (NCR5380_read(STATUS_REG) & SR_SEL); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - /* - * Wait for target to go into MSGIN. - */ - - while (!(NCR5380_read(STATUS_REG) & SR_REQ)); - - len = 1; - data = msg; - phase = PHASE_MSGIN; - NCR5380_transfer_pio(instance, &phase, &len, &data); - - if (!(msg[0] & 0x80)) { - printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO); - print_msg(msg); - do_abort(instance); - return; - } - lun = (msg[0] & 0x07); - -#ifdef SUPPORT_TAGS - /* If the phase is still MSGIN, the target wants to send some more - * messages. In case it supports tagged queuing, this is probably a - * SIMPLE_QUEUE_TAG for the I_T_L_Q nexus. - */ - tag = TAG_NONE; - if (phase == PHASE_MSGIN && setup_use_tagged_queuing) { - /* Accept previous IDENTIFY message by clearing ACK */ - NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE ); - len = 2; - data = msg+1; - if (!NCR5380_transfer_pio(instance, &phase, &len, &data) && - msg[1] == SIMPLE_QUEUE_TAG) - tag = msg[2]; - TAG_PRINTK("scsi%d: target mask %02x, lun %d sent tag %d at " - "reselection\n", HOSTNO, target_mask, lun, tag); - } -#endif - - /* - * Find the command corresponding to the I_T_L or I_T_L_Q nexus we - * just reestablished, and remove it from the disconnected queue. - */ - - for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; - tmp; prev = tmp, tmp = NEXT(tmp) ) { - if ((target_mask == (1 << tmp->target)) && (lun == tmp->lun) -#ifdef SUPPORT_TAGS - && (tag == tmp->tag) -#endif - ) { - if (prev) { - REMOVE(prev, NEXT(prev), tmp, NEXT(tmp)); - NEXT(prev) = NEXT(tmp); - } else { - REMOVE(-1, hostdata->disconnected_queue, tmp, NEXT(tmp)); - hostdata->disconnected_queue = NEXT(tmp); - } - NEXT(tmp) = NULL; - break; - } - } - - if (!tmp) { - printk(KERN_WARNING "scsi%d: warning: target bitmask %02x lun %d " -#ifdef SUPPORT_TAGS - "tag %d " -#endif - "not in disconnect_queue.\n", - HOSTNO, target_mask, lun -#ifdef SUPPORT_TAGS - , tag -#endif - ); - /* - * Since we have an established nexus that we can't do anything - * with, we must abort it. - */ - do_abort(instance); - return; - } - - /* Accept message by clearing ACK */ - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - - hostdata->connected = tmp; - RSL_PRINTK("scsi%d: nexus established, target = %d, lun = %d, tag = %d\n", - HOSTNO, tmp->target, tmp->lun, tmp->tag); -} - - -/* - * Function : int NCR5380_abort (Scsi_Cmnd *cmd) - * - * Purpose : abort a command - * - * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the - * host byte of the result field to, if zero DID_ABORTED is - * used. - * - * Returns : 0 - success, -1 on failure. - * - * XXX - there is no way to abort the command that is currently - * connected, you have to wait for it to complete. If this is - * a problem, we could implement longjmp() / setjmp(), setjmp() - * called where the loop started in NCR5380_main(). - */ - -int NCR5380_abort (Scsi_Cmnd *cmd) -{ - struct Scsi_Host *instance = cmd->host; - SETUP_HOSTDATA(instance); - Scsi_Cmnd *tmp, **prev; - unsigned long flags; - - printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO); - print_Scsi_Cmnd (cmd); - - NCR5380_print_status (instance); - - local_irq_save(flags); - - ABRT_PRINTK("scsi%d: abort called basr 0x%02x, sr 0x%02x\n", HOSTNO, - NCR5380_read(BUS_AND_STATUS_REG), - NCR5380_read(STATUS_REG)); - -#if 1 -/* - * Case 1 : If the command is the currently executing command, - * we'll set the aborted flag and return control so that - * information transfer routine can exit cleanly. - */ - - if (hostdata->connected == cmd) { - - ABRT_PRINTK("scsi%d: aborting connected command\n", HOSTNO); -/* - * We should perform BSY checking, and make sure we haven't slipped - * into BUS FREE. - */ - -/* NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN); */ -/* - * Since we can't change phases until we've completed the current - * handshake, we have to source or sink a byte of data if the current - * phase is not MSGOUT. - */ - -/* - * Return control to the executing NCR drive so we can clear the - * aborted flag and get back into our main loop. - */ - - if (do_abort(instance) == 0) { - hostdata->aborted = 1; - hostdata->connected = NULL; - cmd->result = DID_ABORT << 16; -#ifdef SUPPORT_TAGS - cmd_free_tag( cmd ); -#else - hostdata->busy[cmd->target] &= ~(1 << cmd->lun); -#endif - local_irq_restore(flags); - cmd->scsi_done(cmd); - return SCSI_ABORT_SUCCESS; - } else { -/* local_irq_restore(flags); */ - printk("scsi%d: abort of connected command failed!\n", HOSTNO); - return SCSI_ABORT_ERROR; - } - } -#endif - -/* - * Case 2 : If the command hasn't been issued yet, we simply remove it - * from the issue queue. - */ - for (prev = (Scsi_Cmnd **) &(hostdata->issue_queue), - tmp = (Scsi_Cmnd *) hostdata->issue_queue; - tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) - if (cmd == tmp) { - REMOVE(5, *prev, tmp, NEXT(tmp)); - (*prev) = NEXT(tmp); - NEXT(tmp) = NULL; - tmp->result = DID_ABORT << 16; - local_irq_restore(flags); - ABRT_PRINTK("scsi%d: abort removed command from issue queue.\n", - HOSTNO); - /* Tagged queuing note: no tag to free here, hasn't been assigned - * yet... */ - tmp->scsi_done(tmp); - return SCSI_ABORT_SUCCESS; - } - -/* - * Case 3 : If any commands are connected, we're going to fail the abort - * and let the high level SCSI driver retry at a later time or - * issue a reset. - * - * Timeouts, and therefore aborted commands, will be highly unlikely - * and handling them cleanly in this situation would make the common - * case of noresets less efficient, and would pollute our code. So, - * we fail. - */ - - if (hostdata->connected) { - local_irq_restore(flags); - ABRT_PRINTK("scsi%d: abort failed, command connected.\n", HOSTNO); - return SCSI_ABORT_SNOOZE; - } - -/* - * Case 4: If the command is currently disconnected from the bus, and - * there are no connected commands, we reconnect the I_T_L or - * I_T_L_Q nexus associated with it, go into message out, and send - * an abort message. - * - * This case is especially ugly. In order to reestablish the nexus, we - * need to call NCR5380_select(). The easiest way to implement this - * function was to abort if the bus was busy, and let the interrupt - * handler triggered on the SEL for reselect take care of lost arbitrations - * where necessary, meaning interrupts need to be enabled. - * - * When interrupts are enabled, the queues may change - so we - * can't remove it from the disconnected queue before selecting it - * because that could cause a failure in hashing the nexus if that - * device reselected. - * - * Since the queues may change, we can't use the pointers from when we - * first locate it. - * - * So, we must first locate the command, and if NCR5380_select() - * succeeds, then issue the abort, relocate the command and remove - * it from the disconnected queue. - */ - - for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; - tmp = NEXT(tmp)) - if (cmd == tmp) { - local_irq_restore(flags); - ABRT_PRINTK("scsi%d: aborting disconnected command.\n", HOSTNO); - - if (NCR5380_select (instance, cmd, (int) cmd->tag)) - return SCSI_ABORT_BUSY; - - ABRT_PRINTK("scsi%d: nexus reestablished.\n", HOSTNO); - - do_abort (instance); - - local_irq_save(flags); - for (prev = (Scsi_Cmnd **) &(hostdata->disconnected_queue), - tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; - tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) - if (cmd == tmp) { - REMOVE(5, *prev, tmp, NEXT(tmp)); - *prev = NEXT(tmp); - NEXT(tmp) = NULL; - tmp->result = DID_ABORT << 16; - /* We must unlock the tag/LUN immediately here, since the - * target goes to BUS FREE and doesn't send us another - * message (COMMAND_COMPLETE or the like) - */ -#ifdef SUPPORT_TAGS - cmd_free_tag( tmp ); -#else - hostdata->busy[cmd->target] &= ~(1 << cmd->lun); -#endif - local_irq_restore(flags); - tmp->scsi_done(tmp); - return SCSI_ABORT_SUCCESS; - } - } - -/* - * Case 5 : If we reached this point, the command was not found in any of - * the queues. - * - * We probably reached this point because of an unlikely race condition - * between the command completing successfully and the abortion code, - * so we won't panic, but we will notify the user in case something really - * broke. - */ - - local_irq_restore(flags); - printk(KERN_INFO "scsi%d: warning : SCSI command probably completed successfully\n" - KERN_INFO " before abortion\n", HOSTNO); - -/* Maybe it is sufficient just to release the ST-DMA lock... (if - * possible at all) At least, we should check if the lock could be - * released after the abort, in case it is kept due to some bug. - */ - - return SCSI_ABORT_NOT_RUNNING; -} - - -/* - * Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd) - * - * Purpose : reset the SCSI bus. - * - * Returns : SCSI_RESET_WAKEUP - * - */ - -static int NCR5380_bus_reset( Scsi_Cmnd *cmd) -{ - SETUP_HOSTDATA(cmd->host); - int i; - unsigned long flags; -#if 1 - Scsi_Cmnd *connected, *disconnected_queue; -#endif - - NCR5380_print_status (cmd->host); - - /* get in phase */ - NCR5380_write( TARGET_COMMAND_REG, - PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) )); - /* assert RST */ - NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST ); - udelay (40); - /* reset NCR registers */ - NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE ); - NCR5380_write( MODE_REG, MR_BASE ); - NCR5380_write( TARGET_COMMAND_REG, 0 ); - NCR5380_write( SELECT_ENABLE_REG, 0 ); - /* ++roman: reset interrupt condition! otherwise no interrupts don't get - * through anymore ... */ - (void)NCR5380_read( RESET_PARITY_INTERRUPT_REG ); - -#if 1 /* XXX Should now be done by midlevel code, but it's broken XXX */ - /* XXX see below XXX */ - - /* MSch: old-style reset: actually abort all command processing here */ - - /* After the reset, there are no more connected or disconnected commands - * and no busy units; to avoid problems with re-inserting the commands - * into the issue_queue (via scsi_done()), the aborted commands are - * remembered in local variables first. - */ - local_irq_save(flags); - connected = (Scsi_Cmnd *)hostdata->connected; - hostdata->connected = NULL; - disconnected_queue = (Scsi_Cmnd *)hostdata->disconnected_queue; - hostdata->disconnected_queue = NULL; -#ifdef SUPPORT_TAGS - free_all_tags(); -#endif - for( i = 0; i < 8; ++i ) - hostdata->busy[i] = 0; -#ifdef REAL_DMA - hostdata->dma_len = 0; -#endif - local_irq_restore(flags); - - /* In order to tell the mid-level code which commands were aborted, - * set the command status to DID_RESET and call scsi_done() !!! - * This ultimately aborts processing of these commands in the mid-level. - */ - - if ((cmd = connected)) { - ABRT_PRINTK("scsi%d: reset aborted a connected command\n", H_NO(cmd)); - cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16); - cmd->scsi_done( cmd ); - } - - for (i = 0; (cmd = disconnected_queue); ++i) { - disconnected_queue = NEXT(cmd); - NEXT(cmd) = NULL; - cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16); - cmd->scsi_done( cmd ); - } - if (i > 0) - ABRT_PRINTK("scsi: reset aborted %d disconnected command(s)\n", i); - - /* since all commands have been explicitly terminated, we need to tell - * the midlevel code that the reset was SUCCESSFUL, and there is no - * need to 'wake up' the commands by a request_sense - */ - return SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET; -#else /* 1 */ - - /* MSch: new-style reset handling: let the mid-level do what it can */ - - /* ++guenther: MID-LEVEL IS STILL BROKEN. - * Mid-level is supposed to requeue all commands that were active on the - * various low-level queues. In fact it does this, but that's not enough - * because all these commands are subject to timeout. And if a timeout - * happens for any removed command, *_abort() is called but all queues - * are now empty. Abort then gives up the falcon lock, which is fatal, - * since the mid-level will queue more commands and must have the lock - * (it's all happening inside timer interrupt handler!!). - * Even worse, abort will return NOT_RUNNING for all those commands not - * on any queue, so they won't be retried ... - * - * Conclusion: either scsi.c disables timeout for all resetted commands - * immediately, or we lose! As of linux-2.0.20 it doesn't. - */ - - /* After the reset, there are no more connected or disconnected commands - * and no busy units; so clear the low-level status here to avoid - * conflicts when the mid-level code tries to wake up the affected - * commands! - */ - - if (hostdata->issue_queue) - ABRT_PRINTK("scsi%d: reset aborted issued command(s)\n", H_NO(cmd)); - if (hostdata->connected) - ABRT_PRINTK("scsi%d: reset aborted a connected command\n", H_NO(cmd)); - if (hostdata->disconnected_queue) - ABRT_PRINTK("scsi%d: reset aborted disconnected command(s)\n", H_NO(cmd)); - - local_irq_save(flags); - hostdata->issue_queue = NULL; - hostdata->connected = NULL; - hostdata->disconnected_queue = NULL; -#ifdef SUPPORT_TAGS - free_all_tags(); -#endif - for( i = 0; i < 8; ++i ) - hostdata->busy[i] = 0; -#ifdef REAL_DMA - hostdata->dma_len = 0; -#endif - local_irq_restore(flags); - - /* we did no complete reset of all commands, so a wakeup is required */ - return SCSI_RESET_WAKEUP | SCSI_RESET_BUS_RESET; -#endif /* 1 */ -} - -static Scsi_Host_Template driver_template = { - .name = "Macintosh NCR5380 SCSI", - .detect = macscsi_detect, - .release = macscsi_release, - .info = macscsi_info, - .queuecommand = macscsi_queue_command, - .abort = macscsi_abort, - .reset = macscsi_reset, - .can_queue = CAN_QUEUE, - .this_id = 7, - .sg_tablesize = SG_ALL, - .cmd_per_lun = CMD_PER_LUN, - .use_clustering = DISABLE_CLUSTERING -}; - - -#include "scsi_module.c" - -/* Local Variables: */ -/* tab-width: 8 */ -/* End: */ diff -Nru a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c --- a/drivers/scsi/mesh.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/mesh.c Tue Feb 17 20:00:07 2004 @@ -10,9 +10,13 @@ * Apr. 21 2002 - BenH Rework bus reset code for new error handler * Add delay after initial bus reset * Add module parameters + * + * Sep. 27 2003 - BenH Move to new driver model, fix some write posting + * issues * To do: * - handle aborts correctly * - retry arbitration if lost (unless higher levels do this for us) + * - power down the chip when no device is detected */ #include #include @@ -38,10 +42,7 @@ #include #include #include -#ifdef CONFIG_PMAC_PBOOK -#include -#include -#endif +#include #include "scsi.h" #include "hosts.h" @@ -164,10 +165,12 @@ int last_n_msgout; u8 msgout[16]; struct dbdma_cmd *dma_cmds; /* space for dbdma commands, aligned */ + dma_addr_t dma_cmd_bus; + void *dma_cmd_space; + int dma_cmd_size; int clk_freq; struct mesh_target tgts[8]; - void *dma_cmd_space; - struct device_node *ofnode; + struct macio_dev *mdev; struct pci_dev* pdev; #ifdef MESH_DBG int log_ix; @@ -176,324 +179,124 @@ #endif }; -#ifdef MESH_DBG - -static void dlog(struct mesh_state *ms, char *fmt, int a); -static void dumplog(struct mesh_state *ms, int tgt); -static void dumpslog(struct mesh_state *ms); - -#else -static inline void dlog(struct mesh_state *ms, char *fmt, int a) -{} -static inline void dumplog(struct mesh_state *ms, int tgt) -{} -static inline void dumpslog(struct mesh_state *ms) -{} - -#endif /* MESH_DBG */ -#define MKWORD(a, b, c, d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) +/* + * Driver is too messy, we need a few prototypes... + */ +static void mesh_done(struct mesh_state *ms, int start_next); +static void mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs); +static void cmd_complete(struct mesh_state *ms); +static void set_dma_cmds(struct mesh_state *ms, Scsi_Cmnd *cmd); +static void halt_dma(struct mesh_state *ms); +static void phase_mismatch(struct mesh_state *ms); -static struct mesh_state *all_meshes; -static void mesh_init(struct mesh_state *); -static int mesh_notify_reboot(struct notifier_block *, unsigned long, void *); -static void mesh_dump_regs(struct mesh_state *); -static void mesh_start(struct mesh_state *); -static void mesh_start_cmd(struct mesh_state *, Scsi_Cmnd *); -static void add_sdtr_msg(struct mesh_state *); -static void set_sdtr(struct mesh_state *, int, int); -static void start_phase(struct mesh_state *); -static void get_msgin(struct mesh_state *); -static int msgin_length(struct mesh_state *); -static void cmd_complete(struct mesh_state *); -static void phase_mismatch(struct mesh_state *); -static void reselected(struct mesh_state *); -static void handle_reset(struct mesh_state *); -static void handle_error(struct mesh_state *); -static void handle_exception(struct mesh_state *); -static void mesh_interrupt(int, void *, struct pt_regs *); -static irqreturn_t do_mesh_interrupt(int, void *, struct pt_regs *); -static void handle_msgin(struct mesh_state *); -static void mesh_done(struct mesh_state *, int); -static void mesh_completed(struct mesh_state *, Scsi_Cmnd *); -static void set_dma_cmds(struct mesh_state *, Scsi_Cmnd *); -static void halt_dma(struct mesh_state *); -static int data_goes_out(Scsi_Cmnd *); -static void do_abort(struct mesh_state *ms); -static void set_mesh_power(struct mesh_state *ms, int state); - -#ifdef CONFIG_PMAC_PBOOK -static int mesh_notify_sleep(struct pmu_sleep_notifier *self, int when); -static struct pmu_sleep_notifier mesh_sleep_notifier = { - mesh_notify_sleep, - SLEEP_LEVEL_BLOCK, -}; -#endif +/* + * Some debugging & logging routines + */ -static struct notifier_block mesh_notifier = { - mesh_notify_reboot, - NULL, - 0 -}; +#ifdef MESH_DBG -int -mesh_detect(Scsi_Host_Template *tp) +static inline u32 readtb(void) { - struct device_node *mesh; - int nmeshes, tgt, *cfp, minper; - struct mesh_state *ms, **prev_statep; - struct Scsi_Host *mesh_host; - void *dma_cmd_space; - - if (_machine == _MACH_Pmac) { - use_active_neg = (find_devices("mac-io") ? 0 : SEQ_ACTIVE_NEG); - } else { - /* CHRP mac-io */ - use_active_neg = SEQ_ACTIVE_NEG; - } - - /* Calculate sync rate from module parameters */ - if (sync_rate > 10) - sync_rate = 10; - if (sync_rate > 0) { - printk(KERN_INFO "mesh: configured for synchronous %d MB/s\n", sync_rate); - mesh_sync_period = 1000 / sync_rate; /* ns */ - mesh_sync_offset = 15; - } else - printk(KERN_INFO "mesh: configured for asynchronous\n"); - - nmeshes = 0; - prev_statep = &all_meshes; - /* - * On powermacs, the MESH node has device_type "mesh". - * On chrp machines, its device_type is "scsi" with - * "chrp,mesh0" as its `compatible' property. - */ - mesh = find_devices("mesh"); - if (mesh == 0) - mesh = find_compatible_devices("scsi", "chrp,mesh0"); - for (; mesh != 0; mesh = mesh->next) { - u8 pci_bus, pci_devfn; - struct pci_dev* pdev = NULL; - - if (mesh->n_addrs != 2 || mesh->n_intrs != 2) { - printk(KERN_ERR "mesh: expected 2 addrs and 2 intrs" - " (got %d,%d)\n", mesh->n_addrs, mesh->n_intrs); - continue; - } - if (mesh->parent != NULL - && pci_device_from_OF_node(mesh->parent, &pci_bus, - &pci_devfn) == 0) - pdev = pci_find_slot(pci_bus, pci_devfn); - if (pdev == NULL) { - printk(KERN_ERR "mesh: Can't locate PCI entry\n"); - continue; - } + u32 tb; - mesh_host = scsi_register(tp, sizeof(struct mesh_state)); - if (mesh_host == 0) { - printk(KERN_ERR "mesh: couldn't register host"); - continue; - } - mesh_host->unique_id = nmeshes; -#if !defined(MODULE) - note_scsi_host(mesh, mesh_host); +#ifdef DBG_USE_TB + /* Beware: if you enable this, it will crash on 601s. */ + asm ("mftb %0" : "=r" (tb) : ); +#else + tb = 0; #endif - - ms = (struct mesh_state *) mesh_host->hostdata; - if (ms == 0) - panic("no mesh state"); - memset(ms, 0, sizeof(*ms)); - ms->host = mesh_host; - ms->ofnode = mesh; - ms->pdev = pdev; - ms->mesh = (volatile struct mesh_regs *) - ioremap(mesh->addrs[0].address, 0x1000); - ms->dma = (volatile struct dbdma_regs *) - ioremap(mesh->addrs[1].address, 0x1000); - ms->meshintr = mesh->intrs[0].line; - ms->dmaintr = mesh->intrs[1].line; - - /* Space for dma command list: +1 for stop command, - +1 to allow for aligning. */ - dma_cmd_space = kmalloc((mesh_host->sg_tablesize + 2) * - sizeof(struct dbdma_cmd), GFP_KERNEL); - if (dma_cmd_space == 0) - panic("mesh: couldn't allocate dma command space"); - ms->dma_cmds = (struct dbdma_cmd *) DBDMA_ALIGN(dma_cmd_space); - memset(ms->dma_cmds, 0, (mesh_host->sg_tablesize + 1) - * sizeof(struct dbdma_cmd)); - ms->dma_cmd_space = dma_cmd_space; - - ms->current_req = 0; - for (tgt = 0; tgt < 8; ++tgt) { - ms->tgts[tgt].sdtr_state = do_sdtr; - ms->tgts[tgt].sync_params = ASYNC_PARAMS; - ms->tgts[tgt].current_req = 0; - } - *prev_statep = ms; - prev_statep = &ms->next; - - if ((cfp = (int *) get_property(mesh, "clock-frequency", - NULL))) { - ms->clk_freq = *cfp; - } else { - printk(KERN_INFO "mesh: assuming 50MHz clock frequency\n"); - ms->clk_freq = 50000000; - } - /* The maximum sync rate is clock / 5; increase - mesh_sync_period if necessary. */ - minper = 1000000000 / (ms->clk_freq / 5); /* ns */ - if (mesh_sync_period < minper) - mesh_sync_period = minper; - - set_mesh_power(ms, 1); - - mesh_init(ms); - - if (request_irq(ms->meshintr, do_mesh_interrupt, 0, "MESH", ms)) { - printk(KERN_ERR "MESH: can't get irq %d\n", ms->meshintr); - } - - ++nmeshes; - } - - if ((_machine == _MACH_Pmac) && (nmeshes > 0)) { -#ifdef CONFIG_PMAC_PBOOK - pmu_register_sleep_notifier(&mesh_sleep_notifier); -#endif /* CONFIG_PMAC_PBOOK */ - register_reboot_notifier(&mesh_notifier); - } - - return nmeshes; + return tb; } -int -mesh_release(struct Scsi_Host *host) +static void dlog(struct mesh_state *ms, char *fmt, int a) { - struct mesh_state *ms = (struct mesh_state *) host->hostdata; + struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; + struct dbglog *tlp, *slp; - if (ms == 0) - return 0; - if (ms->mesh) - iounmap((void *) ms->mesh); - if (ms->dma) - iounmap((void *) ms->dma); - kfree(ms->dma_cmd_space); - free_irq(ms->meshintr, ms); - pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 0); - return 0; + tlp = &tp->log[tp->log_ix]; + slp = &ms->log[ms->log_ix]; + tlp->fmt = fmt; + tlp->tb = readtb(); + tlp->phase = (ms->msgphase << 4) + ms->phase; + tlp->bs0 = ms->mesh->bus_status0; + tlp->bs1 = ms->mesh->bus_status1; + tlp->tgt = ms->conn_tgt; + tlp->d = a; + *slp = *tlp; + if (++tp->log_ix >= N_DBG_LOG) + tp->log_ix = 0; + if (tp->n_log < N_DBG_LOG) + ++tp->n_log; + if (++ms->log_ix >= N_DBG_SLOG) + ms->log_ix = 0; + if (ms->n_log < N_DBG_SLOG) + ++ms->n_log; } -static void -set_mesh_power(struct mesh_state *ms, int state) +static void dumplog(struct mesh_state *ms, int t) { - if (_machine != _MACH_Pmac) - return; - if (state) { - pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 1); - mdelay(200); - } else { - pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 0); - mdelay(10); - } -} + struct mesh_target *tp = &ms->tgts[t]; + struct dbglog *lp; + int i; -#ifdef CONFIG_PMAC_PBOOK -/* - * notify clients before sleep and reset bus afterwards - */ -int -mesh_notify_sleep(struct pmu_sleep_notifier *self, int when) -{ - struct mesh_state *ms; - - switch (when) { - case PBOOK_SLEEP_REQUEST: - /* XXX We should wait for current transactions and queue - * new ones that would be posted beyond this point - */ - break; - case PBOOK_SLEEP_REJECT: - break; - - case PBOOK_SLEEP_NOW: - for (ms = all_meshes; ms != 0; ms = ms->next) { - unsigned long flags; - - scsi_block_requests(ms->host); - spin_lock_irqsave(ms->host->host_lock, flags); - while(ms->phase != idle) { - spin_unlock_irqrestore(ms->host->host_lock, flags); - current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(1); - spin_lock_irqsave(ms->host->host_lock, flags); - } - ms->phase = sleeping; - spin_unlock_irqrestore(ms->host->host_lock, flags); - disable_irq(ms->meshintr); - set_mesh_power(ms, 0); - } - break; - case PBOOK_WAKE: - for (ms = all_meshes; ms != 0; ms = ms->next) { - unsigned long flags; - - set_mesh_power(ms, 1); - mesh_init(ms); - spin_lock_irqsave(ms->host->host_lock, flags); - mesh_start(ms); - spin_unlock_irqrestore(ms->host->host_lock, flags); - enable_irq(ms->meshintr); - scsi_unblock_requests(ms->host); - } - break; - } - return PBOOK_SLEEP_OK; + if (tp->n_log == 0) + return; + i = tp->log_ix - tp->n_log; + if (i < 0) + i += N_DBG_LOG; + tp->n_log = 0; + do { + lp = &tp->log[i]; + printk(KERN_DEBUG "mesh log %d: bs=%.2x%.2x ph=%.2x ", + t, lp->bs1, lp->bs0, lp->phase); +#ifdef DBG_USE_TB + printk("tb=%10u ", lp->tb); +#endif + printk(lp->fmt, lp->d); + printk("\n"); + if (++i >= N_DBG_LOG) + i = 0; + } while (i != tp->log_ix); } -#endif /* CONFIG_PMAC_PBOOK */ -/* - * Called by midlayer with host locked to queue a new - * request - */ -int -mesh_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) +static void dumpslog(struct mesh_state *ms) { - struct mesh_state *ms; - - cmd->scsi_done = done; - cmd->host_scribble = NULL; - - ms = (struct mesh_state *) cmd->device->host->hostdata; + struct dbglog *lp; + int i; - if (ms->request_q == NULL) - ms->request_q = cmd; - else - ms->request_qtail->host_scribble = (void *) cmd; - ms->request_qtail = cmd; + if (ms->n_log == 0) + return; + i = ms->log_ix - ms->n_log; + if (i < 0) + i += N_DBG_SLOG; + ms->n_log = 0; + do { + lp = &ms->log[i]; + printk(KERN_DEBUG "mesh log: bs=%.2x%.2x ph=%.2x t%d ", + lp->bs1, lp->bs0, lp->phase, lp->tgt); +#ifdef DBG_USE_TB + printk("tb=%10u ", lp->tb); +#endif + printk(lp->fmt, lp->d); + printk("\n"); + if (++i >= N_DBG_SLOG) + i = 0; + } while (i != ms->log_ix); +} - if (ms->phase == idle) - mesh_start(ms); +#else - return 0; -} +static inline void dlog(struct mesh_state *ms, char *fmt, int a) +{} +static inline void dumplog(struct mesh_state *ms, int tgt) +{} +static inline void dumpslog(struct mesh_state *ms) +{} -/* Todo: here we can at least try to remove the command from the - * queue if it isn't connected yet, and for pending command, assert - * ATN until the bus gets freed. - */ -int -mesh_abort(Scsi_Cmnd *cmd) -{ - struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata; +#endif /* MESH_DBG */ - printk(KERN_DEBUG "mesh_abort(%p)\n", cmd); - mesh_dump_regs(ms); - dumplog(ms, cmd->device->id); - dumpslog(ms); - return SCSI_ABORT_SNOOZE; -} +#define MKWORD(a, b, c, d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) static void mesh_dump_regs(struct mesh_state *ms) @@ -528,79 +331,35 @@ } } + /* - * Called by the midlayer with the lock held to reset the - * SCSI host and bus. - * The midlayer will wait for devices to come back, we don't need - * to do that ourselves + * Flush write buffers on the bus path to the mesh */ -int -mesh_host_reset(Scsi_Cmnd *cmd) +static inline void mesh_flush_io(volatile struct mesh_regs *mr) { - struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata; - volatile struct mesh_regs *mr = ms->mesh; - volatile struct dbdma_regs *md = ms->dma; - - printk(KERN_DEBUG "mesh_host_reset\n"); - - /* Reset the controller & dbdma channel */ - out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16); /* stop dma */ - out_8(&mr->exception, 0xff); /* clear all exception bits */ - out_8(&mr->error, 0xff); /* clear all error bits */ - out_8(&mr->sequence, SEQ_RESETMESH); - udelay(1); - out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); - out_8(&mr->source_id, ms->host->this_id); - out_8(&mr->sel_timeout, 25); /* 250ms */ - out_8(&mr->sync_params, ASYNC_PARAMS); - - /* Reset the bus */ - out_8(&mr->bus_status1, BS1_RST); /* assert RST */ - udelay(30); /* leave it on for >= 25us */ - out_8(&mr->bus_status1, 0); /* negate RST */ - - /* Complete pending commands */ - handle_reset(ms); - - return SUCCESS; + (void)in_8(&mr->mesh_id); } + /* - * If we leave drives set for synchronous transfers (especially - * CDROMs), and reboot to MacOS, it gets confused, poor thing. - * So, on reboot we reset the SCSI bus. + * Complete a SCSI command */ -static int -mesh_notify_reboot(struct notifier_block *this, unsigned long code, void *x) +static void mesh_completed(struct mesh_state *ms, Scsi_Cmnd *cmd) { - struct mesh_state *ms; - volatile struct mesh_regs *mr; - - if (code == SYS_DOWN) { - printk(KERN_INFO "resetting MESH scsi bus(es)\n"); - for (ms = all_meshes; ms != 0; ms = ms->next) { - mr = ms->mesh; - out_8(&mr->intr_mask, 0); - out_8(&mr->interrupt, - INT_ERROR | INT_EXCEPTION | INT_CMDDONE); - out_8(&mr->bus_status1, BS1_RST); - udelay(30); - out_8(&mr->bus_status1, 0); - } - } - return NOTIFY_DONE; + (*cmd->scsi_done)(cmd); } + /* Called with meshinterrupt disabled, initialize the chipset * and eventually do the initial bus reset. The lock must not be * held since we can schedule. */ -static void -mesh_init(struct mesh_state *ms) +static void mesh_init(struct mesh_state *ms) { volatile struct mesh_regs *mr = ms->mesh; volatile struct dbdma_regs *md = ms->dma; + mesh_flush_io(mr); udelay(100); /* Reset controller */ @@ -608,6 +367,7 @@ out_8(&mr->exception, 0xff); /* clear all exception bits */ out_8(&mr->error, 0xff); /* clear all error bits */ out_8(&mr->sequence, SEQ_RESETMESH); + mesh_flush_io(mr); udelay(10); out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); out_8(&mr->source_id, ms->host->this_id); @@ -619,8 +379,10 @@ /* Reset bus */ out_8(&mr->bus_status1, BS1_RST); /* assert RST */ + mesh_flush_io(mr); udelay(30); /* leave it on for >= 25us */ out_8(&mr->bus_status1, 0); /* negate RST */ + mesh_flush_io(mr); /* Wait for bus to come back */ current->state = TASK_UNINTERRUPTIBLE; @@ -630,6 +392,7 @@ /* Reconfigure controller */ out_8(&mr->interrupt, 0xff); /* clear all interrupt bits */ out_8(&mr->sequence, SEQ_FLUSHFIFO); + mesh_flush_io(mr); udelay(1); out_8(&mr->sync_params, ASYNC_PARAMS); out_8(&mr->sequence, SEQ_ENBRESEL); @@ -638,51 +401,15 @@ ms->msgphase = msg_none; } -/* - * Start the next command for a MESH. - * Should be called with interrupts disabled. - */ -static void -mesh_start(struct mesh_state *ms) -{ - Scsi_Cmnd *cmd, *prev, *next; - - if (ms->phase != idle || ms->current_req != NULL) { - printk(KERN_ERR "inappropriate mesh_start (phase=%d, ms=%p)", - ms->phase, ms); - return; - } - - while (ms->phase == idle) { - prev = NULL; - for (cmd = ms->request_q; ; cmd = (Scsi_Cmnd *) cmd->host_scribble) { - if (cmd == NULL) - return; - if (ms->tgts[cmd->device->id].current_req == NULL) - break; - prev = cmd; - } - next = (Scsi_Cmnd *) cmd->host_scribble; - if (prev == NULL) - ms->request_q = next; - else - prev->host_scribble = (void *) next; - if (next == NULL) - ms->request_qtail = prev; - - mesh_start_cmd(ms, cmd); - } -} -static void -mesh_start_cmd(struct mesh_state *ms, Scsi_Cmnd *cmd) +static void mesh_start_cmd(struct mesh_state *ms, Scsi_Cmnd *cmd) { volatile struct mesh_regs *mr = ms->mesh; int t, id; id = cmd->device->id; ms->current_req = cmd; - ms->tgts[id].data_goes_out = data_goes_out(cmd); + ms->tgts[id].data_goes_out = cmd->sc_data_direction == SCSI_DATA_WRITE; ms->tgts[id].current_req = cmd; #if 1 @@ -720,9 +447,10 @@ MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count)); out_8(&mr->interrupt, INT_CMDDONE); out_8(&mr->sequence, SEQ_ENBRESEL); + mesh_flush_io(mr); udelay(1); - if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) { + if (in_8(&mr->bus_status1) & (BS1_BSY | BS1_SEL)) { /* * Some other device has the bus or is arbitrating for it - * probably a target which is about to reselect us. @@ -731,7 +459,7 @@ MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count)); for (t = 100; t > 0; --t) { - if ((mr->bus_status1 & (BS1_BSY | BS1_SEL)) == 0) + if ((in_8(&mr->bus_status1) & (BS1_BSY | BS1_SEL)) == 0) break; if (in_8(&mr->interrupt) != 0) { dlog(ms, "intr b4 arb, intr/exc/err/fc=%.8x", @@ -743,7 +471,7 @@ } udelay(1); } - if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) { + if (in_8(&mr->bus_status1) & (BS1_BSY | BS1_SEL)) { /* XXX should try again in a little while */ ms->stat = DID_BUS_BUSY; ms->phase = idle; @@ -792,23 +520,25 @@ } dlog(ms, "after arb, intr/exc/err/fc=%.8x", MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count)); - if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL) - && (mr->bus_status0 & BS0_IO)) { + if (in_8(&mr->interrupt) == 0 && (in_8(&mr->bus_status1) & BS1_SEL) + && (in_8(&mr->bus_status0) & BS0_IO)) { /* looks like a reselection - try resetting the mesh */ dlog(ms, "resel? after arb, intr/exc/err/fc=%.8x", MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count)); out_8(&mr->sequence, SEQ_RESETMESH); + mesh_flush_io(mr); udelay(10); out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); out_8(&mr->sequence, SEQ_ENBRESEL); - for (t = 10; t > 0 && mr->interrupt == 0; --t) + mesh_flush_io(mr); + for (t = 10; t > 0 && in_8(&mr->interrupt) == 0; --t) udelay(1); dlog(ms, "tried reset after arb, intr/exc/err/fc=%.8x", MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count)); #ifndef MESH_MULTIPLE_HOSTS - if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL) - && (mr->bus_status0 & BS0_IO)) { + if (in_8(&mr->interrupt) == 0 && (in_8(&mr->bus_status1) & BS1_SEL) + && (in_8(&mr->bus_status0) & BS0_IO)) { printk(KERN_ERR "mesh: controller not responding" " to reselection!\n"); /* @@ -822,8 +552,76 @@ } } -static inline void -add_sdtr_msg(struct mesh_state *ms) +/* + * Start the next command for a MESH. + * Should be called with interrupts disabled. + */ +static void mesh_start(struct mesh_state *ms) +{ + Scsi_Cmnd *cmd, *prev, *next; + + if (ms->phase != idle || ms->current_req != NULL) { + printk(KERN_ERR "inappropriate mesh_start (phase=%d, ms=%p)", + ms->phase, ms); + return; + } + + while (ms->phase == idle) { + prev = NULL; + for (cmd = ms->request_q; ; cmd = (Scsi_Cmnd *) cmd->host_scribble) { + if (cmd == NULL) + return; + if (ms->tgts[cmd->device->id].current_req == NULL) + break; + prev = cmd; + } + next = (Scsi_Cmnd *) cmd->host_scribble; + if (prev == NULL) + ms->request_q = next; + else + prev->host_scribble = (void *) next; + if (next == NULL) + ms->request_qtail = prev; + + mesh_start_cmd(ms, cmd); + } +} + +static void mesh_done(struct mesh_state *ms, int start_next) +{ + Scsi_Cmnd *cmd; + struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; + + cmd = ms->current_req; + ms->current_req = 0; + tp->current_req = 0; + if (cmd) { + cmd->result = (ms->stat << 16) + cmd->SCp.Status; + if (ms->stat == DID_OK) + cmd->result += (cmd->SCp.Message << 8); + if (DEBUG_TARGET(cmd)) { + printk(KERN_DEBUG "mesh_done: result = %x, data_ptr=%d, buflen=%d\n", + cmd->result, ms->data_ptr, cmd->request_bufflen); + if ((cmd->cmnd[0] == 0 || cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 3) + && cmd->request_buffer != 0) { + unsigned char *b = cmd->request_buffer; + printk(KERN_DEBUG "buffer = %x %x %x %x %x %x %x %x\n", + b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]); + } + } + cmd->SCp.this_residual -= ms->data_ptr; + mesh_completed(ms, cmd); + } + if (start_next) { + out_8(&ms->mesh->sequence, SEQ_ENBRESEL); + mesh_flush_io(ms->mesh); + udelay(1); + ms->phase = idle; + mesh_start(ms); + } +} + +static inline void add_sdtr_msg(struct mesh_state *ms) { int i = ms->n_msgout; @@ -835,8 +633,7 @@ ms->n_msgout = i + 5; } -static void -set_sdtr(struct mesh_state *ms, int period, int offset) +static void set_sdtr(struct mesh_state *ms, int period, int offset) { struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; volatile struct mesh_regs *mr = ms->mesh; @@ -877,8 +674,7 @@ ms->conn_tgt, tr/10, tr%10); } -static void -start_phase(struct mesh_state *ms) +static void start_phase(struct mesh_state *ms) { int i, seq, nb; volatile struct mesh_regs *mr = ms->mesh; @@ -925,14 +721,16 @@ ms->msgout[1], ms->msgout[2])); out_8(&mr->count_hi, 0); out_8(&mr->sequence, SEQ_FLUSHFIFO); + mesh_flush_io(mr); udelay(1); /* * If ATN is not already asserted, we assert it, then * issue a SEQ_MSGOUT to get the mesh to drop ACK. */ - if ((mr->bus_status0 & BS0_ATN) == 0) { + if ((in_8(&mr->bus_status0) & BS0_ATN) == 0) { dlog(ms, "bus0 was %.2x explictly asserting ATN", mr->bus_status0); out_8(&mr->bus_status0, BS0_ATN); /* explicit ATN */ + mesh_flush_io(mr); udelay(1); out_8(&mr->count_lo, 1); out_8(&mr->sequence, SEQ_MSGOUT + seq); @@ -1006,6 +804,7 @@ case busfreeing: case disconnecting: out_8(&mr->sequence, SEQ_ENBRESEL); + mesh_flush_io(mr); udelay(1); dlog(ms, "enbresel intr/exc/err/fc=%.8x", MKWORD(mr->interrupt, mr->exception, mr->error, @@ -1020,8 +819,7 @@ } -static inline void -get_msgin(struct mesh_state *ms) +static inline void get_msgin(struct mesh_state *ms) { volatile struct mesh_regs *mr = ms->mesh; int i, n; @@ -1035,8 +833,7 @@ } } -static inline int -msgin_length(struct mesh_state *ms) +static inline int msgin_length(struct mesh_state *ms) { int b, n; @@ -1054,265 +851,7 @@ return n; } -static void -cmd_complete(struct mesh_state *ms) -{ - volatile struct mesh_regs *mr = ms->mesh; - Scsi_Cmnd *cmd = ms->current_req; - struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; - int seq, n, t; - - dlog(ms, "cmd_complete fc=%x", mr->fifo_count); - seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0); - switch (ms->msgphase) { - case msg_out_xxx: - /* huh? we expected a phase mismatch */ - ms->n_msgin = 0; - ms->msgphase = msg_in; - /* fall through */ - - case msg_in: - /* should have some message bytes in fifo */ - get_msgin(ms); - n = msgin_length(ms); - if (ms->n_msgin < n) { - out_8(&mr->count_lo, n - ms->n_msgin); - out_8(&mr->sequence, SEQ_MSGIN + seq); - } else { - ms->msgphase = msg_none; - handle_msgin(ms); - start_phase(ms); - } - break; - - case msg_in_bad: - out_8(&mr->sequence, SEQ_FLUSHFIFO); - udelay(1); - out_8(&mr->count_lo, 1); - out_8(&mr->sequence, SEQ_MSGIN + SEQ_ATN + use_active_neg); - break; - - case msg_out: - /* - * To get the right timing on ATN wrt ACK, we have - * to get the MESH to drop ACK, wait until REQ gets - * asserted, then drop ATN. To do this we first - * issue a SEQ_MSGOUT with ATN and wait for REQ, - * then change the command to a SEQ_MSGOUT w/o ATN. - * If we don't see REQ in a reasonable time, we - * change the command to SEQ_MSGIN with ATN, - * wait for the phase mismatch interrupt, then - * issue the SEQ_MSGOUT without ATN. - */ - out_8(&mr->count_lo, 1); - out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg + SEQ_ATN); - t = 30; /* wait up to 30us */ - while ((mr->bus_status0 & BS0_REQ) == 0 && --t >= 0) - udelay(1); - dlog(ms, "last_mbyte err/exc/fc/cl=%.8x", - MKWORD(mr->error, mr->exception, - mr->fifo_count, mr->count_lo)); - if (in_8(&mr->interrupt) & (INT_ERROR | INT_EXCEPTION)) { - /* whoops, target didn't do what we expected */ - ms->last_n_msgout = ms->n_msgout; - ms->n_msgout = 0; - if (in_8(&mr->interrupt) & INT_ERROR) { - printk(KERN_ERR "mesh: error %x in msg_out\n", - in_8(&mr->error)); - handle_error(ms); - return; - } - if (in_8(&mr->exception) != EXC_PHASEMM) - printk(KERN_ERR "mesh: exc %x in msg_out\n", - in_8(&mr->exception)); - else - printk(KERN_DEBUG "mesh: bs0=%x in msg_out\n", - in_8(&mr->bus_status0)); - handle_exception(ms); - return; - } - if (mr->bus_status0 & BS0_REQ) { - out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg); - udelay(1); - out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]); - ms->msgphase = msg_out_last; - } else { - out_8(&mr->sequence, SEQ_MSGIN + use_active_neg + SEQ_ATN); - ms->msgphase = msg_out_xxx; - } - break; - - case msg_out_last: - ms->last_n_msgout = ms->n_msgout; - ms->n_msgout = 0; - ms->msgphase = ms->expect_reply? msg_in: msg_none; - start_phase(ms); - break; - - case msg_none: - switch (ms->phase) { - case idle: - printk(KERN_ERR "mesh: interrupt in idle phase?\n"); - dumpslog(ms); - return; - case selecting: - dlog(ms, "Selecting phase at command completion",0); - ms->msgout[0] = IDENTIFY(ALLOW_RESEL(ms->conn_tgt), - (cmd? cmd->device->lun: 0)); - ms->n_msgout = 1; - ms->expect_reply = 0; - if (ms->aborting) { - ms->msgout[0] = ABORT; - ms->n_msgout++; - } else if (tp->sdtr_state == do_sdtr) { - /* add SDTR message */ - add_sdtr_msg(ms); - ms->expect_reply = 1; - tp->sdtr_state = sdtr_sent; - } - ms->msgphase = msg_out; - /* - * We need to wait for REQ before dropping ATN. - * We wait for at most 30us, then fall back to - * a scheme where we issue a SEQ_COMMAND with ATN, - * which will give us a phase mismatch interrupt - * when REQ does come, and then we send the message. - */ - t = 230; /* wait up to 230us */ - while ((mr->bus_status0 & BS0_REQ) == 0) { - if (--t < 0) { - dlog(ms, "impatient for req", ms->n_msgout); - ms->msgphase = msg_none; - break; - } - udelay(1); - } - break; - case dataing: - if (ms->dma_count != 0) { - start_phase(ms); - return; - } - /* - * We can get a phase mismatch here if the target - * changes to the status phase, even though we have - * had a command complete interrupt. Then, if we - * issue the SEQ_STATUS command, we'll get a sequence - * error interrupt. Which isn't so bad except that - * occasionally the mesh actually executes the - * SEQ_STATUS *as well as* giving us the sequence - * error and phase mismatch exception. - */ - out_8(&mr->sequence, 0); - out_8(&mr->interrupt, - INT_ERROR | INT_EXCEPTION | INT_CMDDONE); - halt_dma(ms); - break; - case statusing: - if (cmd) { - cmd->SCp.Status = mr->fifo; - if (DEBUG_TARGET(cmd)) - printk(KERN_DEBUG "mesh: status is %x\n", - cmd->SCp.Status); - } - ms->msgphase = msg_in; - break; - case busfreeing: - mesh_done(ms, 1); - return; - case disconnecting: - ms->current_req = 0; - ms->phase = idle; - mesh_start(ms); - return; - default: - break; - } - ++ms->phase; - start_phase(ms); - break; - } -} - -static void phase_mismatch(struct mesh_state *ms) -{ - volatile struct mesh_regs *mr = ms->mesh; - int phase; - - dlog(ms, "phasemm ch/cl/seq/fc=%.8x", - MKWORD(mr->count_hi, mr->count_lo, mr->sequence, mr->fifo_count)); - phase = mr->bus_status0 & BS0_PHASE; - if (ms->msgphase == msg_out_xxx && phase == BP_MSGOUT) { - /* output the last byte of the message, without ATN */ - out_8(&mr->count_lo, 1); - out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg); - udelay(1); - out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]); - ms->msgphase = msg_out_last; - return; - } - - if (ms->msgphase == msg_in) { - get_msgin(ms); - if (ms->n_msgin) - handle_msgin(ms); - } - - if (ms->dma_started) - halt_dma(ms); - if (mr->fifo_count) { - out_8(&mr->sequence, SEQ_FLUSHFIFO); - udelay(1); - } - - ms->msgphase = msg_none; - switch (phase) { - case BP_DATAIN: - ms->tgts[ms->conn_tgt].data_goes_out = 0; - ms->phase = dataing; - break; - case BP_DATAOUT: - ms->tgts[ms->conn_tgt].data_goes_out = 1; - ms->phase = dataing; - break; - case BP_COMMAND: - ms->phase = commanding; - break; - case BP_STATUS: - ms->phase = statusing; - break; - case BP_MSGIN: - ms->msgphase = msg_in; - ms->n_msgin = 0; - break; - case BP_MSGOUT: - ms->msgphase = msg_out; - if (ms->n_msgout == 0) { - if (ms->aborting) { - do_abort(ms); - } else { - if (ms->last_n_msgout == 0) { - printk(KERN_DEBUG - "mesh: no msg to repeat\n"); - ms->msgout[0] = NOP; - ms->last_n_msgout = 1; - } - ms->n_msgout = ms->last_n_msgout; - } - } - break; - default: - printk(KERN_DEBUG "mesh: unknown scsi phase %x\n", phase); - ms->stat = DID_ERROR; - mesh_done(ms, 1); - return; - } - - start_phase(ms); -} - -static void -reselected(struct mesh_state *ms) +static void reselected(struct mesh_state *ms) { volatile struct mesh_regs *mr = ms->mesh; Scsi_Cmnd *cmd; @@ -1360,26 +899,30 @@ /* * We seem to get abortive reselections sometimes. */ - while ((mr->bus_status1 & BS1_BSY) == 0) { + while ((in_8(&mr->bus_status1) & BS1_BSY) == 0) { static int mesh_aborted_resels; mesh_aborted_resels++; out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); + mesh_flush_io(mr); udelay(1); out_8(&mr->sequence, SEQ_ENBRESEL); + mesh_flush_io(mr); udelay(5); dlog(ms, "extra resel err/exc/fc = %.6x", MKWORD(0, mr->error, mr->exception, mr->fifo_count)); } out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); + mesh_flush_io(mr); udelay(1); out_8(&mr->sequence, SEQ_ENBRESEL); + mesh_flush_io(mr); udelay(1); out_8(&mr->sync_params, ASYNC_PARAMS); /* * Find out who reselected us. */ - if (mr->fifo_count == 0) { + if (in_8(&mr->fifo_count) == 0) { printk(KERN_ERR "mesh: reselection but nothing in fifo?\n"); ms->conn_tgt = ms->host->this_id; goto bogus; @@ -1438,8 +981,7 @@ dlog(ms, "abort", 0); } -static void -handle_reset(struct mesh_state *ms) +static void handle_reset(struct mesh_state *ms) { int tgt; struct mesh_target *tp; @@ -1466,13 +1008,13 @@ ms->msgphase = msg_none; out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); out_8(&mr->sequence, SEQ_FLUSHFIFO); + mesh_flush_io(mr); udelay(1); out_8(&mr->sync_params, ASYNC_PARAMS); out_8(&mr->sequence, SEQ_ENBRESEL); } -static irqreturn_t -do_mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) +static irqreturn_t do_mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) { unsigned long flags; struct Scsi_Host *dev = ((struct mesh_state *)dev_id)->host; @@ -1497,7 +1039,7 @@ /* SCSI bus was reset */ printk(KERN_INFO "mesh: SCSI bus reset detected: " "waiting for end..."); - while ((mr->bus_status1 & BS1_RST) != 0) + while ((in_8(&mr->bus_status1) & BS1_RST) != 0) udelay(1); printk("done\n"); handle_reset(ms); @@ -1567,7 +1109,7 @@ } mesh_dump_regs(ms); dumplog(ms, ms->conn_tgt); - if (ms->phase > selecting && (mr->bus_status1 & BS1_BSY)) { + if (ms->phase > selecting && (in_8(&mr->bus_status1) & BS1_BSY)) { /* try to do what the target wants */ do_abort(ms); phase_mismatch(ms); @@ -1609,36 +1151,7 @@ } } -static void -mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) -{ - struct mesh_state *ms = (struct mesh_state *) dev_id; - volatile struct mesh_regs *mr = ms->mesh; - int intr; - -#if 0 - if (ALLOW_DEBUG(ms->conn_tgt)) - printk(KERN_DEBUG "mesh_intr, bs0=%x int=%x exc=%x err=%x " - "phase=%d msgphase=%d\n", mr->bus_status0, - mr->interrupt, mr->exception, mr->error, - ms->phase, ms->msgphase); -#endif - while ((intr = in_8(&mr->interrupt)) != 0) { - dlog(ms, "interrupt intr/err/exc/seq=%.8x", - MKWORD(intr, mr->error, mr->exception, mr->sequence)); - if (intr & INT_ERROR) { - handle_error(ms); - } else if (intr & INT_EXCEPTION) { - handle_exception(ms); - } else if (intr & INT_CMDDONE) { - out_8(&mr->interrupt, INT_CMDDONE); - cmd_complete(ms); - } - } -} - -static void -handle_msgin(struct mesh_state *ms) +static void handle_msgin(struct mesh_state *ms) { int i, code; Scsi_Cmnd *cmd = ms->current_req; @@ -1736,51 +1249,10 @@ ms->msgphase = msg_out; } -static void -mesh_done(struct mesh_state *ms, int start_next) -{ - Scsi_Cmnd *cmd; - struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; - - cmd = ms->current_req; - ms->current_req = 0; - tp->current_req = 0; - if (cmd) { - cmd->result = (ms->stat << 16) + cmd->SCp.Status; - if (ms->stat == DID_OK) - cmd->result += (cmd->SCp.Message << 8); - if (DEBUG_TARGET(cmd)) { - printk(KERN_DEBUG "mesh_done: result = %x, data_ptr=%d, buflen=%d\n", - cmd->result, ms->data_ptr, cmd->request_bufflen); - if ((cmd->cmnd[0] == 0 || cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 3) - && cmd->request_buffer != 0) { - unsigned char *b = cmd->request_buffer; - printk(KERN_DEBUG "buffer = %x %x %x %x %x %x %x %x\n", - b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]); - } - } - cmd->SCp.this_residual -= ms->data_ptr; - mesh_completed(ms, cmd); - } - if (start_next) { - out_8(&ms->mesh->sequence, SEQ_ENBRESEL); - udelay(1); - ms->phase = idle; - mesh_start(ms); - } -} - -static void -mesh_completed(struct mesh_state *ms, Scsi_Cmnd *cmd) -{ - (*cmd->scsi_done)(cmd); -} - /* * Set up DMA commands for transferring data. */ -static void -set_dma_cmds(struct mesh_state *ms, Scsi_Cmnd *cmd) +static void set_dma_cmds(struct mesh_state *ms, Scsi_Cmnd *cmd) { int i, dma_cmd, total, off, dtot; struct scatterlist *scl; @@ -1848,8 +1320,7 @@ ms->dma_count = dtot; } -static void -halt_dma(struct mesh_state *ms) +static void halt_dma(struct mesh_state *ms) { volatile struct dbdma_regs *md = ms->dma; volatile struct mesh_regs *mr = ms->mesh; @@ -1859,7 +1330,7 @@ if (!ms->tgts[ms->conn_tgt].data_goes_out) { /* wait a little while until the fifo drains */ t = 50; - while (t > 0 && mr->fifo_count != 0 + while (t > 0 && in_8(&mr->fifo_count) != 0 && (in_le32(&md->status) & ACTIVE) != 0) { --t; udelay(1); @@ -1899,154 +1370,471 @@ ms->dma_started = 0; } -/* - * Work out whether we expect data to go out from the host adaptor or into it. - */ -static int -data_goes_out(Scsi_Cmnd *cmd) +static void phase_mismatch(struct mesh_state *ms) { - switch (cmd->sc_data_direction) { - case SCSI_DATA_WRITE: - return 1; - case SCSI_DATA_READ: - return 0; + volatile struct mesh_regs *mr = ms->mesh; + int phase; + + dlog(ms, "phasemm ch/cl/seq/fc=%.8x", + MKWORD(mr->count_hi, mr->count_lo, mr->sequence, mr->fifo_count)); + phase = in_8(&mr->bus_status0) & BS0_PHASE; + if (ms->msgphase == msg_out_xxx && phase == BP_MSGOUT) { + /* output the last byte of the message, without ATN */ + out_8(&mr->count_lo, 1); + out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg); + mesh_flush_io(mr); + udelay(1); + out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]); + ms->msgphase = msg_out_last; + return; + } + + if (ms->msgphase == msg_in) { + get_msgin(ms); + if (ms->n_msgin) + handle_msgin(ms); + } + + if (ms->dma_started) + halt_dma(ms); + if (mr->fifo_count) { + out_8(&mr->sequence, SEQ_FLUSHFIFO); + mesh_flush_io(mr); + udelay(1); } - /* for SCSI_DATA_UNKNOWN or SCSI_DATA_NONE, fall back on the - old method for now... */ - switch (cmd->cmnd[0]) { - case CHANGE_DEFINITION: - case COMPARE: - case COPY: - case COPY_VERIFY: - case FORMAT_UNIT: - case LOG_SELECT: - case MEDIUM_SCAN: - case MODE_SELECT: - case MODE_SELECT_10: - case REASSIGN_BLOCKS: - case RESERVE: - case SEARCH_EQUAL: - case SEARCH_EQUAL_12: - case SEARCH_HIGH: - case SEARCH_HIGH_12: - case SEARCH_LOW: - case SEARCH_LOW_12: - case SEND_DIAGNOSTIC: - case SEND_VOLUME_TAG: - case SET_WINDOW: - case UPDATE_BLOCK: - case WRITE_BUFFER: - case WRITE_6: - case WRITE_10: - case WRITE_12: - case WRITE_LONG: - case WRITE_LONG_2: /* alternate code for WRITE_LONG */ - case WRITE_SAME: - case WRITE_VERIFY: - case WRITE_VERIFY_12: - return 1; + ms->msgphase = msg_none; + switch (phase) { + case BP_DATAIN: + ms->tgts[ms->conn_tgt].data_goes_out = 0; + ms->phase = dataing; + break; + case BP_DATAOUT: + ms->tgts[ms->conn_tgt].data_goes_out = 1; + ms->phase = dataing; + break; + case BP_COMMAND: + ms->phase = commanding; + break; + case BP_STATUS: + ms->phase = statusing; + break; + case BP_MSGIN: + ms->msgphase = msg_in; + ms->n_msgin = 0; + break; + case BP_MSGOUT: + ms->msgphase = msg_out; + if (ms->n_msgout == 0) { + if (ms->aborting) { + do_abort(ms); + } else { + if (ms->last_n_msgout == 0) { + printk(KERN_DEBUG + "mesh: no msg to repeat\n"); + ms->msgout[0] = NOP; + ms->last_n_msgout = 1; + } + ms->n_msgout = ms->last_n_msgout; + } + } + break; default: - return 0; + printk(KERN_DEBUG "mesh: unknown scsi phase %x\n", phase); + ms->stat = DID_ERROR; + mesh_done(ms, 1); + return; } + + start_phase(ms); } -#ifdef MESH_DBG -static inline u32 readtb(void) +static void cmd_complete(struct mesh_state *ms) { - u32 tb; + volatile struct mesh_regs *mr = ms->mesh; + Scsi_Cmnd *cmd = ms->current_req; + struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; + int seq, n, t; -#ifdef DBG_USE_TB - /* Beware: if you enable this, it will crash on 601s. */ - asm ("mftb %0" : "=r" (tb) : ); -#else - tb = 0; -#endif - return tb; + dlog(ms, "cmd_complete fc=%x", mr->fifo_count); + seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0); + switch (ms->msgphase) { + case msg_out_xxx: + /* huh? we expected a phase mismatch */ + ms->n_msgin = 0; + ms->msgphase = msg_in; + /* fall through */ + + case msg_in: + /* should have some message bytes in fifo */ + get_msgin(ms); + n = msgin_length(ms); + if (ms->n_msgin < n) { + out_8(&mr->count_lo, n - ms->n_msgin); + out_8(&mr->sequence, SEQ_MSGIN + seq); + } else { + ms->msgphase = msg_none; + handle_msgin(ms); + start_phase(ms); + } + break; + + case msg_in_bad: + out_8(&mr->sequence, SEQ_FLUSHFIFO); + mesh_flush_io(mr); + udelay(1); + out_8(&mr->count_lo, 1); + out_8(&mr->sequence, SEQ_MSGIN + SEQ_ATN + use_active_neg); + break; + + case msg_out: + /* + * To get the right timing on ATN wrt ACK, we have + * to get the MESH to drop ACK, wait until REQ gets + * asserted, then drop ATN. To do this we first + * issue a SEQ_MSGOUT with ATN and wait for REQ, + * then change the command to a SEQ_MSGOUT w/o ATN. + * If we don't see REQ in a reasonable time, we + * change the command to SEQ_MSGIN with ATN, + * wait for the phase mismatch interrupt, then + * issue the SEQ_MSGOUT without ATN. + */ + out_8(&mr->count_lo, 1); + out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg + SEQ_ATN); + t = 30; /* wait up to 30us */ + while ((in_8(&mr->bus_status0) & BS0_REQ) == 0 && --t >= 0) + udelay(1); + dlog(ms, "last_mbyte err/exc/fc/cl=%.8x", + MKWORD(mr->error, mr->exception, + mr->fifo_count, mr->count_lo)); + if (in_8(&mr->interrupt) & (INT_ERROR | INT_EXCEPTION)) { + /* whoops, target didn't do what we expected */ + ms->last_n_msgout = ms->n_msgout; + ms->n_msgout = 0; + if (in_8(&mr->interrupt) & INT_ERROR) { + printk(KERN_ERR "mesh: error %x in msg_out\n", + in_8(&mr->error)); + handle_error(ms); + return; + } + if (in_8(&mr->exception) != EXC_PHASEMM) + printk(KERN_ERR "mesh: exc %x in msg_out\n", + in_8(&mr->exception)); + else + printk(KERN_DEBUG "mesh: bs0=%x in msg_out\n", + in_8(&mr->bus_status0)); + handle_exception(ms); + return; + } + if (in_8(&mr->bus_status0) & BS0_REQ) { + out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg); + mesh_flush_io(mr); + udelay(1); + out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]); + ms->msgphase = msg_out_last; + } else { + out_8(&mr->sequence, SEQ_MSGIN + use_active_neg + SEQ_ATN); + ms->msgphase = msg_out_xxx; + } + break; + + case msg_out_last: + ms->last_n_msgout = ms->n_msgout; + ms->n_msgout = 0; + ms->msgphase = ms->expect_reply? msg_in: msg_none; + start_phase(ms); + break; + + case msg_none: + switch (ms->phase) { + case idle: + printk(KERN_ERR "mesh: interrupt in idle phase?\n"); + dumpslog(ms); + return; + case selecting: + dlog(ms, "Selecting phase at command completion",0); + ms->msgout[0] = IDENTIFY(ALLOW_RESEL(ms->conn_tgt), + (cmd? cmd->device->lun: 0)); + ms->n_msgout = 1; + ms->expect_reply = 0; + if (ms->aborting) { + ms->msgout[0] = ABORT; + ms->n_msgout++; + } else if (tp->sdtr_state == do_sdtr) { + /* add SDTR message */ + add_sdtr_msg(ms); + ms->expect_reply = 1; + tp->sdtr_state = sdtr_sent; + } + ms->msgphase = msg_out; + /* + * We need to wait for REQ before dropping ATN. + * We wait for at most 30us, then fall back to + * a scheme where we issue a SEQ_COMMAND with ATN, + * which will give us a phase mismatch interrupt + * when REQ does come, and then we send the message. + */ + t = 230; /* wait up to 230us */ + while ((in_8(&mr->bus_status0) & BS0_REQ) == 0) { + if (--t < 0) { + dlog(ms, "impatient for req", ms->n_msgout); + ms->msgphase = msg_none; + break; + } + udelay(1); + } + break; + case dataing: + if (ms->dma_count != 0) { + start_phase(ms); + return; + } + /* + * We can get a phase mismatch here if the target + * changes to the status phase, even though we have + * had a command complete interrupt. Then, if we + * issue the SEQ_STATUS command, we'll get a sequence + * error interrupt. Which isn't so bad except that + * occasionally the mesh actually executes the + * SEQ_STATUS *as well as* giving us the sequence + * error and phase mismatch exception. + */ + out_8(&mr->sequence, 0); + out_8(&mr->interrupt, + INT_ERROR | INT_EXCEPTION | INT_CMDDONE); + halt_dma(ms); + break; + case statusing: + if (cmd) { + cmd->SCp.Status = mr->fifo; + if (DEBUG_TARGET(cmd)) + printk(KERN_DEBUG "mesh: status is %x\n", + cmd->SCp.Status); + } + ms->msgphase = msg_in; + break; + case busfreeing: + mesh_done(ms, 1); + return; + case disconnecting: + ms->current_req = 0; + ms->phase = idle; + mesh_start(ms); + return; + default: + break; + } + ++ms->phase; + start_phase(ms); + break; + } } -static void dlog(struct mesh_state *ms, char *fmt, int a) + +/* + * Called by midlayer with host locked to queue a new + * request + */ +static int mesh_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) { - struct mesh_target *tp = &ms->tgts[ms->conn_tgt]; - struct dbglog *tlp, *slp; + struct mesh_state *ms; - tlp = &tp->log[tp->log_ix]; - slp = &ms->log[ms->log_ix]; - tlp->fmt = fmt; - tlp->tb = readtb(); - tlp->phase = (ms->msgphase << 4) + ms->phase; - tlp->bs0 = ms->mesh->bus_status0; - tlp->bs1 = ms->mesh->bus_status1; - tlp->tgt = ms->conn_tgt; - tlp->d = a; - *slp = *tlp; - if (++tp->log_ix >= N_DBG_LOG) - tp->log_ix = 0; - if (tp->n_log < N_DBG_LOG) - ++tp->n_log; - if (++ms->log_ix >= N_DBG_SLOG) - ms->log_ix = 0; - if (ms->n_log < N_DBG_SLOG) - ++ms->n_log; + cmd->scsi_done = done; + cmd->host_scribble = NULL; + + ms = (struct mesh_state *) cmd->device->host->hostdata; + + if (ms->request_q == NULL) + ms->request_q = cmd; + else + ms->request_qtail->host_scribble = (void *) cmd; + ms->request_qtail = cmd; + + if (ms->phase == idle) + mesh_start(ms); + + return 0; } -static void dumplog(struct mesh_state *ms, int t) +/* + * Called to handle interrupts, either call by the interrupt + * handler (do_mesh_interrupt) or by other functions in + * exceptional circumstances + */ +static void mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs) { - struct mesh_target *tp = &ms->tgts[t]; - struct dbglog *lp; - int i; + struct mesh_state *ms = (struct mesh_state *) dev_id; + volatile struct mesh_regs *mr = ms->mesh; + int intr; - if (tp->n_log == 0) - return; - i = tp->log_ix - tp->n_log; - if (i < 0) - i += N_DBG_LOG; - tp->n_log = 0; - do { - lp = &tp->log[i]; - printk(KERN_DEBUG "mesh log %d: bs=%.2x%.2x ph=%.2x ", - t, lp->bs1, lp->bs0, lp->phase); -#ifdef DBG_USE_TB - printk("tb=%10u ", lp->tb); +#if 0 + if (ALLOW_DEBUG(ms->conn_tgt)) + printk(KERN_DEBUG "mesh_intr, bs0=%x int=%x exc=%x err=%x " + "phase=%d msgphase=%d\n", mr->bus_status0, + mr->interrupt, mr->exception, mr->error, + ms->phase, ms->msgphase); #endif - printk(lp->fmt, lp->d); - printk("\n"); - if (++i >= N_DBG_LOG) - i = 0; - } while (i != tp->log_ix); + while ((intr = in_8(&mr->interrupt)) != 0) { + dlog(ms, "interrupt intr/err/exc/seq=%.8x", + MKWORD(intr, mr->error, mr->exception, mr->sequence)); + if (intr & INT_ERROR) { + handle_error(ms); + } else if (intr & INT_EXCEPTION) { + handle_exception(ms); + } else if (intr & INT_CMDDONE) { + out_8(&mr->interrupt, INT_CMDDONE); + cmd_complete(ms); + } + } } -static void dumpslog(struct mesh_state *ms) +/* Todo: here we can at least try to remove the command from the + * queue if it isn't connected yet, and for pending command, assert + * ATN until the bus gets freed. + */ +static int mesh_abort(Scsi_Cmnd *cmd) { - struct dbglog *lp; - int i; + struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata; - if (ms->n_log == 0) + printk(KERN_DEBUG "mesh_abort(%p)\n", cmd); + mesh_dump_regs(ms); + dumplog(ms, cmd->device->id); + dumpslog(ms); + return SCSI_ABORT_SNOOZE; +} + +/* + * Called by the midlayer with the lock held to reset the + * SCSI host and bus. + * The midlayer will wait for devices to come back, we don't need + * to do that ourselves + */ +static int mesh_host_reset(Scsi_Cmnd *cmd) +{ + struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata; + volatile struct mesh_regs *mr = ms->mesh; + volatile struct dbdma_regs *md = ms->dma; + + printk(KERN_DEBUG "mesh_host_reset\n"); + + /* Reset the controller & dbdma channel */ + out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16); /* stop dma */ + out_8(&mr->exception, 0xff); /* clear all exception bits */ + out_8(&mr->error, 0xff); /* clear all error bits */ + out_8(&mr->sequence, SEQ_RESETMESH); + mesh_flush_io(mr); + udelay(1); + out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); + out_8(&mr->source_id, ms->host->this_id); + out_8(&mr->sel_timeout, 25); /* 250ms */ + out_8(&mr->sync_params, ASYNC_PARAMS); + + /* Reset the bus */ + out_8(&mr->bus_status1, BS1_RST); /* assert RST */ + mesh_flush_io(mr); + udelay(30); /* leave it on for >= 25us */ + out_8(&mr->bus_status1, 0); /* negate RST */ + + /* Complete pending commands */ + handle_reset(ms); + + return SUCCESS; +} + +static void set_mesh_power(struct mesh_state *ms, int state) +{ + if (_machine != _MACH_Pmac) return; - i = ms->log_ix - ms->n_log; - if (i < 0) - i += N_DBG_SLOG; - ms->n_log = 0; - do { - lp = &ms->log[i]; - printk(KERN_DEBUG "mesh log: bs=%.2x%.2x ph=%.2x t%d ", - lp->bs1, lp->bs0, lp->phase, lp->tgt); -#ifdef DBG_USE_TB - printk("tb=%10u ", lp->tb); -#endif - printk(lp->fmt, lp->d); - printk("\n"); - if (++i >= N_DBG_SLOG) - i = 0; - } while (i != ms->log_ix); + if (state) { + pmac_call_feature(PMAC_FTR_MESH_ENABLE, macio_get_of_node(ms->mdev), 0, 1); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/5); + } else { + pmac_call_feature(PMAC_FTR_MESH_ENABLE, macio_get_of_node(ms->mdev), 0, 0); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/100); + } +} + + +#ifdef CONFIG_PM +static int mesh_suspend(struct macio_dev *mdev, u32 state) +{ + struct mesh_state *ms = (struct mesh_state *)macio_get_drvdata(mdev); + unsigned long flags; + + if (state == mdev->ofdev.dev.power_state || state < 2) + return 0; + + scsi_block_requests(ms->host); + spin_lock_irqsave(ms->host->host_lock, flags); + while(ms->phase != idle) { + spin_unlock_irqrestore(ms->host->host_lock, flags); + current->state = TASK_UNINTERRUPTIBLE; + schedule_timeout(HZ/100); + spin_lock_irqsave(ms->host->host_lock, flags); + } + ms->phase = sleeping; + spin_unlock_irqrestore(ms->host->host_lock, flags); + disable_irq(ms->meshintr); + set_mesh_power(ms, 0); + + mdev->ofdev.dev.power_state = state; + + return 0; } -#endif /* MESH_DBG */ -static Scsi_Host_Template driver_template = { +static int mesh_resume(struct macio_dev *mdev) +{ + struct mesh_state *ms = (struct mesh_state *)macio_get_drvdata(mdev); + unsigned long flags; + + if (mdev->ofdev.dev.power_state == 0) + return 0; + + set_mesh_power(ms, 1); + mesh_init(ms); + spin_lock_irqsave(ms->host->host_lock, flags); + mesh_start(ms); + spin_unlock_irqrestore(ms->host->host_lock, flags); + enable_irq(ms->meshintr); + scsi_unblock_requests(ms->host); + + mdev->ofdev.dev.power_state = 0; + + return 0; +} + +#endif /* CONFIG_PM */ + +/* + * If we leave drives set for synchronous transfers (especially + * CDROMs), and reboot to MacOS, it gets confused, poor thing. + * So, on reboot we reset the SCSI bus. + */ +static int mesh_shutdown(struct macio_dev *mdev) +{ + struct mesh_state *ms = (struct mesh_state *)macio_get_drvdata(mdev); + volatile struct mesh_regs *mr; + unsigned long flags; + + printk(KERN_INFO "resetting MESH scsi bus(es)\n"); + spin_lock_irqsave(ms->host->host_lock, flags); + mr = ms->mesh; + out_8(&mr->intr_mask, 0); + out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE); + out_8(&mr->bus_status1, BS1_RST); + mesh_flush_io(mr); + udelay(30); + out_8(&mr->bus_status1, 0); + spin_unlock_irqrestore(ms->host->host_lock, flags); + + return 0; +} + +static Scsi_Host_Template mesh_template = { .proc_name = "mesh", .name = "MESH", - .detect = mesh_detect, - .release = mesh_release, .queuecommand = mesh_queue, .eh_abort_handler = mesh_abort, .eh_host_reset_handler = mesh_host_reset, @@ -2057,4 +1845,222 @@ .use_clustering = DISABLE_CLUSTERING, }; -#include "scsi_module.c" +static int mesh_probe(struct macio_dev *mdev, const struct of_match *match) +{ + struct device_node *mesh = macio_get_of_node(mdev); + struct pci_dev* pdev = macio_get_pci_dev(mdev); + int tgt, *cfp, minper; + struct mesh_state *ms; + struct Scsi_Host *mesh_host; + void *dma_cmd_space; + dma_addr_t dma_cmd_bus; + + switch (mdev->bus->chip->type) { + case macio_heathrow: + case macio_gatwick: + case macio_paddington: + use_active_neg = 0; + break; + default: + use_active_neg = SEQ_ACTIVE_NEG; + } + + if (macio_resource_count(mdev) != 2 || macio_irq_count(mdev) != 2) { + printk(KERN_ERR "mesh: expected 2 addrs and 2 intrs" + " (got %d,%d)\n", mesh->n_addrs, mesh->n_intrs); + return -ENODEV; + } + + if (macio_request_resources(mdev, "mesh") != 0) { + printk(KERN_ERR "mesh: unable to request memory resources"); + return -EBUSY; + } + mesh_host = scsi_host_alloc(&mesh_template, sizeof(struct mesh_state)); + if (mesh_host == NULL) { + printk(KERN_ERR "mesh: couldn't register host"); + goto out_release; + } + + /* Old junk for root discovery, that will die ultimately */ +#if !defined(MODULE) + note_scsi_host(mesh, mesh_host); +#endif + + mesh_host->base = macio_resource_start(mdev, 0); + mesh_host->irq = macio_irq(mdev, 0); + ms = (struct mesh_state *) mesh_host->hostdata; + macio_set_drvdata(mdev, ms); + ms->host = mesh_host; + ms->mdev = mdev; + ms->pdev = pdev; + + ms->mesh = (volatile struct mesh_regs *) + ioremap(macio_resource_start(mdev, 0), 0x1000); + if (ms->mesh == NULL) { + printk(KERN_ERR "mesh: can't map registers\n"); + goto out_free; + } + ms->dma = (volatile struct dbdma_regs *) + ioremap(macio_resource_start(mdev, 1), 0x1000); + if (ms->dma == NULL) { + printk(KERN_ERR "mesh: can't map registers\n"); + iounmap((void *)ms->mesh); + goto out_free; + } + + ms->meshintr = macio_irq(mdev, 0); + ms->dmaintr = macio_irq(mdev, 1); + + /* Space for dma command list: +1 for stop command, + * +1 to allow for aligning. + */ + ms->dma_cmd_size = (mesh_host->sg_tablesize + 2) * sizeof(struct dbdma_cmd); + + /* We use the PCI APIs for now until the generic one gets fixed + * enough or until we get some macio-specific versions + */ + dma_cmd_space = pci_alloc_consistent(macio_get_pci_dev(mdev), + ms->dma_cmd_size, + &dma_cmd_bus); + if (dma_cmd_space == NULL) { + printk(KERN_ERR "mesh: can't allocate DMA table\n"); + goto out_unmap; + } + memset(dma_cmd_space, 0, ms->dma_cmd_size); + + ms->dma_cmds = (struct dbdma_cmd *) DBDMA_ALIGN(dma_cmd_space); + ms->dma_cmd_space = dma_cmd_space; + ms->dma_cmd_bus = dma_cmd_bus + ((unsigned long)ms->dma_cmds) + - (unsigned long)dma_cmd_space; + ms->current_req = NULL; + for (tgt = 0; tgt < 8; ++tgt) { + ms->tgts[tgt].sdtr_state = do_sdtr; + ms->tgts[tgt].sync_params = ASYNC_PARAMS; + ms->tgts[tgt].current_req = 0; + } + + if ((cfp = (int *) get_property(mesh, "clock-frequency", NULL))) + ms->clk_freq = *cfp; + else { + printk(KERN_INFO "mesh: assuming 50MHz clock frequency\n"); + ms->clk_freq = 50000000; + } + + /* The maximum sync rate is clock / 5; increase + * mesh_sync_period if necessary. + */ + minper = 1000000000 / (ms->clk_freq / 5); /* ns */ + if (mesh_sync_period < minper) + mesh_sync_period = minper; + + /* Power up the chip */ + set_mesh_power(ms, 1); + + /* Set it up */ + mesh_init(ms); + + /* XXX FIXME: error should be fatal */ + if (request_irq(ms->meshintr, do_mesh_interrupt, 0, "MESH", ms)) + printk(KERN_ERR "MESH: can't get irq %d\n", ms->meshintr); + + /* XXX FIXME: handle failure */ + scsi_add_host(mesh_host, &mdev->ofdev.dev); + scsi_scan_host(mesh_host); + + return 0; + +out_unmap: + iounmap((void *)ms->dma); + iounmap((void *)ms->mesh); +out_free: + scsi_host_put(mesh_host); +out_release: + macio_release_resources(mdev); + + return -ENODEV; +} + +static int mesh_remove(struct macio_dev *mdev) +{ + struct mesh_state *ms = (struct mesh_state *)macio_get_drvdata(mdev); + struct Scsi_Host *mesh_host = ms->host; + + scsi_remove_host(mesh_host); + + free_irq(ms->meshintr, ms); + + /* Reset scsi bus */ + mesh_shutdown(mdev); + + /* Shut down chip & termination */ + set_mesh_power(ms, 0); + + /* Unmap registers & dma controller */ + iounmap((void *) ms->mesh); + iounmap((void *) ms->dma); + + /* Free DMA commands memory */ + pci_free_consistent(macio_get_pci_dev(mdev), ms->dma_cmd_size, + ms->dma_cmd_space, ms->dma_cmd_bus); + + /* Release memory resources */ + macio_release_resources(mdev); + + scsi_host_put(mesh_host); + + return 0; +} + + +static struct of_match mesh_match[] = +{ + { + .name = "mesh", + .type = OF_ANY_MATCH, + .compatible = OF_ANY_MATCH + }, + { + .name = OF_ANY_MATCH, + .type = "scsi", + .compatible = "chrp,mesh0" + }, + {}, +}; + +static struct macio_driver mesh_driver = +{ + .name = "mesh", + .match_table = mesh_match, + .probe = mesh_probe, + .remove = mesh_remove, + .shutdown = mesh_shutdown, +#ifdef CONFIG_PM + .suspend = mesh_suspend, + .resume = mesh_resume, +#endif +}; + + +static int __init init_mesh(void) +{ + + /* Calculate sync rate from module parameters */ + if (sync_rate > 10) + sync_rate = 10; + if (sync_rate > 0) { + printk(KERN_INFO "mesh: configured for synchronous %d MB/s\n", sync_rate); + mesh_sync_period = 1000 / sync_rate; /* ns */ + mesh_sync_offset = 15; + } else + printk(KERN_INFO "mesh: configured for asynchronous\n"); + + return macio_register_driver(&mesh_driver); +} + +static void __exit exit_mesh(void) +{ + return macio_unregister_driver(&mesh_driver); +} + +module_init(init_mesh); +module_exit(exit_mesh); diff -Nru a/drivers/scsi/osst.c b/drivers/scsi/osst.c --- a/drivers/scsi/osst.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/osst.c Tue Feb 17 20:00:06 2004 @@ -5106,6 +5106,8 @@ if (need_dma) priority |= GFP_DMA; + priority |= __GFP_NOWARN; + /* Try to allocate the first segment up to OS_DATA_SIZE and the others big enough to reach the goal (code assumes no segments in place) */ for (b_size = OS_DATA_SIZE, order = OSST_FIRST_ORDER; b_size >= PAGE_SIZE; order--, b_size /= 2) { diff -Nru a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c --- a/drivers/scsi/pcmcia/aha152x_stub.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/pcmcia/aha152x_stub.c Tue Feb 17 20:00:08 2004 @@ -78,7 +78,7 @@ static int host_id = 7; static int reconnect = 1; static int parity = 1; -static int synchronous = 0; +static int synchronous = 1; static int reset_delay = 100; static int ext_trans = 0; @@ -244,9 +244,6 @@ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); - /* A bad hack... */ - release_region(link->io.BasePort1, link->io.NumPorts1); - /* Set configuration options for the aha152x driver */ memset(&s, 0, sizeof(s)); s.conf = "PCMCIA setup"; @@ -266,9 +263,6 @@ goto cs_failed; } - scsi_add_host(host, NULL); /* XXX handle failure */ - scsi_scan_host(host); - sprintf(info->node.dev_name, "scsi%d", host->host_no); link->dev = &info->node; info->host = host; @@ -286,7 +280,7 @@ { scsi_info_t *info = link->priv; - scsi_remove_host(info->host); + aha152x_release(info->host); link->dev = NULL; pcmcia_release_configuration(link->handle); @@ -294,7 +288,6 @@ pcmcia_release_irq(link->handle, &link->irq); link->state &= ~DEV_CONFIG; - scsi_unregister(info->host); } static int aha152x_event(event_t event, int priority, diff -Nru a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c --- a/drivers/scsi/ppa.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/ppa.c Tue Feb 17 20:00:07 2004 @@ -11,238 +11,100 @@ */ #include - -/* The following #define is to avoid a clash with hosts.c */ -#define PPA_CODE 1 - +#include +#include +#include #include #include #include #include #include "scsi.h" #include "hosts.h" -int ppa_release(struct Scsi_Host *); static void ppa_reset_pulse(unsigned int base); typedef struct { - struct pardevice *dev; /* Parport device entry */ - int base; /* Actual port address */ - int mode; /* Transfer mode */ - int host; /* Host number (for proc) */ - Scsi_Cmnd *cur_cmd; /* Current queued command */ - struct work_struct ppa_tq; /* Polling interrupt stuff */ - unsigned long jstart; /* Jiffies at start */ - unsigned long recon_tmo; /* How many usecs to wait for reconnection (6th bit) */ - unsigned int failed:1; /* Failure flag */ - unsigned int p_busy:1; /* Parport sharing busy flag */ + struct pardevice *dev; /* Parport device entry */ + int base; /* Actual port address */ + int mode; /* Transfer mode */ + Scsi_Cmnd *cur_cmd; /* Current queued command */ + struct work_struct ppa_tq; /* Polling interrupt stuff */ + unsigned long jstart; /* Jiffies at start */ + unsigned long recon_tmo; /* How many usecs to wait for reconnection (6th bit) */ + unsigned int failed:1; /* Failure flag */ + unsigned wanted:1; /* Parport sharing busy flag */ + wait_queue_head_t *waiting; + struct Scsi_Host *host; + struct list_head list; } ppa_struct; -#define PPA_EMPTY \ -{ .base = -1, \ - .mode = PPA_AUTODETECT, \ - .host = -1, \ - .ppa_tq = { .func = ppa_interrupt }, \ - .recon_tmo = PPA_RECON_TMO, \ -} - #include "ppa.h" -#define NO_HOSTS 4 -static ppa_struct ppa_hosts[NO_HOSTS] = -{PPA_EMPTY, PPA_EMPTY, PPA_EMPTY, PPA_EMPTY}; +static inline ppa_struct *ppa_dev(struct Scsi_Host *host) +{ + return *(ppa_struct **)&host->hostdata; +} -#define PPA_BASE(x) ppa_hosts[(x)].base +static spinlock_t arbitration_lock = SPIN_LOCK_UNLOCKED; -void ppa_wakeup(void *ref) +static void got_it(ppa_struct *dev) { - ppa_struct *ppa_dev = (ppa_struct *) ref; + dev->base = dev->dev->port->base; + if (dev->cur_cmd) + dev->cur_cmd->SCp.phase = 1; + else + wake_up(dev->waiting); +} - if (!ppa_dev->p_busy) - return; +static void ppa_wakeup(void *ref) +{ + ppa_struct *dev = (ppa_struct *) ref; + unsigned long flags; - if (parport_claim(ppa_dev->dev)) { - printk("ppa: bug in ppa_wakeup\n"); + spin_lock_irqsave(&arbitration_lock, flags); + if (dev->wanted) { + parport_claim(dev->dev); + got_it(dev); + dev->wanted = 0; + } + spin_unlock_irqrestore(&arbitration_lock, flags); return; - } - ppa_dev->p_busy = 0; - ppa_dev->base = ppa_dev->dev->port->base; - if (ppa_dev->cur_cmd) - ppa_dev->cur_cmd->SCp.phase++; - return; } -int ppa_release(struct Scsi_Host *host) +static int ppa_pb_claim(ppa_struct *dev) { - int host_no = host->unique_id; - - printk("Releasing ppa%i\n", host_no); - scsi_unregister(host); - parport_unregister_device(ppa_hosts[host_no].dev); - return 0; + unsigned long flags; + int res = 1; + spin_lock_irqsave(&arbitration_lock, flags); + if (parport_claim(dev->dev) == 0) { + got_it(dev); + res = 0; + } + dev->wanted = res; + spin_unlock_irqrestore(&arbitration_lock, flags); + return res; } -static int ppa_pb_claim(int host_no) +static void ppa_pb_dismiss(ppa_struct *dev) { - if (parport_claim(ppa_hosts[host_no].dev)) { - ppa_hosts[host_no].p_busy = 1; - return 1; - } - if (ppa_hosts[host_no].cur_cmd) - ppa_hosts[host_no].cur_cmd->SCp.phase++; - return 0; + unsigned long flags; + int wanted; + spin_lock_irqsave(&arbitration_lock, flags); + wanted = dev->wanted; + dev->wanted = 0; + spin_unlock_irqrestore(&arbitration_lock, flags); + if (!wanted) + parport_release(dev->dev); } -#define ppa_pb_release(x) parport_release(ppa_hosts[(x)].dev) - -/*************************************************************************** - * Parallel port probing routines * - ***************************************************************************/ - -static Scsi_Host_Template driver_template = { - .proc_name = "ppa", - .proc_info = ppa_proc_info, - .name = "Iomega VPI0 (ppa) interface", - .detect = ppa_detect, - .release = ppa_release, - .queuecommand = ppa_queuecommand, - .eh_abort_handler = ppa_abort, - .eh_bus_reset_handler = ppa_reset, - .eh_host_reset_handler = ppa_reset, - .bios_param = ppa_biosparam, - .this_id = -1, - .sg_tablesize = SG_ALL, - .cmd_per_lun = 1, - .use_clustering = ENABLE_CLUSTERING, -}; -#include "scsi_module.c" +static inline void ppa_pb_release(ppa_struct *dev) +{ + parport_release(dev->dev); +} /* * Start of Chipset kludges */ -int ppa_detect(Scsi_Host_Template * host) -{ - struct Scsi_Host *hreg = NULL; - int ports; - int i, nhosts, try_again; - struct parport *pb; - - /* - * unlock to allow the lowlevel parport driver to probe - * the irqs - */ - pb = parport_enumerate(); - - printk("ppa: Version %s\n", PPA_VERSION); - nhosts = 0; - try_again = 0; - - if (!pb) { - printk("ppa: parport reports no devices.\n"); - return 0; - } - retry_entry: - for (i = 0; pb; i++, pb = pb->next) { - int modes, ppb, ppb_hi; - - ppa_hosts[i].dev = - parport_register_device(pb, "ppa", NULL, ppa_wakeup, - NULL, 0, (void *) &ppa_hosts[i]); - - if (!ppa_hosts[i].dev) - continue; - - /* Claim the bus so it remembers what we do to the control - * registers. [ CTR and ECP ] - */ - if (ppa_pb_claim(i)) { - unsigned long now = jiffies; - while (ppa_hosts[i].p_busy) { - schedule(); /* We are safe to schedule here */ - if (time_after(jiffies, now + 3 * HZ)) { - printk(KERN_ERR "ppa%d: failed to claim parport because a " - "pardevice is owning the port for too longtime!\n", - i); - parport_unregister_device(ppa_hosts[i].dev); - spin_lock_irq(ppa_hosts[i].cur_cmd->device->host->host_lock); - return 0; - } - } - } - ppb = PPA_BASE(i) = ppa_hosts[i].dev->port->base; - ppb_hi = ppa_hosts[i].dev->port->base_hi; - w_ctr(ppb, 0x0c); - modes = ppa_hosts[i].dev->port->modes; - - /* Mode detection works up the chain of speed - * This avoids a nasty if-then-else-if-... tree - */ - ppa_hosts[i].mode = PPA_NIBBLE; - - if (modes & PARPORT_MODE_TRISTATE) - ppa_hosts[i].mode = PPA_PS2; - - if (modes & PARPORT_MODE_ECP) { - w_ecr(ppb_hi, 0x20); - ppa_hosts[i].mode = PPA_PS2; - } - if ((modes & PARPORT_MODE_EPP) && (modes & PARPORT_MODE_ECP)) - w_ecr(ppb_hi, 0x80); - - /* Done configuration */ - ppa_pb_release(i); - - if (ppa_init(i)) { - parport_unregister_device(ppa_hosts[i].dev); - continue; - } - /* now the glue ... */ - switch (ppa_hosts[i].mode) { - case PPA_NIBBLE: - ports = 3; - break; - case PPA_PS2: - ports = 3; - break; - case PPA_EPP_8: - case PPA_EPP_16: - case PPA_EPP_32: - ports = 8; - break; - default: /* Never gets here */ - continue; - } - - INIT_WORK(&ppa_hosts[i].ppa_tq, ppa_interrupt, &ppa_hosts[i]); - - host->can_queue = PPA_CAN_QUEUE; - host->sg_tablesize = ppa_sg; - hreg = scsi_register(host, 0); - if(hreg == NULL) - continue; - hreg->io_port = pb->base; - hreg->n_io_port = ports; - hreg->dma_channel = -1; - hreg->unique_id = i; - ppa_hosts[i].host = hreg->host_no; - nhosts++; - } - if (nhosts == 0) { - if (try_again == 1) { - printk("WARNING - no ppa compatible devices found.\n"); - printk(" As of 31/Aug/1998 Iomega started shipping parallel\n"); - printk(" port ZIP drives with a different interface which is\n"); - printk(" supported by the imm (ZIP Plus) driver. If the\n"); - printk(" cable is marked with \"AutoDetect\", this is what has\n"); - printk(" happened.\n"); - return 0; - } - try_again = 1; - goto retry_entry; - } else - return 1; /* return number of hosts detected */ -} - /* This is to give the ppa driver a way to modify the timings (and other * parameters) by writing to the /proc/scsi/ppa/0 file. * Very simple method really... (To simple, no error checking :( ) @@ -251,71 +113,71 @@ * Also gives a method to use a script to obtain optimum timings (TODO) */ -static inline int ppa_proc_write(int hostno, char *buffer, int length) +static inline int ppa_proc_write(ppa_struct *dev, char *buffer, int length) { - unsigned long x; + unsigned long x; + + if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { + x = simple_strtoul(buffer + 5, NULL, 0); + dev->mode = x; + return length; + } + if ((length > 10) && (strncmp(buffer, "recon_tmo=", 10) == 0)) { + x = simple_strtoul(buffer + 10, NULL, 0); + dev->recon_tmo = x; + printk("ppa: recon_tmo set to %ld\n", x); + return length; + } + printk("ppa /proc: invalid variable\n"); + return (-EINVAL); +} - if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { - x = simple_strtoul(buffer + 5, NULL, 0); - ppa_hosts[hostno].mode = x; - return length; - } - if ((length > 10) && (strncmp(buffer, "recon_tmo=", 10) == 0)) { - x = simple_strtoul(buffer + 10, NULL, 0); - ppa_hosts[hostno].recon_tmo = x; - printk("ppa: recon_tmo set to %ld\n", x); - return length; - } - printk("ppa /proc: invalid variable\n"); - return (-EINVAL); -} - -int ppa_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, - int length, int inout) -{ - int i; - int len = 0; - - for (i = 0; i < 4; i++) - if (ppa_hosts[i].host == host->host_no) - break; - - if (inout) - return ppa_proc_write(i, buffer, length); - - len += sprintf(buffer + len, "Version : %s\n", PPA_VERSION); - len += sprintf(buffer + len, "Parport : %s\n", ppa_hosts[i].dev->port->name); - len += sprintf(buffer + len, "Mode : %s\n", PPA_MODE_STRING[ppa_hosts[i].mode]); +static int ppa_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) +{ + int len = 0; + ppa_struct *dev = ppa_dev(host); + + if (inout) + return ppa_proc_write(dev, buffer, length); + + len += sprintf(buffer + len, "Version : %s\n", PPA_VERSION); + len += + sprintf(buffer + len, "Parport : %s\n", + dev->dev->port->name); + len += + sprintf(buffer + len, "Mode : %s\n", + PPA_MODE_STRING[dev->mode]); #if PPA_DEBUG > 0 - len += sprintf(buffer + len, "recon_tmo : %lu\n", ppa_hosts[i].recon_tmo); + len += + sprintf(buffer + len, "recon_tmo : %lu\n", dev->recon_tmo); #endif - /* Request for beyond end of buffer */ - if (offset > length) - return 0; - - *start = buffer + offset; - len -= offset; - if (len > length) - len = length; - return len; + /* Request for beyond end of buffer */ + if (offset > length) + return 0; + + *start = buffer + offset; + len -= offset; + if (len > length) + len = length; + return len; } -static int device_check(int host_no); +static int device_check(ppa_struct *dev); #if PPA_DEBUG > 0 #define ppa_fail(x,y) printk("ppa: ppa_fail(%i) from %s at line %d\n",\ y, __FUNCTION__, __LINE__); ppa_fail_func(x,y); -static inline void ppa_fail_func(int host_no, int error_code) +static inline void ppa_fail_func(ppa_struct *dev, int error_code) #else -static inline void ppa_fail(int host_no, int error_code) +static inline void ppa_fail(ppa_struct *dev, int error_code) #endif { - /* If we fail a device then we trash status / message bytes */ - if (ppa_hosts[host_no].cur_cmd) { - ppa_hosts[host_no].cur_cmd->result = error_code << 16; - ppa_hosts[host_no].failed = 1; - } + /* If we fail a device then we trash status / message bytes */ + if (dev->cur_cmd) { + dev->cur_cmd->result = error_code << 16; + dev->failed = 1; + } } /* @@ -325,33 +187,33 @@ * doesn't appear to be designed to support interrupts. We spin on * the 0x80 ready bit. */ -static unsigned char ppa_wait(int host_no) +static unsigned char ppa_wait(ppa_struct *dev) { - int k; - unsigned short ppb = PPA_BASE(host_no); - unsigned char r; - - k = PPA_SPIN_TMO; - /* Wait for bit 6 and 7 - PJC */ - for (r = r_str (ppb); ((r & 0xc0)!=0xc0) && (k); k--) { - udelay (1); - r = r_str (ppb); - } - - /* - * return some status information. - * Semantics: 0xc0 = ZIP wants more data - * 0xd0 = ZIP wants to send more data - * 0xe0 = ZIP is expecting SCSI command data - * 0xf0 = end of transfer, ZIP is sending status - */ - if (k) - return (r & 0xf0); - - /* Counter expired - Time out occurred */ - ppa_fail(host_no, DID_TIME_OUT); - printk("ppa timeout in ppa_wait\n"); - return 0; /* command timed out */ + int k; + unsigned short ppb = dev->base; + unsigned char r; + + k = PPA_SPIN_TMO; + /* Wait for bit 6 and 7 - PJC */ + for (r = r_str(ppb); ((r & 0xc0) != 0xc0) && (k); k--) { + udelay(1); + r = r_str(ppb); + } + + /* + * return some status information. + * Semantics: 0xc0 = ZIP wants more data + * 0xd0 = ZIP wants to send more data + * 0xe0 = ZIP is expecting SCSI command data + * 0xf0 = end of transfer, ZIP is sending status + */ + if (k) + return (r & 0xf0); + + /* Counter expired - Time out occurred */ + ppa_fail(dev, DID_TIME_OUT); + printk("ppa timeout in ppa_wait\n"); + return 0; /* command timed out */ } /* @@ -359,245 +221,245 @@ */ static inline void epp_reset(unsigned short ppb) { - int i; + int i; - i = r_str(ppb); - w_str(ppb, i); - w_str(ppb, i & 0xfe); + i = r_str(ppb); + w_str(ppb, i); + w_str(ppb, i & 0xfe); } /* * Wait for empty ECP fifo (if we are in ECP fifo mode only) */ -static inline void ecp_sync(unsigned short hostno) +static inline void ecp_sync(ppa_struct *dev) { - int i, ppb_hi=ppa_hosts[hostno].dev->port->base_hi; + int i, ppb_hi = dev->dev->port->base_hi; - if (ppb_hi == 0) return; + if (ppb_hi == 0) + return; - if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */ - for (i = 0; i < 100; i++) { - if (r_ecr(ppb_hi) & 0x01) - return; - udelay(5); - } - printk("ppa: ECP sync failed as data still present in FIFO.\n"); - } + if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */ + for (i = 0; i < 100; i++) { + if (r_ecr(ppb_hi) & 0x01) + return; + udelay(5); + } + printk("ppa: ECP sync failed as data still present in FIFO.\n"); + } } static int ppa_byte_out(unsigned short base, const char *buffer, int len) { - int i; + int i; - for (i = len; i; i--) { - w_dtr(base, *buffer++); - w_ctr(base, 0xe); - w_ctr(base, 0xc); - } - return 1; /* All went well - we hope! */ + for (i = len; i; i--) { + w_dtr(base, *buffer++); + w_ctr(base, 0xe); + w_ctr(base, 0xc); + } + return 1; /* All went well - we hope! */ } static int ppa_byte_in(unsigned short base, char *buffer, int len) { - int i; + int i; - for (i = len; i; i--) { - *buffer++ = r_dtr(base); - w_ctr(base, 0x27); - w_ctr(base, 0x25); - } - return 1; /* All went well - we hope! */ + for (i = len; i; i--) { + *buffer++ = r_dtr(base); + w_ctr(base, 0x27); + w_ctr(base, 0x25); + } + return 1; /* All went well - we hope! */ } static int ppa_nibble_in(unsigned short base, char *buffer, int len) { - for (; len; len--) { - unsigned char h; + for (; len; len--) { + unsigned char h; - w_ctr(base, 0x4); - h = r_str(base) & 0xf0; - w_ctr(base, 0x6); - *buffer++ = h | ((r_str(base) & 0xf0) >> 4); - } - return 1; /* All went well - we hope! */ + w_ctr(base, 0x4); + h = r_str(base) & 0xf0; + w_ctr(base, 0x6); + *buffer++ = h | ((r_str(base) & 0xf0) >> 4); + } + return 1; /* All went well - we hope! */ } -static int ppa_out(int host_no, char *buffer, int len) +static int ppa_out(ppa_struct *dev, char *buffer, int len) { - int r; - unsigned short ppb = PPA_BASE(host_no); + int r; + unsigned short ppb = dev->base; - r = ppa_wait(host_no); + r = ppa_wait(dev); - if ((r & 0x50) != 0x40) { - ppa_fail(host_no, DID_ERROR); - return 0; - } - switch (ppa_hosts[host_no].mode) { - case PPA_NIBBLE: - case PPA_PS2: - /* 8 bit output, with a loop */ - r = ppa_byte_out(ppb, buffer, len); - break; - - case PPA_EPP_32: - case PPA_EPP_16: - case PPA_EPP_8: - epp_reset(ppb); - w_ctr(ppb, 0x4); + if ((r & 0x50) != 0x40) { + ppa_fail(dev, DID_ERROR); + return 0; + } + switch (dev->mode) { + case PPA_NIBBLE: + case PPA_PS2: + /* 8 bit output, with a loop */ + r = ppa_byte_out(ppb, buffer, len); + break; + + case PPA_EPP_32: + case PPA_EPP_16: + case PPA_EPP_8: + epp_reset(ppb); + w_ctr(ppb, 0x4); #ifdef CONFIG_SCSI_IZIP_EPP16 - if (!(((long) buffer | len) & 0x01)) - outsw(ppb + 4, buffer, len >> 1); + if (!(((long) buffer | len) & 0x01)) + outsw(ppb + 4, buffer, len >> 1); #else - if (!(((long) buffer | len) & 0x03)) - outsl(ppb + 4, buffer, len >> 2); + if (!(((long) buffer | len) & 0x03)) + outsl(ppb + 4, buffer, len >> 2); #endif - else - outsb(ppb + 4, buffer, len); - w_ctr(ppb, 0xc); - r = !(r_str(ppb) & 0x01); - w_ctr(ppb, 0xc); - ecp_sync(host_no); - break; - - default: - printk("PPA: bug in ppa_out()\n"); - r = 0; - } - return r; + else + outsb(ppb + 4, buffer, len); + w_ctr(ppb, 0xc); + r = !(r_str(ppb) & 0x01); + w_ctr(ppb, 0xc); + ecp_sync(dev); + break; + + default: + printk("PPA: bug in ppa_out()\n"); + r = 0; + } + return r; } -static int ppa_in(int host_no, char *buffer, int len) +static int ppa_in(ppa_struct *dev, char *buffer, int len) { - int r; - unsigned short ppb = PPA_BASE(host_no); + int r; + unsigned short ppb = dev->base; - r = ppa_wait(host_no); + r = ppa_wait(dev); - if ((r & 0x50) != 0x50) { - ppa_fail(host_no, DID_ERROR); - return 0; - } - switch (ppa_hosts[host_no].mode) { - case PPA_NIBBLE: - /* 4 bit input, with a loop */ - r = ppa_nibble_in(ppb, buffer, len); - w_ctr(ppb, 0xc); - break; + if ((r & 0x50) != 0x50) { + ppa_fail(dev, DID_ERROR); + return 0; + } + switch (dev->mode) { + case PPA_NIBBLE: + /* 4 bit input, with a loop */ + r = ppa_nibble_in(ppb, buffer, len); + w_ctr(ppb, 0xc); + break; - case PPA_PS2: - /* 8 bit input, with a loop */ - w_ctr(ppb, 0x25); - r = ppa_byte_in(ppb, buffer, len); - w_ctr(ppb, 0x4); - w_ctr(ppb, 0xc); - break; + case PPA_PS2: + /* 8 bit input, with a loop */ + w_ctr(ppb, 0x25); + r = ppa_byte_in(ppb, buffer, len); + w_ctr(ppb, 0x4); + w_ctr(ppb, 0xc); + break; - case PPA_EPP_32: - case PPA_EPP_16: - case PPA_EPP_8: - epp_reset(ppb); - w_ctr(ppb, 0x24); + case PPA_EPP_32: + case PPA_EPP_16: + case PPA_EPP_8: + epp_reset(ppb); + w_ctr(ppb, 0x24); #ifdef CONFIG_SCSI_IZIP_EPP16 - if (!(((long) buffer | len) & 0x01)) - insw(ppb + 4, buffer, len >> 1); + if (!(((long) buffer | len) & 0x01)) + insw(ppb + 4, buffer, len >> 1); #else - if (!(((long) buffer | len) & 0x03)) - insl(ppb + 4, buffer, len >> 2); + if (!(((long) buffer | len) & 0x03)) + insl(ppb + 4, buffer, len >> 2); #endif - else - insb(ppb + 4, buffer, len); - w_ctr(ppb, 0x2c); - r = !(r_str(ppb) & 0x01); - w_ctr(ppb, 0x2c); - ecp_sync(host_no); - break; - - default: - printk("PPA: bug in ppa_ins()\n"); - r = 0; - break; - } - return r; + else + insb(ppb + 4, buffer, len); + w_ctr(ppb, 0x2c); + r = !(r_str(ppb) & 0x01); + w_ctr(ppb, 0x2c); + ecp_sync(dev); + break; + + default: + printk("PPA: bug in ppa_ins()\n"); + r = 0; + break; + } + return r; } /* end of ppa_io.h */ static inline void ppa_d_pulse(unsigned short ppb, unsigned char b) { - w_dtr(ppb, b); - w_ctr(ppb, 0xc); - w_ctr(ppb, 0xe); - w_ctr(ppb, 0xc); - w_ctr(ppb, 0x4); - w_ctr(ppb, 0xc); -} - -static void ppa_disconnect(int host_no) -{ - unsigned short ppb = PPA_BASE(host_no); - - ppa_d_pulse(ppb, 0); - ppa_d_pulse(ppb, 0x3c); - ppa_d_pulse(ppb, 0x20); - ppa_d_pulse(ppb, 0xf); + w_dtr(ppb, b); + w_ctr(ppb, 0xc); + w_ctr(ppb, 0xe); + w_ctr(ppb, 0xc); + w_ctr(ppb, 0x4); + w_ctr(ppb, 0xc); +} + +static void ppa_disconnect(ppa_struct *dev) +{ + unsigned short ppb = dev->base; + + ppa_d_pulse(ppb, 0); + ppa_d_pulse(ppb, 0x3c); + ppa_d_pulse(ppb, 0x20); + ppa_d_pulse(ppb, 0xf); } static inline void ppa_c_pulse(unsigned short ppb, unsigned char b) { - w_dtr(ppb, b); - w_ctr(ppb, 0x4); - w_ctr(ppb, 0x6); - w_ctr(ppb, 0x4); - w_ctr(ppb, 0xc); -} - -static inline void ppa_connect(int host_no, int flag) -{ - unsigned short ppb = PPA_BASE(host_no); - - ppa_c_pulse(ppb, 0); - ppa_c_pulse(ppb, 0x3c); - ppa_c_pulse(ppb, 0x20); - if ((flag == CONNECT_EPP_MAYBE) && - IN_EPP_MODE(ppa_hosts[host_no].mode)) - ppa_c_pulse(ppb, 0xcf); - else - ppa_c_pulse(ppb, 0x8f); -} - -static int ppa_select(int host_no, int target) -{ - int k; - unsigned short ppb = PPA_BASE(host_no); - - /* - * Bit 6 (0x40) is the device selected bit. - * First we must wait till the current device goes off line... - */ - k = PPA_SELECT_TMO; - do { - k--; - udelay(1); - } while ((r_str(ppb) & 0x40) && (k)); - if (!k) - return 0; + w_dtr(ppb, b); + w_ctr(ppb, 0x4); + w_ctr(ppb, 0x6); + w_ctr(ppb, 0x4); + w_ctr(ppb, 0xc); +} - w_dtr(ppb, (1 << target)); - w_ctr(ppb, 0xe); - w_ctr(ppb, 0xc); - w_dtr(ppb, 0x80); /* This is NOT the initator */ - w_ctr(ppb, 0x8); - - k = PPA_SELECT_TMO; - do { - k--; - udelay(1); - } - while (!(r_str(ppb) & 0x40) && (k)); - if (!k) - return 0; +static inline void ppa_connect(ppa_struct *dev, int flag) +{ + unsigned short ppb = dev->base; - return 1; + ppa_c_pulse(ppb, 0); + ppa_c_pulse(ppb, 0x3c); + ppa_c_pulse(ppb, 0x20); + if ((flag == CONNECT_EPP_MAYBE) && IN_EPP_MODE(dev->mode)) + ppa_c_pulse(ppb, 0xcf); + else + ppa_c_pulse(ppb, 0x8f); +} + +static int ppa_select(ppa_struct *dev, int target) +{ + int k; + unsigned short ppb = dev->base; + + /* + * Bit 6 (0x40) is the device selected bit. + * First we must wait till the current device goes off line... + */ + k = PPA_SELECT_TMO; + do { + k--; + udelay(1); + } while ((r_str(ppb) & 0x40) && (k)); + if (!k) + return 0; + + w_dtr(ppb, (1 << target)); + w_ctr(ppb, 0xe); + w_ctr(ppb, 0xc); + w_dtr(ppb, 0x80); /* This is NOT the initator */ + w_ctr(ppb, 0x8); + + k = PPA_SELECT_TMO; + do { + k--; + udelay(1); + } + while (!(r_str(ppb) & 0x40) && (k)); + if (!k) + return 0; + + return 1; } /* @@ -609,54 +471,47 @@ * handshaking failed. * */ -static int ppa_init(int host_no) +static int ppa_init(ppa_struct *dev) { - int retv; - unsigned short ppb = PPA_BASE(host_no); - -#if defined(CONFIG_PARPORT) || defined(CONFIG_PARPORT_MODULE) - if (ppa_pb_claim(host_no)) - while (ppa_hosts[host_no].p_busy) - schedule(); /* We can safe schedule here */ -#endif + int retv; + unsigned short ppb = dev->base; - ppa_disconnect(host_no); - ppa_connect(host_no, CONNECT_NORMAL); + ppa_disconnect(dev); + ppa_connect(dev, CONNECT_NORMAL); - retv = 2; /* Failed */ + retv = 2; /* Failed */ - w_ctr(ppb, 0xe); - if ((r_str(ppb) & 0x08) == 0x08) - retv--; + w_ctr(ppb, 0xe); + if ((r_str(ppb) & 0x08) == 0x08) + retv--; - w_ctr(ppb, 0xc); - if ((r_str(ppb) & 0x08) == 0x00) - retv--; + w_ctr(ppb, 0xc); + if ((r_str(ppb) & 0x08) == 0x00) + retv--; - if (!retv) - ppa_reset_pulse(ppb); - udelay(1000); /* Allow devices to settle down */ - ppa_disconnect(host_no); - udelay(1000); /* Another delay to allow devices to settle */ + if (!retv) + ppa_reset_pulse(ppb); + udelay(1000); /* Allow devices to settle down */ + ppa_disconnect(dev); + udelay(1000); /* Another delay to allow devices to settle */ - if (!retv) - retv = device_check(host_no); + if (retv) + return -EIO; - ppa_pb_release(host_no); - return retv; + return device_check(dev); } -static inline int ppa_send_command(Scsi_Cmnd * cmd) +static inline int ppa_send_command(Scsi_Cmnd *cmd) { - int host_no = cmd->device->host->unique_id; - int k; + ppa_struct *dev = ppa_dev(cmd->device->host); + int k; - w_ctr(PPA_BASE(host_no), 0x0c); + w_ctr(dev->base, 0x0c); - for (k = 0; k < cmd->cmd_len; k++) - if (!ppa_out(host_no, &cmd->cmnd[k], 1)) - return 0; - return 1; + for (k = 0; k < cmd->cmd_len; k++) + if (!ppa_out(dev, &cmd->cmnd[k], 1)) + return 0; + return 1; } /* @@ -667,98 +522,100 @@ * The driver appears to remain stable if we speed up the parallel port * i/o in this function, but not elsewhere. */ -static int ppa_completion(Scsi_Cmnd * cmd) +static int ppa_completion(Scsi_Cmnd *cmd) { - /* Return codes: - * -1 Error - * 0 Told to schedule - * 1 Finished data transfer - */ - int host_no = cmd->device->host->unique_id; - unsigned short ppb = PPA_BASE(host_no); - unsigned long start_jiffies = jiffies; - - unsigned char r, v; - int fast, bulk, status; - - v = cmd->cmnd[0]; - bulk = ((v == READ_6) || - (v == READ_10) || - (v == WRITE_6) || - (v == WRITE_10)); - - /* - * We only get here if the drive is ready to comunicate, - * hence no need for a full ppa_wait. - */ - r = (r_str(ppb) & 0xf0); + /* Return codes: + * -1 Error + * 0 Told to schedule + * 1 Finished data transfer + */ + ppa_struct *dev = ppa_dev(cmd->device->host); + unsigned short ppb = dev->base; + unsigned long start_jiffies = jiffies; + + unsigned char r, v; + int fast, bulk, status; + + v = cmd->cmnd[0]; + bulk = ((v == READ_6) || + (v == READ_10) || (v == WRITE_6) || (v == WRITE_10)); - while (r != (unsigned char) 0xf0) { /* - * If we have been running for more than a full timer tick - * then take a rest. + * We only get here if the drive is ready to comunicate, + * hence no need for a full ppa_wait. */ - if (time_after(jiffies, start_jiffies + 1)) - return 0; + r = (r_str(ppb) & 0xf0); - if ((cmd->SCp.this_residual <= 0)) { - ppa_fail(host_no, DID_ERROR); - return -1; /* ERROR_RETURN */ - } - - /* On some hardware we have SCSI disconnected (6th bit low) - * for about 100usecs. It is too expensive to wait a - * tick on every loop so we busy wait for no more than - * 500usecs to give the drive a chance first. We do not - * change things for "normal" hardware since generally - * the 6th bit is always high. - * This makes the CPU load higher on some hardware - * but otherwise we can not get more than 50K/secs - * on this problem hardware. - */ - if ((r & 0xc0) != 0xc0) { - /* Wait for reconnection should be no more than - * jiffy/2 = 5ms = 5000 loops - */ - unsigned long k = ppa_hosts[host_no].recon_tmo; - for (; k && ((r = (r_str(ppb) & 0xf0)) & 0xc0) != 0xc0; k--) - udelay(1); - - if(!k) - return 0; - } - - /* determine if we should use burst I/O */ - fast = (bulk && (cmd->SCp.this_residual >= PPA_BURST_SIZE)) - ? PPA_BURST_SIZE : 1; + while (r != (unsigned char) 0xf0) { + /* + * If we have been running for more than a full timer tick + * then take a rest. + */ + if (time_after(jiffies, start_jiffies + 1)) + return 0; + + if ((cmd->SCp.this_residual <= 0)) { + ppa_fail(dev, DID_ERROR); + return -1; /* ERROR_RETURN */ + } - if (r == (unsigned char) 0xc0) - status = ppa_out(host_no, cmd->SCp.ptr, fast); - else - status = ppa_in(host_no, cmd->SCp.ptr, fast); + /* On some hardware we have SCSI disconnected (6th bit low) + * for about 100usecs. It is too expensive to wait a + * tick on every loop so we busy wait for no more than + * 500usecs to give the drive a chance first. We do not + * change things for "normal" hardware since generally + * the 6th bit is always high. + * This makes the CPU load higher on some hardware + * but otherwise we can not get more than 50K/secs + * on this problem hardware. + */ + if ((r & 0xc0) != 0xc0) { + /* Wait for reconnection should be no more than + * jiffy/2 = 5ms = 5000 loops + */ + unsigned long k = dev->recon_tmo; + for (; k && ((r = (r_str(ppb) & 0xf0)) & 0xc0) != 0xc0; + k--) + udelay(1); - cmd->SCp.ptr += fast; - cmd->SCp.this_residual -= fast; + if (!k) + return 0; + } - if (!status) { - ppa_fail(host_no, DID_BUS_BUSY); - return -1; /* ERROR_RETURN */ - } - if (cmd->SCp.buffer && !cmd->SCp.this_residual) { - /* if scatter/gather, advance to the next segment */ - if (cmd->SCp.buffers_residual--) { - cmd->SCp.buffer++; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; - } + /* determine if we should use burst I/O */ + fast = (bulk && (cmd->SCp.this_residual >= PPA_BURST_SIZE)) + ? PPA_BURST_SIZE : 1; + + if (r == (unsigned char) 0xc0) + status = ppa_out(dev, cmd->SCp.ptr, fast); + else + status = ppa_in(dev, cmd->SCp.ptr, fast); + + cmd->SCp.ptr += fast; + cmd->SCp.this_residual -= fast; + + if (!status) { + ppa_fail(dev, DID_BUS_BUSY); + return -1; /* ERROR_RETURN */ + } + if (cmd->SCp.buffer && !cmd->SCp.this_residual) { + /* if scatter/gather, advance to the next segment */ + if (cmd->SCp.buffers_residual--) { + cmd->SCp.buffer++; + cmd->SCp.this_residual = + cmd->SCp.buffer->length; + cmd->SCp.ptr = + page_address(cmd->SCp.buffer->page) + + cmd->SCp.buffer->offset; + } + } + /* Now check to see if the drive is ready to comunicate */ + r = (r_str(ppb) & 0xf0); + /* If not, drop back down to the scheduler and wait a timer tick */ + if (!(r & 0x80)) + return 0; } - /* Now check to see if the drive is ready to comunicate */ - r = (r_str(ppb) & 0xf0); - /* If not, drop back down to the scheduler and wait a timer tick */ - if (!(r & 0x80)) - return 0; - } - return 1; /* FINISH_RETURN */ + return 1; /* FINISH_RETURN */ } /* @@ -768,203 +625,204 @@ */ static void ppa_interrupt(void *data) { - ppa_struct *tmp = (ppa_struct *) data; - Scsi_Cmnd *cmd = tmp->cur_cmd; - unsigned long flags; + ppa_struct *dev = (ppa_struct *) data; + Scsi_Cmnd *cmd = dev->cur_cmd; - if (!cmd) { - printk("PPA: bug in ppa_interrupt\n"); - return; - } - if (ppa_engine(tmp, cmd)) { - tmp->ppa_tq.data = (void *) tmp; - schedule_delayed_work(&tmp->ppa_tq, 1); - return; - } - /* Command must of completed hence it is safe to let go... */ + if (!cmd) { + printk("PPA: bug in ppa_interrupt\n"); + return; + } + if (ppa_engine(dev, cmd)) { + dev->ppa_tq.data = (void *) dev; + schedule_delayed_work(&dev->ppa_tq, 1); + return; + } + /* Command must of completed hence it is safe to let go... */ #if PPA_DEBUG > 0 - switch ((cmd->result >> 16) & 0xff) { - case DID_OK: - break; - case DID_NO_CONNECT: - printk("ppa: no device at SCSI ID %i\n", cmd->device->target); - break; - case DID_BUS_BUSY: - printk("ppa: BUS BUSY - EPP timeout detected\n"); - break; - case DID_TIME_OUT: - printk("ppa: unknown timeout\n"); - break; - case DID_ABORT: - printk("ppa: told to abort\n"); - break; - case DID_PARITY: - printk("ppa: parity error (???)\n"); - break; - case DID_ERROR: - printk("ppa: internal driver error\n"); - break; - case DID_RESET: - printk("ppa: told to reset device\n"); - break; - case DID_BAD_INTR: - printk("ppa: bad interrupt (???)\n"); - break; - default: - printk("ppa: bad return code (%02x)\n", (cmd->result >> 16) & 0xff); - } + switch ((cmd->result >> 16) & 0xff) { + case DID_OK: + break; + case DID_NO_CONNECT: + printk("ppa: no device at SCSI ID %i\n", cmd->device->target); + break; + case DID_BUS_BUSY: + printk("ppa: BUS BUSY - EPP timeout detected\n"); + break; + case DID_TIME_OUT: + printk("ppa: unknown timeout\n"); + break; + case DID_ABORT: + printk("ppa: told to abort\n"); + break; + case DID_PARITY: + printk("ppa: parity error (???)\n"); + break; + case DID_ERROR: + printk("ppa: internal driver error\n"); + break; + case DID_RESET: + printk("ppa: told to reset device\n"); + break; + case DID_BAD_INTR: + printk("ppa: bad interrupt (???)\n"); + break; + default: + printk("ppa: bad return code (%02x)\n", + (cmd->result >> 16) & 0xff); + } #endif - if (cmd->SCp.phase > 1) - ppa_disconnect(cmd->device->host->unique_id); - if (cmd->SCp.phase > 0) - ppa_pb_release(cmd->device->host->unique_id); - - tmp->cur_cmd = 0; - - spin_lock_irqsave(cmd->device->host->host_lock, flags); - cmd->scsi_done(cmd); - spin_unlock_irqrestore(cmd->device->host->host_lock, flags); - return; -} - -static int ppa_engine(ppa_struct * tmp, Scsi_Cmnd * cmd) -{ - int host_no = cmd->device->host->unique_id; - unsigned short ppb = PPA_BASE(host_no); - unsigned char l = 0, h = 0; - int retv; - - /* First check for any errors that may of occurred - * Here we check for internal errors - */ - if (tmp->failed) - return 0; + if (cmd->SCp.phase > 1) + ppa_disconnect(dev); - switch (cmd->SCp.phase) { - case 0: /* Phase 0 - Waiting for parport */ - if ((jiffies - tmp->jstart) > HZ) { - /* - * We waited more than a second - * for parport to call us - */ - ppa_fail(host_no, DID_BUS_BUSY); - return 0; - } - return 1; /* wait until ppa_wakeup claims parport */ - case 1: /* Phase 1 - Connected */ - { /* Perform a sanity check for cable unplugged */ - int retv = 2; /* Failed */ + ppa_pb_dismiss(dev); - ppa_connect(host_no, CONNECT_EPP_MAYBE); + dev->cur_cmd = 0; - w_ctr(ppb, 0xe); - if ((r_str(ppb) & 0x08) == 0x08) - retv--; + cmd->scsi_done(cmd); +} - w_ctr(ppb, 0xc); - if ((r_str(ppb) & 0x08) == 0x00) - retv--; +static int ppa_engine(ppa_struct *dev, Scsi_Cmnd *cmd) +{ + unsigned short ppb = dev->base; + unsigned char l = 0, h = 0; + int retv; - if (retv) { - if ((jiffies - tmp->jstart) > (1 * HZ)) { - printk("ppa: Parallel port cable is unplugged!!\n"); - ppa_fail(host_no, DID_BUS_BUSY); - return 0; - } else { - ppa_disconnect(host_no); - return 1; /* Try again in a jiffy */ - } - } - cmd->SCp.phase++; - } + /* First check for any errors that may of occurred + * Here we check for internal errors + */ + if (dev->failed) + return 0; - case 2: /* Phase 2 - We are now talking to the scsi bus */ - if (!ppa_select(host_no, cmd->device->id)) { - ppa_fail(host_no, DID_NO_CONNECT); - return 0; - } - cmd->SCp.phase++; + switch (cmd->SCp.phase) { + case 0: /* Phase 0 - Waiting for parport */ + if (time_after(jiffies, dev->jstart + HZ)) { + /* + * We waited more than a second + * for parport to call us + */ + ppa_fail(dev, DID_BUS_BUSY); + return 0; + } + return 1; /* wait until ppa_wakeup claims parport */ + case 1: /* Phase 1 - Connected */ + { /* Perform a sanity check for cable unplugged */ + int retv = 2; /* Failed */ + + ppa_connect(dev, CONNECT_EPP_MAYBE); + + w_ctr(ppb, 0xe); + if ((r_str(ppb) & 0x08) == 0x08) + retv--; + + w_ctr(ppb, 0xc); + if ((r_str(ppb) & 0x08) == 0x00) + retv--; + + if (retv) { + if ((jiffies - dev->jstart) > (1 * HZ)) { + printk + ("ppa: Parallel port cable is unplugged!!\n"); + ppa_fail(dev, DID_BUS_BUSY); + return 0; + } else { + ppa_disconnect(dev); + return 1; /* Try again in a jiffy */ + } + } + cmd->SCp.phase++; + } - case 3: /* Phase 3 - Ready to accept a command */ - w_ctr(ppb, 0x0c); - if (!(r_str(ppb) & 0x80)) - return 1; + case 2: /* Phase 2 - We are now talking to the scsi bus */ + if (!ppa_select(dev, cmd->device->id)) { + ppa_fail(dev, DID_NO_CONNECT); + return 0; + } + cmd->SCp.phase++; - if (!ppa_send_command(cmd)) - return 0; - cmd->SCp.phase++; - - case 4: /* Phase 4 - Setup scatter/gather buffers */ - if (cmd->use_sg) { - /* if many buffers are available, start filling the first */ - cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; - cmd->SCp.this_residual = cmd->SCp.buffer->length; - cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; - } else { - /* else fill the only available buffer */ - cmd->SCp.buffer = NULL; - cmd->SCp.this_residual = cmd->request_bufflen; - cmd->SCp.ptr = cmd->request_buffer; - } - cmd->SCp.buffers_residual = cmd->use_sg - 1; - cmd->SCp.phase++; + case 3: /* Phase 3 - Ready to accept a command */ + w_ctr(ppb, 0x0c); + if (!(r_str(ppb) & 0x80)) + return 1; + + if (!ppa_send_command(cmd)) + return 0; + cmd->SCp.phase++; + + case 4: /* Phase 4 - Setup scatter/gather buffers */ + if (cmd->use_sg) { + /* if many buffers are available, start filling the first */ + cmd->SCp.buffer = + (struct scatterlist *) cmd->request_buffer; + cmd->SCp.this_residual = cmd->SCp.buffer->length; + cmd->SCp.ptr = + page_address(cmd->SCp.buffer->page) + + cmd->SCp.buffer->offset; + } else { + /* else fill the only available buffer */ + cmd->SCp.buffer = NULL; + cmd->SCp.this_residual = cmd->request_bufflen; + cmd->SCp.ptr = cmd->request_buffer; + } + cmd->SCp.buffers_residual = cmd->use_sg - 1; + cmd->SCp.phase++; - case 5: /* Phase 5 - Data transfer stage */ - w_ctr(ppb, 0x0c); - if (!(r_str(ppb) & 0x80)) - return 1; + case 5: /* Phase 5 - Data transfer stage */ + w_ctr(ppb, 0x0c); + if (!(r_str(ppb) & 0x80)) + return 1; + + retv = ppa_completion(cmd); + if (retv == -1) + return 0; + if (retv == 0) + return 1; + cmd->SCp.phase++; + + case 6: /* Phase 6 - Read status/message */ + cmd->result = DID_OK << 16; + /* Check for data overrun */ + if (ppa_wait(dev) != (unsigned char) 0xf0) { + ppa_fail(dev, DID_ERROR); + return 0; + } + if (ppa_in(dev, &l, 1)) { /* read status byte */ + /* Check for optional message byte */ + if (ppa_wait(dev) == (unsigned char) 0xf0) + ppa_in(dev, &h, 1); + cmd->result = + (DID_OK << 16) + (h << 8) + (l & STATUS_MASK); + } + return 0; /* Finished */ + break; - retv = ppa_completion(cmd); - if (retv == -1) - return 0; - if (retv == 0) - return 1; - cmd->SCp.phase++; - - case 6: /* Phase 6 - Read status/message */ - cmd->result = DID_OK << 16; - /* Check for data overrun */ - if (ppa_wait(host_no) != (unsigned char) 0xf0) { - ppa_fail(host_no, DID_ERROR); - return 0; - } - if (ppa_in(host_no, &l, 1)) { /* read status byte */ - /* Check for optional message byte */ - if (ppa_wait(host_no) == (unsigned char) 0xf0) - ppa_in(host_no, &h, 1); - cmd->result = (DID_OK << 16) + (h << 8) + (l & STATUS_MASK); - } - return 0; /* Finished */ - break; - - default: - printk("ppa: Invalid scsi phase\n"); - } - return 0; + default: + printk("ppa: Invalid scsi phase\n"); + } + return 0; } -int ppa_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +static int ppa_queuecommand(Scsi_Cmnd *cmd, void (*done) (Scsi_Cmnd *)) { - int host_no = cmd->device->host->unique_id; + ppa_struct *dev = ppa_dev(cmd->device->host); - if (ppa_hosts[host_no].cur_cmd) { - printk("PPA: bug in ppa_queuecommand\n"); - return 0; - } - ppa_hosts[host_no].failed = 0; - ppa_hosts[host_no].jstart = jiffies; - ppa_hosts[host_no].cur_cmd = cmd; - cmd->scsi_done = done; - cmd->result = DID_ERROR << 16; /* default return code */ - cmd->SCp.phase = 0; /* bus free */ + if (dev->cur_cmd) { + printk("PPA: bug in ppa_queuecommand\n"); + return 0; + } + dev->failed = 0; + dev->jstart = jiffies; + dev->cur_cmd = cmd; + cmd->scsi_done = done; + cmd->result = DID_ERROR << 16; /* default return code */ + cmd->SCp.phase = 0; /* bus free */ - ppa_pb_claim(host_no); + dev->ppa_tq.data = dev; + schedule_work(&dev->ppa_tq); - ppa_hosts[host_no].ppa_tq.data = ppa_hosts + host_no; - schedule_work(&ppa_hosts[host_no].ppa_tq); + ppa_pb_claim(dev); - return 0; + return 0; } /* @@ -973,150 +831,314 @@ * be done in sd.c. Even if it gets fixed there, this will still * work. */ -int ppa_biosparam(struct scsi_device *sdev, struct block_device *dev, - sector_t capacity, int ip[]) +static int ppa_biosparam(struct scsi_device *sdev, struct block_device *dev, + sector_t capacity, int ip[]) { - ip[0] = 0x40; - ip[1] = 0x20; - ip[2] = ((unsigned long)capacity + 1) / (ip[0] * ip[1]); - if (ip[2] > 1024) { - ip[0] = 0xff; - ip[1] = 0x3f; - ip[2] = ((unsigned long)capacity + 1) / (ip[0] * ip[1]); - if (ip[2] > 1023) - ip[2] = 1023; - } - return 0; -} - -int ppa_abort(Scsi_Cmnd * cmd) -{ - int host_no = cmd->device->host->unique_id; - /* - * There is no method for aborting commands since Iomega - * have tied the SCSI_MESSAGE line high in the interface - */ - - switch (cmd->SCp.phase) { - case 0: /* Do not have access to parport */ - case 1: /* Have not connected to interface */ - ppa_hosts[host_no].cur_cmd = NULL; /* Forget the problem */ - return SUCCESS; - break; - default: /* SCSI command sent, can not abort */ - return FAILED; - break; - } + ip[0] = 0x40; + ip[1] = 0x20; + ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]); + if (ip[2] > 1024) { + ip[0] = 0xff; + ip[1] = 0x3f; + ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]); + if (ip[2] > 1023) + ip[2] = 1023; + } + return 0; +} + +static int ppa_abort(Scsi_Cmnd *cmd) +{ + ppa_struct *dev = ppa_dev(cmd->device->host); + /* + * There is no method for aborting commands since Iomega + * have tied the SCSI_MESSAGE line high in the interface + */ + + switch (cmd->SCp.phase) { + case 0: /* Do not have access to parport */ + case 1: /* Have not connected to interface */ + dev->cur_cmd = NULL; /* Forget the problem */ + return SUCCESS; + break; + default: /* SCSI command sent, can not abort */ + return FAILED; + break; + } } static void ppa_reset_pulse(unsigned int base) { - w_dtr(base, 0x40); - w_ctr(base, 0x8); - udelay(30); - w_ctr(base, 0xc); + w_dtr(base, 0x40); + w_ctr(base, 0x8); + udelay(30); + w_ctr(base, 0xc); } -int ppa_reset(Scsi_Cmnd * cmd) +static int ppa_reset(Scsi_Cmnd *cmd) { - int host_no = cmd->device->host->unique_id; + ppa_struct *dev = ppa_dev(cmd->device->host); + + if (cmd->SCp.phase) + ppa_disconnect(dev); + dev->cur_cmd = NULL; /* Forget the problem */ + + ppa_connect(dev, CONNECT_NORMAL); + ppa_reset_pulse(dev->base); + udelay(1000); /* device settle delay */ + ppa_disconnect(dev); + udelay(1000); /* device settle delay */ + return SUCCESS; +} - if (cmd->SCp.phase) - ppa_disconnect(host_no); - ppa_hosts[host_no].cur_cmd = NULL; /* Forget the problem */ +static int device_check(ppa_struct *dev) +{ + /* This routine looks for a device and then attempts to use EPP + to send a command. If all goes as planned then EPP is available. */ + + static char cmd[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + int loop, old_mode, status, k, ppb = dev->base; + unsigned char l; + + old_mode = dev->mode; + for (loop = 0; loop < 8; loop++) { + /* Attempt to use EPP for Test Unit Ready */ + if ((ppb & 0x0007) == 0x0000) + dev->mode = PPA_EPP_32; + + second_pass: + ppa_connect(dev, CONNECT_EPP_MAYBE); + /* Select SCSI device */ + if (!ppa_select(dev, loop)) { + ppa_disconnect(dev); + continue; + } + printk("ppa: Found device at ID %i, Attempting to use %s\n", + loop, PPA_MODE_STRING[dev->mode]); - ppa_connect(host_no, CONNECT_NORMAL); - ppa_reset_pulse(PPA_BASE(host_no)); - udelay(1000); /* device settle delay */ - ppa_disconnect(host_no); - udelay(1000); /* device settle delay */ - return SUCCESS; + /* Send SCSI command */ + status = 1; + w_ctr(ppb, 0x0c); + for (l = 0; (l < 6) && (status); l++) + status = ppa_out(dev, cmd, 1); + + if (!status) { + ppa_disconnect(dev); + ppa_connect(dev, CONNECT_EPP_MAYBE); + w_dtr(ppb, 0x40); + w_ctr(ppb, 0x08); + udelay(30); + w_ctr(ppb, 0x0c); + udelay(1000); + ppa_disconnect(dev); + udelay(1000); + if (dev->mode == PPA_EPP_32) { + dev->mode = old_mode; + goto second_pass; + } + return -EIO; + } + w_ctr(ppb, 0x0c); + k = 1000000; /* 1 Second */ + do { + l = r_str(ppb); + k--; + udelay(1); + } while (!(l & 0x80) && (k)); + + l &= 0xf0; + + if (l != 0xf0) { + ppa_disconnect(dev); + ppa_connect(dev, CONNECT_EPP_MAYBE); + ppa_reset_pulse(ppb); + udelay(1000); + ppa_disconnect(dev); + udelay(1000); + if (dev->mode == PPA_EPP_32) { + dev->mode = old_mode; + goto second_pass; + } + return -EIO; + } + ppa_disconnect(dev); + printk("ppa: Communication established with ID %i using %s\n", + loop, PPA_MODE_STRING[dev->mode]); + ppa_connect(dev, CONNECT_EPP_MAYBE); + ppa_reset_pulse(ppb); + udelay(1000); + ppa_disconnect(dev); + udelay(1000); + return 0; + } + return -ENODEV; } -static int device_check(int host_no) +static Scsi_Host_Template ppa_template = { + .module = THIS_MODULE, + .proc_name = "ppa", + .proc_info = ppa_proc_info, + .name = "Iomega VPI0 (ppa) interface", + .queuecommand = ppa_queuecommand, + .eh_abort_handler = ppa_abort, + .eh_bus_reset_handler = ppa_reset, + .eh_host_reset_handler = ppa_reset, + .bios_param = ppa_biosparam, + .this_id = -1, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 1, + .use_clustering = ENABLE_CLUSTERING, + .can_queue = 1, +}; + +/*************************************************************************** + * Parallel port probing routines * + ***************************************************************************/ + +static LIST_HEAD(ppa_hosts); + +static int __ppa_attach(struct parport *pb) { - /* This routine looks for a device and then attempts to use EPP - to send a command. If all goes as planned then EPP is available. */ + struct Scsi_Host *host; + DECLARE_WAIT_QUEUE_HEAD(waiting); + DEFINE_WAIT(wait); + ppa_struct *dev; + int ports; + int modes, ppb, ppb_hi; + int err = -ENOMEM; - static char cmd[6] = - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - int loop, old_mode, status, k, ppb = PPA_BASE(host_no); - unsigned char l; + dev = kmalloc(sizeof(ppa_struct), GFP_KERNEL); + if (!dev) + return -ENOMEM; + memset(dev, 0, sizeof(ppa_struct)); + dev->base = -1; + dev->mode = PPA_AUTODETECT; + dev->recon_tmo = PPA_RECON_TMO; + init_waitqueue_head(&waiting); + dev->dev = parport_register_device(pb, "ppa", NULL, ppa_wakeup, + NULL, 0, dev); - old_mode = ppa_hosts[host_no].mode; - for (loop = 0; loop < 8; loop++) { - /* Attempt to use EPP for Test Unit Ready */ - if ((ppb & 0x0007) == 0x0000) - ppa_hosts[host_no].mode = PPA_EPP_32; + if (!dev->dev) + goto out; - second_pass: - ppa_connect(host_no, CONNECT_EPP_MAYBE); - /* Select SCSI device */ - if (!ppa_select(host_no, loop)) { - ppa_disconnect(host_no); - continue; + /* Claim the bus so it remembers what we do to the control + * registers. [ CTR and ECP ] + */ + err = -EBUSY; + dev->waiting = &waiting; + prepare_to_wait(&waiting, &wait, TASK_UNINTERRUPTIBLE); + if (ppa_pb_claim(dev)) + schedule_timeout(3 * HZ); + if (dev->wanted) { + printk(KERN_ERR "ppa%d: failed to claim parport because " + "a pardevice is owning the port for too long " + "time!\n", pb->number); + ppa_pb_dismiss(dev); + dev->waiting = NULL; + finish_wait(&waiting, &wait); + goto out1; } - printk("ppa: Found device at ID %i, Attempting to use %s\n", loop, - PPA_MODE_STRING[ppa_hosts[host_no].mode]); - - /* Send SCSI command */ - status = 1; + dev->waiting = NULL; + finish_wait(&waiting, &wait); + ppb = dev->base = dev->dev->port->base; + ppb_hi = dev->dev->port->base_hi; w_ctr(ppb, 0x0c); - for (l = 0; (l < 6) && (status); l++) - status = ppa_out(host_no, cmd, 1); + modes = dev->dev->port->modes; - if (!status) { - ppa_disconnect(host_no); - ppa_connect(host_no, CONNECT_EPP_MAYBE); - w_dtr(ppb, 0x40); - w_ctr(ppb, 0x08); - udelay(30); - w_ctr(ppb, 0x0c); - udelay(1000); - ppa_disconnect(host_no); - udelay(1000); - if (ppa_hosts[host_no].mode == PPA_EPP_32) { - ppa_hosts[host_no].mode = old_mode; - goto second_pass; - } - printk("ppa: Unable to establish communication, aborting driver load.\n"); - return 1; + /* Mode detection works up the chain of speed + * This avoids a nasty if-then-else-if-... tree + */ + dev->mode = PPA_NIBBLE; + + if (modes & PARPORT_MODE_TRISTATE) + dev->mode = PPA_PS2; + + if (modes & PARPORT_MODE_ECP) { + w_ecr(ppb_hi, 0x20); + dev->mode = PPA_PS2; } - w_ctr(ppb, 0x0c); - k = 1000000; /* 1 Second */ - do { - l = r_str(ppb); - k--; - udelay(1); - } while (!(l & 0x80) && (k)); - - l &= 0xf0; - - if (l != 0xf0) { - ppa_disconnect(host_no); - ppa_connect(host_no, CONNECT_EPP_MAYBE); - ppa_reset_pulse(ppb); - udelay(1000); - ppa_disconnect(host_no); - udelay(1000); - if (ppa_hosts[host_no].mode == PPA_EPP_32) { - ppa_hosts[host_no].mode = old_mode; - goto second_pass; - } - printk("ppa: Unable to establish communication, aborting driver load.\n"); - return 1; - } - ppa_disconnect(host_no); - printk("ppa: Communication established with ID %i using %s\n", loop, - PPA_MODE_STRING[ppa_hosts[host_no].mode]); - ppa_connect(host_no, CONNECT_EPP_MAYBE); - ppa_reset_pulse(ppb); - udelay(1000); - ppa_disconnect(host_no); - udelay(1000); + if ((modes & PARPORT_MODE_EPP) && (modes & PARPORT_MODE_ECP)) + w_ecr(ppb_hi, 0x80); + + /* Done configuration */ + + err = ppa_init(dev); + ppa_pb_release(dev); + + if (err) + goto out1; + + /* now the glue ... */ + if (dev->mode == PPA_NIBBLE || dev->mode == PPA_PS2) + ports = 3; + else + ports = 8; + + INIT_WORK(&dev->ppa_tq, ppa_interrupt, dev); + + err = -ENOMEM; + host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *)); + if (!host) + goto out1; + host->io_port = pb->base; + host->n_io_port = ports; + host->dma_channel = -1; + host->unique_id = pb->number; + *(ppa_struct **)&host->hostdata = dev; + dev->host = host; + list_add_tail(&dev->list, &ppa_hosts); + err = scsi_add_host(host, NULL); + if (err) + goto out2; + scsi_scan_host(host); return 0; - } - printk("ppa: No devices found, aborting driver load.\n"); - return 1; +out2: + list_del_init(&dev->list); + scsi_host_put(host); +out1: + parport_unregister_device(dev->dev); +out: + kfree(dev); + return err; +} + +static void ppa_attach(struct parport *pb) +{ + __ppa_attach(pb); +} + +static void ppa_detach(struct parport *pb) +{ + ppa_struct *dev; + list_for_each_entry(dev, &ppa_hosts, list) { + if (dev->dev->port == pb) { + list_del_init(&dev->list); + scsi_remove_host(dev->host); + scsi_host_put(dev->host); + parport_unregister_device(dev->dev); + kfree(dev); + break; + } + } } + +static struct parport_driver ppa_driver = { + .name = "ppa", + .attach = ppa_attach, + .detach = ppa_detach, +}; + +static int __init ppa_driver_init(void) +{ + printk("ppa: Version %s\n", PPA_VERSION); + return parport_register_driver(&ppa_driver); +} + +static void __exit ppa_driver_exit(void) +{ + parport_unregister_driver(&ppa_driver); +} + +module_init(ppa_driver_init); +module_exit(ppa_driver_exit); MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/ppa.h b/drivers/scsi/ppa.h --- a/drivers/scsi/ppa.h Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/ppa.h Tue Feb 17 20:00:08 2004 @@ -73,7 +73,6 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ -#ifdef PPA_CODE #include #include #include @@ -115,11 +114,7 @@ #endif "Unknown"}; -/* This is a global option */ -int ppa_sg = SG_ALL; /* enable/disable scatter-gather. */ - /* other options */ -#define PPA_CAN_QUEUE 1 /* use "queueing" interface */ #define PPA_BURST_SIZE 512 /* data burst size */ #define PPA_SELECT_TMO 5000 /* how long to wait for target ? */ #define PPA_SPIN_TMO 50000 /* ppa_wait loop limiter */ @@ -152,23 +147,5 @@ #endif static int ppa_engine(ppa_struct *, Scsi_Cmnd *); -static int ppa_in(int, char *, int); -static int ppa_init(int); -static void ppa_interrupt(void *); -static int ppa_out(int, char *, int); - -#else -#define ppa_release 0 -#endif - -int ppa_detect(Scsi_Host_Template *); -const char *ppa_info(struct Scsi_Host *); -int ppa_command(Scsi_Cmnd *); -int ppa_queuecommand(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); -int ppa_abort(Scsi_Cmnd *); -int ppa_reset(Scsi_Cmnd *); -int ppa_proc_info(struct Scsi_Host *host, char *, char **, off_t, int, int); -int ppa_biosparam(struct scsi_device *, struct block_device *, - sector_t, int *); #endif /* _PPA_H */ diff -Nru a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig --- a/drivers/scsi/qla2xxx/Kconfig Tue Feb 17 20:00:14 2004 +++ b/drivers/scsi/qla2xxx/Kconfig Tue Feb 17 20:00:14 2004 @@ -1,29 +1,41 @@ -config SCSI_QLA2XXX_CONFIG +config SCSI_QLA2XXX tristate default (SCSI && PCI) depends on SCSI && PCI -config SCSI_QLA2XXX - tristate - config SCSI_QLA21XX - tristate "Qlogic ISP2100 host adapter family support" - select SCSI_QLA2XXX - depends on SCSI_QLA2XXX_CONFIG + tristate "QLogic ISP2100 host adapter family support" + depends on SCSI_QLA2XXX ---help--- This driver supports the QLogic 21xx (ISP2100) host adapter family. config SCSI_QLA22XX - tristate "Qlogic ISP2200 host adapter family support" - select SCSI_QLA2XXX - depends on SCSI_QLA2XXX_CONFIG + tristate "QLogic ISP2200 host adapter family support" + depends on SCSI_QLA2XXX ---help--- This driver supports the QLogic 22xx (ISP2200) host adapter family. -config SCSI_QLA23XX - tristate "Qlogic ISP23xx host adapter family support" - select SCSI_QLA2XXX - depends on SCSI_QLA2XXX_CONFIG +config SCSI_QLA2300 + tristate "QLogic ISP2300 host adapter family support" + depends on SCSI_QLA2XXX + ---help--- + This driver supports the QLogic 2300 (ISP2300, and ISP2312) host + adapter family. + +config SCSI_QLA2322 + tristate "QLogic ISP2322 host adapter family support" + depends on SCSI_QLA2XXX + ---help--- + This driver supports the QLogic 2322 (ISP2322) host adapter family. + +config SCSI_QLA6312 + tristate "QLogic ISP6312 host adapter family support" + depends on SCSI_QLA2XXX + ---help--- + This driver supports the QLogic 6312 (ISP6312) host adapter family. + +config SCSI_QLA6322 + tristate "QLogic ISP6322 host adapter family support" + depends on SCSI_QLA2XXX ---help--- - This driver supports the QLogic 23xx (ISP2300, ISP2312, and ISP2322) - host adapter family. + This driver supports the QLogic 6322 (ISP6322) host adapter family. diff -Nru a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile --- a/drivers/scsi/qla2xxx/Makefile Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/qla2xxx/Makefile Tue Feb 17 20:00:05 2004 @@ -1,12 +1,18 @@ -EXTRA_CFLAGS += -g -Idrivers/scsi -DUNIQUE_FW_NAME +EXTRA_CFLAGS += -Idrivers/scsi -DUNIQUE_FW_NAME qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \ qla_dbg.o qla_sup.o qla_rscn.o qla2100-y := ql2100.o ql2100_fw.o qla2200-y := ql2200.o ql2200_fw.o -qla2300-y := ql2300.o ql2300_fw.o #ql2322_fw.o +qla2300-y := ql2300.o ql2300_fw.o +qla2322-y := ql2322.o ql2322_fw.o +qla6312-y := ql6312.o ql6312_fw.o +qla6322-y := ql6322.o ql6322_fw.o obj-$(CONFIG_SCSI_QLA21XX) += qla2xxx.o qla2100.o obj-$(CONFIG_SCSI_QLA22XX) += qla2xxx.o qla2200.o -obj-$(CONFIG_SCSI_QLA23XX) += qla2xxx.o qla2300.o +obj-$(CONFIG_SCSI_QLA2300) += qla2xxx.o qla2300.o +obj-$(CONFIG_SCSI_QLA2322) += qla2xxx.o qla2322.o +obj-$(CONFIG_SCSI_QLA6312) += qla2xxx.o qla6312.o +obj-$(CONFIG_SCSI_QLA6322) += qla2xxx.o qla6322.o diff -Nru a/drivers/scsi/qla2xxx/ql2300.c b/drivers/scsi/qla2xxx/ql2300.c --- a/drivers/scsi/qla2xxx/ql2300.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/qla2xxx/ql2300.c Tue Feb 17 20:00:08 2004 @@ -1,5 +1,5 @@ /* - * QLogic ISP23XX device driver for Linux 2.6.x + * QLogic ISP2300 device driver for Linux 2.6.x * Copyright (C) 2003 Christoph Hellwig. * Copyright (C) 2003 QLogic Corporation (www.qlogic.com) * @@ -15,80 +15,33 @@ static char qla_driver_name[] = "qla2300"; -extern unsigned char fw2300tpx_version[]; -extern unsigned char fw2300tpx_version_str[]; -extern unsigned short fw2300tpx_addr01; -extern unsigned short fw2300tpx_code01[]; -extern unsigned short fw2300tpx_length01; - -extern unsigned char fw2322tpx_version[]; -extern unsigned char fw2322tpx_version_str[]; -extern unsigned short fw2322tpx_addr01; -extern unsigned short fw2322tpx_code01[]; -extern unsigned short fw2322tpx_length01; -extern unsigned long rseqtpx_code_addr01; -extern unsigned short rseqtpx_code01[]; -extern unsigned short rseqtpx_code_length01; -extern unsigned long xseqtpx_code_addr01; -extern unsigned short xseqtpx_code01[]; -extern unsigned short xseqtpx_code_length01; +extern unsigned char fw2300ipx_version[]; +extern unsigned char fw2300ipx_version_str[]; +extern unsigned short fw2300ipx_addr01; +extern unsigned short fw2300ipx_code01[]; +extern unsigned short fw2300ipx_length01; static struct qla_fw_info qla_fw_tbl[] = { { .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2300tpx_code01[0], - .fwlen = &fw2300tpx_length01, - .fwstart = &fw2300tpx_addr01, + .fwcode = &fw2300ipx_code01[0], + .fwlen = &fw2300ipx_length01, + .fwstart = &fw2300ipx_addr01, }, -#if defined(ISP2322) - /* End of 23xx firmware list */ - { FW_INFO_ADDR_NOMORE, }, - - /* Start of 232x firmware list */ - { - .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2322tpx_code01[0], - .fwlen = &fw2322tpx_length01, - .fwstart = &fw2322tpx_addr01, - }, - { - .addressing = FW_INFO_ADDR_EXTENDED, - .fwcode = &rseqtpx_code01[0], - .fwlen = &rseqtpx_code_length01, - .lfwstart = &rseqtpx_code_addr01, - }, - { - .addressing = FW_INFO_ADDR_EXTENDED, - .fwcode = &xseqtpx_code01[0], - .fwlen = &xseqtpx_code_length01, - .lfwstart = &xseqtpx_code_addr01, - }, -#endif { FW_INFO_ADDR_NOMORE, }, }; static struct qla_board_info qla_board_tbl[] = { { .drv_name = qla_driver_name, - .isp_name = "ISP2300", .fw_info = qla_fw_tbl, }, - { .drv_name = qla_driver_name, - .isp_name = "ISP2312", .fw_info = qla_fw_tbl, }, -#if defined(ISP2322) - { - .drv_name = qla_driver_name, - - .isp_name = "ISP2322", - .fw_info = &qla_fw_tbl[2], - }, -#endif }; static struct pci_device_id qla2300_pci_tbl[] = { @@ -99,7 +52,6 @@ .subdevice = PCI_ANY_ID, .driver_data = (unsigned long)&qla_board_tbl[0], }, - { .vendor = PCI_VENDOR_ID_QLOGIC, .device = PCI_DEVICE_ID_QLOGIC_ISP2312, @@ -107,16 +59,6 @@ .subdevice = PCI_ANY_ID, .driver_data = (unsigned long)&qla_board_tbl[1], }, - -#if defined(ISP2322) - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2322, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[2], - }, -#endif {0, 0}, }; MODULE_DEVICE_TABLE(pci, qla2300_pci_tbl); @@ -157,5 +99,5 @@ module_exit(qla2300_exit); MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP23xx FC-SCSI Host Bus Adapter driver"); +MODULE_DESCRIPTION("QLogic ISP2300 FC-SCSI Host Bus Adapter driver"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/qla2xxx/ql2300_fw.c b/drivers/scsi/qla2xxx/ql2300_fw.c --- a/drivers/scsi/qla2xxx/ql2300_fw.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/qla2xxx/ql2300_fw.c Tue Feb 17 20:00:06 2004 @@ -18,44 +18,44 @@ *************************************************************************/ /* - * Firmware Version 3.02.18 (10:33 Nov 03, 2003) + * Firmware Version 3.02.21 (16:31 Jan 19, 2004) */ #ifdef UNIQUE_FW_NAME -unsigned short fw2300tpx_version = 3*1024+2; +unsigned short fw2300ipx_version = 3*1024+2; #else unsigned short risc_code_version = 3*1024+2; #endif #ifdef UNIQUE_FW_NAME -unsigned char fw2300tpx_version_str[] = {3, 2,18}; +unsigned char fw2300ipx_version_str[] = {3, 2,21}; #else -unsigned char firmware_version[] = {3, 2,18}; +unsigned char firmware_version[] = {3, 2,21}; #endif #ifdef UNIQUE_FW_NAME -#define fw2300tpx_VERSION_STRING "3.02.18" +#define fw2300ipx_VERSION_STRING "3.02.21" #else -#define FW_VERSION_STRING "3.02.18" +#define FW_VERSION_STRING "3.02.21" #endif #ifdef UNIQUE_FW_NAME -unsigned short fw2300tpx_addr01 = 0x0800 ; +unsigned short fw2300ipx_addr01 = 0x0800 ; #else unsigned short risc_code_addr01 = 0x0800 ; #endif #ifdef UNIQUE_FW_NAME -unsigned short fw2300tpx_code01[] = { +unsigned short fw2300ipx_code01[] = { #else unsigned short risc_code01[] = { #endif - 0x0470, 0x0000, 0x0000, 0xcf5b, 0x0000, 0x0003, 0x0002, 0x0012, - 0x0117, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, + 0x0470, 0x0000, 0x0000, 0xe666, 0x0000, 0x0003, 0x0002, 0x0015, + 0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, - 0x332e, 0x3032, 0x2e31, 0x3820, 0x2020, 0x2020, 0x2400, 0x20a9, + 0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, @@ -63,3375 +63,3545 @@ 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, - 0x0000, 0x20c1, 0x0004, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, - 0x1bff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x29be, - 0x2051, 0x1800, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029, + 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78, + 0x7883, 0x0004, 0x2089, 0x2bdb, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e51, 0x2029, 0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8, - 0x4104, 0x8001, 0x1de0, 0x7566, 0x766a, 0x7762, 0x746e, 0x7472, - 0x00e6, 0x2071, 0x1a8b, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7168, + 0x4104, 0x8001, 0x1de0, 0x756e, 0x7672, 0x776a, 0x7476, 0x747a, + 0x00e6, 0x2071, 0x1abf, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7170, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, - 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7168, 0x3400, + 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7170, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e, - 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0eed, 0x080c, - 0x5a2f, 0x080c, 0x996c, 0x080c, 0x10a4, 0x080c, 0x127c, 0x080c, - 0x196d, 0x080c, 0x0d4b, 0x080c, 0x1029, 0x080c, 0x3092, 0x080c, - 0x6f3e, 0x080c, 0x62c8, 0x080c, 0x7b85, 0x080c, 0x217b, 0x080c, - 0x7eaf, 0x080c, 0x757c, 0x080c, 0x1fb8, 0x080c, 0x20ec, 0x080c, - 0x2170, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, - 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, - 0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, 0x2071, 0x1800, 0x7003, - 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, - 0x4737, 0x080c, 0x30b9, 0x080c, 0x6faf, 0x080c, 0x6787, 0x080c, - 0x7bae, 0x080c, 0x292b, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, - 0x0ad4, 0x093e, 0x0b94, 0x0d4a, 0x0d4a, 0x0d4a, 0x080c, 0x0db2, - 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, - 0x1904, 0x0aa7, 0x080c, 0x0e5a, 0x080c, 0x6c53, 0x0150, 0x080c, - 0x6c76, 0x1590, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, - 0x0458, 0x080c, 0x6b8a, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aa7, - 0x7090, 0x9086, 0x0028, 0x1904, 0x0aa7, 0x080c, 0x7b7c, 0x2001, - 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, - 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6ad9, 0x080c, 0x7c4a, 0x2011, - 0x6acc, 0x080c, 0x7d1b, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x2011, - 0x8030, 0x901e, 0x738e, 0x04a0, 0x080c, 0x5137, 0x2079, 0x0100, - 0x7844, 0x9005, 0x1904, 0x0aa7, 0x2011, 0x588a, 0x080c, 0x7c4a, - 0x2011, 0x6ad9, 0x080c, 0x7c4a, 0x2011, 0x6acc, 0x080c, 0x7d1b, - 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, - 0xfffb, 0x7842, 0x2001, 0x1975, 0x2004, 0x9005, 0x1140, 0x00c6, - 0x2061, 0x0100, 0x080c, 0x59d7, 0x00ce, 0x0804, 0x0aa7, 0x780f, - 0x006b, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x8010, 0x73d0, - 0x2001, 0x1976, 0x2003, 0x0001, 0x080c, 0x27f1, 0x080c, 0x4672, - 0x7240, 0xc284, 0x7242, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, - 0x2102, 0x080c, 0x91bb, 0x2011, 0x0004, 0x080c, 0xb60b, 0x080c, - 0x61a1, 0x080c, 0x6c53, 0x1120, 0x080c, 0x2835, 0x02e0, 0x0400, - 0x080c, 0x59de, 0x0140, 0x708f, 0x0001, 0x70cb, 0x0000, 0x080c, - 0x5304, 0x0804, 0x0aa7, 0x080c, 0x5113, 0xd094, 0x0188, 0x2011, - 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5117, 0xd0d4, 0x1118, - 0x080c, 0x2835, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x00a8, - 0x080c, 0x5117, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, - 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x629c, - 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, 0x2012, 0x080c, 0x6262, - 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, 0x7077, 0x0000, 0x080c, - 0x6c53, 0x1130, 0x70a8, 0x9005, 0x1168, 0x080c, 0xba40, 0x0050, - 0x080c, 0xba40, 0x70d4, 0xd09c, 0x1128, 0x70a8, 0x9005, 0x0110, - 0x080c, 0x59b4, 0x70df, 0x0000, 0x70db, 0x0000, 0x709f, 0x0000, - 0x080c, 0x283d, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, - 0x72d4, 0x080c, 0x6c53, 0x1178, 0x9016, 0x0016, 0x080c, 0x25ee, - 0x2019, 0x193e, 0x211a, 0x001e, 0x7057, 0xffff, 0x705b, 0x00ef, - 0x707b, 0x0000, 0x0020, 0x2019, 0x193e, 0x201b, 0x0000, 0x2079, - 0x1853, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72d6, 0x080c, 0x6c53, - 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0xb60b, - 0x70a3, 0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, - 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x080c, - 0x2c2b, 0x2011, 0x0005, 0x080c, 0x92ec, 0x080c, 0x8582, 0x080c, - 0x6c53, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x25ee, - 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000, 0x70a7, - 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, - 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, - 0x92ec, 0x080c, 0x8582, 0x080c, 0x6c53, 0x0148, 0x00c6, 0x2061, - 0x0100, 0x0016, 0x080c, 0x25ee, 0x61e2, 0x001e, 0x00ce, 0x00fe, - 0x012e, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6c53, 0x1118, 0x20a9, - 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6c53, 0x1110, 0x900e, - 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, - 0x905d, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x2f28, 0x8108, 0x1f04, - 0x0abb, 0x7077, 0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, - 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, - 0x7000, 0x9086, 0x0002, 0x1904, 0x0b91, 0x70a4, 0x9086, 0xffff, - 0x0130, 0x080c, 0x2c2b, 0x080c, 0x8582, 0x0804, 0x0b91, 0x70d4, - 0xd0ac, 0x1110, 0xd09c, 0x0558, 0xd084, 0x0548, 0x0006, 0x2001, - 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, 0x0508, 0x080c, 0x2f8b, - 0x11d0, 0x70d8, 0x9086, 0xffff, 0x01b0, 0x080c, 0x2d9c, 0x080c, - 0x8582, 0x70d4, 0xd094, 0x1904, 0x0b91, 0x2011, 0x0001, 0x080c, - 0xbcec, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2dd6, 0x080c, - 0x8582, 0x0804, 0x0b91, 0x70dc, 0x9005, 0x1904, 0x0b91, 0x70a0, - 0x9005, 0x1904, 0x0b91, 0x70d4, 0xd0a4, 0x0118, 0xd0b4, 0x0904, - 0x0b91, 0x080c, 0x6262, 0x1904, 0x0b91, 0x080c, 0x62b5, 0x1904, - 0x0b91, 0x080c, 0x629c, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, - 0x900e, 0x0016, 0x080c, 0x5f7e, 0x1118, 0xb800, 0xd0ec, 0x1138, - 0x001e, 0x8108, 0x1f04, 0x0b31, 0x00ce, 0x015e, 0x0028, 0x001e, - 0x00ce, 0x015e, 0x0804, 0x0b91, 0x0006, 0x2001, 0x0103, 0x2003, - 0x006b, 0x000e, 0x2011, 0x1982, 0x080c, 0x0f5d, 0x2011, 0x199c, - 0x080c, 0x0f5d, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70a7, - 0xffff, 0x080c, 0x0e3c, 0x9006, 0x080c, 0x247f, 0x080c, 0x2f8b, - 0x0118, 0x080c, 0x480f, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, - 0x2021, 0x0006, 0x080c, 0x4829, 0x004e, 0x003e, 0x00f6, 0x2079, - 0x0100, 0x080c, 0x6c76, 0x0150, 0x080c, 0x6c53, 0x7828, 0x0118, - 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, - 0x19b7, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, - 0x92ec, 0x2011, 0x0000, 0x080c, 0x92f6, 0x080c, 0x8582, 0x080c, - 0x865d, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, - 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, - 0x2009, 0x00f7, 0x080c, 0x599d, 0x7940, 0x918c, 0x0010, 0x7942, - 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, - 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x0c21, - 0x2001, 0x1976, 0x2004, 0x9005, 0x1518, 0x080c, 0x28b8, 0x1148, - 0x2001, 0x0001, 0x080c, 0x2820, 0x2001, 0x0001, 0x080c, 0x2803, - 0x00b8, 0x080c, 0x28c0, 0x1138, 0x9006, 0x080c, 0x2820, 0x9006, - 0x080c, 0x2803, 0x0068, 0x080c, 0x28c8, 0x1d50, 0x2001, 0x1967, - 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x261a, 0x0804, 0x0d01, - 0x080c, 0x6c64, 0x0148, 0x080c, 0x6c76, 0x1118, 0x080c, 0x6f39, - 0x0050, 0x080c, 0x6c5b, 0x0dd0, 0x080c, 0x6f34, 0x080c, 0x6f2a, - 0x080c, 0x6b8a, 0x0058, 0x080c, 0x6c53, 0x0140, 0x2009, 0x00f8, - 0x080c, 0x599d, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, - 0x7820, 0xd09c, 0x1138, 0x080c, 0x6c53, 0x0138, 0x7824, 0xd0ac, - 0x1904, 0x0d06, 0x1f04, 0x0c00, 0x0070, 0x7824, 0x080c, 0x6c6d, - 0x0118, 0xd0ac, 0x1904, 0x0d06, 0x9084, 0x1800, 0x0d98, 0x7003, - 0x0001, 0x0804, 0x0d06, 0x2001, 0x0001, 0x080c, 0x247f, 0x0804, - 0x0d19, 0x2001, 0x1976, 0x2004, 0x9005, 0x1518, 0x080c, 0x28b8, - 0x1148, 0x2001, 0x0001, 0x080c, 0x2820, 0x2001, 0x0001, 0x080c, - 0x2803, 0x00b8, 0x080c, 0x28c0, 0x1138, 0x9006, 0x080c, 0x2820, - 0x9006, 0x080c, 0x2803, 0x0068, 0x080c, 0x28c8, 0x1d50, 0x2001, - 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x261a, 0x0804, - 0x0d01, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938, 0x7850, 0x9084, - 0xfbcf, 0x7852, 0x080c, 0x28d0, 0x9085, 0x2000, 0x7852, 0x793a, - 0x20a9, 0x0046, 0x1d04, 0x0c5a, 0x080c, 0x7cfb, 0x1f04, 0x0c5a, - 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x793a, 0x080c, - 0x6c64, 0x0148, 0x080c, 0x6c76, 0x1118, 0x080c, 0x6f39, 0x0050, - 0x080c, 0x6c5b, 0x0dd0, 0x080c, 0x6f34, 0x080c, 0x6f2a, 0x080c, - 0x6b8a, 0x0020, 0x2009, 0x00f8, 0x080c, 0x599d, 0x20a9, 0x0028, - 0xa001, 0x1f04, 0x0c80, 0x7850, 0x9085, 0x1400, 0x7852, 0x080c, - 0x6c53, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, - 0x2019, 0xea60, 0x0d0c, 0x7cfb, 0x7820, 0xd09c, 0x1588, 0x080c, - 0x6c53, 0x0904, 0x0ce6, 0x7824, 0xd0ac, 0x1904, 0x0d06, 0x080c, - 0x6c76, 0x1530, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, - 0x7827, 0x1800, 0x080c, 0x28d0, 0x7824, 0x9084, 0x1800, 0x1168, - 0x9484, 0x0fff, 0x1140, 0x2001, 0x180f, 0x2004, 0x9084, 0x9000, - 0x0110, 0x080c, 0x0d27, 0x8421, 0x1158, 0x1d04, 0x0cc1, 0x080c, - 0x7cfb, 0x080c, 0x6f34, 0x080c, 0x6f2a, 0x7003, 0x0001, 0x04f0, - 0x8319, 0x1940, 0x1d04, 0x0cce, 0x080c, 0x7cfb, 0x2009, 0x196a, - 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b, 0x000a, - 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x28b1, 0x7924, 0x080c, - 0x28d0, 0xd19c, 0x0110, 0x080c, 0x27f1, 0x00d8, 0x080c, 0x6c64, - 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x6c2d, 0x7003, 0x0001, - 0x00a8, 0x7827, 0x1800, 0x080c, 0x28d0, 0x7824, 0x080c, 0x6c6d, - 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003, 0x0001, - 0x0028, 0x2001, 0x0001, 0x080c, 0x247f, 0x0078, 0x2009, 0x180c, - 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906, 0x7827, - 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085, 0x0400, - 0x7852, 0x2001, 0x1976, 0x2003, 0x0000, 0x9006, 0x78f2, 0x015e, - 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, - 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x0156, 0x0069, 0x0d0c, 0x7cfb, 0x015e, 0x00fe, 0x00ee, 0x00de, - 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, 0x000e, 0x0005, 0x00e6, - 0x2071, 0x1894, 0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x30b9, - 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061, 0x197a, 0x2063, 0x0003, - 0x6007, 0x0002, 0x600b, 0x0012, 0x600f, 0x0117, 0x2001, 0x194d, - 0x900e, 0x2102, 0x718e, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, - 0x0218, 0x7057, 0xffff, 0x0008, 0x7156, 0x705f, 0xffff, 0x7176, - 0x717a, 0x080c, 0xba40, 0x70e3, 0x00c0, 0x2061, 0x193d, 0x6003, - 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, - 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, 0x2061, 0x1945, 0x6003, - 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6116, - 0x601b, 0x0001, 0x611e, 0x2061, 0x1958, 0x6003, 0x514c, 0x6007, - 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0x182a, 0x2102, - 0x0005, 0x9016, 0x080c, 0x5f7e, 0x1178, 0xb804, 0x90c4, 0x00ff, - 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, 0x98c6, 0x0600, 0x1120, - 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, 0x9186, 0x0800, 0x1d50, - 0x2208, 0x0005, 0x2091, 0x8000, 0x0e04, 0x0db4, 0x0006, 0x0016, - 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e, 0x7882, 0x7836, - 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886, 0x3900, 0x789a, - 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6, 0x0036, 0x0026, - 0x2079, 0x0300, 0x2069, 0x1a66, 0x7a18, 0x226a, 0x8d68, 0x7a1c, - 0x226a, 0x782c, 0x2019, 0x1a73, 0x201a, 0x2019, 0x1a76, 0x9016, - 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, - 0x1a8b, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, - 0x2019, 0x1a74, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, - 0x2069, 0x1a46, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, - 0x8d68, 0x8318, 0x1f04, 0x0dfd, 0x002e, 0x003e, 0x00de, 0x015e, - 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x0180, 0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, - 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, - 0x0002, 0x2003, 0x1001, 0x080c, 0x5122, 0x1108, 0x0011, 0x0cd8, - 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0eb4, 0x20a9, - 0x0900, 0x080c, 0x0ed5, 0x2011, 0x0040, 0x080c, 0x0eb4, 0x20a9, - 0x0900, 0x080c, 0x0ed5, 0x0c78, 0x0026, 0x080c, 0x0ec1, 0x1118, - 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, - 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, 0x2011, 0x6840, - 0xd0e4, 0x70e7, 0x0000, 0x1128, 0x70e7, 0x0fa0, 0x080c, 0x0ec6, - 0x002e, 0x0005, 0x0026, 0x080c, 0x0ec1, 0x0128, 0xd0a4, 0x1138, - 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, 0x0ec6, 0x002e, - 0x0005, 0x0026, 0x70e7, 0x0000, 0x080c, 0x0ec1, 0x1148, 0x080c, - 0x28c8, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, 0x8282, 0x0040, - 0x080c, 0x28c8, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, - 0x080c, 0x0ec6, 0x002e, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1800, - 0xd0b4, 0x70e0, 0x1110, 0xc0e4, 0x0048, 0x0006, 0x3b00, 0x9084, - 0xff3f, 0x20d8, 0x000e, 0x70e7, 0x0000, 0xc0e5, 0x0079, 0x000e, - 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70e0, 0x1110, - 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70e2, 0x7000, - 0x9084, 0x0007, 0x000b, 0x0005, 0x0e83, 0x0e5a, 0x0e5a, 0x0e3c, - 0x0e69, 0x0e5a, 0x0e5a, 0x0e69, 0x0016, 0x3b08, 0x3a00, 0x9104, - 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, - 0x0005, 0x2001, 0x1838, 0x2004, 0xd0dc, 0x0005, 0x9e86, 0x1800, - 0x190c, 0x0db2, 0x70e0, 0xd0e4, 0x0108, 0xc2e5, 0x72e2, 0xd0e4, - 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0ed5, 0x2091, - 0x6000, 0x1f04, 0x0ed5, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, - 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, - 0x894d, 0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, - 0x0096, 0x2061, 0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, - 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, - 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, - 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, - 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, - 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, - 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, - 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, - 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, - 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, - 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, - 0x3348, 0x080c, 0x0edc, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, - 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, - 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b0, - 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, - 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, - 0x0008, 0x23a0, 0x4001, 0x7074, 0x8007, 0x7178, 0x810f, 0x20a9, - 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d99, - 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, - 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x1007, 0x009e, - 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1080, 0x090c, - 0x0db2, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, - 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73b8, 0x702c, - 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0db2, 0x2300, - 0x9202, 0x0120, 0x1a0c, 0x0db2, 0xa000, 0x0c98, 0x012e, 0x003e, - 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, - 0x0126, 0x2091, 0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, - 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0db2, 0xa000, 0x0cc8, - 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x0126, 0x2091, 0x8000, 0x70b8, 0x8001, 0x0270, 0x70ba, 0x702c, - 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, - 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, - 0x2091, 0x8000, 0x2071, 0x1800, 0x70b8, 0x90ca, 0x0040, 0x0268, - 0x8001, 0x70ba, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, - 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, - 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, - 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, 0x7b7c, 0x012e, 0x00ee, - 0x0005, 0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, - 0x2900, 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, - 0x8420, 0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, - 0x2071, 0x1883, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0534, 0xa802, - 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, - 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, - 0x0c90, 0x2071, 0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, - 0x8318, 0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, - 0xa802, 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, - 0x2300, 0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, - 0x0c88, 0xa803, 0x0000, 0x2071, 0x1800, 0x74b6, 0x74ba, 0x0005, - 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, - 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0534, - 0x0288, 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, - 0x2071, 0x1883, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, - 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e7, 0x7007, - 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, - 0x9085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, - 0x00e6, 0xa06f, 0x0000, 0x2071, 0x19e7, 0x701c, 0x9088, 0x19f1, - 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, - 0x0db2, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, - 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, - 0x2071, 0x19e7, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, - 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, - 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, 0x10f7, 0x10f5, 0x10f5, - 0x10f5, 0x126b, 0x126b, 0x126b, 0x126b, 0x080c, 0x0db2, 0x701c, - 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, - 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f1, 0x2004, - 0x700a, 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, - 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, - 0xa878, 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, - 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, - 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, - 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, - 0x782b, 0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, - 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, - 0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, - 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, - 0x4006, 0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, - 0x0001, 0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, - 0x19e7, 0x2104, 0xc095, 0x200a, 0x080c, 0x10d4, 0x0005, 0x0016, - 0x00e6, 0x2071, 0x19e7, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, - 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, - 0x00ee, 0x001e, 0x0005, 0x10e5, 0x118a, 0x11be, 0x0db2, 0x0db2, - 0x1277, 0x0db2, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, - 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, - 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, - 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, - 0x7806, 0x080c, 0x112a, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, - 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x10e5, 0x0005, 0x7008, - 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, - 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, - 0x080c, 0x113f, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, - 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, - 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, - 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, - 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, - 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, - 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, - 0x009e, 0x080c, 0x10d4, 0x0005, 0x00de, 0x009e, 0x080c, 0x10d4, - 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, - 0x0db2, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, - 0x0000, 0xa897, 0x4002, 0x080c, 0x6529, 0xa09f, 0x0000, 0xa0a3, - 0x0000, 0x2848, 0x080c, 0x1007, 0x009e, 0x0005, 0x00a6, 0xa0a0, - 0x904d, 0x090c, 0x0db2, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, - 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, - 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, - 0x2810, 0x080c, 0x10b5, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, - 0x080c, 0x6529, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, - 0x00c6, 0x2060, 0x080c, 0x99d6, 0x00ce, 0x7008, 0x2048, 0xa89f, - 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1007, 0x7007, 0x0000, 0x080c, - 0x10d4, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, - 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x7007, - 0x0000, 0x080c, 0x10e5, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079, - 0x0300, 0x2071, 0x1a31, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x00c1, - 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x01ed, 0x2061, 0xd372, - 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, 0x1290, - 0x7807, 0x0001, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, 0x0005, - 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, - 0x2001, 0x1a32, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, - 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001, 0x7827, 0x0030, 0x782b, - 0x0400, 0x7827, 0x0031, 0x782b, 0x1a46, 0x781f, 0xff00, 0x781b, - 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, - 0x2061, 0x1a46, 0x602f, 0x1cd0, 0x2001, 0x1818, 0x2004, 0x9082, - 0x1cd0, 0x6032, 0x603b, 0x1da2, 0x00ce, 0x0005, 0x0126, 0x2091, - 0x2200, 0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000, 0x1588, - 0x908a, 0x0021, 0x1a0c, 0x0db2, 0x0043, 0x012e, 0x0005, 0x9084, - 0x0070, 0x190c, 0x0db2, 0x012e, 0x0005, 0x130f, 0x130f, 0x1318, - 0x131d, 0x1321, 0x1326, 0x134e, 0x1352, 0x1360, 0x1364, 0x130f, - 0x13ee, 0x13f2, 0x1455, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, - 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, - 0x1328, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, 0x130f, 0x080c, - 0x0db2, 0x2009, 0x0048, 0x2060, 0x080c, 0x9a50, 0x012e, 0x0005, - 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, - 0x0005, 0x080c, 0x145c, 0x080c, 0x1518, 0x0005, 0x080c, 0x0db2, - 0x080c, 0x145c, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, - 0x009e, 0x2009, 0x0048, 0x080c, 0x9a50, 0x2001, 0x015d, 0x2003, - 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, - 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, - 0x1461, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, - 0x7006, 0x0005, 0x080c, 0x145c, 0x2060, 0x6014, 0x0096, 0x2048, - 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x9a50, 0x0005, - 0x080c, 0x145c, 0x080c, 0x0db2, 0x080c, 0x145c, 0x080c, 0x13d9, - 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, 0x0015, 0x7828, - 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, 0x2003, 0x0050, - 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, 0x78ab, 0x0004, - 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0db2, 0x2001, - 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0480, 0x78ab, 0x0004, - 0x7803, 0x0001, 0x080c, 0x13f2, 0x0005, 0x7828, 0x782b, 0x0000, - 0x9065, 0x090c, 0x0db2, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, - 0x0700, 0x0198, 0x080c, 0x763f, 0x080c, 0x1872, 0x080c, 0xb5fb, - 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, - 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xb9d9, 0x2029, 0x00c8, - 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, - 0x080c, 0xd31b, 0xd5a4, 0x1118, 0x080c, 0x1461, 0x0005, 0x080c, - 0x763f, 0x080c, 0x1872, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, - 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, - 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, - 0x14d2, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, - 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0db2, 0xd184, - 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, - 0x0050, 0x2003, 0x0020, 0x080c, 0x1461, 0x0005, 0x81ff, 0x190c, - 0x0db2, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, - 0x15e0, 0x2071, 0x0200, 0x080c, 0x150c, 0x6014, 0x9005, 0x05a8, - 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, - 0x0160, 0x908e, 0x0048, 0x1548, 0x601c, 0xd084, 0x11d8, 0x00f6, - 0x2c78, 0x080c, 0x1582, 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, - 0x16b6, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, - 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, - 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x12a0, + 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f18, 0x080c, + 0x5e06, 0x080c, 0xab01, 0x080c, 0x10cf, 0x080c, 0x12e4, 0x080c, + 0x1afa, 0x080c, 0x0d69, 0x080c, 0x1054, 0x080c, 0x32d0, 0x080c, + 0x7479, 0x080c, 0x675b, 0x080c, 0x8485, 0x080c, 0x81bc, 0x080c, + 0x232a, 0x080c, 0x8d27, 0x080c, 0x7b3e, 0x080c, 0x2163, 0x080c, + 0x2297, 0x080c, 0x231f, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, + 0x091f, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, + 0x4000, 0x7833, 0x0010, 0x0e04, 0x0913, 0x2091, 0x5000, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, + 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, + 0x1178, 0x080c, 0x49c0, 0x080c, 0x32f7, 0x080c, 0x74ea, 0x080c, + 0x6c9c, 0x080c, 0x8563, 0x080c, 0x81e5, 0x080c, 0x2b45, 0x0c58, + 0x000b, 0x0c78, 0x0944, 0x0945, 0x0ae7, 0x0942, 0x0bae, 0x0d68, + 0x0d68, 0x0d68, 0x080c, 0x0dd5, 0x0005, 0x0126, 0x00f6, 0x2091, + 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aba, 0x080c, 0x54c6, + 0x1130, 0x0026, 0x2011, 0x0080, 0x080c, 0x0edf, 0x002e, 0x080c, + 0x717d, 0x0150, 0x080c, 0x71a0, 0x15a0, 0x2079, 0x0100, 0x7828, + 0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x70af, 0x7000, 0x9086, + 0x0001, 0x1904, 0x0aba, 0x7098, 0x9086, 0x0028, 0x1904, 0x0aba, + 0x080c, 0x81b4, 0x080c, 0x81a6, 0x2001, 0x0161, 0x2003, 0x0001, + 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, + 0x2011, 0x7013, 0x080c, 0x8285, 0x2011, 0x7006, 0x080c, 0x835c, + 0x2011, 0x5c61, 0x080c, 0x8285, 0x2011, 0x8030, 0x901e, 0x7396, + 0x04d0, 0x080c, 0x550e, 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, + 0x0aba, 0x2011, 0x5c61, 0x080c, 0x8285, 0x2011, 0x7013, 0x080c, + 0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x2001, 0x0265, 0x2001, + 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, + 0x19a4, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, + 0x5dae, 0x00ce, 0x0804, 0x0aba, 0x780f, 0x006b, 0x7a28, 0x080c, + 0x7185, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, + 0x2011, 0x8010, 0x73d8, 0x2001, 0x19a5, 0x2003, 0x0001, 0x080c, + 0x2a0b, 0x080c, 0x48fb, 0x7248, 0xc284, 0x724a, 0x2001, 0x180c, + 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa213, 0x2011, 0x0004, + 0x080c, 0xc835, 0x080c, 0x65f0, 0x080c, 0x717d, 0x1120, 0x080c, + 0x2a4f, 0x02e0, 0x0400, 0x080c, 0x5db5, 0x0140, 0x7097, 0x0001, + 0x70d3, 0x0000, 0x080c, 0x56db, 0x0804, 0x0aba, 0x080c, 0x54b7, + 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, + 0x54bb, 0xd0d4, 0x1118, 0x080c, 0x2a4f, 0x1270, 0x2011, 0x180c, + 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x54bb, 0xd0d4, 0x1db8, 0x2011, + 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x2012, 0x080c, 0x672f, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, + 0x2012, 0x080c, 0x66f5, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, + 0x707f, 0x0000, 0x080c, 0x717d, 0x1130, 0x70b0, 0x9005, 0x1168, + 0x080c, 0xcc6a, 0x0050, 0x080c, 0xcc6a, 0x70dc, 0xd09c, 0x1128, + 0x70b0, 0x9005, 0x0110, 0x080c, 0x5d8b, 0x70e7, 0x0000, 0x70e3, + 0x0000, 0x70a7, 0x0000, 0x080c, 0x2a57, 0x0228, 0x2011, 0x0101, + 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x717d, 0x1178, 0x9016, + 0x0016, 0x080c, 0x2808, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f, + 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d, + 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295, + 0x72de, 0x080c, 0x717d, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, + 0x0001, 0x080c, 0xc835, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, + 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, + 0x782a, 0x00fe, 0x080c, 0x2e48, 0x2011, 0x0005, 0x080c, 0xa349, + 0x080c, 0x941c, 0x080c, 0x717d, 0x0148, 0x00c6, 0x2061, 0x0100, + 0x0016, 0x080c, 0x2808, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, + 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, + 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, + 0x2011, 0x0005, 0x080c, 0xa349, 0x080c, 0x941c, 0x080c, 0x717d, + 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2808, 0x61e2, + 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, 0x080c, + 0x717d, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, + 0x717d, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138, + 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, 0x090c, + 0x3166, 0x8108, 0x1f04, 0x0ace, 0x707f, 0x0000, 0x7080, 0x9084, + 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6, + 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0bab, + 0x70ac, 0x9086, 0xffff, 0x0130, 0x080c, 0x2e48, 0x080c, 0x941c, + 0x0804, 0x0bab, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0558, 0xd084, + 0x0548, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, + 0x0508, 0x080c, 0x31c9, 0x11d0, 0x70e0, 0x9086, 0xffff, 0x01b0, + 0x080c, 0x2fda, 0x080c, 0x941c, 0x70dc, 0xd094, 0x1904, 0x0bab, + 0x2011, 0x0001, 0x080c, 0xcf18, 0x0110, 0x2011, 0x0003, 0x901e, + 0x080c, 0x3014, 0x080c, 0x941c, 0x0804, 0x0bab, 0x70e4, 0x9005, + 0x1904, 0x0bab, 0x70a8, 0x9005, 0x1904, 0x0bab, 0x70dc, 0xd0a4, + 0x0118, 0xd0b4, 0x0904, 0x0bab, 0x080c, 0x66f5, 0x1904, 0x0bab, + 0x080c, 0x6748, 0x1904, 0x0bab, 0x080c, 0x672f, 0x01c0, 0x0156, + 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1118, + 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b44, 0x00ce, + 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0bab, 0x0006, + 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b1, 0x080c, + 0x0f88, 0x2011, 0x19cb, 0x080c, 0x0f88, 0x7030, 0xc08c, 0x7032, + 0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x54c6, 0x1130, 0x0026, + 0x2011, 0x0040, 0x080c, 0x0edf, 0x002e, 0x9006, 0x080c, 0x269c, + 0x080c, 0x31c9, 0x0118, 0x080c, 0x4a98, 0x0050, 0x0036, 0x0046, + 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4ab2, 0x004e, 0x003e, + 0x00f6, 0x2079, 0x0100, 0x080c, 0x71a0, 0x0150, 0x080c, 0x717d, + 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, + 0x00fe, 0x2001, 0x19e6, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, + 0x0000, 0x080c, 0xa349, 0x2011, 0x0000, 0x080c, 0xa353, 0x080c, + 0x941c, 0x080c, 0x9548, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046, + 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, + 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5d74, 0x7940, 0x918c, + 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, + 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, + 0x1904, 0x0c3b, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518, 0x080c, + 0x2ad2, 0x1148, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001, 0x0001, + 0x080c, 0x2a1d, 0x00b8, 0x080c, 0x2ada, 0x1138, 0x9006, 0x080c, + 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x0068, 0x080c, 0x2ae2, 0x1d50, + 0x2001, 0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2834, + 0x0804, 0x0d1a, 0x080c, 0x718e, 0x0148, 0x080c, 0x71a0, 0x1118, + 0x080c, 0x7474, 0x0050, 0x080c, 0x7185, 0x0dd0, 0x080c, 0x746f, + 0x080c, 0x7465, 0x080c, 0x70af, 0x0058, 0x080c, 0x717d, 0x0140, + 0x2009, 0x00f8, 0x080c, 0x5d74, 0x7843, 0x0090, 0x7843, 0x0010, + 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x717d, 0x0138, + 0x7824, 0xd0ac, 0x1904, 0x0d1f, 0x1f04, 0x0c1a, 0x0070, 0x7824, + 0x080c, 0x7197, 0x0118, 0xd0ac, 0x1904, 0x0d1f, 0x9084, 0x1800, + 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d1f, 0x2001, 0x0001, 0x080c, + 0x269c, 0x0804, 0x0d32, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518, + 0x080c, 0x2ad2, 0x1148, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001, + 0x0001, 0x080c, 0x2a1d, 0x00b8, 0x080c, 0x2ada, 0x1138, 0x9006, + 0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x0068, 0x080c, 0x2ae2, + 0x1d50, 0x2001, 0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, + 0x2834, 0x0804, 0x0d1a, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938, + 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2aea, 0x9085, 0x2000, + 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c74, 0x080c, 0x833c, + 0x1f04, 0x0c74, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, + 0x793a, 0x080c, 0x718e, 0x0148, 0x080c, 0x71a0, 0x1118, 0x080c, + 0x7474, 0x0050, 0x080c, 0x7185, 0x0dd0, 0x080c, 0x746f, 0x080c, + 0x7465, 0x080c, 0x70af, 0x0020, 0x2009, 0x00f8, 0x080c, 0x5d74, + 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c9a, 0x7850, 0x9085, 0x1400, + 0x7852, 0x080c, 0x717d, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, + 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x833c, 0x7820, 0xd09c, + 0x1580, 0x080c, 0x717d, 0x0904, 0x0cff, 0x7824, 0xd0ac, 0x1904, + 0x0d1f, 0x080c, 0x71a0, 0x1528, 0x0046, 0x2021, 0x0320, 0x8421, + 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2aea, 0x7824, 0x9084, + 0x1800, 0x1160, 0x9484, 0x0fff, 0x1138, 0x2001, 0x1810, 0x2004, + 0xd0fc, 0x0110, 0x080c, 0x0d45, 0x8421, 0x1158, 0x1d04, 0x0cda, + 0x080c, 0x833c, 0x080c, 0x746f, 0x080c, 0x7465, 0x7003, 0x0001, + 0x04f0, 0x8319, 0x1948, 0x1d04, 0x0ce7, 0x080c, 0x833c, 0x2009, + 0x1999, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b, + 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2acb, 0x7924, + 0x080c, 0x2aea, 0xd19c, 0x0110, 0x080c, 0x2a0b, 0x00d8, 0x080c, + 0x718e, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x7155, 0x7003, + 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2aea, 0x7824, 0x080c, + 0x7197, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003, + 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x269c, 0x0078, 0x2009, + 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906, + 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085, + 0x0400, 0x7852, 0x2001, 0x19a5, 0x2003, 0x0000, 0x9006, 0x78f2, + 0x015e, 0x003e, 0x000e, 0x080c, 0x54c6, 0x1110, 0x080c, 0x0e62, + 0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, + 0x0046, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, + 0x0d0c, 0x833c, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x004e, 0x003e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, + 0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x32f7, 0x00ee, 0x0005, + 0x0005, 0x2a70, 0x2061, 0x19a9, 0x2063, 0x0003, 0x6007, 0x0002, + 0x600b, 0x0015, 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, + 0x7196, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, + 0xffff, 0x0008, 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, + 0xcc6a, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, + 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, + 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, + 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, + 0x1987, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, + 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x63cd, + 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, + 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, + 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, + 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, + 0x0dd7, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, + 0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, + 0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, + 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a99, 0x7a08, + 0x226a, 0x2069, 0x1a9a, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, + 0x782c, 0x2019, 0x1aa7, 0x201a, 0x2019, 0x1aaa, 0x9016, 0x7808, + 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1abf, + 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, + 0x1aa8, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, + 0x1a79, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, + 0x8318, 0x1f04, 0x0e24, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, + 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x0180, 0x2001, 0x1a17, 0x2004, 0x9005, 0x0128, 0x2001, + 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, + 0x2003, 0x1001, 0x080c, 0x54c6, 0x1110, 0x080c, 0x0e99, 0x0cd0, + 0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, + 0x1118, 0x918d, 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f, + 0x2102, 0x0005, 0x00f6, 0x0006, 0x2079, 0x1827, 0x2f04, 0x8000, + 0x207a, 0x080c, 0x2ae2, 0x1150, 0x0006, 0x2001, 0x1996, 0x2004, + 0xd0fc, 0x000e, 0x1118, 0x9082, 0x7530, 0x0010, 0x9082, 0x000f, + 0x0258, 0x9006, 0x207a, 0x2079, 0x182a, 0x2f04, 0x9084, 0x0001, + 0x9086, 0x0001, 0x207a, 0x0090, 0x2079, 0x182a, 0x2f7c, 0x8fff, + 0x1138, 0x0026, 0x2011, 0x0080, 0x080c, 0x0edf, 0x002e, 0x0030, + 0x0026, 0x2011, 0x0000, 0x080c, 0x0edf, 0x002e, 0x000e, 0x00fe, + 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0edf, 0x20a9, + 0x0fff, 0x080c, 0x0f00, 0x2011, 0x0040, 0x04c9, 0x20a9, 0x0fff, + 0x080c, 0x0f00, 0x0c80, 0x7038, 0xd0b4, 0x1128, 0x0026, 0x2011, + 0x0040, 0x0469, 0x002e, 0x0005, 0x7038, 0xd0b4, 0x1128, 0x0026, + 0x2011, 0x0080, 0x0421, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, + 0x0459, 0x1148, 0x080c, 0x2ae2, 0x1118, 0x2011, 0x8484, 0x0058, + 0x2011, 0x8282, 0x0040, 0x080c, 0x2ae2, 0x1118, 0x2011, 0xcdc5, + 0x0010, 0x2011, 0xcac2, 0x00e9, 0x002e, 0x0005, 0xd0b4, 0x0130, + 0x0006, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, 0x0005, 0x0016, + 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, + 0x9205, 0x20d0, 0x001e, 0x0005, 0x2001, 0x183a, 0x2004, 0xd0dc, + 0x0005, 0x9e86, 0x1800, 0x190c, 0x0dd5, 0x70e8, 0xd0e4, 0x0108, + 0xc2e5, 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, + 0x1d04, 0x0f00, 0x2091, 0x6000, 0x1f04, 0x0f00, 0x0005, 0x890e, + 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, + 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x000e, 0x0005, + 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188d, 0x600b, 0x0000, + 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, + 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, + 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, + 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, + 0x200f, 0x2001, 0x189d, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, + 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, + 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, + 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, + 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, + 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, + 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, 0x0f07, 0x2100, 0x9300, + 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, + 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, + 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, + 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, + 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, 0x8007, + 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, + 0x900e, 0x080c, 0x0db5, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, + 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, + 0x080c, 0x1032, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x10ab, 0x090c, 0x0dd5, 0x00ee, 0x0005, 0x0086, 0x00e6, + 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, + 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, + 0x090c, 0x0dd5, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dd5, 0xa000, + 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, + 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1910, + 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, + 0x0dd5, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, 0x8001, + 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, + 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, + 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70c0, + 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, + 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, + 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, + 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, + 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x81a6, 0x012e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9026, 0x2009, + 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, 0x8940, 0x2800, 0xa802, + 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0440, 0x0120, 0x2848, + 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7000, 0x9005, 0x11a0, + 0x2001, 0x0534, 0xa802, 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800, + 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, + 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7104, 0x7200, + 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, 0x831b, 0x831b, 0x7312, + 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, 0x8900, 0xa802, 0x2040, + 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, 0x0130, 0x2848, 0x9188, + 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, 0x0000, 0x2071, 0x1800, + 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8, + 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440, + 0x0278, 0x9982, 0x0534, 0x0288, 0x9982, 0x0800, 0x1270, 0x0040, + 0x9982, 0x0800, 0x0250, 0x2071, 0x188d, 0x7010, 0x9902, 0x1228, + 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, + 0x2071, 0x1a16, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, + 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x00ee, 0x0005, + 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, 0x1a16, + 0x701c, 0x9088, 0x1a20, 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, + 0x7120, 0x9106, 0x090c, 0x0dd5, 0x7004, 0x9005, 0x1128, 0x00f6, + 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, + 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a16, 0x7004, 0x9005, 0x1128, + 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, + 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, + 0x1122, 0x12a5, 0x1120, 0x1120, 0x1299, 0x1299, 0x1299, 0x1299, + 0x080c, 0x0dd5, 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, + 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, + 0x9180, 0x1a20, 0x2004, 0x700a, 0x2048, 0x8108, 0x918c, 0x003f, + 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, + 0x780a, 0xa898, 0x780e, 0xa878, 0x700e, 0xa870, 0x7016, 0xa874, + 0x701a, 0xa868, 0x009e, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, + 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, + 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, + 0x7212, 0x8203, 0x7812, 0x782b, 0x0020, 0x782b, 0x0041, 0x002e, + 0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, + 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b, + 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, + 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, 0x7812, 0x782b, 0x0020, + 0x3300, 0x701a, 0x782b, 0x0001, 0x015e, 0x014e, 0x013e, 0x002e, + 0x001e, 0x0005, 0x2009, 0x1a16, 0x2104, 0xc095, 0x200a, 0x080c, + 0x10ff, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a16, 0x00f6, 0x2079, + 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0dce, 0x782b, 0x0002, 0xd1fc, + 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, + 0x0005, 0x1110, 0x11b8, 0x11ec, 0x12c4, 0x0dd5, 0x12df, 0x0dd5, + 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e8, + 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, + 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, 0x013e, + 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, + 0x1155, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, + 0x7007, 0x0000, 0x080c, 0x1110, 0x0005, 0x7008, 0x0096, 0x2048, + 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, + 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x116a, + 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x7007, + 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, 0x7804, + 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, 0x009e, + 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, 0x18b9, + 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, + 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, + 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, 0x080c, + 0x10ff, 0x0005, 0x00de, 0x009e, 0x080c, 0x10ff, 0x0005, 0xa8a8, + 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dd5, 0xa06c, + 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, + 0x4002, 0x080c, 0x6a3a, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, + 0x080c, 0x1032, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, + 0x0dd5, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, 0xa883, + 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, 0xa80e, + 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, 0x080c, + 0x10e0, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, 0x6a3a, + 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, + 0x080c, 0xab6b, 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, + 0x0000, 0x080c, 0x1032, 0x7007, 0x0000, 0x080c, 0x10ff, 0x00ae, + 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, 0x0005, + 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, 0x2001, 0x192e, + 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, + 0x780a, 0xa898, 0x780e, 0x782b, 0x0020, 0x0126, 0x2091, 0x8000, + 0x782b, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x2900, + 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099, 0x0088, + 0x782b, 0x0040, 0x0096, 0x2001, 0x192e, 0x204c, 0xaa7c, 0x009e, + 0x080c, 0x879b, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, 0x200a, + 0x080c, 0x860e, 0x7007, 0x0000, 0x080c, 0x1110, 0x0005, 0x7007, + 0x0000, 0x080c, 0x1110, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079, + 0x0300, 0x2071, 0x1a60, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x00c1, + 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x03ce, 0x2061, 0xe6bb, + 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, 0x12f8, + 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, 0x0005, + 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04a9, + 0x0cd0, 0x2001, 0x1a61, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, + 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, + 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a79, 0x781f, 0xff00, + 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, + 0x0303, 0x2061, 0x1a79, 0x602f, 0x1cd0, 0x2001, 0x181a, 0x2004, + 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1f4a, 0x604f, 0x193c, 0x2001, + 0x1927, 0x2004, 0x6042, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, + 0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc813, + 0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, + 0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xabe6, + 0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, + 0x0070, 0x190c, 0x0dce, 0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, + 0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0dd5, 0x0023, 0x012e, 0x0005, + 0x012e, 0x0005, 0x139e, 0x139e, 0x13b5, 0x13ba, 0x13be, 0x13c3, + 0x13eb, 0x13ef, 0x13fd, 0x1401, 0x139e, 0x14cc, 0x14d0, 0x1535, + 0x153c, 0x139e, 0x153d, 0x153e, 0x1549, 0x1550, 0x139e, 0x139e, + 0x139e, 0x139e, 0x139e, 0x139e, 0x139e, 0x13c5, 0x139e, 0x139e, + 0x139e, 0x139e, 0x139e, 0x139e, 0x13a2, 0x13a0, 0x080c, 0x0dd5, + 0x080c, 0x0dce, 0x080c, 0x155b, 0x2009, 0x1a78, 0x2104, 0x8000, + 0x200a, 0x080c, 0x7c01, 0x080c, 0x19ff, 0x0005, 0x2009, 0x0048, + 0x2060, 0x080c, 0xabe6, 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, + 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x155b, + 0x080c, 0x161f, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x155b, 0x2060, + 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, + 0x080c, 0xabe6, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, + 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, + 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x1560, 0x2001, 0x0307, + 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, + 0x155b, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, + 0x2009, 0x0048, 0x080c, 0xabe6, 0x0005, 0x080c, 0x155b, 0x080c, + 0x0dd5, 0x080c, 0x155b, 0x080c, 0x14b7, 0x7827, 0x0018, 0x79ac, + 0xd1dc, 0x0904, 0x146a, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, + 0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, + 0x0804, 0x1470, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, + 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0dd5, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x149c, 0x78ab, + 0x0004, 0x7803, 0x0001, 0x080c, 0x14d0, 0x0005, 0x7827, 0x0018, + 0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, + 0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, + 0x00ee, 0x080c, 0x19ff, 0x080c, 0x1308, 0x7803, 0x0001, 0x0005, + 0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, + 0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, + 0x0004, 0x7803, 0x0001, 0x080c, 0x14d0, 0x2001, 0x020d, 0x2003, + 0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0dd5, + 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, + 0x7c01, 0x080c, 0x19ff, 0x080c, 0xc825, 0x0158, 0xa9ac, 0xa936, + 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, + 0xa882, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, + 0x080c, 0xabe6, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x6024, 0x190c, 0xcc03, 0x2029, 0x00c8, 0x8529, 0x0128, + 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe664, + 0xd5a4, 0x1118, 0x080c, 0x1560, 0x0005, 0x080c, 0x7c01, 0x080c, + 0x19ff, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, + 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, + 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x15d1, 0x00fe, + 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, + 0x7104, 0x9184, 0x0004, 0x190c, 0x0dd5, 0xd184, 0x1189, 0xd19c, + 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, + 0x0020, 0x080c, 0x1560, 0x0005, 0x81ff, 0x190c, 0x0dd5, 0x0005, + 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, + 0x0200, 0x080c, 0x160c, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, + 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, + 0x908e, 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, + 0x080c, 0x1689, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x180e, + 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, + 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, + 0x1560, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x1308, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, - 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, - 0x0053, 0x080c, 0x9a50, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, - 0x0005, 0x080c, 0x13d9, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, - 0x8109, 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, - 0x0000, 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, - 0x9182, 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, - 0x810c, 0x810c, 0x080c, 0x14c4, 0x6827, 0x0001, 0x8109, 0x1dd0, - 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, - 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, - 0x08c0, 0x080c, 0x763f, 0x080c, 0x1872, 0x0090, 0x7827, 0x0015, - 0x782b, 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, - 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, - 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, - 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, - 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, - 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, - 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, - 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x12d6, 0x00ce, 0x002e, - 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, - 0x2009, 0xff00, 0x8109, 0x0130, 0x7818, 0xd0bc, 0x1dd8, 0x000e, - 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, - 0x0db2, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x2009, 0xff00, - 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x792c, 0x3900, - 0x8000, 0x2004, 0x080c, 0x0db2, 0x7037, 0x0001, 0x7150, 0x7037, - 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, - 0x00e6, 0x0016, 0x2071, 0x0200, 0x0c79, 0x6124, 0xd1dc, 0x01f8, - 0x701c, 0xd08c, 0x0904, 0x1577, 0x7017, 0x0000, 0x2001, 0x0264, - 0x2004, 0xd0bc, 0x0904, 0x1577, 0x2001, 0x0268, 0x00c6, 0x2064, - 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x1577, 0x9c06, - 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c, 0x7597, 0x012e, 0x7358, - 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb9b4, 0xab42, 0xac3e, 0x2001, - 0x1875, 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, - 0xa837, 0xffff, 0x080c, 0x1dc2, 0x1190, 0x080c, 0x1705, 0x2a00, - 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, - 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, - 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x1461, 0x0005, - 0x080c, 0x0db2, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, - 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, - 0x000f, 0x9088, 0x1da2, 0x2165, 0x0002, 0x15ac, 0x15f9, 0x15ac, - 0x15ac, 0x15ac, 0x15db, 0x15ac, 0x15b0, 0x15a5, 0x15f0, 0x15ac, - 0x15ac, 0x15ac, 0x16b4, 0x15c4, 0x15ba, 0xa964, 0x918c, 0x00ff, - 0x918e, 0x0048, 0x0904, 0x15f0, 0x9085, 0x0001, 0x0804, 0x16ac, - 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, - 0x0804, 0x1600, 0xa87c, 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, - 0xa83e, 0xa888, 0x0804, 0x164f, 0xa87c, 0xd0bc, 0x0d28, 0xa890, - 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0db2, 0xa164, - 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1da2, 0x2065, 0xa888, 0xd19c, - 0x1904, 0x164f, 0x0428, 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, - 0x090c, 0x0db2, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1da2, - 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x164f, 0x0080, - 0xa87c, 0xd0ac, 0x0904, 0x15ac, 0x9006, 0xa842, 0xa83e, 0x0804, - 0x164f, 0xa87c, 0xd0ac, 0x0904, 0x15ac, 0x9006, 0xa842, 0xa83e, - 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, - 0x1623, 0x1623, 0x1625, 0x1623, 0x1623, 0x1623, 0x162b, 0x1623, - 0x1623, 0x1623, 0x1631, 0x1623, 0x1623, 0x1623, 0x1637, 0x1623, - 0x1623, 0x1623, 0x163d, 0x1623, 0x1623, 0x1623, 0x1643, 0x1623, - 0x1623, 0x1623, 0x1649, 0x080c, 0x0db2, 0xa574, 0xa478, 0xa37c, - 0xa280, 0x0804, 0x1694, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, - 0x1694, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1694, 0xa5a4, - 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1694, 0xa5b4, 0xa4b8, 0xa3bc, - 0xa2c0, 0x0804, 0x1694, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, - 0x1694, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1694, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1672, - 0x1670, 0x1670, 0x1670, 0x1670, 0x1670, 0x1679, 0x1670, 0x1670, - 0x1670, 0x1670, 0x1670, 0x1680, 0x1670, 0x1670, 0x1670, 0x1670, - 0x1670, 0x1687, 0x1670, 0x1670, 0x1670, 0x1670, 0x1670, 0x168e, - 0x080c, 0x0db2, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, - 0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x00a0, - 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, - 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, - 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, + 0x0050, 0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, + 0x0053, 0x080c, 0xabe6, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, + 0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8af8, + 0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x86fb, 0x0cd0, 0x0005, + 0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, + 0x080c, 0x15d1, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, + 0x080c, 0x14b7, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, + 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, + 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, + 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, + 0x810c, 0x080c, 0x15c3, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, + 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, + 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, + 0x080c, 0x7c01, 0x080c, 0x19ff, 0x0090, 0x7827, 0x0015, 0x782b, + 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, + 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, + 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, + 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, + 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, + 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, + 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, + 0x0016, 0x0026, 0x00c6, 0x080c, 0x1363, 0x00ce, 0x002e, 0x001e, + 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, + 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, + 0x2004, 0x080c, 0x0dd5, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, + 0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, + 0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, + 0x8000, 0x2004, 0x080c, 0x0dd5, 0x7037, 0x0001, 0x7150, 0x7037, + 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c, + 0xff00, 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, + 0x0016, 0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c, + 0xd08c, 0x0904, 0x167e, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, + 0xd0bc, 0x0904, 0x167e, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, + 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x167e, 0x9c06, 0x15f0, + 0x0126, 0x2091, 0x2600, 0x080c, 0x7b59, 0x012e, 0x7358, 0x745c, + 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x190c, 0xcbde, 0xab42, 0xac3e, 0x2001, 0x1869, + 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, + 0xffff, 0x080c, 0x1f6a, 0x1190, 0x080c, 0x185d, 0x2a00, 0xa816, + 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, + 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, + 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x1560, 0x0005, 0x080c, + 0x0dd5, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, + 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, + 0x9088, 0x1f4a, 0x2165, 0x0002, 0x16b3, 0x1721, 0x16b3, 0x16b3, + 0x16b7, 0x1702, 0x16b3, 0x16d7, 0x16ac, 0x1718, 0x16b3, 0x16b3, + 0x16bc, 0x180c, 0x16eb, 0x16e1, 0xa964, 0x918c, 0x00ff, 0x918e, + 0x0048, 0x0904, 0x1718, 0x9085, 0x0001, 0x0804, 0x1804, 0xa87c, + 0xd0ac, 0x0dc8, 0x0804, 0x1728, 0xa87c, 0xd0ac, 0x0da0, 0x0804, + 0x1793, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, + 0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x8cbf, 0x2005, + 0x9005, 0x090c, 0x0dd5, 0x2004, 0xa8ae, 0x0804, 0x17ec, 0xa87c, + 0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, + 0x1728, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, + 0xa888, 0x0804, 0x1793, 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, + 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa164, 0xa91a, + 0x91ec, 0x000f, 0x9d80, 0x1f4a, 0x2065, 0xa888, 0xd19c, 0x1904, + 0x1793, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x16b3, 0xa804, 0x9045, + 0x090c, 0x0dd5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f4a, + 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1793, 0x0080, + 0xa87c, 0xd0ac, 0x0904, 0x16b3, 0x9006, 0xa842, 0xa83e, 0x0804, + 0x1793, 0xa87c, 0xd0ac, 0x0904, 0x16b3, 0x9006, 0xa842, 0xa83e, + 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, + 0x174b, 0x174b, 0x174d, 0x174b, 0x174b, 0x174b, 0x1757, 0x174b, + 0x174b, 0x174b, 0x1761, 0x174b, 0x174b, 0x174b, 0x176b, 0x174b, + 0x174b, 0x174b, 0x1775, 0x174b, 0x174b, 0x174b, 0x177f, 0x174b, + 0x174b, 0x174b, 0x1789, 0x080c, 0x0dd5, 0xa574, 0xa478, 0x9d86, + 0x0024, 0x0904, 0x16c1, 0xa37c, 0xa280, 0x0804, 0x17ec, 0xa584, + 0xa488, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa38c, 0xa290, 0x0804, + 0x17ec, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa39c, + 0xa2a0, 0x0804, 0x17ec, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, + 0x16c1, 0xa3ac, 0xa2b0, 0x0804, 0x17ec, 0xa5b4, 0xa4b8, 0x9d86, + 0x0024, 0x0904, 0x16c1, 0xa3bc, 0xa2c0, 0x0804, 0x17ec, 0xa5c4, + 0xa4c8, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa3cc, 0xa2d0, 0x0804, + 0x17ec, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa3dc, + 0xa2e0, 0x0804, 0x17ec, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, + 0x9082, 0x001b, 0x0002, 0x17b6, 0x17b4, 0x17b4, 0x17b4, 0x17b4, + 0x17b4, 0x17c1, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17cc, + 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17d7, 0x17b4, 0x17b4, + 0x17b4, 0x17b4, 0x17b4, 0x17e2, 0x080c, 0x0dd5, 0xa56c, 0xa470, + 0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x16c1, 0xa37c, 0xa280, + 0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, + 0x16c1, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, + 0x9d86, 0x002c, 0x0904, 0x16c1, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, + 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x16c1, 0xa3c4, + 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, + 0x0904, 0x16c1, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0x2800, 0xa80e, - 0xab0a, 0x2c00, 0xa812, 0x0c80, 0x0804, 0x15ac, 0x2ff0, 0x0126, + 0xab0a, 0x2c00, 0xa812, 0x0c80, 0x0804, 0x16b3, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, - 0x1d9d, 0xa80b, 0x1d9d, 0x2c05, 0xa812, 0xa964, 0xa91a, 0xa87c, - 0xd0ac, 0x090c, 0x0db2, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, - 0x0034, 0x1a0c, 0x0db2, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, + 0x1f45, 0xa813, 0x1f45, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, + 0xd0ac, 0x090c, 0x0dd5, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, + 0x0034, 0x1a0c, 0x0dd5, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, - 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0db2, 0xa80e, 0xa064, - 0xa81a, 0x9084, 0x000f, 0x9080, 0x1da2, 0x2015, 0x82ff, 0x090c, - 0x0db2, 0xaa0a, 0x2205, 0xa812, 0x0c18, 0x903e, 0x2730, 0xa880, - 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x17fa, 0x175c, 0x175c, 0x17fa, - 0x17fa, 0x17f4, 0x17fa, 0x175c, 0x17fa, 0x17ab, 0x17ab, 0x17fa, - 0x17fa, 0x17fa, 0x17f1, 0x17ab, 0xc0fc, 0xa882, 0xab2c, 0xaa30, - 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x17fc, 0x2c05, 0x908a, 0x0034, - 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1748, 0x1746, 0x1746, - 0x1746, 0x1746, 0x1746, 0x174c, 0x1746, 0x1746, 0x1746, 0x1746, - 0x1746, 0x1750, 0x1746, 0x1746, 0x1746, 0x1746, 0x1746, 0x1754, - 0x1746, 0x1746, 0x1746, 0x1746, 0x1746, 0x1758, 0x080c, 0x0db2, - 0xa774, 0xa678, 0x0804, 0x17fc, 0xa78c, 0xa690, 0x0804, 0x17fc, - 0xa7a4, 0xa6a8, 0x0804, 0x17fc, 0xa7bc, 0xa6c0, 0x0804, 0x17fc, - 0xa7d4, 0xa6d8, 0x0804, 0x17fc, 0x2c05, 0x908a, 0x0036, 0x1a0c, - 0x0db2, 0x9082, 0x001b, 0x0002, 0x177f, 0x177f, 0x1781, 0x177f, - 0x177f, 0x177f, 0x1787, 0x177f, 0x177f, 0x177f, 0x178d, 0x177f, - 0x177f, 0x177f, 0x1793, 0x177f, 0x177f, 0x177f, 0x1799, 0x177f, - 0x177f, 0x177f, 0x179f, 0x177f, 0x177f, 0x177f, 0x17a5, 0x080c, - 0x0db2, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x17fc, 0xa584, - 0xa488, 0xa38c, 0xa290, 0x0804, 0x17fc, 0xa594, 0xa498, 0xa39c, - 0xa2a0, 0x0804, 0x17fc, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, - 0x17fc, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x17fc, 0xa5c4, - 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x17fc, 0xa5d4, 0xa4d8, 0xa3dc, - 0xa2e0, 0x0804, 0x17fc, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db2, - 0x9082, 0x001b, 0x0002, 0x17ce, 0x17cc, 0x17cc, 0x17cc, 0x17cc, - 0x17cc, 0x17d5, 0x17cc, 0x17cc, 0x17cc, 0x17cc, 0x17cc, 0x17dc, - 0x17cc, 0x17cc, 0x17cc, 0x17cc, 0x17cc, 0x17e3, 0x17cc, 0x17cc, - 0x17cc, 0x17cc, 0x17cc, 0x17ea, 0x080c, 0x0db2, 0xa56c, 0xa470, - 0xa774, 0xa678, 0xa37c, 0xa280, 0x0438, 0xa584, 0xa488, 0xa78c, - 0xa690, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, - 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, - 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, - 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, 0x1d60, 0x1904, 0x1705, - 0x900e, 0x0050, 0x080c, 0x0db2, 0xab2e, 0xaa32, 0xad1e, 0xac22, - 0xaf26, 0xae2a, 0x080c, 0x1d60, 0x0005, 0x6014, 0x2048, 0x6118, - 0x810c, 0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, - 0xa986, 0x601b, 0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, - 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, - 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0x9a50, 0x0005, 0x0126, - 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, - 0x0000, 0x05b0, 0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, - 0x0006, 0x2031, 0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, - 0x0120, 0x080c, 0x12d6, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, - 0x2031, 0x0168, 0x00c6, 0x7808, 0xd09c, 0x190c, 0x12d6, 0x00ce, - 0x2001, 0x0038, 0x080c, 0x18ff, 0x7930, 0x9186, 0x0040, 0x0160, - 0x9186, 0x0042, 0x190c, 0x0db2, 0x2001, 0x001e, 0x8001, 0x1df0, - 0x8631, 0x1d40, 0x080c, 0x190e, 0x000e, 0x6022, 0x012e, 0x0005, - 0x080c, 0x18fb, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, - 0x0000, 0x0ca0, 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, - 0x0004, 0x00fe, 0x080c, 0x6c53, 0x11b0, 0x2001, 0x0138, 0x2003, - 0x0000, 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, - 0xa001, 0x8211, 0x1de0, 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, - 0x6d03, 0x006e, 0x0005, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, - 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, - 0x28dc, 0x2009, 0x003c, 0x080c, 0x20d9, 0x2001, 0x015d, 0x2003, - 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x7b7c, 0x70a0, - 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, - 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, 0x12a0, 0x7803, 0x0001, - 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, - 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x6c53, 0x1108, - 0x0005, 0x2021, 0x0260, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, - 0x2001, 0x0109, 0x201c, 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, - 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, - 0x0000, 0x0005, 0x0046, 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, - 0xa001, 0x201c, 0x939c, 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, - 0x0c60, 0x004e, 0x0c40, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, - 0x621c, 0x080c, 0x14d2, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, - 0x14f9, 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, - 0x781c, 0x9084, 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, - 0x0040, 0x0904, 0x196c, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, - 0x080c, 0x0db2, 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, - 0x2001, 0x0b10, 0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, - 0x2001, 0x0030, 0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, - 0x1da8, 0x781f, 0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, - 0x0821, 0x9186, 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x1905, - 0x9186, 0x0040, 0x190c, 0x0db2, 0x00d6, 0x2069, 0x0200, 0x692c, - 0xd1f4, 0x1170, 0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, - 0x1800, 0x6802, 0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, - 0x00de, 0x781f, 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0db2, - 0xa001, 0xa001, 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, - 0x2071, 0x1a34, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, - 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x19f1, 0xa964, 0x9184, - 0x0007, 0x0002, 0x198a, 0x19dc, 0x1991, 0x1991, 0x1991, 0x19c4, - 0x19a4, 0x1993, 0x2100, 0x9084, 0x00ff, 0x9086, 0x0048, 0x0904, - 0x19dc, 0x080c, 0x0db2, 0xa87c, 0xd0b4, 0x0904, 0x1ba3, 0xa890, - 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, - 0xa84a, 0xa988, 0x0804, 0x19e4, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1ba3, 0xa890, 0xa842, - 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, - 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1da2, - 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, - 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1ba3, 0xa804, 0xa85a, 0x2040, - 0xa064, 0x9084, 0x000f, 0x9080, 0x1da2, 0x2005, 0xa812, 0xa988, - 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1ba3, - 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, - 0x000f, 0x9080, 0x1da2, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, - 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, - 0x1be4, 0x00e6, 0x2071, 0x1a34, 0x7000, 0x9005, 0x1904, 0x1a4b, - 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, 0x2004, 0x782b, - 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0x00fe, 0x00b6, - 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, 0x2079, 0x0200, - 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, - 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0xa814, 0x2050, - 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec, 0x000f, 0xa944, - 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006, 0x700e, 0x7012, - 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c, 0xa834, 0x9106, - 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000, 0x00a1, 0x0108, - 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005, 0x0036, 0x0046, - 0xab38, 0xac34, 0x080c, 0x1dc2, 0x004e, 0x003e, 0x0d50, 0x0c98, - 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, - 0x0026, 0x8aff, 0x0904, 0x1b9c, 0x700c, 0x7214, 0x923a, 0x7010, - 0x7218, 0x9203, 0x0a04, 0x1b9b, 0x9705, 0x0904, 0x1b9b, 0x903e, - 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1b7f, 0x1ac6, - 0x1ac6, 0x1b7f, 0x1b7f, 0x1b62, 0x1b7f, 0x1ac6, 0x1b68, 0x1b15, - 0x1b15, 0x1b7f, 0x1b7f, 0x1b7f, 0x1b5c, 0x1b15, 0xc0fc, 0xa882, - 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1b81, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1ab2, - 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab6, 0x1ab0, 0x1ab0, - 0x1ab0, 0x1ab0, 0x1ab0, 0x1aba, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab0, - 0x1ab0, 0x1abe, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ab0, 0x1ac2, - 0x080c, 0x0db2, 0xa774, 0xa678, 0x0804, 0x1b81, 0xa78c, 0xa690, - 0x0804, 0x1b81, 0xa7a4, 0xa6a8, 0x0804, 0x1b81, 0xa7bc, 0xa6c0, - 0x0804, 0x1b81, 0xa7d4, 0xa6d8, 0x0804, 0x1b81, 0x2c05, 0x908a, - 0x0036, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1ae9, 0x1ae9, - 0x1aeb, 0x1ae9, 0x1ae9, 0x1ae9, 0x1af1, 0x1ae9, 0x1ae9, 0x1ae9, - 0x1af7, 0x1ae9, 0x1ae9, 0x1ae9, 0x1afd, 0x1ae9, 0x1ae9, 0x1ae9, - 0x1b03, 0x1ae9, 0x1ae9, 0x1ae9, 0x1b09, 0x1ae9, 0x1ae9, 0x1ae9, - 0x1b0f, 0x080c, 0x0db2, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, - 0x1b81, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1b81, 0xa594, - 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1b81, 0xa5a4, 0xa4a8, 0xa3ac, - 0xa2b0, 0x0804, 0x1b81, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, - 0x1b81, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1b81, 0xa5d4, - 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1b81, 0x2c05, 0x908a, 0x0034, - 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1b38, 0x1b36, 0x1b36, - 0x1b36, 0x1b36, 0x1b36, 0x1b40, 0x1b36, 0x1b36, 0x1b36, 0x1b36, - 0x1b36, 0x1b47, 0x1b36, 0x1b36, 0x1b36, 0x1b36, 0x1b36, 0x1b4e, - 0x1b36, 0x1b36, 0x1b36, 0x1b36, 0x1b36, 0x1b55, 0x080c, 0x0db2, - 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804, 0x1b81, - 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x04d0, 0xa59c, - 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0498, 0xa5b4, 0xa4b8, - 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0460, 0xa5cc, 0xa4d0, 0xa7d4, - 0xa6d8, 0xa3dc, 0xa2e0, 0x0428, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x001e, 0x11e8, 0x080c, 0x1d60, 0x1904, 0x1a61, 0x900e, 0x04a0, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0048, 0x190c, 0x0db2, 0x00c6, - 0x7004, 0x2060, 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, 0x1b15, - 0xab9c, 0x9016, 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0010, 0x080c, - 0x0db2, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b, + 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa80e, 0xa064, + 0xa81a, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2015, 0x82ff, 0x090c, + 0x0dd5, 0xaa12, 0x2205, 0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880, + 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1987, 0x18b4, 0x18b4, 0x1987, + 0x18b4, 0x1981, 0x1987, 0x18b4, 0x1987, 0x1924, 0x1924, 0x1987, + 0x1924, 0x1987, 0x197e, 0x1924, 0xc0fc, 0xa882, 0xab2c, 0xaa30, + 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1989, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x18a0, 0x189e, 0x189e, + 0x189e, 0x189e, 0x189e, 0x18a4, 0x189e, 0x189e, 0x189e, 0x189e, + 0x189e, 0x18a8, 0x189e, 0x189e, 0x189e, 0x189e, 0x189e, 0x18ac, + 0x189e, 0x189e, 0x189e, 0x189e, 0x189e, 0x18b0, 0x080c, 0x0dd5, + 0xa774, 0xa678, 0x0804, 0x1989, 0xa78c, 0xa690, 0x0804, 0x1989, + 0xa7a4, 0xa6a8, 0x0804, 0x1989, 0xa7bc, 0xa6c0, 0x0804, 0x1989, + 0xa7d4, 0xa6d8, 0x0804, 0x1989, 0xa898, 0x901d, 0x1108, 0xab9c, + 0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, + 0x0002, 0x18dc, 0x18dc, 0x18de, 0x18dc, 0x18dc, 0x18dc, 0x18e8, + 0x18dc, 0x18dc, 0x18dc, 0x18f2, 0x18dc, 0x18dc, 0x18dc, 0x18fc, + 0x18dc, 0x18dc, 0x18dc, 0x1906, 0x18dc, 0x18dc, 0x18dc, 0x1910, + 0x18dc, 0x18dc, 0x18dc, 0x191a, 0x080c, 0x0dd5, 0xa574, 0xa478, + 0x9d86, 0x0004, 0x0904, 0x1989, 0xa37c, 0xa280, 0x0804, 0x1989, + 0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1989, 0xa38c, 0xa290, + 0x0804, 0x1989, 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1989, + 0xa39c, 0xa2a0, 0x0804, 0x1989, 0xa5a4, 0xa4a8, 0x9d86, 0x0004, + 0x0904, 0x1989, 0xa3ac, 0xa2b0, 0x0804, 0x1989, 0xa5b4, 0xa4b8, + 0x9d86, 0x0004, 0x0904, 0x1989, 0xa3bc, 0xa2c0, 0x0804, 0x1989, + 0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1989, 0xa3cc, 0xa2d0, + 0x0804, 0x1989, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1989, + 0xa3dc, 0xa2e0, 0x0804, 0x1989, 0xa898, 0x901d, 0x1108, 0xab9c, + 0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, + 0x0002, 0x194c, 0x194a, 0x194a, 0x194a, 0x194a, 0x194a, 0x1956, + 0x194a, 0x194a, 0x194a, 0x194a, 0x194a, 0x1960, 0x194a, 0x194a, + 0x194a, 0x194a, 0x194a, 0x196a, 0x194a, 0x194a, 0x194a, 0x194a, + 0x194a, 0x1974, 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, + 0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488, + 0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448, + 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac, + 0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c, + 0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, + 0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, + 0x1130, 0x080c, 0x1f08, 0x1904, 0x185d, 0x900e, 0x0050, 0x080c, + 0x0dd5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, + 0x1f08, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, + 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, + 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, + 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, + 0x0048, 0x0804, 0xabe6, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, + 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, + 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, + 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x1363, + 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, + 0x7808, 0xd09c, 0x190c, 0x1363, 0x00ce, 0x2001, 0x0038, 0x080c, + 0x1a8c, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, + 0x0dd5, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, + 0x1a9b, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1a88, 0x7827, + 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, + 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, + 0x717d, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, + 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, + 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x722d, 0x006e, 0x0005, + 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, + 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2af6, 0x2009, 0x003c, + 0x080c, 0x2284, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, + 0x003c, 0x1de0, 0x080c, 0x81a6, 0x70a0, 0x70a2, 0x7098, 0x709a, + 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, + 0x0300, 0x080c, 0x1308, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, + 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, + 0x2003, 0x0000, 0x080c, 0x717d, 0x1108, 0x0005, 0x2021, 0x0260, + 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, + 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, + 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, + 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, + 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, + 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15d1, + 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15fe, 0x7930, 0x0005, + 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, + 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1af9, + 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0dd5, 0x781f, + 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, + 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, + 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, + 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, + 0x0140, 0x2001, 0x0030, 0x080c, 0x1a92, 0x9186, 0x0040, 0x190c, + 0x0dd5, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, + 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, + 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, + 0x791c, 0x9184, 0x0007, 0x090c, 0x0dd5, 0xa001, 0xa001, 0x781f, + 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a64, 0x2079, + 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c, + 0xd1dc, 0x1904, 0x1b8b, 0xa964, 0x9184, 0x0007, 0x0002, 0x1b17, + 0x1b76, 0x1b1e, 0x1b20, 0x1b1e, 0x1b5e, 0x1b3e, 0x1b2d, 0x2100, + 0x9084, 0x00ff, 0x9086, 0x0048, 0x0904, 0x1b76, 0x080c, 0x0dd5, + 0x9184, 0x00ff, 0x9086, 0x0013, 0x0904, 0x1b76, 0x9184, 0x00ff, + 0x9086, 0x001b, 0x0904, 0x1b76, 0x0c88, 0xa87c, 0xd0b4, 0x0904, + 0x1d4b, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, + 0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1b7e, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x001e, 0x19d0, 0xa87c, 0xd0b4, 0x0904, 0x1d4b, + 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, + 0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, + 0x9080, 0x1f4a, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, + 0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1d4b, 0xa804, + 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2005, + 0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, + 0x0904, 0x1d4b, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, + 0xa864, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2005, 0xa812, 0xa916, + 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, + 0xd0fc, 0x190c, 0x1d8c, 0x00e6, 0x2071, 0x1a64, 0x7000, 0x9005, + 0x1904, 0x1be5, 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, + 0x2004, 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, + 0x00fe, 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, + 0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, + 0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, + 0xa814, 0x2050, 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec, + 0x000f, 0xa944, 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006, + 0x700e, 0x7012, 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c, + 0xa834, 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000, + 0x00a1, 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005, + 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x1f6a, 0x004e, 0x003e, + 0x0d50, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056, + 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1d44, 0x700c, 0x7214, + 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1d43, 0x9705, 0x0904, + 0x1d43, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, + 0x1d1c, 0x1c60, 0x1c60, 0x1d1c, 0x1d1c, 0x1cfe, 0x1d1c, 0x1c60, + 0x1d05, 0x1caf, 0x1caf, 0x1d1c, 0x1d1c, 0x1d1c, 0x1cf8, 0x1caf, + 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, + 0x1d29, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, + 0x0002, 0x1c4c, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c50, + 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c54, 0x1c4a, 0x1c4a, + 0x1c4a, 0x1c4a, 0x1c4a, 0x1c58, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, + 0x1c4a, 0x1c5c, 0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1d29, + 0xa78c, 0xa690, 0x0804, 0x1d29, 0xa7a4, 0xa6a8, 0x0804, 0x1d29, + 0xa7bc, 0xa6c0, 0x0804, 0x1d29, 0xa7d4, 0xa6d8, 0x0804, 0x1d29, + 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, + 0x1c83, 0x1c83, 0x1c85, 0x1c83, 0x1c83, 0x1c83, 0x1c8b, 0x1c83, + 0x1c83, 0x1c83, 0x1c91, 0x1c83, 0x1c83, 0x1c83, 0x1c97, 0x1c83, + 0x1c83, 0x1c83, 0x1c9d, 0x1c83, 0x1c83, 0x1c83, 0x1ca3, 0x1c83, + 0x1c83, 0x1c83, 0x1ca9, 0x080c, 0x0dd5, 0xa574, 0xa478, 0xa37c, + 0xa280, 0x0804, 0x1d29, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, + 0x1d29, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1d29, 0xa5a4, + 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1d29, 0xa5b4, 0xa4b8, 0xa3bc, + 0xa2c0, 0x0804, 0x1d29, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, + 0x1d29, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1d29, 0x2c05, + 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1cd2, + 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cda, 0x1cd0, 0x1cd0, + 0x1cd0, 0x1cd0, 0x1cd0, 0x1ce2, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, + 0x1cd0, 0x1cea, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cf1, + 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, + 0x0804, 0x1d29, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, + 0x0804, 0x1d29, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, + 0x0804, 0x1d29, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, + 0x04c0, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0488, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x11f0, 0x080c, 0x1f08, + 0x1904, 0x1bfb, 0x900e, 0x0804, 0x1d44, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0048, 0x190c, 0x0dd5, 0x00c6, 0x7004, 0x2060, 0x6004, + 0x9086, 0x0043, 0x00ce, 0x0904, 0x1caf, 0xab9c, 0x9016, 0xad8c, + 0xac90, 0xaf94, 0xae98, 0x0068, 0xa964, 0x918c, 0x00ff, 0x9186, + 0x0013, 0x0904, 0x1c60, 0x9186, 0x001b, 0x0904, 0x1caf, 0x080c, + 0x0dd5, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, 0x7012, - 0x080c, 0x1d60, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, 0x005e, - 0x006e, 0x007e, 0x0005, 0x080c, 0x0db2, 0x0026, 0x2001, 0x0105, + 0x080c, 0x1f08, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, 0x005e, + 0x006e, 0x007e, 0x0005, 0x080c, 0x0dd5, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, - 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0118, 0xa880, 0xc0bd, 0xa882, + 0x6014, 0x2048, 0x080c, 0xc825, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, - 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xb251, 0x00ce, - 0x2001, 0x19c5, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, - 0x20d9, 0x080c, 0x9479, 0x2011, 0x0000, 0x080c, 0x92f6, 0x080c, - 0x865d, 0x002e, 0x0804, 0x1d12, 0x0126, 0x2091, 0x2400, 0xa858, - 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1ba5, - 0x7000, 0x0002, 0x1d12, 0x1bf6, 0x1c63, 0x1d10, 0x8001, 0x7002, - 0xd19c, 0x1150, 0x8aff, 0x05b0, 0x080c, 0x1a5b, 0x0904, 0x1d12, - 0x080c, 0x1a5b, 0x0804, 0x1d12, 0x782b, 0x0004, 0xd194, 0x0148, + 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xc472, 0x00ce, + 0x2001, 0x19f4, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, + 0x2284, 0x080c, 0xa4d6, 0x2011, 0x0000, 0x080c, 0xa353, 0x080c, + 0x9548, 0x002e, 0x0804, 0x1eba, 0x0126, 0x2091, 0x2400, 0xa858, + 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1d4d, + 0x7000, 0x0002, 0x1eba, 0x1d9e, 0x1e0b, 0x1eb8, 0x8001, 0x7002, + 0xd19c, 0x1150, 0x8aff, 0x05b0, 0x080c, 0x1bf5, 0x0904, 0x1eba, + 0x080c, 0x1bf5, 0x0804, 0x1eba, 0x782b, 0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x11d8, 0xa87c, 0xc0f5, 0xa87e, 0x00b8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, 0xa832, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, 0xab3e, - 0xaa42, 0x003e, 0x002e, 0x080c, 0x1d78, 0xa880, 0xc0fd, 0xa882, + 0xaa42, 0x003e, 0x002e, 0x080c, 0x1f20, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x7003, 0x0000, - 0x0804, 0x1d12, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, + 0x0804, 0x1eba, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, - 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0db2, 0x7820, 0xd0bc, + 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dd5, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x002e, 0x00fe, 0x782b, 0x0008, 0x7003, - 0x0000, 0x0804, 0x1d12, 0x8001, 0x7002, 0xd194, 0x0170, 0x782c, - 0xd0fc, 0x1904, 0x1be9, 0xd19c, 0x1904, 0x1d0e, 0x8aff, 0x0904, - 0x1d12, 0x080c, 0x1a5b, 0x0804, 0x1d12, 0x0026, 0x0036, 0xab3c, - 0xaa40, 0x080c, 0x1d78, 0xdd9c, 0x1904, 0x1ccd, 0x2c05, 0x908a, - 0x0036, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1ca1, 0x1ca1, - 0x1ca3, 0x1ca1, 0x1ca1, 0x1ca1, 0x1ca9, 0x1ca1, 0x1ca1, 0x1ca1, - 0x1caf, 0x1ca1, 0x1ca1, 0x1ca1, 0x1cb5, 0x1ca1, 0x1ca1, 0x1ca1, - 0x1cbb, 0x1ca1, 0x1ca1, 0x1ca1, 0x1cc1, 0x1ca1, 0x1ca1, 0x1ca1, - 0x1cc7, 0x080c, 0x0db2, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, - 0x1c15, 0xa08c, 0x931a, 0xa090, 0x9213, 0x0804, 0x1c15, 0xa09c, - 0x931a, 0xa0a0, 0x9213, 0x0804, 0x1c15, 0xa0ac, 0x931a, 0xa0b0, - 0x9213, 0x0804, 0x1c15, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, - 0x1c15, 0xa0cc, 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1c15, 0xa0dc, - 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1c15, 0x2c05, 0x908a, 0x0034, - 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1cf0, 0x1cee, 0x1cee, - 0x1cee, 0x1cee, 0x1cee, 0x1cf6, 0x1cee, 0x1cee, 0x1cee, 0x1cee, - 0x1cee, 0x1cfc, 0x1cee, 0x1cee, 0x1cee, 0x1cee, 0x1cee, 0x1d02, - 0x1cee, 0x1cee, 0x1cee, 0x1cee, 0x1cee, 0x1d08, 0x080c, 0x0db2, - 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1c15, 0xa094, 0x931a, - 0xa098, 0x9213, 0x0804, 0x1c15, 0xa0ac, 0x931a, 0xa0b0, 0x9213, - 0x0804, 0x1c15, 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1c15, - 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1c15, 0x0804, 0x1c11, - 0x080c, 0x0db2, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a34, - 0x7000, 0x9086, 0x0000, 0x0904, 0x1d5d, 0x2079, 0x0090, 0x2009, + 0x0000, 0x0804, 0x1eba, 0x8001, 0x7002, 0xd194, 0x0170, 0x782c, + 0xd0fc, 0x1904, 0x1d91, 0xd19c, 0x1904, 0x1eb6, 0x8aff, 0x0904, + 0x1eba, 0x080c, 0x1bf5, 0x0804, 0x1eba, 0x0026, 0x0036, 0xab3c, + 0xaa40, 0x080c, 0x1f20, 0xdd9c, 0x1904, 0x1e75, 0x2c05, 0x908a, + 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1e49, 0x1e49, + 0x1e4b, 0x1e49, 0x1e49, 0x1e49, 0x1e51, 0x1e49, 0x1e49, 0x1e49, + 0x1e57, 0x1e49, 0x1e49, 0x1e49, 0x1e5d, 0x1e49, 0x1e49, 0x1e49, + 0x1e63, 0x1e49, 0x1e49, 0x1e49, 0x1e69, 0x1e49, 0x1e49, 0x1e49, + 0x1e6f, 0x080c, 0x0dd5, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, + 0x1dbd, 0xa08c, 0x931a, 0xa090, 0x9213, 0x0804, 0x1dbd, 0xa09c, + 0x931a, 0xa0a0, 0x9213, 0x0804, 0x1dbd, 0xa0ac, 0x931a, 0xa0b0, + 0x9213, 0x0804, 0x1dbd, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, + 0x1dbd, 0xa0cc, 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1dbd, 0xa0dc, + 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1dbd, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1e98, 0x1e96, 0x1e96, + 0x1e96, 0x1e96, 0x1e96, 0x1e9e, 0x1e96, 0x1e96, 0x1e96, 0x1e96, + 0x1e96, 0x1ea4, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1eaa, + 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1eb0, 0x080c, 0x0dd5, + 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1dbd, 0xa094, 0x931a, + 0xa098, 0x9213, 0x0804, 0x1dbd, 0xa0ac, 0x931a, 0xa0b0, 0x9213, + 0x0804, 0x1dbd, 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1dbd, + 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1dbd, 0x0804, 0x1db9, + 0x080c, 0x0dd5, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a64, + 0x7000, 0x9086, 0x0000, 0x0904, 0x1f05, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, - 0x0003, 0x0188, 0x080c, 0xd364, 0x2001, 0x0133, 0x2004, 0x9005, - 0x090c, 0x0db2, 0x0016, 0x2009, 0x0040, 0x080c, 0x20d9, 0x001e, + 0x0003, 0x0188, 0x080c, 0xe6ad, 0x2001, 0x0133, 0x2004, 0x9005, + 0x090c, 0x0dd5, 0x0016, 0x2009, 0x0040, 0x080c, 0x2284, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, - 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x20d9, 0x782c, - 0xd0fc, 0x09a8, 0x080c, 0x1be4, 0x7000, 0x9086, 0x0000, 0x1978, + 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2284, 0x782c, + 0xd0fc, 0x09a8, 0x080c, 0x1d8c, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, - 0x20d9, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, + 0x2284, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, - 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1da2, - 0x2065, 0x8cff, 0x090c, 0x0db2, 0x8a51, 0x0005, 0x2050, 0x0005, + 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f4a, + 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, 0x2040, 0xa85a, 0xa064, 0x9084, - 0x000f, 0x9080, 0x1db2, 0x2065, 0x8cff, 0x090c, 0x0db2, 0x0005, + 0x000f, 0x9080, 0x1f5a, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, - 0x0023, 0x0000, 0x0000, 0x1d95, 0x1d91, 0x0000, 0x0000, 0x1d9f, - 0x0000, 0x1d95, 0x1d9c, 0x1d9c, 0x1d99, 0x0000, 0x0000, 0x0000, - 0x1d9f, 0x1d9c, 0x0000, 0x1d97, 0x1d97, 0x0000, 0x0000, 0x1d9f, - 0x0000, 0x1d97, 0x1d9d, 0x1d9d, 0x1d9d, 0x0000, 0x0000, 0x0000, - 0x1d9f, 0x1d9d, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, - 0x9055, 0x0904, 0x1f99, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0, - 0x1da2, 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, + 0x0023, 0x0000, 0x0000, 0x1f3d, 0x1f39, 0x1f3d, 0x1f3d, 0x1f47, + 0x0000, 0x1f3d, 0x1f44, 0x1f44, 0x1f41, 0x1f44, 0x1f44, 0x0000, + 0x1f47, 0x1f44, 0x0000, 0x1f3f, 0x1f3f, 0x0000, 0x1f3f, 0x1f47, + 0x0000, 0x1f3f, 0x1f45, 0x1f45, 0x1f45, 0x0000, 0x1f45, 0x0000, + 0x1f47, 0x1f45, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, + 0x9055, 0x0904, 0x2141, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0, + 0x1f4a, 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, - 0x1140, 0x0310, 0x0804, 0x1f99, 0xa004, 0x9045, 0x0904, 0x1f99, - 0x0c18, 0x2c05, 0x9005, 0x0904, 0x1e81, 0xdd9c, 0x1904, 0x1e3d, - 0x908a, 0x0036, 0x1a0c, 0x0db2, 0x9082, 0x001b, 0x0002, 0x1e12, - 0x1e12, 0x1e14, 0x1e12, 0x1e12, 0x1e12, 0x1e1a, 0x1e12, 0x1e12, - 0x1e12, 0x1e20, 0x1e12, 0x1e12, 0x1e12, 0x1e26, 0x1e12, 0x1e12, - 0x1e12, 0x1e2c, 0x1e12, 0x1e12, 0x1e12, 0x1e32, 0x1e12, 0x1e12, - 0x1e12, 0x1e38, 0x080c, 0x0db2, 0xa07c, 0x9422, 0xa080, 0x931b, - 0x0804, 0x1e77, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1e77, - 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, 0x1e77, 0xa0ac, 0x9422, - 0xa0b0, 0x931b, 0x0804, 0x1e77, 0xa0bc, 0x9422, 0xa0c0, 0x931b, - 0x0804, 0x1e77, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1e77, + 0x1140, 0x0310, 0x0804, 0x2141, 0xa004, 0x9045, 0x0904, 0x2141, + 0x0c18, 0x2c05, 0x9005, 0x0904, 0x2029, 0xdd9c, 0x1904, 0x1fe5, + 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1fba, + 0x1fba, 0x1fbc, 0x1fba, 0x1fba, 0x1fba, 0x1fc2, 0x1fba, 0x1fba, + 0x1fba, 0x1fc8, 0x1fba, 0x1fba, 0x1fba, 0x1fce, 0x1fba, 0x1fba, + 0x1fba, 0x1fd4, 0x1fba, 0x1fba, 0x1fba, 0x1fda, 0x1fba, 0x1fba, + 0x1fba, 0x1fe0, 0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080, 0x931b, + 0x0804, 0x201f, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x201f, + 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, 0x201f, 0xa0ac, 0x9422, + 0xa0b0, 0x931b, 0x0804, 0x201f, 0xa0bc, 0x9422, 0xa0c0, 0x931b, + 0x0804, 0x201f, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x201f, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, - 0x0db2, 0x9082, 0x001b, 0x0002, 0x1e5f, 0x1e5d, 0x1e5d, 0x1e5d, - 0x1e5d, 0x1e5d, 0x1e64, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e5d, - 0x1e69, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e6e, 0x1e5d, - 0x1e5d, 0x1e5d, 0x1e5d, 0x1e5d, 0x1e73, 0x080c, 0x0db2, 0xa07c, + 0x0dd5, 0x9082, 0x001b, 0x0002, 0x2007, 0x2005, 0x2005, 0x2005, + 0x2005, 0x2005, 0x200c, 0x2005, 0x2005, 0x2005, 0x2005, 0x2005, + 0x2011, 0x2005, 0x2005, 0x2005, 0x2005, 0x2005, 0x2016, 0x2005, + 0x2005, 0x2005, 0x2005, 0x2005, 0x201b, 0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, - 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, 0x1f99, 0x8c60, 0x0804, - 0x1de9, 0xa004, 0x9045, 0x0904, 0x1f99, 0x0804, 0x1dcc, 0x8a51, - 0x0904, 0x1f99, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, - 0x0904, 0x1f99, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1da2, 0x2c05, - 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, 0x1f8e, 0x2c05, 0x8422, + 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, 0x2141, 0x8c60, 0x0804, + 0x1f91, 0xa004, 0x9045, 0x0904, 0x2141, 0x0804, 0x1f74, 0x8a51, + 0x0904, 0x2141, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, + 0x0904, 0x2141, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1f4a, 0x2c05, + 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, 0x2136, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, - 0x1f2b, 0x9082, 0x001b, 0x0002, 0x1ec7, 0x1ec7, 0x1ec9, 0x1ec7, - 0x1ec7, 0x1ec7, 0x1ed7, 0x1ec7, 0x1ec7, 0x1ec7, 0x1ee5, 0x1ec7, - 0x1ec7, 0x1ec7, 0x1ef3, 0x1ec7, 0x1ec7, 0x1ec7, 0x1f01, 0x1ec7, - 0x1ec7, 0x1ec7, 0x1f0f, 0x1ec7, 0x1ec7, 0x1ec7, 0x1f1d, 0x080c, - 0x0db2, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, - 0x0db2, 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x1f89, 0xa18c, - 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa084, - 0x9420, 0xa088, 0x9319, 0x0804, 0x1f89, 0xa19c, 0x2400, 0x9122, - 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa094, 0x9420, 0xa098, - 0x9319, 0x0804, 0x1f89, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, - 0x911b, 0x0a0c, 0x0db2, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, - 0x1f89, 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, - 0x0db2, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x1f89, 0xa1cc, - 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa0c4, - 0x9420, 0xa0c8, 0x9319, 0x0804, 0x1f89, 0xa1dc, 0x2400, 0x9122, - 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa0d4, 0x9420, 0xa0d8, - 0x9319, 0x0804, 0x1f89, 0x9082, 0x001b, 0x0002, 0x1f49, 0x1f47, - 0x1f47, 0x1f47, 0x1f47, 0x1f47, 0x1f56, 0x1f47, 0x1f47, 0x1f47, - 0x1f47, 0x1f47, 0x1f63, 0x1f47, 0x1f47, 0x1f47, 0x1f47, 0x1f47, - 0x1f70, 0x1f47, 0x1f47, 0x1f47, 0x1f47, 0x1f47, 0x1f7d, 0x080c, - 0x0db2, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, - 0x0db2, 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, - 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa084, 0x9420, + 0x20d3, 0x9082, 0x001b, 0x0002, 0x206f, 0x206f, 0x2071, 0x206f, + 0x206f, 0x206f, 0x207f, 0x206f, 0x206f, 0x206f, 0x208d, 0x206f, + 0x206f, 0x206f, 0x209b, 0x206f, 0x206f, 0x206f, 0x20a9, 0x206f, + 0x206f, 0x206f, 0x20b7, 0x206f, 0x206f, 0x206f, 0x20c5, 0x080c, + 0x0dd5, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, + 0x0dd5, 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x2131, 0xa18c, + 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, + 0x9420, 0xa088, 0x9319, 0x0804, 0x2131, 0xa19c, 0x2400, 0x9122, + 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa094, 0x9420, 0xa098, + 0x9319, 0x0804, 0x2131, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, + 0x911b, 0x0a0c, 0x0dd5, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, + 0x2131, 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, + 0x0dd5, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x2131, 0xa1cc, + 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0c4, + 0x9420, 0xa0c8, 0x9319, 0x0804, 0x2131, 0xa1dc, 0x2400, 0x9122, + 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0d4, 0x9420, 0xa0d8, + 0x9319, 0x0804, 0x2131, 0x9082, 0x001b, 0x0002, 0x20f1, 0x20ef, + 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20fe, 0x20ef, 0x20ef, 0x20ef, + 0x20ef, 0x20ef, 0x210b, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20ef, + 0x2118, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x2125, 0x080c, + 0x0dd5, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, + 0x0dd5, 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, + 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, - 0x911b, 0x0a0c, 0x0db2, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, - 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0db2, + 0x911b, 0x0a0c, 0x0dd5, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, + 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, - 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0db2, 0xa0cc, 0x9420, 0xa0d0, + 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x2001, - 0x0005, 0x2004, 0x9084, 0x0007, 0x0002, 0x1fb7, 0x1be4, 0x1fb7, - 0x1fad, 0x1fb0, 0x1fb3, 0x1fb0, 0x1fb3, 0x080c, 0x1be4, 0x0005, - 0x080c, 0x116f, 0x0005, 0x080c, 0x1be4, 0x080c, 0x116f, 0x0005, - 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, - 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, - 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, - 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, - 0x2600, 0x781c, 0xd0a4, 0x190c, 0x20d6, 0x7900, 0xd1dc, 0x1118, - 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x1ffe, 0x1ff6, - 0x7597, 0x1ff6, 0x1ff8, 0x1ff8, 0x1ff8, 0x1ff8, 0x757d, 0x1ff6, - 0x1ffa, 0x1ff6, 0x1ff8, 0x1ff6, 0x1ff8, 0x1ff6, 0x080c, 0x0db2, - 0x0031, 0x0020, 0x080c, 0x757d, 0x080c, 0x7597, 0x0005, 0x0006, - 0x0016, 0x0026, 0x080c, 0xd364, 0x7930, 0x9184, 0x0003, 0x01c0, - 0x2001, 0x19c5, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, - 0x9005, 0x090c, 0x0db2, 0x00c6, 0x2001, 0x19c5, 0x2064, 0x080c, - 0xb251, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x20d9, 0x00d0, - 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, - 0x6c53, 0x1138, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x080c, 0x6b8a, - 0x0010, 0x080c, 0x58e0, 0x080c, 0x7635, 0x0041, 0x0018, 0x9184, - 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, - 0x0046, 0x0056, 0x2071, 0x1a31, 0x080c, 0x1872, 0x005e, 0x004e, - 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, - 0x7128, 0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 0x2102, 0x2001, - 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, - 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, - 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, - 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, - 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, - 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, - 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, - 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, - 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, - 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, - 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, - 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, - 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, - 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, - 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, - 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, - 0x0db2, 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, - 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, - 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, - 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x28d6, 0x080c, - 0x27f1, 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, - 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, - 0x9085, 0x2000, 0x6052, 0x2009, 0x196c, 0x2011, 0x196d, 0x6358, - 0x939c, 0x38f0, 0x2320, 0x080c, 0x2835, 0x1238, 0x939d, 0x4003, - 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, - 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, 0x2820, 0x9006, 0x080c, - 0x2803, 0x20a9, 0x0012, 0x1d04, 0x212b, 0x2091, 0x6000, 0x1f04, - 0x212b, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, - 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x250f, 0x2009, - 0x00ef, 0x6132, 0x6136, 0x080c, 0x251f, 0x60e7, 0x0000, 0x61ea, - 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, - 0x602f, 0x0000, 0x6007, 0x049f, 0x60bb, 0x0000, 0x20a9, 0x0018, - 0x60bf, 0x0000, 0x1f04, 0x2158, 0x60bb, 0x0000, 0x60bf, 0x0108, - 0x60bf, 0x0012, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, - 0x601f, 0x001e, 0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, - 0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, - 0x0000, 0x00fe, 0x0005, 0x2001, 0x1833, 0x2003, 0x0000, 0x2001, - 0x1832, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, - 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, - 0x002a, 0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x21b8, 0x219e, - 0x21a1, 0x21a4, 0x21a9, 0x21ab, 0x21af, 0x21b3, 0x080c, 0x7eec, - 0x00b8, 0x080c, 0x7fb9, 0x00a0, 0x080c, 0x7fb9, 0x080c, 0x7eec, - 0x0078, 0x0099, 0x0068, 0x080c, 0x7eec, 0x0079, 0x0048, 0x080c, - 0x7fb9, 0x0059, 0x0028, 0x080c, 0x7fb9, 0x080c, 0x7eec, 0x0029, - 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, - 0xd09c, 0x0118, 0xd19c, 0x1904, 0x2408, 0xd1f4, 0x0110, 0x080c, - 0x0db2, 0x080c, 0x6c53, 0x0904, 0x2214, 0x080c, 0xbcec, 0x1120, - 0x7000, 0x9086, 0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, - 0x080c, 0x6c76, 0x0118, 0x080c, 0x6c64, 0x1520, 0x6027, 0x0020, - 0x6043, 0x0000, 0x080c, 0xbcec, 0x0168, 0x080c, 0x6c76, 0x1150, - 0x2001, 0x1976, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6ad9, - 0x0804, 0x240b, 0x709c, 0x9005, 0x1150, 0x709f, 0x0001, 0x00d6, - 0x2069, 0x0140, 0x080c, 0x6caa, 0x00de, 0x1904, 0x240b, 0x080c, - 0x6f34, 0x0428, 0x080c, 0x6c76, 0x1590, 0x6024, 0x9084, 0x1800, - 0x1108, 0x0468, 0x080c, 0x6f34, 0x080c, 0x6f2a, 0x080c, 0x5a21, - 0x080c, 0x6b8a, 0x0804, 0x2408, 0xd1ac, 0x1508, 0x6024, 0xd0dc, - 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7090, - 0x9086, 0x0028, 0x1110, 0x080c, 0x6e17, 0x0804, 0x2408, 0x080c, - 0x6f2f, 0x0048, 0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, - 0x6d8d, 0x0804, 0x2408, 0x080c, 0x6eb2, 0x0804, 0x2408, 0xd1ac, - 0x0904, 0x2329, 0x080c, 0x6c53, 0x11c0, 0x6027, 0x0020, 0x0006, - 0x0026, 0x0036, 0x080c, 0x6c6d, 0x1158, 0x080c, 0x6f2a, 0x080c, - 0x5a21, 0x080c, 0x6b8a, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, - 0x003e, 0x002e, 0x000e, 0x080c, 0x6c2d, 0x0016, 0x0046, 0x00c6, - 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, - 0x0090, 0x6043, 0x0010, 0x74d2, 0x948c, 0xff00, 0x7034, 0xd084, - 0x0178, 0x9186, 0xf800, 0x1160, 0x7040, 0xd084, 0x1148, 0xc085, - 0x7042, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x4672, 0x003e, - 0x080c, 0xbce5, 0x1904, 0x2306, 0x9196, 0xff00, 0x05a8, 0x7058, - 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, - 0xd184, 0x1550, 0x080c, 0x2f86, 0x0128, 0xc18d, 0x7132, 0x080c, - 0x629c, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, - 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2306, - 0x7034, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, - 0x2306, 0xc1ad, 0x2102, 0x0036, 0x73d0, 0x2011, 0x8013, 0x080c, - 0x4672, 0x003e, 0x0804, 0x2306, 0x7034, 0xd08c, 0x1140, 0x2001, - 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2306, 0xc1ad, 0x2102, 0x0036, - 0x73d0, 0x2011, 0x8013, 0x080c, 0x4672, 0x003e, 0x7130, 0xc185, - 0x7132, 0x2011, 0x1854, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, - 0x0001, 0x2011, 0x0100, 0x080c, 0x7e3e, 0x2019, 0x000e, 0x00c6, - 0x2061, 0x0000, 0x080c, 0xcf62, 0x00ce, 0x9484, 0x00ff, 0x9080, - 0x2f92, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, - 0x000e, 0x080c, 0xcfe6, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, - 0x0002, 0x2019, 0x0004, 0x080c, 0x2dfb, 0x001e, 0x0078, 0x0156, - 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5f7e, 0x1110, 0x080c, - 0x5a3b, 0x8108, 0x1f04, 0x22fc, 0x00be, 0x015e, 0x00ce, 0x004e, - 0x080c, 0x9947, 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, - 0x9296, 0x0004, 0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, - 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, - 0x622a, 0x2003, 0x0001, 0x2001, 0x1824, 0x2003, 0x0000, 0x6027, - 0x0020, 0xd194, 0x0904, 0x2408, 0x0016, 0x6220, 0xd2b4, 0x0904, - 0x23b1, 0x080c, 0x7cc7, 0x080c, 0x8fbb, 0x6027, 0x0004, 0x00f6, - 0x2019, 0x19bf, 0x2304, 0x907d, 0x0904, 0x2380, 0x7804, 0x9086, - 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, - 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, - 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, - 0x080c, 0x2997, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, - 0x080c, 0x28b1, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, - 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, 0x080c, 0x847d, 0x080c, - 0x8582, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0x99d6, - 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, - 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2997, 0x00de, 0x00c6, 0x2061, 0x19b6, 0x6028, 0x080c, - 0xbcec, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, - 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8f97, 0x0804, 0x2407, - 0x2061, 0x0100, 0x62c0, 0x080c, 0x97d2, 0x2019, 0x19bf, 0x2304, - 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0x9a50, 0x00ce, 0x0804, - 0x2407, 0xd2bc, 0x0904, 0x23f4, 0x080c, 0x7cd4, 0x6014, 0x9084, - 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, - 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2997, 0x00de, - 0x00c6, 0x2061, 0x19b6, 0x6044, 0x080c, 0xbcec, 0x0120, 0x909a, - 0x0003, 0x1628, 0x0018, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, - 0x603c, 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x7ccc, - 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, - 0x1984, 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, - 0x918d, 0x0016, 0x6116, 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, - 0x2019, 0x0001, 0x080c, 0x9254, 0x003e, 0x2019, 0x19c5, 0x2304, - 0x9065, 0x0120, 0x2009, 0x004f, 0x080c, 0x9a50, 0x00ce, 0x001e, - 0xd19c, 0x0904, 0x247a, 0x7034, 0xd0ac, 0x1904, 0x244f, 0x0016, - 0x0156, 0x6027, 0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, - 0x9084, 0xfbcf, 0x6052, 0x080c, 0x28d0, 0x9085, 0x2000, 0x6052, - 0x20a9, 0x0012, 0x1d04, 0x2422, 0x080c, 0x7cfb, 0x1f04, 0x2422, - 0x6050, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, - 0xa001, 0x1f04, 0x2430, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, - 0x0366, 0x1d04, 0x2439, 0x080c, 0x7cfb, 0x6020, 0xd09c, 0x1130, - 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x04a0, 0x080c, 0x2898, - 0x1f04, 0x2439, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, - 0x6028, 0xc09c, 0x602a, 0x080c, 0x9947, 0x60e3, 0x0000, 0x080c, - 0xd343, 0x080c, 0xd35e, 0x080c, 0x5117, 0xd0fc, 0x1138, 0x080c, - 0xbce5, 0x1120, 0x9085, 0x0001, 0x080c, 0x6c9a, 0x9006, 0x080c, - 0x2987, 0x2009, 0x0002, 0x080c, 0x28d6, 0x00e6, 0x2071, 0x1800, - 0x7003, 0x0004, 0x080c, 0x0e69, 0x00ee, 0x6027, 0x0008, 0x080c, - 0x0b94, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, - 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, - 0x2071, 0x1800, 0x71c8, 0x70ca, 0x9116, 0x0904, 0x24ce, 0x81ff, - 0x01a0, 0x2009, 0x0000, 0x080c, 0x28d6, 0x2011, 0x8011, 0x2019, - 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, - 0x2019, 0x0000, 0x080c, 0x4672, 0x0448, 0x2001, 0x1977, 0x200c, - 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, - 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4672, 0x080c, - 0x0e69, 0x080c, 0x5117, 0xd0fc, 0x1188, 0x080c, 0xbce5, 0x1170, - 0x00c6, 0x080c, 0x256a, 0x080c, 0x91bb, 0x2061, 0x0100, 0x2019, - 0x0028, 0x2009, 0x0002, 0x080c, 0x2dfb, 0x00ce, 0x012e, 0x00fe, - 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, - 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1835, 0x2214, - 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181d, 0x2204, 0x9106, - 0x1190, 0x2011, 0x181e, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, - 0x9206, 0x1148, 0x2011, 0x181e, 0x2214, 0x9294, 0x00ff, 0x9584, - 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7876, 0x0048, 0x9584, - 0x00ff, 0x9080, 0x2f92, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, - 0x0005, 0x9080, 0x2f92, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, - 0x2069, 0x0140, 0x2001, 0x1816, 0x2003, 0x00ef, 0x20a9, 0x0010, - 0x9006, 0x6852, 0x6856, 0x1f04, 0x251a, 0x00de, 0x0005, 0x0006, - 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1816, 0x2102, 0x8114, - 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, - 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xd74a, 0x2005, 0x6856, - 0x8211, 0x1f04, 0x252f, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, - 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, - 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, - 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, - 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, - 0x1f04, 0x255f, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, - 0x015e, 0x0005, 0x080c, 0x5113, 0xd0c4, 0x0150, 0xd0a4, 0x0140, - 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xcfe6, 0x004e, - 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, - 0x0904, 0x25d6, 0x080c, 0x2835, 0x0660, 0x9084, 0x0700, 0x908e, - 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, - 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, - 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, - 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, - 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, - 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, - 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x7e7f, 0x928c, - 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, - 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x6c53, 0x1118, 0x2009, - 0x193e, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, - 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, - 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, - 0x0db2, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, - 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, - 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, - 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, - 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, - 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, - 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, - 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0db2, 0x0033, 0x00ee, - 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x2634, 0x2652, 0x2676, - 0x2678, 0x26a1, 0x26a3, 0x26a5, 0x2001, 0x0001, 0x080c, 0x247f, - 0x080c, 0x2893, 0x2001, 0x1961, 0x2003, 0x0000, 0x7828, 0x9084, - 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2851, 0x2001, - 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x26a6, 0x080c, - 0x7cd9, 0x0005, 0x2009, 0x1964, 0x200b, 0x0000, 0x2001, 0x1969, - 0x2003, 0x0036, 0x2001, 0x1968, 0x2003, 0x002a, 0x2001, 0x1961, - 0x2003, 0x0001, 0x9006, 0x080c, 0x2803, 0x2001, 0xffff, 0x20a9, - 0x0009, 0x080c, 0x2851, 0x2001, 0x195f, 0x2003, 0x0006, 0x2009, - 0x001e, 0x2011, 0x26a6, 0x080c, 0x7cd9, 0x0005, 0x080c, 0x0db2, - 0x2001, 0x1969, 0x2003, 0x0036, 0x2001, 0x1961, 0x2003, 0x0003, - 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, - 0x2001, 0x0001, 0x080c, 0x2803, 0x2001, 0x1965, 0x2003, 0x0000, - 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2851, 0x2001, 0x195f, - 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x26a6, 0x080c, 0x7cd9, - 0x0005, 0x080c, 0x0db2, 0x080c, 0x0db2, 0x0005, 0x0006, 0x0016, - 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, - 0x0100, 0x2001, 0x1961, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0db2, - 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, - 0x0005, 0x26c8, 0x26e8, 0x2728, 0x2758, 0x277c, 0x278c, 0x278e, - 0x080c, 0x2845, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, - 0x1967, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, - 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x195f, 0x2003, 0x0001, - 0x0030, 0x080c, 0x27b2, 0x2001, 0xffff, 0x080c, 0x2643, 0x0005, - 0x080c, 0x2790, 0x05e0, 0x2009, 0x1968, 0x2104, 0x8001, 0x200a, - 0x080c, 0x2845, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, - 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1967, 0x2104, - 0xc085, 0x200a, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a, 0x9086, - 0x0005, 0x0118, 0x080c, 0x2798, 0x00c0, 0x200b, 0x0000, 0x7a38, - 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, - 0x0001, 0x080c, 0x2820, 0x2001, 0x1961, 0x2003, 0x0002, 0x0028, - 0x2001, 0x195f, 0x2003, 0x0003, 0x0010, 0x080c, 0x2665, 0x0005, - 0x080c, 0x2790, 0x0560, 0x2009, 0x1968, 0x2104, 0x8001, 0x200a, - 0x080c, 0x2845, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, - 0x195f, 0x2003, 0x0003, 0x2001, 0x1960, 0x2003, 0x0000, 0x00b8, - 0x2009, 0x1968, 0x2104, 0x9005, 0x1118, 0x080c, 0x27d5, 0x0010, - 0x080c, 0x27a5, 0x080c, 0x2798, 0x2009, 0x1964, 0x200b, 0x0000, - 0x2001, 0x1961, 0x2003, 0x0001, 0x080c, 0x2665, 0x0000, 0x0005, - 0x04b9, 0x0508, 0x080c, 0x2845, 0x11b8, 0x7850, 0x9084, 0xefff, - 0x7852, 0x2009, 0x1965, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, - 0x0108, 0x0078, 0x2001, 0x196a, 0x2003, 0x000a, 0x2009, 0x1967, - 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1961, 0x2003, - 0x0004, 0x080c, 0x2690, 0x0005, 0x0099, 0x0168, 0x080c, 0x2845, - 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x267c, 0x0018, - 0x0079, 0x080c, 0x2690, 0x0005, 0x080c, 0x0db2, 0x080c, 0x0db2, - 0x2009, 0x1969, 0x2104, 0x8001, 0x200a, 0x090c, 0x27f1, 0x0005, - 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, - 0x2001, 0x0001, 0x080c, 0x2820, 0x0005, 0x7a38, 0x9294, 0x0006, - 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, - 0x2803, 0x0005, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a, 0x9086, - 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, - 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, - 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, - 0x2001, 0x0001, 0x080c, 0x2820, 0x0005, 0x0086, 0x2001, 0x1967, - 0x2004, 0x9084, 0x7fff, 0x090c, 0x0db2, 0x2009, 0x1966, 0x2144, - 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, - 0x080c, 0x0db2, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, - 0x0005, 0x0006, 0x0156, 0x2001, 0x195f, 0x20a9, 0x0009, 0x2003, - 0x0000, 0x8000, 0x1f04, 0x27f7, 0x2001, 0x1966, 0x2003, 0x8000, - 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, - 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, - 0x196c, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, - 0x0006, 0x783a, 0x2009, 0x196d, 0x210c, 0x795a, 0x00fe, 0x0005, - 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084, - 0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb, - 0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, - 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0006, 0x2001, 0x0100, - 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, - 0x7820, 0x080c, 0x28d0, 0xd09c, 0x1110, 0x1f04, 0x2848, 0x015e, - 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, - 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x28d0, - 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, - 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, - 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, - 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x287e, - 0x080c, 0x7cfb, 0x1f04, 0x287e, 0x7850, 0x9085, 0x0400, 0x9084, - 0xdfbf, 0x7852, 0x080c, 0x28d0, 0x9085, 0x1000, 0x7852, 0x000e, - 0x001e, 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, - 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, - 0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x28a2, 0x0028, - 0x7854, 0xd08c, 0x1110, 0x1f04, 0x28a8, 0x00fe, 0x015e, 0x000e, - 0x0005, 0x1d04, 0x28b1, 0x080c, 0x7cfb, 0x1f04, 0x28b1, 0x0005, - 0x0006, 0x2001, 0x196b, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, - 0x0006, 0x2001, 0x196b, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, - 0x0006, 0x2001, 0x196b, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, - 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, - 0x1977, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, - 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, - 0x200a, 0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, - 0xff00, 0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1588, 0x2009, - 0x017f, 0x200b, 0x00a2, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, - 0x2009, 0x0169, 0x2104, 0x9084, 0x0007, 0x210c, 0x918c, 0x0007, - 0x910e, 0x1db0, 0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, - 0x1d60, 0x8211, 0x1d68, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, - 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, - 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2001, 0x017f, 0x2003, 0x0000, - 0x004e, 0x003e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd0dc, 0x01b0, - 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001, 0x0141, 0x2004, - 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126, 0x2091, 0x8000, - 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e, 0x0005, 0x00c6, - 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161, 0x2003, 0x0000, - 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008, 0x6104, 0x918e, - 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017, 0x0040, 0x04b9, - 0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016, 0x2019, 0x0141, - 0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0, - 0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, - 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, - 0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, - 0x0026, 0x080c, 0x6c6d, 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, - 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, - 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9285, 0x1000, - 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, + 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0dce, 0x9084, 0x0007, 0x0002, + 0x2162, 0x1d8c, 0x2162, 0x2158, 0x215b, 0x215e, 0x215b, 0x215e, + 0x080c, 0x1d8c, 0x0005, 0x080c, 0x119a, 0x0005, 0x080c, 0x1d8c, + 0x080c, 0x119a, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, + 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, + 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, + 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, + 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2281, + 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, + 0x0002, 0x21a9, 0x21a1, 0x7b59, 0x21a1, 0x21a3, 0x21a3, 0x21a3, + 0x21a3, 0x7b3f, 0x21a1, 0x21a5, 0x21a1, 0x21a3, 0x21a1, 0x21a3, + 0x21a1, 0x080c, 0x0dd5, 0x0031, 0x0020, 0x080c, 0x7b3f, 0x080c, + 0x7b59, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xe6ad, 0x7930, + 0x9184, 0x0003, 0x01c0, 0x2001, 0x19f4, 0x2004, 0x9005, 0x0170, + 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dd5, 0x00c6, 0x2001, + 0x19f4, 0x2064, 0x080c, 0xc472, 0x00ce, 0x00f8, 0x2009, 0x0040, + 0x080c, 0x2284, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, + 0x0003, 0x0160, 0x080c, 0x717d, 0x1138, 0x080c, 0x7465, 0x080c, + 0x5df8, 0x080c, 0x70af, 0x0010, 0x080c, 0x5cb7, 0x080c, 0x7bf7, + 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, + 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a60, 0x080c, + 0x19ff, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, + 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001, + 0x1977, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, + 0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, + 0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, + 0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, + 0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, + 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, + 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, + 0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, + 0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, + 0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, + 0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, + 0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, + 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, + 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, + 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, + 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, + 0x0005, 0x7938, 0x080c, 0x0dce, 0x00f6, 0x2079, 0x0200, 0x7902, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, + 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, + 0x080c, 0x2af0, 0x080c, 0x2a0b, 0x6054, 0x8004, 0x8004, 0x8004, + 0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, + 0x6050, 0x9084, 0xb17f, 0x9085, 0x2000, 0x6052, 0x2009, 0x199b, + 0x2011, 0x199c, 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x2a4f, + 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, + 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, + 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x20a9, 0x0012, 0x1d04, 0x22d6, + 0x2091, 0x6000, 0x1f04, 0x22d6, 0x602f, 0x0100, 0x602f, 0x0000, + 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, + 0x080c, 0x2729, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2739, + 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, + 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb, + 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2303, 0x60bb, + 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, + 0x0014, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, + 0x001e, 0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, + 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, + 0x00fe, 0x0005, 0x2001, 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, + 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, + 0x0026, 0x6124, 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, + 0x006e, 0x1138, 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, + 0x1198, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, + 0x0004, 0x9284, 0x0007, 0x0082, 0x0016, 0x2001, 0x188b, 0x200c, + 0xd184, 0x001e, 0x0d70, 0x0c98, 0x0016, 0x2001, 0x188b, 0x200c, + 0xd194, 0x001e, 0x0d30, 0x0c58, 0x2386, 0x236c, 0x236f, 0x2372, + 0x2377, 0x2379, 0x237d, 0x2381, 0x080c, 0x8d64, 0x00b8, 0x080c, + 0x8e31, 0x00a0, 0x080c, 0x8e31, 0x080c, 0x8d64, 0x0078, 0x0099, + 0x0068, 0x080c, 0x8d64, 0x0079, 0x0048, 0x080c, 0x8e31, 0x0059, + 0x0028, 0x080c, 0x8e31, 0x080c, 0x8d64, 0x0029, 0x002e, 0x001e, + 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, + 0xd19c, 0x1904, 0x25ee, 0xd1f4, 0x190c, 0x0dce, 0x080c, 0x717d, + 0x0904, 0x23e1, 0x080c, 0xcf18, 0x1120, 0x7000, 0x9086, 0x0003, + 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x71a0, 0x0118, + 0x080c, 0x718e, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, 0x080c, + 0xcf18, 0x0168, 0x080c, 0x71a0, 0x1150, 0x2001, 0x19a5, 0x2003, + 0x0001, 0x6027, 0x1800, 0x080c, 0x7013, 0x0804, 0x25f1, 0x70a4, + 0x9005, 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, + 0x71d4, 0x00de, 0x1904, 0x25f1, 0x080c, 0x746f, 0x0428, 0x080c, + 0x71a0, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, + 0x746f, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0x70af, 0x0804, + 0x25ee, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, + 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110, + 0x080c, 0x7352, 0x0804, 0x25ee, 0x080c, 0x746a, 0x0048, 0x2001, + 0x197d, 0x2003, 0x0002, 0x0020, 0x080c, 0x72b7, 0x0804, 0x25ee, + 0x080c, 0x73ed, 0x0804, 0x25ee, 0x6220, 0xd1bc, 0x0138, 0xd2bc, + 0x1904, 0x2661, 0xd2b4, 0x1904, 0x2674, 0x0000, 0xd1ac, 0x0904, + 0x2503, 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x717d, + 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036, 0x080c, 0x7197, + 0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0x70af, 0x003e, + 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, + 0x7155, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, + 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, + 0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, + 0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, + 0x8016, 0x080c, 0x48fb, 0x003e, 0x080c, 0xcf11, 0x1904, 0x24e0, + 0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, + 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x31c4, + 0x0128, 0xc18d, 0x7132, 0x080c, 0x672f, 0x1510, 0x6240, 0x9294, + 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, + 0x7030, 0xd08c, 0x0904, 0x24e0, 0x7038, 0xd08c, 0x1140, 0x2001, + 0x180c, 0x200c, 0xd1ac, 0x1904, 0x24e0, 0xc1ad, 0x2102, 0x0036, + 0x73d8, 0x2011, 0x8013, 0x080c, 0x48fb, 0x003e, 0x0804, 0x24e0, + 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, + 0x24e0, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, + 0x48fb, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, + 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, + 0x846c, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe1f4, + 0x00ce, 0x9484, 0x00ff, 0x9080, 0x31d0, 0x200d, 0x918c, 0xff00, + 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xe280, 0x001e, + 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x3039, 0x001e, + 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x63cd, + 0x1110, 0x080c, 0x5e12, 0x8108, 0x1f04, 0x24d6, 0x00be, 0x015e, + 0x00ce, 0x004e, 0x080c, 0xaadc, 0x60e3, 0x0000, 0x001e, 0x2001, + 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11a0, 0x2011, + 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206, + 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003, + 0x0000, 0x6027, 0x0020, 0xd194, 0x0904, 0x25ee, 0x0016, 0x6220, + 0xd2b4, 0x0904, 0x258b, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x6027, + 0x0004, 0x00f6, 0x2019, 0x19ee, 0x2304, 0x907d, 0x0904, 0x255a, + 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, + 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, + 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, + 0x8001, 0x1df0, 0x080c, 0x2bb1, 0x2001, 0x001e, 0x8001, 0x0240, + 0x20a9, 0x0009, 0x080c, 0x2acb, 0x6904, 0xd1dc, 0x1140, 0x0cb0, + 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x080c, + 0x9317, 0x080c, 0x941c, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, + 0x080c, 0xab6b, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, + 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, + 0x4000, 0x0110, 0x080c, 0x2bb1, 0x00de, 0x00c6, 0x2061, 0x19e5, + 0x6028, 0x080c, 0xcf18, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, + 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x9fd8, + 0x0804, 0x25ed, 0x2061, 0x0100, 0x62c0, 0x080c, 0xa967, 0x2019, + 0x19ee, 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xabe6, + 0x00ce, 0x0804, 0x25ed, 0xd2bc, 0x0904, 0x25d4, 0x080c, 0x8315, + 0x6014, 0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, + 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, + 0x2bb1, 0x00de, 0x00c6, 0x2061, 0x19e5, 0x6044, 0x080c, 0xcf18, + 0x0120, 0x909a, 0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638, + 0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0, + 0x080c, 0x830d, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, + 0x6114, 0x918c, 0x1984, 0x918d, 0x0012, 0x6116, 0x0430, 0x9080, + 0x0008, 0x2004, 0x9086, 0x0009, 0x0d98, 0x6114, 0x918c, 0x1984, + 0x918d, 0x0016, 0x6116, 0x00c8, 0x6027, 0x0004, 0x00b0, 0x0036, + 0x2019, 0x0001, 0x080c, 0xa2ac, 0x003e, 0x2019, 0x19f4, 0x2304, + 0x9065, 0x0150, 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, + 0x2009, 0x004f, 0x080c, 0xabe6, 0x00ce, 0x001e, 0xd19c, 0x0904, + 0x265c, 0x7038, 0xd0ac, 0x1904, 0x2635, 0x0016, 0x0156, 0x6027, + 0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, + 0x6052, 0x080c, 0x2aea, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, + 0x1d04, 0x2608, 0x080c, 0x833c, 0x1f04, 0x2608, 0x6050, 0x9085, + 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, + 0x2616, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, + 0x261f, 0x080c, 0x833c, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, + 0x001e, 0x6027, 0x0008, 0x0480, 0x080c, 0x2ab2, 0x1f04, 0x261f, + 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, + 0x602a, 0x080c, 0xaadc, 0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c, + 0xe6a7, 0x080c, 0x54bb, 0xd0fc, 0x1138, 0x080c, 0xcf11, 0x1120, + 0x9085, 0x0001, 0x080c, 0x71c4, 0x9006, 0x080c, 0x2ba1, 0x2009, + 0x0002, 0x080c, 0x2af0, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, + 0x0008, 0x080c, 0x0bae, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, + 0x0005, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0904, + 0x240e, 0x0016, 0x2009, 0x266d, 0x00d0, 0x2001, 0x188b, 0x200c, + 0xc184, 0x2102, 0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, 0x200c, + 0xd194, 0x001e, 0x0904, 0x240e, 0x0016, 0x2009, 0x2680, 0x0038, + 0x2001, 0x188b, 0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, 0x6028, + 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, + 0xffff, 0x6043, 0x0001, 0x080c, 0x2aea, 0x6027, 0x0080, 0x6017, + 0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, + 0x70d2, 0x9116, 0x05e8, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, + 0x2af0, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, + 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x48fb, + 0x0438, 0x2001, 0x19a6, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, + 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, + 0x8012, 0x080c, 0x48fb, 0x080c, 0x54bb, 0xd0fc, 0x1188, 0x080c, + 0xcf11, 0x1170, 0x00c6, 0x080c, 0x2784, 0x080c, 0xa213, 0x2061, + 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x3039, 0x00ce, + 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, + 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, + 0x1837, 0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f, + 0x2204, 0x9106, 0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00, + 0x9584, 0xff00, 0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294, + 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7e50, + 0x0048, 0x9584, 0x00ff, 0x9080, 0x31d0, 0x200d, 0x918c, 0xff00, + 0x810f, 0x9006, 0x0005, 0x9080, 0x31d0, 0x200d, 0x918c, 0x00ff, + 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef, + 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2734, 0x00de, + 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818, + 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, + 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xee55, + 0x2005, 0x6856, 0x8211, 0x1f04, 0x2749, 0x002e, 0x00de, 0x000e, + 0x0005, 0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, + 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, + 0x0006, 0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, + 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, + 0x0404, 0x680e, 0x1f04, 0x2779, 0x680f, 0x0000, 0x000e, 0x001e, + 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, 0x54b7, 0xd0c4, 0x0150, + 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, + 0xe280, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, + 0x78c4, 0xd0dc, 0x0904, 0x27f0, 0x080c, 0x2a4f, 0x0660, 0x9084, + 0x0700, 0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, + 0x908e, 0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, + 0x0400, 0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, + 0x1120, 0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, + 0x9016, 0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, + 0x2009, 0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, + 0x2011, 0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, + 0x8cf7, 0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, + 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x717d, + 0x1118, 0x2009, 0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, + 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, + 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, + 0x0110, 0x080c, 0x0dce, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, + 0x2001, 0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, + 0x918c, 0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, + 0x810f, 0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, + 0x00ff, 0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, + 0x00ff, 0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, + 0x1000, 0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, + 0x00e6, 0x2001, 0x198e, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5, + 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x284e, + 0x286c, 0x2890, 0x2892, 0x28bb, 0x28bd, 0x28bf, 0x2001, 0x0001, + 0x080c, 0x269c, 0x080c, 0x2aad, 0x2001, 0x1990, 0x2003, 0x0000, + 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, + 0x2a6b, 0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, + 0x28c0, 0x080c, 0x831a, 0x0005, 0x2009, 0x1993, 0x200b, 0x0000, + 0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1997, 0x2003, 0x002a, + 0x2001, 0x1990, 0x2003, 0x0001, 0x9006, 0x080c, 0x2a1d, 0x2001, + 0xffff, 0x20a9, 0x0009, 0x080c, 0x2a6b, 0x2001, 0x198e, 0x2003, + 0x0006, 0x2009, 0x001e, 0x2011, 0x28c0, 0x080c, 0x831a, 0x0005, + 0x080c, 0x0dd5, 0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1990, + 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a1d, 0x2001, 0x1994, + 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2a6b, + 0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x28c0, + 0x080c, 0x831a, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5, 0x0005, + 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, + 0x8000, 0x2079, 0x0100, 0x2001, 0x1990, 0x2004, 0x908a, 0x0007, + 0x1a0c, 0x0dd5, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, + 0x001e, 0x000e, 0x0005, 0x28e2, 0x2902, 0x2942, 0x2972, 0x2996, + 0x29a6, 0x29a8, 0x080c, 0x2a5f, 0x11b0, 0x7850, 0x9084, 0xefff, + 0x7852, 0x2009, 0x1996, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, + 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x198e, + 0x2003, 0x0001, 0x0030, 0x080c, 0x29cc, 0x2001, 0xffff, 0x080c, + 0x285d, 0x0005, 0x080c, 0x29aa, 0x05e0, 0x2009, 0x1997, 0x2104, + 0x8001, 0x200a, 0x080c, 0x2a5f, 0x1178, 0x7850, 0x9084, 0xefff, + 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, + 0x1996, 0x2104, 0xc085, 0x200a, 0x2009, 0x1993, 0x2104, 0x8000, + 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, 0x29b2, 0x00c0, 0x200b, + 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001, 0x1990, 0x2003, + 0x0002, 0x0028, 0x2001, 0x198e, 0x2003, 0x0003, 0x0010, 0x080c, + 0x287f, 0x0005, 0x080c, 0x29aa, 0x0560, 0x2009, 0x1997, 0x2104, + 0x8001, 0x200a, 0x080c, 0x2a5f, 0x1168, 0x7850, 0x9084, 0xefff, + 0x7852, 0x2001, 0x198e, 0x2003, 0x0003, 0x2001, 0x198f, 0x2003, + 0x0000, 0x00b8, 0x2009, 0x1997, 0x2104, 0x9005, 0x1118, 0x080c, + 0x29ef, 0x0010, 0x080c, 0x29bf, 0x080c, 0x29b2, 0x2009, 0x1993, + 0x200b, 0x0000, 0x2001, 0x1990, 0x2003, 0x0001, 0x080c, 0x287f, + 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c, 0x2a5f, 0x11b8, 0x7850, + 0x9084, 0xefff, 0x7852, 0x2009, 0x1994, 0x2104, 0x8000, 0x200a, + 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, 0x1999, 0x2003, 0x000a, + 0x2009, 0x1996, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, + 0x1990, 0x2003, 0x0004, 0x080c, 0x28aa, 0x0005, 0x0099, 0x0168, + 0x080c, 0x2a5f, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, + 0x2896, 0x0018, 0x0079, 0x080c, 0x28aa, 0x0005, 0x080c, 0x0dd5, + 0x080c, 0x0dd5, 0x2009, 0x1998, 0x2104, 0x8001, 0x200a, 0x090c, + 0x2a0b, 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x0005, 0x7a38, + 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, + 0x0001, 0x080c, 0x2a1d, 0x0005, 0x2009, 0x1993, 0x2104, 0x8000, + 0x200a, 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, + 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, + 0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x0005, 0x0086, + 0x2001, 0x1996, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dd5, 0x2009, + 0x1995, 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, + 0xd084, 0x1120, 0x080c, 0x0dd5, 0x9006, 0x0010, 0x2001, 0x0001, + 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x198e, 0x20a9, + 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, 0x2a11, 0x2001, 0x1995, + 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, + 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, + 0x783a, 0x2009, 0x199b, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, + 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, 0x199c, 0x210c, 0x795a, + 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, + 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, + 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, + 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0006, + 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, + 0x20a9, 0x0064, 0x7820, 0x080c, 0x2aea, 0xd09c, 0x1110, 0x1f04, + 0x2a62, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, + 0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, + 0x080c, 0x2aea, 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186, + 0x0000, 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, + 0x783b, 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, + 0x0030, 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, + 0x1d04, 0x2a98, 0x080c, 0x833c, 0x1f04, 0x2a98, 0x7850, 0x9085, + 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2aea, 0x9085, 0x1000, + 0x7852, 0x000e, 0x001e, 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, + 0x7852, 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, + 0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, + 0x2abc, 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2ac2, 0x00fe, + 0x015e, 0x000e, 0x0005, 0x1d04, 0x2acb, 0x080c, 0x833c, 0x1f04, + 0x2acb, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0000, + 0x000e, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0001, + 0x000e, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0002, + 0x000e, 0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, + 0x0006, 0x2001, 0x19a6, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, + 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, + 0xa001, 0xa001, 0x200a, 0x0005, 0x0036, 0x0046, 0x2001, 0x0141, + 0x200c, 0x918c, 0xff00, 0x9186, 0x2000, 0x0118, 0x9186, 0x0100, + 0x1588, 0x2009, 0x00a2, 0x080c, 0x0e51, 0x2019, 0x0160, 0x2324, + 0x2011, 0x0003, 0x2009, 0x0169, 0x2104, 0x9084, 0x0007, 0x210c, + 0x918c, 0x0007, 0x910e, 0x1db0, 0x9086, 0x0003, 0x11b8, 0x2304, + 0x9402, 0x02a0, 0x1d60, 0x8211, 0x1d68, 0x84ff, 0x0170, 0x2001, + 0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009, + 0x180c, 0x2104, 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2009, 0x0000, + 0x080c, 0x0e51, 0x004e, 0x003e, 0x0005, 0x2001, 0x180c, 0x2004, + 0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001, + 0x0141, 0x2004, 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126, + 0x2091, 0x8000, 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e, + 0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161, + 0x2003, 0x0000, 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008, + 0x6104, 0x918e, 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017, + 0x0040, 0x04b9, 0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016, + 0x2019, 0x0141, 0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084, + 0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118, + 0x9385, 0x0009, 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012, + 0x6016, 0x003e, 0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce, + 0x0005, 0x0016, 0x0026, 0x080c, 0x7197, 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, - 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, 0x1110, 0xc0bc, - 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x2c2a, 0x2c2a, - 0x2a4e, 0x2a4e, 0x2a5a, 0x2a5a, 0x2a66, 0x2a66, 0x2a74, 0x2a74, - 0x2a80, 0x2a80, 0x2a8e, 0x2a8e, 0x2a9c, 0x2a9c, 0x2aae, 0x2aae, - 0x2aba, 0x2aba, 0x2ac8, 0x2ac8, 0x2ae6, 0x2ae6, 0x2b06, 0x2b06, - 0x2ad6, 0x2ad6, 0x2af6, 0x2af6, 0x2b14, 0x2b14, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2b26, 0x2b26, - 0x2b32, 0x2b32, 0x2b40, 0x2b40, 0x2b4e, 0x2b4e, 0x2b5e, 0x2b5e, - 0x2b6c, 0x2b6c, 0x2b7c, 0x2b7c, 0x2b8c, 0x2b8c, 0x2b9e, 0x2b9e, - 0x2bac, 0x2bac, 0x2bbc, 0x2bbc, 0x2bde, 0x2bde, 0x2c00, 0x2c00, - 0x2bcc, 0x2bcc, 0x2bef, 0x2bef, 0x2c0f, 0x2c0f, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, - 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x2aac, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2184, - 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x1f9f, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, - 0x080c, 0x2184, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd7, 0x0804, 0x2c22, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x2184, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, 0x080c, 0x2184, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0xa001, 0x0cf0, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12d6, - 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x2184, 0x080c, 0x12d6, 0x0804, 0x2c22, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x1f9f, 0x080c, 0x12d6, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2184, - 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, - 0x080c, 0x2184, 0x080c, 0x12d6, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, - 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12d6, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f9f, 0x080c, 0x2184, - 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, - 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x2184, 0x0804, 0x2c22, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x25d9, 0x080c, 0x1f9f, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, - 0x080c, 0x1f9f, 0x080c, 0x2184, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x2184, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x1f9f, - 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x1f9f, - 0x080c, 0x2184, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, - 0x080c, 0x12d6, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x2184, - 0x080c, 0x12d6, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x1f9f, - 0x080c, 0x12d6, 0x0804, 0x2c22, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, 0x080c, 0x2184, - 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0804, 0x2c22, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x25d9, - 0x080c, 0x1f9f, 0x080c, 0x2184, 0x080c, 0x12d6, 0x0498, 0x0106, + 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, + 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, + 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, + 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, + 0x1128, 0x080c, 0x7197, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, + 0x001e, 0x000e, 0x0005, 0x2e47, 0x2e47, 0x2c6b, 0x2c6b, 0x2c77, + 0x2c77, 0x2c83, 0x2c83, 0x2c91, 0x2c91, 0x2c9d, 0x2c9d, 0x2cab, + 0x2cab, 0x2cb9, 0x2cb9, 0x2ccb, 0x2ccb, 0x2cd7, 0x2cd7, 0x2ce5, + 0x2ce5, 0x2d03, 0x2d03, 0x2d23, 0x2d23, 0x2cf3, 0x2cf3, 0x2d13, + 0x2d13, 0x2d31, 0x2d31, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2d43, 0x2d43, 0x2d4f, 0x2d4f, 0x2d5d, + 0x2d5d, 0x2d6b, 0x2d6b, 0x2d7b, 0x2d7b, 0x2d89, 0x2d89, 0x2d99, + 0x2d99, 0x2da9, 0x2da9, 0x2dbb, 0x2dbb, 0x2dc9, 0x2dc9, 0x2dd9, + 0x2dd9, 0x2dfb, 0x2dfb, 0x2e1d, 0x2e1d, 0x2de9, 0x2de9, 0x2e0c, + 0x2e0c, 0x2e2c, 0x2e2c, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, + 0x2cc9, 0x2cc9, 0x2cc9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x25d9, 0x080c, 0x1f9f, 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0410, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x25d9, 0x080c, 0x12d6, 0x080c, 0x1fd7, 0x0098, 0x0106, + 0x2147, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x25d9, 0x080c, 0x1f9f, 0x080c, 0x2184, 0x080c, 0x12d6, 0x080c, - 0x1fd7, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, - 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, - 0x080c, 0x6262, 0x1904, 0x2d17, 0x72d4, 0x2001, 0x194d, 0x2004, - 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, - 0x2d17, 0x080c, 0x2d1c, 0x0804, 0x2d17, 0xd2cc, 0x1904, 0x2d17, - 0x080c, 0x6c53, 0x1120, 0x70a7, 0xffff, 0x0804, 0x2d17, 0xd294, - 0x0120, 0x70a7, 0xffff, 0x0804, 0x2d17, 0x080c, 0x2f81, 0x0160, - 0x080c, 0xbcec, 0x0128, 0x2001, 0x1816, 0x203c, 0x0804, 0x2cb5, - 0x70a7, 0xffff, 0x0804, 0x2d17, 0x2001, 0x1816, 0x203c, 0x728c, - 0xd284, 0x0904, 0x2cb5, 0xd28c, 0x1904, 0x2cb5, 0x0036, 0x73a4, - 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, - 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, - 0x9084, 0x00ff, 0x970e, 0x0540, 0x908e, 0x0000, 0x0528, 0x908e, - 0x00ff, 0x1150, 0x7230, 0xd284, 0x1518, 0x728c, 0xc28d, 0x728e, - 0x70a7, 0xffff, 0x003e, 0x0408, 0x900e, 0x080c, 0x24d6, 0x080c, - 0x5f1e, 0x11a0, 0x080c, 0x62a4, 0x1150, 0x7030, 0xd08c, 0x0118, - 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2d35, 0x0140, 0x0028, 0x080c, - 0x2e71, 0x080c, 0x2d61, 0x0110, 0x8318, 0x0838, 0x73a6, 0x0010, - 0x70a7, 0xffff, 0x003e, 0x0804, 0x2d17, 0x9780, 0x2f92, 0x203d, - 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff, - 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, - 0x20a8, 0x0020, 0x70a7, 0xffff, 0x0804, 0x2d17, 0x2700, 0x0156, - 0x0016, 0x9106, 0x05c8, 0xc484, 0x080c, 0x5f7e, 0x0138, 0x080c, - 0xbcec, 0x1590, 0x080c, 0x5f1e, 0x15b8, 0x0008, 0xc485, 0x080c, - 0x62a4, 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, - 0x728c, 0xd28c, 0x0180, 0x080c, 0x62a4, 0x9082, 0x0006, 0x02e0, - 0xd484, 0x1118, 0x080c, 0x5f42, 0x0028, 0x080c, 0x2efd, 0x01a0, - 0x080c, 0x2f28, 0x0088, 0x080c, 0x2e71, 0x080c, 0xbcec, 0x1160, - 0x080c, 0x2d61, 0x0188, 0x0040, 0x080c, 0xbcec, 0x1118, 0x080c, - 0x2efd, 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, - 0x2cce, 0x70a7, 0xffff, 0x0018, 0x001e, 0x015e, 0x71a6, 0x004e, - 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70a7, 0x0001, - 0x2009, 0x007e, 0x080c, 0x5f1e, 0x1168, 0xb813, 0x00ff, 0xb817, - 0xfffe, 0x080c, 0x2e71, 0x04a9, 0x0128, 0x70d4, 0xc0bd, 0x70d6, - 0x080c, 0xba40, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, - 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, - 0x9a23, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xba69, 0x6023, 0x0001, - 0x9006, 0x080c, 0x5ebb, 0x2001, 0x0000, 0x080c, 0x5ecf, 0x0126, - 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e, 0x2009, 0x0004, - 0x080c, 0x9a50, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, - 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, - 0x9084, 0x00ff, 0xb842, 0x080c, 0x9a23, 0x0548, 0x2b00, 0x6012, - 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, - 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x2e30, 0x080c, - 0xba69, 0x6023, 0x0001, 0x9006, 0x080c, 0x5ebb, 0x2001, 0x0002, - 0x080c, 0x5ecf, 0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, - 0x012e, 0x2009, 0x0002, 0x080c, 0x9a50, 0x9085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, - 0x0080, 0x080c, 0x5f1e, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, - 0x0039, 0x0110, 0x70db, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, - 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x9980, 0x01d0, 0x2b00, - 0x6012, 0x080c, 0xba69, 0x6023, 0x0001, 0x9006, 0x080c, 0x5ebb, - 0x2001, 0x0002, 0x080c, 0x5ecf, 0x0126, 0x2091, 0x8000, 0x70dc, - 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, 0x080c, 0x9a50, 0x9085, - 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, - 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x5f1e, 0x11b8, - 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, 0x080c, 0x9980, - 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, - 0xba69, 0x2009, 0x0022, 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, - 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, - 0x00b6, 0x21f0, 0x080c, 0x818b, 0x080c, 0x811a, 0x080c, 0x9819, - 0x080c, 0xa893, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, - 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5f7e, - 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, - 0x5a3b, 0x001e, 0x8108, 0x1f04, 0x2e15, 0x9686, 0x0001, 0x190c, - 0x2f55, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, - 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, - 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x8180, 0x0076, 0x2039, - 0x0000, 0x080c, 0x8078, 0x2c08, 0x080c, 0xcd62, 0x007e, 0x001e, - 0xba10, 0xbb14, 0x080c, 0x5a3b, 0xba12, 0xbb16, 0x00be, 0x001e, - 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, - 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, - 0x1800, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2, 0x000e, 0x00ee, - 0x0005, 0x2071, 0x1800, 0x70dc, 0x9005, 0x0dc0, 0x8001, 0x70de, - 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, - 0x00b6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, - 0x20a9, 0x0001, 0x0088, 0x080c, 0x5113, 0xd0c4, 0x0150, 0xd0a4, - 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xcfe6, - 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, - 0x2edd, 0x928e, 0x007f, 0x0904, 0x2edd, 0x928e, 0x0080, 0x05e8, - 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, - 0x195d, 0x0006, 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, 0x0000, - 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x626e, 0x00ce, - 0x00be, 0x2019, 0x0029, 0x080c, 0x8180, 0x0076, 0x2039, 0x0000, - 0x080c, 0x8078, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, - 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, - 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, - 0x2c08, 0x080c, 0xcd62, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, - 0x2e94, 0x015e, 0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, - 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x5113, 0xd0c4, - 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, - 0xcfe6, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, - 0x00c6, 0x728c, 0x82ff, 0x01e8, 0x080c, 0x629c, 0x11d0, 0x2100, - 0x080c, 0x2509, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, - 0x1c80, 0x2c04, 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, - 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, - 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, - 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0036, 0x2019, 0x0029, - 0x00a9, 0x003e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, - 0x00c6, 0x2061, 0x1a73, 0x001e, 0x6112, 0x080c, 0x2e30, 0x001e, - 0x080c, 0x5f42, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, - 0x2110, 0x080c, 0x94b5, 0x080c, 0xd29b, 0x002e, 0x001e, 0x0005, - 0x2001, 0x1835, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, - 0x6c53, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, - 0x6c53, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, - 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, - 0x5f42, 0x8108, 0x1f04, 0x2f66, 0x2061, 0x1800, 0x6077, 0x0000, - 0x6078, 0x9084, 0x00ff, 0x607a, 0x60ab, 0x0000, 0x00be, 0x00ce, - 0x0005, 0x2001, 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, - 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011, 0x1873, 0x2214, 0xd2dc, - 0x002e, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, - 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, - 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, - 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, - 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, - 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, - 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, - 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, - 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, - 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, - 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, - 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, - 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, - 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, - 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, - 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, - 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, - 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, - 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, - 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, - 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, - 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, - 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, - 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, - 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, - 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, - 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x2333, 0x080c, 0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, + 0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, + 0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x1363, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x1363, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x0804, 0x2e3f, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x27f3, 0x080c, 0x2333, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, + 0x2147, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, + 0x2333, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x2182, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x1363, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x1363, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x1363, 0x0804, + 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c, + 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, + 0x2333, 0x080c, 0x1363, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, + 0x080c, 0x1363, 0x080c, 0x2182, 0x0410, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, + 0x1363, 0x080c, 0x2182, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, + 0x080c, 0x2333, 0x080c, 0x1363, 0x080c, 0x2182, 0x0000, 0x015e, + 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, + 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x66f5, 0x1904, + 0x2f55, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c, + 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2f55, 0x080c, 0x2f5a, + 0x0804, 0x2f55, 0xd2cc, 0x1904, 0x2f55, 0x080c, 0x717d, 0x1120, + 0x70af, 0xffff, 0x0804, 0x2f55, 0xd294, 0x0120, 0x70af, 0xffff, + 0x0804, 0x2f55, 0x080c, 0x31bf, 0x0160, 0x080c, 0xcf18, 0x0128, + 0x2001, 0x1818, 0x203c, 0x0804, 0x2ee2, 0x70af, 0xffff, 0x0804, + 0x2f55, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x2ee2, + 0xd28c, 0x1904, 0x2ee2, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, + 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, 0x0001, + 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, + 0x05b8, 0x908e, 0x0000, 0x05a0, 0x908e, 0x00ff, 0x1150, 0x7230, + 0xd284, 0x1598, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, 0x003e, + 0x0488, 0x900e, 0x080c, 0x26f0, 0x080c, 0x636c, 0x1520, 0x9006, + 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, + 0x8710, 0x00ce, 0x090c, 0x8ab4, 0xb8af, 0x0000, 0x080c, 0x6737, + 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, + 0x2f73, 0x0148, 0x0028, 0x080c, 0x30af, 0x080c, 0x2f9f, 0x0118, + 0x8318, 0x0804, 0x2e92, 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e, + 0x0804, 0x2f55, 0x9780, 0x31d0, 0x203d, 0x97bc, 0xff00, 0x873f, + 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, + 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af, + 0xffff, 0x0804, 0x2f55, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, + 0x2f4a, 0xc484, 0x080c, 0x63cd, 0x0148, 0x080c, 0xcf18, 0x1904, + 0x2f4a, 0x080c, 0x636c, 0x1904, 0x2f52, 0x0008, 0xc485, 0xb8bb, + 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8710, + 0x00ce, 0x090c, 0x8ab4, 0xb8af, 0x0000, 0x080c, 0x6737, 0x1130, + 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c, + 0x0180, 0x080c, 0x6737, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, + 0x080c, 0x6391, 0x0028, 0x080c, 0x313b, 0x01a0, 0x080c, 0x3166, + 0x0088, 0x080c, 0x30af, 0x080c, 0xcf18, 0x1160, 0x080c, 0x2f9f, + 0x0188, 0x0040, 0x080c, 0xcf18, 0x1118, 0x080c, 0x313b, 0x0110, + 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2efb, 0x70af, + 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce, + 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, 0x007e, + 0x080c, 0x636c, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, + 0x30af, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xcc6a, + 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, + 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xabb9, 0x01d0, + 0x2b00, 0x6012, 0x080c, 0xcc93, 0x6023, 0x0001, 0x9006, 0x080c, + 0x6309, 0x2001, 0x0000, 0x080c, 0x631d, 0x0126, 0x2091, 0x8000, + 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, 0xabe6, + 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, + 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, + 0xb842, 0x080c, 0xabb9, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, + 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x1110, 0x080c, 0x306e, 0x080c, 0xcc93, 0x6023, + 0x0001, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, + 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, + 0x0002, 0x080c, 0xabe6, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, + 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, + 0x636c, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, + 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, + 0x00d6, 0x00c6, 0x080c, 0xab15, 0x01d0, 0x2b00, 0x6012, 0x080c, + 0xcc93, 0x6023, 0x0001, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002, + 0x080c, 0x631d, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6, + 0x012e, 0x2009, 0x0002, 0x080c, 0xabe6, 0x9085, 0x0001, 0x00ce, + 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2009, 0x007f, 0x080c, 0x636c, 0x11b8, 0xb813, 0x00ff, + 0xb817, 0xfffd, 0xb8cf, 0x0004, 0x080c, 0xab15, 0x0170, 0x2b00, + 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xcc93, 0x2009, + 0x0022, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, + 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, + 0x080c, 0x9025, 0x080c, 0x8faa, 0x080c, 0xa9ae, 0x080c, 0xba81, + 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, + 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1140, 0x9686, + 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5e12, 0x001e, + 0x8108, 0x1f04, 0x3053, 0x9686, 0x0001, 0x190c, 0x3193, 0x00be, + 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, + 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026, + 0x2019, 0x0029, 0x080c, 0x901a, 0x0076, 0x2039, 0x0000, 0x080c, + 0x8ef7, 0x2c08, 0x080c, 0xdfbd, 0x007e, 0x001e, 0xba10, 0xbb14, + 0x080c, 0x5e12, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, 0x003e, + 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, + 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a8, + 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, 0xb800, + 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0036, + 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, + 0x0088, 0x080c, 0x54b7, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, + 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xe280, 0x004e, 0x20a9, + 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x311b, 0x928e, + 0x007f, 0x0904, 0x311b, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, + 0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x198c, 0x0006, + 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, + 0x2158, 0x2001, 0x0001, 0x080c, 0x6701, 0x00ce, 0x00be, 0x2019, + 0x0029, 0x080c, 0x901a, 0x0076, 0x2039, 0x0000, 0x080c, 0x8ef7, + 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, + 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, + 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, + 0xdfbd, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x30d2, 0x015e, + 0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, + 0x0046, 0x0026, 0x0016, 0x080c, 0x54b7, 0xd0c4, 0x0140, 0xd0a4, + 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xe280, 0x001e, + 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, + 0x82ff, 0x01e8, 0x080c, 0x672f, 0x11d0, 0x2100, 0x080c, 0x2723, + 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, + 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, + 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, + 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e, + 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, + 0x1aa7, 0x001e, 0x6112, 0x080c, 0x306e, 0x001e, 0x080c, 0x6391, + 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, + 0xa512, 0x080c, 0xe5e4, 0x002e, 0x001e, 0x0005, 0x2001, 0x1837, + 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x717d, 0x1118, + 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x717d, 0x1110, + 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, + 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x6391, 0x8108, + 0x1f04, 0x31a4, 0x2061, 0x1800, 0x607f, 0x0000, 0x6080, 0x9084, + 0x00ff, 0x6082, 0x60b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, + 0x1869, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, + 0x0005, 0x0026, 0x2011, 0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005, + 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, + 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, + 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, + 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, + 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, + 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, + 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, + 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, + 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, + 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, + 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, + 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, + 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, + 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, + 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, + 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, + 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, + 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, + 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, + 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, + 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, + 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, + 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, + 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, + 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, + 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, + 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, + 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, + 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x2071, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016, - 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0, - 0x703f, 0x18b0, 0x7007, 0x0001, 0x080c, 0x0fee, 0x090c, 0x0db2, - 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x0fee, - 0x090c, 0x0db2, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, - 0x0005, 0x2071, 0x1894, 0x7004, 0x0002, 0x30c1, 0x30c2, 0x30d5, - 0x30e9, 0x0005, 0x1004, 0x30d2, 0x0e04, 0x30d2, 0x2079, 0x0000, - 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, - 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, - 0x18ae, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, - 0x0904, 0x31bd, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, - 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, - 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, - 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, - 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61c8, 0x0042, 0x2100, - 0x908a, 0x003f, 0x1a04, 0x31ba, 0x61c8, 0x0804, 0x314f, 0x3191, - 0x31c9, 0x31d3, 0x31d7, 0x31e1, 0x31e7, 0x31eb, 0x31fb, 0x31fe, - 0x3208, 0x320d, 0x3212, 0x321d, 0x3228, 0x3237, 0x3246, 0x3254, - 0x326b, 0x3286, 0x31ba, 0x332f, 0x336d, 0x3413, 0x3424, 0x3447, - 0x31ba, 0x31ba, 0x31ba, 0x347f, 0x349b, 0x34a4, 0x34d3, 0x34d9, - 0x31ba, 0x351f, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x352a, - 0x3533, 0x353b, 0x353d, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, - 0x31ba, 0x3569, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x3586, - 0x35e1, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x0002, - 0x360b, 0x360e, 0x366d, 0x3686, 0x36b6, 0x3954, 0x31ba, 0x4cec, - 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, 0x31ba, - 0x3208, 0x320d, 0x3e75, 0x31ba, 0x3e8b, 0x4d7b, 0x4dcc, 0x4ecf, - 0x31ba, 0x4f31, 0x4f6d, 0x4f9e, 0x50a2, 0x4fcb, 0x5022, 0x31ba, - 0x3e8f, 0x404f, 0x4065, 0x408a, 0x40ef, 0x4163, 0x4183, 0x41fa, - 0x420b, 0x421c, 0x421f, 0x4244, 0x42b7, 0x431d, 0x4325, 0x4457, - 0x459c, 0x45d0, 0x4834, 0x31ba, 0x4852, 0x48fe, 0x49d4, 0x31ba, - 0x31ba, 0x31ba, 0x31ba, 0x4a3a, 0x4a55, 0x4325, 0x4c9b, 0x714c, - 0x0000, 0x2021, 0x4000, 0x080c, 0x464e, 0x0126, 0x2091, 0x8000, - 0x0e04, 0x319b, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, - 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, - 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x1167, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, - 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, - 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, - 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, - 0x7990, 0x0804, 0x465b, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, + 0x2071, 0x189e, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, + 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, + 0x7007, 0x0001, 0x080c, 0x1019, 0x090c, 0x0dd5, 0x2900, 0x706a, + 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1019, 0x090c, 0x0dd5, + 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, + 0x189e, 0x7004, 0x0002, 0x32ff, 0x3300, 0x3313, 0x3327, 0x0005, + 0x1004, 0x3310, 0x0e04, 0x3310, 0x2079, 0x0000, 0x0126, 0x2091, + 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, + 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, + 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x33fb, + 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, + 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, + 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, + 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, + 0x908a, 0x0040, 0x1210, 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, + 0x1a04, 0x33f8, 0x61d0, 0x0804, 0x338d, 0x33cf, 0x3407, 0x3411, + 0x3415, 0x341f, 0x3425, 0x3429, 0x3439, 0x343c, 0x3446, 0x344b, + 0x3450, 0x345b, 0x3466, 0x3475, 0x3484, 0x3492, 0x34a9, 0x34c4, + 0x33f8, 0x356d, 0x35ab, 0x3651, 0x3662, 0x3685, 0x33f8, 0x33f8, + 0x33f8, 0x36bd, 0x36d9, 0x36e2, 0x3711, 0x3717, 0x33f8, 0x375d, + 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x3768, 0x3771, 0x3779, + 0x377b, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x37a7, + 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x37c4, 0x3825, 0x33f8, + 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x0002, 0x384f, 0x3852, + 0x38b1, 0x38ca, 0x38fa, 0x3b98, 0x33f8, 0x5090, 0x33f8, 0x33f8, + 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x3446, 0x344b, + 0x40b9, 0x54db, 0x40d7, 0x511f, 0x5170, 0x5273, 0x33f8, 0x52d5, + 0x5311, 0x5342, 0x5446, 0x536f, 0x53c6, 0x33f8, 0x40db, 0x42a4, + 0x42ba, 0x42df, 0x4344, 0x43b8, 0x43d8, 0x444f, 0x4460, 0x4478, + 0x447b, 0x44a0, 0x4510, 0x4576, 0x457e, 0x46b0, 0x4825, 0x4859, + 0x4abd, 0x33f8, 0x4adb, 0x4b87, 0x4c69, 0x4cc3, 0x33f8, 0x4d78, + 0x33f8, 0x4dde, 0x4df9, 0x457e, 0x503f, 0x714c, 0x0000, 0x2021, + 0x4000, 0x080c, 0x48d7, 0x0126, 0x2091, 0x8000, 0x0e04, 0x33d9, + 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, + 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, + 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, + 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, + 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, - 0x465e, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x3191, 0x7984, - 0x2114, 0x0804, 0x3191, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, - 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, - 0x7b8c, 0x0804, 0x3191, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, - 0x2011, 0x0002, 0x2019, 0x0012, 0x789b, 0x0117, 0x0804, 0x3191, - 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, - 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x31c6, - 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x31cd, 0x79a0, 0x9182, 0x0040, - 0x0210, 0x0804, 0x31c6, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x31db, - 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x31c6, 0x21e8, 0x7984, - 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x3191, 0x2061, - 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, - 0x2010, 0x9005, 0x0904, 0x3191, 0x0804, 0x31c0, 0x79a0, 0x9182, - 0x0040, 0x0210, 0x0804, 0x31c6, 0x21e0, 0x20a9, 0x0001, 0x7984, - 0x2198, 0x4012, 0x0804, 0x3191, 0x2069, 0x1853, 0x7884, 0x7990, - 0x911a, 0x1a04, 0x31c6, 0x8019, 0x0904, 0x31c6, 0x684a, 0x6942, - 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, - 0x6f5b, 0x0804, 0x3191, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, - 0x1a04, 0x31c6, 0x8019, 0x0904, 0x31c6, 0x684e, 0x6946, 0x788c, - 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, - 0x8000, 0x080c, 0x630e, 0x012e, 0x0804, 0x3191, 0x902e, 0x2520, - 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, 0x7984, 0x7b88, - 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101, - 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, 0x2009, - 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x465b, 0x701f, - 0x32aa, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, - 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, - 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x31c3, 0x810f, 0x918c, - 0x00ff, 0x0904, 0x31c3, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, - 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, 0x2009, - 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, - 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, - 0x9080, 0x0019, 0xaf60, 0x080c, 0x465b, 0x701f, 0x32e8, 0x0005, - 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, - 0x1904, 0x31c3, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, - 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, - 0x080c, 0x5b2d, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, - 0x012e, 0x0050, 0x080c, 0x5e34, 0x1128, 0x7007, 0x0003, 0x701f, - 0x3314, 0x0005, 0x080c, 0x6770, 0x0126, 0x2091, 0x8000, 0x20a9, - 0x0005, 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210, - 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, - 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x465e, 0x2091, - 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, - 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, - 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, - 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, - 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x0180, 0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, - 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, - 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x31c3, - 0x7984, 0x080c, 0x5f7e, 0x1904, 0x31c6, 0x7e98, 0x9684, 0x3fff, - 0x9082, 0x4000, 0x1a04, 0x31c6, 0x7c88, 0x7d8c, 0x080c, 0x60e1, - 0x080c, 0x60b0, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, - 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, - 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, - 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a04, 0x31c3, 0x0c30, - 0x080c, 0xb251, 0x012e, 0x0904, 0x31c3, 0x0804, 0x3191, 0x900e, - 0x2001, 0x0005, 0x080c, 0x6770, 0x0126, 0x2091, 0x8000, 0x080c, - 0xb8e9, 0x080c, 0x6536, 0x012e, 0x0804, 0x3191, 0x00a6, 0x2950, - 0xb198, 0x080c, 0x5f7e, 0x1904, 0x3400, 0xb6a4, 0x9684, 0x3fff, - 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x60e1, 0x080c, - 0x60b0, 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, + 0x48e4, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, + 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x48e7, 0x7984, + 0x7888, 0x2114, 0x200a, 0x0804, 0x33cf, 0x7984, 0x2114, 0x0804, + 0x33cf, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, + 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, + 0x33cf, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, + 0x2019, 0x0015, 0x789b, 0x0137, 0x0804, 0x33cf, 0x2039, 0x0001, + 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, + 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3404, 0x2138, 0x7d98, + 0x7c9c, 0x0804, 0x340b, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, + 0x3404, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3419, 0x79a0, 0x9182, + 0x0040, 0x0210, 0x0804, 0x3404, 0x21e8, 0x7984, 0x7888, 0x20a9, + 0x0001, 0x21a0, 0x4004, 0x0804, 0x33cf, 0x2061, 0x0800, 0xe10c, + 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, + 0x0904, 0x33cf, 0x0804, 0x33fe, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x3404, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, + 0x0804, 0x33cf, 0x2069, 0x1847, 0x7884, 0x7990, 0x911a, 0x1a04, + 0x3404, 0x8019, 0x0904, 0x3404, 0x684a, 0x6942, 0x788c, 0x6852, + 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x7496, 0x0804, + 0x33cf, 0x2069, 0x1847, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3404, + 0x8019, 0x0904, 0x3404, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, + 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, + 0x67a1, 0x012e, 0x0804, 0x33cf, 0x902e, 0x2520, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x3401, 0x7984, 0x7b88, 0x7a8c, 0x20a9, + 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, 0x4101, 0x080c, 0x489b, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x2009, 0x0020, 0xa85c, + 0x9080, 0x0019, 0xaf60, 0x080c, 0x48e4, 0x701f, 0x34e8, 0x0005, + 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, + 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, + 0x9096, 0x0029, 0x1904, 0x3401, 0x810f, 0x918c, 0x00ff, 0x0904, + 0x3401, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, 0x489b, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x2009, 0x0020, 0x7068, + 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, + 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, + 0xaf60, 0x080c, 0x48e4, 0x701f, 0x3526, 0x0005, 0xa864, 0x9084, + 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x3401, + 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, + 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x5f69, + 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, + 0x080c, 0x6282, 0x1128, 0x7007, 0x0003, 0x701f, 0x3552, 0x0005, + 0x080c, 0x6c85, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, + 0x0001, 0x2099, 0x18a6, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, + 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, + 0x0020, 0x012e, 0xaf60, 0x0804, 0x48e7, 0x2091, 0x8000, 0x7837, + 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, 0x4953, 0x788b, + 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7892, 0x3f00, + 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, + 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, 0x2091, 0x5000, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, + 0x1a17, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, + 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, + 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3401, 0x7984, 0x080c, + 0x63cd, 0x1904, 0x3404, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x1a04, 0x3404, 0x7c88, 0x7d8c, 0x080c, 0x6530, 0x080c, 0x64ff, + 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, - 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, - 0x1818, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, - 0xb251, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, - 0x0005, 0x080c, 0x6770, 0x0126, 0x2091, 0x8000, 0x080c, 0xb8e9, - 0x080c, 0x6529, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, - 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, - 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, - 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x31c3, 0x080c, 0x4629, - 0x0904, 0x31c6, 0x080c, 0x6045, 0x0904, 0x31c3, 0x080c, 0x60e7, - 0x0904, 0x31c3, 0x0804, 0x417a, 0x81ff, 0x1904, 0x31c3, 0x080c, - 0x4645, 0x0904, 0x31c6, 0x080c, 0x6175, 0x0904, 0x31c3, 0x2019, - 0x0005, 0x79a8, 0x080c, 0x6102, 0x0904, 0x31c3, 0x7888, 0x908a, - 0x1000, 0x1a04, 0x31c6, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, - 0x7c58, 0x7984, 0xd184, 0x1904, 0x3191, 0x0804, 0x417a, 0x0126, - 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, - 0x07ff, 0x6454, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x5f7e, - 0x11d8, 0x080c, 0x6175, 0x1128, 0x2009, 0x0002, 0x62b8, 0x2518, - 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6102, 0x1118, 0x2009, - 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, - 0x810b, 0x9108, 0x080c, 0x7c58, 0x8529, 0x1ae0, 0x012e, 0x0804, - 0x3191, 0x012e, 0x0804, 0x31c3, 0x012e, 0x0804, 0x31c6, 0x080c, - 0x4629, 0x0904, 0x31c6, 0x080c, 0x6045, 0x0904, 0x31c3, 0xbaa0, - 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x8180, 0x0076, 0x903e, - 0x080c, 0x8078, 0x900e, 0x080c, 0xcd62, 0x007e, 0x00ce, 0x080c, - 0x60e1, 0x0804, 0x3191, 0x080c, 0x4629, 0x0904, 0x31c6, 0x080c, - 0x60e1, 0x2208, 0x0804, 0x3191, 0x0156, 0x00d6, 0x00e6, 0x2069, - 0x1906, 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, - 0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, - 0xb84c, 0x0059, 0x9210, 0x8d68, 0x1f04, 0x34b5, 0x2300, 0x9218, - 0x00ee, 0x00de, 0x015e, 0x0804, 0x3191, 0x00f6, 0x0016, 0x907d, - 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, - 0x001e, 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b4, 0x0804, - 0x3191, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, 0x0126, - 0x2091, 0x8000, 0x080c, 0x5127, 0x0128, 0x2009, 0x0007, 0x012e, - 0x0804, 0x31c3, 0x012e, 0x6154, 0x9190, 0x2f92, 0x2215, 0x9294, - 0x00ff, 0x6374, 0x83ff, 0x0108, 0x6278, 0x67d4, 0x97c4, 0x000a, - 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, - 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, - 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6c53, - 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, - 0x0804, 0x31c3, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3191, 0x6144, - 0x6248, 0x2019, 0x1955, 0x231c, 0x2001, 0x1956, 0x2004, 0x789a, - 0x0804, 0x3191, 0x0126, 0x2091, 0x8000, 0x6134, 0x6238, 0x633c, - 0x012e, 0x0804, 0x3191, 0x080c, 0x4645, 0x0904, 0x31c6, 0xba44, - 0xbb38, 0x0804, 0x3191, 0x080c, 0x0db2, 0x080c, 0x4645, 0x2110, - 0x0904, 0x31c6, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, - 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x31c3, - 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, - 0x94b5, 0x080c, 0x8180, 0x0076, 0x903e, 0x080c, 0x8078, 0x900e, - 0x080c, 0xcd62, 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, - 0x3191, 0x6144, 0x6248, 0x7884, 0x6046, 0x7b88, 0x634a, 0x2069, - 0x1853, 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1955, 0x2d1c, - 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, - 0x1956, 0x2d04, 0x266a, 0x789a, 0x0804, 0x3191, 0x0126, 0x2091, - 0x8000, 0x6134, 0x7884, 0x6036, 0x910e, 0xd1b4, 0x190c, 0x0e84, - 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196c, 0x200a, 0x78ac, - 0x2011, 0x196d, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, - 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, - 0x603a, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, - 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x613c, 0x788c, 0x603e, - 0x910e, 0xd1e4, 0x190c, 0x0e9a, 0x603c, 0xd0cc, 0x0120, 0x78b0, - 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x3191, 0x00f6, 0x2079, - 0x1800, 0x7a34, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, - 0xfebf, 0x8002, 0x9214, 0x7834, 0x9084, 0x0140, 0x9215, 0x7a36, - 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, - 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x31c6, - 0x788c, 0x902d, 0x0904, 0x31c6, 0x900e, 0x080c, 0x5f7e, 0x1120, - 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, - 0x0ca0, 0x080c, 0x4645, 0x0904, 0x31c6, 0x7888, 0x900d, 0x0904, - 0x31c6, 0x788c, 0x9005, 0x0904, 0x31c6, 0xba44, 0xb946, 0xbb38, - 0xb83a, 0x0804, 0x3191, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, - 0x080c, 0x5127, 0x1904, 0x31c3, 0x00c6, 0x2061, 0x0100, 0x7984, - 0x9186, 0x00ff, 0x1130, 0x2001, 0x1816, 0x2004, 0x9085, 0xff00, - 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x2f92, 0x210d, 0x918c, - 0x00ff, 0x2001, 0x1816, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, - 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9980, - 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x5f24, - 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4612, - 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, - 0xa86a, 0x701f, 0x3666, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, - 0x9a50, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x31c3, - 0x00ce, 0x0804, 0x31c6, 0x080c, 0x99d6, 0x0cb0, 0xa830, 0x9086, - 0x0100, 0x0904, 0x31c3, 0x0804, 0x3191, 0x2061, 0x1a3e, 0x0126, - 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, - 0x1800, 0x634c, 0x606c, 0x789a, 0x60b8, 0x789e, 0x60b4, 0x78aa, - 0x012e, 0x0804, 0x3191, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, - 0x31c3, 0x080c, 0x6c53, 0x0904, 0x31c3, 0x0126, 0x2091, 0x8000, - 0x624c, 0x606c, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x253f, - 0x080c, 0x5304, 0x012e, 0x0804, 0x3191, 0x012e, 0x0804, 0x31c6, - 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x1978, 0x2070, 0x2061, - 0x1853, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x7e7f, - 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, - 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3193, - 0x7884, 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, - 0x0288, 0x012e, 0x0804, 0x31c6, 0x2001, 0x002a, 0x2004, 0x2069, - 0x1853, 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x31c6, 0x012e, - 0x0804, 0x31c3, 0x080c, 0x9940, 0x0dd0, 0x7884, 0xd0fc, 0x0904, - 0x3731, 0x00c6, 0x080c, 0x4612, 0x00ce, 0x0d88, 0xa867, 0x0000, - 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, - 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, - 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, - 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, - 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, - 0x38b7, 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, - 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, - 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, - 0x001b, 0x080c, 0x465b, 0x701f, 0x37f4, 0x7023, 0x0001, 0x012e, - 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, - 0x00e6, 0x00f6, 0x080c, 0x36a0, 0x2001, 0x196e, 0x2003, 0x0000, - 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, - 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3926, 0x080c, 0x38e5, - 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a34, 0x2079, 0x0090, - 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, - 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, - 0x0001, 0x080c, 0x3cb9, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3be6, - 0x080c, 0x3aeb, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, - 0x1db8, 0x080c, 0x3d2d, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, - 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, - 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, - 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, - 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181e, 0x2004, - 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, - 0x00ce, 0x0138, 0x080c, 0x3af5, 0x080c, 0x38e0, 0x0058, 0x080c, - 0x38e0, 0x080c, 0x3c51, 0x080c, 0x3bdc, 0x2001, 0x020b, 0x2004, - 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, - 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, - 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, - 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x127c, 0x2009, 0x0028, - 0x080c, 0x20d9, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, - 0x196e, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x3191, 0x012e, - 0x2021, 0x400c, 0x0804, 0x3193, 0x0016, 0x0026, 0x0036, 0x0046, - 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, - 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3850, - 0x2048, 0x1f04, 0x3804, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, - 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, - 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, - 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, - 0x9080, 0x001b, 0x080c, 0x465b, 0x701f, 0x37f4, 0x00b0, 0x8906, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, - 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f52, - 0x000e, 0x080c, 0x465e, 0x701f, 0x37f4, 0x015e, 0x00de, 0x009e, - 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, - 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x38b5, - 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, - 0x080c, 0x5f1e, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, - 0xfffd, 0x080c, 0xbab8, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, - 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x31c3, 0x0016, - 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, - 0x0156, 0x701f, 0x3887, 0x7007, 0x0003, 0x0804, 0x3845, 0x0076, - 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3193, 0xad10, - 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, - 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1a04, 0x3401, 0x0c30, 0x080c, 0xc472, + 0x012e, 0x0904, 0x3401, 0x0804, 0x33cf, 0x900e, 0x2001, 0x0005, + 0x080c, 0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb13, 0x080c, + 0x6a46, 0x012e, 0x0804, 0x33cf, 0x00a6, 0x2950, 0xb198, 0x080c, + 0x63cd, 0x1904, 0x363e, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6530, 0x080c, 0x64ff, 0x1520, + 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, + 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, + 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, + 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xc472, 0x012e, + 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, + 0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb13, 0x080c, 0x6a3a, + 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097, 0x4006, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae, 0x0005, + 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48, 0x00ae, + 0x0005, 0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, + 0x080c, 0x6494, 0x0904, 0x3401, 0x080c, 0x6536, 0x0904, 0x3401, + 0x0804, 0x43cf, 0x81ff, 0x1904, 0x3401, 0x080c, 0x48ce, 0x0904, + 0x3404, 0x080c, 0x65c4, 0x0904, 0x3401, 0x2019, 0x0005, 0x79a8, + 0x080c, 0x6551, 0x0904, 0x3401, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x3404, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8293, 0x7984, + 0xd184, 0x1904, 0x33cf, 0x0804, 0x43cf, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c, + 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x63cd, 0x11d8, 0x080c, + 0x65c4, 0x1128, 0x2009, 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019, + 0x0004, 0x900e, 0x080c, 0x6551, 0x1118, 0x2009, 0x0006, 0x0078, + 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, + 0x080c, 0x8293, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x33cf, 0x012e, + 0x0804, 0x3401, 0x012e, 0x0804, 0x3404, 0x080c, 0x48b2, 0x0904, + 0x3404, 0x080c, 0x6494, 0x0904, 0x3401, 0xbaa0, 0x2019, 0x0005, + 0x00c6, 0x9066, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, + 0x900e, 0x080c, 0xdfbd, 0x007e, 0x00ce, 0x080c, 0x6530, 0x0804, + 0x33cf, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, 0x6530, 0x2208, + 0x0804, 0x33cf, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1910, 0x6810, + 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, + 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, + 0x9210, 0x8d68, 0x1f04, 0x36f3, 0x2300, 0x9218, 0x00ee, 0x00de, + 0x015e, 0x0804, 0x33cf, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, + 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, + 0x0005, 0x2069, 0x1910, 0x6910, 0x62bc, 0x0804, 0x33cf, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x3401, 0x0126, 0x2091, 0x8000, + 0x080c, 0x54cb, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, 0x3401, + 0x012e, 0x615c, 0x9190, 0x31d0, 0x2215, 0x9294, 0x00ff, 0x637c, + 0x83ff, 0x0108, 0x6280, 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, + 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, + 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, + 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x717d, 0x1118, 0x2031, + 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x3401, + 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x33cf, 0x614c, 0x6250, 0x2019, + 0x1984, 0x231c, 0x2001, 0x1985, 0x2004, 0x789a, 0x0804, 0x33cf, + 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, + 0x33cf, 0x080c, 0x48ce, 0x0904, 0x3404, 0xba44, 0xbb38, 0x0804, + 0x33cf, 0x080c, 0x0dd5, 0x080c, 0x48ce, 0x2110, 0x0904, 0x3404, + 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, + 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3401, 0x0126, 0x2091, + 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0xa512, 0x080c, + 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x900e, 0x080c, 0xdfbd, + 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x33cf, 0x614c, + 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, + 0x9305, 0x6816, 0x788c, 0x2069, 0x1984, 0x2d1c, 0x206a, 0x7e98, + 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1985, 0x2d04, + 0x266a, 0x789a, 0x0804, 0x33cf, 0x0126, 0x2091, 0x8000, 0x7884, + 0x603a, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199b, 0x200a, + 0x78ac, 0x2011, 0x199c, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, + 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, + 0x7884, 0xd0b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7888, + 0x603e, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, + 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x788c, 0x6042, 0x9084, + 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, 0x0001, 0x090c, 0x40b9, + 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, + 0x0804, 0x33cf, 0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084, + 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838, + 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, + 0x7888, 0x9025, 0x0904, 0x3404, 0x788c, 0x902d, 0x0904, 0x3404, + 0x900e, 0x080c, 0x63cd, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, + 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x48ce, 0x0904, + 0x3404, 0x7888, 0x900d, 0x0904, 0x3404, 0x788c, 0x9005, 0x0904, + 0x3404, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x33cf, 0x2011, + 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x54cb, 0x1904, 0x3401, + 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, + 0x1818, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, + 0x9188, 0x31d0, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004, + 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, + 0x8000, 0x0006, 0x080c, 0xab15, 0x000e, 0x0510, 0x602e, 0x620a, + 0x7984, 0x00b6, 0x080c, 0x6372, 0x2b08, 0x00be, 0x1500, 0x6112, + 0x6023, 0x0001, 0x080c, 0x489b, 0x01d0, 0x9006, 0xa866, 0x7007, + 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x38aa, 0x2900, + 0x6016, 0x2009, 0x0032, 0x080c, 0xabe6, 0x012e, 0x00ce, 0x0005, + 0x012e, 0x00ce, 0x0804, 0x3401, 0x00ce, 0x0804, 0x3404, 0x080c, + 0xab6b, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x3401, 0x0804, + 0x33cf, 0x2061, 0x1a6e, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, + 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6354, 0x6074, 0x789a, + 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, 0x0804, 0x33cf, 0x900e, + 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3401, 0x080c, 0x717d, 0x0904, + 0x3401, 0x0126, 0x2091, 0x8000, 0x6254, 0x6074, 0x9202, 0x0248, + 0x9085, 0x0001, 0x080c, 0x2759, 0x080c, 0x56db, 0x012e, 0x0804, + 0x33cf, 0x012e, 0x0804, 0x3404, 0x0006, 0x0016, 0x00c6, 0x00e6, + 0x2001, 0x19a7, 0x2070, 0x2061, 0x1847, 0x6008, 0x2072, 0x900e, + 0x2011, 0x1400, 0x080c, 0x8cf7, 0x7206, 0x00ee, 0x00ce, 0x001e, + 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, + 0x2021, 0x400b, 0x0804, 0x33d1, 0x7884, 0xd0fc, 0x0148, 0x2001, + 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x3404, + 0x2001, 0x002a, 0x2004, 0x2069, 0x1847, 0x6908, 0x9102, 0x1230, + 0x012e, 0x0804, 0x3404, 0x012e, 0x0804, 0x3401, 0x080c, 0xaad5, + 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3975, 0x00c6, 0x080c, 0x489b, + 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, + 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, + 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, + 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, + 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, + 0x00fc, 0x8004, 0xa816, 0x080c, 0x3afb, 0x0928, 0x7014, 0x2048, + 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, + 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48e4, 0x701f, + 0x3a38, 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, + 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x38e4, + 0x2001, 0x199d, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, + 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, + 0x080c, 0x3b6a, 0x080c, 0x3b29, 0x00f6, 0x00e6, 0x0086, 0x2940, + 0x2071, 0x1a64, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, + 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, + 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3efd, 0x008e, + 0x00ee, 0x00fe, 0x080c, 0x3e2a, 0x080c, 0x3d2f, 0x05b8, 0x2001, + 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x3f71, 0x00f6, + 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, + 0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, + 0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, + 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, + 0x1190, 0x2001, 0x1820, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, + 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3d39, + 0x080c, 0x3b24, 0x0058, 0x080c, 0x3b24, 0x080c, 0x3e95, 0x080c, + 0x3e20, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, + 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, + 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, + 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, + 0x080c, 0x12e4, 0x2009, 0x0028, 0x080c, 0x2284, 0x2001, 0x0227, + 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, + 0x009e, 0x008e, 0x004e, 0x2001, 0x199d, 0x2004, 0x9005, 0x1118, + 0x012e, 0x0804, 0x33cf, 0x012e, 0x2021, 0x400c, 0x0804, 0x33d1, + 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, + 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, + 0xa804, 0x9005, 0x0904, 0x3a94, 0x2048, 0x1f04, 0x3a48, 0x7068, + 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, + 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, + 0xa864, 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48e4, + 0x701f, 0x3a38, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, - 0x20a0, 0x0006, 0x080c, 0x0f52, 0x000e, 0x080c, 0x465e, 0x007e, - 0x701f, 0x37f4, 0x7023, 0x0001, 0x0005, 0x0804, 0x3191, 0x0156, - 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, - 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4612, 0x001e, - 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006, - 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6, - 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005, - 0x2001, 0x196e, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, - 0x2061, 0x0200, 0x2001, 0x1979, 0x2004, 0x601a, 0x2061, 0x0100, - 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, - 0x4612, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, - 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, - 0x0090, 0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, - 0x0040, 0x080c, 0x20d9, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, - 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, - 0x4612, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, - 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a, - 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000, - 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000, - 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, - 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, - 0x0148, 0x080c, 0x28c8, 0x1130, 0x9006, 0x080c, 0x2820, 0x9006, - 0x080c, 0x2803, 0x7884, 0x9084, 0x0007, 0x0002, 0x3971, 0x397a, - 0x3983, 0x396e, 0x396e, 0x396e, 0x396e, 0x396e, 0x012e, 0x0804, - 0x31c6, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, - 0x3b3f, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, - 0x080c, 0x3b3f, 0x0078, 0x080c, 0x6c53, 0x1128, 0x012e, 0x2009, - 0x0016, 0x0804, 0x31c3, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, - 0x0804, 0x3193, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, - 0x00e6, 0x00f6, 0x080c, 0x36a0, 0x2009, 0x0101, 0x210c, 0x0016, - 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x3e08, - 0x080c, 0x3d58, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, - 0x2071, 0x1a34, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, - 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, - 0x0001, 0x080c, 0x3cb9, 0x080c, 0x28d0, 0x080c, 0x28d0, 0x080c, - 0x28d0, 0x080c, 0x28d0, 0x080c, 0x3cb9, 0x008e, 0x00ee, 0x00fe, - 0x080c, 0x3be6, 0x2009, 0x0190, 0x8109, 0x11b0, 0x080c, 0x3af5, - 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, - 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, - 0x0017, 0x080c, 0x31c3, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, - 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, - 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3bc4, - 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3af5, 0x0804, 0x3aa2, - 0x080c, 0x3d2d, 0x080c, 0x3c51, 0x080c, 0x3ba7, 0x080c, 0x3bdc, - 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, - 0x3af5, 0x00fe, 0x0804, 0x3aa2, 0x00fe, 0x080c, 0x3aeb, 0x1150, - 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, - 0x3af5, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, - 0x1908, 0x8739, 0x0038, 0x2001, 0x1a31, 0x2004, 0x9086, 0x0000, - 0x1904, 0x39f2, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, - 0x8529, 0x2500, 0x9605, 0x0904, 0x3aa2, 0x7884, 0xd0bc, 0x0128, - 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3aa2, 0xa013, 0x0019, 0x2001, - 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a31, - 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, - 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, - 0x0040, 0x080c, 0x20d9, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, - 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, - 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3a79, - 0x00ce, 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, - 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, - 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, - 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, - 0x0804, 0x39ac, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, - 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, - 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, - 0x127c, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, - 0x0028, 0x080c, 0x20d9, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, - 0x9084, 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, - 0x0090, 0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, - 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, - 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x3191, 0x012e, 0x2021, - 0x400c, 0x0804, 0x3193, 0x9085, 0x0001, 0x1d04, 0x3af4, 0x2091, - 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, - 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a31, 0x2003, - 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x20d9, 0x2001, 0x0227, - 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, - 0x00f6, 0x00e6, 0x2071, 0x1a34, 0x7000, 0x9086, 0x0000, 0x0520, - 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, - 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x20d9, 0x782c, 0xd0fc, - 0x0d88, 0x080c, 0x3d2d, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, - 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x20d9, - 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, - 0x2079, 0x0100, 0x2001, 0x1816, 0x200c, 0x7932, 0x7936, 0x080c, - 0x251f, 0x7850, 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, - 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, - 0x20a9, 0x0046, 0x1d04, 0x3b5a, 0x2091, 0x6000, 0x1f04, 0x3b5a, - 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff, 0x7852, 0x2001, 0x0021, - 0x2004, 0x9084, 0x0003, 0x9086, 0x0001, 0x1120, 0x7850, 0x9084, - 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, - 0x20a9, 0x0028, 0xa001, 0x1f04, 0x3b7a, 0x7850, 0x9085, 0x1400, - 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001, 0xa001, 0xd08c, 0x1110, - 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, 0x9085, 0x0400, 0x7852, - 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, - 0x2001, 0x0100, 0x080c, 0x2987, 0x7827, 0x0020, 0x7843, 0x0000, - 0x9006, 0x080c, 0x2987, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, - 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, - 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, - 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, - 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, - 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009, - 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, - 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, - 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, - 0x0100, 0x2001, 0x1979, 0x2004, 0x70e2, 0x080c, 0x38d6, 0x1188, - 0x2001, 0x181e, 0x2004, 0x2009, 0x181d, 0x210c, 0x918c, 0x00ff, - 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, - 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1816, 0x210c, - 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073, - 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, - 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, - 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, - 0x9085, 0x0092, 0x7016, 0x080c, 0x3d2d, 0x00f6, 0x2071, 0x1a31, - 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, - 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, - 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, - 0x080c, 0x3cb9, 0x2011, 0x0001, 0x080c, 0x3cb9, 0x00fe, 0x00ee, - 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, 0x792c, - 0xd1fc, 0x0904, 0x3cb6, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, - 0x3cb2, 0x7000, 0x0002, 0x3cb6, 0x3c67, 0x3c97, 0x3cb2, 0xd1bc, - 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, - 0x3cb9, 0x0904, 0x3cb6, 0x080c, 0x3cb9, 0x0804, 0x3cb6, 0x00f6, - 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, - 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, - 0x080c, 0x3bc4, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, - 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, - 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3c5b, - 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, - 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, - 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, - 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, - 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, - 0x938a, 0x0007, 0x1a0c, 0x0db2, 0x9398, 0x3ce7, 0x231d, 0x083f, - 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, - 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, - 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3d24, - 0x3d1b, 0x3d12, 0x3d09, 0x3d00, 0x3cf7, 0x3cee, 0xa964, 0x7902, - 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, - 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, - 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, - 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, - 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, - 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, - 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, - 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, - 0x2071, 0x1a34, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, - 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x3d54, 0x3d40, 0x3d4b, - 0x8001, 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3cb9, - 0x190c, 0x3cb9, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, - 0x2011, 0x0001, 0x080c, 0x3cb9, 0x008e, 0x00ee, 0x00fe, 0x0005, - 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1979, - 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x1978, 0x2004, 0x60ce, - 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, - 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, - 0x4612, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, - 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, - 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3dd0, - 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4612, 0xa813, 0x0019, - 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, - 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, - 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, - 0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, - 0x080c, 0x20d9, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, - 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, - 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, - 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, - 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a, - 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, - 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, - 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, - 0x080c, 0x4612, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, - 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, - 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, - 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4612, 0x2940, - 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, - 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, - 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3dd0, 0x1d68, - 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4612, 0x2940, 0xa013, 0x0019, - 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, - 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, - 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, - 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, - 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a31, 0x2003, - 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, - 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, - 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, - 0x20a9, 0x0013, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, - 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, - 0x0005, 0x0804, 0x3191, 0x7d98, 0x7c9c, 0x0804, 0x3288, 0x080c, - 0x6c53, 0x190c, 0x59e6, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x465b, - 0x701f, 0x3ea3, 0x0005, 0x080c, 0x5122, 0x1130, 0x3b00, 0x3a08, - 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, - 0x0904, 0x31c6, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x31c6, + 0x20a0, 0x0006, 0x080c, 0x0f7d, 0x000e, 0x080c, 0x48e7, 0x701f, + 0x3a38, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, + 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, + 0x0103, 0x1118, 0x701f, 0x3af9, 0x0450, 0x7014, 0x2048, 0xa868, + 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x636c, 0x0110, 0x9006, + 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xcce2, 0x015e, + 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, + 0x001e, 0x0904, 0x3401, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, + 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3acb, 0x7007, + 0x0003, 0x0804, 0x3a89, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, + 0x0904, 0x33d1, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, + 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f7d, + 0x000e, 0x080c, 0x48e7, 0x007e, 0x701f, 0x3a38, 0x7023, 0x0001, + 0x0005, 0x0804, 0x33cf, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, + 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, + 0x0016, 0x080c, 0x489b, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, + 0xa80a, 0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, + 0x015e, 0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, + 0x0044, 0x00fe, 0x000e, 0x0005, 0x2001, 0x199d, 0x2003, 0x0001, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19a8, + 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004, 0x60ce, + 0x6104, 0xc1ac, 0x6106, 0x080c, 0x489b, 0xa813, 0x0019, 0xa817, + 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, + 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, + 0x19a7, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2284, 0x2001, + 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, + 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, + 0x00fe, 0x0005, 0x00e6, 0x080c, 0x489b, 0x2940, 0xa013, 0x0019, + 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, + 0x2001, 0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, + 0xfff8, 0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, + 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, + 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, + 0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2ae2, 0x1130, + 0x9006, 0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x7884, 0x9084, + 0x0007, 0x0002, 0x3bb5, 0x3bbe, 0x3bc7, 0x3bb2, 0x3bb2, 0x3bb2, + 0x3bb2, 0x3bb2, 0x012e, 0x0804, 0x3404, 0x2009, 0x0114, 0x2104, + 0x9085, 0x0800, 0x200a, 0x080c, 0x3d83, 0x00c0, 0x2009, 0x0114, + 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x3d83, 0x0078, 0x080c, + 0x717d, 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x3401, 0x81ff, + 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x33d1, 0x0086, 0x0096, + 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x38e4, + 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, + 0x2060, 0x2058, 0x080c, 0x404c, 0x080c, 0x3f9c, 0x903e, 0x2720, + 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a64, 0x2079, 0x0090, + 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, + 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3efd, 0x080c, + 0x2aea, 0x080c, 0x2aea, 0x080c, 0x2aea, 0x080c, 0x2aea, 0x080c, + 0x3efd, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3e2a, 0x2009, 0x9c40, + 0x8109, 0x11b0, 0x080c, 0x3d39, 0x2001, 0x0004, 0x200c, 0x918c, + 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x3401, 0x0cf8, + 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, + 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, + 0x81ff, 0x0150, 0x080c, 0x3e08, 0x2d00, 0x9c05, 0x9b05, 0x0120, + 0x080c, 0x3d39, 0x0804, 0x3ce6, 0x080c, 0x3f71, 0x080c, 0x3e95, + 0x080c, 0x3deb, 0x080c, 0x3e20, 0x00f6, 0x2079, 0x0100, 0x7824, + 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3d39, 0x00fe, 0x0804, 0x3ce6, + 0x00fe, 0x080c, 0x3d2f, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, + 0x2001, 0x0033, 0x2502, 0x080c, 0x3d39, 0x0080, 0x87ff, 0x0138, + 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, + 0x1a60, 0x2004, 0x9086, 0x0000, 0x1904, 0x3c36, 0x2001, 0x032f, + 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, + 0x3ce6, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, + 0x3ce6, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, + 0xd0ac, 0x1148, 0x2001, 0x1a60, 0x2003, 0x0003, 0x2001, 0x032a, + 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, + 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2284, 0x2900, + 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, + 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, + 0x0203, 0x2004, 0x1f04, 0x3cbd, 0x00ce, 0x0030, 0xa817, 0x0001, + 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, + 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, + 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, + 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3bf0, 0x001e, 0x00c6, + 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, + 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, + 0x918c, 0xfffd, 0x2102, 0x080c, 0x12e4, 0x7884, 0x9084, 0x0003, + 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, 0x080c, 0x2284, 0x2001, + 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ef, 0x6052, 0x602f, + 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x00ce, + 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, + 0x0804, 0x33cf, 0x012e, 0x2021, 0x400c, 0x0804, 0x33d1, 0x9085, + 0x0001, 0x1d04, 0x3d38, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, + 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, + 0x0004, 0x2001, 0x1a60, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, + 0x080c, 0x2284, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, + 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a64, + 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, + 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, + 0x080c, 0x2284, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x3f71, 0x7000, + 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, + 0x2009, 0x0040, 0x080c, 0x2284, 0x782b, 0x0002, 0x7003, 0x0000, + 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, + 0x200c, 0x7932, 0x7936, 0x080c, 0x2739, 0x7850, 0x9084, 0xfbff, + 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, + 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3d9e, + 0x2091, 0x6000, 0x1f04, 0x3d9e, 0x7850, 0x9085, 0x0400, 0x9084, + 0xdfff, 0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, + 0x0001, 0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, + 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, + 0x3dbe, 0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, + 0xa001, 0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, + 0x7850, 0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, + 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2ba1, + 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2ba1, 0x7827, + 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, + 0x2071, 0x1a60, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, + 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, + 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, + 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, + 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, + 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, + 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, + 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x19a8, 0x2004, + 0x70e2, 0x080c, 0x3b1a, 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, + 0x181f, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, + 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, + 0x702e, 0x2009, 0x1818, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, + 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, + 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, + 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, + 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0092, 0x7016, 0x080c, + 0x3f71, 0x00f6, 0x2071, 0x1a60, 0x2079, 0x0320, 0x00d6, 0x2069, + 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, + 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, + 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x3efd, 0x2011, 0x0001, + 0x080c, 0x3efd, 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, + 0x1a60, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3efa, 0x782b, + 0x0002, 0x9026, 0xd19c, 0x1904, 0x3ef6, 0x7000, 0x0002, 0x3efa, + 0x3eab, 0x3edb, 0x3ef6, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, + 0x7002, 0x2011, 0x0001, 0x080c, 0x3efd, 0x0904, 0x3efa, 0x080c, + 0x3efd, 0x0804, 0x3efa, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, + 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, + 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3e08, 0x2009, 0x0001, + 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, + 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, + 0x782c, 0xd0fc, 0x1904, 0x3e9f, 0x2011, 0x0001, 0x00b1, 0x0090, + 0xa010, 0x9092, 0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, + 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, + 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, + 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, + 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0dd5, + 0x9398, 0x3f2b, 0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, + 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, + 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, + 0x9085, 0x0001, 0x0005, 0x3f68, 0x3f5f, 0x3f56, 0x3f4d, 0x3f44, + 0x3f3b, 0x3f32, 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, + 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, + 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, 0xa988, 0x7906, + 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, 0x7902, 0xa998, + 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, + 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, + 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, + 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, + 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, 0x1a64, 0x2079, 0x0090, + 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, + 0x0002, 0x3f98, 0x3f84, 0x3f8f, 0x8001, 0x7002, 0xd19c, 0x1180, + 0x2011, 0x0001, 0x080c, 0x3efd, 0x190c, 0x3efd, 0x0048, 0x8001, + 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x3efd, + 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, + 0x2061, 0x0200, 0x2001, 0x19a8, 0x2004, 0x601a, 0x2061, 0x0100, + 0x2001, 0x19a7, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, + 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, + 0x2001, 0x002f, 0x201c, 0x080c, 0x489b, 0xa813, 0x0019, 0xaf16, + 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, + 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, + 0x0019, 0x009e, 0x080c, 0x4014, 0x1d68, 0x2900, 0xa85a, 0x00d0, + 0x080c, 0x489b, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, + 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, + 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, + 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a7, + 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2284, 0x2001, 0x002a, + 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, + 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, + 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, + 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, + 0x7402, 0x7306, 0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, + 0x810b, 0x7112, 0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, + 0x0002, 0x702b, 0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, + 0x0086, 0x0096, 0x2940, 0x0086, 0x080c, 0x489b, 0x008e, 0xa058, + 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, + 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, + 0x9005, 0x0528, 0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, + 0x201c, 0x080c, 0x489b, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, + 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, + 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, + 0x009e, 0x080c, 0x4014, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, + 0x489b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, + 0x2001, 0x0030, 0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, + 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, + 0x2004, 0xa072, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, + 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, + 0x0000, 0x2001, 0x1a60, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, + 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, + 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, + 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, + 0x20e9, 0x0001, 0x9006, 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, + 0x20e9, 0x0000, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, + 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x33cf, 0x7d98, + 0x7c9c, 0x0804, 0x34c6, 0x080c, 0x54c6, 0x1128, 0x3a00, 0x9084, + 0x0010, 0x0904, 0x3404, 0x080c, 0x717d, 0x190c, 0x5dbd, 0x6040, + 0x9084, 0x0020, 0x0971, 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48e4, + 0x701f, 0x40fb, 0x0005, 0x080c, 0x54c6, 0x1130, 0x3b00, 0x3a08, + 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, + 0x0904, 0x3404, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3404, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, - 0x6a28, 0x928a, 0x007f, 0x1a04, 0x31c6, 0x9288, 0x2f92, 0x210d, - 0x918c, 0x00ff, 0x615e, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, - 0x1a04, 0x31c6, 0x6056, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, - 0x8004, 0x8004, 0x0006, 0x2009, 0x1980, 0x9080, 0x2612, 0x2005, - 0x200a, 0x000e, 0x2009, 0x1981, 0x9080, 0x2616, 0x2005, 0x200a, - 0x6808, 0x908a, 0x0100, 0x0a04, 0x31c6, 0x908a, 0x0841, 0x1a04, - 0x31c6, 0x9084, 0x0007, 0x1904, 0x31c6, 0x680c, 0x9005, 0x0904, - 0x31c6, 0x6810, 0x9005, 0x0904, 0x31c6, 0x6848, 0x6940, 0x910a, - 0x1a04, 0x31c6, 0x8001, 0x0904, 0x31c6, 0x684c, 0x6944, 0x910a, - 0x1a04, 0x31c6, 0x8001, 0x0904, 0x31c6, 0x2009, 0x1950, 0x200b, - 0x0000, 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, + 0x6a28, 0x928a, 0x007f, 0x1a04, 0x3404, 0x9288, 0x31d0, 0x210d, + 0x918c, 0x00ff, 0x6166, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, + 0x1a04, 0x3404, 0x605e, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, + 0x8004, 0x8004, 0x0006, 0x2009, 0x19af, 0x9080, 0x282c, 0x2005, + 0x200a, 0x000e, 0x2009, 0x19b0, 0x9080, 0x2830, 0x2005, 0x200a, + 0x6808, 0x908a, 0x0100, 0x0a04, 0x3404, 0x908a, 0x0841, 0x1a04, + 0x3404, 0x9084, 0x0007, 0x1904, 0x3404, 0x680c, 0x9005, 0x0904, + 0x3404, 0x6810, 0x9005, 0x0904, 0x3404, 0x6848, 0x6940, 0x910a, + 0x1a04, 0x3404, 0x8001, 0x0904, 0x3404, 0x684c, 0x6944, 0x910a, + 0x1a04, 0x3404, 0x8001, 0x0904, 0x3404, 0x2009, 0x197f, 0x200b, + 0x0000, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, - 0x00ff, 0x6146, 0x8007, 0x9084, 0x00ff, 0x604a, 0x080c, 0x6f5b, - 0x080c, 0x62da, 0x080c, 0x630e, 0x6808, 0x602a, 0x080c, 0x204b, + 0x00ff, 0x614e, 0x8007, 0x9084, 0x00ff, 0x6052, 0x080c, 0x7496, + 0x080c, 0x676d, 0x080c, 0x67a1, 0x6808, 0x602a, 0x080c, 0x21f6, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, - 0x0036, 0x6b08, 0x080c, 0x2579, 0x003e, 0x6000, 0x9086, 0x0000, - 0x1904, 0x403f, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, + 0x0036, 0x6b08, 0x080c, 0x2793, 0x003e, 0x6000, 0x9086, 0x0000, + 0x1904, 0x4292, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, - 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x1982, - 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199c, 0x20e9, - 0x0001, 0x4001, 0x080c, 0x7d50, 0x00c6, 0x900e, 0x20a9, 0x0001, + 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b1, + 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x19cb, 0x20e9, + 0x0001, 0x4001, 0x080c, 0x837e, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, - 0x8109, 0x080c, 0x74e0, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, + 0x8109, 0x080c, 0x7a4c, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, - 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x3f94, 0x00ce, - 0x00c6, 0x2061, 0x196b, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, - 0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2820, - 0x2001, 0x0001, 0x080c, 0x2803, 0x0088, 0x9286, 0x4000, 0x1148, - 0x2063, 0x0001, 0x9006, 0x080c, 0x2820, 0x9006, 0x080c, 0x2803, - 0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, - 0x2c70, 0x080c, 0x0e69, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, - 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, - 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, - 0x2001, 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, - 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, - 0x080c, 0x25ee, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, - 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, - 0x6c53, 0x0128, 0x080c, 0x4a2e, 0x0110, 0x080c, 0x253f, 0x60cc, - 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x4027, 0x00d0, 0x080c, - 0x6c53, 0x1168, 0x2011, 0x6ad9, 0x080c, 0x7c4a, 0x2011, 0x6acc, - 0x080c, 0x7d1b, 0x080c, 0x6f2f, 0x080c, 0x6b8a, 0x0040, 0x080c, - 0x58e0, 0x0028, 0x6003, 0x0004, 0x2009, 0x403f, 0x0010, 0x0804, - 0x3191, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, - 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, - 0x9086, 0x0000, 0x0904, 0x31c3, 0x2069, 0x1853, 0x7890, 0x6842, - 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x2039, 0x0001, 0x0804, 0x465e, 0x9006, 0x080c, 0x253f, - 0x81ff, 0x1904, 0x31c3, 0x080c, 0x6c53, 0x11b0, 0x080c, 0x6f2a, - 0x080c, 0x5a21, 0x080c, 0x2f86, 0x0118, 0x6130, 0xc18d, 0x6132, - 0x080c, 0xbcec, 0x0130, 0x080c, 0x6c76, 0x1118, 0x080c, 0x6c2d, - 0x0038, 0x080c, 0x6b8a, 0x0020, 0x080c, 0x59e6, 0x080c, 0x58e0, - 0x0804, 0x3191, 0x81ff, 0x1904, 0x31c3, 0x080c, 0x6c53, 0x1110, - 0x0804, 0x31c3, 0x618c, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, - 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, - 0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x465e, 0x701f, 0x318f, - 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, - 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, - 0x6554, 0x9588, 0x2f92, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, - 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x5f7e, 0x1190, - 0xb814, 0x821c, 0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, - 0x201a, 0x0038, 0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, - 0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, - 0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, - 0x1c80, 0x2099, 0x1c80, 0x080c, 0x5971, 0x0804, 0x4097, 0x080c, - 0x4645, 0x0904, 0x31c6, 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, - 0x0804, 0x31c3, 0x080c, 0x5113, 0xd0b4, 0x0558, 0x7884, 0x908e, - 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, - 0x080c, 0x2f81, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, - 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, - 0xa86a, 0x080c, 0xb7bd, 0x1120, 0x2009, 0x0003, 0x0804, 0x31c3, - 0x7007, 0x0003, 0x701f, 0x4125, 0x0005, 0x080c, 0x4645, 0x0904, - 0x31c6, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, - 0x9080, 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, - 0x2098, 0x080c, 0x0f52, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, - 0x000a, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, - 0x080c, 0x0f52, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x0804, 0x465e, 0x81ff, 0x1904, 0x31c3, 0x080c, 0x4629, - 0x0904, 0x31c6, 0x080c, 0x60f0, 0x0904, 0x31c3, 0x0058, 0xa878, - 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x31c3, 0xa974, 0xaa94, - 0x0804, 0x3191, 0x080c, 0x511b, 0x0904, 0x3191, 0x701f, 0x416f, - 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x31c3, 0x7888, 0x908a, - 0x1000, 0x1a04, 0x31c6, 0x080c, 0x4645, 0x0904, 0x31c6, 0x080c, - 0x62a4, 0x0120, 0x080c, 0x62ac, 0x1904, 0x31c6, 0x080c, 0x6175, - 0x0904, 0x31c3, 0x2019, 0x0004, 0x900e, 0x080c, 0x6102, 0x0904, - 0x31c3, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, - 0x12f8, 0x080c, 0x4643, 0x01e0, 0x080c, 0x62a4, 0x0118, 0x080c, - 0x62ac, 0x11b0, 0x080c, 0x6175, 0x2009, 0x0002, 0x0168, 0x2009, - 0x0002, 0x2019, 0x0004, 0x080c, 0x6102, 0x2009, 0x0003, 0x0120, - 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, - 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, - 0xa897, 0x4000, 0x080c, 0x511b, 0x0110, 0x9006, 0x0018, 0x900e, - 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, - 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6454, 0x2400, - 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, - 0x5f7e, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, - 0x7c58, 0x0005, 0x81ff, 0x1904, 0x31c3, 0x080c, 0x4629, 0x0904, - 0x31c6, 0x080c, 0x6045, 0x0904, 0x31c3, 0x080c, 0x60f9, 0x0904, - 0x31c3, 0x0804, 0x417a, 0x81ff, 0x1904, 0x31c3, 0x080c, 0x4629, - 0x0904, 0x31c6, 0x080c, 0x6045, 0x0904, 0x31c3, 0x080c, 0x60e7, - 0x0904, 0x31c3, 0x0804, 0x417a, 0x6100, 0x0804, 0x3191, 0x080c, - 0x4645, 0x0904, 0x31c6, 0x080c, 0x5127, 0x1904, 0x31c3, 0x79a8, - 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, - 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, - 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, - 0x918c, 0x0200, 0x0804, 0x3191, 0x78a8, 0x909c, 0x0003, 0xd0b4, - 0x1140, 0x939a, 0x0003, 0x1a04, 0x31c3, 0x6254, 0x7884, 0x9206, - 0x1560, 0x2031, 0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, - 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, - 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, 0x465e, - 0x000e, 0x2031, 0x0000, 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, - 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10b5, - 0x7007, 0x0002, 0x701f, 0x429d, 0x0005, 0x81ff, 0x1904, 0x31c3, - 0x080c, 0x4645, 0x0904, 0x31c6, 0x080c, 0x62a4, 0x1904, 0x31c3, - 0x00c6, 0x080c, 0x4612, 0x00ce, 0x0904, 0x31c3, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xb763, 0x0904, 0x31c3, - 0x7007, 0x0003, 0x701f, 0x42a1, 0x0005, 0x080c, 0x3e75, 0x0804, - 0x3191, 0xa830, 0x9086, 0x0100, 0x0904, 0x31c3, 0x8906, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, - 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x465e, 0x9006, - 0x080c, 0x253f, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, - 0x81ff, 0x1904, 0x31c3, 0x080c, 0x6c53, 0x0110, 0x080c, 0x59e6, - 0x7888, 0x908a, 0x1000, 0x1a04, 0x31c6, 0x7984, 0x9186, 0x00ff, - 0x0138, 0x9182, 0x007f, 0x1a04, 0x31c6, 0x2100, 0x080c, 0x2509, - 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19c9, 0x601b, - 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, - 0x6c53, 0x1158, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x9085, 0x0001, - 0x080c, 0x6c9a, 0x080c, 0x6b8a, 0x00d0, 0x080c, 0x9947, 0x2061, - 0x0100, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, - 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, 0x200b, - 0x0000, 0x2009, 0x002d, 0x2011, 0x590c, 0x080c, 0x7cd9, 0x7984, - 0x080c, 0x6c53, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x41dd, - 0x012e, 0x00ce, 0x002e, 0x0804, 0x3191, 0x7984, 0x080c, 0x5f1e, - 0x2b08, 0x1904, 0x31c6, 0x0804, 0x3191, 0x81ff, 0x0120, 0x2009, - 0x0001, 0x0804, 0x31c3, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, - 0x2009, 0x0005, 0x0804, 0x31c3, 0x080c, 0x4612, 0x1120, 0x2009, - 0x0002, 0x0804, 0x31c3, 0x7984, 0x9192, 0x0021, 0x1a04, 0x31c6, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, - 0xaf60, 0x7736, 0x080c, 0x465b, 0x701f, 0x4355, 0x7880, 0x9086, - 0x006e, 0x0110, 0x701f, 0x4be0, 0x0005, 0x2009, 0x0080, 0x080c, - 0x5f7e, 0x1118, 0x080c, 0x62a4, 0x0120, 0x2021, 0x400a, 0x0804, - 0x3193, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, - 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x43ee, 0x90be, 0x0112, - 0x0904, 0x43ee, 0x90be, 0x0113, 0x0904, 0x43ee, 0x90be, 0x0114, - 0x0904, 0x43ee, 0x90be, 0x0117, 0x0904, 0x43ee, 0x90be, 0x011a, - 0x0904, 0x43ee, 0x90be, 0x011c, 0x0904, 0x43ee, 0x90be, 0x0121, - 0x0904, 0x43d5, 0x90be, 0x0131, 0x0904, 0x43d5, 0x90be, 0x0171, - 0x0904, 0x43ee, 0x90be, 0x0173, 0x0904, 0x43ee, 0x90be, 0x01a1, - 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x43f9, 0x90be, 0x0212, - 0x0904, 0x43e2, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, - 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, - 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, - 0x009e, 0x00de, 0x0804, 0x31c6, 0x7028, 0x9080, 0x0010, 0x2098, - 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x4437, - 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, - 0x20a9, 0x0001, 0x080c, 0x4437, 0x00c8, 0x7028, 0x9080, 0x000c, - 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, - 0x4444, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, - 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4444, 0x7028, 0x9080, + 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x41ec, 0x00ce, + 0x00c6, 0x2061, 0x199a, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, + 0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2a3a, + 0x2001, 0x0001, 0x080c, 0x2a1d, 0x0088, 0x9286, 0x4000, 0x1148, + 0x2063, 0x0001, 0x9006, 0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d, + 0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x6888, + 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, + 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, + 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294, 0x0030, + 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, + 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2808, 0x2001, 0x196d, 0x2102, + 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, + 0x0000, 0x00ce, 0x080c, 0x717d, 0x0128, 0x080c, 0x4dd2, 0x0110, + 0x080c, 0x2759, 0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, + 0x427a, 0x00e0, 0x080c, 0x717d, 0x1168, 0x2011, 0x7013, 0x080c, + 0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x080c, 0x746a, 0x080c, + 0x70af, 0x0040, 0x080c, 0x5cb7, 0x0028, 0x6003, 0x0004, 0x2009, + 0x4292, 0x0020, 0x080c, 0x66a2, 0x0804, 0x33cf, 0x2001, 0x0170, + 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, + 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, + 0x3401, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, + 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, + 0x0804, 0x48e7, 0x9006, 0x080c, 0x2759, 0x81ff, 0x1904, 0x3401, + 0x080c, 0x717d, 0x11b0, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, + 0x31c4, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xcf18, 0x0130, + 0x080c, 0x71a0, 0x1118, 0x080c, 0x7155, 0x0038, 0x080c, 0x70af, + 0x0020, 0x080c, 0x5dbd, 0x080c, 0x5cb7, 0x0804, 0x33cf, 0x81ff, + 0x1904, 0x3401, 0x080c, 0x717d, 0x1110, 0x0804, 0x3401, 0x6194, + 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, 0x2039, + 0x0001, 0x080c, 0x48e7, 0x701f, 0x33cd, 0x012e, 0x0005, 0x704f, + 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9, 0x0001, + 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x655c, 0x9588, 0x31d0, + 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, 0x2100, + 0x9506, 0x01a8, 0x080c, 0x63cd, 0x1190, 0xb814, 0x821c, 0x0238, + 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, 0x9398, + 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, 0x8108, + 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0x9105, + 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099, 0x1c80, + 0x080c, 0x5d48, 0x0804, 0x42ec, 0x080c, 0x48ce, 0x0904, 0x3404, + 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x080c, + 0x54b7, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, 0x908e, + 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x31bf, 0x1148, + 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, + 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc9e7, + 0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, + 0x437a, 0x0005, 0x080c, 0x48ce, 0x0904, 0x3404, 0x20a9, 0x002b, + 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d, + 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, 0xb8c4, + 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f7d, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, + 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7, + 0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, + 0x653f, 0x0904, 0x3401, 0x0058, 0xa878, 0x9005, 0x0120, 0x2009, + 0x0004, 0x0804, 0x3401, 0xa974, 0xaa94, 0x0804, 0x33cf, 0x080c, + 0x54bf, 0x0904, 0x33cf, 0x701f, 0x43c4, 0x7007, 0x0003, 0x0005, + 0x81ff, 0x1904, 0x3401, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3404, + 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x0120, 0x080c, + 0x673f, 0x1904, 0x3404, 0x080c, 0x65c4, 0x0904, 0x3401, 0x2019, + 0x0004, 0x900e, 0x080c, 0x6551, 0x0904, 0x3401, 0x7984, 0x7a88, + 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, 0x48cc, + 0x01e0, 0x080c, 0x6737, 0x0118, 0x080c, 0x673f, 0x11b0, 0x080c, + 0x65c4, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019, 0x0004, + 0x080c, 0x6551, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, 0x00d1, + 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, + 0x54bf, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, + 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, + 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506, 0x0110, 0x2508, + 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x63cd, 0x1138, 0x2200, + 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8293, 0x0005, 0x81ff, + 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, 0x6494, + 0x0904, 0x3401, 0x080c, 0x6548, 0x0904, 0x3401, 0x0804, 0x43cf, + 0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, + 0x6737, 0x0120, 0x080c, 0x673f, 0x1904, 0x3404, 0x080c, 0x6494, + 0x0904, 0x3401, 0x080c, 0x6536, 0x0904, 0x3401, 0x0804, 0x43cf, + 0x6100, 0x0804, 0x33cf, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, + 0x54cb, 0x1904, 0x3401, 0x79a8, 0xd184, 0x1158, 0xb834, 0x8007, + 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217, + 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c, + 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804, 0x33cf, + 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, 0x1a04, + 0x3401, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x8368, 0x2001, + 0xfff4, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, + 0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, + 0x48e7, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, + 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, + 0x10e0, 0x7007, 0x0002, 0x701f, 0x44f6, 0x0005, 0x81ff, 0x1904, + 0x3401, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x1904, + 0x3401, 0x00c6, 0x080c, 0x489b, 0x00ce, 0x0904, 0x3401, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc98d, 0x0904, + 0x3401, 0x7007, 0x0003, 0x701f, 0x44fa, 0x0005, 0x080c, 0x40b9, + 0x0804, 0x33cf, 0xa830, 0x9086, 0x0100, 0x0904, 0x3401, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7, + 0x9006, 0x080c, 0x2759, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, + 0x0118, 0x81ff, 0x1904, 0x3401, 0x080c, 0x717d, 0x0110, 0x080c, + 0x5dbd, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3404, 0x7984, 0x9186, + 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3404, 0x2100, 0x080c, + 0x2723, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19f8, + 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000, + 0x080c, 0x717d, 0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085, + 0x0001, 0x080c, 0x71c4, 0x080c, 0x70af, 0x00d0, 0x080c, 0xaadc, + 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, + 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, + 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5ce3, 0x080c, 0x831a, + 0x7984, 0x080c, 0x717d, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, + 0x4432, 0x012e, 0x00ce, 0x002e, 0x0804, 0x33cf, 0x7984, 0x080c, + 0x636c, 0x2b08, 0x1904, 0x3404, 0x0804, 0x33cf, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x3401, 0x60dc, 0xd0ac, 0x1130, 0xd09c, + 0x1120, 0x2009, 0x0005, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120, + 0x2009, 0x0002, 0x0804, 0x3401, 0x7984, 0x9192, 0x0021, 0x1a04, + 0x3404, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, + 0x702a, 0xaf60, 0x7736, 0x080c, 0x48e4, 0x701f, 0x45ae, 0x7880, + 0x9086, 0x006e, 0x0110, 0x701f, 0x4f84, 0x0005, 0x2009, 0x0080, + 0x080c, 0x63cd, 0x1118, 0x080c, 0x6737, 0x0120, 0x2021, 0x400a, + 0x0804, 0x33d1, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, + 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4647, 0x90be, + 0x0112, 0x0904, 0x4647, 0x90be, 0x0113, 0x0904, 0x4647, 0x90be, + 0x0114, 0x0904, 0x4647, 0x90be, 0x0117, 0x0904, 0x4647, 0x90be, + 0x011a, 0x0904, 0x4647, 0x90be, 0x011c, 0x0904, 0x4647, 0x90be, + 0x0121, 0x0904, 0x462e, 0x90be, 0x0131, 0x0904, 0x462e, 0x90be, + 0x0171, 0x0904, 0x4647, 0x90be, 0x0173, 0x0904, 0x4647, 0x90be, + 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x4652, 0x90be, + 0x0212, 0x0904, 0x463b, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, + 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, + 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, + 0x05b0, 0x009e, 0x00de, 0x0804, 0x3404, 0x7028, 0x9080, 0x0010, + 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, + 0x4690, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, + 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4690, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, - 0x04f1, 0x00c6, 0x080c, 0x4612, 0x0550, 0xa868, 0xc0fd, 0xa86a, - 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, - 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, - 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, - 0xa86a, 0xa804, 0x2048, 0x080c, 0xb77e, 0x1120, 0x2009, 0x0003, - 0x0804, 0x31c3, 0x7007, 0x0003, 0x701f, 0x442e, 0x0005, 0x00ce, - 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x31c3, 0xa820, 0x9086, - 0x8001, 0x1904, 0x3191, 0x2009, 0x0004, 0x0804, 0x31c3, 0x0016, - 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, - 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, - 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, - 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, - 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, 0x60d4, 0xd0ac, 0x1130, - 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x31c3, 0x7984, 0x78a8, - 0x2040, 0x080c, 0x9940, 0x1120, 0x9182, 0x007f, 0x0a04, 0x31c6, - 0x9186, 0x00ff, 0x0904, 0x31c6, 0x9182, 0x0800, 0x1a04, 0x31c6, - 0x7a8c, 0x7b88, 0x6074, 0x9306, 0x1140, 0x6078, 0x924e, 0x0904, - 0x31c6, 0x99cc, 0xff00, 0x0904, 0x31c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0x452c, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, - 0x900e, 0x080c, 0x619e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, - 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, - 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, - 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, - 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3193, 0x2b00, - 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9a23, - 0x0904, 0x4501, 0x2b00, 0x6012, 0x080c, 0xba69, 0x2e58, 0x00ee, - 0x00e6, 0x00c6, 0x080c, 0x4612, 0x00ce, 0x2b70, 0x1158, 0x080c, - 0x99d6, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, - 0x0804, 0x31c3, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, - 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x2e30, - 0x6023, 0x0001, 0x9006, 0x080c, 0x5ebb, 0x2001, 0x0002, 0x080c, - 0x5ecf, 0x2009, 0x0002, 0x080c, 0x9a50, 0x78a8, 0xd094, 0x0138, - 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, - 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, - 0x0003, 0x0804, 0x31c3, 0x7007, 0x0003, 0x701f, 0x4510, 0x0005, - 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, - 0xba04, 0x9294, 0x00ff, 0x0804, 0x5070, 0x900e, 0xa868, 0xd0f4, - 0x1904, 0x3191, 0x080c, 0x619e, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0x0804, 0x3191, 0x00e6, 0x00d6, 0x0096, 0x83ff, - 0x0904, 0x4574, 0x902e, 0x080c, 0x9940, 0x0130, 0x9026, 0x20a9, - 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, - 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, - 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, - 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, - 0x11d8, 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, - 0xbe14, 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, - 0x0568, 0xd894, 0x1558, 0x080c, 0x62a4, 0x1540, 0x2001, 0x4000, - 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, - 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, - 0x9940, 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, - 0x4542, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, - 0x0030, 0x080c, 0x5f1e, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, - 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x31c3, 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, - 0x31c3, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, - 0x0904, 0x31c6, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, - 0x31c6, 0x2010, 0x2918, 0x080c, 0x2dd6, 0x1120, 0x2009, 0x0003, - 0x0804, 0x31c3, 0x7007, 0x0003, 0x701f, 0x45c7, 0x0005, 0xa830, - 0x9086, 0x0100, 0x1904, 0x3191, 0x2009, 0x0004, 0x0804, 0x31c3, - 0x7984, 0x080c, 0x9940, 0x1120, 0x9182, 0x007f, 0x0a04, 0x31c6, - 0x9186, 0x00ff, 0x0904, 0x31c6, 0x9182, 0x0800, 0x1a04, 0x31c6, - 0x2001, 0x9000, 0x080c, 0x50cb, 0x1904, 0x31c3, 0x0804, 0x3191, - 0xa998, 0x080c, 0x9940, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, - 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, - 0x50cb, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, - 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, - 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, - 0x000a, 0x0c48, 0x080c, 0x0fd5, 0x0198, 0x9006, 0xa802, 0x7014, - 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, - 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, - 0x0005, 0x7984, 0x080c, 0x5f7e, 0x1130, 0x7e88, 0x9684, 0x3fff, - 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, - 0x5f7e, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, - 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, - 0x5f7e, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, - 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1007, 0x0cc8, 0x7116, - 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, - 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, - 0xa392, 0xa496, 0xa59a, 0x080c, 0x10b5, 0x7007, 0x0002, 0x701f, - 0x3191, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, - 0x2001, 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x468f, 0x7a36, - 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, 0x0804, 0x46f5, 0x0016, - 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, - 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, - 0x0fd5, 0x0904, 0x46ed, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, - 0x0002, 0x9080, 0x1da2, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, - 0x0004, 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, - 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, - 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, - 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db2, 0x2060, 0x001e, 0x8108, - 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x0fd5, 0x1130, 0x8109, - 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, - 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, - 0x9080, 0x1da2, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, - 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, - 0x2c00, 0x9082, 0x001b, 0x0002, 0x4717, 0x4717, 0x4719, 0x4717, - 0x4717, 0x4717, 0x471d, 0x4717, 0x4717, 0x4717, 0x4721, 0x4717, - 0x4717, 0x4717, 0x4725, 0x4717, 0x4717, 0x4717, 0x4729, 0x4717, - 0x4717, 0x4717, 0x472d, 0x4717, 0x4717, 0x4717, 0x4732, 0x080c, - 0x0db2, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, - 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, - 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, - 0x0804, 0x46f0, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x46f0, 0x00e6, - 0x2071, 0x1894, 0x7048, 0x9005, 0x0904, 0x47c9, 0x0126, 0x2091, - 0x8000, 0x0e04, 0x47c8, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, - 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, - 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db2, 0x2060, - 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x47cb, 0xa804, - 0x9005, 0x090c, 0x0db2, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, - 0x2001, 0x0002, 0x9080, 0x1da2, 0x2005, 0xa04a, 0x0804, 0x47cb, - 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, - 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, 0x87ff, - 0x0118, 0x2748, 0x080c, 0x1007, 0x7048, 0x8001, 0x704a, 0x9005, - 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1007, 0x9006, - 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, - 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, - 0x90fa, 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, - 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0db2, 0x2048, 0xa800, - 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1da2, - 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, - 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x47ea, - 0x47ea, 0x47ec, 0x47ea, 0x47ea, 0x47ea, 0x47f1, 0x47ea, 0x47ea, - 0x47ea, 0x47f6, 0x47ea, 0x47ea, 0x47ea, 0x47fb, 0x47ea, 0x47ea, - 0x47ea, 0x4800, 0x47ea, 0x47ea, 0x47ea, 0x4805, 0x47ea, 0x47ea, - 0x47ea, 0x480a, 0x080c, 0x0db2, 0xaa74, 0xab78, 0xac7c, 0x0804, - 0x4776, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x4776, 0xaa94, 0xab98, - 0xac9c, 0x0804, 0x4776, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4776, - 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x4776, 0xaac4, 0xabc8, 0xaccc, - 0x0804, 0x4776, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4776, 0x0016, - 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x5f7e, - 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, - 0x801b, 0x080c, 0x4672, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, - 0x0005, 0x0026, 0x080c, 0x5113, 0xd0c4, 0x0120, 0x2011, 0x8014, - 0x080c, 0x4672, 0x002e, 0x0005, 0x81ff, 0x1904, 0x31c3, 0x0126, - 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, - 0x6c53, 0x1158, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x9085, 0x0001, - 0x080c, 0x6c9a, 0x080c, 0x6b8a, 0x0010, 0x080c, 0x58e0, 0x012e, - 0x0804, 0x3191, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, - 0x080c, 0x5127, 0x0120, 0x2009, 0x0007, 0x0804, 0x31c3, 0x080c, - 0x629c, 0x0120, 0x2009, 0x0008, 0x0804, 0x31c3, 0x080c, 0x2f81, - 0x0128, 0x7984, 0x080c, 0x5f1e, 0x1904, 0x31c6, 0x080c, 0x4645, - 0x0904, 0x31c6, 0x2b00, 0x7026, 0x080c, 0x62a4, 0x7888, 0x1170, - 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x619e, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3191, 0x080c, 0x4612, - 0x0904, 0x31c3, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, - 0x080c, 0xb817, 0x0904, 0x31c3, 0x7888, 0xd094, 0x0118, 0xb8bc, - 0xc08d, 0xb8be, 0x7007, 0x0003, 0x701f, 0x48eb, 0x0005, 0x2061, - 0x1800, 0x080c, 0x5127, 0x2009, 0x0007, 0x1578, 0x080c, 0x629c, - 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x2f81, 0x0120, 0xa998, - 0x080c, 0x5f1e, 0x1530, 0x080c, 0x4643, 0x0518, 0x080c, 0x62a4, - 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x619e, - 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, - 0xc0fc, 0xa86a, 0x080c, 0xb817, 0x11e0, 0xa89c, 0xd094, 0x0118, - 0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, - 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, - 0x1110, 0x0804, 0x5070, 0x900e, 0x080c, 0x619e, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3191, 0x080c, 0x5127, - 0x0120, 0x2009, 0x0007, 0x0804, 0x31c3, 0x7f84, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, - 0x31c3, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, - 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x5f7e, 0x1904, - 0x4981, 0x080c, 0x62a4, 0x0120, 0x080c, 0x62ac, 0x1904, 0x4981, - 0x080c, 0x629c, 0x1130, 0x080c, 0x619e, 0x1118, 0xd79c, 0x0904, - 0x4981, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, - 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, - 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, - 0x4444, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, - 0x20e0, 0x080c, 0x4444, 0x4104, 0xd794, 0x0528, 0xb8b4, 0x20e0, - 0xb8b8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, - 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, - 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, - 0x20e0, 0x080c, 0x4437, 0x9c80, 0x0026, 0x2098, 0xb8b4, 0x20e0, - 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, - 0x0005, 0x8108, 0x080c, 0x9940, 0x0118, 0x9186, 0x0800, 0x0040, - 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, - 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, - 0x0150, 0x0804, 0x491d, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, - 0x3191, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, - 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, - 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10b5, - 0x7007, 0x0002, 0x701f, 0x49bd, 0x0005, 0x7030, 0x9005, 0x1180, - 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, - 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x491d, - 0x7124, 0x810b, 0x0804, 0x3191, 0x2029, 0x007e, 0x7984, 0x7a88, - 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, - 0x31c6, 0x9502, 0x0a04, 0x31c6, 0x9184, 0x00ff, 0x90e2, 0x0020, - 0x0a04, 0x31c6, 0x9502, 0x0a04, 0x31c6, 0x9284, 0xff00, 0x8007, - 0x90e2, 0x0020, 0x0a04, 0x31c6, 0x9502, 0x0a04, 0x31c6, 0x9284, - 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x31c6, 0x9502, 0x0a04, 0x31c6, - 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x31c6, 0x9502, - 0x0a04, 0x31c6, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x31c6, - 0x9502, 0x0a04, 0x31c6, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, - 0x0a04, 0x31c6, 0x9502, 0x0a04, 0x31c6, 0x9484, 0x00ff, 0x90e2, - 0x0020, 0x0a04, 0x31c6, 0x9502, 0x0a04, 0x31c6, 0x2061, 0x1958, - 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3191, 0x0006, 0x080c, - 0x5113, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x5117, 0xd0bc, - 0x000e, 0x0005, 0x616c, 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, - 0x0804, 0x3191, 0x83ff, 0x1904, 0x31c6, 0x2001, 0xfff0, 0x9200, - 0x1a04, 0x31c6, 0x2019, 0xffff, 0x6070, 0x9302, 0x9200, 0x0a04, - 0x31c6, 0x7986, 0x626e, 0x0804, 0x3191, 0x080c, 0x5127, 0x1904, - 0x31c3, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4612, 0x0904, - 0x31c3, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, - 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, - 0x8bff, 0x0178, 0x080c, 0x62a4, 0x0118, 0x080c, 0x62ac, 0x1148, - 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, - 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, - 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, - 0x7e7f, 0x2208, 0x0804, 0x3191, 0x7033, 0x0001, 0x7122, 0x7024, - 0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa37a, - 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, - 0x080c, 0x10b5, 0x7007, 0x0002, 0x701f, 0x4aaf, 0x0005, 0x7030, - 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, - 0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, - 0x4a6d, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x7e7f, 0x2208, - 0x0804, 0x3191, 0x00f6, 0x00e6, 0x080c, 0x5127, 0x2009, 0x0007, - 0x1904, 0x4b42, 0x2071, 0x1894, 0x745c, 0x84ff, 0x2009, 0x000e, - 0x1904, 0x4b42, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, - 0x0fee, 0x2009, 0x0002, 0x0904, 0x4b42, 0x2900, 0x705e, 0x900e, - 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, - 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, - 0x62a4, 0x0118, 0x080c, 0x62ac, 0x1148, 0xb814, 0x20a9, 0x0001, - 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, - 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, - 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x7e7f, 0x2208, 0x009e, - 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0db2, 0x2148, - 0x080c, 0x1007, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, - 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061, 0x18af, - 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, - 0xa696, 0xa79a, 0xa09f, 0x4b4e, 0x000e, 0xa0a2, 0x080c, 0x10b5, - 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, - 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, - 0x904d, 0x090c, 0x0db2, 0x00e6, 0x2071, 0x1894, 0xa06c, 0x908e, - 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, - 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, - 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, - 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, - 0x0003, 0x080c, 0x7e7f, 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0db2, - 0x2148, 0x080c, 0x1007, 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, - 0x2091, 0x8000, 0x080c, 0x6536, 0x012e, 0xa09f, 0x0000, 0xa0a3, - 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, - 0x0178, 0x080c, 0x62a4, 0x0118, 0x080c, 0x62ac, 0x1148, 0xb814, - 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, - 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, - 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, - 0x81ff, 0x090c, 0x0db2, 0x2148, 0x080c, 0x1007, 0x9006, 0x705e, - 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6536, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, - 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, - 0xa592, 0xa696, 0xa79a, 0x080c, 0x10b5, 0x9006, 0x00ee, 0x0005, - 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, - 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x31c6, 0xa884, 0xa988, - 0x080c, 0x24d6, 0x1518, 0x080c, 0x5f1e, 0x1500, 0x7126, 0xbe12, - 0xbd16, 0xae7c, 0x080c, 0x4612, 0x01c8, 0x080c, 0x4612, 0x01b0, - 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, - 0xa804, 0x2048, 0x080c, 0xb79e, 0x1120, 0x2009, 0x0003, 0x0804, - 0x31c3, 0x7007, 0x0003, 0x701f, 0x4c1b, 0x0005, 0x009e, 0x2009, - 0x0002, 0x0804, 0x31c3, 0x7124, 0x080c, 0x2f28, 0xa820, 0x9086, - 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x31c3, 0x2900, 0x7022, - 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, - 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f52, 0xaa6c, - 0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, - 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, - 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, - 0x465e, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, - 0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, - 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10b5, 0x7007, 0x0002, - 0x701f, 0x4c77, 0x0005, 0x000e, 0x007e, 0x0804, 0x31c6, 0x7020, - 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, - 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, - 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f52, 0x2100, 0x2238, - 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, - 0x002a, 0x0804, 0x465e, 0x81ff, 0x1904, 0x31c3, 0x798c, 0x2001, - 0x194f, 0x2102, 0x080c, 0x4629, 0x0904, 0x31c6, 0x080c, 0x62a4, - 0x0120, 0x080c, 0x62ac, 0x1904, 0x31c6, 0x080c, 0x6045, 0x0904, - 0x31c3, 0x0126, 0x2091, 0x8000, 0x080c, 0x610b, 0x012e, 0x0904, - 0x31c3, 0x0804, 0x417a, 0xa9a0, 0x2001, 0x194f, 0xc18d, 0x2102, - 0x080c, 0x4636, 0x01a0, 0x080c, 0x62a4, 0x0118, 0x080c, 0x62ac, - 0x1170, 0x080c, 0x6045, 0x2009, 0x0002, 0x0128, 0x080c, 0x610b, - 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, - 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, - 0x4000, 0x080c, 0x511b, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, - 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084, - 0x0904, 0x40ef, 0x080c, 0x4645, 0x0904, 0x31c6, 0x080c, 0x4612, - 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, 0x080c, 0x62a4, 0x0130, - 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c, - 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x5113, 0xd0b4, - 0x0904, 0x4129, 0x7884, 0x908e, 0x007e, 0x0904, 0x4129, 0x908e, - 0x007f, 0x0904, 0x4129, 0x908e, 0x0080, 0x0904, 0x4129, 0xb800, - 0xd08c, 0x1904, 0x4129, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, - 0x080c, 0xb7bd, 0x1120, 0x2009, 0x0003, 0x0804, 0x31c3, 0x7007, - 0x0003, 0x701f, 0x4d34, 0x0005, 0x080c, 0x4645, 0x0904, 0x31c6, - 0x0804, 0x4129, 0x080c, 0x2f81, 0x0108, 0x0005, 0x2009, 0x1832, - 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, 0x080c, - 0x5127, 0x0120, 0x2009, 0x0007, 0x0804, 0x31c3, 0x080c, 0x629c, - 0x0120, 0x2009, 0x0008, 0x0804, 0x31c3, 0xb89c, 0xd0a4, 0x1118, - 0xd0ac, 0x1904, 0x4129, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, - 0xa86a, 0x080c, 0xb817, 0x1120, 0x2009, 0x0003, 0x0804, 0x31c3, - 0x7007, 0x0003, 0x701f, 0x4d6d, 0x0005, 0xa830, 0x9086, 0x0100, - 0x1120, 0x2009, 0x0004, 0x0804, 0x5070, 0x080c, 0x4645, 0x0904, - 0x31c6, 0x0804, 0x4d06, 0x81ff, 0x2009, 0x0001, 0x1904, 0x31c3, - 0x080c, 0x5127, 0x2009, 0x0007, 0x1904, 0x31c3, 0x080c, 0x629c, - 0x0120, 0x2009, 0x0008, 0x0804, 0x31c3, 0x080c, 0x4645, 0x0904, - 0x31c6, 0x080c, 0x62a4, 0x2009, 0x0009, 0x1904, 0x31c3, 0x080c, - 0x4612, 0x2009, 0x0002, 0x0904, 0x31c3, 0x9006, 0xa866, 0xa832, - 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, 0x00ff, - 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038, - 0x928e, 0x0100, 0x1904, 0x31c6, 0xc0e5, 0xa952, 0xa956, 0xa83e, - 0x080c, 0xba6a, 0x2009, 0x0003, 0x0904, 0x31c3, 0x7007, 0x0003, - 0x701f, 0x4dc3, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, - 0x0904, 0x31c3, 0x0804, 0x3191, 0x7aa8, 0x9284, 0xc000, 0x0148, - 0xd2ec, 0x01a0, 0x080c, 0x5127, 0x1188, 0x2009, 0x0014, 0x0804, - 0x31c3, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, 0x31c3, - 0x080c, 0x5127, 0x2009, 0x0007, 0x1904, 0x31c3, 0xd2f4, 0x0130, - 0x9284, 0x5000, 0x080c, 0x50ee, 0x0804, 0x3191, 0xd2fc, 0x0158, - 0x080c, 0x4645, 0x0904, 0x31c6, 0x7984, 0x9284, 0x9000, 0x080c, - 0x50cb, 0x0804, 0x3191, 0x080c, 0x4645, 0x0904, 0x31c6, 0xb804, - 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x4eac, - 0x080c, 0x4612, 0x2009, 0x0002, 0x0904, 0x4eac, 0xa85c, 0x9080, - 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0x080c, 0x465b, 0x701f, 0x4e1d, 0x0005, 0xa86c, 0x9086, 0x0500, - 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, - 0x1904, 0x31c6, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, - 0x4645, 0x1110, 0x0804, 0x31c6, 0x2009, 0x0043, 0x080c, 0xbad2, - 0x2009, 0x0003, 0x0904, 0x4eac, 0x7007, 0x0003, 0x701f, 0x4e41, - 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x4eac, - 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x50cb, 0x0804, 0x3191, - 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c, - 0x5127, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, 0x080c, - 0x5127, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000, - 0x080c, 0x50ee, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4643, 0x0588, - 0xa998, 0x9284, 0x9000, 0x080c, 0x50cb, 0xa87b, 0x0000, 0xa883, - 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4643, 0x0510, 0x080c, - 0x62a4, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, - 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, - 0x4643, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xbad2, 0x2009, - 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x31c3, - 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x50cb, 0x001e, - 0x1904, 0x31c3, 0x0804, 0x3191, 0x00f6, 0x2d78, 0x0011, 0x00fe, - 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, 0x1000, - 0xc0fd, 0x080c, 0x50cb, 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff, - 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, 0x080c, 0x5127, 0x0120, - 0x2009, 0x0007, 0x0804, 0x31c3, 0x7984, 0x7ea8, 0x96b4, 0x00ff, - 0x080c, 0x5f7e, 0x1904, 0x31c6, 0x9186, 0x007f, 0x0138, 0x080c, - 0x62a4, 0x0120, 0x2009, 0x0009, 0x0804, 0x31c3, 0x080c, 0x4612, - 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, 0xa867, 0x0000, 0xa868, - 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, 0xb7d7, - 0x1120, 0x2009, 0x0003, 0x0804, 0x31c3, 0x7007, 0x0003, 0x701f, - 0x4f0a, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, 0x2009, - 0x0004, 0x0804, 0x31c3, 0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084, - 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9080, - 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, - 0x465e, 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, - 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, - 0x7023, 0x1982, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, 0x199c, - 0x0010, 0x0804, 0x31c6, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x465b, 0x701f, - 0x4f5a, 0x0005, 0x2001, 0x182c, 0x2003, 0x0001, 0xa85c, 0x9080, - 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0, - 0x20e9, 0x0001, 0x4003, 0x0804, 0x3191, 0x080c, 0x4612, 0x1120, - 0x2009, 0x0002, 0x0804, 0x31c3, 0x7984, 0x9194, 0xff00, 0x918c, - 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1982, 0x0040, 0x92c6, - 0x0001, 0x1118, 0x2099, 0x199c, 0x0010, 0x0804, 0x31c6, 0xa85c, - 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, - 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x465e, 0x7884, 0x908a, - 0x1000, 0x1a04, 0x31c6, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, - 0x810b, 0x9108, 0x00c6, 0x2061, 0x19c9, 0x6142, 0x00ce, 0x012e, - 0x0804, 0x3191, 0x00c6, 0x080c, 0x6c53, 0x1160, 0x080c, 0x6f2a, - 0x080c, 0x5a21, 0x9085, 0x0001, 0x080c, 0x6c9a, 0x080c, 0x6b8a, - 0x080c, 0x0db2, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c, - 0x58e0, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e, - 0x0000, 0x0904, 0x31c3, 0x7884, 0x9005, 0x0188, 0x7888, 0x2061, - 0x196b, 0x2c0c, 0x2062, 0x080c, 0x28b8, 0x01a0, 0x080c, 0x28c0, - 0x0188, 0x080c, 0x28c8, 0x0170, 0x2162, 0x0804, 0x31c6, 0x2061, - 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010, - 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061, 0x0100, - 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c, 0x92ec, - 0x2011, 0x0002, 0x080c, 0x92f6, 0x002e, 0x080c, 0x91de, 0x0036, - 0x901e, 0x080c, 0x9254, 0x003e, 0x60e3, 0x0000, 0x080c, 0xd343, - 0x080c, 0xd35e, 0x9085, 0x0001, 0x080c, 0x6c9a, 0x9006, 0x080c, - 0x2987, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x00ce, - 0x0804, 0x3191, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x31c3, - 0x080c, 0x5127, 0x0120, 0x2009, 0x0007, 0x0804, 0x31c3, 0x7984, - 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5f7e, 0x1904, 0x31c6, 0x9186, - 0x007f, 0x0138, 0x080c, 0x62a4, 0x0120, 0x2009, 0x0009, 0x0804, - 0x31c3, 0x080c, 0x4612, 0x1120, 0x2009, 0x0002, 0x0804, 0x31c3, - 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb7da, 0x1120, - 0x2009, 0x0003, 0x0804, 0x31c3, 0x7007, 0x0003, 0x701f, 0x5059, + 0x080c, 0x469d, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, + 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x469d, 0x7028, + 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, + 0x0001, 0x04f1, 0x00c6, 0x080c, 0x489b, 0x0550, 0xa868, 0xc0fd, + 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, + 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, + 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, + 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xc9a8, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x4687, 0x0005, + 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3401, 0xa820, + 0x9086, 0x8001, 0x1904, 0x33cf, 0x2009, 0x0004, 0x0804, 0x3401, + 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, + 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, + 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, + 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3401, 0x60dc, 0xd0ac, + 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3401, 0x7984, + 0x78a8, 0x2040, 0x080c, 0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04, + 0x3404, 0x9186, 0x00ff, 0x0904, 0x3404, 0x9182, 0x0800, 0x1a04, + 0x3404, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1140, 0x6080, 0x924e, + 0x0904, 0x3404, 0x99cc, 0xff00, 0x0904, 0x3404, 0x0126, 0x2091, + 0x8000, 0x080c, 0x47ae, 0x0904, 0x472e, 0x0086, 0x90c6, 0x4000, + 0x008e, 0x1538, 0x00c6, 0x0006, 0x0036, 0xb818, 0xbb1c, 0x9305, + 0xbb20, 0x9305, 0xbb24, 0x9305, 0xbb28, 0x9305, 0xbb2c, 0x9305, + 0xbb30, 0x9305, 0xbb34, 0x9305, 0x003e, 0x0570, 0xd88c, 0x1128, + 0x080c, 0x6737, 0x0110, 0xc89d, 0x0438, 0x900e, 0x080c, 0x65ed, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce, + 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, 0x90c6, 0x4008, + 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, 0x1108, 0x0040, + 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, 0x000a, + 0x2020, 0x012e, 0x0804, 0x33d1, 0x000e, 0x00ce, 0x2b00, 0x7026, + 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xabb9, 0x0904, + 0x4783, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2e58, 0x00ee, 0x00e6, + 0x00c6, 0x080c, 0x489b, 0x00ce, 0x2b70, 0x1158, 0x080c, 0xab6b, + 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, + 0x3401, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, + 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, + 0x306e, 0x6023, 0x0001, 0x9006, 0x080c, 0x6309, 0xd89c, 0x0138, + 0x2001, 0x0004, 0x080c, 0x631d, 0x2009, 0x0003, 0x0030, 0x2001, + 0x0002, 0x080c, 0x631d, 0x2009, 0x0002, 0x080c, 0xabe6, 0x78a8, + 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8cc, 0xc08d, + 0xb8ce, 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, + 0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, + 0x4792, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, + 0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x5414, 0x900e, + 0xa868, 0xd0f4, 0x1904, 0x33cf, 0x080c, 0x65ed, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x00e6, 0x00d6, + 0x0096, 0x83ff, 0x0904, 0x47fd, 0x902e, 0x080c, 0xaad5, 0x0130, + 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, + 0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, + 0x9406, 0x1904, 0x480e, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, + 0xfffd, 0x1558, 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, + 0x1520, 0x93ce, 0x00ff, 0x1508, 0xc5fd, 0x0480, 0x2058, 0xbf10, + 0x2700, 0x9306, 0x11e8, 0xbe14, 0x2600, 0x9206, 0x11c8, 0x2400, + 0x9106, 0x1180, 0xd884, 0x0598, 0xd894, 0x1588, 0x080c, 0x66d7, + 0x1570, 0x2001, 0x4000, 0x0460, 0x080c, 0x6737, 0x1540, 0x2001, + 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, + 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, + 0x080c, 0xaad5, 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, + 0x1f04, 0x47c4, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, + 0x0001, 0x0030, 0x080c, 0x636c, 0x1dd0, 0xbb12, 0xba16, 0x9006, + 0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, + 0x9005, 0x0904, 0x3404, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, + 0x1a04, 0x3404, 0x2010, 0x2918, 0x080c, 0x3014, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x4850, 0x0005, + 0xa830, 0x9086, 0x0100, 0x1904, 0x33cf, 0x2009, 0x0004, 0x0804, + 0x3401, 0x7984, 0x080c, 0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04, + 0x3404, 0x9186, 0x00ff, 0x0904, 0x3404, 0x9182, 0x0800, 0x1a04, + 0x3404, 0x2001, 0x9000, 0x080c, 0x546f, 0x1904, 0x3401, 0x0804, + 0x33cf, 0xa998, 0x080c, 0xaad5, 0x1118, 0x9182, 0x007f, 0x0280, + 0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, + 0x080c, 0x546f, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, + 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, + 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, + 0x2009, 0x000a, 0x0c48, 0x080c, 0x1000, 0x0198, 0x9006, 0xa802, + 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, + 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, + 0x0001, 0x0005, 0x7984, 0x080c, 0x63cd, 0x1130, 0x7e88, 0x9684, + 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, + 0x080c, 0x63cd, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, + 0x080c, 0x63cd, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, + 0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1032, 0x0cc8, + 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, + 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, + 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e0, 0x7007, 0x0002, + 0x701f, 0x33cf, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, + 0x0000, 0x2001, 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4918, + 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x0804, 0x497e, + 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, + 0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, + 0x080c, 0x1000, 0x0904, 0x4976, 0xa84b, 0x0000, 0x2900, 0x7046, + 0x2001, 0x0002, 0x9080, 0x1f4a, 0x2005, 0xa846, 0x0098, 0x7038, + 0x90e0, 0x0004, 0x2001, 0x18ba, 0x9c82, 0x18fa, 0x0210, 0x2061, + 0x18ba, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, + 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, + 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x2060, 0x001e, + 0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x1000, 0x1130, + 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, + 0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, + 0x0002, 0x9080, 0x1f4a, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, + 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, + 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x49a0, 0x49a0, 0x49a2, + 0x49a0, 0x49a0, 0x49a0, 0x49a6, 0x49a0, 0x49a0, 0x49a0, 0x49aa, + 0x49a0, 0x49a0, 0x49a0, 0x49ae, 0x49a0, 0x49a0, 0x49a0, 0x49b2, + 0x49a0, 0x49a0, 0x49a0, 0x49b6, 0x49a0, 0x49a0, 0x49a0, 0x49bb, + 0x080c, 0x0dd5, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, + 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, + 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, + 0xa4ce, 0x0804, 0x4979, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4979, + 0x00e6, 0x2071, 0x189e, 0x7048, 0x9005, 0x0904, 0x4a52, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x4a51, 0x00f6, 0x2079, 0x0000, 0x00c6, + 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, + 0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5, + 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a54, + 0xa804, 0x9005, 0x090c, 0x0dd5, 0x7042, 0x2938, 0x2040, 0xa003, + 0x0000, 0x2001, 0x0002, 0x9080, 0x1f4a, 0x2005, 0xa04a, 0x0804, + 0x4a54, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, + 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, + 0x87ff, 0x0118, 0x2748, 0x080c, 0x1032, 0x7048, 0x8001, 0x704a, + 0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1032, + 0x9006, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x0420, + 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, + 0x0004, 0x90fa, 0x18fa, 0x0210, 0x2001, 0x18ba, 0x703e, 0x00a0, + 0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0dd5, 0x2048, + 0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, + 0x1f4a, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, + 0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, + 0x4a73, 0x4a73, 0x4a75, 0x4a73, 0x4a73, 0x4a73, 0x4a7a, 0x4a73, + 0x4a73, 0x4a73, 0x4a7f, 0x4a73, 0x4a73, 0x4a73, 0x4a84, 0x4a73, + 0x4a73, 0x4a73, 0x4a89, 0x4a73, 0x4a73, 0x4a73, 0x4a8e, 0x4a73, + 0x4a73, 0x4a73, 0x4a93, 0x080c, 0x0dd5, 0xaa74, 0xab78, 0xac7c, + 0x0804, 0x49ff, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x49ff, 0xaa94, + 0xab98, 0xac9c, 0x0804, 0x49ff, 0xaaa4, 0xaba8, 0xacac, 0x0804, + 0x49ff, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x49ff, 0xaac4, 0xabc8, + 0xaccc, 0x0804, 0x49ff, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49ff, + 0x0016, 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, + 0x63cd, 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, + 0x2011, 0x801b, 0x080c, 0x48fb, 0x00ce, 0x00be, 0x003e, 0x002e, + 0x001e, 0x0005, 0x0026, 0x080c, 0x54b7, 0xd0c4, 0x0120, 0x2011, + 0x8014, 0x080c, 0x48fb, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3401, + 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, + 0x080c, 0x717d, 0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085, + 0x0001, 0x080c, 0x71c4, 0x080c, 0x70af, 0x0010, 0x080c, 0x5cb7, + 0x012e, 0x0804, 0x33cf, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401, + 0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804, 0x3401, 0x080c, + 0x31bf, 0x0128, 0x7984, 0x080c, 0x636c, 0x1904, 0x3404, 0x080c, + 0x48ce, 0x0904, 0x3404, 0x2b00, 0x7026, 0x080c, 0x6737, 0x7888, + 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x65ed, 0x1108, + 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x080c, + 0x489b, 0x0904, 0x3401, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xca41, 0x0904, 0x3401, 0x7888, 0xd094, 0x0118, + 0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, 0x701f, 0x4b74, 0x0005, + 0x2061, 0x1800, 0x080c, 0x54cb, 0x2009, 0x0007, 0x1578, 0x080c, + 0x672f, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x31bf, 0x0120, + 0xa998, 0x080c, 0x636c, 0x1530, 0x080c, 0x48cc, 0x0518, 0x080c, + 0x6737, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, + 0x65ed, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, + 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xca41, 0x11e0, 0xa89c, 0xd094, + 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x2009, 0x0003, 0xa897, 0x4005, + 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, + 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, + 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, + 0x2058, 0x1110, 0x0804, 0x5414, 0x900e, 0x080c, 0x65ed, 0x1108, + 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x080c, + 0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401, 0x7f84, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3401, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, + 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x63cd, + 0x1904, 0x4c16, 0x080c, 0x6737, 0x0138, 0x080c, 0x673f, 0x0120, + 0x080c, 0x66d7, 0x1904, 0x4c16, 0xd794, 0x1110, 0xd784, 0x01a8, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, + 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, + 0x20a9, 0x0002, 0x080c, 0x469d, 0x0048, 0x20a9, 0x0004, 0x4003, + 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x469d, 0x9186, 0x007e, + 0x0170, 0x9186, 0x0080, 0x0158, 0x080c, 0x6737, 0x90c2, 0x0006, + 0x1210, 0xc1fd, 0x0020, 0x080c, 0x65ed, 0x1108, 0xc1fd, 0x4104, + 0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, 0xb8c8, 0x2060, 0x9c80, + 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, + 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, + 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4690, + 0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, + 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, + 0xaad5, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, + 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, + 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4ba6, + 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x33cf, 0x7033, 0x0001, + 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44, + 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, + 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e0, 0x7007, 0x0002, 0x701f, + 0x4c52, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, + 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, + 0xa390, 0xa494, 0xa598, 0x0804, 0x4ba6, 0x7124, 0x810b, 0x0804, + 0x33cf, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, + 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04, + 0x3404, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, + 0x0a04, 0x3404, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, + 0x3404, 0x9502, 0x0a04, 0x3404, 0x9284, 0x00ff, 0x90e2, 0x0020, + 0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404, 0x9384, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404, 0x9384, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404, + 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, + 0x0a04, 0x3404, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404, + 0x9502, 0x0a04, 0x3404, 0x2061, 0x1987, 0x6102, 0x6206, 0x630a, + 0x640e, 0x0804, 0x33cf, 0x080c, 0x489b, 0x0904, 0x3401, 0x2009, + 0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, + 0xaf60, 0x080c, 0x48e4, 0x701f, 0x4cd6, 0x0005, 0x2001, 0x0138, + 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, + 0x00ee, 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, + 0x9080, 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, + 0x20e9, 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, 0x4d57, + 0x6804, 0x2008, 0x918c, 0xfff8, 0x1904, 0x4d57, 0x680c, 0x9005, + 0x0904, 0x4d57, 0x9082, 0xff01, 0x1a04, 0x4d57, 0x6810, 0x9082, + 0x005c, 0x0a04, 0x4d57, 0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, + 0x4d57, 0x9182, 0x0400, 0x1a04, 0x4d57, 0x0056, 0x2029, 0x0000, + 0x080c, 0x888a, 0x005e, 0x6944, 0x6820, 0x9102, 0x06c0, 0x6820, + 0x9082, 0x0019, 0x16a0, 0x6828, 0x6944, 0x810c, 0x9102, 0x0678, + 0x6840, 0x9082, 0x000f, 0x1658, 0x080c, 0x1019, 0x2900, 0x0904, + 0x4d71, 0x684e, 0x00e6, 0x2071, 0x1930, 0x00b6, 0x2059, 0x0000, + 0x080c, 0x8746, 0x00be, 0x00ee, 0x0558, 0x080c, 0x84a0, 0x080c, + 0x84e6, 0x11e0, 0x6857, 0x0000, 0x00c6, 0x2061, 0x0100, 0x6104, + 0x918d, 0x2000, 0x6106, 0x6b10, 0x2061, 0x1a60, 0x630a, 0x00ce, + 0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x33cf, 0x080c, + 0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x3404, 0x00e6, 0x2071, + 0x1930, 0x080c, 0x891b, 0x080c, 0x892a, 0x080c, 0x8735, 0x00ee, + 0x2001, 0x188a, 0x204c, 0x080c, 0x1032, 0x2001, 0x188a, 0x2003, + 0x0000, 0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x3401, + 0x2001, 0x1924, 0x200c, 0x918e, 0x0000, 0x0904, 0x4dd0, 0x080c, + 0x8730, 0x0904, 0x4dd0, 0x2001, 0x0101, 0x200c, 0x918c, 0xdfff, + 0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, + 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x8735, 0x2001, 0x0035, + 0x080c, 0x15d1, 0x00c6, 0x2061, 0x193c, 0x6004, 0x6100, 0x9106, + 0x1de0, 0x00ce, 0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x00e6, + 0x00f6, 0x2071, 0x1923, 0x080c, 0x8671, 0x0120, 0x2f00, 0x080c, + 0x86fb, 0x0cc8, 0x00fe, 0x00ee, 0x0126, 0x2091, 0x8000, 0x2001, + 0x188a, 0x200c, 0x81ff, 0x0138, 0x2148, 0x080c, 0x1032, 0x2001, + 0x188a, 0x2003, 0x0000, 0x2001, 0x183c, 0x2003, 0x0020, 0x00e6, + 0x2071, 0x1930, 0x080c, 0x891b, 0x080c, 0x892a, 0x00ee, 0x012e, + 0x0804, 0x33cf, 0x0006, 0x080c, 0x54b7, 0xd0cc, 0x000e, 0x0005, + 0x0006, 0x080c, 0x54bb, 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, + 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x33cf, 0x83ff, 0x1904, + 0x3404, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3404, 0x2019, 0xffff, + 0x6078, 0x9302, 0x9200, 0x0a04, 0x3404, 0x7986, 0x6276, 0x0804, + 0x33cf, 0x080c, 0x54cb, 0x1904, 0x3401, 0x7c88, 0x7d84, 0x7e98, + 0x7f8c, 0x080c, 0x489b, 0x0904, 0x3401, 0x900e, 0x901e, 0x7326, + 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, + 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737, + 0x0118, 0x080c, 0x673f, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, + 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, + 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, + 0x900e, 0x2001, 0x0003, 0x080c, 0x8cf7, 0x2208, 0x0804, 0x33cf, + 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b8, + 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, + 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10e0, 0x7007, 0x0002, + 0x701f, 0x4e53, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, + 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, + 0xa590, 0xa694, 0xa798, 0x0804, 0x4e11, 0x7224, 0x900e, 0x2001, + 0x0003, 0x080c, 0x8cf7, 0x2208, 0x0804, 0x33cf, 0x00f6, 0x00e6, + 0x080c, 0x54cb, 0x2009, 0x0007, 0x1904, 0x4ee6, 0x2071, 0x189e, + 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4ee6, 0xac9c, 0xad98, + 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1019, 0x2009, 0x0002, 0x0904, + 0x4ee6, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, + 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, + 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737, 0x0118, 0x080c, 0x673f, + 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, + 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, + 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, + 0x080c, 0x8cf7, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, + 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1032, 0x9006, 0x705e, + 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, + 0x9300, 0x7056, 0x2061, 0x18b9, 0x2c44, 0xa37a, 0x7058, 0xa076, + 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4ef2, + 0x000e, 0xa0a2, 0x080c, 0x10e0, 0x9006, 0x0048, 0x009e, 0xa897, + 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, + 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0dd5, 0x00e6, + 0x2071, 0x189e, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, + 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, + 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, + 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, + 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8cf7, 0xaa9a, + 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1032, 0x705f, + 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, + 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, + 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737, 0x0118, + 0x080c, 0x673f, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, + 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, + 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, + 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, + 0x080c, 0x1032, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, + 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0xa09f, + 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, + 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, + 0x10e0, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, + 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, + 0x0804, 0x3404, 0xa884, 0xa988, 0x080c, 0x26f0, 0x1518, 0x080c, + 0x636c, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x489b, + 0x01c8, 0x080c, 0x489b, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xc9c8, + 0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, + 0x4fbf, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3401, 0x7124, + 0x080c, 0x3166, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, + 0x0804, 0x3401, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, + 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, + 0x002a, 0x080c, 0x0f7d, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, + 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, + 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, + 0x0004, 0x000e, 0x007e, 0x0804, 0x48e7, 0x97c6, 0x7200, 0x11b8, + 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, + 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, + 0x080c, 0x10e0, 0x7007, 0x0002, 0x701f, 0x501b, 0x0005, 0x000e, + 0x007e, 0x0804, 0x3404, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, + 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, + 0x080c, 0x0f7d, 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c, + 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48e7, 0x81ff, + 0x1904, 0x3401, 0x798c, 0x2001, 0x197e, 0x2102, 0x080c, 0x48b2, + 0x0904, 0x3404, 0x080c, 0x6737, 0x0120, 0x080c, 0x673f, 0x1904, + 0x3404, 0x080c, 0x6494, 0x0904, 0x3401, 0x0126, 0x2091, 0x8000, + 0x080c, 0x655a, 0x012e, 0x0904, 0x3401, 0x0804, 0x43cf, 0xa9a0, + 0x2001, 0x197e, 0xc18d, 0x2102, 0x080c, 0x48bf, 0x01a0, 0x080c, + 0x6737, 0x0118, 0x080c, 0x673f, 0x1170, 0x080c, 0x6494, 0x2009, + 0x0002, 0x0128, 0x080c, 0x655a, 0x1170, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, 0x54bf, 0x0110, + 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, + 0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x4344, 0x080c, 0x48ce, + 0x0904, 0x3404, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3401, 0x080c, 0x6737, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, + 0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, + 0x0028, 0x080c, 0x54b7, 0xd0b4, 0x0904, 0x437e, 0x7884, 0x908e, + 0x007e, 0x0904, 0x437e, 0x908e, 0x007f, 0x0904, 0x437e, 0x908e, + 0x0080, 0x0904, 0x437e, 0xb800, 0xd08c, 0x1904, 0x437e, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc9e7, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x50d8, 0x0005, + 0x080c, 0x48ce, 0x0904, 0x3404, 0x0804, 0x437e, 0x080c, 0x31bf, + 0x0108, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007, + 0x0804, 0x3401, 0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804, + 0x3401, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x437e, 0x9006, + 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca41, 0x1120, + 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x5111, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, - 0x31c3, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, - 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x465e, - 0xa898, 0x9086, 0x000d, 0x1904, 0x31c3, 0x2021, 0x4005, 0x0126, - 0x2091, 0x8000, 0x0e04, 0x507d, 0x0010, 0x012e, 0x0cc0, 0x7c36, - 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, - 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, - 0x080c, 0x464e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x1167, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, - 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c9, - 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898, - 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001, - 0x19d7, 0x2044, 0x2001, 0x19de, 0xa076, 0xa060, 0xa072, 0xa07b, - 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, - 0x012e, 0x0804, 0x3191, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, - 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb648, 0x000e, 0x1198, - 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, - 0x5a3b, 0x080c, 0x9940, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, - 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, - 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, - 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186, - 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, - 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x50f6, - 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004, 0x0005, 0x2001, - 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0d4, - 0x000e, 0x0005, 0x2001, 0x180d, 0x2004, 0xd0b4, 0x0005, 0x2001, - 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, - 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x0126, - 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, - 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x52e0, 0x0068, 0xd08c, - 0x0118, 0x080c, 0x51e9, 0x0040, 0xd094, 0x0118, 0x080c, 0x51b9, - 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, - 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, - 0x7090, 0x9005, 0x000e, 0x0120, 0x7093, 0x0000, 0x708b, 0x0000, - 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, - 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, - 0x9296, 0xf700, 0x0178, 0x7134, 0xd1a4, 0x1160, 0x6240, 0x9295, - 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, - 0x599d, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, - 0x6043, 0x0000, 0x707f, 0x0000, 0x709b, 0x0001, 0x70bf, 0x0000, - 0x70d7, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x708f, 0x0000, - 0x7083, 0x000f, 0x2009, 0x000f, 0x2011, 0x5883, 0x080c, 0x7cd9, - 0x0005, 0x2001, 0x1875, 0x2004, 0xd08c, 0x0110, 0x7057, 0xffff, - 0x7080, 0x9005, 0x1528, 0x2011, 0x5883, 0x080c, 0x7c4a, 0x6040, - 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, - 0xd08c, 0x1168, 0x1f04, 0x51cf, 0x6242, 0x7093, 0x0000, 0x6040, - 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, - 0x7093, 0x0000, 0x7087, 0x0000, 0x9006, 0x080c, 0x5a26, 0x0000, - 0x0005, 0x7084, 0x908a, 0x0003, 0x1a0c, 0x0db2, 0x000b, 0x0005, - 0x51f3, 0x5244, 0x52df, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, - 0x7087, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, - 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x5202, - 0x080c, 0x0db2, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, - 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, - 0x5a02, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, - 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, - 0x0004, 0x4003, 0x080c, 0x97ce, 0x20e1, 0x0001, 0x2099, 0x1c00, + 0x5414, 0x080c, 0x48ce, 0x0904, 0x3404, 0x0804, 0x50aa, 0x81ff, + 0x2009, 0x0001, 0x1904, 0x3401, 0x080c, 0x54cb, 0x2009, 0x0007, + 0x1904, 0x3401, 0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804, + 0x3401, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x2009, + 0x0009, 0x1904, 0x3401, 0x080c, 0x489b, 0x2009, 0x0002, 0x0904, + 0x3401, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, + 0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, + 0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3404, + 0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xcc94, 0x2009, 0x0003, + 0x0904, 0x3401, 0x7007, 0x0003, 0x701f, 0x5167, 0x0005, 0xa830, + 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x3401, 0x0804, 0x33cf, + 0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x54cb, + 0x1188, 0x2009, 0x0014, 0x0804, 0x3401, 0xd2dc, 0x1568, 0x81ff, + 0x2009, 0x0001, 0x1904, 0x3401, 0x080c, 0x54cb, 0x2009, 0x0007, + 0x1904, 0x3401, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5492, + 0x0804, 0x33cf, 0xd2fc, 0x0158, 0x080c, 0x48ce, 0x0904, 0x3404, + 0x7984, 0x9284, 0x9000, 0x080c, 0x546f, 0x0804, 0x33cf, 0x080c, + 0x48ce, 0x0904, 0x3404, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, + 0x2009, 0x0009, 0x1904, 0x5250, 0x080c, 0x489b, 0x2009, 0x0002, + 0x0904, 0x5250, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x48e4, 0x701f, 0x51c1, + 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, + 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3404, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x48ce, 0x1110, 0x0804, 0x3404, + 0x2009, 0x0043, 0x080c, 0xccfc, 0x2009, 0x0003, 0x0904, 0x5250, + 0x7007, 0x0003, 0x701f, 0x51e5, 0x0005, 0xa830, 0x9086, 0x0100, + 0x2009, 0x0004, 0x0904, 0x5250, 0x7984, 0x7aa8, 0x9284, 0x1000, + 0x080c, 0x546f, 0x0804, 0x33cf, 0x00c6, 0xaab0, 0x9284, 0xc000, + 0x0140, 0xd2ec, 0x0168, 0x080c, 0x54cb, 0x1150, 0x2009, 0x0014, + 0x04f0, 0x2061, 0x1800, 0x080c, 0x54cb, 0x2009, 0x0007, 0x15b8, + 0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, 0x5492, 0x0050, 0xd2fc, + 0x0178, 0x080c, 0x48cc, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, + 0x546f, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, + 0x080c, 0x48cc, 0x0510, 0x080c, 0x6737, 0x2009, 0x0009, 0x11b8, + 0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, + 0x9084, 0xff00, 0x1190, 0x080c, 0x48cc, 0x1108, 0x0070, 0x2009, + 0x004b, 0x080c, 0xccfc, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, + 0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, + 0x7aa8, 0xd2dc, 0x0904, 0x3401, 0x0016, 0x7984, 0x9284, 0x1000, + 0xc0fd, 0x080c, 0x546f, 0x001e, 0x1904, 0x3401, 0x0804, 0x33cf, + 0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, + 0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x546f, 0x001e, + 0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401, + 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x63cd, 0x1904, 0x3404, + 0x9186, 0x007f, 0x0138, 0x080c, 0x6737, 0x0120, 0x2009, 0x0009, + 0x0804, 0x3401, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, + 0x8007, 0xa80a, 0x080c, 0xca01, 0x1120, 0x2009, 0x0003, 0x0804, + 0x3401, 0x7007, 0x0003, 0x701f, 0x52ae, 0x0005, 0xa808, 0x8007, + 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3401, 0xa8e0, + 0xa866, 0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, + 0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7, 0x080c, 0x489b, 0x1120, + 0x2009, 0x0002, 0x0804, 0x3401, 0x7984, 0x9194, 0xff00, 0x918c, + 0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b1, 0x0040, 0x92c6, + 0x0001, 0x1118, 0x7023, 0x19cb, 0x0010, 0x0804, 0x3404, 0x2009, + 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, + 0xaf60, 0x080c, 0x48e4, 0x701f, 0x52fe, 0x0005, 0x2001, 0x182e, + 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, + 0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, + 0x33cf, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3401, + 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, + 0x2099, 0x19b1, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cb, + 0x0010, 0x0804, 0x3404, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, + 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, + 0x0804, 0x48e7, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3404, 0x0126, + 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, + 0x19f8, 0x6142, 0x00ce, 0x012e, 0x0804, 0x33cf, 0x00c6, 0x080c, + 0x717d, 0x1160, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085, 0x0001, + 0x080c, 0x71c4, 0x080c, 0x70af, 0x080c, 0x0dd5, 0x2061, 0x1800, + 0x6030, 0xc09d, 0x6032, 0x080c, 0x5cb7, 0x00ce, 0x0005, 0x00c6, + 0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3401, 0x7884, + 0x9005, 0x0188, 0x7888, 0x2061, 0x199a, 0x2c0c, 0x2062, 0x080c, + 0x2ad2, 0x01a0, 0x080c, 0x2ada, 0x0188, 0x080c, 0x2ae2, 0x0170, + 0x2162, 0x0804, 0x3404, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, + 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, + 0x0002, 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, + 0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353, + 0x002e, 0x080c, 0xa236, 0x0036, 0x901e, 0x080c, 0xa2ac, 0x003e, + 0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c, 0xe6a7, 0x9085, 0x0001, + 0x080c, 0x71c4, 0x9006, 0x080c, 0x2ba1, 0x2001, 0x1800, 0x2003, + 0x0004, 0x6027, 0x0008, 0x00ce, 0x0804, 0x33cf, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, + 0x0007, 0x0804, 0x3401, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, + 0x63cd, 0x1904, 0x3404, 0x9186, 0x007f, 0x0138, 0x080c, 0x6737, + 0x0120, 0x2009, 0x0009, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120, + 0x2009, 0x0002, 0x0804, 0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xca04, 0x1120, 0x2009, 0x0003, 0x0804, 0x3401, + 0x7007, 0x0003, 0x701f, 0x53fd, 0x0005, 0xa830, 0x9086, 0x0100, + 0x1120, 0x2009, 0x0004, 0x0804, 0x3401, 0xa8e0, 0xa866, 0xa834, + 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0xaf60, 0x0804, 0x48e7, 0xa898, 0x9086, 0x000d, 0x1904, + 0x3401, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5421, + 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, + 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, + 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x48d7, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x7007, 0x0001, + 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, + 0x8000, 0x00c6, 0x2061, 0x19f8, 0x7984, 0x6152, 0x614e, 0x6057, + 0x0000, 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, + 0x6062, 0x788c, 0x605e, 0x2001, 0x1a06, 0x2044, 0x2001, 0x1a0d, + 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, + 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x33cf, 0x0126, + 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, + 0x080c, 0xc872, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, + 0x2004, 0x905d, 0x0160, 0x080c, 0x5e12, 0x080c, 0xaad5, 0x0110, + 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, + 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, + 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180, + 0x9186, 0x007e, 0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080, + 0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e, + 0x001e, 0x8108, 0x1f04, 0x549a, 0x015e, 0x012e, 0x0005, 0x2001, + 0x1848, 0x2004, 0x0005, 0x2001, 0x1867, 0x2004, 0x0005, 0x0006, + 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, + 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, + 0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d, 0x710a, + 0x00ee, 0x001e, 0x0005, 0x080c, 0x489b, 0x080c, 0x0f07, 0x2100, + 0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081, + 0x1a04, 0x3404, 0x810c, 0x080c, 0x48e4, 0x701f, 0x54f0, 0x0005, + 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, + 0x2061, 0x18b8, 0x2c44, 0xa770, 0xa074, 0x2071, 0x189e, 0x080c, + 0x48e7, 0x701f, 0x5504, 0x0005, 0x2061, 0x18b8, 0x2c44, 0xa074, + 0x2048, 0x9006, 0xa802, 0xa806, 0x0804, 0x33cf, 0x0126, 0x0156, + 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, + 0x11e8, 0xd084, 0x0118, 0x080c, 0x56b7, 0x0068, 0xd08c, 0x0118, + 0x080c, 0x55c0, 0x0040, 0xd094, 0x0118, 0x080c, 0x5590, 0x0018, + 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, + 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, + 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, + 0x9005, 0x000e, 0x0120, 0x709b, 0x0000, 0x7093, 0x0000, 0x624c, + 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, + 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, + 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, + 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5d74, + 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, + 0x0000, 0x7087, 0x0000, 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, + 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x7097, 0x0000, 0x708b, + 0x000f, 0x2009, 0x000f, 0x2011, 0x5c5a, 0x080c, 0x831a, 0x0005, + 0x2001, 0x1869, 0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, + 0x9005, 0x1528, 0x2011, 0x5c5a, 0x080c, 0x8285, 0x6040, 0x9094, + 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, + 0x1168, 0x1f04, 0x55a6, 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, + 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, + 0x0000, 0x708f, 0x0000, 0x9006, 0x080c, 0x5dfd, 0x0000, 0x0005, + 0x708c, 0x908a, 0x0003, 0x1a0c, 0x0dd5, 0x000b, 0x0005, 0x55ca, + 0x561b, 0x56b6, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, + 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, + 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x55d9, 0x080c, + 0x0dd5, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, + 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5dd9, + 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, + 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, 0x0004, + 0x4003, 0x080c, 0xa82b, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, + 0x600f, 0x0000, 0x080c, 0x5c8b, 0x00fe, 0x9006, 0x7092, 0x6043, + 0x0008, 0x6042, 0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, + 0x0904, 0x5693, 0x6020, 0xd0b4, 0x1904, 0x5691, 0x71a0, 0x81ff, + 0x0904, 0x567f, 0x9486, 0x000c, 0x1904, 0x568c, 0x9480, 0x0018, + 0x8004, 0x20a8, 0x080c, 0x5dd2, 0x2011, 0x0260, 0x2019, 0x1c00, + 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x5638, + 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, + 0x2061, 0x0100, 0x6043, 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, + 0x2009, 0x07d0, 0x2011, 0x5c61, 0x080c, 0x831a, 0x080c, 0x5dd9, + 0x04c0, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, + 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, + 0x7804, 0x9005, 0x0190, 0x080c, 0x5dd2, 0x2011, 0x026e, 0x2019, + 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, + 0x8210, 0x8318, 0x1f04, 0x5673, 0x0078, 0x70a3, 0x0000, 0x080c, + 0x5dd2, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, + 0x1c00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, + 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, + 0xd0b4, 0x1db8, 0x080c, 0xa82b, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, - 0x000c, 0x600f, 0x0000, 0x080c, 0x58b4, 0x00fe, 0x9006, 0x708a, - 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x7088, 0x708b, 0x0000, - 0x9025, 0x0904, 0x52bc, 0x6020, 0xd0b4, 0x1904, 0x52ba, 0x7198, - 0x81ff, 0x0904, 0x52a8, 0x9486, 0x000c, 0x1904, 0x52b5, 0x9480, - 0x0018, 0x8004, 0x20a8, 0x080c, 0x59fb, 0x2011, 0x0260, 0x2019, - 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, - 0x5261, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, - 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x7087, 0x0002, 0x7093, - 0x0002, 0x2009, 0x07d0, 0x2011, 0x588a, 0x080c, 0x7cd9, 0x080c, - 0x5a02, 0x04c0, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7930, 0x918e, - 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, - 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x59fb, 0x2011, 0x026e, - 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, - 0x11a0, 0x8210, 0x8318, 0x1f04, 0x529c, 0x0078, 0x709b, 0x0000, - 0x080c, 0x59fb, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, - 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, - 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, - 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x97ce, 0x20e1, 0x0001, 0x2099, - 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, - 0x60c3, 0x000c, 0x2011, 0x19c0, 0x2013, 0x0000, 0x708b, 0x0000, - 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8fb2, 0x08d8, 0x0005, - 0x7090, 0x908a, 0x001d, 0x1a0c, 0x0db2, 0x000b, 0x0005, 0x5311, - 0x5324, 0x534d, 0x536d, 0x5393, 0x53c2, 0x53e8, 0x5420, 0x5446, - 0x5474, 0x54af, 0x54e7, 0x5505, 0x5530, 0x5552, 0x556d, 0x5577, - 0x55ab, 0x55d1, 0x5600, 0x5626, 0x565e, 0x56a2, 0x56df, 0x5700, - 0x5759, 0x577b, 0x57a9, 0x57a9, 0x00c6, 0x2061, 0x1800, 0x6003, - 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, - 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, - 0x0100, 0x6043, 0x0002, 0x7093, 0x0001, 0x2009, 0x07d0, 0x2011, - 0x588a, 0x080c, 0x7cd9, 0x0005, 0x00f6, 0x7088, 0x9086, 0x0014, - 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x59fb, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, - 0x7a38, 0xd2fc, 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, - 0x2011, 0x588a, 0x080c, 0x7c4a, 0x7093, 0x0010, 0x080c, 0x5577, - 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0003, - 0x6043, 0x0004, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x080c, 0x597f, - 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, - 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5362, 0x60c3, - 0x0014, 0x080c, 0x58b4, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, - 0x0500, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x9086, 0x0014, 0x11b8, - 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, - 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70bc, 0x9005, - 0x1110, 0x70bf, 0x0001, 0x7093, 0x0004, 0x0029, 0x0010, 0x080c, - 0x59d7, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0005, 0x080c, 0x597f, - 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x59fb, - 0x080c, 0x59de, 0x1170, 0x707c, 0x9005, 0x1158, 0x7154, 0x9186, - 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5837, 0x0168, 0x080c, - 0x59b4, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, - 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x58b4, - 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x588a, - 0x080c, 0x7c4a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x59fb, 0x2079, + 0x000c, 0x2011, 0x19ef, 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, + 0x0056, 0x60a7, 0x9575, 0x080c, 0x9ff3, 0x08d8, 0x0005, 0x7098, + 0x908a, 0x001d, 0x1a0c, 0x0dd5, 0x000b, 0x0005, 0x56e8, 0x56fb, + 0x5724, 0x5744, 0x576a, 0x5799, 0x57bf, 0x57f7, 0x581d, 0x584b, + 0x5886, 0x58be, 0x58dc, 0x5907, 0x5929, 0x5944, 0x594e, 0x5982, + 0x59a8, 0x59d7, 0x59fd, 0x5a35, 0x5a79, 0x5ab6, 0x5ad7, 0x5b30, + 0x5b52, 0x5b80, 0x5b80, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, + 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, + 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, + 0x6043, 0x0002, 0x709b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5c61, + 0x080c, 0x831a, 0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, + 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5dd2, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, + 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, + 0x5c61, 0x080c, 0x8285, 0x709b, 0x0010, 0x080c, 0x594e, 0x0010, + 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, + 0x0004, 0x2011, 0x5c61, 0x080c, 0x8285, 0x080c, 0x5d56, 0x2079, + 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, + 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5739, 0x60c3, 0x0014, + 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, + 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x11b8, 0x080c, + 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, + 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x709b, 0x0004, 0x0029, 0x0010, 0x080c, 0x5dae, + 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0005, 0x080c, 0x5d56, 0x2079, + 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c, + 0x5db5, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, + 0x0138, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x0168, 0x080c, 0x5d8b, + 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe, + 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c, + 0x8285, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, + 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, + 0x0006, 0x0029, 0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, + 0x709b, 0x0007, 0x080c, 0x5d56, 0x2079, 0x0240, 0x7833, 0x1104, + 0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c, 0x5db5, 0x11b8, 0x7084, + 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x31d0, + 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5c0e, + 0x0180, 0x080c, 0x4dd8, 0x0110, 0x080c, 0x2759, 0x20a9, 0x0008, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, + 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, + 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, + 0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, + 0x080c, 0x5d56, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, + 0x080c, 0x5db5, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5b81, + 0x1188, 0x9085, 0x0001, 0x080c, 0x2759, 0x20a9, 0x0008, 0x080c, + 0x5dd2, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x0010, 0x080c, + 0x56db, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, + 0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x1560, 0x080c, 0x5dd2, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, + 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, + 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, + 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, + 0x1110, 0x70c7, 0x0001, 0x7097, 0x0000, 0x709b, 0x000e, 0x080c, + 0x5929, 0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b, + 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, + 0x2019, 0xffff, 0x4304, 0x080c, 0x5d56, 0x2079, 0x0240, 0x7833, + 0x1106, 0x7837, 0x0000, 0x080c, 0x5db5, 0x0118, 0x2013, 0x0000, + 0x0020, 0x7060, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, + 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, + 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x58ab, + 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x01c0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0084, + 0x1178, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, + 0x1138, 0x7834, 0x9005, 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, + 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, + 0x5d56, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, + 0x5dd2, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, + 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, + 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, + 0x58ef, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x01e0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, + 0x0084, 0x1198, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, + 0x5d28, 0x709b, 0x000e, 0x0029, 0x0010, 0x080c, 0x5dae, 0x00fe, + 0x0005, 0x918d, 0x0001, 0x080c, 0x5dfd, 0x709b, 0x000f, 0x7093, + 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, + 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, + 0x5c61, 0x080c, 0x8279, 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, + 0x5c61, 0x080c, 0x8285, 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, + 0x080c, 0xa82b, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099, 0x0260, + 0x20e9, 0x0000, 0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, + 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5db5, + 0x11a0, 0x717c, 0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, + 0x0160, 0x080c, 0x26f0, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, + 0x0120, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x60c3, 0x0014, 0x080c, + 0x5c8b, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, + 0x080c, 0x8285, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, - 0x7093, 0x0006, 0x0029, 0x0010, 0x080c, 0x59d7, 0x00fe, 0x0005, - 0x00f6, 0x7093, 0x0007, 0x080c, 0x597f, 0x2079, 0x0240, 0x7833, - 0x1104, 0x7837, 0x0000, 0x080c, 0x59fb, 0x080c, 0x59de, 0x11b8, - 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, 0x9180, - 0x2f92, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, - 0x5837, 0x0180, 0x080c, 0x4a34, 0x0110, 0x080c, 0x253f, 0x20a9, - 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x58b4, 0x00fe, 0x0005, - 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x588a, 0x080c, 0x7c4a, - 0x9086, 0x0014, 0x11b8, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, 0x7093, 0x0008, - 0x0029, 0x0010, 0x080c, 0x59d7, 0x00fe, 0x0005, 0x00f6, 0x7093, - 0x0009, 0x080c, 0x597f, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, - 0x0100, 0x080c, 0x59de, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, - 0x57aa, 0x1188, 0x9085, 0x0001, 0x080c, 0x253f, 0x20a9, 0x0008, - 0x080c, 0x59fb, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, - 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x58b4, 0x0010, - 0x080c, 0x5304, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x05a8, - 0x2011, 0x588a, 0x080c, 0x7c4a, 0x9086, 0x0014, 0x1560, 0x080c, - 0x59fb, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, - 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, 0x7093, 0x000a, - 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70bc, - 0x9005, 0x1110, 0x70bf, 0x0001, 0x708f, 0x0000, 0x7093, 0x000e, - 0x080c, 0x5552, 0x0010, 0x080c, 0x59d7, 0x00fe, 0x0005, 0x00f6, - 0x7093, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, - 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x597f, 0x2079, 0x0240, - 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x59de, 0x0118, 0x2013, - 0x0000, 0x0020, 0x7058, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, - 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, - 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, - 0x54d4, 0x60c3, 0x0084, 0x080c, 0x58b4, 0x00fe, 0x0005, 0x00f6, - 0x7088, 0x9005, 0x01c0, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x9086, - 0x0084, 0x1178, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x7093, 0x000c, 0x0029, - 0x0010, 0x080c, 0x59d7, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x000d, - 0x080c, 0x597f, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, - 0x080c, 0x59fb, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, - 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, - 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, - 0x1f04, 0x5518, 0x60c3, 0x0084, 0x080c, 0x58b4, 0x00fe, 0x0005, - 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, 0x588a, 0x080c, 0x7c4a, - 0x9086, 0x0084, 0x1198, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x708f, 0x0001, - 0x080c, 0x5951, 0x7093, 0x000e, 0x0029, 0x0010, 0x080c, 0x59d7, - 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x5a26, 0x7093, 0x000f, - 0x708b, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, - 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, - 0x2011, 0x588a, 0x080c, 0x7c3e, 0x0005, 0x7088, 0x9005, 0x0130, - 0x2011, 0x588a, 0x080c, 0x7c4a, 0x7093, 0x0000, 0x0005, 0x7093, - 0x0011, 0x080c, 0x97ce, 0x080c, 0x59fb, 0x20e1, 0x0000, 0x2099, - 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x7488, 0x9480, 0x0018, - 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, - 0x59de, 0x11a0, 0x7174, 0x81ff, 0x0188, 0x900e, 0x7078, 0x9084, - 0x00ff, 0x0160, 0x080c, 0x24d6, 0x9186, 0x007e, 0x0138, 0x9186, - 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5837, 0x60c3, 0x0014, - 0x080c, 0x58b4, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, - 0x588a, 0x080c, 0x7c4a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x59fb, - 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, - 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, - 0x0001, 0x7093, 0x0012, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, - 0x0005, 0x00f6, 0x7093, 0x0013, 0x080c, 0x598d, 0x2079, 0x0240, - 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x59fb, 0x080c, 0x59de, - 0x1170, 0x707c, 0x9005, 0x1158, 0x7154, 0x9186, 0xffff, 0x0138, - 0x2011, 0x0008, 0x080c, 0x5837, 0x0168, 0x080c, 0x59b4, 0x20a9, - 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x58b4, 0x00fe, 0x0005, - 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x588a, 0x080c, 0x7c4a, - 0x9086, 0x0014, 0x11b8, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, 0x7093, 0x0014, - 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, - 0x0015, 0x080c, 0x598d, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, - 0x0000, 0x080c, 0x59fb, 0x080c, 0x59de, 0x11b8, 0x707c, 0x9005, - 0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, 0x9180, 0x2f92, 0x200d, - 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5837, 0x0180, - 0x080c, 0x4a34, 0x0110, 0x080c, 0x253f, 0x20a9, 0x0008, 0x20e1, - 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, - 0x60c3, 0x0014, 0x080c, 0x58b4, 0x00fe, 0x0005, 0x00f6, 0x7088, - 0x9005, 0x05f0, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x9086, 0x0014, - 0x15a8, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, - 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, - 0x9085, 0x0001, 0x080c, 0x5a26, 0x7a38, 0xd2fc, 0x0128, 0x70bc, - 0x9005, 0x1110, 0x70bf, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, - 0xd2fc, 0x0128, 0x70bc, 0x9005, 0x1110, 0x70bf, 0x0001, 0x9085, - 0x0001, 0x080c, 0x5a26, 0x708f, 0x0000, 0x7a38, 0xd2f4, 0x0110, - 0x70d7, 0x0008, 0x7093, 0x0016, 0x0029, 0x0010, 0x708b, 0x0000, - 0x00fe, 0x0005, 0x080c, 0x97ce, 0x080c, 0x59fb, 0x20e1, 0x0000, - 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, - 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, - 0x2012, 0x2011, 0x026e, 0x7093, 0x0017, 0x080c, 0x59de, 0x1150, - 0x707c, 0x9005, 0x1138, 0x080c, 0x57aa, 0x1188, 0x9085, 0x0001, - 0x080c, 0x253f, 0x20a9, 0x0008, 0x080c, 0x59fb, 0x20e1, 0x0000, + 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, + 0x709b, 0x0012, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, + 0x00f6, 0x709b, 0x0013, 0x080c, 0x5d64, 0x2079, 0x0240, 0x7833, + 0x1103, 0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c, 0x5db5, 0x1170, + 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, + 0x0008, 0x080c, 0x5c0e, 0x0168, 0x080c, 0x5d8b, 0x20a9, 0x0008, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, + 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, + 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, + 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, + 0x080c, 0x5d64, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, + 0x080c, 0x5dd2, 0x080c, 0x5db5, 0x11b8, 0x7084, 0x9005, 0x11a0, + 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x31d0, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x0180, 0x080c, + 0x4dd8, 0x0110, 0x080c, 0x2759, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, - 0x0014, 0x080c, 0x58b4, 0x0010, 0x080c, 0x5304, 0x0005, 0x00f6, - 0x7088, 0x9005, 0x01d8, 0x2011, 0x588a, 0x080c, 0x7c4a, 0x9086, - 0x0084, 0x1190, 0x080c, 0x59fb, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5a26, - 0x7093, 0x0018, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, - 0x00f6, 0x7093, 0x0019, 0x080c, 0x598d, 0x2079, 0x0240, 0x7833, - 0x1106, 0x7837, 0x0000, 0x080c, 0x59fb, 0x2009, 0x026e, 0x2039, - 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, - 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5713, - 0x2039, 0x1c0e, 0x080c, 0x59de, 0x11e8, 0x2728, 0x2514, 0x8207, - 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, - 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0, 0x1c0e, 0x2414, 0x938c, - 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, - 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, - 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, - 0x0240, 0x1f04, 0x5746, 0x60c3, 0x0084, 0x080c, 0x58b4, 0x00fe, - 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, 0x588a, 0x080c, - 0x7c4a, 0x9086, 0x0084, 0x1198, 0x080c, 0x59fb, 0x2079, 0x0260, - 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x708f, - 0x0001, 0x080c, 0x5951, 0x7093, 0x001a, 0x0029, 0x0010, 0x708b, - 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5a26, 0x7093, - 0x001b, 0x080c, 0x97ce, 0x080c, 0x59fb, 0x2011, 0x0260, 0x2009, - 0x0240, 0x7488, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, - 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, - 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, - 0x2011, 0x0260, 0x1f04, 0x5792, 0x60c3, 0x0084, 0x080c, 0x58b4, - 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1854, 0x252c, 0x20a9, - 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x59fb, - 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, - 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, - 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, - 0x57c4, 0x0804, 0x5833, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, - 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5833, 0x918d, - 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, - 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, - 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x57ea, 0x04d8, - 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x57fc, 0x2328, - 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, - 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x580b, 0x7556, - 0x95c8, 0x2f92, 0x292d, 0x95ac, 0x00ff, 0x757a, 0x6532, 0x6536, - 0x0016, 0x2508, 0x080c, 0x251f, 0x001e, 0x60e7, 0x0000, 0x65ea, - 0x2018, 0x2304, 0x9405, 0x201a, 0x707f, 0x0001, 0x20e9, 0x0000, - 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, - 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, - 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, - 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, - 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, - 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, - 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, - 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, 0x7156, 0x91a0, 0x2f92, - 0x242d, 0x95ac, 0x00ff, 0x757a, 0x6532, 0x6536, 0x0016, 0x2508, - 0x080c, 0x251f, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x707f, 0x0001, - 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7083, 0x0000, - 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, - 0x080c, 0x5940, 0x080c, 0x8fbb, 0x7004, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2997, 0x0126, 0x2091, 0x8000, 0x2071, 0x1824, 0x2073, - 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x599d, - 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, - 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, - 0x283d, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, - 0x19c0, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e, 0x60a3, 0x0056, - 0x60a7, 0x9575, 0x080c, 0x8fb2, 0x6144, 0xd184, 0x0120, 0x7190, - 0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000, 0x2011, 0x1968, - 0x2112, 0x2009, 0x07d0, 0x2011, 0x588a, 0x080c, 0x7cd9, 0x0005, - 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9947, - 0x2009, 0x00f7, 0x080c, 0x599d, 0x2061, 0x19c9, 0x900e, 0x611a, - 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, - 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, 0x200b, - 0x0000, 0x2009, 0x002d, 0x2011, 0x590c, 0x080c, 0x7c3e, 0x012e, - 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, - 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x8fbb, 0x2071, 0x0140, - 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2997, 0x080c, 0x6c5b, - 0x0188, 0x080c, 0x6c76, 0x1170, 0x080c, 0x6f34, 0x0016, 0x080c, - 0x25ee, 0x2001, 0x193e, 0x2102, 0x001e, 0x080c, 0x6f2f, 0x080c, - 0x6b8a, 0x0050, 0x2009, 0x0001, 0x080c, 0x28d6, 0x2001, 0x0001, - 0x080c, 0x247f, 0x080c, 0x58e0, 0x012e, 0x000e, 0x00ee, 0x0005, - 0x2001, 0x180d, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, - 0x8017, 0x2001, 0x1968, 0x201c, 0x080c, 0x4672, 0x003e, 0x002e, - 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, - 0x59fb, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, - 0x080c, 0x59f5, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, - 0x000e, 0x080c, 0x59f8, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, - 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, - 0x8108, 0x8210, 0x1f04, 0x5975, 0x002e, 0x001e, 0x0005, 0x080c, - 0x97ce, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, - 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0x97ce, 0x080c, - 0x59fb, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, - 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, - 0x0100, 0x810f, 0x2001, 0x1832, 0x2004, 0x9005, 0x1138, 0x2001, - 0x1816, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, - 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x62a0, - 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xcfe6, 0x2001, - 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, - 0x2dfb, 0x080c, 0xbcec, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, - 0x0007, 0x080c, 0x4829, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, - 0x58e0, 0x7093, 0x0000, 0x708b, 0x0000, 0x0005, 0x0006, 0x2001, - 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, - 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, - 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, - 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, - 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, - 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00, - 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, - 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, - 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x1975, - 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, - 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, - 0x5a35, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, - 0x2069, 0x1853, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a, - 0xb80e, 0xb812, 0x9198, 0x2f92, 0x231d, 0x939c, 0x00ff, 0xbb16, - 0x0016, 0x0026, 0xb8b2, 0x080c, 0x9940, 0x1120, 0x9192, 0x007e, - 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, 0x9198, - 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, - 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, - 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, - 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, - 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, - 0x080c, 0x1007, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, - 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, - 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, - 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5b0b, - 0x9182, 0x0800, 0x1a04, 0x5b0f, 0x2001, 0x180c, 0x2004, 0x9084, - 0x0003, 0x1904, 0x5b15, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, - 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, - 0x1904, 0x5b27, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, - 0xb84e, 0x080c, 0x801d, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, - 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, - 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, - 0x0006, 0x1290, 0x080c, 0x9940, 0x1160, 0xb8a0, 0x9084, 0xff80, - 0x1140, 0xb900, 0xd1fc, 0x0990, 0x2001, 0x0029, 0x2009, 0x1000, - 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, - 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, - 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, - 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, - 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, - 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, - 0x62a4, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5abe, 0x080c, - 0x611a, 0x0904, 0x5ad7, 0x0804, 0x5ac2, 0x00b6, 0x00e6, 0x0126, - 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x5ba8, 0x9188, - 0x1000, 0x2104, 0x905d, 0x0904, 0x5b80, 0xb8a0, 0x9086, 0x007f, - 0x0178, 0x080c, 0x62ac, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, - 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x62a4, 0x1598, - 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, - 0x2010, 0x080c, 0xb5e9, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, - 0x5baa, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, - 0x5baa, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, - 0x9980, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, - 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x9a50, 0x9006, 0x0458, - 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0x9940, - 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, - 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, - 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, - 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, - 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, - 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, - 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, - 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, - 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, - 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, + 0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, + 0x05f0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x15a8, + 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, + 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, + 0x0001, 0x080c, 0x5dfd, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, + 0x1110, 0x70c7, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, + 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, + 0x080c, 0x5dfd, 0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, + 0x0008, 0x709b, 0x0016, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, + 0x0005, 0x080c, 0xa82b, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099, + 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, + 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, + 0x2011, 0x026e, 0x709b, 0x0017, 0x080c, 0x5db5, 0x1150, 0x7084, + 0x9005, 0x1138, 0x080c, 0x5b81, 0x1188, 0x9085, 0x0001, 0x080c, + 0x2759, 0x20a9, 0x0008, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x5c8b, 0x0010, 0x080c, 0x56db, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x01d8, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0084, + 0x1190, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, + 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5dfd, 0x709b, + 0x0018, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, + 0x709b, 0x0019, 0x080c, 0x5d64, 0x2079, 0x0240, 0x7833, 0x1106, + 0x7837, 0x0000, 0x080c, 0x5dd2, 0x2009, 0x026e, 0x2039, 0x1c0e, + 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, + 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5aea, 0x2039, + 0x1c0e, 0x080c, 0x5db5, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, + 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, + 0x7060, 0x2310, 0x8214, 0x92a0, 0x1c0e, 0x2414, 0x938c, 0x0001, + 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, + 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, + 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, + 0x1f04, 0x5b1d, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005, + 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x5c61, 0x080c, 0x8285, + 0x9086, 0x0084, 0x1198, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, + 0x080c, 0x5d28, 0x709b, 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, + 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5dfd, 0x709b, 0x001b, + 0x080c, 0xa82b, 0x080c, 0x5dd2, 0x2011, 0x0260, 0x2009, 0x0240, + 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, + 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, + 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, + 0x0260, 0x1f04, 0x5b69, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x0005, + 0x0005, 0x0086, 0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, + 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5dd2, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, + 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, + 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5b9b, + 0x0804, 0x5c0a, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, + 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5c0a, 0x918d, 0xc000, + 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, + 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, + 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5bc1, 0x04d8, 0x23a8, + 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5bd3, 0x2328, 0x8529, + 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, + 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5be2, 0x755e, 0x95c8, + 0x31d0, 0x292d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, + 0x2508, 0x080c, 0x2739, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, + 0x2304, 0x9405, 0x201a, 0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, + 0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, + 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, + 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, + 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, + 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, + 0x942c, 0x11b8, 0x9405, 0x203a, 0x715e, 0x91a0, 0x31d0, 0x242d, + 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, + 0x2739, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, + 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, + 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, + 0x5d17, 0x080c, 0x9ffc, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, + 0x2bb1, 0x0126, 0x2091, 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, + 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5d74, 0x001e, + 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, + 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2a57, + 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19ef, + 0x2013, 0x0000, 0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, + 0x9575, 0x080c, 0x9ff3, 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, + 0x2000, 0x0018, 0x718c, 0x918d, 0x1000, 0x2011, 0x1997, 0x2112, + 0x2009, 0x07d0, 0x2011, 0x5c61, 0x080c, 0x831a, 0x0005, 0x0016, + 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaadc, 0x2009, + 0x00f7, 0x080c, 0x5d74, 0x2061, 0x19f8, 0x900e, 0x611a, 0x611e, + 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, + 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b, 0x0000, + 0x2009, 0x002d, 0x2011, 0x5ce3, 0x080c, 0x8279, 0x012e, 0x00ce, + 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, + 0x0471, 0x2071, 0x0100, 0x080c, 0x9ffc, 0x2071, 0x0140, 0x7004, + 0x9084, 0x4000, 0x0110, 0x080c, 0x2bb1, 0x080c, 0x7185, 0x0188, + 0x080c, 0x71a0, 0x1170, 0x080c, 0x746f, 0x0016, 0x080c, 0x2808, + 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x746a, 0x080c, 0x70af, + 0x0050, 0x2009, 0x0001, 0x080c, 0x2af0, 0x2001, 0x0001, 0x080c, + 0x269c, 0x080c, 0x5cb7, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, + 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, + 0x2001, 0x1997, 0x201c, 0x080c, 0x48fb, 0x003e, 0x002e, 0x0005, + 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, 0x5dd2, + 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, + 0x5dcc, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, 0x000e, + 0x080c, 0x5dcf, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, 0x0005, + 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, + 0x8210, 0x1f04, 0x5d4c, 0x002e, 0x001e, 0x0005, 0x080c, 0xa82b, + 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa82b, 0x080c, 0x5dd2, + 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, + 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, 0x2001, 0x1818, + 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, + 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x6733, 0x0158, + 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe280, 0x2001, 0x180c, + 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x3039, + 0x080c, 0xcf18, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, + 0x080c, 0x4ab2, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x5cb7, + 0x709b, 0x0000, 0x7093, 0x0000, 0x0005, 0x0006, 0x2001, 0x180c, + 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, + 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, 0x2102, + 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, 0x2009, + 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, + 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, 0x0080, + 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00, 0x7803, + 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7823, + 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, 0x0005, + 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x19a4, 0x0118, + 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, + 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x5e0c, + 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, + 0x1847, 0x9006, 0xb802, 0xb8ce, 0xb807, 0x0707, 0xb80a, 0xb80e, + 0xb812, 0x9198, 0x31d0, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, + 0x0026, 0xb8c2, 0x080c, 0xaad5, 0x1120, 0x9192, 0x007e, 0x1208, + 0xbbc2, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198, 0x0006, + 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, 0x23a0, + 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, 0xb856, + 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, + 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, + 0xb89e, 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, + 0x1032, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, + 0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, + 0x2060, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001, 0x181a, 0x2004, + 0x9c02, 0x1a0c, 0x0dd5, 0x080c, 0x8710, 0x00ce, 0x090c, 0x8ab4, + 0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, + 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, + 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5efa, 0x9182, + 0x0800, 0x1a04, 0x5efe, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, + 0x1904, 0x5f04, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, 0xb804, + 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, 0x1904, + 0x5f16, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, 0xb84e, + 0x080c, 0x8e9c, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, 0x2900, + 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, 0x0005, + 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, + 0x1290, 0x080c, 0xaad5, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, + 0xb900, 0xd1fc, 0x0990, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, + 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, + 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, + 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, + 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, + 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, + 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x6737, + 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5ead, 0x080c, 0x6569, + 0x0904, 0x5ec6, 0x0804, 0x5eb1, 0x00b6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0xa874, 0x908e, 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, + 0x0060, 0xa974, 0x9182, 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, + 0x905d, 0x01d0, 0x080c, 0x66d7, 0x11d0, 0x080c, 0xab15, 0x0570, + 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0009, 0x600b, 0x0000, + 0xa874, 0x908e, 0x00ff, 0x1110, 0x600b, 0x8000, 0x2009, 0x0043, + 0x080c, 0xabe6, 0x9006, 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, + 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, + 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x0010, 0x2001, + 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, + 0x0cc0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, + 0x0800, 0x1a04, 0x5fe4, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, + 0x5fbc, 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x673f, 0x0160, + 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, + 0x0118, 0x080c, 0x6737, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, + 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xc813, 0x002e, + 0x1120, 0x2001, 0x0008, 0x0804, 0x5fe6, 0x6020, 0x9086, 0x000a, + 0x0120, 0x2001, 0x0008, 0x0804, 0x5fe6, 0x601a, 0x6003, 0x0008, + 0x2900, 0x6016, 0x0058, 0x080c, 0xab15, 0x05e8, 0x2b00, 0x6012, + 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, + 0x080c, 0xabe6, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, + 0x0006, 0x1290, 0x080c, 0xaad5, 0x1160, 0xb8a0, 0x9084, 0xff80, + 0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, 0x1000, + 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, + 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, + 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, + 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, + 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, + 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, + 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, + 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, + 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, + 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0038, + 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9006, + 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x607b, 0x6036, + 0x604d, 0x607b, 0x607b, 0x607b, 0x607b, 0x607b, 0x2100, 0x9082, + 0x007e, 0x1278, 0x080c, 0x636c, 0x0148, 0x9046, 0xb810, 0x9306, + 0x1904, 0x6083, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, + 0x0010, 0x080c, 0x47ae, 0x0150, 0x04b0, 0x080c, 0x63cd, 0x1598, + 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0xab15, + 0x0530, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2900, 0x6016, 0x600b, + 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, + 0x306e, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, + 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, + 0xabe6, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001, + 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000, + 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, + 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x6262, 0x90c6, + 0x0056, 0x0904, 0x6266, 0x90c6, 0x0066, 0x0904, 0x626a, 0x90c6, + 0x0071, 0x0904, 0x626e, 0x90c6, 0x0074, 0x0904, 0x6272, 0x90c6, + 0x007c, 0x0904, 0x6276, 0x90c6, 0x007e, 0x0904, 0x627a, 0x90c6, + 0x0037, 0x0904, 0x627e, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, + 0x00ff, 0x0904, 0x625d, 0x9182, 0x0800, 0x1a04, 0x625d, 0x080c, + 0x63cd, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, + 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xaad5, 0x1904, 0x6246, + 0xb8a0, 0x9084, 0xff80, 0x1904, 0x6246, 0xa894, 0x90c6, 0x006f, + 0x0158, 0x90c6, 0x005e, 0x0904, 0x61a6, 0x90c6, 0x0064, 0x0904, + 0x61cf, 0x2008, 0x0804, 0x6168, 0xa998, 0xa8b0, 0x2040, 0x080c, + 0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04, 0x6168, 0x9186, 0x00ff, + 0x0904, 0x6168, 0x9182, 0x0800, 0x1a04, 0x6168, 0xaaa0, 0xab9c, + 0x787c, 0x9306, 0x1188, 0x7880, 0x0096, 0x924e, 0x1128, 0x2208, + 0x2310, 0x009e, 0x0804, 0x6168, 0x99cc, 0xff00, 0x009e, 0x1120, + 0x2208, 0x2310, 0x0804, 0x6168, 0x080c, 0x47ae, 0x0904, 0x6172, + 0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0, 0x0006, 0x080c, 0x65ed, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, + 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d, 0x20a9, 0x0004, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, + 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f7d, 0xa8c4, 0xabc8, + 0x9305, 0xabcc, 0x9305, 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, + 0x9305, 0xabdc, 0x9305, 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, + 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, + 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, + 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, + 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, + 0x0478, 0x000e, 0x080c, 0xab15, 0x1130, 0x2001, 0x4005, 0x2009, + 0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2900, + 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, + 0x0126, 0x2091, 0x8000, 0x080c, 0x306e, 0x012e, 0x9006, 0x080c, + 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x2009, 0x0002, 0x080c, + 0xabe6, 0xa8b0, 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x9006, + 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x54cb, + 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x63cd, + 0x1904, 0x6163, 0x9186, 0x007f, 0x0130, 0x080c, 0x6737, 0x0118, + 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x1000, 0x1120, 0x009e, + 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xca04, + 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x616a, 0xa998, + 0xaeb0, 0x080c, 0x63cd, 0x1904, 0x6163, 0x0096, 0x080c, 0x1000, + 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x6223, 0x2900, 0x009e, + 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, + 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, + 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, + 0x2398, 0x080c, 0x0f7d, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, + 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x54b7, 0xd0b4, 0x1118, + 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, + 0x00b0, 0x080c, 0x6737, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, + 0x54cb, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xc9e7, 0x1904, + 0x619f, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x616a, 0xa87b, + 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, + 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a, 0x080c, + 0xb084, 0x1904, 0x619f, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, + 0x900e, 0x0804, 0x61a0, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, - 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, - 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, - 0x00fe, 0x0005, 0x5c3f, 0x5bfa, 0x5c11, 0x5c3f, 0x5c3f, 0x5c3f, - 0x5c3f, 0x5c3f, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x5f1e, - 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x5c47, 0xb814, 0x9206, - 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x452c, 0x0150, - 0x04b0, 0x080c, 0x5f7e, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, - 0x9206, 0x1568, 0x080c, 0x9980, 0x0530, 0x2b00, 0x6012, 0x080c, - 0xba69, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, - 0x9086, 0x0001, 0x1170, 0x080c, 0x2e30, 0x9006, 0x080c, 0x5ebb, - 0x2001, 0x0002, 0x080c, 0x5ecf, 0x2001, 0x0200, 0xb86e, 0xb893, - 0x0002, 0x2009, 0x0003, 0x080c, 0x9a50, 0x9006, 0x0068, 0x2001, - 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, - 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, - 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, - 0x0015, 0x0904, 0x5e14, 0x90c6, 0x0056, 0x0904, 0x5e18, 0x90c6, - 0x0066, 0x0904, 0x5e1c, 0x90c6, 0x0071, 0x0904, 0x5e20, 0x90c6, - 0x0074, 0x0904, 0x5e24, 0x90c6, 0x007c, 0x0904, 0x5e28, 0x90c6, - 0x007e, 0x0904, 0x5e2c, 0x90c6, 0x0037, 0x0904, 0x5e30, 0x9016, - 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x5e0f, 0x9182, - 0x0800, 0x1a04, 0x5e0f, 0x080c, 0x5f7e, 0x1198, 0xb804, 0x9084, - 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, - 0x080c, 0x9940, 0x1904, 0x5df8, 0xb8a0, 0x9084, 0xff80, 0x1904, - 0x5df8, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, - 0x5d58, 0x90c6, 0x0064, 0x0904, 0x5d81, 0x2008, 0x0804, 0x5d1b, - 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9940, 0x1120, 0x9182, 0x007f, - 0x0a04, 0x5d1b, 0x9186, 0x00ff, 0x0904, 0x5d1b, 0x9182, 0x0800, - 0x1a04, 0x5d1b, 0xaaa0, 0xab9c, 0x7874, 0x9306, 0x1188, 0x7878, - 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x5d1b, - 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x5d1b, - 0x080c, 0x452c, 0x0904, 0x5d24, 0x900e, 0x9016, 0x90c6, 0x4000, - 0x1558, 0x0006, 0x080c, 0x619e, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, - 0x080c, 0x0f52, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, - 0x080c, 0x0f52, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, - 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, - 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, - 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, - 0x2001, 0x0030, 0x900e, 0x0470, 0x080c, 0x9980, 0x1130, 0x2001, - 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, - 0xba69, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, - 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e30, 0x012e, - 0x9006, 0x080c, 0x5ebb, 0x2001, 0x0002, 0x080c, 0x5ecf, 0x2009, - 0x0002, 0x080c, 0x9a50, 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, - 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, - 0x080c, 0x5127, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, - 0x080c, 0x5f7e, 0x1904, 0x5d16, 0x9186, 0x007f, 0x0130, 0x080c, - 0x62a4, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x0fd5, - 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, - 0x080c, 0xb7da, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, - 0x5d1d, 0xa998, 0xaeb0, 0x080c, 0x5f7e, 0x1904, 0x5d16, 0x0096, - 0x080c, 0x0fd5, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x5dd5, - 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8b4, - 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, - 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbb8, - 0x9398, 0x0006, 0x2398, 0x080c, 0x0f52, 0x009e, 0xa87b, 0x0000, - 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x5113, - 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, - 0xa89b, 0x000c, 0x00b0, 0x080c, 0x62a4, 0x0118, 0xa89b, 0x0009, - 0x0080, 0x080c, 0x5127, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, - 0xb7bd, 0x1904, 0x5d51, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, - 0x5d1d, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, - 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, - 0x120c, 0x080c, 0x9ed6, 0x1904, 0x5d51, 0x2009, 0x0002, 0x08e8, - 0x2001, 0x0028, 0x900e, 0x0804, 0x5d52, 0x2009, 0x180c, 0x210c, - 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, - 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x5d52, 0x2001, - 0x0029, 0x900e, 0x0804, 0x5d52, 0x080c, 0x33b6, 0x0804, 0x5d53, - 0x080c, 0x4e50, 0x0804, 0x5d53, 0x080c, 0x41a5, 0x0804, 0x5d53, - 0x080c, 0x45e8, 0x0804, 0x5d53, 0x080c, 0x489f, 0x0804, 0x5d53, - 0x080c, 0x4aca, 0x0804, 0x5d53, 0x080c, 0x4cbb, 0x0804, 0x5d53, - 0x080c, 0x35c6, 0x0804, 0x5d53, 0x00b6, 0xa974, 0xae78, 0x9684, - 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, - 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x62a4, 0x1148, 0x00e9, - 0x080c, 0x60a9, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, 0x0090, - 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88, 0x2001, 0x0029, - 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, - 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, - 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148, 0xa802, 0x009e, - 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, - 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0xb84c, 0x9005, - 0x0170, 0x00e6, 0x2071, 0x19b6, 0x7004, 0x9086, 0x0002, 0x0168, - 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e, 0x0005, 0x2900, - 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c, 0x9b06, 0x1d80, - 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900, 0xb002, 0x00ae, - 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0xb84c, 0x904d, - 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x012e, - 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, - 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, - 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, - 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, - 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, - 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x62a0, - 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, - 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, - 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0db2, 0x000e, 0x00ce, - 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, - 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, - 0xd0a4, 0x0150, 0x080c, 0x629c, 0x1138, 0x9284, 0x00ff, 0x9086, - 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, - 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, - 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, - 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0fd5, 0x2958, 0x009e, - 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6, 0x9006, - 0xb8a6, 0x080c, 0x5a3b, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, - 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, - 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, - 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, - 0x0110, 0x080c, 0x1007, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, - 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0110, - 0x080c, 0x0f87, 0x080c, 0x99d6, 0x00ce, 0x0c88, 0x00ce, 0x00de, - 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x1017, 0x00de, - 0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, - 0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, - 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, - 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, - 0x6c53, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x9940, - 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1951, - 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, - 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, - 0x6886, 0x2069, 0x1800, 0x68ae, 0x7040, 0xb85e, 0x7048, 0xb862, - 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, - 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, - 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, - 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, - 0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, - 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, - 0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, - 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, - 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, - 0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, - 0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, - 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, - 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbbc, 0xc384, 0xba00, - 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, - 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, - 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbbe, - 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, - 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, - 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, - 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, - 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, - 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0db2, 0x3c00, 0x20e8, - 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, - 0x014e, 0x013e, 0x0060, 0x080c, 0x0fd5, 0x0170, 0x2900, 0xb8a6, - 0xa803, 0x0000, 0x080c, 0x613a, 0xa807, 0x0001, 0xae12, 0x9085, - 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, - 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, - 0x080c, 0x6149, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, - 0xa806, 0x0020, 0x080c, 0x1007, 0xb8a7, 0x0000, 0x009e, 0x012e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x801d, 0x012e, 0x0005, - 0x901e, 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, - 0xb84c, 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, - 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, - 0xa870, 0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, - 0x933f, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, - 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, - 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, - 0x619e, 0x0128, 0x080c, 0xb6c3, 0x0010, 0x9085, 0x0001, 0x0005, - 0x080c, 0x619e, 0x0128, 0x080c, 0xb65d, 0x0010, 0x9085, 0x0001, - 0x0005, 0x080c, 0x619e, 0x0128, 0x080c, 0xb6c0, 0x0010, 0x9085, - 0x0001, 0x0005, 0x080c, 0x619e, 0x0128, 0x080c, 0xb681, 0x0010, - 0x9085, 0x0001, 0x0005, 0x080c, 0x619e, 0x0128, 0x080c, 0xb6ed, - 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, - 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, - 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, - 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, - 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, - 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, - 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, + 0x2001, 0x0029, 0x900e, 0x0804, 0x61a0, 0x2001, 0x0029, 0x900e, + 0x0804, 0x61a0, 0x080c, 0x35f4, 0x0804, 0x61a1, 0x080c, 0x51f4, + 0x0804, 0x61a1, 0x080c, 0x43fa, 0x0804, 0x61a1, 0x080c, 0x4871, + 0x0804, 0x61a1, 0x080c, 0x4b28, 0x0804, 0x61a1, 0x080c, 0x4e6e, + 0x0804, 0x61a1, 0x080c, 0x505f, 0x0804, 0x61a1, 0x080c, 0x380a, + 0x0804, 0x61a1, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, 0x1000, 0x2104, + 0x905d, 0x0140, 0x080c, 0x6737, 0x1148, 0x00e9, 0x080c, 0x64f8, + 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, + 0x1240, 0xb900, 0xd1fc, 0x0d88, 0x2001, 0x0029, 0x2009, 0x1000, + 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, + 0x9005, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0xb850, 0x900d, + 0x0150, 0x2900, 0x0096, 0x2148, 0xa802, 0x009e, 0xa803, 0x0000, + 0xb852, 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, + 0x0cc0, 0x0126, 0x2091, 0x8000, 0xb84c, 0x9005, 0x0170, 0x00e6, + 0x2071, 0x19e5, 0x7004, 0x9086, 0x0002, 0x0168, 0x00ee, 0xb84c, + 0xa802, 0x2900, 0xb84e, 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, + 0xa803, 0x0000, 0x0cc0, 0x701c, 0x9b06, 0x1d80, 0xb84c, 0x00a6, + 0x2050, 0xb000, 0xa802, 0x2900, 0xb002, 0x00ae, 0x00ee, 0x012e, + 0x0005, 0x0126, 0x2091, 0x8000, 0xb84c, 0x904d, 0x0130, 0xa800, + 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x012e, 0x0005, 0xb84c, + 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, + 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, + 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, 0xc284, 0xba02, + 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, + 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, + 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6733, 0x0140, 0x9284, + 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, + 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, + 0xba90, 0x82ff, 0x090c, 0x0dd5, 0x000e, 0x00ce, 0x012e, 0x00be, + 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, + 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, + 0x080c, 0x672f, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, + 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, + 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, + 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, + 0x1188, 0x0096, 0x080c, 0x1000, 0x2958, 0x009e, 0x0168, 0x2b00, + 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, + 0x080c, 0x5e12, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, 0x00de, + 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, + 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, + 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, + 0x080c, 0x1032, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168, + 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc825, 0x0110, 0x080c, + 0x0fb2, 0x080c, 0xab6b, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, + 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x1042, 0x00de, 0x9006, + 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, + 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, + 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, + 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x717d, + 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xaad5, 0x11d8, + 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1980, 0x7048, + 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, + 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, + 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, + 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8, + 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, + 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, + 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, + 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, + 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009, + 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, + 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349, + 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009, + 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, + 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, + 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, + 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbcc, 0xc384, 0xba00, 0x2009, + 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, + 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, + 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbce, 0x003e, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, + 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, + 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, + 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, + 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0dd5, 0x3c00, 0x20e8, 0x3300, + 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, + 0x013e, 0x0060, 0x080c, 0x1000, 0x0170, 0x2900, 0xb8a6, 0xa803, + 0x0000, 0x080c, 0x6589, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, + 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, + 0x6598, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, + 0x0020, 0x080c, 0x1032, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8e9c, 0x012e, 0x0005, 0x901e, + 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c, + 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120, + 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, + 0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0xa39c, + 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, + 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, + 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x65ed, + 0x0128, 0x080c, 0xc8ed, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x65ed, 0x0128, 0x080c, 0xc887, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x65ed, 0x0128, 0x080c, 0xc8ea, 0x0010, 0x9085, 0x0001, + 0x0005, 0x080c, 0x65ed, 0x0128, 0x080c, 0xc8ab, 0x0010, 0x9085, + 0x0001, 0x0005, 0x080c, 0x65ed, 0x0128, 0x080c, 0xc917, 0x0010, + 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, + 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, - 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, - 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, - 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, - 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, 0x0fd5, 0x0168, 0x2900, - 0xb8a6, 0x080c, 0x613a, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, - 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, - 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, - 0x1007, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, - 0x0005, 0x00b6, 0x00f6, 0x080c, 0x6c53, 0x01b0, 0x71bc, 0x81ff, - 0x1198, 0x71d4, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, - 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, - 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804, 0xd0a4, - 0x01d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5f7e, - 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, - 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, - 0x1f04, 0x61c5, 0x015e, 0x080c, 0x6262, 0x0120, 0x2001, 0x1954, - 0x200c, 0x0038, 0x2079, 0x1853, 0x7804, 0xd0a4, 0x0130, 0x2009, - 0x07d0, 0x2011, 0x61f0, 0x080c, 0x7cd9, 0x00fe, 0x00be, 0x0005, - 0x00b6, 0x2011, 0x61f0, 0x080c, 0x7c4a, 0x080c, 0x6262, 0x01d8, - 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, - 0x62a0, 0x0130, 0x2009, 0x07d0, 0x2011, 0x61f0, 0x080c, 0x7cd9, - 0x00e6, 0x2071, 0x1800, 0x9006, 0x7076, 0x7058, 0x707a, 0x080c, - 0x2c2b, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, - 0x0016, 0x080c, 0x5f7e, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, - 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xcfe6, 0xb800, - 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x629c, 0x2001, 0x0707, 0x1128, - 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, - 0x080c, 0x8180, 0x0076, 0x903e, 0x080c, 0x8078, 0x900e, 0x080c, - 0xcd62, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6218, 0x00ce, - 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, - 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, - 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, - 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, - 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, - 0x190c, 0x0db2, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, - 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1835, 0x2204, - 0xd0cc, 0x0138, 0x2001, 0x1952, 0x200c, 0x2011, 0x6292, 0x080c, - 0x7cd9, 0x0005, 0x2011, 0x6292, 0x080c, 0x7c4a, 0x2011, 0x1835, - 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x5113, 0xd0ac, 0x0005, - 0x080c, 0x5113, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, - 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, - 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, - 0xbcec, 0x0158, 0x70d4, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, - 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, 0x0005, - 0x2071, 0x1906, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, - 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1919, 0x2003, - 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x191a, 0x900e, 0x710a, - 0x080c, 0x5113, 0xd0fc, 0x1140, 0x080c, 0x5113, 0x900e, 0xd09c, - 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001, 0x1873, 0x200c, 0x9184, - 0x0007, 0x0002, 0x62e4, 0x62e4, 0x62e4, 0x62e4, 0x62e4, 0x62fa, - 0x6308, 0x62e4, 0x7003, 0x0003, 0x2009, 0x1874, 0x210c, 0x9184, - 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, - 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, - 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1906, 0x7028, - 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, - 0x0158, 0x080c, 0x6f9c, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, - 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, - 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, - 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, - 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1906, 0x7028, 0xc084, - 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, - 0x0005, 0xa868, 0xd0fc, 0x11d8, 0x00e6, 0x0026, 0x2001, 0x191a, - 0x2004, 0x9005, 0x0904, 0x653b, 0xa87c, 0xd0bc, 0x1904, 0x653b, - 0xa978, 0xa874, 0x9105, 0x1904, 0x653b, 0x2001, 0x191a, 0x2004, - 0x0002, 0x653b, 0x6394, 0x63d0, 0x63d0, 0x653b, 0x63d0, 0x0005, - 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x191a, 0x210c, - 0x81ff, 0x0904, 0x653b, 0xa87c, 0xd0cc, 0x0904, 0x653b, 0xa880, - 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x653b, 0x9186, 0x0003, - 0x0904, 0x63d0, 0x9186, 0x0005, 0x0904, 0x63d0, 0xa84f, 0x8021, - 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, - 0x2071, 0x1906, 0x701c, 0x9005, 0x1904, 0x66fb, 0x0e04, 0x6746, - 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, - 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x190c, 0x1167, 0x2071, 0x1800, 0x2011, 0x0001, 0xa804, - 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, 0x702e, 0x70b8, 0x9200, - 0x70ba, 0x080c, 0x7b7c, 0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, - 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, - 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1906, 0xa803, - 0x0000, 0x7010, 0x9005, 0x1904, 0x64bf, 0x782c, 0x908c, 0x0780, - 0x190c, 0x686d, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, - 0x63ee, 0x64bf, 0x6413, 0x645a, 0x080c, 0x0db2, 0x2071, 0x1800, - 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c9, 0x703c, - 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, + 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, + 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, + 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, + 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, + 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, + 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, + 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, + 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, + 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x1128, 0x080c, 0x1000, 0x0168, 0x2900, 0xb8a6, + 0x080c, 0x6589, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, + 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1032, + 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, + 0x00b6, 0x00f6, 0x080c, 0x717d, 0x01b0, 0x71c4, 0x81ff, 0x1198, + 0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, + 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, + 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0, + 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1168, + 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, + 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, + 0x6614, 0x015e, 0x080c, 0x66f5, 0x0120, 0x2001, 0x1983, 0x200c, + 0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, + 0x2011, 0x663f, 0x080c, 0x831a, 0x00fe, 0x00be, 0x0005, 0x00b6, + 0x2011, 0x663f, 0x080c, 0x8285, 0x080c, 0x66f5, 0x01d8, 0x2001, + 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6733, + 0x0130, 0x2009, 0x07d0, 0x2011, 0x663f, 0x080c, 0x831a, 0x00e6, + 0x2071, 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2e48, + 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, + 0x080c, 0x63cd, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, 0xbaa0, + 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe280, 0xb800, 0xc0e5, + 0xc0ec, 0xb802, 0x080c, 0x672f, 0x2001, 0x0707, 0x1128, 0xb804, + 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c, + 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x900e, 0x080c, 0xdfbd, + 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6667, 0x00ce, 0x015e, + 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, + 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, 0x080c, 0x1019, 0x090c, + 0x0dd5, 0x2958, 0x009e, 0x2001, 0x196b, 0x2b02, 0xb8af, 0x0000, + 0x2009, 0x00ff, 0x080c, 0x5e12, 0xb807, 0x0006, 0xb813, 0x00ff, + 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c, 0xb893, 0x0002, 0xb8bb, + 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000, 0x00ce, 0x00be, 0x0005, + 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, 0x6010, + 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, 0x0005, 0x0006, + 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff, 0x9196, 0x0006, 0x0188, + 0x9196, 0x0004, 0x0170, 0x9196, 0x0005, 0x0158, 0x908c, 0xff00, + 0x810f, 0x9196, 0x0006, 0x0128, 0x9196, 0x0004, 0x0110, 0x9196, + 0x0005, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x00f6, 0x2001, + 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, + 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, + 0x1000, 0x2204, 0x9b06, 0x190c, 0x0dd5, 0x000e, 0xba00, 0x9005, + 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, + 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1981, 0x200c, + 0x2011, 0x6725, 0x080c, 0x831a, 0x0005, 0x2011, 0x6725, 0x080c, + 0x8285, 0x2011, 0x1837, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, + 0x54b7, 0xd0ac, 0x0005, 0x080c, 0x54b7, 0xd0a4, 0x0005, 0x0016, + 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, + 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, + 0x00b6, 0x00f6, 0x080c, 0xcf18, 0x0158, 0x70dc, 0x9084, 0x0028, + 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, 0xb8cc, 0xd094, + 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910, 0x7003, 0x0001, 0x7007, + 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, + 0x2001, 0x1947, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x1948, 0x900e, 0x710a, 0x080c, 0x54b7, 0xd0fc, 0x1140, 0x080c, + 0x54b7, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001, + 0x1867, 0x200c, 0x9184, 0x0007, 0x0002, 0x6777, 0x6777, 0x6777, + 0x6777, 0x6777, 0x678d, 0x679b, 0x6777, 0x7003, 0x0003, 0x2009, + 0x1868, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, + 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, + 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, + 0x2071, 0x1910, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, + 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x74d7, 0x6a60, 0x9200, + 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, + 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, + 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, + 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, + 0x1910, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, + 0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6, 0x0026, 0x2071, 0x1948, + 0x7000, 0x9015, 0x0904, 0x6a4b, 0x9286, 0x0003, 0x0904, 0x68e1, + 0x9286, 0x0005, 0x0904, 0x68e1, 0x2071, 0x1877, 0xa87c, 0x9005, + 0x0904, 0x6842, 0x7140, 0xa868, 0x9102, 0x0a04, 0x6a4b, 0xa878, + 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001, 0x8023, 0xa84e, 0x2071, + 0x1910, 0x701c, 0x9005, 0x1904, 0x6bed, 0x0e04, 0x6c5b, 0x2071, + 0x0000, 0xa850, 0x7032, 0xa84c, 0x7082, 0xa870, 0x7086, 0xa86c, + 0x708a, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, + 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, + 0x013e, 0x01de, 0x014e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x1192, 0x0804, 0x68c4, 0xa853, 0x001b, 0x2001, + 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904, 0x6a4b, 0xa853, 0x001a, + 0x2001, 0x8024, 0x0804, 0x6806, 0x00e6, 0x0026, 0x2071, 0x1948, + 0x7000, 0x9015, 0x0904, 0x6a4b, 0x9286, 0x0003, 0x0904, 0x68e1, + 0x9286, 0x0005, 0x0904, 0x68e1, 0xa84f, 0x8022, 0xa853, 0x0018, + 0x0804, 0x68a9, 0xa868, 0xd0fc, 0x11d8, 0x00e6, 0x0026, 0x2001, + 0x1948, 0x2004, 0x9005, 0x0904, 0x6a4b, 0xa87c, 0xd0bc, 0x1904, + 0x6a4b, 0xa978, 0xa874, 0x9105, 0x1904, 0x6a4b, 0x2001, 0x1948, + 0x2004, 0x0002, 0x6a4b, 0x68a5, 0x68e1, 0x68e1, 0x6a4b, 0x68e1, + 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1948, + 0x210c, 0x81ff, 0x0904, 0x6a4b, 0xa87c, 0xd0cc, 0x0904, 0x6a4b, + 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6a4b, 0x9186, + 0x0003, 0x0904, 0x68e1, 0x9186, 0x0005, 0x0904, 0x68e1, 0xa84f, + 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, + 0x0016, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6bed, 0x0e04, + 0x6c5b, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, + 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1800, 0x2011, 0x0001, + 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x81a6, 0x002e, 0x00ee, 0x0005, 0x0096, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, + 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1910, + 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x69d0, 0x782c, 0x908c, + 0x0780, 0x190c, 0x6da7, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, + 0x0002, 0x68ff, 0x69d0, 0x6924, 0x696b, 0x080c, 0x0dd5, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19f8, + 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, + 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, + 0x70c2, 0x080c, 0x81a6, 0x0c10, 0x2071, 0x1800, 0x2900, 0x7822, + 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, + 0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, + 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, + 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x19f0, 0x2071, 0x19f8, 0x703c, + 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, - 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, - 0x080c, 0x7b7c, 0x0c10, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, - 0x900d, 0x1580, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, - 0x1148, 0x2009, 0x182e, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, - 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70b8, 0x8000, 0x70ba, 0x080c, 0x7b7c, 0x782c, 0x9094, 0x0780, - 0x190c, 0x686d, 0xd0a4, 0x19f0, 0x2071, 0x19c9, 0x703c, 0x9005, - 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, - 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, 0x080c, - 0x7b7c, 0x0800, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, - 0x702c, 0xa802, 0x2900, 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, - 0x7b7c, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, 0x1d60, - 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd09c, 0x11a0, - 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, 0x19c9, - 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, - 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, - 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, - 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c9, 0x703c, 0x9005, - 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, + 0x080c, 0x81a6, 0x0800, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, + 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, + 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, + 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, + 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, + 0x19f8, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, + 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, + 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, + 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19f8, 0x703c, + 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x81a6, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, + 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6a25, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x1198, 0x701c, + 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, + 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, + 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, + 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x1d60, 0x00ee, 0x2071, + 0x19f8, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, + 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x81a6, 0x00ee, + 0x0804, 0x69e0, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804, 0xa807, + 0x0000, 0x904d, 0x190c, 0x0fb2, 0x009e, 0x0018, 0xa868, 0xd0fc, + 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, + 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6b67, + 0x782c, 0x908c, 0x0780, 0x190c, 0x6da7, 0x8004, 0x8004, 0x8004, + 0x9084, 0x0003, 0x0002, 0x6a6a, 0x6b67, 0x6a85, 0x6af6, 0x080c, + 0x0dd5, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, + 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x81a6, 0x0c60, 0x2071, 0x1800, 0x2900, + 0x7822, 0xa804, 0x900d, 0x1904, 0x6ae5, 0x7830, 0x8007, 0x9084, + 0x001f, 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, + 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058, + 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, + 0xd0a4, 0x19f0, 0x0e04, 0x6adc, 0x7838, 0x7938, 0x910e, 0x1de0, + 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, + 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b, 0x0000, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1921, 0x200c, 0xc185, + 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x81a6, 0x0804, 0x6a98, 0x0096, 0x00e6, + 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6da7, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6b3a, 0x7838, + 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, + 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b, + 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x1170, + 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, 0x2908, + 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, + 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, - 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, - 0x70ba, 0x080c, 0x7b7c, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, + 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, + 0x70c2, 0x080c, 0x81a6, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, - 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6514, 0x782c, - 0x9094, 0x0780, 0x190c, 0x686d, 0xd09c, 0x1198, 0x701c, 0x904d, - 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, - 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd09c, - 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, 0x01b0, - 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, - 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, 0x7b7c, 0x782c, 0x9094, - 0x0780, 0x190c, 0x686d, 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x19c9, - 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, - 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, + 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6bd8, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x11b0, 0x701c, 0x904d, + 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, + 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6da7, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6da7, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x1d60, + 0x00ee, 0x0e04, 0x6bd1, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, + 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, + 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x1192, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, + 0x080c, 0x81a6, 0x00ee, 0x0804, 0x6b77, 0x2071, 0x1910, 0xa803, + 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, + 0x1e04, 0x6c18, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, - 0x702e, 0x70b8, 0x9200, 0x70ba, 0x080c, 0x7b7c, 0x00ee, 0x0804, - 0x64cf, 0xa868, 0xd0fc, 0x1904, 0x6577, 0x0096, 0xa804, 0xa807, - 0x0000, 0x904d, 0x190c, 0x0f87, 0x009e, 0x0018, 0xa868, 0xd0fc, - 0x15f0, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, - 0x2071, 0x1800, 0x70e4, 0x8001, 0x01d0, 0x1678, 0x2071, 0x1906, - 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6675, 0x782c, 0x908c, - 0x0780, 0x190c, 0x686d, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, - 0x0002, 0x6578, 0x6675, 0x6593, 0x6604, 0x080c, 0x0db2, 0x70e7, - 0x0fa0, 0x71e0, 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, - 0x9205, 0x70e2, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, - 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0888, 0x70e6, 0x0878, 0x0005, - 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, - 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, - 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, - 0x080c, 0x7b7c, 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, - 0x900d, 0x1904, 0x65f3, 0x7830, 0x8007, 0x9084, 0x001f, 0x9082, - 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, - 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182e, 0x210c, - 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, - 0x702c, 0xa802, 0x2900, 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, - 0x7b7c, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, 0x19f0, - 0x0e04, 0x65ea, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, - 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1917, 0x200c, - 0xc184, 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x1167, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x2001, 0x1917, 0x200c, 0xc185, 0x2102, 0x00fe, - 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, - 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, - 0x080c, 0x7b7c, 0x0804, 0x65a6, 0x0096, 0x00e6, 0x7824, 0x2048, - 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70b8, 0x8000, - 0x70ba, 0x080c, 0x7b7c, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, - 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6648, 0x7838, 0x7938, 0x910e, - 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, - 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x190c, 0x1167, 0x2009, 0x1919, 0x200b, 0x0000, 0x782c, - 0x9094, 0x0780, 0x190c, 0x686d, 0xd09c, 0x1170, 0x009e, 0x2900, - 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, 0x2908, 0x7010, 0x8000, - 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, - 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, - 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, 0x080c, - 0x7b7c, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, - 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, - 0x2148, 0xa804, 0x900d, 0x1904, 0x66e6, 0x782c, 0x9094, 0x0780, - 0x190c, 0x686d, 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, - 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, - 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, - 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, - 0x05c8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, 0x7b7c, 0x782c, - 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, - 0x66df, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, - 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, 0x2009, - 0x1919, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, - 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, - 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x702e, 0x70b8, 0x9200, 0x70ba, 0x080c, 0x7b7c, - 0x00ee, 0x0804, 0x6685, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x81a6, 0x0e04, 0x6c02, + 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071, + 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, + 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1910, 0x080c, + 0x6d93, 0x002e, 0x00ee, 0x0005, 0xa850, 0x9082, 0x001c, 0x1e68, + 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, + 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, + 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, - 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, 0x1e04, 0x6726, - 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, - 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70b8, - 0x9200, 0x70ba, 0x080c, 0x7b7c, 0x0e04, 0x6710, 0x2071, 0x1906, - 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, - 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, 0x2071, - 0x1906, 0x080c, 0x6859, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1906, - 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, - 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, - 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70b8, 0x9200, 0x70ba, 0x080c, 0x7b7c, 0x002e, 0x00ee, 0x0005, - 0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, - 0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, - 0x1906, 0x7004, 0x0002, 0x6791, 0x6792, 0x6858, 0x6792, 0x0db2, - 0x6858, 0x0005, 0x2001, 0x191a, 0x2004, 0x0002, 0x679c, 0x679c, - 0x67f1, 0x67f2, 0x679c, 0x67f2, 0x0126, 0x2091, 0x8000, 0x1e0c, - 0x6878, 0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, 0x0e04, - 0x67c0, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, - 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x1167, 0x2071, 0x1906, 0x080c, 0x6859, - 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, - 0x686d, 0xd09c, 0x2071, 0x1906, 0x1510, 0x2071, 0x1906, 0x700f, - 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, - 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, - 0x0050, 0x6822, 0x00de, 0x2071, 0x1906, 0x701c, 0x2048, 0x7010, - 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, - 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19c9, 0x683c, 0x9005, - 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1813, 0x2004, - 0x2009, 0x1a8b, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, - 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, 0x6824, - 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1167, - 0x2069, 0x19c9, 0x683f, 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, - 0x8000, 0x1e0c, 0x68e9, 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, - 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1906, - 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, - 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, - 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, 0x7010, 0x8001, - 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, - 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, 0x0160, 0x7010, - 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, - 0x080c, 0x1007, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, - 0x686f, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, 0x0dbb, - 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01e0, 0xc084, - 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, - 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x1167, 0x2009, 0x1919, 0x200b, 0x0000, - 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, - 0x0db8, 0x2009, 0x1919, 0x2104, 0x8000, 0x200a, 0x9082, 0x000f, - 0x0e78, 0x00e6, 0x2071, 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, - 0x712c, 0xd19c, 0x1148, 0x2009, 0x182e, 0x210c, 0x918a, 0x0040, - 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70b8, 0x8000, 0x70ba, 0x080c, 0x7b7c, 0x782c, - 0x9094, 0x0780, 0x190c, 0x686d, 0xd0a4, 0x19f0, 0x7838, 0x7938, - 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, - 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x1167, 0x2009, 0x1919, 0x200b, 0x0000, 0x00ee, 0x00fe, 0x009e, - 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8, 0xc084, - 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, - 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x1167, 0x00fe, 0x0005, 0x782c, 0x9094, - 0x0780, 0x190c, 0x686d, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, - 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70b8, 0x8000, - 0x70ba, 0x080c, 0x7b7c, 0x782c, 0x9094, 0x0780, 0x190c, 0x686d, - 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x191a, - 0x6808, 0x690a, 0x2069, 0x19c9, 0x9102, 0x1118, 0x683c, 0x9005, - 0x1328, 0x2001, 0x191b, 0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x7090, 0x908a, 0x0029, 0x1a0c, 0x0db2, 0x9082, - 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x6a0d, 0x6997, 0x69b3, - 0x69db, 0x69fc, 0x6a3c, 0x6a4e, 0x69b3, 0x6a24, 0x6952, 0x6980, - 0x6951, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, - 0x6808, 0x9005, 0x1518, 0x7093, 0x0028, 0x2069, 0x195e, 0x2d04, - 0x7002, 0x080c, 0x6d8d, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, - 0x7093, 0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x6028, 0x9085, - 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a31, - 0x080c, 0x1872, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, - 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, - 0x1160, 0x7093, 0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, - 0x6e17, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, - 0x2001, 0x0090, 0x080c, 0x2987, 0x000e, 0x6124, 0xd1e4, 0x1190, - 0x080c, 0x6abb, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, - 0x7093, 0x0020, 0x080c, 0x6abb, 0x0028, 0x7093, 0x001d, 0x0010, - 0x7093, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2987, 0x6124, - 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, - 0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6c7f, - 0x2001, 0x0080, 0x080c, 0x2987, 0x7093, 0x0028, 0x0058, 0x7093, - 0x001e, 0x0040, 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, - 0x7093, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, - 0x080c, 0x6c7f, 0x2001, 0x0080, 0x080c, 0x2987, 0x6124, 0xd1d4, - 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, - 0x7093, 0x0028, 0x0040, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, - 0x0010, 0x7093, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x2987, - 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x189c, 0x7093, - 0x001e, 0x0010, 0x7093, 0x001d, 0x0005, 0x080c, 0x6b3e, 0x6124, - 0xd1dc, 0x1188, 0x080c, 0x6abb, 0x0016, 0x080c, 0x189c, 0x001e, - 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7093, 0x001e, 0x0020, 0x7093, - 0x001f, 0x080c, 0x6abb, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, - 0x2987, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, - 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, - 0x0010, 0x7093, 0x0021, 0x0005, 0x080c, 0x6b3e, 0x6124, 0xd1d4, - 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, - 0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005, 0x0006, 0x2001, - 0x0090, 0x080c, 0x2987, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, - 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7093, 0x001e, 0x0040, - 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, 0x7093, 0x001f, - 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, - 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x6c53, - 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, - 0x6027, 0x0200, 0x080c, 0x28d0, 0x6024, 0xd0cc, 0x0148, 0x2001, - 0x00a0, 0x080c, 0x2987, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x0428, - 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6c6d, 0x0150, 0x080c, - 0x6c64, 0x1138, 0x2001, 0x0001, 0x080c, 0x247f, 0x080c, 0x6c2d, - 0x00a0, 0x080c, 0x6b3b, 0x0178, 0x2001, 0x0001, 0x080c, 0x247f, - 0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022, 0x1118, - 0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee, 0x00de, - 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x6acc, 0x080c, 0x7d1b, - 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x6acc, 0x080c, - 0x7d12, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, - 0x8fbb, 0x2071, 0x1800, 0x080c, 0x6a69, 0x001e, 0x00fe, 0x00ee, - 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x0126, 0x080c, 0x8fbb, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, - 0x080c, 0x92ec, 0x2011, 0x0002, 0x080c, 0x92f6, 0x080c, 0x91de, - 0x080c, 0x7cc7, 0x0036, 0x901e, 0x080c, 0x9254, 0x003e, 0x60e3, - 0x0000, 0x080c, 0xd343, 0x080c, 0xd35e, 0x2009, 0x0004, 0x080c, - 0x28d6, 0x080c, 0x27f1, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, - 0x0008, 0x2011, 0x6acc, 0x080c, 0x7d1b, 0x080c, 0x6c6d, 0x0118, - 0x9006, 0x080c, 0x2987, 0x080c, 0x0b94, 0x2001, 0x0001, 0x080c, - 0x247f, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, - 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x6ad9, 0x2071, 0x19c9, - 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, - 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, - 0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2987, - 0x0156, 0x20a9, 0x002d, 0x1d04, 0x6b4b, 0x2091, 0x6000, 0x1f04, - 0x6b4b, 0x015e, 0x00d6, 0x2069, 0x1800, 0x6894, 0x8001, 0x0220, - 0x0118, 0x6896, 0x00de, 0x0005, 0x6897, 0x0014, 0x68e0, 0xd0dc, - 0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x7d27, 0x0c90, - 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0x1800, 0x080c, 0x6f39, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, - 0x7092, 0x60e2, 0x6886, 0x080c, 0x254a, 0x9006, 0x080c, 0x2987, - 0x080c, 0x58e0, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, - 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, - 0x0140, 0x2071, 0x1800, 0x2001, 0x194e, 0x200c, 0x9186, 0x0000, - 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, - 0x0003, 0x0158, 0x0804, 0x6c1d, 0x7093, 0x0022, 0x0040, 0x7093, - 0x0021, 0x0028, 0x7093, 0x0023, 0x0010, 0x7093, 0x0024, 0x60e3, - 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x254a, 0x0026, - 0x080c, 0x9947, 0x002e, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, - 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, - 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, - 0xbcec, 0x0118, 0x9006, 0x080c, 0x29b1, 0x0804, 0x6c29, 0x6800, - 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x28d0, 0x6904, 0xd1d4, - 0x1140, 0x2001, 0x0100, 0x080c, 0x2987, 0x1f04, 0x6bca, 0x080c, - 0x6caa, 0x012e, 0x015e, 0x080c, 0x6c64, 0x01a8, 0x6044, 0x9005, - 0x0168, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x6caa, - 0x9006, 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, - 0x1110, 0x080c, 0x6caa, 0x080c, 0xbcec, 0x0118, 0x9006, 0x080c, - 0x29b1, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, - 0x00c8, 0x2011, 0x6ad9, 0x080c, 0x7cd9, 0x002e, 0x001e, 0x080c, - 0x7b73, 0x2001, 0x194e, 0x2003, 0x0004, 0x080c, 0x693a, 0x080c, - 0x6c64, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, - 0x6f2f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, - 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7b7c, - 0x080c, 0x6f39, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7092, - 0x60e2, 0x6886, 0x080c, 0x254a, 0x9006, 0x080c, 0x2987, 0x6043, - 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, - 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004, 0x9086, - 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5117, 0x9084, 0x0030, - 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x5117, 0x9084, - 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, 0x5117, - 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, 0x080c, - 0x5117, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, 0x0036, - 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, 0x0020, - 0x080c, 0x256a, 0x900e, 0x0028, 0x080c, 0x629c, 0x1dc8, 0x2009, - 0x0002, 0x2019, 0x0028, 0x080c, 0x2dfb, 0x9006, 0x0019, 0x001e, - 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, - 0xbce5, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, - 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, - 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138, 0x6050, 0x9084, - 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, 0x1d04, - 0x6cbf, 0x2091, 0x6000, 0x1f04, 0x6cbf, 0x602f, 0x0100, 0x602f, - 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x613a, - 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e, - 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, - 0x0001, 0x2001, 0x0001, 0x080c, 0x254a, 0x2001, 0x00a0, 0x0006, - 0x080c, 0xbcec, 0x000e, 0x0130, 0x080c, 0x29a5, 0x9006, 0x080c, - 0x29b1, 0x0010, 0x080c, 0x2987, 0x000e, 0x6052, 0x6050, 0x0006, - 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2845, 0x00fe, - 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, + 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, + 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, + 0x080c, 0x81a6, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, + 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, + 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1910, 0x7004, 0x0002, + 0x6ca6, 0x6ca7, 0x6d92, 0x6ca7, 0x0dd5, 0x6d92, 0x0005, 0x2001, + 0x1948, 0x2004, 0x0002, 0x6cb1, 0x6cb1, 0x6d2b, 0x6d2c, 0x6cb1, + 0x6d2c, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6db2, 0x701c, 0x904d, + 0x0508, 0xa84c, 0x9005, 0x0904, 0x6cfc, 0x0e04, 0x6cda, 0xa94c, + 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, + 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1910, + 0x080c, 0x6d93, 0x012e, 0x0804, 0x6d2a, 0xa850, 0x9082, 0x001c, + 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, + 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, + 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, 0x005b, 0x2004, 0x9094, + 0x0780, 0x190c, 0x6da7, 0xd09c, 0x2071, 0x1910, 0x1510, 0x2071, + 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, + 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, + 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1910, 0x701c, + 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, + 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19f8, + 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, + 0x1815, 0x2004, 0x2009, 0x1abf, 0x210c, 0x9102, 0x1500, 0x0126, + 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, + 0x0e04, 0x6d5e, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, + 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x1192, 0x2069, 0x19f8, 0x683f, 0xffff, 0x012e, 0x00de, + 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6e23, 0x701c, 0x904d, 0x0540, + 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, + 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, + 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, + 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, + 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, + 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, + 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, + 0x701a, 0x012e, 0x080c, 0x1032, 0x0005, 0x012e, 0x0005, 0x2091, + 0x8000, 0x0e04, 0x6da9, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, + 0x0804, 0x0dde, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, + 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, + 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, + 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, + 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, 0x2104, 0x8000, 0x200a, + 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, 0x7824, 0x00e6, + 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, + 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, + 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x19f0, + 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, + 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b, 0x0000, 0x00ee, + 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, + 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, + 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x00fe, 0x0005, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x0db8, 0x00e6, + 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6da7, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, + 0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x19f8, 0x9102, 0x1118, + 0x683c, 0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e, + 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c, + 0x0dd5, 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x6f47, + 0x6ed1, 0x6eed, 0x6f15, 0x6f36, 0x6f76, 0x6f88, 0x6eed, 0x6f5e, + 0x6e8c, 0x6eba, 0x6e8b, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, + 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x709b, 0x0028, 0x2069, + 0x198d, 0x2d04, 0x7002, 0x080c, 0x72b7, 0x6028, 0x9085, 0x0600, + 0x602a, 0x00b0, 0x709b, 0x0028, 0x2069, 0x198d, 0x2d04, 0x7002, + 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, + 0x2071, 0x1a60, 0x080c, 0x19ff, 0x005e, 0x004e, 0x003e, 0x00ee, + 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, + 0x6808, 0x9005, 0x1160, 0x709b, 0x0028, 0x2069, 0x198d, 0x2d04, + 0x7002, 0x080c, 0x7352, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, + 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2ba1, 0x000e, 0x6124, + 0xd1e4, 0x1190, 0x080c, 0x6ff5, 0xd1d4, 0x1160, 0xd1dc, 0x1138, + 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c, 0x6ff5, 0x0028, 0x709b, + 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, + 0x2ba1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, + 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, + 0x080c, 0x71a9, 0x2001, 0x0080, 0x080c, 0x2ba1, 0x709b, 0x0028, + 0x0058, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, + 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, + 0xc0b4, 0x600e, 0x080c, 0x71a9, 0x2001, 0x0080, 0x080c, 0x2ba1, + 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, + 0x1e00, 0x1158, 0x709b, 0x0028, 0x0040, 0x709b, 0x001e, 0x0028, + 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x00a0, + 0x080c, 0x2ba1, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, + 0x1a29, 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, 0x080c, + 0x7078, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6ff5, 0x0016, 0x080c, + 0x1a29, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, 0x001e, + 0x0020, 0x709b, 0x001f, 0x080c, 0x6ff5, 0x0005, 0x0006, 0x2001, + 0x00a0, 0x080c, 0x2ba1, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, + 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, + 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, 0x7078, + 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, + 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, + 0x0006, 0x2001, 0x0090, 0x080c, 0x2ba1, 0x000e, 0x6124, 0xd1d4, + 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x709b, + 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, + 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, + 0x080c, 0x717d, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, + 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2aea, 0x6024, 0xd0cc, + 0x0148, 0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c, + 0x5df8, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x7197, + 0x0150, 0x080c, 0x718e, 0x1138, 0x2001, 0x0001, 0x080c, 0x269c, + 0x080c, 0x7155, 0x00a0, 0x080c, 0x7075, 0x0178, 0x2001, 0x0001, + 0x080c, 0x269c, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, + 0x0022, 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, + 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x7006, + 0x080c, 0x835c, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, + 0x7006, 0x080c, 0x8353, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, + 0x0016, 0x080c, 0x9ffc, 0x2071, 0x1800, 0x080c, 0x6fa3, 0x001e, + 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, + 0x00e6, 0x00f6, 0x0126, 0x080c, 0x9ffc, 0x2061, 0x0100, 0x2069, + 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, + 0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353, + 0x080c, 0xa236, 0x080c, 0x8308, 0x0036, 0x901e, 0x080c, 0xa2ac, + 0x003e, 0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c, 0xe6a7, 0x2009, + 0x0004, 0x080c, 0x2af0, 0x080c, 0x2a0b, 0x2001, 0x1800, 0x2003, + 0x0004, 0x6027, 0x0008, 0x2011, 0x7006, 0x080c, 0x835c, 0x080c, + 0x7197, 0x0118, 0x9006, 0x080c, 0x2ba1, 0x080c, 0x0bae, 0x2001, + 0x0001, 0x080c, 0x269c, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x7013, + 0x2071, 0x19f8, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, + 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, + 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x0170, 0x2001, 0x00c0, + 0x080c, 0x2ba1, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x7085, 0x2091, + 0x6000, 0x1f04, 0x7085, 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7474, + 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, + 0x080c, 0x2764, 0x9006, 0x080c, 0x2ba1, 0x080c, 0x5cb7, 0x6027, + 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, - 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c, 0xc1c5, - 0x2102, 0x0804, 0x6d7f, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, - 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, 0x0090, - 0x080c, 0x2987, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, 0x1d04, - 0x6d2c, 0x2091, 0x6000, 0x1f04, 0x6d2c, 0x2011, 0x0003, 0x080c, - 0x92ec, 0x2011, 0x0002, 0x080c, 0x92f6, 0x080c, 0x91de, 0x901e, - 0x080c, 0x9254, 0x2001, 0x00a0, 0x080c, 0x2987, 0x080c, 0x6f2a, - 0x080c, 0x5a21, 0x080c, 0xbcec, 0x0110, 0x080c, 0x0d27, 0x9085, - 0x0001, 0x0498, 0x86ff, 0x1110, 0x080c, 0x189c, 0x60e3, 0x0000, - 0x2001, 0x193e, 0x2004, 0x080c, 0x254a, 0x60e2, 0x2001, 0x0080, - 0x080c, 0x2987, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, - 0x080c, 0x28d0, 0x6024, 0x910c, 0x0138, 0x1d04, 0x6d64, 0x2091, - 0x6000, 0x1f04, 0x6d64, 0x0808, 0x6028, 0x9085, 0x1e00, 0x602a, - 0x70ac, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, - 0xbcec, 0x0110, 0x080c, 0x0d27, 0x9006, 0x00ee, 0x00de, 0x00ce, - 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, - 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, - 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, - 0x1904, 0x6de1, 0x2001, 0x0088, 0x080c, 0x2987, 0x9006, 0x60e2, - 0x6886, 0x080c, 0x254a, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, - 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, - 0x0400, 0x2069, 0x195e, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, - 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6dc3, 0x2091, 0x6000, 0x1f04, - 0x6dc3, 0x0804, 0x6e0f, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, - 0x1e00, 0x2009, 0x1e00, 0x080c, 0x28d0, 0x6024, 0x910c, 0x0508, - 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x6dcf, 0x2091, 0x6000, 0x1f04, - 0x6dcf, 0x2011, 0x0003, 0x080c, 0x92ec, 0x2011, 0x0002, 0x080c, - 0x92f6, 0x080c, 0x91de, 0x901e, 0x080c, 0x9254, 0x2001, 0x00a0, - 0x080c, 0x2987, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x9085, 0x0001, - 0x00b0, 0x2001, 0x0080, 0x080c, 0x2987, 0x2069, 0x0140, 0x60e3, - 0x0000, 0x70ac, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, - 0x2001, 0x193e, 0x2004, 0x080c, 0x254a, 0x60e2, 0x9006, 0x00ee, + 0x2001, 0x197d, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, + 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, + 0x7145, 0x709b, 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, + 0x0023, 0x0010, 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, + 0x2001, 0x0001, 0x080c, 0x2764, 0x0026, 0x080c, 0xaadc, 0x002e, + 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, + 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, + 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xcf18, 0x0118, 0x9006, + 0x080c, 0x2bcb, 0x0804, 0x7151, 0x6800, 0x9084, 0x00a1, 0xc0bd, + 0x6802, 0x080c, 0x2aea, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, + 0x080c, 0x2ba1, 0x1f04, 0x70ef, 0x080c, 0x71d4, 0x012e, 0x015e, + 0x080c, 0x718e, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, 0x0006, + 0x9085, 0x0020, 0x6052, 0x080c, 0x71d4, 0x9006, 0x8001, 0x1df0, + 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x71d4, + 0x080c, 0xcf18, 0x0118, 0x9006, 0x080c, 0x2bcb, 0x0016, 0x0026, + 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x7013, + 0x080c, 0x831a, 0x002e, 0x001e, 0x080c, 0x819d, 0x7034, 0xc085, + 0x7036, 0x2001, 0x197d, 0x2003, 0x0004, 0x080c, 0x6e74, 0x080c, + 0x718e, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, + 0x746a, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x81b4, + 0x080c, 0x81a6, 0x080c, 0x7474, 0x2001, 0x196d, 0x2003, 0x0000, + 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x2764, 0x9006, 0x080c, + 0x2ba1, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, + 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c, + 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x54bb, + 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, + 0x54bb, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, + 0x080c, 0x54bb, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, + 0x0006, 0x080c, 0x54bb, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, + 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, + 0x0180, 0x0020, 0x080c, 0x2784, 0x900e, 0x0028, 0x080c, 0x672f, + 0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x3039, 0x9006, + 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, + 0x0130, 0x080c, 0xcf11, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, + 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, + 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138, + 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, + 0x0012, 0x1d04, 0x71e9, 0x2091, 0x6000, 0x1f04, 0x71e9, 0x602f, + 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, + 0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, + 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, + 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2764, 0x2001, + 0x00a0, 0x0006, 0x080c, 0xcf18, 0x000e, 0x0130, 0x080c, 0x2bbf, + 0x9006, 0x080c, 0x2bcb, 0x0010, 0x080c, 0x2ba1, 0x000e, 0x6052, + 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, + 0x2a5f, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, + 0x200c, 0xc1c5, 0x2102, 0x0804, 0x72a9, 0x2001, 0x180c, 0x200c, + 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, + 0x2001, 0x0090, 0x080c, 0x2ba1, 0x20a9, 0x0366, 0x6024, 0xd0cc, + 0x1518, 0x1d04, 0x7256, 0x2091, 0x6000, 0x1f04, 0x7256, 0x2011, + 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353, 0x080c, + 0xa236, 0x901e, 0x080c, 0xa2ac, 0x2001, 0x00a0, 0x080c, 0x2ba1, + 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0xcf18, 0x0110, 0x080c, + 0x0d45, 0x9085, 0x0001, 0x0498, 0x86ff, 0x1110, 0x080c, 0x1a29, + 0x60e3, 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764, 0x60e2, + 0x2001, 0x0080, 0x080c, 0x2ba1, 0x20a9, 0x0366, 0x6027, 0x1e00, + 0x2009, 0x1e00, 0x080c, 0x2aea, 0x6024, 0x910c, 0x0138, 0x1d04, + 0x728e, 0x2091, 0x6000, 0x1f04, 0x728e, 0x0808, 0x6028, 0x9085, + 0x1e00, 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x080c, 0xcf18, 0x0110, 0x080c, 0x0d45, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, - 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, - 0x080c, 0x92ec, 0x2011, 0x0002, 0x080c, 0x92f6, 0x080c, 0x91de, - 0x901e, 0x080c, 0x9254, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, - 0x2987, 0x080c, 0x6f2a, 0x080c, 0x5a21, 0x0804, 0x6eaa, 0x2001, - 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6ac1, - 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x2987, 0x60e3, 0x0000, - 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, - 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195e, - 0x7000, 0x206a, 0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6eaa, - 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x28d0, 0x6024, 0x910c, - 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x6e68, 0x0006, 0x0016, - 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7bae, 0x00ee, 0x00de, 0x00ce, - 0x001e, 0x000e, 0x00e6, 0x2071, 0x19c9, 0x7018, 0x00ee, 0x9005, - 0x19f8, 0x0500, 0x0026, 0x2011, 0x6ad9, 0x080c, 0x7c4a, 0x2011, - 0x6acc, 0x080c, 0x7d1b, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, - 0x70ac, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, - 0x193e, 0x2004, 0x080c, 0x254a, 0x60e2, 0x2001, 0x180c, 0x200c, - 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, - 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, - 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbce5, 0x1904, - 0x6f18, 0x7130, 0xd184, 0x1170, 0x080c, 0x2f86, 0x0138, 0xc18d, - 0x7132, 0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, - 0x0904, 0x6f18, 0x2011, 0x1854, 0x220c, 0xd1a4, 0x0538, 0x0016, - 0x2019, 0x000e, 0x080c, 0xcf62, 0x0156, 0x00b6, 0x20a9, 0x007f, - 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, - 0x5f7e, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, - 0xcfe6, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x7e3e, 0x001e, - 0x8108, 0x1f04, 0x6ee1, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, - 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2dfb, 0x001e, - 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5f7e, - 0x1110, 0x080c, 0x5a3b, 0x8108, 0x1f04, 0x6f0e, 0x00be, 0x015e, - 0x080c, 0x189c, 0x080c, 0x9947, 0x60e3, 0x0000, 0x080c, 0x5a21, - 0x080c, 0x6b8a, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, - 0x015e, 0x0005, 0x2001, 0x194e, 0x2003, 0x0001, 0x0005, 0x2001, - 0x194e, 0x2003, 0x0000, 0x0005, 0x2001, 0x194d, 0x2003, 0xaaaa, - 0x0005, 0x2001, 0x194d, 0x2003, 0x0000, 0x0005, 0x2071, 0x18f0, - 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x0fee, 0x090c, 0x0db2, - 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x0fee, 0x090c, 0x0db2, - 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, - 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, - 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, - 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, - 0x7016, 0x6850, 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, - 0x700e, 0x6840, 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, - 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, - 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, - 0x2102, 0x00d6, 0x2069, 0x18f0, 0x6807, 0x0001, 0x00de, 0x080c, - 0x74e5, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, - 0x8003, 0x2011, 0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, - 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x6fa0, 0x015e, 0x0005, 0x2079, - 0x0040, 0x2071, 0x18f0, 0x7004, 0x0002, 0x6fbf, 0x6fc0, 0x6ff7, - 0x7052, 0x714d, 0x6fbd, 0x6fbd, 0x7177, 0x080c, 0x0db2, 0x0005, - 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x7571, 0xd0a4, - 0x01f0, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, - 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, - 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, - 0x0007, 0x0128, 0x9186, 0x0003, 0x19e8, 0x080c, 0x7052, 0x782c, - 0xd09c, 0x090c, 0x74e5, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, - 0x003b, 0x0c18, 0x080c, 0x7088, 0x0c90, 0x00e3, 0x08f0, 0x0005, - 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, - 0x70aa, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7088, 0x7088, 0x7088, 0x7088, 0x7094, 0x7088, 0x724c, 0x7088, - 0x7088, 0x7088, 0x7088, 0x7088, 0x7094, 0x728d, 0x72ce, 0x7315, - 0x7329, 0x7088, 0x7088, 0x70aa, 0x7094, 0x7088, 0x7088, 0x7121, - 0x73d4, 0x73ef, 0x7088, 0x70aa, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7117, 0x73ef, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7088, 0x7088, 0x7088, 0x70be, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7088, 0x7088, 0x7088, 0x7088, 0x7088, 0x7515, 0x7088, 0x7088, - 0x7088, 0x7088, 0x7088, 0x70d2, 0x7088, 0x7088, 0x7088, 0x7088, - 0x7088, 0x7088, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, - 0x782c, 0x080c, 0x750e, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, - 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, - 0x002b, 0x0c50, 0x00e9, 0x080c, 0x74e5, 0x0005, 0x7088, 0x7094, - 0x7238, 0x7088, 0x7094, 0x7088, 0x7094, 0x7094, 0x7088, 0x7094, - 0x7238, 0x7094, 0x7094, 0x7094, 0x7094, 0x7094, 0x7088, 0x7094, - 0x7238, 0x7088, 0x7088, 0x7094, 0x7088, 0x7088, 0x7088, 0x7094, - 0x00e6, 0x2071, 0x18f0, 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, - 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, - 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, - 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6536, - 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, - 0x1120, 0x7007, 0x0001, 0x0804, 0x71f6, 0x7007, 0x0003, 0x7012, - 0x2900, 0x7016, 0x701a, 0x704b, 0x71f6, 0x0005, 0xa864, 0x8007, - 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, - 0x7211, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, - 0x7211, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, - 0x1904, 0x7090, 0x7007, 0x0001, 0x2009, 0x1832, 0x210c, 0x81ff, + 0x2071, 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, + 0x2004, 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a76, + 0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, + 0x0120, 0x6884, 0x9005, 0x1904, 0x731c, 0x2001, 0x0088, 0x080c, + 0x2ba1, 0x9006, 0x60e2, 0x6886, 0x080c, 0x2764, 0x2069, 0x0200, + 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, + 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, 0x198d, 0x7000, 0x206a, + 0x709b, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x72fe, + 0x2091, 0x6000, 0x1f04, 0x72fe, 0x0804, 0x734a, 0x2069, 0x0140, + 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2aea, + 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x730a, + 0x2091, 0x6000, 0x1f04, 0x730a, 0x2011, 0x0003, 0x080c, 0xa349, + 0x2011, 0x0002, 0x080c, 0xa353, 0x080c, 0xa236, 0x901e, 0x080c, + 0xa2ac, 0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c, + 0x5df8, 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2ba1, + 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, + 0x0001, 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764, + 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, + 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, + 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, + 0x01c8, 0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, + 0xa353, 0x080c, 0xa236, 0x901e, 0x080c, 0xa2ac, 0x2069, 0x0140, + 0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c, 0x5df8, + 0x0804, 0x73e5, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, + 0x2102, 0x080c, 0x6ffb, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, + 0x2ba1, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, + 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, + 0x0200, 0x2069, 0x198d, 0x7000, 0x206a, 0x709b, 0x0027, 0x7003, + 0x0001, 0x0804, 0x73e5, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, + 0x2aea, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, + 0x73a3, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x81e5, + 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19f8, + 0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500, 0x0026, 0x2011, 0x7013, + 0x080c, 0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x002e, 0x2069, + 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, + 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764, 0x60e2, + 0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, + 0x080c, 0xcf11, 0x1904, 0x7453, 0x7130, 0xd184, 0x1170, 0x080c, + 0x31c4, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, + 0x1120, 0x7030, 0xd08c, 0x0904, 0x7453, 0x2011, 0x1848, 0x220c, + 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe1f4, 0x0156, + 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, + 0x0080, 0x0188, 0x080c, 0x63cd, 0x1170, 0x2120, 0x9006, 0x0016, + 0x2009, 0x000e, 0x080c, 0xe280, 0x2009, 0x0001, 0x2011, 0x0100, + 0x080c, 0x846c, 0x001e, 0x8108, 0x1f04, 0x741c, 0x00be, 0x015e, + 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, + 0x080c, 0x3039, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, + 0x900e, 0x080c, 0x63cd, 0x1110, 0x080c, 0x5e12, 0x8108, 0x1f04, + 0x7449, 0x00be, 0x015e, 0x080c, 0x1a29, 0x080c, 0xaadc, 0x60e3, + 0x0000, 0x080c, 0x5df8, 0x080c, 0x70af, 0x00ee, 0x00ce, 0x004e, + 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197d, 0x2003, + 0x0001, 0x0005, 0x2001, 0x197d, 0x2003, 0x0000, 0x0005, 0x2001, + 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197c, 0x2003, 0x0000, + 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, + 0x1019, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, + 0x1019, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, + 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, + 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101, + 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854, 0x7006, + 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110, 0x7012, + 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, + 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, + 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x18fa, 0x6807, + 0x0001, 0x00de, 0x080c, 0x7a51, 0x9006, 0x00ee, 0x0005, 0x900e, + 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, 0x0100, 0x2214, 0x9296, + 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x74db, + 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002, + 0x74fa, 0x74fb, 0x7532, 0x758d, 0x769d, 0x74f8, 0x74f8, 0x76c7, + 0x080c, 0x0dd5, 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, + 0x190c, 0x7b33, 0xd0a4, 0x01f0, 0x7824, 0x2048, 0x9006, 0xa802, + 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, + 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, + 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x19e8, + 0x080c, 0x758d, 0x782c, 0xd09c, 0x090c, 0x7a51, 0x0005, 0x9082, + 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, 0x75c3, 0x0c90, + 0x00e3, 0x08f0, 0x0005, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75e5, 0x75c3, 0x75c3, 0x75c3, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75cf, + 0x75c3, 0x77b8, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75cf, + 0x77f9, 0x783a, 0x7881, 0x7895, 0x75c3, 0x75c3, 0x75e5, 0x75cf, + 0x75f9, 0x75c3, 0x7671, 0x7940, 0x795b, 0x75c3, 0x75e5, 0x75c3, + 0x75f9, 0x75c3, 0x75c3, 0x7667, 0x795b, 0x75c3, 0x75c3, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x760d, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, + 0x7ad7, 0x75c3, 0x7a81, 0x75c3, 0x7a81, 0x75c3, 0x7622, 0x75c3, + 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x2079, 0x0040, 0x7004, + 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7a7a, 0xd0a4, 0x0170, + 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, + 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7a51, + 0x0005, 0x75c3, 0x75cf, 0x77a4, 0x75c3, 0x75cf, 0x75c3, 0x75cf, + 0x75cf, 0x75c3, 0x75cf, 0x77a4, 0x75cf, 0x75cf, 0x75cf, 0x75cf, + 0x75cf, 0x75c3, 0x75cf, 0x77a4, 0x75c3, 0x75c3, 0x75cf, 0x75c3, + 0x75c3, 0x75c3, 0x75cf, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, + 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, + 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, + 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6a46, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, + 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7746, + 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7746, + 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, + 0x7007, 0x0001, 0x0804, 0x7761, 0x7007, 0x0003, 0x7012, 0x2900, + 0x7016, 0x701a, 0x704b, 0x7761, 0x0005, 0xa864, 0x8007, 0x9084, + 0x00ff, 0x0904, 0x75cb, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, + 0x777d, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, + 0x777d, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x75cb, 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, - 0x5c50, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, - 0xa87a, 0xa982, 0x080c, 0x6536, 0x012e, 0x0ca0, 0xa994, 0x9186, + 0x608c, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, + 0xa87a, 0xa982, 0x080c, 0x6a46, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, - 0x7406, 0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, + 0x7972, 0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, - 0x0401, 0x1a04, 0x7098, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7098, - 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x71b4, - 0x0018, 0x9280, 0x71aa, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, - 0x7195, 0x080c, 0x0fee, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, + 0x0401, 0x1a04, 0x75d3, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x75d3, + 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7704, + 0x0018, 0x9280, 0x76fa, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, + 0x76e5, 0x080c, 0x1019, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, - 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10b5, 0xa06c, + 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10e0, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, - 0x0005, 0x7020, 0x2048, 0x080c, 0x1007, 0x7014, 0x2048, 0x0804, - 0x7098, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, - 0x2048, 0xa906, 0x711a, 0x0804, 0x714d, 0x7014, 0x2048, 0x7007, + 0x0005, 0x7020, 0x2048, 0x080c, 0x1032, 0x7014, 0x2048, 0x0804, + 0x75d3, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, + 0x2048, 0xa906, 0x711a, 0x0804, 0x769d, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, - 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7406, - 0x0804, 0x71f6, 0x71ac, 0x71b0, 0x0002, 0x001d, 0x0007, 0x0004, + 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7972, + 0x0804, 0x7746, 0x76fc, 0x7700, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, @@ -3440,1419 +3610,1812 @@ 0xb094, 0xb09e, 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, - 0xb004, 0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1832, - 0x210c, 0x81ff, 0x1178, 0x080c, 0x5a9d, 0x1108, 0x0005, 0x080c, - 0x6770, 0x0126, 0x2091, 0x8000, 0x080c, 0xb8e3, 0x080c, 0x6536, - 0x012e, 0x0ca0, 0x080c, 0xbce5, 0x1d70, 0x2001, 0x0028, 0x900e, - 0x0c70, 0x2009, 0x1832, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, - 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5bb2, - 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, 0x5b2d, 0x1108, 0x0005, - 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6536, 0x012e, - 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, - 0x7018, 0xa802, 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, - 0x7012, 0x0118, 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, - 0x0001, 0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, - 0xa878, 0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, - 0x9096, 0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, - 0x0160, 0x9005, 0x11d8, 0xa974, 0x080c, 0x5f7e, 0x11b8, 0x0066, - 0xae80, 0x080c, 0x608e, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, - 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x5f7e, 0x1110, - 0x080c, 0x618e, 0x8108, 0x1f04, 0x7275, 0x00ce, 0xa87c, 0xd084, - 0x1120, 0x080c, 0x1007, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6536, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x080c, 0x62a0, 0x0580, 0x2061, 0x1a3e, 0x6100, - 0xd184, 0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, - 0x0520, 0x6004, 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, - 0x00c8, 0x2011, 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, - 0x8000, 0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, - 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, - 0xc28d, 0x6202, 0x012e, 0x0804, 0x74cf, 0x012e, 0x0804, 0x74c9, - 0x012e, 0x0804, 0x74c3, 0x012e, 0x0804, 0x74c6, 0x0126, 0x2091, - 0x8000, 0x7007, 0x0001, 0x080c, 0x62a0, 0x05e0, 0x2061, 0x1a3e, - 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, - 0x9484, 0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, - 0x2100, 0x9210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, - 0x02f0, 0x9484, 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, - 0x9082, 0x0004, 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, - 0x0004, 0x1168, 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, - 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x74cf, 0x012e, - 0x0804, 0x74cc, 0x012e, 0x0804, 0x74c9, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x2061, 0x1a3e, 0x6300, 0xd38c, 0x1120, 0x6308, - 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x74dd, 0x012e, 0x0804, - 0x74cc, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, - 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a3e, 0x6000, 0x9084, - 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, - 0x9065, 0x0598, 0x2001, 0x1832, 0x2004, 0x9005, 0x0118, 0x080c, - 0x9a06, 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, - 0x0110, 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0x9a50, 0xa988, - 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, - 0xfdff, 0x080c, 0x7e3e, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, - 0x1a3e, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, - 0x00ce, 0x012e, 0x00be, 0x0804, 0x74cf, 0x00ce, 0x012e, 0x00be, - 0x0804, 0x74c9, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, - 0x0d18, 0x9186, 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, - 0x180c, 0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, - 0x9186, 0x0029, 0x1d10, 0xa974, 0x080c, 0x5f7e, 0x1968, 0xb800, - 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, - 0x2001, 0x1955, 0x2004, 0x601a, 0x0804, 0x7364, 0xa88c, 0x9065, - 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, 0x1832, 0x2004, 0x9005, - 0x0150, 0x080c, 0x9a06, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9a06, - 0x00ee, 0x0804, 0x7364, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, - 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, - 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x8000, 0x080c, - 0x8582, 0x00ee, 0x0804, 0x7364, 0x2061, 0x1a3e, 0x6000, 0xd084, - 0x0190, 0xd08c, 0x1904, 0x74dd, 0x0126, 0x2091, 0x8000, 0x6204, - 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x74dd, 0x012e, 0xa883, - 0x0016, 0x0804, 0x74d6, 0xa883, 0x0007, 0x0804, 0x74d6, 0xa864, - 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, - 0x0069, 0x0005, 0x080c, 0x7090, 0x0040, 0x7007, 0x0003, 0x7012, - 0x2900, 0x7016, 0x701a, 0x704b, 0x7406, 0x0005, 0x00b6, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61c8, 0x81ff, - 0x1904, 0x7488, 0x6130, 0xd194, 0x1904, 0x74b2, 0xa878, 0x2070, - 0x9e82, 0x1cd0, 0x0a04, 0x747c, 0x6060, 0x9e02, 0x1a04, 0x747c, - 0x7120, 0x9186, 0x0006, 0x1904, 0x746e, 0x7010, 0x905d, 0x0904, - 0x7488, 0xb800, 0xd0e4, 0x1904, 0x74ac, 0x2061, 0x1a3e, 0x6100, - 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, - 0x74b5, 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, - 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x74b8, 0x080c, 0x5113, - 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x7d5e, - 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, - 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x74b8, 0x012e, 0x00ee, - 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, - 0x74d6, 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, - 0x5f7e, 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, - 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, - 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, - 0x080c, 0x5117, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, - 0x02c0, 0x6060, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, - 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, - 0x7000, 0x9086, 0x0007, 0x1904, 0x7412, 0x7003, 0x0002, 0x0804, - 0x7412, 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, - 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, - 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xcbad, 0x012e, - 0x00ee, 0x00be, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, - 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, - 0x0001, 0xa884, 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, - 0x8000, 0x080c, 0x6536, 0x012e, 0x0005, 0x080c, 0x1007, 0x0005, - 0x00d6, 0x080c, 0x7d55, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, - 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, - 0x0780, 0x190c, 0x7571, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70b8, - 0x90ea, 0x0040, 0x0278, 0x8001, 0x70ba, 0x702c, 0x2048, 0xa800, - 0x702e, 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, - 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, - 0x0780, 0x190c, 0x7571, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, - 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, - 0x1a04, 0x7562, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, - 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, - 0x1108, 0x04b0, 0x2b10, 0x080c, 0x9980, 0x1118, 0x080c, 0x9a23, - 0x05a8, 0x6212, 0xa874, 0x0002, 0x7540, 0x7545, 0x7548, 0x754e, - 0x2019, 0x0002, 0x080c, 0xcf62, 0x0060, 0x080c, 0xcefe, 0x0048, - 0x2019, 0x0002, 0xa980, 0x080c, 0xcf19, 0x0018, 0xa980, 0x080c, - 0xcefe, 0x080c, 0x99d6, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6536, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, - 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, - 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, - 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7573, 0x0006, 0x0016, 0x2001, - 0x8003, 0x0006, 0x0804, 0x0dbb, 0x0005, 0x00f6, 0x2079, 0x0300, - 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, - 0x210c, 0xd1ec, 0x1120, 0x080c, 0x1461, 0x00fe, 0x0005, 0x2001, - 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, - 0xd08c, 0x0904, 0x75dd, 0x68b8, 0x90aa, 0x0005, 0x0a04, 0x7b73, - 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, - 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, - 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, - 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, - 0xd31b, 0x080c, 0x7ab8, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, - 0x1118, 0x080c, 0x7b16, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, - 0x080c, 0x763f, 0x080c, 0x203e, 0x005e, 0x004e, 0x0020, 0x080c, - 0xd31b, 0x7817, 0x0140, 0x080c, 0x7620, 0x2001, 0x19bf, 0x2004, - 0x9005, 0x090c, 0x8582, 0x0005, 0x0002, 0x75f6, 0x78da, 0x75ed, - 0x75ed, 0x75ed, 0x75ed, 0x75ed, 0x75ed, 0x7817, 0x0140, 0x2001, - 0x19bf, 0x2004, 0x9005, 0x090c, 0x8582, 0x0005, 0x7000, 0x908c, - 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, - 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x5137, - 0x0070, 0x080c, 0x765f, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, - 0x7815, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x79e8, 0x7817, - 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x8582, 0x0005, - 0x2001, 0x180f, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, - 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, - 0x080c, 0x4672, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, - 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, - 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, - 0xffff, 0x2001, 0x180f, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, - 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, - 0x4672, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, - 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, - 0x9096, 0x0023, 0x1904, 0x77e6, 0x9186, 0x0023, 0x15c0, 0x080c, - 0x7a7d, 0x0904, 0x77e6, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, - 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, - 0x77e6, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, - 0x0015, 0x080c, 0x9a50, 0x0804, 0x77e6, 0x908e, 0x0214, 0x0118, - 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x9a50, 0x0804, - 0x77e6, 0x908e, 0x0100, 0x1904, 0x77e6, 0x7034, 0x9005, 0x1904, - 0x77e6, 0x2009, 0x0016, 0x080c, 0x9a50, 0x0804, 0x77e6, 0x9186, - 0x0022, 0x1904, 0x77e6, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d4, - 0xd0a4, 0x0528, 0xc0b5, 0x68d6, 0x7100, 0x918c, 0x00ff, 0x6976, - 0x7004, 0x687a, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, - 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x251f, 0x7932, 0x7936, - 0x001e, 0x000e, 0x00fe, 0x080c, 0x24d6, 0x6956, 0x703c, 0x00e6, - 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70ae, 0x00ee, 0x7034, - 0x9005, 0x1904, 0x77e6, 0x2009, 0x0017, 0x0804, 0x77b3, 0x908e, - 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x77e6, 0x080c, 0x6c53, - 0x0120, 0x2009, 0x001d, 0x0804, 0x77b3, 0x68d4, 0xc0a5, 0x68d6, - 0x2009, 0x0030, 0x0804, 0x77b3, 0x908e, 0x0500, 0x1140, 0x7034, - 0x9005, 0x1904, 0x77e6, 0x2009, 0x0018, 0x0804, 0x77b3, 0x908e, - 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x77b3, 0x908e, 0x2110, - 0x1120, 0x2009, 0x001a, 0x0804, 0x77b3, 0x908e, 0x5200, 0x1140, - 0x7034, 0x9005, 0x1904, 0x77e6, 0x2009, 0x001b, 0x0804, 0x77b3, - 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x77e6, 0x2009, - 0x001c, 0x0804, 0x77b3, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, - 0x0804, 0x77b3, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, - 0x77e6, 0x2009, 0x0024, 0x0804, 0x77b3, 0x908c, 0xff00, 0x918e, - 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x180f, 0x2004, 0xd09c, - 0x0904, 0x77b3, 0x080c, 0xc384, 0x1904, 0x77e6, 0x0804, 0x77b1, - 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, - 0x77b3, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x77b3, - 0x908e, 0x5300, 0x1108, 0x0440, 0x908e, 0x6104, 0x1528, 0x2029, - 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, - 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, - 0x080c, 0x4672, 0x004e, 0x8108, 0x0f04, 0x777f, 0x9186, 0x0280, - 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, - 0x0000, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, - 0x003f, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, - 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, - 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, - 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, - 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6834, 0xd0d4, - 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, - 0x220c, 0x080c, 0x24d6, 0x1568, 0x080c, 0x5f1e, 0x1550, 0xbe12, - 0xbd16, 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186, 0x0046, - 0x1150, 0x6874, 0x9606, 0x1138, 0x6878, 0x9506, 0x9084, 0xff00, - 0x1110, 0x001e, 0x0098, 0x080c, 0x9980, 0x01a8, 0x2b08, 0x6112, - 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, - 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x9a50, 0x00ce, 0x00be, - 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180d, 0x2004, 0xd0ec, 0x0120, - 0x2011, 0x8049, 0x080c, 0x4672, 0x080c, 0x9a23, 0x0d90, 0x2b08, - 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, - 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, - 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, - 0x6003, 0x0001, 0x080c, 0x8048, 0x08a0, 0x080c, 0x2f50, 0x1140, - 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, - 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, - 0x9186, 0x0033, 0x11e8, 0x080c, 0x7a7d, 0x0904, 0x7872, 0x7124, - 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, - 0x2009, 0x0015, 0x080c, 0x9a50, 0x04a8, 0x908e, 0x0100, 0x1590, - 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x9a50, 0x0450, - 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, - 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, - 0x24d6, 0x11b8, 0x080c, 0x5f1e, 0x11a0, 0xbe12, 0xbd16, 0x080c, - 0x9980, 0x0178, 0x2b08, 0x6112, 0x080c, 0xba69, 0x6023, 0x0004, - 0x7120, 0x610a, 0x001e, 0x080c, 0x9a50, 0x080c, 0x8582, 0x0010, - 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, - 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, - 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, - 0x78d4, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x78d4, - 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, - 0x2019, 0x1835, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, - 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, - 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, - 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, - 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, - 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, - 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x78a9, 0x82ff, 0x1118, 0x9085, - 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, - 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, - 0x0002, 0x78f1, 0x78f1, 0x78f1, 0x7a8f, 0x78f1, 0x78fa, 0x7925, - 0x79b3, 0x78f1, 0x78f1, 0x78f1, 0x78f1, 0x78f1, 0x78f1, 0x78f1, - 0x78f1, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, - 0x8582, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, - 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6860, 0x9c02, - 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, - 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, - 0x0046, 0x080c, 0x9a50, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, - 0x9005, 0x090c, 0x8582, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, - 0x0fff, 0x0904, 0x7989, 0x7110, 0xd1bc, 0x1904, 0x7989, 0x7108, - 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, - 0x81ff, 0x15a0, 0x9080, 0x2f92, 0x200d, 0x918c, 0xff00, 0x810f, - 0x2001, 0x0080, 0x9106, 0x0904, 0x7989, 0x080c, 0x5f1e, 0x1904, - 0x7989, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, - 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x9980, 0x05e8, 0x2b08, - 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, 0x7120, - 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xc5dc, 0x0408, - 0x080c, 0x62a4, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x7876, - 0x11c0, 0x0898, 0x080c, 0x9980, 0x2b08, 0x0198, 0x6112, 0x6023, - 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, - 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8048, 0x080c, - 0x8582, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, - 0x8582, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180d, 0x2004, 0xd0ec, - 0x0120, 0x2011, 0x8049, 0x080c, 0x4672, 0x080c, 0x9a23, 0x0d48, - 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, - 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x8000, - 0x080c, 0x8582, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, - 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6860, - 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, - 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, - 0x2009, 0x0045, 0x080c, 0x9a50, 0x7817, 0x0140, 0x2001, 0x19bf, - 0x2004, 0x9005, 0x090c, 0x8582, 0x00be, 0x0005, 0x6120, 0x9186, - 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, - 0x080c, 0x2f50, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, - 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, - 0x0005, 0x79ff, 0x7a00, 0x79ff, 0x79ff, 0x7a5f, 0x7a6e, 0x0005, - 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7a5d, - 0x700c, 0x7108, 0x080c, 0x24d6, 0x1904, 0x7a5d, 0x080c, 0x5f1e, - 0x1904, 0x7a5d, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, - 0x62a4, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7a7d, - 0x00ce, 0x05d8, 0x080c, 0x9980, 0x2b08, 0x05b8, 0x6112, 0x080c, - 0xba69, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, - 0x9a50, 0x0458, 0x080c, 0x62a4, 0x0148, 0x9086, 0x0004, 0x0130, - 0x080c, 0x62ac, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x9980, - 0x2b08, 0x01d8, 0x6112, 0x080c, 0xba69, 0x6023, 0x0005, 0x7120, - 0x610a, 0x2009, 0x0088, 0x080c, 0x9a50, 0x0078, 0x080c, 0x9980, - 0x2b08, 0x0158, 0x6112, 0x080c, 0xba69, 0x6023, 0x0004, 0x7120, - 0x610a, 0x2009, 0x0001, 0x080c, 0x9a50, 0x00be, 0x0005, 0x7110, - 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x79de, 0x1130, 0x7124, - 0x610a, 0x2009, 0x0089, 0x080c, 0x9a50, 0x0005, 0x7110, 0xd1bc, - 0x0158, 0x0059, 0x0148, 0x080c, 0x79de, 0x1130, 0x7124, 0x610a, - 0x2009, 0x008a, 0x080c, 0x9a50, 0x0005, 0x7020, 0x2060, 0x9c84, - 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x1818, 0x2004, - 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, - 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, 0x11b0, - 0x9c82, 0x1cd0, 0x0298, 0x6860, 0x9c02, 0x1280, 0x7008, 0x9084, - 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, - 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9a50, 0x7817, 0x0140, - 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x8582, 0x00be, 0x0005, - 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, - 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, - 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, - 0x05d0, 0x080c, 0x9980, 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, - 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x24d6, 0x15a0, 0x080c, - 0x5f1e, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, - 0x080c, 0xba69, 0x080c, 0x0fd5, 0x0510, 0x2900, 0x605a, 0x9006, - 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, - 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, - 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, - 0x8048, 0x080c, 0x8582, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, - 0x99d6, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, - 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, - 0x7b6d, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, - 0x1904, 0x7b6f, 0x7030, 0x908e, 0x0400, 0x0904, 0x7b6f, 0x908e, - 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, - 0x2009, 0x1835, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, - 0x6262, 0x0558, 0x68a8, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, - 0x9106, 0x1518, 0x6878, 0x69a8, 0x918c, 0xff00, 0x9105, 0x7104, - 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, - 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, - 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7a7d, 0x0128, - 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, - 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, - 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, - 0x9085, 0x1200, 0x7802, 0x00fe, 0x0005, 0x2071, 0x19c9, 0x7003, - 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, - 0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0x8fd1, 0x7032, 0x7037, - 0x903f, 0x703f, 0xffff, 0x7042, 0x7047, 0x4fb2, 0x704a, 0x705b, - 0x7ce2, 0x080c, 0x0fee, 0x090c, 0x0db2, 0x2900, 0x703a, 0xa867, - 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19c9, - 0x1d04, 0x7c39, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1510, - 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, - 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0db2, - 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, - 0x7d27, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, 0x7044, - 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, 0x0188, - 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, - 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, - 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, 0x1160, - 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, 0x090c, - 0x90b9, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, 0x0310, - 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a, - 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, - 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d, - 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109, - 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, - 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, - 0x012e, 0x7004, 0x0002, 0x7c61, 0x7c62, 0x7c7e, 0x00e6, 0x2071, - 0x19c9, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, - 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19c9, 0x701c, 0x9206, - 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, - 0x00e6, 0x2071, 0x19c9, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, - 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, 0x5f7e, 0x1168, 0xb888, - 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, - 0x080c, 0x8582, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, - 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, - 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, - 0x1110, 0x080c, 0xb8fa, 0x6018, 0x9005, 0x0510, 0x8001, 0x601a, - 0x11f8, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x11b0, - 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, - 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, - 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c, 0xb313, - 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x1818, 0x2004, 0x9102, - 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, - 0x19c9, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, - 0x19d2, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c9, 0x7132, - 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19d5, 0x2013, 0x0000, - 0x0005, 0x00e6, 0x2071, 0x19c9, 0x711a, 0x721e, 0x700b, 0x0009, - 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, 0x2001, - 0x19d7, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, 0xa09a, - 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, 0x10b5, - 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, 0x00b6, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x7bae, 0x015e, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x001e, - 0x000e, 0x0005, 0x00e6, 0x2071, 0x19c9, 0x7172, 0x7276, 0x706f, - 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19c9, 0x7074, - 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x2069, - 0x1800, 0x69e0, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, 0x6a4c, - 0x686c, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c0, 0x0088, 0x9184, - 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69e2, 0x0070, - 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094, 0x00c0, - 0x9184, 0xff3f, 0x9205, 0x68e2, 0x080c, 0x0eb4, 0x002e, 0x0005, - 0x00c6, 0x2061, 0x1a3e, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, - 0x8003, 0x8003, 0x9080, 0x1a3e, 0x2060, 0x0005, 0xa884, 0x908a, - 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a3e, 0x6014, - 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, - 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, - 0x00c0, 0x918e, 0x00c0, 0x0904, 0x7de8, 0xd0b4, 0x1168, 0xd0bc, - 0x1904, 0x7dc1, 0x2009, 0x0006, 0x080c, 0x7e15, 0x0005, 0x900e, - 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, 0x0003, - 0x0120, 0x918e, 0x0003, 0x1904, 0x7e0f, 0x908c, 0x2020, 0x918e, - 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1875, 0x2104, - 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0x9a50, - 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0x9a50, 0x6110, - 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, - 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, - 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, - 0x1904, 0x7e0f, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, - 0x00f6, 0x2c78, 0x080c, 0x1582, 0x00fe, 0x007e, 0x87ff, 0x1120, - 0x2009, 0x0042, 0x080c, 0x9a50, 0x0005, 0x6110, 0x00b6, 0x2158, - 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, - 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, - 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, - 0x080c, 0x9a50, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, - 0x0043, 0x080c, 0x9a50, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, - 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, - 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xb5fb, - 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, - 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, - 0x2061, 0x1a3e, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, - 0x6206, 0x00ce, 0x080c, 0x6370, 0x6014, 0x904d, 0x0076, 0x2039, - 0x0000, 0x190c, 0x7d5e, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, - 0x2061, 0x1a3e, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, - 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, - 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x0126, + 0xb004, 0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, + 0x210c, 0x81ff, 0x1178, 0x080c, 0x5e8c, 0x1108, 0x0005, 0x080c, + 0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb0d, 0x080c, 0x6a46, + 0x012e, 0x0ca0, 0x080c, 0xcf11, 0x1d70, 0x2001, 0x0028, 0x900e, + 0x0c70, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, + 0x0188, 0xa883, 0x0000, 0x080c, 0x5f1c, 0x1108, 0x0005, 0xa87a, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x0cb8, 0x2001, + 0x0028, 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c, + 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, + 0xd0f4, 0x0120, 0x080c, 0x5fee, 0x1138, 0x0005, 0x9006, 0xa87a, + 0x080c, 0x5f69, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, + 0xa982, 0x080c, 0x6a46, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, + 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, + 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, + 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, + 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, + 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, + 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, + 0x080c, 0x63cd, 0x11b8, 0x0066, 0xae80, 0x080c, 0x64dd, 0x006e, + 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, + 0x00c6, 0x080c, 0x63cd, 0x1110, 0x080c, 0x65dd, 0x8108, 0x1f04, + 0x77e1, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x1032, 0x00be, + 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x00be, + 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6733, + 0x0580, 0x2061, 0x1a6e, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, + 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, + 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, + 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, + 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, + 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, + 0x7a3b, 0x012e, 0x0804, 0x7a35, 0x012e, 0x0804, 0x7a2f, 0x012e, + 0x0804, 0x7a32, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, + 0x6733, 0x05e0, 0x2061, 0x1a6e, 0x6000, 0xd084, 0x05b8, 0x6204, + 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, + 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, + 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, + 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, + 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, + 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, + 0x012e, 0x0804, 0x7a3b, 0x012e, 0x0804, 0x7a38, 0x012e, 0x0804, + 0x7a35, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a6e, + 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, + 0x0804, 0x7a49, 0x012e, 0x0804, 0x7a38, 0x00b6, 0x0126, 0x00c6, + 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, + 0x2061, 0x1a6e, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, + 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, + 0x2004, 0x9005, 0x0118, 0x080c, 0xab9c, 0x0068, 0x6017, 0xf400, + 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, + 0x0041, 0x080c, 0xabe6, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, + 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x846c, 0x002e, + 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a6e, 0x6000, 0xd08c, 0x1120, + 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, + 0x7a3b, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7a35, 0xa984, 0x9186, + 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, + 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, + 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, + 0x080c, 0x63cd, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, + 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1984, 0x2004, 0x601a, + 0x0804, 0x78d0, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, + 0x2001, 0x1834, 0x2004, 0x9005, 0x0150, 0x080c, 0xab9c, 0x8eff, + 0x0118, 0x2e60, 0x080c, 0xab9c, 0x00ee, 0x0804, 0x78d0, 0x6024, + 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, + 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, + 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ee, 0x0804, 0x78d0, + 0x2061, 0x1a6e, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7a49, + 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, + 0x0804, 0x7a49, 0x012e, 0xa883, 0x0016, 0x0804, 0x7a42, 0xa883, + 0x0007, 0x0804, 0x7a42, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, + 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x75cb, + 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, + 0x7972, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, + 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, 0x79f4, 0x6130, 0xd194, + 0x1904, 0x7a1e, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x79e8, + 0x6068, 0x9e02, 0x1a04, 0x79e8, 0x7120, 0x9186, 0x0006, 0x1904, + 0x79da, 0x7010, 0x905d, 0x0904, 0x79f4, 0xb800, 0xd0e4, 0x1904, + 0x7a18, 0x2061, 0x1a6e, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, + 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7a21, 0xa883, 0x0000, 0xa803, + 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, + 0x1904, 0x7a24, 0x080c, 0x54b7, 0xd09c, 0x1118, 0xa87c, 0xc0cc, + 0xa87e, 0x2e60, 0x080c, 0x838c, 0x012e, 0x00ee, 0x00be, 0x0005, + 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, + 0x1904, 0x7a24, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, + 0xa883, 0x0006, 0x00be, 0x0804, 0x7a42, 0xd184, 0x0db8, 0xd1c4, + 0x1190, 0x00a0, 0xa974, 0x080c, 0x63cd, 0x15d0, 0xb800, 0xd0e4, + 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, + 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, + 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x54bb, 0xd0fc, 0x01e8, + 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6068, 0x9e02, 0x12a8, + 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, + 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, + 0x797e, 0x7003, 0x0002, 0x0804, 0x797e, 0xa883, 0x0028, 0x0010, + 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, + 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, + 0x0014, 0x080c, 0xde08, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, + 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, + 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, + 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, + 0x0005, 0x080c, 0x1032, 0x0005, 0x00d6, 0x080c, 0x8383, 0x00de, + 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, + 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7b33, 0xd09c, + 0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001, + 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, + 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, + 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7b33, 0x000e, + 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, 0xab15, 0x05d8, + 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, + 0x6008, 0xc0fd, 0x600a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0, + 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, + 0x00ff, 0x080c, 0x26f0, 0x1540, 0x00b6, 0x080c, 0x63cd, 0x2b00, + 0x00be, 0x1510, 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, + 0xabe6, 0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a46, 0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6a46, 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x0005, 0x00d6, + 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, + 0x9282, 0x0004, 0x1a04, 0x7b24, 0xa97c, 0x9188, 0x1000, 0x2104, + 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, + 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0xab15, 0x1118, + 0x080c, 0xabb9, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7b02, 0x7b07, + 0x7b0a, 0x7b10, 0x2019, 0x0002, 0x080c, 0xe1f4, 0x0060, 0x080c, + 0xe190, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xe1ab, 0x0018, + 0xa980, 0x080c, 0xe190, 0x080c, 0xab6b, 0xa887, 0x0000, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x00be, 0x001e, 0x002e, + 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, + 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, + 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7b35, 0x0006, + 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0dde, 0x0005, 0x00f6, + 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, + 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x1560, 0x00fe, + 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, + 0x0005, 0x781c, 0xd08c, 0x0904, 0x7b9f, 0x68c0, 0x90aa, 0x0005, + 0x0a04, 0x819d, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, + 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, + 0x04a8, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, + 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, + 0x11c0, 0x080c, 0xe664, 0x080c, 0x8092, 0x7817, 0x0140, 0x00a8, + 0x9584, 0x0076, 0x1118, 0x080c, 0x80f0, 0x19c8, 0xd5a4, 0x0148, + 0x0046, 0x0056, 0x080c, 0x7c01, 0x080c, 0x21e9, 0x005e, 0x004e, + 0x0020, 0x080c, 0xe664, 0x7817, 0x0140, 0x080c, 0x7be2, 0x2001, + 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x0005, 0x0002, 0x7bb8, + 0x7eb4, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7817, + 0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x0005, + 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, + 0x6892, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, + 0x080c, 0x550e, 0x0070, 0x080c, 0x7c21, 0x0058, 0x9286, 0x3000, + 0x1118, 0x080c, 0x7def, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, + 0x7fc2, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, + 0x941c, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, + 0x8048, 0x2518, 0x080c, 0x48fb, 0x003e, 0x002e, 0x0005, 0x0036, + 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, + 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, + 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, + 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, + 0x8048, 0x080c, 0x48fb, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, + 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, + 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x7dc0, 0x9186, 0x0023, + 0x15c0, 0x080c, 0x8057, 0x0904, 0x7dc0, 0x6120, 0x9186, 0x0001, + 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, + 0x000a, 0x1904, 0x7dc0, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, + 0x1130, 0x2009, 0x0015, 0x080c, 0xabe6, 0x0804, 0x7dc0, 0x908e, + 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, + 0xabe6, 0x0804, 0x7dc0, 0x908e, 0x0100, 0x1904, 0x7dc0, 0x7034, + 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0016, 0x080c, 0xabe6, 0x0804, + 0x7dc0, 0x9186, 0x0022, 0x1904, 0x7dc0, 0x7030, 0x908e, 0x0300, + 0x1580, 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, + 0x00ff, 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, + 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2739, + 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x26f0, 0x695e, + 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, + 0x00ee, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0017, 0x0804, + 0x7d8d, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x7dc0, + 0x080c, 0x717d, 0x0120, 0x2009, 0x001d, 0x0804, 0x7d8d, 0x68dc, + 0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x7d8d, 0x908e, 0x0500, + 0x1140, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0018, 0x0804, + 0x7d8d, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x7d8d, + 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x7d8d, 0x908e, + 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x001b, + 0x0804, 0x7d8d, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, + 0x7dc0, 0x2009, 0x001c, 0x0804, 0x7d8d, 0x908e, 0x1300, 0x1120, + 0x2009, 0x0034, 0x0804, 0x7d8d, 0x908e, 0x1200, 0x1140, 0x7034, + 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0024, 0x0804, 0x7d8d, 0x908c, + 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, + 0x2004, 0xd09c, 0x0904, 0x7d8d, 0x080c, 0xd5dd, 0x1904, 0x7dc0, + 0x0804, 0x7d8b, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, + 0x002a, 0x0804, 0x7d8d, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, + 0x0804, 0x7d8d, 0x908e, 0x5300, 0x1108, 0x0448, 0x908e, 0x6104, + 0x1530, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, + 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, + 0x0046, 0x2124, 0x080c, 0x48fb, 0x004e, 0x8108, 0x0f04, 0x7d41, + 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, + 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0804, 0x7d8d, 0x908e, + 0x6000, 0x1120, 0x2009, 0x003f, 0x0804, 0x7d8d, 0x908e, 0x5400, + 0x1138, 0x080c, 0x814d, 0x1904, 0x7dc0, 0x2009, 0x0046, 0x04a8, + 0x908e, 0x5500, 0x1148, 0x080c, 0x8175, 0x1118, 0x2009, 0x0041, + 0x0460, 0x2009, 0x0042, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, + 0x0045, 0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, + 0x908e, 0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, + 0x918e, 0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, + 0x918e, 0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, + 0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, + 0x2204, 0x8211, 0x220c, 0x080c, 0x26f0, 0x1568, 0x080c, 0x636c, + 0x1550, 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8c0, 0x9005, 0x1168, + 0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506, + 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0xab15, 0x01a8, + 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, + 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xabe6, + 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, + 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48fb, 0x080c, 0xabb9, + 0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, + 0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, + 0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, + 0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x08a0, 0x080c, + 0x318e, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, + 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, + 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x8057, 0x0904, + 0x7e4c, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, + 0x9005, 0x15d0, 0x2009, 0x0015, 0x080c, 0xabe6, 0x04a8, 0x908e, + 0x0100, 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, + 0xabe6, 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, + 0x1518, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x26f0, 0x11b8, 0x080c, 0x636c, 0x11a0, 0xbe12, + 0xbd16, 0x080c, 0xab15, 0x0178, 0x2b08, 0x6112, 0x080c, 0xcc93, + 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xabe6, 0x080c, + 0x941c, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, + 0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, + 0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, + 0x007f, 0x0804, 0x7eae, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, + 0x0804, 0x7eae, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, + 0x2011, 0x0000, 0x2019, 0x1837, 0x231c, 0xd3ac, 0x0130, 0x9026, + 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, + 0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, + 0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, + 0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, + 0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, + 0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7e83, 0x82ff, + 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, + 0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, + 0x9184, 0x000f, 0x0002, 0x7ecb, 0x7ecb, 0x7ecb, 0x8069, 0x7ecb, + 0x7ed4, 0x7eff, 0x7f8d, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb, + 0x7ecb, 0x7ecb, 0x7ecb, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, + 0x9005, 0x090c, 0x941c, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, + 0x7120, 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, + 0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, + 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, + 0x610a, 0x2009, 0x0046, 0x080c, 0xabe6, 0x7817, 0x0140, 0x2001, + 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x00be, 0x0005, 0x00b6, + 0x00c6, 0x9484, 0x0fff, 0x0904, 0x7f63, 0x7110, 0xd1bc, 0x1904, + 0x7f63, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, + 0xff00, 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x31d0, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7f63, 0x080c, + 0x636c, 0x1904, 0x7f63, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, + 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0xab15, + 0x05e8, 0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, + 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, + 0xd837, 0x0408, 0x080c, 0x6737, 0x1138, 0xb807, 0x0606, 0x0c30, + 0x190c, 0x7e50, 0x11c0, 0x0898, 0x080c, 0xab15, 0x2b08, 0x0198, + 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, + 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, + 0x8ec7, 0x080c, 0x941c, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, + 0x9005, 0x090c, 0x941c, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, + 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48fb, 0x080c, + 0xabb9, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, + 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, + 0x080c, 0x8e7f, 0x080c, 0x941c, 0x08b0, 0x00b6, 0x7110, 0xd1bc, + 0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, + 0x02a8, 0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, + 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, + 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0xabe6, 0x7817, 0x0140, + 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x00be, 0x0005, + 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, + 0x0001, 0x0005, 0x080c, 0x318e, 0x1168, 0x7010, 0x9084, 0xff00, + 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, + 0x1208, 0x000b, 0x0005, 0x7fd9, 0x7fda, 0x7fd9, 0x7fd9, 0x8039, + 0x8048, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, + 0x0904, 0x8037, 0x700c, 0x7108, 0x080c, 0x26f0, 0x1904, 0x8037, + 0x080c, 0x636c, 0x1904, 0x8037, 0xbe12, 0xbd16, 0x7110, 0xd1bc, + 0x01d8, 0x080c, 0x6737, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, + 0x080c, 0x8057, 0x00ce, 0x05d8, 0x080c, 0xab15, 0x2b08, 0x05b8, + 0x6112, 0x080c, 0xcc93, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, + 0x0088, 0x080c, 0xabe6, 0x0458, 0x080c, 0x6737, 0x0148, 0x9086, + 0x0004, 0x0130, 0x080c, 0x673f, 0x0118, 0x9086, 0x0004, 0x1180, + 0x080c, 0xab15, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xcc93, 0x6023, + 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xabe6, 0x0078, + 0x080c, 0xab15, 0x2b08, 0x0158, 0x6112, 0x080c, 0xcc93, 0x6023, + 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0xabe6, 0x00be, + 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7fb8, + 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0xabe6, 0x0005, + 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7fb8, 0x1130, + 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xabe6, 0x0005, 0x7020, + 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, + 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, + 0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6868, 0x9c02, 0x1280, + 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, + 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0xabe6, + 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, + 0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, + 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, + 0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, + 0x9086, 0xc000, 0x05d0, 0x080c, 0xab15, 0x05b8, 0x0066, 0x00c6, + 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26f0, + 0x15a0, 0x080c, 0x636c, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, + 0x00ce, 0x6012, 0x080c, 0xcc93, 0x080c, 0x1000, 0x0510, 0x2900, + 0x605a, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, + 0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, + 0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, + 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x00fe, 0x009e, 0x00ce, + 0x0005, 0x080c, 0xab6b, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, + 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, + 0x2000, 0x1904, 0x8147, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, + 0x2004, 0x9005, 0x1904, 0x8149, 0x7030, 0x908e, 0x0400, 0x0904, + 0x8149, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, + 0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4, + 0x1580, 0x080c, 0x66f5, 0x0558, 0x68b0, 0x9084, 0x00ff, 0x7100, + 0x918c, 0x00ff, 0x9106, 0x1518, 0x6880, 0x69b0, 0x918c, 0xff00, + 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, + 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, + 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, + 0x8057, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, + 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x0156, 0x0046, 0x0016, + 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, + 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x027a, 0x080c, 0xbb13, + 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, + 0x027e, 0x080c, 0xbb13, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, + 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x0016, + 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, + 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0272, 0x080c, 0xbb13, + 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, + 0x0276, 0x080c, 0xbb13, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, + 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x00f6, 0x2079, 0x0200, + 0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, + 0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, + 0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, + 0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x19f8, 0x7003, 0x0003, + 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, + 0x7007, 0x0000, 0x7026, 0x702b, 0xa012, 0x7032, 0x7037, 0xa080, + 0x703f, 0xffff, 0x7042, 0x7047, 0x5356, 0x704a, 0x705b, 0x8323, + 0x080c, 0x1019, 0x090c, 0x0dd5, 0x2900, 0x703a, 0xa867, 0x0003, + 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19f8, 0x1d04, + 0x8274, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1530, 0x2001, + 0x013c, 0x2004, 0x9005, 0x190c, 0x8368, 0x2001, 0x1869, 0x2004, + 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, + 0x0001, 0x20d1, 0x0000, 0x080c, 0x0dd5, 0x700f, 0x0361, 0x7007, + 0x0001, 0x0126, 0x2091, 0x8000, 0x7040, 0x900d, 0x0148, 0x8109, + 0x7142, 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, + 0x7024, 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, + 0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, + 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, + 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, + 0x9184, 0x007f, 0x090c, 0xa10e, 0x0010, 0x7034, 0x080f, 0x703c, + 0x9005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, + 0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, + 0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, + 0x0016, 0x7070, 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, + 0x706f, 0x0009, 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, + 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, + 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x829c, 0x829d, + 0x82b9, 0x00e6, 0x2071, 0x19f8, 0x7018, 0x9005, 0x1120, 0x711a, + 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, + 0x19f8, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, + 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x19f8, 0xb888, 0x9102, + 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, + 0x63cd, 0x1168, 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, + 0x2091, 0x8000, 0x0016, 0x080c, 0x941c, 0x001e, 0x012e, 0x8108, + 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, + 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, + 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xcb24, 0x6018, 0x9005, + 0x0540, 0x8001, 0x601a, 0x1528, 0x6120, 0x9186, 0x0003, 0x0148, + 0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11c8, 0x611c, 0xd1c4, + 0x1100, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, + 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, + 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c, + 0xc53d, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x181a, 0x2004, + 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6, + 0x2071, 0x19f8, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, + 0x2001, 0x1a01, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19f8, + 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a04, 0x2013, + 0x0000, 0x0005, 0x00e6, 0x2071, 0x19f8, 0x711a, 0x721e, 0x700b, + 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, + 0x2001, 0x1a06, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, + 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, + 0x10e0, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x81e5, + 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19f8, 0x7172, 0x7276, + 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19f8, + 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, + 0x0016, 0x00c6, 0x2009, 0xfffc, 0x210d, 0x2061, 0x0100, 0x60f0, + 0x9100, 0x60f3, 0x0000, 0x2009, 0xfffc, 0x200f, 0x1220, 0x8108, + 0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x2061, + 0x1a6e, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, + 0x9080, 0x1a6e, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, + 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a6e, 0x6014, 0x00ce, 0x9005, + 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, + 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, + 0x00c0, 0x0904, 0x8416, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x83ef, + 0x2009, 0x0006, 0x080c, 0x8443, 0x0005, 0x900e, 0x0c60, 0x2001, + 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, + 0x0003, 0x1904, 0x843d, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, + 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138, + 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xabe6, 0x0005, 0x87ff, + 0x1de8, 0x2009, 0x0042, 0x0804, 0xabe6, 0x6110, 0x00b6, 0x2158, + 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, + 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, + 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x843d, + 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, + 0x080c, 0x1689, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, + 0x080c, 0xabe6, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, + 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, + 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, + 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0xabe6, + 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, + 0xabe6, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, + 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, + 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xc825, 0x0518, 0x6014, + 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, + 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a6e, + 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, + 0x080c, 0x6881, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, + 0x838c, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a6e, + 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, + 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, + 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1923, 0x7003, + 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, 0x080c, + 0x1019, 0x090c, 0x0dd5, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab, + 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, 0x0005, + 0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, 0x6a2c, 0x721e, + 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, 0xa89a, + 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, 0x0028, 0x200a, 0x9005, + 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, 0x9210, + 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0178, 0xc084, + 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x181d, 0x2104, + 0x9082, 0x0007, 0x2009, 0x1abf, 0x200a, 0x000e, 0xc095, 0x7012, + 0x2008, 0x2001, 0x003b, 0x080c, 0x15d1, 0x9006, 0x2071, 0x193c, + 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, 0x00e6, 0x0126, + 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, 0x0008, + 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, 0x0008, + 0x1f04, 0x84f6, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9, + 0x0007, 0x00c6, 0x080c, 0xab15, 0x6023, 0x0009, 0x6003, 0x0004, + 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, 0x867c, + 0x012e, 0x1f04, 0x8502, 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee, + 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, 0x0086, + 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, 0xd084, + 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, 0x002c, + 0x2029, 0x000a, 0x080c, 0x1000, 0x090c, 0x0dd5, 0x2900, 0x6016, + 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, 0xa8aa, + 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, 0xa89e, + 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, 0x080c, + 0x1000, 0x090c, 0x0dd5, 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806, + 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, 0x009e, + 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1923, 0x7004, + 0x004b, 0x700c, 0x0002, 0x856e, 0x8567, 0x8567, 0x0005, 0x8578, + 0x85d9, 0x85d9, 0x85d9, 0x85da, 0x85eb, 0x85eb, 0x700c, 0x0cba, + 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x0128, 0x78a0, + 0x79a0, 0x9106, 0x1904, 0x85cc, 0x2001, 0x0005, 0x2004, 0xd0bc, + 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, + 0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, 0x861a, + 0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, + 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935, 0x2004, 0x9100, + 0x9202, 0x0e48, 0x080c, 0x8766, 0x2200, 0x9102, 0x0208, 0x2208, + 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x886f, + 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, + 0x2009, 0x1a16, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, + 0x080c, 0x10ff, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, + 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, + 0x0005, 0x0005, 0x700c, 0x0002, 0x85df, 0x85e2, 0x85e1, 0x080c, + 0x8576, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974, + 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, 0x7018, + 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, 0xa892, + 0x9006, 0x0068, 0x0006, 0x080c, 0x886f, 0x2100, 0xaa8c, 0x9210, + 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, + 0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005, 0x00e6, 0x2071, + 0x1923, 0x700c, 0x0002, 0x8618, 0x8618, 0x8616, 0x700f, 0x0001, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, 0x0508, + 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, + 0x8685, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, 0x86cc, + 0x00ee, 0x0178, 0x0096, 0x080c, 0x1019, 0x2900, 0x009e, 0x0148, + 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, 0x0000, 0x012e, + 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, 0x2940, + 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, 0x2068, + 0x9d88, 0x1f4a, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, 0x87f4, + 0x080c, 0x1f08, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004, + 0xa88a, 0x080c, 0x1689, 0x781f, 0x0101, 0x7813, 0x0000, 0x0126, + 0x2091, 0x8000, 0x080c, 0x86db, 0x012e, 0x008e, 0x00ce, 0x00de, + 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, 0x2001, + 0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1923, 0x7030, + 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026, + 0x9b80, 0x894e, 0x2005, 0x906d, 0x090c, 0x0dd5, 0x9b80, 0x8946, + 0x2005, 0x9065, 0x090c, 0x0dd5, 0x6114, 0x2600, 0x9102, 0x0248, + 0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de, + 0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084, 0x1178, 0xc085, + 0x6856, 0x2011, 0x8026, 0x080c, 0x48fb, 0x684c, 0x0096, 0x904d, + 0x090c, 0x0dd5, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, 0x2030, + 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025, + 0x080c, 0x48fb, 0x684c, 0x0096, 0x904d, 0x090c, 0x0dd5, 0xa800, + 0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019, 0x0008, 0x8319, + 0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020, 0x0210, 0x9302, + 0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, 0x090c, 0x0dd5, + 0x781c, 0x9084, 0x0101, 0x9086, 0x0101, 0x190c, 0x0dd5, 0x2069, + 0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, 0x6904, 0x8108, + 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193e, 0x2003, + 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, + 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x1032, 0x009e, 0xa8ab, + 0x0000, 0x080c, 0x0fb2, 0x080c, 0xab6b, 0x00ce, 0x009e, 0x0005, + 0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006, + 0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178, + 0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8a81, 0x00be, + 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, + 0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, 0x2071, 0x1923, + 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, 0x0000, 0x7112, + 0x2001, 0x003b, 0x080c, 0x15d1, 0x00ee, 0x0005, 0x0096, 0x00d6, + 0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, + 0x7026, 0x702f, 0x0000, 0x080c, 0x88ce, 0x0170, 0x080c, 0x8903, + 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, + 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, + 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, 0x2100, 0x9202, + 0x1618, 0x080c, 0x8903, 0x090c, 0x0dd5, 0x7018, 0x9005, 0x1160, + 0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, 0xa806, + 0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, 0xa002, + 0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, 0x9080, + 0x000a, 0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce, 0x00de, 0x008e, + 0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6, + 0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300, 0x831f, 0x831e, + 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, + 0x7104, 0x080c, 0x886f, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, + 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, + 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8878, + 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, + 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, + 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8766, + 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, + 0x7106, 0x2500, 0x9212, 0x1904, 0x87a5, 0x012e, 0x00ee, 0x014e, + 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x9580, 0x8946, 0x2005, 0x9075, 0x090c, 0x0dd5, + 0x080c, 0x884a, 0x012e, 0x9580, 0x8942, 0x2005, 0x9075, 0x090c, + 0x0dd5, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e, + 0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098, + 0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002, + 0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8834, 0x8834, 0x8836, 0x8834, + 0x8836, 0x8834, 0x8834, 0x8834, 0x8834, 0x8834, 0x883c, 0x8834, + 0x883c, 0x8834, 0x8834, 0x8834, 0x080c, 0x0dd5, 0x4104, 0x20a9, + 0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104, + 0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e, + 0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, 0x2110, + 0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, 0x000a, + 0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, 0x080c, + 0x8912, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001, + 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, 0x0006, + 0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, 0x0005, + 0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, 0x0240, + 0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005, + 0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, 0x6810, 0x2019, + 0x0001, 0x2031, 0x88b8, 0x9112, 0x0220, 0x0118, 0x8318, 0x2208, + 0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a, 0x6804, 0xd084, + 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, 0x0a67, + 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, 0x0002, + 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, 0x0cd0, + 0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, 0x1800, 0x7128, + 0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210, 0x8318, 0x0cd8, + 0x2031, 0x88cb, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, 0x0046, + 0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x894a, 0x2005, 0x9005, + 0x090c, 0x0dd5, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1019, 0x01d0, + 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, 0x1019, + 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, 0x7026, 0x94a2, + 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, 0x012e, 0x004e, + 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, 0xac00, 0x080c, + 0x1032, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, 0x2048, + 0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, + 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, 0xa802, 0x2900, + 0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, 0x2004, 0x9005, + 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x1032, 0x000e, 0x0cb8, + 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, 0x2048, 0xa800, + 0x0006, 0x080c, 0x1032, 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a, + 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, + 0x009e, 0x0005, 0x1a62, 0x0000, 0x0000, 0x0000, 0x1930, 0x0000, + 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, 0x0000, + 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040, + 0x2071, 0x1877, 0x080c, 0x8a6c, 0xa067, 0x0023, 0x6010, 0x905d, + 0x0904, 0x8a41, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176, + 0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, 0x0000, 0xa898, + 0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, 0x2031, 0x0018, + 0xa068, 0x908a, 0x0019, 0x1a0c, 0x0dd5, 0x2020, 0x2050, 0x2940, + 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x1f4a, 0x2c65, + 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0dd5, + 0x9082, 0x001b, 0x0002, 0x89ae, 0x89ae, 0x89b0, 0x89ae, 0x89ae, + 0x89ae, 0x89b2, 0x89ae, 0x89ae, 0x89ae, 0x89b4, 0x89ae, 0x89ae, + 0x89ae, 0x89b6, 0x89ae, 0x89ae, 0x89ae, 0x89b8, 0x89ae, 0x89ae, + 0x89ae, 0x89ba, 0x89ae, 0x89ae, 0x89ae, 0x89bc, 0x080c, 0x0dd5, + 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488, + 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034, + 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x89e0, 0x89de, 0x89de, + 0x89de, 0x89de, 0x89de, 0x89e2, 0x89de, 0x89de, 0x89de, 0x89de, + 0x89de, 0x89e4, 0x89de, 0x89de, 0x89de, 0x89de, 0x89de, 0x89e6, + 0x89de, 0x89de, 0x89de, 0x89de, 0x89de, 0x89e8, 0x080c, 0x0dd5, + 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008, + 0xa1e0, 0x2600, 0x0002, 0x8a04, 0x8a06, 0x8a08, 0x8a0a, 0x8a0c, + 0x8a0e, 0x8a10, 0x8a12, 0x8a14, 0x8a16, 0x8a18, 0x8a1a, 0x8a1c, + 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a28, 0x8a2a, 0x8a2c, + 0x8a2e, 0x8a30, 0x8a32, 0x8a34, 0x080c, 0x0dd5, 0xb9e2, 0x0468, + 0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, 0xb9d2, 0x0428, + 0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, 0xb9c2, 0x00e8, + 0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, 0x00a8, + 0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, 0xb9a2, 0x0068, + 0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, 0xb992, 0x0028, + 0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, 0x8421, 0x0120, + 0x080c, 0x1f08, 0x0804, 0x8988, 0x00ae, 0x00be, 0x00ce, 0x00ee, + 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, + 0x0804, 0x896a, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, + 0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, 0x0188, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, + 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x48fb, 0x004e, 0x003e, + 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, + 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, 0x0130, + 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, 0xa26a, + 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, + 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, + 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, 0x2079, 0x0000, + 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, 0x9106, 0x0140, + 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0dd5, 0x2068, 0x0cb0, + 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, 0x0200, + 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x00c6, + 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, 0x2071, + 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, 0x8ac1, + 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, 0xb8ac, + 0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, 0x0004, 0x601b, + 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, 0xa88b, + 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0dd5, 0x080c, + 0x1032, 0x080c, 0x867c, 0x0c18, 0x2071, 0x0300, 0x701b, 0x0200, + 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, + 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x26f0, 0x015e, + 0x11b0, 0x080c, 0x636c, 0x190c, 0x0dd5, 0x000e, 0x001e, 0xb912, + 0xb816, 0x080c, 0xab15, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, + 0x2009, 0x0001, 0x080c, 0xabe6, 0x00be, 0x00ce, 0x0005, 0x000e, + 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, + 0x0013, 0x006e, 0x0005, 0x8b33, 0x8b33, 0x8b33, 0x8b35, 0x8b86, + 0x8b33, 0x8b33, 0x8b33, 0x8be9, 0x8b33, 0x8c26, 0x8b33, 0x8b33, + 0x8b33, 0x8b33, 0x8b33, 0x080c, 0x0dd5, 0x9182, 0x0040, 0x0002, + 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, + 0x8b48, 0x8b4a, 0x8b5f, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b72, + 0x080c, 0x0dd5, 0x0096, 0x080c, 0x93cc, 0x080c, 0x9548, 0x6114, + 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, + 0x00be, 0x080c, 0x684c, 0x080c, 0xab6b, 0x009e, 0x0005, 0x080c, + 0x93cc, 0x00d6, 0x6114, 0x080c, 0xc825, 0x0130, 0x0096, 0x6114, + 0x2148, 0x080c, 0x6a46, 0x009e, 0x00de, 0x080c, 0xab6b, 0x080c, + 0x9548, 0x0005, 0x080c, 0x93cc, 0x080c, 0x306e, 0x6114, 0x0096, + 0x2148, 0x080c, 0xc825, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6a46, + 0x009e, 0x080c, 0xab6b, 0x080c, 0x9548, 0x0005, 0x601b, 0x0000, + 0x9182, 0x0040, 0x0096, 0x0002, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, + 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba3, 0x8ba1, 0x8ba1, 0x8ba1, + 0x8be5, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba9, + 0x8ba1, 0x080c, 0x0dd5, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, + 0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8952, 0x0096, 0xa8a8, + 0x2048, 0x080c, 0x67e4, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005, + 0x0128, 0x00b6, 0x2058, 0x080c, 0x8a81, 0x00be, 0xae88, 0x00b6, + 0x2059, 0x0000, 0x080c, 0x8685, 0x00be, 0x01e0, 0x2071, 0x193c, + 0x080c, 0x86cc, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1946, + 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x1000, 0x2900, 0x009e, + 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x8643, 0x00fe, 0x00ee, + 0x009e, 0x0005, 0x080c, 0x867c, 0x0cd0, 0x080c, 0x8c93, 0x009e, + 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8bfd, 0x8bfd, 0x8bfd, + 0x8bff, 0x8bfd, 0x8bfd, 0x8bfd, 0x8c24, 0x8bfd, 0x8bfd, 0x8bfd, + 0x8bfd, 0x8bfd, 0x8bfd, 0x8bfd, 0x8bfd, 0x080c, 0x0dd5, 0x6003, + 0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, + 0xa837, 0x0000, 0xa83b, 0x0000, 0xa884, 0x9092, 0x199a, 0x0210, + 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x2c10, + 0x080c, 0x1b03, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9548, 0x012e, 0x009e, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x93cc, + 0x080c, 0x9548, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, + 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6a46, 0x080c, 0xab6b, + 0x009e, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, + 0x0013, 0x009e, 0x0005, 0x8c53, 0x8c53, 0x8c53, 0x8c55, 0x8c66, + 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, + 0x8c53, 0x8c53, 0x8c53, 0x080c, 0x0dd5, 0x080c, 0xa4d6, 0x6114, + 0x2148, 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, + 0x00be, 0x080c, 0x6a46, 0x080c, 0xab6b, 0x0005, 0x0461, 0x0005, + 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x0013, 0x009e, + 0x0005, 0x8c81, 0x8c81, 0x8c81, 0x8c83, 0x8c93, 0x8c81, 0x8c81, + 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, + 0x8c81, 0x080c, 0x0dd5, 0x0036, 0x00e6, 0x2071, 0x19e5, 0x703c, + 0x9c06, 0x1120, 0x2019, 0x0000, 0x080c, 0xa2ac, 0x080c, 0xa4d6, + 0x00ee, 0x003e, 0x0005, 0x00f6, 0x00e6, 0x601b, 0x0000, 0x6014, + 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8a81, + 0x00be, 0x2071, 0x193c, 0x080c, 0x86cc, 0x0160, 0x2001, 0x187f, + 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8643, 0x00ee, + 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, 0x080c, + 0x1032, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x867c, 0x0c80, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x187a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200, 0x1f04, - 0x7e60, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, + 0x8cd8, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, 0x8213, 0x2039, 0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a, 0x1220, - 0x1f04, 0x7e8a, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x7e8a, + 0x1f04, 0x8d02, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8d02, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, - 0x2091, 0x2800, 0x2079, 0x19b6, 0x012e, 0x00d6, 0x2069, 0x19b6, + 0x2091, 0x2800, 0x2079, 0x19e5, 0x012e, 0x00d6, 0x2069, 0x19e5, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, - 0x0200, 0x080c, 0x97ce, 0x0401, 0x080c, 0x97b9, 0x00e9, 0x080c, - 0x97bc, 0x00d1, 0x080c, 0x97bf, 0x00b9, 0x080c, 0x97c2, 0x00a1, - 0x080c, 0x97c5, 0x0089, 0x080c, 0x97c8, 0x0071, 0x080c, 0x97cb, + 0x0200, 0x080c, 0xa82b, 0x0401, 0x080c, 0xa816, 0x00e9, 0x080c, + 0xa819, 0x00d1, 0x080c, 0xa81c, 0x00b9, 0x080c, 0xa81f, 0x00a1, + 0x080c, 0xa822, 0x0089, 0x080c, 0xa825, 0x0071, 0x080c, 0xa828, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, - 0x9084, 0x0007, 0x0002, 0x7efd, 0x7f21, 0x7f60, 0x7f03, 0x7f21, - 0x7efd, 0x7efb, 0x7efb, 0x080c, 0x0db2, 0x080c, 0x7cc7, 0x080c, - 0x8582, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, - 0x2011, 0x588a, 0x080c, 0x7c4a, 0x7828, 0x9092, 0x00c8, 0x1228, - 0x8000, 0x782a, 0x080c, 0x58ca, 0x0c88, 0x62c0, 0x080c, 0x97d2, - 0x080c, 0x588a, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, - 0x0c28, 0x080c, 0x7cc7, 0x6220, 0xd2a4, 0x0160, 0x782b, 0x0000, - 0x7824, 0x9065, 0x090c, 0x0db2, 0x2009, 0x0013, 0x080c, 0x9a50, - 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0db2, 0x7828, - 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x283d, - 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, 0x0db2, - 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x8582, 0x0c00, - 0x080c, 0x8f97, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0x97d2, - 0x080c, 0xd358, 0x2009, 0x0014, 0x080c, 0x9a50, 0x00ce, 0x0880, - 0x2001, 0x19d2, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, - 0x0000, 0x7824, 0x9065, 0x090c, 0x0db2, 0x2009, 0x0013, 0x080c, - 0x9aa2, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, - 0x090c, 0x0db2, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, 0x782a, - 0x00de, 0x00ce, 0x00be, 0x080c, 0x283d, 0x02f0, 0x00b6, 0x00c6, - 0x00d6, 0x781c, 0x905d, 0x090c, 0x0db2, 0xb800, 0xc0dc, 0xb802, - 0x7924, 0x2160, 0x080c, 0x99d6, 0xb93c, 0x81ff, 0x090c, 0x0db2, + 0x9084, 0x0007, 0x0002, 0x8d75, 0x8d99, 0x8dd8, 0x8d7b, 0x8d99, + 0x8d75, 0x8d73, 0x8d73, 0x080c, 0x0dd5, 0x080c, 0x8308, 0x080c, + 0x941c, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, + 0x2011, 0x5c61, 0x080c, 0x8285, 0x7828, 0x9092, 0x00c8, 0x1228, + 0x8000, 0x782a, 0x080c, 0x5ca1, 0x0c88, 0x62c0, 0x080c, 0xa967, + 0x080c, 0x5c61, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, + 0x0c28, 0x080c, 0x8308, 0x6220, 0xd2a4, 0x0160, 0x782b, 0x0000, + 0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c, 0xabe6, + 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x7828, + 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x2a57, + 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, 0x0dd5, + 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x941c, 0x0c00, + 0x080c, 0x9fd8, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0xa967, + 0x080c, 0xe6a1, 0x2009, 0x0014, 0x080c, 0xabe6, 0x00ce, 0x0880, + 0x2001, 0x1a01, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, + 0x0000, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c, + 0xac38, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, + 0x090c, 0x0dd5, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, 0x782a, + 0x00de, 0x00ce, 0x00be, 0x080c, 0x2a57, 0x02f0, 0x00b6, 0x00c6, + 0x00d6, 0x781c, 0x905d, 0x090c, 0x0dd5, 0xb800, 0xc0dc, 0xb802, + 0x7924, 0x2160, 0x080c, 0xab6b, 0xb93c, 0x81ff, 0x090c, 0x0dd5, 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, - 0x00be, 0x080c, 0x8582, 0x0868, 0x080c, 0x8f97, 0x0850, 0x2011, - 0x0130, 0x2214, 0x080c, 0x97d2, 0x080c, 0xd358, 0x7824, 0x9065, - 0x2009, 0x0014, 0x080c, 0x9a50, 0x00de, 0x00ce, 0x00be, 0x0804, - 0x7f71, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1be4, - 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, 0x9205, - 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0x9a50, - 0x00ce, 0x0005, 0x2011, 0x19d5, 0x2013, 0x0000, 0x0cc8, 0x793c, - 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7946, + 0x00be, 0x080c, 0x941c, 0x0868, 0x080c, 0x9fd8, 0x0850, 0x2011, + 0x0130, 0x2214, 0x080c, 0xa967, 0x080c, 0xe6a1, 0x7824, 0x9065, + 0x2009, 0x0014, 0x080c, 0xabe6, 0x00de, 0x00ce, 0x00be, 0x0804, + 0x8de9, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1d8c, + 0x6024, 0x6027, 0x0002, 0xd0f4, 0x15b8, 0x62c8, 0x60c4, 0x9205, + 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0xabe6, + 0x00ce, 0x0005, 0x2011, 0x1a04, 0x2013, 0x0000, 0x0cc8, 0x793c, + 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x1628, 0x8108, 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, - 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x6014, 0x9084, - 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8, 0x793c, 0x2160, 0x2009, - 0x004a, 0x080c, 0x9a50, 0x08a0, 0x7848, 0xc085, 0x784a, 0x0880, - 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, - 0x2c08, 0x2061, 0x19b6, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, - 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, - 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19b6, - 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, - 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x8582, 0x00de, 0x0005, - 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, - 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, - 0x19b6, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, - 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, - 0x2c08, 0x2061, 0x19b6, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, - 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, - 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, - 0x2c08, 0x2061, 0x19b6, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, - 0x2102, 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, - 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, - 0x19b6, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, - 0x80ef, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x80ea, 0x87ff, - 0x0120, 0x6054, 0x9106, 0x1904, 0x80ea, 0x703c, 0x9c06, 0x1178, - 0x0036, 0x2019, 0x0001, 0x080c, 0x9254, 0x7033, 0x0000, 0x9006, - 0x703e, 0x7042, 0x7046, 0x704a, 0x003e, 0x2029, 0x0001, 0x7038, - 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, - 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, - 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, - 0x0000, 0x080c, 0xb5fb, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, - 0x0003, 0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, - 0x0036, 0x0076, 0x080c, 0xb8e3, 0x080c, 0xd28c, 0x080c, 0x6536, - 0x007e, 0x003e, 0x001e, 0x080c, 0xb7dd, 0x080c, 0x9a06, 0x00ce, - 0x0804, 0x808e, 0x2c78, 0x600c, 0x2060, 0x0804, 0x808e, 0x85ff, - 0x0120, 0x0036, 0x080c, 0x865d, 0x003e, 0x012e, 0x000e, 0x001e, - 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, - 0x0016, 0x0036, 0x0076, 0x080c, 0xd28c, 0x080c, 0xcf91, 0x007e, - 0x003e, 0x001e, 0x0890, 0x6020, 0x9086, 0x000a, 0x0904, 0x80d4, - 0x0804, 0x80d2, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, - 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19b6, 0x7838, 0x9065, - 0x0904, 0x816a, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, - 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x9254, 0x7833, 0x0000, - 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xb5fb, + 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x793c, 0x9188, + 0x0008, 0x210c, 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, + 0x9085, 0x0016, 0x6016, 0x08a0, 0x793c, 0x2160, 0x2009, 0x004a, + 0x080c, 0xabe6, 0x0868, 0x7848, 0xc085, 0x784a, 0x0848, 0x0006, + 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, + 0x2061, 0x19e5, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148, + 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, + 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19e5, 0xb800, + 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, 0x1110, + 0x2b00, 0x681e, 0x00de, 0x0804, 0x941c, 0x00de, 0x0005, 0xc0d5, + 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, + 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19e5, + 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, 0x0006, + 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, + 0x2061, 0x19e5, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, + 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, + 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, + 0x2061, 0x19e5, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, + 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, + 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, + 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e5, + 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x8f6e, + 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x8f69, 0x87ff, 0x0120, + 0x6054, 0x9106, 0x1904, 0x8f69, 0x703c, 0x9c06, 0x1178, 0x0036, + 0x2019, 0x0001, 0x080c, 0xa2ac, 0x7033, 0x0000, 0x9006, 0x703e, + 0x7042, 0x7046, 0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, + 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, + 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, + 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, + 0x080c, 0xc825, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, + 0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, + 0x0076, 0x080c, 0xcb0d, 0x080c, 0xe5d5, 0x080c, 0x6a46, 0x007e, + 0x003e, 0x001e, 0x080c, 0xca07, 0x080c, 0xab9c, 0x00ce, 0x0804, + 0x8f0d, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8f0d, 0x85ff, 0x0120, + 0x0036, 0x080c, 0x9548, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, + 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, + 0x0036, 0x0076, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x007e, 0x003e, + 0x001e, 0x0890, 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, + 0x0016, 0x0036, 0x0076, 0x080c, 0x6a46, 0x080c, 0xab6b, 0x007e, + 0x003e, 0x001e, 0x0818, 0x6020, 0x9086, 0x000a, 0x0904, 0x8f53, + 0x0804, 0x8f51, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, + 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19e5, 0x7838, 0x9065, + 0x0904, 0x8ffa, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, + 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x7833, 0x0000, + 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xc825, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180, 0x2001, - 0x1957, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877, - 0x0000, 0x080c, 0x6529, 0x080c, 0xb7dd, 0x080c, 0x9a06, 0x000e, - 0x0804, 0x8127, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, + 0x1986, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x6a3a, 0x080c, 0xca07, 0x080c, 0xab9c, 0x000e, + 0x0804, 0x8fb7, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, - 0x080c, 0xcf91, 0x0c50, 0x6020, 0x9086, 0x000a, 0x09f8, 0x08e0, - 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x8269, 0x008e, - 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19b6, 0x2091, - 0x8000, 0x080c, 0x8300, 0x080c, 0x838e, 0x012e, 0x00fe, 0x0005, - 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, - 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, 0x7614, 0x2660, - 0x2678, 0x8cff, 0x0904, 0x822e, 0x6010, 0x2058, 0xb8a0, 0x9206, - 0x1904, 0x8229, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x8229, - 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, - 0x080c, 0x7cc7, 0x080c, 0x8fbb, 0x68c3, 0x0000, 0x080c, 0x9469, - 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, - 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, + 0x080c, 0xe223, 0x0c50, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, + 0x080c, 0x6a46, 0x080c, 0xab6b, 0x0c10, 0x6020, 0x9086, 0x000a, + 0x09a8, 0x0890, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, + 0x9103, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, + 0x19e5, 0x2091, 0x8000, 0x080c, 0x919a, 0x080c, 0x9228, 0x012e, + 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, + 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x90c8, 0x6010, 0x2058, + 0xb8a0, 0x9206, 0x1904, 0x90c3, 0x88ff, 0x0120, 0x6054, 0x9106, + 0x1904, 0x90c3, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x1508, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, + 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, + 0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x90c3, + 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xc825, 0x01e8, 0x6020, + 0x9086, 0x0003, 0x1580, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d, + 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, + 0x0086, 0x080c, 0xcb0d, 0x080c, 0xe5d5, 0x080c, 0x6a46, 0x008e, + 0x003e, 0x001e, 0x080c, 0xca07, 0x080c, 0xab9c, 0x080c, 0xa39c, + 0x00ce, 0x0804, 0x9043, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9043, + 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, + 0x0036, 0x0086, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x008e, 0x003e, + 0x001e, 0x08d0, 0x080c, 0xb51d, 0x6020, 0x9086, 0x0002, 0x1160, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x90a9, 0x9086, + 0x008b, 0x0904, 0x90a9, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, + 0x09b0, 0x0804, 0x90bc, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, + 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, + 0x9193, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19e5, 0xbe54, + 0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff, + 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108, + 0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000, + 0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x62ff, + 0x0904, 0x918f, 0x7624, 0x86ff, 0x0904, 0x917e, 0x9680, 0x0005, + 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0560, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, + 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, + 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, + 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, + 0x2660, 0x080c, 0xab9c, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, + 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x9136, 0x89ff, 0x0158, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcb0d, 0x080c, + 0xe5d5, 0x080c, 0x6a46, 0x080c, 0xa39c, 0x0804, 0x9136, 0x006e, + 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, + 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, + 0x7814, 0x9065, 0x0904, 0x91fb, 0x600c, 0x0006, 0x600f, 0x0000, + 0x7824, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, + 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6, + 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, - 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x8229, 0x7014, 0x9c36, - 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, - 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, - 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, - 0x6014, 0x2048, 0x080c, 0xb5fb, 0x01e8, 0x6020, 0x9086, 0x0003, - 0x1580, 0x080c, 0xb7fa, 0x1118, 0x080c, 0xa364, 0x0098, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, - 0xb8e3, 0x080c, 0xd28c, 0x080c, 0x6536, 0x008e, 0x003e, 0x001e, - 0x080c, 0xb7dd, 0x080c, 0x9a06, 0x080c, 0x933f, 0x00ce, 0x0804, - 0x81a9, 0x2c78, 0x600c, 0x2060, 0x0804, 0x81a9, 0x012e, 0x000e, - 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, - 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, - 0x080c, 0xd28c, 0x080c, 0xcf91, 0x008e, 0x003e, 0x001e, 0x08d0, - 0x080c, 0xa364, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, - 0x9086, 0x0085, 0x000e, 0x0904, 0x820f, 0x9086, 0x008b, 0x0904, - 0x820f, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, - 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, - 0x8222, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, 0x0126, 0x2091, - 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, 0x82f9, 0x00f6, - 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b6, 0xbe54, 0x7018, 0x9b06, - 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff, 0x1118, 0x7018, - 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108, 0xae56, 0x96d5, - 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000, 0xb85b, 0x0000, - 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5eb1, 0x0904, 0x82f5, - 0x7624, 0x86ff, 0x0904, 0x82e4, 0x9680, 0x0005, 0x2004, 0x9906, - 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0560, 0x080c, - 0x7cc7, 0x080c, 0x8fbb, 0x68c3, 0x0000, 0x080c, 0x9469, 0x7027, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, 0x2069, - 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, + 0x0040, 0x080c, 0x66cf, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, + 0x00f8, 0x6014, 0x2048, 0x080c, 0xc823, 0x01b0, 0x6020, 0x9086, + 0x0003, 0x1508, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d, 0x0060, + 0x080c, 0x66cf, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0x6a46, 0x080c, 0xca07, 0x080c, 0xab9c, 0x080c, 0xa39c, + 0x000e, 0x0804, 0x91a1, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, + 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, + 0xe223, 0x0c50, 0x080c, 0xb51d, 0x6020, 0x9086, 0x0002, 0x1150, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, + 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, + 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, + 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d, + 0x0904, 0x92a8, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, + 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x62ff, 0x0904, 0x92a5, 0x7e24, + 0x86ff, 0x0904, 0x9298, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, + 0x9298, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x928f, + 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6, + 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, + 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, + 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, + 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1986, + 0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, + 0x2660, 0x600f, 0x0000, 0x080c, 0xab9c, 0x00ce, 0x0048, 0x00de, + 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x923b, + 0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0x6a46, 0x080c, 0xa39c, 0x0804, 0x923b, 0x000e, 0x0804, 0x922f, + 0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, + 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, + 0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19e5, + 0x7024, 0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, + 0xb800, 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, + 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, + 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x9ffc, + 0x78c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2079, + 0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2079, 0x0100, 0x7824, 0xd084, + 0x0110, 0x7827, 0x0001, 0x080c, 0xa4c6, 0x003e, 0x080c, 0x62ff, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, - 0x9a06, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, - 0x630a, 0x00ce, 0x0804, 0x829c, 0x89ff, 0x0158, 0xa867, 0x0103, - 0xab7a, 0xa877, 0x0000, 0x080c, 0xb8e3, 0x080c, 0xd28c, 0x080c, - 0x6536, 0x080c, 0x933f, 0x0804, 0x829c, 0x006e, 0x00de, 0x00ee, - 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, 0x00be, 0x0005, - 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814, 0x9065, - 0x0904, 0x8361, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0x9c06, - 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x7cc7, - 0x080c, 0x8fbb, 0x68c3, 0x0000, 0x080c, 0x9469, 0x7827, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x080c, - 0x625a, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8, 0x6014, - 0x2048, 0x080c, 0xb5f9, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, - 0x080c, 0xb7fa, 0x1118, 0x080c, 0xa364, 0x0060, 0x080c, 0x625a, - 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6536, - 0x080c, 0xb7dd, 0x080c, 0x9a06, 0x080c, 0x933f, 0x000e, 0x0804, - 0x8307, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, - 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xcf91, 0x0c50, - 0x080c, 0xa364, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, - 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, - 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, - 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0066, - 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d, 0x0904, 0x840e, - 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4, 0xc0dc, - 0xb802, 0x080c, 0x5eb1, 0x0904, 0x840b, 0x7e24, 0x86ff, 0x0904, - 0x83fe, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, 0x83fe, 0x00d6, - 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x83f5, 0x080c, 0x7cc7, - 0x080c, 0x8fbb, 0x68c3, 0x0000, 0x080c, 0x9469, 0x7827, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, - 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150, 0x9680, - 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1957, 0x210c, 0x2102, - 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x600f, - 0x0000, 0x080c, 0x9a06, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, - 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x83a1, 0x89ff, 0x0138, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6536, 0x080c, - 0x933f, 0x0804, 0x83a1, 0x000e, 0x0804, 0x8395, 0x781e, 0x781a, - 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, 0x00e6, - 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, 0x904d, - 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b6, 0x7024, 0x9035, - 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800, 0xc0dc, - 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00f6, - 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, 0x6003, - 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x8fbb, 0x78c3, 0x0000, - 0x080c, 0x9469, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, - 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, - 0x080c, 0x2987, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, - 0x0001, 0x080c, 0x9469, 0x003e, 0x080c, 0x5eb1, 0x00c6, 0xb83c, - 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x99d6, 0x00ce, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb8e3, 0x080c, - 0x6536, 0x080c, 0x933f, 0x00fe, 0x0005, 0x00b6, 0x00e6, 0x00c6, - 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c, 0x2014, - 0xc2e4, 0x2202, 0x2071, 0x19b6, 0x7004, 0x9084, 0x0007, 0x0002, - 0x849a, 0x849e, 0x84b5, 0x84de, 0x851c, 0x849a, 0x84b5, 0x8498, - 0x080c, 0x0db2, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, - 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0x9015, 0x0158, 0x7216, - 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, - 0x00be, 0x0005, 0x7216, 0x7212, 0x0ca8, 0x6010, 0x2058, 0x080c, - 0x5eb1, 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000, 0x7027, 0x0000, - 0x7020, 0x8001, 0x7022, 0x1148, 0x2001, 0x180c, 0x2014, 0xd2ec, - 0x1180, 0x00ce, 0x00ee, 0x00be, 0x0005, 0xb854, 0x9015, 0x0120, - 0x721e, 0x080c, 0x8582, 0x0ca8, 0x7218, 0x721e, 0x080c, 0x8582, - 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x865d, 0x0c58, 0x7024, 0x9065, - 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0x933f, 0x600c, 0x9015, - 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, - 0x7014, 0x9c06, 0x1160, 0x080c, 0x933f, 0x600c, 0x9015, 0x0120, - 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, - 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, 0x080c, 0x5eb1, 0xb800, - 0xc0dc, 0xb802, 0x080c, 0x933f, 0x701c, 0x9065, 0x0138, 0xb854, - 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, - 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, 0x0140, 0x080c, - 0x933f, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f, 0x0000, 0x080c, - 0x9469, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x720e, - 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19b6, 0x6830, 0x9084, 0x0003, - 0x0002, 0x853f, 0x8541, 0x8565, 0x853d, 0x080c, 0x0db2, 0x00de, - 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8, 0x683c, 0x9065, - 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, - 0x0000, 0x683f, 0x0000, 0x2011, 0x19d5, 0x2013, 0x0000, 0x00ce, - 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, - 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50, 0x00c6, 0x9006, 0x6842, - 0x6846, 0x684a, 0x683c, 0x9065, 0x0160, 0x600c, 0x9015, 0x0130, - 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0018, 0x683e, 0x683a, - 0x6836, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1e5, - 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec, 0x0120, 0xc1ec, - 0x2102, 0x080c, 0x865d, 0x2001, 0x19c2, 0x2004, 0x9086, 0x0001, - 0x0d58, 0x00d6, 0x2069, 0x19b6, 0x6804, 0x9084, 0x0007, 0x0002, - 0x85a2, 0x8645, 0x8645, 0x8645, 0x8645, 0x8647, 0x8645, 0x85a0, - 0x080c, 0x0db2, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, - 0x680c, 0x9065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, - 0x080c, 0x86b3, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, - 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x86b3, 0x00ce, - 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, - 0x8631, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, - 0x905d, 0x0120, 0x920e, 0x0904, 0x8631, 0x0028, 0x6818, 0x920e, - 0x0904, 0x8631, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, - 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, - 0x99ad, 0x0904, 0x8631, 0x8318, 0xbb3e, 0x6116, 0x2b10, 0x6212, - 0x0096, 0x2148, 0xa880, 0x9084, 0x00ff, 0x605e, 0xa883, 0x0000, - 0xa884, 0x009e, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, - 0x801b, 0x831b, 0x9318, 0x631a, 0x6114, 0x0096, 0x2148, 0xa964, - 0x009e, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0538, 0x00f6, 0x2c78, - 0x2061, 0x0100, 0xbab0, 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, - 0x080c, 0x8bf2, 0x2069, 0x19b6, 0xbb00, 0xc3dd, 0xbb02, 0x6807, - 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, - 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00be, 0x00ce, 0x00de, - 0x0005, 0x00ee, 0x00be, 0x00ce, 0x0cd0, 0xbb00, 0xc3dd, 0xbb02, - 0x6807, 0x0006, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x080c, 0x97f2, - 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, - 0x680c, 0x9065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, - 0x080c, 0x86b3, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, - 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6, 0x2069, - 0x19b6, 0x6830, 0x9086, 0x0000, 0x1548, 0x2001, 0x180c, 0x2014, - 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, 0x8591, 0x2069, 0x19b6, - 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0, 0x6838, 0x907d, 0x01b0, - 0x6a04, 0x9296, 0x0000, 0x1588, 0x6833, 0x0001, 0x683e, 0x6847, + 0xab6b, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0xcb0d, 0x080c, 0x6a46, 0x080c, 0xa39c, 0x00fe, 0x0005, 0x00b6, + 0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, + 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19e5, 0x7004, 0x9084, + 0x0007, 0x0002, 0x9334, 0x9338, 0x934f, 0x9378, 0x93b6, 0x9334, + 0x934f, 0x9332, 0x080c, 0x0dd5, 0x00ce, 0x00ee, 0x00be, 0x0005, + 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0x9015, + 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, + 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, 0x0ca8, 0x6010, + 0x2058, 0x080c, 0x62ff, 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000, + 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148, 0x2001, 0x180c, + 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, 0x0005, 0xb854, + 0x9015, 0x0120, 0x721e, 0x080c, 0x941c, 0x0ca8, 0x7218, 0x721e, + 0x080c, 0x941c, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x9548, 0x0c58, + 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0xa39c, + 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, + 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0xa39c, 0x600c, + 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, + 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, 0x080c, + 0x62ff, 0xb800, 0xc0dc, 0xb802, 0x080c, 0xa39c, 0x701c, 0x9065, + 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, + 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, + 0x0140, 0x080c, 0xa39c, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f, + 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, + 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19e5, 0x6830, + 0x9084, 0x0003, 0x0002, 0x93d9, 0x93db, 0x93ff, 0x93d7, 0x080c, + 0x0dd5, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8, + 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f, + 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1a04, 0x2013, + 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90, 0x6843, + 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50, 0x00c6, + 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, 0x0160, 0x600c, + 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0018, + 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, + 0x200c, 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec, + 0x0120, 0xc1ec, 0x2102, 0x080c, 0x9548, 0x2001, 0x19f1, 0x2004, + 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19e5, 0x6804, 0x9084, + 0x0007, 0x0006, 0x9005, 0x11c8, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0028, 0x1198, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0168, + 0x2001, 0x188b, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, 0x0028, + 0x080c, 0x9548, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, 0x9459, + 0x9516, 0x9516, 0x9516, 0x9516, 0x9518, 0x9516, 0x9457, 0x080c, + 0x0dd5, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, + 0x9065, 0x0520, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, + 0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, 0x1837, 0x210c, 0x918c, + 0x0028, 0x1150, 0x080c, 0x717d, 0x0138, 0x0006, 0x2009, 0x188b, + 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, 0x6826, 0x682b, + 0x0000, 0x080c, 0x95f0, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065, + 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x95f0, + 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000, + 0x0904, 0x9502, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0, + 0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x9502, 0x0028, 0x6818, + 0x920e, 0x0904, 0x9502, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888, + 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40, + 0x080c, 0xab42, 0x0904, 0x9502, 0x8318, 0xbb3e, 0x6116, 0x2b10, + 0x6212, 0x0096, 0x2148, 0xa880, 0x9084, 0x00ff, 0x605e, 0xa883, + 0x0000, 0xa884, 0x009e, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, + 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x6114, 0x0096, 0x2148, + 0xa964, 0x009e, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0538, 0x00f6, + 0x2c78, 0x2061, 0x0100, 0xbac0, 0x629a, 0x2069, 0x0200, 0x2071, + 0x0240, 0x080c, 0x9b3d, 0x2069, 0x19e5, 0xbb00, 0xc3dd, 0xbb02, + 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x7823, 0x0003, + 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00be, 0x00ce, + 0x00de, 0x0005, 0x00ee, 0x00be, 0x00ce, 0x0cd0, 0xbb00, 0xc3dd, + 0xbb02, 0x6807, 0x0006, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x080c, + 0xa987, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, + 0x00c6, 0x680c, 0x9065, 0x0508, 0x6114, 0x0096, 0x2148, 0xa964, + 0x009e, 0x918c, 0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, 0x1837, + 0x210c, 0x918c, 0x0028, 0x1150, 0x080c, 0x717d, 0x0138, 0x0006, + 0x2009, 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, + 0x6826, 0x682b, 0x0000, 0x080c, 0x95f0, 0x00ce, 0x00de, 0x0005, + 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, + 0x00f6, 0x00d6, 0x2069, 0x19e5, 0x6830, 0x9086, 0x0000, 0x1570, + 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, + 0x942b, 0x2069, 0x19e5, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x1508, + 0x6838, 0x907d, 0x01d8, 0x6a04, 0x9296, 0x0000, 0x1904, 0x95e9, + 0x7920, 0x918e, 0x0009, 0x0588, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, - 0x080c, 0x19f2, 0x1178, 0x012e, 0x080c, 0x8e0a, 0x00de, 0x00fe, - 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, 0x6d03, - 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, + 0x080c, 0x1b8c, 0x1178, 0x012e, 0x080c, 0x9e4a, 0x00de, 0x00fe, + 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, 0x722d, + 0x006e, 0x08b0, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, - 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x6a04, 0x9296, 0x0006, - 0x0958, 0x0804, 0x8655, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, - 0x86c7, 0x86cc, 0x8b2c, 0x8bbb, 0x86cc, 0x8b2c, 0x8bbb, 0x86c7, - 0x86cc, 0x86c7, 0x86c7, 0x86c7, 0x86c7, 0x86c7, 0x86c7, 0x080c, - 0x847d, 0x080c, 0x8582, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, - 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, - 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db2, 0x6110, - 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, - 0x1a04, 0x8738, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, - 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x88af, 0x88ea, - 0x8913, 0x89bb, 0x89dd, 0x89e3, 0x89f0, 0x89f8, 0x8a04, 0x8a0a, - 0x8a1b, 0x8a0a, 0x8a73, 0x89f8, 0x8a7f, 0x8a85, 0x8a04, 0x8a85, - 0x8a91, 0x8736, 0x8736, 0x8736, 0x8736, 0x8736, 0x8736, 0x8736, - 0x8736, 0x8736, 0x8736, 0x8736, 0x910b, 0x912e, 0x913f, 0x915f, - 0x9191, 0x89f0, 0x8736, 0x89f0, 0x8a0a, 0x8736, 0x8913, 0x89bb, - 0x8736, 0x9556, 0x8a0a, 0x8736, 0x9572, 0x8a0a, 0x8736, 0x8a04, - 0x88a9, 0x8759, 0x8736, 0x958e, 0x95fb, 0x96d2, 0x8736, 0x96df, - 0x89ed, 0x970a, 0x8736, 0x919b, 0x9737, 0x8736, 0x080c, 0x0db2, - 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, - 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8757, 0x8757, 0x8757, - 0x8780, 0x882c, 0x8837, 0x8757, 0x8757, 0x8757, 0x887e, 0x888a, - 0x879b, 0x8757, 0x87b6, 0x87ea, 0x98b4, 0x98f9, 0x8a0a, 0x080c, - 0x0db2, 0x00d6, 0x0096, 0x080c, 0x8aa4, 0x7003, 0x2414, 0x7007, - 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, - 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x8f8f, 0x009e, - 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, - 0x9940, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, - 0x00d6, 0x0096, 0x080c, 0x8aa4, 0x7003, 0x0500, 0x7814, 0x2048, - 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, - 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8f8f, - 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8aa4, 0x7003, - 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, - 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, - 0x0010, 0x080c, 0x8f8f, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, - 0x0126, 0x2091, 0x8000, 0x080c, 0x8aa4, 0x20e9, 0x0000, 0x2001, - 0x1972, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, - 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, - 0x2001, 0x1972, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x20be, - 0x080c, 0xc2e6, 0x9006, 0x080c, 0x20be, 0x001e, 0xa804, 0x9005, - 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8f8f, 0x012e, 0x009e, - 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, - 0x8aef, 0x20e9, 0x0000, 0x2001, 0x1972, 0x2003, 0x0000, 0x7814, - 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, - 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, - 0x2001, 0x1972, 0x0016, 0x200c, 0x080c, 0xc2e6, 0x001e, 0xa804, - 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, - 0x0f87, 0x080c, 0x8f8f, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, - 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, - 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8aa4, 0x7003, 0x7800, - 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x8f8f, 0x00d6, - 0x00e6, 0x080c, 0x8aef, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, - 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, - 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, - 0x1f04, 0x884d, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, - 0x8e70, 0x1f04, 0x8856, 0x2069, 0x1982, 0x9086, 0xdf00, 0x0110, - 0x2069, 0x199c, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, - 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, - 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8864, 0x60c3, - 0x004c, 0x080c, 0x8f8f, 0x00ee, 0x00de, 0x0005, 0x080c, 0x8aa4, - 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, - 0x0804, 0x8f8f, 0x00d6, 0x0026, 0x0016, 0x080c, 0x8aef, 0x7003, - 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, - 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee, - 0x7206, 0x710a, 0x62c2, 0x080c, 0x8f8f, 0x001e, 0x002e, 0x00de, - 0x0005, 0x2001, 0x1816, 0x2004, 0x609a, 0x0804, 0x8f8f, 0x080c, - 0x8aa4, 0x7003, 0x5200, 0x2069, 0x1853, 0x6804, 0xd084, 0x0130, - 0x6828, 0x0016, 0x080c, 0x2509, 0x710e, 0x001e, 0x20a9, 0x0004, - 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, - 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, 0x4003, - 0x080c, 0x9940, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, - 0x181d, 0x2004, 0x7032, 0x2001, 0x181e, 0x2004, 0x7036, 0x0030, - 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c, - 0x0804, 0x8f8f, 0x080c, 0x8aa4, 0x7003, 0x0500, 0x080c, 0x9940, - 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181d, 0x2004, - 0x700a, 0x2001, 0x181e, 0x2004, 0x700e, 0x0030, 0x2001, 0x1816, - 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, - 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, - 0x0010, 0x0804, 0x8f8f, 0x080c, 0x8aa4, 0x9006, 0x080c, 0x626e, - 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, - 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, 0x9006, 0xa89a, - 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, 0x9086, 0x007e, - 0x1904, 0x8982, 0x00d6, 0x2069, 0x193d, 0x2001, 0x1835, 0x2004, - 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000, 0x7012, - 0x080c, 0x9957, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, - 0x681c, 0x7026, 0x0090, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, - 0x080c, 0x6c53, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, - 0x7012, 0x080c, 0x9957, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, - 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, - 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, - 0x00d6, 0x080c, 0x97b9, 0x2069, 0x1945, 0x2071, 0x024e, 0x6800, - 0xc0dd, 0x7002, 0x080c, 0x5117, 0xd0e4, 0x0110, 0x680c, 0x700e, - 0x00de, 0x04a8, 0x2001, 0x1835, 0x2004, 0xd0a4, 0x0170, 0x0016, - 0x2001, 0x193e, 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, - 0x0000, 0x080c, 0x254a, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, - 0x193d, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, - 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, - 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x97b9, - 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, 0x1945, 0x4003, 0x60c3, - 0x0074, 0x0804, 0x8f8f, 0x080c, 0x8aa4, 0x7003, 0x2010, 0x7007, - 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, - 0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, - 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x8a54, - 0x7026, 0x60c3, 0x0014, 0x0804, 0x8f8f, 0x080c, 0x8aa4, 0x7003, - 0x5000, 0x0804, 0x892d, 0x080c, 0x8aa4, 0x7003, 0x2110, 0x7007, - 0x0014, 0x60c3, 0x0014, 0x0804, 0x8f8f, 0x080c, 0x8ae6, 0x0010, - 0x080c, 0x8aef, 0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x8f8f, - 0x080c, 0x8aef, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, - 0x60c3, 0x0008, 0x0804, 0x8f8f, 0x080c, 0x8aef, 0x7003, 0x0200, - 0x0804, 0x892d, 0x080c, 0x8aef, 0x7003, 0x0100, 0x782c, 0x9005, - 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, - 0x0008, 0x0804, 0x8f8f, 0x00d6, 0x080c, 0x8aef, 0x7003, 0x0210, - 0x7007, 0x0014, 0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, - 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, - 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, - 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, - 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, - 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x2009, 0x1875, 0x210c, - 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, 0x1873, 0x210c, - 0xd1e4, 0x0150, 0xc0c5, 0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, - 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, - 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, - 0x00de, 0x0804, 0x8f8f, 0x080c, 0x8aef, 0x7003, 0x0210, 0x7007, - 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, 0x8f8f, 0x080c, - 0x8aef, 0x7003, 0x0200, 0x0804, 0x88b3, 0x080c, 0x8aef, 0x7003, - 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, - 0x8f8f, 0x080c, 0x8aef, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, - 0x0008, 0x0804, 0x8f8f, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, - 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, - 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x97ce, 0xb810, 0x9305, - 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, - 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, - 0x8f7d, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, - 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x97ce, 0x7003, 0x02ff, - 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, - 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, - 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, - 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, - 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, - 0x97ce, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, - 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, - 0x700f, 0xfffe, 0x0020, 0x6874, 0x700a, 0x6878, 0x700e, 0x0000, - 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8f7d, - 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, - 0x0005, 0x080c, 0x8f7d, 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, - 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, - 0x0a0c, 0x0db2, 0x908a, 0x0092, 0x1a0c, 0x0db2, 0x6110, 0x2158, - 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8b5d, 0x8b6c, - 0x8b77, 0x8b5b, 0x8b5b, 0x8b5b, 0x8b5d, 0x8b5b, 0x8b5b, 0x8b5b, - 0x8b5b, 0x8b5b, 0x8b5b, 0x080c, 0x0db2, 0x0411, 0x60c3, 0x0000, - 0x0026, 0x080c, 0x283d, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, - 0x2012, 0x002e, 0x0804, 0x8f8f, 0x0431, 0x7808, 0x700a, 0x7814, - 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, 0x8f8f, 0x0479, - 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x0804, 0x8f8f, - 0x0026, 0x080c, 0x97ce, 0xb810, 0x9085, 0x8100, 0x7002, 0xb814, - 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013, - 0x0009, 0x0804, 0x8abf, 0x0026, 0x080c, 0x97ce, 0xb810, 0x9085, - 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, - 0x6878, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8b21, 0x0026, - 0x080c, 0x97ce, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001, 0x0099, - 0x7012, 0x0804, 0x8b21, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, - 0x0a0c, 0x0db2, 0x908a, 0x0054, 0x1a0c, 0x0db2, 0x7910, 0x2158, - 0xb9b0, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, - 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8bf2, 0x8c99, 0x8c6c, - 0x8dbb, 0x8bf0, 0x8bf0, 0x8bf0, 0x8bf0, 0x8bf0, 0x8bf0, 0x8bf0, - 0x930c, 0x9318, 0x9324, 0x9330, 0x8bf0, 0x9716, 0x8bf0, 0x9300, - 0x080c, 0x0db2, 0x0096, 0x780b, 0xffff, 0x080c, 0x8c48, 0x7914, - 0x2148, 0xa978, 0x7956, 0x7132, 0xa97c, 0x9184, 0x000f, 0x1118, - 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, - 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, - 0x9205, 0x7042, 0xd1ac, 0x0128, 0x7047, 0x0002, 0x080c, 0x1582, - 0x0050, 0xd1b4, 0x0118, 0x7047, 0x0001, 0x0028, 0x7047, 0x0000, - 0x9016, 0x2230, 0x0010, 0xaab0, 0xaeac, 0x726a, 0x766e, 0x20a9, - 0x0008, 0x20e9, 0x0000, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, - 0x2098, 0x20a1, 0x0252, 0x2069, 0x0200, 0x6813, 0x0018, 0x4003, - 0x6813, 0x0008, 0x60c3, 0x0020, 0x6017, 0x0009, 0x2001, 0x19d2, - 0x2003, 0x07d0, 0x2001, 0x19d1, 0x2003, 0x0009, 0x009e, 0x0005, - 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8bc, 0xd084, 0x0128, 0x7a46, - 0x7b14, 0x7b4a, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, - 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, - 0x1800, 0x6a74, 0x720a, 0x6a78, 0x720e, 0x7013, 0x0829, 0x2f10, - 0x7222, 0x7027, 0xffff, 0x0005, 0x00d6, 0x0096, 0x0081, 0x7814, - 0x2048, 0xa890, 0x7002, 0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac, - 0x700e, 0x60c3, 0x000c, 0x009e, 0x00de, 0x0804, 0x8f8f, 0x6813, - 0x0008, 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, - 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013, 0x0889, 0x080c, - 0x8f7d, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, - 0x0005, 0x00d6, 0x0096, 0x080c, 0x8d99, 0x7814, 0x2048, 0x080c, - 0xb5f9, 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, - 0x9006, 0x001b, 0x009e, 0x00de, 0x0005, 0x8cb7, 0x8d20, 0x8d30, - 0x8d56, 0x8d62, 0x8d73, 0x8d7b, 0x8cb5, 0x080c, 0x0db2, 0x0016, - 0x0036, 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, - 0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, - 0x701e, 0x003e, 0x001e, 0x2001, 0x1980, 0x2004, 0x60c2, 0x0804, - 0x8f8f, 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0db2, 0xaba8, - 0x7824, 0xd0cc, 0x1904, 0x8d1d, 0x7316, 0xa898, 0x701a, 0xa894, - 0x701e, 0xa8a4, 0x7026, 0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384, - 0x0300, 0x0570, 0xd3c4, 0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110, - 0xa8a4, 0x9108, 0x6810, 0x9085, 0x0010, 0x6812, 0x2011, 0x0258, - 0x20e9, 0x0000, 0x22a0, 0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0, - 0xa85c, 0x9080, 0x002c, 0x2098, 0x4003, 0x6810, 0x8000, 0x6812, - 0x2011, 0x0240, 0x22a0, 0x20a9, 0x0005, 0x4003, 0x6810, 0xc084, - 0x6812, 0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, - 0x61c2, 0x003e, 0x001e, 0x0804, 0x8f8f, 0xc3e5, 0x0804, 0x8cdc, - 0x2011, 0x0008, 0x2001, 0x180e, 0x2004, 0xd0a4, 0x0110, 0x2011, - 0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5, - 0x2011, 0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105, - 0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, - 0x7027, 0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500, - 0x704f, 0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240, - 0x700b, 0x2500, 0x60c3, 0x0032, 0x0804, 0x8f8f, 0x2011, 0x0028, - 0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, 0x8f8f, - 0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, - 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, - 0x0020, 0x0804, 0x8f8f, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108, - 0xc2e5, 0x7216, 0x0c08, 0x0036, 0x7b14, 0x9384, 0xff00, 0x7816, - 0x9384, 0x00ff, 0x8001, 0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5, - 0x7216, 0x003e, 0x0888, 0x0046, 0x2021, 0x0800, 0x0006, 0x7824, - 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e, - 0x0818, 0x00d6, 0x6813, 0x0008, 0xb810, 0x9085, 0x0700, 0x7002, - 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, - 0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0x8f7d, 0x721a, - 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, - 0x7013, 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, - 0x0013, 0x001e, 0x0005, 0x8dcb, 0x8dcb, 0x8dcd, 0x8dcb, 0x8dcb, - 0x8dcb, 0x8de7, 0x8dcb, 0x080c, 0x0db2, 0x7914, 0x918c, 0x08ff, - 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, - 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, - 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0x8f8f, 0x2009, - 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x97ce, - 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, - 0x1800, 0x6a74, 0x720a, 0x6a78, 0x720e, 0x7013, 0x0888, 0x918d, - 0x0008, 0x7116, 0x080c, 0x8f7d, 0x721a, 0x7a08, 0x7222, 0x2f10, - 0x7226, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, + 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x7908, 0xd1fc, 0x1198, + 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, + 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1b8c, 0x19d8, 0x012e, + 0x080c, 0x9dcb, 0x0858, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, + 0x1188, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0158, 0x2001, + 0x19e6, 0x2004, 0x9005, 0x11f0, 0x2001, 0x188b, 0x200c, 0xc185, + 0xc18c, 0x2102, 0x2f00, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, + 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, + 0x1b8c, 0x1904, 0x958a, 0x012e, 0x6a3c, 0x2278, 0x080c, 0x9d55, + 0x0804, 0x957e, 0x2011, 0x188b, 0x2204, 0xc08d, 0x2012, 0x0804, + 0x957e, 0x6a04, 0x9296, 0x0006, 0x0904, 0x9568, 0x0804, 0x9540, + 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x9604, 0x9609, 0x9a77, + 0x9b06, 0x9609, 0x9a77, 0x9b06, 0x9604, 0x9609, 0x9604, 0x9604, + 0x9604, 0x9604, 0x9604, 0x9604, 0x080c, 0x9317, 0x080c, 0x941c, + 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, + 0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x6110, 0x2158, 0xb9c0, 0x2c78, + 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x9675, 0x005b, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, + 0x015e, 0x00be, 0x0005, 0x97fa, 0x9835, 0x985e, 0x9906, 0x9928, + 0x992e, 0x993b, 0x9943, 0x994f, 0x9955, 0x9966, 0x9955, 0x99be, + 0x9943, 0x99ca, 0x99d0, 0x994f, 0x99d0, 0x99dc, 0x9673, 0x9673, + 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, + 0x9673, 0xa163, 0xa186, 0xa197, 0xa1b7, 0xa1e9, 0x993b, 0x9673, + 0x993b, 0x9955, 0x9673, 0x985e, 0x9906, 0x9673, 0xa5b3, 0x9955, + 0x9673, 0xa5cf, 0x9955, 0x9673, 0x994f, 0x97f4, 0x9696, 0x9673, + 0xa5eb, 0xa658, 0xa72f, 0x9673, 0xa73c, 0x9938, 0xa767, 0x9673, + 0xa1f3, 0xa794, 0x9673, 0x080c, 0x0dd5, 0x2100, 0x005b, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, + 0x00be, 0x0005, 0xa82f, 0xa8e1, 0x9694, 0x96bd, 0x9769, 0x9774, + 0x9694, 0x993b, 0x9694, 0x97bb, 0x97c7, 0x96d8, 0x9694, 0x96f3, + 0x9727, 0xaa49, 0xaa8e, 0x9955, 0x080c, 0x0dd5, 0x00d6, 0x0096, + 0x080c, 0x99ef, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, + 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, + 0x60c3, 0x0018, 0x080c, 0x9fd0, 0x009e, 0x00de, 0x0005, 0x7810, + 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xaad5, 0x1118, 0x9084, + 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, + 0x99ef, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, + 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, + 0x701e, 0x60c3, 0x0010, 0x080c, 0x9fd0, 0x009e, 0x00de, 0x0005, + 0x00d6, 0x0096, 0x080c, 0x99ef, 0x7003, 0x0500, 0x7814, 0x2048, + 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, + 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9fd0, + 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, + 0x080c, 0x99ef, 0x20e9, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000, + 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a1, 0x0016, + 0x200c, 0x2001, 0x0001, 0x080c, 0x2269, 0x080c, 0xd53f, 0x9006, + 0x080c, 0x2269, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, + 0x04d9, 0x080c, 0x9fd0, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, + 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a3a, 0x20e9, 0x0000, + 0x2001, 0x19a1, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, + 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a1, 0x0016, + 0x200c, 0x080c, 0xd53f, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, + 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fb2, 0x080c, 0x9fd0, + 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, + 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, + 0x0005, 0x080c, 0x99ef, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, + 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6, 0x00e6, 0x080c, 0x9a3a, + 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, + 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, + 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x978a, 0x2069, + 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9793, + 0x2069, 0x19b1, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cb, 0x20a9, + 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, + 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, + 0x8d68, 0x8e70, 0x1f04, 0x97a1, 0x60c3, 0x004c, 0x080c, 0x9fd0, + 0x00ee, 0x00de, 0x0005, 0x080c, 0x99ef, 0x7003, 0x6300, 0x7007, + 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6, + 0x0026, 0x0016, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x7814, 0x700e, + 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, + 0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, + 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, + 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9fd0, + 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, + 0x0804, 0x9fd0, 0x080c, 0x99ef, 0x7003, 0x5200, 0x2069, 0x1847, + 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2723, 0x710e, + 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x0254, 0x4003, 0x080c, 0xaad5, 0x1120, 0xb8a0, 0x9082, + 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, + 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, + 0x7036, 0x60c3, 0x001c, 0x0804, 0x9fd0, 0x080c, 0x99ef, 0x7003, + 0x0500, 0x080c, 0xaad5, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, + 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e, + 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, + 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, + 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9fd0, 0x080c, 0x99ef, + 0x9006, 0x080c, 0x6701, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, + 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, + 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, + 0xb8a0, 0x9086, 0x007e, 0x1904, 0x98cd, 0x00d6, 0x2069, 0x196c, + 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, + 0x9084, 0x2000, 0x7012, 0x080c, 0xaaec, 0x680c, 0x7016, 0x701f, + 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090, 0x6800, 0x700a, + 0x6804, 0x700e, 0x6808, 0x080c, 0x717d, 0x1118, 0x9084, 0x37ff, + 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xaaec, 0x680c, 0x7016, + 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xa816, 0x2069, 0x1974, + 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x54bb, 0xd0e4, + 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, 0x2004, + 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c, 0x60e0, 0x9106, + 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2764, 0x61e2, 0x001e, + 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, + 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, + 0x4003, 0x080c, 0xa816, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, + 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9fd0, 0x080c, 0x99ef, + 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, + 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, 0x1110, + 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, + 0x00d6, 0x0804, 0x999f, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9fd0, + 0x080c, 0x99ef, 0x7003, 0x5000, 0x0804, 0x9878, 0x080c, 0x99ef, + 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9fd0, + 0x080c, 0x9a31, 0x0010, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x60c3, + 0x0004, 0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0100, 0x700b, + 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c, + 0x9a3a, 0x7003, 0x0200, 0x0804, 0x9878, 0x080c, 0x9a3a, 0x7003, + 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, + 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6, 0x080c, + 0x9a3a, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894, + 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998, + 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, + 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, + 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, + 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, + 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, + 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbacc, 0xd28c, + 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, + 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, + 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9fd0, 0x080c, 0x9a3a, + 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, + 0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x0804, 0x97fe, + 0x080c, 0x9a3a, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, + 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0100, + 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x0026, 0x00d6, + 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, + 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, + 0xa82b, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, + 0x003e, 0x00de, 0x080c, 0x9fbe, 0x721a, 0x9f95, 0x0000, 0x7222, + 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, + 0xa82b, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, + 0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, + 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, + 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, + 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, + 0x2021, 0x0100, 0x080c, 0xa82b, 0xb810, 0x9305, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, + 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, 0x700a, + 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, + 0x00de, 0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, + 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9fbe, 0x721a, 0x7a08, + 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, + 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c, + 0x0dd5, 0x6110, 0x2158, 0xb9c0, 0x2c78, 0x2061, 0x0100, 0x619a, + 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x0005, 0x9aa8, 0x9ab7, 0x9ac2, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa8, + 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x080c, 0x0dd5, + 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2a57, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9fd0, 0x0431, + 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, + 0x0804, 0x9fd0, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, + 0x0004, 0x0804, 0x9fd0, 0x0026, 0x080c, 0xa82b, 0xb810, 0x9085, + 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, + 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9a0a, 0x0026, 0x080c, + 0xa82b, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, + 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, + 0x0804, 0x9a6c, 0x0026, 0x080c, 0xa82b, 0xb810, 0x9085, 0x8500, + 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, + 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x9a6c, 0x00b6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, + 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0dd5, 0x908a, 0x0054, 0x1a0c, + 0x0dd5, 0x7910, 0x2158, 0xb9c0, 0x2061, 0x0100, 0x619a, 0x9082, + 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, + 0x9b3d, 0x9be4, 0x9bb7, 0x9d06, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b, + 0x9b3b, 0x9b3b, 0x9b3b, 0xa369, 0xa375, 0xa381, 0xa38d, 0x9b3b, + 0xa773, 0x9b3b, 0xa35d, 0x080c, 0x0dd5, 0x0096, 0x780b, 0xffff, + 0x080c, 0x9b93, 0x7914, 0x2148, 0xa978, 0x7956, 0x7132, 0xa97c, + 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, + 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, + 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0128, 0x7047, + 0x0002, 0x080c, 0x1689, 0x0050, 0xd1b4, 0x0118, 0x7047, 0x0001, + 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0, 0xaeac, + 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069, 0x0200, + 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020, 0x6017, + 0x0009, 0x2001, 0x1a01, 0x2003, 0x07d0, 0x2001, 0x1a00, 0x2003, + 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8cc, + 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a, 0x9294, + 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, + 0xba14, 0x7206, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, + 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x00d6, + 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, 0xa88c, 0x7006, + 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, 0x009e, 0x00de, + 0x0804, 0x9fd0, 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, 0x7002, + 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, + 0x7013, 0x0889, 0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10, + 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9ce4, + 0x7814, 0x2048, 0x080c, 0xc823, 0x1130, 0x7814, 0x9084, 0x0700, + 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, 0x0005, + 0x9c02, 0x9c6b, 0x9c7b, 0x9ca1, 0x9cad, 0x9cbe, 0x9cc6, 0x9c00, + 0x080c, 0x0dd5, 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, 0x0118, + 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316, + 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, 0x19af, + 0x2004, 0x60c2, 0x0804, 0x9fd0, 0xc3e5, 0x0c88, 0x9186, 0x0001, + 0x190c, 0x0dd5, 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x9c68, 0x7316, + 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, 0xa8ac, 0x702e, + 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, 0x0110, 0xa8ac, + 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, 0x9085, 0x0010, + 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, 0x0156, 0x20a9, + 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, 0x2098, 0x4003, + 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, 0x20a9, 0x0005, + 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, 0x0003, 0x0118, + 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804, 0x9fd0, + 0xc3e5, 0x0804, 0x9c27, 0x2011, 0x0008, 0x2001, 0x180f, 0x2004, + 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216, + 0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016, 0x782c, 0x701a, + 0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc, + 0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f, 0x0008, 0x7043, + 0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069, 0x0200, 0x6813, + 0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3, 0x0032, 0x0804, + 0x9fd0, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3, + 0x0018, 0x0804, 0x9fd0, 0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824, + 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, + 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x9fd0, 0x2011, 0x0008, + 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, 0x0036, 0x7b14, + 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, 0x7824, + 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, 0x0046, 0x2021, + 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416, + 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, 0x0008, 0xb810, + 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, + 0x700a, 0x6880, 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898, + 0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, + 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, 0x7814, + 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x9d16, 0x9d16, + 0x9d18, 0x9d16, 0x9d16, 0x9d16, 0x9d32, 0x9d16, 0x080c, 0x0dd5, + 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, + 0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, + 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, + 0x0804, 0x9fd0, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, + 0x0016, 0x080c, 0xa82b, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, + 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, + 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x9fbe, 0x721a, + 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x00e6, 0x00d6, + 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, + 0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, 0x96b4, 0x0028, 0x0110, + 0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, 0x0028, 0x0140, 0x2001, + 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, 0x2001, + 0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, 0x0000, + 0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, 0x0008, 0xb88c, 0x8000, + 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, + 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, + 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, + 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, + 0x0000, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x0128, 0x609f, + 0x0000, 0x2001, 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f, + 0x00ff, 0x6027, 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0, + 0x080c, 0x830d, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00be, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, + 0x7810, 0x2058, 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, + 0x007e, 0x1250, 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x31d0, + 0x2015, 0x9294, 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480, + 0x70dc, 0xd0ac, 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80, + 0x0138, 0x9185, 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030, + 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, + 0x6077, 0x0000, 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, + 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, + 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, + 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, + 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, + 0x60d7, 0x0000, 0xbac0, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, + 0x0000, 0x00fe, 0x2009, 0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, + 0x830d, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, + 0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, - 0xb8a0, 0x2028, 0xb910, 0xba14, 0x7374, 0x7478, 0x7820, 0x90be, - 0x0006, 0x0904, 0x8eec, 0x90be, 0x000a, 0x1904, 0x8ea8, 0x609f, - 0x0000, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05c8, 0xaf90, 0x9784, + 0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480, 0x7820, 0x90be, + 0x0006, 0x0904, 0x9f2d, 0x90be, 0x000a, 0x1904, 0x9ee9, 0x609f, + 0x0000, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, - 0x2048, 0xa878, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, - 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, - 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, - 0x609f, 0x0000, 0x2001, 0x1835, 0x2004, 0xd0ac, 0x11a8, 0xd09c, - 0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, - 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, - 0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, - 0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, - 0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, - 0x8007, 0x607a, 0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, - 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, - 0x60d7, 0x0000, 0x080c, 0x97b3, 0x2009, 0x07d0, 0x60c4, 0x9084, - 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7ccc, 0x003e, - 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, - 0x7804, 0x9086, 0x0040, 0x0904, 0x8f28, 0x9185, 0x0100, 0x6062, - 0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, - 0x95d5, 0x60d7, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, - 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, - 0x7814, 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, - 0xa844, 0x60ca, 0xb86c, 0x60ce, 0xbab0, 0x629e, 0x080c, 0x97b3, - 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, - 0x1b58, 0x080c, 0x7ccc, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, - 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, - 0x0003, 0x9086, 0x0002, 0x0904, 0x8f44, 0x9185, 0x0100, 0x6062, - 0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, - 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, - 0x2f00, 0x6086, 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, - 0xa8b0, 0x60c6, 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, - 0xa8b0, 0x792c, 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, - 0x60d7, 0x0000, 0xbab0, 0x629e, 0x080c, 0x9790, 0x0804, 0x8ed8, - 0xb8bc, 0xd084, 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, - 0xa836, 0x2900, 0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, - 0x636a, 0x646e, 0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, - 0x60d7, 0x0000, 0x0804, 0x8ebb, 0x9185, 0x0700, 0x6062, 0x6266, - 0x636a, 0x646e, 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, - 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, - 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, - 0x7808, 0x6082, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, - 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0xbab0, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0x97b3, 0x0804, - 0x8ed8, 0x080c, 0x9790, 0x0804, 0x8ed8, 0x7a10, 0x00b6, 0x2258, - 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, - 0x00d6, 0x2069, 0x19b6, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, - 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x7cbe, 0x0005, 0x0016, - 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, - 0x0089, 0x080c, 0x7cbe, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, - 0x2102, 0x2001, 0x19b7, 0x2003, 0x0000, 0x2001, 0x19bf, 0x2003, - 0x0000, 0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, - 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, - 0x61a4, 0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, - 0x6016, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, - 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, - 0x0140, 0x080c, 0x6c53, 0x11e8, 0x2001, 0x19d2, 0x2004, 0x9005, - 0x1904, 0x9021, 0x0066, 0x2031, 0x0001, 0x080c, 0x6d03, 0x006e, - 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, - 0x090c, 0x0db2, 0x080c, 0x7cbe, 0x0460, 0x00c6, 0x2061, 0x19b6, - 0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0x8fbb, 0x080c, - 0x2997, 0x00c6, 0x2061, 0x19b6, 0x6128, 0x9192, 0x0008, 0x1258, - 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x7cbe, - 0x080c, 0x8fb2, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, - 0xd358, 0x080c, 0x7cc7, 0x2009, 0x0014, 0x080c, 0x9a50, 0x00ce, - 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d2, - 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b6, 0x6128, 0x9192, - 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x7cbe, 0x080c, - 0x58e0, 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, - 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x7cd4, 0x2071, - 0x19b6, 0x713c, 0x81ff, 0x0904, 0x90ad, 0x2061, 0x0100, 0x2069, - 0x0140, 0x080c, 0x6c53, 0x11b0, 0x0036, 0x2019, 0x0002, 0x080c, - 0x9254, 0x003e, 0x713c, 0x2160, 0x080c, 0xd358, 0x2009, 0x004a, - 0x080c, 0x9a50, 0x0066, 0x2031, 0x0001, 0x080c, 0x6d03, 0x006e, - 0x0804, 0x90ad, 0x6904, 0xd1f4, 0x0904, 0x90b4, 0x080c, 0x2997, - 0x00c6, 0x703c, 0x9065, 0x090c, 0x0db2, 0x6020, 0x00ce, 0x9086, - 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, - 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, - 0x9294, 0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, - 0x080c, 0x28ea, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, - 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, 0x9a50, 0x0070, 0x0036, - 0x2019, 0x0001, 0x080c, 0x9254, 0x003e, 0x713c, 0x2160, 0x080c, - 0xd358, 0x2009, 0x004a, 0x080c, 0x9a50, 0x002e, 0x001e, 0x00ee, - 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x906e, 0x0804, - 0x9070, 0x0026, 0x00e6, 0x2071, 0x19b6, 0x7048, 0xd084, 0x01c0, - 0x713c, 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, - 0x928e, 0x0006, 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, - 0x7016, 0x0030, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, + 0x2048, 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, + 0x0510, 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, + 0x6086, 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, + 0x0000, 0x609f, 0x0000, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x11a8, + 0xd09c, 0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080, 0x1268, + 0xb814, 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, + 0x9185, 0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, + 0xaf94, 0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, + 0x636a, 0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, + 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0xa838, 0x608a, 0xa834, + 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, + 0x95d5, 0x60d7, 0x0000, 0x080c, 0xa810, 0x2009, 0x07d0, 0x60c4, + 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x830d, + 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, + 0x0005, 0x7804, 0x9086, 0x0040, 0x0904, 0x9f69, 0x9185, 0x0100, + 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, + 0x60af, 0x95d5, 0x60d7, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, + 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, + 0x6086, 0x7814, 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, + 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0xbac0, 0x629e, 0x080c, + 0xa810, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, + 0x2009, 0x1b58, 0x080c, 0x830d, 0x003e, 0x004e, 0x005e, 0x00ce, + 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, + 0x9084, 0x0003, 0x9086, 0x0002, 0x0904, 0x9f85, 0x9185, 0x0100, + 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, + 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, + 0x607e, 0x2f00, 0x6086, 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, + 0x608e, 0xa8b0, 0x60c6, 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, + 0x7932, 0xa8b0, 0x792c, 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, + 0x95d5, 0x60d7, 0x0000, 0xbac0, 0x629e, 0x080c, 0xa7ed, 0x0804, + 0x9f19, 0xb8cc, 0xd084, 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, + 0x7846, 0xa836, 0x2900, 0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, + 0x6266, 0x636a, 0x646e, 0x6073, 0x0829, 0x6077, 0x0000, 0x60af, + 0x9575, 0x60d7, 0x0000, 0x0804, 0x9efc, 0x9185, 0x0700, 0x6062, + 0x6266, 0x636a, 0x646e, 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, + 0x0889, 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, + 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, + 0x6086, 0x7808, 0x6082, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, + 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, + 0x0000, 0xbac0, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0xa810, + 0x0804, 0x9f19, 0x080c, 0xa7ed, 0x0804, 0x9f19, 0x7a10, 0x00b6, + 0x2258, 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, + 0x0005, 0x00d6, 0x2069, 0x19e5, 0x6843, 0x0001, 0x00de, 0x0005, + 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x82ff, 0x0005, + 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, + 0x0128, 0x0089, 0x080c, 0x82ff, 0x001e, 0x0005, 0xc1e5, 0x2001, + 0x180c, 0x2102, 0x2001, 0x19e6, 0x2003, 0x0000, 0x2001, 0x19ee, + 0x2003, 0x0000, 0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, + 0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, + 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, + 0x0008, 0x6016, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, + 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, + 0x2069, 0x0140, 0x080c, 0x717d, 0x11e8, 0x2001, 0x1a01, 0x2004, + 0x9005, 0x1904, 0xa062, 0x0066, 0x2031, 0x0001, 0x080c, 0x722d, + 0x006e, 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, + 0xd084, 0x090c, 0x0dd5, 0x080c, 0x82ff, 0x0460, 0x00c6, 0x2061, + 0x19e5, 0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0x9ffc, + 0x080c, 0x2bb1, 0x00c6, 0x2061, 0x19e5, 0x6128, 0x9192, 0x0008, + 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, + 0x82ff, 0x080c, 0x9ff3, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, + 0x080c, 0xe6a1, 0x080c, 0x8308, 0x2009, 0x0014, 0x080c, 0xabe6, + 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, + 0x1a01, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e5, 0x6128, + 0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x82ff, + 0x080c, 0x5cb7, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, + 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8315, + 0x2071, 0x19e5, 0x713c, 0x81ff, 0x0904, 0xa102, 0x2061, 0x0100, + 0x2069, 0x0140, 0x080c, 0x717d, 0x1500, 0x0036, 0x2019, 0x0002, + 0x080c, 0xa2ac, 0x003e, 0x713c, 0x2160, 0x080c, 0xe6a1, 0x2009, + 0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, + 0x0006, 0x2009, 0x004a, 0x080c, 0xabe6, 0x0066, 0x2031, 0x0001, + 0x080c, 0x722d, 0x006e, 0x0804, 0xa102, 0x6904, 0xd1f4, 0x0904, + 0xa109, 0x080c, 0x2bb1, 0x00c6, 0x703c, 0x9065, 0x090c, 0x0dd5, + 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105, + 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294, + 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0030, 0xc0d4, + 0x200a, 0xd0cc, 0x0110, 0x080c, 0x2b04, 0x6014, 0x9084, 0xe7fd, + 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, + 0xabe6, 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x003e, + 0x713c, 0x2160, 0x080c, 0xe6a1, 0x2009, 0x004a, 0x6220, 0x9296, + 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, + 0x080c, 0xabe6, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, + 0x0005, 0xd1ec, 0x1904, 0xa0b9, 0x0804, 0xa0bb, 0x0026, 0x00e6, + 0x2071, 0x19e5, 0x7048, 0xd084, 0x01d8, 0x713c, 0x81ff, 0x01c0, + 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, + 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0048, 0x928e, + 0x0009, 0x0db0, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, - 0xbca0, 0x2071, 0x19b6, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, + 0xbca0, 0x2071, 0x19e5, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, - 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x60b0, 0x0110, 0x9085, + 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x64ff, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, - 0x00ee, 0x00be, 0x0005, 0x080c, 0x8aa4, 0x7003, 0x1200, 0x7838, + 0x00ee, 0x00be, 0x0005, 0x080c, 0x99ef, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, - 0x0020, 0x2061, 0x1800, 0x6074, 0x6178, 0x9084, 0x00ff, 0x700a, - 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x8f8f, 0x080c, 0x8aa4, + 0x0020, 0x2061, 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, + 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x9fd0, 0x080c, 0x99ef, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, - 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f8f, 0x0156, - 0x080c, 0x8aef, 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, - 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, - 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, - 0x1f04, 0x9150, 0x60c3, 0x001c, 0x015e, 0x0804, 0x8f8f, 0x0016, - 0x0026, 0x080c, 0x8acb, 0x080c, 0x8add, 0x9e80, 0x0004, 0x20e9, + 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x0156, + 0x080c, 0x9a3a, 0x7003, 0x0200, 0x080c, 0x8368, 0x20a9, 0x0006, + 0x2011, 0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, 0x2305, 0x2072, + 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, + 0x1f04, 0xa1a6, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9fd0, 0x0016, + 0x0026, 0x080c, 0x9a16, 0x080c, 0x9a28, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, - 0x8003, 0x60c2, 0x080c, 0x8f8f, 0x002e, 0x001e, 0x0005, 0x20a9, - 0x0010, 0x4003, 0x080c, 0x97b9, 0x20a1, 0x0240, 0x22a8, 0x4003, - 0x0c68, 0x080c, 0x8aa4, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, - 0x0008, 0x0804, 0x8f8f, 0x0016, 0x0026, 0x080c, 0x8aa4, 0x20e9, + 0x8003, 0x60c2, 0x080c, 0x9fd0, 0x002e, 0x001e, 0x0005, 0x20a9, + 0x0010, 0x4003, 0x080c, 0xa816, 0x20a1, 0x0240, 0x22a8, 0x4003, + 0x0c68, 0x080c, 0x99ef, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, + 0x0008, 0x0804, 0x9fd0, 0x0016, 0x0026, 0x080c, 0x99ef, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, - 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x8f8f, + 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9fd0, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0x19b6, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, - 0xb7fa, 0x1110, 0x080c, 0xa364, 0x600c, 0x0006, 0x080c, 0xba61, - 0x080c, 0x99d6, 0x080c, 0x933f, 0x00ce, 0x0c78, 0x2c00, 0x700e, + 0x8000, 0x2071, 0x19e5, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, + 0xca24, 0x1110, 0x080c, 0xb51d, 0x600c, 0x0006, 0x080c, 0xcc8b, + 0x080c, 0xab6b, 0x080c, 0xa39c, 0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, - 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b6, 0x7024, 0x2060, - 0x8cff, 0x01f8, 0x080c, 0x8fbb, 0x6ac0, 0x68c3, 0x0000, 0x080c, - 0x7cc7, 0x00c6, 0x2061, 0x0100, 0x080c, 0x97d2, 0x00ce, 0x20a9, - 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0x9a50, 0x000e, 0x001e, + 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e5, 0x7024, 0x2060, + 0x8cff, 0x01f8, 0x080c, 0x9ffc, 0x6ac0, 0x68c3, 0x0000, 0x080c, + 0x8308, 0x00c6, 0x2061, 0x0100, 0x080c, 0xa967, 0x00ce, 0x20a9, + 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0xabe6, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, - 0x0004, 0x0d60, 0x080c, 0x7cc7, 0x6814, 0x9084, 0x0001, 0x0110, - 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x588a, - 0x080c, 0x7c4a, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, - 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2997, - 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x9236, - 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, - 0x9006, 0x080c, 0x2987, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, + 0x0004, 0x0d60, 0x080c, 0x8308, 0x6814, 0x9084, 0x0001, 0x0110, + 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x5c61, + 0x080c, 0x8285, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, + 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2bb1, + 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0xa28e, + 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, + 0x9006, 0x080c, 0x2ba1, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, - 0x2079, 0x0140, 0x2071, 0x19b6, 0x703c, 0x2060, 0x8cff, 0x0904, - 0x92e1, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, - 0x92e1, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, - 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x7cd4, 0x080c, 0x1d14, - 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, + 0x2079, 0x0140, 0x2071, 0x19e5, 0x703c, 0x2060, 0x8cff, 0x0904, + 0xa33e, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, + 0xa33e, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, + 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8315, 0x080c, 0x1ebc, + 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e51, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, - 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a34, + 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a64, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, - 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x1950, 0x2004, 0x200a, - 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, - 0x7804, 0x9084, 0x4000, 0x190c, 0x2997, 0x0090, 0xd08c, 0x0118, - 0x6827, 0x0002, 0x0010, 0x1f04, 0x92bb, 0x7804, 0x9084, 0x1000, - 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, - 0x6827, 0x4000, 0x6824, 0x83ff, 0x1120, 0x2009, 0x0049, 0x080c, - 0x9a50, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, - 0x2069, 0x19b6, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, - 0x2091, 0x8000, 0x2069, 0x19b6, 0x6a32, 0x012e, 0x00de, 0x0005, - 0x080c, 0x8c48, 0x7814, 0x080c, 0x511b, 0x0108, 0x782c, 0x7032, - 0x7042, 0x7047, 0x1000, 0x0478, 0x080c, 0x8c48, 0x7814, 0x080c, - 0x511b, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, - 0x080c, 0x8c48, 0x7814, 0x080c, 0x511b, 0x0108, 0x782c, 0x7032, - 0x7042, 0x7047, 0x2000, 0x00b8, 0x080c, 0x8c48, 0x7814, 0x080c, - 0x511b, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, - 0x080c, 0x8c48, 0x7814, 0x080c, 0x511b, 0x0108, 0x782c, 0x7032, - 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x8f8f, 0x00e6, - 0x2071, 0x19b6, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, - 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, - 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, 0x7614, 0x2660, 0x2678, - 0x2039, 0x0001, 0x87ff, 0x0904, 0x93e4, 0x8cff, 0x0904, 0x93e4, - 0x6020, 0x9086, 0x0006, 0x1904, 0x93df, 0x88ff, 0x0138, 0x2800, - 0x9c06, 0x1904, 0x93df, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, - 0x1904, 0x93df, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x93df, - 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, - 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7cc7, 0x080c, - 0x9469, 0x7027, 0x0000, 0x0428, 0x080c, 0x7cc7, 0x6820, 0xd0b4, - 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, - 0x9469, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, - 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, - 0x2987, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, - 0x003e, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, - 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, - 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, - 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, - 0x080c, 0xb5f9, 0x0110, 0x080c, 0xcf91, 0x009e, 0x080c, 0x9a06, - 0x080c, 0x933f, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x935a, 0x2c78, - 0x600c, 0x2060, 0x0804, 0x935a, 0x9006, 0x012e, 0x000e, 0x006e, - 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, - 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, + 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x197f, 0x200c, 0x080c, + 0x0e51, 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, + 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2bb1, 0x0090, 0xd08c, + 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0xa314, 0x7804, 0x9084, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, + 0x2ba1, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1140, 0x2009, 0x0049, + 0x6020, 0x9086, 0x0009, 0x0110, 0x080c, 0xabe6, 0x000e, 0x001e, + 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, + 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e5, 0x6a06, + 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, + 0x19e5, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x9b93, 0x7814, + 0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x1000, + 0x0478, 0x080c, 0x9b93, 0x7814, 0x080c, 0x54bf, 0x0108, 0x782c, + 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, 0x9b93, 0x7814, + 0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x2000, + 0x00b8, 0x080c, 0x9b93, 0x7814, 0x080c, 0x54bf, 0x0108, 0x782c, + 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, 0x9b93, 0x7814, + 0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0200, + 0x60c3, 0x0020, 0x0804, 0x9fd0, 0x00e6, 0x2071, 0x19e5, 0x7020, + 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19e5, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, + 0x0904, 0xa441, 0x8cff, 0x0904, 0xa441, 0x6020, 0x9086, 0x0006, + 0x1904, 0xa43c, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0xa43c, + 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0xa43c, 0x85ff, + 0x0120, 0x6054, 0x9106, 0x1904, 0xa43c, 0x7024, 0x9c06, 0x15b0, + 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, 0x0148, + 0x6827, 0x0001, 0x080c, 0x8308, 0x080c, 0xa4c6, 0x7027, 0x0000, + 0x0428, 0x080c, 0x8308, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, + 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, + 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100, + 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7014, 0x9c36, + 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, + 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, + 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168, + 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xc823, 0x0110, + 0x080c, 0xe223, 0x009e, 0x080c, 0xab9c, 0x080c, 0xa39c, 0x88ff, + 0x1190, 0x00ce, 0x0804, 0xa3b7, 0x2c78, 0x600c, 0x2060, 0x0804, + 0xa3b7, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001, + 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7638, 0x2660, + 0x2678, 0x8cff, 0x0904, 0xa4b5, 0x6020, 0x9086, 0x0006, 0x1904, + 0xa4b0, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0xa4b0, 0x0040, + 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0, + 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac, + 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, 0x003e, + 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xc823, 0x0110, 0x080c, + 0xe223, 0x080c, 0xab9c, 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa461, + 0x2c78, 0x600c, 0x2060, 0x0804, 0xa461, 0x9006, 0x012e, 0x000e, + 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, + 0x19e5, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, + 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x19b6, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9458, 0x6020, - 0x9086, 0x0006, 0x1904, 0x9453, 0x87ff, 0x0128, 0x2700, 0x9c06, - 0x1904, 0x9453, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, - 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, - 0x0001, 0x080c, 0x9254, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, - 0x7046, 0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, - 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, - 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, - 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, - 0xb5f9, 0x0110, 0x080c, 0xcf91, 0x080c, 0x9a06, 0x87ff, 0x1198, - 0x00ce, 0x0804, 0x9404, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9404, - 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, - 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, - 0x0c80, 0x00e6, 0x2071, 0x19b6, 0x2001, 0x1800, 0x2004, 0x9086, - 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, - 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0x19b6, 0x2c10, 0x7638, 0x2660, 0x2678, - 0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, - 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, - 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, - 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, - 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, - 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, - 0x2071, 0x19b6, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9545, - 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x9540, + 0x19e5, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, + 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, + 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, + 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, + 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, + 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x760c, + 0x2660, 0x2678, 0x8cff, 0x0904, 0xa5a2, 0x6010, 0x00b6, 0x2058, + 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa59d, 0x7024, 0x9c06, 0x1520, + 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xa579, 0x080c, 0x9ffc, + 0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, + 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, + 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, + 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xca13, + 0x1158, 0x080c, 0x3093, 0x080c, 0xca24, 0x11f0, 0x080c, 0xb51d, + 0x00d8, 0x080c, 0xa4c6, 0x08c0, 0x080c, 0xca24, 0x1118, 0x080c, + 0xb51d, 0x0090, 0x6014, 0x2048, 0x080c, 0xc823, 0x0168, 0x6020, + 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0x6a3a, 0x080c, 0xca07, 0x080c, 0xcc8b, 0x080c, 0xab9c, + 0x080c, 0xa39c, 0x00ce, 0x0804, 0xa522, 0x2c78, 0x600c, 0x2060, + 0x0804, 0xa522, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, + 0x080c, 0xe223, 0x0c08, 0x00d6, 0x080c, 0x9a3a, 0x7003, 0x0200, + 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1987, + 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, + 0x0004, 0x7027, 0x7878, 0x080c, 0x9fd0, 0x00de, 0x0005, 0x080c, + 0x9a3a, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, + 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7858, 0x9084, 0x00ff, + 0x9085, 0x0200, 0x7002, 0x7858, 0x9084, 0xff00, 0x8007, 0x7006, + 0x60c2, 0x0804, 0x9fd0, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, + 0x2009, 0x0035, 0x080c, 0xce90, 0x00de, 0x1904, 0xa650, 0x080c, + 0x99ef, 0x7003, 0x1300, 0x782c, 0x080c, 0xa752, 0x2068, 0x6820, + 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xaad5, + 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, + 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, + 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, + 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, + 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, 0x00a8, 0x080c, + 0xaad5, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, + 0x00d6, 0x2069, 0x181f, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, + 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, + 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x9fd0, 0x00be, 0x0005, + 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, + 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, + 0x0003, 0x0904, 0xa6ca, 0x9186, 0x0005, 0x0904, 0xa6b3, 0x9186, + 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0xa6bb, 0x7807, 0x0037, + 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0xa72f, 0x0005, 0x080c, + 0xa6f0, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, + 0x0002, 0xa694, 0xa69f, 0xa696, 0xa69f, 0xa69b, 0xa694, 0xa694, + 0xa69f, 0xa69f, 0xa69f, 0xa69f, 0xa694, 0xa694, 0xa694, 0xa694, + 0xa694, 0xa69f, 0xa694, 0xa69f, 0x080c, 0x0dd5, 0x6824, 0xd0e4, + 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, + 0x7022, 0x6830, 0x7026, 0x0804, 0xa6e9, 0x080c, 0xa6f0, 0x00d6, + 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, + 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026, 0x792c, 0x2168, + 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026, 0x792c, 0x2168, + 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108, + 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814, + 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e, + 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, 0x2004, 0x908e, + 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000, 0x0008, + 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804, 0x9fd0, + 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9a3a, 0x9006, + 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058, + 0xb8a0, 0x080c, 0xaad5, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6, + 0x2069, 0x181f, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000, 0x2b5c, + 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498, 0x2029, 0x0000, + 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, 0x0003, 0x1128, + 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, 0x7416, 0x751a, + 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, 0x0005, 0x080c, + 0x9a3a, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e, + 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c, 0x99e6, 0x7003, 0x1400, + 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830, + 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, + 0x0804, 0x9fd0, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, + 0x7810, 0x00b6, 0x2058, 0xb8cc, 0xd084, 0x0120, 0x7848, 0x702a, + 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, + 0x9a31, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, + 0x0008, 0x0804, 0x9fd0, 0x0021, 0x60c3, 0x0000, 0x0804, 0x9fd0, + 0x00d6, 0x080c, 0xa82b, 0xb810, 0x9085, 0x0300, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, + 0x0819, 0x080c, 0x9fbe, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226, + 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, 0x60c3, + 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2a57, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x9ff3, 0x080c, + 0x82ff, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048, + 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294, + 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff, + 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870, + 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa82b, + 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035, + 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, + 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096, + 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001, + 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4, + 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5, + 0x2102, 0x2009, 0x19b0, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010, + 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009, + 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009, + 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028, + 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x080c, + 0x99ef, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, + 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001, + 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa8d0, 0x7003, 0x5400, + 0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f, + 0x918c, 0xff00, 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c, + 0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290, + 0x0006, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa861, 0x20a9, + 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, + 0xa86b, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009, + 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, + 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa816, 0x00de, 0x2071, + 0x0240, 0x2011, 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002, + 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9, + 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c, + 0x9080, 0x0031, 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, + 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c, + 0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0028, 0x1168, 0x080c, 0x717d, 0x0150, 0x6028, 0xc0bd, 0x602a, + 0x6014, 0x9084, 0x1804, 0x9085, 0x0029, 0x6016, 0x0010, 0x080c, + 0x9fd0, 0x080c, 0x82ff, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002, + 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804, + 0xa846, 0x080c, 0x99ef, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, + 0x2048, 0x7013, 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084, + 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c, + 0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998, + 0x918c, 0xff00, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d, + 0x7112, 0x6180, 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c, + 0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001, + 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004, + 0x2009, 0x1805, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa922, + 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, + 0x1f04, 0xa92c, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xa816, + 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803, + 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa942, + 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0, + 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xa953, 0x00ce, + 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9fd0, + 0x080c, 0x82ff, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00d6, + 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, + 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, + 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, + 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6, + 0x0096, 0x6014, 0x2048, 0xa878, 0x6056, 0x9006, 0xa836, 0xa83a, + 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003, + 0x0003, 0x600b, 0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900, + 0xa85a, 0xa813, 0x1f48, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000, + 0x080c, 0x9548, 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19e5, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0xaa35, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, - 0x951c, 0x080c, 0x8fbb, 0x68c3, 0x0000, 0x080c, 0x9469, 0x7027, + 0xaa0c, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, 0x080c, 0x2987, 0x2069, + 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, - 0x0000, 0x080c, 0xb7e9, 0x1158, 0x080c, 0x2e55, 0x080c, 0xb7fa, - 0x11f0, 0x080c, 0xa364, 0x00d8, 0x080c, 0x9469, 0x08c0, 0x080c, - 0xb7fa, 0x1118, 0x080c, 0xa364, 0x0090, 0x6014, 0x2048, 0x080c, - 0xb5f9, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, - 0xab7a, 0xa877, 0x0000, 0x080c, 0x6529, 0x080c, 0xb7dd, 0x080c, - 0xba61, 0x080c, 0x9a06, 0x080c, 0x933f, 0x00ce, 0x0804, 0x94c5, - 0x2c78, 0x600c, 0x2060, 0x0804, 0x94c5, 0x012e, 0x000e, 0x002e, - 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, - 0x9086, 0x0006, 0x1d20, 0x080c, 0xcf91, 0x0c08, 0x00d6, 0x080c, - 0x8aef, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, - 0x0001, 0x2099, 0x1958, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, - 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8f8f, - 0x00de, 0x0005, 0x080c, 0x8aef, 0x700b, 0x0800, 0x7814, 0x9084, - 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, - 0x7858, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858, 0x9084, - 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x8f8f, 0x00b6, 0x00d6, - 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xbc66, 0x00de, - 0x1904, 0x95f3, 0x080c, 0x8aa4, 0x7003, 0x1300, 0x782c, 0x080c, - 0x96f5, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, - 0xbaa0, 0x080c, 0x9940, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, - 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, - 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, - 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, - 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, - 0x700e, 0x00a8, 0x080c, 0x9940, 0x1130, 0x7810, 0x2058, 0xb8a0, - 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181d, 0x2d04, 0x700a, - 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, - 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, - 0x8f8f, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, - 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, - 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0x966d, 0x9186, 0x0005, - 0x0904, 0x9656, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, - 0x965e, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, - 0x96d2, 0x0005, 0x080c, 0x9693, 0x00d6, 0x0026, 0x792c, 0x2168, - 0x2009, 0x4000, 0x6800, 0x0002, 0x9637, 0x9642, 0x9639, 0x9642, - 0x963e, 0x9637, 0x9637, 0x9642, 0x9642, 0x9642, 0x9642, 0x9637, - 0x9637, 0x9637, 0x9637, 0x9637, 0x9642, 0x9637, 0x9642, 0x080c, - 0x0db2, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, - 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x968c, - 0x080c, 0x9693, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, - 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, - 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, - 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, - 0x9286, 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, - 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, - 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, - 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, - 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, - 0x00de, 0x0804, 0x8f8f, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, - 0x080c, 0x8aef, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, - 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0x9940, 0x1118, 0x9092, - 0x007e, 0x0268, 0x00d6, 0x2069, 0x181d, 0x2d2c, 0x8d68, 0x2d34, - 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, - 0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, - 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, - 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, - 0x00be, 0x0005, 0x080c, 0x8aef, 0x7003, 0x0100, 0x782c, 0x700a, - 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f8f, 0x080c, - 0x8a9b, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, - 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, - 0x701a, 0x60c3, 0x0010, 0x0804, 0x8f8f, 0x00e6, 0x2071, 0x0240, - 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, - 0x0120, 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, - 0x00ee, 0x0005, 0x080c, 0x8ae6, 0x7003, 0x0100, 0x782c, 0x700a, - 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f8f, 0x0021, 0x60c3, - 0x0000, 0x0804, 0x8f8f, 0x00d6, 0x080c, 0x97ce, 0xb810, 0x9085, - 0x0300, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, - 0x6878, 0x700e, 0x7013, 0x0819, 0x080c, 0x8f7d, 0x721a, 0x2f10, - 0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, - 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, - 0x283d, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, - 0x080c, 0x8fb2, 0x080c, 0x7cbe, 0x0005, 0x0036, 0x0096, 0x00d6, - 0x00e6, 0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, - 0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, - 0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, - 0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, - 0x0200, 0x080c, 0x97ce, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, - 0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, - 0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, - 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, - 0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, - 0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, - 0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, - 0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x1981, 0x210c, 0x009e, - 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, - 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, - 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, - 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, - 0x6912, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, - 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, - 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, - 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, - 0x00de, 0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878, 0x6056, - 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, - 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, 0x0001, - 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, 0x1da0, 0x080c, 0x8065, - 0x0126, 0x2091, 0x8000, 0x080c, 0x865d, 0x012e, 0x009e, 0x00de, - 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, - 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, 0x760c, 0x2660, 0x2678, - 0x8cff, 0x0904, 0x98a0, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, - 0x68c0, 0x9005, 0x0904, 0x9877, 0x080c, 0x8fbb, 0x68c3, 0x0000, - 0x080c, 0x9469, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, - 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2987, 0x9006, - 0x080c, 0x2987, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, - 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, - 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, - 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, - 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb7e9, 0x1158, 0x080c, - 0x2e55, 0x080c, 0xb7fa, 0x11f0, 0x080c, 0xa364, 0x00d8, 0x080c, - 0x9469, 0x08c0, 0x080c, 0xb7fa, 0x1118, 0x080c, 0xa364, 0x0090, - 0x6014, 0x2048, 0x080c, 0xb5f9, 0x0168, 0x6020, 0x9086, 0x0003, - 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6536, - 0x080c, 0xb7dd, 0x080c, 0xba61, 0x080c, 0x9a06, 0x080c, 0x933f, - 0x00ce, 0x0804, 0x9828, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9828, - 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, - 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, - 0x1d08, 0x080c, 0xcf91, 0x08f0, 0x00d6, 0x0156, 0x080c, 0x8aef, - 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, - 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, - 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, - 0x6c53, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad4, 0xd29c, 0x1110, - 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, 0x63f0, 0x2312, - 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x2071, 0x0250, - 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, - 0x1f04, 0x98e8, 0x60c3, 0x0020, 0x080c, 0x8f8f, 0x015e, 0x00de, - 0x0005, 0x0156, 0x080c, 0x8aef, 0x7a14, 0x82ff, 0x0168, 0x9286, - 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, - 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, - 0x700f, 0x0001, 0x2011, 0x198c, 0x2204, 0x8007, 0x701a, 0x8210, - 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, - 0x0248, 0x2001, 0x181d, 0x2004, 0x7022, 0x2001, 0x181e, 0x2004, - 0x7026, 0x0030, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x7026, - 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, - 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x8f8f, - 0x0006, 0x2001, 0x1835, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, - 0x0003, 0x080c, 0x92ec, 0x2011, 0x0002, 0x080c, 0x92f6, 0x080c, - 0x91de, 0x0036, 0x901e, 0x080c, 0x9254, 0x003e, 0x0005, 0x080c, - 0x2f8b, 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, - 0x7012, 0x2009, 0x007e, 0x080c, 0x5f7e, 0xb85c, 0xc0ac, 0xb85e, - 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071, 0x1883, 0x7000, 0x9005, - 0x0140, 0x2001, 0x0976, 0x2071, 0x1800, 0x706e, 0x7072, 0x7063, - 0xffe0, 0x2071, 0x1800, 0x706c, 0x704e, 0x7053, 0x1cd0, 0x0005, - 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x754c, 0x9582, - 0x0010, 0x0608, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, - 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, - 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, - 0x9502, 0x1230, 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, - 0x7053, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, - 0x754c, 0x9582, 0x0010, 0x0600, 0x7050, 0x2060, 0x6000, 0x9086, - 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, - 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, - 0x0018, 0x7060, 0x9502, 0x1228, 0x7552, 0x9085, 0x0001, 0x00ee, - 0x0005, 0x7053, 0x1cd0, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, - 0x0a0c, 0x0db2, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a0c, 0x0db2, - 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, - 0x0000, 0x6003, 0x0000, 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, - 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x6042, 0x2061, 0x1800, - 0x604c, 0x8000, 0x604e, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, - 0x2091, 0x8000, 0x080c, 0x8582, 0x012e, 0x0cc0, 0x0006, 0x6000, - 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084, 0x190c, 0x1827, 0x6017, - 0x0000, 0x6023, 0x0007, 0x2001, 0x1955, 0x2004, 0x0006, 0x9082, - 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xd240, 0x6043, - 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, - 0x8000, 0x754c, 0x9582, 0x0001, 0x0608, 0x7050, 0x2060, 0x6000, - 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, - 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, - 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001, - 0x012e, 0x00ee, 0x0005, 0x7053, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, - 0x6020, 0x9084, 0x000f, 0x0002, 0x9a63, 0x9a6c, 0x9a87, 0x9aa2, - 0xbd12, 0xbd2f, 0xbd4a, 0x9a63, 0x9a6c, 0x9a63, 0x9abe, 0x9a63, - 0x9a63, 0x9a63, 0x9a63, 0x9186, 0x0013, 0x1128, 0x080c, 0x847d, - 0x080c, 0x8582, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, - 0x1a0c, 0x0db2, 0x0013, 0x006e, 0x0005, 0x9a85, 0xa1dd, 0xa3ab, - 0x9a85, 0xa439, 0x9d9f, 0x9a85, 0x9a85, 0xa15f, 0xa947, 0x9a85, - 0x9a85, 0x9a85, 0x9a85, 0x9a85, 0x9a85, 0x080c, 0x0db2, 0x0066, - 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db2, 0x0013, 0x006e, 0x0005, - 0x9aa0, 0xb012, 0x9aa0, 0x9aa0, 0x9aa0, 0x9aa0, 0x9aa0, 0x9aa0, - 0xafb7, 0xb194, 0x9aa0, 0xb053, 0xb0d2, 0xb053, 0xb0d2, 0x9aa0, - 0x080c, 0x0db2, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0db2, 0x6000, - 0x0002, 0x9abc, 0xa98e, 0xaa73, 0xaba3, 0xad45, 0x9abc, 0x9abc, - 0x9abc, 0xa962, 0xaf43, 0xaf46, 0x9abc, 0x9abc, 0x9abc, 0x9abc, - 0xaf75, 0x9abc, 0x9abc, 0x9abc, 0x080c, 0x0db2, 0x0066, 0x6000, - 0x90b2, 0x0016, 0x1a0c, 0x0db2, 0x0013, 0x006e, 0x0005, 0x9ad7, - 0x9ad7, 0x9b1a, 0x9bb8, 0x9c4c, 0x9ad7, 0x9ad7, 0x9ad7, 0x9ad9, - 0x9ad7, 0x9ad7, 0x9ad7, 0x9ad7, 0x9ad7, 0x9ad7, 0x9ad7, 0x080c, - 0x0db2, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0db2, - 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, - 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, - 0xa8b0, 0xa84a, 0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, - 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, - 0x009e, 0x2c10, 0x080c, 0x1976, 0x080c, 0x8065, 0x0126, 0x2091, - 0x8000, 0x080c, 0x865d, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, - 0xbca0, 0x00be, 0x2c00, 0x080c, 0x9c6e, 0x080c, 0xbd04, 0x6003, - 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a88, - 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, - 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, - 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, - 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, - 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, - 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, - 0x8423, 0x9405, 0x0002, 0x9b80, 0x9b80, 0x9b7b, 0x9b7e, 0x9b80, - 0x9b78, 0x9b6b, 0x9b6b, 0x9b6b, 0x9b6b, 0x9b6b, 0x9b6b, 0x9b6b, - 0x9b6b, 0x9b6b, 0x9b6b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, - 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0db2, - 0x080c, 0xa5d7, 0x0028, 0x080c, 0xa6b5, 0x0010, 0x080c, 0xa7a4, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, - 0x000e, 0x080c, 0x9d2c, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, - 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, - 0x0000, 0x2041, 0x1226, 0x080c, 0x9ed6, 0x0160, 0x000e, 0x9005, - 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, - 0x0804, 0x99d6, 0x2001, 0x002c, 0x900e, 0x080c, 0x9d92, 0x0c70, - 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, - 0x0a0c, 0x0db2, 0x91b2, 0x0050, 0x1a0c, 0x0db2, 0x9182, 0x0047, - 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7fb9, 0x002e, 0x001e, - 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, - 0x9b1a, 0x0005, 0x9beb, 0x9beb, 0x9bed, 0x9c22, 0x9beb, 0x9beb, - 0x9beb, 0x9beb, 0x9c35, 0x080c, 0x0db2, 0x00d6, 0x0016, 0x0096, - 0x080c, 0x8532, 0x080c, 0x865d, 0x6003, 0x0004, 0x6114, 0x2148, - 0xa87c, 0xd0fc, 0x01b8, 0xa878, 0x9005, 0x1158, 0xa894, 0x9005, - 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0x9d92, 0x080c, 0x99d6, + 0x0000, 0x080c, 0xca13, 0x1158, 0x080c, 0x3093, 0x080c, 0xca24, + 0x11f0, 0x080c, 0xb51d, 0x00d8, 0x080c, 0xa4c6, 0x08c0, 0x080c, + 0xca24, 0x1118, 0x080c, 0xb51d, 0x0090, 0x6014, 0x2048, 0x080c, + 0xc823, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6a46, 0x080c, 0xca07, 0x080c, + 0xcc8b, 0x080c, 0xab9c, 0x080c, 0xa39c, 0x00ce, 0x0804, 0xa9bd, + 0x2c78, 0x600c, 0x2060, 0x0804, 0xa9bd, 0x700f, 0x0000, 0x700b, + 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, + 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe223, + 0x08f0, 0x00d6, 0x0156, 0x080c, 0x9a3a, 0x7a14, 0x82ff, 0x0138, + 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, + 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, + 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x717d, 0x1110, 0xc3ad, + 0x0008, 0xc3a5, 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, + 0x730e, 0x080c, 0x8368, 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, + 0xfff5, 0x2071, 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, + 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xaa7b, 0x60c3, + 0x0020, 0x080c, 0x9fd0, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, + 0x9a3a, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, + 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, + 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, + 0x19bb, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, + 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, + 0x2004, 0x7022, 0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, + 0x1818, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, + 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, + 0x60c3, 0x001c, 0x015e, 0x0804, 0x9fd0, 0x0006, 0x2001, 0x1837, + 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa349, + 0x2011, 0x0002, 0x080c, 0xa353, 0x080c, 0xa236, 0x0036, 0x901e, + 0x080c, 0xa2ac, 0x003e, 0x0005, 0x080c, 0x31c9, 0x0188, 0x0016, + 0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, + 0x080c, 0x63cd, 0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, + 0x0005, 0x2071, 0x188d, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, + 0x2071, 0x1800, 0x7076, 0x707a, 0x706b, 0xffe0, 0x2071, 0x1800, + 0x7074, 0x7056, 0x705b, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, + 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0010, 0x0608, 0x7058, + 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, + 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, + 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a, + 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0, + 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, 0x0010, + 0x0600, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, + 0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, + 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, + 0x1228, 0x755a, 0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, 0x1cd0, + 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0dd5, 0x9006, 0x6006, 0x600a, + 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, + 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, + 0x603a, 0x603e, 0x6042, 0x602a, 0x2061, 0x1800, 0x6054, 0x8000, + 0x6056, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, + 0x080c, 0x941c, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, + 0x01b0, 0x601c, 0xd084, 0x190c, 0x19b4, 0x6017, 0x0000, 0x6023, + 0x0007, 0x2001, 0x1984, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, + 0x0208, 0x8004, 0x601a, 0x080c, 0xe4d8, 0x6043, 0x0000, 0x000e, + 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7554, + 0x9582, 0x0001, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, + 0x0148, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, + 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018, + 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee, + 0x0005, 0x705b, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, + 0x000f, 0x0002, 0xabf9, 0xac02, 0xac1d, 0xac38, 0xcf3e, 0xcf5b, + 0xcf76, 0xabf9, 0xac02, 0x8b1a, 0xac54, 0xabf9, 0xabf9, 0xabf9, + 0xabf9, 0x9186, 0x0013, 0x1128, 0x080c, 0x9317, 0x080c, 0x941c, + 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, + 0x0013, 0x006e, 0x0005, 0xac1b, 0xb389, 0xb564, 0xac1b, 0xb5fa, + 0xaf37, 0xac1b, 0xac1b, 0xb30b, 0xbb5f, 0xac1b, 0xac1b, 0xac1b, + 0xac1b, 0xac1b, 0xac1b, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, + 0x0016, 0x1a0c, 0x0dd5, 0x0013, 0x006e, 0x0005, 0xac36, 0xc233, + 0xac36, 0xac36, 0xac36, 0xac36, 0xac36, 0xac36, 0xc1d8, 0xc3b5, + 0xac36, 0xc274, 0xc2f3, 0xc274, 0xc2f3, 0xac36, 0x080c, 0x0dd5, + 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x0002, 0xac52, + 0xbba6, 0xbc8b, 0xbdbb, 0xbf66, 0xac52, 0xac52, 0xac52, 0xbb7a, + 0xc164, 0xc167, 0xac52, 0xac52, 0xac52, 0xac52, 0xc196, 0xac52, + 0xac52, 0xac52, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, + 0x1a0c, 0x0dd5, 0x0013, 0x006e, 0x0005, 0xac6d, 0xac6d, 0xacb0, + 0xad4f, 0xade4, 0xac6d, 0xac6d, 0xac6d, 0xac6f, 0xac6d, 0xac6d, + 0xac6d, 0xac6d, 0xac6d, 0xac6d, 0xac6d, 0x080c, 0x0dd5, 0x9186, + 0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0dd5, 0x0096, 0x601c, + 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, + 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, + 0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, + 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, + 0x080c, 0x1b03, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9548, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x080c, 0xae06, 0x080c, 0xcf30, 0x6003, 0x0007, 0x0005, + 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, + 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, + 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, + 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, + 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, + 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, + 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, + 0x9405, 0x0002, 0xad17, 0xad17, 0xad12, 0xad15, 0xad17, 0xad0f, + 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, + 0xad02, 0xad02, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, + 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dd5, 0x080c, + 0xb7b7, 0x0028, 0x080c, 0xb89c, 0x0010, 0x080c, 0xb992, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, + 0x080c, 0xaec4, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, + 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, + 0x2041, 0x1254, 0x080c, 0xb084, 0x0160, 0x000e, 0x9005, 0x0120, + 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, + 0xab6b, 0x2001, 0x002c, 0x900e, 0x080c, 0xaf2a, 0x0c70, 0x91b6, + 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, + 0x0dd5, 0x91b2, 0x0050, 0x1a0c, 0x0dd5, 0x9182, 0x0047, 0x00ca, + 0x2001, 0x0109, 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, 0x2800, + 0x0006, 0x0016, 0x0026, 0x080c, 0x8e31, 0x002e, 0x001e, 0x000e, + 0x012e, 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xacb0, + 0x0005, 0xad82, 0xad82, 0xad84, 0xadba, 0xad82, 0xad82, 0xad82, + 0xad82, 0xadcd, 0x080c, 0x0dd5, 0x00d6, 0x0016, 0x0096, 0x080c, + 0x93cc, 0x080c, 0x9548, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, + 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, + 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xaf2a, 0x080c, 0xab6b, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, - 0x00de, 0x0005, 0x080c, 0x8532, 0x00d6, 0x0096, 0x6114, 0x2148, - 0x080c, 0xb5fb, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6536, 0x009e, - 0x00de, 0x080c, 0x99d6, 0x0804, 0x865d, 0x080c, 0x8532, 0x080c, - 0x2e30, 0x080c, 0xbd01, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, - 0xb5fb, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6536, 0x009e, 0x00de, - 0x080c, 0x99d6, 0x0804, 0x865d, 0x9182, 0x0047, 0x0002, 0x9c5c, - 0x9c5e, 0x9c5c, 0x9c5c, 0x9c5c, 0x9c5c, 0x9c5c, 0x9c5c, 0x9c5c, - 0x9c5c, 0x9c5c, 0x9c5c, 0x9c5e, 0x080c, 0x0db2, 0x00d6, 0x0096, - 0x080c, 0x14c9, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, - 0x080c, 0x6536, 0x009e, 0x00de, 0x0804, 0x99d6, 0x0026, 0x0036, - 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0fd5, - 0x000e, 0x090c, 0x0db2, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, + 0x00de, 0x0005, 0x080c, 0x93cc, 0x00d6, 0x0096, 0x6114, 0x2148, + 0x080c, 0xc825, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6a46, 0x009e, + 0x00de, 0x080c, 0xab6b, 0x0804, 0x9548, 0x080c, 0x93cc, 0x080c, + 0x306e, 0x080c, 0xcf2d, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, + 0xc825, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6a46, 0x009e, 0x00de, + 0x080c, 0xab6b, 0x0804, 0x9548, 0x9182, 0x0047, 0x0002, 0xadf4, + 0xadf6, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4, + 0xadf4, 0xadf4, 0xadf4, 0xadf6, 0x080c, 0x0dd5, 0x00d6, 0x0096, + 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, + 0x080c, 0x6a46, 0x009e, 0x00de, 0x0804, 0xab6b, 0x0026, 0x0036, + 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1000, + 0x000e, 0x090c, 0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, - 0x7988, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, + 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, - 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xb219, 0x04c0, - 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xb219, 0x96b2, - 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0f87, 0x080c, 0x0fd5, + 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xc43a, 0x04c0, + 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xc43a, 0x96b2, + 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fb2, 0x080c, 0x1000, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, - 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xb219, + 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xc43a, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, - 0x080c, 0xb219, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, + 0x080c, 0xc43a, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, - 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x6536, + 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x6a46, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, - 0x080c, 0x0fd5, 0x000e, 0x090c, 0x0db2, 0xa960, 0x21e8, 0xa95c, + 0x080c, 0x1000, 0x000e, 0x090c, 0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, - 0xa87a, 0x2079, 0x1800, 0x7988, 0x810c, 0x9188, 0x000c, 0x9182, + 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, - 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x6536, + 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x6a46, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, - 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x0fd5, + 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x1000, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, - 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0x9d41, 0x0804, - 0x9d43, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, + 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xaed9, 0x0804, + 0xaedb, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, - 0xa982, 0x080c, 0x6529, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, - 0x0015, 0x1118, 0x080c, 0x99d6, 0x0030, 0x91b6, 0x0016, 0x190c, - 0x0db2, 0x080c, 0x99d6, 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, + 0xa982, 0x080c, 0x6a3a, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, + 0x0015, 0x1118, 0x080c, 0xab6b, 0x0030, 0x91b6, 0x0016, 0x190c, + 0x0dd5, 0x080c, 0xab6b, 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, - 0x080c, 0xb5fb, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0x009e, 0x0804, 0x99d6, 0x0096, 0x00d6, 0x0036, 0x7330, - 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf, 0x0000, + 0x080c, 0xc825, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, + 0x0103, 0x009e, 0x0804, 0xab6b, 0x0096, 0x00d6, 0x0036, 0x7330, + 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8cf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0xab32, 0x080c, 0x99d6, 0x003e, 0x00de, 0x009e, 0x0005, - 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xbcec, 0x0188, + 0x0103, 0xab32, 0x080c, 0xab6b, 0x003e, 0x00de, 0x009e, 0x0005, + 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xcf18, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x6043, - 0x0000, 0x2009, 0x0022, 0x080c, 0xa1b5, 0x9006, 0x001e, 0x000e, + 0x0000, 0x2009, 0x0022, 0x080c, 0xb361, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, @@ -4860,405 +5423,421 @@ 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048, 0xa800, - 0x2048, 0xa867, 0x0103, 0x080c, 0x99d6, 0x001e, 0x009e, 0x0005, + 0x2048, 0xa867, 0x0103, 0x080c, 0xab6b, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c, 0x6014, - 0x2048, 0x080c, 0xb219, 0x080c, 0xb5fb, 0x0140, 0x6014, 0x2048, - 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x99d6, - 0x001e, 0x009e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, - 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, - 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, - 0x0108, 0x2048, 0x080c, 0xb219, 0x009e, 0x080c, 0xb5fb, 0x0148, - 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, - 0x0103, 0x080c, 0x99d6, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, - 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xa364, 0x00e0, - 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, - 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, - 0x2041, 0x120c, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, - 0x080c, 0x0fd5, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, - 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, - 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x10b5, 0x008e, - 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, - 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, - 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, - 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, - 0xbc66, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, - 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0x99d6, - 0x0020, 0x0039, 0x0010, 0x080c, 0x9fe8, 0x002e, 0x00de, 0x00ee, - 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0x9fd0, - 0x918e, 0x0016, 0x1904, 0x9fe6, 0x700c, 0x908c, 0xff00, 0x9186, - 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0x9faa, 0x89ff, 0x1138, - 0x6800, 0x9086, 0x000f, 0x0904, 0x9f8d, 0x0804, 0x9fe4, 0x6808, - 0x9086, 0xffff, 0x1904, 0x9fd2, 0xa87c, 0x9084, 0x0060, 0x9086, - 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0x9fd2, 0x6824, - 0xd0b4, 0x1904, 0x9fd2, 0x080c, 0xb7dd, 0x685c, 0xa882, 0xa87c, - 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, - 0x000a, 0x080c, 0x7e7f, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, - 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xb33a, 0x00ce, - 0x0804, 0x9fe4, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5a9d, - 0x0010, 0x080c, 0x5e34, 0x00ce, 0x1904, 0x9fd2, 0x00c6, 0x2d60, - 0x080c, 0x99d6, 0x00ce, 0x0804, 0x9fe4, 0x00c6, 0x080c, 0x9a23, - 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xba69, 0x6023, - 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x99d6, 0x00ce, 0x080c, - 0x9a50, 0x00ce, 0x0804, 0x9fe4, 0x2001, 0x1957, 0x2004, 0x6842, - 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, - 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa883, - 0x0003, 0x080c, 0xbca8, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0002, 0x080c, 0x8000, 0x080c, 0x8582, 0x00ce, 0x00e8, 0x700c, - 0x9086, 0x2a00, 0x1138, 0x2001, 0x1957, 0x2004, 0x6842, 0x00a0, - 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0db2, 0x00c6, 0x00d6, 0x2d60, - 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6351, 0x080c, 0xb7dd, - 0x080c, 0x9a06, 0x00de, 0x00ce, 0x080c, 0x99d6, 0x009e, 0x0005, - 0x9186, 0x0015, 0x1128, 0x2001, 0x1957, 0x2004, 0x6842, 0x0068, - 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xd240, - 0x080c, 0x7e13, 0x080c, 0x99d6, 0x00ce, 0x080c, 0x99d6, 0x0005, - 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, - 0x2001, 0x1957, 0x2004, 0x6842, 0x0804, 0xa064, 0x00c6, 0x2d60, - 0x080c, 0xb244, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1170, 0x00c6, - 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x8000, - 0x080c, 0x8582, 0x00ce, 0x0804, 0xa064, 0x6800, 0x9086, 0x000f, - 0x01b0, 0x89ff, 0x090c, 0x0db2, 0x6800, 0x9086, 0x0004, 0x1198, - 0xa87c, 0xd0ac, 0x0180, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, - 0xc0f4, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, - 0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, - 0x6824, 0xd0f4, 0x1d40, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c18, - 0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, - 0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, - 0xb960, 0x080c, 0x8582, 0x0010, 0x080c, 0x99d6, 0x004e, 0x003e, - 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, - 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xa0cf, - 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, - 0xa0cf, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, - 0x0007, 0x0904, 0xa0cf, 0x9286, 0x0002, 0x0904, 0xa0cf, 0x9286, - 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, - 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, - 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, - 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, - 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb5fb, 0x090c, 0x0db2, - 0xa883, 0x0003, 0x009e, 0x080c, 0xbca8, 0x6007, 0x0085, 0x6003, - 0x000b, 0x6023, 0x0002, 0x080c, 0x8000, 0x080c, 0x8582, 0x00ce, - 0x0030, 0x6038, 0x2070, 0x2001, 0x1957, 0x2004, 0x7042, 0x080c, - 0x99d6, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, - 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, - 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, - 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, - 0x080c, 0xa91d, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xa13e, - 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, - 0x0006, 0x20a9, 0x0004, 0x080c, 0xa91d, 0x002e, 0x003e, 0x015e, - 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, - 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, - 0x9dd7, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, - 0x2041, 0x120c, 0x080c, 0x9ed6, 0x0130, 0x00fe, 0x009e, 0x080c, - 0x99d6, 0x00be, 0x0005, 0x080c, 0xa364, 0x0cb8, 0x2b78, 0x00f6, - 0x080c, 0x2e30, 0x080c, 0xbd01, 0x00fe, 0x00c6, 0x080c, 0x9980, - 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, - 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5ecf, 0x080c, 0x5efb, - 0x080c, 0x8048, 0x080c, 0x8582, 0x00ce, 0x0804, 0xa111, 0x2100, - 0x91b2, 0x0053, 0x1a0c, 0x0db2, 0x91b2, 0x0040, 0x1a04, 0xa1c7, - 0x0002, 0xa1b5, 0xa1b5, 0xa1ab, 0xa1b5, 0xa1b5, 0xa1b5, 0xa1a9, - 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1b5, 0xa1a9, 0xa1b5, 0xa1b5, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1a9, 0xa1ab, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1a9, 0xa1a9, 0xa1a9, 0xa1b5, 0xa1b5, 0xa1a9, 0xa1a9, 0xa1a9, - 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1a9, 0xa1b5, 0xa1a9, - 0xa1a9, 0x080c, 0x0db2, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8bc, - 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, - 0x9186, 0x0032, 0x0118, 0x080c, 0x8048, 0x0010, 0x080c, 0x8000, - 0x0126, 0x2091, 0x8000, 0x080c, 0x8582, 0x012e, 0x0005, 0x2600, - 0x0002, 0xa1db, 0xa1db, 0xa1db, 0xa1b5, 0xa1b5, 0xa1db, 0xa1db, - 0xa1db, 0xa1db, 0xa1b5, 0xa1db, 0xa1b5, 0xa1db, 0xa1b5, 0xa1db, - 0xa1db, 0xa1db, 0xa1db, 0x080c, 0x0db2, 0x6004, 0x90b2, 0x0053, - 0x1a0c, 0x0db2, 0x91b6, 0x0013, 0x0904, 0xa29f, 0x91b6, 0x0027, - 0x1904, 0xa25a, 0x080c, 0x847d, 0x6004, 0x080c, 0xb7e9, 0x01b0, - 0x080c, 0xb7fa, 0x01a8, 0x908e, 0x0021, 0x0904, 0xa257, 0x908e, - 0x0022, 0x1130, 0x080c, 0x9e03, 0x0904, 0xa253, 0x0804, 0xa254, - 0x908e, 0x003d, 0x0904, 0xa257, 0x0804, 0xa24d, 0x080c, 0x2e55, - 0x2001, 0x0007, 0x080c, 0x5ecf, 0x6010, 0x00b6, 0x2058, 0xb9a0, - 0x00be, 0x080c, 0xa364, 0x9186, 0x007e, 0x1148, 0x2001, 0x1835, - 0x2014, 0xc285, 0x080c, 0x6c53, 0x1108, 0xc2ad, 0x2202, 0x0036, - 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xd29b, 0x002e, 0x003e, - 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x8180, - 0x0076, 0x903e, 0x080c, 0x8078, 0x6010, 0x00b6, 0x905d, 0x0100, - 0x00be, 0x2c08, 0x080c, 0xcd62, 0x007e, 0x003e, 0x002e, 0x001e, - 0x080c, 0xbd01, 0x0016, 0x080c, 0xba61, 0x080c, 0x99d6, 0x001e, - 0x080c, 0x2f28, 0x080c, 0x8582, 0x0030, 0x080c, 0xba61, 0x080c, - 0x99d6, 0x080c, 0x8582, 0x0005, 0x080c, 0xa364, 0x0cb0, 0x080c, - 0xa3a0, 0x0c98, 0x9186, 0x0014, 0x1db0, 0x080c, 0x847d, 0x6004, - 0x908e, 0x0022, 0x1118, 0x080c, 0x9e03, 0x0d68, 0x080c, 0x2e30, - 0x080c, 0xbd01, 0x080c, 0xb7e9, 0x1190, 0x080c, 0x2e55, 0x6010, - 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa364, 0x9186, 0x007e, - 0x1128, 0x2001, 0x1835, 0x200c, 0xc185, 0x2102, 0x0870, 0x080c, - 0xb7fa, 0x1118, 0x080c, 0xa364, 0x0840, 0x6004, 0x908e, 0x0032, - 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, - 0x31c3, 0x00fe, 0x00ee, 0x0804, 0xa24d, 0x6004, 0x908e, 0x0021, - 0x0d48, 0x908e, 0x0022, 0x090c, 0xa364, 0x0804, 0xa24d, 0x90b2, - 0x0040, 0x1a04, 0xa34d, 0x2008, 0x0002, 0xa2e7, 0xa2e8, 0xa2eb, - 0xa2ee, 0xa2f1, 0xa2f4, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, - 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, - 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, - 0xa2e5, 0xa2e5, 0xa2e5, 0xa2f7, 0xa302, 0xa2e5, 0xa304, 0xa302, - 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa302, 0xa302, 0xa2e5, - 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2e5, 0xa334, - 0xa302, 0xa2e5, 0xa2fe, 0xa2e5, 0xa2e5, 0xa2e5, 0xa2ff, 0xa2e5, - 0xa2e5, 0xa2e5, 0xa302, 0xa32b, 0xa2e5, 0x080c, 0x0db2, 0x00d0, - 0x2001, 0x000b, 0x0410, 0x2001, 0x0003, 0x00f8, 0x2001, 0x0005, - 0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001, 0x0009, 0x00b0, 0x080c, - 0x847d, 0x6003, 0x0005, 0x080c, 0x8582, 0x0070, 0x0018, 0x0010, - 0x080c, 0x5ecf, 0x0804, 0xa345, 0x080c, 0x847d, 0x080c, 0xbd04, - 0x6003, 0x0004, 0x080c, 0x8582, 0x0005, 0x080c, 0x5ecf, 0x080c, - 0x847d, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e, 0x2304, 0x9084, - 0xff00, 0x1120, 0x2001, 0x1955, 0x201c, 0x0040, 0x8007, 0x909a, - 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, - 0x080c, 0x8582, 0x0c08, 0x080c, 0x847d, 0x080c, 0xba61, 0x080c, - 0x99d6, 0x080c, 0x8582, 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x1894, - 0x2079, 0x0000, 0x080c, 0x31c3, 0x00fe, 0x00ee, 0x080c, 0x847d, - 0x080c, 0x99d6, 0x080c, 0x8582, 0x0838, 0x080c, 0x847d, 0x6003, - 0x0002, 0x080c, 0xbd04, 0x0804, 0x8582, 0x2600, 0x2008, 0x0002, - 0xa362, 0xa362, 0xa362, 0xa345, 0xa345, 0xa362, 0xa362, 0xa362, - 0xa362, 0xa345, 0xa362, 0xa345, 0xa362, 0xa345, 0xa362, 0xa362, - 0xa362, 0xa362, 0x080c, 0x0db2, 0x00e6, 0x0096, 0x0026, 0x0016, - 0x080c, 0xb5fb, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, - 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x4ebc, 0x0130, - 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, - 0x900e, 0x2011, 0x4005, 0x080c, 0xbbcd, 0x0090, 0xa868, 0xd0fc, - 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021, 0x0168, - 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833, 0x0100, - 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, - 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0xa823, - 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, - 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0db2, 0x6604, 0x96b6, 0x004d, - 0x1120, 0x080c, 0xbaed, 0x0804, 0xa428, 0x6604, 0x96b6, 0x0043, - 0x1120, 0x080c, 0xbb36, 0x0804, 0xa428, 0x6604, 0x96b6, 0x004b, - 0x1120, 0x080c, 0xbb62, 0x0804, 0xa428, 0x6604, 0x96b6, 0x0033, - 0x1120, 0x080c, 0xba83, 0x0804, 0xa428, 0x6604, 0x96b6, 0x0028, - 0x1120, 0x080c, 0xb833, 0x0804, 0xa428, 0x6604, 0x96b6, 0x0029, - 0x1120, 0x080c, 0xb874, 0x0804, 0xa428, 0x6604, 0x96b6, 0x001f, - 0x1118, 0x080c, 0x9dac, 0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118, - 0x080c, 0xa0d5, 0x04a8, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, - 0x9de4, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0x9ef4, - 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xa06a, 0x0400, - 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0x9e1c, 0x00c8, 0x6604, - 0x96b6, 0x0044, 0x1118, 0x080c, 0x9e58, 0x0090, 0x6604, 0x96b6, - 0x0049, 0x1118, 0x080c, 0x9e83, 0x0058, 0x91b6, 0x0015, 0x1110, - 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xa65e, - 0x00be, 0x0005, 0x080c, 0x9a6b, 0x0cd8, 0xa445, 0xa448, 0xa445, - 0xa48d, 0xa445, 0xa5d7, 0xa66b, 0xa445, 0xa445, 0xa638, 0xa445, - 0xa64c, 0x0096, 0x080c, 0x14c9, 0x6014, 0x2048, 0xa800, 0x2048, - 0xa867, 0x0103, 0x009e, 0x0804, 0x99d6, 0xa001, 0xa001, 0x0005, - 0x00e6, 0x2071, 0x1800, 0x7088, 0x9086, 0x0074, 0x1540, 0x080c, - 0xcd33, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, - 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, - 0x0006, 0x080c, 0x5ecf, 0x080c, 0x2e55, 0x080c, 0x99d6, 0x0088, - 0x2001, 0x000a, 0x080c, 0x5ecf, 0x080c, 0x2e55, 0x6003, 0x0001, - 0x6007, 0x0001, 0x080c, 0x8048, 0x080c, 0x8582, 0x0010, 0x080c, - 0xa5c2, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, - 0x080c, 0x5ebb, 0x2069, 0x1853, 0x6804, 0xd0a4, 0x0120, 0x2001, - 0x0006, 0x080c, 0x5efb, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, - 0x2011, 0x1822, 0x2204, 0x9086, 0x0074, 0x1904, 0xa59b, 0x6010, - 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xa7af, 0x0804, - 0xa4ff, 0x080c, 0xa7a4, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, - 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, - 0x080c, 0xbbcd, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, - 0x0200, 0x2001, 0x0006, 0x080c, 0x5ecf, 0x080c, 0x2e55, 0x080c, - 0x99d6, 0x0804, 0xa59c, 0x080c, 0xa5aa, 0x6014, 0x9005, 0x0190, - 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, - 0xbbcd, 0x08f8, 0x080c, 0xa5a0, 0x0160, 0x9006, 0x080c, 0x5ebb, - 0x2001, 0x0004, 0x080c, 0x5efb, 0x2001, 0x0007, 0x080c, 0x5ecf, - 0x08a0, 0x2001, 0x0004, 0x080c, 0x5ecf, 0x6003, 0x0001, 0x6007, - 0x0003, 0x080c, 0x8048, 0x080c, 0x8582, 0x0804, 0xa59c, 0xb85c, - 0xd0e4, 0x01d8, 0x080c, 0xba03, 0x080c, 0x6c53, 0x0118, 0xd0dc, - 0x1904, 0xa4c1, 0x2011, 0x1835, 0x2204, 0xc0ad, 0x2012, 0x2001, - 0x193e, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, - 0x254a, 0x78e2, 0x00fe, 0x0804, 0xa4c1, 0x080c, 0xba40, 0x2011, - 0x1835, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xce81, 0x000e, - 0x1904, 0xa4c1, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x5ecf, - 0x9006, 0x080c, 0x5ebb, 0x00c6, 0x2001, 0x180e, 0x2004, 0xd09c, - 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, - 0x9084, 0x00ff, 0x78e6, 0x7076, 0x7010, 0x78ea, 0x707a, 0x908c, - 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x251f, - 0x00f6, 0x2100, 0x900e, 0x080c, 0x24d6, 0x7956, 0x00fe, 0x9186, - 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, - 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, - 0x00fe, 0x080c, 0x251f, 0x00f6, 0x2079, 0x1800, 0x797a, 0x2100, - 0x900e, 0x080c, 0x24d6, 0x7956, 0x00fe, 0x8108, 0x080c, 0x5f1e, - 0x2b00, 0x00ce, 0x1904, 0xa4c1, 0x6012, 0x2009, 0x180e, 0x210c, - 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, - 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x5ecf, - 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8048, - 0x080c, 0x8582, 0x0008, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, - 0x2001, 0x180f, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, - 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xd2f4, 0x0190, 0x2071, 0x0260, - 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, - 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, - 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, 0x5ecf, 0x080c, - 0x5127, 0x1120, 0x2001, 0x0007, 0x080c, 0x5efb, 0x080c, 0x2e55, - 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0x99d6, 0x00b6, - 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7088, 0x9086, 0x0014, - 0x1904, 0xa62f, 0x080c, 0x5127, 0x1170, 0x6014, 0x9005, 0x1158, + 0x2048, 0x080c, 0xc43a, 0x080c, 0xc825, 0x0140, 0x6014, 0x2048, + 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xab6b, + 0x001e, 0x009e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, + 0x0200, 0x0110, 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, + 0x0dd5, 0xa97a, 0x080c, 0x6a46, 0x009e, 0x080c, 0xab6b, 0x001e, + 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, + 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, + 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, + 0x080c, 0xc43a, 0x009e, 0x080c, 0xc825, 0x0148, 0xa804, 0x9005, + 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, + 0xab6b, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, + 0x9086, 0x0100, 0x1118, 0x080c, 0xb51d, 0x00e0, 0xa034, 0x8007, + 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, + 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a, + 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x1000, + 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, + 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, + 0xad9a, 0x0086, 0x2940, 0x080c, 0x10e0, 0x008e, 0x9085, 0x0001, + 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, + 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, + 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043, + 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xce90, 0x001e, + 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, + 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xab6b, 0x0020, 0x0039, + 0x0010, 0x080c, 0xb196, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, + 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xb17e, 0x918e, 0x0016, + 0x1904, 0xb194, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, + 0x9186, 0x0300, 0x1904, 0xb158, 0x89ff, 0x1138, 0x6800, 0x9086, + 0x000f, 0x0904, 0xb13b, 0x0804, 0xb192, 0x6808, 0x9086, 0xffff, + 0x1904, 0xb180, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, + 0xa83c, 0xa940, 0x9105, 0x1904, 0xb180, 0x6824, 0xd0b4, 0x1904, + 0xb180, 0x080c, 0xca07, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, + 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, + 0x8cf7, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, + 0x1138, 0x00c6, 0x2d60, 0x080c, 0xc564, 0x00ce, 0x0804, 0xb192, + 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5e8c, 0x0010, 0x080c, + 0x6282, 0x00ce, 0x1904, 0xb180, 0x00c6, 0x2d60, 0x080c, 0xab6b, + 0x00ce, 0x0804, 0xb192, 0x00c6, 0x080c, 0xabb9, 0x0198, 0x6017, + 0x0000, 0x6810, 0x6012, 0x080c, 0xcc93, 0x6023, 0x0003, 0x6904, + 0x00c6, 0x2d60, 0x080c, 0xab6b, 0x00ce, 0x080c, 0xabe6, 0x00ce, + 0x0804, 0xb192, 0x2001, 0x1986, 0x2004, 0x6842, 0x00ce, 0x04d0, + 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, + 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, + 0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, + 0x1138, 0x2001, 0x1986, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, + 0x89ff, 0x090c, 0x0dd5, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, + 0xa87b, 0x0003, 0x080c, 0x6862, 0x080c, 0xca07, 0x080c, 0xab9c, + 0x00de, 0x00ce, 0x080c, 0xab6b, 0x009e, 0x0005, 0x9186, 0x0015, + 0x1128, 0x2001, 0x1986, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, + 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xe4d8, 0x080c, 0x8441, + 0x080c, 0xab6b, 0x00ce, 0x080c, 0xab6b, 0x0005, 0x0026, 0x0036, + 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1986, + 0x2004, 0x6842, 0x0804, 0xb210, 0x00c6, 0x2d60, 0x080c, 0xc465, + 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, + 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x8e7f, 0x080c, 0x941c, + 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, + 0x0dd5, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, + 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, + 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, + 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, + 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, + 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, + 0x2001, 0x0005, 0x6832, 0x080c, 0xcb8a, 0x080c, 0x941c, 0x0010, + 0x080c, 0xab6b, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, + 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, + 0x00be, 0x9206, 0x1904, 0xb27b, 0x700c, 0x6210, 0x00b6, 0x2258, + 0xba14, 0x00be, 0x9206, 0x1904, 0xb27b, 0x6038, 0x2068, 0x6824, + 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xb27b, 0x9286, + 0x0002, 0x0904, 0xb27b, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, + 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, + 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, + 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, + 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, + 0x080c, 0xc825, 0x090c, 0x0dd5, 0xa87b, 0x0003, 0x009e, 0x080c, + 0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, + 0x1986, 0x2004, 0x7042, 0x080c, 0xab6b, 0x002e, 0x00de, 0x00ee, + 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, + 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, + 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, + 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xbb27, 0x002e, 0x003e, + 0x015e, 0x009e, 0x1904, 0xb2ea, 0x0096, 0x0156, 0x0036, 0x0026, + 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, + 0xbb27, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, + 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, + 0x00fe, 0x009e, 0x00be, 0x0804, 0xaf6f, 0x0096, 0x2048, 0xaa12, + 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, + 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a, 0x080c, 0xb084, + 0x0130, 0x00fe, 0x009e, 0x080c, 0xab6b, 0x00be, 0x0005, 0x080c, + 0xb51d, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x306e, 0x080c, 0xcf2d, + 0x00fe, 0x00c6, 0x080c, 0xab15, 0x2f00, 0x6012, 0x6017, 0x0000, + 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, + 0x080c, 0x631d, 0x080c, 0x6349, 0x080c, 0x8ec7, 0x080c, 0x941c, + 0x00ce, 0x0804, 0xb2bd, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0dd5, + 0x91b2, 0x0040, 0x1a04, 0xb373, 0x0002, 0xb361, 0xb361, 0xb357, + 0xb361, 0xb361, 0xb361, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, + 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, + 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, + 0xb355, 0xb355, 0xb355, 0xb355, 0xb361, 0xb355, 0xb361, 0xb361, + 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb357, 0xb355, 0xb355, + 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb361, + 0xb361, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, + 0xb355, 0xb355, 0xb361, 0xb355, 0xb355, 0x080c, 0x0dd5, 0x0066, + 0x00b6, 0x6610, 0x2658, 0xb8cc, 0xc08c, 0xb8ce, 0x00be, 0x006e, + 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, + 0x8ec7, 0x0010, 0x080c, 0x8e7f, 0x0126, 0x2091, 0x8000, 0x080c, + 0x941c, 0x012e, 0x0005, 0x2600, 0x0002, 0xb361, 0xb361, 0xb387, + 0xb361, 0xb361, 0xb387, 0xb387, 0xb387, 0xb387, 0xb361, 0xb387, + 0xb361, 0xb387, 0xb361, 0xb387, 0xb387, 0xb387, 0xb387, 0x080c, + 0x0dd5, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013, + 0x0904, 0xb44b, 0x91b6, 0x0027, 0x1904, 0xb406, 0x080c, 0x9317, + 0x6004, 0x080c, 0xca13, 0x01b0, 0x080c, 0xca24, 0x01a8, 0x908e, + 0x0021, 0x0904, 0xb403, 0x908e, 0x0022, 0x1130, 0x080c, 0xaf9b, + 0x0904, 0xb3ff, 0x0804, 0xb400, 0x908e, 0x003d, 0x0904, 0xb403, + 0x0804, 0xb3f9, 0x080c, 0x3093, 0x2001, 0x0007, 0x080c, 0x631d, + 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb51d, 0x9186, + 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, 0xc285, 0x080c, 0x717d, + 0x1108, 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, + 0x080c, 0xe5e4, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, + 0x2019, 0x0028, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, + 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xdfbd, + 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xcf2d, 0x0016, 0x080c, + 0xcc8b, 0x080c, 0xab6b, 0x001e, 0x080c, 0x3166, 0x080c, 0x941c, + 0x0030, 0x080c, 0xcc8b, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, + 0x080c, 0xb51d, 0x0cb0, 0x080c, 0xb559, 0x0c98, 0x9186, 0x0014, + 0x1db0, 0x080c, 0x9317, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, + 0xaf9b, 0x0d68, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x080c, 0xca13, + 0x1190, 0x080c, 0x3093, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, + 0x080c, 0xb51d, 0x9186, 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, + 0xc185, 0x2102, 0x0870, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d, + 0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, + 0x189e, 0x2079, 0x0000, 0x080c, 0x3401, 0x00fe, 0x00ee, 0x0804, + 0xb3f9, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, + 0xb51d, 0x0804, 0xb3f9, 0x90b2, 0x0040, 0x1a04, 0xb4f9, 0x2008, + 0x0002, 0xb493, 0xb494, 0xb497, 0xb49a, 0xb49d, 0xb4a0, 0xb491, + 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, + 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, + 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb4a3, + 0xb4ae, 0xb491, 0xb4b0, 0xb4ae, 0xb491, 0xb491, 0xb491, 0xb491, + 0xb491, 0xb4ae, 0xb4ae, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, + 0xb491, 0xb491, 0xb491, 0xb4e0, 0xb4ae, 0xb491, 0xb4aa, 0xb491, + 0xb491, 0xb491, 0xb4ab, 0xb491, 0xb491, 0xb491, 0xb4ae, 0xb4d7, + 0xb491, 0x080c, 0x0dd5, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, + 0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, + 0x2001, 0x0009, 0x00b0, 0x080c, 0x9317, 0x6003, 0x0005, 0x080c, + 0x941c, 0x0070, 0x0018, 0x0010, 0x080c, 0x631d, 0x0804, 0xb4f1, + 0x080c, 0x9317, 0x080c, 0xcf30, 0x6003, 0x0004, 0x080c, 0x941c, + 0x0005, 0x080c, 0x631d, 0x080c, 0x9317, 0x6003, 0x0002, 0x0036, + 0x2019, 0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1984, + 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, + 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x941c, 0x0c08, 0x080c, + 0x9317, 0x080c, 0xcc8b, 0x080c, 0xab6b, 0x080c, 0x941c, 0x08c0, + 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x3401, + 0x00fe, 0x00ee, 0x080c, 0x9317, 0x080c, 0xab6b, 0x080c, 0x941c, + 0x0838, 0x080c, 0x9317, 0x6003, 0x0002, 0x080c, 0xcf30, 0x0804, + 0x941c, 0x2600, 0x2008, 0x0002, 0xb510, 0xb4f1, 0xb50e, 0xb4f1, + 0xb4f1, 0xb50e, 0xb50e, 0xb50e, 0xb50e, 0xb4f1, 0xb50e, 0xb4f1, + 0xb50e, 0xb4f1, 0xb50e, 0xb50e, 0xb50e, 0xb50e, 0x080c, 0x0dd5, + 0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0x6a46, 0x009e, + 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x00e6, 0x0096, 0x0026, + 0x0016, 0x080c, 0xc825, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, + 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x5260, + 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, + 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xcdf7, 0x0090, 0xa868, + 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021, + 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833, + 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009, + 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, + 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804, + 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x6604, 0x96b6, + 0x004d, 0x1120, 0x080c, 0xcd17, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x0043, 0x1120, 0x080c, 0xcd60, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x004b, 0x1120, 0x080c, 0xcd8c, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x0033, 0x1120, 0x080c, 0xccad, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x0028, 0x1120, 0x080c, 0xca5d, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x0029, 0x1120, 0x080c, 0xca9e, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x001f, 0x1120, 0x080c, 0xaf44, 0x0804, 0xb5e9, 0x6604, 0x96b6, + 0x0000, 0x1118, 0x080c, 0xb281, 0x04e0, 0x6604, 0x96b6, 0x0022, + 0x1118, 0x080c, 0xaf7c, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, + 0x080c, 0xb0a2, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, + 0xb216, 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xafb4, + 0x0400, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xaff0, 0x00c8, + 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xb031, 0x0090, 0x6604, + 0x96b6, 0x0041, 0x1118, 0x080c, 0xb01b, 0x0058, 0x91b6, 0x0015, + 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, + 0xb843, 0x00be, 0x0005, 0x080c, 0xac01, 0x0cd8, 0xb606, 0xb609, + 0xb606, 0xb650, 0xb606, 0xb7b7, 0xb850, 0xb606, 0xb606, 0xb819, + 0xb606, 0xb82f, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, + 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0xab6b, 0xa001, 0xa001, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, 0x0074, 0x1540, + 0x080c, 0xdf8e, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, + 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00f9, 0x00be, + 0x2001, 0x0006, 0x080c, 0x631d, 0x080c, 0x3093, 0x080c, 0xab6b, + 0x0098, 0x2001, 0x000a, 0x080c, 0x631d, 0x080c, 0x3093, 0x6003, + 0x0001, 0x6007, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0020, + 0x2001, 0x0001, 0x080c, 0xb787, 0x00ee, 0x0005, 0x00d6, 0xb800, + 0xd084, 0x0160, 0x9006, 0x080c, 0x6309, 0x2069, 0x1847, 0x6804, + 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x6349, 0x00de, 0x0005, + 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, + 0x1904, 0xb75e, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, + 0x080c, 0xb99d, 0x0804, 0xb6c2, 0x080c, 0xb992, 0x6010, 0x2058, + 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, + 0x900e, 0x2011, 0x4000, 0x080c, 0xcdf7, 0x0030, 0xa807, 0x0000, + 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x631d, + 0x080c, 0x3093, 0x080c, 0xab6b, 0x0804, 0xb761, 0x080c, 0xb76f, + 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, + 0x2011, 0x4000, 0x080c, 0xcdf7, 0x08f8, 0x080c, 0xb765, 0x0160, + 0x9006, 0x080c, 0x6309, 0x2001, 0x0004, 0x080c, 0x6349, 0x2001, + 0x0007, 0x080c, 0x631d, 0x08a0, 0x2001, 0x0004, 0x080c, 0x631d, + 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8ec7, 0x080c, 0x941c, + 0x0804, 0xb761, 0xb85c, 0xd0e4, 0x01d8, 0x080c, 0xcc2d, 0x080c, + 0x717d, 0x0118, 0xd0dc, 0x1904, 0xb684, 0x2011, 0x1837, 0x2204, + 0xc0ad, 0x2012, 0x2001, 0x196d, 0x2004, 0x00f6, 0x2079, 0x0100, + 0x78e3, 0x0000, 0x080c, 0x2764, 0x78e2, 0x00fe, 0x0804, 0xb684, + 0x080c, 0xcc6a, 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, + 0x080c, 0xe113, 0x000e, 0x1904, 0xb684, 0xc0b5, 0x2012, 0x2001, + 0x0006, 0x080c, 0x631d, 0x9006, 0x080c, 0x6309, 0x00c6, 0x2001, + 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, + 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010, + 0x78ea, 0x7082, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, + 0x00fe, 0x080c, 0x2739, 0x00f6, 0x2100, 0x900e, 0x080c, 0x26f0, + 0x795e, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, + 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, + 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2739, 0x00f6, 0x2079, + 0x1800, 0x7982, 0x2100, 0x900e, 0x080c, 0x26f0, 0x795e, 0x00fe, + 0x8108, 0x080c, 0x636c, 0x2b00, 0x00ce, 0x1904, 0xb684, 0x6012, + 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, + 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, + 0x0002, 0x080c, 0x631d, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, + 0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0018, 0x2001, 0x0001, + 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, + 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, 0xd0ac, 0x0005, 0x00e6, + 0x080c, 0xe63d, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, + 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, + 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, + 0x9005, 0x0158, 0x2001, 0x0007, 0x080c, 0x631d, 0x080c, 0x54cb, + 0x1120, 0x2001, 0x0007, 0x080c, 0x6349, 0x2600, 0x9005, 0x11b0, + 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x1178, 0x0036, + 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, + 0x2011, 0x8014, 0x080c, 0x48fb, 0x004e, 0x003e, 0x080c, 0x3093, + 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0xab6b, 0x00b6, + 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7090, 0x9086, 0x0014, + 0x1904, 0xb80f, 0x080c, 0x54cb, 0x1170, 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, - 0x4829, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x6019, - 0x080c, 0xa47b, 0x00de, 0x080c, 0xa875, 0x1588, 0x6010, 0x2058, - 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x5ecf, 0x0096, + 0x4ab2, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x6468, + 0x080c, 0xb63e, 0x00de, 0x080c, 0xba63, 0x1588, 0x6010, 0x2058, + 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x631d, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, - 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbbcd, + 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcdf7, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807, - 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x2e55, - 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x99d6, 0x0020, 0x080c, - 0xa364, 0x080c, 0xa5c2, 0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, - 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, 0x0002, - 0x080c, 0x5ecf, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8048, - 0x0804, 0x8582, 0x0804, 0xa5c2, 0x2030, 0x2011, 0x1822, 0x2204, - 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, - 0x080c, 0x5ecf, 0x0804, 0x99d6, 0x0804, 0xa5c2, 0x0002, 0xa445, - 0xa676, 0xa445, 0xa6b5, 0xa445, 0xa760, 0xa66b, 0xa445, 0xa445, - 0xa773, 0xa445, 0xa783, 0x6604, 0x9686, 0x0003, 0x0904, 0xa5d7, - 0x96b6, 0x001e, 0x1110, 0x080c, 0x99d6, 0x0005, 0x00b6, 0x00d6, - 0x00c6, 0x080c, 0xa793, 0x11a0, 0x9006, 0x080c, 0x5ebb, 0x080c, - 0x2e30, 0x080c, 0xbd01, 0x2001, 0x0002, 0x080c, 0x5ecf, 0x6003, - 0x0001, 0x6007, 0x0002, 0x080c, 0x8048, 0x080c, 0x8582, 0x0408, - 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, - 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, 0x601b, - 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, - 0x1900, 0x1108, 0x08a0, 0x080c, 0x2e30, 0x080c, 0xbd01, 0x080c, - 0xa5c2, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, - 0x9016, 0x080c, 0xa7a1, 0x00d6, 0x2069, 0x194d, 0x2d04, 0x9005, - 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, - 0x181e, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, - 0x9006, 0x080c, 0x5ebb, 0x2001, 0x0002, 0x080c, 0x5ecf, 0x6003, - 0x0001, 0x6007, 0x0002, 0x080c, 0x8048, 0x080c, 0x8582, 0x0804, - 0xa730, 0x080c, 0xb5fb, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, - 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, - 0xbc27, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, - 0x0001, 0x0ca8, 0x2001, 0x180d, 0x2004, 0xd0dc, 0x0148, 0x6010, - 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, - 0x080c, 0xa364, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, - 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, - 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900, - 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x5ecf, - 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xa5c2, - 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, - 0x2048, 0x080c, 0xb5fb, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, - 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084, - 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, - 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, - 0x1800, 0x080c, 0x59b4, 0x00ee, 0x0010, 0x080c, 0x2e30, 0x0870, - 0x080c, 0xa7a1, 0x1160, 0x2001, 0x0004, 0x080c, 0x5ecf, 0x6003, - 0x0001, 0x6007, 0x0003, 0x080c, 0x8048, 0x0804, 0x8582, 0x080c, - 0xa364, 0x0804, 0xa5c2, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c, - 0x5ecf, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x8048, 0x0804, - 0x8582, 0x0804, 0xa5c2, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c, - 0x5ecf, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8048, 0x0804, - 0x8582, 0x0804, 0xa5c2, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, - 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, - 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, - 0x2158, 0x080c, 0x5f8d, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, - 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, - 0x1835, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa847, 0x0560, - 0x2009, 0x1835, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x62a0, 0x0158, - 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xcfe6, 0x2001, 0x180c, - 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, - 0x2dfb, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2c2b, 0x00ee, 0x00c6, - 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x2f28, 0x8108, - 0x1f04, 0xa7e5, 0x015e, 0x00ce, 0x080c, 0xa7a4, 0x2071, 0x0260, - 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1835, 0x200c, 0xc1c5, - 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, - 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1835, 0x2102, 0x2079, 0x0100, - 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181d, 0x206a, 0x78e6, 0x0006, - 0x8e70, 0x2e04, 0x2069, 0x181e, 0x206a, 0x78ea, 0x7832, 0x7836, - 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182a, 0x200a, - 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x251f, 0x080c, 0x6c53, - 0x0170, 0x2071, 0x0260, 0x2069, 0x1951, 0x7048, 0x206a, 0x704c, - 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xba03, 0x0040, - 0x2001, 0x0006, 0x080c, 0x5ecf, 0x080c, 0x2e55, 0x080c, 0x99d6, - 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, - 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182a, 0x231c, 0x83ff, - 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, - 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, - 0x2b48, 0x2019, 0x000a, 0x080c, 0xa91d, 0x1148, 0x2011, 0x027a, - 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xa91d, 0x1100, 0x015e, - 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, - 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, - 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, - 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, - 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, - 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bf, - 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, - 0x724c, 0x706c, 0x9202, 0x1a04, 0xa8f5, 0x080c, 0xd012, 0x05f0, - 0x6720, 0x9786, 0x0007, 0x05d0, 0x2500, 0x9c06, 0x05b8, 0x2400, - 0x9c06, 0x05a0, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, - 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1538, 0x00c6, - 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1827, 0x9786, 0x000a, - 0x0148, 0x080c, 0xb7fa, 0x1130, 0x00ce, 0x080c, 0xa364, 0x080c, - 0x9a06, 0x00a0, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0160, 0x9786, - 0x0003, 0x11e8, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, - 0x6529, 0x080c, 0xb7dd, 0x080c, 0x9a06, 0x00ce, 0x9ce0, 0x0018, - 0x7060, 0x9c02, 0x1210, 0x0804, 0xa8a8, 0x012e, 0x000e, 0x002e, - 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, - 0x0006, 0x1118, 0x080c, 0xcf91, 0x0c30, 0x9786, 0x000a, 0x09e0, - 0x08c8, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, - 0xa909, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, - 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, - 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, - 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, - 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, - 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, - 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, - 0x908a, 0x0053, 0x1a0c, 0x0db2, 0x080c, 0xb7e9, 0x0120, 0x080c, - 0xb7fa, 0x0168, 0x0028, 0x080c, 0x2e55, 0x080c, 0xb7fa, 0x0138, - 0x080c, 0x847d, 0x080c, 0x99d6, 0x080c, 0x8582, 0x0005, 0x080c, - 0xa364, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, - 0x000a, 0x0005, 0xa97e, 0xa97e, 0xa97e, 0xa97e, 0xa97e, 0xa97e, - 0xa97e, 0xa97e, 0xa97e, 0xa97e, 0xa97e, 0xa980, 0xa980, 0xa980, - 0xa980, 0xa97e, 0xa97e, 0xa97e, 0xa980, 0xa97e, 0x080c, 0x0db2, - 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x8000, 0x0126, - 0x2091, 0x8000, 0x080c, 0x8582, 0x012e, 0x0005, 0x9186, 0x0013, - 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xaa35, 0x9186, 0x0027, - 0x1520, 0x080c, 0x847d, 0x080c, 0x2e30, 0x080c, 0xbd01, 0x0096, - 0x6114, 0x2148, 0x080c, 0xb5fb, 0x0198, 0x080c, 0xb7fa, 0x1118, - 0x080c, 0xa364, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, - 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6536, 0x080c, 0xb7dd, - 0x009e, 0x080c, 0x99d6, 0x0804, 0x8582, 0x9186, 0x0014, 0x1120, + 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x3093, + 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, 0xab6b, 0x0028, 0x080c, + 0xb51d, 0x9006, 0x080c, 0xb787, 0x001e, 0x002e, 0x00ee, 0x00be, + 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, + 0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, + 0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804, 0xb787, 0x2030, + 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, + 0x1120, 0x2001, 0x0007, 0x080c, 0x631d, 0x0804, 0xab6b, 0x2001, + 0x0001, 0x0804, 0xb787, 0x0002, 0xb606, 0xb85b, 0xb606, 0xb89c, + 0xb606, 0xb949, 0xb850, 0xb606, 0xb606, 0xb95d, 0xb606, 0xb96f, + 0x6604, 0x9686, 0x0003, 0x0904, 0xb7b7, 0x96b6, 0x001e, 0x1110, + 0x080c, 0xab6b, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xb981, + 0x11a0, 0x9006, 0x080c, 0x6309, 0x080c, 0x306e, 0x080c, 0xcf2d, + 0x2001, 0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0002, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0418, 0x2009, 0x026e, 0x2104, + 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, + 0x9005, 0x0170, 0x8001, 0xb842, 0x601b, 0x000a, 0x0088, 0x2009, + 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, + 0x080c, 0x306e, 0x080c, 0xcf2d, 0x2001, 0x0001, 0x080c, 0xb787, + 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, + 0x080c, 0xb98f, 0x00d6, 0x2069, 0x197c, 0x2d04, 0x9005, 0x0168, + 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, 0x1820, + 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, + 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x6003, 0x0001, + 0x6007, 0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0804, 0xb919, + 0x080c, 0xc825, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, + 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, 0xce51, + 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, + 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, + 0xb51d, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, + 0x0520, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, + 0xff00, 0x1118, 0x9686, 0x0009, 0x01c0, 0x9086, 0x1900, 0x1168, + 0x9686, 0x0009, 0x0190, 0x2001, 0x0004, 0x080c, 0x631d, 0x2001, + 0x0028, 0x601a, 0x6007, 0x0052, 0x0020, 0x2001, 0x0001, 0x080c, + 0xb787, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, + 0x6014, 0x2048, 0x080c, 0xc825, 0x0140, 0xa864, 0x9086, 0x0139, + 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40, 0x6010, 0x2058, 0xb840, + 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, + 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, + 0x2071, 0x1800, 0x080c, 0x5d8b, 0x00ee, 0x0010, 0x080c, 0x306e, + 0x0860, 0x080c, 0xb98f, 0x1160, 0x2001, 0x0004, 0x080c, 0x631d, + 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8ec7, 0x0804, 0x941c, + 0x080c, 0xb51d, 0x9006, 0x0804, 0xb787, 0x0489, 0x1160, 0x2001, + 0x0008, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, + 0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804, 0xb787, 0x00f9, + 0x1160, 0x2001, 0x000a, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, + 0x0001, 0x080c, 0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804, + 0xb787, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, + 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, + 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, + 0x63dc, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, + 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, 0x1837, 0x2104, + 0x9085, 0x0003, 0x200a, 0x080c, 0xba35, 0x0560, 0x2009, 0x1837, + 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6733, 0x0158, 0x9006, 0x2020, + 0x2009, 0x002a, 0x080c, 0xe280, 0x2001, 0x180c, 0x200c, 0xc195, + 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x3039, 0x00e6, + 0x2071, 0x1800, 0x080c, 0x2e48, 0x00ee, 0x00c6, 0x0156, 0x20a9, + 0x0781, 0x2009, 0x007f, 0x080c, 0x3166, 0x8108, 0x1f04, 0xb9d3, + 0x015e, 0x00ce, 0x080c, 0xb992, 0x2071, 0x0260, 0x2079, 0x0200, + 0x7817, 0x0001, 0x2001, 0x1837, 0x200c, 0xc1c5, 0x7018, 0xd0fc, + 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817, + 0x0000, 0x2001, 0x1837, 0x2102, 0x2079, 0x0100, 0x2e04, 0x9084, + 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, + 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, + 0xff00, 0x001e, 0x9105, 0x2009, 0x182c, 0x200a, 0x2200, 0x9084, + 0x00ff, 0x2008, 0x080c, 0x2739, 0x080c, 0x717d, 0x0170, 0x2071, + 0x0260, 0x2069, 0x1980, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, + 0x680a, 0x7054, 0x680e, 0x080c, 0xcc2d, 0x0040, 0x2001, 0x0006, + 0x080c, 0x631d, 0x080c, 0x3093, 0x080c, 0xab6b, 0x001e, 0x003e, + 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, + 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, 0x83ff, 0x01f0, 0x2071, + 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, + 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, + 0x000a, 0x080c, 0xbb27, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, + 0x2019, 0x0006, 0x080c, 0xbb27, 0x1100, 0x015e, 0x00ee, 0x003e, + 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9086, + 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec, + 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4, + 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ee, + 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19ee, 0x252c, 0x2021, + 0x19f4, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7254, 0x7074, + 0x9202, 0x1a04, 0xbaf3, 0x080c, 0x8710, 0x0904, 0xbaec, 0x080c, + 0xe2ac, 0x0904, 0xbaec, 0x6720, 0x9786, 0x0007, 0x0904, 0xbaec, + 0x2500, 0x9c06, 0x0904, 0xbaec, 0x2400, 0x9c06, 0x05e8, 0x3e08, + 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004, + 0x1110, 0x080c, 0x19b4, 0x9786, 0x000a, 0x0148, 0x080c, 0xca24, + 0x1130, 0x00ce, 0x080c, 0xb51d, 0x080c, 0xab9c, 0x00e8, 0x6014, + 0x2048, 0x080c, 0xc825, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, + 0xa878, 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0x6a3a, 0x080c, + 0xca07, 0x080c, 0xab9c, 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02, + 0x1210, 0x0804, 0xba96, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, + 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, + 0x080c, 0xe223, 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, + 0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, 0xabe6, 0x08e0, 0x9786, + 0x000a, 0x0938, 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, + 0x8318, 0x1f04, 0xbb13, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, + 0x2001, 0x0001, 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, + 0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, + 0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, + 0x4002, 0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, + 0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, + 0x0010, 0x2001, 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, + 0x0005, 0x220c, 0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, + 0x1f04, 0xbb51, 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, + 0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x080c, 0xca13, 0x0120, 0x080c, + 0xca24, 0x0168, 0x0028, 0x080c, 0x3093, 0x080c, 0xca24, 0x0138, + 0x080c, 0x9317, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x080c, + 0xb51d, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, + 0x000a, 0x0005, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96, + 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb98, 0xbb98, 0xbb98, + 0xbb98, 0xbb96, 0xbb96, 0xbb96, 0xbb98, 0xbb96, 0x080c, 0x0dd5, + 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126, + 0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x9186, 0x0013, + 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xbc4d, 0x9186, 0x0027, + 0x1520, 0x080c, 0x9317, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x0096, + 0x6114, 0x2148, 0x080c, 0xc825, 0x0198, 0x080c, 0xca24, 0x1118, + 0x080c, 0xb51d, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, + 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6a46, 0x080c, 0xca07, + 0x009e, 0x080c, 0xab6b, 0x0804, 0x941c, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, - 0x0db2, 0x2001, 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, + 0x0dd5, 0x2001, 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, - 0x2079, 0x19b6, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x7eec, + 0x2079, 0x19e5, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x8d64, 0x00ce, 0x00ee, 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, - 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xaa73, 0x0005, - 0x0002, 0xaa0f, 0xaa0d, 0xaa0d, 0xaa0d, 0xaa0d, 0xaa0d, 0xaa0d, - 0xaa0d, 0xaa0d, 0xaa0d, 0xaa0d, 0xaa2a, 0xaa2a, 0xaa2a, 0xaa2a, - 0xaa0d, 0xaa2a, 0xaa0d, 0xaa2a, 0xaa0d, 0x080c, 0x0db2, 0x080c, - 0x847d, 0x0096, 0x6114, 0x2148, 0x080c, 0xb5fb, 0x0168, 0xa867, + 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xbc8b, 0x0005, + 0x0002, 0xbc27, 0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc25, + 0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc42, 0xbc42, 0xbc42, 0xbc42, + 0xbc25, 0xbc42, 0xbc25, 0xbc42, 0xbc25, 0x080c, 0x0dd5, 0x080c, + 0x9317, 0x0096, 0x6114, 0x2148, 0x080c, 0xc825, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, - 0x080c, 0x6536, 0x080c, 0xb7dd, 0x009e, 0x080c, 0x99d6, 0x080c, - 0x8582, 0x0005, 0x080c, 0x847d, 0x080c, 0xb7fa, 0x090c, 0xa364, - 0x080c, 0x99d6, 0x080c, 0x8582, 0x0005, 0x0002, 0xaa4c, 0xaa4a, - 0xaa4a, 0xaa4a, 0xaa4a, 0xaa4a, 0xaa4a, 0xaa4a, 0xaa4a, 0xaa4a, - 0xaa4a, 0xaa63, 0xaa63, 0xaa63, 0xaa63, 0xaa4a, 0xaa6d, 0xaa4a, - 0xaa63, 0xaa4a, 0x080c, 0x0db2, 0x0096, 0x080c, 0x847d, 0x6014, - 0x2048, 0x2001, 0x1957, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, + 0x080c, 0x6a46, 0x080c, 0xca07, 0x009e, 0x080c, 0xab6b, 0x080c, + 0x941c, 0x0005, 0x080c, 0x9317, 0x080c, 0xca24, 0x090c, 0xb51d, + 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x0002, 0xbc64, 0xbc62, + 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, + 0xbc62, 0xbc7b, 0xbc7b, 0xbc7b, 0xbc7b, 0xbc62, 0xbc85, 0xbc62, + 0xbc7b, 0xbc62, 0x080c, 0x0dd5, 0x0096, 0x080c, 0x9317, 0x6014, + 0x2048, 0x2001, 0x1986, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, - 0x6003, 0x0002, 0x0cb8, 0x080c, 0x847d, 0x080c, 0xbd04, 0x080c, - 0xbd09, 0x6003, 0x000f, 0x0804, 0x8582, 0x080c, 0x847d, 0x080c, - 0x99d6, 0x0804, 0x8582, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, - 0x0208, 0x000a, 0x0005, 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, - 0xaa91, 0xab6e, 0xaa8f, 0xaba2, 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, - 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, 0xaa8f, 0xaba2, 0x080c, - 0x0db2, 0x00b6, 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, - 0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xab5d, + 0x6003, 0x0002, 0x0cb8, 0x080c, 0x9317, 0x080c, 0xcf30, 0x080c, + 0xcf35, 0x6003, 0x000f, 0x0804, 0x941c, 0x080c, 0x9317, 0x080c, + 0xab6b, 0x0804, 0x941c, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, + 0x0208, 0x000a, 0x0005, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7, + 0xbca9, 0xbd86, 0xbca7, 0xbdba, 0xbca7, 0xbca7, 0xbca7, 0xbca7, + 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbdba, 0x080c, + 0x0dd5, 0x00b6, 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, + 0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbd75, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, - 0xa834, 0xa938, 0x9115, 0x190c, 0xad37, 0x080c, 0x6351, 0x6210, + 0xa834, 0xa938, 0x9115, 0x190c, 0xbf4f, 0x080c, 0x6862, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, - 0x1904, 0xab41, 0x080c, 0x99d6, 0x009e, 0x00be, 0x0005, 0x968c, - 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xab45, + 0x1904, 0xbd59, 0x080c, 0xab6b, 0x009e, 0x00be, 0x0005, 0x968c, + 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbd5d, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, @@ -5266,36 +5845,36 @@ 0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, - 0xc6c4, 0x0804, 0xaa98, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, + 0xc6c4, 0x0804, 0xbcb0, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, - 0x2011, 0x0025, 0x080c, 0xb219, 0x003e, 0xd6cc, 0x0904, 0xaaad, - 0x7154, 0xa98a, 0x81ff, 0x0904, 0xaaad, 0x9192, 0x0021, 0x1278, - 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb219, 0x2011, - 0x0205, 0x2013, 0x0000, 0x080c, 0xbc93, 0x0804, 0xaaad, 0xa868, + 0x2011, 0x0025, 0x080c, 0xc43a, 0x003e, 0xd6cc, 0x0904, 0xbcc5, + 0x7154, 0xa98a, 0x81ff, 0x0904, 0xbcc5, 0x9192, 0x0021, 0x1278, + 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc43a, 0x2011, + 0x0205, 0x2013, 0x0000, 0x080c, 0xcebd, 0x0804, 0xbcc5, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, - 0x080c, 0xb1b8, 0x00ae, 0x080c, 0xbc93, 0x080c, 0xb209, 0x0804, - 0xaaaf, 0x080c, 0xb8ed, 0x0804, 0xaabc, 0xa87c, 0xd0ac, 0x0904, - 0xaac8, 0xa880, 0xd0bc, 0x1904, 0xaac8, 0x7348, 0xa838, 0x9306, - 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xaac8, 0xd6d4, 0x0190, - 0xab38, 0x9305, 0x0904, 0xaac8, 0x0068, 0xa87c, 0xd0ac, 0x0904, - 0xaaa0, 0xa838, 0xa934, 0x9105, 0x0904, 0xaaa0, 0xa880, 0xd0bc, - 0x1904, 0xaaa0, 0x080c, 0xb927, 0x0804, 0xaabc, 0x0096, 0x00f6, + 0x080c, 0xc3d9, 0x00ae, 0x080c, 0xcebd, 0x080c, 0xc42a, 0x0804, + 0xbcc7, 0x080c, 0xcb17, 0x0804, 0xbcd4, 0xa87c, 0xd0ac, 0x0904, + 0xbce0, 0xa880, 0xd0bc, 0x1904, 0xbce0, 0x7348, 0xa838, 0x9306, + 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xbce0, 0xd6d4, 0x0190, + 0xab38, 0x9305, 0x0904, 0xbce0, 0x0068, 0xa87c, 0xd0ac, 0x0904, + 0xbcb8, 0xa838, 0xa934, 0x9105, 0x0904, 0xbcb8, 0xa880, 0xd0bc, + 0x1904, 0xbcb8, 0x080c, 0xcb51, 0x0804, 0xbcd4, 0x0096, 0x00f6, 0x6003, 0x0003, 0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043, - 0x0000, 0x2c10, 0x080c, 0x1976, 0x080c, 0x8065, 0x080c, 0x865d, + 0x0000, 0x2c10, 0x080c, 0x1b03, 0x080c, 0x8ee4, 0x080c, 0x9548, 0x009e, 0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, - 0x0208, 0x000a, 0x0005, 0xabbf, 0xabbf, 0xabbf, 0xabbf, 0xabbf, - 0xabc1, 0xac57, 0xabbf, 0xabbf, 0xac6e, 0xacfa, 0xabbf, 0xabbf, - 0xabbf, 0xabbf, 0xad0f, 0xabbf, 0xabbf, 0xabbf, 0xabbf, 0x080c, - 0x0db2, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, + 0x0208, 0x000a, 0x0005, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, + 0xbdd9, 0xbe6f, 0xbdd7, 0xbdd7, 0xbe86, 0xbf12, 0xbdd7, 0xbdd7, + 0xbdd7, 0xbdd7, 0xbf27, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0x080c, + 0x0dd5, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, - 0x00be, 0x86ff, 0x0904, 0xac52, 0x9694, 0xff00, 0x9284, 0x0c00, + 0x00be, 0x86ff, 0x0904, 0xbe6a, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, - 0xac52, 0x080c, 0x0fd5, 0x090c, 0x0db2, 0x2900, 0xb07a, 0xb77c, + 0xbe6a, 0x080c, 0x1000, 0x090c, 0x0dd5, 0x2900, 0xb07a, 0xb77c, 0xc7cd, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, @@ -5304,1392 +5883,1550 @@ 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, - 0x080c, 0xb219, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, + 0x080c, 0xc43a, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, - 0x0029, 0x080c, 0xb219, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, + 0x0029, 0x080c, 0xc43a, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, - 0x080c, 0xb1b8, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, + 0x080c, 0xc3d9, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, - 0x00fe, 0x2c10, 0x080c, 0x1976, 0x0804, 0x8f88, 0x6003, 0x0002, + 0x00fe, 0x2c10, 0x080c, 0x1b03, 0x0804, 0x9fc9, 0x6003, 0x0002, 0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, - 0x080c, 0x1582, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, - 0x009e, 0x080c, 0x847d, 0x080c, 0x8582, 0x0096, 0x2001, 0x1957, - 0x2004, 0x6042, 0x080c, 0x8532, 0x080c, 0x865d, 0x6114, 0x2148, - 0xa97c, 0xd1e4, 0x0904, 0xacf5, 0xd1cc, 0x05a8, 0xa978, 0xa868, + 0x080c, 0x1689, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, + 0x009e, 0x080c, 0x9317, 0x080c, 0x941c, 0x0096, 0x2001, 0x1986, + 0x2004, 0x6042, 0x080c, 0x93cc, 0x080c, 0x9548, 0x6114, 0x2148, + 0xa97c, 0xd1e4, 0x0904, 0xbf0d, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, 0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, 0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, - 0xa87e, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0f87, 0x001e, - 0x0440, 0x0016, 0x080c, 0x0f87, 0x009e, 0xa974, 0x0016, 0x080c, - 0xb209, 0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, + 0xa87e, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fb2, 0x001e, + 0x0440, 0x0016, 0x080c, 0x0fb2, 0x009e, 0xa974, 0x0016, 0x080c, + 0xc42a, 0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, - 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x6351, - 0x001e, 0xd1e4, 0x1120, 0x080c, 0x99d6, 0x009e, 0x0005, 0x080c, - 0xb8ed, 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x847d, - 0x080c, 0x8582, 0x2019, 0x0001, 0x080c, 0x9254, 0x6003, 0x0002, - 0x080c, 0xbd09, 0x080c, 0x8532, 0x080c, 0x865d, 0x0005, 0x6004, - 0x9086, 0x0040, 0x1120, 0x080c, 0x847d, 0x080c, 0x8582, 0x2019, - 0x0001, 0x080c, 0x9254, 0x080c, 0x8532, 0x080c, 0x2e30, 0x080c, - 0xbd01, 0x0096, 0x6114, 0x2148, 0x080c, 0xb5fb, 0x0150, 0xa867, - 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6536, 0x080c, - 0xb7dd, 0x009e, 0x080c, 0x99d6, 0x080c, 0x865d, 0x0005, 0xa87b, - 0x0015, 0xd1fc, 0x0138, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, - 0x9189, 0x0000, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, - 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xad61, 0xad61, 0xad61, - 0xad61, 0xad61, 0xad63, 0xad61, 0xad61, 0xae09, 0xad61, 0xad61, - 0xad61, 0xad61, 0xad61, 0xad61, 0xad61, 0xad61, 0xad61, 0xad61, - 0xaf3a, 0x080c, 0x0db2, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, - 0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, - 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, - 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xae02, 0x9694, 0xff00, - 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, - 0x0300, 0x0904, 0xae02, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, - 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0fd5, 0x090c, 0x0db2, - 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, - 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, - 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, - 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, - 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, - 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, - 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, - 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, - 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, - 0x080c, 0xb219, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, - 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, - 0x0029, 0x080c, 0xb219, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, - 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, - 0x080c, 0xb1b8, 0x080c, 0x1805, 0x009e, 0x00ee, 0x00ae, 0x007e, - 0x0005, 0x2001, 0x1957, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, - 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, - 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xaf35, 0x6043, 0x0000, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, - 0xaf04, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xaec5, 0x0016, 0xa87c, - 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, - 0x90b6, 0x0002, 0x0904, 0xae93, 0x9086, 0x0028, 0x1904, 0xae7f, - 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xae9b, 0x6024, 0xd0f4, - 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, - 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, - 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, - 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, - 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, - 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, - 0x080c, 0x0f87, 0x009e, 0x080c, 0xb927, 0x0804, 0xaf35, 0xd1dc, - 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbbb6, 0x0118, + 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x6862, + 0x001e, 0xd1e4, 0x1120, 0x080c, 0xab6b, 0x009e, 0x0005, 0x080c, + 0xcb17, 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x9317, + 0x080c, 0x941c, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x6003, 0x0002, + 0x080c, 0xcf35, 0x080c, 0x93cc, 0x080c, 0x9548, 0x0005, 0x6004, + 0x9086, 0x0040, 0x1120, 0x080c, 0x9317, 0x080c, 0x941c, 0x2019, + 0x0001, 0x080c, 0xa2ac, 0x080c, 0x93cc, 0x080c, 0x306e, 0x080c, + 0xcf2d, 0x0096, 0x6114, 0x2148, 0x080c, 0xc825, 0x0150, 0xa867, + 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6a46, 0x080c, + 0xca07, 0x009e, 0x080c, 0xab6b, 0x080c, 0x9548, 0x0005, 0xa87b, + 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, + 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a77, 0x2104, 0x8000, + 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbf82, 0xbf82, + 0xbf82, 0xbf82, 0xbf82, 0xbf84, 0xbf82, 0xbf82, 0xc02a, 0xbf82, + 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, + 0xbf82, 0xc15b, 0x080c, 0x0dd5, 0x0076, 0x00a6, 0x00e6, 0x0096, + 0x2071, 0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, + 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, + 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xc023, 0x9694, + 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, + 0x9284, 0x0300, 0x0904, 0xc023, 0x9686, 0x0100, 0x1130, 0x7064, + 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x1000, 0x090c, + 0x0dd5, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, + 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, + 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, + 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, + 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, + 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, + 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, + 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, + 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, + 0x0025, 0x080c, 0xc43a, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, + 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, + 0x2011, 0x0029, 0x080c, 0xc43a, 0x2011, 0x0205, 0x2013, 0x0000, + 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, + 0x2950, 0x080c, 0xc3d9, 0x080c, 0x1992, 0x009e, 0x00ee, 0x00ae, + 0x007e, 0x0005, 0x2001, 0x1986, 0x2004, 0x6042, 0x0096, 0x6114, + 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, + 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xc156, 0x6043, 0x0000, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, + 0x0904, 0xc125, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xc0e6, 0x0016, + 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, + 0x00ff, 0x90b6, 0x0002, 0x0904, 0xc0b4, 0x9086, 0x0028, 0x1904, + 0xc0a0, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xc0bc, 0x6024, + 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, + 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, + 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, + 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, + 0x8000, 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, + 0xc0e4, 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, + 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xcb51, 0x0804, 0xc156, + 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xcde0, + 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, + 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, + 0xa938, 0x9115, 0x190c, 0xbf4f, 0xa87c, 0xb07e, 0xa890, 0xb092, + 0xa88c, 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, + 0x20a9, 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, + 0x9084, 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, + 0xa882, 0x000e, 0xa87e, 0x080c, 0xcebd, 0x001e, 0xa874, 0x0006, + 0x2148, 0x080c, 0x0fb2, 0x001e, 0x0804, 0xc152, 0x0016, 0x00a6, + 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, + 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, + 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xcde0, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, - 0x9115, 0x190c, 0xad37, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, - 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, - 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, - 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, - 0x000e, 0xa87e, 0x080c, 0xbc93, 0x001e, 0xa874, 0x0006, 0x2148, - 0x080c, 0x0f87, 0x001e, 0x0804, 0xaf31, 0x0016, 0x00a6, 0x2150, - 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, - 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, - 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbbb6, 0x0118, 0xb174, - 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, - 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, - 0x190c, 0xad37, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, - 0x00ae, 0x080c, 0x0f87, 0x009e, 0x080c, 0xbc93, 0xa974, 0x0016, - 0x080c, 0xb209, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, - 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, - 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbbb6, - 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, - 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, - 0xa938, 0x9115, 0x190c, 0xad37, 0xa974, 0x0016, 0x080c, 0x6351, - 0x001e, 0xd1e4, 0x1120, 0x080c, 0x99d6, 0x009e, 0x0005, 0x080c, - 0xb8ed, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, - 0x1813, 0x009e, 0x0005, 0x080c, 0x847d, 0x0010, 0x080c, 0x8532, - 0x080c, 0xb5fb, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xb7fa, - 0x1118, 0x080c, 0xa364, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, - 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, - 0x0029, 0x1110, 0x080c, 0xd28c, 0xa877, 0x0000, 0x080c, 0x6536, - 0x009e, 0x080c, 0x99d6, 0x080c, 0x8582, 0x0804, 0x865d, 0xa87b, - 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, - 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xaf91, 0xaf91, 0xaf91, - 0xaf91, 0xaf91, 0xaf93, 0xaf91, 0xaf91, 0xaf91, 0xaf91, 0xaf91, - 0xaf91, 0xaf91, 0xaf91, 0xaf91, 0xaf91, 0xaf91, 0xaf91, 0xaf91, - 0xaf91, 0x080c, 0x0db2, 0x080c, 0x511b, 0x01f8, 0x6014, 0x7144, - 0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, - 0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, - 0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, - 0xa99a, 0xaa9e, 0x080c, 0x6536, 0x009e, 0x0804, 0x99d6, 0x9182, - 0x0085, 0x0002, 0xafc9, 0xafc7, 0xafc7, 0xafd5, 0xafc7, 0xafc7, - 0xafc7, 0xafc7, 0xafc7, 0xafc7, 0xafc7, 0xafc7, 0xafc7, 0x080c, - 0x0db2, 0x6003, 0x0001, 0x6106, 0x080c, 0x8000, 0x0126, 0x2091, - 0x8000, 0x080c, 0x8582, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, - 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb5e9, - 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, - 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb244, 0x00ce, 0x0128, - 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, - 0x0001, 0x080c, 0x8000, 0x080c, 0x8582, 0x9280, 0x0004, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, - 0x00c6, 0x2260, 0x080c, 0xb927, 0x00ce, 0x00ee, 0x00de, 0x005e, - 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, - 0x0a0c, 0x0db2, 0x908a, 0x0092, 0x1a0c, 0x0db2, 0x9082, 0x0085, - 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0db2, - 0x080c, 0x847d, 0x0096, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0140, - 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6536, - 0x009e, 0x080c, 0x9a06, 0x0804, 0x8582, 0xb04a, 0xb04c, 0xb04c, - 0xb04a, 0xb04a, 0xb04a, 0xb04a, 0xb04a, 0xb04a, 0xb04a, 0xb04a, - 0xb04a, 0xb04a, 0x080c, 0x0db2, 0x080c, 0x847d, 0x080c, 0x9a06, - 0x080c, 0x8582, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, - 0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x847d, - 0x080c, 0x2e30, 0x080c, 0xbd01, 0x0096, 0x6014, 0x2048, 0x080c, - 0xb5fb, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, - 0x080c, 0x6536, 0x080c, 0xb7dd, 0x009e, 0x080c, 0x99d6, 0x080c, - 0x8582, 0x0005, 0x080c, 0x9a6b, 0x0ce0, 0x9186, 0x0014, 0x1dd0, - 0x080c, 0x847d, 0x0096, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0d60, - 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, - 0xa882, 0x08f0, 0x0002, 0xb0a2, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a0, - 0xb0a0, 0xb0ba, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a0, - 0x080c, 0x0db2, 0x080c, 0x847d, 0x6034, 0x908c, 0xff00, 0x810f, - 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, - 0x0010, 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, - 0x8582, 0x0005, 0x080c, 0x847d, 0x6034, 0x908c, 0xff00, 0x810f, - 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, - 0x0010, 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, - 0x8582, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, - 0x0012, 0x0804, 0x9a6b, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0ea, - 0xb137, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0e8, 0xb0e8, - 0x080c, 0x0db2, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, - 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb14b, 0x080c, - 0xb5fb, 0x1118, 0x080c, 0xb7dd, 0x0068, 0x6014, 0x2048, 0xa87c, - 0xd0e4, 0x1110, 0x080c, 0xb7dd, 0xa867, 0x0103, 0x080c, 0xbccc, - 0x080c, 0x6536, 0x00d6, 0x2c68, 0x080c, 0x9980, 0x01d0, 0x6003, - 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, - 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, - 0xba69, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x8000, 0x080c, - 0x8582, 0x2d60, 0x00de, 0x080c, 0x99d6, 0x009e, 0x0005, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, - 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbc66, 0x11f0, - 0x080c, 0x9980, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, - 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, - 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, - 0x080c, 0xba69, 0x080c, 0x8000, 0x080c, 0x8582, 0x2d60, 0x00de, - 0x0804, 0x99d6, 0x0096, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x01c8, - 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, - 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, - 0x0005, 0x080c, 0xb8e9, 0xa877, 0x0000, 0x080c, 0x6536, 0x080c, - 0xb7dd, 0x009e, 0x0804, 0x99d6, 0x0016, 0x0096, 0x6014, 0x2048, - 0x080c, 0xb5fb, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, - 0x0000, 0x080c, 0x6536, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, - 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9a6b, - 0x0030, 0x080c, 0x847d, 0x080c, 0x9a06, 0x080c, 0x8582, 0x0005, - 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, - 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, - 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xb219, 0x96b2, 0x0020, - 0xb004, 0x904d, 0x0110, 0x080c, 0x0f87, 0x080c, 0x0fd5, 0x0520, - 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, - 0x003d, 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, - 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, - 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, - 0xb566, 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, - 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, - 0x0005, 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, - 0x0000, 0x080c, 0x6536, 0x2a48, 0x0cb8, 0x080c, 0x6536, 0x00ae, - 0x0005, 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, - 0xd184, 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, - 0xa85c, 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, - 0x4003, 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, - 0x2098, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, - 0x7817, 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, - 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, - 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb27f, 0xb27f, - 0xb27a, 0xb2a1, 0xb26d, 0xb27a, 0xb2a1, 0xb27a, 0xb26d, 0xb26d, - 0xb27a, 0xb27a, 0xb27a, 0xb26d, 0xb26d, 0x080c, 0x0db2, 0x0036, - 0x2019, 0x0010, 0x080c, 0xcbad, 0x6023, 0x0006, 0x6003, 0x0007, - 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, - 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x01c0, 0xa864, - 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, - 0x900e, 0x2001, 0x0005, 0x080c, 0x6770, 0x080c, 0xb8e9, 0x080c, - 0x6529, 0x080c, 0x9a06, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, - 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db2, 0x0002, 0xb2b7, - 0xb2dc, 0xb2b9, 0xb2fd, 0xb2d7, 0xb2b7, 0xb27a, 0xb27f, 0xb27f, - 0xb27a, 0xb27a, 0xb27a, 0xb27a, 0xb27a, 0xb27a, 0xb27a, 0x080c, - 0x0db2, 0x86ff, 0x11c8, 0x6020, 0x9086, 0x0006, 0x01a8, 0x0096, - 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0110, 0x080c, 0xb8e9, 0x009e, - 0x080c, 0xbca8, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x080c, 0x8000, 0x080c, 0x8582, 0x9085, 0x0001, 0x0005, 0x0066, - 0x080c, 0x1827, 0x006e, 0x08e8, 0x00e6, 0x2071, 0x19b6, 0x7024, - 0x9c06, 0x1120, 0x080c, 0x91de, 0x00ee, 0x0898, 0x6020, 0x9084, - 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, - 0x2c40, 0x080c, 0x9349, 0x009e, 0x008e, 0x0010, 0x080c, 0x90db, - 0x00ee, 0x1904, 0xb2b9, 0x0804, 0xb27a, 0x0036, 0x00e6, 0x2071, - 0x19b6, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x9254, 0x00ee, - 0x003e, 0x0804, 0xb2b9, 0x080c, 0x9479, 0x00ee, 0x003e, 0x1904, - 0xb2b9, 0x0804, 0xb27a, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, - 0x00ce, 0x0005, 0xb330, 0xb3df, 0xb546, 0xb33a, 0x9a06, 0xb330, - 0xcb9f, 0xbd0e, 0xb3df, 0xb329, 0xb5c5, 0xb329, 0xb329, 0xb329, - 0xb329, 0x080c, 0x0db2, 0x080c, 0xb7fa, 0x1110, 0x080c, 0xa364, - 0x0005, 0x080c, 0x847d, 0x080c, 0x8582, 0x0804, 0x99d6, 0x601b, - 0x0001, 0x0005, 0x080c, 0xb5fb, 0x0130, 0x6014, 0x0096, 0x2048, - 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db2, - 0x0002, 0xb359, 0xb35b, 0xb37f, 0xb393, 0xb3b7, 0xb359, 0xb330, - 0xb330, 0xb330, 0xb393, 0xb393, 0xb359, 0xb359, 0xb359, 0xb359, - 0xb39d, 0x080c, 0x0db2, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, - 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b6, 0x7024, 0x9c06, 0x01a0, - 0x080c, 0x90db, 0x080c, 0xbca8, 0x6007, 0x0085, 0x6003, 0x000b, - 0x6023, 0x0002, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c, 0x8000, - 0x080c, 0x8582, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, - 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xbca8, - 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x8000, - 0x080c, 0x8582, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, - 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x511b, 0x01a8, - 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, - 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, - 0xa89b, 0x0004, 0x080c, 0x6536, 0x009e, 0x0804, 0x99d6, 0x6014, - 0x0096, 0x904d, 0x01f8, 0xa97c, 0xd1e4, 0x01e0, 0x2001, 0x180e, - 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, - 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, - 0x14d2, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, - 0x9a50, 0x0005, 0x009e, 0x080c, 0x1827, 0x0804, 0xb37f, 0x6000, - 0x908a, 0x0016, 0x1a0c, 0x0db2, 0x000b, 0x0005, 0xb3f6, 0xb337, - 0xb3f8, 0xb3f6, 0xb3f8, 0xb3f8, 0xb331, 0xb3f6, 0xb32b, 0xb32b, - 0xb3f6, 0xb3f6, 0xb3f6, 0xb3f6, 0xb3f6, 0xb3f6, 0x080c, 0x0db2, - 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, - 0x000c, 0x1a0c, 0x0db2, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb413, - 0xb4e0, 0xb415, 0xb455, 0xb415, 0xb455, 0xb415, 0xb423, 0xb413, - 0xb455, 0xb413, 0xb444, 0x080c, 0x0db2, 0x6004, 0x908e, 0x0016, - 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, - 0x0052, 0x0904, 0xb4dc, 0x6004, 0x080c, 0xb7fa, 0x0904, 0xb4f9, - 0x908e, 0x0004, 0x1110, 0x080c, 0x2e55, 0x908e, 0x0021, 0x0904, - 0xb4fd, 0x908e, 0x0022, 0x0904, 0xb541, 0x908e, 0x003d, 0x0904, - 0xb4fd, 0x908e, 0x0039, 0x0904, 0xb501, 0x908e, 0x0035, 0x0904, - 0xb501, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, - 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, - 0x2e30, 0x080c, 0xa364, 0x0804, 0x9a06, 0x00c6, 0x00d6, 0x6104, - 0x9186, 0x0016, 0x0904, 0xb4cd, 0x9186, 0x0002, 0x1904, 0xb4a2, - 0x2001, 0x1835, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x6c53, 0x11b0, - 0x080c, 0xbcec, 0x0138, 0x080c, 0x6c76, 0x1120, 0x080c, 0x6b68, - 0x0804, 0xb52a, 0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800, - 0x2003, 0x0001, 0x080c, 0x6b8a, 0x0804, 0xb52a, 0x6010, 0x2058, - 0x2001, 0x1835, 0x2004, 0xd0ac, 0x1904, 0xb52a, 0xb8a0, 0x9084, - 0xff80, 0x1904, 0xb52a, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, - 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, - 0x6043, 0x0000, 0x080c, 0x9980, 0x0128, 0x2b00, 0x6012, 0x6023, - 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, - 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1835, - 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x59b4, - 0x00ee, 0x080c, 0xa364, 0x0030, 0x080c, 0xa364, 0x080c, 0x2e30, - 0x080c, 0xbd01, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e55, - 0x012e, 0x00ee, 0x080c, 0x9a06, 0x0005, 0x2001, 0x0002, 0x080c, - 0x5ecf, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8048, 0x080c, - 0x8582, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2e55, 0x0804, 0xb451, - 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, - 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xb4a2, 0x8001, 0xb842, - 0x6003, 0x0001, 0x080c, 0x8048, 0x080c, 0x8582, 0x00de, 0x00ce, - 0x0898, 0x080c, 0xa364, 0x0804, 0xb453, 0x080c, 0xa3a0, 0x0804, - 0xb453, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xbc66, 0x00de, 0x0118, - 0x080c, 0x99d6, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, - 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x603c, 0x600a, 0x2001, 0x1956, 0x2004, 0x601a, 0x602c, 0x2c08, - 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x8000, 0x080c, - 0x8582, 0x0005, 0x00de, 0x00ce, 0x080c, 0xa364, 0x080c, 0x2e30, - 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e55, 0x6017, 0x0000, - 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, 0x00ee, - 0x0005, 0x080c, 0x9e03, 0x1904, 0xb4f9, 0x0005, 0x6000, 0x908a, - 0x0016, 0x1a0c, 0x0db2, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, - 0x0005, 0xb561, 0xb561, 0xb561, 0xb561, 0xb561, 0xb561, 0xb561, - 0xb561, 0xb561, 0xb330, 0xb561, 0xb337, 0xb563, 0xb337, 0xb570, - 0xb561, 0x080c, 0x0db2, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007, - 0x008b, 0x6003, 0x000d, 0x080c, 0x8000, 0x080c, 0x8582, 0x0005, - 0x080c, 0xbce0, 0x0118, 0x080c, 0xbcf3, 0x0010, 0x080c, 0xbd01, - 0x080c, 0xb7dd, 0x080c, 0xb5fb, 0x0570, 0x080c, 0x2e30, 0x080c, - 0xb5fb, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, - 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6536, 0x2c68, - 0x080c, 0x9980, 0x0150, 0x6810, 0x6012, 0x080c, 0xba69, 0x00c6, - 0x2d60, 0x080c, 0x9a06, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, - 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8048, - 0x080c, 0x8582, 0x00c8, 0x080c, 0xbce0, 0x0138, 0x6034, 0x9086, - 0x4000, 0x1118, 0x080c, 0x2e30, 0x08d0, 0x6034, 0x908c, 0xff00, - 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, - 0x2e30, 0x0868, 0x080c, 0x9a06, 0x0005, 0x6000, 0x908a, 0x0016, - 0x1a0c, 0x0db2, 0x0002, 0xb5db, 0xb5db, 0xb5dd, 0xb5dd, 0xb5dd, - 0xb5db, 0xb5db, 0x9a06, 0xb5db, 0xb5db, 0xb5db, 0xb5db, 0xb5db, - 0xb5db, 0xb5db, 0xb5db, 0x080c, 0x0db2, 0x080c, 0x9479, 0x6114, - 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6536, 0x009e, 0x0804, - 0x99d6, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, 0x0240, 0x2001, - 0x1818, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, - 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, - 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1080, - 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x734c, 0x706c, - 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xbcec, 0x0180, - 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, - 0x2e30, 0x080c, 0xbd01, 0x00c6, 0x080c, 0x9a06, 0x00ce, 0x0060, - 0x080c, 0xb9e3, 0x0148, 0x080c, 0xb7fa, 0x1110, 0x080c, 0xa364, - 0x00c6, 0x080c, 0x99d6, 0x00ce, 0x9ce0, 0x0018, 0x7060, 0x9c02, - 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, - 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, - 0x2061, 0x1a73, 0x6112, 0x080c, 0x2e30, 0x9006, 0x0010, 0x9085, - 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x080c, 0x9980, 0x01d8, 0x080c, 0x511b, 0x0110, 0x662e, - 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x511b, 0x0118, 0x080c, - 0xb721, 0x0168, 0x080c, 0xba69, 0x6023, 0x0003, 0x2009, 0x004b, - 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, - 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9a23, - 0x0590, 0x080c, 0x511b, 0x0118, 0x602f, 0x0000, 0x0010, 0x6017, - 0x0000, 0x2b00, 0x6012, 0x080c, 0xba69, 0x6023, 0x0003, 0x0016, - 0x080c, 0x8180, 0x0076, 0x903e, 0x080c, 0x8078, 0x2c08, 0x080c, - 0xcd62, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x99d6, 0x9085, - 0x0001, 0x0070, 0x080c, 0x511b, 0x0128, 0xd18c, 0x1170, 0x080c, - 0xb721, 0x0148, 0x2009, 0x004c, 0x080c, 0x9a50, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, - 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, - 0x0016, 0x080c, 0x9980, 0x2c78, 0x01d8, 0x080c, 0x511b, 0x0110, - 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, - 0x0005, 0x080c, 0xb733, 0x2f60, 0x080c, 0x511b, 0x0118, 0x080c, - 0xb721, 0x0130, 0x001e, 0x0016, 0x080c, 0x9a50, 0x9085, 0x0001, - 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, - 0x080c, 0x9980, 0x2c78, 0x0530, 0x080c, 0x511b, 0x0110, 0x7e2e, - 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, - 0x0004, 0x0489, 0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120, - 0x2f60, 0x080c, 0x99d6, 0x0060, 0x2f60, 0x080c, 0x511b, 0x0120, - 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9a50, - 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, - 0x0c98, 0x00c6, 0x080c, 0x4612, 0x00ce, 0x1120, 0x080c, 0x99d6, - 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, - 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, - 0x080c, 0x60b2, 0x0158, 0x2001, 0xb738, 0x0006, 0x900e, 0x2400, - 0x080c, 0x6770, 0x080c, 0x6536, 0x000e, 0x0807, 0x2418, 0x080c, - 0x8417, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, - 0x080c, 0x8198, 0x008e, 0x080c, 0x8078, 0x2f08, 0x2648, 0x080c, - 0xcd62, 0xb93c, 0x81ff, 0x090c, 0x8269, 0x080c, 0x8582, 0x012e, - 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, - 0x9980, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xba69, 0x6023, - 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9a50, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, - 0x2091, 0x8000, 0x080c, 0x9a23, 0x01b8, 0x660a, 0x2b08, 0x6112, - 0x080c, 0xba69, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, - 0x080c, 0x1582, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9a50, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, - 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9980, 0x0198, - 0x660a, 0x2b08, 0x6112, 0x080c, 0xba69, 0x6023, 0x0001, 0x2900, - 0x6016, 0x001e, 0x0016, 0x080c, 0x9a50, 0x9085, 0x0001, 0x001e, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x080c, 0x9a23, 0x0188, 0x2b08, 0x6112, 0x080c, 0xba69, - 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9a50, - 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, - 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, - 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x002e, - 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, - 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, - 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, - 0x6014, 0x904d, 0x080c, 0xb5fb, 0x0168, 0xa864, 0x9086, 0x0139, - 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, - 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x080c, 0x9a23, 0x0198, 0x2b08, 0x6112, - 0x080c, 0xba69, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x2e30, - 0x2009, 0x0028, 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1822, - 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa5aa, 0x00be, - 0x080c, 0xa7a4, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x8048, - 0x080c, 0x8582, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, - 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbc27, 0x080c, 0xa364, - 0x080c, 0x99d6, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0db2, - 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, - 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6536, 0x012e, - 0x009e, 0x080c, 0x99d6, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, - 0x2001, 0x0004, 0x080c, 0x5ecf, 0x00e8, 0x9186, 0x0015, 0x1510, - 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, - 0x2058, 0x080c, 0x6019, 0x00be, 0x080c, 0xa875, 0x1198, 0x6010, - 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, - 0x080c, 0x5ecf, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, - 0x9dd7, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, - 0xa364, 0x080c, 0x99d6, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, - 0x904d, 0x090c, 0x0db2, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, - 0x4000, 0x900e, 0x080c, 0x619e, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6536, - 0x012e, 0x080c, 0x99d6, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0db2, - 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, - 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6536, 0x012e, - 0x080c, 0x99d6, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, - 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, 0x6017, - 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x8000, 0x080c, - 0x8582, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005, - 0xb330, 0xb919, 0xb919, 0xb91c, 0xd030, 0xd04b, 0xd04e, 0xb330, - 0xb330, 0xb330, 0xb330, 0xb330, 0xb330, 0xb330, 0xb330, 0x080c, - 0x0db2, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, - 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1832, - 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0x9980, 0x0508, - 0x7810, 0x6012, 0x080c, 0xba69, 0x7820, 0x9086, 0x0003, 0x0128, - 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, - 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, - 0x7954, 0x6156, 0x080c, 0x8000, 0x080c, 0x8582, 0x2f60, 0x00fe, - 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005, - 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0180, 0xc0e4, - 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, - 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0f87, 0x6830, - 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, - 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, - 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, - 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, - 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, - 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, - 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x8000, 0x080c, - 0x8582, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, - 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, - 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, - 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, - 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, - 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, - 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, - 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, - 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, - 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, - 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, - 0x2001, 0x1951, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, - 0x7e7f, 0x2001, 0x1955, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, - 0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d, 0x711a, - 0x721e, 0x2001, 0x0064, 0x080c, 0x7e7f, 0x2001, 0x1956, 0x82ff, - 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1957, 0x9288, 0x000a, - 0x2102, 0x2001, 0x1a55, 0x2102, 0x2001, 0x0032, 0x080c, 0x14d2, - 0x080c, 0x6285, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, - 0x0006, 0x0016, 0x00e6, 0x2001, 0x1955, 0x2003, 0x0028, 0x2001, - 0x1956, 0x2003, 0x0014, 0x2071, 0x193d, 0x701b, 0x0000, 0x701f, - 0x07d0, 0x2001, 0x1957, 0x2009, 0x001e, 0x2102, 0x2001, 0x1a55, - 0x2102, 0x2001, 0x0032, 0x080c, 0x14d2, 0x00ee, 0x001e, 0x000e, - 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x1007, 0x009e, - 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9980, - 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, - 0x2009, 0x0033, 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, - 0x9186, 0x0015, 0x1500, 0x7088, 0x9086, 0x0018, 0x11e0, 0x6014, - 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x8772, 0x01d8, - 0x7074, 0xaa50, 0x9206, 0x1160, 0x7078, 0xaa54, 0x9206, 0x1140, - 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x2e75, - 0x080c, 0x9dd7, 0x0020, 0x080c, 0xa364, 0x080c, 0x99d6, 0x00fe, - 0x00ee, 0x009e, 0x0005, 0x7058, 0xaa54, 0x9206, 0x0d48, 0x0c80, - 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9980, 0x0188, 0x2b08, - 0x6112, 0x080c, 0xba69, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, - 0x004d, 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, - 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, - 0x9980, 0x0180, 0x2b08, 0x6112, 0x080c, 0xba69, 0x6023, 0x0001, - 0x2900, 0x6016, 0x001e, 0x080c, 0x9a50, 0x9085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, - 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, - 0x9186, 0x0015, 0x1568, 0x7188, 0x6014, 0x2048, 0xa814, 0x8003, - 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x196f, 0x2003, 0x0000, - 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, - 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, - 0x196f, 0x0016, 0x200c, 0x080c, 0xc29a, 0x001e, 0xa804, 0x9005, - 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, - 0x080c, 0xa364, 0x080c, 0x99d6, 0x00fe, 0x00ee, 0x009e, 0x006e, - 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, - 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7088, 0x9086, - 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8772, 0x01a8, - 0x7074, 0xaa74, 0x9206, 0x1130, 0x7078, 0xaa78, 0x9206, 0x1110, - 0x080c, 0x2e30, 0x080c, 0x9dd7, 0x0020, 0x080c, 0xa364, 0x080c, - 0x99d6, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7058, 0xaa78, 0x9206, - 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, - 0x0015, 0x1550, 0x7088, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, - 0x2c78, 0x080c, 0x8772, 0x05e8, 0x7074, 0xaacc, 0x9206, 0x1180, - 0x7078, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2e30, 0x0016, 0xa998, - 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x50cb, 0x001e, 0x0010, - 0x080c, 0x4ebc, 0x080c, 0xb5fb, 0x0500, 0xa87b, 0x0000, 0xa883, - 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x4ebc, 0x080c, 0xb5fb, - 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, - 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, - 0x080c, 0x6536, 0x012e, 0x080c, 0x99d6, 0x00fe, 0x00ee, 0x009e, - 0x0005, 0x7058, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, 0x0026, - 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, - 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, - 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, - 0x080c, 0xb5fb, 0x0904, 0xbc23, 0x0096, 0x6314, 0x2348, 0xa87a, - 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, - 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x619e, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, - 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f52, 0x20a9, 0x0004, - 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, 0x2098, - 0x080c, 0x0f52, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, - 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, - 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6529, - 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026, - 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210, - 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084, - 0x00ff, 0x900e, 0x080c, 0x24d6, 0x2118, 0x831f, 0x939c, 0xff00, - 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, - 0x4672, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b, - 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002, - 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe, - 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026, - 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c, - 0xb5e9, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, - 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160, - 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106, - 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005, - 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff, - 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e, - 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xad37, 0x0005, - 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0489, 0x01d0, - 0x080c, 0xb5fb, 0x01b8, 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, - 0x0096, 0x2048, 0xa87c, 0x080c, 0xb7fa, 0x1118, 0x080c, 0xa364, - 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, - 0x6536, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, - 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, - 0x0020, 0xa87b, 0x0005, 0x080c, 0xb8e9, 0xa877, 0x0000, 0x0005, - 0x2001, 0x180f, 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, 0x180f, - 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, - 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, - 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4829, 0x004e, 0x003e, - 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1955, 0x2004, 0x601a, - 0x0005, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005, 0x080c, 0x99d6, - 0x0804, 0x8582, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, - 0x0db2, 0x001b, 0x006e, 0x00be, 0x0005, 0xbd2d, 0xc3f7, 0xc552, - 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd64, 0xc5d0, 0xbd2d, - 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0x080c, 0x0db2, 0x0066, - 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db2, 0x0013, 0x006e, 0x0005, - 0xbd48, 0xcb38, 0xbd48, 0xbd48, 0xbd48, 0xbd48, 0xbd48, 0xbd48, - 0xcae5, 0xcb8c, 0xbd48, 0xd16d, 0xd1a3, 0xd16d, 0xd1a3, 0xbd48, - 0x080c, 0x0db2, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0db2, 0x6000, - 0x000a, 0x0005, 0xbd62, 0xc7ad, 0xc89d, 0xc8bf, 0xc97e, 0xbd62, - 0xca5c, 0xca06, 0xc5dc, 0xcabb, 0xcad0, 0xbd62, 0xbd62, 0xbd62, - 0xbd62, 0xbd62, 0x080c, 0x0db2, 0x91b2, 0x0053, 0x1a0c, 0x0db2, - 0x2100, 0x91b2, 0x0040, 0x1a04, 0xc19a, 0x0002, 0xbdae, 0xbf8b, - 0xbdae, 0xbdae, 0xbdae, 0xbf94, 0xbdae, 0xbdae, 0xbdae, 0xbdae, - 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, - 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdb0, 0xbe06, 0xbe15, - 0xbe79, 0xbea4, 0xbf1d, 0xbf76, 0xbdae, 0xbdae, 0xbf97, 0xbdae, - 0xbdae, 0xbfac, 0xbfb9, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, - 0xc03c, 0xbdae, 0xbdae, 0xc050, 0xbdae, 0xbdae, 0xc00b, 0xbdae, - 0xbdae, 0xbdae, 0xc068, 0xbdae, 0xbdae, 0xbdae, 0xc0e5, 0xbdae, - 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xbdae, 0xc162, 0x080c, 0x0db2, - 0x080c, 0x6262, 0x1150, 0x2001, 0x1835, 0x2004, 0xd0cc, 0x1128, - 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, - 0x0009, 0x6017, 0x0000, 0x0804, 0xbf84, 0x080c, 0x624b, 0x00e6, - 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, - 0x2019, 0x0029, 0x080c, 0x8180, 0x0076, 0x903e, 0x080c, 0x8078, - 0x2c08, 0x080c, 0xcd62, 0x007e, 0x001e, 0x001e, 0x002e, 0x003e, - 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x5f8d, 0xbe04, 0x9684, - 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xcc94, 0x1904, 0xbe71, - 0x080c, 0xcc30, 0x1120, 0x6007, 0x0008, 0x0804, 0xbf84, 0x6007, - 0x0009, 0x0804, 0xbf84, 0x080c, 0xce81, 0x0128, 0x080c, 0xcc94, - 0x0d78, 0x0804, 0xbe71, 0x6017, 0x1900, 0x0c88, 0x080c, 0x2f50, - 0x1904, 0xc197, 0x6106, 0x080c, 0xcbe7, 0x6007, 0x0006, 0x0804, - 0xbf84, 0x6007, 0x0007, 0x0804, 0xbf84, 0x080c, 0xd1df, 0x1904, - 0xc197, 0x080c, 0x2f50, 0x1904, 0xc197, 0x00d6, 0x6610, 0x2658, - 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, - 0x080c, 0x5ebb, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0188, - 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, - 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, 0x00de, - 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, 0x1140, - 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130, - 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, 0x080c, - 0xccf8, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, - 0xbaa0, 0x900e, 0x080c, 0x2e75, 0x002e, 0x080c, 0x6019, 0x6007, - 0x000a, 0x00de, 0x0804, 0xbf84, 0x6007, 0x000b, 0x00de, 0x0804, - 0xbf84, 0x080c, 0x2e30, 0x080c, 0xbd01, 0x6007, 0x0001, 0x0804, - 0xbf84, 0x080c, 0xd1df, 0x1904, 0xc197, 0x080c, 0x2f50, 0x1904, - 0xc197, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, 0x90b2, - 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, 0x2658, - 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, 0xbaa0, - 0x900e, 0x080c, 0x2e75, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, - 0x080c, 0xd2fb, 0x0804, 0xbf84, 0x080c, 0x6262, 0x1140, 0x2001, - 0x1835, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, - 0xbdbd, 0x080c, 0x624b, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, - 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, - 0x5efb, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, - 0x0120, 0x9686, 0x0006, 0x1904, 0xbe71, 0x080c, 0xcd05, 0x1120, - 0x6007, 0x000e, 0x0804, 0xbf84, 0x0046, 0x6410, 0x2458, 0xbca0, - 0x0046, 0x080c, 0x2e30, 0x080c, 0xbd01, 0x004e, 0x0016, 0x9006, - 0x2009, 0x1854, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, - 0xcfe6, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, - 0x6007, 0x0001, 0x0804, 0xbf84, 0x2001, 0x0001, 0x080c, 0x5ebb, - 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, - 0x2011, 0x0270, 0x080c, 0xa909, 0x003e, 0x002e, 0x001e, 0x015e, - 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, - 0xbe71, 0x9682, 0x0007, 0x0a04, 0xbecd, 0x0804, 0xbe71, 0x6017, - 0x1900, 0x6007, 0x0009, 0x0804, 0xbf84, 0x080c, 0x6262, 0x1140, - 0x2001, 0x1835, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, - 0x0804, 0xbdbd, 0x080c, 0x624b, 0x6610, 0x2658, 0xbe04, 0x9684, - 0x00ff, 0x9082, 0x0006, 0x0690, 0x96b4, 0xff00, 0x8637, 0x9686, - 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xbe71, 0x080c, 0xcd33, - 0x1130, 0x080c, 0xcc30, 0x1118, 0x6007, 0x0010, 0x04e8, 0x0046, - 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2e30, 0x080c, 0xbd01, - 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0xd1a4, 0x0148, - 0x2009, 0x0029, 0x080c, 0xcfe6, 0x6010, 0x2058, 0xb800, 0xc0e5, - 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xce81, - 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0978, 0x0804, - 0xbe71, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f50, - 0x1904, 0xc197, 0x080c, 0xd1df, 0x1904, 0xc197, 0x080c, 0xc335, - 0x1904, 0xbe71, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x8048, - 0x080c, 0x8582, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, - 0x8048, 0x080c, 0x8582, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, - 0xd1df, 0x1904, 0xc197, 0x080c, 0x2f50, 0x1904, 0xc197, 0x080c, - 0xc335, 0x1904, 0xbe71, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, - 0x8048, 0x080c, 0x8582, 0x0005, 0x080c, 0x2f50, 0x1904, 0xc197, - 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8048, 0x080c, 0x8582, - 0x0005, 0x080c, 0xd1df, 0x1904, 0xc197, 0x080c, 0x2f50, 0x1904, - 0xc197, 0x080c, 0xc335, 0x1904, 0xbe71, 0x0016, 0x0026, 0x00e6, - 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, - 0xb5e9, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, - 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, - 0x9006, 0x080c, 0xcfb8, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, - 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, - 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, - 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x99d6, 0x2160, 0x6007, - 0x0025, 0x6003, 0x0001, 0x080c, 0x8048, 0x080c, 0x8582, 0x00ee, - 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5ebb, 0x0156, - 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, - 0x0276, 0x080c, 0xa909, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, - 0x6007, 0x0031, 0x0804, 0xbf84, 0x080c, 0xa5c2, 0x080c, 0x6c53, - 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6c6d, 0x1138, 0x080c, - 0x6f2a, 0x080c, 0x5a21, 0x080c, 0x6b8a, 0x0010, 0x080c, 0x6c2d, - 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2f50, 0x1904, 0xc197, - 0x080c, 0xc335, 0x1904, 0xbe71, 0x6106, 0x080c, 0xc351, 0x1120, - 0x6007, 0x002b, 0x0804, 0xbf84, 0x6007, 0x002c, 0x0804, 0xbf84, - 0x080c, 0xd1df, 0x1904, 0xc197, 0x080c, 0x2f50, 0x1904, 0xc197, - 0x080c, 0xc335, 0x1904, 0xbe71, 0x6106, 0x080c, 0xc356, 0x1120, - 0x6007, 0x002e, 0x0804, 0xbf84, 0x6007, 0x002f, 0x0804, 0xbf84, - 0x080c, 0x2f50, 0x1904, 0xc197, 0x00e6, 0x00d6, 0x00c6, 0x6010, - 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, - 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, - 0x0804, 0xbf8b, 0x080c, 0x5117, 0xd0e4, 0x0904, 0xc0e2, 0x2071, - 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, - 0x62a0, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, - 0x9206, 0x0510, 0x080c, 0x629c, 0x15b8, 0x2069, 0x1800, 0x6878, - 0x9206, 0x1590, 0x6874, 0x9106, 0x1578, 0x7210, 0x080c, 0xb5e9, - 0x0590, 0x080c, 0xc222, 0x0578, 0x080c, 0xd05d, 0x0560, 0x622e, - 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x8000, 0x080c, 0x8582, - 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, - 0x080c, 0xb5e9, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, - 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xcfb8, - 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, - 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, - 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2f50, 0x1904, - 0xc197, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, - 0x0006, 0x1904, 0xbf8b, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x5117, - 0xd0e4, 0x0904, 0xc15a, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, - 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, - 0x2c08, 0x9085, 0x0001, 0x080c, 0xcfb8, 0x2c10, 0x00ce, 0x05e8, - 0x080c, 0xb5e9, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, - 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb244, 0x002e, 0x00ce, - 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, - 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, - 0x9005, 0x0170, 0x080c, 0xc222, 0x0904, 0xc0db, 0x0056, 0x7510, - 0x7614, 0x080c, 0xd076, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, - 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, - 0x080c, 0x8000, 0x080c, 0x8582, 0x0c78, 0x6007, 0x003b, 0x602f, - 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x8000, 0x080c, - 0x8582, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, - 0x0804, 0xc0b2, 0x00e6, 0x0026, 0x080c, 0x6262, 0x0550, 0x080c, - 0x624b, 0x080c, 0xd251, 0x1518, 0x2071, 0x1800, 0x70d4, 0x9085, - 0x0003, 0x70d6, 0x00f6, 0x2079, 0x0100, 0x72a8, 0x9284, 0x00ff, - 0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205, 0x707a, 0x78ea, - 0x00fe, 0x70df, 0x0000, 0x080c, 0x62a0, 0x0120, 0x2011, 0x19cf, - 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c2b, 0x0010, 0x080c, - 0xd283, 0x002e, 0x00ee, 0x080c, 0x99d6, 0x0804, 0xbf8a, 0x080c, - 0x99d6, 0x0005, 0x2600, 0x0002, 0xc1ae, 0xc1ae, 0xc1ae, 0xc1ae, - 0xc1ae, 0xc1b0, 0xc1ae, 0xc1ae, 0xc1ae, 0xc1ae, 0xc1cd, 0xc1ae, - 0xc1ae, 0xc1ae, 0xc1df, 0xc1ec, 0xc21d, 0xc1ae, 0x080c, 0x0db2, - 0x080c, 0xd1df, 0x1d20, 0x080c, 0x2f50, 0x1d08, 0x080c, 0xc335, - 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, - 0x8048, 0x0005, 0x080c, 0x2e30, 0x080c, 0xbd01, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x8048, 0x0005, 0x080c, 0xd1df, 0x1938, - 0x080c, 0x2f50, 0x1920, 0x080c, 0xc335, 0x1d60, 0x703c, 0x6016, - 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8048, 0x0005, 0x080c, - 0xc23d, 0x0904, 0xc197, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, - 0x8048, 0x080c, 0x8582, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, - 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, - 0x7140, 0x2001, 0x198c, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, - 0x198d, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, - 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, - 0x080c, 0xa91d, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, - 0x080c, 0x8048, 0x080c, 0x8582, 0x0005, 0x6007, 0x0050, 0x703c, - 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, - 0x6010, 0x2058, 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, - 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, - 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, - 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, - 0x7088, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196f, - 0x2003, 0x0000, 0x080c, 0x0fee, 0x05a0, 0x2900, 0x6016, 0x7088, - 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, - 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, - 0x196f, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x0fee, - 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, - 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, - 0x196f, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, - 0x0048, 0x2071, 0x1800, 0x708b, 0x0000, 0x6014, 0x2048, 0x080c, - 0x0f87, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, - 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, - 0xffff, 0x11a8, 0x080c, 0x20b2, 0x2099, 0x026c, 0x2001, 0x0014, - 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, - 0x22a8, 0x8108, 0x080c, 0x20b2, 0x2099, 0x0260, 0x0ca8, 0x080c, - 0x20b2, 0x2061, 0x196f, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, - 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, - 0x080c, 0x20b2, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196f, 0x2019, - 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, + 0x9115, 0x190c, 0xbf4f, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, + 0xb07e, 0x00ae, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xcebd, 0xa974, + 0x0016, 0x080c, 0xc42a, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, + 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, + 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, + 0xcde0, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, + 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, + 0xa834, 0xa938, 0x9115, 0x190c, 0xbf4f, 0xa974, 0x0016, 0x080c, + 0x6862, 0x001e, 0xd1e4, 0x1120, 0x080c, 0xab6b, 0x009e, 0x0005, + 0x080c, 0xcb17, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, + 0x190c, 0x19a0, 0x009e, 0x0005, 0x080c, 0x9317, 0x0010, 0x080c, + 0x93cc, 0x080c, 0xc825, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, + 0xca24, 0x1118, 0x080c, 0xb51d, 0x00a0, 0xa867, 0x0103, 0x2009, + 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, + 0x918e, 0x0029, 0x1110, 0x080c, 0xe5d5, 0xa877, 0x0000, 0x080c, + 0x6a46, 0x009e, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0804, 0x9548, + 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc1b2, 0xc1b2, + 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b4, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, + 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, + 0xc1b2, 0xc1b2, 0x080c, 0x0dd5, 0x080c, 0x54bf, 0x01f8, 0x6014, + 0x7144, 0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, + 0x00ff, 0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, + 0x0139, 0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, + 0x4000, 0xa99a, 0xaa9e, 0x080c, 0x6a46, 0x009e, 0x0804, 0xab6b, + 0x9182, 0x0085, 0x0002, 0xc1ea, 0xc1e8, 0xc1e8, 0xc1f6, 0xc1e8, + 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, + 0x080c, 0x0dd5, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126, + 0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x0026, 0x0056, + 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, + 0xc813, 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, + 0x6d10, 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xc465, 0x00ce, + 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, + 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x9280, 0x0004, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, + 0x0128, 0x00c6, 0x2260, 0x080c, 0xcb51, 0x00ce, 0x00ee, 0x00de, + 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, + 0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082, + 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, + 0x0dd5, 0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825, + 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, + 0x6a46, 0x009e, 0x080c, 0xab9c, 0x0804, 0x941c, 0xc26b, 0xc26d, + 0xc26d, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b, + 0xc26b, 0xc26b, 0xc26b, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, + 0xab9c, 0x080c, 0x941c, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, + 0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, + 0x9317, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x0096, 0x6014, 0x2048, + 0x080c, 0xc825, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, + 0x0029, 0x080c, 0x6a46, 0x080c, 0xca07, 0x009e, 0x080c, 0xab6b, + 0x080c, 0x941c, 0x0005, 0x080c, 0xac01, 0x0ce0, 0x9186, 0x0014, + 0x1dd0, 0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825, + 0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, + 0xc0ec, 0xa882, 0x08f0, 0x0002, 0xc2c3, 0xc2c1, 0xc2c1, 0xc2c1, + 0xc2c1, 0xc2c1, 0xc2db, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1, + 0xc2c1, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, + 0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000c, + 0x080c, 0x941c, 0x0005, 0x080c, 0x9317, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, + 0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000e, + 0x080c, 0x941c, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, + 0x0208, 0x0012, 0x0804, 0xac01, 0xc309, 0xc309, 0xc309, 0xc309, + 0xc30b, 0xc358, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, + 0xc309, 0x080c, 0x0dd5, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc36c, + 0x080c, 0xc825, 0x1118, 0x080c, 0xca07, 0x0068, 0x6014, 0x2048, + 0xa87c, 0xd0e4, 0x1110, 0x080c, 0xca07, 0xa867, 0x0103, 0x080c, + 0xcef8, 0x080c, 0x6a46, 0x00d6, 0x2c68, 0x080c, 0xab15, 0x01d0, + 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, + 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, + 0x080c, 0xcc93, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x8e7f, + 0x080c, 0x941c, 0x2d60, 0x00de, 0x080c, 0xab6b, 0x009e, 0x0005, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, + 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, + 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xce90, + 0x11f0, 0x080c, 0xab15, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, + 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, + 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, + 0x6156, 0x080c, 0xcc93, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x2d60, + 0x00de, 0x0804, 0xab6b, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825, + 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, + 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, + 0xa87b, 0x0005, 0x080c, 0xcb13, 0xa877, 0x0000, 0x080c, 0x6a46, + 0x080c, 0xca07, 0x009e, 0x0804, 0xab6b, 0x0016, 0x0096, 0x6014, + 0x2048, 0x080c, 0xc825, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, + 0xa877, 0x0000, 0x080c, 0x6a46, 0x009e, 0x001e, 0x9186, 0x0013, + 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, + 0xac01, 0x0030, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, + 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, + 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, + 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xc43a, 0x96b2, + 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fb2, 0x080c, 0x1000, + 0x0520, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, + 0x968a, 0x003d, 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, + 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, + 0x0c28, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, + 0x0003, 0xb566, 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, + 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, + 0x005e, 0x0005, 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, + 0xa807, 0x0000, 0x080c, 0x6a46, 0x2a48, 0x0cb8, 0x080c, 0x6a46, + 0x00ae, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, + 0x7816, 0xd184, 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, + 0x20e8, 0xa85c, 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, + 0x2098, 0x4003, 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, + 0x9e00, 0x2098, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, + 0x1d80, 0x7817, 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, + 0x8000, 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, + 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, + 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xc4a0, + 0xc4a0, 0xc49b, 0xc4c2, 0xc48e, 0xc49b, 0xc4c2, 0xc49b, 0xc48e, + 0x8c68, 0xc49b, 0xc49b, 0xc49b, 0xc48e, 0xc48e, 0x080c, 0x0dd5, + 0x0036, 0x2019, 0x0010, 0x080c, 0xde08, 0x6023, 0x0006, 0x6003, + 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, + 0x0096, 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xc825, 0x01c0, + 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, + 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6c85, 0x080c, 0xcb13, + 0x080c, 0x6a3a, 0x080c, 0xab9c, 0x9085, 0x0001, 0x009e, 0x0005, + 0x9006, 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, + 0xc4d8, 0xc506, 0xc4da, 0xc527, 0xc501, 0xc4d8, 0xc49b, 0xc4a0, + 0xc4a0, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, + 0x080c, 0x0dd5, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, + 0x0096, 0x6014, 0x2048, 0x080c, 0xc825, 0x0158, 0xa87c, 0xd0cc, + 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, + 0xcb13, 0x009e, 0x080c, 0xced2, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x9085, 0x0001, + 0x0005, 0x0066, 0x080c, 0x19b4, 0x006e, 0x08a0, 0x00e6, 0x2071, + 0x19e5, 0x7024, 0x9c06, 0x1120, 0x080c, 0xa236, 0x00ee, 0x0850, + 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, + 0x2049, 0x0001, 0x2c40, 0x080c, 0xa3a6, 0x009e, 0x008e, 0x0010, + 0x080c, 0xa133, 0x00ee, 0x1904, 0xc4da, 0x0804, 0xc49b, 0x0036, + 0x00e6, 0x2071, 0x19e5, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, + 0xa2ac, 0x00ee, 0x003e, 0x0804, 0xc4da, 0x080c, 0xa4d6, 0x00ee, + 0x003e, 0x1904, 0xc4da, 0x0804, 0xc49b, 0x00c6, 0x6020, 0x9084, + 0x000f, 0x0013, 0x00ce, 0x0005, 0xc55a, 0xc609, 0xc770, 0xc564, + 0xab9c, 0xc55a, 0xddfa, 0xcf3a, 0xc609, 0x8c3a, 0xc7ef, 0xc553, + 0xc553, 0xc553, 0xc553, 0x080c, 0x0dd5, 0x080c, 0xca24, 0x1110, + 0x080c, 0xb51d, 0x0005, 0x080c, 0x9317, 0x080c, 0x941c, 0x0804, + 0xab6b, 0x601b, 0x0001, 0x0005, 0x080c, 0xc825, 0x0130, 0x6014, + 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, + 0x1a0c, 0x0dd5, 0x0002, 0xc583, 0xc585, 0xc5a9, 0xc5bd, 0xc5e1, + 0xc583, 0xc55a, 0xc55a, 0xc55a, 0xc5bd, 0xc5bd, 0xc583, 0xc583, + 0xc583, 0xc583, 0xc5c7, 0x080c, 0x0dd5, 0x00e6, 0x6014, 0x0096, + 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e5, 0x7024, + 0x9c06, 0x01a0, 0x080c, 0xa133, 0x080c, 0xced2, 0x6007, 0x0085, + 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1985, 0x2004, 0x601a, + 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ee, 0x0005, 0x601b, 0x0001, + 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, + 0x080c, 0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0005, 0x0096, 0x601b, 0x0001, + 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, + 0x54bf, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, + 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, + 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6a46, 0x009e, 0x0804, + 0xab6b, 0x6014, 0x0096, 0x904d, 0x01f8, 0xa97c, 0xd1e4, 0x01e0, + 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, + 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, + 0x2c08, 0x080c, 0x15d1, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, + 0x0048, 0x080c, 0xabe6, 0x0005, 0x009e, 0x080c, 0x19b4, 0x0804, + 0xc5a9, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x000b, 0x0005, + 0xc620, 0xc561, 0xc622, 0xc620, 0xc622, 0xc622, 0xc55b, 0xc620, + 0xc555, 0xc555, 0xc620, 0xc620, 0xc620, 0xc620, 0xc620, 0xc620, + 0x080c, 0x0dd5, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, + 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0dd5, 0x00b6, 0x0013, 0x00be, + 0x0005, 0xc63d, 0xc70a, 0xc63f, 0xc67f, 0xc63f, 0xc67f, 0xc63f, + 0xc64d, 0xc63d, 0xc67f, 0xc63d, 0xc66e, 0x080c, 0x0dd5, 0x6004, + 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, + 0x0590, 0x908e, 0x0052, 0x0904, 0xc706, 0x6004, 0x080c, 0xca24, + 0x0904, 0xc723, 0x908e, 0x0004, 0x1110, 0x080c, 0x3093, 0x908e, + 0x0021, 0x0904, 0xc727, 0x908e, 0x0022, 0x0904, 0xc76b, 0x908e, + 0x003d, 0x0904, 0xc727, 0x908e, 0x0039, 0x0904, 0xc72b, 0x908e, + 0x0035, 0x0904, 0xc72b, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, + 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, + 0x0110, 0x080c, 0x306e, 0x080c, 0xb51d, 0x0804, 0xab9c, 0x00c6, + 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xc6f7, 0x9186, 0x0002, + 0x1904, 0xc6cc, 0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c, + 0x717d, 0x11b0, 0x080c, 0xcf18, 0x0138, 0x080c, 0x71a0, 0x1120, + 0x080c, 0x708d, 0x0804, 0xc754, 0x2001, 0x197d, 0x2003, 0x0001, + 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x70af, 0x0804, 0xc754, + 0x6010, 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xc754, + 0xb8a0, 0x9084, 0xff80, 0x1904, 0xc754, 0xb840, 0x9084, 0x00ff, + 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, + 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0xab15, 0x0128, 0x2b00, + 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, + 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, + 0x2009, 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x5d8b, 0x00ee, 0x080c, 0xb51d, 0x0030, 0x080c, 0xb51d, + 0x080c, 0x306e, 0x080c, 0xcf2d, 0x00e6, 0x0126, 0x2091, 0x8000, + 0x080c, 0x3093, 0x012e, 0x00ee, 0x080c, 0xab9c, 0x0005, 0x2001, + 0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x8ec7, 0x080c, 0x941c, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x3093, + 0x0804, 0xc67b, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, + 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xc6cc, + 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, + 0x00de, 0x00ce, 0x0898, 0x080c, 0xb51d, 0x0804, 0xc67d, 0x080c, + 0xb559, 0x0804, 0xc67d, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xce90, + 0x00de, 0x0118, 0x080c, 0xab6b, 0x00f0, 0x6004, 0x8007, 0x6134, + 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1985, 0x2004, 0x601a, + 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb51d, + 0x080c, 0x306e, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x3093, + 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, + 0x012e, 0x00ee, 0x0005, 0x080c, 0xaf9b, 0x1904, 0xc723, 0x0005, + 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x00d6, 0x001b, + 0x00de, 0x009e, 0x0005, 0xc78b, 0xc78b, 0xc78b, 0xc78b, 0xc78b, + 0xc78b, 0xc78b, 0xc78b, 0xc78b, 0xc55a, 0xc78b, 0xc561, 0xc78d, + 0xc561, 0xc79a, 0xc78b, 0x080c, 0x0dd5, 0x6004, 0x9086, 0x008b, + 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x8e7f, 0x080c, + 0x941c, 0x0005, 0x080c, 0xcf0c, 0x0118, 0x080c, 0xcf1f, 0x0010, + 0x080c, 0xcf2d, 0x080c, 0xca07, 0x080c, 0xc825, 0x0570, 0x080c, + 0x306e, 0x080c, 0xc825, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, + 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, + 0x6a46, 0x2c68, 0x080c, 0xab15, 0x0150, 0x6810, 0x6012, 0x080c, + 0xcc93, 0x00c6, 0x2d60, 0x080c, 0xab9c, 0x00ce, 0x0008, 0x2d60, + 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x00c8, 0x080c, 0xcf0c, 0x0138, + 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x306e, 0x08d0, 0x6034, + 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, + 0x1118, 0x080c, 0x306e, 0x0868, 0x080c, 0xab9c, 0x0005, 0x6000, + 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xc805, 0xc805, 0xc807, + 0xc807, 0xc807, 0xc805, 0xc805, 0xab9c, 0xc805, 0xc805, 0xc805, + 0xc805, 0xc805, 0xc805, 0xc805, 0xc805, 0x080c, 0x0dd5, 0x080c, + 0xa4d6, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6a46, + 0x009e, 0x0804, 0xab6b, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, + 0x0240, 0x2001, 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, + 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, + 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, + 0x080c, 0x10ab, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, + 0x7354, 0x7074, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, + 0xcf18, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, + 0x1148, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x00c6, 0x080c, 0xab9c, + 0x00ce, 0x0060, 0x080c, 0xcc0d, 0x0148, 0x080c, 0xca24, 0x1110, + 0x080c, 0xb51d, 0x00c6, 0x080c, 0xab6b, 0x00ce, 0x9ce0, 0x0018, + 0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, + 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, + 0x81ff, 0x0128, 0x2061, 0x1aa7, 0x6112, 0x080c, 0x306e, 0x9006, + 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0xab15, 0x01d8, 0x080c, 0x54bf, + 0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x54bf, + 0x0118, 0x080c, 0xc94b, 0x0168, 0x080c, 0xcc93, 0x6023, 0x0003, + 0x2009, 0x004b, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, + 0x080c, 0xabb9, 0x0590, 0x080c, 0x54bf, 0x0118, 0x602f, 0x0000, + 0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x6023, + 0x0003, 0x0016, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, + 0x2c08, 0x080c, 0xdfbd, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, + 0xab6b, 0x9085, 0x0001, 0x0070, 0x080c, 0x54bf, 0x0128, 0xd18c, + 0x1170, 0x080c, 0xc94b, 0x0148, 0x2009, 0x004c, 0x080c, 0xabe6, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, + 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, + 0x00c6, 0x0046, 0x0016, 0x080c, 0xab15, 0x2c78, 0x01d8, 0x080c, + 0x54bf, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, + 0x0003, 0x2021, 0x0005, 0x080c, 0xc95d, 0x2f60, 0x080c, 0x54bf, + 0x0118, 0x080c, 0xc94b, 0x0130, 0x001e, 0x0016, 0x080c, 0xabe6, + 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, + 0x00c6, 0x0046, 0x080c, 0xab15, 0x2c78, 0x0530, 0x080c, 0x54bf, + 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, + 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x197e, 0x200c, + 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xab6b, 0x0060, 0x2f60, 0x080c, + 0x54bf, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, + 0x080c, 0xabe6, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, + 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x489b, 0x00ce, 0x1120, + 0x080c, 0xab6b, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, + 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6501, 0x0158, 0x2001, 0xc962, 0x0006, + 0x900e, 0x2400, 0x080c, 0x6c85, 0x080c, 0x6a46, 0x000e, 0x0807, + 0x2418, 0x080c, 0x92b1, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, + 0x0001, 0x2608, 0x080c, 0x9032, 0x008e, 0x080c, 0x8ef7, 0x2f08, + 0x2648, 0x080c, 0xdfbd, 0xb93c, 0x81ff, 0x090c, 0x9103, 0x080c, + 0x941c, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xab15, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, + 0xcc93, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, + 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x01b8, 0x660a, + 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0008, 0x2900, 0x6016, + 0x00f6, 0x2c78, 0x080c, 0x1689, 0x00fe, 0x2009, 0x0021, 0x080c, + 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, + 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, + 0xab15, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, + 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0xabe6, 0x9085, + 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x0188, 0x2b08, 0x6112, + 0x080c, 0xcc93, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, + 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, + 0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, + 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, + 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, + 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, + 0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xc825, 0x0168, 0xa864, + 0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, + 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, + 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x0198, + 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0001, 0x2900, 0x6016, + 0x080c, 0x306e, 0x2009, 0x0028, 0x080c, 0xabe6, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, + 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, + 0xb76f, 0x00be, 0x080c, 0xb992, 0x6003, 0x0001, 0x6007, 0x0029, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0078, 0x6014, 0x0096, 0x2048, + 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xce51, + 0x080c, 0xb51d, 0x080c, 0xab6b, 0x0005, 0x0096, 0x6014, 0x904d, + 0x090c, 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, + 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a46, 0x012e, 0x009e, 0x080c, 0xab6b, 0x0c30, 0x0096, 0x9186, + 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x631d, 0x00e8, 0x9186, + 0x0015, 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, + 0x6010, 0x00b6, 0x2058, 0x080c, 0x6468, 0x00be, 0x080c, 0xba63, + 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, + 0x2001, 0x0006, 0x080c, 0x631d, 0x6014, 0x2048, 0xa868, 0xd0fc, + 0x0170, 0x080c, 0xaf6f, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, + 0x0528, 0x080c, 0xb51d, 0x080c, 0xab6b, 0x009e, 0x0005, 0x6014, + 0x6310, 0x2358, 0x904d, 0x090c, 0x0dd5, 0xa87b, 0x0000, 0xa883, + 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x65ed, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x08f8, 0x6014, 0x904d, + 0x090c, 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, + 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a46, 0x012e, 0x080c, 0xab6b, 0x0840, 0xa878, 0x9086, 0x0005, + 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, + 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, + 0x00ce, 0x0005, 0xc55a, 0xcb43, 0xcb43, 0xcb46, 0xe2ca, 0xe2e5, + 0xe2e8, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, + 0xc55a, 0x080c, 0x0dd5, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, + 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, + 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, + 0x2001, 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, + 0xab15, 0x0508, 0x7810, 0x6012, 0x080c, 0xcc93, 0x7820, 0x9086, + 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, + 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, + 0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x8e7f, 0x080c, 0x941c, + 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1986, 0x2004, + 0x6042, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, + 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, + 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, + 0x0fb2, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, + 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, + 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, + 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, + 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, + 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954, + 0x6156, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, + 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, + 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, + 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, + 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, + 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, + 0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, + 0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, + 0x0188, 0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, + 0x0039, 0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, + 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, + 0x0036, 0x00e6, 0x2001, 0x1980, 0x200c, 0x8000, 0x2014, 0x2001, + 0x0032, 0x080c, 0x8cf7, 0x2001, 0x1984, 0x82ff, 0x1110, 0x2011, + 0x0014, 0x2202, 0x2001, 0x1982, 0x200c, 0x8000, 0x2014, 0x2071, + 0x196c, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8cf7, 0x2001, + 0x1985, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1986, + 0x9288, 0x000a, 0x2102, 0x2001, 0x1a88, 0x2102, 0x2001, 0x0032, + 0x080c, 0x15d1, 0x080c, 0x6718, 0x00ee, 0x003e, 0x002e, 0x001e, + 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1984, 0x2003, + 0x0028, 0x2001, 0x1985, 0x2003, 0x0014, 0x2071, 0x196c, 0x701b, + 0x0000, 0x701f, 0x07d0, 0x2001, 0x1986, 0x2009, 0x001e, 0x2102, + 0x2001, 0x1a88, 0x2102, 0x2001, 0x0032, 0x080c, 0x15d1, 0x00ee, + 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, + 0x1032, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, + 0x080c, 0xab15, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, + 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0xabe6, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, + 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x7090, 0x9086, 0x0018, + 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, + 0x96af, 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, + 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, + 0x080c, 0x30b3, 0x080c, 0xaf6f, 0x0020, 0x080c, 0xb51d, 0x080c, + 0xab6b, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, + 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xab15, + 0x0188, 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0001, 0x2900, + 0x6016, 0x2009, 0x004d, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, + 0x0016, 0x080c, 0xab15, 0x0180, 0x2b08, 0x6112, 0x080c, 0xcc93, + 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xabe6, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, + 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, + 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x7190, 0x6014, 0x2048, + 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x199e, + 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, + 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x20a0, 0x2001, 0x199e, 0x0016, 0x200c, 0x080c, 0xd4f3, 0x001e, + 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, + 0x0103, 0x0010, 0x080c, 0xb51d, 0x080c, 0xab6b, 0x00fe, 0x00ee, + 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, + 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, + 0x7090, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, + 0x96af, 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, + 0x9206, 0x1110, 0x080c, 0x306e, 0x080c, 0xaf6f, 0x0020, 0x080c, + 0xb51d, 0x080c, 0xab6b, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, + 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, + 0x1800, 0x9186, 0x0015, 0x1550, 0x7090, 0x9086, 0x0004, 0x1530, + 0x6014, 0x2048, 0x2c78, 0x080c, 0x96af, 0x05e8, 0x707c, 0xaacc, + 0x9206, 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, 0x306e, + 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x546f, + 0x001e, 0x0010, 0x080c, 0x5260, 0x080c, 0xc825, 0x0500, 0xa87b, + 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x5260, + 0x080c, 0xc825, 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, + 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, + 0xa867, 0x0139, 0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x00fe, + 0x00ee, 0x009e, 0x0005, 0x7060, 0xaad0, 0x9206, 0x0938, 0x0890, + 0x0016, 0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, + 0x9205, 0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, + 0xa992, 0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, + 0x00d6, 0x0036, 0x080c, 0xc825, 0x0904, 0xce4d, 0x0096, 0x6314, + 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, + 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x65ed, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, + 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d, + 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, + 0x000a, 0x2098, 0x080c, 0x0f7d, 0x00ce, 0x0090, 0xaa96, 0x3918, + 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, + 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, + 0x080c, 0x6a3a, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, + 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, + 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, + 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x26f0, 0x2118, 0x831f, + 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, + 0x8018, 0x080c, 0x48fb, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, + 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, + 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, + 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, + 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, + 0x6a2c, 0x080c, 0xc813, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, + 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, + 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, + 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, + 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, + 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, + 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xbf4f, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, + 0x0499, 0x01e0, 0x080c, 0xc825, 0x01c8, 0x080c, 0xca07, 0x6037, + 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, + 0xca24, 0x1118, 0x080c, 0xb51d, 0x0040, 0xa867, 0x0103, 0xa877, + 0x0000, 0x83ff, 0x1129, 0x080c, 0x6a46, 0x009e, 0x003e, 0x0005, + 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, + 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, + 0xcb13, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, + 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, + 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, + 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, + 0x080c, 0x4ab2, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, + 0x2001, 0x1984, 0x2004, 0x601a, 0x0005, 0x2001, 0x1986, 0x2004, + 0x6042, 0x0005, 0x080c, 0xab6b, 0x0804, 0x941c, 0x00b6, 0x0066, + 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x001b, 0x006e, 0x00be, + 0x0005, 0xcf59, 0xd650, 0xd7ad, 0xcf59, 0xcf59, 0xcf59, 0xcf59, + 0xcf59, 0xcf90, 0xd82b, 0xcf59, 0xcf59, 0xcf59, 0xcf59, 0xcf59, + 0xcf59, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, + 0x0dd5, 0x0013, 0x006e, 0x0005, 0xcf74, 0xdd93, 0xcf74, 0xcf74, + 0xcf74, 0xcf74, 0xcf74, 0xcf74, 0xdd40, 0xdde7, 0xcf74, 0xe405, + 0xe43b, 0xe405, 0xe43b, 0xcf74, 0x080c, 0x0dd5, 0x6000, 0x9082, + 0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x000a, 0x0005, 0xcf8e, 0xda08, + 0xdaf8, 0xdb1a, 0xdbd9, 0xcf8e, 0xdcb7, 0xdc61, 0xd837, 0xdd16, + 0xdd2b, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8e, 0x080c, 0x0dd5, + 0x91b2, 0x0053, 0x1a0c, 0x0dd5, 0x2100, 0x91b2, 0x0040, 0x1a04, + 0xd3c6, 0x0002, 0xcfda, 0xd1b7, 0xcfda, 0xcfda, 0xcfda, 0xd1c0, + 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, + 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, + 0xcfda, 0xcfdc, 0xd032, 0xd041, 0xd0a5, 0xd0d0, 0xd149, 0xd1a2, + 0xcfda, 0xcfda, 0xd1c3, 0xcfda, 0xcfda, 0xd1d8, 0xd1e5, 0xcfda, + 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xd268, 0xcfda, 0xcfda, 0xd27c, + 0xcfda, 0xcfda, 0xd237, 0xcfda, 0xcfda, 0xcfda, 0xd294, 0xcfda, + 0xcfda, 0xcfda, 0xd311, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, + 0xcfda, 0xd38e, 0x080c, 0x0dd5, 0x080c, 0x66f5, 0x1150, 0x2001, + 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, + 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, + 0xd1b0, 0x080c, 0x669a, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, + 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x901a, + 0x0076, 0x903e, 0x080c, 0x8ef7, 0x2c08, 0x080c, 0xdfbd, 0x007e, + 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, + 0x080c, 0x63dc, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, + 0x080c, 0xdeef, 0x1904, 0xd09d, 0x080c, 0xde8b, 0x1120, 0x6007, + 0x0008, 0x0804, 0xd1b0, 0x6007, 0x0009, 0x0804, 0xd1b0, 0x080c, + 0xe113, 0x0128, 0x080c, 0xdeef, 0x0d78, 0x0804, 0xd09d, 0x6017, + 0x1900, 0x0c88, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x6106, 0x080c, + 0xde42, 0x6007, 0x0006, 0x0804, 0xd1b0, 0x6007, 0x0007, 0x0804, + 0xd1b0, 0x080c, 0xe477, 0x1904, 0xd3c3, 0x080c, 0x318e, 0x1904, + 0xd3c3, 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, + 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x6309, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, + 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, + 0x9686, 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, + 0x7034, 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, + 0x7030, 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, + 0x0007, 0x00b0, 0x00ee, 0x080c, 0xdf53, 0x1190, 0x9686, 0x0006, + 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x30b3, + 0x002e, 0x080c, 0x6468, 0x6007, 0x000a, 0x00de, 0x0804, 0xd1b0, + 0x6007, 0x000b, 0x00de, 0x0804, 0xd1b0, 0x080c, 0x306e, 0x080c, + 0xcf2d, 0x6007, 0x0001, 0x0804, 0xd1b0, 0x080c, 0xe477, 0x1904, + 0xd3c3, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x2071, 0x0260, 0x7034, + 0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, + 0x0003, 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, + 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x30b3, 0x002e, + 0x6007, 0x000c, 0x2001, 0x0001, 0x080c, 0xe644, 0x0804, 0xd1b0, + 0x080c, 0x66f5, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, + 0x9086, 0x0008, 0x1110, 0x0804, 0xcfe9, 0x080c, 0x669a, 0x6610, + 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, + 0x0026, 0x2001, 0x0006, 0x080c, 0x6349, 0x002e, 0x0050, 0x96b4, + 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, + 0xd09d, 0x080c, 0xdf60, 0x1120, 0x6007, 0x000e, 0x0804, 0xd1b0, + 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x306e, 0x080c, + 0xcf2d, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, + 0x0148, 0x2009, 0x0029, 0x080c, 0xe280, 0x6010, 0x2058, 0xb800, + 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xd1b0, + 0x2001, 0x0001, 0x080c, 0x6309, 0x0156, 0x0016, 0x0026, 0x0036, + 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xbb13, + 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, + 0x8637, 0x9682, 0x0004, 0x0a04, 0xd09d, 0x9682, 0x0007, 0x0a04, + 0xd0f9, 0x0804, 0xd09d, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, + 0xd1b0, 0x080c, 0x66f5, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xcfe9, 0x080c, 0x669a, + 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0690, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, + 0x1904, 0xd09d, 0x080c, 0xdf8e, 0x1130, 0x080c, 0xde8b, 0x1118, + 0x6007, 0x0010, 0x04e8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, + 0x080c, 0x306e, 0x080c, 0xcf2d, 0x004e, 0x0016, 0x9006, 0x2009, + 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe280, + 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, + 0x0001, 0x00f0, 0x080c, 0xe113, 0x0140, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0006, 0x0978, 0x0804, 0xd09d, 0x6017, 0x1900, 0x6007, + 0x0009, 0x0070, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xe477, + 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, 0x6007, 0x0012, + 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0cb0, + 0x6007, 0x0005, 0x0c68, 0x080c, 0xe477, 0x1904, 0xd3c3, 0x080c, + 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, 0x6007, + 0x0020, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, + 0x080c, 0x318e, 0x1904, 0xd3c3, 0x6007, 0x0023, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0xe477, 0x1904, + 0xd3c3, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, + 0xd09d, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, + 0xffff, 0x0180, 0x2c08, 0x080c, 0xc813, 0x01b0, 0x2260, 0x7240, + 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, + 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xe24a, 0x1180, + 0x7244, 0x9286, 0xffff, 0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, + 0x1700, 0x7214, 0x9296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, + 0x6020, 0x9086, 0x0007, 0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, + 0x080c, 0xab6b, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, + 0x8ec7, 0x080c, 0x941c, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, + 0x0001, 0x080c, 0x6309, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, + 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xbb13, 0x003e, + 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xd1b0, + 0x080c, 0xb787, 0x080c, 0x717d, 0x1190, 0x0006, 0x0026, 0x0036, + 0x080c, 0x7197, 0x1138, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, + 0x70af, 0x0010, 0x080c, 0x7155, 0x003e, 0x002e, 0x000e, 0x0005, + 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, + 0x6106, 0x080c, 0xd5aa, 0x1120, 0x6007, 0x002b, 0x0804, 0xd1b0, + 0x6007, 0x002c, 0x0804, 0xd1b0, 0x080c, 0xe477, 0x1904, 0xd3c3, + 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, + 0x6106, 0x080c, 0xd5af, 0x1120, 0x6007, 0x002e, 0x0804, 0xd1b0, + 0x6007, 0x002f, 0x0804, 0xd1b0, 0x080c, 0x318e, 0x1904, 0xd3c3, + 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, + 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, + 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xd1b7, 0x080c, 0x54bb, + 0xd0e4, 0x0904, 0xd30e, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, + 0x603e, 0x7108, 0x720c, 0x080c, 0x6733, 0x0140, 0x6010, 0x2058, + 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x672f, + 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, + 0x1578, 0x7210, 0x080c, 0xc813, 0x0590, 0x080c, 0xd47b, 0x0578, + 0x080c, 0xe2f7, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, + 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ce, 0x00de, 0x00ee, 0x0005, + 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xc813, 0x01c0, 0x9280, + 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, + 0x9085, 0x0001, 0x080c, 0xe24a, 0x2c10, 0x2160, 0x0140, 0x0890, + 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, + 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, + 0x0868, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x6010, 0x2058, 0xb804, + 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xd1b7, 0x00e6, + 0x00d6, 0x00c6, 0x080c, 0x54bb, 0xd0e4, 0x0904, 0xd386, 0x2069, + 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, + 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, + 0xe24a, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xc813, 0x05d0, 0x7108, + 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, + 0x080c, 0xc465, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, + 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, + 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xd47b, + 0x0904, 0xd307, 0x0056, 0x7510, 0x7614, 0x080c, 0xe310, 0x005e, + 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, + 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, + 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, + 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0c10, 0x6007, 0x003b, + 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xd2de, 0x00e6, 0x0026, + 0x080c, 0x66f5, 0x0550, 0x080c, 0x669a, 0x080c, 0xe4e9, 0x1518, + 0x2071, 0x1800, 0x70dc, 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, + 0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, + 0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, + 0x6733, 0x0120, 0x2011, 0x19fe, 0x2013, 0x07d0, 0xd0ac, 0x1128, + 0x080c, 0x2e48, 0x0010, 0x080c, 0xe51b, 0x002e, 0x00ee, 0x080c, + 0xab6b, 0x0804, 0xd1b6, 0x080c, 0xab6b, 0x0005, 0x2600, 0x0002, + 0xd3da, 0xd40b, 0xd41c, 0xd3da, 0xd3da, 0xd3dc, 0xd42d, 0xd3da, + 0xd3da, 0xd3da, 0xd3f9, 0xd3da, 0xd3da, 0xd3da, 0xd438, 0xd445, + 0xd476, 0xd3da, 0x080c, 0x0dd5, 0x080c, 0xe477, 0x1d20, 0x080c, + 0x318e, 0x1d08, 0x080c, 0xd58e, 0x1148, 0x7038, 0x6016, 0x6007, + 0x0045, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x0005, 0x080c, 0x306e, + 0x080c, 0xcf2d, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8ec7, + 0x0005, 0x080c, 0xe477, 0x1938, 0x080c, 0x318e, 0x1920, 0x080c, + 0xd58e, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x0005, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x2009, + 0x0041, 0x080c, 0xe524, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, + 0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0x318e, 0x1904, 0xd3c3, + 0x2009, 0x0042, 0x080c, 0xe524, 0x6007, 0x0047, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0x318e, 0x1904, + 0xd3c3, 0x2009, 0x0046, 0x080c, 0xe524, 0x080c, 0xab6b, 0x0005, + 0x080c, 0xd496, 0x0904, 0xd3c3, 0x6007, 0x004e, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007, 0x004f, 0x6017, + 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, + 0x1160, 0x7140, 0x2001, 0x19bb, 0x2004, 0x9106, 0x11b0, 0x7144, + 0x2001, 0x19bc, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, + 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, + 0x000a, 0x080c, 0xbb27, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, + 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007, 0x0050, + 0x703c, 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, + 0x2260, 0x6010, 0x2058, 0xb8cc, 0xd084, 0x0150, 0x7128, 0x6048, + 0x9106, 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, + 0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, + 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, + 0x1800, 0x7090, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, + 0x199e, 0x2003, 0x0000, 0x080c, 0x1019, 0x05a0, 0x2900, 0x6016, + 0x7090, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, + 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x199e, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, + 0x1019, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, + 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x199e, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, + 0x0001, 0x0048, 0x2071, 0x1800, 0x7093, 0x0000, 0x6014, 0x2048, + 0x080c, 0x0fb2, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, + 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, + 0x918c, 0xffff, 0x11a8, 0x080c, 0x225d, 0x2099, 0x026c, 0x2001, + 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, + 0x4003, 0x22a8, 0x8108, 0x080c, 0x225d, 0x2099, 0x0260, 0x0ca8, + 0x080c, 0x225d, 0x2061, 0x199e, 0x6004, 0x2098, 0x6008, 0x3518, + 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, + 0x8108, 0x080c, 0x225d, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x199e, + 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, + 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, + 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2275, + 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, + 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, + 0x080c, 0x2275, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2275, 0x2061, + 0x19a1, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, + 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, + 0x080c, 0x2275, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x19a1, 0x2019, + 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, - 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, - 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x20ca, 0x20a1, - 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, - 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, - 0x20ca, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x20ca, 0x2061, 0x1972, - 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, - 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, - 0x20ca, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1972, 0x2019, 0x0260, - 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, - 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, - 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, - 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, - 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, - 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, - 0x0005, 0x00d6, 0x080c, 0xc3cd, 0x00de, 0x0005, 0x00d6, 0x080c, - 0xc3da, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, - 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, - 0xd2fb, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, - 0x00ff, 0x6824, 0x080c, 0x24d6, 0x1148, 0x2001, 0x0001, 0x080c, - 0xd2fb, 0x2110, 0x900e, 0x080c, 0x2e75, 0x0018, 0x9085, 0x0001, - 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0x9a23, - 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, - 0x220c, 0x080c, 0x24d6, 0x1578, 0x080c, 0x5f1e, 0x1560, 0xbe12, - 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xd1df, - 0x11d8, 0x080c, 0x2f50, 0x11c0, 0x080c, 0xc335, 0x0510, 0x2001, - 0x0007, 0x080c, 0x5ecf, 0x2001, 0x0007, 0x080c, 0x5efb, 0x6017, - 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, - 0x8048, 0x080c, 0x8582, 0x0010, 0x080c, 0x99d6, 0x9085, 0x0001, - 0x00ce, 0x00be, 0x0005, 0x080c, 0x99d6, 0x00ce, 0x002e, 0x001e, - 0x0ca8, 0x080c, 0x99d6, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, - 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, - 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, - 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, - 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, - 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, - 0x90b2, 0x0053, 0x1a0c, 0x0db2, 0x91b6, 0x0013, 0x1130, 0x2008, - 0x91b2, 0x0040, 0x1a04, 0xc522, 0x0092, 0x91b6, 0x0027, 0x0120, - 0x91b6, 0x0014, 0x190c, 0x0db2, 0x2001, 0x0007, 0x080c, 0x5efb, - 0x080c, 0x847d, 0x080c, 0x9a06, 0x080c, 0x8582, 0x0005, 0xc457, - 0xc459, 0xc457, 0xc457, 0xc457, 0xc459, 0xc468, 0xc51b, 0xc4ba, - 0xc51b, 0xc4cc, 0xc51b, 0xc468, 0xc51b, 0xc513, 0xc51b, 0xc513, - 0xc51b, 0xc51b, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, - 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc459, 0xc457, 0xc51b, - 0xc457, 0xc457, 0xc51b, 0xc457, 0xc518, 0xc51b, 0xc457, 0xc457, - 0xc457, 0xc457, 0xc51b, 0xc51b, 0xc457, 0xc51b, 0xc51b, 0xc457, - 0xc463, 0xc457, 0xc457, 0xc457, 0xc457, 0xc517, 0xc51b, 0xc457, - 0xc457, 0xc51b, 0xc51b, 0xc457, 0xc457, 0xc457, 0xc457, 0x080c, - 0x0db2, 0x080c, 0x847d, 0x080c, 0xbd04, 0x6003, 0x0002, 0x080c, - 0x8582, 0x0804, 0xc521, 0x9006, 0x080c, 0x5ebb, 0x0804, 0xc51b, - 0x080c, 0x629c, 0x1904, 0xc51b, 0x9006, 0x080c, 0x5ebb, 0x6010, - 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, - 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb8b0, - 0x9005, 0x1178, 0x080c, 0xbcec, 0x1904, 0xc51b, 0x0036, 0x0046, - 0xbba0, 0x2021, 0x0007, 0x080c, 0x4829, 0x004e, 0x003e, 0x0804, - 0xc51b, 0x080c, 0x2f81, 0x1904, 0xc51b, 0x2001, 0x1800, 0x2004, - 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a0, 0x8000, - 0x78a2, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5ecf, 0x080c, 0x847d, - 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8048, - 0x080c, 0x8582, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x7c58, - 0x0804, 0xc521, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, - 0x9686, 0x0006, 0x0904, 0xc51b, 0x9686, 0x0004, 0x0904, 0xc51b, - 0x2001, 0x0004, 0x0804, 0xc519, 0x2001, 0x1800, 0x2004, 0x9086, - 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, - 0x0006, 0x080c, 0x4829, 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, - 0xc53f, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, - 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c, 0x5efb, - 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006, 0x080c, - 0x5ecf, 0x080c, 0x629c, 0x11f8, 0x2001, 0x1835, 0x2004, 0xd0a4, - 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, - 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0804, 0xc4a2, - 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, - 0x0010, 0x080c, 0x5efb, 0x080c, 0x847d, 0x080c, 0x99d6, 0x080c, - 0x8582, 0x0005, 0x2600, 0x0002, 0xc536, 0xc536, 0xc536, 0xc536, - 0xc536, 0xc538, 0xc536, 0xc536, 0xc536, 0xc536, 0xc538, 0xc536, - 0xc536, 0xc536, 0xc538, 0xc538, 0xc538, 0xc538, 0x080c, 0x0db2, - 0x080c, 0x847d, 0x080c, 0x99d6, 0x080c, 0x8582, 0x0005, 0x0016, - 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, - 0x5ecf, 0x9006, 0x080c, 0x5ebb, 0x080c, 0x2e55, 0x00de, 0x00be, - 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, - 0x90b2, 0x000c, 0x1a0c, 0x0db2, 0x91b6, 0x0015, 0x1110, 0x003b, - 0x0028, 0x91b6, 0x0016, 0x190c, 0x0db2, 0x006b, 0x0005, 0xa445, - 0xa445, 0xa445, 0xa445, 0xa445, 0xa445, 0xc5ba, 0xc57f, 0xa445, - 0xa445, 0xa445, 0xa445, 0xa445, 0xa445, 0xa445, 0xa445, 0xa445, - 0xa445, 0xc5ba, 0xc5c1, 0xa445, 0xa445, 0xa445, 0xa445, 0x00f6, - 0x080c, 0x629c, 0x11d8, 0x080c, 0xbcec, 0x11c0, 0x6010, 0x905d, - 0x01a8, 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5ebb, 0x2001, - 0x0002, 0x080c, 0x5ecf, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x8048, 0x080c, 0x8582, 0x00d0, 0x2011, 0x0263, - 0x2204, 0x8211, 0x220c, 0x080c, 0x24d6, 0x1190, 0x080c, 0x5f7e, - 0x0118, 0x080c, 0x99d6, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006, - 0x080c, 0x5a3b, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x99d6, - 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x99d6, - 0x0005, 0x080c, 0xa7a1, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, - 0x080c, 0x8048, 0x080c, 0x8582, 0x0010, 0x080c, 0x99d6, 0x0005, - 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db2, 0x080c, 0x847d, 0x080c, - 0x9a06, 0x080c, 0x8582, 0x0005, 0x9182, 0x0040, 0x0002, 0xc5f2, - 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f4, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, - 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, - 0xc5f2, 0xc5f2, 0x080c, 0x0db2, 0x0096, 0x00b6, 0x00d6, 0x00e6, - 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, - 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc65a, - 0x080c, 0xd2ef, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, - 0x2011, 0x0200, 0x080c, 0x7e3e, 0x0020, 0x9026, 0x080c, 0xd224, - 0x0c38, 0x080c, 0x0fd5, 0x090c, 0x0db2, 0x6003, 0x0007, 0xa867, - 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, - 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, - 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x6536, - 0x001e, 0x080c, 0xd2ef, 0x1904, 0xc6ba, 0x9486, 0x2000, 0x1130, - 0x2019, 0x0017, 0x080c, 0xcf62, 0x0804, 0xc6ba, 0x9486, 0x0200, - 0x1120, 0x080c, 0xcefe, 0x0804, 0xc6ba, 0x9486, 0x0400, 0x0120, - 0x9486, 0x1000, 0x1904, 0xc6ba, 0x2019, 0x0002, 0x080c, 0xcf19, - 0x0804, 0xc6ba, 0x2069, 0x1a3e, 0x6a00, 0xd284, 0x0904, 0xc724, - 0x9284, 0x0300, 0x1904, 0xc71d, 0x6804, 0x9005, 0x0904, 0xc705, - 0x2d78, 0x6003, 0x0007, 0x080c, 0x0fee, 0x0904, 0xc6c6, 0x7800, - 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, - 0x180e, 0x2004, 0xd084, 0x1904, 0xc728, 0x9006, 0xa802, 0xa867, - 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, - 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, - 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, - 0x0003, 0x9080, 0xc6c2, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, - 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, - 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, - 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, - 0x080c, 0x6536, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, - 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x180f, - 0x2004, 0xd084, 0x0120, 0x080c, 0x0fd5, 0x1904, 0xc66f, 0x6017, - 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x8000, 0x080c, - 0x8582, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, - 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, - 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, - 0x080c, 0x8000, 0x080c, 0x8582, 0x0828, 0x6868, 0x602e, 0x686c, - 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, - 0x8000, 0x080c, 0x8582, 0x0804, 0xc6ba, 0x2001, 0x180d, 0x2004, - 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4672, 0x6017, 0xf300, - 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, - 0x8000, 0x080c, 0x8582, 0x0804, 0xc6ba, 0x6017, 0xf500, 0x0c98, - 0x6017, 0xf600, 0x0804, 0xc6da, 0x6017, 0xf200, 0x0804, 0xc6da, - 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, - 0x7044, 0x9084, 0x0003, 0x9080, 0xc6c2, 0x2005, 0xa87e, 0x2928, - 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, - 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, - 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, - 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0db2, - 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0029, 0x20a0, 0x2011, 0xc7a4, 0x2041, 0x0001, 0x223d, - 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, - 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, - 0x2098, 0x0c68, 0x2950, 0x080c, 0x0fee, 0x0170, 0x2900, 0xb002, - 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, - 0x080c, 0x1007, 0x0cc8, 0x080c, 0x1007, 0x0804, 0xc6c6, 0x2548, - 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, - 0x080c, 0xcf91, 0x0804, 0xc6ba, 0x8010, 0x0004, 0x801a, 0x0006, - 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, - 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0db2, 0x9082, 0x0040, 0x0a0c, - 0x0db2, 0x2008, 0x0804, 0xc855, 0x9186, 0x0051, 0x0108, 0x00c0, - 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc806, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7eec, 0x002e, 0x001e, - 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xc89d, - 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, - 0x0500, 0x190c, 0x0db2, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, - 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, - 0x0016, 0x0026, 0x080c, 0x7eec, 0x002e, 0x001e, 0x000e, 0x00ce, - 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0db2, 0x0804, - 0xc97e, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x9a6b, - 0x0005, 0xc81c, 0xc81e, 0xc81e, 0xc845, 0xc81c, 0xc81c, 0xc81c, - 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0xc81c, - 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0x080c, 0x0db2, 0x080c, 0x847d, - 0x080c, 0x8582, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, - 0xb5fb, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, - 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xcf91, 0x6017, - 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1956, 0x2004, 0x601a, - 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x847d, - 0x080c, 0x8582, 0x080c, 0xb5fb, 0x0120, 0x6014, 0x2048, 0x080c, - 0x1007, 0x080c, 0x9a06, 0x009e, 0x0005, 0x0002, 0xc869, 0xc880, - 0xc86b, 0xc897, 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, - 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, 0xc869, - 0xc869, 0x080c, 0x0db2, 0x0096, 0x080c, 0x847d, 0x6014, 0x2048, - 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, - 0x9a50, 0x0010, 0x6003, 0x0004, 0x080c, 0x8582, 0x009e, 0x0005, - 0x080c, 0x847d, 0x080c, 0xb5fb, 0x0138, 0x6114, 0x0096, 0x2148, - 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x7e13, 0x080c, 0x99d6, - 0x080c, 0x8582, 0x0005, 0x080c, 0xd1e8, 0x0db0, 0x0cc8, 0x080c, - 0x847d, 0x2009, 0x0041, 0x0804, 0xca06, 0x9182, 0x0040, 0x0002, - 0xc8b3, 0xc8b5, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, - 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, 0xc8b3, - 0xc8b3, 0xc8b6, 0xc8b3, 0x080c, 0x0db2, 0x0005, 0x00d6, 0x080c, - 0x7e13, 0x00de, 0x080c, 0xd240, 0x080c, 0x99d6, 0x0005, 0x9182, - 0x0040, 0x0002, 0xc8d5, 0xc8d5, 0xc8d5, 0xc8d5, 0xc8d5, 0xc8d5, - 0xc8d5, 0xc8d5, 0xc8d5, 0xc8d7, 0xc946, 0xc8d5, 0xc8d5, 0xc8d5, - 0xc8d5, 0xc946, 0xc8d5, 0xc8d5, 0xc8d5, 0x080c, 0x0db2, 0x2001, - 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, - 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xc946, 0x2009, 0x180c, - 0x2104, 0xd0d4, 0x0904, 0xc946, 0xc0d4, 0x200a, 0x2009, 0x0105, - 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1873, - 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x8532, 0x6014, - 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, - 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, - 0x865d, 0x2009, 0x0041, 0x009e, 0x0804, 0xca06, 0x080c, 0x865d, - 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x7e13, 0x009e, 0x0005, - 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, - 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, - 0xd1cc, 0x0110, 0x080c, 0x28ea, 0x080c, 0x865d, 0x6014, 0x2048, - 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x7e13, 0x080c, 0x99d6, 0x009e, - 0x0005, 0x080c, 0xd1e8, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, - 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x8532, 0x080c, 0x865d, - 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, - 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, - 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xcf91, 0x6018, - 0x9005, 0x1128, 0x2001, 0x1956, 0x2004, 0x8003, 0x601a, 0x6017, - 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, - 0x0002, 0xc995, 0xc995, 0xc995, 0xc995, 0xc995, 0xc995, 0xc995, - 0xc995, 0xc997, 0xc995, 0xc995, 0xc995, 0xc995, 0xc995, 0xc995, - 0xc995, 0xc995, 0xc995, 0xc995, 0xc9e2, 0x080c, 0x0db2, 0x6014, - 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, - 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, - 0x2009, 0x0041, 0x009e, 0x0804, 0xca06, 0x6003, 0x0007, 0x601b, - 0x0000, 0x080c, 0x7e13, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, - 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, - 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, - 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, - 0x180d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, - 0x0006, 0x00e9, 0x080c, 0x7e15, 0x009e, 0x0005, 0x6003, 0x0002, - 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x14c9, 0x1904, - 0xc997, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, - 0x9105, 0x1120, 0x080c, 0x14c9, 0x1904, 0xc997, 0x0005, 0xd2fc, - 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, - 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, - 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, - 0x0db2, 0x6024, 0xd0dc, 0x090c, 0x0db2, 0x0005, 0xca29, 0xca35, - 0xca41, 0xca4d, 0xca29, 0xca29, 0xca29, 0xca29, 0xca30, 0xca2b, - 0xca2b, 0xca29, 0xca29, 0xca29, 0xca29, 0xca2b, 0xca29, 0xca2b, - 0xca29, 0x080c, 0x0db2, 0x6024, 0xd0dc, 0x090c, 0x0db2, 0x0005, - 0x6014, 0x9005, 0x190c, 0x0db2, 0x0005, 0x6003, 0x0001, 0x6106, - 0x080c, 0x8000, 0x0126, 0x2091, 0x8000, 0x080c, 0x8582, 0x012e, - 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x8000, 0x0126, 0x2091, - 0x8000, 0x080c, 0x8582, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, - 0x2c10, 0x080c, 0x1976, 0x0126, 0x2091, 0x8000, 0x080c, 0x8065, - 0x080c, 0x865d, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, - 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, - 0xca78, 0xca7a, 0xca8c, 0xcaa6, 0xca78, 0xca78, 0xca78, 0xca78, - 0xca78, 0xca78, 0xca78, 0xca78, 0xca78, 0xca78, 0xca78, 0xca78, - 0x080c, 0x0db2, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c, - 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, - 0x8000, 0x080c, 0x8582, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, - 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, - 0x6106, 0x080c, 0x8000, 0x080c, 0x8582, 0x00e0, 0x901e, 0x6316, - 0x631a, 0x2019, 0x0004, 0x080c, 0xcf91, 0x00a0, 0x6014, 0x2048, - 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, - 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1976, 0x080c, 0x8065, - 0x080c, 0x865d, 0x0005, 0x080c, 0x847d, 0x6114, 0x81ff, 0x0158, - 0x0096, 0x2148, 0x080c, 0xd28c, 0x0036, 0x2019, 0x0029, 0x080c, - 0xcf91, 0x003e, 0x009e, 0x080c, 0x9a06, 0x080c, 0x8582, 0x0005, - 0x080c, 0x8532, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, - 0xd28c, 0x0036, 0x2019, 0x0029, 0x080c, 0xcf91, 0x003e, 0x009e, - 0x080c, 0x9a06, 0x080c, 0x865d, 0x0005, 0x9182, 0x0085, 0x0002, - 0xcaf7, 0xcaf5, 0xcaf5, 0xcb03, 0xcaf5, 0xcaf5, 0xcaf5, 0xcaf5, - 0xcaf5, 0xcaf5, 0xcaf5, 0xcaf5, 0xcaf5, 0x080c, 0x0db2, 0x6003, - 0x000b, 0x6106, 0x080c, 0x8000, 0x0126, 0x2091, 0x8000, 0x080c, - 0x8582, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd1df, 0x0118, - 0x080c, 0x99d6, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, - 0x180d, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, - 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0x9cf4, 0x7220, 0x080c, - 0xce37, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, - 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, - 0x8000, 0x080c, 0x8582, 0x080c, 0x865d, 0x00ee, 0x002e, 0x0005, - 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db2, - 0x908a, 0x0092, 0x1a0c, 0x0db2, 0x9082, 0x0085, 0x00a2, 0x9186, - 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9a6b, 0x0050, - 0x2001, 0x0007, 0x080c, 0x5efb, 0x080c, 0x847d, 0x080c, 0x9a06, - 0x080c, 0x8582, 0x0005, 0xcb68, 0xcb6a, 0xcb6a, 0xcb68, 0xcb68, - 0xcb68, 0xcb68, 0xcb68, 0xcb68, 0xcb68, 0xcb68, 0xcb68, 0xcb68, - 0x080c, 0x0db2, 0x080c, 0x847d, 0x080c, 0x9a06, 0x080c, 0x8582, - 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0db2, 0x9182, 0x0092, 0x1a0c, - 0x0db2, 0x9182, 0x0085, 0x0002, 0xcb89, 0xcb89, 0xcb89, 0xcb8b, - 0xcb89, 0xcb89, 0xcb89, 0xcb89, 0xcb89, 0xcb89, 0xcb89, 0xcb89, - 0xcb89, 0x080c, 0x0db2, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, - 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9a6b, 0x0030, - 0x080c, 0x847d, 0x080c, 0x9a06, 0x080c, 0x8582, 0x0005, 0x0036, - 0x080c, 0xd240, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, - 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, - 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x9349, 0x009e, - 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x93f4, 0x007e, 0x1520, - 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, - 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd240, 0x080c, 0xbd04, - 0x080c, 0x1827, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb5fb, - 0x0110, 0x080c, 0xcf91, 0x009e, 0x6017, 0x0000, 0x080c, 0xd240, - 0x6023, 0x0007, 0x080c, 0xbd04, 0x003e, 0x012e, 0x0005, 0x00f6, - 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, - 0x080c, 0x24d6, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5f7e, 0x1580, - 0x001e, 0x00c6, 0x2160, 0x080c, 0xbd01, 0x00ce, 0x002e, 0x0026, - 0x0016, 0x2019, 0x0029, 0x080c, 0x94b5, 0x080c, 0x8180, 0x0076, - 0x903e, 0x080c, 0x8078, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, - 0xcd62, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, - 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x2eea, - 0x002e, 0x001e, 0x080c, 0x5a3b, 0xbe12, 0xbd16, 0x9006, 0x0010, - 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, - 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1822, 0x2104, 0x9086, - 0x0074, 0x1904, 0xcc89, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, - 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xcc86, 0x2001, 0x194d, - 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x0118, - 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, - 0xd2f4, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, - 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, - 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, - 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, - 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, - 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, - 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, - 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, - 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, - 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, - 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x5f8d, 0x0804, - 0xccf1, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, - 0x000a, 0x080c, 0xa91d, 0x009e, 0x15a8, 0x2011, 0x027a, 0x20a9, - 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa91d, 0x009e, - 0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1854, - 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xcfe6, 0xb800, - 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x8180, 0x0076, 0x2039, - 0x0000, 0x080c, 0x8078, 0x2c08, 0x080c, 0xcd62, 0x007e, 0x2001, - 0x0007, 0x080c, 0x5efb, 0x2001, 0x0007, 0x080c, 0x5ecf, 0x001e, - 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, 0x0005, - 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, 0x6017, - 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, 0x0016, - 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, 0x080c, - 0x24d6, 0x11d0, 0x080c, 0x5f7e, 0x11b8, 0x2011, 0x0270, 0x20a9, - 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xa91d, 0x009e, - 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, - 0x0006, 0x080c, 0xa91d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, - 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, - 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x24d6, - 0x11d0, 0x080c, 0x5f7e, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, - 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xa91d, 0x009e, 0x1158, + 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, + 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, + 0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, + 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, + 0x00be, 0x0005, 0x00d6, 0x080c, 0xd626, 0x00de, 0x0005, 0x00d6, + 0x080c, 0xd633, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, + 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, + 0x080c, 0xe644, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, + 0x918c, 0x00ff, 0x6824, 0x080c, 0x26f0, 0x1148, 0x2001, 0x0001, + 0x080c, 0xe644, 0x2110, 0x900e, 0x080c, 0x30b3, 0x0018, 0x9085, + 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, + 0xabb9, 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, + 0x8211, 0x220c, 0x080c, 0x26f0, 0x1578, 0x080c, 0x636c, 0x1560, + 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, + 0xe477, 0x11d8, 0x080c, 0x318e, 0x11c0, 0x080c, 0xd58e, 0x0510, + 0x2001, 0x0007, 0x080c, 0x631d, 0x2001, 0x0007, 0x080c, 0x6349, + 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0010, 0x080c, 0xab6b, 0x9085, + 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0xab6b, 0x00ce, 0x002e, + 0x001e, 0x0ca8, 0x080c, 0xab6b, 0x9006, 0x0c98, 0x2069, 0x026d, + 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, + 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, + 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, + 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, + 0x910d, 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, + 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x1130, + 0x2008, 0x91b2, 0x0040, 0x1a04, 0xd77d, 0x0092, 0x91b6, 0x0027, + 0x0120, 0x91b6, 0x0014, 0x190c, 0x0dd5, 0x2001, 0x0007, 0x080c, + 0x6349, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005, + 0xd6b0, 0xd6b2, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b2, 0xd6c1, 0xd776, + 0xd713, 0xd776, 0xd727, 0xd776, 0xd6c1, 0xd776, 0xd76e, 0xd776, + 0xd76e, 0xd776, 0xd776, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, + 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b2, 0xd6b0, + 0xd776, 0xd6b0, 0xd6b0, 0xd776, 0xd6b0, 0xd773, 0xd776, 0xd6b0, + 0xd6b0, 0xd6b0, 0xd6b0, 0xd776, 0xd776, 0xd6b0, 0xd776, 0xd776, + 0xd6b0, 0xd6bc, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd772, 0xd776, + 0xd6b0, 0xd6b0, 0xd776, 0xd776, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, + 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, 0xcf30, 0x6003, 0x0002, + 0x080c, 0x941c, 0x0804, 0xd77c, 0x9006, 0x080c, 0x6309, 0x0804, + 0xd776, 0x080c, 0x672f, 0x1904, 0xd776, 0x9006, 0x080c, 0x6309, + 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, + 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010, 0x2058, + 0xb8c0, 0x9005, 0x1178, 0x080c, 0xcf18, 0x1904, 0xd776, 0x0036, + 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4ab2, 0x004e, 0x003e, + 0x0804, 0xd776, 0x080c, 0x31bf, 0x1904, 0xd776, 0x2001, 0x1800, + 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8, + 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x631d, 0x080c, + 0x9317, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, + 0x8ec7, 0x080c, 0x941c, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, + 0x8293, 0x0804, 0xd77c, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0006, 0x0904, 0xd776, 0x9686, 0x0004, 0x0904, + 0xd776, 0x080c, 0x8a4a, 0x2001, 0x0004, 0x0804, 0xd774, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, + 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4ab2, 0x004e, 0x003e, + 0x2001, 0x0006, 0x080c, 0xd79a, 0x6610, 0x2658, 0xbe04, 0x0066, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, + 0x0006, 0x080c, 0x6349, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, + 0x2001, 0x0006, 0x080c, 0x631d, 0x080c, 0x672f, 0x11f8, 0x2001, + 0x1837, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, + 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, + 0x00fe, 0x0804, 0xd6fb, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, + 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x6349, 0x080c, 0x9317, + 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x2600, 0x0002, 0xd791, + 0xd791, 0xd791, 0xd791, 0xd791, 0xd793, 0xd791, 0xd793, 0xd791, + 0xd791, 0xd793, 0xd791, 0xd791, 0xd791, 0xd793, 0xd793, 0xd793, + 0xd793, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, 0xab6b, 0x080c, + 0x941c, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, + 0xd184, 0x0138, 0x080c, 0x631d, 0x9006, 0x080c, 0x6309, 0x080c, + 0x3093, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, + 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x91b6, + 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0dd5, + 0x006b, 0x0005, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, + 0xd815, 0xd7da, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, + 0xb606, 0xb606, 0xb606, 0xb606, 0xd815, 0xd81c, 0xb606, 0xb606, + 0xb606, 0xb606, 0x00f6, 0x080c, 0x672f, 0x11d8, 0x080c, 0xcf18, + 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8c0, 0x9005, 0x0190, 0x9006, + 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x6023, 0x0001, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c, + 0x00d0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26f0, + 0x1190, 0x080c, 0x63cd, 0x0118, 0x080c, 0xab6b, 0x0060, 0xb810, + 0x0006, 0xb814, 0x0006, 0x080c, 0x5e12, 0x000e, 0xb816, 0x000e, + 0xb812, 0x080c, 0xab6b, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, + 0x1110, 0x080c, 0xab6b, 0x0005, 0x080c, 0xb98f, 0x1148, 0x6003, + 0x0001, 0x6007, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0010, + 0x080c, 0xab6b, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dd5, + 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005, 0x9182, + 0x0040, 0x0002, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84f, 0xd84d, + 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, + 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0x080c, 0x0dd5, 0x0096, + 0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, + 0xb8bc, 0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, + 0xff00, 0x0904, 0xd8b5, 0x080c, 0xe638, 0x1170, 0x9486, 0x2000, + 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x846c, 0x0020, + 0x9026, 0x080c, 0xe4bc, 0x0c38, 0x080c, 0x1000, 0x090c, 0x0dd5, + 0x6003, 0x0007, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, + 0x2c00, 0xa88e, 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, + 0xa97a, 0x0016, 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, + 0x0036, 0x080c, 0x6a46, 0x001e, 0x080c, 0xe638, 0x1904, 0xd915, + 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xe1f4, 0x0804, + 0xd915, 0x9486, 0x0200, 0x1120, 0x080c, 0xe190, 0x0804, 0xd915, + 0x9486, 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xd915, 0x2019, + 0x0002, 0x080c, 0xe1ab, 0x0804, 0xd915, 0x2069, 0x1a6e, 0x6a00, + 0xd284, 0x0904, 0xd97f, 0x9284, 0x0300, 0x1904, 0xd978, 0x6804, + 0x9005, 0x0904, 0xd960, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1019, + 0x0904, 0xd921, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, + 0x6017, 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd983, + 0x9006, 0xa802, 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, + 0xa87a, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, + 0xa9ba, 0xb92c, 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, + 0x003d, 0x7044, 0x9084, 0x0003, 0x9080, 0xd91d, 0x2005, 0xa87e, + 0x20a9, 0x000a, 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, + 0x0205, 0x200b, 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, + 0x22a0, 0x4003, 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, + 0x8000, 0x200c, 0xa9ae, 0x080c, 0x6a46, 0x002e, 0x004e, 0x00fe, + 0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, + 0x0000, 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x1000, + 0x1904, 0xd8ca, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, + 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0c00, 0x2069, 0x0260, 0x6848, + 0x9084, 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, + 0x0016, 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, + 0x0001, 0x6007, 0x0043, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0828, + 0x6868, 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, + 0x6007, 0x0041, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0804, 0xd915, + 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, + 0x48fb, 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, + 0x6007, 0x0041, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0804, 0xd915, + 0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xd935, 0x6017, + 0xf200, 0x0804, 0xd935, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, + 0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd91d, + 0x2005, 0xa87e, 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, + 0xa88a, 0xb82c, 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, + 0x003d, 0x2009, 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, + 0x0000, 0x2011, 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, + 0x0111, 0x1a0c, 0x0dd5, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xd9ff, + 0x2041, 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, + 0x20a8, 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, + 0x2d0a, 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1019, + 0x0170, 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, + 0xa800, 0x902d, 0x0118, 0x080c, 0x1032, 0x0cc8, 0x080c, 0x1032, + 0x0804, 0xd921, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, + 0x0205, 0x200b, 0x0000, 0x080c, 0xe223, 0x0804, 0xd915, 0x8010, + 0x0004, 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, + 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0dd5, + 0x9082, 0x0040, 0x0a0c, 0x0dd5, 0x2008, 0x0804, 0xdab0, 0x9186, + 0x0051, 0x0108, 0x00c0, 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, + 0xda61, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, + 0x8d64, 0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, + 0x1580, 0x0804, 0xdaf8, 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, + 0x0128, 0x9186, 0x0014, 0x0500, 0x190c, 0x0dd5, 0x2001, 0x0109, + 0x2004, 0xd084, 0x01f0, 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, + 0x2061, 0x0100, 0x0006, 0x0016, 0x0026, 0x080c, 0x8d64, 0x002e, + 0x001e, 0x000e, 0x00ce, 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, + 0x190c, 0x0dd5, 0x0804, 0xdbd9, 0x6004, 0x9082, 0x0040, 0x2008, + 0x001a, 0x080c, 0xac01, 0x0005, 0xda77, 0xda79, 0xda79, 0xdaa0, + 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, + 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0x080c, + 0x0dd5, 0x080c, 0x9317, 0x080c, 0x941c, 0x0036, 0x0096, 0x6014, + 0x904d, 0x01d8, 0x080c, 0xc825, 0x01c0, 0x6003, 0x0002, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, + 0x080c, 0xe223, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, + 0x1985, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, + 0x0096, 0x080c, 0x9317, 0x080c, 0x941c, 0x080c, 0xc825, 0x0120, + 0x6014, 0x2048, 0x080c, 0x1032, 0x080c, 0xab9c, 0x009e, 0x0005, + 0x0002, 0xdac4, 0xdadb, 0xdac6, 0xdaf2, 0xdac4, 0xdac4, 0xdac4, + 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, + 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0x080c, 0x0dd5, 0x0096, 0x080c, + 0x9317, 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, + 0x2009, 0x0043, 0x080c, 0xabe6, 0x0010, 0x6003, 0x0004, 0x080c, + 0x941c, 0x009e, 0x0005, 0x080c, 0x9317, 0x080c, 0xc825, 0x0138, + 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, + 0x8441, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x080c, 0xe480, + 0x0db0, 0x0cc8, 0x080c, 0x9317, 0x2009, 0x0041, 0x0804, 0xdc61, + 0x9182, 0x0040, 0x0002, 0xdb0e, 0xdb10, 0xdb0e, 0xdb0e, 0xdb0e, + 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, + 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb11, 0xdb0e, 0x080c, 0x0dd5, + 0x0005, 0x00d6, 0x080c, 0x8441, 0x00de, 0x080c, 0xe4d8, 0x080c, + 0xab6b, 0x0005, 0x9182, 0x0040, 0x0002, 0xdb30, 0xdb30, 0xdb30, + 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb32, 0xdba1, + 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdba1, 0xdb30, 0xdb30, 0xdb30, + 0x080c, 0x0dd5, 0x2001, 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, + 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, + 0xdba1, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x0904, 0xdba1, 0xc0d4, + 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, + 0x200a, 0x2001, 0x1867, 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, + 0x080c, 0x93cc, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, + 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, + 0xd0d4, 0x11e0, 0x080c, 0x9548, 0x2009, 0x0041, 0x009e, 0x0804, + 0xdc61, 0x080c, 0x9548, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, + 0x8441, 0x009e, 0x0005, 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, + 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, + 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c, 0x2b04, 0x080c, + 0x9548, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x8441, + 0x080c, 0xab6b, 0x009e, 0x0005, 0x080c, 0xe480, 0x0db8, 0x009e, + 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, + 0x93cc, 0x080c, 0x9548, 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, + 0x9086, 0x0002, 0x0140, 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, + 0x632c, 0x931b, 0x632e, 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, + 0x080c, 0xe223, 0x6018, 0x9005, 0x1128, 0x2001, 0x1985, 0x2004, + 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, + 0x0005, 0x9182, 0x0040, 0x0002, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, + 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf2, 0xdbf0, 0xdbf0, 0xdbf0, + 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdc3d, + 0x080c, 0x0dd5, 0x6014, 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, + 0x00b6, 0x2058, 0xb900, 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, + 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, 0x0804, 0xdc61, + 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8441, 0x009e, 0x0005, + 0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, + 0x2200, 0x910b, 0x6030, 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, + 0x004e, 0x000e, 0x08d8, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, + 0xd1bc, 0x1178, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, + 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c, 0x8443, 0x009e, + 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, + 0x080c, 0x15c8, 0x1904, 0xdbf2, 0x0005, 0x6014, 0x0096, 0x2048, + 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c, 0x15c8, 0x1904, + 0xdbf2, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, + 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, + 0x0005, 0x9182, 0x0040, 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, + 0x9186, 0x0014, 0x190c, 0x0dd5, 0x6024, 0xd0dc, 0x090c, 0x0dd5, + 0x0005, 0xdc84, 0xdc90, 0xdc9c, 0xdca8, 0xdc84, 0xdc84, 0xdc84, + 0xdc84, 0xdc8b, 0xdc86, 0xdc86, 0xdc84, 0xdc84, 0xdc84, 0xdc84, + 0xdc86, 0xdc84, 0xdc86, 0xdc84, 0x080c, 0x0dd5, 0x6024, 0xd0dc, + 0x090c, 0x0dd5, 0x0005, 0x6014, 0x9005, 0x190c, 0x0dd5, 0x0005, + 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126, 0x2091, 0x8000, + 0x080c, 0x941c, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, + 0x8e7f, 0x0126, 0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, + 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1b03, 0x0126, 0x2091, + 0x8000, 0x080c, 0x8ee4, 0x080c, 0x9548, 0x012e, 0x0005, 0x0126, + 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, + 0x003e, 0x012e, 0x0005, 0xdcd3, 0xdcd5, 0xdce7, 0xdd01, 0xdcd3, + 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, + 0xdcd3, 0xdcd3, 0xdcd3, 0x080c, 0x0dd5, 0x6014, 0x2048, 0xa87c, + 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, + 0x0001, 0x6106, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0470, 0x6014, + 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, + 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x080c, 0x941c, + 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe223, + 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, + 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, + 0x1b03, 0x080c, 0x8ee4, 0x080c, 0x9548, 0x0005, 0x080c, 0x9317, + 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xe5d5, 0x0036, + 0x2019, 0x0029, 0x080c, 0xe223, 0x003e, 0x009e, 0x080c, 0xab9c, + 0x080c, 0x941c, 0x0005, 0x080c, 0x93cc, 0x6114, 0x81ff, 0x0158, + 0x0096, 0x2148, 0x080c, 0xe5d5, 0x0036, 0x2019, 0x0029, 0x080c, + 0xe223, 0x003e, 0x009e, 0x080c, 0xab9c, 0x080c, 0x9548, 0x0005, + 0x9182, 0x0085, 0x0002, 0xdd52, 0xdd50, 0xdd50, 0xdd5e, 0xdd50, + 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, + 0x080c, 0x0dd5, 0x6003, 0x000b, 0x6106, 0x080c, 0x8e7f, 0x0126, + 0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x0026, 0x00e6, + 0x080c, 0xe477, 0x0118, 0x080c, 0xab6b, 0x0450, 0x2071, 0x0260, + 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, + 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, + 0xae8c, 0x7220, 0x080c, 0xe0c9, 0x0118, 0x6007, 0x0086, 0x0040, + 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, + 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x080c, 0x9548, + 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, + 0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082, + 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, + 0x080c, 0xac01, 0x0050, 0x2001, 0x0007, 0x080c, 0x6349, 0x080c, + 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005, 0xddc3, 0xddc5, + 0xddc5, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3, + 0xddc3, 0xddc3, 0xddc3, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, + 0xab9c, 0x080c, 0x941c, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0dd5, + 0x9182, 0x0092, 0x1a0c, 0x0dd5, 0x9182, 0x0085, 0x0002, 0xdde4, + 0xdde4, 0xdde4, 0xdde6, 0xdde4, 0xdde4, 0xdde4, 0xdde4, 0xdde4, + 0xdde4, 0xdde4, 0xdde4, 0xdde4, 0x080c, 0x0dd5, 0x0005, 0x9186, + 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, + 0x080c, 0xac01, 0x0030, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, + 0x941c, 0x0005, 0x0036, 0x080c, 0xe4d8, 0x6043, 0x0000, 0x2019, + 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, + 0x0126, 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, + 0x080c, 0xa3a6, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, + 0xa451, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, + 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, + 0xe4d8, 0x080c, 0xcf30, 0x080c, 0x19b4, 0x6023, 0x0007, 0x6014, + 0x2048, 0x080c, 0xc825, 0x0110, 0x080c, 0xe223, 0x009e, 0x6017, + 0x0000, 0x080c, 0xe4d8, 0x6023, 0x0007, 0x080c, 0xcf30, 0x003e, + 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, + 0x0260, 0x7938, 0x783c, 0x080c, 0x26f0, 0x15b8, 0x0016, 0x00c6, + 0x080c, 0x63cd, 0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xcf2d, + 0x00ce, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0xa512, + 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x007e, 0x001e, + 0x0076, 0x903e, 0x080c, 0xdfbd, 0x007e, 0x0026, 0xba04, 0x9294, + 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, + 0xbaa0, 0x080c, 0x3128, 0x002e, 0x001e, 0x080c, 0x5e12, 0xbe12, + 0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, + 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, + 0x1824, 0x2104, 0x9086, 0x0074, 0x1904, 0xdee4, 0x2069, 0x0260, + 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, + 0xdee1, 0x2001, 0x197c, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, + 0xb8c0, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, + 0x0001, 0x0648, 0x080c, 0xe63d, 0x0118, 0x6978, 0xd1fc, 0x11b8, + 0x2009, 0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, + 0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, + 0x0001, 0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, + 0x0100, 0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, + 0x6017, 0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, + 0x0028, 0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, + 0x0008, 0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, + 0x00b6, 0x0026, 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, + 0x00ff, 0x9286, 0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, + 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, + 0x080c, 0x63dc, 0x0804, 0xdf4c, 0x2011, 0x0276, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbb27, 0x009e, 0x15a8, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, - 0x080c, 0xa91d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, - 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, - 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x19bf, - 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, - 0x764c, 0x706c, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1a73, 0x000e, - 0x0128, 0x8001, 0x9602, 0x1a04, 0xcdf0, 0x0018, 0x9606, 0x0904, - 0xcdf0, 0x2100, 0x9c06, 0x0904, 0xcde7, 0x080c, 0xd022, 0x1904, - 0xcde7, 0x080c, 0xd311, 0x0904, 0xcde7, 0x080c, 0xd012, 0x0904, - 0xcde7, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x2f81, 0x0904, - 0xce0b, 0x6004, 0x9086, 0x0000, 0x1904, 0xce0b, 0x9786, 0x0004, - 0x0904, 0xce0b, 0x9786, 0x0007, 0x05d0, 0x2500, 0x9c06, 0x05b8, - 0x2400, 0x9c06, 0x05a0, 0x88ff, 0x0118, 0x6054, 0x9906, 0x1578, - 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1827, - 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xb7fa, 0x1130, 0x080c, - 0xa364, 0x009e, 0x080c, 0x9a06, 0x00d0, 0x6014, 0x2048, 0x080c, - 0xb5fb, 0x0190, 0x9786, 0x0003, 0x1528, 0xa867, 0x0103, 0xab7a, - 0xa877, 0x0000, 0x080c, 0xd28c, 0x0016, 0x080c, 0xb8e3, 0x080c, - 0x6529, 0x001e, 0x080c, 0xb7dd, 0x009e, 0x080c, 0x9a06, 0x9ce0, - 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xcd76, - 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, - 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, - 0x080c, 0xd28c, 0x080c, 0xcf91, 0x08f8, 0x009e, 0x0c00, 0x9786, - 0x000a, 0x0968, 0x0850, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, - 0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, - 0x1970, 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xb7e9, 0x0130, - 0x080c, 0xb7fa, 0x1920, 0x080c, 0xa364, 0x0038, 0x080c, 0x2e55, - 0x080c, 0xb7fa, 0x1110, 0x080c, 0xa364, 0x080c, 0x9a06, 0x0804, - 0xcde7, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, - 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xcfb8, 0x001e, - 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, - 0xce56, 0xce56, 0xce56, 0xce56, 0xce56, 0xce56, 0xce58, 0xce56, - 0xce56, 0xce56, 0xce56, 0x9a06, 0x9a06, 0xce56, 0x9006, 0x0005, - 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, - 0x2c00, 0x2009, 0x0020, 0x080c, 0xcfe6, 0x001e, 0x004e, 0x2019, - 0x0002, 0x080c, 0xcbad, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, - 0x080c, 0xb5fb, 0x0140, 0x6014, 0x904d, 0x080c, 0xb251, 0x687b, - 0x0005, 0x080c, 0x6536, 0x009e, 0x080c, 0x9a06, 0x9085, 0x0001, - 0x0005, 0x2001, 0x0001, 0x080c, 0x5ebb, 0x0156, 0x0016, 0x0026, - 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, - 0xa909, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, - 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, - 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, - 0xcef1, 0x2071, 0x1800, 0x764c, 0x706c, 0x8001, 0x9602, 0x1a04, - 0xcef1, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, - 0xd012, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, - 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, - 0x11f8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, - 0xd084, 0x0140, 0x080c, 0xd240, 0x080c, 0xbd04, 0x080c, 0x1827, - 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb5fb, 0x0120, 0x0046, - 0x080c, 0xcf91, 0x004e, 0x009e, 0x080c, 0x9a06, 0x88ff, 0x1198, - 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, - 0xcea6, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, - 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x00b6, 0x0076, - 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, - 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0x9349, 0x009e, 0x008e, - 0x903e, 0x080c, 0x93f4, 0x080c, 0xce97, 0x005e, 0x007e, 0x00be, - 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, - 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5f7e, - 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, - 0x904e, 0x080c, 0x9349, 0x009e, 0x008e, 0x903e, 0x080c, 0x93f4, - 0x080c, 0xce97, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xcf24, - 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, - 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, - 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x9349, 0x009e, 0x008e, - 0x903e, 0x080c, 0x93f4, 0x2c20, 0x080c, 0xce97, 0x005e, 0x007e, - 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, - 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x5f7e, - 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, - 0xd224, 0x004e, 0x0096, 0x904e, 0x080c, 0x9349, 0x009e, 0x008e, - 0x903e, 0x080c, 0x93f4, 0x080c, 0xce97, 0x003e, 0x001e, 0x8108, - 0x1f04, 0xcf6c, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, - 0x0005, 0x0016, 0x00f6, 0x080c, 0xb5f9, 0x0198, 0xa864, 0x9084, - 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, - 0x0000, 0xab82, 0x080c, 0x6536, 0x2f48, 0x0cb0, 0xab82, 0x080c, - 0x6536, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, - 0x0000, 0x080c, 0x6536, 0x2f48, 0x0cb8, 0x080c, 0x6536, 0x0c88, - 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, - 0x1800, 0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, - 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, - 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, - 0x2001, 0x1818, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, - 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, - 0x080c, 0x0fd5, 0x000e, 0x090c, 0x0db2, 0xa867, 0x010d, 0xa88e, - 0x0026, 0x2010, 0x080c, 0xb5e9, 0x2001, 0x0000, 0x0120, 0x2200, - 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f, - 0x0000, 0x2001, 0x195d, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802, - 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6536, 0x012e, - 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, - 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, - 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, - 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, - 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, - 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0005, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c, 0x8000, 0x080c, - 0x8582, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, - 0x0158, 0xd0cc, 0x0118, 0x080c, 0xb927, 0x0030, 0x080c, 0xd240, - 0x080c, 0x7e13, 0x080c, 0x99d6, 0x0005, 0x9280, 0x0008, 0x2004, - 0x9084, 0x000f, 0x0002, 0xd071, 0xd071, 0xd071, 0xd073, 0xd071, - 0xd073, 0xd073, 0xd071, 0xd073, 0xd071, 0xd071, 0xd071, 0xd071, - 0xd071, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, - 0x2004, 0x9084, 0x000f, 0x0002, 0xd08a, 0xd08a, 0xd08a, 0xd08a, - 0xd08a, 0xd08a, 0xd097, 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd08a, - 0xd08a, 0xd08a, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, - 0x6003, 0x0001, 0x080c, 0x8000, 0x080c, 0x8582, 0x0005, 0x0096, - 0x00c6, 0x2260, 0x080c, 0xd240, 0x6043, 0x0000, 0x6024, 0xc0f4, - 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, - 0x0007, 0x1904, 0xd0f1, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, - 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, - 0x0001, 0x080c, 0x8000, 0x080c, 0x8582, 0x00c6, 0x2d60, 0x6100, - 0x9186, 0x0002, 0x1904, 0xd169, 0x6014, 0x9005, 0x1138, 0x6000, - 0x9086, 0x0007, 0x190c, 0x0db2, 0x0804, 0xd169, 0x2048, 0x080c, - 0xb5fb, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, - 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1170, 0xa87c, - 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0f4, 0xc0fc, 0xa882, 0x2009, - 0x0043, 0x080c, 0xca06, 0x0804, 0xd169, 0x2009, 0x0041, 0x0804, - 0xd163, 0x9186, 0x0005, 0x15a8, 0x6814, 0x2048, 0xa87c, 0xd0bc, - 0x1120, 0x00de, 0x009e, 0x0804, 0xd08a, 0xd0b4, 0x0128, 0xd0fc, - 0x090c, 0x0db2, 0x0804, 0xd0ab, 0x6007, 0x003a, 0x6003, 0x0001, - 0x080c, 0x8000, 0x080c, 0x8582, 0x00c6, 0x2d60, 0x6100, 0x9186, - 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd169, 0x6814, 0x2048, - 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1f4, 0xc1fc, 0xc1bc, - 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1582, 0x00fe, 0x2009, 0x0042, - 0x04d0, 0x0036, 0x080c, 0x0fd5, 0x090c, 0x0db2, 0xa867, 0x010d, + 0x080c, 0xbb27, 0x009e, 0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220, + 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, + 0x080c, 0xe280, 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, + 0x901a, 0x0076, 0x2039, 0x0000, 0x080c, 0x8ef7, 0x2c08, 0x080c, + 0xdfbd, 0x007e, 0x2001, 0x0007, 0x080c, 0x6349, 0x2001, 0x0007, + 0x080c, 0x631d, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, + 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, + 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, + 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, + 0x7930, 0x7834, 0x080c, 0x26f0, 0x11d0, 0x080c, 0x63cd, 0x11b8, + 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, + 0x080c, 0xbb27, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x015e, + 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, + 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x26f0, 0x11d0, 0x080c, 0x63cd, 0x11b8, 0x2011, + 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, + 0xbb27, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x015e, 0x003e, + 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, + 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, + 0x2740, 0x2029, 0x19ee, 0x252c, 0x2021, 0x19f4, 0x2424, 0x2061, + 0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, + 0x9186, 0x1aa7, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xe05a, + 0x0018, 0x9606, 0x0904, 0xe05a, 0x080c, 0x8710, 0x0904, 0xe051, + 0x2100, 0x9c06, 0x0904, 0xe051, 0x080c, 0xe2bc, 0x1904, 0xe051, + 0x080c, 0xe65a, 0x0904, 0xe051, 0x080c, 0xe2ac, 0x0904, 0xe051, + 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x31bf, 0x0904, 0xe099, + 0x6004, 0x9086, 0x0000, 0x1904, 0xe099, 0x9786, 0x0004, 0x0904, + 0xe099, 0x9786, 0x0007, 0x0904, 0xe051, 0x2500, 0x9c06, 0x0904, + 0xe051, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, + 0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, + 0x19b4, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xca24, 0x1130, + 0x080c, 0xb51d, 0x009e, 0x080c, 0xab9c, 0x0418, 0x6014, 0x2048, + 0x080c, 0xc825, 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, + 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xe5d5, 0x0016, 0x080c, + 0xcb0d, 0x080c, 0x6a3a, 0x001e, 0x080c, 0xca07, 0x009e, 0x080c, + 0xab9c, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, + 0x0804, 0xdfd1, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, + 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, + 0x0005, 0x0128, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x08f8, 0x009e, + 0x0c00, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0, + 0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x93cc, 0x0096, 0x6114, + 0x2148, 0x080c, 0xc825, 0x0118, 0x6010, 0x080c, 0x6a46, 0x009e, + 0x00c6, 0x080c, 0xab6b, 0x00ce, 0x0036, 0x080c, 0x9548, 0x003e, + 0x009e, 0x0804, 0xe051, 0x9786, 0x000a, 0x0904, 0xe038, 0x0804, + 0xe036, 0x81ff, 0x0904, 0xe051, 0x9180, 0x0001, 0x2004, 0x9086, + 0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1904, + 0xe051, 0x6000, 0x9086, 0x0002, 0x1904, 0xe051, 0x080c, 0xca13, + 0x0138, 0x080c, 0xca24, 0x1904, 0xe051, 0x080c, 0xb51d, 0x0038, + 0x080c, 0x3093, 0x080c, 0xca24, 0x1110, 0x080c, 0xb51d, 0x080c, + 0xab9c, 0x0804, 0xe051, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, + 0xe24a, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, + 0x00ce, 0x0005, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, + 0xe0ea, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xab9c, 0xab9c, 0xe0e8, + 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, + 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xe280, 0x001e, + 0x004e, 0x2019, 0x0002, 0x080c, 0xde08, 0x003e, 0x9085, 0x0001, + 0x0005, 0x0096, 0x080c, 0xc825, 0x0140, 0x6014, 0x904d, 0x080c, + 0xc472, 0x687b, 0x0005, 0x080c, 0x6a46, 0x009e, 0x080c, 0xab9c, + 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x6309, 0x0156, + 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, + 0x0276, 0x080c, 0xbb13, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, + 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, + 0x8fff, 0x0904, 0xe183, 0x2071, 0x1800, 0x7654, 0x7074, 0x8001, + 0x9602, 0x1a04, 0xe183, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, + 0x2078, 0x080c, 0xe2ac, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, + 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, + 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, + 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe4d8, 0x080c, 0xcf30, + 0x080c, 0x19b4, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xc825, + 0x0120, 0x0046, 0x080c, 0xe223, 0x004e, 0x009e, 0x080c, 0xab9c, + 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, + 0x1210, 0x0804, 0xe138, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, + 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, + 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, + 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xa3a6, + 0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x080c, 0xe129, 0x005e, + 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, + 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, + 0x080c, 0x63cd, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, + 0x0001, 0x0096, 0x904e, 0x080c, 0xa3a6, 0x009e, 0x008e, 0x903e, + 0x080c, 0xa451, 0x080c, 0xe129, 0x005e, 0x003e, 0x001e, 0x8108, + 0x1f04, 0xe1b6, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, + 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, + 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0xa3a6, + 0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x2c20, 0x080c, 0xe129, + 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, + 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, + 0x080c, 0x63cd, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, + 0x0001, 0x080c, 0xe4bc, 0x004e, 0x0096, 0x904e, 0x080c, 0xa3a6, + 0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x080c, 0xe129, 0x003e, + 0x001e, 0x8108, 0x1f04, 0xe1fe, 0x015e, 0x00ce, 0x007e, 0x005e, + 0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xc823, 0x0198, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, + 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6a46, 0x2f48, 0x0cb0, + 0xab82, 0x080c, 0x6a46, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, + 0x0130, 0xa803, 0x0000, 0x080c, 0x6a46, 0x2f48, 0x0cb8, 0x080c, + 0x6a46, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, + 0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, 0x12f8, + 0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, 0x6008, + 0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0, + 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x181a, + 0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, 0x9006, + 0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30, + 0x0096, 0x0006, 0x080c, 0x1000, 0x000e, 0x090c, 0x0dd5, 0xa867, + 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xc813, 0x2001, 0x0000, + 0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, + 0xac76, 0xa87f, 0x0000, 0x2001, 0x198c, 0x2004, 0xa882, 0x9006, + 0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6a46, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, + 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, + 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, + 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, + 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, + 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, + 0x000b, 0x6023, 0x0005, 0x2001, 0x1985, 0x2004, 0x601a, 0x080c, + 0x8e7f, 0x080c, 0x941c, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, + 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xcb51, 0x0030, + 0x080c, 0xe4d8, 0x080c, 0x8441, 0x080c, 0xab6b, 0x0005, 0x9280, + 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe30b, 0xe30b, 0xe30b, + 0xe30d, 0xe30b, 0xe30d, 0xe30d, 0xe30b, 0xe30d, 0xe30b, 0xe30b, + 0xe30b, 0xe30b, 0xe30b, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, + 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe324, 0xe324, + 0xe324, 0xe324, 0xe324, 0xe324, 0xe331, 0xe324, 0xe324, 0xe324, + 0xe324, 0xe324, 0xe324, 0xe324, 0x6007, 0x003b, 0x602f, 0x0009, + 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, + 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe4d8, 0x6043, 0x0000, + 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, + 0x2268, 0x9186, 0x0007, 0x1904, 0xe38a, 0x6814, 0x9005, 0x0138, + 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, + 0x003a, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00c6, + 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe401, 0x6014, 0x9005, + 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0dd5, 0x0804, 0xe401, + 0x2048, 0x080c, 0xc825, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, + 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, + 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, + 0x2009, 0x0043, 0x080c, 0xdc61, 0x0804, 0xe401, 0x2009, 0x0041, + 0x0804, 0xe3fb, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, + 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe324, 0xd0b4, 0x0128, + 0xd0fc, 0x090c, 0x0dd5, 0x0804, 0xe345, 0x6007, 0x003a, 0x6003, + 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00c6, 0x2d60, 0x6100, + 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xe401, 0x6814, + 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, + 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1689, 0x00fe, 0x2009, 0x0042, + 0x04d0, 0x0036, 0x080c, 0x1000, 0x090c, 0x0dd5, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, - 0x080c, 0x6536, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcbad, + 0x080c, 0x6a46, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xde08, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, - 0xca06, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, + 0xdc61, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, - 0x080c, 0x847d, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, - 0x080c, 0xcf91, 0x009e, 0x003e, 0x080c, 0x8582, 0x0005, 0x9186, - 0x0014, 0x0d70, 0x080c, 0x9a6b, 0x0005, 0xd19c, 0xd19a, 0xd19a, - 0xd19a, 0xd19a, 0xd19a, 0xd19c, 0xd19a, 0xd19a, 0xd19a, 0xd19a, - 0xd19a, 0xd19a, 0x080c, 0x0db2, 0x080c, 0x847d, 0x6003, 0x000c, - 0x080c, 0x8582, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, - 0x0208, 0x001a, 0x080c, 0x9a6b, 0x0005, 0xd1ba, 0xd1ba, 0xd1ba, - 0xd1ba, 0xd1bc, 0xd1dc, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, - 0xd1ba, 0xd1ba, 0x080c, 0x0db2, 0x00d6, 0x2c68, 0x080c, 0x9980, + 0x080c, 0x9317, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, + 0x080c, 0xe223, 0x009e, 0x003e, 0x080c, 0x941c, 0x0005, 0x9186, + 0x0014, 0x0d70, 0x080c, 0xac01, 0x0005, 0xe434, 0xe432, 0xe432, + 0xe432, 0xe432, 0xe432, 0xe434, 0xe432, 0xe432, 0xe432, 0xe432, + 0xe432, 0xe432, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x6003, 0x000c, + 0x080c, 0x941c, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, + 0x0208, 0x001a, 0x080c, 0xac01, 0x0005, 0xe452, 0xe452, 0xe452, + 0xe452, 0xe454, 0xe474, 0xe452, 0xe452, 0xe452, 0xe452, 0xe452, + 0xe452, 0xe452, 0x080c, 0x0dd5, 0x00d6, 0x2c68, 0x080c, 0xab15, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, - 0x6112, 0x6023, 0x0004, 0x080c, 0x8000, 0x080c, 0x8582, 0x2d60, - 0x080c, 0x99d6, 0x00de, 0x0005, 0x080c, 0x99d6, 0x0005, 0x00e6, + 0x6112, 0x6023, 0x0004, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x2d60, + 0x080c, 0xab6b, 0x00de, 0x0005, 0x080c, 0xab6b, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, - 0x2009, 0x1873, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, - 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1957, 0x2004, 0x6042, - 0x2009, 0x1873, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873, + 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, + 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1986, 0x2004, 0x6042, + 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, - 0x2001, 0x1957, 0x200c, 0x2001, 0x1955, 0x2004, 0x9100, 0x9080, - 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, + 0x2001, 0x1986, 0x200c, 0x2001, 0x1984, 0x2004, 0x9100, 0x9080, + 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, - 0xb8ac, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, - 0x1138, 0x600c, 0x2072, 0x080c, 0x7e13, 0x080c, 0x99d6, 0x0010, + 0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, + 0x1138, 0x600c, 0x2072, 0x080c, 0x8441, 0x080c, 0xab6b, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, - 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, + 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068, 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, - 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182a, 0x2204, 0x9084, + 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, - 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa91d, + 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbb27, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, - 0x2048, 0x2019, 0x0006, 0x080c, 0xa91d, 0x009e, 0x1100, 0x015e, - 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x59b4, - 0x080c, 0x2c2b, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, - 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, - 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, - 0x19bf, 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, - 0x1800, 0x764c, 0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, - 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, - 0x9c06, 0x01d0, 0x080c, 0xd012, 0x01b8, 0x080c, 0xd022, 0x11a0, - 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1827, 0x001e, - 0x080c, 0xb7e9, 0x1110, 0x080c, 0x2e55, 0x080c, 0xb7fa, 0x1110, - 0x080c, 0xa364, 0x080c, 0x9a06, 0x9ce0, 0x0018, 0x2001, 0x1818, - 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, - 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, - 0x180f, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1835, 0x2004, - 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xbcec, - 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, - 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4829, 0x004e, 0x003e, - 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x94b5, 0x080c, - 0x9a06, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, - 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, - 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, - 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, - 0x908e, 0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee, - 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, - 0x2071, 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, - 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, - 0x00e6, 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, - 0x1844, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, - 0x8000, 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, - 0x012e, 0x0005, 0x0002, 0x0003, 0x03d8, 0x0000, 0x8064, 0x0008, - 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4406, 0x000b, - 0x8060, 0x0000, 0x0400, 0x0000, 0x580c, 0x0003, 0x7933, 0x0003, - 0x5090, 0x000b, 0x4c09, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, - 0x0c09, 0x000b, 0x15fe, 0x0008, 0x3409, 0x0003, 0x808c, 0x0008, - 0x0001, 0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, - 0x0002, 0x0000, 0x081b, 0x0003, 0x4022, 0x0000, 0x001c, 0x0003, - 0x4122, 0x0008, 0x4447, 0x0002, 0x0de8, 0x0003, 0x0bfe, 0x0008, - 0x11a0, 0x0001, 0x11ca, 0x000b, 0x0ca0, 0x0001, 0x11ca, 0x000b, - 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x442a, 0x0003, - 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, - 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x4432, 0x0003, - 0x03fe, 0x0000, 0x43e0, 0x0001, 0x0dc7, 0x000b, 0xc2c0, 0x0009, - 0x00ff, 0x0008, 0x02e0, 0x0001, 0x0dc7, 0x000b, 0x9180, 0x0001, - 0x0005, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x0019, 0x0000, 0x4441, 0x000b, 0x0240, 0x0002, - 0x09c4, 0x0003, 0x00fe, 0x0000, 0x31c7, 0x000b, 0x112a, 0x0000, - 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c09, 0x000b, - 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, - 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4452, 0x0003, - 0x01fe, 0x0008, 0x42e0, 0x0009, 0x0dba, 0x000b, 0x00fe, 0x0000, - 0x43e0, 0x0001, 0x0dba, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, - 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, - 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x1e0a, 0x0008, 0x4464, 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, - 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x586a, 0x0003, - 0x8066, 0x0000, 0x3679, 0x0000, 0x446d, 0x0003, 0x586e, 0x000b, - 0x8054, 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, - 0x1efe, 0x0000, 0x3009, 0x000b, 0x0077, 0x0004, 0x0009, 0x000b, - 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, - 0x447b, 0x000b, 0x587c, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, - 0x1f43, 0x0002, 0x0c86, 0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, - 0x0348, 0x0008, 0x044a, 0x0008, 0x008a, 0x0003, 0x0344, 0x0008, - 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x588a, 0x000b, - 0x8054, 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, - 0x4000, 0x000f, 0x3a40, 0x000a, 0x0c0c, 0x000b, 0x2b24, 0x0008, - 0x2b24, 0x0008, 0x5894, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, - 0x1242, 0x0002, 0x08d8, 0x0003, 0x3a45, 0x000a, 0x08c9, 0x0003, - 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x08c6, 0x0003, 0x1d00, 0x0002, - 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x0009, 0x0008, 0x44a4, 0x0003, 0x00fe, 0x0000, 0x34c3, 0x0003, - 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, - 0x0009, 0x0008, 0x44ac, 0x000b, 0x00fe, 0x0000, 0x31a3, 0x0003, - 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, - 0x8066, 0x0000, 0x0009, 0x0008, 0x44b5, 0x0003, 0x80c0, 0x0009, - 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, - 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, - 0x44bf, 0x0003, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x00a0, 0x000b, - 0x0036, 0x0008, 0x0077, 0x0004, 0x00d8, 0x000b, 0x8074, 0x0000, - 0x2000, 0x0000, 0x00d8, 0x000b, 0x3a44, 0x0002, 0x09cd, 0x0003, - 0x8074, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, - 0x35a3, 0x000b, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, - 0x2700, 0x0008, 0x00d0, 0x0009, 0x0ce6, 0x0003, 0x8074, 0x0000, - 0x4040, 0x0008, 0x58d8, 0x0003, 0x5090, 0x000b, 0x3a46, 0x000a, - 0x0ce6, 0x0003, 0x3a47, 0x0002, 0x08e3, 0x000b, 0x8054, 0x0008, - 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0127, 0x0003, - 0x92c0, 0x0009, 0x0f88, 0x0008, 0x0809, 0x0003, 0x1a60, 0x0000, - 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, 0x0000, - 0x44eb, 0x000b, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102, 0x0000, - 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306, 0x0000, - 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a, 0x0000, - 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e, 0x0000, - 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912, 0x0000, - 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, - 0x8066, 0x0000, 0x0052, 0x0000, 0x4505, 0x0003, 0x92c0, 0x0009, - 0x0780, 0x0008, 0x0db4, 0x0003, 0x124b, 0x0002, 0x090e, 0x0003, - 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x09a3, 0x000b, 0x3a46, 0x000a, - 0x0d1b, 0x0003, 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, - 0x1243, 0x000a, 0x0925, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, - 0x0194, 0x0004, 0x1810, 0x0000, 0x0194, 0x0004, 0x0125, 0x000b, - 0x194d, 0x000a, 0x091f, 0x0003, 0x1243, 0x000a, 0x09aa, 0x000b, - 0x591f, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0189, 0x0004, - 0x1810, 0x0000, 0x0194, 0x0004, 0x8074, 0x0000, 0xf000, 0x0008, - 0x0d30, 0x0000, 0x3a42, 0x0002, 0x0d2d, 0x0003, 0x15fe, 0x0008, - 0x344b, 0x0003, 0x0009, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, - 0x8010, 0x0008, 0x000c, 0x0008, 0x0194, 0x0004, 0x0009, 0x000b, - 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d43, 0x000b, 0x18fe, 0x0000, - 0x3ce0, 0x0009, 0x0940, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, - 0x0940, 0x0003, 0x0184, 0x000c, 0x8076, 0x0008, 0x0040, 0x0000, - 0x0181, 0x0003, 0x8076, 0x0008, 0x0041, 0x0008, 0x0181, 0x0003, - 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d48, 0x0003, 0x3c1e, 0x0008, - 0x0181, 0x0003, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0d66, 0x0003, - 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d40, 0x000b, 0x8076, 0x0008, - 0x0040, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, - 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, - 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, - 0x8066, 0x0000, 0x0422, 0x0000, 0x455d, 0x000b, 0x0189, 0x0004, - 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, - 0x8072, 0x0000, 0x8000, 0x0000, 0x0127, 0x0003, 0xbbe0, 0x0009, - 0x0038, 0x0000, 0x0d78, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, - 0x0975, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d3c, 0x0003, - 0x0184, 0x000c, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, - 0x8000, 0x0000, 0x01c4, 0x000b, 0x8076, 0x0008, 0x0042, 0x0008, - 0x0181, 0x0003, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0d81, 0x0003, - 0x3a44, 0x0002, 0x0c0b, 0x0003, 0x8072, 0x0000, 0x8000, 0x0000, - 0x8000, 0x000f, 0x0009, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, - 0x0009, 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, - 0x0007, 0x0000, 0x018d, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, - 0x9880, 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0x4592, 0x000b, - 0x4000, 0x000f, 0x2194, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, - 0xbac0, 0x0009, 0x0090, 0x0008, 0x099d, 0x0003, 0x8074, 0x0000, - 0x0706, 0x0000, 0x019f, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, - 0x4000, 0x000f, 0x8010, 0x0008, 0x0008, 0x0000, 0x01d2, 0x0003, - 0x0189, 0x0004, 0x8010, 0x0008, 0x0007, 0x0000, 0x0194, 0x0004, - 0x1810, 0x0000, 0x0194, 0x0004, 0x01dc, 0x000b, 0x0189, 0x0004, - 0x8010, 0x0008, 0x001b, 0x0008, 0x0194, 0x0004, 0x1810, 0x0000, - 0x0194, 0x0004, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, - 0x0009, 0x000b, 0x8010, 0x0008, 0x0009, 0x0008, 0x01d2, 0x0003, - 0x8010, 0x0008, 0x0005, 0x0008, 0x01d2, 0x0003, 0x808c, 0x0008, - 0x0001, 0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, - 0x0859, 0x0003, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x0d2a, 0x0008, - 0x01d2, 0x0003, 0x8010, 0x0008, 0x0003, 0x0008, 0x01d4, 0x0003, - 0x8010, 0x0008, 0x000b, 0x0000, 0x01d4, 0x0003, 0x8010, 0x0008, - 0x0002, 0x0000, 0x01d4, 0x0003, 0x3a47, 0x0002, 0x0cd8, 0x000b, - 0x8010, 0x0008, 0x0006, 0x0008, 0x01d4, 0x0003, 0x8074, 0x0000, - 0xf000, 0x0008, 0x0194, 0x0004, 0x0197, 0x0004, 0x3a40, 0x000a, - 0x0809, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, 0x0194, 0x0004, - 0x0009, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, - 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x09e5, 0x0003, 0x8054, 0x0008, - 0x0019, 0x0000, 0x0009, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, - 0x0009, 0x000b, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x01c7, 0x000b, - 0x55d0, 0xf6d9, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, - 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, - 0x4000, 0x8000, 0xac74 + 0x2048, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x1100, 0x015e, + 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5d8b, + 0x080c, 0x2e48, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, 0x1000, + 0x090c, 0x0dd5, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9, 0x000c, + 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118, 0xa867, + 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110, 0xa87b, + 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00, 0x8007, + 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084, 0x00ff, + 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294, 0x00ff, + 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294, 0xff00, + 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186, 0x0046, + 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204, 0x8007, + 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204, 0x8007, + 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186, 0x0046, + 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, + 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, + 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001, 0x00b0, + 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, + 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260, 0x2204, + 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186, 0x0046, + 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146, 0x01d6, + 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210, 0x8319, + 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013, 0x0000, + 0x002e, 0x080c, 0x6a46, 0x009e, 0x0005, 0x00e6, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, + 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, + 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, + 0x2029, 0x19ee, 0x252c, 0x2021, 0x19f4, 0x2424, 0x2061, 0x1cd0, + 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, 0x9786, + 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, + 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe2ac, 0x01b8, 0x080c, 0xe2bc, + 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x19b4, + 0x001e, 0x080c, 0xca13, 0x1110, 0x080c, 0x3093, 0x080c, 0xca24, + 0x1110, 0x080c, 0xb51d, 0x080c, 0xab9c, 0x9ce0, 0x0018, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, + 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, + 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1837, + 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, + 0xcf18, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, + 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4ab2, 0x004e, + 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0xa512, + 0x080c, 0xab9c, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, + 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, + 0x7006, 0xd5b4, 0x0118, 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, + 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, + 0x0130, 0x908e, 0x0005, 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e, + 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, + 0x8000, 0x2071, 0xfff6, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, + 0x2e05, 0x8000, 0x2077, 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, + 0x0005, 0x00e6, 0x2071, 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0xfff8, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, + 0x2091, 0x8000, 0x2071, 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, + 0x000e, 0x012e, 0x0005, 0x0003, 0x000b, 0x079a, 0x0000, 0xc000, + 0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, + 0x0008, 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, + 0x000b, 0x79a8, 0x000b, 0x50ee, 0x000b, 0x4c0a, 0x0003, 0xbac0, + 0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, + 0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, + 0x0000, 0x1668, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, + 0x0007, 0x4028, 0x0000, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, + 0x0000, 0x0822, 0x0003, 0x4022, 0x0000, 0x0028, 0x000b, 0x4122, + 0x0008, 0x94c0, 0x0009, 0xff00, 0x0008, 0xffe0, 0x0009, 0x0500, + 0x0008, 0x0a93, 0x000b, 0x4447, 0x0002, 0x0e90, 0x0003, 0x0bfe, + 0x0008, 0x11a0, 0x0001, 0x126e, 0x0003, 0x0ca0, 0x0001, 0x126e, + 0x0003, 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4436, + 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, + 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x443e, + 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x0e6b, 0x000b, 0xc2c0, + 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x0e6b, 0x000b, 0x9180, + 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, + 0x0008, 0x8066, 0x0000, 0x0019, 0x0000, 0x444d, 0x000b, 0x0240, + 0x0002, 0x0a68, 0x0003, 0x00fe, 0x0000, 0x326b, 0x000b, 0x0248, + 0x000a, 0x085c, 0x0003, 0x9180, 0x0001, 0x0006, 0x0008, 0x7f62, + 0x0008, 0x8002, 0x0008, 0x0003, 0x0008, 0x8066, 0x0000, 0x020a, + 0x0000, 0x445b, 0x0003, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, + 0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, + 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, + 0x0000, 0x0011, 0x0008, 0x4468, 0x0003, 0x01fe, 0x0008, 0x42e0, + 0x0009, 0x0e5c, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e5c, + 0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, + 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x447a, + 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, + 0x0008, 0x0002, 0x0000, 0x5880, 0x000b, 0x8066, 0x0000, 0x3679, + 0x0000, 0x4483, 0x0003, 0x5884, 0x0003, 0x3efe, 0x0008, 0x7f4f, + 0x0002, 0x088a, 0x000b, 0x0d00, 0x0000, 0x0092, 0x000c, 0x8054, + 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, + 0x0000, 0x300a, 0x000b, 0x00c8, 0x000c, 0x000a, 0x000b, 0x00fe, + 0x0000, 0x349a, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, + 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x4499, 0x000b, 0x03fe, + 0x0000, 0x04d0, 0x0001, 0x0cc0, 0x000b, 0x82c0, 0x0001, 0x1f00, + 0x0000, 0xffa0, 0x0001, 0x0400, 0x0000, 0x08af, 0x0003, 0x14c0, + 0x000b, 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, + 0x0008, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x10af, + 0x0003, 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08c0, + 0x0003, 0x00fe, 0x0000, 0x34b6, 0x000b, 0x8072, 0x0000, 0x1010, + 0x0008, 0x3944, 0x0002, 0x08b1, 0x0003, 0x00ba, 0x0003, 0x8072, + 0x0000, 0x2020, 0x0008, 0x3945, 0x000a, 0x08b6, 0x000b, 0x3946, + 0x000a, 0x0cc7, 0x0003, 0x0000, 0x0007, 0x3943, 0x000a, 0x08c7, + 0x000b, 0x00ba, 0x0003, 0x00fe, 0x0000, 0x34c5, 0x0003, 0x8072, + 0x0000, 0x1000, 0x0000, 0x00c7, 0x0003, 0x8072, 0x0000, 0x2000, + 0x0000, 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, + 0x0000, 0x0231, 0x0008, 0x44cc, 0x000b, 0x58cd, 0x000b, 0x0140, + 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0cdb, 0x000b, 0x0d44, + 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, + 0x0008, 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00df, + 0x0003, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, + 0x0000, 0x1948, 0x000a, 0x08e2, 0x0003, 0x0d4a, 0x0008, 0x58e2, + 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08e9, 0x000b, 0x8000, + 0x0000, 0x0001, 0x0000, 0x0092, 0x000c, 0x8054, 0x0008, 0x0001, + 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40, + 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, 0x0008, 0x58f2, + 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, 0x0940, + 0x0003, 0x3a45, 0x000a, 0x092f, 0x0003, 0x8072, 0x0000, 0x1000, + 0x0000, 0x3945, 0x000a, 0x08ff, 0x0003, 0x8072, 0x0000, 0x3010, + 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x092a, 0x0003, 0x1d00, + 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, + 0x0000, 0x0009, 0x0008, 0x4508, 0x000b, 0x00fe, 0x0000, 0x3527, + 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, + 0x0000, 0x0009, 0x0008, 0x4510, 0x000b, 0x00fe, 0x0000, 0x3243, + 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, + 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4519, 0x000b, 0x80c0, + 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, + 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, + 0x0008, 0x4523, 0x000b, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x0104, + 0x000b, 0x0036, 0x0008, 0x00c8, 0x000c, 0x0140, 0x000b, 0x8074, + 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000, 0x0140, + 0x000b, 0x3a44, 0x0002, 0x0a71, 0x000b, 0x8074, 0x0000, 0x1000, + 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, + 0x0000, 0x3640, 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, + 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d52, 0x000b, 0x8074, + 0x0000, 0x4040, 0x0008, 0x5940, 0x0003, 0x50ee, 0x000b, 0x3a46, + 0x000a, 0x0d52, 0x000b, 0x3a47, 0x0002, 0x094d, 0x000b, 0x8054, + 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x8072, + 0x0000, 0x3000, 0x0008, 0x019c, 0x0003, 0x92c0, 0x0009, 0x0fc8, + 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0e3a, 0x0003, 0x1a60, + 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, + 0x0000, 0x4557, 0x000b, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102, + 0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306, + 0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a, + 0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e, + 0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912, + 0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, + 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x4571, 0x0003, 0x92c0, + 0x0009, 0x0780, 0x0008, 0x0e56, 0x0003, 0x124b, 0x0002, 0x097a, + 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a40, 0x0003, 0x3a46, + 0x000a, 0x0d8a, 0x000b, 0x597c, 0x0003, 0x8054, 0x0008, 0x0004, + 0x0000, 0x1243, 0x000a, 0x0998, 0x0003, 0x8010, 0x0008, 0x000d, + 0x0000, 0x021b, 0x000c, 0x1948, 0x000a, 0x0987, 0x000b, 0x0210, + 0x0004, 0x1810, 0x0000, 0x021b, 0x000c, 0x0198, 0x000b, 0x1948, + 0x000a, 0x098e, 0x000b, 0x1243, 0x000a, 0x0a43, 0x0003, 0x194d, + 0x000a, 0x0992, 0x0003, 0x1243, 0x000a, 0x0a4a, 0x0003, 0x5992, + 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0210, 0x0004, 0x1810, + 0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, + 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x3a42, 0x0002, 0x0da2, + 0x000b, 0x15fe, 0x0008, 0x3461, 0x000b, 0x000a, 0x000b, 0x8074, + 0x0000, 0x0501, 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x021b, + 0x000c, 0x000a, 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0db8, + 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09b5, 0x0003, 0x15fe, + 0x0008, 0x3ce0, 0x0009, 0x09b5, 0x0003, 0x020b, 0x0004, 0x8076, + 0x0008, 0x0040, 0x0000, 0x0208, 0x000b, 0x8076, 0x0008, 0x0041, + 0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0dbd, + 0x0003, 0x3c1e, 0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x003b, + 0x0000, 0x0dc2, 0x000b, 0x3c20, 0x0000, 0x0208, 0x000b, 0xbbe0, + 0x0009, 0x0035, 0x0008, 0x0dc8, 0x000b, 0x8072, 0x0000, 0x8000, + 0x0000, 0x0384, 0x000b, 0xbbe0, 0x0009, 0x0036, 0x0008, 0x0aa5, + 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0de9, 0x000b, 0x18fe, + 0x0000, 0x3ce0, 0x0009, 0x0db5, 0x000b, 0x8076, 0x0008, 0x0040, + 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604, + 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808, + 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066, + 0x0000, 0x0422, 0x0000, 0x45e0, 0x000b, 0x0210, 0x0004, 0x8054, + 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, + 0x0000, 0xb000, 0x0000, 0x019c, 0x0003, 0xbbe0, 0x0009, 0x0038, + 0x0000, 0x0dfb, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09f8, + 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0db1, 0x0003, 0x020b, + 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, + 0x0000, 0x0268, 0x000b, 0x8076, 0x0008, 0x0042, 0x0008, 0x0208, + 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0e08, 0x000b, 0x8074, + 0x0000, 0x0808, 0x0008, 0x3a44, 0x0002, 0x0c0c, 0x000b, 0x8074, + 0x0000, 0x0800, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, + 0x000f, 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, + 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, + 0x0000, 0x0214, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, + 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, + 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0x4619, 0x000b, 0x4000, + 0x000f, 0x221e, 0x000b, 0x0870, 0x0008, 0x4000, 0x000f, 0x7e1b, + 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0e1b, 0x0003, 0x18fe, + 0x0000, 0x3ce0, 0x0009, 0x0a2c, 0x0003, 0x15fe, 0x0008, 0x3ce0, + 0x0009, 0x0a2c, 0x0003, 0x020b, 0x0004, 0x8076, 0x0008, 0x0040, + 0x0000, 0x022e, 0x0003, 0x8076, 0x0008, 0x0041, 0x0008, 0x8072, + 0x0000, 0x8000, 0x0000, 0x021b, 0x0003, 0xbac0, 0x0009, 0x0090, + 0x0008, 0x0a37, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000, 0x0239, + 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010, + 0x0008, 0x0023, 0x0000, 0x0276, 0x000b, 0x8010, 0x0008, 0x0008, + 0x0000, 0x0276, 0x000b, 0x8010, 0x0008, 0x0022, 0x0008, 0x0276, + 0x000b, 0x0210, 0x0004, 0x8010, 0x0008, 0x0007, 0x0000, 0x021b, + 0x000c, 0x1810, 0x0000, 0x021b, 0x000c, 0x0282, 0x0003, 0x0210, + 0x0004, 0x8010, 0x0008, 0x001b, 0x0008, 0x021b, 0x000c, 0x1810, + 0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, + 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b, 0x8010, + 0x0008, 0x0009, 0x0008, 0x0276, 0x000b, 0x8010, 0x0008, 0x0005, + 0x0008, 0x0276, 0x000b, 0x1648, 0x000a, 0x0c6f, 0x000b, 0x808c, + 0x0008, 0x0001, 0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, + 0x000a, 0x086f, 0x0003, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, + 0x0008, 0x0276, 0x000b, 0x8010, 0x0008, 0x0003, 0x0008, 0x027a, + 0x000b, 0x8010, 0x0008, 0x000b, 0x0000, 0x027a, 0x000b, 0x8010, + 0x0008, 0x0002, 0x0000, 0x027a, 0x000b, 0x3a47, 0x0002, 0x0d40, + 0x000b, 0x8010, 0x0008, 0x0006, 0x0008, 0x027a, 0x000b, 0x8074, + 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x021b, + 0x000c, 0x0231, 0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, + 0x0008, 0x000c, 0x0008, 0x021b, 0x000c, 0x000a, 0x000b, 0x8074, + 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, + 0x0000, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a8d, 0x000b, 0x8054, + 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, + 0x0008, 0x000a, 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x026b, + 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x4447, 0x0002, 0x0ab9, + 0x0003, 0xc0c0, 0x0001, 0x00ff, 0x0008, 0xffe0, 0x0009, 0x00ff, + 0x0008, 0x0e90, 0x0003, 0xc1e0, 0x0001, 0xffff, 0x0008, 0x0e90, + 0x0003, 0x8010, 0x0008, 0x0013, 0x0000, 0x021b, 0x000c, 0x8074, + 0x0000, 0x0202, 0x0008, 0x000a, 0x000b, 0x3a40, 0x000a, 0x0eb6, + 0x000b, 0x8074, 0x0000, 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe, + 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x43e0, 0x0001, 0x0eb4, + 0x0003, 0x42fe, 0x0000, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x00e0, + 0x0009, 0x0a90, 0x000b, 0x0d08, 0x0008, 0x0309, 0x000b, 0x8072, + 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, 0x038d, 0x0004, 0x808c, + 0x0008, 0x0001, 0x0000, 0x04fe, 0x0008, 0x3370, 0x0003, 0x0460, + 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, + 0x0008, 0x46c3, 0x0003, 0x0004, 0x0000, 0x80c0, 0x0009, 0x00ff, + 0x0008, 0x7f00, 0x0000, 0x80e0, 0x0001, 0x0004, 0x0000, 0x0add, + 0x000b, 0x80e0, 0x0001, 0x0005, 0x0008, 0x0add, 0x000b, 0x80e0, + 0x0001, 0x0006, 0x0008, 0x0add, 0x000b, 0x82c0, 0x0001, 0xff00, + 0x0008, 0x7f04, 0x0008, 0x82e0, 0x0009, 0x0600, 0x0008, 0x0add, + 0x000b, 0x82e0, 0x0009, 0x0500, 0x0008, 0x0add, 0x000b, 0x82e0, + 0x0009, 0x0400, 0x0000, 0x0f70, 0x0003, 0xc4c0, 0x0009, 0x7000, + 0x0000, 0xffe0, 0x0009, 0x1000, 0x0000, 0x0b09, 0x0003, 0x037e, + 0x0004, 0x3941, 0x0002, 0x0ae8, 0x000b, 0x8072, 0x0000, 0x0400, + 0x0000, 0x000a, 0x000b, 0x0460, 0x0000, 0x80fe, 0x0008, 0x002b, + 0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, 0x0008, 0x46ee, + 0x0003, 0x11fe, 0x0000, 0x3304, 0x0003, 0x9180, 0x0001, 0x0002, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, + 0x0000, 0x0609, 0x0008, 0x46f8, 0x000b, 0x42fe, 0x0000, 0xffc0, + 0x0001, 0xff00, 0x0008, 0x03e0, 0x0009, 0x0f01, 0x0003, 0x8072, + 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x9180, 0x0001, 0x0003, + 0x0008, 0x02eb, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x8010, + 0x0008, 0x0010, 0x0000, 0x0361, 0x0003, 0x037e, 0x0004, 0x3941, + 0x0002, 0x0b0f, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, + 0x000b, 0x0346, 0x000c, 0x11fe, 0x0000, 0x0f17, 0x000b, 0x8072, + 0x0000, 0x0400, 0x0000, 0x8010, 0x0008, 0x000e, 0x0000, 0x0361, + 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x04fe, 0x0008, 0x0f2c, + 0x0003, 0x808c, 0x0008, 0x0000, 0x0008, 0x9180, 0x0001, 0x0005, + 0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4722, + 0x000b, 0x0060, 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, + 0x0008, 0x4206, 0x0008, 0x8066, 0x0000, 0x0412, 0x0000, 0x472a, + 0x0003, 0x0343, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0460, + 0x0000, 0x8062, 0x0008, 0x002b, 0x0008, 0x8066, 0x0000, 0x0609, + 0x0008, 0x4733, 0x000b, 0x8066, 0x0000, 0x220a, 0x0008, 0x4736, + 0x000b, 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x7f04, + 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x9180, 0x0001, 0x0002, + 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x041a, 0x0008, 0x4742, + 0x000b, 0x8072, 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x8060, + 0x0000, 0x0400, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x0411, + 0x0000, 0x474b, 0x000b, 0x02fe, 0x0008, 0x03e0, 0x0009, 0x0f51, + 0x0003, 0x0d22, 0x0000, 0x4000, 0x000f, 0x8280, 0x0009, 0x0002, + 0x0000, 0x1380, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, + 0x0008, 0x4757, 0x0003, 0x0200, 0x000a, 0xffc0, 0x0001, 0x0007, + 0x0000, 0x7f06, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x060a, + 0x0008, 0x475f, 0x000b, 0x4000, 0x000f, 0x3a44, 0x0002, 0x0c0a, + 0x000b, 0x2f44, 0x000a, 0x2f44, 0x000a, 0x0e6b, 0x000b, 0x808a, + 0x0008, 0x0003, 0x0008, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, + 0x0000, 0x3000, 0x0008, 0x5b6c, 0x0003, 0x8054, 0x0008, 0x0019, + 0x0000, 0x000a, 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, + 0x0008, 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, 0x0008, 0x021b, + 0x000c, 0x42fe, 0x0000, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x7f10, + 0x0008, 0x021b, 0x000c, 0x4310, 0x0008, 0x027a, 0x000b, 0x3941, + 0x0002, 0x0b81, 0x0003, 0x4000, 0x000f, 0x8072, 0x0000, 0x0404, + 0x0008, 0x4000, 0x000f, 0x8010, 0x0008, 0x0012, 0x0008, 0x021b, + 0x000c, 0x0346, 0x000c, 0x1110, 0x0000, 0x021b, 0x000c, 0x11fe, + 0x0000, 0x0f87, 0x000b, 0x000a, 0x000b, 0xc2c0, 0x0009, 0x00ff, + 0x0008, 0x7f00, 0x0000, 0xc3c0, 0x0001, 0xff00, 0x0008, 0x00d0, + 0x0009, 0x0bb2, 0x0003, 0x0d0a, 0x0000, 0x8580, 0x0001, 0x1000, + 0x0000, 0x7f62, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, + 0x0000, 0x0809, 0x0000, 0x479c, 0x000b, 0x04fe, 0x0008, 0x33ab, + 0x0003, 0x0460, 0x0000, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, + 0x0000, 0x0211, 0x0000, 0x47a4, 0x0003, 0x01fe, 0x0008, 0x00e0, + 0x0009, 0x0fab, 0x0003, 0x02fe, 0x0008, 0x43e0, 0x0001, 0x0bb1, + 0x0003, 0x0500, 0x0002, 0x7f0a, 0x0000, 0xffe0, 0x0009, 0x0800, + 0x0000, 0x0f95, 0x000b, 0x0d08, 0x0008, 0x4000, 0x000f, 0x43fe, + 0x0008, 0x3e80, 0x0001, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, + 0x0000, 0x0809, 0x0000, 0x47b8, 0x000b, 0x8060, 0x0000, 0x0400, + 0x0000, 0x84c0, 0x0001, 0xff00, 0x0008, 0x7f60, 0x000a, 0x7f60, + 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, + 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0xff80, 0x0009, 0x1000, + 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, 0x47ca, + 0x000b, 0x4000, 0x000f, 0x57bb, 0xebe0, 0x0001, 0x0002, 0x0004, + 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, + 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x2df1 }; #ifdef UNIQUE_FW_NAME -unsigned short fw2300tpx_length01 = 0xcf5b; +unsigned short fw2300ipx_length01 = 0xe666; #else -unsigned short risc_code_length01 = 0xcf5b; +unsigned short risc_code_length01 = 0xe666; #endif diff -Nru a/drivers/scsi/qla2xxx/ql2322.c b/drivers/scsi/qla2xxx/ql2322.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql2322.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,108 @@ +/* + * QLogic ISP2322 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation (www.qlogic.com) + * + * Released under GPL v2. + */ + +#include +#include +#include + +#include "qla_os.h" +#include "qla_def.h" + +static char qla_driver_name[] = "qla2322"; + +extern unsigned char fw2322ipx_version[]; +extern unsigned char fw2322ipx_version_str[]; +extern unsigned short fw2322ipx_addr01; +extern unsigned short fw2322ipx_code01[]; +extern unsigned short fw2322ipx_length01; +extern unsigned long rseqipx_code_addr01; +extern unsigned short rseqipx_code01[]; +extern unsigned short rseqipx_code_length01; +extern unsigned long xseqipx_code_addr01; +extern unsigned short xseqipx_code01[]; +extern unsigned short xseqipx_code_length01; + +static struct qla_fw_info qla_fw_tbl[] = { + { + .addressing = FW_INFO_ADDR_NORMAL, + .fwcode = &fw2322ipx_code01[0], + .fwlen = &fw2322ipx_length01, + .fwstart = &fw2322ipx_addr01, + }, + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = &rseqipx_code01[0], + .fwlen = &rseqipx_code_length01, + .lfwstart = &rseqipx_code_addr01, + }, + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = &xseqipx_code01[0], + .fwlen = &xseqipx_code_length01, + .lfwstart = &xseqipx_code_addr01, + }, + { FW_INFO_ADDR_NOMORE, }, +}; + +static struct qla_board_info qla_board_tbl[] = { + { + .drv_name = qla_driver_name, + .isp_name = "ISP2322", + .fw_info = qla_fw_tbl, + }, +}; + +static struct pci_device_id qla2322_pci_tbl[] = { + { + .vendor = PCI_VENDOR_ID_QLOGIC, + .device = PCI_DEVICE_ID_QLOGIC_ISP2322, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (unsigned long)&qla_board_tbl[0], + }, + {0, 0}, +}; +MODULE_DEVICE_TABLE(pci, qla2322_pci_tbl); + +static int __devinit +qla2322_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, + (struct qla_board_info *)id->driver_data); +} + +static void __devexit +qla2322_remove_one(struct pci_dev *pdev) +{ + qla2x00_remove_one(pdev); +} + +static struct pci_driver qla2322_pci_driver = { + .name = "qla2322", + .id_table = qla2322_pci_tbl, + .probe = qla2322_probe_one, + .remove = __devexit_p(qla2322_remove_one), +}; + +static int __init +qla2322_init(void) +{ + return pci_module_init(&qla2322_pci_driver); +} + +static void __exit +qla2322_exit(void) +{ + pci_unregister_driver(&qla2322_pci_driver); +} + +module_init(qla2322_init); +module_exit(qla2322_exit); + +MODULE_AUTHOR("QLogic Corporation"); +MODULE_DESCRIPTION("QLogic ISP2322 FC-SCSI Host Bus Adapter driver"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/qla2xxx/ql2322_fw.c b/drivers/scsi/qla2xxx/ql2322_fw.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql2322_fw.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,8019 @@ +/************************************************************************** + * QLOGIC LINUX SOFTWARE + * + * QLogic ISP2x00 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation + * (www.qlogic.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + *************************************************************************/ + +/* + * Firmware Version 3.02.21 (16:27 Jan 19, 2004) + */ + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_version = 3*1024+2; +#else +unsigned short risc_code_version = 3*1024+2; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned char fw2322ipx_version_str[] = {3, 2,21}; +#else +unsigned char firmware_version[] = {3, 2,21}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2322ipx_VERSION_STRING "3.02.21" +#else +#define FW_VERSION_STRING "3.02.21" +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_addr01 = 0x0800 ; +#else +unsigned short risc_code_addr01 = 0x0800 ; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_code01[] = { +#else +unsigned short risc_code01[] = { +#endif + 0x0470, 0x0000, 0x0000, 0xdddb, 0x0000, 0x0003, 0x0002, 0x0015, + 0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, + 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, + 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, + 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, + 0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9, + 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, + 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, + 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, + 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, + 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, + 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, + 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, + 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78, + 0x7883, 0x0004, 0x2089, 0x2a7c, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e55, 0x00f6, + 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x202e, 0x1170, + 0x2079, 0x0300, 0x080c, 0x2044, 0x2061, 0xe000, 0x080c, 0x202e, + 0x1128, 0x2079, 0x0380, 0x080c, 0x2044, 0x0060, 0x00fe, 0x7883, + 0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091, + 0x4080, 0x0cf8, 0x00fe, 0x2029, 0x5600, 0x2031, 0xffff, 0x2039, + 0x55dc, 0x2021, 0x0200, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, + 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, + 0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, + 0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756e, + 0x7672, 0x776a, 0x7476, 0x747a, 0x00e6, 0x2071, 0x1b4c, 0x2472, + 0x00ee, 0x20a1, 0x1ddc, 0x7170, 0x810d, 0x810d, 0x810d, 0x810d, + 0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104, + 0x8211, 0x1de0, 0x7170, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218, + 0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d, + 0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9, + 0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211, + 0x1dd8, 0x080c, 0x0f53, 0x080c, 0x5f4f, 0x080c, 0xaa6e, 0x080c, + 0x110a, 0x080c, 0x131f, 0x080c, 0x1b99, 0x080c, 0x9057, 0x080c, + 0x0d0f, 0x080c, 0x108f, 0x080c, 0x3434, 0x080c, 0x76fc, 0x080c, + 0x698e, 0x080c, 0x87cf, 0x080c, 0x8436, 0x080c, 0x2213, 0x080c, + 0x7dcc, 0x080c, 0x205d, 0x080c, 0x2197, 0x080c, 0x2208, 0x2091, + 0x3009, 0x7883, 0x0000, 0x1004, 0x0943, 0x7880, 0x9086, 0x0002, + 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, + 0x0937, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11cd, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c, + 0x9084, 0x0030, 0x9086, 0x0000, 0x190c, 0x0d7d, 0x2071, 0x1800, + 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, 0x4afd, 0x080c, 0x345b, + 0x080c, 0x7764, 0x080c, 0x6ed6, 0x080c, 0x88ad, 0x080c, 0x845f, + 0x0c68, 0x000b, 0x0c88, 0x096d, 0x096e, 0x0b09, 0x096b, 0x0bc3, + 0x0d0e, 0x0d0e, 0x0d0e, 0x080c, 0x0d7d, 0x0005, 0x0126, 0x00f6, + 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x080c, + 0x0ea5, 0x080c, 0x73e4, 0x0150, 0x080c, 0x7407, 0x15b0, 0x2079, + 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, 0x0478, 0x080c, 0x7315, + 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x7098, 0x9086, 0x0028, + 0x1904, 0x0adc, 0x080c, 0x842e, 0x080c, 0x8420, 0x2001, 0x0161, + 0x2003, 0x0001, 0x2079, 0x0100, 0x2011, 0xffff, 0x080c, 0x2a0b, + 0x7a28, 0x9295, 0x5e2c, 0x7a2a, 0x2011, 0x725a, 0x080c, 0x850b, + 0x2011, 0x724d, 0x080c, 0x8614, 0x2011, 0x5da6, 0x080c, 0x850b, + 0x2011, 0x8030, 0x901e, 0x7396, 0x04d0, 0x080c, 0x5653, 0x2079, + 0x0100, 0x7844, 0x9005, 0x1904, 0x0adc, 0x2011, 0x5da6, 0x080c, + 0x850b, 0x2011, 0x725a, 0x080c, 0x850b, 0x2011, 0x724d, 0x080c, + 0x8614, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, + 0x9084, 0xfffb, 0x7842, 0x2001, 0x19a4, 0x2004, 0x9005, 0x1140, + 0x00c6, 0x2061, 0x0100, 0x080c, 0x5ef7, 0x00ce, 0x0804, 0x0adc, + 0x780f, 0x006b, 0x7a28, 0x080c, 0x73ec, 0x0118, 0x9295, 0x5e2c, + 0x0010, 0x9295, 0x402c, 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001, + 0x19a5, 0x2003, 0x0001, 0x080c, 0x28ea, 0x080c, 0x4a38, 0x7248, + 0xc284, 0x724a, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, + 0x2001, 0x0390, 0x2003, 0x0400, 0x080c, 0xa781, 0x080c, 0x9f4a, + 0x2011, 0x0004, 0x080c, 0xc733, 0x080c, 0xa79d, 0x080c, 0x681f, + 0x080c, 0x73e4, 0x1120, 0x080c, 0x2938, 0x0600, 0x0420, 0x080c, + 0x5efe, 0x0140, 0x7097, 0x0001, 0x70d3, 0x0000, 0x080c, 0x5820, + 0x0804, 0x0adc, 0x080c, 0x55fc, 0xd094, 0x01a8, 0x2001, 0x0390, + 0x2003, 0x0404, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, + 0x5600, 0xd0d4, 0x1118, 0x080c, 0x2938, 0x1270, 0x2011, 0x180c, + 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x5600, 0xd0d4, 0x1db8, 0x2011, + 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x2012, 0x080c, 0x6962, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, + 0x2012, 0x080c, 0x6928, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, + 0x707f, 0x0000, 0x080c, 0x73e4, 0x1130, 0x70b0, 0x9005, 0x1168, + 0x080c, 0xcb83, 0x0050, 0x080c, 0xcb83, 0x70dc, 0xd09c, 0x1128, + 0x70b0, 0x9005, 0x0110, 0x080c, 0x5ed4, 0x70e7, 0x0000, 0x70e3, + 0x0000, 0x70a7, 0x0000, 0x080c, 0x2940, 0x0228, 0x2011, 0x0101, + 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x73e4, 0x1178, 0x9016, + 0x0016, 0x080c, 0x26e7, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f, + 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d, + 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295, + 0x72de, 0x080c, 0x73e4, 0x0118, 0x9296, 0x0004, 0x0518, 0x2011, + 0x0001, 0x080c, 0xc733, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, + 0x0002, 0x00fe, 0x080c, 0x2f79, 0x080c, 0xa781, 0x2011, 0x0005, + 0x080c, 0xa0a6, 0x080c, 0xa79d, 0x080c, 0x73e4, 0x0148, 0x00c6, + 0x2061, 0x0100, 0x0016, 0x080c, 0x26e7, 0x61e2, 0x001e, 0x00ce, + 0x012e, 0x00e0, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, + 0x080c, 0xa781, 0x2011, 0x0005, 0x080c, 0xa0a6, 0x080c, 0xa79d, + 0x080c, 0x73e4, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, + 0x26e7, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, + 0x00b6, 0x080c, 0x73e4, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, + 0x0782, 0x080c, 0x73e4, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, + 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, + 0xd0bc, 0x090c, 0x32bc, 0x8108, 0x1f04, 0x0af0, 0x707f, 0x0000, + 0x7080, 0x9084, 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, + 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, + 0x1904, 0x0bc0, 0x70ac, 0x9086, 0xffff, 0x0120, 0x080c, 0x2f79, + 0x0804, 0x0bc0, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0538, 0xd084, + 0x0528, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, + 0x01e8, 0x080c, 0x332d, 0x11b0, 0x70e0, 0x9086, 0xffff, 0x0190, + 0x080c, 0x310b, 0x70dc, 0xd094, 0x1904, 0x0bc0, 0x2011, 0x0001, + 0x080c, 0xce35, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x3145, + 0x0804, 0x0bc0, 0x70e4, 0x9005, 0x1904, 0x0bc0, 0x70a8, 0x9005, + 0x1904, 0x0bc0, 0x70dc, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0bc0, + 0x080c, 0x6928, 0x1904, 0x0bc0, 0x080c, 0x697b, 0x1904, 0x0bc0, + 0x080c, 0x6962, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, + 0x0016, 0x080c, 0x652d, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, + 0x8108, 0x1f04, 0x0b60, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, + 0x015e, 0x0804, 0x0bc0, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, + 0x000e, 0x2011, 0x19b1, 0x080c, 0x0fc3, 0x2011, 0x19cb, 0x080c, + 0x0fc3, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70af, 0xffff, + 0x080c, 0x0e79, 0x9006, 0x080c, 0x2574, 0x080c, 0x332d, 0x0118, + 0x080c, 0x4bd5, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, + 0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x7407, 0x0150, 0x080c, 0x73e4, 0x7828, 0x0118, 0x9084, + 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0xa781, + 0x2001, 0x19e6, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, + 0x080c, 0xa0a6, 0x2011, 0x0000, 0x080c, 0xa0b0, 0x080c, 0xa79d, + 0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126, + 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, + 0x2009, 0x00f7, 0x080c, 0x5ebd, 0x7940, 0x918c, 0x0010, 0x7942, + 0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x2a0b, 0xd19c, + 0x0120, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x0006, 0x0036, 0x0156, + 0x0000, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518, 0x080c, 0x299f, + 0x1148, 0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x0001, 0x080c, + 0x28fc, 0x00b8, 0x080c, 0x29a7, 0x1138, 0x9006, 0x080c, 0x2919, + 0x9006, 0x080c, 0x28fc, 0x0068, 0x080c, 0x29af, 0x1d50, 0x2001, + 0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2713, 0x0804, + 0x0cc1, 0x080c, 0x2a2e, 0x080c, 0x2a72, 0x20a9, 0x003a, 0x1d04, + 0x0c17, 0x080c, 0x85f4, 0x1f04, 0x0c17, 0x080c, 0x73f5, 0x0148, + 0x080c, 0x7407, 0x1118, 0x080c, 0x76f7, 0x0050, 0x080c, 0x73ec, + 0x0dd0, 0x080c, 0x76f2, 0x080c, 0x76e8, 0x080c, 0x7315, 0x0020, + 0x2009, 0x00f8, 0x080c, 0x5ebd, 0x7850, 0xc0e5, 0x7852, 0x080c, + 0x73e4, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, + 0x2019, 0xea60, 0x0d0c, 0x85f4, 0x7820, 0xd09c, 0x15a0, 0x080c, + 0x73e4, 0x0904, 0x0ca3, 0x7824, 0xd0ac, 0x1904, 0x0cc6, 0x080c, + 0x7407, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, + 0x2011, 0x1800, 0x080c, 0x2a0b, 0x080c, 0x29b7, 0x7824, 0x9084, + 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, + 0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x8421, 0x1160, 0x1d04, + 0x0c73, 0x080c, 0x85f4, 0x080c, 0x76f2, 0x080c, 0x76e8, 0x7003, + 0x0001, 0x0804, 0x0cc6, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004, + 0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x1d04, 0x0c89, 0x080c, + 0x85f4, 0x2009, 0x1999, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, + 0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x20a9, + 0x0002, 0x080c, 0x2998, 0x7924, 0x080c, 0x29b7, 0xd19c, 0x0110, + 0x080c, 0x28ea, 0x00f0, 0x080c, 0x73f5, 0x1140, 0x94a2, 0x03e8, + 0x1128, 0x080c, 0x73b8, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800, + 0x080c, 0x2a0b, 0x080c, 0x29b7, 0x7824, 0x080c, 0x73fe, 0x0110, + 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c7b, 0x7003, 0x0001, + 0x0028, 0x2001, 0x0001, 0x080c, 0x2574, 0x00a0, 0x7850, 0xc0e4, + 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, + 0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x7828, 0x9085, + 0x0028, 0x782a, 0x2001, 0x19a5, 0x2003, 0x0000, 0x9006, 0x78f2, + 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e, + 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x85f4, 0x015e, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086, + 0x0001, 0x1110, 0x080c, 0x345b, 0x00ee, 0x0005, 0x0005, 0x2a70, + 0x2061, 0x19a9, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015, + 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, 0x7196, 0x2001, + 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008, + 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xcb83, 0x70ef, + 0x00c0, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, + 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, + 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, + 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, + 0x1987, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, + 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x652d, + 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, + 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, + 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, + 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, + 0x0d7f, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, + 0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, + 0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, + 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1b22, 0x7a08, + 0x226a, 0x2069, 0x1b23, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, + 0x782c, 0x2019, 0x1b30, 0x201a, 0x2019, 0x1b33, 0x9016, 0x7808, + 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b4c, + 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, + 0x1b31, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, + 0x1a78, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, + 0x8318, 0x1f04, 0x0dcc, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e, + 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x0180, 0x2001, 0x1a20, 0x2004, 0x9005, 0x0128, + 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, + 0x0002, 0x2003, 0x1001, 0x080c, 0x560b, 0x1170, 0x080c, 0x0f13, + 0x0110, 0x080c, 0x0e66, 0x080c, 0x560b, 0x1130, 0x2071, 0x1800, + 0x2011, 0x8000, 0x080c, 0x0f27, 0x0c70, 0x0005, 0x2001, 0x0382, + 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015, + 0x080c, 0xa772, 0x2079, 0x0380, 0x2069, 0x1b02, 0x7818, 0x6802, + 0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812, + 0x2019, 0x1b0d, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a, + 0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead, + 0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c, + 0x6826, 0x7803, 0x0000, 0x2069, 0x1ac2, 0x901e, 0x20a9, 0x0020, + 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e40, 0x2069, + 0x1ae2, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, + 0x8d68, 0x8318, 0x1f04, 0x0e4d, 0x0005, 0x918c, 0x03ff, 0x2001, + 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, + 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, + 0x2011, 0x0080, 0x080c, 0x0f05, 0x20a9, 0x0900, 0x080c, 0x0f3b, + 0x2011, 0x0040, 0x080c, 0x0f05, 0x20a9, 0x0900, 0x080c, 0x0f3b, + 0x0c78, 0x0026, 0x080c, 0x0f13, 0x1188, 0x2011, 0x010e, 0x2214, + 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0x0947, 0x0010, + 0x2011, 0x1b47, 0x080c, 0x0f27, 0x002e, 0x0005, 0x2011, 0x010e, + 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, + 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1128, 0x70f3, + 0x0fa0, 0x080c, 0x0f18, 0x002e, 0x0005, 0x0026, 0x080c, 0x0f13, + 0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, + 0x080c, 0x0f18, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, + 0x0f13, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f27, 0x002e, 0x0005, + 0x080c, 0x29af, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, + 0x080c, 0x0f18, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071, + 0x1800, 0xd0b4, 0x70ec, 0x71e8, 0x1118, 0xc0e4, 0xc1f4, 0x0050, + 0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70f3, 0x0000, + 0xc0e5, 0xc1f5, 0x0099, 0x000e, 0x001e, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0x1800, 0xd0e4, 0x70ec, 0x1110, 0xc0dc, 0x0008, 0xc0dd, + 0x0016, 0x71e8, 0x0019, 0x001e, 0x00ee, 0x0005, 0x70ee, 0x71ea, + 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0ecb, 0x0ea5, 0x0ea5, + 0x0e79, 0x0eb4, 0x0ea5, 0x0ea5, 0x0eb4, 0xc284, 0x0016, 0x3b08, + 0x3a00, 0x9104, 0x918d, 0x00c1, 0x21d8, 0x9084, 0xff3e, 0x9205, + 0x20d0, 0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, + 0x9e86, 0x1800, 0x190c, 0x0d7d, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, + 0x72ee, 0xd0e4, 0x1118, 0x9294, 0x00c1, 0x08f9, 0x0005, 0x9e86, + 0x1800, 0x190c, 0x0d7d, 0x70e8, 0xd0f4, 0x0108, 0xc2f5, 0x72ea, + 0xd0f4, 0x1140, 0x9284, 0x8000, 0x8005, 0xc284, 0x9215, 0x9294, + 0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f3b, 0x2091, 0x6000, 0x1f04, + 0x0f3b, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, + 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, + 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, + 0x188d, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, + 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, + 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, + 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, + 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x189d, 0x928a, 0x000e, + 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, + 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, + 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, + 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, + 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, + 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, + 0x0f42, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, + 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, + 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, + 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, + 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, + 0x4001, 0x707c, 0x8007, 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, + 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d5d, 0x2001, 0x0000, + 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, + 0xa807, 0x0000, 0x0006, 0x080c, 0x106d, 0x009e, 0x0cb0, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x080c, 0x10e6, 0x090c, 0x0d7d, 0x00ee, + 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, + 0x8000, 0x00c9, 0x2071, 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, + 0x0158, 0x8210, 0x9906, 0x090c, 0x0d7d, 0x2300, 0x9202, 0x0120, + 0x1a0c, 0x0d7d, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, + 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1910, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, + 0x0128, 0x9906, 0x090c, 0x0d7d, 0xa000, 0x0cc8, 0x012e, 0x000e, + 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, + 0x8000, 0x70c0, 0x8001, 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, + 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, + 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, + 0x2071, 0x1800, 0x70c0, 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, + 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, + 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, + 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, + 0x8000, 0x70c2, 0x080c, 0x8420, 0x012e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, + 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, + 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, + 0x7000, 0x9005, 0x11a0, 0x2001, 0x0558, 0xa802, 0x2048, 0x2009, + 0x5600, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, + 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, + 0x188d, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, + 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, + 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, + 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, + 0x0000, 0x2071, 0x1800, 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, + 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, + 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0558, 0x0288, 0x9982, + 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188d, + 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, + 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x1a1f, 0x7007, 0x0000, 0x9006, + 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, + 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, + 0x0000, 0x2071, 0x1a1f, 0x701c, 0x9088, 0x1a29, 0x280a, 0x8000, + 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d7d, 0x7004, + 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, + 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a1f, + 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, + 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, + 0x0006, 0x7000, 0x0002, 0x115d, 0x12e0, 0x115b, 0x115b, 0x12d4, + 0x12d4, 0x12d4, 0x12d4, 0x080c, 0x0d7d, 0x701c, 0x7120, 0x9106, + 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, + 0x0000, 0x0005, 0x0096, 0x9180, 0x1a29, 0x2004, 0x700a, 0x2048, + 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, + 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, 0x700e, + 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, 0x0120, + 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, + 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, + 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020, + 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136, + 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, + 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, + 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, + 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e, + 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x1a1f, 0x2104, + 0xc095, 0x200a, 0x080c, 0x113a, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x1a1f, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0d76, + 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, + 0x00fe, 0x00ee, 0x001e, 0x0005, 0x114b, 0x11f3, 0x1227, 0x12ff, + 0x0d7d, 0x131a, 0x0d7d, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, + 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, + 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, + 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, + 0x7804, 0x7806, 0x080c, 0x1190, 0x0005, 0x7008, 0x0096, 0x2048, + 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x114b, 0x0005, + 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, + 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, + 0x7806, 0x080c, 0x11a5, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, + 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, + 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, + 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, + 0x2048, 0x2001, 0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, + 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, + 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, + 0x00de, 0x009e, 0x080c, 0x113a, 0x0005, 0x00de, 0x009e, 0x080c, + 0x113a, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, + 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, + 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6c73, 0xa09f, 0x0000, + 0xa0a3, 0x0000, 0x2848, 0x080c, 0x106d, 0x009e, 0x0005, 0x00a6, + 0xa0a0, 0x904d, 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0128, + 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, + 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, + 0xa07a, 0x2810, 0x080c, 0x111b, 0x00e8, 0xa97c, 0xa894, 0x0016, + 0x0006, 0x080c, 0x6c73, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, + 0x0128, 0x00c6, 0x2060, 0x080c, 0xaad8, 0x00ce, 0x7008, 0x2048, + 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x106d, 0x7007, 0x0000, + 0x080c, 0x113a, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, + 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, + 0x0096, 0x2001, 0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, + 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0x782b, 0x0020, + 0x0126, 0x2091, 0x8000, 0x782b, 0x0041, 0x7007, 0x0003, 0x7000, + 0xc084, 0x7002, 0x2900, 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, + 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x0096, 0x2001, 0x192e, + 0x204c, 0xaa7c, 0x009e, 0x080c, 0x8ae5, 0x2009, 0x188c, 0x2104, + 0x9084, 0xfffc, 0x200a, 0x080c, 0x8958, 0x7007, 0x0000, 0x080c, + 0x114b, 0x0005, 0x7007, 0x0000, 0x080c, 0x114b, 0x0005, 0x0126, + 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a69, 0x7003, 0x0000, + 0x78bf, 0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, + 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165, + 0x2003, 0x4198, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04e9, 0x0cd0, + 0x2001, 0x1a6a, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, + 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, + 0x0400, 0x7827, 0x0031, 0x782b, 0x1a78, 0x781f, 0xff00, 0x781b, + 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, + 0x2061, 0x1a78, 0x602f, 0x1ddc, 0x2001, 0x181a, 0x2004, 0x9082, + 0x1ddc, 0x6032, 0x603b, 0x1e31, 0x602b, 0x1ab8, 0x6007, 0x1a98, + 0x2061, 0x1a98, 0x60af, 0x193c, 0x2001, 0x1927, 0x2004, 0x60ba, + 0x783f, 0x3334, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, 0x7808, + 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc711, 0x0180, + 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, 0x9186, + 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xab77, 0x001e, + 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, + 0x190c, 0x0d76, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540, + 0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004, + 0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c, + 0x6a95, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e, + 0xb8d0, 0x9005, 0x190c, 0x6658, 0x00be, 0x6044, 0xd0fc, 0x190c, + 0xa7aa, 0x080c, 0xab01, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005, + 0x908a, 0x0024, 0x1a0c, 0x0d7d, 0x002b, 0x012e, 0x0005, 0x04b0, + 0x012e, 0x0005, 0x13fe, 0x1424, 0x1454, 0x1459, 0x145d, 0x1462, + 0x148a, 0x148e, 0x149c, 0x14a0, 0x13fe, 0x156b, 0x156f, 0x15d4, + 0x15db, 0x13fe, 0x15dc, 0x15dd, 0x15e8, 0x15ef, 0x13fe, 0x13fe, + 0x13fe, 0x13fe, 0x13fe, 0x13fe, 0x13fe, 0x1464, 0x13fe, 0x142c, + 0x1451, 0x1418, 0x13fe, 0x1438, 0x1402, 0x1400, 0x080c, 0x0d7d, + 0x080c, 0x0d76, 0x080c, 0x15fa, 0x2009, 0x1a77, 0x2104, 0x8000, + 0x200a, 0x080c, 0x7e7f, 0x080c, 0x1a9e, 0x0005, 0x6044, 0xd0fc, + 0x190c, 0xa7aa, 0x2009, 0x0055, 0x080c, 0xab77, 0x012e, 0x0005, + 0x080c, 0x15fa, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x2009, + 0x0055, 0x080c, 0xab77, 0x0005, 0x2009, 0x0048, 0x080c, 0x15fa, + 0x2060, 0x080c, 0xab77, 0x0005, 0x2009, 0x0054, 0x080c, 0x15fa, + 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x080c, 0xab77, 0x0005, + 0x080c, 0x15fa, 0x2060, 0x0056, 0x0066, 0x080c, 0x15fa, 0x2028, + 0x080c, 0x15fa, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418, + 0x2009, 0x0056, 0x080c, 0xab77, 0x004e, 0x003e, 0x006e, 0x005e, + 0x0005, 0x080c, 0x15fa, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, + 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x15fa, 0x080c, + 0x16be, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x15fa, 0x2060, 0x6014, + 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, + 0xab77, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, + 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, + 0x2004, 0xd0ec, 0x1110, 0x080c, 0x15ff, 0x2001, 0x0307, 0x2003, + 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x15fa, + 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, + 0x0048, 0x080c, 0xab77, 0x0005, 0x080c, 0x15fa, 0x080c, 0x0d7d, + 0x080c, 0x15fa, 0x080c, 0x1556, 0x7827, 0x0018, 0x79ac, 0xd1dc, + 0x0904, 0x1509, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, + 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, + 0x150f, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, 0x7827, + 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d7d, 0x2001, 0x020d, + 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x153b, 0x78ab, 0x0004, + 0x7803, 0x0001, 0x080c, 0x156f, 0x0005, 0x7827, 0x0018, 0xa001, + 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, 0x79ac, + 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, 0x00ee, + 0x080c, 0x1a9e, 0x080c, 0x1333, 0x7803, 0x0001, 0x0005, 0x7037, + 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, 0x0500, + 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, 0x0004, + 0x7803, 0x0001, 0x080c, 0x156f, 0x2001, 0x020d, 0x2003, 0x0020, + 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7d, 0x6014, + 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7e7f, + 0x080c, 0x1a9e, 0x080c, 0xc723, 0x0158, 0xa9ac, 0xa936, 0xa9b0, + 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, + 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, 0x080c, + 0xab77, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x6024, 0x190c, 0xcb18, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, + 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe573, 0xd5a4, + 0x1118, 0x080c, 0x15ff, 0x0005, 0x080c, 0x7e7f, 0x080c, 0x1a9e, + 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, + 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, + 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1670, 0x00fe, 0x007e, + 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, + 0x9184, 0x0004, 0x190c, 0x0d7d, 0xd184, 0x1189, 0xd19c, 0x0158, + 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, + 0x080c, 0x15ff, 0x0005, 0x81ff, 0x190c, 0x0d7d, 0x0005, 0xc184, + 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, 0x0200, + 0x080c, 0x16ab, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048, + 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, + 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c, + 0x1728, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18ad, 0x00fe, + 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005, + 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x15ff, + 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x1333, 0x7803, + 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, + 0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, 0x0053, + 0x080c, 0xab77, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, 0x00d1, + 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8e42, 0x0005, + 0x0089, 0x9005, 0x0118, 0x080c, 0x8a45, 0x0cd0, 0x0005, 0x2001, + 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, 0x080c, + 0x1670, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, + 0x1556, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, + 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, + 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, + 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, + 0x080c, 0x1662, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, + 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, + 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, + 0x7e7f, 0x080c, 0x1a9e, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, + 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, + 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, + 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015, + 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, 0x6802, + 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001, + 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, 0x0005, + 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016, + 0x0026, 0x00c6, 0x080c, 0x139a, 0x00ce, 0x002e, 0x001e, 0x000e, + 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, + 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, + 0x080c, 0x0d7d, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, + 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, + 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, + 0x2004, 0x080c, 0x0d7d, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, + 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c, 0xff00, + 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x0016, + 0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, + 0x0904, 0x171d, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, + 0x0904, 0x171d, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, + 0x00ce, 0x918e, 0x0039, 0x1904, 0x171d, 0x9c06, 0x15f0, 0x0126, + 0x2091, 0x2600, 0x080c, 0x7de7, 0x012e, 0x7358, 0x745c, 0x6014, + 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x190c, 0xcaf3, 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, + 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, + 0x080c, 0x1e51, 0x1190, 0x080c, 0x18fc, 0x2a00, 0xa816, 0x0130, + 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, + 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, + 0x0020, 0x001e, 0x00ee, 0x080c, 0x15ff, 0x0005, 0x080c, 0x0d7d, + 0x2cf0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, + 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, + 0x1e31, 0x2165, 0x0002, 0x1752, 0x17c0, 0x1752, 0x1752, 0x1756, + 0x17a1, 0x1752, 0x1776, 0x174b, 0x17b7, 0x1752, 0x1752, 0x175b, + 0x18ab, 0x178a, 0x1780, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, + 0x0904, 0x17b7, 0x9085, 0x0001, 0x0804, 0x18a3, 0xa87c, 0xd0ac, + 0x0dc8, 0x0804, 0x17c7, 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x1832, + 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42, + 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x900b, 0x2005, 0x9005, + 0x090c, 0x0d7d, 0x2004, 0xa8ae, 0x0804, 0x188b, 0xa87c, 0xd0bc, + 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x17c7, + 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, + 0x0804, 0x1832, 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c, + 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa164, 0xa91a, 0x91ec, + 0x000f, 0x9d80, 0x1e31, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1832, + 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x1752, 0xa804, 0x9045, 0x090c, + 0x0d7d, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1e31, 0x2065, + 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1832, 0x0080, 0xa87c, + 0xd0ac, 0x0904, 0x1752, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1832, + 0xa87c, 0xd0ac, 0x0904, 0x1752, 0x9006, 0xa842, 0xa83e, 0x2c05, + 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x17ea, + 0x17ea, 0x17ec, 0x17ea, 0x17ea, 0x17ea, 0x17f6, 0x17ea, 0x17ea, + 0x17ea, 0x1800, 0x17ea, 0x17ea, 0x17ea, 0x180a, 0x17ea, 0x17ea, + 0x17ea, 0x1814, 0x17ea, 0x17ea, 0x17ea, 0x181e, 0x17ea, 0x17ea, + 0x17ea, 0x1828, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86, 0x0024, + 0x0904, 0x1760, 0xa37c, 0xa280, 0x0804, 0x188b, 0xa584, 0xa488, + 0x9d86, 0x0024, 0x0904, 0x1760, 0xa38c, 0xa290, 0x0804, 0x188b, + 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x1760, 0xa39c, 0xa2a0, + 0x0804, 0x188b, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x1760, + 0xa3ac, 0xa2b0, 0x0804, 0x188b, 0xa5b4, 0xa4b8, 0x9d86, 0x0024, + 0x0904, 0x1760, 0xa3bc, 0xa2c0, 0x0804, 0x188b, 0xa5c4, 0xa4c8, + 0x9d86, 0x0024, 0x0904, 0x1760, 0xa3cc, 0xa2d0, 0x0804, 0x188b, + 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x1760, 0xa3dc, 0xa2e0, + 0x0804, 0x188b, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, + 0x001b, 0x0002, 0x1855, 0x1853, 0x1853, 0x1853, 0x1853, 0x1853, + 0x1860, 0x1853, 0x1853, 0x1853, 0x1853, 0x1853, 0x186b, 0x1853, + 0x1853, 0x1853, 0x1853, 0x1853, 0x1876, 0x1853, 0x1853, 0x1853, + 0x1853, 0x1853, 0x1881, 0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774, + 0xa678, 0x9d86, 0x002c, 0x0904, 0x1760, 0xa37c, 0xa280, 0x0458, + 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, 0x1760, + 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, + 0x002c, 0x0904, 0x1760, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8, + 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x1760, 0xa3c4, 0xa2c8, + 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904, + 0x1760, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, + 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, + 0x8109, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, + 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, + 0x2c00, 0xa812, 0x0c80, 0x0804, 0x1752, 0x2ff0, 0x0126, 0x2091, + 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1e2c, + 0xa813, 0x1e2c, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, + 0x090c, 0x0d7d, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, + 0x1a0c, 0x0d7d, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, + 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, + 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, + 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, + 0x0005, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa80e, 0xa064, 0xa81a, + 0x9084, 0x000f, 0x9080, 0x1e31, 0x2015, 0x82ff, 0x090c, 0x0d7d, + 0xaa12, 0x2205, 0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc, + 0x1190, 0x2d00, 0x0002, 0x1a26, 0x1953, 0x1953, 0x1a26, 0x1953, + 0x1a20, 0x1a26, 0x1953, 0x1a26, 0x19c3, 0x19c3, 0x1a26, 0x19c3, + 0x1a26, 0x1a1d, 0x19c3, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, + 0xac20, 0xdd9c, 0x0904, 0x1a28, 0x2c05, 0x908a, 0x0034, 0x1a0c, + 0x0d7d, 0x9082, 0x001b, 0x0002, 0x193f, 0x193d, 0x193d, 0x193d, + 0x193d, 0x193d, 0x1943, 0x193d, 0x193d, 0x193d, 0x193d, 0x193d, + 0x1947, 0x193d, 0x193d, 0x193d, 0x193d, 0x193d, 0x194b, 0x193d, + 0x193d, 0x193d, 0x193d, 0x193d, 0x194f, 0x080c, 0x0d7d, 0xa774, + 0xa678, 0x0804, 0x1a28, 0xa78c, 0xa690, 0x0804, 0x1a28, 0xa7a4, + 0xa6a8, 0x0804, 0x1a28, 0xa7bc, 0xa6c0, 0x0804, 0x1a28, 0xa7d4, + 0xa6d8, 0x0804, 0x1a28, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, + 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, + 0x197b, 0x197b, 0x197d, 0x197b, 0x197b, 0x197b, 0x1987, 0x197b, + 0x197b, 0x197b, 0x1991, 0x197b, 0x197b, 0x197b, 0x199b, 0x197b, + 0x197b, 0x197b, 0x19a5, 0x197b, 0x197b, 0x197b, 0x19af, 0x197b, + 0x197b, 0x197b, 0x19b9, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86, + 0x0004, 0x0904, 0x1a28, 0xa37c, 0xa280, 0x0804, 0x1a28, 0xa584, + 0xa488, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa38c, 0xa290, 0x0804, + 0x1a28, 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa39c, + 0xa2a0, 0x0804, 0x1a28, 0xa5a4, 0xa4a8, 0x9d86, 0x0004, 0x0904, + 0x1a28, 0xa3ac, 0xa2b0, 0x0804, 0x1a28, 0xa5b4, 0xa4b8, 0x9d86, + 0x0004, 0x0904, 0x1a28, 0xa3bc, 0xa2c0, 0x0804, 0x1a28, 0xa5c4, + 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa3cc, 0xa2d0, 0x0804, + 0x1a28, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa3dc, + 0xa2e0, 0x0804, 0x1a28, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, + 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, + 0x19eb, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19f5, 0x19e9, + 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19ff, 0x19e9, 0x19e9, 0x19e9, + 0x19e9, 0x19e9, 0x1a09, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19e9, + 0x1a13, 0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, + 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488, 0xa78c, + 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448, 0xa59c, + 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac, 0xa2b0, + 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c, 0x01c0, + 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, + 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, + 0x080c, 0x1e07, 0x1904, 0x18fc, 0x900e, 0x0050, 0x080c, 0x0d7d, + 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e07, + 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, + 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa974, + 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, + 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, + 0x0804, 0xab77, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, + 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003, + 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6, + 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x139a, 0x8631, + 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, + 0xd09c, 0x190c, 0x139a, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1b2b, + 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0d7d, + 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1b3a, + 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1b27, 0x7827, 0x0015, + 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, + 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x73e4, + 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, + 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081, + 0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x7485, 0x0005, 0x0479, + 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, + 0x00e6, 0x2071, 0x0200, 0x080c, 0x29c3, 0x2009, 0x003c, 0x080c, + 0x2184, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, + 0x1de0, 0x080c, 0x8420, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, + 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, + 0x080c, 0x1333, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, + 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, + 0x0000, 0x080c, 0x73e4, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, + 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, + 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, + 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, + 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, + 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c, + 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1670, 0x7930, + 0x0005, 0x2c08, 0x621c, 0x080c, 0x169d, 0x7930, 0x0005, 0x8001, + 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170, + 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1b98, 0x2001, + 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d7d, 0x781f, 0x0202, + 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c, + 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186, + 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001, + 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140, + 0x2001, 0x0030, 0x080c, 0x1b31, 0x9186, 0x0040, 0x190c, 0x0d7d, + 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160, + 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080, + 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c, + 0x9184, 0x0007, 0x090c, 0x0d7d, 0xa001, 0xa001, 0x781f, 0x0200, + 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, 0x19e5, + 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, + 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, 0x000f, + 0x0002, 0x1bc1, 0x1bc1, 0x1bc1, 0x1bc3, 0x1bc1, 0x1bc1, 0x1bc1, + 0x1bc1, 0x1bc1, 0x1bcb, 0x1bc1, 0x1bc7, 0x1bc1, 0x1bc1, 0x1bc1, + 0x1bc1, 0x080c, 0x0d7d, 0x9186, 0x0013, 0x0128, 0x0cd0, 0x9186, + 0x001b, 0x0108, 0x0cb0, 0xa87c, 0xd0b4, 0x0904, 0x1d3a, 0x9184, + 0x000f, 0x9080, 0x1e31, 0x2015, 0x2205, 0xab88, 0x2908, 0xa80a, + 0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842, 0xa83e, 0x012e, 0x0005, + 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa88c, + 0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a, 0xa83e, 0xa942, 0xa846, + 0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186, 0x001e, 0x0190, 0x2940, + 0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80, 0x1e31, 0x2065, 0x2c05, + 0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x012e, + 0x0005, 0xa804, 0x2040, 0x0c60, 0x2cf0, 0x0126, 0x2091, 0x2400, + 0x3e60, 0x6014, 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, 0x1d04, + 0xc1dd, 0xa97e, 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916, + 0xa964, 0xa91a, 0x9184, 0x000f, 0x9088, 0x1e31, 0x2145, 0x0002, + 0x1c38, 0x1c46, 0x1c38, 0x1c38, 0x1c38, 0x1c3a, 0x1c38, 0x1c38, + 0x1c9b, 0x1c9b, 0x1c38, 0x1c38, 0x1c38, 0x1c99, 0x1c38, 0x1c38, + 0x080c, 0x0d7d, 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, + 0x9080, 0x1e31, 0x2045, 0xd19c, 0x1904, 0x1c9b, 0x9036, 0x2638, + 0x2805, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, + 0x1c6b, 0x1c6b, 0x1c6d, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c73, 0x1c6b, + 0x1c6b, 0x1c6b, 0x1c79, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c7f, 0x1c6b, + 0x1c6b, 0x1c6b, 0x1c85, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c8b, 0x1c6b, + 0x1c6b, 0x1c6b, 0x1c91, 0x080c, 0x0d7d, 0xb574, 0xb478, 0xb37c, + 0xb280, 0x0804, 0x1ce0, 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804, + 0x1ce0, 0xb594, 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1ce0, 0xb5a4, + 0xb4a8, 0xb3ac, 0xb2b0, 0x0804, 0x1ce0, 0xb5b4, 0xb4b8, 0xb3bc, + 0xb2c0, 0x0804, 0x1ce0, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, + 0x1ce0, 0xb5d4, 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1ce0, 0x0804, + 0x1ce0, 0x080c, 0x0d7d, 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d7d, + 0x9082, 0x001b, 0x0002, 0x1cbe, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, + 0x1cbc, 0x1cc5, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1ccc, + 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cd3, 0x1cbc, 0x1cbc, + 0x1cbc, 0x1cbc, 0x1cbc, 0x1cda, 0x080c, 0x0d7d, 0xb56c, 0xb470, + 0xb774, 0xb678, 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, 0xb78c, + 0xb690, 0xb394, 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, + 0xb3ac, 0xb2b0, 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, + 0xb2c8, 0x0030, 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, + 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8109, + 0xa916, 0x1118, 0x9006, 0x012e, 0x0005, 0x8840, 0x2805, 0x9005, + 0x1168, 0xb004, 0x9005, 0x090c, 0x0d7d, 0x2050, 0xb164, 0xa91a, + 0x9184, 0x000f, 0x9080, 0x1e31, 0x2045, 0x2805, 0x2810, 0x2a08, + 0xa80a, 0xa90e, 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c, + 0x0d7d, 0xa93c, 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, 0x9206, + 0x0508, 0x2958, 0xab48, 0xac44, 0x2940, 0x080c, 0x1e51, 0x1998, + 0x2850, 0x2c40, 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, 0x2005, + 0xa80a, 0x2a00, 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, 0x3e60, + 0x6044, 0xc0a4, 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, 0xab16, + 0x1904, 0x1ced, 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046, + 0x0804, 0x1cea, 0x080c, 0x0d7d, 0x00f6, 0x00e6, 0x0096, 0x00c6, + 0x0026, 0x704c, 0x9c06, 0x190c, 0x0d7d, 0x2079, 0x0090, 0x2001, + 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7057, 0x0000, 0x6014, + 0x2048, 0x080c, 0xc723, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, + 0x9086, 0x0006, 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, + 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, + 0xa896, 0x704c, 0x2060, 0x00c6, 0x080c, 0xc32e, 0x080c, 0xa781, + 0x00ce, 0x704c, 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, 0x2184, + 0x080c, 0xa239, 0x2011, 0x0000, 0x080c, 0xa0b0, 0x002e, 0x00ce, + 0x009e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, 0x781c, + 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, + 0x9085, 0x0012, 0x7816, 0x2019, 0x1000, 0x8319, 0x090c, 0x0d7d, + 0x7820, 0xd0bc, 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, + 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, + 0x1984, 0x9085, 0x0012, 0x7816, 0x2079, 0x0090, 0x782b, 0x0008, + 0x7057, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e5, + 0x7054, 0x9086, 0x0000, 0x0904, 0x1e02, 0x2079, 0x0090, 0x2009, + 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, + 0x0003, 0x0188, 0x080c, 0xe5bc, 0x2001, 0x0133, 0x2004, 0x9005, + 0x090c, 0x0d7d, 0x0016, 0x2009, 0x0040, 0x080c, 0x2184, 0x001e, + 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, + 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2184, 0x782c, + 0xd0fc, 0x09a8, 0x080c, 0xa79d, 0x782c, 0xd0fc, 0x1de8, 0x080c, + 0xa781, 0x7054, 0x9086, 0x0000, 0x1950, 0x782b, 0x0004, 0x782c, + 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2184, 0x782b, 0x0002, + 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d7d, 0x8c60, + 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, + 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1e31, 0x2065, + 0x8cff, 0x090c, 0x0d7d, 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000, + 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, + 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, + 0x0000, 0x0000, 0x1e24, 0x1e20, 0x1e24, 0x1e24, 0x1e2e, 0x0000, + 0x1e24, 0x1e2b, 0x1e2b, 0x1e28, 0x1e2b, 0x1e2b, 0x0000, 0x1e2e, + 0x1e2b, 0x0000, 0x1e26, 0x1e26, 0x0000, 0x1e26, 0x1e2e, 0x0000, + 0x1e26, 0x1e2c, 0x1e2c, 0x1e2c, 0x0000, 0x1e2c, 0x0000, 0x1e2e, + 0x1e2c, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, + 0x0904, 0x2028, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1e31, + 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, + 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, + 0x0310, 0x0804, 0x2028, 0xa004, 0x9045, 0x0904, 0x2028, 0x0c18, + 0x2c05, 0x9005, 0x0904, 0x1f10, 0xdd9c, 0x1904, 0x1ecc, 0x908a, + 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1ea1, 0x1ea1, + 0x1ea3, 0x1ea1, 0x1ea1, 0x1ea1, 0x1ea9, 0x1ea1, 0x1ea1, 0x1ea1, + 0x1eaf, 0x1ea1, 0x1ea1, 0x1ea1, 0x1eb5, 0x1ea1, 0x1ea1, 0x1ea1, + 0x1ebb, 0x1ea1, 0x1ea1, 0x1ea1, 0x1ec1, 0x1ea1, 0x1ea1, 0x1ea1, + 0x1ec7, 0x080c, 0x0d7d, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, + 0x1f06, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1f06, 0xa09c, + 0x9422, 0xa0a0, 0x931b, 0x0804, 0x1f06, 0xa0ac, 0x9422, 0xa0b0, + 0x931b, 0x0804, 0x1f06, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, + 0x1f06, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1f06, 0xa0dc, + 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d7d, + 0x9082, 0x001b, 0x0002, 0x1eee, 0x1eec, 0x1eec, 0x1eec, 0x1eec, + 0x1eec, 0x1ef3, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1ef8, + 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1efd, 0x1eec, 0x1eec, + 0x1eec, 0x1eec, 0x1eec, 0x1f02, 0x080c, 0x0d7d, 0xa07c, 0x9422, + 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, + 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, + 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, + 0x9405, 0x0160, 0x8a51, 0x0904, 0x2028, 0x8c60, 0x0804, 0x1e78, + 0xa004, 0x9045, 0x0904, 0x2028, 0x0804, 0x1e5b, 0x8a51, 0x0904, + 0x2028, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, + 0x2028, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1e31, 0x2c05, 0x2060, + 0xa880, 0xc0fc, 0xa882, 0x0804, 0x201d, 0x2c05, 0x8422, 0x8420, + 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1fba, + 0x9082, 0x001b, 0x0002, 0x1f56, 0x1f56, 0x1f58, 0x1f56, 0x1f56, + 0x1f56, 0x1f66, 0x1f56, 0x1f56, 0x1f56, 0x1f74, 0x1f56, 0x1f56, + 0x1f56, 0x1f82, 0x1f56, 0x1f56, 0x1f56, 0x1f90, 0x1f56, 0x1f56, + 0x1f56, 0x1f9e, 0x1f56, 0x1f56, 0x1f56, 0x1fac, 0x080c, 0x0d7d, + 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d7d, + 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x2018, 0xa18c, 0x2400, + 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa084, 0x9420, + 0xa088, 0x9319, 0x0804, 0x2018, 0xa19c, 0x2400, 0x9122, 0xa1a0, + 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa094, 0x9420, 0xa098, 0x9319, + 0x0804, 0x2018, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, + 0x0a0c, 0x0d7d, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x2018, + 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, + 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x2018, 0xa1cc, 0x2400, + 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0c4, 0x9420, + 0xa0c8, 0x9319, 0x0804, 0x2018, 0xa1dc, 0x2400, 0x9122, 0xa1e0, + 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0d4, 0x9420, 0xa0d8, 0x9319, + 0x0804, 0x2018, 0x9082, 0x001b, 0x0002, 0x1fd8, 0x1fd6, 0x1fd6, + 0x1fd6, 0x1fd6, 0x1fd6, 0x1fe5, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, + 0x1fd6, 0x1ff2, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fff, + 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x200c, 0x080c, 0x0d7d, + 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d7d, + 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, + 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa084, 0x9420, 0xa088, + 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, + 0x0a0c, 0x0d7d, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, + 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0b4, + 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, + 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0cc, 0x9420, 0xa0d0, 0x9319, + 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, + 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, + 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6, 0x610c, + 0x0016, 0x9026, 0x2410, 0x6004, 0x9420, 0x9291, 0x0000, 0x2c04, + 0x9210, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, 0x000f, + 0x9405, 0x001e, 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, 0x0000, + 0x6004, 0x7812, 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, 0x0002, + 0x1db8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0d76, + 0xd094, 0x0110, 0x080c, 0x11d5, 0x0005, 0x0126, 0x2091, 0x2600, + 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, + 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, + 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, + 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, + 0x190c, 0x2181, 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, + 0x9084, 0x000e, 0x0002, 0x20a3, 0x209b, 0x7de7, 0x209b, 0x209d, + 0x209d, 0x209d, 0x209d, 0x7dcd, 0x209b, 0x209f, 0x209b, 0x209d, + 0x209b, 0x209d, 0x209b, 0x080c, 0x0d7d, 0x0031, 0x0020, 0x080c, + 0x7dcd, 0x080c, 0x7de7, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, + 0xe5bc, 0x7930, 0x9184, 0x0003, 0x01f0, 0x080c, 0xa781, 0x2001, + 0x19f8, 0x2004, 0x9005, 0x0180, 0x2001, 0x0133, 0x2004, 0x9005, + 0x090c, 0x0d7d, 0x00c6, 0x2001, 0x19f8, 0x2064, 0x080c, 0xa79d, + 0x080c, 0xc32e, 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, 0x2184, + 0x080c, 0xa79d, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, + 0x0003, 0x0160, 0x080c, 0x73e4, 0x1138, 0x080c, 0x76e8, 0x080c, + 0x5f41, 0x080c, 0x7315, 0x0010, 0x080c, 0x5dfc, 0x080c, 0x7e75, + 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, + 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a69, 0x080c, + 0x1a9e, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, + 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001, + 0x1977, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, + 0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, + 0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, + 0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, + 0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, + 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, + 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, + 0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, + 0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, + 0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, + 0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, + 0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, + 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, + 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, + 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, + 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, + 0x0005, 0x7938, 0x080c, 0x0d76, 0x00f6, 0x2079, 0x0200, 0x7902, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, + 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, + 0x080c, 0x29bd, 0x080c, 0x28ea, 0x080c, 0x2a2e, 0x9006, 0x080c, + 0x2919, 0x9006, 0x080c, 0x28fc, 0x20a9, 0x0012, 0x1d04, 0x21ae, + 0x2091, 0x6000, 0x1f04, 0x21ae, 0x602f, 0x0100, 0x602f, 0x0000, + 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, 0x080c, + 0x2a0b, 0x080c, 0x2608, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, + 0x2618, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, + 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x349f, + 0x00c6, 0x2061, 0x0140, 0x608b, 0x000b, 0x608f, 0x10b8, 0x6093, + 0x0000, 0x6097, 0x0198, 0x00ce, 0x6004, 0x9085, 0x8000, 0x6006, + 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x21ec, + 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405, + 0x60bf, 0x0014, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, + 0x601f, 0x001e, 0x600f, 0x006b, 0x602b, 0x402c, 0x012e, 0x0005, + 0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, + 0x0000, 0x00fe, 0x0005, 0x2001, 0x1835, 0x2003, 0x0000, 0x2001, + 0x1834, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x6124, 0x6028, 0x910c, 0x0066, 0x2031, 0x1837, + 0x2634, 0x96b4, 0x0028, 0x006e, 0x1138, 0x6020, 0xd1bc, 0x0120, + 0xd0bc, 0x1168, 0xd0b4, 0x1198, 0x9184, 0x5e2c, 0x1118, 0x9184, + 0x0007, 0x00aa, 0x9195, 0x0004, 0x9284, 0x0007, 0x0082, 0x0016, + 0x2001, 0x0387, 0x200c, 0xd1a4, 0x001e, 0x0d70, 0x0c98, 0x0016, + 0x2001, 0x0387, 0x200c, 0xd1b4, 0x001e, 0x0d30, 0x0c58, 0x225a, + 0x2257, 0x2257, 0x2257, 0x2259, 0x2257, 0x2257, 0x2257, 0x080c, + 0x0d7d, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, + 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x24d4, 0xd1f4, + 0x190c, 0x0d76, 0x080c, 0x73e4, 0x0904, 0x22b7, 0x080c, 0xce35, + 0x1120, 0x7000, 0x9086, 0x0003, 0x0580, 0x6024, 0x9084, 0x1800, + 0x0560, 0x080c, 0x7407, 0x0118, 0x080c, 0x73f5, 0x1530, 0x2011, + 0x0020, 0x080c, 0x2a0b, 0x6043, 0x0000, 0x080c, 0xce35, 0x0168, + 0x080c, 0x7407, 0x1150, 0x2001, 0x19a5, 0x2003, 0x0001, 0x6027, + 0x1800, 0x080c, 0x725a, 0x0804, 0x24d7, 0x70a4, 0x9005, 0x1150, + 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x743b, 0x00de, + 0x1904, 0x24d7, 0x080c, 0x76f2, 0x0428, 0x080c, 0x7407, 0x1590, + 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x76f2, 0x080c, + 0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x0804, 0x24d4, 0xd1ac, + 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, + 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110, 0x080c, 0x75c9, + 0x0804, 0x24d4, 0x080c, 0x76ed, 0x0048, 0x2001, 0x197d, 0x2003, + 0x0002, 0x0020, 0x080c, 0x7526, 0x0804, 0x24d4, 0x080c, 0x766c, + 0x0804, 0x24d4, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x2539, + 0xd2b4, 0x1904, 0x254b, 0x0000, 0xd1ac, 0x0904, 0x23e1, 0x0036, + 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x73e4, 0x11d0, 0x2011, + 0x0020, 0x080c, 0x2a0b, 0x0006, 0x0026, 0x0036, 0x080c, 0x73fe, + 0x1158, 0x080c, 0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x003e, + 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, + 0x73b8, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, + 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, + 0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, + 0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, + 0x8016, 0x080c, 0x4a38, 0x003e, 0x080c, 0xce2e, 0x1904, 0x23b8, + 0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, + 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x3328, + 0x0128, 0xc18d, 0x7132, 0x080c, 0x6962, 0x1510, 0x6240, 0x9294, + 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, + 0x7030, 0xd08c, 0x0904, 0x23b8, 0x7038, 0xd08c, 0x1140, 0x2001, + 0x180c, 0x200c, 0xd1ac, 0x1904, 0x23b8, 0xc1ad, 0x2102, 0x0036, + 0x73d8, 0x2011, 0x8013, 0x080c, 0x4a38, 0x003e, 0x0804, 0x23b8, + 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, + 0x23b8, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, + 0x4a38, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, + 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, + 0x87b6, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe101, + 0x00ce, 0x9484, 0x00ff, 0x9080, 0x3334, 0x200d, 0x918c, 0xff00, + 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xe191, 0x001e, + 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x316a, 0x001e, + 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x652d, + 0x1110, 0x080c, 0x5f5b, 0x8108, 0x1f04, 0x23ae, 0x00be, 0x015e, + 0x00ce, 0x004e, 0x080c, 0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d, + 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, + 0x1170, 0xd19c, 0x11b0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, + 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, + 0x0001, 0x2001, 0x1826, 0x2003, 0x0000, 0x2011, 0x0020, 0x080c, + 0x2a0b, 0xd194, 0x0904, 0x24d4, 0x0016, 0x080c, 0xa781, 0x6220, + 0xd2b4, 0x0904, 0x246f, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x2011, + 0x0004, 0x080c, 0x2a0b, 0x00f6, 0x2019, 0x19f1, 0x2304, 0x907d, + 0x0904, 0x243c, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, + 0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, + 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, + 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x29e1, 0x2001, 0x001e, + 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x2998, 0x6904, 0xd1dc, + 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, + 0x29d1, 0x080c, 0x94a8, 0x080c, 0xa79d, 0x7814, 0x2048, 0xa867, + 0x0103, 0x2f60, 0x080c, 0xaad8, 0x009e, 0x00ee, 0x00ce, 0x00de, + 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, + 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x00de, 0x00c6, + 0x2061, 0x19e5, 0x6034, 0x080c, 0xce35, 0x0120, 0x909a, 0x0003, + 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce, + 0x080c, 0x9ce1, 0x0804, 0x24d1, 0x2061, 0x0100, 0x62c0, 0x080c, + 0xa6b7, 0x2019, 0x19f1, 0x2304, 0x9065, 0x0130, 0x6003, 0x0001, + 0x2009, 0x0027, 0x080c, 0xab77, 0x00ce, 0x0804, 0x24d1, 0xd2bc, + 0x0904, 0x24b4, 0x080c, 0x85cd, 0x2011, 0x0004, 0x080c, 0x2a0b, + 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, + 0x29e1, 0x00de, 0x00c6, 0x2061, 0x19e5, 0x6050, 0x080c, 0xce35, + 0x0120, 0x909a, 0x0003, 0x1668, 0x0018, 0x909a, 0x00c8, 0x1648, + 0x8000, 0x6052, 0x604c, 0x00ce, 0x9005, 0x05d8, 0x2009, 0x07d0, + 0x080c, 0x85c5, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, + 0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2a1a, 0x0450, 0x9080, + 0x0008, 0x2004, 0x9086, 0x0009, 0x0d98, 0x2009, 0x1984, 0x2011, + 0x0016, 0x080c, 0x2a1a, 0x00e8, 0x2011, 0x0004, 0x080c, 0x2a0b, + 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x003e, 0x2019, + 0x19f8, 0x2304, 0x9065, 0x0160, 0x2009, 0x004f, 0x6020, 0x9086, + 0x0009, 0x1110, 0x2009, 0x004f, 0x6003, 0x0003, 0x080c, 0xab77, + 0x00ce, 0x080c, 0xa79d, 0x001e, 0xd19c, 0x0904, 0x2532, 0x7038, + 0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011, 0x0008, 0x080c, 0x2a0b, + 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x1f04, 0x24ff, 0x1d04, + 0x24e7, 0x080c, 0x85f4, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079, + 0x0100, 0x080c, 0x2948, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052, + 0x2011, 0x0008, 0x080c, 0x2a0b, 0x015e, 0x001e, 0x0498, 0x015e, + 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0xa781, 0x080c, + 0xaa49, 0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b, 0x080c, + 0xe5b6, 0x080c, 0x5600, 0xd0fc, 0x1138, 0x080c, 0xce2e, 0x1120, + 0x9085, 0x0001, 0x080c, 0x742b, 0x9006, 0x080c, 0x29d1, 0x2009, + 0x0002, 0x080c, 0x29bd, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, + 0x080c, 0x0eb4, 0x00ee, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x080c, + 0x0bc3, 0x001e, 0x918c, 0xffd0, 0x2110, 0x080c, 0x2a0b, 0x00ae, + 0x0005, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4, 0x001e, 0x0904, + 0x22e4, 0x0016, 0x2009, 0x2545, 0x00c0, 0x2001, 0x0387, 0x2003, + 0x1000, 0x001e, 0x0c38, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4, + 0x001e, 0x0904, 0x22e4, 0x0016, 0x2009, 0x2557, 0x0030, 0x2001, + 0x0387, 0x2003, 0x4000, 0x001e, 0x08a8, 0x6028, 0xc0bc, 0x602a, + 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, 0xffff, 0x6043, + 0x0001, 0x080c, 0x29b7, 0x2011, 0x0080, 0x080c, 0x2a0b, 0x6017, + 0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, + 0x70d2, 0x9116, 0x0904, 0x25c7, 0x81ff, 0x01a0, 0x2009, 0x0000, + 0x080c, 0x29bd, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, + 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, + 0x4a38, 0x0468, 0x2001, 0x19a6, 0x200c, 0x81ff, 0x1140, 0x2001, + 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, + 0x2011, 0x8012, 0x080c, 0x4a38, 0x080c, 0x0eb4, 0x080c, 0x5600, + 0xd0fc, 0x11a8, 0x080c, 0xce2e, 0x1190, 0x00c6, 0x080c, 0x2663, + 0x080c, 0xa781, 0x080c, 0x9f4a, 0x080c, 0xa79d, 0x2061, 0x0100, + 0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x316a, 0x00ce, 0x012e, + 0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, + 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1837, + 0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f, 0x2204, + 0x9106, 0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00, 0x9584, + 0xff00, 0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294, 0x00ff, + 0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x80cc, 0x0048, + 0x9584, 0x00ff, 0x9080, 0x3334, 0x200d, 0x918c, 0xff00, 0x810f, + 0x9006, 0x0005, 0x9080, 0x3334, 0x200d, 0x918c, 0x00ff, 0x0005, + 0x00d6, 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9, + 0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2613, 0x00de, 0x0005, + 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818, 0x2102, + 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, + 0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xe5ca, 0x2005, + 0x6856, 0x8211, 0x1f04, 0x2628, 0x002e, 0x00de, 0x000e, 0x0005, + 0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, + 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, + 0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, + 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, + 0x680e, 0x1f04, 0x2658, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, + 0x00de, 0x015e, 0x0005, 0x080c, 0x55fc, 0xd0c4, 0x0150, 0xd0a4, + 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xe191, + 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, + 0xd0dc, 0x0904, 0x26cf, 0x080c, 0x2938, 0x0660, 0x9084, 0x0700, + 0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, + 0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, + 0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, + 0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, + 0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, + 0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, + 0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x9030, + 0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, + 0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x73e4, 0x1118, + 0x2009, 0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, + 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, + 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, + 0x080c, 0x0d76, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, + 0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, + 0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, + 0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, + 0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, + 0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, + 0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, + 0x2001, 0x198e, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7d, 0x0033, + 0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x272d, 0x274b, + 0x276f, 0x2771, 0x279a, 0x279c, 0x279e, 0x2001, 0x0001, 0x080c, + 0x2574, 0x080c, 0x2982, 0x2001, 0x1990, 0x2003, 0x0000, 0x7828, + 0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2954, + 0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x279f, + 0x080c, 0x85d2, 0x0005, 0x2009, 0x1993, 0x200b, 0x0000, 0x2001, + 0x1998, 0x2003, 0x0036, 0x2001, 0x1997, 0x2003, 0x002a, 0x2001, + 0x1990, 0x2003, 0x0001, 0x9006, 0x080c, 0x28fc, 0x2001, 0xffff, + 0x20a9, 0x0009, 0x080c, 0x2954, 0x2001, 0x198e, 0x2003, 0x0006, + 0x2009, 0x001e, 0x2011, 0x279f, 0x080c, 0x85d2, 0x0005, 0x080c, + 0x0d7d, 0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1990, 0x2003, + 0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x28fc, 0x2001, 0x1994, 0x2003, + 0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2954, 0x2001, + 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x279f, 0x080c, + 0x85d2, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x0005, 0x0006, + 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, + 0x2079, 0x0100, 0x2001, 0x1990, 0x2004, 0x908a, 0x0007, 0x1a0c, + 0x0d7d, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, + 0x000e, 0x0005, 0x27c1, 0x27e1, 0x2821, 0x2851, 0x2875, 0x2885, + 0x2887, 0x080c, 0x2948, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, + 0x2009, 0x1996, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, + 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x198e, 0x2003, + 0x0001, 0x0030, 0x080c, 0x28ab, 0x2001, 0xffff, 0x080c, 0x273c, + 0x0005, 0x080c, 0x2889, 0x05e0, 0x2009, 0x1997, 0x2104, 0x8001, + 0x200a, 0x080c, 0x2948, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, + 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1996, + 0x2104, 0xc085, 0x200a, 0x2009, 0x1993, 0x2104, 0x8000, 0x200a, + 0x9086, 0x0005, 0x0118, 0x080c, 0x2891, 0x00c0, 0x200b, 0x0000, + 0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, + 0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x1990, 0x2003, 0x0002, + 0x0028, 0x2001, 0x198e, 0x2003, 0x0003, 0x0010, 0x080c, 0x275e, + 0x0005, 0x080c, 0x2889, 0x0560, 0x2009, 0x1997, 0x2104, 0x8001, + 0x200a, 0x080c, 0x2948, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, + 0x2001, 0x198e, 0x2003, 0x0003, 0x2001, 0x198f, 0x2003, 0x0000, + 0x00b8, 0x2009, 0x1997, 0x2104, 0x9005, 0x1118, 0x080c, 0x28ce, + 0x0010, 0x080c, 0x289e, 0x080c, 0x2891, 0x2009, 0x1993, 0x200b, + 0x0000, 0x2001, 0x1990, 0x2003, 0x0001, 0x080c, 0x275e, 0x0000, + 0x0005, 0x04b9, 0x0508, 0x080c, 0x2948, 0x11b8, 0x7850, 0x9084, + 0xefff, 0x7852, 0x2009, 0x1994, 0x2104, 0x8000, 0x200a, 0x9086, + 0x0007, 0x0108, 0x0078, 0x2001, 0x1999, 0x2003, 0x000a, 0x2009, + 0x1996, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1990, + 0x2003, 0x0004, 0x080c, 0x2789, 0x0005, 0x0099, 0x0168, 0x080c, + 0x2948, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x2775, + 0x0018, 0x0079, 0x080c, 0x2789, 0x0005, 0x080c, 0x0d7d, 0x080c, + 0x0d7d, 0x2009, 0x1998, 0x2104, 0x8001, 0x200a, 0x090c, 0x28ea, + 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x2919, 0x0005, 0x7a38, 0x9294, + 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x080c, 0x28fc, 0x0005, 0x2009, 0x1993, 0x2104, 0x8000, 0x200a, + 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, + 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x2919, 0x0005, 0x0086, 0x2001, + 0x1996, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0d7d, 0x2009, 0x1995, + 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, + 0x1120, 0x080c, 0x0d7d, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, + 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x198e, 0x20a9, 0x0009, + 0x2003, 0x0000, 0x8000, 0x1f04, 0x28f0, 0x2001, 0x1995, 0x2003, + 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, + 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, + 0x2009, 0x199b, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, + 0x9085, 0x0006, 0x783a, 0x2009, 0x199c, 0x210c, 0x795a, 0x00fe, + 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, + 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x7850, 0x9084, 0xfff0, + 0x7852, 0x0060, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, + 0x7850, 0x9084, 0xfff0, 0x9085, 0x0000, 0x7852, 0x00fe, 0x0005, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, + 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x29b7, 0xd09c, 0x1110, + 0x1f04, 0x294b, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, + 0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007, + 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186, + 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118, + 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x2974, 0x080c, 0x85f4, + 0x1f04, 0x2974, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, + 0x012e, 0x0005, 0x080c, 0x2a72, 0x0005, 0x0006, 0x0156, 0x00f6, + 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, 0x7854, + 0xd08c, 0x1110, 0x1f04, 0x298f, 0x00fe, 0x015e, 0x000e, 0x0005, + 0x1d04, 0x2998, 0x080c, 0x85f4, 0x1f04, 0x2998, 0x0005, 0x0006, + 0x2001, 0x199a, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, + 0x2001, 0x199a, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, + 0x2001, 0x199a, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x19a6, + 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, + 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, + 0x0005, 0x0016, 0x0026, 0x080c, 0x73fe, 0x0108, 0xc0bc, 0x2009, + 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, + 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, + 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, + 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, + 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, + 0x1128, 0x080c, 0x73fe, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, + 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0101, + 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, 0x0100, + 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, 0x7844, + 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, 0x7a16, + 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, 0x9085, + 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x2998, 0x6050, 0x9085, + 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, 0x2998, + 0x6054, 0xd0bc, 0x090c, 0x0d7d, 0x20a9, 0x0005, 0x080c, 0x2998, + 0x6054, 0xd0ac, 0x090c, 0x0d7d, 0x2009, 0x19ad, 0x9084, 0x7e00, + 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a, 0x2009, + 0x199b, 0x2011, 0x199c, 0x6358, 0x939c, 0x38df, 0x2320, 0x939d, + 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e, 0x002e, + 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, 0xc0cd, + 0x6052, 0x00ce, 0x000e, 0x0005, 0x2f78, 0x2f78, 0x2b7c, 0x2b7c, + 0x2b88, 0x2b88, 0x2b94, 0x2b94, 0x2ba2, 0x2ba2, 0x2bae, 0x2bae, + 0x2bbc, 0x2bbc, 0x2bca, 0x2bca, 0x2bdc, 0x2bdc, 0x2be8, 0x2be8, + 0x2bf6, 0x2bf6, 0x2c14, 0x2c14, 0x2c34, 0x2c34, 0x2c04, 0x2c04, + 0x2c24, 0x2c24, 0x2c42, 0x2c42, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2c54, 0x2c54, 0x2c60, 0x2c60, + 0x2c6e, 0x2c6e, 0x2c7c, 0x2c7c, 0x2c8c, 0x2c8c, 0x2c9a, 0x2c9a, + 0x2caa, 0x2caa, 0x2cba, 0x2cba, 0x2ccc, 0x2ccc, 0x2cda, 0x2cda, + 0x2cea, 0x2cea, 0x2d0c, 0x2d0c, 0x2d30, 0x2d30, 0x2cfa, 0x2cfa, + 0x2d1e, 0x2d1e, 0x2d40, 0x2d40, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2d54, 0x2d54, 0x2d60, 0x2d60, + 0x2d6e, 0x2d6e, 0x2d7c, 0x2d7c, 0x2d8c, 0x2d8c, 0x2d9a, 0x2d9a, + 0x2daa, 0x2daa, 0x2dba, 0x2dba, 0x2dcc, 0x2dcc, 0x2dda, 0x2dda, + 0x2dea, 0x2dea, 0x2dfa, 0x2dfa, 0x2e0c, 0x2e0c, 0x2e1c, 0x2e1c, + 0x2e2e, 0x2e2e, 0x2e40, 0x2e40, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2e54, 0x2e54, 0x2e62, 0x2e62, + 0x2e72, 0x2e72, 0x2e82, 0x2e82, 0x2e94, 0x2e94, 0x2ea4, 0x2ea4, + 0x2eb6, 0x2eb6, 0x2ec8, 0x2ec8, 0x2edc, 0x2edc, 0x2eec, 0x2eec, + 0x2efe, 0x2efe, 0x2f10, 0x2f10, 0x2f24, 0x2f24, 0x2f35, 0x2f35, + 0x2f48, 0x2f48, 0x2f5b, 0x2f5b, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, + 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x2052, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x207c, + 0x0804, 0x2f70, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x139a, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, + 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, + 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x139a, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, + 0x080c, 0x2052, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, + 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x221c, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, + 0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, + 0x080c, 0x2052, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0xa7e7, 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, + 0x080c, 0xa7e7, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, + 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x207c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x139a, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, + 0x080c, 0xa7e7, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, + 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, + 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x080c, 0x221c, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, + 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x207c, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, + 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x139a, 0x0804, 0x2f70, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, + 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, + 0x080c, 0x139a, 0x080c, 0x207c, 0x04d8, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, + 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, 0x080c, 0x207c, 0x0440, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x139a, 0x080c, 0xa7e7, + 0x080c, 0x207c, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, + 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, 0x080c, 0x207c, 0x0000, + 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, + 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6928, + 0x1904, 0x3086, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, + 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x3086, 0x080c, + 0x308b, 0x0804, 0x3086, 0xd2cc, 0x1904, 0x3086, 0x080c, 0x73e4, + 0x1120, 0x70af, 0xffff, 0x0804, 0x3086, 0xd294, 0x0120, 0x70af, + 0xffff, 0x0804, 0x3086, 0x080c, 0x3323, 0x0160, 0x080c, 0xce35, + 0x0128, 0x2001, 0x1818, 0x203c, 0x0804, 0x3013, 0x70af, 0xffff, + 0x0804, 0x3086, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, + 0x3013, 0xd28c, 0x1904, 0x3013, 0x0036, 0x73ac, 0x938e, 0xffff, + 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c, + 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, + 0x970e, 0x05b8, 0x908e, 0x0000, 0x05a0, 0x908e, 0x00ff, 0x1150, + 0x7230, 0xd284, 0x1598, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, + 0x003e, 0x0488, 0x900e, 0x080c, 0x25cf, 0x080c, 0x64cc, 0x1520, + 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, + 0x080c, 0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af, 0x0000, 0x080c, + 0x696a, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, + 0x080c, 0x30a4, 0x0148, 0x0028, 0x080c, 0x31f8, 0x080c, 0x30d0, + 0x0118, 0x8318, 0x0804, 0x2fc3, 0x73ae, 0x0010, 0x70af, 0xffff, + 0x003e, 0x0804, 0x3086, 0x9780, 0x3334, 0x203d, 0x97bc, 0xff00, + 0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, + 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, + 0x70af, 0xffff, 0x0804, 0x3086, 0x2700, 0x0156, 0x0016, 0x9106, + 0x0904, 0x307b, 0xc484, 0x080c, 0x652d, 0x0148, 0x080c, 0xce35, + 0x1904, 0x307b, 0x080c, 0x64cc, 0x1904, 0x3083, 0x0008, 0xc485, + 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, + 0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af, 0x0000, 0x080c, 0x696a, + 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, + 0xd28c, 0x0180, 0x080c, 0x696a, 0x9082, 0x0006, 0x02e0, 0xd484, + 0x1118, 0x080c, 0x64f1, 0x0028, 0x080c, 0x3291, 0x01a0, 0x080c, + 0x32bc, 0x0088, 0x080c, 0x31f8, 0x080c, 0xce35, 0x1160, 0x080c, + 0x30d0, 0x0188, 0x0040, 0x080c, 0xce35, 0x1118, 0x080c, 0x3291, + 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x302c, + 0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, + 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, + 0x007e, 0x080c, 0x64cc, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, + 0x080c, 0x31f8, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, + 0xcb83, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, + 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xab4a, + 0x01d0, 0x2b00, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x9006, + 0x080c, 0x6469, 0x2001, 0x0000, 0x080c, 0x647d, 0x0126, 0x2091, + 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, + 0xab77, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, + 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, + 0x00ff, 0xb842, 0x080c, 0xab4a, 0x0548, 0x2b00, 0x6012, 0xb800, + 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, + 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x31ab, 0x080c, 0xcbb0, + 0x6023, 0x0001, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002, 0x080c, + 0x647d, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, + 0x2009, 0x0002, 0x080c, 0xab77, 0x9085, 0x0001, 0x00ce, 0x00de, + 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, + 0x080c, 0x64cc, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, + 0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, + 0x0076, 0x00d6, 0x00c6, 0x080c, 0xaa82, 0x01d0, 0x2b00, 0x6012, + 0x080c, 0xcbb0, 0x6023, 0x0001, 0x9006, 0x080c, 0x6469, 0x2001, + 0x0002, 0x080c, 0x647d, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, + 0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xab77, 0x9085, 0x0001, + 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, + 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x64cc, 0x11b8, 0xb813, + 0x00ff, 0xb817, 0xfffd, 0xb8d7, 0x0004, 0x080c, 0xaa82, 0x0170, + 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xcbb0, + 0x2009, 0x0022, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00de, + 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, + 0x21f0, 0x9036, 0x080c, 0xa781, 0x1110, 0x2031, 0x0001, 0x0066, + 0x080c, 0x927a, 0x080c, 0x91f0, 0x080c, 0xa6d7, 0x080c, 0xba04, + 0x006e, 0x86ff, 0x0110, 0x080c, 0xa79d, 0x3e08, 0x2130, 0x81ff, + 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, + 0x0016, 0x080c, 0x652d, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, + 0xd0bc, 0x1110, 0x080c, 0x5f5b, 0x001e, 0x8108, 0x1f04, 0x3190, + 0x9686, 0x0001, 0x190c, 0x32f7, 0x00be, 0x002e, 0x003e, 0x006e, + 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, + 0x00b6, 0x9016, 0x080c, 0xa781, 0x1110, 0x2011, 0x0001, 0x0026, + 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x926f, + 0x0076, 0x2039, 0x0000, 0x080c, 0x9141, 0x2c08, 0x080c, 0xdeb3, + 0x007e, 0x001e, 0x002e, 0x82ff, 0x0110, 0x080c, 0xa79d, 0xba10, + 0xbb14, 0x080c, 0x5f5b, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, + 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, + 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, + 0x70a8, 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, + 0x2071, 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, + 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, + 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0xa781, + 0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001, + 0x0088, 0x080c, 0x55fc, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, + 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xe191, 0x004e, 0x20a9, + 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x326c, 0x928e, + 0x007f, 0x0904, 0x326c, 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, + 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x198c, 0x0006, + 0x2003, 0x0001, 0x080c, 0x327e, 0x000e, 0x2003, 0x0000, 0x00b6, + 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6934, 0x00ce, 0x00be, + 0x2019, 0x0029, 0x080c, 0x926f, 0x0076, 0x2039, 0x0000, 0x080c, + 0x9141, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, + 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, + 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, + 0x080c, 0xdeb3, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x3222, + 0x002e, 0x82ff, 0x0110, 0x080c, 0xa79d, 0x015e, 0x001e, 0x002e, + 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, + 0x0016, 0x080c, 0x55fc, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, + 0x2220, 0x2009, 0x0029, 0x080c, 0xe191, 0x001e, 0x002e, 0x004e, + 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, + 0x080c, 0x6962, 0x11d0, 0x2100, 0x080c, 0x2602, 0x81ff, 0x01b8, + 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0xd384, 0x0120, + 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, + 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x0066, 0x9036, 0x080c, 0xa781, 0x1110, 0x2031, 0x0001, + 0x0066, 0x0036, 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, + 0x0110, 0x080c, 0xa79d, 0x006e, 0x9180, 0x1000, 0x2004, 0x9065, + 0x0158, 0x0016, 0x00c6, 0x2061, 0x1b30, 0x001e, 0x6112, 0x080c, + 0x31ab, 0x001e, 0x080c, 0x64f1, 0x012e, 0x00ce, 0x001e, 0x0005, + 0x0016, 0x0026, 0x2110, 0x080c, 0xa275, 0x080c, 0xe4f3, 0x002e, + 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, 0x00c6, + 0x00b6, 0x080c, 0x73e4, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, + 0x0782, 0x080c, 0x73e4, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, + 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, + 0xd0bc, 0x090c, 0x64f1, 0x8108, 0x1f04, 0x3308, 0x2061, 0x1800, + 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, 0x60b3, 0x0000, + 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, 0xd0bc, 0x0005, + 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011, 0x1867, + 0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, + 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, + 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, + 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, + 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, + 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, + 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, + 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, + 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, + 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, + 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, + 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, + 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, + 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, + 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, + 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, + 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, + 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, + 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, + 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, + 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, + 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, + 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, + 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, + 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, + 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, + 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, + 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e, 0x7003, 0x0002, + 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, + 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, 0x080c, 0x1054, + 0x090c, 0x0d7d, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, + 0x080c, 0x1054, 0x090c, 0x0d7d, 0x2900, 0x706e, 0xa867, 0x0002, + 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002, 0x3463, + 0x3464, 0x3477, 0x348b, 0x0005, 0x1004, 0x3474, 0x0e04, 0x3474, + 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, + 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, + 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, + 0x9086, 0x0200, 0x0904, 0x355f, 0x0005, 0x7018, 0x2048, 0x2061, + 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, + 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, + 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, + 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61d0, + 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x355c, 0x61d0, 0x0804, + 0x34f1, 0x3533, 0x356b, 0x3575, 0x3579, 0x3583, 0x3589, 0x358d, + 0x359d, 0x35a0, 0x35aa, 0x35af, 0x35b4, 0x35bf, 0x35ca, 0x35d9, + 0x35e8, 0x35f6, 0x360d, 0x3628, 0x355c, 0x36d1, 0x370f, 0x37b4, + 0x37c5, 0x37e8, 0x355c, 0x355c, 0x355c, 0x3820, 0x3840, 0x3849, + 0x3875, 0x387b, 0x355c, 0x38c1, 0x355c, 0x355c, 0x355c, 0x355c, + 0x355c, 0x38cc, 0x38d5, 0x38dd, 0x38df, 0x355c, 0x355c, 0x355c, + 0x355c, 0x355c, 0x355c, 0x390f, 0x355c, 0x355c, 0x355c, 0x355c, + 0x355c, 0x392c, 0x3990, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c, + 0x355c, 0x0002, 0x39ba, 0x39bd, 0x3a1c, 0x3a35, 0x3a65, 0x3d07, + 0x355c, 0x51cd, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c, + 0x355c, 0x355c, 0x35aa, 0x35af, 0x4206, 0x5620, 0x4224, 0x525c, + 0x52ad, 0x53b0, 0x355c, 0x5412, 0x544e, 0x547f, 0x558b, 0x54ac, + 0x550b, 0x355c, 0x4228, 0x43dd, 0x43f3, 0x4418, 0x447d, 0x44f1, + 0x4511, 0x4588, 0x4599, 0x45b1, 0x45b4, 0x45d9, 0x4649, 0x46b3, + 0x46bb, 0x47ed, 0x4962, 0x4996, 0x4bfa, 0x355c, 0x4c18, 0x4cc4, + 0x4da6, 0x4e00, 0x355c, 0x4eb5, 0x355c, 0x4f1b, 0x4f36, 0x46bb, + 0x517c, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4a14, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x353d, 0x0010, 0x012e, 0x0cc0, 0x7c36, + 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, + 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11cd, 0x7007, 0x0001, 0x2091, 0x5000, + 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, + 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, + 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, + 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4a21, 0x7883, 0x0004, 0x7884, + 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, + 0x7990, 0x0804, 0x4a24, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, + 0x3533, 0x7984, 0x2114, 0x0804, 0x3533, 0x20e1, 0x0000, 0x2099, + 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, + 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x3533, 0x7884, 0x2060, 0x04d8, + 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x0015, 0x789b, 0x0137, + 0x0804, 0x3533, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, + 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x3568, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x356f, 0x79a0, + 0x9182, 0x0040, 0x0210, 0x0804, 0x3568, 0x2138, 0x7d98, 0x7c9c, + 0x0804, 0x357d, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3568, + 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, + 0x3533, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, + 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x3533, 0x0804, 0x3562, + 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3568, 0x21e0, 0x20a9, + 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x3533, 0x2069, 0x1847, + 0x7884, 0x7990, 0x911a, 0x1a04, 0x3568, 0x8019, 0x0904, 0x3568, + 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, + 0x685e, 0x080c, 0x7719, 0x0804, 0x3533, 0x2069, 0x1847, 0x7884, + 0x7994, 0x911a, 0x1a04, 0x3568, 0x8019, 0x0904, 0x3568, 0x684e, + 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, + 0x0126, 0x2091, 0x8000, 0x080c, 0x69d4, 0x012e, 0x0804, 0x3533, + 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, + 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, + 0x18a6, 0x4101, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3565, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, + 0x4a21, 0x701f, 0x364c, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, + 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, + 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x3565, + 0x810f, 0x918c, 0x00ff, 0x0904, 0x3565, 0x7112, 0x7010, 0x8001, + 0x0560, 0x7012, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3565, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, + 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, + 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21, 0x701f, + 0x368a, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, + 0x9096, 0x000a, 0x1904, 0x3565, 0x0888, 0x7014, 0x2048, 0xa868, + 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, + 0xc2fd, 0xaa7a, 0x080c, 0x60ae, 0x0150, 0x0126, 0x2091, 0x8000, + 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x63c7, 0x1128, 0x7007, + 0x0003, 0x701f, 0x36b6, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091, + 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, 0x400a, + 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, + 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, + 0x4a24, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, + 0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, + 0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, + 0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, + 0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x0180, 0x2001, 0x1a20, 0x2004, 0x9005, 0x0128, + 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, + 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, + 0x1904, 0x3565, 0x7984, 0x080c, 0x652d, 0x1904, 0x3568, 0x7e98, + 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x3568, 0x7c88, 0x7d8c, + 0x080c, 0x675f, 0x080c, 0x66f0, 0x1518, 0x2061, 0x1ddc, 0x0126, + 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, + 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, + 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a04, 0x3565, + 0x0c30, 0x080c, 0xc32e, 0x012e, 0x0904, 0x3565, 0x0804, 0x3533, + 0x900e, 0x2001, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091, 0x8000, + 0x080c, 0xca20, 0x080c, 0x6c7f, 0x012e, 0x0804, 0x3533, 0x00a6, + 0x2950, 0xb198, 0x080c, 0x652d, 0x1904, 0x37a1, 0xb6a4, 0x9684, + 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x675f, + 0x080c, 0x670a, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, + 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, + 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c, + 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, + 0x080c, 0xc32e, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, + 0x2001, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091, 0x8000, 0x080c, + 0xca20, 0x080c, 0x6c73, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, + 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, + 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, + 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x3565, 0x080c, + 0x49ef, 0x0904, 0x3568, 0x080c, 0x65f4, 0x0904, 0x3565, 0x080c, + 0x6765, 0x0904, 0x3565, 0x0804, 0x4508, 0x81ff, 0x1904, 0x3565, + 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x67f3, 0x0904, 0x3565, + 0x2019, 0x0005, 0x79a8, 0x080c, 0x6780, 0x0904, 0x3565, 0x7888, + 0x908a, 0x1000, 0x1a04, 0x3568, 0x8003, 0x800b, 0x810b, 0x9108, + 0x080c, 0x8519, 0x7984, 0xd184, 0x1904, 0x3533, 0x0804, 0x4508, + 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, + 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, + 0x652d, 0x11d8, 0x080c, 0x67f3, 0x1128, 0x2009, 0x0002, 0x62c0, + 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6780, 0x1118, + 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, + 0x800b, 0x810b, 0x9108, 0x080c, 0x8519, 0x8529, 0x1ae0, 0x012e, + 0x0804, 0x3533, 0x012e, 0x0804, 0x3565, 0x012e, 0x0804, 0x3568, + 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, 0x65f4, 0x0904, 0x3565, + 0x080c, 0xa781, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, + 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x900e, 0x080c, 0xdeb3, + 0x007e, 0x00ce, 0x080c, 0xa79d, 0x080c, 0x675f, 0x0804, 0x3533, + 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, 0x675f, 0x2208, 0x0804, + 0x3533, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1910, 0x6810, + 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, + 0x19e5, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, + 0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x3533, 0x00f6, + 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, + 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, 0x6910, + 0x62bc, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3565, 0x0126, 0x2091, 0x8000, 0x080c, 0x5610, 0x0128, 0x2009, + 0x0007, 0x012e, 0x0804, 0x3565, 0x012e, 0x615c, 0x9190, 0x3334, + 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, 0x67dc, + 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, + 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, + 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, + 0x080c, 0x73e4, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, + 0x2009, 0x0005, 0x0804, 0x3565, 0x9036, 0x7e9a, 0x7f9e, 0x0804, + 0x3533, 0x614c, 0x6250, 0x2019, 0x1984, 0x231c, 0x2001, 0x1985, + 0x2004, 0x789a, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x6138, + 0x623c, 0x6340, 0x012e, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904, + 0x3568, 0xba44, 0xbb38, 0x0804, 0x3533, 0x080c, 0x0d7d, 0x080c, + 0x4a0b, 0x2110, 0x0904, 0x3568, 0xb804, 0x908c, 0x00ff, 0x918e, + 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, + 0x1904, 0x3565, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, + 0x9066, 0x080c, 0xa781, 0x080c, 0xa275, 0x080c, 0x926f, 0x0076, + 0x903e, 0x080c, 0x9141, 0x900e, 0x080c, 0xdeb3, 0x007e, 0x00ce, + 0x080c, 0xa79d, 0xb807, 0x0407, 0x012e, 0x0804, 0x3533, 0x614c, + 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, + 0x9305, 0x6816, 0x788c, 0x2069, 0x1984, 0x2d1c, 0x206a, 0x7e98, + 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1985, 0x2d04, + 0x266a, 0x789a, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x6138, + 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ecc, 0xd0c4, 0x01a8, + 0x00d6, 0x78a8, 0x2009, 0x199b, 0x200a, 0x78ac, 0x2011, 0x199c, + 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, + 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, + 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, + 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, + 0x190c, 0x0ee7, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, + 0x0001, 0x090c, 0x4206, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, + 0x0114, 0x2012, 0x012e, 0x0804, 0x3533, 0x00f6, 0x2079, 0x1800, + 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, + 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, + 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, + 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x3568, 0x788c, + 0x902d, 0x0904, 0x3568, 0x900e, 0x080c, 0x652d, 0x1120, 0xba44, + 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, + 0x080c, 0x4a0b, 0x0904, 0x3568, 0x7888, 0x900d, 0x0904, 0x3568, + 0x788c, 0x9005, 0x0904, 0x3568, 0xba44, 0xb946, 0xbb38, 0xb83a, + 0x0804, 0x3533, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, + 0x5610, 0x1904, 0x3565, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, + 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00, 0x0088, + 0x9182, 0x007f, 0x16e0, 0x9188, 0x3334, 0x210d, 0x918c, 0x00ff, + 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, + 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xaa82, 0x000e, + 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x64d2, 0x2b08, + 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x49d8, 0x01d0, + 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, + 0x701f, 0x3a15, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0xab77, + 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3565, 0x00ce, + 0x0804, 0x3568, 0x080c, 0xaad8, 0x0cb0, 0xa830, 0x9086, 0x0100, + 0x0904, 0x3565, 0x0804, 0x3533, 0x2061, 0x1a6d, 0x0126, 0x2091, + 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, + 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, + 0x0804, 0x3533, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3565, + 0x080c, 0x73e4, 0x0904, 0x3565, 0x0126, 0x2091, 0x8000, 0x6254, + 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2638, 0x080c, + 0x5820, 0x012e, 0x0804, 0x3533, 0x012e, 0x0804, 0x3568, 0x0006, + 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a7, 0x2070, 0x2061, 0x1847, + 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x9030, 0x7206, + 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3535, 0x7884, + 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, + 0x012e, 0x0804, 0x3568, 0x2001, 0x002a, 0x2004, 0x2069, 0x1847, + 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x3568, 0x012e, 0x0804, + 0x3565, 0x080c, 0xaa42, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3ae0, + 0x00c6, 0x080c, 0x49d8, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, + 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, + 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, + 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, + 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, + 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x3c6a, + 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, + 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x080c, 0x4a21, 0x701f, 0x3ba7, 0x7023, 0x0001, 0x012e, 0x0005, + 0x080c, 0xa781, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a4f, 0x2001, 0x199d, 0x2003, + 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, + 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3cd9, 0x080c, + 0x3c98, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e5, 0x2079, + 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, + 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, + 0x2011, 0x0001, 0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe, 0x080c, + 0x3f77, 0x080c, 0x3ea4, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, + 0x0140, 0x1db8, 0x080c, 0x40be, 0x00f6, 0x2079, 0x0300, 0x78bc, + 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, + 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, + 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, + 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x1820, + 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, + 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3eae, 0x080c, 0x3c93, 0x0058, + 0x080c, 0x3c93, 0x080c, 0x3fe2, 0x080c, 0x3f6d, 0x2001, 0x020b, + 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, + 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, + 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, + 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x131f, 0x2009, + 0x0028, 0x080c, 0x2184, 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, + 0xa79d, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x008e, 0x004e, 0x2001, 0x199d, 0x2004, 0x9005, 0x1118, 0x012e, + 0x0804, 0x3533, 0x012e, 0x2021, 0x400c, 0x0804, 0x3535, 0x0016, + 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, + 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, + 0x9005, 0x0904, 0x3c03, 0x2048, 0x1f04, 0x3bb7, 0x7068, 0x2040, + 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, + 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, + 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4a21, 0x701f, + 0x3ba7, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, + 0x0006, 0x080c, 0x0fb8, 0x000e, 0x080c, 0x4a24, 0x701f, 0x3ba7, + 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, + 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, + 0x1118, 0x701f, 0x3c68, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, + 0xa86a, 0x2009, 0x007f, 0x080c, 0x64cc, 0x0110, 0x9006, 0x0030, + 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xcbff, 0x015e, 0x00de, + 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, + 0x0904, 0x3565, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, + 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3c3a, 0x7007, 0x0003, + 0x0804, 0x3bf8, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, + 0x3535, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, + 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, + 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fb8, 0x000e, + 0x080c, 0x4a24, 0x007e, 0x701f, 0x3ba7, 0x7023, 0x0001, 0x0005, + 0x0804, 0x3533, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, + 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, + 0x080c, 0x49d8, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, + 0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, + 0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, + 0x00fe, 0x000e, 0x0005, 0x2001, 0x199d, 0x2003, 0x0001, 0x0005, + 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19a8, 0x2004, + 0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004, 0x60ce, 0x6104, + 0xc1ac, 0x6106, 0x080c, 0x49d8, 0xa813, 0x0019, 0xa817, 0x0001, + 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, + 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a7, + 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2184, 0x2001, 0x002a, + 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, + 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, + 0x0005, 0x00e6, 0x080c, 0x49d8, 0x2940, 0xa013, 0x0019, 0xa017, + 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, + 0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, + 0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, + 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, + 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, + 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x29af, 0x1130, 0x9006, + 0x080c, 0x2919, 0x9006, 0x080c, 0x28fc, 0x7884, 0x9084, 0x0007, + 0x0002, 0x3d24, 0x3d2d, 0x3d36, 0x3d21, 0x3d21, 0x3d21, 0x3d21, + 0x3d21, 0x012e, 0x0804, 0x3568, 0x2009, 0x0114, 0x2104, 0x9085, + 0x0800, 0x200a, 0x080c, 0x3ef8, 0x00c0, 0x2009, 0x0114, 0x2104, + 0x9085, 0x4000, 0x200a, 0x080c, 0x3ef8, 0x0078, 0x080c, 0x73e4, + 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x3565, 0x81ff, 0x0128, + 0x012e, 0x2021, 0x400b, 0x0804, 0x3535, 0x080c, 0xa781, 0x0086, + 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, + 0x3a4f, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, + 0x2068, 0x2060, 0x2058, 0x080c, 0x4199, 0x080c, 0x40e9, 0x903e, + 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e5, 0x2079, + 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, + 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x404a, + 0x080c, 0x29b7, 0x080c, 0x29b7, 0x080c, 0x29b7, 0x080c, 0x29b7, + 0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3f77, 0x2009, + 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3eae, 0x2001, 0x0004, 0x200c, + 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x3565, + 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, + 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, + 0x200c, 0x81ff, 0x0150, 0x080c, 0x3f55, 0x2d00, 0x9c05, 0x9b05, + 0x0120, 0x080c, 0x3eae, 0x0804, 0x3e57, 0x080c, 0x40be, 0x080c, + 0x3fe2, 0x080c, 0x3f38, 0x080c, 0x3f6d, 0x00f6, 0x2079, 0x0100, + 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3eae, 0x00fe, 0x0804, + 0x3e57, 0x00fe, 0x080c, 0x3ea4, 0x1150, 0x8d68, 0x2001, 0x0032, + 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3eae, 0x0080, 0x87ff, + 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, + 0x2001, 0x1a69, 0x2004, 0x9086, 0x0000, 0x1904, 0x3da7, 0x2001, + 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, + 0x0904, 0x3e57, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, + 0x1904, 0x3e57, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, + 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a69, 0x2003, 0x0003, 0x2001, + 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, + 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2184, + 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, + 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, + 0x2001, 0x0203, 0x2004, 0x1f04, 0x3e2e, 0x00ce, 0x0030, 0xa817, + 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, + 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, + 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, + 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3d61, 0x001e, + 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, + 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, + 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x131f, 0x7884, 0x9084, + 0x0003, 0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x2184, + 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, + 0x2a72, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, + 0x6043, 0x0010, 0x080c, 0xa79d, 0x00ce, 0x2d08, 0x2c10, 0x2b18, + 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, + 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x3533, 0x012e, + 0x2021, 0x400c, 0x0804, 0x3535, 0x9085, 0x0001, 0x1d04, 0x3ead, + 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, + 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a69, + 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x2184, 0x2001, + 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, + 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e5, 0x7054, 0x9086, 0x0000, + 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, + 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2184, 0x782c, + 0xd0fc, 0x0d88, 0x080c, 0x40be, 0x7054, 0x9086, 0x0000, 0x1d58, + 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, + 0x2184, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, + 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932, 0x7936, + 0x080c, 0x2618, 0x080c, 0x2a2e, 0x080c, 0x2a72, 0x784b, 0xf7f7, + 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, + 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, + 0x7852, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x7843, 0x0040, 0x2019, + 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, + 0x29d1, 0x2011, 0x0020, 0x080c, 0x2a0b, 0x7843, 0x0000, 0x9006, + 0x080c, 0x29d1, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x00fe, 0x0005, + 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a69, 0x2079, + 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, + 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, + 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, + 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, + 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, + 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, + 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, + 0x2071, 0x0100, 0x2001, 0x19a8, 0x2004, 0x70e2, 0x080c, 0x3c89, + 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c, 0x918c, + 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, + 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1818, + 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, + 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, + 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, + 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, + 0x1984, 0x9085, 0x0092, 0x7016, 0x080c, 0x40be, 0x00f6, 0x2071, + 0x1a69, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, + 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, + 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, + 0x0011, 0x080c, 0x404a, 0x2011, 0x0001, 0x080c, 0x404a, 0x00fe, + 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a69, 0x2079, 0x0320, + 0x792c, 0xd1fc, 0x0904, 0x4047, 0x782b, 0x0002, 0x9026, 0xd19c, + 0x1904, 0x4043, 0x7000, 0x0002, 0x4047, 0x3ff8, 0x4028, 0x4043, + 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, + 0x080c, 0x404a, 0x0904, 0x4047, 0x080c, 0x404a, 0x0804, 0x4047, + 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, + 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, + 0x0de8, 0x080c, 0x3f55, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, + 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, + 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, + 0x3fec, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, + 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, + 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, + 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, + 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, + 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0d7d, 0x9398, 0x4078, 0x231d, + 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, + 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, + 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, + 0x40b5, 0x40ac, 0x40a3, 0x409a, 0x4091, 0x4088, 0x407f, 0xa964, + 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, + 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, + 0x0005, 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, + 0x7916, 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, + 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, + 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, + 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, + 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, + 0x0086, 0x2071, 0x19e5, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, + 0x782b, 0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x40e5, 0x40d1, + 0x40dc, 0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, + 0x404a, 0x190c, 0x404a, 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, + 0x1d38, 0x2011, 0x0001, 0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, + 0x19a8, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004, + 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, + 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, + 0x080c, 0x49d8, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, + 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, + 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, + 0x4161, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x49d8, 0xa813, + 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, + 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, + 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, + 0x0090, 0x2079, 0x0100, 0x2001, 0x19a7, 0x2004, 0x6036, 0x2009, + 0x0040, 0x080c, 0x2184, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, + 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, + 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, + 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, + 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, + 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, + 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, + 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, + 0x0086, 0x080c, 0x49d8, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, + 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, + 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, + 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x49d8, + 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, + 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, + 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4161, + 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x49d8, 0x2940, 0xa013, + 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, + 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, + 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, + 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, + 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a69, + 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, + 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, + 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, + 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, + 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000, 0x9006, + 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, + 0x0108, 0x0005, 0x0804, 0x3533, 0x7d98, 0x7c9c, 0x0804, 0x362a, + 0x080c, 0x73e4, 0x190c, 0x5f06, 0x6040, 0x9084, 0x0020, 0x09b1, + 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x080c, 0x4a21, 0x701f, 0x4240, 0x0005, + 0x080c, 0x560b, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, + 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x3568, 0x6804, + 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3568, 0xd094, 0x00c6, 0x2061, + 0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, + 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, + 0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, + 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, + 0x1a04, 0x3568, 0x9288, 0x3334, 0x210d, 0x918c, 0x00ff, 0x6166, + 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3568, 0x605e, + 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, + 0x2009, 0x19af, 0x9080, 0x270b, 0x2005, 0x200a, 0x2008, 0x2001, + 0x0018, 0x080c, 0xa772, 0x2009, 0x0390, 0x200b, 0x0400, 0x000e, + 0x2009, 0x19b0, 0x9080, 0x270f, 0x2005, 0x200a, 0x6808, 0x908a, + 0x0100, 0x0a04, 0x3568, 0x908a, 0x0841, 0x1a04, 0x3568, 0x9084, + 0x0007, 0x1904, 0x3568, 0x680c, 0x9005, 0x0904, 0x3568, 0x6810, + 0x9005, 0x0904, 0x3568, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3568, + 0x8001, 0x0904, 0x3568, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3568, + 0x8001, 0x0904, 0x3568, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, + 0x9084, 0x00ff, 0x6052, 0x080c, 0x7719, 0x080c, 0x69a0, 0x080c, + 0x69d4, 0x6808, 0x602a, 0x080c, 0x20f6, 0x2009, 0x0170, 0x200b, + 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, + 0x2672, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x43cb, 0x6818, + 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, + 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, + 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, + 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, + 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b1, 0x20e9, 0x0001, 0x4001, + 0x20a9, 0x0004, 0x20a1, 0x19cb, 0x20e9, 0x0001, 0x4001, 0x080c, + 0x869b, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, + 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7cda, 0x6878, + 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, + 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, + 0x0001, 0x1f04, 0x4329, 0x00ce, 0x00c6, 0x2061, 0x199a, 0x6a88, + 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, 0x0000, + 0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x0001, 0x080c, 0x28fc, + 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, 0x080c, + 0x2919, 0x9006, 0x080c, 0x28fc, 0x0028, 0x9286, 0x8000, 0x1d30, + 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0eb4, 0x00ee, + 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, 0x0180, + 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, 0x9294, + 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294, + 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, 0x928e, + 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x26e7, 0x2001, 0x196d, + 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, + 0x602f, 0x0000, 0x00ce, 0x080c, 0x73e4, 0x0128, 0x080c, 0x4f0f, + 0x0110, 0x080c, 0x2638, 0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001, + 0x2009, 0x43b3, 0x00e0, 0x080c, 0x73e4, 0x1168, 0x2011, 0x725a, + 0x080c, 0x850b, 0x2011, 0x724d, 0x080c, 0x8614, 0x080c, 0x76ed, + 0x080c, 0x7315, 0x0040, 0x080c, 0x5dfc, 0x0028, 0x6003, 0x0004, + 0x2009, 0x43cb, 0x0020, 0x080c, 0x68d5, 0x0804, 0x3533, 0x2001, + 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, + 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, 0x0000, + 0x0904, 0x3565, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, 0x6846, + 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, + 0x0001, 0x0804, 0x4a24, 0x9006, 0x080c, 0x2638, 0x81ff, 0x1904, + 0x3565, 0x080c, 0x73e4, 0x11b0, 0x080c, 0x76e8, 0x080c, 0x5f41, + 0x080c, 0x3328, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xce35, + 0x0130, 0x080c, 0x7407, 0x1118, 0x080c, 0x73b8, 0x0038, 0x080c, + 0x7315, 0x0020, 0x080c, 0x5f06, 0x080c, 0x5dfc, 0x0804, 0x3533, + 0x81ff, 0x1904, 0x3565, 0x080c, 0x73e4, 0x1110, 0x0804, 0x3565, + 0x6194, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009, + 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, + 0x2039, 0x0001, 0x080c, 0x4a24, 0x701f, 0x3531, 0x012e, 0x0005, + 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, 0x20e9, + 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x655c, 0x9588, + 0x3334, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, + 0x2100, 0x9506, 0x01a8, 0x080c, 0x652d, 0x1190, 0xb814, 0x821c, + 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, + 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, + 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, + 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, 0x2099, + 0x1d80, 0x080c, 0x5e91, 0x0804, 0x4425, 0x080c, 0x4a0b, 0x0904, + 0x3568, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, + 0x080c, 0x55fc, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, + 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x3323, + 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, + 0xc8eb, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003, + 0x701f, 0x44b3, 0x0005, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x20a9, + 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, + 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, + 0x0fb8, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, + 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb8, + 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, + 0x4a24, 0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568, + 0x080c, 0x676e, 0x0904, 0x3565, 0x0058, 0xa878, 0x9005, 0x0120, + 0x2009, 0x0004, 0x0804, 0x3565, 0xa974, 0xaa94, 0x0804, 0x3533, + 0x080c, 0x5604, 0x0904, 0x3533, 0x701f, 0x44fd, 0x7007, 0x0003, + 0x0005, 0x81ff, 0x1904, 0x3565, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x3568, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x696a, 0x0120, + 0x080c, 0x6972, 0x1904, 0x3568, 0x080c, 0x67f3, 0x0904, 0x3565, + 0x2019, 0x0004, 0x900e, 0x080c, 0x6780, 0x0904, 0x3565, 0x7984, + 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, + 0x4a09, 0x01e0, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x11b0, + 0x080c, 0x67f3, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019, + 0x0004, 0x080c, 0x6780, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, + 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, + 0x080c, 0x5604, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, + 0x2029, 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506, 0x0110, + 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x652d, 0x1138, + 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8519, 0x0005, + 0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, + 0x65f4, 0x0904, 0x3565, 0x080c, 0x6777, 0x0904, 0x3565, 0x0804, + 0x4508, 0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568, + 0x080c, 0x696a, 0x0120, 0x080c, 0x6972, 0x1904, 0x3568, 0x080c, + 0x65f4, 0x0904, 0x3565, 0x080c, 0x6765, 0x0904, 0x3565, 0x0804, + 0x4508, 0x6100, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904, 0x3568, + 0x080c, 0x5610, 0x1904, 0x3565, 0x79a8, 0xd184, 0x1158, 0xb834, + 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28, + 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a, + 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804, + 0x3533, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, + 0x1a04, 0x3565, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x8685, + 0x2001, 0xfff4, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x2039, 0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, + 0x0804, 0x4a24, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, + 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, + 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x462f, 0x0005, 0x81ff, + 0x1904, 0x3565, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x696a, + 0x1904, 0x3565, 0x00c6, 0x080c, 0x49d8, 0x00ce, 0x0904, 0x3565, + 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc891, + 0x0904, 0x3565, 0x7007, 0x0003, 0x701f, 0x4633, 0x0005, 0x080c, + 0x4206, 0x0804, 0x3533, 0xa830, 0x9086, 0x0100, 0x0904, 0x3565, + 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, + 0x4a24, 0x9006, 0x080c, 0x2638, 0x78a8, 0x9084, 0x00ff, 0x9086, + 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3565, 0x080c, 0x73e4, 0x0110, + 0x080c, 0x5f06, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3568, 0x7984, + 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3568, 0x2100, + 0x080c, 0x2602, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, + 0x1a01, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, + 0x0000, 0x080c, 0x73e4, 0x1158, 0x080c, 0x76e8, 0x080c, 0x5f41, + 0x9085, 0x0001, 0x080c, 0x742b, 0x080c, 0x7315, 0x00f0, 0x080c, + 0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d, 0x2061, 0x0100, 0x2001, + 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, + 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b, 0x0000, 0x2009, + 0x002d, 0x2011, 0x5e2c, 0x080c, 0x85d2, 0x7984, 0x080c, 0x73e4, + 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x456b, 0x012e, 0x00ce, + 0x002e, 0x0804, 0x3533, 0x7984, 0x080c, 0x64cc, 0x2b08, 0x1904, + 0x3568, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3565, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, + 0x0804, 0x3565, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3565, 0x7984, 0x9192, 0x0021, 0x1a04, 0x3568, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, + 0x080c, 0x4a21, 0x701f, 0x46eb, 0x7880, 0x9086, 0x006e, 0x0110, + 0x701f, 0x50c1, 0x0005, 0x2009, 0x0080, 0x080c, 0x652d, 0x1118, + 0x080c, 0x696a, 0x0120, 0x2021, 0x400a, 0x0804, 0x3535, 0x00d6, + 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, + 0x90be, 0x0100, 0x0904, 0x4784, 0x90be, 0x0112, 0x0904, 0x4784, + 0x90be, 0x0113, 0x0904, 0x4784, 0x90be, 0x0114, 0x0904, 0x4784, + 0x90be, 0x0117, 0x0904, 0x4784, 0x90be, 0x011a, 0x0904, 0x4784, + 0x90be, 0x011c, 0x0904, 0x4784, 0x90be, 0x0121, 0x0904, 0x476b, + 0x90be, 0x0131, 0x0904, 0x476b, 0x90be, 0x0171, 0x0904, 0x4784, + 0x90be, 0x0173, 0x0904, 0x4784, 0x90be, 0x01a1, 0x1128, 0xa894, + 0x8007, 0xa896, 0x0804, 0x478f, 0x90be, 0x0212, 0x0904, 0x4778, + 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217, + 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, + 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, + 0x0804, 0x3568, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, + 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x47cd, 0x7028, 0x9080, + 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, + 0x080c, 0x47cd, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, + 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x47da, 0x00b8, + 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, + 0x20a9, 0x0001, 0x080c, 0x47da, 0x7028, 0x9080, 0x000c, 0x2098, + 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, + 0x080c, 0x49d8, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, + 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, + 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, + 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, + 0x2048, 0x080c, 0xc8ac, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, + 0x7007, 0x0003, 0x701f, 0x47c4, 0x0005, 0x00ce, 0x009e, 0x00de, + 0x2009, 0x0002, 0x0804, 0x3565, 0xa820, 0x9086, 0x8001, 0x1904, + 0x3533, 0x2009, 0x0004, 0x0804, 0x3565, 0x0016, 0x0026, 0x3510, + 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, + 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, + 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, + 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x3565, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, + 0x2009, 0x0005, 0x0804, 0x3565, 0x7984, 0x78a8, 0x2040, 0x080c, + 0xaa42, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3568, 0x9186, 0x00ff, + 0x0904, 0x3568, 0x9182, 0x0800, 0x1a04, 0x3568, 0x7a8c, 0x7b88, + 0x607c, 0x9306, 0x1140, 0x6080, 0x924e, 0x0904, 0x3568, 0x99cc, + 0xff00, 0x0904, 0x3568, 0x0126, 0x2091, 0x8000, 0x080c, 0x48eb, + 0x0904, 0x486b, 0x0086, 0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6, + 0x0006, 0x0036, 0xb818, 0xbb1c, 0x9305, 0xbb20, 0x9305, 0xbb24, + 0x9305, 0xbb28, 0x9305, 0xbb2c, 0x9305, 0xbb30, 0x9305, 0xbb34, + 0x9305, 0x003e, 0x0570, 0xd88c, 0x1128, 0x080c, 0x696a, 0x0110, + 0xc89d, 0x0438, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, + 0x1110, 0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, + 0x0060, 0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, + 0x0020, 0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, + 0x3535, 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, + 0x00e6, 0x2c70, 0x080c, 0xab4a, 0x0904, 0x48c0, 0x2b00, 0x6012, + 0x080c, 0xcbb0, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x49d8, + 0x00ce, 0x2b70, 0x1158, 0x080c, 0xaad8, 0x00ee, 0x00ce, 0x00be, + 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x3565, 0x900e, 0xa966, + 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, + 0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, 0x31ab, 0x6023, 0x0001, + 0x9006, 0x080c, 0x6469, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, + 0x647d, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x647d, + 0x2009, 0x0002, 0x080c, 0xab77, 0x78a8, 0xd094, 0x0138, 0x00ee, + 0x7024, 0x00e6, 0x2058, 0xb8d4, 0xc08d, 0xb8d6, 0x9085, 0x0001, + 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, + 0x0804, 0x3565, 0x7007, 0x0003, 0x701f, 0x48cf, 0x0005, 0xa830, + 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, + 0x9294, 0x00ff, 0x0804, 0x5559, 0x900e, 0xa868, 0xd0f4, 0x1904, + 0x3533, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, + 0xc18d, 0x0804, 0x3533, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, + 0x493a, 0x902e, 0x080c, 0xaa42, 0x0130, 0x9026, 0x20a9, 0x0800, + 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, + 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, 0x494b, + 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1558, 0x0030, + 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x1520, 0x93ce, 0x00ff, + 0x1508, 0xc5fd, 0x0480, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11e8, + 0xbe14, 0x2600, 0x9206, 0x11c8, 0x2400, 0x9106, 0x1180, 0xd884, + 0x0598, 0xd894, 0x1588, 0x080c, 0x690a, 0x1570, 0x2001, 0x4000, + 0x0460, 0x080c, 0x696a, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, + 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158, + 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xaa42, 0x1900, + 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4901, 0x85ff, + 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, + 0x64cc, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de, + 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, + 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x3568, + 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x3568, 0x2010, + 0x2918, 0x080c, 0x3145, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, + 0x7007, 0x0003, 0x701f, 0x498d, 0x0005, 0xa830, 0x9086, 0x0100, + 0x1904, 0x3533, 0x2009, 0x0004, 0x0804, 0x3565, 0x7984, 0x080c, + 0xaa42, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3568, 0x9186, 0x00ff, + 0x0904, 0x3568, 0x9182, 0x0800, 0x1a04, 0x3568, 0x2001, 0x9000, + 0x080c, 0x55b4, 0x1904, 0x3565, 0x0804, 0x3533, 0xa998, 0x080c, + 0xaa42, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, + 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x55b4, 0x11a8, + 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, 0x0c48, + 0x080c, 0x103b, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, + 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040, + 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, + 0x080c, 0x652d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x652d, 0x1130, + 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, + 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x652d, 0x1108, + 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, + 0x2148, 0xa904, 0x080c, 0x106d, 0x0cc8, 0x7116, 0x711a, 0x001e, + 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18b8, + 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, + 0xa59a, 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x3533, 0x0005, + 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18b0, + 0x2004, 0x9005, 0x1190, 0x0e04, 0x4a55, 0x7a36, 0x7833, 0x0012, + 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11cd, 0x0804, 0x4abb, 0x0016, 0x0086, 0x0096, + 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, 0x7148, + 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x103b, 0x0904, + 0x4ab3, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, + 0x1e31, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001, + 0x18ba, 0x9c82, 0x18fa, 0x0210, 0x2061, 0x18ba, 0x2c00, 0x703a, + 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, 0x7148, + 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, 0x908a, + 0x0036, 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, + 0xa146, 0x1520, 0x080c, 0x103b, 0x1130, 0x8109, 0xa946, 0x7148, + 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, + 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1e31, + 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, + 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, + 0x001b, 0x0002, 0x4add, 0x4add, 0x4adf, 0x4add, 0x4add, 0x4add, + 0x4ae3, 0x4add, 0x4add, 0x4add, 0x4ae7, 0x4add, 0x4add, 0x4add, + 0x4aeb, 0x4add, 0x4add, 0x4add, 0x4aef, 0x4add, 0x4add, 0x4add, + 0x4af3, 0x4add, 0x4add, 0x4add, 0x4af8, 0x080c, 0x0d7d, 0xa276, + 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, + 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, + 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4ab6, + 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4ab6, 0x00e6, 0x2071, 0x189e, + 0x7048, 0x9005, 0x0904, 0x4b8f, 0x0126, 0x2091, 0x8000, 0x0e04, + 0x4b8e, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, + 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105, + 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108, + 0x2105, 0x9005, 0xa94a, 0x1904, 0x4b91, 0xa804, 0x9005, 0x090c, + 0x0d7d, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002, + 0x9080, 0x1e31, 0x2005, 0xa04a, 0x0804, 0x4b91, 0x703c, 0x2060, + 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012, + 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x87ff, 0x0118, 0x2748, + 0x080c, 0x106d, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, + 0x2048, 0x9005, 0x0128, 0x080c, 0x106d, 0x9006, 0x7042, 0x7046, + 0x703b, 0x18ba, 0x703f, 0x18ba, 0x0420, 0x7040, 0x9005, 0x1508, + 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x18fa, + 0x0210, 0x2001, 0x18ba, 0x703e, 0x00a0, 0x9006, 0x703e, 0x703a, + 0x7044, 0x9005, 0x090c, 0x0d7d, 0x2048, 0xa800, 0x9005, 0x1de0, + 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1e31, 0x2005, 0xa84a, + 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, + 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4bb0, 0x4bb0, 0x4bb2, + 0x4bb0, 0x4bb0, 0x4bb0, 0x4bb7, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bbc, + 0x4bb0, 0x4bb0, 0x4bb0, 0x4bc1, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bc6, + 0x4bb0, 0x4bb0, 0x4bb0, 0x4bcb, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bd0, + 0x080c, 0x0d7d, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4b3c, 0xaa84, + 0xab88, 0xac8c, 0x0804, 0x4b3c, 0xaa94, 0xab98, 0xac9c, 0x0804, + 0x4b3c, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4b3c, 0xaab4, 0xabb8, + 0xacbc, 0x0804, 0x4b3c, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4b3c, + 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4b3c, 0x0016, 0x0026, 0x0036, + 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x652d, 0x2019, 0x0001, + 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, 0x080c, + 0x4a38, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, + 0x080c, 0x55fc, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x4a38, + 0x002e, 0x0005, 0x81ff, 0x1904, 0x3565, 0x0126, 0x2091, 0x8000, + 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x73e4, 0x1158, + 0x080c, 0x76e8, 0x080c, 0x5f41, 0x9085, 0x0001, 0x080c, 0x742b, + 0x080c, 0x7315, 0x0010, 0x080c, 0x5dfc, 0x012e, 0x0804, 0x3533, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, 0x080c, 0x5610, + 0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x080c, 0x6962, 0x0120, + 0x2009, 0x0008, 0x0804, 0x3565, 0x080c, 0x3323, 0x0128, 0x7984, + 0x080c, 0x64cc, 0x1904, 0x3568, 0x080c, 0x4a0b, 0x0904, 0x3568, + 0x2b00, 0x7026, 0x080c, 0x696a, 0x7888, 0x1170, 0x9084, 0x0005, + 0x1158, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0x0804, 0x3533, 0x080c, 0x49d8, 0x0904, 0x3565, + 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc94e, + 0x0904, 0x3565, 0x7888, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, + 0x7007, 0x0003, 0x701f, 0x4cb1, 0x0005, 0x2061, 0x1800, 0x080c, + 0x5610, 0x2009, 0x0007, 0x1578, 0x080c, 0x6962, 0x0118, 0x2009, + 0x0008, 0x0448, 0x080c, 0x3323, 0x0120, 0xa998, 0x080c, 0x64cc, + 0x1530, 0x080c, 0x4a09, 0x0518, 0x080c, 0x696a, 0xa89c, 0x1168, + 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, + 0x080c, 0xc94e, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8d4, 0xc08d, + 0xb8d6, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, 0x0005, 0x9006, + 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, + 0x5559, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0x0804, 0x3533, 0x080c, 0x5610, 0x0120, 0x2009, + 0x0007, 0x0804, 0x3565, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x900e, + 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, + 0x0005, 0x702a, 0x20a0, 0x080c, 0x652d, 0x1904, 0x4d53, 0x080c, + 0x696a, 0x0138, 0x080c, 0x6972, 0x0120, 0x080c, 0x690a, 0x1904, + 0x4d53, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, + 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, + 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, + 0x47da, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, + 0x20e0, 0x080c, 0x47da, 0x9186, 0x007e, 0x0170, 0x9186, 0x0080, + 0x0158, 0x080c, 0x696a, 0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020, + 0x080c, 0x681c, 0x1108, 0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528, + 0xb8c4, 0x20e0, 0xb8c8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, + 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, + 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, + 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x47cd, 0x9c80, 0x0026, 0x2098, + 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, + 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xaa42, 0x0118, 0x9186, + 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, + 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, + 0x9686, 0x0028, 0x0150, 0x0804, 0x4ce3, 0x86ff, 0x1120, 0x7124, + 0x810b, 0x0804, 0x3533, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, + 0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa67a, + 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, + 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x4d8f, 0x0005, 0x7030, + 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, + 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, + 0x0804, 0x4ce3, 0x7124, 0x810b, 0x0804, 0x3533, 0x2029, 0x007e, + 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, + 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9184, 0x00ff, + 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9284, + 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, + 0x3568, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, + 0x0a04, 0x3568, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, + 0x3568, 0x9502, 0x0a04, 0x3568, 0x9384, 0x00ff, 0x90e2, 0x0020, + 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9484, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9484, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, + 0x2061, 0x1987, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3533, + 0x080c, 0x49d8, 0x0904, 0x3565, 0x2009, 0x0016, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21, + 0x701f, 0x4e13, 0x0005, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, + 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x20a9, 0x0016, + 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, 0x0019, 0x2098, + 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, 0x0001, 0x2da0, + 0x4003, 0x6800, 0x9005, 0x0904, 0x4e94, 0x6804, 0x2008, 0x918c, + 0xfff8, 0x1904, 0x4e94, 0x680c, 0x9005, 0x0904, 0x4e94, 0x9082, + 0xff01, 0x1a04, 0x4e94, 0x6810, 0x9082, 0x005c, 0x0a04, 0x4e94, + 0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, 0x4e94, 0x9182, 0x0400, + 0x1a04, 0x4e94, 0x0056, 0x2029, 0x0000, 0x080c, 0x8bd4, 0x005e, + 0x6944, 0x6820, 0x9102, 0x06c0, 0x6820, 0x9082, 0x0019, 0x16a0, + 0x6828, 0x6944, 0x810c, 0x9102, 0x0678, 0x6840, 0x9082, 0x000f, + 0x1658, 0x080c, 0x1054, 0x2900, 0x0904, 0x4eae, 0x684e, 0x00e6, + 0x2071, 0x1930, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8a90, 0x00be, + 0x00ee, 0x0558, 0x080c, 0x87ea, 0x080c, 0x8830, 0x11e0, 0x6857, + 0x0000, 0x00c6, 0x2061, 0x0100, 0x6104, 0x918d, 0x2000, 0x6106, + 0x6b10, 0x2061, 0x1a69, 0x630a, 0x00ce, 0x080c, 0x26e7, 0x2001, + 0x0138, 0x2102, 0x0804, 0x3533, 0x080c, 0x26e7, 0x2001, 0x0138, + 0x2102, 0x0804, 0x3568, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8c65, + 0x080c, 0x8c74, 0x080c, 0x8a7f, 0x00ee, 0x2001, 0x188a, 0x204c, + 0x080c, 0x106d, 0x2001, 0x188a, 0x2003, 0x0000, 0x080c, 0x26e7, + 0x2001, 0x0138, 0x2102, 0x0804, 0x3565, 0x2001, 0x1924, 0x200c, + 0x918e, 0x0000, 0x0904, 0x4f0d, 0x080c, 0x8a7a, 0x0904, 0x4f0d, + 0x2001, 0x0101, 0x200c, 0x918c, 0xdfff, 0x2102, 0x2001, 0x0138, + 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, + 0x00ee, 0x080c, 0x8a7f, 0x2001, 0x0035, 0x080c, 0x1670, 0x00c6, + 0x2061, 0x193c, 0x6004, 0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c, + 0x26e7, 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1923, + 0x080c, 0x89bb, 0x0120, 0x2f00, 0x080c, 0x8a45, 0x0cc8, 0x00fe, + 0x00ee, 0x0126, 0x2091, 0x8000, 0x2001, 0x188a, 0x200c, 0x81ff, + 0x0138, 0x2148, 0x080c, 0x106d, 0x2001, 0x188a, 0x2003, 0x0000, + 0x2001, 0x183d, 0x2003, 0x0020, 0x00e6, 0x2071, 0x1930, 0x080c, + 0x8c65, 0x080c, 0x8c74, 0x00ee, 0x012e, 0x0804, 0x3533, 0x0006, + 0x080c, 0x55fc, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600, + 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, 0x82ff, 0x1118, + 0x7986, 0x0804, 0x3533, 0x83ff, 0x1904, 0x3568, 0x2001, 0xfff0, + 0x9200, 0x1a04, 0x3568, 0x2019, 0xffff, 0x6078, 0x9302, 0x9200, + 0x0a04, 0x3568, 0x7986, 0x6276, 0x0804, 0x3533, 0x080c, 0x5610, + 0x1904, 0x3565, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x49d8, + 0x0904, 0x3565, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, + 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, + 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, + 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, + 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, + 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003, + 0x080c, 0x9030, 0x2208, 0x0804, 0x3533, 0x7033, 0x0001, 0x7122, + 0x7024, 0x9300, 0x7026, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, + 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, + 0xa79a, 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x4f90, 0x0005, + 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, + 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, + 0x0804, 0x4f4e, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x9030, + 0x2208, 0x0804, 0x3533, 0x00f6, 0x00e6, 0x080c, 0x5610, 0x2009, + 0x0007, 0x1904, 0x5023, 0x2071, 0x189e, 0x745c, 0x84ff, 0x2009, + 0x000e, 0x1904, 0x5023, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, + 0x080c, 0x1054, 0x2009, 0x0002, 0x0904, 0x5023, 0x2900, 0x705e, + 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, + 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, + 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x1148, 0xb814, 0x20a9, + 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, + 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, + 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x9030, 0x2208, + 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0d7d, + 0x2148, 0x080c, 0x106d, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, + 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061, + 0x18b9, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, + 0xa592, 0xa696, 0xa79a, 0xa09f, 0x502f, 0x000e, 0xa0a2, 0x080c, + 0x111b, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, + 0xa0a0, 0x904d, 0x090c, 0x0d7d, 0x00e6, 0x2071, 0x189e, 0xa06c, + 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, + 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, + 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, + 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e, + 0x2001, 0x0003, 0x080c, 0x9030, 0xaa9a, 0x715c, 0x81ff, 0x090c, + 0x0d7d, 0x2148, 0x080c, 0x106d, 0x705f, 0x0000, 0xa0a0, 0x2048, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0xa09f, 0x0000, + 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, + 0x8bff, 0x0178, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x1148, + 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, + 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518, + 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, + 0x715c, 0x81ff, 0x090c, 0x0d7d, 0x2148, 0x080c, 0x106d, 0x9006, + 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6c7f, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, + 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, + 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x111b, 0x9006, 0x00ee, + 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, + 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x3568, 0xa884, + 0xa988, 0x080c, 0x25cf, 0x1518, 0x080c, 0x64cc, 0x1500, 0x7126, + 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x49d8, 0x01c8, 0x080c, 0x49d8, + 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, + 0x0000, 0xa804, 0x2048, 0x080c, 0xc8cc, 0x1120, 0x2009, 0x0003, + 0x0804, 0x3565, 0x7007, 0x0003, 0x701f, 0x50fc, 0x0005, 0x009e, + 0x2009, 0x0002, 0x0804, 0x3565, 0x7124, 0x080c, 0x32bc, 0xa820, + 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x3565, 0x2900, + 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006, + 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb8, + 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18b8, 0x2c44, 0xa06b, + 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, + 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e, + 0x0804, 0x4a24, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, + 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, 0xa772, 0xa07b, + 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x111b, 0x7007, + 0x0002, 0x701f, 0x5158, 0x0005, 0x000e, 0x007e, 0x0804, 0x3568, + 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, + 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb8, 0x2100, + 0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, + 0x2009, 0x002a, 0x0804, 0x4a24, 0x81ff, 0x1904, 0x3565, 0x798c, + 0x2001, 0x197e, 0x2102, 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, + 0x696a, 0x0120, 0x080c, 0x6972, 0x1904, 0x3568, 0x080c, 0x65f4, + 0x0904, 0x3565, 0x0126, 0x2091, 0x8000, 0x080c, 0x6789, 0x012e, + 0x0904, 0x3565, 0x0804, 0x4508, 0xa9a0, 0x2001, 0x197e, 0xc18d, + 0x2102, 0x080c, 0x49fc, 0x01a0, 0x080c, 0x696a, 0x0118, 0x080c, + 0x6972, 0x1170, 0x080c, 0x65f4, 0x2009, 0x0002, 0x0128, 0x080c, + 0x6789, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, + 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, + 0xa897, 0x4000, 0x080c, 0x5604, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, + 0xd084, 0x0904, 0x447d, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, + 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x080c, 0x696a, + 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, + 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x55fc, + 0xd0b4, 0x0904, 0x44b7, 0x7884, 0x908e, 0x007e, 0x0904, 0x44b7, + 0x908e, 0x007f, 0x0904, 0x44b7, 0x908e, 0x0080, 0x0904, 0x44b7, + 0xb800, 0xd08c, 0x1904, 0x44b7, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xc8eb, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, + 0x7007, 0x0003, 0x701f, 0x5215, 0x0005, 0x080c, 0x4a0b, 0x0904, + 0x3568, 0x0804, 0x44b7, 0x080c, 0x3323, 0x0108, 0x0005, 0x2009, + 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, + 0x080c, 0x5610, 0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x080c, + 0x6962, 0x0120, 0x2009, 0x0008, 0x0804, 0x3565, 0xb89c, 0xd0a4, + 0x1118, 0xd0ac, 0x1904, 0x44b7, 0x9006, 0xa866, 0xa832, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xc94e, 0x1120, 0x2009, 0x0003, 0x0804, + 0x3565, 0x7007, 0x0003, 0x701f, 0x524e, 0x0005, 0xa830, 0x9086, + 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x5559, 0x080c, 0x4a0b, + 0x0904, 0x3568, 0x0804, 0x51e7, 0x81ff, 0x2009, 0x0001, 0x1904, + 0x3565, 0x080c, 0x5610, 0x2009, 0x0007, 0x1904, 0x3565, 0x080c, + 0x6962, 0x0120, 0x2009, 0x0008, 0x0804, 0x3565, 0x080c, 0x4a0b, + 0x0904, 0x3568, 0x080c, 0x696a, 0x2009, 0x0009, 0x1904, 0x3565, + 0x080c, 0x49d8, 0x2009, 0x0002, 0x0904, 0x3565, 0x9006, 0xa866, + 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, + 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, + 0x0038, 0x928e, 0x0100, 0x1904, 0x3568, 0xc0e5, 0xa952, 0xa956, + 0xa83e, 0x080c, 0xcbb1, 0x2009, 0x0003, 0x0904, 0x3565, 0x7007, + 0x0003, 0x701f, 0x52a4, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, + 0x0004, 0x0904, 0x3565, 0x0804, 0x3533, 0x7aa8, 0x9284, 0xc000, + 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x5610, 0x1188, 0x2009, 0x0014, + 0x0804, 0x3565, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, + 0x3565, 0x080c, 0x5610, 0x2009, 0x0007, 0x1904, 0x3565, 0xd2f4, + 0x0130, 0x9284, 0x5000, 0x080c, 0x55d7, 0x0804, 0x3533, 0xd2fc, + 0x0158, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x7984, 0x9284, 0x9000, + 0x080c, 0x55b4, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904, 0x3568, + 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, + 0x538d, 0x080c, 0x49d8, 0x2009, 0x0002, 0x0904, 0x538d, 0xa85c, + 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x080c, 0x4a21, 0x701f, 0x52fe, 0x0005, 0xa86c, 0x9086, + 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, + 0x0110, 0x1904, 0x3568, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0x4a0b, 0x1110, 0x0804, 0x3568, 0x2009, 0x0043, 0x080c, + 0xcc19, 0x2009, 0x0003, 0x0904, 0x538d, 0x7007, 0x0003, 0x701f, + 0x5322, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, + 0x538d, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x55b4, 0x0804, + 0x3533, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, + 0x080c, 0x5610, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, + 0x080c, 0x5610, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, + 0x5000, 0x080c, 0x55d7, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4a09, + 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x55b4, 0xa87b, 0x0000, + 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4a09, 0x0510, + 0x080c, 0x696a, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, + 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, + 0x080c, 0x4a09, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xcc19, + 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, + 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, + 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, + 0x3565, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x55b4, + 0x001e, 0x1904, 0x3565, 0x0804, 0x3533, 0x00f6, 0x2d78, 0x0011, + 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, + 0x1000, 0xc0fd, 0x080c, 0x55b4, 0x001e, 0x9085, 0x0001, 0x0005, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, 0x080c, 0x5610, + 0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x7984, 0x7ea8, 0x96b4, + 0x00ff, 0x080c, 0x652d, 0x1904, 0x3568, 0x9186, 0x007f, 0x0138, + 0x080c, 0x696a, 0x0120, 0x2009, 0x0009, 0x0804, 0x3565, 0x080c, + 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0xa867, 0x0000, + 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, + 0xc905, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003, + 0x701f, 0x53eb, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, + 0x2009, 0x0004, 0x0804, 0x3565, 0xa8e0, 0xa866, 0xa810, 0x8007, + 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, + 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x0804, 0x4a24, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3565, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, + 0x1118, 0x7023, 0x19b1, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, + 0x19cb, 0x0010, 0x0804, 0x3568, 0x2009, 0x001a, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21, + 0x701f, 0x543b, 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, 0xa85c, + 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, + 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3533, 0x080c, 0x49d8, + 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x7984, 0x9194, 0xff00, + 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b1, 0x0040, + 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cb, 0x0010, 0x0804, 0x3568, + 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, + 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x4a24, 0x7884, + 0x908a, 0x1000, 0x1a04, 0x3568, 0x0126, 0x2091, 0x8000, 0x8003, + 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x1a01, 0x6142, 0x00ce, + 0x012e, 0x0804, 0x3533, 0x00c6, 0x080c, 0x73e4, 0x1160, 0x080c, + 0x76e8, 0x080c, 0x5f41, 0x9085, 0x0001, 0x080c, 0x742b, 0x080c, + 0x7315, 0x080c, 0x0d7d, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, + 0x080c, 0x5dfc, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, + 0x908e, 0x0000, 0x0904, 0x3565, 0x7884, 0x9005, 0x0188, 0x7888, + 0x2061, 0x199a, 0x2c0c, 0x2062, 0x080c, 0x299f, 0x01a0, 0x080c, + 0x29a7, 0x0188, 0x080c, 0x29af, 0x0170, 0x2162, 0x0804, 0x3568, + 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, + 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, 0x2061, + 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0xa781, 0x0026, 0x2011, + 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, 0xa0b0, 0x002e, + 0x080c, 0x9f6f, 0x0036, 0x901e, 0x080c, 0x9fef, 0x003e, 0x080c, + 0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b, 0x080c, 0xe5b6, 0x9085, + 0x0001, 0x080c, 0x742b, 0x9006, 0x080c, 0x29d1, 0x2001, 0x1800, + 0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x002e, + 0x00ce, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3565, 0x080c, 0x5610, 0x0120, 0x2009, 0x0007, 0x0804, 0x3565, + 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x652d, 0x1904, 0x3568, + 0x9186, 0x007f, 0x0138, 0x080c, 0x696a, 0x0120, 0x2009, 0x0009, + 0x0804, 0x3565, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, + 0x3565, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc908, + 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003, 0x701f, + 0x5542, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, + 0x0804, 0x3565, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, + 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, + 0x4a24, 0xa898, 0x9086, 0x000d, 0x1904, 0x3565, 0x2021, 0x4005, + 0x0126, 0x2091, 0x8000, 0x0e04, 0x5566, 0x0010, 0x012e, 0x0cc0, + 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, + 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, + 0x799e, 0x080c, 0x4a14, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11cd, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, + 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, + 0x1a01, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, + 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, + 0x2001, 0x1a0f, 0x2044, 0x2001, 0x1a16, 0xa076, 0xa060, 0xa072, + 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, + 0x00ce, 0x012e, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x00b6, + 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xc770, 0x000e, + 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, + 0x080c, 0x5f5b, 0x080c, 0xaa42, 0x0110, 0xb817, 0x0000, 0x9006, + 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, + 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, + 0x9180, 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, + 0x9186, 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, + 0x0120, 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, + 0x55df, 0x015e, 0x012e, 0x0005, 0x2001, 0x1848, 0x2004, 0x0005, + 0x2001, 0x1867, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, + 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, + 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, + 0x2071, 0x189e, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, + 0x080c, 0x49d8, 0x080c, 0x0f42, 0x2100, 0x2238, 0x7d84, 0x7c88, + 0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3568, 0x810c, + 0x080c, 0x4a21, 0x701f, 0x5635, 0x0005, 0x2079, 0x0000, 0x7d94, + 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, + 0xa770, 0xa074, 0x2071, 0x189e, 0x080c, 0x4a24, 0x701f, 0x5649, + 0x0005, 0x2061, 0x18b8, 0x2c44, 0xa074, 0x2048, 0x9006, 0xa802, + 0xa806, 0x0804, 0x3533, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, + 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, + 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, + 0x080c, 0x57fc, 0x0068, 0xd08c, 0x0118, 0x080c, 0x5705, 0x0040, + 0xd094, 0x0118, 0x080c, 0x56d5, 0x0018, 0xd09c, 0x0108, 0x0099, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, + 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, + 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, 0x000e, 0x0120, + 0x709b, 0x0000, 0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, + 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, + 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, + 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, + 0x0128, 0x2009, 0x00f7, 0x080c, 0x5ebd, 0x00f0, 0x6040, 0x9084, + 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7087, 0x0000, + 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, 0x0000, 0x2009, 0x1d80, + 0x200b, 0x0000, 0x7097, 0x0000, 0x708b, 0x000f, 0x2009, 0x000f, + 0x2011, 0x5d9f, 0x080c, 0x85d2, 0x0005, 0x2001, 0x1869, 0x2004, + 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528, 0x2011, + 0x5d9f, 0x080c, 0x850b, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, + 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x56eb, + 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, + 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f, 0x0000, + 0x9006, 0x080c, 0x5f46, 0x0000, 0x0005, 0x708c, 0x908a, 0x0003, + 0x1a0c, 0x0d7d, 0x000b, 0x0005, 0x570f, 0x5760, 0x57fb, 0x00f6, + 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001, 0x015d, + 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, + 0x00fc, 0x0120, 0x1f04, 0x571e, 0x080c, 0x0d7d, 0x68a0, 0x68a2, + 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, + 0x001e, 0x6837, 0x0020, 0x080c, 0x5f22, 0x2079, 0x1d00, 0x7833, + 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0xa57b, + 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, + 0x5dd0, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042, 0x0005, + 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x57d8, 0x6020, + 0xd0b4, 0x1904, 0x57d6, 0x71a0, 0x81ff, 0x0904, 0x57c4, 0x9486, + 0x000c, 0x1904, 0x57d1, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, + 0x5f1b, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304, 0x9106, + 0x11e8, 0x8210, 0x8318, 0x1f04, 0x577d, 0x6043, 0x0004, 0x2061, + 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, + 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011, + 0x5da6, 0x080c, 0x85d2, 0x080c, 0x5f22, 0x04c0, 0x080c, 0x5f1b, + 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, + 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, + 0x080c, 0x5f1b, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, + 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, + 0x57b8, 0x0078, 0x70a3, 0x0000, 0x080c, 0x5f1b, 0x20e1, 0x0000, + 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9, 0x0014, + 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, + 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, + 0xa57b, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f2, + 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, + 0x080c, 0x9cfc, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c, + 0x0d7d, 0x000b, 0x0005, 0x582d, 0x5840, 0x5869, 0x5889, 0x58af, + 0x58de, 0x5904, 0x593c, 0x5962, 0x5990, 0x59cb, 0x5a03, 0x5a21, + 0x5a4c, 0x5a6e, 0x5a89, 0x5a93, 0x5ac7, 0x5aed, 0x5b1c, 0x5b42, + 0x5b7a, 0x5bbe, 0x5bfb, 0x5c1c, 0x5c75, 0x5c97, 0x5cc5, 0x5cc5, + 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, + 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, + 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x709b, + 0x0001, 0x2009, 0x07d0, 0x2011, 0x5da6, 0x080c, 0x85d2, 0x0005, + 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, + 0x11f0, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, + 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4, + 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5da6, 0x080c, 0x850b, + 0x709b, 0x0010, 0x080c, 0x5a93, 0x0010, 0x7093, 0x0000, 0x00fe, + 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011, 0x5da6, + 0x080c, 0x850b, 0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1102, + 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, + 0x8108, 0x1f04, 0x587e, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x00fe, + 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5da6, 0x080c, + 0x850b, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, + 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, + 0x0004, 0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe, 0x0005, 0x00f6, + 0x709b, 0x0005, 0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1103, + 0x7837, 0x0000, 0x080c, 0x5f1b, 0x080c, 0x5efe, 0x1170, 0x7084, + 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, + 0x080c, 0x5d53, 0x0168, 0x080c, 0x5ed4, 0x20a9, 0x0008, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, + 0x9005, 0x0500, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, + 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, + 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, 0x0010, + 0x080c, 0x5ef7, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c, + 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, + 0x5f1b, 0x080c, 0x5efe, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, + 0x9186, 0xffff, 0x0180, 0x9180, 0x3334, 0x200d, 0x918c, 0xff00, + 0x810f, 0x2011, 0x0008, 0x080c, 0x5d53, 0x0180, 0x080c, 0x4f15, + 0x0110, 0x080c, 0x2638, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, + 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014, 0x11b8, 0x080c, + 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, + 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c, 0x5ef7, + 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x5e9f, 0x2079, + 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5efe, 0x1150, + 0x7084, 0x9005, 0x1138, 0x080c, 0x5cc6, 0x1188, 0x9085, 0x0001, + 0x080c, 0x2638, 0x20a9, 0x0008, 0x080c, 0x5f1b, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, + 0x0014, 0x080c, 0x5dd0, 0x0010, 0x080c, 0x5820, 0x00fe, 0x0005, + 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5da6, 0x080c, 0x850b, + 0x9086, 0x0014, 0x1560, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, + 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, + 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, + 0x7097, 0x0000, 0x709b, 0x000e, 0x080c, 0x5a6e, 0x0010, 0x080c, + 0x5ef7, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, 0x1d0e, + 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, + 0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, + 0x080c, 0x5efe, 0x0118, 0x2013, 0x0000, 0x0020, 0x7060, 0x9085, + 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1d0e, + 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, + 0x6812, 0x2009, 0x0240, 0x1f04, 0x59f0, 0x60c3, 0x0084, 0x080c, + 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011, + 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1178, 0x080c, 0x5f1b, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, + 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe, + 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x5e9f, 0x2079, 0x0240, + 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5f1b, 0x20a9, 0x0040, + 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, + 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, + 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5a34, 0x60c3, 0x0084, + 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, + 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1198, 0x080c, + 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, + 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5e71, 0x709b, 0x000e, + 0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe, 0x0005, 0x918d, 0x0001, + 0x080c, 0x5f46, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061, 0x0140, + 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, + 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5da6, 0x080c, 0x84ff, + 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5da6, 0x080c, 0x850b, + 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xa57b, 0x080c, + 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, + 0x8004, 0x20a8, 0x4003, 0x080c, 0x5efe, 0x11a0, 0x717c, 0x81ff, + 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, 0x25cf, + 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, + 0x080c, 0x5d53, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x0005, 0x00f6, + 0x7090, 0x9005, 0x0500, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, + 0x0014, 0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, + 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0012, 0x0029, + 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0013, + 0x080c, 0x5ead, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, + 0x080c, 0x5f1b, 0x080c, 0x5efe, 0x1170, 0x7084, 0x9005, 0x1158, + 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5d53, + 0x0168, 0x080c, 0x5ed4, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, + 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014, 0x11b8, 0x080c, + 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, + 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, + 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, 0x0010, 0x7093, 0x0000, + 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, 0x080c, 0x5ead, 0x2079, + 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5f1b, 0x080c, + 0x5efe, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, + 0x0180, 0x9180, 0x3334, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, + 0x0008, 0x080c, 0x5d53, 0x0180, 0x080c, 0x4f15, 0x0110, 0x080c, + 0x2638, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, + 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dd0, + 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, 0x5da6, + 0x080c, 0x850b, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5f1b, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, + 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x5f46, + 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, + 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, + 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x5f46, 0x7097, + 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, 0x0016, + 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, 0xa57b, + 0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, + 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x709b, + 0x0017, 0x080c, 0x5efe, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, + 0x5cc6, 0x1188, 0x9085, 0x0001, 0x080c, 0x2638, 0x20a9, 0x0008, + 0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x0010, + 0x080c, 0x5820, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011, + 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1190, 0x080c, 0x5f1b, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, + 0x1138, 0x9006, 0x080c, 0x5f46, 0x709b, 0x0018, 0x0029, 0x0010, + 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c, + 0x5ead, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, + 0x5f1b, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040, 0x213e, + 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, + 0x2009, 0x0260, 0x1f04, 0x5c2f, 0x2039, 0x1d0e, 0x080c, 0x5efe, + 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, + 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x7060, 0x2310, 0x8214, + 0x92a0, 0x1d0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, + 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, + 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, + 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5c62, 0x60c3, + 0x0084, 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, + 0x01e0, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1198, + 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, + 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5e71, 0x709b, + 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085, + 0x0001, 0x080c, 0x5f46, 0x709b, 0x001b, 0x080c, 0xa57b, 0x080c, + 0x5f1b, 0x2011, 0x0260, 0x2009, 0x0240, 0x7490, 0x9480, 0x0018, + 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, + 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, + 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5cae, + 0x60c3, 0x0084, 0x080c, 0x5dd0, 0x0005, 0x0005, 0x0086, 0x0096, + 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e, 0x20e9, + 0x0001, 0x28a0, 0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, + 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, + 0x8210, 0x0008, 0x8211, 0x1f04, 0x5ce0, 0x0804, 0x5d4f, 0x82ff, + 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, + 0x3fff, 0x0904, 0x5d4f, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, + 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, + 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, + 0x8318, 0x1f04, 0x5d06, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, + 0x8425, 0x1f04, 0x5d18, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, + 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, + 0x0010, 0x1f04, 0x5d27, 0x755e, 0x95c8, 0x3334, 0x292d, 0x95ac, + 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2618, + 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, + 0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, + 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, + 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, + 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, + 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, + 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, + 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, + 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, + 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, + 0x203a, 0x715e, 0x91a0, 0x3334, 0x242d, 0x95ac, 0x00ff, 0x7582, + 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2618, 0x001e, 0x60e7, + 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, + 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, + 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5e60, 0x080c, 0x9d09, + 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, + 0x2009, 0x00f7, 0x080c, 0x5ebd, 0x001e, 0x9094, 0x0010, 0x9285, + 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, + 0x0126, 0x2091, 0x8000, 0x080c, 0x2940, 0x0228, 0x2011, 0x0101, + 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f2, 0x2013, 0x0000, 0x7093, + 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9cfc, + 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018, 0x718c, + 0x918d, 0x1000, 0x2011, 0x1997, 0x2112, 0x2009, 0x07d0, 0x2011, + 0x5da6, 0x080c, 0x85d2, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x080c, 0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d, + 0x2009, 0x00f7, 0x080c, 0x5ebd, 0x2061, 0x1a01, 0x900e, 0x611a, + 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, + 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b, + 0x0000, 0x2009, 0x002d, 0x2011, 0x5e2c, 0x080c, 0x84ff, 0x012e, + 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, + 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9d09, 0x2071, 0x0140, + 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x080c, 0x73ec, + 0x0188, 0x080c, 0x7407, 0x1170, 0x080c, 0x76f2, 0x0016, 0x080c, + 0x26e7, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x76ed, 0x080c, + 0x7315, 0x0050, 0x2009, 0x0001, 0x080c, 0x29bd, 0x2001, 0x0001, + 0x080c, 0x2574, 0x080c, 0x5dfc, 0x012e, 0x000e, 0x00ee, 0x0005, + 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, + 0x8017, 0x2001, 0x1997, 0x201c, 0x080c, 0x4a38, 0x003e, 0x002e, + 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x080c, + 0x5f1b, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, + 0x080c, 0x5f15, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051, 0x20a9, + 0x000e, 0x080c, 0x5f18, 0x2099, 0x0260, 0x20a1, 0x1db2, 0x0009, + 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, + 0x8108, 0x8210, 0x1f04, 0x5e95, 0x002e, 0x001e, 0x0005, 0x080c, + 0xa57b, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa57b, 0x080c, + 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, + 0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, 0x2001, + 0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, + 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x6966, + 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe191, 0x2001, + 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, + 0x316a, 0x080c, 0xce35, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, + 0x0007, 0x080c, 0x4bef, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, + 0x5dfc, 0x709b, 0x0000, 0x7093, 0x0000, 0x0005, 0x0006, 0x2001, + 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, + 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, + 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, + 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, + 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, + 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x4004, 0x2079, 0x1d00, + 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, + 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, + 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x19a4, + 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, + 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, + 0x5f55, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, + 0x2069, 0x1847, 0x9006, 0xb802, 0xb8d6, 0xb807, 0x0707, 0xb80a, + 0xb80e, 0xb812, 0x9198, 0x3334, 0x231d, 0x939c, 0x00ff, 0xbb16, + 0x0016, 0x0026, 0xb886, 0x080c, 0xaa42, 0x1120, 0x9192, 0x007e, + 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198, + 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, + 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8ce, 0xb8d2, + 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876, + 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e, + 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x106d, + 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, + 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, 0x2060, + 0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02, + 0x1a0c, 0x0d7d, 0x080c, 0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af, + 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, + 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, + 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6031, 0x9182, 0x0800, + 0x1a04, 0x6035, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, + 0x603b, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804, 0x9084, + 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904, 0x604d, + 0x080c, 0x63f6, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005, 0x900e, + 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, + 0x080c, 0xaa42, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, + 0xd1fc, 0x0d10, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, 0x2001, + 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, + 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, + 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, 0x900e, + 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, + 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, 0x19d0, + 0x9188, 0x1000, 0x2104, 0x9065, 0x09a8, 0x080c, 0x696a, 0x1990, + 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5ff4, 0x080c, 0x6798, 0x0904, + 0x5ffd, 0x0804, 0x5ff8, 0x00e6, 0x2071, 0x19e5, 0x7004, 0x9086, + 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06, 0x00ee, + 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, 0x908e, + 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, 0x0060, 0xa974, 0x9182, + 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c, + 0x690a, 0x11d0, 0x080c, 0xaa82, 0x0570, 0x2b00, 0x6012, 0x2900, + 0x6016, 0x6023, 0x0009, 0x602b, 0x0000, 0xa874, 0x908e, 0x00ff, + 0x1110, 0x602b, 0x8000, 0x2009, 0x0043, 0x080c, 0xab77, 0x9006, + 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, + 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, + 0x0010, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, + 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6, 0x00e6, + 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x6129, + 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x6101, 0xb8a0, 0x9086, + 0x007f, 0x0178, 0x080c, 0x6972, 0x0160, 0xa994, 0x81ff, 0x0130, + 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x696a, + 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, + 0x0026, 0x2010, 0x080c, 0xc711, 0x002e, 0x1120, 0x2001, 0x0008, + 0x0804, 0x612b, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, + 0x0804, 0x612b, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, + 0x080c, 0xaa82, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, + 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xab77, 0x9006, + 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, + 0xaa42, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, + 0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, + 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, + 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, + 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, + 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, + 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, + 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, + 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, + 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, + 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, + 0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, + 0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, + 0x00be, 0x00fe, 0x0005, 0x61c0, 0x617b, 0x6192, 0x61c0, 0x61c0, + 0x61c0, 0x61c0, 0x61c0, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, + 0x64cc, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x61c8, 0xb814, + 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x48eb, + 0x0150, 0x04b0, 0x080c, 0x652d, 0x1598, 0xb810, 0x9306, 0x1580, + 0xb814, 0x9206, 0x1568, 0x080c, 0xaa82, 0x0530, 0x2b00, 0x6012, + 0x080c, 0xcbb0, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, + 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x31ab, 0x9006, 0x080c, + 0x6469, 0x2001, 0x0002, 0x080c, 0x647d, 0x2001, 0x0200, 0xb86e, + 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xab77, 0x9006, 0x0068, + 0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, + 0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, + 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, + 0x90c6, 0x0015, 0x0904, 0x63a7, 0x90c6, 0x0056, 0x0904, 0x63ab, + 0x90c6, 0x0066, 0x0904, 0x63af, 0x90c6, 0x0071, 0x0904, 0x63b3, + 0x90c6, 0x0074, 0x0904, 0x63b7, 0x90c6, 0x007c, 0x0904, 0x63bb, + 0x90c6, 0x007e, 0x0904, 0x63bf, 0x90c6, 0x0037, 0x0904, 0x63c3, + 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x63a2, + 0x9182, 0x0800, 0x1a04, 0x63a2, 0x080c, 0x652d, 0x1198, 0xb804, + 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, + 0x0148, 0x080c, 0xaa42, 0x1904, 0x638b, 0xb8a0, 0x9084, 0xff80, + 0x1904, 0x638b, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, + 0x0904, 0x62eb, 0x90c6, 0x0064, 0x0904, 0x6314, 0x2008, 0x0804, + 0x62ad, 0xa998, 0xa8b0, 0x2040, 0x080c, 0xaa42, 0x1120, 0x9182, + 0x007f, 0x0a04, 0x62ad, 0x9186, 0x00ff, 0x0904, 0x62ad, 0x9182, + 0x0800, 0x1a04, 0x62ad, 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x1188, + 0x7880, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, + 0x62ad, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, + 0x62ad, 0x080c, 0x48eb, 0x0904, 0x62b7, 0x900e, 0x9016, 0x90c6, + 0x4000, 0x15e0, 0x0006, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, + 0x2098, 0x080c, 0x0fb8, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, + 0x2098, 0x080c, 0x0fb8, 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305, + 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305, + 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007, + 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, + 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, + 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, + 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0478, 0x000e, 0x080c, + 0xaa82, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, + 0x2b00, 0x6012, 0x080c, 0xcbb0, 0x2900, 0x6016, 0x6023, 0x0001, + 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, + 0x080c, 0x31ab, 0x012e, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002, + 0x080c, 0x647d, 0x2009, 0x0002, 0x080c, 0xab77, 0xa8b0, 0xd094, + 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x9006, 0x9005, 0x012e, 0x00ee, + 0x00fe, 0x00be, 0x0005, 0x080c, 0x5610, 0x0118, 0x2009, 0x0007, + 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x652d, 0x1904, 0x62a8, 0x9186, + 0x007f, 0x0130, 0x080c, 0x696a, 0x0118, 0x2009, 0x0009, 0x0080, + 0x0096, 0x080c, 0x103b, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, + 0x2900, 0x009e, 0xa806, 0x080c, 0xc908, 0x19b0, 0x2009, 0x0003, + 0x2001, 0x4005, 0x0804, 0x62af, 0xa998, 0xaeb0, 0x080c, 0x652d, + 0x1904, 0x62a8, 0x0096, 0x080c, 0x103b, 0x1128, 0x009e, 0x2009, + 0x0002, 0x0804, 0x6368, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, + 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, + 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0fb8, + 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, + 0x1168, 0x080c, 0x55fc, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, + 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x696a, + 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x5610, 0x0118, 0xa89b, + 0x0007, 0x0050, 0x080c, 0xc8eb, 0x1904, 0x62e4, 0x2009, 0x0003, + 0x2001, 0x4005, 0x0804, 0x62af, 0xa87b, 0x0030, 0xa897, 0x4005, + 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, + 0x2031, 0x0000, 0x2041, 0x1275, 0x080c, 0xaffd, 0x1904, 0x62e4, + 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x62e5, + 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, + 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, + 0x0804, 0x62e5, 0x2001, 0x0029, 0x900e, 0x0804, 0x62e5, 0x080c, + 0x3757, 0x0804, 0x62e6, 0x080c, 0x5331, 0x0804, 0x62e6, 0x080c, + 0x4533, 0x0804, 0x62e6, 0x080c, 0x49ae, 0x0804, 0x62e6, 0x080c, + 0x4c65, 0x0804, 0x62e6, 0x080c, 0x4fab, 0x0804, 0x62e6, 0x080c, + 0x519c, 0x0804, 0x62e6, 0x080c, 0x3975, 0x0804, 0x62e6, 0x00b6, + 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1608, 0x9182, + 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d, 0x0130, 0x080c, + 0x696a, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, + 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d98, 0x2001, + 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, + 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0xa877, 0x0000, + 0xb8d0, 0x9005, 0x1904, 0x645d, 0xb888, 0x9005, 0x1904, 0x645d, + 0xb838, 0xb93c, 0x9102, 0x1a04, 0x645d, 0x2b10, 0x080c, 0xaaaf, + 0x0904, 0x6459, 0x8108, 0xb93e, 0x6212, 0x2900, 0x6016, 0x6023, + 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, 0x605e, 0xa880, + 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac, 0x0588, + 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1530, 0xa816, 0xa864, 0x9094, + 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd, 0x601e, + 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001, 0x1df0, + 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079, 0x0380, + 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836, 0x781b, + 0x8080, 0x00fe, 0x0005, 0x080c, 0x1728, 0x601c, 0xc0bd, 0x601e, + 0x0c38, 0xd0b4, 0x190c, 0x1c0c, 0x2001, 0x8004, 0x6003, 0x0002, + 0x0c18, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908, 0xb8cc, 0xb9ce, + 0x9005, 0x1110, 0xb9d2, 0x0020, 0x0096, 0x2048, 0xa902, 0x009e, + 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, + 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, 0xc284, 0xba02, + 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, + 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, + 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6966, 0x0140, 0x9284, + 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, + 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, + 0xba90, 0x82ff, 0x090c, 0x0d7d, 0x000e, 0x00ce, 0x012e, 0x00be, + 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, + 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, + 0x080c, 0x6962, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, + 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, + 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, + 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, + 0x1188, 0x0096, 0x080c, 0x103b, 0x2958, 0x009e, 0x0168, 0x2b00, + 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, + 0x080c, 0x5f5b, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, 0x00de, + 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, + 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, + 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, + 0x080c, 0x106d, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168, + 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc723, 0x0110, 0x080c, + 0x0fed, 0x080c, 0xaad8, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, + 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x107d, 0x00de, 0x9006, + 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, + 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, + 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, + 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x73e4, + 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xaa42, 0x11d8, + 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1980, 0x7048, + 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, + 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, + 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, + 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8, + 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, + 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, + 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, + 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, + 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009, + 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, + 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349, + 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009, + 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, + 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, + 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, + 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbd4, 0xc384, 0xba00, 0x2009, + 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, + 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, + 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbd6, 0x003e, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, + 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, + 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, + 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, + 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d7d, 0x3c00, 0x20e8, 0x3300, + 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, + 0x013e, 0x0060, 0x080c, 0x103b, 0x0170, 0x2900, 0xb8a6, 0xa803, + 0x0000, 0x080c, 0x67b8, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, + 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, + 0x67c7, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, + 0x0020, 0x080c, 0x106d, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, + 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x66b1, 0xb8d0, 0x904d, + 0x0904, 0x66b1, 0x080c, 0xaaaf, 0x0904, 0x66ad, 0x8210, 0xba3e, + 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x2b00, 0x6012, 0x2900, + 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, + 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, + 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, 0xa816, + 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084, 0x00ff, + 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x8004, + 0x6003, 0x0004, 0x0030, 0x080c, 0x1c0c, 0x2001, 0x8004, 0x6003, + 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0xa772, 0xb838, + 0xba3c, 0x9202, 0x0a04, 0x665e, 0x0020, 0x82ff, 0x1110, 0xb88b, + 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1728, 0x601c, 0xc0bd, + 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800, 0x900e, + 0x0016, 0x080c, 0x652d, 0x1158, 0xb8d0, 0x904d, 0x0140, 0x3e00, + 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041, 0x001e, + 0x8108, 0x1f04, 0x66c0, 0x001e, 0x00be, 0x009e, 0x0005, 0x0096, + 0x0016, 0xb8d0, 0x904d, 0x0188, 0xa800, 0xb8d2, 0x9005, 0x1108, + 0xb8ce, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0xca1a, 0x080c, 0x6c7f, 0x0c60, 0x001e, 0x009e, 0x0005, + 0x0086, 0x9046, 0xb8d0, 0x904d, 0x0198, 0xa86c, 0x9406, 0x1118, + 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148, 0x0ca8, + 0xa800, 0x88ff, 0x1110, 0xb8d2, 0x0008, 0xa002, 0xa803, 0x0000, + 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6, 0x0096, + 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, + 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff, 0x0120, + 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, + 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c, 0x0006, + 0x0066, 0x2830, 0x080c, 0x9e79, 0x006e, 0x000e, 0x83ff, 0x0508, + 0x0c08, 0x9046, 0xb8d0, 0x904d, 0x01e0, 0x83ff, 0x0120, 0xa878, + 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, + 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8d0, 0xaa00, 0x0026, + 0x9906, 0x1110, 0xbad2, 0x0008, 0xa202, 0x000e, 0x83ff, 0x0108, + 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9016, + 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x681c, 0x0128, + 0x080c, 0xc7ef, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x681c, + 0x0128, 0x080c, 0xc785, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x681c, 0x0128, 0x080c, 0xc7ec, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x681c, 0x0128, 0x080c, 0xc7a9, 0x0010, 0x9085, 0x0001, + 0x0005, 0x080c, 0x681c, 0x0128, 0x080c, 0xc819, 0x0010, 0x9085, + 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, 0x0005, + 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, + 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, + 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, + 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, 0x0005, + 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, 0x20a0, + 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, 0x0136, + 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, + 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, + 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, + 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, 0x20a0, + 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, 0x9006, + 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, + 0x904d, 0x1128, 0x080c, 0x103b, 0x0168, 0x2900, 0xb8a6, 0x080c, + 0x67b8, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, + 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x106d, 0x9085, + 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, + 0x00f6, 0x080c, 0x73e4, 0x01b0, 0x71c4, 0x81ff, 0x1198, 0x71dc, + 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, 0x905d, + 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, + 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0, 0x0156, + 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x652d, 0x1168, 0xb804, + 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, + 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x6843, + 0x015e, 0x080c, 0x6928, 0x0120, 0x2001, 0x1983, 0x200c, 0x0038, + 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, + 0x686e, 0x080c, 0x85d2, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, + 0x686e, 0x080c, 0x850b, 0x080c, 0x6928, 0x01d8, 0x2001, 0x107e, + 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6966, 0x0130, + 0x2009, 0x07d0, 0x2011, 0x686e, 0x080c, 0x85d2, 0x00e6, 0x2071, + 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2f79, 0x00ee, + 0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, + 0x652d, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220, + 0x9006, 0x2009, 0x0029, 0x080c, 0xe191, 0xb800, 0xc0e5, 0xc0ec, + 0xb802, 0x080c, 0x6962, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, + 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0xa781, 0x2019, 0x0029, + 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x900e, 0x080c, + 0xdeb3, 0x007e, 0x004e, 0x080c, 0xa79d, 0x001e, 0x8108, 0x1f04, + 0x6896, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, + 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, + 0x080c, 0x1054, 0x090c, 0x0d7d, 0x2958, 0x009e, 0x2001, 0x196b, + 0x2b02, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x5f5b, 0xb807, + 0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c, + 0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000, + 0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, + 0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff, + 0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, 0x0005, + 0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, 0x9196, + 0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, 0x0005, + 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, + 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, + 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0d7d, + 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, + 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138, + 0x2001, 0x1981, 0x200c, 0x2011, 0x6958, 0x080c, 0x85d2, 0x0005, + 0x2011, 0x6958, 0x080c, 0x850b, 0x2011, 0x1837, 0x2204, 0xc0cc, + 0x2012, 0x0005, 0x080c, 0x55fc, 0xd0ac, 0x0005, 0x080c, 0x55fc, + 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, + 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, + 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xce35, 0x0158, + 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, + 0x0110, 0xb8d4, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910, + 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, + 0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000, 0x0005, + 0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, 0x55fc, + 0xd0fc, 0x1140, 0x080c, 0x55fc, 0x900e, 0xd09c, 0x0108, 0x8108, + 0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0002, + 0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69c0, 0x69ce, 0x69aa, + 0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, 0x8007, + 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, + 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, + 0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085, 0x702a, + 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, + 0x775a, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, + 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, + 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, + 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, + 0x0001, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc084, 0x702a, 0x7007, + 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6, + 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c84, 0x9286, + 0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0x2071, + 0x1877, 0xa87c, 0x9005, 0x0904, 0x6a75, 0x7140, 0xa868, 0x9102, + 0x0a04, 0x6c84, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001, + 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6e27, + 0x0e04, 0x6e95, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c, 0x7082, + 0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036, 0x0146, + 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, + 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, + 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x0804, 0x6af7, + 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904, + 0x6c84, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6a39, 0x00e6, + 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c84, 0x9286, + 0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0xa84f, + 0x8022, 0xa853, 0x0018, 0x0804, 0x6adc, 0xa868, 0xd0fc, 0x11d8, + 0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904, 0x6c84, + 0xa87c, 0xd0bc, 0x1904, 0x6c84, 0xa978, 0xa874, 0x9105, 0x1904, + 0x6c84, 0x2001, 0x1948, 0x2004, 0x0002, 0x6c84, 0x6ad8, 0x6b14, + 0x6b14, 0x6c84, 0x6b14, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, + 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6c84, 0xa87c, + 0xd0cc, 0x0904, 0x6c84, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x6c84, 0x9186, 0x0003, 0x0904, 0x6b14, 0x9186, 0x0005, + 0x0904, 0x6b14, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, + 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005, + 0x1904, 0x6e27, 0x0e04, 0x6e95, 0x2071, 0x0000, 0xa84c, 0x7082, + 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2071, + 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, + 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x002e, + 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, + 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, + 0x6c09, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe1, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x6b32, 0x6c09, 0x6b57, 0x6ba4, + 0x080c, 0x0d7d, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, + 0x1170, 0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, + 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0c10, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, 0x00e6, + 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, + 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, + 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, + 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x2071, 0x1a01, 0x703c, + 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, + 0x080c, 0x8420, 0x0804, 0x6b5e, 0x0096, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, + 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, + 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, + 0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, + 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, + 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x1a01, + 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x6c5e, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x1198, + 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, + 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6fe1, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, + 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x1d60, 0x00ee, + 0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, + 0x00ee, 0x0804, 0x6c19, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804, + 0xa807, 0x0000, 0x904d, 0x190c, 0x0fed, 0x009e, 0x0018, 0xa868, + 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, + 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, + 0x6da1, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe1, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x6ca3, 0x6da1, 0x6cbe, 0x6d30, + 0x080c, 0x0d7d, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, + 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0c60, 0x2071, 0x1800, + 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6d1f, 0x7830, 0xd0dc, + 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, + 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, 0x918a, + 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, + 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x0e04, 0x6d16, 0x7838, 0x7938, + 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, + 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2009, 0x1947, + 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1921, + 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0804, 0x6ccd, + 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, + 0x6d74, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, + 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2009, + 0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, + 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, + 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x6e12, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x11b0, + 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x0d50, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, + 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, + 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6e0b, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11cd, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x8420, 0x00ee, 0x0804, 0x6db1, 0x2071, + 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1128, 0x1e04, 0x6e52, 0x002e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, + 0x0e04, 0x6e3c, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, 0x900d, + 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, + 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2071, + 0x1910, 0x080c, 0x6fcd, 0x002e, 0x00ee, 0x0005, 0xa850, 0x9082, + 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, + 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, + 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, + 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, 0xa803, + 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, + 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, + 0x9200, 0x70c2, 0x080c, 0x8420, 0x002e, 0x00ee, 0x0005, 0x0006, + 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, + 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1910, + 0x7004, 0x0002, 0x6ee0, 0x6ee1, 0x6fcc, 0x6ee1, 0x0d7d, 0x6fcc, + 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6eeb, 0x6eeb, 0x6f65, + 0x6f66, 0x6eeb, 0x6f66, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6fec, + 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x6f36, 0x0e04, + 0x6f14, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, + 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, + 0x2071, 0x1910, 0x080c, 0x6fcd, 0x012e, 0x0804, 0x6f64, 0xa850, + 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, + 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, + 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, + 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, 0x005b, + 0x2004, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x2071, 0x1910, + 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, + 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, + 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, + 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, + 0x2069, 0x1a01, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, + 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b4c, 0x210c, 0x9102, + 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, + 0x9106, 0x0190, 0x0e04, 0x6f98, 0x2069, 0x0000, 0x6837, 0x8040, + 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11cd, 0x2069, 0x1a01, 0x683f, 0xffff, + 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x7062, 0x701c, + 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, + 0xd09c, 0x1500, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, + 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, + 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, + 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, + 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, + 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x106d, 0x0005, 0x012e, + 0x0005, 0x2091, 0x8000, 0x0e04, 0x6fe3, 0x0006, 0x0016, 0x2001, + 0x8004, 0x0006, 0x0804, 0x0d86, 0x0096, 0x00f6, 0x2079, 0x0050, + 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, + 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, + 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, 0x2104, + 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, + 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, + 0x1830, 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, + 0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x7838, + 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, + 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x11cd, 0x2009, 0x1947, 0x200b, 0x0000, 0x00ee, 0x00fe, + 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8, + 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, + 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x00fe, 0x0005, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x0db8, 0x00e6, 0x2071, + 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, + 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6fe1, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, + 0x1948, 0x6808, 0x690a, 0x2069, 0x1a01, 0x9102, 0x1118, 0x683c, + 0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c, 0x0d7d, + 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x2a0b, + 0x002e, 0x0005, 0x718a, 0x7114, 0x7130, 0x7158, 0x7179, 0x71b9, + 0x71cb, 0x7130, 0x71a1, 0x70cf, 0x70fd, 0x70ce, 0x0005, 0x00d6, + 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, + 0x709b, 0x0028, 0x2069, 0x198d, 0x2d04, 0x7002, 0x080c, 0x7526, + 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028, 0x2069, + 0x198d, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, + 0x0036, 0x0046, 0x0056, 0x2071, 0x1a69, 0x080c, 0x1a9e, 0x005e, + 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, + 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, 0x0028, + 0x2069, 0x198d, 0x2d04, 0x7002, 0x080c, 0x75c9, 0x6028, 0x9085, + 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, + 0x29d1, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x723c, 0xd1d4, + 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c, + 0x723c, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, + 0x2001, 0x0088, 0x080c, 0x29d1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, + 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, + 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7410, 0x2001, 0x0080, 0x080c, + 0x29d1, 0x709b, 0x0028, 0x0058, 0x709b, 0x001e, 0x0040, 0x709b, + 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, + 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7410, 0x2001, + 0x0080, 0x080c, 0x29d1, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, + 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x709b, 0x0028, 0x0040, + 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, + 0x0005, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x6124, 0xd1dc, 0x1138, + 0xd1e4, 0x0138, 0x080c, 0x1ac8, 0x709b, 0x001e, 0x0010, 0x709b, + 0x001d, 0x0005, 0x080c, 0x72c5, 0x6124, 0xd1dc, 0x1188, 0x080c, + 0x723c, 0x0016, 0x080c, 0x1ac8, 0x001e, 0xd1d4, 0x1128, 0xd1e4, + 0x0138, 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x723c, + 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x000e, 0x6124, + 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, + 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, + 0x0005, 0x080c, 0x72c5, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, + 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, + 0x709b, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29d1, + 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, + 0xd1e4, 0x0158, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, + 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6, + 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, + 0x1800, 0x2091, 0x8000, 0x080c, 0x73e4, 0x11f8, 0x2001, 0x180c, + 0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200, + 0x080c, 0x2a0b, 0x002e, 0x080c, 0x29b7, 0x6024, 0xd0cc, 0x0148, + 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c, 0x5f41, + 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x73fe, 0x0150, + 0x080c, 0x73f5, 0x1138, 0x2001, 0x0001, 0x080c, 0x2574, 0x080c, + 0x73b8, 0x00a0, 0x080c, 0x72c2, 0x0178, 0x2001, 0x0001, 0x080c, + 0x2574, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, + 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, + 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x724d, 0x080c, + 0x8614, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x724d, + 0x080c, 0x860b, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, + 0x080c, 0x9d09, 0x2071, 0x1800, 0x080c, 0x71e6, 0x001e, 0x00fe, + 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x0126, 0x080c, 0x9d09, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c, + 0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, + 0xa0b0, 0x080c, 0x9f6f, 0x080c, 0x85c0, 0x0036, 0x901e, 0x080c, + 0x9fef, 0x003e, 0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b, + 0x080c, 0xe5b6, 0x2009, 0x0004, 0x080c, 0x29bd, 0x080c, 0x28ea, + 0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x2a0b, + 0x2011, 0x724d, 0x080c, 0x8614, 0x080c, 0x73fe, 0x0118, 0x9006, + 0x080c, 0x29d1, 0x080c, 0x0bc3, 0x2001, 0x0001, 0x080c, 0x2574, + 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, + 0x0005, 0x0026, 0x00e6, 0x2011, 0x725a, 0x2071, 0x1a01, 0x701c, + 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, + 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, + 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x29d1, 0x0156, + 0x20a9, 0x002d, 0x1d04, 0x72d2, 0x2091, 0x6000, 0x1f04, 0x72d2, + 0x015e, 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, 0x0220, 0x0118, + 0x689e, 0x00de, 0x0005, 0x689f, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, + 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8620, 0x0c90, 0x00c6, + 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, + 0x080c, 0x76f7, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, + 0x60e2, 0x6886, 0x080c, 0x2643, 0x9006, 0x080c, 0x29d1, 0x080c, + 0x5dfc, 0x0026, 0x2011, 0xffff, 0x080c, 0x2a0b, 0x002e, 0x602b, + 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197d, + 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, + 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x73a8, 0x709b, + 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, + 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, + 0x080c, 0x2643, 0x080c, 0xa781, 0x0026, 0x080c, 0xaa49, 0x002e, + 0x080c, 0xa79d, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, + 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, + 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xce35, + 0x0118, 0x9006, 0x080c, 0x29fb, 0x0804, 0x73b4, 0x6800, 0x9084, + 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x29b7, 0x6904, 0xd1d4, 0x1140, + 0x2001, 0x0100, 0x080c, 0x29d1, 0x1f04, 0x7359, 0x080c, 0x743b, + 0x012e, 0x015e, 0x080c, 0x73f5, 0x0170, 0x6044, 0x9005, 0x0130, + 0x080c, 0x743b, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4, + 0x1110, 0x080c, 0x743b, 0x080c, 0xce35, 0x0118, 0x9006, 0x080c, + 0x29fb, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, + 0x00c8, 0x2011, 0x725a, 0x080c, 0x85d2, 0x002e, 0x001e, 0x080c, + 0x8417, 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, 0x2003, 0x0004, + 0x080c, 0x70b3, 0x080c, 0x73f5, 0x0138, 0x6804, 0xd0d4, 0x1120, + 0xd0dc, 0x1100, 0x080c, 0x76ed, 0x00ee, 0x00de, 0x00ce, 0x0005, + 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, + 0x1800, 0x080c, 0x842e, 0x080c, 0x8420, 0x080c, 0x76f7, 0x2001, + 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, + 0x2643, 0x9006, 0x080c, 0x29d1, 0x6043, 0x0090, 0x6043, 0x0010, + 0x0026, 0x2011, 0xffff, 0x080c, 0x2a0b, 0x002e, 0x602b, 0x182c, + 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c, 0x2004, + 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600, 0x9084, + 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600, + 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, + 0x5600, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, + 0x080c, 0x5600, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, + 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, + 0x0020, 0x080c, 0x2663, 0x900e, 0x0028, 0x080c, 0x6962, 0x1dc8, + 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x316a, 0x9006, 0x0019, + 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, + 0x080c, 0xce2e, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, + 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, + 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f, + 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c, + 0x2998, 0x0026, 0x2011, 0x0040, 0x080c, 0x2a0b, 0x002e, 0x000e, + 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, + 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2643, 0x2001, + 0x00a0, 0x0006, 0x080c, 0xce35, 0x000e, 0x0130, 0x080c, 0x29ef, + 0x9006, 0x080c, 0x29fb, 0x0010, 0x080c, 0x29d1, 0x000e, 0x6052, + 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, + 0x2948, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x080c, 0xa7df, 0x0158, 0x2001, 0x0386, 0x2004, + 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0xa772, 0x0804, 0x7518, + 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, + 0x602a, 0x2011, 0x0200, 0x080c, 0x2a0b, 0x2001, 0x0090, 0x080c, + 0x29d1, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x74b3, + 0x2091, 0x6000, 0x1f04, 0x74b3, 0x080c, 0xa781, 0x2011, 0x0003, + 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, 0xa0b0, 0x080c, 0x9f6f, + 0x901e, 0x080c, 0x9fef, 0x2001, 0x0386, 0x2003, 0x7000, 0x080c, + 0xa79d, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c, + 0x5f41, 0x080c, 0xce35, 0x0110, 0x080c, 0x0ce9, 0x9085, 0x0001, + 0x04e8, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1ac8, + 0x60e3, 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2, + 0x2001, 0x0080, 0x080c, 0x29d1, 0x20a9, 0x0366, 0x2011, 0x1e00, + 0x080c, 0x2a0b, 0x2009, 0x1e00, 0x080c, 0x29b7, 0x6024, 0x910c, + 0x0140, 0x1d04, 0x74f6, 0x2091, 0x6000, 0x1f04, 0x74f6, 0x0804, + 0x74bc, 0x2001, 0x0386, 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, + 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, + 0x080c, 0xce35, 0x0110, 0x080c, 0x0ce9, 0x9006, 0x00ee, 0x00de, + 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, + 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, + 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, + 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a75, 0x2d04, + 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, + 0x6884, 0x9005, 0x1904, 0x758f, 0x2001, 0x0088, 0x080c, 0x29d1, + 0x9006, 0x60e2, 0x6886, 0x080c, 0x2643, 0x2069, 0x0200, 0x6804, + 0x9005, 0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, + 0x602a, 0x2011, 0x0400, 0x080c, 0x2a0b, 0x2069, 0x198d, 0x7000, + 0x206a, 0x709b, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, + 0x756f, 0x2091, 0x6000, 0x1f04, 0x756f, 0x0804, 0x75c1, 0x2069, + 0x0140, 0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x2a0b, 0x2009, + 0x1e00, 0x080c, 0x29b7, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, + 0x1510, 0x1d04, 0x757b, 0x2091, 0x6000, 0x1f04, 0x757b, 0x080c, + 0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, + 0xa0b0, 0x080c, 0x9f6f, 0x901e, 0x080c, 0x9fef, 0x080c, 0xa79d, + 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c, 0x5f41, + 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x29d1, 0x2069, + 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, + 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2, + 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, + 0x080c, 0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, + 0x080c, 0xa0b0, 0x080c, 0x9f6f, 0x901e, 0x080c, 0x9fef, 0x080c, + 0xa79d, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, + 0x76e8, 0x080c, 0x5f41, 0x0804, 0x7664, 0x2001, 0x180c, 0x200c, + 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x7242, 0x2069, 0x0140, + 0x2001, 0x0080, 0x080c, 0x29d1, 0x60e3, 0x0000, 0x2069, 0x0200, + 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, + 0xfdff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2a0b, 0x2069, 0x198d, + 0x7000, 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804, 0x7664, + 0x2011, 0x1e00, 0x080c, 0x2a0b, 0x2009, 0x1e00, 0x080c, 0x29b7, + 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7620, + 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x845f, 0x00ee, + 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x1a01, 0x7018, + 0x00ee, 0x9005, 0x19e8, 0x0500, 0x0026, 0x2011, 0x725a, 0x080c, + 0x850b, 0x2011, 0x724d, 0x080c, 0x8614, 0x002e, 0x2069, 0x0140, + 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2, 0x2001, + 0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, + 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, + 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, + 0xce2e, 0x1904, 0x76d2, 0x7130, 0xd184, 0x1170, 0x080c, 0x3328, + 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, + 0x7030, 0xd08c, 0x0904, 0x76d2, 0x2011, 0x1848, 0x220c, 0xd1a4, + 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe101, 0x0156, 0x00b6, + 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, + 0x0188, 0x080c, 0x652d, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, + 0x000e, 0x080c, 0xe191, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, + 0x87b6, 0x001e, 0x8108, 0x1f04, 0x769b, 0x00be, 0x015e, 0x001e, + 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, + 0x316a, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, + 0x080c, 0x652d, 0x1110, 0x080c, 0x5f5b, 0x8108, 0x1f04, 0x76c8, + 0x00be, 0x015e, 0x080c, 0x1ac8, 0x080c, 0xa781, 0x080c, 0xaa49, + 0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0x5f41, 0x080c, 0x7315, + 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, + 0x2001, 0x197d, 0x2003, 0x0001, 0x0005, 0x2001, 0x197d, 0x2003, + 0x0000, 0x0005, 0x2001, 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001, + 0x197c, 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, + 0x7007, 0x0000, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa8ab, 0xdcb0, + 0x2900, 0x704e, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa8ab, 0xdcb0, + 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, + 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, + 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, + 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, + 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, + 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, + 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, + 0x2069, 0x18fa, 0x6807, 0x0001, 0x00de, 0x080c, 0x7cdf, 0x9006, + 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d, + 0x1f04, 0x775e, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, + 0x7004, 0x0002, 0x7774, 0x7775, 0x77c0, 0x781b, 0x792b, 0x7772, + 0x7772, 0x7955, 0x080c, 0x0d7d, 0x0005, 0x2079, 0x0040, 0x2001, + 0x1dc0, 0x2003, 0x0000, 0x782c, 0x908c, 0x0780, 0x190c, 0x7dc1, + 0xd0a4, 0x0570, 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1640, + 0x1d04, 0x7792, 0x2001, 0x1a04, 0x200c, 0x8109, 0x0508, 0x2091, + 0x6000, 0x2102, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, + 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, + 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, + 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x1968, 0x080c, 0x781b, + 0x782c, 0xd09c, 0x090c, 0x7cdf, 0x0005, 0x9082, 0x005a, 0x1218, + 0x2100, 0x003b, 0x0c18, 0x080c, 0x7851, 0x0c90, 0x00e3, 0x08f0, + 0x0005, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7873, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x785d, 0x7851, 0x7a46, + 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x785d, 0x7a87, 0x7ac8, + 0x7b0f, 0x7b23, 0x7851, 0x7851, 0x7873, 0x785d, 0x7887, 0x7851, + 0x78ff, 0x7bce, 0x7be9, 0x7851, 0x7873, 0x7851, 0x7887, 0x7851, + 0x7851, 0x78f5, 0x7be9, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7851, 0x7851, 0x7851, 0x789b, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7d65, 0x7851, + 0x7d0f, 0x7851, 0x7d0f, 0x7851, 0x78b0, 0x7851, 0x7851, 0x7851, + 0x7851, 0x7851, 0x7851, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, + 0x1198, 0x782c, 0x080c, 0x7d08, 0xd0a4, 0x0170, 0x7824, 0x2048, + 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, + 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7cdf, 0x0005, 0x7851, + 0x785d, 0x7a32, 0x7851, 0x785d, 0x7851, 0x785d, 0x785d, 0x7851, + 0x785d, 0x7a32, 0x785d, 0x785d, 0x785d, 0x785d, 0x785d, 0x7851, + 0x785d, 0x7a32, 0x7851, 0x7851, 0x785d, 0x7851, 0x7851, 0x7851, + 0x785d, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, 0x0071, 0x00ee, + 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029, + 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868, + 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6c7f, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, + 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x79d4, 0x7007, 0x0003, + 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x79d4, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, + 0x0804, 0x79ef, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, + 0x704b, 0x79ef, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, + 0x7859, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7a0b, 0x7007, + 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7a0b, 0x0005, + 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7859, + 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868, + 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x61d1, 0x1108, + 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, + 0x080c, 0x6c7f, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, + 0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, + 0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, + 0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, + 0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, + 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7c00, 0x2900, + 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, + 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, + 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, + 0x7861, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7861, 0x82ff, 0x1138, + 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7992, 0x0018, 0x9280, + 0x7988, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7973, 0x080c, + 0x1054, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, + 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, + 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, + 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, + 0xa17a, 0x810b, 0xa17e, 0x080c, 0x111b, 0xa06c, 0x908e, 0x0100, + 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, + 0x2048, 0x080c, 0x106d, 0x7014, 0x2048, 0x0804, 0x7861, 0x7020, + 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, + 0x711a, 0x0804, 0x792b, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, + 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7c00, 0x0804, 0x79d4, + 0x798a, 0x798e, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, + 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, + 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, + 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, + 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, + 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, + 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, + 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, + 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, + 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, + 0x1178, 0x080c, 0x5fd3, 0x1108, 0x0005, 0x080c, 0x6ebf, 0x0126, + 0x2091, 0x8000, 0x080c, 0xca1a, 0x080c, 0x6c7f, 0x012e, 0x0ca0, + 0x080c, 0xce2e, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, + 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, 0xa883, + 0x0000, 0x080c, 0x6061, 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6c7f, 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, + 0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11d8, + 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, + 0x080c, 0x6133, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, 0x60ae, + 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, + 0x6c7f, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, + 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, 0xa906, 0x711a, + 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030, 0x7014, + 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, + 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, + 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, + 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, 0x080c, 0x652d, + 0x11b8, 0x0066, 0xae80, 0x080c, 0x663d, 0x006e, 0x0088, 0x0046, + 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, + 0x652d, 0x1110, 0x080c, 0x680c, 0x8108, 0x1f04, 0x7a6f, 0x00ce, + 0xa87c, 0xd084, 0x1120, 0x080c, 0x106d, 0x00be, 0x0005, 0x0126, + 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x00be, 0x0005, 0x0126, + 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6966, 0x0580, 0x2061, + 0x1a6d, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, + 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003, 0x0000, + 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, 0x9005, 0x1110, + 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, + 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, + 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x7cc9, 0x012e, + 0x0804, 0x7cc3, 0x012e, 0x0804, 0x7cbd, 0x012e, 0x0804, 0x7cc0, + 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6966, 0x05e0, + 0x2061, 0x1a6d, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, + 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, + 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001, 0x1508, + 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0xa988, 0x810f, + 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318, 0x0288, + 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250, 0xa890, + 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, + 0x7cc9, 0x012e, 0x0804, 0x7cc6, 0x012e, 0x0804, 0x7cc3, 0x0126, + 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a6d, 0x6300, 0xd38c, + 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x7cd7, + 0x012e, 0x0804, 0x7cc6, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, + 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a6d, + 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, + 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, 0x2004, 0x9005, + 0x0118, 0x080c, 0xab13, 0x0068, 0x6017, 0xf400, 0x6063, 0x0000, + 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x6162, 0x2009, 0x0041, 0x080c, + 0xab77, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, + 0x900e, 0x2011, 0xfdff, 0x080c, 0x87b6, 0x002e, 0xa87c, 0xd0c4, + 0x0148, 0x2061, 0x1a6d, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, + 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7cc9, 0x00ce, + 0x012e, 0x00be, 0x0804, 0x7cc3, 0xa984, 0x9186, 0x002e, 0x0d30, + 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, 0x9186, 0x002a, + 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, + 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, 0x080c, 0x652d, + 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, + 0x6007, 0x0024, 0x2001, 0x1984, 0x2004, 0x601a, 0x0804, 0x7b5e, + 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, 0x1834, + 0x2004, 0x9005, 0x0150, 0x080c, 0xab13, 0x8eff, 0x0118, 0x2e60, + 0x080c, 0xab13, 0x00ee, 0x0804, 0x7b5e, 0x6024, 0xc0dc, 0xc0d5, + 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, + 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, 0x2009, + 0x8020, 0x080c, 0x90e8, 0x00ee, 0x0804, 0x7b5e, 0x2061, 0x1a6d, + 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7cd7, 0x0126, 0x2091, + 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x7cd7, + 0x012e, 0xa883, 0x0016, 0x0804, 0x7cd0, 0xa883, 0x0007, 0x0804, + 0x7cd0, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, + 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x7859, 0x0040, 0x7007, + 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7c00, 0x0005, + 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, + 0x61d0, 0x81ff, 0x1904, 0x7c82, 0x6130, 0xd194, 0x1904, 0x7cac, + 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x0a04, 0x7c76, 0x6068, 0x9e02, + 0x1a04, 0x7c76, 0x7120, 0x9186, 0x0006, 0x1904, 0x7c68, 0x7010, + 0x905d, 0x0904, 0x7c82, 0xb800, 0xd0e4, 0x1904, 0x7ca6, 0x2061, + 0x1a6d, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, + 0xd0dc, 0x1904, 0x7caf, 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, + 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7cb2, + 0x080c, 0x55fc, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, + 0x080c, 0x86a9, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, + 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7cb2, + 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, + 0x00be, 0x0804, 0x7cd0, 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, + 0xa974, 0x080c, 0x652d, 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, + 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, + 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, + 0x0035, 0x0430, 0x080c, 0x5600, 0xd0fc, 0x01e8, 0xa878, 0x2070, + 0x9e82, 0x1ddc, 0x02c0, 0x6068, 0x9e02, 0x12a8, 0x7120, 0x9186, + 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, + 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x7c0c, 0x7003, + 0x0002, 0x0804, 0x7c0c, 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, + 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, + 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, + 0xdce5, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, 0x003e, 0x0058, + 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, + 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, 0x9105, 0xa886, + 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x0005, 0x080c, + 0x106d, 0x0005, 0x00d6, 0x080c, 0x86a0, 0x00de, 0x0005, 0x00d6, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, + 0x01d8, 0x908c, 0x0780, 0x190c, 0x7dc1, 0xd09c, 0x11a8, 0x2071, + 0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001, 0x70c2, 0x702c, + 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, + 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, + 0x0006, 0x9084, 0x0780, 0x190c, 0x7dc1, 0x000e, 0x0005, 0xa898, + 0x9084, 0x0003, 0x05a8, 0x080c, 0xaa82, 0x05d8, 0x2900, 0x6016, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, 0x6028, 0xc0fd, + 0x602a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff, + 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c, + 0x25cf, 0x1540, 0x00b6, 0x080c, 0x652d, 0x2b00, 0x00be, 0x1510, + 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, 0xab77, 0x0005, + 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, + 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, + 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, 0x8000, 0x080c, + 0x6c7f, 0x012e, 0x080c, 0xaad8, 0x0005, 0x00d6, 0x00c6, 0x0036, + 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, + 0x1a04, 0x7db2, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, + 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, + 0x1108, 0x04b0, 0x2b10, 0x080c, 0xaa82, 0x1118, 0x080c, 0xab4a, + 0x05a8, 0x6212, 0xa874, 0x0002, 0x7d90, 0x7d95, 0x7d98, 0x7d9e, + 0x2019, 0x0002, 0x080c, 0xe101, 0x0060, 0x080c, 0xe091, 0x0048, + 0x2019, 0x0002, 0xa980, 0x080c, 0xe0b0, 0x0018, 0xa980, 0x080c, + 0xe091, 0x080c, 0xaad8, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6c7f, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, + 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, + 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, + 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7dc3, 0x0006, 0x0016, 0x2001, + 0x8003, 0x0006, 0x0804, 0x0d86, 0x0005, 0x00f6, 0x2079, 0x0300, + 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, + 0x210c, 0xd1ec, 0x1120, 0x080c, 0x15ff, 0x00fe, 0x0005, 0x2001, + 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, + 0xd08c, 0x0904, 0x7e2f, 0x68c0, 0x90aa, 0x0005, 0x0a04, 0x8417, + 0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d7d, 0x9584, 0x00f6, 0x1508, + 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, + 0x8007, 0x0470, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, + 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, + 0x8100, 0x11c0, 0x080c, 0xe573, 0x080c, 0x830e, 0x7817, 0x0140, + 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x836a, 0x19c8, 0xd5a4, + 0x0148, 0x0046, 0x0056, 0x080c, 0x7e7f, 0x080c, 0x20e9, 0x005e, + 0x004e, 0x0020, 0x080c, 0xe573, 0x7817, 0x0140, 0x0489, 0x0005, + 0x0002, 0x7e3c, 0x8130, 0x7e39, 0x7e39, 0x7e39, 0x7e39, 0x7e39, + 0x7e39, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, + 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, 0x1150, + 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x5653, 0x0070, 0x080c, + 0x7e9f, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x806d, 0x0028, + 0x9286, 0x8000, 0x1110, 0x080c, 0x8244, 0x7817, 0x0140, 0x0005, + 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, + 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, + 0x080c, 0x4a38, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, + 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, + 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, + 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, + 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, + 0x4a38, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, + 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, + 0x9096, 0x0023, 0x1904, 0x803e, 0x9186, 0x0023, 0x15c0, 0x080c, + 0x82d9, 0x0904, 0x803e, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, + 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, + 0x803e, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, + 0x0015, 0x080c, 0xab77, 0x0804, 0x803e, 0x908e, 0x0214, 0x0118, + 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0xab77, 0x0804, + 0x803e, 0x908e, 0x0100, 0x1904, 0x803e, 0x7034, 0x9005, 0x1904, + 0x803e, 0x2009, 0x0016, 0x080c, 0xab77, 0x0804, 0x803e, 0x9186, + 0x0022, 0x1904, 0x803e, 0x7030, 0x908e, 0x0300, 0x1580, 0x68dc, + 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, 0x00ff, 0x697e, + 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, + 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2618, 0x7932, 0x7936, + 0x001e, 0x000e, 0x00fe, 0x080c, 0x25cf, 0x695e, 0x703c, 0x00e6, + 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, 0x7034, + 0x9005, 0x1904, 0x803e, 0x2009, 0x0017, 0x0804, 0x800b, 0x908e, + 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x803e, 0x080c, 0x73e4, + 0x0120, 0x2009, 0x001d, 0x0804, 0x800b, 0x68dc, 0xc0a5, 0x68de, + 0x2009, 0x0030, 0x0804, 0x800b, 0x908e, 0x0500, 0x1140, 0x7034, + 0x9005, 0x1904, 0x803e, 0x2009, 0x0018, 0x0804, 0x800b, 0x908e, + 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x800b, 0x908e, 0x2110, + 0x1120, 0x2009, 0x001a, 0x0804, 0x800b, 0x908e, 0x5200, 0x1140, + 0x7034, 0x9005, 0x1904, 0x803e, 0x2009, 0x001b, 0x0804, 0x800b, + 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x803e, 0x2009, + 0x001c, 0x0804, 0x800b, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, + 0x0804, 0x800b, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, + 0x803e, 0x2009, 0x0024, 0x0804, 0x800b, 0x908c, 0xff00, 0x918e, + 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, + 0x0904, 0x800b, 0x080c, 0xd522, 0x1904, 0x803e, 0x0804, 0x8009, + 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, + 0x800b, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x800b, + 0x908e, 0x5300, 0x1108, 0x0448, 0x908e, 0x6104, 0x1530, 0x2029, + 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, + 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, + 0x080c, 0x4a38, 0x004e, 0x8108, 0x0f04, 0x7fbf, 0x9186, 0x0280, + 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, + 0x0000, 0x2009, 0x0023, 0x0804, 0x800b, 0x908e, 0x6000, 0x1120, + 0x2009, 0x003f, 0x0804, 0x800b, 0x908e, 0x5400, 0x1138, 0x080c, + 0x83c7, 0x1904, 0x803e, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, + 0x1148, 0x080c, 0x83ef, 0x1118, 0x2009, 0x0041, 0x0460, 0x2009, + 0x0042, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, + 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, + 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, + 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, + 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, + 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x25cf, 0x1568, 0x080c, 0x64cc, 0x1550, 0xbe12, + 0xbd16, 0x001e, 0x0016, 0xb884, 0x9005, 0x1168, 0x9186, 0x0046, + 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506, 0x9084, 0xff00, + 0x1110, 0x001e, 0x0098, 0x080c, 0xaa82, 0x01a8, 0x2b08, 0x6112, + 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, + 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xab77, 0x00ce, 0x00be, + 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, + 0x2011, 0x8049, 0x080c, 0x4a38, 0x080c, 0xab4a, 0x0d90, 0x2b08, + 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, + 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, + 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, + 0x6003, 0x0001, 0x080c, 0x90ef, 0x08a0, 0x080c, 0x32f2, 0x1140, + 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, + 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, + 0x9186, 0x0033, 0x11e8, 0x080c, 0x82d9, 0x0904, 0x80c8, 0x7124, + 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0, + 0x2009, 0x0015, 0x080c, 0xab77, 0x0498, 0x908e, 0x0100, 0x1580, + 0x7034, 0x9005, 0x1568, 0x2009, 0x0016, 0x080c, 0xab77, 0x0440, + 0x9186, 0x0032, 0x1528, 0x7030, 0x908e, 0x1400, 0x1508, 0x2009, + 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x25cf, 0x11a8, 0x080c, 0x64cc, 0x1190, 0xbe12, 0xbd16, 0x080c, + 0xaa82, 0x0168, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0004, + 0x7120, 0x610a, 0x001e, 0x080c, 0xab77, 0x0010, 0x00ce, 0x001e, + 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, 0x00d6, + 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, 0x02a0, + 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x812a, 0x9596, + 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x812a, 0x9596, 0xfffc, + 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, 0x1837, + 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, + 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, 0x2e1c, + 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, 0x01b8, + 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, 0x1120, + 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, 0x007e, + 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, 0x8420, + 0x8e70, 0x1f04, 0x80ff, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, + 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, 0x0005, + 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x0002, 0x8147, + 0x8147, 0x8147, 0x82eb, 0x8147, 0x814a, 0x816f, 0x81f8, 0x8147, + 0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x7817, + 0x0140, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, + 0x9c8c, 0x0003, 0x11c0, 0x9c8a, 0x1ddc, 0x02a8, 0x6868, 0x9c02, + 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, + 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, + 0x0046, 0x080c, 0xab77, 0x7817, 0x0140, 0x00be, 0x0005, 0x00b6, + 0x00c6, 0x9484, 0x0fff, 0x0904, 0x81d4, 0x7110, 0xd1bc, 0x1904, + 0x81d4, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, + 0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, 0x3334, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x81d4, 0x9182, + 0x0801, 0x1a04, 0x81d4, 0x9190, 0x1000, 0x2204, 0x905d, 0x05e0, + 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, 0xff00, + 0x9286, 0x0600, 0x1190, 0x080c, 0xaa82, 0x0598, 0x2b08, 0x7028, + 0x6052, 0x702c, 0x604e, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, + 0x7130, 0x615e, 0x080c, 0xd784, 0x00f8, 0x080c, 0x696a, 0x1138, + 0xb807, 0x0606, 0x0c40, 0x190c, 0x80cc, 0x11b0, 0x0880, 0x080c, + 0xaa82, 0x2b08, 0x0188, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, + 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, + 0x6003, 0x0001, 0x080c, 0x90ef, 0x7817, 0x0140, 0x00ce, 0x00be, + 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, + 0x080c, 0x4a38, 0x080c, 0xab4a, 0x0d78, 0x2b08, 0x6112, 0x6023, + 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x6017, 0xf300, 0x6003, + 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x90e8, 0x08e0, + 0x00b6, 0x7110, 0xd1bc, 0x05d0, 0x7020, 0x2060, 0x9c84, 0x0003, + 0x15a8, 0x9c82, 0x1ddc, 0x0690, 0x6868, 0x9c02, 0x1678, 0x9484, + 0x0fff, 0x9082, 0x000c, 0x0650, 0x7008, 0x9084, 0x00ff, 0x6110, + 0x2158, 0xb910, 0x9106, 0x1510, 0x700c, 0xb914, 0x9106, 0x11f0, + 0x7124, 0x610a, 0x601c, 0xd0fc, 0x11c8, 0x2001, 0x0271, 0x2004, + 0x9005, 0x1180, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0158, 0x0066, + 0x2031, 0x0100, 0xa001, 0xa001, 0x8631, 0x1de0, 0x006e, 0x601c, + 0xd0fc, 0x1120, 0x2009, 0x0045, 0x080c, 0xab77, 0x7817, 0x0140, + 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, + 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x32f2, 0x1168, 0x7010, + 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, + 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, 0x825b, 0x825c, 0x825b, + 0x825b, 0x82bb, 0x82ca, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, + 0x702c, 0xd084, 0x0904, 0x82b9, 0x700c, 0x7108, 0x080c, 0x25cf, + 0x1904, 0x82b9, 0x080c, 0x64cc, 0x1904, 0x82b9, 0xbe12, 0xbd16, + 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x696a, 0x0118, 0x9086, 0x0004, + 0x1588, 0x00c6, 0x080c, 0x82d9, 0x00ce, 0x05d8, 0x080c, 0xaa82, + 0x2b08, 0x05b8, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0002, 0x7120, + 0x610a, 0x2009, 0x0088, 0x080c, 0xab77, 0x0458, 0x080c, 0x696a, + 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6972, 0x0118, 0x9086, + 0x0004, 0x1180, 0x080c, 0xaa82, 0x2b08, 0x01d8, 0x6112, 0x080c, + 0xcbb0, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, + 0xab77, 0x0078, 0x080c, 0xaa82, 0x2b08, 0x0158, 0x6112, 0x080c, + 0xcbb0, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, + 0xab77, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, + 0x080c, 0x823a, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, + 0xab77, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, + 0x823a, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xab77, + 0x0005, 0x7020, 0x2060, 0x9c84, 0x0003, 0x1158, 0x9c82, 0x1ddc, + 0x0240, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, + 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, + 0x2060, 0x9c84, 0x0003, 0x11b0, 0x9c82, 0x1ddc, 0x0298, 0x6868, + 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, + 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, + 0x080c, 0xab77, 0x7817, 0x0140, 0x00be, 0x0005, 0x2031, 0x0105, + 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207, + 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x0096, + 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05c0, 0x080c, + 0xaa82, 0x05a8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, + 0x8211, 0x220c, 0x080c, 0x25cf, 0x1590, 0x080c, 0x64cc, 0x1578, + 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xcbb0, + 0x080c, 0x103b, 0x0500, 0x2900, 0x6062, 0x9006, 0xa802, 0xa866, + 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, 0x20e8, + 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007, + 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x00fe, + 0x009e, 0x00ce, 0x0005, 0x080c, 0xaad8, 0x006e, 0x0cc0, 0x004e, + 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, + 0x810f, 0x9086, 0x2000, 0x1904, 0x83c1, 0x9186, 0x0022, 0x15f0, + 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x83c3, 0x7030, 0x908e, + 0x0400, 0x0904, 0x83c3, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, + 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, 0xd18c, + 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6928, 0x0558, 0x68b0, 0x9084, + 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518, 0x6880, 0x69b0, + 0x918c, 0xff00, 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, + 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, + 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, + 0x1140, 0x080c, 0x82d9, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, + 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x0156, + 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, + 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x027a, + 0x080c, 0xba99, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, + 0x1801, 0x2011, 0x027e, 0x080c, 0xba99, 0x1120, 0xd494, 0x0110, + 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x0156, + 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, + 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0272, + 0x080c, 0xba99, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, + 0x1801, 0x2011, 0x0276, 0x080c, 0xba99, 0x1120, 0xd494, 0x0110, + 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x00f6, + 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, + 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, + 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x1a01, + 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, + 0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, 0x702b, 0x9d2b, 0x7032, + 0x7037, 0x9da8, 0x703f, 0xffff, 0x7042, 0x7047, 0x5493, 0x704a, + 0x705b, 0x85db, 0x080c, 0x1054, 0x090c, 0x0d7d, 0x2900, 0x703a, + 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, + 0x1a01, 0x1d04, 0x84fa, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, + 0x1590, 0x2001, 0x013c, 0x2004, 0x9005, 0x190c, 0x8685, 0x2001, + 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, + 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d7d, 0x700f, + 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800, + 0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x8649, 0x0010, + 0x080c, 0x8620, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, + 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, + 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, + 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, + 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, + 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, + 0x090c, 0x9e44, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, + 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, + 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, + 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, + 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, + 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, + 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, + 0x080f, 0x012e, 0x7004, 0x0002, 0x8522, 0x8523, 0x854d, 0x00e6, + 0x2071, 0x1a01, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, + 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a01, 0x701c, + 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, + 0x0005, 0x00e6, 0x2071, 0x1a01, 0xb888, 0x9102, 0x0208, 0xb98a, + 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c, + 0x652d, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126, + 0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, 0x0138, 0x0026, 0xba3c, + 0x0016, 0x080c, 0x6658, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108, + 0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e, + 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014, + 0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001, + 0x604a, 0x1110, 0x080c, 0xca31, 0x6018, 0x9005, 0x0904, 0x85a2, + 0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x85b5, 0x781b, + 0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, 0x0804, + 0x85b5, 0x8001, 0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918, + 0xd1ac, 0x1dd0, 0x010e, 0x00fe, 0x1528, 0x6120, 0x9186, 0x0003, + 0x0148, 0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11c8, 0x611c, + 0xd1c4, 0x1100, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, + 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, + 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x080c, 0xce61, 0x0110, + 0x080c, 0xc421, 0x012e, 0x9c88, 0x001c, 0x7116, 0x2001, 0x181a, + 0x2004, 0x9102, 0x1228, 0x8631, 0x0138, 0x2160, 0x0804, 0x8551, + 0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6, + 0x2071, 0x1a01, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, + 0x2001, 0x1a0a, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1a01, + 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a0d, 0x2013, + 0x0000, 0x0005, 0x00e6, 0x2071, 0x1a01, 0x711a, 0x721e, 0x700b, + 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, + 0x2001, 0x1a0f, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, + 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, + 0x111b, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x845f, + 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x1a01, 0x7172, 0x7276, + 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a01, + 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, + 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, + 0x6a54, 0x6874, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c1, 0x0088, + 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69ee, + 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094, + 0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ee, 0x080c, 0x0f05, 0x002e, + 0x0005, 0x69e8, 0x9184, 0x003f, 0x05b8, 0x8109, 0x9184, 0x003f, + 0x01a8, 0x6a54, 0x6874, 0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc, + 0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x0f27, 0x00ee, 0x0400, 0x69ea, 0x00f0, 0x0026, 0x8107, + 0x9094, 0x0007, 0x0128, 0x8001, 0x8007, 0x9085, 0x0007, 0x0050, + 0x2010, 0x8004, 0x8004, 0x8004, 0x9084, 0x0007, 0x9205, 0x8007, + 0x9085, 0x0028, 0x9086, 0x0040, 0x2010, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x0f27, 0x00ee, 0x002e, 0x0005, 0x0016, 0x00c6, 0x2009, + 0xfffc, 0x210d, 0x2061, 0x0100, 0x60f0, 0x9100, 0x60f3, 0x0000, + 0x2009, 0xfffc, 0x200f, 0x1220, 0x8108, 0x2105, 0x8000, 0x200f, + 0x00ce, 0x001e, 0x0005, 0x00c6, 0x2061, 0x1a6d, 0x00ce, 0x0005, + 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a6d, 0x2060, + 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, + 0x2061, 0x1a6d, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, + 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, + 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x8760, + 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x8739, 0x2009, 0x0006, 0x080c, + 0x878d, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, + 0x05c8, 0x908c, 0x2023, 0x1550, 0x87ff, 0x1540, 0x6124, 0x918c, + 0x0500, 0x1520, 0x6100, 0x918e, 0x0007, 0x1500, 0x2009, 0x1869, + 0x210c, 0xd184, 0x11d8, 0x6003, 0x0003, 0x6007, 0x0043, 0x6047, + 0xb035, 0x080c, 0x1be0, 0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, + 0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, + 0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, + 0x0120, 0x918e, 0x0003, 0x1904, 0x8787, 0x908c, 0x2020, 0x918e, + 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, + 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xab77, + 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0xab77, 0x6110, + 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, + 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, + 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, + 0x1904, 0x8787, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, + 0x00f6, 0x2c78, 0x080c, 0x1728, 0x00fe, 0x007e, 0x87ff, 0x1120, + 0x2009, 0x0042, 0x080c, 0xab77, 0x0005, 0x6110, 0x00b6, 0x2158, + 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, + 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, + 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, + 0x080c, 0xab77, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, + 0x0043, 0x080c, 0xab77, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, + 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, + 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xc723, + 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, + 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, + 0x2061, 0x1a6d, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, + 0x6206, 0x00ce, 0x080c, 0x6ab4, 0x6014, 0x904d, 0x0076, 0x2039, + 0x0000, 0x190c, 0x86a9, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, + 0x2061, 0x1a6d, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, + 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, + 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, + 0x1923, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, + 0x0001, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa867, 0x0006, 0xa86b, + 0x0001, 0xa8ab, 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, + 0x0000, 0x0005, 0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, + 0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, + 0x702a, 0xa89a, 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, 0x0028, + 0x200a, 0x9005, 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, + 0x2100, 0x9210, 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, + 0x0178, 0xc084, 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, + 0x181d, 0x2104, 0x9082, 0x0007, 0x2009, 0x1b4c, 0x200a, 0x000e, + 0xc095, 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x1670, 0x9006, + 0x2071, 0x193c, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, + 0x00e6, 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, + 0x2001, 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, + 0x9080, 0x0008, 0x1f04, 0x8840, 0x71c0, 0x9102, 0x02e0, 0x2071, + 0x1877, 0x20a9, 0x0007, 0x00c6, 0x080c, 0xaa82, 0x6023, 0x0009, + 0x6003, 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, + 0x080c, 0x89c6, 0x012e, 0x1f04, 0x884c, 0x9006, 0x00ce, 0x015e, + 0x012e, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, + 0x0096, 0x0086, 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, + 0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, + 0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x103b, 0x090c, 0x0d7d, + 0x2900, 0x6016, 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, + 0xa87a, 0xa8aa, 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, + 0x7010, 0xa89e, 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, + 0x0160, 0x080c, 0x103b, 0x090c, 0x0d7d, 0xad66, 0x2b00, 0xa802, + 0x2900, 0xb806, 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, + 0x008e, 0x009e, 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, + 0x1923, 0x7004, 0x004b, 0x700c, 0x0002, 0x88b8, 0x88b1, 0x88b1, + 0x0005, 0x88c2, 0x8923, 0x8923, 0x8923, 0x8924, 0x8935, 0x8935, + 0x700c, 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, + 0x0128, 0x78a0, 0x79a0, 0x9106, 0x1904, 0x8916, 0x2001, 0x0005, + 0x2004, 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, + 0x0ca8, 0x012e, 0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, + 0x080c, 0x8964, 0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, + 0x0210, 0x2009, 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935, + 0x2004, 0x9100, 0x9202, 0x0e48, 0x080c, 0x8ab0, 0x2200, 0x9102, + 0x0208, 0x2208, 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, + 0x080c, 0x8bb9, 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, + 0x2091, 0x8000, 0x2009, 0x1a1f, 0x2104, 0xc085, 0x200a, 0x700f, + 0x0002, 0x012e, 0x080c, 0x113a, 0x1de8, 0x0005, 0x2001, 0x0005, + 0x2004, 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, + 0x0ca8, 0x012e, 0x0005, 0x0005, 0x700c, 0x0002, 0x8929, 0x892c, + 0x892b, 0x080c, 0x88c0, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, + 0x2048, 0xa974, 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, + 0x2048, 0x7018, 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, + 0x7020, 0xa892, 0x9006, 0x0068, 0x0006, 0x080c, 0x8bb9, 0x2100, + 0xaa8c, 0x9210, 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, + 0x000e, 0x009e, 0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005, + 0x00e6, 0x2071, 0x1923, 0x700c, 0x0002, 0x8962, 0x8962, 0x8960, + 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, + 0x9005, 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, + 0x0000, 0x080c, 0x89cf, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, + 0x080c, 0x8a16, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1054, 0x2900, + 0x009e, 0x0148, 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, + 0x0000, 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, + 0x00a6, 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, + 0x000f, 0x2068, 0x9d88, 0x1e31, 0x2165, 0x0056, 0x2029, 0x0000, + 0x080c, 0x8b3e, 0x080c, 0x1e07, 0x1dd8, 0x005e, 0x00ae, 0x2001, + 0x187f, 0x2004, 0xa88a, 0x080c, 0x1728, 0x781f, 0x0101, 0x7813, + 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x8a25, 0x012e, 0x008e, + 0x00ce, 0x00de, 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, + 0x7032, 0x2001, 0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, + 0x1923, 0x7030, 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, + 0x00c6, 0x0026, 0x9b80, 0x8c98, 0x2005, 0x906d, 0x090c, 0x0d7d, + 0x9b80, 0x8c90, 0x2005, 0x9065, 0x090c, 0x0d7d, 0x6114, 0x2600, + 0x9102, 0x0248, 0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, + 0x00ce, 0x00de, 0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084, + 0x1178, 0xc085, 0x6856, 0x2011, 0x8026, 0x080c, 0x4a38, 0x684c, + 0x0096, 0x904d, 0x090c, 0x0d7d, 0xa804, 0x8000, 0xa806, 0x009e, + 0x9006, 0x2030, 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, + 0x2011, 0x8025, 0x080c, 0x4a38, 0x684c, 0x0096, 0x904d, 0x090c, + 0x0d7d, 0xa800, 0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019, + 0x0008, 0x8319, 0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020, + 0x0210, 0x9302, 0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, + 0x090c, 0x0d7d, 0x781c, 0x9084, 0x0101, 0x9086, 0x0101, 0x190c, + 0x0d7d, 0x2069, 0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, + 0x6904, 0x8108, 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, + 0x193e, 0x2003, 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, + 0x6014, 0x2048, 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x106d, + 0x009e, 0xa8ab, 0x0000, 0x080c, 0x0fed, 0x080c, 0xaad8, 0x00ce, + 0x009e, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, + 0x0110, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, + 0x0000, 0x0178, 0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, + 0x8dcb, 0x00be, 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, + 0x0861, 0x0005, 0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, + 0x2071, 0x1923, 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, + 0x0000, 0x7112, 0x2001, 0x003b, 0x080c, 0x1670, 0x00ee, 0x0005, + 0x0096, 0x00d6, 0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, + 0x7016, 0x702a, 0x7026, 0x702f, 0x0000, 0x080c, 0x8c18, 0x0170, + 0x080c, 0x8c4d, 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, + 0x0001, 0x701f, 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, + 0x00e6, 0x0096, 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, + 0x2100, 0x9202, 0x1618, 0x080c, 0x8c4d, 0x090c, 0x0d7d, 0x7018, + 0x9005, 0x1160, 0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006, + 0x700e, 0xa806, 0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806, + 0x2900, 0xa002, 0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012, + 0x701c, 0x9080, 0x000a, 0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce, + 0x00de, 0x008e, 0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, + 0x0146, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300, + 0x831f, 0x831e, 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, + 0x9398, 0x0003, 0x7104, 0x080c, 0x8bb9, 0x810c, 0x2100, 0x9318, + 0x8003, 0x2228, 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, + 0x2500, 0x8004, 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, + 0x080c, 0x8bc2, 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, + 0x9102, 0x701e, 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, + 0x7000, 0x2048, 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, + 0x080c, 0x8ab0, 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, + 0x0000, 0x0008, 0x7106, 0x2500, 0x9212, 0x1904, 0x8aef, 0x012e, + 0x00ee, 0x014e, 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x9580, 0x8c90, 0x2005, 0x9075, + 0x090c, 0x0d7d, 0x080c, 0x8b94, 0x012e, 0x9580, 0x8c8c, 0x2005, + 0x9075, 0x090c, 0x0d7d, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, + 0x831f, 0x831e, 0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, + 0x9100, 0x2098, 0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, + 0x20a9, 0x0002, 0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8b7e, 0x8b7e, + 0x8b80, 0x8b7e, 0x8b80, 0x8b7e, 0x8b7e, 0x8b7e, 0x8b7e, 0x8b7e, + 0x8b86, 0x8b7e, 0x8b86, 0x8b7e, 0x8b7e, 0x8b7e, 0x080c, 0x0d7d, + 0x4104, 0x20a9, 0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, + 0x4003, 0x4104, 0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016, + 0x710c, 0x2110, 0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210, + 0x9282, 0x000a, 0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158, + 0x0006, 0x080c, 0x8c5c, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, + 0x7010, 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e, + 0x0005, 0x0006, 0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008, + 0x000e, 0x0005, 0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092, + 0x000c, 0x0240, 0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, + 0x000e, 0x0005, 0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, + 0x6810, 0x2019, 0x0001, 0x2031, 0x8c02, 0x9112, 0x0220, 0x0118, + 0x8318, 0x2208, 0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a, + 0x6804, 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, + 0x0967, 0x0a67, 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, + 0x9082, 0x0002, 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, + 0x0a67, 0x0cd0, 0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, + 0x1800, 0x7128, 0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210, + 0x8318, 0x0cd8, 0x2031, 0x8c15, 0x0870, 0x6c16, 0x00ee, 0x0005, + 0x0096, 0x0046, 0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x8c94, + 0x2005, 0x9005, 0x090c, 0x0d7d, 0x2004, 0x90a0, 0x000a, 0x080c, + 0x1054, 0x01d0, 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, + 0x080c, 0x1054, 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, + 0x7026, 0x94a2, 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, + 0x012e, 0x004e, 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, + 0xac00, 0x080c, 0x106d, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, + 0x7024, 0x2048, 0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000, + 0xa807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, + 0xa802, 0x2900, 0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, + 0x2004, 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x106d, + 0x000e, 0x0cb8, 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, + 0x2048, 0xa800, 0x0006, 0x080c, 0x106d, 0x000e, 0x0cb8, 0x9006, + 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, + 0x7026, 0x702e, 0x009e, 0x0005, 0x1a6b, 0x0000, 0x0000, 0x0000, + 0x1930, 0x0000, 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, + 0x1877, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, + 0xa8a8, 0x2040, 0x2071, 0x1877, 0x080c, 0x8db6, 0xa067, 0x0023, + 0x6010, 0x905d, 0x0904, 0x8d8b, 0xb814, 0xa06e, 0xb910, 0xa172, + 0xb9a0, 0xa176, 0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, + 0x0000, 0xa898, 0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, + 0x2031, 0x0018, 0xa068, 0x908a, 0x0019, 0x1a0c, 0x0d7d, 0x2020, + 0x2050, 0x2940, 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, + 0x1e31, 0x2c65, 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, + 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x8cf8, 0x8cf8, 0x8cfa, + 0x8cf8, 0x8cf8, 0x8cf8, 0x8cfc, 0x8cf8, 0x8cf8, 0x8cf8, 0x8cfe, + 0x8cf8, 0x8cf8, 0x8cf8, 0x8d00, 0x8cf8, 0x8cf8, 0x8cf8, 0x8d02, + 0x8cf8, 0x8cf8, 0x8cf8, 0x8d04, 0x8cf8, 0x8cf8, 0x8cf8, 0x8d06, + 0x080c, 0x0d7d, 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, + 0xa1b0, 0x0488, 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, + 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x8d2a, + 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d2c, 0x8d28, 0x8d28, + 0x8d28, 0x8d28, 0x8d28, 0x8d2e, 0x8d28, 0x8d28, 0x8d28, 0x8d28, + 0x8d28, 0x8d30, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d32, + 0x080c, 0x0d7d, 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, + 0xa1c8, 0x0008, 0xa1e0, 0x2600, 0x0002, 0x8d4e, 0x8d50, 0x8d52, + 0x8d54, 0x8d56, 0x8d58, 0x8d5a, 0x8d5c, 0x8d5e, 0x8d60, 0x8d62, + 0x8d64, 0x8d66, 0x8d68, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d70, 0x8d72, + 0x8d74, 0x8d76, 0x8d78, 0x8d7a, 0x8d7c, 0x8d7e, 0x080c, 0x0d7d, + 0xb9e2, 0x0468, 0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, + 0xb9d2, 0x0428, 0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, + 0xb9c2, 0x00e8, 0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, + 0xb9b2, 0x00a8, 0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, + 0xb9a2, 0x0068, 0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, + 0xb992, 0x0028, 0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, + 0x8421, 0x0120, 0x080c, 0x1e07, 0x0804, 0x8cd2, 0x00ae, 0x00be, + 0x00ce, 0x00ee, 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, + 0x00ff, 0x9006, 0x0804, 0x8cb4, 0x0006, 0x0016, 0x00b6, 0x6010, + 0x2058, 0xb810, 0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, + 0x0188, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, + 0x0046, 0xbba0, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4a38, + 0x004e, 0x003e, 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, + 0xa834, 0x910a, 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, + 0x0238, 0x0130, 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, + 0xaa8a, 0xa26a, 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, + 0x781b, 0x0200, 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, + 0xa001, 0x7818, 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, + 0x2079, 0x0000, 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, + 0x9106, 0x0140, 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0d7d, + 0x2068, 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, + 0x781b, 0x0200, 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, + 0x0096, 0x00c6, 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, + 0x01ff, 0x2071, 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, + 0x1f04, 0x8e0b, 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, + 0x1d90, 0xb8ac, 0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, + 0x0004, 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, + 0x2048, 0xa88b, 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, + 0x0d7d, 0x080c, 0x106d, 0x080c, 0x89c6, 0x0c18, 0x2071, 0x0300, + 0x701b, 0x0200, 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, + 0x00ee, 0x0005, 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, + 0x25cf, 0x015e, 0x11b0, 0x080c, 0x64cc, 0x190c, 0x0d7d, 0x000e, + 0x001e, 0xb912, 0xb816, 0x080c, 0xaa82, 0x0140, 0x2b00, 0x6012, + 0x6023, 0x0001, 0x2009, 0x0001, 0x080c, 0xab77, 0x00be, 0x00ce, + 0x0005, 0x000e, 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, + 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0x8e7d, 0x8e7d, 0x8e7d, + 0x8e7f, 0x8ec8, 0x8e7d, 0x8e7d, 0x8e7d, 0x8f2b, 0x8e7d, 0x8f63, + 0x8e7d, 0x8e7d, 0x8e7d, 0x8e7d, 0x8e7d, 0x080c, 0x0d7d, 0x9182, + 0x0040, 0x0002, 0x8e92, 0x8e92, 0x8e92, 0x8e92, 0x8e92, 0x8e92, + 0x8e92, 0x8e92, 0x8e92, 0x8e94, 0x8ea5, 0x8e92, 0x8e92, 0x8e92, + 0x8e92, 0x8eb6, 0x080c, 0x0d7d, 0x0096, 0x6114, 0x2148, 0xa87b, + 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, + 0x6a7f, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0x9505, 0x00d6, + 0x6114, 0x080c, 0xc723, 0x0130, 0x0096, 0x6114, 0x2148, 0x080c, + 0x6c7f, 0x009e, 0x00de, 0x080c, 0xaad8, 0x0005, 0x080c, 0x9505, + 0x080c, 0x31ab, 0x6114, 0x0096, 0x2148, 0x080c, 0xc723, 0x0120, + 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8, 0x0005, + 0x601b, 0x0000, 0x9182, 0x0040, 0x0096, 0x0002, 0x8ee3, 0x8ee3, + 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee5, 0x8ee3, + 0x8ee3, 0x8ee3, 0x8f27, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, + 0x8ee3, 0x8eeb, 0x8ee3, 0x080c, 0x0d7d, 0x6114, 0x2148, 0xa938, + 0x918e, 0xffff, 0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8c9c, + 0x0096, 0xa8a8, 0x2048, 0x080c, 0x6a17, 0x009e, 0xa8ab, 0x0000, + 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8dcb, 0x00be, + 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x89cf, 0x00be, 0x01e0, + 0x2071, 0x193c, 0x080c, 0x8a16, 0x01b8, 0x9086, 0x0001, 0x1128, + 0x2001, 0x1946, 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x103b, + 0x2900, 0x009e, 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x898d, + 0x00fe, 0x00ee, 0x009e, 0x0005, 0x080c, 0x89c6, 0x0cd0, 0x080c, + 0x8fdf, 0x009e, 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8f3f, + 0x8f3f, 0x8f3f, 0x8f41, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f61, 0x8f3f, + 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x080c, + 0x0d7d, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa836, + 0xa8b0, 0xa83a, 0xa847, 0x0000, 0xa84b, 0x0000, 0xa884, 0x9092, + 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, + 0x621a, 0x080c, 0x1ba3, 0x2009, 0x8030, 0x080c, 0x912f, 0x009e, + 0x0005, 0x080c, 0x0d7d, 0x080c, 0x9505, 0x6114, 0x2148, 0xa87b, + 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, + 0x6c7f, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0xa781, 0x6144, + 0xd1fc, 0x0120, 0xd1ac, 0x1110, 0x6003, 0x0003, 0x6000, 0x908a, + 0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0023, 0x009e, 0x080c, 0xa79d, + 0x0005, 0x8f99, 0x8f99, 0x8f99, 0x8f9b, 0x8fac, 0x8f99, 0x8f99, + 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, + 0x8f99, 0x080c, 0x0d7d, 0x080c, 0xa915, 0x6114, 0x2148, 0xa87b, + 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, + 0x6c7f, 0x080c, 0xaad8, 0x0005, 0x0491, 0x0005, 0x080c, 0xa781, + 0x6000, 0x6144, 0xd1fc, 0x0130, 0xd1ac, 0x1120, 0x6003, 0x0003, + 0x2009, 0x0003, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0033, + 0x009e, 0x0106, 0x080c, 0xa79d, 0x010e, 0x0005, 0x8fd6, 0x8fd6, + 0x8fd6, 0x8fd8, 0x8fdf, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, + 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x080c, 0x0d7d, + 0x0036, 0x00e6, 0x080c, 0xa915, 0x00ee, 0x003e, 0x0005, 0x00f6, + 0x00e6, 0x601b, 0x0000, 0x6014, 0x2048, 0x6010, 0x9005, 0x0128, + 0x00b6, 0x2058, 0x080c, 0x8dcb, 0x00be, 0x2071, 0x193c, 0x080c, + 0x8a16, 0x0160, 0x2001, 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, + 0x2c78, 0x080c, 0x898d, 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, + 0x0000, 0xa8a8, 0x2048, 0x080c, 0x106d, 0x009e, 0xa8ab, 0x0000, + 0x080c, 0x89c6, 0x0c80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x187a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, + 0x20a9, 0x0010, 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, + 0x1f04, 0x9024, 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, + 0x01c8, 0x911a, 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, + 0x1f04, 0x903b, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x903b, + 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, + 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, + 0x2091, 0x2800, 0x2079, 0x19e5, 0x012e, 0x00d6, 0x2069, 0x19e5, + 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, + 0x0200, 0x080c, 0xa57b, 0x04a9, 0x080c, 0xa566, 0x0491, 0x080c, + 0xa569, 0x0479, 0x080c, 0xa56c, 0x0461, 0x080c, 0xa56f, 0x0449, + 0x080c, 0xa572, 0x0431, 0x080c, 0xa575, 0x0419, 0x080c, 0xa578, + 0x0401, 0x01de, 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, 0x2079, + 0x0380, 0x00f9, 0x7807, 0x0003, 0x7803, 0x0000, 0x7803, 0x0001, + 0x2069, 0x0004, 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, 0x206a, + 0x2069, 0x0100, 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de, + 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, + 0x0005, 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, + 0x0400, 0x7827, 0x0031, 0x782b, 0x1aed, 0x781f, 0xff00, 0x781b, + 0xff00, 0x2061, 0x1ae2, 0x602f, 0x19e5, 0x6033, 0x1800, 0x6037, + 0x1a01, 0x603b, 0x1e31, 0x603f, 0x1e41, 0x6042, 0x6047, 0x1ab8, + 0x00ce, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0001, 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, + 0x19e5, 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, + 0x0003, 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, + 0x6146, 0x2c08, 0x2001, 0x0012, 0x080c, 0xa772, 0x0005, 0x0016, + 0x2009, 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, + 0x0007, 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0xa772, + 0x0088, 0x00c6, 0x2061, 0x19e5, 0x602c, 0x8000, 0x602e, 0x600c, + 0x9005, 0x0128, 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112, + 0x610e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, + 0x0007, 0x9086, 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, + 0x2c08, 0x2061, 0x19e5, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, + 0x2102, 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, + 0x600f, 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0xa772, 0x0005, + 0x6044, 0xd0dc, 0x0128, 0x9006, 0x7007, 0x0000, 0x700a, 0x7032, + 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, + 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, + 0x2071, 0x19e5, 0x7648, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, + 0x0904, 0x91ba, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x91b5, + 0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x91b5, 0x704c, 0x9c06, + 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x703f, 0x0000, + 0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x2029, 0x0001, + 0x080c, 0x9138, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, + 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, + 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xc723, 0x01c8, 0x6014, + 0x2048, 0x6020, 0x9086, 0x0003, 0x1560, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xca1a, 0x080c, + 0xe4e4, 0x080c, 0x6c7f, 0x007e, 0x003e, 0x001e, 0x080c, 0xc90b, + 0x080c, 0xab13, 0x00ce, 0x0804, 0x9157, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x9157, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, + 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, + 0x080c, 0xe4e4, 0x080c, 0xe134, 0x007e, 0x003e, 0x001e, 0x08c0, + 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, + 0x0076, 0x080c, 0x6c7f, 0x080c, 0xaad8, 0x007e, 0x003e, 0x001e, + 0x0848, 0x6020, 0x9086, 0x000a, 0x0904, 0x919f, 0x0804, 0x919d, + 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, + 0x2091, 0x8000, 0x2079, 0x19e5, 0x7848, 0x9065, 0x0904, 0x924f, + 0x600c, 0x0006, 0x600f, 0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036, + 0x2019, 0x0001, 0x080c, 0x9fef, 0x783f, 0x0000, 0x901e, 0x7b4e, + 0x7b6a, 0x7b52, 0x7b6e, 0x003e, 0x000e, 0x9005, 0x1118, 0x600c, + 0x600f, 0x0000, 0x0006, 0x00e6, 0x2f70, 0x080c, 0x9138, 0x00ee, + 0x080c, 0xc723, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, + 0x1580, 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, + 0x1198, 0x2001, 0x1986, 0x2004, 0x604a, 0x0070, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x6044, + 0xc0fc, 0x6046, 0x080c, 0xab13, 0x000e, 0x0804, 0x91fd, 0x7e4a, + 0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xe134, 0x0c38, + 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, 0x080c, 0x6c7f, 0x080c, + 0xaad8, 0x0c10, 0x6020, 0x9086, 0x000a, 0x0990, 0x0878, 0x0016, + 0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x9360, 0x008e, 0x002e, + 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19e5, 0x2091, 0x8000, + 0x080c, 0x93a9, 0x080c, 0x943d, 0x080c, 0x66ba, 0x012e, 0x00fe, + 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7620, + 0x2660, 0x2678, 0x8cff, 0x0904, 0x9325, 0x6010, 0x2058, 0xb8a0, + 0x9206, 0x1904, 0x9320, 0x88ff, 0x0120, 0x605c, 0x9106, 0x1904, + 0x9320, 0x7030, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, + 0x1508, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c, + 0xa223, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, + 0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, + 0x003e, 0x0040, 0x7008, 0xc0ad, 0x700a, 0x6003, 0x0009, 0x630a, + 0x0804, 0x9320, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, + 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, + 0x0008, 0x2678, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, 0x6014, + 0x2048, 0x080c, 0xc723, 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, + 0x080c, 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0098, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xca1a, + 0x080c, 0xe4e4, 0x080c, 0x6c7f, 0x008e, 0x003e, 0x001e, 0x080c, + 0xc90b, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804, 0x929a, + 0x2c78, 0x600c, 0x2060, 0x0804, 0x929a, 0x012e, 0x000e, 0x001e, + 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, + 0xe4e4, 0x080c, 0xe134, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, + 0xb4a0, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, + 0x0085, 0x000e, 0x0904, 0x9306, 0x9086, 0x008b, 0x0904, 0x9306, + 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, + 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, 0x9319, + 0x0006, 0x00f6, 0x00e6, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x0016, + 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x2079, + 0x19e5, 0x9036, 0x7828, 0x2060, 0x8cff, 0x0538, 0x6010, 0x9b06, + 0x1500, 0x6043, 0xffff, 0x080c, 0xa960, 0x01d8, 0x610c, 0x0016, + 0x080c, 0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xca1a, 0x080c, 0xe4e4, + 0x080c, 0x6c7f, 0x008e, 0x003e, 0x001e, 0x080c, 0xab13, 0x00ce, + 0x08d8, 0x2c30, 0x600c, 0x2060, 0x08b8, 0x080c, 0x66d7, 0x012e, + 0x001e, 0x006e, 0x00ce, 0x00be, 0x009e, 0x00ee, 0x00fe, 0x000e, + 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7820, + 0x9065, 0x0904, 0x9410, 0x600c, 0x0006, 0x6044, 0xc0fc, 0x6046, + 0x600f, 0x0000, 0x7830, 0x9c06, 0x1588, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x1508, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000, + 0x080c, 0xa223, 0x7833, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, + 0x080c, 0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0058, 0x080c, 0x6902, 0x1538, 0x6003, 0x0009, + 0x630a, 0x7808, 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048, + 0x080c, 0xc721, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, + 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0060, 0x080c, 0x6902, 0x1168, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, + 0xc90b, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x000e, 0x0804, 0x93b0, + 0x7e22, 0x7e1e, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xe134, 0x0c50, 0x080c, + 0xb4a0, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, 0x9086, + 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, + 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, + 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0096, 0x00b6, + 0x00c6, 0x0066, 0x9036, 0x7828, 0x9065, 0x0510, 0x6010, 0x2058, + 0x600c, 0x0006, 0x3e08, 0x918e, 0x0002, 0x1118, 0xb800, 0xd0bc, + 0x11a8, 0x6043, 0xffff, 0x080c, 0xa960, 0x0180, 0x610c, 0x080c, + 0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0x6c7f, 0x080c, 0xab13, 0x000e, 0x08f0, 0x2c30, 0x0ce0, + 0x006e, 0x00ce, 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6, + 0x0096, 0x0066, 0x080c, 0x6053, 0x11b0, 0x2071, 0x19e5, 0x7030, + 0x9080, 0x0005, 0x2004, 0x904d, 0x0170, 0xa878, 0x9606, 0x1158, + 0x2071, 0x19e5, 0x7030, 0x9035, 0x0130, 0x9080, 0x0005, 0x2004, + 0x9906, 0x1108, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, + 0x00c6, 0x2660, 0x6043, 0xffff, 0x080c, 0xa960, 0x0178, 0x080c, + 0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0xca1a, 0x080c, 0x6c7f, 0x080c, 0xab13, 0x00ce, 0x0005, + 0x00b6, 0x00e6, 0x00c6, 0x080c, 0xa7df, 0x0106, 0x190c, 0xa781, + 0x2071, 0x0101, 0x2e04, 0xc0c4, 0x2072, 0x6044, 0xd0fc, 0x1138, + 0x010e, 0x190c, 0xa79d, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x2071, + 0x19e5, 0x7030, 0x9005, 0x0da0, 0x9c06, 0x190c, 0x0d7d, 0x7036, + 0x080c, 0x85c0, 0x7004, 0x9084, 0x0007, 0x0002, 0x94d8, 0x94da, + 0x94e1, 0x94eb, 0x94f9, 0x94d8, 0x94e1, 0x94d6, 0x080c, 0x0d7d, + 0x0428, 0x0005, 0x080c, 0xa94b, 0x7007, 0x0000, 0x7033, 0x0000, + 0x00e8, 0x0066, 0x9036, 0x080c, 0x9e79, 0x006e, 0x7007, 0x0000, + 0x7033, 0x0000, 0x0098, 0x080c, 0xa936, 0x0140, 0x080c, 0xa94b, + 0x0128, 0x0066, 0x9036, 0x080c, 0x9e79, 0x006e, 0x7033, 0x0000, + 0x0028, 0x080c, 0xa936, 0x080c, 0xa223, 0x0000, 0x010e, 0x190c, + 0xa79d, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x00d6, 0x00c6, 0x080c, + 0xa7df, 0x0106, 0x190c, 0xa781, 0x6044, 0xd0fc, 0x1130, 0x010e, + 0x190c, 0xa79d, 0x00ce, 0x00de, 0x0005, 0x2069, 0x19e5, 0x684c, + 0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d7d, 0x6852, 0x00e6, 0x2d70, + 0x080c, 0x9138, 0x00ee, 0x080c, 0x85cd, 0x0016, 0x2009, 0x0040, + 0x080c, 0x2184, 0x001e, 0x683c, 0x9084, 0x0003, 0x0002, 0x9535, + 0x9536, 0x9554, 0x9533, 0x080c, 0x0d7d, 0x0460, 0x6868, 0x9086, + 0x0001, 0x0190, 0x600c, 0x9015, 0x0160, 0x6a4a, 0x600f, 0x0000, + 0x6044, 0xc0fc, 0x6046, 0x9006, 0x7042, 0x684e, 0x683f, 0x0000, + 0x00c8, 0x684a, 0x6846, 0x0ca0, 0x686b, 0x0000, 0x6848, 0x9065, + 0x0d78, 0x6003, 0x0002, 0x0c60, 0x9006, 0x686a, 0x6852, 0x686e, + 0x600c, 0x9015, 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0018, 0x684e, + 0x684a, 0x6846, 0x684f, 0x0000, 0x010e, 0x190c, 0xa79d, 0x00ce, + 0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, + 0x9580, 0x9583, 0x99f1, 0x9a80, 0x9583, 0x99f1, 0x9a80, 0x9580, + 0x9583, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580, + 0x080c, 0x94a8, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, + 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, + 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x6110, 0x2158, + 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, + 0x95ef, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x9774, 0x97af, 0x97d8, + 0x9880, 0x98a2, 0x98a8, 0x98b5, 0x98bd, 0x98c9, 0x98cf, 0x98e0, + 0x98cf, 0x9938, 0x98bd, 0x9944, 0x994a, 0x98c9, 0x994a, 0x9956, + 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, + 0x95ed, 0x95ed, 0x95ed, 0x9e9a, 0x9ebd, 0x9ece, 0x9eee, 0x9f20, + 0x98b5, 0x95ed, 0x98b5, 0x98cf, 0x95ed, 0x97d8, 0x9880, 0x95ed, + 0xa316, 0x98cf, 0x95ed, 0xa332, 0x98cf, 0x95ed, 0x98c9, 0x976e, + 0x9610, 0x95ed, 0xa34e, 0xa3bb, 0xa49b, 0x95ed, 0xa4a8, 0x98b2, + 0xa4d3, 0x95ed, 0x9f2a, 0xa4df, 0x95ed, 0x080c, 0x0d7d, 0x2100, + 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, + 0x013e, 0x015e, 0x00be, 0x0005, 0xa57f, 0xa631, 0x960e, 0x9637, + 0x96e3, 0x96ee, 0x960e, 0x98b5, 0x960e, 0x9735, 0x9741, 0x9652, + 0x960e, 0x966d, 0x96a1, 0xa9b6, 0xa9fb, 0x98cf, 0x080c, 0x0d7d, + 0x00d6, 0x0096, 0x080c, 0x9969, 0x7003, 0x2414, 0x7007, 0x0018, + 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, + 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x9cd9, 0x009e, 0x00de, + 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xaa42, + 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, + 0x0096, 0x080c, 0x9969, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, + 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, + 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9cd9, 0x009e, + 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9969, 0x7003, 0x0500, + 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, + 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, + 0x080c, 0x9cd9, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, + 0x2091, 0x8000, 0x080c, 0x9969, 0x20e9, 0x0000, 0x2001, 0x19a1, + 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, + 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, + 0x19a1, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x2169, 0x080c, + 0xd484, 0x9006, 0x080c, 0x2169, 0x001e, 0xa804, 0x9005, 0x0110, + 0x2048, 0x0c28, 0x04d9, 0x080c, 0x9cd9, 0x012e, 0x009e, 0x00de, + 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x99b4, + 0x20e9, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000, 0x7814, 0x2048, + 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, + 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, + 0x19a1, 0x0016, 0x200c, 0x080c, 0xd484, 0x001e, 0xa804, 0x9005, + 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fed, + 0x080c, 0x9cd9, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, + 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, + 0x8000, 0x1de0, 0x0005, 0x080c, 0x9969, 0x7003, 0x7800, 0x7808, + 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x00d6, 0x00e6, + 0x080c, 0x99b4, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, + 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, + 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, + 0x9704, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, + 0x1f04, 0x970d, 0x2069, 0x19b1, 0x9086, 0xdf00, 0x0110, 0x2069, + 0x19cb, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, + 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, + 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x971b, 0x60c3, 0x004c, + 0x080c, 0x9cd9, 0x00ee, 0x00de, 0x0005, 0x080c, 0x9969, 0x7003, + 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, + 0x9cd9, 0x00d6, 0x0026, 0x0016, 0x080c, 0x99b4, 0x7003, 0x0200, + 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, + 0x000c, 0x2069, 0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, + 0x8e70, 0x2073, 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, + 0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, + 0x080c, 0x9cd9, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, + 0x2004, 0x609a, 0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003, 0x5200, + 0x2069, 0x1847, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, + 0x2602, 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, + 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, + 0x2099, 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0xaa42, 0x1120, + 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, + 0x2001, 0x1820, 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, + 0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0x9cd9, 0x080c, + 0x9969, 0x7003, 0x0500, 0x080c, 0xaa42, 0x1120, 0xb8a0, 0x9082, + 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, + 0x2004, 0x700e, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, + 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, + 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9cd9, + 0x080c, 0x9969, 0x9006, 0x080c, 0x6934, 0xb8a0, 0x9086, 0x007e, + 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, + 0x0096, 0x904d, 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, + 0x7003, 0x0300, 0xb8a0, 0x9086, 0x007e, 0x1904, 0x9847, 0x00d6, + 0x2069, 0x196c, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, + 0x700a, 0x6808, 0x9084, 0x2000, 0x7012, 0x080c, 0xaa59, 0x680c, + 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090, + 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, 0x73e4, 0x1118, + 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xaa59, + 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, + 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, + 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xa566, + 0x2069, 0x1974, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, + 0x5600, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, + 0x1837, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c, + 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2643, + 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, + 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, + 0x20a1, 0x025a, 0x4003, 0x080c, 0xa566, 0x20a1, 0x024e, 0x20a9, + 0x0008, 0x2099, 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9cd9, + 0x080c, 0x9969, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, + 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, + 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, + 0x9085, 0x0002, 0x00d6, 0x0804, 0x9919, 0x7026, 0x60c3, 0x0014, + 0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003, 0x5000, 0x0804, 0x97f2, + 0x080c, 0x9969, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, + 0x0804, 0x9cd9, 0x080c, 0x99ab, 0x0010, 0x080c, 0x99b4, 0x7003, + 0x0200, 0x60c3, 0x0004, 0x0804, 0x9cd9, 0x080c, 0x99b4, 0x7003, + 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, + 0x9cd9, 0x080c, 0x99b4, 0x7003, 0x0200, 0x0804, 0x97f2, 0x080c, + 0x99b4, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, + 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, + 0x00d6, 0x080c, 0x99b4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, + 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, + 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, + 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, + 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1847, + 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, + 0x9085, 0x0010, 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, + 0x0002, 0x0026, 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, + 0xbad4, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, + 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, + 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9cd9, + 0x080c, 0x99b4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, + 0x60c3, 0x0014, 0x0804, 0x9cd9, 0x080c, 0x99b4, 0x7003, 0x0200, + 0x0804, 0x9778, 0x080c, 0x99b4, 0x7003, 0x0100, 0x700b, 0x0003, + 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x080c, 0x99b4, + 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9cd9, + 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, + 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, + 0x0100, 0x080c, 0xa57b, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, + 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x9ccd, 0x721a, 0x9f95, + 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, + 0x0026, 0x080c, 0xa57b, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, + 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013, + 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, + 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, + 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, + 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0xa57b, 0xb810, 0x9305, + 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, + 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, + 0x687c, 0x700a, 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, + 0x004e, 0x003e, 0x00de, 0x080c, 0x9ccd, 0x721a, 0x7a08, 0x7222, + 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9ccd, + 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, + 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, + 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, + 0x0092, 0x1a0c, 0x0d7d, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, + 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x0005, 0x9a22, 0x9a31, 0x9a3c, 0x9a20, 0x9a20, + 0x9a20, 0x9a22, 0x9a20, 0x9a20, 0x9a20, 0x9a20, 0x9a20, 0x9a20, + 0x080c, 0x0d7d, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2940, + 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, + 0x9cd9, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, + 0x60c3, 0x000c, 0x0804, 0x9cd9, 0x0479, 0x7003, 0x0003, 0x7007, + 0x0300, 0x60c3, 0x0004, 0x0804, 0x9cd9, 0x0026, 0x080c, 0xa57b, + 0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9984, + 0x0026, 0x080c, 0xa57b, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, + 0x0099, 0x7012, 0x0804, 0x99e6, 0x0026, 0x080c, 0xa57b, 0xb810, + 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, + 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x99e6, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, + 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d7d, 0x908a, + 0x0057, 0x1a0c, 0x0d7d, 0x7910, 0x2158, 0xb984, 0x2061, 0x0100, + 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x0005, 0x9ab5, 0x9ab5, 0x9ab5, 0x9ad9, 0x9ab5, 0x9ab5, + 0x9ab5, 0x9ab5, 0x9ab5, 0x9ab5, 0x9ab5, 0xa0c6, 0xa0d2, 0xa0de, + 0xa0ea, 0x9ab5, 0x9ab5, 0x9ab5, 0xa0ba, 0x080c, 0x0d7d, 0x6813, + 0x0008, 0xba8c, 0x8210, 0xb8d4, 0xd084, 0x0128, 0x7a4e, 0x7b14, + 0x7b52, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, + 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x6a7c, 0x720a, + 0x6a80, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, + 0x0005, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, + 0x0005, 0x9ae9, 0x9ae9, 0x9aeb, 0x9ae9, 0x9ae9, 0x9ae9, 0x9b05, + 0x9ae9, 0x080c, 0x0d7d, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, + 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, + 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, + 0x3f00, 0x60c3, 0x0001, 0x0804, 0x9cd9, 0x2009, 0x0003, 0x0019, + 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xa57b, 0x001e, 0xb810, + 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, + 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, + 0x080c, 0x9ccd, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, + 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, + 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, + 0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, + 0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, + 0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, + 0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, + 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, + 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, + 0x7814, 0x0096, 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, + 0x60c6, 0xa834, 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, + 0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0028, 0x0128, 0x609f, 0x0000, 0x2001, 0x0092, 0x0058, 0x6028, + 0xc0bd, 0x602a, 0x609f, 0x00ff, 0x2011, 0xffff, 0x080c, 0x2a0b, + 0x2001, 0x00b2, 0x2010, 0x900e, 0x080c, 0x2a1a, 0x2009, 0x07d0, + 0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00be, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, + 0x7810, 0x2058, 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, + 0x007e, 0x1250, 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x3334, + 0x2015, 0x9294, 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480, + 0x70dc, 0xd0ac, 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80, + 0x0138, 0x9185, 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030, + 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, + 0x6077, 0x0000, 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, + 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, + 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, + 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, + 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, + 0x60d7, 0x0000, 0xba84, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, + 0x0000, 0x00fe, 0x900e, 0x2011, 0x0092, 0x080c, 0x2a1a, 0x2009, + 0x07d0, 0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, + 0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, + 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, + 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480, + 0x7820, 0x0002, 0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c49, + 0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c4b, 0x9c49, 0x9c49, 0x9c49, + 0x9c49, 0x080c, 0x0d7d, 0x609f, 0x0000, 0x7814, 0x2048, 0xa87c, + 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, + 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, + 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705, + 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, + 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001, + 0x1837, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048, + 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039, + 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073, + 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, + 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000, + 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, + 0x0000, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, + 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, + 0xa55b, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, + 0x2009, 0x1b58, 0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x00ce, + 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff, + 0x8217, 0x0005, 0x00d6, 0x2069, 0x19e5, 0x686b, 0x0001, 0x00de, + 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x85b7, + 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, + 0x0600, 0x0128, 0x0089, 0x080c, 0x85b7, 0x001e, 0x0005, 0xc1e5, + 0x2001, 0x180c, 0x2102, 0x2001, 0x19e6, 0x2003, 0x0000, 0x2001, + 0x19f1, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009, + 0x1804, 0x2011, 0x0009, 0x080c, 0x2a1a, 0x002e, 0x001e, 0x000e, + 0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0xa7df, 0x0106, 0x190c, + 0xa781, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, + 0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x2a1a, 0x002e, 0x001e, + 0x010e, 0x190c, 0xa79d, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, + 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, + 0x0100, 0x2069, 0x0140, 0x080c, 0x73e4, 0x1510, 0x2001, 0x1a0a, + 0x2004, 0x9005, 0x1904, 0x9d8a, 0x080c, 0x7485, 0x11a8, 0x2069, + 0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, + 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d7d, 0x6843, + 0x0100, 0x080c, 0x85b7, 0x04b0, 0x00c6, 0x2061, 0x19e5, 0x00f0, + 0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0x9d09, 0x080c, 0x29e1, + 0x00c6, 0x2061, 0x19e5, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108, + 0x6136, 0x080c, 0xa781, 0x6130, 0x080c, 0xa79d, 0x00ce, 0x81ff, + 0x01c8, 0x080c, 0x85b7, 0x080c, 0x9cfc, 0x00a0, 0x080c, 0xa781, + 0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xe5b0, 0x080c, 0x85c0, + 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xab77, 0x080c, 0xa79d, + 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, + 0x1a0a, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e5, 0x6134, + 0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x85b7, + 0x080c, 0x5dfc, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, + 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x85cd, + 0x080c, 0xa781, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19e5, + 0x714c, 0x81ff, 0x0904, 0x9e32, 0x2061, 0x0100, 0x2069, 0x0140, + 0x080c, 0x73e4, 0x1510, 0x0036, 0x2019, 0x0002, 0x080c, 0x9fef, + 0x003e, 0x714c, 0x2160, 0x080c, 0xe5b0, 0x2009, 0x004a, 0x6220, + 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, + 0x004a, 0x6003, 0x0003, 0x080c, 0xab77, 0x2001, 0x0386, 0x2003, + 0x5040, 0x080c, 0x7485, 0x0804, 0x9e32, 0x6904, 0xd1f4, 0x0904, + 0x9e3f, 0x080c, 0x29e1, 0x00c6, 0x704c, 0x9065, 0x090c, 0x0d7d, + 0x6020, 0x00ce, 0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4, 0x9105, + 0x11f8, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214, 0x9294, + 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0010, 0xc0d4, + 0x200a, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c, + 0x2060, 0x080c, 0x9505, 0x2009, 0x0049, 0x080c, 0xab77, 0x00d0, + 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x003e, 0x714c, 0x2160, + 0x080c, 0xe5b0, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, 0x1130, + 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x6003, 0x0003, + 0x080c, 0xab77, 0x2001, 0x0387, 0x2003, 0x0200, 0x080c, 0xa79d, + 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, + 0x1904, 0x9de9, 0x0804, 0x9deb, 0x0026, 0x00e6, 0x2071, 0x19e5, + 0x706c, 0xd084, 0x01e8, 0xc084, 0x706e, 0x714c, 0x81ff, 0x01c0, + 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, + 0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2a1a, 0x0048, 0x928e, + 0x0009, 0x0db0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2a1a, + 0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19ef, 0x2004, 0x9005, + 0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, 0x0001, + 0x0005, 0x00f6, 0x2079, 0x19e5, 0x610c, 0x9006, 0x600e, 0x6044, + 0xc0fc, 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, 0x7826, + 0x782a, 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, 0x00ce, + 0x7824, 0x9c06, 0x1108, 0x7e26, 0x080c, 0xa0f9, 0x080c, 0xc90b, + 0x00fe, 0x0005, 0x080c, 0x9969, 0x7003, 0x1200, 0x7838, 0x7012, + 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, + 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, + 0x2061, 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, 0x710e, + 0x00ce, 0x60c3, 0x002c, 0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003, + 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, + 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x0156, 0x080c, + 0x99b4, 0x7003, 0x0200, 0x080c, 0x8685, 0x20a9, 0x0006, 0x2011, + 0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, 0x2305, 0x2072, 0x8e70, + 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, + 0x9edd, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9cd9, 0x0016, 0x0026, + 0x080c, 0x9990, 0x080c, 0x99a2, 0x9e80, 0x0004, 0x20e9, 0x0000, + 0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, + 0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, + 0x60c2, 0x080c, 0x9cd9, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, + 0x4003, 0x080c, 0xa566, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, + 0x080c, 0x9969, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, + 0x0804, 0x9cd9, 0x0016, 0x0026, 0x080c, 0x9969, 0x20e9, 0x0000, + 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, + 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9cd9, 0x002e, + 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19e5, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, 0xc931, + 0x1110, 0x080c, 0xb4a0, 0x600c, 0x0006, 0x080c, 0xcba8, 0x600f, + 0x0000, 0x080c, 0xaad8, 0x080c, 0xa0f9, 0x00ce, 0x0c68, 0x2c00, + 0x7012, 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, + 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, + 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, + 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e5, 0x7030, + 0x2060, 0x8cff, 0x0548, 0x080c, 0x9d09, 0x6ac0, 0x68c3, 0x0000, + 0x080c, 0x85c0, 0x00c6, 0x2061, 0x0100, 0x080c, 0xa6b7, 0x00ce, + 0x20a9, 0x01f4, 0x04b1, 0x080c, 0x94a8, 0x6044, 0xd0ac, 0x1128, + 0x2001, 0x1986, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, 0x080c, + 0xab77, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, + 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, + 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x85c0, 0x6814, + 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, + 0x0000, 0x2011, 0x5da6, 0x080c, 0x850b, 0x20a9, 0x01f4, 0x0009, + 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, + 0x4000, 0x190c, 0x29e1, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, + 0x0010, 0x1f04, 0x9fd1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x0005, 0x0126, + 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, + 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, + 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, 0x701c, + 0x0006, 0x701f, 0x0202, 0x2071, 0x19e5, 0x704c, 0x2060, 0x8cff, + 0x0904, 0xa094, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, + 0x0904, 0xa094, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, + 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x85cd, 0x080c, + 0x1db4, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e55, 0x2021, 0x0169, + 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, + 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, + 0x19e5, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, + 0x0008, 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, + 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009, 0x0040, + 0x080c, 0x2184, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e55, 0x004e, + 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, + 0x9084, 0x4000, 0x190c, 0x29e1, 0x0090, 0xd08c, 0x0118, 0x6827, + 0x0002, 0x0010, 0x1f04, 0xa062, 0x7804, 0x9084, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x6827, + 0x4000, 0x6824, 0x83ff, 0x1180, 0x2009, 0x0049, 0x6020, 0x9086, + 0x0009, 0x0150, 0x080c, 0x9505, 0x6044, 0xd0ac, 0x1118, 0x6003, + 0x0002, 0x0010, 0x080c, 0xab77, 0x000e, 0x2071, 0x0380, 0xd08c, + 0x1110, 0x701f, 0x0200, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, + 0x2091, 0x8000, 0x2069, 0x19e5, 0x6a06, 0x012e, 0x00de, 0x0005, + 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e5, 0x6a3e, 0x012e, + 0x00de, 0x0005, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108, + 0x782c, 0x7032, 0x7042, 0x7047, 0x1000, 0x0478, 0x080c, 0x9ab7, + 0x7814, 0x080c, 0x5604, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, + 0x4000, 0x0418, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108, + 0x782c, 0x7032, 0x7042, 0x7047, 0x2000, 0x00b8, 0x080c, 0x9ab7, + 0x7814, 0x080c, 0x5604, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, + 0x0400, 0x0058, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108, + 0x782c, 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, + 0x9cd9, 0x00e6, 0x2071, 0x19e5, 0x702c, 0x9005, 0x0110, 0x8001, + 0x702e, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, + 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7620, + 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa19e, 0x8cff, + 0x0904, 0xa19e, 0x6020, 0x9086, 0x0006, 0x1904, 0xa199, 0x88ff, + 0x0138, 0x2800, 0x9c06, 0x1904, 0xa199, 0x2039, 0x0000, 0x0050, + 0x6010, 0x9b06, 0x1904, 0xa199, 0x85ff, 0x0120, 0x605c, 0x9106, + 0x1904, 0xa199, 0x7030, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, + 0x9005, 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, + 0x85c0, 0x080c, 0xa223, 0x7033, 0x0000, 0x0428, 0x080c, 0x85c0, + 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, + 0x0000, 0x080c, 0xa223, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, + 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, + 0x9006, 0x080c, 0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, + 0x6827, 0x0001, 0x003e, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, + 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, + 0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, + 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, + 0x0096, 0x2048, 0x080c, 0xc721, 0x0110, 0x080c, 0xe134, 0x009e, + 0x080c, 0xab13, 0x080c, 0xa0f9, 0x88ff, 0x1190, 0x00ce, 0x0804, + 0xa114, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa114, 0x9006, 0x012e, + 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, + 0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19e5, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, + 0xa212, 0x6020, 0x9086, 0x0006, 0x1904, 0xa20d, 0x87ff, 0x0128, + 0x2700, 0x9c06, 0x1904, 0xa20d, 0x0040, 0x6010, 0x9b06, 0x15e8, + 0x85ff, 0x0118, 0x605c, 0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168, + 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x703f, 0x0000, 0x9006, + 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x7048, 0x9c36, 0x1110, + 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, + 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, + 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, + 0x2048, 0x080c, 0xc721, 0x0110, 0x080c, 0xe134, 0x080c, 0xab13, + 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa1be, 0x2c78, 0x600c, 0x2060, + 0x0804, 0xa1be, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, + 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, + 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e5, 0x7033, 0x0000, + 0x7004, 0x9086, 0x0003, 0x0158, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19e5, 0x2c10, 0x7648, 0x2660, 0x2678, + 0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110, + 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, + 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x2c00, 0x9f06, + 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, + 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, + 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19e5, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa305, + 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa300, + 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, + 0xa2dc, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c, 0xa223, 0x7033, + 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x2069, + 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, + 0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, + 0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, + 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, + 0x0000, 0x080c, 0xc920, 0x1158, 0x080c, 0x31dc, 0x080c, 0xc931, + 0x11f0, 0x080c, 0xb4a0, 0x00d8, 0x080c, 0xa223, 0x08c0, 0x080c, + 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0090, 0x6014, 0x2048, 0x080c, + 0xc721, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x080c, + 0xcba8, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804, 0xa285, + 0x2c78, 0x600c, 0x2060, 0x0804, 0xa285, 0x012e, 0x000e, 0x002e, + 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, + 0x9086, 0x0006, 0x1d20, 0x080c, 0xe134, 0x0c08, 0x00d6, 0x080c, + 0x99b4, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, + 0x0001, 0x2099, 0x1987, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, + 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x9cd9, + 0x00de, 0x0005, 0x080c, 0x99b4, 0x700b, 0x0800, 0x7814, 0x9084, + 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, + 0x7860, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7860, 0x9084, + 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x9cd9, 0x00b6, 0x00d6, + 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xcdad, 0x00de, + 0x1904, 0xa3b3, 0x080c, 0x9969, 0x7003, 0x1300, 0x782c, 0x080c, + 0xa4be, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, + 0xbaa0, 0x080c, 0xaa42, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, + 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, + 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, + 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, + 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0xb884, + 0x700e, 0x00a8, 0x080c, 0xaa42, 0x1130, 0x7810, 0x2058, 0xb8a0, + 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181f, 0x2d04, 0x700a, + 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, + 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, + 0x9cd9, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, + 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, + 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xa431, 0x9186, 0x0005, + 0x0904, 0xa419, 0x9186, 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, + 0xa422, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, + 0xa49b, 0x0005, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c, 0x2168, + 0x2009, 0x4000, 0x6800, 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0xa3fa, + 0xa405, 0xa3fc, 0xa405, 0xa401, 0xa3fa, 0xa3fa, 0xa405, 0xa405, + 0xa405, 0xa405, 0xa3fa, 0xa3fa, 0xa3fa, 0xa3fa, 0xa3fa, 0xa405, + 0xa3fa, 0xa405, 0x080c, 0x0d7d, 0x6824, 0xd0e4, 0x0110, 0xd0cc, + 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, + 0x7026, 0x0804, 0xa455, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c, + 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, + 0x04e0, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, + 0x4000, 0x0498, 0x04c9, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, + 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108, 0x900e, + 0x0420, 0x0451, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814, 0x0096, + 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, + 0x7022, 0x7226, 0x792c, 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, + 0x9180, 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, + 0x0118, 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, + 0x002e, 0x00de, 0x0804, 0x9cd9, 0x00b6, 0x0036, 0x0046, 0x0056, + 0x0066, 0x080c, 0x99b4, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, + 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xaa42, 0x1118, + 0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68, + 0x2d34, 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, + 0x901e, 0xbc84, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, + 0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, + 0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, + 0x003e, 0x00be, 0x0005, 0x080c, 0x99b4, 0x7003, 0x0100, 0x782c, + 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, + 0x080c, 0x9960, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, + 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, + 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0x9cd9, 0x00e6, 0x2071, + 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8d4, + 0xd084, 0x0120, 0x7850, 0x702a, 0x784c, 0x702e, 0x00be, 0x00fe, + 0x000e, 0x00ee, 0x0005, 0x080c, 0x99ab, 0x7003, 0x0100, 0x782c, + 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x00a9, + 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, + 0x2940, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, + 0x080c, 0x9cfc, 0x080c, 0x85b7, 0x0005, 0x0036, 0x0096, 0x00d6, + 0x00e6, 0x7860, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, + 0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, + 0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, + 0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, + 0x0200, 0x080c, 0xa57b, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, + 0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, + 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, + 0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, + 0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, + 0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, + 0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x19b0, 0x210c, 0x009e, + 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, + 0x2110, 0x900e, 0x080c, 0x2a1a, 0x002e, 0x0005, 0x2009, 0x0009, + 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009, + 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028, + 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x080c, + 0x9969, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, + 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001, + 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa620, 0x7003, 0x5400, + 0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f, + 0x918c, 0xff00, 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c, + 0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290, + 0x0006, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa5b1, 0x20a9, + 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, + 0xa5bb, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009, + 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, + 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa566, 0x00de, 0x2071, + 0x0240, 0x2011, 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002, + 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9, + 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c, + 0x9080, 0x0031, 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, + 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c, + 0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084, + 0x0028, 0x1168, 0x080c, 0x73e4, 0x0150, 0x6028, 0xc0bd, 0x602a, + 0x2009, 0x1804, 0x2011, 0x0029, 0x080c, 0x2a1a, 0x0010, 0x080c, + 0x9cd9, 0x080c, 0x85b7, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002, + 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804, + 0xa596, 0x080c, 0x9969, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, + 0x2048, 0x7013, 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084, + 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c, + 0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998, + 0x918c, 0xff00, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d, + 0x7112, 0x6180, 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c, + 0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001, + 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004, + 0x2009, 0x1805, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa672, + 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, + 0x1f04, 0xa67c, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xa566, + 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803, + 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa692, + 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0, + 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xa6a3, 0x00ce, + 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9cd9, + 0x080c, 0x85b7, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00d6, + 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, + 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, + 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, + 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00f6, + 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19e5, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, + 0xa75e, 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0904, 0xa735, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c, 0xa223, + 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, + 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, + 0x7010, 0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x600f, 0x0000, 0x080c, 0xc920, 0x1158, 0x080c, 0x31dc, 0x080c, + 0xc931, 0x11f0, 0x080c, 0xb4a0, 0x00d8, 0x080c, 0xa223, 0x08c0, + 0x080c, 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0090, 0x6014, 0x2048, + 0x080c, 0xc721, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b, + 0x080c, 0xcba8, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804, + 0xa6e6, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa6e6, 0x7013, 0x0000, + 0x700f, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, + 0xe134, 0x08f0, 0x00f6, 0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc, + 0x1de8, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe, + 0x0005, 0x0016, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0001, 0x1188, 0x2001, 0x0015, 0x0c29, 0x2009, 0x1000, 0x2001, + 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0120, 0x8109, + 0x1db0, 0x080c, 0x0d7d, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, + 0x9084, 0x0007, 0x9086, 0x0003, 0x1120, 0x2001, 0x0380, 0x2003, + 0x0001, 0x0005, 0x0156, 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, + 0x19e5, 0x0469, 0x0106, 0x0190, 0x7004, 0x9086, 0x0003, 0x0148, + 0x20a9, 0x1000, 0x6044, 0xd0fc, 0x01d8, 0x1f04, 0xa7ba, 0x080c, + 0x0d7d, 0x080c, 0xa781, 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, + 0x1148, 0x080c, 0x94a8, 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, + 0x700a, 0x7042, 0x704c, 0x9c06, 0x190c, 0x0d7d, 0x080c, 0x9505, + 0x010e, 0x1919, 0x00ee, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, + 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0005, 0x0126, + 0x2091, 0x2400, 0x7808, 0xd0a4, 0x190c, 0x0d76, 0xd09c, 0x0128, + 0x7820, 0x908c, 0xf000, 0x11b8, 0x0012, 0x012e, 0x0005, 0xa807, + 0xa845, 0xa86c, 0xa8a3, 0xa8b3, 0xa8c4, 0xa8d3, 0xa8e1, 0xa90e, + 0xa912, 0xa807, 0xa807, 0xa807, 0xa807, 0xa807, 0xa807, 0x080c, + 0x0d7d, 0x012e, 0x0005, 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, + 0x6046, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0012, 0x012e, + 0x0005, 0xa82c, 0xa82e, 0xa82c, 0xa834, 0xa82c, 0xa82c, 0xa82c, + 0xa82c, 0xa82c, 0xa82e, 0xa82c, 0xa82e, 0xa82c, 0xa82e, 0xa82c, + 0xa82c, 0xa82c, 0xa82e, 0xa82c, 0x080c, 0x0d7d, 0x2009, 0x0013, + 0x080c, 0xab77, 0x012e, 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, + 0x0130, 0x080c, 0x878b, 0x080c, 0xaad8, 0x012e, 0x0005, 0x2009, + 0x0049, 0x080c, 0xab77, 0x012e, 0x0005, 0x080c, 0xa781, 0x2001, + 0x1a0a, 0x2003, 0x0000, 0x7030, 0x9065, 0x090c, 0x0d7d, 0x7034, + 0x9092, 0x00c8, 0x1258, 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, + 0x0110, 0x7007, 0x0000, 0x781f, 0x0808, 0x0040, 0x080c, 0xe5b0, + 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xab77, 0x781f, 0x0100, + 0x080c, 0xa79d, 0x012e, 0x0005, 0x080c, 0xa781, 0x714c, 0x81ff, + 0x1128, 0x2011, 0x1a0d, 0x2013, 0x0000, 0x0438, 0x2061, 0x0100, + 0x7150, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7152, 0x714c, 0x9188, + 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, + 0x9085, 0x0012, 0x6016, 0x0088, 0x714c, 0x9188, 0x0008, 0x210c, + 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, + 0x6016, 0x0018, 0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, + 0xa79d, 0x012e, 0x0005, 0x080c, 0xa781, 0x714c, 0x2160, 0x6003, + 0x0003, 0x2009, 0x004a, 0x080c, 0xab77, 0x781f, 0x0200, 0x080c, + 0xa79d, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, + 0x6003, 0x0003, 0x080c, 0xa781, 0x080c, 0x1d3c, 0x781f, 0x0400, + 0x080c, 0xa79d, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, + 0x2060, 0x080c, 0xa781, 0x080c, 0x1d84, 0x781f, 0x0400, 0x080c, + 0xa79d, 0x012e, 0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, + 0x6046, 0x7104, 0x9186, 0x0003, 0x0110, 0x080c, 0x956b, 0x012e, + 0x0005, 0x00f6, 0x703c, 0x9086, 0x0002, 0x0528, 0x704c, 0x907d, + 0x0510, 0x7844, 0xc0bc, 0x7846, 0x7820, 0x9086, 0x0009, 0x0118, + 0x080c, 0x9c24, 0x00c0, 0x7828, 0xd0fc, 0x1118, 0x080c, 0x9ba3, + 0x0090, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1130, 0x2001, + 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1120, 0x2001, 0x0387, 0x2003, + 0x1000, 0x080c, 0x9b28, 0x00fe, 0x012e, 0x0005, 0x080c, 0x7485, + 0x012e, 0x0005, 0x080c, 0x0d7d, 0x0005, 0x00e6, 0x2071, 0x19e5, + 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, 0x9c06, 0x1190, + 0x2019, 0x0001, 0x080c, 0x9fef, 0x704f, 0x0000, 0x2001, 0x0109, + 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, 0xd0bc, 0x1110, + 0x703f, 0x0000, 0x080c, 0xa239, 0x00ee, 0x0005, 0x0026, 0x7010, + 0x9c06, 0x1178, 0x080c, 0xa0f9, 0x6044, 0xc0fc, 0x6046, 0x600c, + 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, 0x7212, 0x720e, + 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, 0x1178, 0x080c, + 0xa0f9, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, 0x7222, + 0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006, 0x002e, 0x0005, + 0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, + 0x9005, 0x01f8, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000, + 0x080c, 0xa223, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x2069, + 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x9085, 0x0001, + 0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009, 0x630a, 0x9006, + 0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036, 0x6100, 0x2019, + 0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190, 0x00c6, 0x0126, + 0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0xa7e7, 0x003e, 0x001e, + 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, 0x2200, 0x0010, + 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0156, + 0x080c, 0x99b4, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, + 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, + 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, + 0x0060, 0x080c, 0x73e4, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6adc, + 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, 0x8685, + 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x2071, 0x0250, + 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, + 0x9290, 0x0002, 0x1f04, 0xa9e8, 0x60c3, 0x0020, 0x080c, 0x9cd9, + 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x99b4, 0x7a14, 0x82ff, + 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, + 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, + 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19bb, 0x2204, 0x8007, + 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, + 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7022, 0x2001, + 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, + 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, + 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, + 0x0804, 0x9cd9, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x000e, + 0x0005, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, + 0xa0b0, 0x080c, 0x9f6f, 0x0036, 0x901e, 0x080c, 0x9fef, 0x003e, + 0x0005, 0x080c, 0x332d, 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010, + 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x652d, 0xb85c, + 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071, 0x188d, + 0x7000, 0x9005, 0x0140, 0x2001, 0x0812, 0x2071, 0x1800, 0x7076, + 0x707a, 0x706b, 0xffd4, 0x2071, 0x1800, 0x7074, 0x7056, 0x705b, + 0x1ddc, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, + 0x7554, 0x9582, 0x0010, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, + 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, + 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, + 0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, + 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, + 0x2071, 0x1800, 0x7554, 0x9582, 0x0010, 0x0600, 0x7058, 0x2060, + 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, + 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, + 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, 0x1228, 0x755a, 0x9085, + 0x0001, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, + 0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02, + 0x1a0c, 0x0d7d, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, + 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x605e, 0x6062, + 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x604a, + 0x602a, 0x6046, 0x6042, 0x2061, 0x1800, 0x6054, 0x8000, 0x6056, + 0x0005, 0x9006, 0x600e, 0x6016, 0x601a, 0x6012, 0x6022, 0x6002, + 0x601e, 0x605e, 0x6062, 0x604a, 0x6046, 0x2061, 0x1800, 0x6054, + 0x8000, 0x6056, 0x0005, 0x0006, 0x6000, 0x9086, 0x0000, 0x01d0, + 0x601c, 0xd084, 0x190c, 0x1a53, 0x6023, 0x0007, 0x2001, 0x1984, + 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, + 0x080c, 0xe3e7, 0x604b, 0x0000, 0x6044, 0xd0fc, 0x1129, 0x9006, + 0x6046, 0x6016, 0x000e, 0x0005, 0x080c, 0xa7df, 0x0106, 0x190c, + 0xa781, 0x2001, 0x19f8, 0x2004, 0x9c06, 0x1130, 0x0036, 0x2019, + 0x0001, 0x080c, 0x9fef, 0x003e, 0x080c, 0xa239, 0x010e, 0x190c, + 0xa79d, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, + 0x7554, 0x9582, 0x0001, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, + 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, + 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, + 0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, + 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x6020, + 0x9084, 0x000f, 0x0002, 0xab8b, 0xab95, 0xabb0, 0xabcb, 0xce7f, + 0xce9c, 0xceb7, 0xab8b, 0xab95, 0x8e64, 0xabe7, 0xab8b, 0xab8b, + 0xab8b, 0xab8b, 0xab8b, 0x9186, 0x0013, 0x1130, 0x6044, 0xd0fc, + 0x0110, 0x080c, 0x94a8, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, + 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xabae, 0xb30c, + 0xb4e7, 0xabae, 0xb57d, 0xaeb0, 0xabae, 0xabae, 0xb28e, 0xbae5, + 0xabae, 0xabae, 0xabae, 0xabae, 0xabae, 0xabae, 0x080c, 0x0d7d, + 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, + 0x0005, 0xabc9, 0xc0f0, 0xabc9, 0xabc9, 0xabc9, 0xabc9, 0xabc9, + 0xabc9, 0xc095, 0xc273, 0xabc9, 0xc12d, 0xc1b1, 0xc12d, 0xc1b1, + 0xabc9, 0x080c, 0x0d7d, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7d, + 0x6000, 0x0002, 0xabe5, 0xbb2f, 0xbbc6, 0xbd46, 0xbdb5, 0xabe5, + 0xabe5, 0xabe5, 0xbafe, 0xc016, 0xc019, 0xabe5, 0xabe5, 0xabe5, + 0xabe5, 0xc049, 0xabe5, 0xabe5, 0xabe5, 0x080c, 0x0d7d, 0x0066, + 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, + 0xac00, 0xac00, 0xac3e, 0xacdd, 0xad5d, 0xac00, 0xac00, 0xac00, + 0xac02, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, + 0x080c, 0x0d7d, 0x9186, 0x004c, 0x0560, 0x9186, 0x0003, 0x190c, + 0x0d7d, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, + 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, + 0xa836, 0xa8b0, 0xa83a, 0x9006, 0xa846, 0xa84a, 0xa884, 0x9092, + 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, + 0x621a, 0x009e, 0x080c, 0x1ba3, 0x2009, 0x8030, 0x080c, 0x912f, + 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, + 0xad7f, 0x080c, 0xce4d, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, + 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec, + 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, + 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, + 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, + 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, + 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, + 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, + 0xaca5, 0xaca5, 0xaca0, 0xaca3, 0xaca5, 0xac9d, 0xac90, 0xac90, + 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, + 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d7d, 0x080c, 0xb73a, 0x0028, + 0x080c, 0xb81f, 0x0010, 0x080c, 0xb915, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xae3d, + 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, + 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x128f, + 0x080c, 0xaffd, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, + 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xaad8, 0x2001, + 0x002c, 0x900e, 0x080c, 0xaea3, 0x0c70, 0x91b6, 0x0015, 0x0170, + 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0d7d, 0x91b2, + 0x0050, 0x1a0c, 0x0d7d, 0x9182, 0x0047, 0x0042, 0x080c, 0xa993, + 0x0120, 0x9086, 0x0002, 0x0904, 0xac3e, 0x0005, 0xacff, 0xacff, + 0xad01, 0xad33, 0xacff, 0xacff, 0xacff, 0xacff, 0xad46, 0x080c, + 0x0d7d, 0x00d6, 0x0016, 0x0096, 0x6003, 0x0004, 0x6114, 0x2148, + 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, + 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xaea3, 0x080c, + 0xaad8, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, + 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, + 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, + 0x001e, 0x00de, 0x0005, 0x080c, 0x9505, 0x00d6, 0x0096, 0x6114, + 0x2148, 0x080c, 0xc723, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6c7f, + 0x009e, 0x00de, 0x080c, 0xaad8, 0x0804, 0x956a, 0x080c, 0x9505, + 0x080c, 0x31ab, 0x080c, 0xce4a, 0x00d6, 0x0096, 0x6114, 0x2148, + 0x080c, 0xc723, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e, + 0x00de, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9182, 0x0047, 0x0002, + 0xad6d, 0xad6f, 0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6d, + 0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6f, 0x080c, 0x0d7d, 0x00d6, + 0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, + 0x0000, 0x080c, 0x6c7f, 0x009e, 0x00de, 0x0804, 0xaad8, 0x0026, + 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, + 0x103b, 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8, 0xa95c, 0x9188, + 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, + 0x1800, 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, + 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, + 0x0001, 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xc2f6, + 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xc2f6, + 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fed, 0x080c, + 0x103b, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, + 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, + 0xc2f6, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, + 0x001b, 0x080c, 0xc2f6, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, + 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, + 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, + 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, + 0x6c7f, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, + 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, + 0x0006, 0x080c, 0x103b, 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8, + 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, + 0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c, + 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, + 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, + 0x200c, 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, + 0x6c7f, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, + 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, + 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, + 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, + 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, + 0x103b, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, + 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, + 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, + 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, + 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, + 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xae52, + 0x0804, 0xae54, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, + 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, + 0xa87a, 0xa982, 0x080c, 0x6c73, 0x009e, 0x003e, 0x00de, 0x0005, + 0x91b6, 0x0015, 0x1118, 0x080c, 0xaad8, 0x0030, 0x91b6, 0x0016, + 0x190c, 0x0d7d, 0x080c, 0xaad8, 0x0005, 0x20a9, 0x000e, 0x20e1, + 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, + 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006, + 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318, + 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318, + 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8, + 0x0096, 0x080c, 0xc723, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, + 0xa867, 0x0103, 0x009e, 0x0804, 0xaad8, 0x0096, 0x00d6, 0x0036, + 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8d7, + 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, + 0xa867, 0x0103, 0xab32, 0x080c, 0xaad8, 0x003e, 0x00de, 0x009e, + 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xce35, + 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, + 0x604b, 0x0000, 0x2009, 0x0022, 0x080c, 0xb2e4, 0x9006, 0x001e, + 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9, + 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, + 0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, + 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099, + 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048, + 0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0xaad8, 0x001e, 0x009e, + 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140, + 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004, + 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c, + 0x6014, 0x2048, 0x080c, 0xc2f6, 0x080c, 0xc723, 0x0140, 0x6014, + 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, + 0xaad8, 0x001e, 0x009e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, + 0x9086, 0x0200, 0x0110, 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, + 0x090c, 0x0d7d, 0xa97a, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8, + 0x001e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, + 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, + 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, + 0x2048, 0x080c, 0xc2f6, 0x009e, 0x080c, 0xc723, 0x0148, 0xa804, + 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, + 0x080c, 0xaad8, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, + 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xb4a0, 0x00e0, 0xa034, + 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, + 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, + 0x1275, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, + 0x103b, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, + 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, + 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x111b, 0x008e, 0x9085, + 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, + 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, + 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, + 0x604b, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xcdad, + 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, + 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xaad8, 0x0020, + 0x0039, 0x0010, 0x080c, 0xb119, 0x002e, 0x00de, 0x00ee, 0x0005, + 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xb0f8, 0x918e, + 0x0016, 0x1904, 0xb117, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, + 0x0120, 0x9186, 0x0300, 0x1904, 0xb0d2, 0x89ff, 0x1138, 0x6800, + 0x9086, 0x000f, 0x0904, 0xb0b4, 0x0804, 0xb115, 0x6808, 0x9086, + 0xffff, 0x1904, 0xb0fa, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, + 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xb0fa, 0x6824, 0xd0b4, + 0x1904, 0xb0fa, 0x080c, 0xc90b, 0x6864, 0xa882, 0xa87c, 0xc0dc, + 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, + 0x080c, 0x9030, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, + 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xc449, 0x00ce, 0x0804, + 0xb115, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5fd3, 0x0010, + 0x080c, 0x63c7, 0x00ce, 0x1904, 0xb0fa, 0x00c6, 0x2d60, 0x080c, + 0xaad8, 0x00ce, 0x0804, 0xb115, 0x00c6, 0x080c, 0xab4a, 0x0198, + 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0003, + 0x6904, 0x00c6, 0x2d60, 0x080c, 0xaad8, 0x00ce, 0x080c, 0xab77, + 0x00ce, 0x0804, 0xb115, 0x2001, 0x1986, 0x2004, 0x684a, 0x00ce, + 0x0804, 0xb115, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, + 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, + 0x0003, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00ce, 0x0430, 0x700c, + 0x9086, 0x2a00, 0x1138, 0x2001, 0x1986, 0x2004, 0x684a, 0x00e8, + 0x04c1, 0x00e8, 0x89ff, 0x090c, 0x0d7d, 0x00c6, 0x00d6, 0x2d60, + 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6a95, 0x080c, 0xc90b, + 0x080c, 0xab13, 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, + 0x6658, 0x00be, 0x002e, 0x00de, 0x00ce, 0x080c, 0xaad8, 0x009e, + 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1986, 0x2004, 0x684a, + 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, + 0xe3e7, 0x080c, 0x878b, 0x080c, 0xaad8, 0x00ce, 0x080c, 0xaad8, + 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, + 0x0130, 0x2001, 0x1986, 0x2004, 0x684a, 0x0804, 0xb193, 0x00c6, + 0x2d60, 0x080c, 0xc321, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, + 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, + 0x8023, 0x080c, 0x90e8, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, + 0x01a8, 0x89ff, 0x090c, 0x0d7d, 0x6800, 0x9086, 0x0004, 0x1190, + 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, + 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, + 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, + 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, + 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, + 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xca9a, + 0x080c, 0x956a, 0x0010, 0x080c, 0xaad8, 0x004e, 0x003e, 0x002e, + 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, + 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb1fe, 0x700c, + 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xb1fe, + 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, + 0x0904, 0xb1fe, 0x9286, 0x0002, 0x0904, 0xb1fe, 0x9286, 0x0000, + 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, + 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, + 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, + 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, + 0x6014, 0x0096, 0x2048, 0x080c, 0xc723, 0x090c, 0x0d7d, 0xa87b, + 0x0003, 0x009e, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00ce, 0x0030, + 0x6038, 0x2070, 0x2001, 0x1986, 0x2004, 0x704a, 0x080c, 0xaad8, + 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, + 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, + 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, + 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, + 0xbaad, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xb26d, 0x0096, + 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, + 0x20a9, 0x0004, 0x080c, 0xbaad, 0x002e, 0x003e, 0x015e, 0x009e, + 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, + 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0xaee8, + 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, + 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, + 0x1275, 0x080c, 0xaffd, 0x0130, 0x00fe, 0x009e, 0x080c, 0xaad8, + 0x00be, 0x0005, 0x080c, 0xb4a0, 0x0cb8, 0x2b78, 0x00f6, 0x080c, + 0x31ab, 0x080c, 0xce4a, 0x00fe, 0x00c6, 0x080c, 0xaa82, 0x2f00, + 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, + 0x0001, 0x2001, 0x0007, 0x080c, 0x647d, 0x080c, 0x64a9, 0x080c, + 0x90ef, 0x080c, 0x956a, 0x00ce, 0x0804, 0xb240, 0x2100, 0x91b2, + 0x0053, 0x1a0c, 0x0d7d, 0x91b2, 0x0040, 0x1a04, 0xb2f6, 0x0002, + 0xb2e4, 0xb2e4, 0xb2da, 0xb2e4, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8, + 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, + 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, + 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2e4, + 0xb2d8, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, + 0xb2da, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, + 0xb2d8, 0xb2d8, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, + 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2e4, 0xb2d8, 0xb2d8, + 0x080c, 0x0d7d, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8d4, 0xc08c, + 0xb8d6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, + 0x0032, 0x0118, 0x080c, 0x90ef, 0x0010, 0x080c, 0x90e8, 0x0126, + 0x2091, 0x8000, 0x080c, 0x956a, 0x012e, 0x0005, 0x2600, 0x0002, + 0xb2e4, 0xb2e4, 0xb30a, 0xb2e4, 0xb2e4, 0xb30a, 0xb30a, 0xb30a, + 0xb30a, 0xb2e4, 0xb30a, 0xb2e4, 0xb30a, 0xb2e4, 0xb30a, 0xb30a, + 0xb30a, 0xb30a, 0x080c, 0x0d7d, 0x6004, 0x90b2, 0x0053, 0x1a0c, + 0x0d7d, 0x91b6, 0x0013, 0x0904, 0xb3e1, 0x91b6, 0x0027, 0x1904, + 0xb38d, 0x080c, 0x94a8, 0x6004, 0x080c, 0xc920, 0x01b0, 0x080c, + 0xc931, 0x01a8, 0x908e, 0x0021, 0x0904, 0xb38a, 0x908e, 0x0022, + 0x1130, 0x080c, 0xaf14, 0x0904, 0xb386, 0x0804, 0xb387, 0x908e, + 0x003d, 0x0904, 0xb38a, 0x0804, 0xb380, 0x080c, 0x31dc, 0x2001, + 0x0007, 0x080c, 0x647d, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, + 0x080c, 0xb4a0, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, + 0xc285, 0x080c, 0x73e4, 0x1108, 0xc2ad, 0x2202, 0x080c, 0xa781, + 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xe4f3, 0x002e, + 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, + 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x6010, 0x00b6, 0x905d, + 0x0100, 0x00be, 0x2c08, 0x080c, 0xdeb3, 0x007e, 0x003e, 0x002e, + 0x001e, 0x080c, 0xa79d, 0x080c, 0xce4a, 0x0016, 0x080c, 0xcba8, + 0x080c, 0xaad8, 0x001e, 0x080c, 0x32bc, 0x080c, 0x956a, 0x0030, + 0x080c, 0xcba8, 0x080c, 0xaad8, 0x080c, 0x956a, 0x0005, 0x080c, + 0xb4a0, 0x0cb0, 0x080c, 0xb4dc, 0x0c98, 0x9186, 0x0015, 0x0118, + 0x9186, 0x0016, 0x1140, 0x080c, 0xa993, 0x0d80, 0x9086, 0x0002, + 0x0904, 0xb4e7, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x94a8, + 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xaf14, 0x09f8, 0x080c, + 0x31ab, 0x080c, 0xce4a, 0x080c, 0xc920, 0x1190, 0x080c, 0x31dc, + 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb4a0, 0x9186, + 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0800, + 0x080c, 0xc931, 0x1120, 0x080c, 0xb4a0, 0x0804, 0xb380, 0x6004, + 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, + 0x0000, 0x080c, 0x3565, 0x00fe, 0x00ee, 0x0804, 0xb380, 0x6004, + 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xb4a0, 0x0804, + 0xb380, 0x90b2, 0x0040, 0x1a04, 0xb480, 0x2008, 0x0002, 0xb429, + 0xb42a, 0xb42d, 0xb430, 0xb433, 0xb436, 0xb427, 0xb427, 0xb427, + 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, + 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, + 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb439, 0xb442, 0xb427, + 0xb443, 0xb442, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb442, + 0xb442, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, + 0xb427, 0xb46b, 0xb442, 0xb427, 0xb43e, 0xb427, 0xb427, 0xb427, + 0xb43f, 0xb427, 0xb427, 0xb427, 0xb442, 0xb466, 0xb427, 0x080c, + 0x0d7d, 0x00c0, 0x2001, 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, + 0x2001, 0x0005, 0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, + 0x0088, 0x6003, 0x0005, 0x080c, 0x956a, 0x0058, 0x0018, 0x0010, + 0x080c, 0x647d, 0x04b8, 0x080c, 0xce4d, 0x6003, 0x0004, 0x080c, + 0x956a, 0x0005, 0x080c, 0x647d, 0x6003, 0x0002, 0x0036, 0x2019, + 0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1984, 0x201c, + 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, + 0x9318, 0x631a, 0x003e, 0x080c, 0x956a, 0x0c18, 0x080c, 0xcba8, + 0x080c, 0xaad8, 0x08f0, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, + 0x0000, 0x080c, 0x3565, 0x00fe, 0x00ee, 0x080c, 0x94a8, 0x080c, + 0xaad8, 0x0878, 0x6003, 0x0002, 0x080c, 0xce4d, 0x0804, 0x956a, + 0x2600, 0x2008, 0x0002, 0xb497, 0xb47a, 0xb495, 0xb47a, 0xb47a, + 0xb495, 0xb495, 0xb495, 0xb495, 0xb47a, 0xb495, 0xb47a, 0xb495, + 0xb47a, 0xb495, 0xb495, 0xb495, 0xb495, 0x080c, 0x0d7d, 0x0096, + 0x6014, 0x2048, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8, 0x0005, + 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xc723, 0x0568, 0x6014, + 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, + 0x1148, 0x080c, 0x539d, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, + 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, + 0xcd14, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, + 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, + 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, + 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, + 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, + 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, + 0x0d7d, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xcc34, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xcc7d, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xcca9, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xcbca, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xc96a, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xc9ab, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x001f, 0x1120, 0x080c, 0xaebd, 0x0804, + 0xb56c, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xb204, 0x04e0, + 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xaef5, 0x04a8, 0x6604, + 0x96b6, 0x0035, 0x1118, 0x080c, 0xb01b, 0x0470, 0x6604, 0x96b6, + 0x0039, 0x1118, 0x080c, 0xb199, 0x0438, 0x6604, 0x96b6, 0x003d, + 0x1118, 0x080c, 0xaf2d, 0x0400, 0x6604, 0x96b6, 0x0044, 0x1118, + 0x080c, 0xaf69, 0x00c8, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, + 0xafaa, 0x0090, 0x6604, 0x96b6, 0x0041, 0x1118, 0x080c, 0xaf94, + 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, + 0x1128, 0x00be, 0x0804, 0xb7c6, 0x00be, 0x0005, 0x080c, 0xab94, + 0x0cd8, 0xb589, 0xb58c, 0xb589, 0xb5d3, 0xb589, 0xb73a, 0xb7d3, + 0xb589, 0xb589, 0xb79c, 0xb589, 0xb7b2, 0x0096, 0x601f, 0x0000, + 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, + 0xaad8, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, + 0x9086, 0x0074, 0x1540, 0x080c, 0xde84, 0x11b0, 0x6010, 0x00b6, + 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, + 0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x647d, 0x080c, + 0x31dc, 0x080c, 0xaad8, 0x0098, 0x2001, 0x000a, 0x080c, 0x647d, + 0x080c, 0x31dc, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x90ef, + 0x080c, 0x956a, 0x0020, 0x2001, 0x0001, 0x080c, 0xb70a, 0x00ee, + 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x6469, + 0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, + 0x64a9, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, + 0x2204, 0x9086, 0x0074, 0x1904, 0xb6e1, 0x6010, 0x2058, 0xbaa0, + 0x9286, 0x007e, 0x1120, 0x080c, 0xb920, 0x0804, 0xb645, 0x080c, + 0xb915, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, + 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcd14, + 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, + 0x0006, 0x080c, 0x647d, 0x080c, 0x31dc, 0x080c, 0xaad8, 0x0804, + 0xb6e4, 0x080c, 0xb6f2, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, + 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcd14, 0x08f8, + 0x080c, 0xb6e8, 0x0160, 0x9006, 0x080c, 0x6469, 0x2001, 0x0004, + 0x080c, 0x64a9, 0x2001, 0x0007, 0x080c, 0x647d, 0x08a0, 0x2001, + 0x0004, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, + 0x90ef, 0x080c, 0x956a, 0x0804, 0xb6e4, 0xb85c, 0xd0e4, 0x01d8, + 0x080c, 0xcb42, 0x080c, 0x73e4, 0x0118, 0xd0dc, 0x1904, 0xb607, + 0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x196d, 0x2004, + 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2643, 0x78e2, + 0x00fe, 0x0804, 0xb607, 0x080c, 0xcb83, 0x2011, 0x1837, 0x2204, + 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe014, 0x000e, 0x1904, 0xb607, + 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x647d, 0x9006, 0x080c, + 0x6469, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, + 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, + 0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, 0x908c, 0x00ff, 0x00ee, + 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2618, 0x00f6, 0x2100, + 0x900e, 0x080c, 0x25cf, 0x795e, 0x00fe, 0x9186, 0x0081, 0x01d8, + 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, + 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, + 0x2618, 0x00f6, 0x2079, 0x1800, 0x7982, 0x2100, 0x900e, 0x080c, + 0x25cf, 0x795e, 0x00fe, 0x8108, 0x080c, 0x64cc, 0x2b00, 0x00ce, + 0x1904, 0xb607, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, + 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, + 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x647d, 0x6023, 0x0001, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, + 0x0018, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, + 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, + 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xe54c, 0x0190, 0x2071, 0x0260, + 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, + 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, + 0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007, 0x080c, + 0x647d, 0x080c, 0x5610, 0x1120, 0x2001, 0x0007, 0x080c, 0x64a9, + 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, + 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, + 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4a38, 0x004e, + 0x003e, 0x080c, 0x31dc, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, + 0x0804, 0xaad8, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, + 0x7090, 0x9086, 0x0014, 0x1904, 0xb792, 0x080c, 0x5610, 0x1170, + 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, + 0x2021, 0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x00d6, 0x6010, + 0x2058, 0x080c, 0x65c8, 0x080c, 0xb5c1, 0x00de, 0x080c, 0xb9e6, + 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, + 0x080c, 0x647d, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, + 0x4000, 0x080c, 0xcd14, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, + 0x009e, 0x080c, 0x31dc, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, + 0xaad8, 0x0028, 0x080c, 0xb4a0, 0x9006, 0x080c, 0xb70a, 0x001e, + 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, + 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003, 0x0001, + 0x6007, 0x0001, 0x080c, 0x90ef, 0x0804, 0x956a, 0x2001, 0x0001, + 0x0804, 0xb70a, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, + 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x647d, + 0x0804, 0xaad8, 0x2001, 0x0001, 0x0804, 0xb70a, 0x0002, 0xb589, + 0xb7de, 0xb589, 0xb81f, 0xb589, 0xb8cc, 0xb7d3, 0xb589, 0xb589, + 0xb8e0, 0xb589, 0xb8f2, 0x6604, 0x9686, 0x0003, 0x0904, 0xb73a, + 0x96b6, 0x001e, 0x1110, 0x080c, 0xaad8, 0x0005, 0x00b6, 0x00d6, + 0x00c6, 0x080c, 0xb904, 0x11a0, 0x9006, 0x080c, 0x6469, 0x080c, + 0x31ab, 0x080c, 0xce4a, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x0418, + 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, 0x601b, + 0x000a, 0x0088, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, + 0x1900, 0x1108, 0x08a0, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x2001, + 0x0001, 0x080c, 0xb70a, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, + 0x00b6, 0x0026, 0x9016, 0x080c, 0xb912, 0x00d6, 0x2069, 0x197c, + 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, + 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, + 0x00de, 0x0088, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002, 0x080c, + 0x647d, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, + 0x956a, 0x0804, 0xb89c, 0x080c, 0xc723, 0x01b0, 0x6014, 0x2048, + 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, + 0x0002, 0x080c, 0xcd6e, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, + 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, + 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, + 0x9006, 0x0c38, 0x080c, 0xb4a0, 0x2009, 0x026e, 0x2134, 0x96b4, + 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, 0x01c8, 0x2009, + 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01c0, + 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, 0x2001, 0x0004, + 0x080c, 0x647d, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0020, + 0x2001, 0x0001, 0x080c, 0xb70a, 0x002e, 0x00be, 0x009e, 0x0005, + 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xc723, 0x0140, + 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40, + 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, + 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, + 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5ed4, 0x00ee, + 0x0010, 0x080c, 0x31ab, 0x0860, 0x080c, 0xb912, 0x1160, 0x2001, + 0x0004, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, + 0x90ef, 0x0804, 0x956a, 0x080c, 0xb4a0, 0x9006, 0x0804, 0xb70a, + 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x647d, 0x6003, 0x0001, + 0x6007, 0x0005, 0x080c, 0x90ef, 0x0804, 0x956a, 0x2001, 0x0001, + 0x0804, 0xb70a, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c, 0x647d, + 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x90ef, 0x0804, 0x956a, + 0x2001, 0x0001, 0x0804, 0xb70a, 0x2009, 0x026e, 0x2104, 0x9086, + 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, + 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, + 0x6110, 0x2158, 0x080c, 0x653c, 0x001e, 0x00ce, 0x00be, 0x0005, + 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, + 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xb9b8, + 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6966, + 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe191, 0x2001, + 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, + 0x080c, 0x316a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2f79, 0x00ee, + 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x32bc, + 0x8108, 0x1f04, 0xb956, 0x015e, 0x00ce, 0x080c, 0xb915, 0x2071, + 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1837, 0x200c, + 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, + 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, 0x2102, 0x2079, + 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, + 0x0006, 0x8e70, 0x2e04, 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, + 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182c, + 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2618, 0x080c, + 0x73e4, 0x0170, 0x2071, 0x0260, 0x2069, 0x1980, 0x7048, 0x206a, + 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xcb42, + 0x0040, 0x2001, 0x0006, 0x080c, 0x647d, 0x080c, 0x31dc, 0x080c, + 0xaad8, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, + 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, + 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, + 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, + 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, 0x1148, 0x2011, + 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xbaad, 0x1100, + 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, + 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, + 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, + 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, + 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, + 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, + 0x19f1, 0x252c, 0x2021, 0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071, + 0x1800, 0x7254, 0x7074, 0x9202, 0x1a04, 0xba79, 0x080c, 0x8a5a, + 0x0904, 0xba72, 0x080c, 0xe1bd, 0x0904, 0xba72, 0x6720, 0x9786, + 0x0007, 0x0904, 0xba72, 0x2500, 0x9c06, 0x0904, 0xba72, 0x2400, + 0x9c06, 0x0904, 0xba72, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, + 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590, + 0x00c6, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, + 0x1a53, 0x9786, 0x000a, 0x0148, 0x080c, 0xc931, 0x1130, 0x00ce, + 0x080c, 0xb4a0, 0x080c, 0xab13, 0x00e8, 0x6014, 0x2048, 0x080c, + 0xc723, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, + 0x080c, 0x0fed, 0x009e, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x080c, + 0xab13, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1210, 0x0804, + 0xba19, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, + 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xe134, + 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, + 0x2009, 0x004c, 0x080c, 0xab77, 0x08e0, 0x9786, 0x000a, 0x0938, + 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, + 0xba99, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, + 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, + 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, + 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, + 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, + 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, + 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, + 0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbad7, + 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, + 0x1a0c, 0x0d7d, 0x080c, 0xc920, 0x0120, 0x080c, 0xc931, 0x0158, + 0x0028, 0x080c, 0x31dc, 0x080c, 0xc931, 0x0128, 0x080c, 0x94a8, + 0x080c, 0xaad8, 0x0005, 0x080c, 0xb4a0, 0x0cc0, 0x9182, 0x0057, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbb1d, 0xbb1d, + 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, + 0xbb1d, 0xbb1f, 0xbb1f, 0xbb1f, 0xbb1f, 0xbb1d, 0xbb1d, 0xbb1d, + 0xbb1f, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0x080c, 0x0d7d, 0x600b, + 0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, 0x8000, 0x080c, + 0xce4d, 0x2009, 0x8000, 0x080c, 0x90e8, 0x012e, 0x0005, 0x9186, + 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xbba4, 0x9186, + 0x0027, 0x1520, 0x080c, 0x94a8, 0x080c, 0x31ab, 0x080c, 0xce4a, + 0x0096, 0x6114, 0x2148, 0x080c, 0xc723, 0x0198, 0x080c, 0xc931, + 0x1118, 0x080c, 0xb4a0, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, + 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6c7f, 0x080c, + 0xc90b, 0x009e, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9186, 0x0014, + 0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c, 0x0d7d, 0x0005, + 0x0002, 0xbb82, 0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb80, + 0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb9b, 0xbb9b, 0xbb9b, 0xbb9b, + 0xbb80, 0xbb9b, 0xbb80, 0xbb9b, 0xbb80, 0xbb80, 0xbb80, 0xbb80, + 0x080c, 0x0d7d, 0x080c, 0x94a8, 0x0096, 0x6114, 0x2148, 0x080c, + 0xc723, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, + 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6c7f, 0x080c, 0xc90b, 0x009e, + 0x080c, 0xaad8, 0x0005, 0x080c, 0x94a8, 0x080c, 0xc931, 0x090c, + 0xb4a0, 0x080c, 0xaad8, 0x0005, 0x0002, 0xbbbe, 0xbbbc, 0xbbbc, + 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, + 0xbbc0, 0xbbc0, 0xbbc0, 0xbbc0, 0xbbbc, 0xbbc2, 0xbbbc, 0xbbc0, + 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0x080c, 0x0d7d, 0x080c, 0x0d7d, + 0x080c, 0x0d7d, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9182, 0x0057, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbbe5, 0xbbe5, + 0xbbe5, 0xbbe5, 0xbbe5, 0xbc1e, 0xbd0d, 0xbbe5, 0xbd19, 0xbbe5, + 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, + 0xbbe5, 0xbd19, 0xbbe7, 0xbbe5, 0xbd17, 0x080c, 0x0d7d, 0x00b6, + 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1508, + 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87c, 0xd0ac, + 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x080c, 0x6a95, + 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, + 0x9005, 0x0110, 0x080c, 0x6658, 0x080c, 0xaad8, 0x009e, 0x00be, + 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, 0x9105, 0x09c0, + 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xca61, 0x0c80, 0x00b6, 0x0096, + 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, + 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, 0xb800, 0xd0bc, + 0x1904, 0xbcfc, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, + 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x080c, + 0x6a95, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, + 0xb8d0, 0x9005, 0x0110, 0x080c, 0x6658, 0x601c, 0xd0fc, 0x1148, + 0x7044, 0xd0e4, 0x1904, 0xbce0, 0x080c, 0xaad8, 0x009e, 0x00be, + 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d7d, 0x968c, 0x0c00, + 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbce4, 0x7348, + 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, + 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, + 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, + 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, + 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, + 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, + 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, + 0x0804, 0xbc2a, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, + 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, + 0x0025, 0x080c, 0xc2f6, 0x003e, 0xd6cc, 0x0904, 0xbc3f, 0x7154, + 0xa98a, 0x81ff, 0x0904, 0xbc3f, 0x9192, 0x0021, 0x1278, 0x8304, + 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc2f6, 0x2011, 0x0205, + 0x2013, 0x0000, 0x080c, 0xcdda, 0x0804, 0xbc3f, 0xa868, 0xd0fc, + 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, + 0xc295, 0x00ae, 0x080c, 0xcdda, 0x080c, 0xc2e6, 0x0804, 0xbc41, + 0x080c, 0xca24, 0x0804, 0xbc56, 0xa87c, 0xd0ac, 0x0904, 0xbc67, + 0xa880, 0xd0bc, 0x1904, 0xbc67, 0x7348, 0xa838, 0x9306, 0x11c8, + 0x734c, 0xa834, 0x931e, 0x0904, 0xbc67, 0xd6d4, 0x0190, 0xab38, + 0x9305, 0x0904, 0xbc67, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xbc32, + 0xa838, 0xa934, 0x9105, 0x0904, 0xbc32, 0xa880, 0xd0bc, 0x1904, + 0xbc32, 0x080c, 0xca61, 0x0804, 0xbc56, 0x00f6, 0x2079, 0x026c, + 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021, 0x0005, 0x0011, + 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007, 0x0043, 0x6014, + 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005, 0x2130, 0x2228, + 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, + 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a, 0xae36, 0xad3a, + 0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x604b, 0x0000, 0x080c, 0x1c0c, + 0x1118, 0x6144, 0x080c, 0x9114, 0x009e, 0x0005, 0x9182, 0x0057, + 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbd65, 0xbd65, + 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, + 0xbd67, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd78, 0xbd65, 0xbd65, + 0xbd65, 0xbd65, 0xbd9c, 0xbd65, 0xbd65, 0x080c, 0x0d7d, 0x6004, + 0x9086, 0x0040, 0x1110, 0x080c, 0x94a8, 0x2019, 0x0001, 0x080c, + 0x9fef, 0x6003, 0x0002, 0x080c, 0xce52, 0x080c, 0x9505, 0x0005, + 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x94a8, 0x2019, 0x0001, + 0x080c, 0x9fef, 0x080c, 0x9505, 0x080c, 0x31ab, 0x080c, 0xce4a, + 0x0096, 0x6114, 0x2148, 0x080c, 0xc723, 0x0150, 0xa867, 0x0103, + 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b, + 0x009e, 0x080c, 0xaad8, 0x0005, 0x080c, 0x0d7d, 0xa87b, 0x0015, + 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, + 0x0000, 0x0006, 0x0016, 0x2009, 0x1a76, 0x2104, 0x8000, 0x200a, + 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0057, 0x1220, + 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbdd4, 0xbdd4, 0xbdd4, + 0xbdd4, 0xbdd4, 0xbdd6, 0xbdd4, 0xbdd4, 0xbe93, 0xbdd4, 0xbdd4, + 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, + 0xbfd7, 0xbdd4, 0xbfe1, 0xbdd4, 0x080c, 0x0d7d, 0x601c, 0xd0bc, + 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084, 0x601e, 0x0804, + 0xbbc6, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5, 0xa87e, 0x009e, + 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, + 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, 0xb676, 0x96b4, + 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, + 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xbe8c, + 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, + 0xb08e, 0x9284, 0x0300, 0x0904, 0xbe8c, 0x9686, 0x0100, 0x1130, + 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x103b, + 0x090c, 0x0d7d, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, + 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, + 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, + 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, + 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, + 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, + 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, + 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, + 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, + 0x2011, 0x0025, 0x080c, 0xc2f6, 0x003e, 0xd6cc, 0x01e8, 0x7154, + 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, + 0x0018, 0x2011, 0x0029, 0x080c, 0xc2f6, 0x2011, 0x0205, 0x2013, + 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, + 0x0c68, 0x2950, 0x080c, 0xc295, 0x080c, 0x1a31, 0x009e, 0x00ee, + 0x00ae, 0x007e, 0x0005, 0x2001, 0x1986, 0x2004, 0x604a, 0x0096, + 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, + 0xa87e, 0x6003, 0x0002, 0x080c, 0xce5b, 0x0904, 0xbfd2, 0x604b, + 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, + 0xd1cc, 0x0904, 0xbf91, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xbf52, + 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, + 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xbf20, 0x9086, 0x0028, + 0x1904, 0xbf0c, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xbf28, + 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, + 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, + 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, + 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, + 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc, 0x601e, 0x9006, + 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0140, + 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fed, 0x009e, + 0x080c, 0xca61, 0x0804, 0xbfd2, 0xd1dc, 0x0158, 0xa87b, 0x0015, + 0xb07b, 0x0015, 0x080c, 0xccfd, 0x0118, 0xb174, 0xc1dc, 0xb176, + 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, + 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06, 0x8006, + 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080, 0x0019, + 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xa87e, 0x080c, + 0xcdda, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fed, 0x001e, + 0x0804, 0xbfbe, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, + 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c, + 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, + 0x0015, 0x080c, 0xccfd, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, + 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, + 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0xa890, + 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fed, + 0x009e, 0x080c, 0xcdda, 0xa974, 0x0016, 0x080c, 0xc2e6, 0x001e, + 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, + 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc, + 0x0148, 0xa87b, 0x0015, 0x080c, 0xccfd, 0x0118, 0xa974, 0xc1dc, + 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b, + 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xbd9e, 0xa974, 0x0016, 0x080c, 0x6a95, 0x001e, 0x6010, 0x00b6, + 0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, 0x9005, + 0x0120, 0x0016, 0x080c, 0x6658, 0x001e, 0x00be, 0xd1e4, 0x1120, + 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0xca24, 0x0cd8, 0x6114, + 0x0096, 0x2148, 0xa97c, 0x080c, 0xce5b, 0x190c, 0x1a3f, 0x009e, + 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x01e8, + 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6, 0x6010, + 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x6a95, 0xba3c, + 0x8211, 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x6658, + 0x080c, 0xaad8, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc, 0xa87e, + 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xbd9e, 0x0c28, + 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xca61, 0x0c60, 0x080c, 0x94a8, + 0x0010, 0x080c, 0x9505, 0x601c, 0xd084, 0x0110, 0x080c, 0x1a53, + 0x080c, 0xc723, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xc931, + 0x1118, 0x080c, 0xb4a0, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, + 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a, 0x918e, + 0x0029, 0x1110, 0x080c, 0xe4e4, 0xa877, 0x0000, 0x080c, 0x6c7f, + 0x009e, 0x0804, 0xab13, 0xa87b, 0x0004, 0x0cb0, 0xa87b, 0x0004, + 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, + 0x0005, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc06a, 0xc068, + 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, + 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc08e, 0xc068, 0xc068, + 0x080c, 0x0d7d, 0x080c, 0x5604, 0x01f8, 0x6014, 0x7144, 0x918c, + 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, + 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, + 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, + 0xaa9e, 0x080c, 0x6c7f, 0x009e, 0x0804, 0xaad8, 0x080c, 0x5604, + 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085, 0x0002, + 0xc0a7, 0xc0a5, 0xc0a5, 0xc0b3, 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, + 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, 0x080c, 0x0d7d, 0x6003, + 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, + 0x90e8, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, + 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xc711, 0x01a0, 0x2268, + 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, + 0x00c6, 0x2d60, 0x080c, 0xc321, 0x00ce, 0x0128, 0x6803, 0x0002, + 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x2009, + 0x8020, 0x080c, 0x90e8, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, + 0x080c, 0xca61, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, + 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d, + 0x908a, 0x0092, 0x1a0c, 0x0d7d, 0x9082, 0x0085, 0x00e2, 0x9186, + 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7d, 0x080c, 0x94a8, + 0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x0140, 0xa867, 0x0103, + 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e, 0x080c, + 0xab13, 0x0804, 0x956a, 0xc128, 0xc12a, 0xc12a, 0xc128, 0xc128, + 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, + 0x080c, 0x0d7d, 0x080c, 0xab13, 0x0005, 0x9186, 0x0013, 0x1130, + 0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xc179, 0x9186, 0x0027, + 0x1558, 0x080c, 0x94a8, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x0096, + 0x6014, 0x2048, 0x080c, 0xc723, 0x0150, 0xa867, 0x0103, 0xa877, + 0x0000, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x080c, 0xc90b, 0x009e, + 0x080c, 0xaad8, 0x0005, 0x9186, 0x0089, 0x0118, 0x9186, 0x008a, + 0x1140, 0x080c, 0xa993, 0x0128, 0x9086, 0x000c, 0x0904, 0xc1b1, + 0x0000, 0x080c, 0xab94, 0x0c70, 0x9186, 0x0014, 0x1d60, 0x080c, + 0x94a8, 0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x0d00, 0xa867, + 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, + 0x0890, 0x0002, 0xc189, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, + 0xc19d, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, 0x080c, + 0x0d7d, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, + 0x9186, 0x0035, 0x1118, 0x2001, 0x1984, 0x0010, 0x2001, 0x1985, + 0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, + 0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000e, + 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, + 0x0804, 0xab94, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c9, 0xc216, + 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0x080c, + 0x0d7d, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, + 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc22a, 0x080c, 0xc723, + 0x1118, 0x080c, 0xc90b, 0x0068, 0x6014, 0x2048, 0x080c, 0xce61, + 0x1110, 0x080c, 0xc90b, 0xa867, 0x0103, 0x080c, 0xce15, 0x080c, + 0x6c7f, 0x00d6, 0x2c68, 0x080c, 0xaa82, 0x01d0, 0x6003, 0x0001, + 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, + 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xcbb0, + 0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, + 0x2d60, 0x00de, 0x080c, 0xaad8, 0x009e, 0x0005, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, + 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xcdad, 0x11f0, 0x080c, + 0xaa82, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, + 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, + 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, 0x615e, 0x080c, + 0xcbb0, 0x2009, 0x8020, 0x080c, 0x90e8, 0x2d60, 0x00de, 0x0804, + 0xaad8, 0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x01c8, 0xa867, + 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, + 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, + 0x080c, 0xca20, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b, + 0x009e, 0x0804, 0xaad8, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, + 0xc723, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, + 0x080c, 0x6c7f, 0x009e, 0x001e, 0x9186, 0x0013, 0x0158, 0x9186, + 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xab94, 0x0020, + 0x080c, 0x94a8, 0x080c, 0xab13, 0x0005, 0x0056, 0x0066, 0x0096, + 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, + 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, + 0x0029, 0x080c, 0xc2f6, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, + 0x080c, 0x0fed, 0x080c, 0x103b, 0x0520, 0x8528, 0xa867, 0x0110, + 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608, + 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c, + 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003, + 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000, + 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, + 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff, + 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x6c7f, + 0x2a48, 0x0cb8, 0x080c, 0x6c7f, 0x00ae, 0x0005, 0x00f6, 0x2079, + 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108, + 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0, + 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386, + 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000, + 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe, + 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x6020, + 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091, + 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f, 0x001b, + 0x006e, 0x012e, 0x0005, 0xc373, 0xc373, 0xc36e, 0xc397, 0xc34b, + 0xc36e, 0xc34d, 0xc36e, 0xc34b, 0x8fae, 0xc36e, 0xc36e, 0xc36e, + 0xc34b, 0xc34b, 0xc34b, 0x080c, 0x0d7d, 0x6010, 0x9080, 0x0000, + 0x2004, 0xd0bc, 0x190c, 0xc397, 0x0036, 0x6014, 0x0096, 0x2048, + 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c, 0x0038, 0xd094, + 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010, 0x080c, 0xdce5, + 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, + 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, 0x6014, 0x2048, + 0x080c, 0xc723, 0x01d0, 0x6043, 0xffff, 0xa864, 0x9086, 0x0139, + 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, + 0x0005, 0x080c, 0x6ebf, 0x080c, 0xca20, 0x080c, 0x6c73, 0x080c, + 0xab13, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x080c, + 0xa781, 0x080c, 0xce6f, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, + 0x002b, 0x0106, 0x080c, 0xa79d, 0x010e, 0x0005, 0xc3b6, 0xc3e4, + 0xc3b8, 0xc40b, 0xc3df, 0xc3b6, 0xc36e, 0xc373, 0xc373, 0xc36e, + 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0x080c, 0x0d7d, + 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014, + 0x2048, 0x080c, 0xc723, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096, + 0xa878, 0x2048, 0x080c, 0x0fed, 0x009e, 0x080c, 0xca20, 0x009e, + 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x2009, 0x8020, 0x080c, 0x90ca, 0x9085, 0x0001, 0x0005, 0x0066, + 0x080c, 0x1a53, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19e5, 0x7030, + 0x9c06, 0x1120, 0x080c, 0x9f6f, 0x00ee, 0x0850, 0x6020, 0x9084, + 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, + 0x2c40, 0x080c, 0xa103, 0x009e, 0x008e, 0x0040, 0x0066, 0x080c, + 0x9e6b, 0x190c, 0x0d7d, 0x080c, 0x9e79, 0x006e, 0x00ee, 0x1904, + 0xc3b8, 0x0804, 0xc36e, 0x0036, 0x00e6, 0x2071, 0x19e5, 0x704c, + 0x9c06, 0x1138, 0x901e, 0x080c, 0x9fef, 0x00ee, 0x003e, 0x0804, + 0xc3b8, 0x080c, 0xa239, 0x00ee, 0x003e, 0x1904, 0xc3b8, 0x0804, + 0xc36e, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, + 0x00ce, 0x0005, 0xc441, 0xc503, 0xc66a, 0xc449, 0xab13, 0xc441, + 0xdcd7, 0xce57, 0xc503, 0x8f75, 0xc6e9, 0xc43a, 0xc43a, 0xc43a, + 0xc43a, 0xc43a, 0x080c, 0x0d7d, 0x080c, 0xc931, 0x1110, 0x080c, + 0xb4a0, 0x0005, 0x080c, 0x94a8, 0x0804, 0xaad8, 0x601b, 0x0001, + 0x0005, 0x080c, 0xc723, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, + 0xa896, 0x009e, 0x080c, 0xa781, 0x080c, 0xce6f, 0x6000, 0x908a, + 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x0804, 0xa79d, 0xc46e, 0xc470, + 0xc49a, 0xc4ae, 0xc4d9, 0xc46e, 0xc441, 0xc441, 0xc441, 0xc4b5, + 0xc4b5, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc4bf, 0x080c, 0x0d7d, + 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, + 0x2071, 0x19e5, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c, 0x9e6b, + 0x190c, 0x0d7d, 0x080c, 0x9e79, 0x006e, 0x080c, 0xcdef, 0x6007, + 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1985, 0x2004, + 0x601a, 0x2009, 0x8020, 0x080c, 0x90ca, 0x00ee, 0x0005, 0x601b, + 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, + 0x009e, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0002, 0x2009, 0x8020, 0x080c, 0x90ca, 0x0005, 0x080c, 0xa781, + 0x080c, 0xa915, 0x080c, 0xa79d, 0x0c28, 0x0096, 0x601b, 0x0001, + 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, + 0x5604, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, + 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, + 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6c7f, 0x009e, 0x0804, + 0xaad8, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c, 0xce5b, 0x01f0, + 0x080c, 0xa79d, 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, + 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, + 0x2001, 0x0037, 0x2c08, 0x080c, 0x1670, 0x6000, 0x9086, 0x0004, + 0x1120, 0x2009, 0x0048, 0x080c, 0xab77, 0x0005, 0x009e, 0x080c, + 0x1a53, 0x0804, 0xc49a, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, + 0x000b, 0x0005, 0xc51a, 0xc446, 0xc51c, 0xc51a, 0xc51c, 0xc51c, + 0xc442, 0xc51a, 0xc43c, 0xc43c, 0xc51a, 0xc51a, 0xc51a, 0xc51a, + 0xc51a, 0xc51a, 0x080c, 0x0d7d, 0x6010, 0x00b6, 0x2058, 0xb804, + 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d7d, 0x00b6, + 0x0013, 0x00be, 0x0005, 0xc537, 0xc604, 0xc539, 0xc579, 0xc539, + 0xc579, 0xc539, 0xc547, 0xc537, 0xc579, 0xc537, 0xc568, 0x080c, + 0x0d7d, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, + 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xc600, 0x6004, + 0x080c, 0xc931, 0x0904, 0xc61d, 0x908e, 0x0004, 0x1110, 0x080c, + 0x31dc, 0x908e, 0x0021, 0x0904, 0xc621, 0x908e, 0x0022, 0x0904, + 0xc665, 0x908e, 0x003d, 0x0904, 0xc621, 0x908e, 0x0039, 0x0904, + 0xc625, 0x908e, 0x0035, 0x0904, 0xc625, 0x908e, 0x001e, 0x0178, + 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, + 0x9086, 0x0006, 0x0110, 0x080c, 0x31ab, 0x080c, 0xb4a0, 0x0804, + 0xab13, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xc5f1, + 0x9186, 0x0002, 0x1904, 0xc5c6, 0x2001, 0x1837, 0x2004, 0xd08c, + 0x11c8, 0x080c, 0x73e4, 0x11b0, 0x080c, 0xce35, 0x0138, 0x080c, + 0x7407, 0x1120, 0x080c, 0x72ef, 0x0804, 0xc64e, 0x2001, 0x197d, + 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x7315, + 0x0804, 0xc64e, 0x6010, 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac, + 0x1904, 0xc64e, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xc64e, 0xb840, + 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, + 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x080c, 0xaa82, + 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, + 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, + 0x007e, 0x1170, 0x2009, 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6, + 0x2071, 0x1800, 0x080c, 0x5ed4, 0x00ee, 0x080c, 0xb4a0, 0x0030, + 0x080c, 0xb4a0, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x080c, 0x31dc, 0x012e, 0x00ee, 0x080c, 0xab13, + 0x0005, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007, + 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00de, 0x00ce, 0x0c80, + 0x080c, 0x31dc, 0x0804, 0xc575, 0x00c6, 0x00d6, 0x6104, 0x9186, + 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, + 0x0904, 0xc5c6, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x90ef, + 0x080c, 0x956a, 0x00de, 0x00ce, 0x0898, 0x080c, 0xb4a0, 0x0804, + 0xc577, 0x080c, 0xb4dc, 0x0804, 0xc577, 0x00d6, 0x2c68, 0x6104, + 0x080c, 0xcdad, 0x00de, 0x0118, 0x080c, 0xaad8, 0x00f0, 0x6004, + 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, + 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1985, + 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, + 0x2160, 0x2009, 0x8020, 0x080c, 0x90e8, 0x0005, 0x00de, 0x00ce, + 0x080c, 0xb4a0, 0x080c, 0x31ab, 0x00e6, 0x0126, 0x2091, 0x8000, + 0x080c, 0x31dc, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, + 0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xaf14, 0x1904, + 0xc61d, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096, + 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xc685, 0xc685, 0xc685, + 0xc685, 0xc685, 0xc685, 0xc685, 0xc685, 0xc685, 0xc441, 0xc685, + 0xc446, 0xc687, 0xc446, 0xc694, 0xc685, 0x080c, 0x0d7d, 0x6004, + 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x2009, + 0x8020, 0x080c, 0x90e8, 0x0005, 0x080c, 0xce29, 0x0118, 0x080c, + 0xce3c, 0x0010, 0x080c, 0xce4a, 0x080c, 0xc90b, 0x080c, 0xc723, + 0x0570, 0x080c, 0x31ab, 0x080c, 0xc723, 0x0168, 0x6014, 0x2048, + 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, + 0xa882, 0x080c, 0x6c7f, 0x2c68, 0x080c, 0xaa82, 0x0150, 0x6810, + 0x6012, 0x080c, 0xcbb0, 0x00c6, 0x2d60, 0x080c, 0xab13, 0x00ce, + 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, + 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00c8, 0x080c, + 0xce29, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x31ab, + 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, + 0x9186, 0x0035, 0x1118, 0x080c, 0x31ab, 0x0868, 0x080c, 0xab13, + 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0002, 0xc6ff, + 0xc6ff, 0xc701, 0xc701, 0xc701, 0xc6ff, 0xc6ff, 0xab13, 0xc6ff, + 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0x080c, + 0x0d7d, 0x080c, 0xa781, 0x080c, 0xa915, 0x080c, 0xa79d, 0x6114, + 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6c7f, 0x009e, 0x0804, + 0xaad8, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, 0x0240, 0x2001, + 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, + 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, + 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x10e6, + 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7354, 0x7074, + 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xce35, 0x0180, + 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, + 0x31ab, 0x080c, 0xce4a, 0x00c6, 0x080c, 0xab13, 0x00ce, 0x0060, + 0x080c, 0xcb22, 0x0148, 0x080c, 0xc931, 0x1110, 0x080c, 0xb4a0, + 0x00c6, 0x080c, 0xaad8, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, + 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, + 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, + 0x2061, 0x1b30, 0x6112, 0x080c, 0x31ab, 0x9006, 0x0010, 0x9085, + 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0xaa82, 0x01d8, 0x080c, 0x5604, 0x0110, 0x662e, + 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x5604, 0x0118, 0x080c, + 0xc84d, 0x0168, 0x080c, 0xcbb0, 0x6023, 0x0003, 0x2009, 0x004b, + 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xab4a, + 0x05b0, 0x080c, 0x5604, 0x0118, 0x602f, 0x0000, 0x0010, 0x6017, + 0x0000, 0x2b00, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0003, 0x0016, + 0x080c, 0xa781, 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, + 0x2c08, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d, 0x001e, 0xd184, + 0x0128, 0x080c, 0xaad8, 0x9085, 0x0001, 0x0070, 0x080c, 0x5604, + 0x0128, 0xd18c, 0x1170, 0x080c, 0xc84d, 0x0148, 0x2009, 0x004c, + 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, + 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0xaa82, 0x2c78, + 0x01d8, 0x080c, 0x5604, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, + 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xc85f, 0x2f60, + 0x080c, 0x5604, 0x0118, 0x080c, 0xc84d, 0x0130, 0x001e, 0x0016, + 0x080c, 0xab77, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, + 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0xaa82, 0x2c78, 0x0530, + 0x080c, 0x5604, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, + 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, + 0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xaad8, 0x0060, + 0x2f60, 0x080c, 0x5604, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, + 0x2009, 0x0052, 0x080c, 0xab77, 0x9085, 0x0001, 0x004e, 0x00ce, + 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x49d8, + 0x00ce, 0x1120, 0x080c, 0xaad8, 0x9006, 0x0005, 0xa867, 0x0000, + 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, + 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0xa781, 0x080c, 0x670c, + 0x0158, 0x2001, 0xc866, 0x0006, 0x900e, 0x2400, 0x080c, 0x6ebf, + 0x080c, 0x6c7f, 0x000e, 0x0807, 0x2418, 0x080c, 0x946e, 0xbaa0, + 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x9289, + 0x008e, 0x080c, 0x9141, 0x2f08, 0x2648, 0x080c, 0xdeb3, 0xb93c, + 0x81ff, 0x090c, 0x9360, 0x080c, 0xa79d, 0x012e, 0x007e, 0x009e, + 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0190, + 0x660a, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, + 0x6016, 0x2009, 0x001f, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, + 0x080c, 0xab4a, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcbb0, + 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1728, + 0x00fe, 0x2009, 0x0021, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, + 0x0016, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0198, 0x660a, 0x2b08, + 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, + 0x0016, 0x080c, 0xab77, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0xab4a, 0x0188, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, + 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xab77, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830, + 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c, + 0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8d0, 0x9005, 0x0128, + 0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, 0x00be, 0x002e, 0x0005, + 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, 0x0003, + 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, + 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, 0x6014, + 0x904d, 0x080c, 0xc723, 0x0168, 0xa864, 0x9086, 0x0139, 0x0158, + 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, 0x9006, + 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x080c, 0xab4a, 0x0198, 0x2b08, 0x6112, 0x080c, + 0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x31ab, 0x2009, + 0x0028, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1824, 0x2204, + 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xb6f2, 0x00be, 0x080c, + 0xb915, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x90ef, 0x080c, + 0x956a, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, + 0x0148, 0x2001, 0x0001, 0x080c, 0xcd6e, 0x080c, 0xb4a0, 0x080c, + 0xaad8, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b, + 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, + 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x009e, + 0x080c, 0xaad8, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001, + 0x0004, 0x080c, 0x647d, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011, + 0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058, + 0x080c, 0x65c8, 0x00be, 0x080c, 0xb9e6, 0x1198, 0x6010, 0x00b6, + 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c, + 0x647d, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xaee8, + 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xb4a0, + 0x080c, 0xaad8, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d, + 0x090c, 0x0d7d, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, + 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, + 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, + 0x080c, 0xaad8, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b, + 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, + 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x080c, + 0xaad8, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005, + 0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, 0x0000, 0x6017, 0x0000, + 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x90e8, + 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0130, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, + 0x0005, 0xc441, 0xca53, 0xca53, 0xca56, 0xe1db, 0xe1f6, 0xe1f9, + 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, + 0xc441, 0x080c, 0x0d7d, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, + 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, + 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, + 0x2001, 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, + 0xaa82, 0x0508, 0x7810, 0x6012, 0x080c, 0xcbb0, 0x7820, 0x9086, + 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, + 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, + 0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020, 0x080c, 0x90e8, + 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1986, 0x2004, + 0x604a, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0x681c, 0xd0fc, + 0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, 0x0180, 0xc0e4, 0xa87e, + 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, 0x0130, + 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fed, 0x6830, 0x6036, + 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0170, + 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, 0x6803, + 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, 0x2048, + 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, 0x683c, + 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a, + 0x6808, 0x603e, 0x6910, 0x6112, 0x695c, 0x615e, 0x6023, 0x0001, + 0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, + 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8, + 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024, + 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046, + 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303, + 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005, + 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5, + 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8, + 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037, + 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e, + 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e, + 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, + 0x1980, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x9030, + 0x2001, 0x1984, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, + 0x1982, 0x200c, 0x8000, 0x2014, 0x2071, 0x196c, 0x711a, 0x721e, + 0x2001, 0x0064, 0x080c, 0x9030, 0x2001, 0x1985, 0x82ff, 0x1110, + 0x2011, 0x0014, 0x2202, 0x2001, 0x1986, 0x9288, 0x000a, 0x2102, + 0x2001, 0x0017, 0x080c, 0xa772, 0x2001, 0x1a87, 0x2102, 0x2001, + 0x0032, 0x080c, 0x1670, 0x080c, 0x694b, 0x00ee, 0x003e, 0x002e, + 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1984, + 0x2003, 0x0028, 0x2001, 0x1985, 0x2003, 0x0014, 0x2071, 0x196c, + 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1986, 0x2009, 0x001e, + 0x2102, 0x2001, 0x0017, 0x080c, 0xa772, 0x2001, 0x1a87, 0x2102, + 0x2001, 0x0032, 0x080c, 0x1670, 0x00ee, 0x001e, 0x000e, 0x0005, + 0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x106d, 0x009e, 0x0005, + 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0180, + 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, + 0x0033, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, + 0x0015, 0x1500, 0x7090, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048, + 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x9629, 0x01d8, 0x707c, + 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, 0x1140, 0x6210, + 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x31fc, 0x080c, + 0xaee8, 0x0020, 0x080c, 0xb4a0, 0x080c, 0xaad8, 0x00fe, 0x00ee, + 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0188, 0x2b08, 0x6112, + 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, + 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xaa82, + 0x0180, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, + 0x6016, 0x001e, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, + 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, + 0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, + 0x1530, 0x20e1, 0x0000, 0x2001, 0x199e, 0x2003, 0x0000, 0x6014, + 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, + 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e, + 0x0016, 0x200c, 0x080c, 0xd438, 0x001e, 0xa804, 0x9005, 0x0110, + 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, + 0xb4a0, 0x080c, 0xaad8, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, + 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, + 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, 0x9086, 0x0004, + 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x9629, 0x01a8, 0x707c, + 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, 0x1110, 0x080c, + 0x31ab, 0x080c, 0xaee8, 0x0020, 0x080c, 0xb4a0, 0x080c, 0xaad8, + 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, 0x9206, 0x0d78, + 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, + 0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78, + 0x080c, 0x9629, 0x05e8, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080, + 0xaad0, 0x9206, 0x1160, 0x080c, 0x31ab, 0x0016, 0xa998, 0xaab0, + 0x9284, 0x1000, 0xc0fd, 0x080c, 0x55b4, 0x001e, 0x0010, 0x080c, + 0x539d, 0x080c, 0xc723, 0x0500, 0xa87b, 0x0000, 0xa883, 0x0000, + 0xa897, 0x4000, 0x0078, 0x080c, 0x539d, 0x080c, 0xc723, 0x01a0, + 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, + 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, + 0x6c7f, 0x012e, 0x080c, 0xaad8, 0x00fe, 0x00ee, 0x009e, 0x0005, + 0x7060, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, 0x0026, 0xa87c, + 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, 0xa890, + 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, 0x9085, + 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, 0x080c, + 0xc723, 0x0904, 0xcd6a, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, + 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000, + 0xa868, 0xd0f4, 0x1140, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, + 0x9080, 0x0006, 0x2098, 0x080c, 0x0fb8, 0x20a9, 0x0004, 0xa85c, + 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, + 0x0fb8, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, 0x231c, + 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, 0x6310, + 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6c73, 0x6017, + 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026, 0x0036, + 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210, 0x2258, + 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084, 0x00ff, + 0x900e, 0x080c, 0x25cf, 0x2118, 0x831f, 0x939c, 0xff00, 0x7838, + 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, 0x4a38, + 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b, 0x000d, + 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002, 0x1130, + 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe, 0x009e, + 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026, 0x0016, + 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c, 0xc711, + 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, + 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160, 0x6108, + 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106, 0x1118, + 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005, 0x9085, + 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff, 0x918e, + 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e, 0x0001, + 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x0005, 0x0036, + 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, + 0xc723, 0x01c8, 0x080c, 0xc90b, 0x6037, 0x4000, 0x6014, 0x6017, + 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xc931, 0x1118, 0x080c, + 0xb4a0, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, + 0x080c, 0x6c7f, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, + 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, + 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xca20, 0xa877, 0x0000, + 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, + 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, 0x1810, + 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, + 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4bef, 0x004e, + 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1984, 0x2004, + 0x601a, 0x0005, 0x2001, 0x1986, 0x2004, 0x604a, 0x0005, 0x080c, + 0xaad8, 0x0804, 0x956a, 0x611c, 0xd1fc, 0xa97c, 0x1108, 0xd1e4, + 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x601c, + 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x6044, + 0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186, 0x0005, + 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x0005, 0x00b6, + 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x001b, 0x006e, + 0x00be, 0x0005, 0xce9a, 0xd593, 0xd6e4, 0xce9a, 0xce9a, 0xce9a, + 0xce9a, 0xce9a, 0xced1, 0xd762, 0xce9a, 0xce9a, 0xce9a, 0xce9a, + 0xce9a, 0xce9a, 0x080c, 0x0d7d, 0x0066, 0x6000, 0x90b2, 0x0016, + 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xceb5, 0xdc74, 0xceb5, + 0xceb5, 0xceb5, 0xceb5, 0xceb5, 0xceb5, 0xdc23, 0xdcc6, 0xceb5, + 0xe316, 0xe34a, 0xe316, 0xe34a, 0xceb5, 0x080c, 0x0d7d, 0x6000, + 0x9082, 0x0016, 0x1a0c, 0x0d7d, 0x6000, 0x000a, 0x0005, 0xcecf, + 0xd93e, 0xda07, 0xda29, 0xdaa4, 0xcecf, 0xdb9a, 0xdb2c, 0xd76c, + 0xdbfb, 0xdc10, 0xcecf, 0xcecf, 0xcecf, 0xcecf, 0xcecf, 0x080c, + 0x0d7d, 0x91b2, 0x0053, 0x1a0c, 0x0d7d, 0x2100, 0x91b2, 0x0040, + 0x1a04, 0xd30b, 0x0002, 0xcf1b, 0xd0fc, 0xcf1b, 0xcf1b, 0xcf1b, + 0xd105, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, + 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, + 0xcf1b, 0xcf1b, 0xcf1d, 0xcf77, 0xcf86, 0xcfea, 0xd015, 0xd08e, + 0xd0e7, 0xcf1b, 0xcf1b, 0xd108, 0xcf1b, 0xcf1b, 0xd11d, 0xd12a, + 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xd1ad, 0xcf1b, 0xcf1b, + 0xd1c1, 0xcf1b, 0xcf1b, 0xd17c, 0xcf1b, 0xcf1b, 0xcf1b, 0xd1d9, + 0xcf1b, 0xcf1b, 0xcf1b, 0xd256, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, + 0xcf1b, 0xcf1b, 0xd2d3, 0x080c, 0x0d7d, 0x080c, 0x6928, 0x1150, + 0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, + 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, + 0x0804, 0xd0f5, 0x080c, 0x68cd, 0x00e6, 0x00c6, 0x0036, 0x0026, + 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, + 0xa781, 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x2c08, + 0x080c, 0xdeb3, 0x007e, 0x001e, 0x080c, 0xa79d, 0x001e, 0x002e, + 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x653c, 0xbe04, + 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xdde1, 0x1904, + 0xcfe2, 0x080c, 0xdd7d, 0x1120, 0x6007, 0x0008, 0x0804, 0xd0f5, + 0x6007, 0x0009, 0x0804, 0xd0f5, 0x080c, 0xe014, 0x0128, 0x080c, + 0xdde1, 0x0d78, 0x0804, 0xcfe2, 0x6017, 0x1900, 0x0c88, 0x080c, + 0x32f2, 0x1904, 0xd308, 0x6106, 0x080c, 0xdd30, 0x6007, 0x0006, + 0x0804, 0xd0f5, 0x6007, 0x0007, 0x0804, 0xd0f5, 0x080c, 0xe386, + 0x1904, 0xd308, 0x080c, 0x32f2, 0x1904, 0xd308, 0x00d6, 0x6610, + 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, + 0x0001, 0x080c, 0x6469, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, + 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, + 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, + 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, + 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, + 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, + 0x080c, 0xde49, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, + 0x2258, 0xbaa0, 0x900e, 0x080c, 0x31fc, 0x002e, 0x080c, 0x65c8, + 0x6007, 0x000a, 0x00de, 0x0804, 0xd0f5, 0x6007, 0x000b, 0x00de, + 0x0804, 0xd0f5, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x6007, 0x0001, + 0x0804, 0xd0f5, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, + 0x1904, 0xd308, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, + 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, + 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, + 0xbaa0, 0x900e, 0x080c, 0x31fc, 0x002e, 0x6007, 0x000c, 0x2001, + 0x0001, 0x080c, 0xe553, 0x0804, 0xd0f5, 0x080c, 0x6928, 0x1140, + 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, + 0x0804, 0xcf2a, 0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04, 0x9684, + 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, + 0x080c, 0x64a9, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, + 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xcfe2, 0x080c, 0xde56, + 0x1120, 0x6007, 0x000e, 0x0804, 0xd0f5, 0x0046, 0x6410, 0x2458, + 0xbca0, 0x0046, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x004e, 0x0016, + 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, + 0x080c, 0xe191, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, + 0x004e, 0x6007, 0x0001, 0x0804, 0xd0f5, 0x2001, 0x0001, 0x080c, + 0x6469, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, + 0x1805, 0x2011, 0x0270, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e, + 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, + 0x0a04, 0xcfe2, 0x9682, 0x0007, 0x0a04, 0xd03e, 0x0804, 0xcfe2, + 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xd0f5, 0x080c, 0x6928, + 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, + 0x1110, 0x0804, 0xcf2a, 0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04, + 0x9684, 0x00ff, 0x9082, 0x0006, 0x0690, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xcfe2, 0x080c, + 0xde84, 0x1130, 0x080c, 0xdd7d, 0x1118, 0x6007, 0x0010, 0x04e8, + 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x31ab, 0x080c, + 0xce4a, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, + 0x0148, 0x2009, 0x0029, 0x080c, 0xe191, 0x6010, 0x2058, 0xb800, + 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, + 0xe014, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0978, + 0x0804, 0xcfe2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, + 0x32f2, 0x1904, 0xd308, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, + 0xd4d3, 0x1904, 0xcfe2, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, + 0x90ef, 0x080c, 0x956a, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x90ef, 0x080c, 0x956a, 0x0cb0, 0x6007, 0x0005, 0x0c68, + 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, 0x1904, 0xd308, + 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6007, 0x0020, 0x6003, 0x0001, + 0x080c, 0x90ef, 0x080c, 0x956a, 0x0005, 0x080c, 0x32f2, 0x1904, + 0xd308, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, + 0x956a, 0x0005, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, + 0x1904, 0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x0016, 0x0026, + 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, + 0x080c, 0xc711, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, + 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, + 0x2c08, 0x9006, 0x080c, 0xe15b, 0x1180, 0x7244, 0x9286, 0xffff, + 0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, + 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, + 0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0xaad8, 0x2160, + 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x6469, + 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, + 0x2011, 0x0276, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0120, 0x6007, 0x0031, 0x0804, 0xd0f5, 0x080c, 0xb70a, 0x080c, + 0x73e4, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x73fe, 0x1138, + 0x080c, 0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x0010, 0x080c, + 0x73b8, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x32f2, 0x1904, + 0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6106, 0x080c, 0xd4ef, + 0x1120, 0x6007, 0x002b, 0x0804, 0xd0f5, 0x6007, 0x002c, 0x0804, + 0xd0f5, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, 0x1904, + 0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6106, 0x080c, 0xd4f4, + 0x1120, 0x6007, 0x002e, 0x0804, 0xd0f5, 0x6007, 0x002f, 0x0804, + 0xd0f5, 0x080c, 0x32f2, 0x1904, 0xd308, 0x00e6, 0x00d6, 0x00c6, + 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, + 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, + 0x00ee, 0x0804, 0xd0fc, 0x080c, 0x5600, 0xd0e4, 0x0904, 0xd253, + 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, + 0x080c, 0x6966, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, + 0xb814, 0x9206, 0x0510, 0x080c, 0x6962, 0x15b8, 0x2069, 0x1800, + 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, 0x1578, 0x7210, 0x080c, + 0xc711, 0x0590, 0x080c, 0xd3c0, 0x0578, 0x080c, 0xe208, 0x0560, + 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, + 0x90e8, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, + 0x0150, 0x080c, 0xc711, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, + 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, + 0xe15b, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, + 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, + 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x32f2, + 0x1904, 0xd308, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, + 0x9086, 0x0006, 0x1904, 0xd0fc, 0x00e6, 0x00d6, 0x00c6, 0x080c, + 0x5600, 0xd0e4, 0x0904, 0xd2cb, 0x2069, 0x1800, 0x2071, 0x026c, + 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, + 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe15b, 0x2c10, 0x00ce, + 0x05e8, 0x080c, 0xc711, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, + 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xc321, 0x002e, + 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, + 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, + 0x2004, 0x9005, 0x0170, 0x080c, 0xd3c0, 0x0904, 0xd24c, 0x0056, + 0x7510, 0x7614, 0x080c, 0xe221, 0x005e, 0x00ce, 0x00de, 0x00ee, + 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, + 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, 0x0c78, 0x6007, 0x003b, + 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x90e8, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, + 0x0000, 0x0804, 0xd223, 0x00e6, 0x0026, 0x080c, 0x6928, 0x0550, + 0x080c, 0x68cd, 0x080c, 0xe3f8, 0x1518, 0x2071, 0x1800, 0x70dc, + 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, 0x0100, 0x72b0, 0x9284, + 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, 0x7280, 0x9205, 0x7082, + 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, 0x6966, 0x0120, 0x2011, + 0x1a07, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2f79, 0x0010, + 0x080c, 0xe42a, 0x002e, 0x00ee, 0x080c, 0xaad8, 0x0804, 0xd0fb, + 0x080c, 0xaad8, 0x0005, 0x2600, 0x0002, 0xd31f, 0xd350, 0xd361, + 0xd31f, 0xd31f, 0xd321, 0xd372, 0xd31f, 0xd31f, 0xd31f, 0xd33e, + 0xd31f, 0xd31f, 0xd31f, 0xd37d, 0xd38a, 0xd3bb, 0xd31f, 0x080c, + 0x0d7d, 0x080c, 0xe386, 0x1d20, 0x080c, 0x32f2, 0x1d08, 0x080c, + 0xd4d3, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, + 0x080c, 0x90ef, 0x0005, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0005, 0x080c, 0xe386, + 0x1938, 0x080c, 0x32f2, 0x1920, 0x080c, 0xd4d3, 0x1d60, 0x703c, + 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0005, + 0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0041, 0x080c, 0xe433, + 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, + 0x0005, 0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0042, 0x080c, + 0xe433, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, + 0x956a, 0x0005, 0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0046, + 0x080c, 0xe433, 0x080c, 0xaad8, 0x0005, 0x080c, 0xd3db, 0x0904, + 0xd308, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, + 0x956a, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, + 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, + 0x19bb, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x19bc, 0x2004, + 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, + 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbaad, + 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, + 0x080c, 0x956a, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, + 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, + 0xb8d4, 0xd084, 0x0150, 0x7128, 0x6050, 0x9106, 0x1120, 0x712c, + 0x604c, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, + 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, + 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7090, 0x908a, + 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x199e, 0x2003, 0x0000, + 0x080c, 0x1054, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816, + 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e, 0x0016, + 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1054, 0x01c0, 0x2900, + 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e, 0x0016, + 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, + 0x1800, 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fed, 0x9006, + 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, + 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, + 0x080c, 0x215d, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, + 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, + 0x080c, 0x215d, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x215d, 0x2061, + 0x199e, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, + 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x215d, + 0x2099, 0x0260, 0x0ca8, 0x2061, 0x199e, 0x2019, 0x0280, 0x3300, + 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108, + 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, + 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2175, 0x20a1, 0x024c, 0x2001, + 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, + 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2175, 0x20a1, + 0x0240, 0x0c98, 0x080c, 0x2175, 0x2061, 0x19a1, 0x6004, 0x20a0, + 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, + 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2175, 0x20a1, + 0x0240, 0x0c98, 0x2061, 0x19a1, 0x2019, 0x0260, 0x3400, 0x931e, + 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162, + 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, + 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004, + 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, + 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6, + 0x080c, 0xd569, 0x00de, 0x0005, 0x00d6, 0x080c, 0xd576, 0x1520, + 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, + 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xe553, 0x2009, + 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, + 0x080c, 0x25cf, 0x1148, 0x2001, 0x0001, 0x080c, 0xe553, 0x2110, + 0x900e, 0x080c, 0x31fc, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, + 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xab4a, 0x0598, 0x0016, + 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x25cf, 0x1568, 0x080c, 0x64cc, 0x1550, 0xbe12, 0xbd16, 0x00ce, + 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xe386, 0x11c8, 0x080c, + 0x32f2, 0x11b0, 0x080c, 0xd4d3, 0x0500, 0x2001, 0x0007, 0x080c, + 0x647d, 0x2001, 0x0007, 0x080c, 0x64a9, 0x6017, 0x0000, 0x6023, + 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0010, + 0x080c, 0xaad8, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, + 0xaad8, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xaad8, 0x9006, + 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, + 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, + 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, + 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, + 0x6800, 0x9084, 0x00ff, 0x910d, 0x6162, 0x908e, 0x0014, 0x0110, + 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d7d, + 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xd6b8, + 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d7d, + 0x2001, 0x0007, 0x080c, 0x64a9, 0x080c, 0x94a8, 0x080c, 0xab13, + 0x080c, 0x956a, 0x0005, 0xd5f3, 0xd5f5, 0xd5f3, 0xd5f3, 0xd5f3, + 0xd5f5, 0xd602, 0xd6b5, 0xd652, 0xd6b5, 0xd666, 0xd6b5, 0xd602, + 0xd6b5, 0xd6ad, 0xd6b5, 0xd6ad, 0xd6b5, 0xd6b5, 0xd5f3, 0xd5f3, + 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, + 0xd5f3, 0xd5f5, 0xd5f3, 0xd6b5, 0xd5f3, 0xd5f3, 0xd6b5, 0xd5f3, + 0xd6b2, 0xd6b5, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd6b5, 0xd6b5, + 0xd5f3, 0xd6b5, 0xd6b5, 0xd5f3, 0xd5fd, 0xd5f3, 0xd5f3, 0xd5f3, + 0xd5f3, 0xd6b1, 0xd6b5, 0xd5f3, 0xd5f3, 0xd6b5, 0xd6b5, 0xd5f3, + 0xd5f3, 0xd5f3, 0xd5f3, 0x080c, 0x0d7d, 0x080c, 0xce4d, 0x6003, + 0x0002, 0x080c, 0x956a, 0x0804, 0xd6b7, 0x9006, 0x080c, 0x6469, + 0x0804, 0xd6b5, 0x080c, 0x6962, 0x1904, 0xd6b5, 0x9006, 0x080c, + 0x6469, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, + 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010, + 0x2058, 0xb884, 0x9005, 0x1178, 0x080c, 0xce35, 0x1904, 0xd6b5, + 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4bef, 0x004e, + 0x003e, 0x0804, 0xd6b5, 0x080c, 0x3323, 0x1904, 0xd6b5, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, + 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x647d, + 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, + 0x080c, 0x956a, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x8519, + 0x0804, 0xd6b7, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0006, 0x0904, 0xd6b5, 0x9686, 0x0004, 0x0904, 0xd6b5, + 0x080c, 0x8d94, 0x2001, 0x0004, 0x0804, 0xd6b3, 0x2001, 0x1800, + 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, + 0xbba0, 0x2021, 0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x2001, + 0x0006, 0x080c, 0xd6d1, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, + 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, + 0x080c, 0x64a9, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, + 0x0006, 0x080c, 0x647d, 0x080c, 0x6962, 0x11f8, 0x2001, 0x1837, + 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, + 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, + 0x0804, 0xd63c, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0409, + 0x0020, 0x0018, 0x0010, 0x080c, 0x64a9, 0x080c, 0xaad8, 0x0005, + 0x2600, 0x0002, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6ce, + 0xd6cc, 0xd6ce, 0xd6cc, 0xd6cc, 0xd6ce, 0xd6cc, 0xd6cc, 0xd6cc, + 0xd6ce, 0xd6ce, 0xd6ce, 0xd6ce, 0x080c, 0x0d7d, 0x080c, 0xaad8, + 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, + 0x0138, 0x080c, 0x647d, 0x9006, 0x080c, 0x6469, 0x080c, 0x31dc, + 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, + 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d7d, 0x91b6, 0x0015, + 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d7d, 0x006b, + 0x0005, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xd74c, + 0xd711, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, + 0xb589, 0xb589, 0xb589, 0xd74c, 0xd753, 0xb589, 0xb589, 0xb589, + 0xb589, 0x00f6, 0x080c, 0x6962, 0x11d8, 0x080c, 0xce35, 0x11c0, + 0x6010, 0x905d, 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006, 0x080c, + 0x6469, 0x2001, 0x0002, 0x080c, 0x647d, 0x6023, 0x0001, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00d0, + 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25cf, 0x1190, + 0x080c, 0x652d, 0x0118, 0x080c, 0xaad8, 0x0060, 0xb810, 0x0006, + 0xb814, 0x0006, 0x080c, 0x5f5b, 0x000e, 0xb816, 0x000e, 0xb812, + 0x080c, 0xaad8, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, + 0x080c, 0xaad8, 0x0005, 0x080c, 0xb912, 0x1148, 0x6003, 0x0001, + 0x6007, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, 0x0010, 0x080c, + 0xaad8, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x080c, + 0x94a8, 0x080c, 0xab13, 0x0005, 0x9182, 0x0040, 0x0002, 0xd782, + 0xd782, 0xd782, 0xd782, 0xd784, 0xd782, 0xd782, 0xd782, 0xd782, + 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, + 0xd782, 0xd782, 0x080c, 0x0d7d, 0x0096, 0x00b6, 0x00d6, 0x00e6, + 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11b0, + 0x6007, 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, + 0xd7eb, 0x080c, 0xe547, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, + 0x0001, 0x2011, 0x0200, 0x080c, 0x87b6, 0x0020, 0x9026, 0x080c, + 0xe3cb, 0x0c30, 0x080c, 0x103b, 0x090c, 0x0d7d, 0x6003, 0x0007, + 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, + 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, + 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, + 0x6c7f, 0x001e, 0x080c, 0xe547, 0x1904, 0xd84b, 0x9486, 0x2000, + 0x1130, 0x2019, 0x0017, 0x080c, 0xe101, 0x0804, 0xd84b, 0x9486, + 0x0200, 0x1120, 0x080c, 0xe091, 0x0804, 0xd84b, 0x9486, 0x0400, + 0x0120, 0x9486, 0x1000, 0x1904, 0xd84b, 0x2019, 0x0002, 0x080c, + 0xe0b0, 0x0804, 0xd84b, 0x2069, 0x1a6d, 0x6a00, 0xd284, 0x0904, + 0xd8b5, 0x9284, 0x0300, 0x1904, 0xd8ae, 0x6804, 0x9005, 0x0904, + 0xd896, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1054, 0x0904, 0xd857, + 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, + 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd8b9, 0x9006, 0xa802, + 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, + 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, + 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, + 0x9084, 0x0003, 0x9080, 0xd853, 0x2005, 0xa87e, 0x20a9, 0x000a, + 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, + 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, + 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, + 0xa9ae, 0x080c, 0x6c82, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, + 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, + 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x103b, 0x1904, 0xd800, + 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, + 0x080c, 0x90e8, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, + 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, + 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, + 0x0043, 0x2009, 0xa025, 0x080c, 0x90e8, 0x0828, 0x6868, 0x602e, + 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, + 0x2009, 0xa022, 0x080c, 0x90e8, 0x0804, 0xd84b, 0x2001, 0x180e, + 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4a38, 0x6017, + 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, + 0x2009, 0xa022, 0x080c, 0x90e8, 0x0804, 0xd84b, 0x6017, 0xf500, + 0x0c98, 0x6017, 0xf600, 0x0804, 0xd86b, 0x6017, 0xf200, 0x0804, + 0xd86b, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, + 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd853, 0x2005, 0xa87e, + 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, + 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, + 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, + 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, + 0x0d7d, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xd935, 0x2041, 0x0001, + 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, + 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, + 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1054, 0x0170, 0x2900, + 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, + 0x0118, 0x080c, 0x106d, 0x0cc8, 0x080c, 0x106d, 0x0804, 0xd857, + 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, + 0x0000, 0x080c, 0xe134, 0x0804, 0xd84b, 0x8010, 0x0004, 0x801a, + 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, + 0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d7d, 0x9082, 0x0040, + 0x0a0c, 0x0d7d, 0x2008, 0x0804, 0xd9c0, 0x9186, 0x0051, 0x0108, + 0x0040, 0x080c, 0xa993, 0x01e8, 0x9086, 0x0002, 0x0904, 0xda07, + 0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, 0x9186, + 0x0014, 0x0150, 0x190c, 0x0d7d, 0x080c, 0xa993, 0x0150, 0x9086, + 0x0004, 0x0904, 0xdaa4, 0x0028, 0x6004, 0x9082, 0x0040, 0x2008, + 0x001a, 0x080c, 0xab94, 0x0005, 0xd987, 0xd989, 0xd989, 0xd9b0, + 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, + 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0x080c, + 0x0d7d, 0x080c, 0x94a8, 0x080c, 0x956a, 0x0036, 0x0096, 0x6014, + 0x904d, 0x01d8, 0x080c, 0xc723, 0x01c0, 0x6003, 0x0002, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, + 0x080c, 0xe134, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, + 0x1985, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, + 0x0096, 0x080c, 0x94a8, 0x080c, 0x956a, 0x080c, 0xc723, 0x0120, + 0x6014, 0x2048, 0x080c, 0x106d, 0x080c, 0xab13, 0x009e, 0x0005, + 0x0002, 0xd9d4, 0xd9e9, 0xd9d6, 0xd9fe, 0xd9d4, 0xd9d4, 0xd9d4, + 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, + 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0x080c, 0x0d7d, 0x0096, 0x6014, + 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, + 0x080c, 0xab77, 0x0010, 0x6003, 0x0004, 0x080c, 0x956a, 0x009e, + 0x0005, 0x080c, 0xc723, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, + 0x009e, 0xd1ec, 0x1138, 0x080c, 0x878b, 0x080c, 0xaad8, 0x080c, + 0x956a, 0x0005, 0x080c, 0xe38f, 0x0db0, 0x0cc8, 0x6003, 0x0001, + 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x90e8, 0x0005, 0x9182, + 0x0040, 0x0002, 0xda1d, 0xda1f, 0xda1d, 0xda1d, 0xda1d, 0xda1d, + 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, + 0xda1d, 0xda1d, 0xda1d, 0xda20, 0xda1d, 0x080c, 0x0d7d, 0x0005, + 0x00d6, 0x080c, 0x878b, 0x00de, 0x080c, 0xe3e7, 0x080c, 0xaad8, + 0x0005, 0x9182, 0x0040, 0x0002, 0xda3f, 0xda3f, 0xda3f, 0xda3f, + 0xda3f, 0xda3f, 0xda3f, 0xda3f, 0xda3f, 0xda41, 0xda6c, 0xda3f, + 0xda3f, 0xda3f, 0xda3f, 0xda6c, 0xda3f, 0xda3f, 0xda3f, 0x080c, + 0x0d7d, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x908c, + 0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, 0x2009, + 0x0041, 0x009e, 0x0804, 0xdb2c, 0x6003, 0x0007, 0x601b, 0x0000, + 0x080c, 0x878b, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec, + 0x1130, 0x080c, 0x878b, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, + 0xe38f, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, + 0x2102, 0x0036, 0x080c, 0x9505, 0x080c, 0x956a, 0x6014, 0x0096, + 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0188, + 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac, 0x6330, + 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003, 0x0002, + 0x0080, 0x2019, 0x0004, 0x080c, 0xe134, 0x6018, 0x9005, 0x1128, + 0x2001, 0x1985, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, + 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xdabb, + 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabd, + 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, + 0xdabb, 0xdabb, 0xdb08, 0x080c, 0x0d7d, 0x6014, 0x0096, 0x2048, + 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, 0x00be, 0xd1bc, + 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, + 0x009e, 0x0804, 0xdb2c, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, + 0x878b, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046, + 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420, 0x6432, + 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110, 0x00b6, + 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e, 0x210c, + 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, + 0x080c, 0x878d, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, + 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1667, 0x1904, 0xdabd, 0x0005, + 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, + 0x080c, 0x1667, 0x1904, 0xdabd, 0x0005, 0xd2fc, 0x0140, 0x8002, + 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, + 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208, 0x0062, + 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7d, 0x6024, + 0xd0dc, 0x090c, 0x0d7d, 0x0005, 0xdb4f, 0xdb5b, 0xdb67, 0xdb73, + 0xdb4f, 0xdb4f, 0xdb4f, 0xdb4f, 0xdb56, 0xdb51, 0xdb51, 0xdb4f, + 0xdb4f, 0xdb4f, 0xdb4f, 0xdb51, 0xdb4f, 0xdb51, 0xdb4f, 0x080c, + 0x0d7d, 0x6024, 0xd0dc, 0x090c, 0x0d7d, 0x0005, 0x6014, 0x9005, + 0x190c, 0x0d7d, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, + 0x8000, 0x2009, 0xa022, 0x080c, 0x90ca, 0x012e, 0x0005, 0x6003, + 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, 0x080c, + 0x90e8, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1be0, + 0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, 0x9084, + 0x0003, 0x9086, 0x0002, 0x0198, 0x6024, 0xd0cc, 0x1148, 0xd0c4, + 0x1138, 0xa8a8, 0x2004, 0x9005, 0x1118, 0x2009, 0xb035, 0x0010, + 0x2009, 0xa035, 0x009e, 0x080c, 0x912f, 0x012e, 0x0005, 0x2009, + 0xa032, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, + 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xdbb6, 0xdbb8, + 0xdbcd, 0xdbe7, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, + 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0x080c, 0x0d7d, + 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, 0x909c, 0x0003, 0x939e, + 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, + 0x2009, 0xa022, 0x080c, 0x90e8, 0x0468, 0x6014, 0x2048, 0xa87c, + 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, + 0x0001, 0x6106, 0x2009, 0xa001, 0x080c, 0x90e8, 0x00d8, 0x901e, + 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe134, 0x0098, 0x6014, + 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, + 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, 0x1be0, 0x2009, 0xa035, + 0x080c, 0x912f, 0x0005, 0x080c, 0x94a8, 0x6114, 0x81ff, 0x0158, + 0x0096, 0x2148, 0x080c, 0xe4e4, 0x0036, 0x2019, 0x0029, 0x080c, + 0xe134, 0x003e, 0x009e, 0x080c, 0xab13, 0x080c, 0x956a, 0x0005, + 0x080c, 0x9505, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, + 0xe4e4, 0x0036, 0x2019, 0x0029, 0x080c, 0xe134, 0x003e, 0x009e, + 0x080c, 0xab13, 0x0005, 0x9182, 0x0085, 0x0002, 0xdc35, 0xdc33, + 0xdc33, 0xdc41, 0xdc33, 0xdc33, 0xdc33, 0xdc33, 0xdc33, 0xdc33, + 0xdc33, 0xdc33, 0xdc33, 0x080c, 0x0d7d, 0x6003, 0x000b, 0x6106, + 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x90e8, 0x012e, + 0x0005, 0x0026, 0x00e6, 0x080c, 0xe386, 0x0118, 0x080c, 0xaad8, + 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, + 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, + 0x2011, 0x014e, 0x080c, 0xae05, 0x7220, 0x080c, 0xdfca, 0x0118, + 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, + 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, + 0x90e8, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, + 0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d, + 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, + 0x0118, 0x080c, 0xab94, 0x0050, 0x2001, 0x0007, 0x080c, 0x64a9, + 0x080c, 0x94a8, 0x080c, 0xab13, 0x080c, 0x956a, 0x0005, 0xdca4, + 0xdca6, 0xdca6, 0xdca4, 0xdca4, 0xdca4, 0xdca4, 0xdca4, 0xdca4, + 0xdca4, 0xdca4, 0xdca4, 0xdca4, 0x080c, 0x0d7d, 0x080c, 0xab13, + 0x080c, 0x956a, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d7d, 0x9182, + 0x0092, 0x1a0c, 0x0d7d, 0x9182, 0x0085, 0x0002, 0xdcc3, 0xdcc3, + 0xdcc3, 0xdcc5, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3, + 0xdcc3, 0xdcc3, 0xdcc3, 0x080c, 0x0d7d, 0x0005, 0x9186, 0x0013, + 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, + 0xab94, 0x0020, 0x080c, 0x94a8, 0x080c, 0xab13, 0x0005, 0x0036, + 0x080c, 0xe3e7, 0x604b, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, + 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, + 0x8000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x0006, 0x9086, + 0x0003, 0x0110, 0x080c, 0xa781, 0x0086, 0x2c40, 0x0096, 0x904e, + 0x080c, 0xa103, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, + 0xa1ae, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, + 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, + 0xe3e7, 0x080c, 0xce4d, 0x080c, 0x1a53, 0x6023, 0x0007, 0x6014, + 0x2048, 0x080c, 0xc723, 0x0110, 0x080c, 0xe134, 0x009e, 0x6017, + 0x0000, 0x080c, 0xe3e7, 0x6023, 0x0007, 0x080c, 0xce4d, 0x000e, + 0x9086, 0x0003, 0x0110, 0x080c, 0xa79d, 0x003e, 0x012e, 0x0005, + 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, + 0x783c, 0x080c, 0x25cf, 0x15d8, 0x0016, 0x00c6, 0x080c, 0x652d, + 0x15a0, 0x001e, 0x00c6, 0x2160, 0x080c, 0xce4a, 0x00ce, 0x002e, + 0x0026, 0x0016, 0x080c, 0xa781, 0x2019, 0x0029, 0x080c, 0xa275, + 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x007e, 0x001e, + 0x0076, 0x903e, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d, 0x0026, + 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, + 0x0004, 0x1118, 0xbaa0, 0x080c, 0x327e, 0x002e, 0x001e, 0x080c, + 0x5f5b, 0xbe12, 0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, + 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, + 0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, 0x1904, 0xddd6, + 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, + 0x8000, 0x0904, 0xddd3, 0x2001, 0x197c, 0x2004, 0x9005, 0x1140, + 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, + 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xe54c, 0x0118, 0x6978, + 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, + 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, + 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, 0x918a, 0x0001, 0x0298, + 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, + 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, 0x6017, 0x0900, 0x0040, + 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, + 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, + 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, 0x0156, 0x6210, 0x2258, + 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, 0x0180, 0x9286, 0x0004, + 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, + 0x0004, 0x0120, 0x080c, 0x653c, 0x0804, 0xde42, 0x2011, 0x0276, + 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, + 0x009e, 0x15c8, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, + 0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x1568, 0x0046, 0x0016, + 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, + 0x2009, 0x0029, 0x080c, 0xe191, 0xb800, 0xc0e5, 0xb802, 0x080c, + 0xa781, 0x2019, 0x0029, 0x080c, 0x926f, 0x0076, 0x2039, 0x0000, + 0x080c, 0x9141, 0x2c08, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d, + 0x2001, 0x0007, 0x080c, 0x64a9, 0x2001, 0x0007, 0x080c, 0x647d, + 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, + 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, + 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, + 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, + 0x080c, 0x25cf, 0x11d0, 0x080c, 0x652d, 0x11b8, 0x2011, 0x0270, + 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, + 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, + 0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x015e, 0x003e, 0x002e, + 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, + 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x25cf, 0x11d0, 0x080c, 0x652d, 0x11b8, 0x2011, 0x0276, 0x20a9, + 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, 0x009e, + 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, + 0x0006, 0x080c, 0xbaad, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, + 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, + 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x080c, 0xa7df, + 0x0106, 0x190c, 0xa781, 0x2740, 0x2029, 0x19f1, 0x252c, 0x2021, + 0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, + 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b30, 0x000e, 0x0128, 0x8001, + 0x9602, 0x1a04, 0xdf58, 0x0018, 0x9606, 0x0904, 0xdf58, 0x080c, + 0x8a5a, 0x0904, 0xdf4f, 0x2100, 0x9c06, 0x0904, 0xdf4f, 0x080c, + 0xe1cd, 0x1904, 0xdf4f, 0x080c, 0xe569, 0x0904, 0xdf4f, 0x080c, + 0xe1bd, 0x0904, 0xdf4f, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, + 0x3323, 0x0904, 0xdf9a, 0x6004, 0x9086, 0x0000, 0x1904, 0xdf9a, + 0x9786, 0x0004, 0x0904, 0xdf9a, 0x9786, 0x0007, 0x0904, 0xdf4f, + 0x2500, 0x9c06, 0x0904, 0xdf4f, 0x2400, 0x9c06, 0x0904, 0xdf4f, + 0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, 0x0096, 0x6043, 0xffff, + 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a53, 0x001e, + 0x9786, 0x000a, 0x0148, 0x080c, 0xc931, 0x1130, 0x080c, 0xb4a0, + 0x009e, 0x080c, 0xab13, 0x0418, 0x6014, 0x2048, 0x080c, 0xc723, + 0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, + 0x0fed, 0x009e, 0x080c, 0xe4e4, 0x0016, 0x080c, 0xca1a, 0x080c, + 0x6c73, 0x001e, 0x080c, 0xc90b, 0x009e, 0x080c, 0xab13, 0x9ce0, + 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xdecc, + 0x010e, 0x190c, 0xa79d, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, + 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, + 0x9386, 0x0005, 0x0128, 0x080c, 0xe4e4, 0x080c, 0xe134, 0x08e0, + 0x009e, 0x08e8, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, + 0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x9505, 0x0096, + 0x6114, 0x2148, 0x080c, 0xc723, 0x0118, 0x6010, 0x080c, 0x6c7f, + 0x009e, 0x00c6, 0x080c, 0xaad8, 0x00ce, 0x0036, 0x080c, 0x956a, + 0x003e, 0x009e, 0x0804, 0xdf4f, 0x9786, 0x000a, 0x0904, 0xdf36, + 0x0804, 0xdf34, 0x81ff, 0x0904, 0xdf4f, 0x9180, 0x0001, 0x2004, + 0x9086, 0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, + 0x1904, 0xdf4f, 0x6000, 0x9086, 0x0002, 0x1904, 0xdf4f, 0x080c, + 0xc920, 0x0138, 0x080c, 0xc931, 0x1904, 0xdf4f, 0x080c, 0xb4a0, + 0x0038, 0x080c, 0x31dc, 0x080c, 0xc931, 0x1110, 0x080c, 0xb4a0, + 0x080c, 0xab13, 0x0804, 0xdf4f, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, + 0x080c, 0xe15b, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, + 0x00ee, 0x00ce, 0x0005, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9, + 0xdfe9, 0xdfeb, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9, 0xab13, 0xab13, + 0xdfe9, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, + 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xe191, + 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xdce5, 0x003e, 0x9085, + 0x0001, 0x0005, 0x0096, 0x080c, 0xc723, 0x0140, 0x6014, 0x904d, + 0x080c, 0xc32e, 0x687b, 0x0005, 0x080c, 0x6c7f, 0x009e, 0x080c, + 0xab13, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x6469, + 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, + 0x2011, 0x0276, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e, 0x015e, + 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, + 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079, + 0x0001, 0x8fff, 0x0904, 0xe084, 0x2071, 0x1800, 0x7654, 0x7074, + 0x8001, 0x9602, 0x1a04, 0xe084, 0x88ff, 0x0120, 0x2800, 0x9c06, + 0x1590, 0x2078, 0x080c, 0xe1bd, 0x0570, 0x2400, 0x9c06, 0x0558, + 0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, + 0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106, + 0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe3e7, 0x080c, + 0xce4d, 0x080c, 0x1a53, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, + 0xc723, 0x0120, 0x0046, 0x080c, 0xe134, 0x004e, 0x009e, 0x080c, + 0xab13, 0x88ff, 0x1198, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, + 0x9c02, 0x1210, 0x0804, 0xe039, 0x9006, 0x012e, 0x00be, 0x006e, + 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, + 0x0ca0, 0x080c, 0xa781, 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, + 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, + 0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c, 0xa1ae, + 0x080c, 0xe02a, 0x005e, 0x007e, 0x00be, 0x080c, 0xa79d, 0x0005, + 0x080c, 0xa781, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, + 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, + 0x652d, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, + 0x0096, 0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c, + 0xa1ae, 0x080c, 0xe02a, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, + 0xe0bd, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, + 0xa79d, 0x0005, 0x080c, 0xa781, 0x00b6, 0x0076, 0x0056, 0x6210, + 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, + 0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c, 0xa1ae, + 0x2c20, 0x080c, 0xe02a, 0x005e, 0x007e, 0x00be, 0x080c, 0xa79d, + 0x0005, 0x080c, 0xa781, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, + 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, + 0x652d, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, + 0x080c, 0xe3cb, 0x004e, 0x0096, 0x904e, 0x080c, 0xa103, 0x009e, + 0x008e, 0x903e, 0x080c, 0xa1ae, 0x080c, 0xe02a, 0x003e, 0x001e, + 0x8108, 0x1f04, 0xe10d, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, + 0x00be, 0x080c, 0xa79d, 0x0005, 0x0016, 0x00f6, 0x080c, 0xc721, + 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, + 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6c7f, 0x2f48, + 0x0cb0, 0xab82, 0x080c, 0x6c7f, 0x00fe, 0x001e, 0x0005, 0xa800, + 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6c7f, 0x2f48, 0x0cb8, + 0x080c, 0x6c7f, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc, + 0x9005, 0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, + 0x12f8, 0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, + 0x6008, 0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, + 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c, 0x2001, + 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, + 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, + 0x0c30, 0x0096, 0x0006, 0x080c, 0x103b, 0x000e, 0x090c, 0x0d7d, + 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xc711, 0x2001, + 0x0000, 0x0120, 0x2200, 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, + 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198c, 0x2004, 0xa882, + 0x9006, 0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6c7f, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, + 0x0158, 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, + 0x0009, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, + 0x0138, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, + 0x9085, 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, + 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, + 0x6003, 0x000b, 0x6023, 0x0005, 0x2001, 0x1985, 0x2004, 0x601a, + 0x2009, 0x8020, 0x080c, 0x90e8, 0x001e, 0x0005, 0xa001, 0xa001, + 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xca61, + 0x0030, 0x080c, 0xe3e7, 0x080c, 0x878b, 0x080c, 0xaad8, 0x0005, + 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe21c, 0xe21c, + 0xe21c, 0xe21e, 0xe21c, 0xe21e, 0xe21e, 0xe21c, 0xe21e, 0xe21c, + 0xe21c, 0xe21c, 0xe21c, 0xe21c, 0x9006, 0x0005, 0x9085, 0x0001, + 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe235, + 0xe235, 0xe235, 0xe235, 0xe235, 0xe235, 0xe242, 0xe235, 0xe235, + 0xe235, 0xe235, 0xe235, 0xe235, 0xe235, 0x6007, 0x003b, 0x602f, + 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, + 0x90e8, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe3e7, 0x604b, + 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, + 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe29b, 0x6814, 0x9005, + 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, + 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, + 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe312, 0x6014, + 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0d7d, 0x0804, + 0xe312, 0x2048, 0x080c, 0xc723, 0x1130, 0x0028, 0x2048, 0xa800, + 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, + 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, + 0xa882, 0x2009, 0x0043, 0x080c, 0xdb2c, 0x0804, 0xe312, 0x2009, + 0x0041, 0x0804, 0xe30c, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, + 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe235, 0xd0b4, + 0x0128, 0xd0fc, 0x090c, 0x0d7d, 0x0804, 0xe256, 0x6007, 0x003a, + 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00c6, 0x2d60, + 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xe312, + 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, + 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1728, 0x00fe, 0x2009, + 0x0042, 0x04d0, 0x0036, 0x080c, 0x103b, 0x090c, 0x0d7d, 0xa867, + 0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, + 0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, + 0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c, + 0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, + 0x0001, 0x080c, 0x6c7f, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, + 0xdce5, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, + 0x631a, 0x634a, 0x003e, 0x0038, 0x604b, 0x0000, 0x6003, 0x0007, + 0x080c, 0xdb2c, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, + 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, + 0x1178, 0x080c, 0x94a8, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, + 0x0004, 0x080c, 0xe134, 0x009e, 0x003e, 0x080c, 0x956a, 0x0005, + 0x9186, 0x0014, 0x0d70, 0x080c, 0xab94, 0x0005, 0xe345, 0xe343, + 0xe343, 0xe343, 0xe343, 0xe343, 0xe345, 0xe343, 0xe343, 0xe343, + 0xe343, 0xe343, 0xe343, 0x080c, 0x0d7d, 0x6003, 0x000c, 0x080c, + 0x956a, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, + 0x001a, 0x080c, 0xab94, 0x0005, 0xe361, 0xe361, 0xe361, 0xe361, + 0xe363, 0xe383, 0xe361, 0xe361, 0xe361, 0xe361, 0xe361, 0xe361, + 0xe361, 0x080c, 0x0d7d, 0x00d6, 0x2c68, 0x080c, 0xaa82, 0x01b0, + 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, + 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, + 0x6023, 0x0004, 0x2009, 0x8020, 0x080c, 0x90e8, 0x2d60, 0x080c, + 0xaad8, 0x00de, 0x0005, 0x080c, 0xaad8, 0x0005, 0x00e6, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, + 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, + 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1986, 0x2004, 0x604a, 0x2009, + 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867, 0x210c, + 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, + 0x1986, 0x200c, 0x2001, 0x1984, 0x2004, 0x9100, 0x9080, 0x000a, + 0x604a, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, 0x0008, 0x2104, + 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, + 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8bc, + 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x605c, 0x9106, 0x1138, + 0x600c, 0x2072, 0x080c, 0x878b, 0x080c, 0xaad8, 0x0010, 0x9cf0, + 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, + 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068, 0x9005, 0x0130, 0x9c06, + 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, + 0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084, 0x00ff, + 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204, + 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004, + 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbaad, 0x009e, + 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, + 0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x1100, 0x015e, 0x003e, + 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5ed4, 0x080c, + 0x2f79, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, 0x103b, 0x090c, + 0x0d7d, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9, 0x000c, 0xa860, + 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118, 0xa867, 0x0136, + 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110, 0xa87b, 0x0001, + 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00, 0x8007, 0x9215, + 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084, 0x00ff, 0x723c, + 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294, 0x00ff, 0xaaa2, + 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294, 0xff00, 0x9215, + 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186, 0x0046, 0x1118, + 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204, 0x8007, 0xa8a6, + 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204, 0x8007, 0xa8ae, + 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186, 0x0046, 0x11b8, + 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, + 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, + 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001, 0x00b0, 0x9e90, + 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, 0xa8ba, + 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260, 0x2204, 0x8007, + 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186, 0x0046, 0x1118, + 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146, 0x01d6, 0x0036, + 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210, 0x8319, 0x1dd0, + 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013, 0x0000, 0x002e, + 0x080c, 0x6c7f, 0x009e, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, + 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, + 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, + 0x19f1, 0x252c, 0x2021, 0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071, + 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, + 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, + 0x9c06, 0x01d0, 0x080c, 0xe1bd, 0x01b8, 0x080c, 0xe1cd, 0x11a0, + 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a53, 0x001e, + 0x080c, 0xc920, 0x1110, 0x080c, 0x31dc, 0x080c, 0xc931, 0x1110, + 0x080c, 0xb4a0, 0x080c, 0xab13, 0x9ce0, 0x001c, 0x2001, 0x181a, + 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, + 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1837, 0x2004, + 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xce35, + 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, + 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4bef, 0x004e, 0x003e, + 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0xa275, 0x080c, + 0xab13, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, + 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006, + 0xd5b4, 0x0118, 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500, + 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, + 0x908e, 0x0005, 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e, 0x00ee, + 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, + 0x2071, 0xfff6, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05, + 0x8000, 0x2077, 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005, + 0x00e6, 0x2071, 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, + 0xfff8, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, + 0x8000, 0x2071, 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, 0x000e, + 0x012e, 0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, + 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, + 0x4000, 0x8000, 0xd89f +}; +#ifdef UNIQUE_FW_NAME +unsigned short fw2322ipx_length01 = 0xdddb; +#else +unsigned short risc_code_length01 = 0xdddb; +#endif + +/* + * + */ + +unsigned long rseqipx_code_addr01 = 0x0001c000 ; +unsigned short rseqipx_code01[] = { +0x000b, 0x0003, 0x0000, 0x09d8, 0x0001, 0xc000, 0x0008, 0x8064, + 0x0000, 0x0010, 0x0000, 0x8066, 0x0008, 0x0101, 0x0003, 0xc007, + 0x0008, 0x80e0, 0x0008, 0xff00, 0x0000, 0x80e2, 0x0008, 0xff00, + 0x0008, 0x0162, 0x0000, 0x8066, 0x0008, 0xa101, 0x000b, 0xc00f, + 0x0008, 0x0d02, 0x0000, 0x8060, 0x0000, 0x0400, 0x0003, 0x60c2, + 0x0003, 0x5817, 0x000b, 0x7ae0, 0x000b, 0x521c, 0x000b, 0xc813, + 0x0009, 0xbac0, 0x0000, 0x008a, 0x0003, 0x8813, 0x0000, 0x15fc, + 0x000b, 0xb013, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0001, 0xffa0, + 0x0000, 0x2000, 0x0003, 0x9394, 0x0008, 0x808c, 0x0000, 0x0001, + 0x0007, 0x0000, 0x0007, 0x0000, 0x0000, 0x40d4, 0x000a, 0x4047, + 0x0008, 0x808c, 0x0000, 0x0002, 0x0007, 0x0000, 0x0003, 0x082e, + 0x0000, 0x4022, 0x0003, 0x0034, 0x0008, 0x4122, 0x0009, 0xeac0, + 0x0008, 0xff00, 0x0009, 0xffe0, 0x0008, 0x0500, 0x0003, 0x0bbb, + 0x0002, 0x4447, 0x000b, 0x8bb8, 0x0008, 0x0bfe, 0x0001, 0x11a0, + 0x0003, 0x139a, 0x0001, 0x0ca0, 0x0003, 0x139a, 0x0001, 0x9180, + 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc042, 0x0008, 0x808c, + 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0004, + 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc04a, 0x0000, 0x03fe, + 0x0001, 0x43e0, 0x0003, 0x8b97, 0x0009, 0xc2c0, 0x0008, 0x00ff, + 0x0001, 0x02e0, 0x0003, 0x8b97, 0x0001, 0x9180, 0x0008, 0x0005, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0000, 0x0019, 0x000b, 0xc059, 0x0002, 0x0240, 0x000b, 0x0b94, + 0x0008, 0x00fc, 0x0003, 0x3397, 0x000a, 0x0244, 0x000b, 0x086b, + 0x000c, 0x01f5, 0x0001, 0x9180, 0x0000, 0x0007, 0x0008, 0x7f62, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0002, 0x0234, 0x0008, 0x7f04, + 0x0000, 0x8066, 0x0000, 0x040a, 0x000b, 0xc06a, 0x000a, 0x0248, + 0x000b, 0x0875, 0x0001, 0x9180, 0x0008, 0x0006, 0x0008, 0x7f62, + 0x0008, 0x8002, 0x0008, 0x0003, 0x0000, 0x8066, 0x0000, 0x020a, + 0x000b, 0xc074, 0x0000, 0x112a, 0x0008, 0x002e, 0x0008, 0x022c, + 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, 0x0000, 0x0002, + 0x0008, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0000, 0x8066, + 0x0008, 0x0011, 0x000b, 0xc081, 0x0008, 0x01fe, 0x0009, 0x42e0, + 0x000b, 0x8b87, 0x0000, 0x00fe, 0x0001, 0x43e0, 0x000b, 0x8b87, + 0x0000, 0x1734, 0x0000, 0x1530, 0x0008, 0x1632, 0x0008, 0x0d2a, + 0x0001, 0x9880, 0x0008, 0x0012, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x000b, 0xc093, + 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x1a60, 0x0008, 0x8062, + 0x0000, 0x0002, 0x0003, 0x5899, 0x0000, 0x8066, 0x0000, 0x3679, + 0x000b, 0xc09c, 0x000b, 0x589d, 0x0008, 0x8054, 0x0008, 0x0011, + 0x0000, 0x8074, 0x0008, 0x1010, 0x0008, 0x1efc, 0x0003, 0x3013, + 0x0004, 0x00a6, 0x0003, 0x0013, 0x0000, 0x1c60, 0x0000, 0x1b62, + 0x0000, 0x8066, 0x0008, 0x0231, 0x000b, 0xc0aa, 0x000b, 0x58ab, + 0x0008, 0x0140, 0x0000, 0x0242, 0x0002, 0x1f43, 0x0003, 0x88b5, + 0x0000, 0x0d44, 0x0008, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, + 0x0003, 0x00b9, 0x0008, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, + 0x0000, 0x064a, 0x000a, 0x1948, 0x000b, 0x08bc, 0x0008, 0x0d4a, + 0x000b, 0x58bc, 0x0008, 0x8054, 0x0000, 0x0001, 0x0000, 0x8074, + 0x0008, 0x2020, 0x000f, 0x4000, 0x0000, 0x4820, 0x0008, 0x0bfe, + 0x0009, 0x10a0, 0x0003, 0x1123, 0x0001, 0x0ca0, 0x0003, 0x1123, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0008, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc0cf, + 0x0001, 0x80e0, 0x0008, 0x0003, 0x000b, 0x8923, 0x0000, 0x49b4, + 0x0002, 0x4b4e, 0x000b, 0x892c, 0x0008, 0x808a, 0x0000, 0x0004, + 0x0000, 0x18fe, 0x0001, 0x10e0, 0x000b, 0x88dd, 0x0002, 0x192f, + 0x0008, 0x7f32, 0x0008, 0x15fe, 0x0001, 0x10e0, 0x000b, 0x88e2, + 0x0002, 0x162f, 0x0008, 0x7f2c, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0009, 0x9080, 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x0009, 0x0003, 0xc0e9, 0x000a, 0x004f, 0x000b, 0x891a, + 0x000a, 0x0040, 0x0003, 0x0904, 0x0002, 0x004e, 0x0003, 0x0904, + 0x0002, 0x0030, 0x0002, 0x7f2f, 0x0000, 0x7f00, 0x0000, 0x8066, + 0x0008, 0x000a, 0x000b, 0xc0f5, 0x0008, 0x1010, 0x0004, 0x01dc, + 0x000b, 0xb0fd, 0x000c, 0x035b, 0x000c, 0x01c6, 0x000b, 0x7814, + 0x0003, 0x0013, 0x0000, 0x0806, 0x0008, 0x8010, 0x0000, 0x001f, + 0x000c, 0x035b, 0x0000, 0x0310, 0x000c, 0x035b, 0x0003, 0x00fb, + 0x000a, 0x002f, 0x0000, 0x7f00, 0x0000, 0x8066, 0x0008, 0x000a, + 0x000b, 0xc108, 0x000c, 0x019f, 0x000a, 0x0040, 0x000b, 0x091d, + 0x000c, 0x020c, 0x0000, 0x8000, 0x0000, 0x0002, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0006, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x000a, 0x000b, 0xc116, 0x0000, 0x8072, + 0x0000, 0x4000, 0x0003, 0x00fb, 0x0008, 0x8010, 0x0008, 0x001e, + 0x000b, 0x011f, 0x0008, 0x8010, 0x0008, 0x001d, 0x000c, 0x035b, + 0x0008, 0x1010, 0x000c, 0x035b, 0x000b, 0x0014, 0x0002, 0x4b4e, + 0x0003, 0x0929, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x6129, + 0x000f, 0x8000, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0011, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc133, + 0x000a, 0x004f, 0x0003, 0x8990, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0009, 0x9080, 0x0008, 0x0005, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x0009, 0x000b, 0xc13d, 0x0008, 0x0060, 0x0008, 0x8062, + 0x0000, 0x001f, 0x0000, 0x8066, 0x0000, 0x0209, 0x000b, 0xc143, + 0x000a, 0x014b, 0x000b, 0x0990, 0x0008, 0x8062, 0x0008, 0x000f, + 0x0000, 0x8066, 0x0000, 0x0211, 0x000b, 0xc14a, 0x0008, 0x01fe, + 0x0001, 0x02d0, 0x0003, 0x8990, 0x0004, 0x01a8, 0x000b, 0x0990, + 0x0008, 0x03a0, 0x0008, 0x8004, 0x0000, 0x0002, 0x0000, 0x8006, + 0x0000, 0x0043, 0x0008, 0x4908, 0x0008, 0x808a, 0x0000, 0x0004, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0000, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, 0x0003, 0xc15f, + 0x000b, 0xe160, 0x0008, 0x4908, 0x0008, 0x480a, 0x0008, 0x808a, + 0x0000, 0x0004, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x002b, + 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc16a, 0x0008, 0x04fe, + 0x0009, 0x02a0, 0x0003, 0x9171, 0x0002, 0x0500, 0x000b, 0x098d, + 0x0003, 0x0172, 0x0000, 0x05fe, 0x0001, 0x03a0, 0x000b, 0x118d, + 0x0000, 0x0d0c, 0x0008, 0x0d0e, 0x0008, 0x0d10, 0x0000, 0x0d12, + 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, 0x0000, 0x8066, + 0x0008, 0x0832, 0x0003, 0xc17d, 0x0000, 0x800a, 0x0000, 0x8005, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0011, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0a12, 0x0003, 0xc187, + 0x0008, 0x5006, 0x0008, 0x100e, 0x0004, 0x01b3, 0x000b, 0x7814, + 0x0003, 0x0013, 0x0008, 0x0208, 0x0008, 0x030a, 0x0003, 0x0174, + 0x000c, 0x019f, 0x0008, 0x808a, 0x0000, 0x0004, 0x0008, 0x8010, + 0x0008, 0x0021, 0x000c, 0x035b, 0x0008, 0x1010, 0x000c, 0x035b, + 0x0000, 0x4810, 0x000c, 0x035b, 0x0008, 0x4910, 0x000c, 0x035b, + 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0002, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0xb40a, 0x0003, 0xc1a6, 0x000f, 0x4000, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x0a62, 0x0000, 0x8066, + 0x0000, 0x0411, 0x000b, 0xc1ad, 0x0002, 0x0210, 0x0001, 0xffc0, + 0x0000, 0x0007, 0x0009, 0x03e0, 0x000f, 0x4000, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0001, 0x8380, 0x0000, 0x0002, 0x0009, 0x0a80, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0e0a, 0x0003, 0xc1bb, + 0x0002, 0x0300, 0x0001, 0xffc0, 0x0000, 0x0007, 0x0000, 0x7f06, + 0x0002, 0x0a00, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x060a, + 0x000b, 0xc1c4, 0x000f, 0x4000, 0x0000, 0x0da0, 0x0008, 0x0da2, + 0x0008, 0x0da4, 0x0009, 0x8880, 0x0000, 0x0001, 0x0008, 0x7f62, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, 0x0008, 0xa012, + 0x0000, 0x0da6, 0x0008, 0x0da8, 0x0000, 0x0daa, 0x0000, 0x0dac, + 0x0003, 0xc1d4, 0x0009, 0x8880, 0x0008, 0x0009, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0xa03a, 0x000b, 0xc1da, 0x000f, 0x4000, + 0x0009, 0x8880, 0x0008, 0x0005, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc1e3, + 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, 0x0000, 0x8066, + 0x0008, 0x0021, 0x000b, 0xc1e9, 0x0000, 0x00fe, 0x0001, 0x01d0, + 0x000b, 0x89f2, 0x0008, 0x02fe, 0x0009, 0x03d0, 0x0003, 0x09f2, + 0x0000, 0x0d06, 0x000f, 0x4000, 0x0000, 0x8006, 0x0000, 0x0001, + 0x000f, 0x4000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x002b, + 0x0000, 0x8066, 0x0008, 0xa041, 0x0003, 0xc1fa, 0x0002, 0x0243, + 0x000b, 0x8a01, 0x0000, 0x54ac, 0x0000, 0x55ae, 0x0008, 0x0da8, + 0x0000, 0x0daa, 0x0000, 0x50b0, 0x0000, 0x51b2, 0x0000, 0x0db4, + 0x0008, 0x0db6, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0007, + 0x0000, 0x8066, 0x0008, 0xa452, 0x0003, 0xc20a, 0x000f, 0x4000, + 0x000a, 0x3945, 0x000b, 0x8a16, 0x0000, 0x8072, 0x0008, 0x4040, + 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x8a14, 0x000f, 0x4000, + 0x0000, 0x8072, 0x0000, 0x4000, 0x0007, 0x0000, 0x0007, 0x0000, + 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x0a0e, 0x000b, 0x0216, + 0x000a, 0x3a40, 0x000b, 0x8817, 0x0008, 0x2b24, 0x0008, 0x2b24, + 0x0003, 0x5a20, 0x0008, 0x8054, 0x0000, 0x0002, 0x0002, 0x1242, + 0x0003, 0x0a64, 0x000a, 0x3a45, 0x000b, 0x0a55, 0x000a, 0x1e10, + 0x0000, 0x7f3c, 0x0003, 0x0a52, 0x0002, 0x1d00, 0x0000, 0x7f3a, + 0x0000, 0x0d60, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x0003, 0xc230, 0x0008, 0x00fc, 0x0003, 0xb24f, 0x0000, 0x1c60, + 0x0008, 0x8062, 0x0000, 0x0001, 0x0000, 0x8066, 0x0008, 0x0009, + 0x000b, 0xc238, 0x0008, 0x00fc, 0x0003, 0x3370, 0x0000, 0x0038, + 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0019, 0x0000, 0x8066, + 0x0008, 0x0009, 0x0003, 0xc241, 0x0009, 0x80c0, 0x0008, 0x00ff, + 0x0008, 0x7f3e, 0x0000, 0x0d60, 0x0008, 0x0efe, 0x0001, 0x1f80, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc24b, + 0x0008, 0x003a, 0x0000, 0x1dfe, 0x000b, 0x022c, 0x0008, 0x0036, + 0x0004, 0x00a6, 0x000b, 0x0264, 0x0000, 0x8074, 0x0000, 0x2000, + 0x000b, 0x0264, 0x0002, 0x3a44, 0x000b, 0x0b9d, 0x0000, 0x8074, + 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x000b, 0xb36d, + 0x0008, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, + 0x0009, 0x00d0, 0x0003, 0x8a74, 0x0000, 0x8074, 0x0008, 0x4040, + 0x0003, 0x5a64, 0x000b, 0x521c, 0x000a, 0x3a46, 0x0003, 0x8a74, + 0x0002, 0x3a47, 0x000b, 0x0a6f, 0x0008, 0x8054, 0x0000, 0x0004, + 0x0000, 0x8074, 0x0000, 0x8000, 0x0003, 0x02d4, 0x0009, 0x92c0, + 0x0000, 0x0fc8, 0x000b, 0x0813, 0x000a, 0x1246, 0x0003, 0x8b67, + 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x0002, 0x0000, 0x8066, + 0x0000, 0x367a, 0x000b, 0xc279, 0x0009, 0x92c0, 0x0008, 0x0780, + 0x000b, 0x8b81, 0x0002, 0x124b, 0x000b, 0x0a82, 0x0002, 0x2e4d, + 0x0002, 0x2e4d, 0x000b, 0x0b6d, 0x000a, 0x3a46, 0x000b, 0x8a92, + 0x000b, 0x5a84, 0x0008, 0x8054, 0x0000, 0x0004, 0x000a, 0x1243, + 0x000b, 0x0ad2, 0x0008, 0x8010, 0x0000, 0x000d, 0x000c, 0x035b, + 0x000a, 0x1948, 0x0003, 0x0a8f, 0x0004, 0x0350, 0x0000, 0x1810, + 0x000c, 0x035b, 0x0003, 0x02d2, 0x000a, 0x1948, 0x000b, 0x0a96, + 0x000a, 0x1243, 0x000b, 0x0b70, 0x000a, 0x194d, 0x000b, 0x0a9a, + 0x000a, 0x1243, 0x0003, 0x0b77, 0x000b, 0x5a9a, 0x0008, 0x8054, + 0x0000, 0x0004, 0x000a, 0x192e, 0x0008, 0x7f32, 0x000a, 0x1947, + 0x000b, 0x0acc, 0x0002, 0x194f, 0x000b, 0x0aaa, 0x0004, 0x0350, + 0x0000, 0x1810, 0x0004, 0x01dc, 0x000b, 0xb2c5, 0x000c, 0x035b, + 0x000c, 0x01c6, 0x0003, 0x02d2, 0x0000, 0x1a60, 0x0008, 0x8062, + 0x0000, 0x001f, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc2af, + 0x000a, 0x004c, 0x0003, 0x8acc, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0001, 0x9880, 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0000, 0x320a, 0x000b, 0xc2b9, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0001, 0x9880, 0x0008, 0x0012, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x1e0a, 0x000b, 0xc2c1, 0x0000, 0x1826, 0x0000, 0x1928, + 0x0003, 0x02d2, 0x0000, 0x0806, 0x0008, 0x8010, 0x0000, 0x001f, + 0x000c, 0x035b, 0x0000, 0x0310, 0x000c, 0x035b, 0x0003, 0x02d2, + 0x0004, 0x0350, 0x0008, 0x8010, 0x0000, 0x0001, 0x000c, 0x035b, + 0x0000, 0x1810, 0x000c, 0x035b, 0x0000, 0x8074, 0x0008, 0xf000, + 0x0000, 0x0d30, 0x0002, 0x3a42, 0x000b, 0x8ada, 0x0000, 0x15fc, + 0x000b, 0xb07a, 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0x0501, + 0x0008, 0x8010, 0x0008, 0x000c, 0x000c, 0x035b, 0x0003, 0x0013, + 0x0009, 0xbbe0, 0x0008, 0x0030, 0x0003, 0x8af6, 0x0000, 0x18fe, + 0x0009, 0x3ce0, 0x000b, 0x0af3, 0x0008, 0x15fe, 0x0009, 0x3ce0, + 0x000b, 0x0af3, 0x0008, 0x13fe, 0x0009, 0x3ce0, 0x000b, 0x8aef, + 0x000c, 0x0349, 0x0008, 0x0d26, 0x0003, 0x02f0, 0x0004, 0x034b, + 0x0008, 0x8076, 0x0000, 0x0040, 0x0003, 0x0346, 0x0008, 0x8076, + 0x0008, 0x0041, 0x0003, 0x0346, 0x0009, 0xbbe0, 0x0000, 0x0032, + 0x000b, 0x8afb, 0x0008, 0x3c1e, 0x0003, 0x0346, 0x0009, 0xbbe0, + 0x0000, 0x003b, 0x000b, 0x8b00, 0x0000, 0x3cdc, 0x0003, 0x0346, + 0x0009, 0xbbe0, 0x0008, 0x0035, 0x000b, 0x8b06, 0x0000, 0x8072, + 0x0000, 0x8000, 0x0003, 0x04aa, 0x0009, 0xbbe0, 0x0008, 0x0036, + 0x000b, 0x0bcd, 0x0009, 0xbbe0, 0x0000, 0x0037, 0x000b, 0x8b27, + 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x0003, 0x8af3, 0x0008, 0x8076, + 0x0000, 0x0040, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x000d, + 0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, + 0x0000, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, + 0x0000, 0x8066, 0x0000, 0x0422, 0x000b, 0xc31e, 0x0004, 0x0350, + 0x0008, 0x8054, 0x0000, 0x0004, 0x0000, 0x8074, 0x0008, 0xf000, + 0x0000, 0x8072, 0x0000, 0x8000, 0x0003, 0x02d4, 0x0009, 0xbbe0, + 0x0000, 0x0038, 0x000b, 0x8b39, 0x0000, 0x18fe, 0x0009, 0x3ce0, + 0x0003, 0x0b36, 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x000b, 0x8ae9, + 0x0004, 0x034b, 0x0008, 0x8076, 0x0000, 0x0040, 0x0000, 0x8072, + 0x0000, 0x8000, 0x0003, 0x0394, 0x0008, 0x8076, 0x0008, 0x0042, + 0x0003, 0x0346, 0x0009, 0xbbe0, 0x0000, 0x0016, 0x0003, 0x8b46, + 0x0000, 0x8074, 0x0008, 0x0808, 0x0002, 0x3a44, 0x0003, 0x8816, + 0x0000, 0x8074, 0x0000, 0x0800, 0x0000, 0x8072, 0x0000, 0x8000, + 0x000f, 0x8000, 0x0003, 0x0013, 0x0000, 0x8072, 0x0000, 0x8000, + 0x0003, 0x0013, 0x0002, 0x1430, 0x0003, 0x034c, 0x000a, 0x3d30, + 0x0000, 0x7f00, 0x0001, 0xbc80, 0x0000, 0x0007, 0x0003, 0x0354, + 0x000a, 0x1930, 0x0000, 0x7f00, 0x0001, 0x9880, 0x0000, 0x0007, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x000a, 0x000b, 0xc359, 0x000f, 0x4000, 0x000b, 0x235b, + 0x0008, 0x0870, 0x000f, 0x4000, 0x0009, 0xbac0, 0x0008, 0x0090, + 0x000b, 0x0b64, 0x0000, 0x8074, 0x0000, 0x0706, 0x000b, 0x0366, + 0x0000, 0x8074, 0x0000, 0x0703, 0x000f, 0x4000, 0x0008, 0x8010, + 0x0000, 0x0023, 0x0003, 0x03a2, 0x0008, 0x8010, 0x0000, 0x0008, + 0x0003, 0x03a2, 0x0008, 0x8010, 0x0008, 0x0022, 0x0003, 0x03a2, + 0x0004, 0x0350, 0x0008, 0x8010, 0x0000, 0x0007, 0x000c, 0x035b, + 0x0000, 0x1810, 0x000c, 0x035b, 0x000b, 0x03ac, 0x0004, 0x0350, + 0x0008, 0x8010, 0x0008, 0x001b, 0x000c, 0x035b, 0x0000, 0x1810, + 0x000c, 0x035b, 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, + 0x0003, 0x0013, 0x0008, 0x8010, 0x0008, 0x0009, 0x0003, 0x03a2, + 0x0008, 0x8010, 0x0008, 0x0005, 0x0003, 0x03a2, 0x000a, 0x1648, + 0x000b, 0x8888, 0x0008, 0x808c, 0x0000, 0x0001, 0x0007, 0x0000, + 0x0008, 0x8010, 0x0000, 0x0004, 0x000a, 0x4143, 0x0003, 0x0888, + 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x0d2a, 0x0003, 0x03a2, + 0x0008, 0x8010, 0x0008, 0x0003, 0x0003, 0x03a4, 0x0008, 0x8010, + 0x0000, 0x000b, 0x0003, 0x03a4, 0x0008, 0x8010, 0x0000, 0x0002, + 0x0003, 0x03a4, 0x0002, 0x3a47, 0x000b, 0x8a64, 0x0008, 0x8010, + 0x0008, 0x0006, 0x0003, 0x03a4, 0x0000, 0x8074, 0x0008, 0xf000, + 0x000c, 0x035b, 0x000c, 0x035e, 0x000a, 0x3a40, 0x000b, 0x0813, + 0x0008, 0x8010, 0x0008, 0x000c, 0x000c, 0x035b, 0x0003, 0x0013, + 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0002, 0x2e4d, + 0x0002, 0x2e4d, 0x000b, 0x0bb5, 0x0008, 0x8054, 0x0000, 0x0019, + 0x0003, 0x0013, 0x0008, 0x8054, 0x0008, 0x0009, 0x0003, 0x0013, + 0x0002, 0x3a44, 0x0003, 0x8813, 0x0003, 0x0397, 0x0008, 0x808c, + 0x0008, 0x0000, 0x0002, 0x4447, 0x0003, 0x0be1, 0x0001, 0xc0c0, + 0x0008, 0x00ff, 0x0009, 0xffe0, 0x0008, 0x00ff, 0x000b, 0x8bb8, + 0x0001, 0xc1e0, 0x0008, 0xffff, 0x000b, 0x8bb8, 0x0008, 0x8010, + 0x0000, 0x0013, 0x000c, 0x035b, 0x0000, 0x8074, 0x0008, 0x0202, + 0x0003, 0x0013, 0x000a, 0x3a40, 0x000b, 0x8bde, 0x0000, 0x8074, + 0x0000, 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe, 0x0000, 0x8072, + 0x0000, 0x8000, 0x0001, 0x43e0, 0x0003, 0x8bdc, 0x0000, 0x42fe, + 0x0001, 0xffc0, 0x0008, 0x00ff, 0x0009, 0x00e0, 0x0003, 0x0bb8, + 0x0008, 0x0d08, 0x000b, 0x0431, 0x0000, 0x8072, 0x0000, 0x8000, + 0x0003, 0x0013, 0x0004, 0x04b3, 0x0008, 0x808c, 0x0000, 0x0001, + 0x0000, 0x04fc, 0x0003, 0x3496, 0x0000, 0x0460, 0x0008, 0x8062, + 0x0000, 0x0001, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc3eb, + 0x0000, 0x0004, 0x0009, 0x80c0, 0x0008, 0x00ff, 0x0000, 0x7f00, + 0x0001, 0x80e0, 0x0000, 0x0004, 0x000b, 0x0c05, 0x0001, 0x80e0, + 0x0008, 0x0005, 0x000b, 0x0c05, 0x0001, 0x80e0, 0x0008, 0x0006, + 0x000b, 0x0c05, 0x0001, 0x82c0, 0x0008, 0xff00, 0x0008, 0x7f04, + 0x0009, 0x82e0, 0x0008, 0x0600, 0x000b, 0x0c05, 0x0009, 0x82e0, + 0x0008, 0x0500, 0x000b, 0x0c05, 0x0009, 0x82e0, 0x0000, 0x0400, + 0x0003, 0x8c96, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0009, 0xffe0, + 0x0000, 0x1000, 0x0003, 0x0c31, 0x0004, 0x04a4, 0x0002, 0x3941, + 0x0003, 0x0c10, 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, + 0x0000, 0x0460, 0x0008, 0x80fe, 0x0008, 0x002b, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc416, 0x0008, 0x11fc, + 0x000b, 0x342c, 0x0001, 0x9180, 0x0000, 0x0002, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0609, + 0x000b, 0xc420, 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0xff00, + 0x0009, 0x03e0, 0x000b, 0x8c29, 0x0000, 0x8072, 0x0000, 0x0400, + 0x0003, 0x0052, 0x0001, 0x9180, 0x0008, 0x0003, 0x000b, 0x0413, + 0x0000, 0x8072, 0x0000, 0x0400, 0x0008, 0x8010, 0x0000, 0x0010, + 0x000b, 0x0489, 0x0004, 0x04a4, 0x0002, 0x3941, 0x0003, 0x0c37, + 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, 0x0004, 0x046e, + 0x0008, 0x11fc, 0x0003, 0x8c3f, 0x0000, 0x8072, 0x0000, 0x0400, + 0x0008, 0x8010, 0x0000, 0x000e, 0x000b, 0x0489, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0000, 0x04fc, 0x000b, 0x8c54, 0x0008, 0x808c, + 0x0008, 0x0000, 0x0001, 0x9180, 0x0008, 0x0005, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc44a, 0x0008, 0x0060, + 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, + 0x0000, 0x8066, 0x0000, 0x0412, 0x000b, 0xc452, 0x000b, 0x046b, + 0x0008, 0x808c, 0x0000, 0x0001, 0x0000, 0x0460, 0x0008, 0x8062, + 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0x0609, 0x000b, 0xc45b, + 0x0000, 0x8066, 0x0008, 0x220a, 0x000b, 0xc45e, 0x0000, 0x42fe, + 0x0001, 0xffc0, 0x0008, 0xff00, 0x0008, 0x7f04, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0001, 0x9180, 0x0000, 0x0002, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x041a, 0x0003, 0xc46a, 0x0000, 0x8072, + 0x0000, 0x0400, 0x0003, 0x0052, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0008, 0x6b62, 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc473, + 0x0008, 0x02fe, 0x0009, 0x03e0, 0x000b, 0x8c79, 0x0000, 0x0d22, + 0x000f, 0x4000, 0x0009, 0x8280, 0x0000, 0x0002, 0x0001, 0x6b80, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc47f, + 0x000a, 0x0200, 0x0001, 0xffc0, 0x0000, 0x0007, 0x0000, 0x7f06, + 0x0008, 0x6b62, 0x0000, 0x8066, 0x0008, 0x060a, 0x0003, 0xc487, + 0x000f, 0x4000, 0x0002, 0x3a44, 0x0003, 0x8813, 0x000a, 0x2f44, + 0x000a, 0x2f44, 0x0003, 0x8b97, 0x0008, 0x808a, 0x0008, 0x0003, + 0x0000, 0x8074, 0x0000, 0xf080, 0x0003, 0x5c92, 0x0008, 0x8054, + 0x0000, 0x0019, 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, + 0x0008, 0x808c, 0x0008, 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, + 0x000c, 0x035b, 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0x00ff, + 0x0008, 0x7f10, 0x000c, 0x035b, 0x0008, 0x4310, 0x0003, 0x03a4, + 0x0002, 0x3941, 0x0003, 0x0ca7, 0x000f, 0x4000, 0x0000, 0x8072, + 0x0008, 0x0404, 0x000f, 0x4000, 0x0008, 0x8010, 0x0008, 0x0012, + 0x000c, 0x035b, 0x0004, 0x046e, 0x0000, 0x1110, 0x000c, 0x035b, + 0x0008, 0x11fc, 0x000b, 0x8cad, 0x0003, 0x0013, 0x0009, 0xc2c0, + 0x0008, 0x00ff, 0x0000, 0x7f00, 0x0001, 0xc3c0, 0x0008, 0xff00, + 0x0009, 0x00d0, 0x000b, 0x0cd8, 0x0000, 0x0d0a, 0x0001, 0x8580, + 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0000, 0x8066, 0x0000, 0x0809, 0x000b, 0xc4c2, 0x0000, 0x04fc, + 0x0003, 0x34d1, 0x0000, 0x0460, 0x0008, 0x8062, 0x0000, 0x0004, + 0x0000, 0x8066, 0x0000, 0x0211, 0x0003, 0xc4ca, 0x0008, 0x01fe, + 0x0009, 0x00e0, 0x0003, 0x8cd1, 0x0008, 0x02fe, 0x0001, 0x43e0, + 0x000b, 0x0cd7, 0x0002, 0x0500, 0x0000, 0x7f0a, 0x0009, 0xffe0, + 0x0000, 0x0800, 0x0003, 0x8cbb, 0x0008, 0x0d08, 0x000f, 0x4000, + 0x0008, 0x43fe, 0x0001, 0x3e80, 0x0000, 0x0d60, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0000, 0x0809, 0x0003, 0xc4de, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0001, 0x84c0, 0x0008, 0xff00, 0x0002, 0x7f70, + 0x0009, 0xff80, 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0000, 0x0809, 0x000b, 0xc4e9, 0x000f, 0x4000, 0xe552, 0xe9f6 +}; +unsigned short rseqipx_code_length01 = 0x09d8; +/* + * + */ + +unsigned long xseqipx_code_addr01 = 0x0001e000 ; +unsigned short xseqipx_code01[] = { +0x0013, 0x0003, 0x0000, 0x1082, 0x0001, 0xe000, 0x0005, 0x0032, + 0x0000, 0x0010, 0x0015, 0x0033, 0x0010, 0xbb39, 0x000b, 0x8007, + 0x0004, 0x010b, 0x0014, 0x011d, 0x0010, 0xc000, 0x0000, 0xc001, + 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0010, 0xc0b2, 0x0000, 0xc0b3, + 0x0010, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0010, 0xc0b7, + 0x0010, 0xc0b8, 0x0000, 0xc0b9, 0x0000, 0xc0ba, 0x0000, 0xc0c2, + 0x0010, 0xc0c3, 0x0000, 0xc0c4, 0x0010, 0xc0c5, 0x0010, 0xc0c6, + 0x0000, 0xc0c7, 0x0000, 0xc0c8, 0x0010, 0xc0c9, 0x0010, 0xc0ca, + 0x0000, 0xc0cb, 0x0010, 0xc0cc, 0x0000, 0xc0cd, 0x0000, 0xc0ce, + 0x0010, 0xc0cf, 0x0015, 0x0039, 0x0010, 0xff00, 0x0015, 0x003a, + 0x0010, 0xff00, 0x0005, 0x00d0, 0x0010, 0xff00, 0x0015, 0x00d1, + 0x0010, 0xff00, 0x0012, 0x3a40, 0x000b, 0x1031, 0x0002, 0x7940, + 0x001b, 0x112f, 0x0002, 0x3a42, 0x001b, 0x1035, 0x0003, 0xb035, + 0x0003, 0xa1d8, 0x0002, 0x3a41, 0x001b, 0x1039, 0x0012, 0x7941, + 0x000b, 0x12f6, 0x0003, 0xe055, 0x0012, 0xd042, 0x0003, 0x103f, + 0x0000, 0x75ff, 0x0002, 0xff41, 0x001b, 0x1055, 0x0000, 0x0cfe, + 0x0003, 0x6049, 0x0002, 0x3a44, 0x000b, 0x1049, 0x0011, 0x02e8, + 0x0010, 0x0000, 0x0013, 0x1383, 0x0011, 0x02e8, 0x0010, 0x0005, + 0x0003, 0x1413, 0x0012, 0x3a46, 0x001b, 0x1055, 0x0012, 0xd042, + 0x0003, 0x1050, 0x0000, 0x75ff, 0x0012, 0xff40, 0x001b, 0x1055, + 0x0000, 0x12fe, 0x0013, 0x6055, 0x0001, 0x0fe8, 0x0010, 0x0000, + 0x0013, 0x1619, 0x0015, 0x0030, 0x0000, 0x0400, 0x0010, 0xc131, + 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x805a, 0x0010, 0xb2ff, + 0x0001, 0xb3e0, 0x001c, 0x10cd, 0x000b, 0xf02d, 0x0011, 0x3be8, + 0x0000, 0x0010, 0x001b, 0x1072, 0x0000, 0x0afe, 0x000b, 0x6066, + 0x0000, 0x3c0b, 0x0003, 0x006e, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0x0a88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x3c0a, 0x000b, 0x806d, 0x0010, 0x3c0a, 0x0002, 0x0c00, + 0x0010, 0xff0c, 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0010, 0x0012, + 0x000b, 0x1085, 0x0010, 0x08fe, 0x001b, 0x6079, 0x0010, 0x3c09, + 0x0013, 0x0081, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0888, + 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, + 0x000b, 0x8080, 0x0000, 0x3c08, 0x0002, 0x0c00, 0x0010, 0xff0c, + 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0000, 0x0013, 0x001b, 0x108b, + 0x0000, 0x3cb0, 0x0004, 0x00dd, 0x0013, 0x00ca, 0x0011, 0x3be8, + 0x0000, 0x0019, 0x000b, 0x109e, 0x0010, 0x04fe, 0x001b, 0x6092, + 0x0010, 0x3c05, 0x0013, 0x009a, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0488, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x3c0a, 0x001b, 0x8099, 0x0000, 0x3c04, 0x0002, 0x0c00, + 0x0010, 0xff0c, 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0000, 0x0015, + 0x001b, 0x10aa, 0x0014, 0x0114, 0x0004, 0x0126, 0x0015, 0x0039, + 0x0000, 0x8000, 0x0017, 0x8000, 0x0004, 0x010b, 0x0014, 0x011d, + 0x0004, 0x00f6, 0x0013, 0x002d, 0x0011, 0x3be8, 0x0000, 0x0016, + 0x000b, 0x10bc, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0013, 0x10b6, + 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0013, 0x10b6, 0x0015, 0x0039, + 0x0010, 0x1010, 0x0013, 0x00ca, 0x0015, 0x0039, 0x0000, 0x5040, + 0x0015, 0x00b8, 0x0000, 0x0008, 0x0004, 0x083d, 0x0013, 0x00ca, + 0x0011, 0x3be8, 0x0010, 0x0017, 0x000b, 0x10c1, 0x0010, 0x3cc3, + 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0010, 0x0018, 0x001b, 0x10c6, + 0x0000, 0x3cc2, 0x0013, 0x00ca, 0x0005, 0x00ce, 0x0000, 0x0001, + 0x0000, 0x3bcf, 0x0004, 0x0801, 0x0015, 0x0039, 0x0000, 0x8000, + 0x0013, 0x002d, 0x0001, 0xb288, 0x0000, 0x0002, 0x0001, 0xc180, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x80d3, + 0x0002, 0xb200, 0x0011, 0xffc8, 0x0000, 0x0007, 0x0010, 0xffb2, + 0x0010, 0xc131, 0x0015, 0x0033, 0x0010, 0xb20a, 0x0001, 0xb0d0, + 0x000b, 0x80dc, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xb088, + 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, + 0x001b, 0x80e4, 0x0001, 0xb1e8, 0x0010, 0xffff, 0x0003, 0x10f5, + 0x0000, 0x11fe, 0x001b, 0x60ec, 0x0000, 0xb012, 0x0003, 0x00f4, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x80f3, + 0x0000, 0xb011, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0xbc88, 0x0000, 0x001f, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xc411, 0x000b, 0x80fd, 0x0011, 0xbc88, 0x0010, 0x0018, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc609, 0x000b, 0x8103, + 0x0011, 0xbc88, 0x0000, 0x0037, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xc709, 0x000b, 0x8109, 0x0017, 0x4000, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0x0269, 0x000b, 0x8112, 0x0017, 0x4000, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x026a, 0x000b, 0x811b, + 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, + 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0f59, + 0x000b, 0x8124, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xbb88, 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x0f5a, 0x000b, 0x812d, 0x0017, 0x4000, 0x0000, 0xd0ff, + 0x0012, 0xff40, 0x000b, 0x1031, 0x0015, 0x00d1, 0x0010, 0x0101, + 0x0013, 0x9134, 0x0005, 0x0079, 0x0000, 0x0001, 0x0013, 0x9137, + 0x0015, 0x00d1, 0x0000, 0x0100, 0x0011, 0x02e8, 0x0000, 0x0002, + 0x0003, 0x115d, 0x0011, 0x02e8, 0x0000, 0x0001, 0x0003, 0x1175, + 0x0011, 0x02e8, 0x0000, 0x0004, 0x0013, 0x1193, 0x0011, 0x02e8, + 0x0010, 0x0003, 0x0003, 0x11c4, 0x0005, 0x0002, 0x0010, 0x0000, + 0x0000, 0xc00e, 0x0000, 0xc00d, 0x0010, 0xc003, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0xbd88, 0x0010, 0x0009, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8152, 0x0012, 0x3a45, + 0x0013, 0x115a, 0x0015, 0x003a, 0x0000, 0x2000, 0x0015, 0x003a, + 0x0010, 0x1010, 0x0004, 0x0829, 0x0012, 0xd042, 0x0013, 0x1031, + 0x0013, 0x0050, 0x0012, 0x7849, 0x0013, 0x11d2, 0x0010, 0x0dfe, + 0x0003, 0x6148, 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x816a, 0x0010, 0xb3fe, + 0x0003, 0x6172, 0x0010, 0xb30b, 0x0015, 0x0033, 0x0010, 0xc00a, + 0x001b, 0x8170, 0x0013, 0x01c7, 0x0000, 0xc00b, 0x0010, 0xc00a, + 0x0013, 0x01c7, 0x0000, 0x78b0, 0x0012, 0xb044, 0x0013, 0x11d2, + 0x0002, 0xb049, 0x0013, 0x11d2, 0x0010, 0x71ff, 0x0012, 0xff38, + 0x0010, 0xff71, 0x0010, 0x0dfe, 0x0013, 0x6146, 0x0012, 0x0c10, + 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, + 0x000b, 0x8188, 0x0010, 0xb3fe, 0x0003, 0x6190, 0x0000, 0xb309, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x818e, 0x0013, 0x01c7, + 0x0010, 0xc009, 0x0000, 0xc008, 0x0013, 0x01c7, 0x0000, 0x78b0, + 0x0012, 0xb044, 0x0013, 0x11d2, 0x0002, 0xb049, 0x0013, 0x11d2, + 0x0010, 0x71ff, 0x0012, 0xff38, 0x0010, 0xff71, 0x0010, 0x0dfe, + 0x0013, 0x6146, 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x81a6, 0x0010, 0xb3fe, + 0x0013, 0x61ae, 0x0000, 0xb305, 0x0015, 0x0033, 0x0010, 0xc00a, + 0x000b, 0x81ac, 0x0013, 0x01b0, 0x0010, 0xc005, 0x0000, 0xc004, + 0x0002, 0x033f, 0x0002, 0xff27, 0x0000, 0x0db8, 0x0004, 0x0378, + 0x0000, 0x0db8, 0x0004, 0x083d, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0xbc88, 0x0010, 0x0000, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb309, 0x000b, 0x81bd, 0x0011, 0xb3e8, 0x0000, 0x0002, + 0x001b, 0x1146, 0x0005, 0x0002, 0x0010, 0x0005, 0x0003, 0x0148, + 0x0012, 0x7849, 0x0013, 0x11d2, 0x0003, 0x0148, 0x0000, 0x0db8, + 0x0012, 0x0345, 0x001b, 0x11cd, 0x0002, 0x033f, 0x0004, 0x0378, + 0x0013, 0x0146, 0x0002, 0x033f, 0x0002, 0xff27, 0x0004, 0x0378, + 0x0004, 0x083d, 0x0013, 0x0146, 0x0015, 0x00b8, 0x0000, 0x0001, + 0x0015, 0x003a, 0x0010, 0x0101, 0x0004, 0x083d, 0x0003, 0x0153, + 0x0000, 0x2bba, 0x0003, 0xb1d9, 0x0005, 0x002a, 0x0000, 0x0002, + 0x0001, 0xbac8, 0x0000, 0x0700, 0x000b, 0x12b1, 0x0011, 0x15e8, + 0x0000, 0x0002, 0x0003, 0x122c, 0x0011, 0x15e8, 0x0000, 0x0001, + 0x0013, 0x11e8, 0x0005, 0x0015, 0x0010, 0x0000, 0x0003, 0x020f, + 0x0005, 0x0015, 0x0010, 0x0000, 0x0002, 0xba43, 0x0003, 0x1210, + 0x0003, 0xb1ec, 0x0005, 0x002a, 0x0000, 0x0004, 0x0012, 0xba42, + 0x0003, 0x1216, 0x0012, 0x104b, 0x000b, 0x120f, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, + 0x001b, 0x81f8, 0x0010, 0x20b0, 0x0010, 0x21b1, 0x0010, 0x22b2, + 0x0010, 0x23b3, 0x0010, 0x24b4, 0x0010, 0x25b5, 0x0010, 0x28b8, + 0x0010, 0x29b9, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0007, + 0x0015, 0x0033, 0x0010, 0xb032, 0x000b, 0x8206, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, 0x0010, 0xb812, + 0x000b, 0x820c, 0x0005, 0x0015, 0x0010, 0x0000, 0x0013, 0x0035, + 0x0000, 0x1efe, 0x0003, 0x6224, 0x0014, 0x0256, 0x0000, 0x1efe, + 0x000c, 0x6256, 0x0003, 0x020f, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x821b, + 0x0002, 0xb02f, 0x0000, 0xffb0, 0x0005, 0x0031, 0x0000, 0x0020, + 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x8222, 0x0003, 0x01f3, + 0x0015, 0x00b8, 0x0010, 0x0005, 0x0004, 0x083d, 0x0000, 0x13b8, + 0x0015, 0x003a, 0x0010, 0x0404, 0x0004, 0x083d, 0x0003, 0x020f, + 0x0005, 0x0015, 0x0000, 0x0001, 0x0012, 0xba42, 0x0013, 0x1239, + 0x0013, 0xb230, 0x0010, 0x2bff, 0x0012, 0xff4f, 0x000b, 0x11d8, + 0x0002, 0xba43, 0x001b, 0x1216, 0x0000, 0x1efe, 0x000c, 0x6256, + 0x0003, 0x020f, 0x0010, 0x28b8, 0x0010, 0x29b9, 0x0004, 0x02c7, + 0x0002, 0x3a42, 0x000b, 0x120f, 0x0000, 0x1c30, 0x0015, 0x00ff, + 0x0000, 0x0002, 0x0002, 0x1f43, 0x001b, 0x1246, 0x0001, 0xff88, + 0x0000, 0x0002, 0x0003, 0x0248, 0x0001, 0xff88, 0x0000, 0x0004, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x824b, + 0x0000, 0xb0ff, 0x0011, 0x16a0, 0x0000, 0xff16, 0x000b, 0x24e2, + 0x0002, 0xb100, 0x0003, 0x0253, 0x0010, 0xb1ff, 0x0001, 0x17a0, + 0x0010, 0xff17, 0x0013, 0x0216, 0x0000, 0x16ff, 0x0001, 0x18a0, + 0x0010, 0xff00, 0x001b, 0x225d, 0x0002, 0x1700, 0x0003, 0x12b0, + 0x0013, 0x025e, 0x0010, 0x17ff, 0x0011, 0x19a0, 0x0003, 0x22b0, + 0x0011, 0x00d0, 0x0003, 0x12b0, 0x0000, 0x1c30, 0x0000, 0x1b31, + 0x0015, 0x0033, 0x0000, 0xb131, 0x000b, 0x8266, 0x0003, 0xb267, + 0x0000, 0xb120, 0x0010, 0xb221, 0x0002, 0x1f43, 0x001b, 0x1273, + 0x0010, 0xc022, 0x0000, 0xc023, 0x0000, 0xb324, 0x0000, 0xb425, + 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0003, 0x0277, 0x0000, 0xb322, + 0x0000, 0xb423, 0x0000, 0xb524, 0x0010, 0xb625, 0x0013, 0xb277, + 0x0005, 0x002a, 0x0000, 0x0001, 0x0012, 0x1500, 0x0000, 0xff15, + 0x0000, 0x16ff, 0x0001, 0xb580, 0x0000, 0xff16, 0x000b, 0x2282, + 0x0002, 0x1700, 0x0013, 0x0283, 0x0010, 0x17ff, 0x0001, 0xb680, + 0x0010, 0xff17, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0013, 0x62b0, + 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0010, 0xc030, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x828e, 0x0010, 0xb0fe, + 0x001b, 0x62af, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0001, + 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8296, 0x0010, 0xb0fe, + 0x001b, 0x629c, 0x0005, 0x00ce, 0x0010, 0x0005, 0x0013, 0x0801, + 0x0010, 0xb01c, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0019, + 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82a2, 0x0001, 0xb0c8, + 0x0010, 0x00ff, 0x0000, 0xff1f, 0x0010, 0xc030, 0x0011, 0xbe80, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82ab, + 0x0000, 0xb01d, 0x0010, 0x1dff, 0x0013, 0x028a, 0x0000, 0xb01b, + 0x0017, 0x4000, 0x0002, 0x3a41, 0x0003, 0x12b9, 0x0003, 0xb2b3, + 0x0005, 0x002a, 0x0000, 0x0004, 0x0005, 0x0015, 0x0010, 0x0000, + 0x0003, 0x020f, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0002, + 0x0015, 0x0033, 0x0000, 0x1b2a, 0x000b, 0x82be, 0x0015, 0x00b8, + 0x0000, 0x0004, 0x0004, 0x083d, 0x0000, 0x13b8, 0x0015, 0x003a, + 0x0010, 0x0404, 0x0004, 0x083d, 0x0013, 0x0039, 0x0002, 0x1e00, + 0x0010, 0xff1e, 0x0012, 0x1d10, 0x0010, 0xff1d, 0x0010, 0xc030, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82cf, + 0x0010, 0xb0fe, 0x000b, 0x62f4, 0x0000, 0x1cff, 0x0001, 0x1ae0, + 0x0013, 0x12de, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0010, 0x0000, + 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82da, 0x0010, 0xb0fe, + 0x001b, 0x62de, 0x0000, 0x1aff, 0x0000, 0xff1c, 0x0000, 0x1c30, + 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x82e4, 0x0001, 0xb0c8, 0x0010, 0x000f, 0x0000, 0xff1f, + 0x0001, 0xbf80, 0x0010, 0xff1d, 0x0010, 0xc030, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82ee, 0x0010, 0xb0fe, + 0x000b, 0x62f4, 0x0005, 0x00ce, 0x0010, 0x0006, 0x0013, 0x0801, + 0x0000, 0xb01b, 0x0017, 0x4000, 0x0010, 0x79b0, 0x0000, 0xd0ff, + 0x0012, 0xff40, 0x001b, 0x1039, 0x0015, 0x00d1, 0x0010, 0x0101, + 0x0003, 0x92fc, 0x0005, 0x0079, 0x0000, 0x0002, 0x0003, 0x92ff, + 0x0015, 0x00d1, 0x0000, 0x0100, 0x0010, 0x13fe, 0x0003, 0x6334, + 0x0012, 0xb04e, 0x001b, 0x1350, 0x0012, 0x784a, 0x0003, 0x1356, + 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0010, 0x1800, 0x001b, 0x1356, + 0x0001, 0x0fe8, 0x0000, 0x0001, 0x001b, 0x1318, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0x8f0a, 0x000b, 0x8316, 0x0013, 0x035c, + 0x0001, 0x0fe8, 0x0000, 0x0002, 0x000b, 0x1323, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0005, 0x0031, 0x0000, 0x001a, 0x0015, 0x0033, + 0x0010, 0xc00a, 0x001b, 0x8321, 0x0013, 0x035c, 0x0001, 0x0fe8, + 0x0010, 0x0000, 0x0013, 0x132a, 0x0005, 0x00ce, 0x0000, 0x0007, + 0x0010, 0x0fcf, 0x0013, 0x07fb, 0x0000, 0x13b8, 0x0002, 0x1045, + 0x0013, 0x1332, 0x0012, 0x103f, 0x0002, 0xff27, 0x0004, 0x0378, + 0x0004, 0x083d, 0x0003, 0x0334, 0x0012, 0x103f, 0x0004, 0x0378, + 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, 0x0013, 0x133d, + 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, 0x0000, 0x0008, + 0x0004, 0x083d, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, + 0x0010, 0x000c, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, + 0x001b, 0x8344, 0x0010, 0xc014, 0x0000, 0xc013, 0x0000, 0xc010, + 0x0002, 0x3a47, 0x0013, 0x134f, 0x0015, 0x003a, 0x0000, 0x8000, + 0x0015, 0x003a, 0x0010, 0x4040, 0x0014, 0x0806, 0x0013, 0x0039, + 0x0015, 0x00b8, 0x0010, 0x0003, 0x0015, 0x003a, 0x0010, 0x0202, + 0x0004, 0x083d, 0x0013, 0x0348, 0x0015, 0x00b8, 0x0000, 0x0002, + 0x0015, 0x003a, 0x0010, 0x0202, 0x0004, 0x083d, 0x0013, 0x0348, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8363, + 0x0011, 0x1388, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xc00a, 0x001b, 0x8369, 0x0010, 0xb0fe, 0x0003, 0x636e, + 0x0000, 0xb012, 0x0003, 0x0370, 0x0010, 0xc012, 0x0010, 0xc011, + 0x0012, 0x104b, 0x0013, 0x132a, 0x0002, 0x103b, 0x0010, 0xff03, + 0x0005, 0x0002, 0x0010, 0x0000, 0x0000, 0xc00d, 0x0003, 0x032a, + 0x0000, 0xffb0, 0x0010, 0xc3b1, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xb888, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb012, 0x001b, 0x8381, 0x0017, 0x4000, 0x0012, 0x3a43, + 0x0013, 0x1392, 0x0015, 0x003a, 0x0000, 0x0800, 0x0010, 0x0db0, + 0x0003, 0x6392, 0x0000, 0x0bff, 0x0001, 0xb0e0, 0x0003, 0x13bb, + 0x0010, 0x09ff, 0x0001, 0xb0e0, 0x0003, 0x139f, 0x0010, 0x05ff, + 0x0001, 0xb0e0, 0x0003, 0x1396, 0x0000, 0xc00e, 0x0000, 0x05fe, + 0x0013, 0x639c, 0x0000, 0x050d, 0x0005, 0x0002, 0x0000, 0x0004, + 0x0014, 0x041d, 0x0002, 0x3a47, 0x001b, 0x141c, 0x0003, 0x03b6, + 0x0000, 0x09fe, 0x0013, 0x63b8, 0x0000, 0x090d, 0x0005, 0x0002, + 0x0000, 0x0001, 0x0014, 0x0436, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xba09, 0x001b, 0x83a9, 0x0011, 0x03c8, 0x0010, 0x000f, + 0x0000, 0xffb6, 0x0011, 0xb6e8, 0x0000, 0x0001, 0x0013, 0x14ca, + 0x0011, 0xb6e8, 0x0000, 0x0002, 0x0003, 0x14ec, 0x0011, 0xb6e8, + 0x0010, 0x0003, 0x0003, 0x15d7, 0x0014, 0x0806, 0x0013, 0x041c, + 0x0010, 0x0bfe, 0x0013, 0x641c, 0x0010, 0x0b0d, 0x0005, 0x0002, + 0x0000, 0x0002, 0x0014, 0x0436, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xba09, 0x001b, 0x83c5, 0x0000, 0xb930, 0x0005, 0x0031, + 0x0010, 0x0021, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x83cb, + 0x0001, 0xb0a8, 0x0000, 0x199a, 0x0003, 0x23d1, 0x0005, 0x00b0, + 0x0000, 0x1999, 0x0012, 0xb050, 0x0000, 0xffb0, 0x0002, 0xff50, + 0x0002, 0xff50, 0x0001, 0xb080, 0x0000, 0xffb0, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0006, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x83de, 0x0000, 0xb930, + 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, + 0x001b, 0x83e4, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0001, 0xffe8, + 0x0010, 0x0048, 0x001b, 0x1445, 0x0005, 0x0002, 0x0010, 0x0006, + 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb109, 0x001b, 0x83f5, 0x0000, 0xb10b, 0x000b, 0x63f9, + 0x0010, 0xb10a, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x83fb, + 0x0002, 0x032b, 0x0010, 0xff03, 0x0011, 0x0d88, 0x0010, 0x0011, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x030a, 0x000b, 0x8403, + 0x0000, 0x11fe, 0x000b, 0x6408, 0x0000, 0x0d12, 0x0003, 0x0411, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0010, 0x0db0, 0x0015, 0x0033, 0x0000, 0xb00a, + 0x001b, 0x8410, 0x0000, 0x0d11, 0x0013, 0x041c, 0x0000, 0x05fe, + 0x0013, 0x641c, 0x0005, 0x0002, 0x0000, 0x0004, 0x0000, 0x050d, + 0x0014, 0x041d, 0x0002, 0x3a47, 0x001b, 0x141c, 0x0014, 0x0806, + 0x0003, 0x0049, 0x0001, 0xc7c8, 0x0010, 0x0028, 0x000b, 0x1435, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x000a, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8427, + 0x0002, 0xb04f, 0x0013, 0x1435, 0x0001, 0x0fe8, 0x0010, 0x0000, + 0x0013, 0x1433, 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0013, 0x1433, + 0x0015, 0x003a, 0x0010, 0x8080, 0x0003, 0x0435, 0x0015, 0x003a, + 0x0010, 0x4040, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x0309, 0x001b, 0x843d, 0x0011, 0x0d88, 0x0010, 0x0005, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb909, 0x001b, 0x8443, + 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0600, 0x0014, 0x0607, + 0x0014, 0x04b4, 0x0000, 0xb05a, 0x0000, 0xb15b, 0x0005, 0x0054, + 0x0010, 0x0829, 0x0010, 0x0d58, 0x0015, 0x0059, 0x0010, 0xffff, + 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x001e, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x8455, 0x0000, 0xb05c, 0x0005, 0x0031, + 0x0000, 0x001f, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x845b, + 0x0001, 0xb0c8, 0x0010, 0x000f, 0x001b, 0x1462, 0x0015, 0x00ff, + 0x0010, 0x0005, 0x0003, 0x046a, 0x0002, 0xb040, 0x0003, 0x1467, + 0x0015, 0x00ff, 0x0000, 0x0004, 0x0003, 0x046a, 0x0001, 0xb0c8, + 0x0010, 0x0006, 0x0002, 0xff60, 0x0010, 0xffb2, 0x0011, 0x0d88, + 0x0000, 0x0019, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, + 0x001b, 0x8470, 0x0012, 0xb170, 0x0011, 0xffc8, 0x0010, 0xff00, + 0x0011, 0xb2d0, 0x0010, 0xff60, 0x0002, 0xb045, 0x0013, 0x147b, + 0x0015, 0x00b2, 0x0000, 0x0002, 0x0013, 0x0485, 0x0002, 0xb046, + 0x0003, 0x1480, 0x0015, 0x00b2, 0x0000, 0x0001, 0x0013, 0x0485, + 0x0015, 0x00b2, 0x0010, 0x0000, 0x0000, 0xc0b0, 0x0010, 0xc0b1, + 0x0003, 0x048b, 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x002b, + 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x848a, 0x0010, 0xb16a, + 0x0010, 0xb06b, 0x0000, 0xb261, 0x0015, 0x0044, 0x0010, 0x0018, + 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0x6241, + 0x001b, 0x8494, 0x0003, 0x9495, 0x0015, 0x00a0, 0x0000, 0x0020, + 0x0012, 0xd041, 0x001b, 0x1498, 0x0015, 0x00d1, 0x0010, 0x0202, + 0x0003, 0x949c, 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, + 0x0001, 0xffd8, 0x0010, 0x0009, 0x0013, 0x94a2, 0x0000, 0xff75, + 0x0013, 0x94a4, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, + 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, + 0x0015, 0x0033, 0x0000, 0xb012, 0x000b, 0x84b2, 0x0013, 0x041c, + 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x0035, 0x0015, 0x0033, + 0x0000, 0xb009, 0x001b, 0x84b9, 0x0002, 0xb040, 0x0003, 0x14c7, + 0x0000, 0xb7b0, 0x0000, 0xb9b1, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0000, 0x0013, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb012, 0x000b, 0x84c5, 0x0003, 0x04c9, 0x0010, 0xc0b1, + 0x0000, 0xc0b0, 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0500, + 0x0014, 0x0607, 0x0005, 0x0054, 0x0010, 0x0889, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x84d6, 0x0010, 0xb058, + 0x0000, 0x0d59, 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0023, + 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x84de, 0x0010, 0xb15c, + 0x0010, 0xb05d, 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, + 0x0000, 0xb011, 0x001b, 0x84e5, 0x0000, 0xb15e, 0x0000, 0xb05f, + 0x0003, 0x94e8, 0x0015, 0x00a0, 0x0010, 0x000c, 0x0003, 0x05ec, + 0x0005, 0x00b6, 0x0000, 0x0700, 0x0014, 0x0607, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb709, 0x000b, 0x84f6, 0x0012, 0xb749, + 0x0013, 0x14fc, 0x0005, 0x0054, 0x0010, 0x0889, 0x0013, 0x04fe, + 0x0005, 0x0054, 0x0010, 0x0898, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x001b, 0x8505, 0x0010, 0xb058, 0x0000, 0x0d59, + 0x0001, 0xb9a8, 0x0010, 0x00f0, 0x000b, 0x252a, 0x0011, 0x0d88, + 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x8510, 0x0001, 0xb0c8, 0x0000, 0xf700, 0x0000, 0xffb0, + 0x0011, 0xb0e8, 0x0000, 0xf100, 0x0003, 0x1571, 0x0011, 0xb0e8, + 0x0000, 0xf200, 0x0013, 0x1576, 0x0011, 0xb0e8, 0x0010, 0xf300, + 0x0003, 0x1599, 0x0011, 0xb0e8, 0x0000, 0xf400, 0x0013, 0x159e, + 0x0011, 0xb0e8, 0x0010, 0xf500, 0x0003, 0x1571, 0x0011, 0xb0e8, + 0x0010, 0xf600, 0x0003, 0x15af, 0x0005, 0x00ce, 0x0010, 0x0009, + 0x0000, 0xb0cf, 0x0013, 0x07fb, 0x0000, 0xb930, 0x0005, 0x0031, + 0x0000, 0x0025, 0x0015, 0x0033, 0x0000, 0xb039, 0x000b, 0x852f, + 0x0012, 0xb749, 0x0013, 0x1534, 0x0002, 0xb52c, 0x0000, 0xffb5, + 0x0000, 0xb162, 0x0000, 0xb063, 0x0005, 0x0031, 0x0000, 0x001f, + 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x853a, 0x0001, 0xb3c8, + 0x0010, 0x0003, 0x0003, 0x1542, 0x0010, 0xffb2, 0x0001, 0xffe8, + 0x0010, 0x0003, 0x001b, 0x1544, 0x0000, 0xc2b7, 0x0003, 0x05cb, + 0x0001, 0xb2e8, 0x0000, 0x0001, 0x0003, 0x154b, 0x0005, 0x00ce, + 0x0010, 0x000a, 0x0010, 0xb2cf, 0x0013, 0x07fb, 0x0010, 0xb465, + 0x0010, 0xb667, 0x0015, 0x00b7, 0x0010, 0x0018, 0x0001, 0xb5c8, + 0x0010, 0x0300, 0x0013, 0x1570, 0x0012, 0xb548, 0x0013, 0x1557, + 0x0000, 0xb6ff, 0x0011, 0xb780, 0x0010, 0xffb7, 0x0002, 0xb549, + 0x0003, 0x155c, 0x0010, 0xb4ff, 0x0011, 0xb780, 0x0010, 0xffb7, + 0x0015, 0x0044, 0x0010, 0x0018, 0x0005, 0x0031, 0x0000, 0x002c, + 0x0015, 0x0033, 0x0000, 0x6841, 0x000b, 0x8562, 0x0015, 0x0044, + 0x0000, 0x0019, 0x0005, 0x0031, 0x0000, 0x0034, 0x0015, 0x0033, + 0x0000, 0x5029, 0x001b, 0x8569, 0x0015, 0x0044, 0x0000, 0x0008, + 0x0011, 0xb7c8, 0x0010, 0x0003, 0x0013, 0x1570, 0x0010, 0xff55, + 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0000, 0x0008, 0x0015, 0x00b7, + 0x0010, 0x0018, 0x0003, 0x05cb, 0x0011, 0x0d88, 0x0000, 0x000b, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x857b, + 0x0010, 0xb1ff, 0x0001, 0xb0d0, 0x0003, 0x1584, 0x0005, 0x00b5, + 0x0010, 0x0b02, 0x0010, 0xb062, 0x0010, 0xb163, 0x0003, 0x0586, + 0x0005, 0x00b5, 0x0000, 0x0302, 0x0015, 0x0065, 0x0010, 0x0012, + 0x0005, 0x0067, 0x0000, 0x0008, 0x0015, 0x006c, 0x0000, 0x7000, + 0x0005, 0x006d, 0x0010, 0x0500, 0x0015, 0x006f, 0x0010, 0x000a, + 0x0015, 0x0044, 0x0000, 0x0001, 0x0005, 0x0052, 0x0000, 0x2500, + 0x0015, 0x0044, 0x0000, 0x0008, 0x0015, 0x00b7, 0x0000, 0x0032, + 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0010, 0x0028, 0x0015, 0x00b7, + 0x0010, 0x0018, 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0000, 0x0100, + 0x0005, 0x0067, 0x0000, 0x0008, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0018, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x001b, 0x85a9, 0x0001, 0xb0c8, 0x0010, 0x00ff, + 0x0015, 0x00b7, 0x0000, 0x0020, 0x0003, 0x05cb, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb609, 0x000b, 0x85b6, 0x0001, 0xb6c8, + 0x0010, 0xff00, 0x0000, 0xffb0, 0x0015, 0x0033, 0x0000, 0xb00a, + 0x000b, 0x85bc, 0x0001, 0xb6c8, 0x0010, 0x00ff, 0x0012, 0xff10, + 0x001b, 0x15c5, 0x0000, 0xffb5, 0x0015, 0x00b7, 0x0010, 0x0018, + 0x0003, 0x05cb, 0x0010, 0xff63, 0x0005, 0x00b5, 0x0000, 0x0800, + 0x0015, 0x00b7, 0x0010, 0x0018, 0x0003, 0x05cb, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x85d2, 0x0010, 0xb561, + 0x0013, 0x95d4, 0x0010, 0xb7a0, 0x0003, 0x05ec, 0x0005, 0x00b6, + 0x0010, 0x0300, 0x0014, 0x0607, 0x0005, 0x0054, 0x0010, 0x0819, + 0x0010, 0x0d58, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x001b, 0x85e4, 0x0000, 0xb059, 0x0003, 0x95e6, 0x0010, 0xc0a0, + 0x0010, 0x71ff, 0x0002, 0xff28, 0x0010, 0xff71, 0x0003, 0x05ec, + 0x0012, 0xd041, 0x000b, 0x15ec, 0x0015, 0x00d1, 0x0010, 0x0202, + 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, + 0x0010, 0x0009, 0x0013, 0x95f5, 0x0000, 0xff75, 0x0003, 0x95f7, + 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0005, 0x00b0, + 0x0010, 0x0009, 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0015, 0x0033, + 0x0000, 0xb012, 0x001b, 0x8605, 0x0013, 0x041c, 0x0015, 0x0044, + 0x0000, 0x0008, 0x0005, 0x0098, 0x0010, 0x0056, 0x0015, 0x0099, + 0x0000, 0x9575, 0x0004, 0x07c2, 0x0000, 0xb096, 0x0012, 0xb270, + 0x0010, 0xff56, 0x0014, 0x07e4, 0x0010, 0xb052, 0x0010, 0xb153, + 0x0000, 0xb6ff, 0x0011, 0xb2d0, 0x0010, 0xff50, 0x0010, 0xb351, + 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1288, + 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1009, + 0x000b, 0x8620, 0x0015, 0x000f, 0x0000, 0x0001, 0x0010, 0xc014, + 0x0000, 0x1213, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, + 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, + 0x000b, 0x862c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, + 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1a09, + 0x000b, 0x8634, 0x0012, 0x104b, 0x000b, 0x163d, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0000, 0x000b, 0x0015, 0x0033, 0x0000, 0x1621, + 0x001b, 0x863c, 0x0010, 0x15fe, 0x000b, 0x665c, 0x0014, 0x0683, + 0x0002, 0x3a42, 0x001b, 0x1682, 0x0001, 0x10c8, 0x0010, 0x000f, + 0x000b, 0x16e5, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, + 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x864c, 0x0011, 0xb0e8, 0x0010, 0x0009, 0x0003, 0x1653, + 0x0011, 0xb0e8, 0x0000, 0x0001, 0x001b, 0x1681, 0x0011, 0x1388, + 0x0010, 0x000a, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x8658, 0x0002, 0xb04f, 0x001b, 0x1678, 0x0013, 0x0681, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8663, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8666, 0x0010, 0xb0fe, + 0x0003, 0x666b, 0x0000, 0xb012, 0x0003, 0x066d, 0x0010, 0xc012, + 0x0010, 0xc011, 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, + 0x0013, 0x1676, 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, + 0x0000, 0x0008, 0x0004, 0x083d, 0x0000, 0xc013, 0x0013, 0x0682, + 0x0010, 0x02fe, 0x0013, 0x667d, 0x0015, 0x003a, 0x0010, 0x2020, + 0x0013, 0x0682, 0x0015, 0x003a, 0x0000, 0x2000, 0x0015, 0x003a, + 0x0010, 0x1010, 0x0004, 0x0829, 0x0013, 0x0055, 0x0013, 0xb683, + 0x0005, 0x002a, 0x0000, 0x0004, 0x0000, 0xba30, 0x0005, 0x0031, + 0x0010, 0x001b, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x868b, + 0x0000, 0xc02c, 0x0000, 0xb02d, 0x0012, 0x104b, 0x0003, 0x16a6, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, + 0x0000, 0xb129, 0x001b, 0x8695, 0x0000, 0xb120, 0x0010, 0xb221, + 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0000, 0xc025, + 0x0010, 0xb526, 0x0010, 0xc027, 0x0010, 0xb516, 0x0010, 0xc017, + 0x0000, 0xb518, 0x0000, 0xc019, 0x0010, 0xc028, 0x0000, 0xc029, + 0x0010, 0xc01e, 0x0003, 0x06dc, 0x0012, 0x1044, 0x0013, 0x16d6, + 0x0002, 0x1034, 0x0000, 0xff10, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b29, 0x001b, 0x86af, + 0x0000, 0x1c30, 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, + 0x001b, 0x86b4, 0x0002, 0x1f43, 0x001b, 0x16bb, 0x0010, 0xb3b5, + 0x0000, 0xb4b6, 0x0000, 0xc0b3, 0x0010, 0xc0b4, 0x0000, 0xb120, + 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, + 0x0010, 0xb625, 0x0010, 0xb516, 0x0000, 0xb617, 0x0000, 0x1826, + 0x0000, 0x1927, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, + 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x86ca, 0x0000, 0xb028, + 0x0000, 0xb129, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0003, 0x66dc, + 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0004, 0x028a, 0x0002, 0x3a42, + 0x0013, 0x16dc, 0x0013, 0x06e4, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b79, 0x001b, 0x86db, + 0x0013, 0xb6dc, 0x0005, 0x002a, 0x0000, 0x0001, 0x0005, 0x0015, + 0x0000, 0x0001, 0x0000, 0x1efe, 0x0013, 0x66e4, 0x0003, 0x0256, + 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x001b, + 0x0015, 0x0033, 0x0010, 0xb051, 0x000b, 0x86ea, 0x0000, 0xb0a3, + 0x0010, 0xb697, 0x0010, 0xb946, 0x0015, 0x00a5, 0x0000, 0x0010, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0002, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb509, 0x000b, 0x86f7, + 0x0014, 0x07e4, 0x0004, 0x07d3, 0x0012, 0xb470, 0x0010, 0xffb4, + 0x0010, 0xb48e, 0x0010, 0xb08a, 0x0010, 0xb18b, 0x0012, 0x104d, + 0x0003, 0x1702, 0x0013, 0x072f, 0x0012, 0x104b, 0x0003, 0x1715, + 0x0005, 0x008c, 0x0010, 0x0829, 0x0010, 0xc08d, 0x0001, 0xb2d8, + 0x0010, 0x0600, 0x0010, 0xff88, 0x0010, 0xb389, 0x0000, 0x1390, + 0x0010, 0xb591, 0x0000, 0xc08f, 0x0010, 0x1ab9, 0x0014, 0x04b4, + 0x0013, 0x9710, 0x0010, 0xb092, 0x0010, 0xb193, 0x0013, 0x9713, + 0x0013, 0x072a, 0x0005, 0x008c, 0x0000, 0x0809, 0x0015, 0x008d, + 0x0000, 0x0008, 0x0001, 0xb2d8, 0x0000, 0x0100, 0x0010, 0xff88, + 0x0010, 0xb389, 0x0000, 0x1390, 0x0010, 0xb591, 0x0000, 0xc08f, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, + 0x0000, 0xb011, 0x001b, 0x8725, 0x0013, 0x9726, 0x0000, 0xb192, + 0x0000, 0xb093, 0x0013, 0x9729, 0x0010, 0x19a1, 0x0000, 0x18a2, + 0x0015, 0x00b1, 0x0010, 0x0096, 0x0013, 0x079e, 0x0000, 0xb590, + 0x0010, 0x1391, 0x0001, 0x10c8, 0x0010, 0x000f, 0x0001, 0xffe8, + 0x0010, 0x0005, 0x0013, 0x1756, 0x0001, 0xb2d8, 0x0000, 0x0700, + 0x0010, 0xff88, 0x0010, 0xb389, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x1388, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x8741, 0x0002, 0xb049, 0x0003, 0x1749, + 0x0005, 0x008c, 0x0010, 0x0889, 0x0015, 0x00b1, 0x0010, 0x0096, + 0x0003, 0x074d, 0x0005, 0x008c, 0x0010, 0x0898, 0x0015, 0x00b1, + 0x0000, 0x0092, 0x0010, 0xc08d, 0x0000, 0xc08f, 0x0013, 0x974f, + 0x0000, 0xc092, 0x0010, 0xc093, 0x0013, 0x9752, 0x0010, 0x19a1, + 0x0000, 0x18a2, 0x0013, 0x079e, 0x0001, 0xb2d8, 0x0000, 0x0100, + 0x0010, 0xff88, 0x0010, 0xb389, 0x0005, 0x008c, 0x0010, 0x0880, + 0x0015, 0x008d, 0x0000, 0x0008, 0x0011, 0x1388, 0x0000, 0x000e, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8763, + 0x0010, 0xb08f, 0x0000, 0xb590, 0x0010, 0x1391, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0000, 0x000d, 0x0015, 0x0033, 0x0000, 0xb021, + 0x000b, 0x876c, 0x0013, 0x976d, 0x0010, 0xb392, 0x0010, 0xb293, + 0x0013, 0x9770, 0x0000, 0xb1a1, 0x0010, 0xb0a2, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x877a, 0x0000, 0xb3ff, + 0x0001, 0xb080, 0x0000, 0xffb3, 0x000b, 0x2781, 0x0002, 0xb200, + 0x0003, 0x0782, 0x0010, 0xb2ff, 0x0011, 0xb180, 0x0010, 0xffb2, + 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb212, 0x001b, 0x8789, 0x0015, 0x00b1, 0x0000, 0x0092, + 0x0002, 0x104c, 0x0013, 0x179c, 0x0011, 0xc2e8, 0x0010, 0x000c, + 0x001b, 0x1794, 0x0015, 0x00ff, 0x0000, 0x0800, 0x0003, 0x079c, + 0x0011, 0xc2e8, 0x0000, 0x0020, 0x000b, 0x179a, 0x0015, 0x00ff, + 0x0010, 0x1800, 0x0003, 0x079c, 0x0015, 0x00ff, 0x0000, 0x1000, + 0x0011, 0xb1d0, 0x0010, 0xffb1, 0x0015, 0x009a, 0x0010, 0x0036, + 0x0005, 0x009b, 0x0000, 0x95d5, 0x0012, 0xd041, 0x001b, 0x17a2, + 0x0015, 0x00d1, 0x0010, 0x0202, 0x0003, 0x97a6, 0x0012, 0x104e, + 0x0003, 0x17ab, 0x0012, 0xb12f, 0x0010, 0xffb1, 0x0000, 0xb175, + 0x0003, 0x97ac, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0001, 0x19c8, + 0x0010, 0xfff0, 0x001b, 0x17b5, 0x0015, 0x00b1, 0x0010, 0x07d0, + 0x0003, 0x07b7, 0x0015, 0x00b1, 0x0000, 0x1b58, 0x0005, 0x00b0, + 0x0010, 0x0009, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, + 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, + 0x000b, 0x87c0, 0x0013, 0x0682, 0x0000, 0xba30, 0x0005, 0x0031, + 0x0010, 0x0021, 0x0015, 0x0033, 0x0010, 0xb019, 0x001b, 0x87c7, + 0x0002, 0xb200, 0x0011, 0xffc8, 0x0010, 0x00ff, 0x0010, 0xffb2, + 0x0010, 0xb2b7, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, + 0x0010, 0xb20a, 0x000b, 0x87d1, 0x0017, 0x4000, 0x0000, 0xba30, + 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb409, + 0x000b, 0x87d8, 0x0002, 0xb400, 0x0011, 0xffc8, 0x0010, 0x00ff, + 0x0010, 0xffb4, 0x0010, 0xb4b7, 0x0005, 0x0031, 0x0000, 0x0023, + 0x0015, 0x0033, 0x0010, 0xb40a, 0x000b, 0x87e2, 0x0017, 0x4000, + 0x0000, 0xba30, 0x0001, 0xc7c8, 0x0000, 0x0020, 0x000b, 0x17f0, + 0x0005, 0x0031, 0x0010, 0x0028, 0x0015, 0x0033, 0x0010, 0xb209, + 0x001b, 0x87ec, 0x0011, 0xb2c8, 0x0000, 0xff80, 0x0013, 0x17f3, + 0x0010, 0xc4b0, 0x0010, 0xc5b1, 0x0003, 0x07f5, 0x0010, 0xc6b1, + 0x0000, 0xc0b0, 0x0005, 0x0031, 0x0000, 0x0004, 0x0015, 0x0033, + 0x0010, 0xb211, 0x000b, 0x87f9, 0x0017, 0x4000, 0x0015, 0x00b8, + 0x0010, 0x0009, 0x0015, 0x003a, 0x0010, 0x0707, 0x0004, 0x083d, + 0x0013, 0x002d, 0x0015, 0x00b8, 0x0010, 0x0009, 0x0015, 0x003a, + 0x0010, 0x0707, 0x0013, 0x083d, 0x0014, 0x0114, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xba09, 0x001b, 0x880e, 0x0004, 0x07c2, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0010, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x8817, + 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x0309, 0x000b, 0x881d, 0x0002, 0x0327, 0x0010, 0xffb2, + 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb20a, 0x001b, 0x8825, 0x0015, 0x00b8, 0x0010, 0x0006, + 0x0013, 0x083d, 0x0004, 0x0126, 0x0004, 0x07c2, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0010, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x8832, 0x0012, 0x1027, + 0x0010, 0xffb2, 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x883a, 0x0015, 0x00b8, + 0x0000, 0x0007, 0x0003, 0x483d, 0x0000, 0xb838, 0x0017, 0x4000, + 0xa4bc, 0xa221 +}; +unsigned short xseqipx_code_length01 = 0x1082; diff -Nru a/drivers/scsi/qla2xxx/ql6312.c b/drivers/scsi/qla2xxx/ql6312.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql6312.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,90 @@ +/* + * QLogic ISP6312 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation (www.qlogic.com) + * + * Released under GPL v2. + */ + +#include +#include +#include + +#include "qla_os.h" +#include "qla_def.h" + +static char qla_driver_name[] = "qla6312"; + +extern unsigned char fw2300flx_version[]; +extern unsigned char fw2300flx_version_str[]; +extern unsigned short fw2300flx_addr01; +extern unsigned short fw2300flx_code01[]; +extern unsigned short fw2300flx_length01; + +static struct qla_fw_info qla_fw_tbl[] = { + { + .addressing = FW_INFO_ADDR_NORMAL, + .fwcode = &fw2300flx_code01[0], + .fwlen = &fw2300flx_length01, + .fwstart = &fw2300flx_addr01, + }, + { FW_INFO_ADDR_NOMORE, }, +}; + +static struct qla_board_info qla_board_tbl[] = { + { + .drv_name = qla_driver_name, + .isp_name = "ISP6312", + .fw_info = qla_fw_tbl, + }, +}; + +static struct pci_device_id qla6312_pci_tbl[] = { + { + .vendor = PCI_VENDOR_ID_QLOGIC, + .device = PCI_DEVICE_ID_QLOGIC_ISP6312, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (unsigned long)&qla_board_tbl[0], + }, + {0, 0}, +}; +MODULE_DEVICE_TABLE(pci, qla6312_pci_tbl); + +static int __devinit +qla6312_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, + (struct qla_board_info *)id->driver_data); +} + +static void __devexit +qla6312_remove_one(struct pci_dev *pdev) +{ + qla2x00_remove_one(pdev); +} + +static struct pci_driver qla6312_pci_driver = { + .name = "qla6312", + .id_table = qla6312_pci_tbl, + .probe = qla6312_probe_one, + .remove = __devexit_p(qla6312_remove_one), +}; + +static int __init +qla6312_init(void) +{ + return pci_module_init(&qla6312_pci_driver); +} + +static void __exit +qla6312_exit(void) +{ + pci_unregister_driver(&qla6312_pci_driver); +} + +module_init(qla6312_init); +module_exit(qla6312_exit); + +MODULE_AUTHOR("QLogic Corporation"); +MODULE_DESCRIPTION("QLogic ISP6312 FC-SCSI Host Bus Adapter driver"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/qla2xxx/ql6312_fw.c b/drivers/scsi/qla2xxx/ql6312_fw.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql6312_fw.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,6773 @@ +/************************************************************************** + * QLOGIC LINUX SOFTWARE + * + * QLogic ISP2x00 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation + * (www.qlogic.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + *************************************************************************/ + +/* + * Firmware Version 3.02.21 (16:22 Jan 19, 2004) + */ + +#ifdef UNIQUE_FW_NAME +unsigned short fw2300flx_version = 3*1024+2; +#else +unsigned short risc_code_version = 3*1024+2; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned char fw2300flx_version_str[] = {3, 2,21}; +#else +unsigned char firmware_version[] = {3, 2,21}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2300flx_VERSION_STRING "3.02.21" +#else +#define FW_VERSION_STRING "3.02.21" +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2300flx_addr01 = 0x0800 ; +#else +unsigned short risc_code_addr01 = 0x0800 ; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2300flx_code01[] = { +#else +unsigned short risc_code01[] = { +#endif + 0x0470, 0x0000, 0x0000, 0xd1c9, 0x0000, 0x0003, 0x0002, 0x0015, + 0x0317, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, + 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, + 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, + 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, + 0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9, + 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, + 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, + 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, + 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, + 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, + 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, + 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, + 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78, + 0x7883, 0x0004, 0x2089, 0x29f6, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e2f, 0x2029, + 0x2480, 0x2031, 0xffff, 0x2039, 0x2450, 0x2021, 0x0050, 0x20e9, + 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, + 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, + 0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8, + 0x4104, 0x8001, 0x1de0, 0x756a, 0x766e, 0x7766, 0x7472, 0x7476, + 0x00e6, 0x2071, 0x1a8f, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x716c, + 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, + 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x716c, 0x3400, + 0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009, + 0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f, + 0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e, + 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f04, 0x080c, + 0x5aa2, 0x080c, 0x9a5e, 0x080c, 0x10bb, 0x080c, 0x1296, 0x080c, + 0x19a1, 0x080c, 0x0d46, 0x080c, 0x1040, 0x080c, 0x30d9, 0x080c, + 0x700c, 0x080c, 0x6383, 0x080c, 0x7c91, 0x080c, 0x21b2, 0x080c, + 0x7fbb, 0x080c, 0x767b, 0x080c, 0x1fef, 0x080c, 0x2123, 0x080c, + 0x21a7, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, + 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, + 0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2071, 0x1800, 0x7003, + 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, + 0x477e, 0x080c, 0x3100, 0x080c, 0x707d, 0x080c, 0x6843, 0x080c, + 0x7cba, 0x080c, 0x2960, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, + 0x0ad8, 0x093e, 0x0b8f, 0x0d45, 0x0d45, 0x0d45, 0x080c, 0x0db4, + 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, + 0x1904, 0x0aab, 0x080c, 0x0e71, 0x080c, 0x6d14, 0x0150, 0x080c, + 0x6d37, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, + 0x0468, 0x080c, 0x6c46, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab, + 0x7094, 0x9086, 0x0028, 0x1904, 0x0aab, 0x080c, 0x7c89, 0x080c, + 0x7c7b, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, + 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6b95, 0x080c, + 0x7d56, 0x2011, 0x6b88, 0x080c, 0x7e27, 0x2011, 0x58fd, 0x080c, + 0x7d56, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x51aa, + 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x58fd, + 0x080c, 0x7d56, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011, 0x6b88, + 0x080c, 0x7e27, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, + 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x1975, 0x2004, 0x9005, + 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5a4a, 0x00ce, 0x0804, + 0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x6d1c, 0x0118, 0x9295, + 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, 0x2011, 0x8010, 0x73d4, + 0x2001, 0x1976, 0x2003, 0x0001, 0x080c, 0x2826, 0x080c, 0x46b9, + 0x7244, 0xc284, 0x7246, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, + 0x2102, 0x080c, 0x92c1, 0x2011, 0x0004, 0x080c, 0xb7a3, 0x080c, + 0x6214, 0x080c, 0x6d14, 0x1120, 0x080c, 0x286a, 0x02e0, 0x0400, + 0x080c, 0x5a51, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c, + 0x5377, 0x0804, 0x0aab, 0x080c, 0x5153, 0xd094, 0x0188, 0x2011, + 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5157, 0xd0d4, 0x1118, + 0x080c, 0x286a, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, + 0x080c, 0x5157, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x630d, + 0x0008, 0x2012, 0x080c, 0x62d3, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, + 0x00a8, 0x707b, 0x0000, 0x080c, 0x6d14, 0x1130, 0x70ac, 0x9005, + 0x1168, 0x080c, 0xbbd8, 0x0050, 0x080c, 0xbbd8, 0x70d8, 0xd09c, + 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5a27, 0x70e3, 0x0000, + 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x2872, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6d14, 0x1178, + 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e, + 0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019, + 0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108, + 0xc295, 0x72da, 0x080c, 0x6d14, 0x0118, 0x9296, 0x0004, 0x0548, + 0x2011, 0x0001, 0x080c, 0xb7a3, 0x70a7, 0x0000, 0x70ab, 0xffff, + 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, + 0x0003, 0x782a, 0x00fe, 0x080c, 0x2c63, 0x2011, 0x0005, 0x080c, + 0x93f3, 0x080c, 0x868e, 0x080c, 0x6d14, 0x0148, 0x00c6, 0x2061, + 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x012e, + 0x0420, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, 0x0002, 0x00f6, + 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, + 0x00fe, 0x2011, 0x0005, 0x080c, 0x93f3, 0x080c, 0x868e, 0x080c, + 0x6d14, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, + 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, + 0x080c, 0x6d14, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, + 0x080c, 0x6d14, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, + 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, + 0x090c, 0x2f76, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c, + 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, 0x00ce, 0x0005, + 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, + 0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2c63, 0x080c, + 0x868e, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540, + 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, + 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x2deb, + 0x080c, 0x868e, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001, + 0x080c, 0xbe86, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2e25, + 0x080c, 0x868e, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c, + 0x70a4, 0x9005, 0x1904, 0x0b8c, 0x70d8, 0xd0a4, 0x0118, 0xd0b4, + 0x0904, 0x0b8c, 0x080c, 0x62d3, 0x1904, 0x0b8c, 0x080c, 0x6326, + 0x1904, 0x0b8c, 0x080c, 0x630d, 0x01c0, 0x0156, 0x00c6, 0x20a9, + 0x007f, 0x900e, 0x0016, 0x080c, 0x5ff1, 0x1118, 0xb800, 0xd0ec, + 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b32, 0x00ce, 0x015e, 0x0028, + 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b8c, 0x0006, 0x2001, 0x0103, + 0x2003, 0x006b, 0x000e, 0x2011, 0x1982, 0x080c, 0x0f74, 0x2011, + 0x199c, 0x080c, 0x0f74, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, + 0x70ab, 0xffff, 0x080c, 0x0e53, 0x9006, 0x080c, 0x24b4, 0x0036, + 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4856, 0x004e, + 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x6d37, 0x0150, 0x080c, + 0x6d14, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, + 0x782a, 0x00fe, 0x2001, 0x19b7, 0x2004, 0x9086, 0x0005, 0x1120, + 0x2011, 0x0000, 0x080c, 0x93f3, 0x2011, 0x0000, 0x080c, 0x93fd, + 0x080c, 0x868e, 0x080c, 0x8769, 0x012e, 0x00be, 0x0005, 0x0016, + 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, + 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5a10, 0x7940, + 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, + 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, + 0xd1ac, 0x1904, 0x0c1c, 0x2001, 0x1976, 0x2004, 0x9005, 0x1518, + 0x080c, 0x28ed, 0x1148, 0x2001, 0x0001, 0x080c, 0x2855, 0x2001, + 0x0001, 0x080c, 0x2838, 0x00b8, 0x080c, 0x28f5, 0x1138, 0x9006, + 0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0068, 0x080c, 0x28fd, + 0x1d50, 0x2001, 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, + 0x264f, 0x0804, 0x0cfc, 0x080c, 0x6d25, 0x0148, 0x080c, 0x6d37, + 0x1118, 0x080c, 0x7007, 0x0050, 0x080c, 0x6d1c, 0x0dd0, 0x080c, + 0x7002, 0x080c, 0x6ff8, 0x080c, 0x6c46, 0x0058, 0x080c, 0x6d14, + 0x0140, 0x2009, 0x00f8, 0x080c, 0x5a10, 0x7843, 0x0090, 0x7843, + 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x6d14, + 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0d01, 0x1f04, 0x0bfb, 0x0070, + 0x7824, 0x080c, 0x6d2e, 0x0118, 0xd0ac, 0x1904, 0x0d01, 0x9084, + 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d01, 0x2001, 0x0001, + 0x080c, 0x24b4, 0x0804, 0x0d14, 0x2001, 0x1976, 0x2004, 0x9005, + 0x1518, 0x080c, 0x28ed, 0x1148, 0x2001, 0x0001, 0x080c, 0x2855, + 0x2001, 0x0001, 0x080c, 0x2838, 0x00b8, 0x080c, 0x28f5, 0x1138, + 0x9006, 0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0068, 0x080c, + 0x28fd, 0x1d50, 0x2001, 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, + 0x080c, 0x264f, 0x0804, 0x0cfc, 0x7850, 0x9085, 0x0040, 0x7852, + 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2905, 0x9085, + 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c55, 0x080c, + 0x7e07, 0x1f04, 0x0c55, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, + 0x7852, 0x793a, 0x080c, 0x6d25, 0x0148, 0x080c, 0x6d37, 0x1118, + 0x080c, 0x7007, 0x0050, 0x080c, 0x6d1c, 0x0dd0, 0x080c, 0x7002, + 0x080c, 0x6ff8, 0x080c, 0x6c46, 0x0020, 0x2009, 0x00f8, 0x080c, + 0x5a10, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c7b, 0x7850, 0x9085, + 0x1400, 0x7852, 0x080c, 0x6d14, 0x0120, 0x7843, 0x0090, 0x7843, + 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x7e07, 0x7820, + 0xd09c, 0x1588, 0x080c, 0x6d14, 0x0904, 0x0ce1, 0x7824, 0xd0ac, + 0x1904, 0x0d01, 0x080c, 0x6d37, 0x1530, 0x0046, 0x2021, 0x0320, + 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2905, 0x7824, + 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, + 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d22, 0x8421, 0x1158, + 0x1d04, 0x0cbc, 0x080c, 0x7e07, 0x080c, 0x7002, 0x080c, 0x6ff8, + 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, 0x0cc9, 0x080c, + 0x7e07, 0x2009, 0x196a, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, + 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, + 0x28e6, 0x7924, 0x080c, 0x2905, 0xd19c, 0x0110, 0x080c, 0x2826, + 0x00d8, 0x080c, 0x6d25, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, + 0x6cec, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2905, + 0x7824, 0x080c, 0x6d2e, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, + 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x24b4, + 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, + 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, + 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1976, 0x2003, 0x0000, + 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, + 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x7e07, 0x015e, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, + 0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086, 0x0001, + 0x1110, 0x080c, 0x3100, 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061, + 0x197a, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015, 0x600f, + 0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001, 0x0100, + 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, 0x715a, + 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbbd8, 0x70e7, 0x00c0, + 0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, + 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, + 0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, + 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1958, + 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, + 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x5ff1, 0x1178, + 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, + 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, + 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x2079, + 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, 0x0db6, + 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e, + 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886, + 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6, + 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a69, 0x7a08, 0x226a, + 0x2069, 0x1a6a, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c, + 0x2019, 0x1a77, 0x201a, 0x2019, 0x1a7a, 0x9016, 0x7808, 0xd09c, + 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1a8f, 0x0108, + 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1a78, + 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a49, + 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318, + 0x1f04, 0x0e03, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, 0x1800, + 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x0180, 0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, + 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, + 0x1001, 0x080c, 0x5162, 0x1108, 0x0099, 0x0cd8, 0x0005, 0x918c, + 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, + 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f, 0x2102, 0x0005, + 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0ecb, 0x20a9, 0x0900, + 0x080c, 0x0eec, 0x2011, 0x0040, 0x080c, 0x0ecb, 0x20a9, 0x0900, + 0x080c, 0x0eec, 0x0c78, 0x0026, 0x080c, 0x0ed8, 0x1118, 0x2011, + 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, 0x9296, + 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, 0x2011, 0x6840, 0xd0e4, + 0x70eb, 0x0000, 0x1128, 0x70eb, 0x0fa0, 0x080c, 0x0edd, 0x002e, + 0x0005, 0x0026, 0x080c, 0x0ed8, 0x0128, 0xd0a4, 0x1138, 0x2011, + 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, 0x0edd, 0x002e, 0x0005, + 0x0026, 0x70eb, 0x0000, 0x080c, 0x0ed8, 0x1148, 0x080c, 0x28fd, + 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, 0x8282, 0x0040, 0x080c, + 0x28fd, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c, + 0x0edd, 0x002e, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1800, 0xd0b4, + 0x70e4, 0x1110, 0xc0e4, 0x0048, 0x0006, 0x3b00, 0x9084, 0xff3f, + 0x20d8, 0x000e, 0x70eb, 0x0000, 0xc0e5, 0x0079, 0x000e, 0x00ee, + 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70e4, 0x1110, 0xc0dc, + 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70e6, 0x7000, 0x9084, + 0x0007, 0x000b, 0x0005, 0x0e9a, 0x0e71, 0x0e71, 0x0e53, 0x0e80, + 0x0e71, 0x0e71, 0x0e80, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, + 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, 0x0005, + 0x2001, 0x1839, 0x2004, 0xd0dc, 0x0005, 0x9e86, 0x1800, 0x190c, + 0x0db4, 0x70e4, 0xd0e4, 0x0108, 0xc2e5, 0x72e6, 0xd0e4, 0x1118, + 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eec, 0x2091, 0x6000, + 0x1f04, 0x0eec, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, + 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, + 0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, + 0x2061, 0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, + 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, + 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, + 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, + 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a, + 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, + 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, + 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, + 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, + 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, + 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, + 0x080c, 0x0ef3, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, + 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, + 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, + 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, + 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, + 0x23a0, 0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, + 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d94, 0x2001, + 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, + 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x101e, 0x009e, 0x0cb0, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1097, 0x090c, 0x0db4, + 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, + 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, + 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0db4, 0x2300, 0x9202, + 0x0120, 0x1a0c, 0x0db4, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, + 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, + 0x9045, 0x0128, 0x9906, 0x090c, 0x0db4, 0xa000, 0x0cc8, 0x012e, + 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, + 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, + 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, + 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, + 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, + 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, + 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x012e, 0x00ee, 0x0005, + 0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, + 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, + 0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, + 0x1883, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0492, 0xa802, 0x2048, + 0x2009, 0x2480, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, + 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, + 0x2071, 0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, + 0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, + 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, + 0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, + 0xa803, 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, + 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, + 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0492, 0x0288, + 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, + 0x1883, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, + 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e7, 0x7007, 0x0000, + 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, + 0x8044, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, + 0xa06f, 0x0000, 0x2071, 0x19e7, 0x701c, 0x9088, 0x19f1, 0x280a, + 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0db4, + 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, + 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, + 0x19e7, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, + 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, + 0x7007, 0x0006, 0x7000, 0x0002, 0x110e, 0x110c, 0x110c, 0x110c, + 0x1285, 0x1285, 0x1285, 0x1285, 0x080c, 0x0db4, 0x701c, 0x7120, + 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, + 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f1, 0x2004, 0x700a, + 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, + 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, + 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, + 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, + 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, + 0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, + 0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, + 0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, + 0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, + 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, + 0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, + 0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19e7, + 0x2104, 0xc095, 0x200a, 0x080c, 0x10eb, 0x0005, 0x0016, 0x00e6, + 0x2071, 0x19e7, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, + 0x0dad, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, + 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x10fc, 0x11a4, 0x11d8, + 0x0db4, 0x0db4, 0x1291, 0x0db4, 0x918c, 0x0700, 0x1550, 0x0136, + 0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, + 0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, + 0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, + 0x7802, 0x7804, 0x7806, 0x080c, 0x1141, 0x0005, 0x7008, 0x0096, + 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x10fc, + 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, + 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, + 0x7804, 0x7806, 0x080c, 0x1156, 0x0005, 0x7008, 0x0096, 0x2048, + 0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, + 0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, + 0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, + 0x7008, 0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c, + 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, + 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, + 0x008e, 0x00de, 0x009e, 0x080c, 0x10eb, 0x0005, 0x00de, 0x009e, + 0x080c, 0x10eb, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, + 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, + 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x65e5, 0xa09f, + 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x101e, 0x009e, 0x0005, + 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100, + 0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, + 0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, + 0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, + 0xb000, 0xa07a, 0x2810, 0x080c, 0x10cc, 0x00e8, 0xa97c, 0xa894, + 0x0016, 0x0006, 0x080c, 0x65e5, 0x000e, 0x001e, 0xd1fc, 0x1138, + 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9ac8, 0x00ce, 0x7008, + 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x101e, 0x7007, + 0x0000, 0x080c, 0x10eb, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, + 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, + 0x0005, 0x7007, 0x0000, 0x080c, 0x10fc, 0x0005, 0x0126, 0x2091, + 0x2200, 0x2079, 0x0300, 0x2071, 0x1a31, 0x7003, 0x0000, 0x78bf, + 0x00f6, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x0254, + 0x2061, 0xd512, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, + 0x1f04, 0x12aa, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, + 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, + 0x7820, 0x0cd8, 0x2001, 0x1a32, 0x2003, 0x0000, 0x78ab, 0x0004, + 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, + 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a49, 0x781f, + 0xff00, 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, + 0x781f, 0x0303, 0x2061, 0x1a49, 0x602f, 0x1cd0, 0x2001, 0x1819, + 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1dd6, 0x00ce, 0x0005, + 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0dad, + 0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024, + 0x1a0c, 0x0db4, 0x0023, 0x012e, 0x0005, 0x012e, 0x0005, 0x132b, + 0x132b, 0x1342, 0x1347, 0x134b, 0x1350, 0x1378, 0x137c, 0x138a, + 0x138e, 0x132b, 0x1418, 0x141c, 0x147f, 0x132b, 0x132b, 0x132b, + 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, + 0x132b, 0x132b, 0x1352, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, + 0x132b, 0x132f, 0x132d, 0x080c, 0x0db4, 0x080c, 0x0dad, 0x080c, + 0x1486, 0x2009, 0x1a48, 0x2104, 0x8000, 0x200a, 0x080c, 0x773e, + 0x080c, 0x18a6, 0x0005, 0x2009, 0x0048, 0x2060, 0x080c, 0x9b42, + 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, + 0xc085, 0x7006, 0x0005, 0x080c, 0x1486, 0x080c, 0x1543, 0x0005, + 0x080c, 0x0db4, 0x080c, 0x1486, 0x2060, 0x6014, 0x0096, 0x2048, + 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x9b42, 0x2001, + 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, + 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, + 0x1110, 0x080c, 0x148b, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, + 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1486, 0x2060, 0x6014, + 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, + 0x9b42, 0x0005, 0x080c, 0x1486, 0x080c, 0x0db4, 0x080c, 0x1486, + 0x080c, 0x1403, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, + 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, + 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, + 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, + 0x0db4, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0480, + 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x141c, 0x0005, 0x7828, + 0x782b, 0x0000, 0x9065, 0x090c, 0x0db4, 0x6014, 0x2048, 0x78ab, + 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x773e, 0x080c, 0x18a6, + 0x080c, 0xb793, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, + 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xbb71, + 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, + 0x0dc8, 0x7dbc, 0x080c, 0xd4bb, 0xd5a4, 0x1118, 0x080c, 0x148b, + 0x0005, 0x080c, 0x773e, 0x080c, 0x18a6, 0x0005, 0x781f, 0x0300, + 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, + 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, + 0x0016, 0x080c, 0x14fc, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, + 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, + 0x0db4, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x148b, 0x0005, + 0x81ff, 0x190c, 0x0db4, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106, + 0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c, 0x1537, 0x6014, + 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, + 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, 0x601c, 0xd084, + 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x15ad, 0x00fe, 0x00a8, 0x00f6, + 0x2c78, 0x080c, 0x16ea, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0160, + 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, + 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, + 0x080c, 0x12ba, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, 0x0031, + 0x2060, 0x2009, 0x0053, 0x080c, 0x9b42, 0x0005, 0x7808, 0xd09c, + 0x0de8, 0x7820, 0x0005, 0x080c, 0x1403, 0x00d6, 0x2069, 0x0200, + 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, + 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, + 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, + 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x14ee, 0x6827, 0x0001, + 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, + 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, + 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x773e, 0x080c, 0x18a6, 0x0090, + 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, + 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, + 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, + 0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, + 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, + 0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, + 0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, + 0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x12f0, + 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, + 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, + 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0db4, 0x2009, 0xff00, + 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, + 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, + 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0db4, 0x7037, + 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, + 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0c79, + 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x15a2, 0x7017, + 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x15a2, 0x2001, + 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039, + 0x1904, 0x15a2, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c, + 0x7696, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xbb4c, + 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4, 0x1170, 0x601c, + 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1df6, 0x1190, + 0x080c, 0x1739, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, + 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, + 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, + 0x080c, 0x148b, 0x0005, 0x080c, 0x0db4, 0x0016, 0x2009, 0x00a0, + 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0, 0x0126, + 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, + 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1dd6, 0x2165, + 0x0002, 0x15e0, 0x162d, 0x15e0, 0x15e0, 0x15e0, 0x160f, 0x15e0, + 0x15e4, 0x15d9, 0x1624, 0x15e0, 0x15e0, 0x15e0, 0x16e8, 0x15f8, + 0x15ee, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x1624, + 0x9085, 0x0001, 0x0804, 0x16e0, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, + 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1634, 0xa87c, 0xd0bc, + 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1683, + 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, + 0x9045, 0x090c, 0x0db4, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, + 0x1dd6, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1683, 0x0428, 0xa87c, + 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, 0x0db4, 0xa164, 0xa91a, + 0x91ec, 0x000f, 0x9d80, 0x1dd6, 0x2065, 0x9006, 0xa842, 0xa83e, + 0xd19c, 0x1904, 0x1683, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x15e0, + 0x9006, 0xa842, 0xa83e, 0x0804, 0x1683, 0xa87c, 0xd0ac, 0x0904, + 0x15e0, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, + 0x0db4, 0x9082, 0x001b, 0x0002, 0x1657, 0x1657, 0x1659, 0x1657, + 0x1657, 0x1657, 0x165f, 0x1657, 0x1657, 0x1657, 0x1665, 0x1657, + 0x1657, 0x1657, 0x166b, 0x1657, 0x1657, 0x1657, 0x1671, 0x1657, + 0x1657, 0x1657, 0x1677, 0x1657, 0x1657, 0x1657, 0x167d, 0x080c, + 0x0db4, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x16c8, 0xa584, + 0xa488, 0xa38c, 0xa290, 0x0804, 0x16c8, 0xa594, 0xa498, 0xa39c, + 0xa2a0, 0x0804, 0x16c8, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, + 0x16c8, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x16c8, 0xa5c4, + 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x16c8, 0xa5d4, 0xa4d8, 0xa3dc, + 0xa2e0, 0x0804, 0x16c8, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, + 0x9082, 0x001b, 0x0002, 0x16a6, 0x16a4, 0x16a4, 0x16a4, 0x16a4, + 0x16a4, 0x16ad, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16b4, + 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16bb, 0x16a4, 0x16a4, + 0x16a4, 0x16a4, 0x16a4, 0x16c2, 0x080c, 0x0db4, 0xa56c, 0xa470, + 0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, + 0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, + 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, + 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, + 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, + 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150, + 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, + 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c80, + 0x0804, 0x15e0, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, + 0x2048, 0x2940, 0xa80e, 0x2061, 0x1dd1, 0xa813, 0x1dd1, 0x2c05, + 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0db4, 0x9006, + 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0xadcc, + 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, + 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, + 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, + 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0xa804, 0x9045, + 0x090c, 0x0db4, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, + 0x1dd6, 0x2015, 0x82ff, 0x090c, 0x0db4, 0xaa12, 0x2205, 0xa80a, + 0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, + 0x182e, 0x1790, 0x1790, 0x182e, 0x182e, 0x1828, 0x182e, 0x1790, + 0x182e, 0x17df, 0x17df, 0x182e, 0x182e, 0x182e, 0x1825, 0x17df, + 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, + 0x1830, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, + 0x0002, 0x177c, 0x177a, 0x177a, 0x177a, 0x177a, 0x177a, 0x1780, + 0x177a, 0x177a, 0x177a, 0x177a, 0x177a, 0x1784, 0x177a, 0x177a, + 0x177a, 0x177a, 0x177a, 0x1788, 0x177a, 0x177a, 0x177a, 0x177a, + 0x177a, 0x178c, 0x080c, 0x0db4, 0xa774, 0xa678, 0x0804, 0x1830, + 0xa78c, 0xa690, 0x0804, 0x1830, 0xa7a4, 0xa6a8, 0x0804, 0x1830, + 0xa7bc, 0xa6c0, 0x0804, 0x1830, 0xa7d4, 0xa6d8, 0x0804, 0x1830, + 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, + 0x17b3, 0x17b3, 0x17b5, 0x17b3, 0x17b3, 0x17b3, 0x17bb, 0x17b3, + 0x17b3, 0x17b3, 0x17c1, 0x17b3, 0x17b3, 0x17b3, 0x17c7, 0x17b3, + 0x17b3, 0x17b3, 0x17cd, 0x17b3, 0x17b3, 0x17b3, 0x17d3, 0x17b3, + 0x17b3, 0x17b3, 0x17d9, 0x080c, 0x0db4, 0xa574, 0xa478, 0xa37c, + 0xa280, 0x0804, 0x1830, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, + 0x1830, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1830, 0xa5a4, + 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1830, 0xa5b4, 0xa4b8, 0xa3bc, + 0xa2c0, 0x0804, 0x1830, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, + 0x1830, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1830, 0x2c05, + 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, 0x1802, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1809, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1810, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1817, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x181e, + 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, + 0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x0400, + 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, + 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, + 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, + 0x080c, 0x1d94, 0x1904, 0x1739, 0x900e, 0x0050, 0x080c, 0x0db4, + 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1d94, + 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, + 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa974, + 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, + 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, + 0x0804, 0x9b42, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, + 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003, + 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6, + 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x12f0, 0x8631, + 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, + 0xd09c, 0x190c, 0x12f0, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1933, + 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0db4, + 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1942, + 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x192f, 0x7827, 0x0015, + 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, + 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x6d14, + 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, + 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081, + 0x0066, 0x2031, 0x0000, 0x080c, 0x6dc4, 0x006e, 0x0005, 0x0479, + 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, + 0x00e6, 0x2071, 0x0200, 0x080c, 0x2911, 0x2009, 0x003c, 0x080c, + 0x2110, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, + 0x1de0, 0x080c, 0x7c7b, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, + 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, + 0x080c, 0x12ba, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, + 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, + 0x0000, 0x080c, 0x6d14, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, + 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, + 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, + 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, + 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, + 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c, + 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x14fc, 0x7930, + 0x0005, 0x2c08, 0x621c, 0x080c, 0x1529, 0x7930, 0x0005, 0x8001, + 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170, + 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x19a0, 0x2001, + 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0db4, 0x781f, 0x0202, + 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c, + 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186, + 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001, + 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140, + 0x2001, 0x0030, 0x080c, 0x1939, 0x9186, 0x0040, 0x190c, 0x0db4, + 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160, + 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080, + 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c, + 0x9184, 0x0007, 0x090c, 0x0db4, 0xa001, 0xa001, 0x781f, 0x0200, + 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a34, 0x2079, 0x0090, + 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, + 0x1904, 0x1a25, 0xa964, 0x9184, 0x0007, 0x0002, 0x19be, 0x1a10, + 0x19c5, 0x19c5, 0x19c5, 0x19f8, 0x19d8, 0x19c7, 0x2100, 0x9084, + 0x00ff, 0x9086, 0x0048, 0x0904, 0x1a10, 0x080c, 0x0db4, 0xa87c, + 0xd0b4, 0x0904, 0x1bd7, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, + 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1a18, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1d38, 0xa87c, 0xd0b4, + 0x0904, 0x1bd7, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, + 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, + 0x9084, 0x000f, 0x9080, 0x1dd6, 0x2005, 0xa812, 0xa988, 0x0448, + 0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, + 0x1bd7, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, + 0x1dd6, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, + 0xa87c, 0xd0b4, 0x0904, 0x1bd7, 0xa988, 0x9006, 0xa842, 0xa83e, + 0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080, 0x1dd6, 0x2005, + 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, + 0x0090, 0x782c, 0xd0fc, 0x190c, 0x1c18, 0x00e6, 0x2071, 0x1a34, + 0x7000, 0x9005, 0x1904, 0x1a7f, 0x7206, 0x9280, 0x0005, 0x204c, + 0x9280, 0x0004, 0x2004, 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, + 0x7803, 0x0040, 0x00fe, 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, + 0x00be, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, + 0x78d6, 0x00fe, 0xa814, 0x2050, 0xa858, 0x2040, 0xa810, 0x2060, + 0xa064, 0x90ec, 0x000f, 0xa944, 0x791a, 0x7116, 0xa848, 0x781e, + 0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0xa940, 0xa838, 0x9106, + 0x1188, 0xa93c, 0xa834, 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, + 0x2091, 0x8000, 0x00a1, 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, + 0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x1df6, + 0x004e, 0x003e, 0x0d50, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, + 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1bd0, + 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1bcf, + 0x9705, 0x0904, 0x1bcf, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, + 0x2d00, 0x0002, 0x1bb3, 0x1afa, 0x1afa, 0x1bb3, 0x1bb3, 0x1b96, + 0x1bb3, 0x1afa, 0x1b9c, 0x1b49, 0x1b49, 0x1bb3, 0x1bb3, 0x1bb3, + 0x1b90, 0x1b49, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, + 0xdd9c, 0x0904, 0x1bb5, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, + 0x9082, 0x001b, 0x0002, 0x1ae6, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, + 0x1ae4, 0x1aea, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1aee, + 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1af2, 0x1ae4, 0x1ae4, + 0x1ae4, 0x1ae4, 0x1ae4, 0x1af6, 0x080c, 0x0db4, 0xa774, 0xa678, + 0x0804, 0x1bb5, 0xa78c, 0xa690, 0x0804, 0x1bb5, 0xa7a4, 0xa6a8, + 0x0804, 0x1bb5, 0xa7bc, 0xa6c0, 0x0804, 0x1bb5, 0xa7d4, 0xa6d8, + 0x0804, 0x1bb5, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, + 0x001b, 0x0002, 0x1b1d, 0x1b1d, 0x1b1f, 0x1b1d, 0x1b1d, 0x1b1d, + 0x1b25, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b2b, 0x1b1d, 0x1b1d, 0x1b1d, + 0x1b31, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b37, 0x1b1d, 0x1b1d, 0x1b1d, + 0x1b3d, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b43, 0x080c, 0x0db4, 0xa574, + 0xa478, 0xa37c, 0xa280, 0x0804, 0x1bb5, 0xa584, 0xa488, 0xa38c, + 0xa290, 0x0804, 0x1bb5, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, + 0x1bb5, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1bb5, 0xa5b4, + 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1bb5, 0xa5c4, 0xa4c8, 0xa3cc, + 0xa2d0, 0x0804, 0x1bb5, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, + 0x1bb5, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, + 0x0002, 0x1b6c, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b74, + 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b7b, 0x1b6a, 0x1b6a, + 0x1b6a, 0x1b6a, 0x1b6a, 0x1b82, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, + 0x1b6a, 0x1b89, 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678, + 0xa37c, 0xa280, 0x0804, 0x1bb5, 0xa584, 0xa488, 0xa78c, 0xa690, + 0xa394, 0xa298, 0x04d0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, + 0xa2b0, 0x0498, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, + 0x0460, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0428, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x11e8, 0x080c, 0x1d94, + 0x1904, 0x1a95, 0x900e, 0x04a0, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0048, 0x190c, 0x0db4, 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086, + 0x0043, 0x00ce, 0x0904, 0x1b49, 0xab9c, 0x9016, 0xad8c, 0xac90, + 0xaf94, 0xae98, 0x0010, 0x080c, 0x0db4, 0x7b12, 0x7a16, 0x7d02, + 0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, + 0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, + 0x700e, 0x7010, 0x9201, 0x7012, 0x080c, 0x1d94, 0x0008, 0x9006, + 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, + 0x0db4, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, + 0x7003, 0x0000, 0x7004, 0x2060, 0x6014, 0x2048, 0x080c, 0xb793, + 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1180, + 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, + 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060, + 0x00c6, 0x080c, 0xb3e0, 0x00ce, 0x2001, 0x19c5, 0x2004, 0x9c06, + 0x1160, 0x2009, 0x0040, 0x080c, 0x2110, 0x080c, 0x9580, 0x2011, + 0x0000, 0x080c, 0x93fd, 0x080c, 0x8769, 0x002e, 0x0804, 0x1d46, + 0x0126, 0x2091, 0x2400, 0xa858, 0x2040, 0x792c, 0x782b, 0x0002, + 0x9184, 0x0700, 0x1904, 0x1bd9, 0x7000, 0x0002, 0x1d46, 0x1c2a, + 0x1c97, 0x1d44, 0x8001, 0x7002, 0xd19c, 0x1150, 0x8aff, 0x05b0, + 0x080c, 0x1a8f, 0x0904, 0x1d46, 0x080c, 0x1a8f, 0x0804, 0x1d46, + 0x782b, 0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, + 0x11d8, 0xa87c, 0xc0f5, 0xa87e, 0x00b8, 0x0026, 0x0036, 0xab3c, + 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, 0xa832, 0x9213, 0x7800, + 0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, + 0x1dac, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, + 0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1d46, 0x00f6, 0x0026, + 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, + 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, + 0x090c, 0x0db4, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e, + 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, + 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x002e, + 0x00fe, 0x782b, 0x0008, 0x7003, 0x0000, 0x0804, 0x1d46, 0x8001, + 0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1c1d, 0xd19c, + 0x1904, 0x1d42, 0x8aff, 0x0904, 0x1d46, 0x080c, 0x1a8f, 0x0804, + 0x1d46, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x1dac, 0xdd9c, + 0x1904, 0x1d01, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, + 0x001b, 0x0002, 0x1cd5, 0x1cd5, 0x1cd7, 0x1cd5, 0x1cd5, 0x1cd5, + 0x1cdd, 0x1cd5, 0x1cd5, 0x1cd5, 0x1ce3, 0x1cd5, 0x1cd5, 0x1cd5, + 0x1ce9, 0x1cd5, 0x1cd5, 0x1cd5, 0x1cef, 0x1cd5, 0x1cd5, 0x1cd5, + 0x1cf5, 0x1cd5, 0x1cd5, 0x1cd5, 0x1cfb, 0x080c, 0x0db4, 0xa07c, + 0x931a, 0xa080, 0x9213, 0x0804, 0x1c49, 0xa08c, 0x931a, 0xa090, + 0x9213, 0x0804, 0x1c49, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, + 0x1c49, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1c49, 0xa0bc, + 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1c49, 0xa0cc, 0x931a, 0xa0d0, + 0x9213, 0x0804, 0x1c49, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, + 0x1c49, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, + 0x0002, 0x1d24, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d2a, + 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d30, 0x1d22, 0x1d22, + 0x1d22, 0x1d22, 0x1d22, 0x1d36, 0x1d22, 0x1d22, 0x1d22, 0x1d22, + 0x1d22, 0x1d3c, 0x080c, 0x0db4, 0xa07c, 0x931a, 0xa080, 0x9213, + 0x0804, 0x1c49, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1c49, + 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1c49, 0xa0c4, 0x931a, + 0xa0c8, 0x9213, 0x0804, 0x1c49, 0xa0dc, 0x931a, 0xa0e0, 0x9213, + 0x0804, 0x1c49, 0x0804, 0x1c45, 0x080c, 0x0db4, 0x012e, 0x0005, + 0x00f6, 0x00e6, 0x2071, 0x1a34, 0x7000, 0x9086, 0x0000, 0x0904, + 0x1d91, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, + 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xd504, + 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0db4, 0x0016, 0x2009, + 0x0040, 0x080c, 0x2110, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, + 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, + 0x0040, 0x080c, 0x2110, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1c18, + 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, + 0x1de8, 0x2009, 0x0040, 0x080c, 0x2110, 0x782b, 0x0002, 0x7003, + 0x0000, 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, + 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, + 0x9084, 0x000f, 0x9080, 0x1dd6, 0x2065, 0x8cff, 0x090c, 0x0db4, + 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, + 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, + 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1de6, 0x2065, + 0x8cff, 0x090c, 0x0db4, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, + 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, + 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1dc9, + 0x1dc5, 0x0000, 0x0000, 0x1dd3, 0x0000, 0x1dc9, 0x1dd0, 0x1dd0, + 0x1dcd, 0x0000, 0x0000, 0x0000, 0x1dd3, 0x1dd0, 0x0000, 0x1dcb, + 0x1dcb, 0x0000, 0x0000, 0x1dd3, 0x0000, 0x1dcb, 0x1dd1, 0x1dd1, + 0x1dd1, 0x0000, 0x0000, 0x0000, 0x1dd3, 0x1dd1, 0x00c6, 0x00d6, + 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1fcd, 0x2940, + 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1dd6, 0x9d86, 0x0007, 0x0130, + 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x1fcd, + 0xa004, 0x9045, 0x0904, 0x1fcd, 0x0c18, 0x2c05, 0x9005, 0x0904, + 0x1eb5, 0xdd9c, 0x1904, 0x1e71, 0x908a, 0x0036, 0x1a0c, 0x0db4, + 0x9082, 0x001b, 0x0002, 0x1e46, 0x1e46, 0x1e48, 0x1e46, 0x1e46, + 0x1e46, 0x1e4e, 0x1e46, 0x1e46, 0x1e46, 0x1e54, 0x1e46, 0x1e46, + 0x1e46, 0x1e5a, 0x1e46, 0x1e46, 0x1e46, 0x1e60, 0x1e46, 0x1e46, + 0x1e46, 0x1e66, 0x1e46, 0x1e46, 0x1e46, 0x1e6c, 0x080c, 0x0db4, + 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1eab, 0xa08c, 0x9422, + 0xa090, 0x931b, 0x0804, 0x1eab, 0xa09c, 0x9422, 0xa0a0, 0x931b, + 0x0804, 0x1eab, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1eab, + 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1eab, 0xa0cc, 0x9422, + 0xa0d0, 0x931b, 0x0804, 0x1eab, 0xa0dc, 0x9422, 0xa0e0, 0x931b, + 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, + 0x1e93, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e98, 0x1e91, + 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e9d, 0x1e91, 0x1e91, 0x1e91, + 0x1e91, 0x1e91, 0x1ea2, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e91, + 0x1ea7, 0x080c, 0x0db4, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, + 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, + 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, + 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51, + 0x0904, 0x1fcd, 0x8c60, 0x0804, 0x1e1d, 0xa004, 0x9045, 0x0904, + 0x1fcd, 0x0804, 0x1e00, 0x8a51, 0x0904, 0x1fcd, 0x8c60, 0x2c05, + 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x1fcd, 0xa064, 0x90ec, + 0x000f, 0x9de0, 0x1dd6, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, + 0x0804, 0x1fc2, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, + 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1f5f, 0x9082, 0x001b, 0x0002, + 0x1efb, 0x1efb, 0x1efd, 0x1efb, 0x1efb, 0x1efb, 0x1f0b, 0x1efb, + 0x1efb, 0x1efb, 0x1f19, 0x1efb, 0x1efb, 0x1efb, 0x1f27, 0x1efb, + 0x1efb, 0x1efb, 0x1f35, 0x1efb, 0x1efb, 0x1efb, 0x1f43, 0x1efb, + 0x1efb, 0x1efb, 0x1f51, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa074, 0x9420, 0xa078, + 0x9319, 0x0804, 0x1fbd, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, + 0x911b, 0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, + 0x1fbd, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, + 0x0db4, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1fbd, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0a4, + 0x9420, 0xa0a8, 0x9319, 0x0804, 0x1fbd, 0xa1bc, 0x2400, 0x9122, + 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0b4, 0x9420, 0xa0b8, + 0x9319, 0x0804, 0x1fbd, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, + 0x911b, 0x0a0c, 0x0db4, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, + 0x1fbd, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0db4, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1fbd, 0x9082, + 0x001b, 0x0002, 0x1f7d, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, + 0x1f8a, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f97, 0x1f7b, + 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1fa4, 0x1f7b, 0x1f7b, 0x1f7b, + 0x1f7b, 0x1f7b, 0x1fb1, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122, + 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa06c, 0x9420, 0xa070, + 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, + 0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, + 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa09c, + 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, + 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0b4, 0x9420, 0xa0b8, 0x9319, + 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, + 0x0db4, 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, + 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, + 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, + 0x9085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, + 0x0dad, 0x9084, 0x0007, 0x0002, 0x1fee, 0x1c18, 0x1fee, 0x1fe4, + 0x1fe7, 0x1fea, 0x1fe7, 0x1fea, 0x080c, 0x1c18, 0x0005, 0x080c, + 0x1186, 0x0005, 0x080c, 0x1c18, 0x080c, 0x1186, 0x0005, 0x0126, + 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, + 0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, + 0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, + 0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, + 0x781c, 0xd0a4, 0x190c, 0x210d, 0x7900, 0xd1dc, 0x1118, 0x9084, + 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x2035, 0x202d, 0x7696, + 0x202d, 0x202f, 0x202f, 0x202f, 0x202f, 0x767c, 0x202d, 0x2031, + 0x202d, 0x202f, 0x202d, 0x202f, 0x202d, 0x080c, 0x0db4, 0x0031, + 0x0020, 0x080c, 0x767c, 0x080c, 0x7696, 0x0005, 0x0006, 0x0016, + 0x0026, 0x080c, 0xd504, 0x7930, 0x9184, 0x0003, 0x01c0, 0x2001, + 0x19c5, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, 0x9005, + 0x090c, 0x0db4, 0x00c6, 0x2001, 0x19c5, 0x2064, 0x080c, 0xb3e0, + 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2110, 0x00d0, 0x9184, + 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x6d14, + 0x1138, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46, 0x0010, + 0x080c, 0x5953, 0x080c, 0x7734, 0x0041, 0x0018, 0x9184, 0x9540, + 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, + 0x0056, 0x2071, 0x1a31, 0x080c, 0x18a6, 0x005e, 0x004e, 0x003e, + 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, + 0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 0x2102, 0x2001, 0x013b, + 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, 0x0200, + 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, 0x2320, + 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, 0x8423, + 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, 0x8003, + 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, + 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, + 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, 0x9182, + 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, 0x9182, + 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, 0x2011, + 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, 0x9402, + 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, 0x012e, + 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, + 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, + 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, + 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, + 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, 0x0dad, + 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, + 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, + 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, + 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x290b, 0x080c, 0x2826, + 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, + 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, 0x9085, + 0x2000, 0x6052, 0x2009, 0x196c, 0x2011, 0x196d, 0x6358, 0x939c, + 0x38f0, 0x2320, 0x080c, 0x286a, 0x1238, 0x939d, 0x4003, 0x94a5, + 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, + 0x230a, 0x2412, 0x9006, 0x080c, 0x2855, 0x9006, 0x080c, 0x2838, + 0x20a9, 0x0012, 0x1d04, 0x2162, 0x2091, 0x6000, 0x1f04, 0x2162, + 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, + 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x2544, 0x2009, 0x00ef, + 0x6132, 0x6136, 0x080c, 0x2554, 0x60e7, 0x0000, 0x61ea, 0x60e3, + 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, + 0x0000, 0x6007, 0x149f, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, + 0x0000, 0x1f04, 0x218f, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, + 0x0012, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, + 0x001e, 0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, + 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, + 0x00fe, 0x0005, 0x2001, 0x1834, 0x2003, 0x0000, 0x2001, 0x1833, + 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, + 0x0026, 0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, + 0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x21ef, 0x21d5, 0x21d8, + 0x21db, 0x21e0, 0x21e2, 0x21e6, 0x21ea, 0x080c, 0x7ff8, 0x00b8, + 0x080c, 0x80c5, 0x00a0, 0x080c, 0x80c5, 0x080c, 0x7ff8, 0x0078, + 0x0099, 0x0068, 0x080c, 0x7ff8, 0x0079, 0x0048, 0x080c, 0x80c5, + 0x0059, 0x0028, 0x080c, 0x80c5, 0x080c, 0x7ff8, 0x0029, 0x002e, + 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, + 0x0118, 0xd19c, 0x1904, 0x243d, 0xd1f4, 0x190c, 0x0dad, 0x080c, + 0x6d14, 0x0904, 0x224a, 0x080c, 0xbe86, 0x1120, 0x7000, 0x9086, + 0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x6d37, + 0x0118, 0x080c, 0x6d25, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, + 0x080c, 0xbe86, 0x0168, 0x080c, 0x6d37, 0x1150, 0x2001, 0x1976, + 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6b95, 0x0804, 0x2440, + 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, 0x0140, + 0x080c, 0x6d6b, 0x00de, 0x1904, 0x2440, 0x080c, 0x7002, 0x0428, + 0x080c, 0x6d37, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, + 0x080c, 0x7002, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46, + 0x0804, 0x243d, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, + 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, 0x0028, + 0x1110, 0x080c, 0x6ee7, 0x0804, 0x243d, 0x080c, 0x6ffd, 0x0048, + 0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x6e4d, 0x0804, + 0x243d, 0x080c, 0x6f81, 0x0804, 0x243d, 0xd1ac, 0x0904, 0x235e, + 0x080c, 0x6d14, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036, + 0x080c, 0x6d2e, 0x1158, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c, + 0x6c46, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, + 0x000e, 0x080c, 0x6cec, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, + 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, + 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, + 0xf800, 0x1160, 0x7044, 0xd084, 0x1148, 0xc085, 0x7046, 0x0036, + 0x2418, 0x2011, 0x8016, 0x080c, 0x46b9, 0x003e, 0x080c, 0xbe7f, + 0x1904, 0x233b, 0x9196, 0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff, + 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, + 0x080c, 0x2fd4, 0x0128, 0xc18d, 0x7132, 0x080c, 0x630d, 0x1510, + 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, + 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x233b, 0x7038, 0xd08c, + 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x233b, 0xc1ad, + 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x46b9, 0x003e, + 0x0804, 0x233b, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, + 0xd1ac, 0x1904, 0x233b, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, + 0x8013, 0x080c, 0x46b9, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, + 0x1854, 0x220c, 0x00f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, + 0x080c, 0x7f4a, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, + 0xd104, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x2fd9, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xd188, + 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, + 0x080c, 0x2e4a, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, + 0x900e, 0x080c, 0x5ff1, 0x1110, 0x080c, 0x5aae, 0x8108, 0x1f04, + 0x2331, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x9a4e, 0x60e3, + 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, + 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, + 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, + 0x2001, 0x1825, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0904, + 0x243d, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x23e6, 0x080c, 0x7dd3, + 0x080c, 0x90c1, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19bf, 0x2304, + 0x907d, 0x0904, 0x23b5, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, + 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, + 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, + 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x29cc, 0x2001, + 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x28e6, 0x6904, + 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, + 0x080c, 0x29bc, 0x080c, 0x8589, 0x080c, 0x868e, 0x7814, 0x2048, + 0xa867, 0x0103, 0x2f60, 0x080c, 0x9ac8, 0x009e, 0x00ee, 0x00ce, + 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, + 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x29cc, 0x00de, + 0x00c6, 0x2061, 0x19b6, 0x6028, 0x080c, 0xbe86, 0x0120, 0x909a, + 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, + 0x00ce, 0x080c, 0x909d, 0x0804, 0x243c, 0x2061, 0x0100, 0x62c0, + 0x080c, 0x98d9, 0x2019, 0x19bf, 0x2304, 0x9065, 0x0120, 0x2009, + 0x0027, 0x080c, 0x9b42, 0x00ce, 0x0804, 0x243c, 0xd2bc, 0x0904, + 0x2429, 0x080c, 0x7de0, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010, + 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, + 0x4000, 0x0110, 0x080c, 0x29cc, 0x00de, 0x00c6, 0x2061, 0x19b6, + 0x6044, 0x080c, 0xbe86, 0x0120, 0x909a, 0x0003, 0x1628, 0x0018, + 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, + 0x0558, 0x2009, 0x07d0, 0x080c, 0x7dd8, 0x9080, 0x0008, 0x2004, + 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, 0x1984, 0x918d, 0x0012, + 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, 0x918d, 0x0016, 0x6116, + 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c, + 0x935a, 0x003e, 0x2019, 0x19c5, 0x2304, 0x9065, 0x0120, 0x2009, + 0x004f, 0x080c, 0x9b42, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x24af, + 0x7038, 0xd0ac, 0x1904, 0x2484, 0x0016, 0x0156, 0x6027, 0x0008, + 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, + 0x080c, 0x2905, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, + 0x2457, 0x080c, 0x7e07, 0x1f04, 0x2457, 0x6050, 0x9085, 0x0400, + 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x2465, + 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x246e, + 0x080c, 0x7e07, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, + 0x6027, 0x0008, 0x04a0, 0x080c, 0x28cd, 0x1f04, 0x246e, 0x015e, + 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, + 0x080c, 0x9a4e, 0x60e3, 0x0000, 0x080c, 0xd4e3, 0x080c, 0xd4fe, + 0x080c, 0x5157, 0xd0fc, 0x1138, 0x080c, 0xbe7f, 0x1120, 0x9085, + 0x0001, 0x080c, 0x6d5b, 0x9006, 0x080c, 0x29bc, 0x2009, 0x0002, + 0x080c, 0x290b, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, 0x080c, + 0x0e80, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b8f, 0x001e, 0x918c, + 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc, + 0x70ce, 0x9116, 0x0904, 0x2503, 0x81ff, 0x01a0, 0x2009, 0x0000, + 0x080c, 0x290b, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, + 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, + 0x46b9, 0x0448, 0x2001, 0x1977, 0x200c, 0x81ff, 0x1140, 0x2001, + 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, + 0x2011, 0x8012, 0x080c, 0x46b9, 0x080c, 0x0e80, 0x080c, 0x5157, + 0xd0fc, 0x1188, 0x080c, 0xbe7f, 0x1170, 0x00c6, 0x080c, 0x259f, + 0x080c, 0x92c1, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, + 0x080c, 0x2e4a, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, + 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, + 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, 0x11c8, 0x81ff, + 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, 0x2011, 0x181f, + 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011, + 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, + 0x2500, 0x080c, 0x7975, 0x0048, 0x9584, 0x00ff, 0x9080, 0x2fd9, + 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x2fd9, + 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, + 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, + 0x1f04, 0x254f, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, + 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, + 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, + 0x000f, 0x9080, 0xd9b8, 0x2005, 0x6856, 0x8211, 0x1f04, 0x2564, + 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800, 0x6030, + 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, + 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0x9116, + 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, + 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x2594, 0x680f, + 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, + 0x5153, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, + 0x2009, 0x002e, 0x080c, 0xd188, 0x004e, 0x0005, 0x00f6, 0x0016, + 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x260b, 0x080c, + 0x286a, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, 0x2011, + 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011, 0x8000, + 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009, 0x0001, + 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002, 0x00b0, + 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078, 0x908e, + 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084, 0x0700, + 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300, 0x9080, + 0x0020, 0x2018, 0x080c, 0x7f8b, 0x928c, 0xff00, 0x0110, 0x2011, + 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, + 0x220a, 0x080c, 0x6d14, 0x1118, 0x2009, 0x193e, 0x220a, 0x002e, + 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, + 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, + 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0dad, 0x002e, 0x001e, + 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004, 0xd0dc, 0x0168, + 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, 0x004c, 0x1128, + 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, 0x2001, 0x0227, + 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001, 0x0226, + 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005, 0x0018, + 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800, 0x0156, + 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x195f, 0x2004, 0x908a, + 0x0007, 0x1a0c, 0x0db4, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, + 0x015e, 0x0005, 0x2669, 0x2687, 0x26ab, 0x26ad, 0x26d6, 0x26d8, + 0x26da, 0x2001, 0x0001, 0x080c, 0x24b4, 0x080c, 0x28c8, 0x2001, + 0x1961, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, + 0x20a9, 0x0009, 0x080c, 0x2886, 0x2001, 0x195f, 0x2003, 0x0006, + 0x2009, 0x001e, 0x2011, 0x26db, 0x080c, 0x7de5, 0x0005, 0x2009, + 0x1964, 0x200b, 0x0000, 0x2001, 0x1969, 0x2003, 0x0036, 0x2001, + 0x1968, 0x2003, 0x002a, 0x2001, 0x1961, 0x2003, 0x0001, 0x9006, + 0x080c, 0x2838, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2886, + 0x2001, 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x26db, + 0x080c, 0x7de5, 0x0005, 0x080c, 0x0db4, 0x2001, 0x1969, 0x2003, + 0x0036, 0x2001, 0x1961, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, + 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, + 0x2838, 0x2001, 0x1965, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, + 0x0009, 0x080c, 0x2886, 0x2001, 0x195f, 0x2003, 0x0006, 0x2009, + 0x001e, 0x2011, 0x26db, 0x080c, 0x7de5, 0x0005, 0x080c, 0x0db4, + 0x080c, 0x0db4, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, + 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1961, + 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0db4, 0x0043, 0x012e, 0x015e, + 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x26fd, 0x271d, + 0x275d, 0x278d, 0x27b1, 0x27c1, 0x27c3, 0x080c, 0x287a, 0x11b0, + 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1967, 0x2104, 0x7a38, + 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, + 0x200a, 0x2001, 0x195f, 0x2003, 0x0001, 0x0030, 0x080c, 0x27e7, + 0x2001, 0xffff, 0x080c, 0x2678, 0x0005, 0x080c, 0x27c5, 0x05e0, + 0x2009, 0x1968, 0x2104, 0x8001, 0x200a, 0x080c, 0x287a, 0x1178, + 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296, + 0x0005, 0x0518, 0x2009, 0x1967, 0x2104, 0xc085, 0x200a, 0x2009, + 0x1964, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, + 0x27cd, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, + 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2855, + 0x2001, 0x1961, 0x2003, 0x0002, 0x0028, 0x2001, 0x195f, 0x2003, + 0x0003, 0x0010, 0x080c, 0x269a, 0x0005, 0x080c, 0x27c5, 0x0560, + 0x2009, 0x1968, 0x2104, 0x8001, 0x200a, 0x080c, 0x287a, 0x1168, + 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x195f, 0x2003, 0x0003, + 0x2001, 0x1960, 0x2003, 0x0000, 0x00b8, 0x2009, 0x1968, 0x2104, + 0x9005, 0x1118, 0x080c, 0x280a, 0x0010, 0x080c, 0x27da, 0x080c, + 0x27cd, 0x2009, 0x1964, 0x200b, 0x0000, 0x2001, 0x1961, 0x2003, + 0x0001, 0x080c, 0x269a, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c, + 0x287a, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1965, + 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, + 0x196a, 0x2003, 0x000a, 0x2009, 0x1967, 0x2104, 0xc0fd, 0x200a, + 0x0038, 0x0419, 0x2001, 0x1961, 0x2003, 0x0004, 0x080c, 0x26c5, + 0x0005, 0x0099, 0x0168, 0x080c, 0x287a, 0x1138, 0x7850, 0x9084, + 0xefff, 0x7852, 0x080c, 0x26b1, 0x0018, 0x0079, 0x080c, 0x26c5, + 0x0005, 0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x1969, 0x2104, + 0x8001, 0x200a, 0x090c, 0x2826, 0x0005, 0x7a38, 0x9294, 0x0005, + 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, + 0x2855, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2838, 0x0005, 0x2009, + 0x1964, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0108, 0x0068, + 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, + 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005, + 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, + 0x2855, 0x0005, 0x0086, 0x2001, 0x1967, 0x2004, 0x9084, 0x7fff, + 0x090c, 0x0db4, 0x2009, 0x1966, 0x2144, 0x8846, 0x280a, 0x9844, + 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0db4, 0x9006, + 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, + 0x2001, 0x195f, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, + 0x282c, 0x2001, 0x1966, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, + 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, + 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196c, 0x210c, 0x795a, + 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, + 0x196d, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, + 0x9085, 0x0000, 0x0138, 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, + 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, + 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, + 0x000e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, + 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2905, + 0xd09c, 0x1110, 0x1f04, 0x287d, 0x015e, 0x0005, 0x0126, 0x0016, + 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040, 0x7852, 0x7850, + 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2905, 0x9085, 0x2000, 0x7852, + 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007, 0x0090, + 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186, 0x0002, + 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118, 0x783b, + 0x0004, 0x0000, 0x0006, 0x1d04, 0x28b3, 0x080c, 0x7e07, 0x1f04, + 0x28b3, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, + 0x2905, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, 0x012e, 0x0005, + 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, 0x0156, 0x00f6, + 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820, + 0xd0e4, 0x1140, 0x1f04, 0x28d7, 0x0028, 0x7854, 0xd08c, 0x1110, + 0x1f04, 0x28dd, 0x00fe, 0x015e, 0x000e, 0x0005, 0x1d04, 0x28e6, + 0x080c, 0x7e07, 0x1f04, 0x28e6, 0x0005, 0x0006, 0x2001, 0x196b, + 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0x196b, + 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, 0x2001, 0x196b, + 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, 0xa001, 0xa001, + 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1977, 0x2102, 0x000e, + 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, + 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, 0x0005, 0x0036, + 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x2000, + 0x0118, 0x9186, 0x0100, 0x1588, 0x2009, 0x00a2, 0x080c, 0x0e2f, + 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009, 0x0169, 0x2104, + 0x9084, 0x0007, 0x210c, 0x918c, 0x0007, 0x910e, 0x1db0, 0x9086, + 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, 0x1d60, 0x8211, 0x1d68, + 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, 0x9186, + 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, 0xc0dd, 0x200a, 0x0008, + 0x0419, 0x2009, 0x0000, 0x080c, 0x0e2f, 0x004e, 0x003e, 0x0005, + 0x2001, 0x180c, 0x2004, 0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, + 0x9005, 0x0140, 0x2001, 0x0141, 0x2004, 0x9084, 0xff00, 0x9086, + 0x0100, 0x1148, 0x0126, 0x2091, 0x8000, 0x0016, 0x0026, 0x0021, + 0x002e, 0x001e, 0x012e, 0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, + 0x0006, 0x2001, 0x0161, 0x2003, 0x0000, 0x6017, 0x0018, 0xa001, + 0xa001, 0x602f, 0x0008, 0x6104, 0x918e, 0x0010, 0x6106, 0x918e, + 0x0010, 0x6106, 0x6017, 0x0040, 0x04b9, 0x001e, 0x9184, 0x0003, + 0x01e0, 0x0036, 0x0016, 0x2019, 0x0141, 0x6124, 0x918c, 0x0028, + 0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4, + 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, 0x6016, 0x9184, 0x0002, + 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, 0x2001, 0x180c, 0x200c, + 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x080c, 0x6d2e, + 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, + 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, + 0x2114, 0x9294, 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, + 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, + 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, + 0x2009, 0x0140, 0x2104, 0x1128, 0x080c, 0x6d2e, 0x0110, 0xc0bc, + 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x2c62, 0x2c62, + 0x2a86, 0x2a86, 0x2a92, 0x2a92, 0x2a9e, 0x2a9e, 0x2aac, 0x2aac, + 0x2ab8, 0x2ab8, 0x2ac6, 0x2ac6, 0x2ad4, 0x2ad4, 0x2ae6, 0x2ae6, + 0x2af2, 0x2af2, 0x2b00, 0x2b00, 0x2b1e, 0x2b1e, 0x2b3e, 0x2b3e, + 0x2b0e, 0x2b0e, 0x2b2e, 0x2b2e, 0x2b4c, 0x2b4c, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2b5e, 0x2b5e, + 0x2b6a, 0x2b6a, 0x2b78, 0x2b78, 0x2b86, 0x2b86, 0x2b96, 0x2b96, + 0x2ba4, 0x2ba4, 0x2bb4, 0x2bb4, 0x2bc4, 0x2bc4, 0x2bd6, 0x2bd6, + 0x2be4, 0x2be4, 0x2bf4, 0x2bf4, 0x2c16, 0x2c16, 0x2c38, 0x2c38, + 0x2c04, 0x2c04, 0x2c27, 0x2c27, 0x2c47, 0x2c47, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21bb, + 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1fd3, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, + 0x080c, 0x21bb, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x200e, 0x0804, 0x2c5a, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x21bb, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, 0x080c, 0x21bb, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0xa001, 0x0cf0, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12f0, + 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x0804, 0x2c5a, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x1fd3, 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21bb, + 0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, + 0x080c, 0x21bb, 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, + 0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12f0, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, 0x080c, 0x21bb, + 0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, + 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb, 0x0804, 0x2c5a, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x260e, 0x080c, 0x1fd3, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, + 0x080c, 0x1fd3, 0x080c, 0x21bb, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3, + 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3, + 0x080c, 0x21bb, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, + 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb, + 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3, + 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb, + 0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, + 0x080c, 0x1fd3, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x0498, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x260e, 0x080c, 0x1fd3, 0x080c, 0x12f0, 0x080c, 0x200e, 0x0410, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x260e, 0x080c, 0x12f0, 0x080c, 0x200e, 0x0098, 0x0106, + 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, + 0x260e, 0x080c, 0x1fd3, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x080c, + 0x200e, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, + 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, + 0x080c, 0x62d3, 0x1904, 0x2d66, 0x72d8, 0x2001, 0x194d, 0x2004, + 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, + 0x2d66, 0x080c, 0x2d6b, 0x0804, 0x2d66, 0xd2cc, 0x1904, 0x2d66, + 0x080c, 0x6d14, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2d66, 0xd294, + 0x0120, 0x70ab, 0xffff, 0x0804, 0x2d66, 0x080c, 0x2fcf, 0x0160, + 0x080c, 0xbe86, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2cf8, + 0x70ab, 0xffff, 0x0804, 0x2d66, 0x2001, 0x1817, 0x203c, 0x7290, + 0xd284, 0x0904, 0x2cf8, 0xd28c, 0x1904, 0x2cf8, 0x0036, 0x73a8, + 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, + 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, + 0x9084, 0x00ff, 0x970e, 0x0590, 0x908e, 0x0000, 0x0578, 0x908e, + 0x00ff, 0x1150, 0x7230, 0xd284, 0x1570, 0x7290, 0xc28d, 0x7292, + 0x70ab, 0xffff, 0x003e, 0x0460, 0x0026, 0x2011, 0x0010, 0x080c, + 0x6339, 0x002e, 0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c, + 0x250b, 0x080c, 0x5f91, 0x11a8, 0x080c, 0x6315, 0x1150, 0x7030, + 0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2d84, 0x0148, + 0x0028, 0x080c, 0x2ec0, 0x080c, 0x2db0, 0x0118, 0x8318, 0x0804, + 0x2cad, 0x73aa, 0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2d66, + 0x9780, 0x2fd9, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, + 0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, + 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70ab, 0xffff, 0x0804, + 0x2d66, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x2d5b, 0x0026, + 0x2011, 0x0010, 0x080c, 0x6339, 0x002e, 0x0120, 0x2009, 0xffff, + 0x0804, 0x2d63, 0xc484, 0x080c, 0x5ff1, 0x0138, 0x080c, 0xbe86, + 0x1590, 0x080c, 0x5f91, 0x15b8, 0x0008, 0xc485, 0x080c, 0x6315, + 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290, + 0xd28c, 0x0180, 0x080c, 0x6315, 0x9082, 0x0006, 0x02e0, 0xd484, + 0x1118, 0x080c, 0x5fb5, 0x0028, 0x080c, 0x2f4b, 0x01a0, 0x080c, + 0x2f76, 0x0088, 0x080c, 0x2ec0, 0x080c, 0xbe86, 0x1160, 0x080c, + 0x2db0, 0x0188, 0x0040, 0x080c, 0xbe86, 0x1118, 0x080c, 0x2f4b, + 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2d11, + 0x70ab, 0xffff, 0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e, + 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009, + 0x007e, 0x080c, 0x5f91, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, + 0x080c, 0x2ec0, 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c, + 0xbbd8, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, + 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9b15, + 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x6023, 0x0001, 0x9006, + 0x080c, 0x5f2e, 0x2001, 0x0000, 0x080c, 0x5f42, 0x0126, 0x2091, + 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c, + 0x9b42, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, + 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, + 0x00ff, 0xb842, 0x080c, 0x9b15, 0x0548, 0x2b00, 0x6012, 0xb800, + 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, + 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x2e7f, 0x080c, 0xbc01, + 0x6023, 0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, + 0x5f42, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, + 0x2009, 0x0002, 0x080c, 0x9b42, 0x9085, 0x0001, 0x00ce, 0x00de, + 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, + 0x080c, 0x5f91, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, + 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, + 0x0076, 0x00d6, 0x00c6, 0x080c, 0x9a72, 0x01d0, 0x2b00, 0x6012, + 0x080c, 0xbc01, 0x6023, 0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001, + 0x0002, 0x080c, 0x5f42, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000, + 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, 0x9b42, 0x9085, 0x0001, + 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, + 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x5f91, 0x11b8, 0xb813, + 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, 0x080c, 0x9a72, 0x0170, + 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbc01, + 0x2009, 0x0022, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00de, + 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, + 0x21f0, 0x080c, 0x8297, 0x080c, 0x8226, 0x080c, 0x9920, 0x080c, + 0xaa0d, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, + 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5ff1, 0x1140, + 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5aae, + 0x001e, 0x8108, 0x1f04, 0x2e64, 0x9686, 0x0001, 0x190c, 0x2fa3, + 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, + 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, + 0x0026, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000, + 0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x001e, 0xba10, + 0xbb14, 0x080c, 0x5aae, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, + 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, + 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, + 0x70a4, 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, + 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, + 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, + 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, + 0x0001, 0x0080, 0x080c, 0x5153, 0xd0c4, 0x0148, 0x0040, 0x9006, + 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xd188, 0x004e, 0x20a9, + 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x2f2b, 0x928e, + 0x007f, 0x0904, 0x2f2b, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, + 0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x195d, 0x0006, + 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, + 0x2158, 0x2001, 0x0001, 0x080c, 0x62df, 0x00ce, 0x00be, 0x2019, + 0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000, 0x080c, 0x8184, + 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, + 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, + 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, + 0xcef9, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x2ee2, 0x015e, + 0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, + 0x0046, 0x0026, 0x0016, 0x080c, 0x5153, 0xd0c4, 0x0140, 0xd0a4, + 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xd188, 0x001e, + 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7290, + 0x82ff, 0x01e8, 0x080c, 0x630d, 0x11d0, 0x2100, 0x080c, 0x253e, + 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, + 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, + 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, + 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e, + 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, + 0x1a77, 0x001e, 0x6112, 0x080c, 0x2e7f, 0x001e, 0x080c, 0x5fb5, + 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, + 0x95bc, 0x080c, 0xd43b, 0x002e, 0x001e, 0x0005, 0x2001, 0x1836, + 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6d14, 0x1118, + 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6d14, 0x1110, + 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, + 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x5fb5, 0x8108, + 0x1f04, 0x2fb4, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, 0x9084, + 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, + 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, 0x2214, 0xd2ec, + 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, + 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, + 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, + 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, + 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, + 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, + 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, + 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, + 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, + 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, + 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, + 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, + 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, + 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, + 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, + 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, + 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, + 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, + 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, + 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, + 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, + 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, + 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, + 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, + 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, + 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, + 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x2071, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, + 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, + 0x18b0, 0x7007, 0x0001, 0x080c, 0x1005, 0x090c, 0x0db4, 0x2900, + 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1005, 0x090c, + 0x0db4, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, + 0x2071, 0x1894, 0x7004, 0x0002, 0x3108, 0x3109, 0x311c, 0x3130, + 0x0005, 0x1004, 0x3119, 0x0e04, 0x3119, 0x2079, 0x0000, 0x0126, + 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, + 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18ae, + 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, + 0x3204, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, + 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, + 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, + 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, + 0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a, + 0x003f, 0x1a04, 0x3201, 0x61cc, 0x0804, 0x3196, 0x31d8, 0x3210, + 0x321a, 0x321e, 0x3228, 0x322e, 0x3232, 0x3242, 0x3245, 0x324f, + 0x3254, 0x3259, 0x3264, 0x326f, 0x327e, 0x328d, 0x329b, 0x32b2, + 0x32cd, 0x3201, 0x3376, 0x33b4, 0x345a, 0x346b, 0x348e, 0x3201, + 0x3201, 0x3201, 0x34c6, 0x34e2, 0x34eb, 0x351a, 0x3520, 0x3201, + 0x3566, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3571, 0x357a, + 0x3582, 0x3584, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, + 0x35b0, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x35cd, 0x3628, + 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x0002, 0x3652, + 0x3655, 0x36b4, 0x36cd, 0x36fd, 0x399b, 0x3201, 0x4d2c, 0x3201, + 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x324f, + 0x3254, 0x3ebc, 0x5177, 0x3ed2, 0x4dbb, 0x4e0c, 0x4f0f, 0x3201, + 0x4f71, 0x4fad, 0x4fde, 0x50e2, 0x500b, 0x5062, 0x3201, 0x3ed6, + 0x4077, 0x408d, 0x40b2, 0x4117, 0x418b, 0x41ab, 0x4222, 0x4233, + 0x424b, 0x424e, 0x4273, 0x42e6, 0x434c, 0x4354, 0x4486, 0x45e3, + 0x4617, 0x4861, 0x3201, 0x487f, 0x493e, 0x4a14, 0x3201, 0x3201, + 0x3201, 0x3201, 0x4a7a, 0x4a95, 0x4354, 0x4cdb, 0x714c, 0x0000, + 0x2021, 0x4000, 0x080c, 0x4695, 0x0126, 0x2091, 0x8000, 0x0e04, + 0x31e2, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, + 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, + 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x117e, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, + 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, + 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, + 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, + 0x0804, 0x46a2, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, + 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x46a5, + 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x31d8, 0x7984, 0x2114, + 0x0804, 0x31d8, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, + 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, + 0x0804, 0x31d8, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, + 0x0002, 0x2019, 0x0015, 0x789b, 0x0317, 0x0804, 0x31d8, 0x2039, + 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, + 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x320d, 0x2138, + 0x7d98, 0x7c9c, 0x0804, 0x3214, 0x79a0, 0x9182, 0x0040, 0x0210, + 0x0804, 0x320d, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3222, 0x79a0, + 0x9182, 0x0040, 0x0210, 0x0804, 0x320d, 0x21e8, 0x7984, 0x7888, + 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x31d8, 0x2061, 0x0800, + 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, + 0x9005, 0x0904, 0x31d8, 0x0804, 0x3207, 0x79a0, 0x9182, 0x0040, + 0x0210, 0x0804, 0x320d, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, + 0x4012, 0x0804, 0x31d8, 0x2069, 0x1853, 0x7884, 0x7990, 0x911a, + 0x1a04, 0x320d, 0x8019, 0x0904, 0x320d, 0x684a, 0x6942, 0x788c, + 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x7029, + 0x0804, 0x31d8, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, 0x1a04, + 0x320d, 0x8019, 0x0904, 0x320d, 0x684e, 0x6946, 0x788c, 0x6862, + 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, + 0x080c, 0x63ca, 0x012e, 0x0804, 0x31d8, 0x902e, 0x2520, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x7984, 0x7b88, 0x7a8c, + 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101, 0x080c, + 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x2009, 0x0020, + 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f, 0x32f1, + 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, + 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, + 0x0120, 0x9096, 0x0029, 0x1904, 0x320a, 0x810f, 0x918c, 0x00ff, + 0x0904, 0x320a, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, + 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x2009, 0x0020, + 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, + 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, + 0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f, 0x332f, 0x0005, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, + 0x320a, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, + 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, + 0x5ba0, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, + 0x0050, 0x080c, 0x5ea7, 0x1128, 0x7007, 0x0003, 0x701f, 0x335b, + 0x0005, 0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, + 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210, 0x9399, + 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, + 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x46a5, 0x2091, 0x8000, + 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, 0x4953, + 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7892, + 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, + 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, 0x2091, + 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, + 0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, + 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, + 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x320a, 0x7984, + 0x080c, 0x5ff1, 0x1904, 0x320d, 0x7e98, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x1a04, 0x320d, 0x7c88, 0x7d8c, 0x080c, 0x6154, 0x080c, + 0x6123, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, + 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, + 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, + 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x320a, 0x0c30, 0x080c, + 0xb3e0, 0x012e, 0x0904, 0x320a, 0x0804, 0x31d8, 0x900e, 0x2001, + 0x0005, 0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x080c, 0xba81, + 0x080c, 0x65f2, 0x012e, 0x0804, 0x31d8, 0x00a6, 0x2950, 0xb198, + 0x080c, 0x5ff1, 0x1904, 0x3447, 0xb6a4, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6154, 0x080c, 0x6123, + 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, + 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, + 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x1819, + 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb3e0, + 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, + 0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x080c, 0xba81, 0x080c, + 0x65e5, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae, + 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48, + 0x00ae, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, 0x0904, + 0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x615a, 0x0904, + 0x320a, 0x0804, 0x41a2, 0x81ff, 0x1904, 0x320a, 0x080c, 0x468c, + 0x0904, 0x320d, 0x080c, 0x61e8, 0x0904, 0x320a, 0x2019, 0x0005, + 0x79a8, 0x080c, 0x6175, 0x0904, 0x320a, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x320d, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7d64, + 0x7984, 0xd184, 0x1904, 0x31d8, 0x0804, 0x41a2, 0x0126, 0x2091, + 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, + 0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x5ff1, 0x11d8, + 0x080c, 0x61e8, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, + 0x2019, 0x0004, 0x900e, 0x080c, 0x6175, 0x1118, 0x2009, 0x0006, + 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, + 0x9108, 0x080c, 0x7d64, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x31d8, + 0x012e, 0x0804, 0x320a, 0x012e, 0x0804, 0x320d, 0x080c, 0x4670, + 0x0904, 0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0xbaa0, 0x2019, + 0x0005, 0x00c6, 0x9066, 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, + 0x8184, 0x900e, 0x080c, 0xcef9, 0x007e, 0x00ce, 0x080c, 0x6154, + 0x0804, 0x31d8, 0x080c, 0x4670, 0x0904, 0x320d, 0x080c, 0x6154, + 0x2208, 0x0804, 0x31d8, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1906, + 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, + 0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, + 0x0059, 0x9210, 0x8d68, 0x1f04, 0x34fc, 0x2300, 0x9218, 0x00ee, + 0x00de, 0x015e, 0x0804, 0x31d8, 0x00f6, 0x0016, 0x907d, 0x0138, + 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, + 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804, 0x31d8, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x0126, 0x2091, + 0x8000, 0x080c, 0x5167, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, + 0x320a, 0x012e, 0x6158, 0x9190, 0x2fd9, 0x2215, 0x9294, 0x00ff, + 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, 0x000a, 0x98c6, + 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6, + 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6, + 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6d14, 0x1118, + 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, + 0x320a, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x31d8, 0x6148, 0x624c, + 0x2019, 0x1955, 0x231c, 0x2001, 0x1956, 0x2004, 0x789a, 0x0804, + 0x31d8, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, + 0x0804, 0x31d8, 0x080c, 0x468c, 0x0904, 0x320d, 0xba44, 0xbb38, + 0x0804, 0x31d8, 0x080c, 0x0db4, 0x080c, 0x468c, 0x2110, 0x0904, + 0x320d, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, + 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x320a, 0x0126, + 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x95bc, + 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x900e, 0x080c, + 0xcef9, 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x31d8, + 0x6148, 0x624c, 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, + 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1955, 0x2d1c, 0x206a, + 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1956, + 0x2d04, 0x266a, 0x789a, 0x0804, 0x31d8, 0x0126, 0x2091, 0x8000, + 0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0e9b, 0xd0c4, + 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196c, 0x200a, 0x78ac, 0x2011, + 0x196d, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, + 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, + 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, + 0x0010, 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, + 0xd1e4, 0x190c, 0x0eb1, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, + 0x0114, 0x2012, 0x012e, 0x0804, 0x31d8, 0x00f6, 0x2079, 0x1800, + 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, + 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, + 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, + 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x320d, 0x788c, + 0x902d, 0x0904, 0x320d, 0x900e, 0x080c, 0x5ff1, 0x1120, 0xba44, + 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, + 0x080c, 0x468c, 0x0904, 0x320d, 0x7888, 0x900d, 0x0904, 0x320d, + 0x788c, 0x9005, 0x0904, 0x320d, 0xba44, 0xb946, 0xbb38, 0xb83a, + 0x0804, 0x31d8, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, + 0x5167, 0x1904, 0x320a, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, + 0x00ff, 0x1130, 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, + 0x9182, 0x007f, 0x16e0, 0x9188, 0x2fd9, 0x210d, 0x918c, 0x00ff, + 0x2001, 0x1817, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, + 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9a72, 0x000e, + 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x5f97, 0x2b08, + 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4659, 0x01d0, + 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, + 0x701f, 0x36ad, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9b42, + 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x320a, 0x00ce, + 0x0804, 0x320d, 0x080c, 0x9ac8, 0x0cb0, 0xa830, 0x9086, 0x0100, + 0x0904, 0x320a, 0x0804, 0x31d8, 0x2061, 0x1a3e, 0x0126, 0x2091, + 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, + 0x6350, 0x6070, 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, + 0x0804, 0x31d8, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x320a, + 0x080c, 0x6d14, 0x0904, 0x320a, 0x0126, 0x2091, 0x8000, 0x6250, + 0x6070, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2574, 0x080c, + 0x5377, 0x012e, 0x0804, 0x31d8, 0x012e, 0x0804, 0x320d, 0x0006, + 0x0016, 0x00c6, 0x00e6, 0x2001, 0x1978, 0x2070, 0x2061, 0x1853, + 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x7f8b, 0x7206, + 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, + 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x31da, 0x7884, + 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, + 0x012e, 0x0804, 0x320d, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853, + 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x320d, 0x012e, 0x0804, + 0x320a, 0x080c, 0x9a47, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3778, + 0x00c6, 0x080c, 0x4659, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, + 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, + 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, + 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, + 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, + 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x38fe, + 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, + 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x080c, 0x46a2, 0x701f, 0x383b, 0x7023, 0x0001, 0x012e, 0x0005, + 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x080c, 0x36e7, 0x2001, 0x196e, 0x2003, 0x0000, 0x2021, + 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, + 0x32e1, 0x60bf, 0x0012, 0x080c, 0x396d, 0x080c, 0x392c, 0x00f6, + 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a34, 0x2079, 0x0090, 0x00d6, + 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, + 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, + 0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3c2d, 0x080c, + 0x3b32, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, + 0x080c, 0x3d74, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, + 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, 0x9084, + 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, 0x9084, + 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, + 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181f, 0x2004, 0x9106, + 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, + 0x0138, 0x080c, 0x3b3c, 0x080c, 0x3927, 0x0058, 0x080c, 0x3927, + 0x080c, 0x3c98, 0x080c, 0x3c23, 0x2001, 0x020b, 0x2004, 0xd0e4, + 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, + 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, + 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, + 0x918c, 0xfffd, 0x2102, 0x080c, 0x1296, 0x2009, 0x0028, 0x080c, + 0x2110, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, 0x196e, + 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x31d8, 0x012e, 0x2021, + 0x400c, 0x0804, 0x31da, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, + 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, + 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3897, 0x2048, + 0x1f04, 0x384b, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, + 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, + 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, 0x0170, + 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x001b, 0x080c, 0x46a2, 0x701f, 0x383b, 0x00b0, 0x8906, 0x8006, + 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, + 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f69, 0x000e, + 0x080c, 0x46a5, 0x701f, 0x383b, 0x015e, 0x00de, 0x009e, 0x008e, + 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, + 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x38fc, 0x0450, + 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, + 0x5f91, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, + 0x080c, 0xbc50, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, + 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x320a, 0x0016, 0x0026, + 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, + 0x701f, 0x38ce, 0x7007, 0x0003, 0x0804, 0x388c, 0xa830, 0x9086, + 0x0100, 0x2021, 0x400c, 0x0904, 0x31da, 0x0076, 0xad10, 0xac0c, + 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, + 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, + 0x0006, 0x080c, 0x0f69, 0x000e, 0x080c, 0x46a5, 0x007e, 0x701f, + 0x383b, 0x7023, 0x0001, 0x0005, 0x0804, 0x31d8, 0x0156, 0x00c6, + 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, + 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4659, 0x001e, 0x0130, + 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006, 0x0010, + 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6, 0x2079, + 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005, 0x2001, + 0x196e, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, + 0x0200, 0x2001, 0x1979, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, + 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4659, + 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, + 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, + 0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, + 0x080c, 0x2110, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, + 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, + 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4659, + 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, + 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a, 0x2001, + 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000, 0x2001, + 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, + 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, + 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, + 0x080c, 0x28fd, 0x1130, 0x9006, 0x080c, 0x2855, 0x9006, 0x080c, + 0x2838, 0x7884, 0x9084, 0x0007, 0x0002, 0x39b8, 0x39c1, 0x39ca, + 0x39b5, 0x39b5, 0x39b5, 0x39b5, 0x39b5, 0x012e, 0x0804, 0x320d, + 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3b86, + 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, + 0x3b86, 0x0078, 0x080c, 0x6d14, 0x1128, 0x012e, 0x2009, 0x0016, + 0x0804, 0x320a, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, + 0x31da, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x080c, 0x36e7, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, + 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x3e4f, 0x080c, + 0x3d9f, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, + 0x1a34, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, + 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, + 0x080c, 0x3d00, 0x080c, 0x2905, 0x080c, 0x2905, 0x080c, 0x2905, + 0x080c, 0x2905, 0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x080c, + 0x3c2d, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3b3c, 0x2001, + 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, + 0x080c, 0x320a, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, + 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, + 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3c0b, 0x2d00, + 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3b3c, 0x0804, 0x3ae9, 0x080c, + 0x3d74, 0x080c, 0x3c98, 0x080c, 0x3bee, 0x080c, 0x3c23, 0x00f6, + 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3b3c, + 0x00fe, 0x0804, 0x3ae9, 0x00fe, 0x080c, 0x3b32, 0x1150, 0x8d68, + 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3b3c, + 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, + 0x8739, 0x0038, 0x2001, 0x1a31, 0x2004, 0x9086, 0x0000, 0x1904, + 0x3a39, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, + 0x2500, 0x9605, 0x0904, 0x3ae9, 0x7884, 0xd0bc, 0x0128, 0x2d00, + 0x9c05, 0x9b05, 0x1904, 0x3ae9, 0xa013, 0x0019, 0x2001, 0x032a, + 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a31, 0x2003, + 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, + 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, + 0x080c, 0x2110, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, + 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, + 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3ac0, 0x00ce, + 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, + 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, + 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, + 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, + 0x39f3, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, + 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, + 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1296, + 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, + 0x080c, 0x2110, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, + 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, + 0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, + 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x008e, 0x1118, 0x012e, 0x0804, 0x31d8, 0x012e, 0x2021, 0x400c, + 0x0804, 0x31da, 0x9085, 0x0001, 0x1d04, 0x3b3b, 0x2091, 0x6000, + 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, + 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a31, 0x2003, 0x0000, + 0x0071, 0x2009, 0x0048, 0x080c, 0x2110, 0x2001, 0x0227, 0x2024, + 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, + 0x00e6, 0x2071, 0x1a34, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, + 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, + 0x1120, 0x2009, 0x0040, 0x080c, 0x2110, 0x782c, 0xd0fc, 0x0d88, + 0x080c, 0x3d74, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, + 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2110, 0x782b, + 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, + 0x0100, 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x2554, + 0x7850, 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, + 0x8319, 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, + 0x0046, 0x1d04, 0x3ba1, 0x2091, 0x6000, 0x1f04, 0x3ba1, 0x7850, + 0x9085, 0x0400, 0x9084, 0xdfff, 0x7852, 0x2001, 0x0021, 0x2004, + 0x9084, 0x0003, 0x9086, 0x0001, 0x1120, 0x7850, 0x9084, 0xdfff, + 0x7852, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, + 0x0028, 0xa001, 0x1f04, 0x3bc1, 0x7850, 0x9085, 0x1400, 0x7852, + 0x2019, 0x61a8, 0x7854, 0xa001, 0xa001, 0xd08c, 0x1110, 0x8319, + 0x1dc8, 0x7827, 0x0048, 0x7850, 0x9085, 0x0400, 0x7852, 0x7843, + 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, + 0x0100, 0x080c, 0x29bc, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, + 0x080c, 0x29bc, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, + 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, 0x2001, + 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, + 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, + 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, + 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, + 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, + 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, + 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, + 0x2001, 0x1979, 0x2004, 0x70e2, 0x080c, 0x391d, 0x1188, 0x2001, + 0x181f, 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, + 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, + 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 0x210c, 0x716e, + 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, + 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, + 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, + 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, + 0x0092, 0x7016, 0x080c, 0x3d74, 0x00f6, 0x2071, 0x1a31, 0x2079, + 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, + 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, + 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, + 0x3d00, 0x2011, 0x0001, 0x080c, 0x3d00, 0x00fe, 0x00ee, 0x0005, + 0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, 0x792c, 0xd1fc, + 0x0904, 0x3cfd, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3cf9, + 0x7000, 0x0002, 0x3cfd, 0x3cae, 0x3cde, 0x3cf9, 0xd1bc, 0x1170, + 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3d00, + 0x0904, 0x3cfd, 0x080c, 0x3d00, 0x0804, 0x3cfd, 0x00f6, 0x2079, + 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, + 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, + 0x3c0b, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, + 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, + 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3ca2, 0x2011, + 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, 0x0015, + 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, + 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, + 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, + 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, + 0x0007, 0x1a0c, 0x0db4, 0x9398, 0x3d2e, 0x231d, 0x083f, 0x9080, + 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, + 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, + 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3d6b, 0x3d62, + 0x3d59, 0x3d50, 0x3d47, 0x3d3e, 0x3d35, 0xa964, 0x7902, 0xa968, + 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, + 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, + 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, + 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, + 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, + 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, + 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, + 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, + 0x1a34, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, + 0x2940, 0x9026, 0x7000, 0x0002, 0x3d9b, 0x3d87, 0x3d92, 0x8001, + 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3d00, 0x190c, + 0x3d00, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, + 0x0001, 0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, + 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1979, 0x2004, + 0x601a, 0x2061, 0x0100, 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, + 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, + 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4659, + 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, + 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, + 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3e17, 0x1d68, + 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4659, 0xa813, 0x0019, 0xa817, + 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, + 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, + 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, + 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, + 0x2110, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, + 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, + 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, + 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, + 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a, 0x700e, + 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, 0x702c, + 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, 0x7400, + 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, 0x080c, + 0x4659, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, + 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, + 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, 0x0030, + 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4659, 0x2940, 0xa813, + 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, + 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, + 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3e17, 0x1d68, 0x2900, + 0xa85a, 0x00d8, 0x080c, 0x4659, 0x2940, 0xa013, 0x0019, 0xa017, + 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, 0x2001, + 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, + 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, 0x2003, + 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, + 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a31, 0x2003, 0x0003, + 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, + 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, + 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, + 0x0013, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, + 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, + 0x0804, 0x31d8, 0x7d98, 0x7c9c, 0x0804, 0x32cf, 0x080c, 0x6d14, + 0x190c, 0x5a59, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x46a2, 0x701f, + 0x3eea, 0x0005, 0x080c, 0x5162, 0x1130, 0x3b00, 0x3a08, 0xc194, + 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904, + 0x320d, 0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, + 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, + 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, + 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, + 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x320d, 0x9288, + 0x2fd9, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, + 0x908a, 0x007f, 0x1a04, 0x320d, 0x605a, 0x6888, 0x9084, 0x0030, + 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1980, 0x9080, + 0x2647, 0x2005, 0x200a, 0x000e, 0x2009, 0x1981, 0x9080, 0x264b, + 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x320d, 0x908a, + 0x0841, 0x1a04, 0x320d, 0x9084, 0x0007, 0x1904, 0x320d, 0x680c, + 0x9005, 0x0904, 0x320d, 0x6810, 0x9005, 0x0904, 0x320d, 0x6848, + 0x6940, 0x910a, 0x1a04, 0x320d, 0x8001, 0x0904, 0x320d, 0x684c, + 0x6944, 0x910a, 0x1a04, 0x320d, 0x8001, 0x0904, 0x320d, 0x2009, + 0x1950, 0x200b, 0x0000, 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0140, + 0x7884, 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, + 0x6814, 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, + 0x080c, 0x7029, 0x080c, 0x6395, 0x080c, 0x63ca, 0x6808, 0x602a, + 0x080c, 0x2082, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, + 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x25ae, 0x003e, 0x6000, + 0x9086, 0x0000, 0x1904, 0x4067, 0x6818, 0x691c, 0x6a20, 0x6b24, + 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, + 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, + 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, + 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, + 0x20a1, 0x1982, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, + 0x199c, 0x20e9, 0x0001, 0x4001, 0x080c, 0x7e5c, 0x00c6, 0x900e, + 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, + 0x210c, 0x918e, 0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, + 0x12b0, 0x3508, 0x8109, 0x080c, 0x75df, 0x6878, 0x6016, 0x6874, + 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, + 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, + 0x3fd6, 0x00ce, 0x00c6, 0x2061, 0x196b, 0x2063, 0x0001, 0x9006, + 0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0000, 0x00ce, 0x00e6, + 0x2c70, 0x080c, 0x0e80, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, + 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, + 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, + 0x2001, 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, + 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, + 0x080c, 0x2623, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, + 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, + 0x6d14, 0x0128, 0x080c, 0x4a6e, 0x0110, 0x080c, 0x2574, 0x60d0, + 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x404f, 0x00d0, 0x080c, + 0x6d14, 0x1168, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011, 0x6b88, + 0x080c, 0x7e27, 0x080c, 0x6ffd, 0x080c, 0x6c46, 0x0040, 0x080c, + 0x5953, 0x0028, 0x6003, 0x0004, 0x2009, 0x4067, 0x0010, 0x0804, + 0x31d8, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, + 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, + 0x9086, 0x0000, 0x0904, 0x320a, 0x2069, 0x1853, 0x7890, 0x6842, + 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x2039, 0x0001, 0x0804, 0x46a5, 0x9006, 0x080c, 0x2574, + 0x81ff, 0x1904, 0x320a, 0x080c, 0x6d14, 0x11b0, 0x080c, 0x6ff8, + 0x080c, 0x5a94, 0x080c, 0x2fd4, 0x0118, 0x6130, 0xc18d, 0x6132, + 0x080c, 0xbe86, 0x0130, 0x080c, 0x6d37, 0x1118, 0x080c, 0x6cec, + 0x0038, 0x080c, 0x6c46, 0x0020, 0x080c, 0x5a59, 0x080c, 0x5953, + 0x0804, 0x31d8, 0x81ff, 0x1904, 0x320a, 0x080c, 0x6d14, 0x1110, + 0x0804, 0x320a, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, + 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, + 0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x46a5, 0x701f, 0x31d6, + 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, + 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, + 0x6558, 0x9588, 0x2fd9, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, + 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x5ff1, 0x1190, + 0xb814, 0x821c, 0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, + 0x201a, 0x0038, 0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, + 0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, + 0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, + 0x1c80, 0x2099, 0x1c80, 0x080c, 0x59e4, 0x0804, 0x40bf, 0x080c, + 0x468c, 0x0904, 0x320d, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, + 0x0804, 0x320a, 0x080c, 0x5153, 0xd0b4, 0x0558, 0x7884, 0x908e, + 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, + 0x080c, 0x2fcf, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, + 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xb955, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a, + 0x7007, 0x0003, 0x701f, 0x414d, 0x0005, 0x080c, 0x468c, 0x0904, + 0x320d, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, + 0x9080, 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, + 0x2098, 0x080c, 0x0f69, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, + 0x000a, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, + 0x080c, 0x0f69, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x0804, 0x46a5, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, + 0x0904, 0x320d, 0x080c, 0x6163, 0x0904, 0x320a, 0x0058, 0xa878, + 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x320a, 0xa974, 0xaa94, + 0x0804, 0x31d8, 0x080c, 0x515b, 0x0904, 0x31d8, 0x701f, 0x4197, + 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x320a, 0x7888, 0x908a, + 0x1000, 0x1a04, 0x320d, 0x080c, 0x468c, 0x0904, 0x320d, 0x080c, + 0x6315, 0x0120, 0x080c, 0x631d, 0x1904, 0x320d, 0x080c, 0x61e8, + 0x0904, 0x320a, 0x2019, 0x0004, 0x900e, 0x080c, 0x6175, 0x0904, + 0x320a, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, + 0x12f8, 0x080c, 0x468a, 0x01e0, 0x080c, 0x6315, 0x0118, 0x080c, + 0x631d, 0x11b0, 0x080c, 0x61e8, 0x2009, 0x0002, 0x0168, 0x2009, + 0x0002, 0x2019, 0x0004, 0x080c, 0x6175, 0x2009, 0x0003, 0x0120, + 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, + 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, + 0xa897, 0x4000, 0x080c, 0x515b, 0x0110, 0x9006, 0x0018, 0x900e, + 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, + 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, + 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, + 0x5ff1, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, + 0x7d64, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, 0x0904, + 0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x616c, 0x0904, + 0x320a, 0x0804, 0x41a2, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, + 0x0904, 0x320d, 0x080c, 0x6315, 0x0120, 0x080c, 0x631d, 0x1904, + 0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x615a, 0x0904, + 0x320a, 0x0804, 0x41a2, 0x6100, 0x0804, 0x31d8, 0x080c, 0x468c, + 0x0904, 0x320d, 0x080c, 0x5167, 0x1904, 0x320a, 0x79a8, 0xd184, + 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, + 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, + 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, + 0x0200, 0x0804, 0x31d8, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, + 0x939a, 0x0003, 0x1a04, 0x320a, 0x6258, 0x7884, 0x9206, 0x1560, + 0x2031, 0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, + 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, + 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, 0x46a5, 0x000e, + 0x2031, 0x0000, 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, + 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007, + 0x0002, 0x701f, 0x42cc, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c, + 0x468c, 0x0904, 0x320d, 0x080c, 0x6315, 0x1904, 0x320a, 0x00c6, + 0x080c, 0x4659, 0x00ce, 0x0904, 0x320a, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xb8fb, 0x0904, 0x320a, 0x7007, + 0x0003, 0x701f, 0x42d0, 0x0005, 0x080c, 0x3ebc, 0x0804, 0x31d8, + 0xa830, 0x9086, 0x0100, 0x0904, 0x320a, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x46a5, 0x9006, 0x080c, + 0x2574, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, + 0x1904, 0x320a, 0x080c, 0x6d14, 0x0110, 0x080c, 0x5a59, 0x7888, + 0x908a, 0x1000, 0x1a04, 0x320d, 0x7984, 0x9186, 0x00ff, 0x0138, + 0x9182, 0x007f, 0x1a04, 0x320d, 0x2100, 0x080c, 0x253e, 0x0026, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19c9, 0x601b, 0x0000, + 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x6d14, + 0x1158, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x9085, 0x0001, 0x080c, + 0x6d5b, 0x080c, 0x6c46, 0x00d0, 0x080c, 0x9a4e, 0x2061, 0x0100, + 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, + 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, 0x200b, 0x0000, + 0x2009, 0x002d, 0x2011, 0x597f, 0x080c, 0x7de5, 0x7984, 0x080c, + 0x6d14, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x4205, 0x012e, + 0x00ce, 0x002e, 0x0804, 0x31d8, 0x7984, 0x080c, 0x5f91, 0x2b08, + 0x1904, 0x320d, 0x0804, 0x31d8, 0x81ff, 0x0120, 0x2009, 0x0001, + 0x0804, 0x320a, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, + 0x0005, 0x0804, 0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, + 0x0804, 0x320a, 0x7984, 0x9192, 0x0021, 0x1a04, 0x320d, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, + 0x7736, 0x080c, 0x46a2, 0x701f, 0x4384, 0x7880, 0x9086, 0x006e, + 0x0110, 0x701f, 0x4c20, 0x0005, 0x2009, 0x0080, 0x080c, 0x5ff1, + 0x1118, 0x080c, 0x6315, 0x0120, 0x2021, 0x400a, 0x0804, 0x31da, + 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, + 0xa884, 0x90be, 0x0100, 0x0904, 0x441d, 0x90be, 0x0112, 0x0904, + 0x441d, 0x90be, 0x0113, 0x0904, 0x441d, 0x90be, 0x0114, 0x0904, + 0x441d, 0x90be, 0x0117, 0x0904, 0x441d, 0x90be, 0x011a, 0x0904, + 0x441d, 0x90be, 0x011c, 0x0904, 0x441d, 0x90be, 0x0121, 0x0904, + 0x4404, 0x90be, 0x0131, 0x0904, 0x4404, 0x90be, 0x0171, 0x0904, + 0x441d, 0x90be, 0x0173, 0x0904, 0x441d, 0x90be, 0x01a1, 0x1128, + 0xa894, 0x8007, 0xa896, 0x0804, 0x4428, 0x90be, 0x0212, 0x0904, + 0x4411, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, + 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, + 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, + 0x00de, 0x0804, 0x320d, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, + 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x4466, 0x7028, + 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, + 0x0001, 0x080c, 0x4466, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, + 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4473, + 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, + 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4473, 0x7028, 0x9080, 0x000c, + 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, + 0x00c6, 0x080c, 0x4659, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, + 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, + 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, + 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, + 0xa804, 0x2048, 0x080c, 0xb916, 0x1120, 0x2009, 0x0003, 0x0804, + 0x320a, 0x7007, 0x0003, 0x701f, 0x445d, 0x0005, 0x00ce, 0x009e, + 0x00de, 0x2009, 0x0002, 0x0804, 0x320a, 0xa820, 0x9086, 0x8001, + 0x1904, 0x31d8, 0x2009, 0x0004, 0x0804, 0x320a, 0x0016, 0x0026, + 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, + 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, + 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, + 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x320a, 0x60d8, 0xd0ac, 0x1160, 0xd09c, + 0x0120, 0x2009, 0x0016, 0x0804, 0x320a, 0xd09c, 0x1120, 0x2009, + 0x0005, 0x0804, 0x320a, 0x7984, 0x78a8, 0x2040, 0x080c, 0x9a47, + 0x1120, 0x9182, 0x007f, 0x0a04, 0x320d, 0x9186, 0x00ff, 0x0904, + 0x320d, 0x9182, 0x0800, 0x1a04, 0x320d, 0x7a8c, 0x7b88, 0x6078, + 0x9306, 0x1140, 0x607c, 0x924e, 0x0904, 0x320d, 0x99cc, 0xff00, + 0x0904, 0x320d, 0x0126, 0x2091, 0x8000, 0x0026, 0x2011, 0x8008, + 0x080c, 0x6339, 0x002e, 0x0118, 0x2001, 0x4009, 0x0458, 0x080c, + 0x4573, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e, + 0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, + 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, + 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, + 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, + 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x31da, 0x2b00, 0x7026, + 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9b15, 0x0904, + 0x4540, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x2e58, 0x00ee, 0x00e6, + 0x00c6, 0x080c, 0x4659, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9ac8, + 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, + 0x320a, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, + 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x2e7f, 0x6023, + 0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, 0x5f42, + 0x2009, 0x0002, 0x080c, 0x9b42, 0x78a8, 0xd094, 0x0138, 0x00ee, + 0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001, + 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, + 0x0804, 0x320a, 0x7007, 0x0003, 0x701f, 0x454f, 0x0005, 0xa830, + 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x31da, + 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, + 0x9294, 0x00ff, 0x0804, 0x50b0, 0x900e, 0xa868, 0xd0f4, 0x1904, + 0x31d8, 0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, + 0xc18d, 0x0804, 0x31d8, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, + 0x45bb, 0x902e, 0x080c, 0x9a47, 0x0130, 0x9026, 0x20a9, 0x0800, + 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, + 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428, + 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce, + 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8, + 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14, + 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568, + 0xd894, 0x1558, 0x080c, 0x6315, 0x1540, 0x2001, 0x4000, 0x0430, + 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, + 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9a47, + 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4589, + 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, + 0x080c, 0x5f91, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, + 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, + 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, + 0x320d, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x320d, + 0x2010, 0x2918, 0x080c, 0x2e25, 0x1120, 0x2009, 0x0003, 0x0804, + 0x320a, 0x7007, 0x0003, 0x701f, 0x460e, 0x0005, 0xa830, 0x9086, + 0x0100, 0x1904, 0x31d8, 0x2009, 0x0004, 0x0804, 0x320a, 0x7984, + 0x080c, 0x9a47, 0x1120, 0x9182, 0x007f, 0x0a04, 0x320d, 0x9186, + 0x00ff, 0x0904, 0x320d, 0x9182, 0x0800, 0x1a04, 0x320d, 0x2001, + 0x9000, 0x080c, 0x510b, 0x1904, 0x320a, 0x0804, 0x31d8, 0xa998, + 0x080c, 0x9a47, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, + 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x510b, + 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, + 0x0c48, 0x080c, 0x0fec, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, + 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, + 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, + 0x7984, 0x080c, 0x5ff1, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x5ff1, + 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, + 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x5ff1, + 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, + 0x0128, 0x2148, 0xa904, 0x080c, 0x101e, 0x0cc8, 0x7116, 0x711a, + 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, + 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, + 0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007, 0x0002, 0x701f, 0x31d8, + 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, + 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x46d6, 0x7a36, 0x7833, + 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x117e, 0x0804, 0x473c, 0x0016, 0x0086, + 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, 0x1540, + 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x0fec, + 0x0904, 0x4734, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, + 0x9080, 0x1dd6, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, + 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, 0x2c00, + 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, + 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, + 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, 0x8108, 0x2105, + 0x9005, 0xa146, 0x1520, 0x080c, 0x0fec, 0x1130, 0x8109, 0xa946, + 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, + 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, + 0x1dd6, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, + 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, + 0x9082, 0x001b, 0x0002, 0x475e, 0x475e, 0x4760, 0x475e, 0x475e, + 0x475e, 0x4764, 0x475e, 0x475e, 0x475e, 0x4768, 0x475e, 0x475e, + 0x475e, 0x476c, 0x475e, 0x475e, 0x475e, 0x4770, 0x475e, 0x475e, + 0x475e, 0x4774, 0x475e, 0x475e, 0x475e, 0x4779, 0x080c, 0x0db4, + 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, + 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, + 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, + 0x4737, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4737, 0x00e6, 0x2071, + 0x1894, 0x7048, 0x9005, 0x0904, 0x4810, 0x0126, 0x2091, 0x8000, + 0x0e04, 0x480f, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, + 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, + 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, + 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4812, 0xa804, 0x9005, + 0x090c, 0x0db4, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, + 0x0002, 0x9080, 0x1dd6, 0x2005, 0xa04a, 0x0804, 0x4812, 0x703c, + 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, + 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x87ff, 0x0118, + 0x2748, 0x080c, 0x101e, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, + 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x101e, 0x9006, 0x7042, + 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, 0x9005, + 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, + 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, 0x703e, + 0x703a, 0x7044, 0x9005, 0x090c, 0x0db4, 0x2048, 0xa800, 0x9005, + 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1dd6, 0x2005, + 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, + 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4831, 0x4831, + 0x4833, 0x4831, 0x4831, 0x4831, 0x4838, 0x4831, 0x4831, 0x4831, + 0x483d, 0x4831, 0x4831, 0x4831, 0x4842, 0x4831, 0x4831, 0x4831, + 0x4847, 0x4831, 0x4831, 0x4831, 0x484c, 0x4831, 0x4831, 0x4831, + 0x4851, 0x080c, 0x0db4, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x47bd, + 0xaa84, 0xab88, 0xac8c, 0x0804, 0x47bd, 0xaa94, 0xab98, 0xac9c, + 0x0804, 0x47bd, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x47bd, 0xaab4, + 0xabb8, 0xacbc, 0x0804, 0x47bd, 0xaac4, 0xabc8, 0xaccc, 0x0804, + 0x47bd, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x47bd, 0x0026, 0x080c, + 0x5153, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x46b9, 0x002e, + 0x0005, 0x81ff, 0x1904, 0x320a, 0x0126, 0x2091, 0x8000, 0x6030, + 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6d14, 0x1158, 0x080c, + 0x6ff8, 0x080c, 0x5a94, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x080c, + 0x6c46, 0x0010, 0x080c, 0x5953, 0x012e, 0x0804, 0x31d8, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c, 0x5167, 0x0120, + 0x2009, 0x0007, 0x0804, 0x320a, 0x080c, 0x630d, 0x0120, 0x2009, + 0x0008, 0x0804, 0x320a, 0x0026, 0x2011, 0x0010, 0x080c, 0x6339, + 0x002e, 0x0120, 0x2009, 0x4009, 0x0804, 0x320a, 0x080c, 0x2fcf, + 0x0128, 0x7984, 0x080c, 0x5f91, 0x1904, 0x320d, 0x080c, 0x468c, + 0x0904, 0x320d, 0x2b00, 0x7026, 0x080c, 0x6315, 0x7888, 0x1170, + 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x31d8, 0x080c, 0x4659, + 0x0904, 0x320a, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0xb9af, 0x0904, 0x320a, 0x7888, 0xd094, 0x0118, 0xb8bc, + 0xc08d, 0xb8be, 0x7007, 0x0003, 0x701f, 0x4923, 0x0005, 0x2061, + 0x1800, 0x080c, 0x5167, 0x2009, 0x0007, 0x1578, 0x080c, 0x630d, + 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x2fcf, 0x0120, 0xa998, + 0x080c, 0x5f91, 0x1530, 0x080c, 0x468a, 0x0518, 0x080c, 0x6315, + 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x6211, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, + 0xc0fc, 0xa86a, 0x080c, 0xb9af, 0x11e0, 0xa89c, 0xd094, 0x0118, + 0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, + 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, + 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, + 0x0005, 0x9006, 0x0005, 0xa830, 0x2008, 0x918e, 0xdead, 0x1120, + 0x2021, 0x4009, 0x0804, 0x31da, 0x9086, 0x0100, 0x7024, 0x2058, + 0x1110, 0x0804, 0x50b0, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x31d8, 0x080c, 0x5167, + 0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x7f84, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, + 0x320a, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, + 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x5ff1, 0x1904, + 0x49c1, 0x080c, 0x6315, 0x0120, 0x080c, 0x631d, 0x1904, 0x49c1, + 0x080c, 0x630d, 0x1130, 0x080c, 0x6211, 0x1118, 0xd79c, 0x0904, + 0x49c1, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, + 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, + 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, + 0x4473, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, + 0x20e0, 0x080c, 0x4473, 0x4104, 0xd794, 0x0528, 0xb8b4, 0x20e0, + 0xb8b8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, + 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, + 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, + 0x20e0, 0x080c, 0x4466, 0x9c80, 0x0026, 0x2098, 0xb8b4, 0x20e0, + 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, + 0x0005, 0x8108, 0x080c, 0x9a47, 0x0118, 0x9186, 0x0800, 0x0040, + 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, + 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, + 0x0150, 0x0804, 0x495d, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, + 0x31d8, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, + 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, + 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc, + 0x7007, 0x0002, 0x701f, 0x49fd, 0x0005, 0x7030, 0x9005, 0x1180, + 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, + 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x495d, + 0x7124, 0x810b, 0x0804, 0x31d8, 0x2029, 0x007e, 0x7984, 0x7a88, + 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, + 0x320d, 0x9502, 0x0a04, 0x320d, 0x9184, 0x00ff, 0x90e2, 0x0020, + 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9284, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9284, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, + 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502, + 0x0a04, 0x320d, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x320d, + 0x9502, 0x0a04, 0x320d, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, + 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9484, 0x00ff, 0x90e2, + 0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x2061, 0x1958, + 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x31d8, 0x0006, 0x080c, + 0x5153, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157, 0xd0bc, + 0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, + 0x0804, 0x31d8, 0x83ff, 0x1904, 0x320d, 0x2001, 0xfff0, 0x9200, + 0x1a04, 0x320d, 0x2019, 0xffff, 0x6074, 0x9302, 0x9200, 0x0a04, + 0x320d, 0x7986, 0x6272, 0x0804, 0x31d8, 0x080c, 0x5167, 0x1904, + 0x320a, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4659, 0x0904, + 0x320a, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, + 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, + 0x8bff, 0x0178, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d, 0x1148, + 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, + 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, + 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, + 0x7f8b, 0x2208, 0x0804, 0x31d8, 0x7033, 0x0001, 0x7122, 0x7024, + 0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa37a, + 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, + 0x080c, 0x10cc, 0x7007, 0x0002, 0x701f, 0x4aef, 0x0005, 0x7030, + 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, + 0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, + 0x4aad, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x7f8b, 0x2208, + 0x0804, 0x31d8, 0x00f6, 0x00e6, 0x080c, 0x5167, 0x2009, 0x0007, + 0x1904, 0x4b82, 0x2071, 0x1894, 0x745c, 0x84ff, 0x2009, 0x000e, + 0x1904, 0x4b82, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, + 0x1005, 0x2009, 0x0002, 0x0904, 0x4b82, 0x2900, 0x705e, 0x900e, + 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, + 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, + 0x6315, 0x0118, 0x080c, 0x631d, 0x1148, 0xb814, 0x20a9, 0x0001, + 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, + 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, + 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x7f8b, 0x2208, 0x009e, + 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148, + 0x080c, 0x101e, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, + 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061, 0x18af, + 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, + 0xa696, 0xa79a, 0xa09f, 0x4b8e, 0x000e, 0xa0a2, 0x080c, 0x10cc, + 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, + 0x904d, 0x090c, 0x0db4, 0x00e6, 0x2071, 0x1894, 0xa06c, 0x908e, + 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, + 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, + 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, + 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, + 0x0003, 0x080c, 0x7f8b, 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0db4, + 0x2148, 0x080c, 0x101e, 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, + 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, 0xa09f, 0x0000, 0xa0a3, + 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, + 0x0178, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d, 0x1148, 0xb814, + 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, + 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, + 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, + 0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101e, 0x9006, 0x705e, + 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, + 0x080c, 0x65f2, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, + 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, + 0xa592, 0xa696, 0xa79a, 0x080c, 0x10cc, 0x9006, 0x00ee, 0x0005, + 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, + 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x320d, 0xa884, 0xa988, + 0x080c, 0x250b, 0x1518, 0x080c, 0x5f91, 0x1500, 0x7126, 0xbe12, + 0xbd16, 0xae7c, 0x080c, 0x4659, 0x01c8, 0x080c, 0x4659, 0x01b0, + 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, + 0xa804, 0x2048, 0x080c, 0xb936, 0x1120, 0x2009, 0x0003, 0x0804, + 0x320a, 0x7007, 0x0003, 0x701f, 0x4c5b, 0x0005, 0x009e, 0x2009, + 0x0002, 0x0804, 0x320a, 0x7124, 0x080c, 0x2f76, 0xa820, 0x9086, + 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x320a, 0x2900, 0x7022, + 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, + 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f69, 0xaa6c, + 0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, + 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, + 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, + 0x46a5, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, + 0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, + 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007, 0x0002, + 0x701f, 0x4cb7, 0x0005, 0x000e, 0x007e, 0x0804, 0x320d, 0x7020, + 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, + 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f69, 0x2100, 0x2238, + 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, + 0x002a, 0x0804, 0x46a5, 0x81ff, 0x1904, 0x320a, 0x798c, 0x2001, + 0x194f, 0x2102, 0x080c, 0x4670, 0x0904, 0x320d, 0x080c, 0x6315, + 0x0120, 0x080c, 0x631d, 0x1904, 0x320d, 0x080c, 0x60b8, 0x0904, + 0x320a, 0x0126, 0x2091, 0x8000, 0x080c, 0x617e, 0x012e, 0x0904, + 0x320a, 0x0804, 0x41a2, 0xa9a0, 0x2001, 0x194f, 0xc18d, 0x2102, + 0x080c, 0x467d, 0x01a0, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d, + 0x1170, 0x080c, 0x60b8, 0x2009, 0x0002, 0x0128, 0x080c, 0x617e, + 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, + 0x4000, 0x080c, 0x515b, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084, + 0x0904, 0x4117, 0x080c, 0x468c, 0x0904, 0x320d, 0x080c, 0x4659, + 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x080c, 0x6315, 0x0130, + 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c, + 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x5153, 0xd0b4, + 0x0904, 0x4151, 0x7884, 0x908e, 0x007e, 0x0904, 0x4151, 0x908e, + 0x007f, 0x0904, 0x4151, 0x908e, 0x0080, 0x0904, 0x4151, 0xb800, + 0xd08c, 0x1904, 0x4151, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0x080c, 0xb955, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a, 0x7007, + 0x0003, 0x701f, 0x4d74, 0x0005, 0x080c, 0x468c, 0x0904, 0x320d, + 0x0804, 0x4151, 0x080c, 0x2fcf, 0x0108, 0x0005, 0x2009, 0x1833, + 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c, + 0x5167, 0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x080c, 0x630d, + 0x0120, 0x2009, 0x0008, 0x0804, 0x320a, 0xb89c, 0xd0a4, 0x1118, + 0xd0ac, 0x1904, 0x4151, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0xb9af, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a, + 0x7007, 0x0003, 0x701f, 0x4dad, 0x0005, 0xa830, 0x9086, 0x0100, + 0x1120, 0x2009, 0x0004, 0x0804, 0x50b0, 0x080c, 0x468c, 0x0904, + 0x320d, 0x0804, 0x4d46, 0x81ff, 0x2009, 0x0001, 0x1904, 0x320a, + 0x080c, 0x5167, 0x2009, 0x0007, 0x1904, 0x320a, 0x080c, 0x630d, + 0x0120, 0x2009, 0x0008, 0x0804, 0x320a, 0x080c, 0x468c, 0x0904, + 0x320d, 0x080c, 0x6315, 0x2009, 0x0009, 0x1904, 0x320a, 0x080c, + 0x4659, 0x2009, 0x0002, 0x0904, 0x320a, 0x9006, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, 0x00ff, + 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038, + 0x928e, 0x0100, 0x1904, 0x320d, 0xc0e5, 0xa952, 0xa956, 0xa83e, + 0x080c, 0xbc02, 0x2009, 0x0003, 0x0904, 0x320a, 0x7007, 0x0003, + 0x701f, 0x4e03, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, + 0x0904, 0x320a, 0x0804, 0x31d8, 0x7aa8, 0x9284, 0xc000, 0x0148, + 0xd2ec, 0x01a0, 0x080c, 0x5167, 0x1188, 0x2009, 0x0014, 0x0804, + 0x320a, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, 0x320a, + 0x080c, 0x5167, 0x2009, 0x0007, 0x1904, 0x320a, 0xd2f4, 0x0130, + 0x9284, 0x5000, 0x080c, 0x512e, 0x0804, 0x31d8, 0xd2fc, 0x0158, + 0x080c, 0x468c, 0x0904, 0x320d, 0x7984, 0x9284, 0x9000, 0x080c, + 0x510b, 0x0804, 0x31d8, 0x080c, 0x468c, 0x0904, 0x320d, 0xb804, + 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x4eec, + 0x080c, 0x4659, 0x2009, 0x0002, 0x0904, 0x4eec, 0xa85c, 0x9080, + 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0x080c, 0x46a2, 0x701f, 0x4e5d, 0x0005, 0xa86c, 0x9086, 0x0500, + 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, + 0x1904, 0x320d, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, + 0x468c, 0x1110, 0x0804, 0x320d, 0x2009, 0x0043, 0x080c, 0xbc6a, + 0x2009, 0x0003, 0x0904, 0x4eec, 0x7007, 0x0003, 0x701f, 0x4e81, + 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x4eec, + 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x510b, 0x0804, 0x31d8, + 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c, + 0x5167, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, 0x080c, + 0x5167, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000, + 0x080c, 0x512e, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x468a, 0x0588, + 0xa998, 0x9284, 0x9000, 0x080c, 0x510b, 0xa87b, 0x0000, 0xa883, + 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x468a, 0x0510, 0x080c, + 0x6315, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, + 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, + 0x468a, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xbc6a, 0x2009, + 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a, + 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, + 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x320a, + 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x510b, 0x001e, + 0x1904, 0x320a, 0x0804, 0x31d8, 0x00f6, 0x2d78, 0x0011, 0x00fe, + 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, 0x1000, + 0xc0fd, 0x080c, 0x510b, 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff, + 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c, 0x5167, 0x0120, + 0x2009, 0x0007, 0x0804, 0x320a, 0x7984, 0x7ea8, 0x96b4, 0x00ff, + 0x080c, 0x5ff1, 0x1904, 0x320d, 0x9186, 0x007f, 0x0138, 0x080c, + 0x6315, 0x0120, 0x2009, 0x0009, 0x0804, 0x320a, 0x080c, 0x4659, + 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, 0xb96f, + 0x1120, 0x2009, 0x0003, 0x0804, 0x320a, 0x7007, 0x0003, 0x701f, + 0x4f4a, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, 0x2009, + 0x0004, 0x0804, 0x320a, 0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084, + 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9080, + 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, + 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, + 0x46a5, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, + 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, + 0x7023, 0x1982, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, 0x199c, + 0x0010, 0x0804, 0x320d, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f, + 0x4f9a, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001, 0xa85c, 0x9080, + 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0, + 0x20e9, 0x0001, 0x4003, 0x0804, 0x31d8, 0x080c, 0x4659, 0x1120, + 0x2009, 0x0002, 0x0804, 0x320a, 0x7984, 0x9194, 0xff00, 0x918c, + 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1982, 0x0040, 0x92c6, + 0x0001, 0x1118, 0x2099, 0x199c, 0x0010, 0x0804, 0x320d, 0xa85c, + 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, + 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, + 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x46a5, 0x7884, 0x908a, + 0x1000, 0x1a04, 0x320d, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, + 0x810b, 0x9108, 0x00c6, 0x2061, 0x19c9, 0x6142, 0x00ce, 0x012e, + 0x0804, 0x31d8, 0x00c6, 0x080c, 0x6d14, 0x1160, 0x080c, 0x6ff8, + 0x080c, 0x5a94, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x080c, 0x6c46, + 0x080c, 0x0db4, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c, + 0x5953, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e, + 0x0000, 0x0904, 0x320a, 0x7884, 0x9005, 0x0188, 0x7888, 0x2061, + 0x196b, 0x2c0c, 0x2062, 0x080c, 0x28ed, 0x01a0, 0x080c, 0x28f5, + 0x0188, 0x080c, 0x28fd, 0x0170, 0x2162, 0x0804, 0x320d, 0x2061, + 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010, + 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061, 0x0100, + 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c, 0x93f3, + 0x2011, 0x0002, 0x080c, 0x93fd, 0x002e, 0x080c, 0x92e4, 0x0036, + 0x901e, 0x080c, 0x935a, 0x003e, 0x60e3, 0x0000, 0x080c, 0xd4e3, + 0x080c, 0xd4fe, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x9006, 0x080c, + 0x29bc, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x00ce, + 0x0804, 0x31d8, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, + 0x080c, 0x5167, 0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x7984, + 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5ff1, 0x1904, 0x320d, 0x9186, + 0x007f, 0x0138, 0x080c, 0x6315, 0x0120, 0x2009, 0x0009, 0x0804, + 0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, + 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb972, 0x1120, + 0x2009, 0x0003, 0x0804, 0x320a, 0x7007, 0x0003, 0x701f, 0x5099, + 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, + 0x320a, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, + 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x46a5, + 0xa898, 0x9086, 0x000d, 0x1904, 0x320a, 0x2021, 0x4005, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x50bd, 0x0010, 0x012e, 0x0cc0, 0x7c36, + 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, + 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, + 0x080c, 0x4695, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x117e, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, + 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c9, + 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898, + 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001, + 0x19d7, 0x2044, 0x2001, 0x19de, 0xa076, 0xa060, 0xa072, 0xa07b, + 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, + 0x012e, 0x0804, 0x31d8, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, + 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb7e0, 0x000e, 0x1198, + 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, + 0x5aae, 0x080c, 0x9a47, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, + 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, + 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, + 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186, + 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, + 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x5136, + 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004, 0x0005, 0x2001, + 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4, + 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x080c, + 0x4659, 0x080c, 0x0ef3, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, + 0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x320d, 0x810c, 0x080c, + 0x46a2, 0x701f, 0x518c, 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, + 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18ae, 0x2c44, 0xa770, + 0xa074, 0x2071, 0x1894, 0x080c, 0x46a5, 0x701f, 0x51a0, 0x0005, + 0x2061, 0x18ae, 0x2c44, 0xa074, 0x2048, 0x9006, 0xa802, 0xa806, + 0x0804, 0x31d8, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, + 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, + 0x5353, 0x0068, 0xd08c, 0x0118, 0x080c, 0x525c, 0x0040, 0xd094, + 0x0118, 0x080c, 0x522c, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, + 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, + 0x001e, 0x0c68, 0x0006, 0x7094, 0x9005, 0x000e, 0x0120, 0x7097, + 0x0000, 0x708f, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, + 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, + 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, + 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, + 0x2009, 0x00f7, 0x080c, 0x5a10, 0x00f0, 0x6040, 0x9084, 0x0010, + 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7083, 0x0000, 0x709f, + 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, 0x1c80, 0x200b, + 0x0000, 0x7093, 0x0000, 0x7087, 0x000f, 0x2009, 0x000f, 0x2011, + 0x58f6, 0x080c, 0x7de5, 0x0005, 0x2001, 0x1875, 0x2004, 0xd08c, + 0x0110, 0x705b, 0xffff, 0x7084, 0x9005, 0x1528, 0x2011, 0x58f6, + 0x080c, 0x7d56, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, + 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x5242, 0x6242, + 0x7097, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, + 0x6242, 0x0048, 0x6242, 0x7097, 0x0000, 0x708b, 0x0000, 0x9006, + 0x080c, 0x5a99, 0x0000, 0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c, + 0x0db4, 0x000b, 0x0005, 0x5266, 0x52b7, 0x5352, 0x00f6, 0x0016, + 0x6900, 0x918c, 0x0800, 0x708b, 0x0001, 0x2001, 0x015d, 0x2003, + 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, + 0x0120, 0x1f04, 0x5275, 0x080c, 0x0db4, 0x68a0, 0x68a2, 0x689c, + 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, + 0x6837, 0x0020, 0x080c, 0x5a75, 0x2079, 0x1c00, 0x7833, 0x1101, + 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, + 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x98d5, 0x20e1, + 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5927, + 0x00fe, 0x9006, 0x708e, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, + 0x708c, 0x708f, 0x0000, 0x9025, 0x0904, 0x532f, 0x6020, 0xd0b4, + 0x1904, 0x532d, 0x719c, 0x81ff, 0x0904, 0x531b, 0x9486, 0x000c, + 0x1904, 0x5328, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5a6e, + 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, + 0x8210, 0x8318, 0x1f04, 0x52d4, 0x6043, 0x0004, 0x2061, 0x0140, + 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, + 0x708b, 0x0002, 0x7097, 0x0002, 0x2009, 0x07d0, 0x2011, 0x58fd, + 0x080c, 0x7de5, 0x080c, 0x5a75, 0x04c0, 0x080c, 0x5a6e, 0x2079, + 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, + 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, + 0x5a6e, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, + 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x530f, + 0x0078, 0x709f, 0x0000, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, + 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, + 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, + 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x98d5, + 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19c0, 0x2013, + 0x0000, 0x708f, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, + 0x90b8, 0x08d8, 0x0005, 0x7094, 0x908a, 0x001d, 0x1a0c, 0x0db4, + 0x000b, 0x0005, 0x5384, 0x5397, 0x53c0, 0x53e0, 0x5406, 0x5435, + 0x545b, 0x5493, 0x54b9, 0x54e7, 0x5522, 0x555a, 0x5578, 0x55a3, + 0x55c5, 0x55e0, 0x55ea, 0x561e, 0x5644, 0x5673, 0x5699, 0x56d1, + 0x5715, 0x5752, 0x5773, 0x57cc, 0x57ee, 0x581c, 0x581c, 0x00c6, + 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, + 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, + 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x7097, 0x0001, + 0x2009, 0x07d0, 0x2011, 0x58fd, 0x080c, 0x7de5, 0x0005, 0x00f6, + 0x708c, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, + 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, + 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, + 0x1110, 0x70c3, 0x0001, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x7097, + 0x0010, 0x080c, 0x55ea, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, + 0x00f6, 0x7097, 0x0003, 0x6043, 0x0004, 0x2011, 0x58fd, 0x080c, + 0x7d56, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, + 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, + 0x1f04, 0x53d5, 0x60c3, 0x0014, 0x080c, 0x5927, 0x00fe, 0x0005, + 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56, + 0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, + 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0004, + 0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005, 0x00f6, 0x7097, + 0x0005, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, + 0x0000, 0x080c, 0x5a6e, 0x080c, 0x5a51, 0x1170, 0x7080, 0x9005, + 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, + 0x58aa, 0x0168, 0x080c, 0x5a27, 0x20a9, 0x0008, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, + 0x0014, 0x080c, 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8, + 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, + 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, + 0x1110, 0x70c3, 0x0001, 0x7097, 0x0006, 0x0029, 0x0010, 0x080c, + 0x5a4a, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0007, 0x080c, 0x59f2, + 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5a6e, + 0x080c, 0x5a51, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, + 0xffff, 0x0180, 0x9180, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f, + 0x2011, 0x0008, 0x080c, 0x58aa, 0x0180, 0x080c, 0x4a74, 0x0110, + 0x080c, 0x2574, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, + 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x7097, 0x0008, 0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe, + 0x0005, 0x00f6, 0x7097, 0x0009, 0x080c, 0x59f2, 0x2079, 0x0240, + 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5a51, 0x1150, 0x7080, + 0x9005, 0x1138, 0x080c, 0x581d, 0x1188, 0x9085, 0x0001, 0x080c, + 0x2574, 0x20a9, 0x0008, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, + 0x080c, 0x5927, 0x0010, 0x080c, 0x5377, 0x00fe, 0x0005, 0x00f6, + 0x708c, 0x9005, 0x05a8, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, + 0x0014, 0x1560, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x7097, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, + 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, + 0x0000, 0x7097, 0x000e, 0x080c, 0x55c5, 0x0010, 0x080c, 0x5a4a, + 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000b, 0x2011, 0x1c0e, 0x20e9, + 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, + 0x59f2, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, + 0x5a51, 0x0118, 0x2013, 0x0000, 0x0020, 0x705c, 0x9085, 0x0100, + 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, + 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, + 0x2009, 0x0240, 0x1f04, 0x5547, 0x60c3, 0x0084, 0x080c, 0x5927, + 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01c0, 0x2011, 0x58fd, + 0x080c, 0x7d56, 0x9086, 0x0084, 0x1178, 0x080c, 0x5a6e, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, + 0x7097, 0x000c, 0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005, + 0x00f6, 0x7097, 0x000d, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833, + 0x1107, 0x7837, 0x0000, 0x080c, 0x5a6e, 0x20a9, 0x0040, 0x2011, + 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, + 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, + 0x6816, 0x2011, 0x0260, 0x1f04, 0x558b, 0x60c3, 0x0084, 0x080c, + 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, + 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0084, 0x1198, 0x080c, 0x5a6e, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, + 0x1140, 0x7093, 0x0001, 0x080c, 0x59c4, 0x7097, 0x000e, 0x0029, + 0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, + 0x5a99, 0x7097, 0x000f, 0x708f, 0x0000, 0x2061, 0x0140, 0x605b, + 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, + 0x0004, 0x2009, 0x07d0, 0x2011, 0x58fd, 0x080c, 0x7d4a, 0x0005, + 0x708c, 0x9005, 0x0130, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x7097, + 0x0000, 0x0005, 0x7097, 0x0011, 0x080c, 0x98d5, 0x080c, 0x5a6e, + 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, + 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, + 0x20a8, 0x4003, 0x080c, 0x5a51, 0x11a0, 0x7178, 0x81ff, 0x0188, + 0x900e, 0x707c, 0x9084, 0x00ff, 0x0160, 0x080c, 0x250b, 0x9186, + 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, + 0x58aa, 0x60c3, 0x0014, 0x080c, 0x5927, 0x0005, 0x00f6, 0x708c, + 0x9005, 0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, + 0x11b8, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, + 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, + 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0012, 0x0029, 0x0010, + 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0013, 0x080c, + 0x5a00, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, + 0x5a6e, 0x080c, 0x5a51, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, + 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x58aa, 0x0168, + 0x080c, 0x5a27, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, + 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, + 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x7097, 0x0014, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, + 0x0005, 0x00f6, 0x7097, 0x0015, 0x080c, 0x5a00, 0x2079, 0x0240, + 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5a6e, 0x080c, 0x5a51, + 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, + 0x9180, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, + 0x080c, 0x58aa, 0x0180, 0x080c, 0x4a74, 0x0110, 0x080c, 0x2574, + 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, + 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5927, 0x00fe, + 0x0005, 0x00f6, 0x708c, 0x9005, 0x05f0, 0x2011, 0x58fd, 0x080c, + 0x7d56, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5a6e, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, + 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x5a99, 0x7a38, + 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, + 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, + 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x5a99, 0x7093, 0x0000, + 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7097, 0x0016, 0x0029, + 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x080c, 0x98d5, 0x080c, + 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, + 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7097, 0x0017, + 0x080c, 0x5a51, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x581d, + 0x1188, 0x9085, 0x0001, 0x080c, 0x2574, 0x20a9, 0x0008, 0x080c, + 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, + 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5927, 0x0010, 0x080c, + 0x5377, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01d8, 0x2011, 0x58fd, + 0x080c, 0x7d56, 0x9086, 0x0084, 0x1190, 0x080c, 0x5a6e, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, + 0x9006, 0x080c, 0x5a99, 0x7097, 0x0018, 0x0029, 0x0010, 0x708f, + 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0019, 0x080c, 0x5a00, + 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5a6e, + 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, + 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, + 0x0260, 0x1f04, 0x5786, 0x2039, 0x1c0e, 0x080c, 0x5a51, 0x11e8, + 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, + 0x00ff, 0x8007, 0x9205, 0x202a, 0x705c, 0x2310, 0x8214, 0x92a0, + 0x1c0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, + 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, + 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, + 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x57b9, 0x60c3, 0x0084, + 0x080c, 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, + 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0084, 0x1198, 0x080c, + 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, + 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x59c4, 0x7097, 0x001a, + 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, + 0x080c, 0x5a99, 0x7097, 0x001b, 0x080c, 0x98d5, 0x080c, 0x5a6e, + 0x2011, 0x0260, 0x2009, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, + 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, + 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, + 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5805, 0x60c3, + 0x0084, 0x080c, 0x5927, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, + 0x1854, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, + 0x28a0, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, + 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, + 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, + 0x0008, 0x8211, 0x1f04, 0x5837, 0x0804, 0x58a6, 0x82ff, 0x1160, + 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, + 0x0904, 0x58a6, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, + 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, + 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, + 0x1f04, 0x585d, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, + 0x1f04, 0x586f, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, + 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, + 0x1f04, 0x587e, 0x755a, 0x95c8, 0x2fd9, 0x292d, 0x95ac, 0x00ff, + 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2554, 0x001e, + 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7083, + 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, + 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, + 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, + 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, + 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, + 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, + 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, + 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, + 0x715a, 0x91a0, 0x2fd9, 0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532, + 0x6536, 0x0016, 0x2508, 0x080c, 0x2554, 0x001e, 0x60e7, 0x0000, + 0x65ea, 0x7083, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x7087, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, + 0x0100, 0x2071, 0x0140, 0x080c, 0x59b3, 0x080c, 0x90c1, 0x7004, + 0x9084, 0x4000, 0x0110, 0x080c, 0x29cc, 0x0126, 0x2091, 0x8000, + 0x2071, 0x1825, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, + 0x00f7, 0x080c, 0x5a10, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, + 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, + 0x2091, 0x8000, 0x080c, 0x2872, 0x0228, 0x2011, 0x0101, 0x2204, + 0xc0c5, 0x2012, 0x2011, 0x19c0, 0x2013, 0x0000, 0x708f, 0x0000, + 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x90b8, 0x6144, + 0xd184, 0x0120, 0x7194, 0x918d, 0x2000, 0x0018, 0x7188, 0x918d, + 0x1000, 0x2011, 0x1968, 0x2112, 0x2009, 0x07d0, 0x2011, 0x58fd, + 0x080c, 0x7de5, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9a4e, 0x2009, 0x00f7, 0x080c, 0x5a10, 0x2061, + 0x19c9, 0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, + 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, + 0x2009, 0x1968, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x597f, + 0x080c, 0x7d4a, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, + 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, + 0x90c1, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, + 0x29cc, 0x080c, 0x6d1c, 0x0188, 0x080c, 0x6d37, 0x1170, 0x080c, + 0x7002, 0x0016, 0x080c, 0x2623, 0x2001, 0x193e, 0x2102, 0x001e, + 0x080c, 0x6ffd, 0x080c, 0x6c46, 0x0050, 0x2009, 0x0001, 0x080c, + 0x290b, 0x2001, 0x0001, 0x080c, 0x24b4, 0x080c, 0x5953, 0x012e, + 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, + 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1968, 0x201c, 0x080c, + 0x46b9, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, + 0x20a1, 0x1c80, 0x080c, 0x5a6e, 0x20e9, 0x0000, 0x2099, 0x026e, + 0x0099, 0x20a9, 0x0020, 0x080c, 0x5a68, 0x2099, 0x0260, 0x20a1, + 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x5a6b, 0x2099, 0x0260, + 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, + 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x59e8, 0x002e, + 0x001e, 0x0005, 0x080c, 0x98d5, 0x20e1, 0x0001, 0x2099, 0x1c00, + 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, + 0x080c, 0x98d5, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x0260, + 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, + 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, + 0x9005, 0x1138, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, + 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, + 0x0046, 0x080c, 0x6311, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, + 0x080c, 0xd188, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, + 0x002a, 0x900e, 0x080c, 0x2e4a, 0x080c, 0xbe86, 0x0140, 0x0036, + 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4856, 0x003e, 0x004e, + 0x001e, 0x0005, 0x080c, 0x5953, 0x7097, 0x0000, 0x708f, 0x0000, + 0x0005, 0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, + 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, + 0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, + 0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, + 0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, + 0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, + 0x4004, 0x2079, 0x1c00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, + 0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, + 0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, + 0x0005, 0x2001, 0x1975, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, + 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, + 0x200a, 0x8108, 0x1f04, 0x5aa8, 0x015e, 0x0005, 0x00d6, 0x0036, + 0x0156, 0x0136, 0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8be, + 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x2fd9, 0x231d, + 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb8b2, 0x080c, 0x9a47, + 0x1120, 0x9192, 0x007e, 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, + 0x20e8, 0xb9b8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, + 0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, + 0xb842, 0xb84e, 0xb852, 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, + 0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, + 0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, + 0xb8a4, 0x904d, 0x0110, 0x080c, 0x101e, 0xb8a7, 0x0000, 0x009e, + 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, + 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, + 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x1a04, 0x5b7e, 0x9182, 0x0800, 0x1a04, 0x5b82, 0x2001, + 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, 0x5b88, 0x9188, 0x1000, + 0x2104, 0x905d, 0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, + 0x1508, 0xb8a4, 0x900d, 0x1904, 0x5b9a, 0xb850, 0x900d, 0x1148, + 0xa802, 0x2900, 0xb852, 0xb84e, 0x080c, 0x8129, 0x9006, 0x012e, + 0x0005, 0x00a6, 0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, + 0xb852, 0x0c90, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, + 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0x9a47, 0x1160, + 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0990, 0x2001, + 0x0029, 0x2009, 0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, + 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, + 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, + 0x0118, 0x2009, 0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, + 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, + 0x2001, 0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, + 0x905d, 0x09a8, 0x080c, 0x6315, 0x1990, 0xb800, 0xd0bc, 0x0978, + 0x0804, 0x5b31, 0x080c, 0x618d, 0x0904, 0x5b4a, 0x0804, 0x5b35, + 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, + 0x1a04, 0x5c1b, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x5bf3, + 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x631d, 0x0160, 0xa994, + 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, + 0x080c, 0x6315, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, + 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xb781, 0x002e, 0x1120, + 0x2001, 0x0008, 0x0804, 0x5c1d, 0x6020, 0x9086, 0x000a, 0x0120, + 0x2001, 0x0008, 0x0804, 0x5c1d, 0x601a, 0x6003, 0x0008, 0x2900, + 0x6016, 0x0058, 0x080c, 0x9a72, 0x05e8, 0x2b00, 0x6012, 0x2900, + 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, + 0x9b42, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, + 0x1290, 0x080c, 0x9a47, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, + 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, + 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, + 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, + 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, + 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, + 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, + 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, + 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, + 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, + 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, + 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, + 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, + 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x5cb2, 0x5c6d, 0x5c84, + 0x5cb2, 0x5cb2, 0x5cb2, 0x5cb2, 0x5cb2, 0x2100, 0x9082, 0x007e, + 0x1278, 0x080c, 0x5f91, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, + 0x5cba, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, + 0x080c, 0x4573, 0x0150, 0x04b0, 0x080c, 0x5ff1, 0x1598, 0xb810, + 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0x9a72, 0x0530, + 0x2b00, 0x6012, 0x080c, 0xbc01, 0x2900, 0x6016, 0x600b, 0xffff, + 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x2e7f, + 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, 0x5f42, 0x2001, + 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0x9b42, + 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, + 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, + 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x5e87, 0x90c6, 0x0056, + 0x0904, 0x5e8b, 0x90c6, 0x0066, 0x0904, 0x5e8f, 0x90c6, 0x0071, + 0x0904, 0x5e93, 0x90c6, 0x0074, 0x0904, 0x5e97, 0x90c6, 0x007c, + 0x0904, 0x5e9b, 0x90c6, 0x007e, 0x0904, 0x5e9f, 0x90c6, 0x0037, + 0x0904, 0x5ea3, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, + 0x0904, 0x5e82, 0x9182, 0x0800, 0x1a04, 0x5e82, 0x080c, 0x5ff1, + 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, + 0x90c6, 0x006f, 0x0148, 0x080c, 0x9a47, 0x1904, 0x5e6b, 0xb8a0, + 0x9084, 0xff80, 0x1904, 0x5e6b, 0xa894, 0x90c6, 0x006f, 0x0158, + 0x90c6, 0x005e, 0x0904, 0x5dcb, 0x90c6, 0x0064, 0x0904, 0x5df4, + 0x2008, 0x0804, 0x5d8e, 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9a47, + 0x1120, 0x9182, 0x007f, 0x0a04, 0x5d8e, 0x9186, 0x00ff, 0x0904, + 0x5d8e, 0x9182, 0x0800, 0x1a04, 0x5d8e, 0xaaa0, 0xab9c, 0x7878, + 0x9306, 0x1188, 0x787c, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, + 0x009e, 0x0804, 0x5d8e, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, + 0x2310, 0x0804, 0x5d8e, 0x080c, 0x4573, 0x0904, 0x5d97, 0x900e, + 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, 0x6211, 0x1108, + 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, + 0x9080, 0x0006, 0x2098, 0x080c, 0x0f69, 0x20a9, 0x0004, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, + 0x9080, 0x000a, 0x2098, 0x080c, 0x0f69, 0x000e, 0x00c8, 0x90c6, + 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, + 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, + 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, + 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0470, 0x080c, + 0x9a72, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, + 0x2b00, 0x6012, 0x080c, 0xbc01, 0x2900, 0x6016, 0x6023, 0x0001, + 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, + 0x080c, 0x2e7f, 0x012e, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, + 0x080c, 0x5f42, 0x2009, 0x0002, 0x080c, 0x9b42, 0xa8b0, 0xd094, + 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee, + 0x00fe, 0x00be, 0x0005, 0x080c, 0x5167, 0x0118, 0x2009, 0x0007, + 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x5ff1, 0x1904, 0x5d89, 0x9186, + 0x007f, 0x0130, 0x080c, 0x6315, 0x0118, 0x2009, 0x0009, 0x0080, + 0x0096, 0x080c, 0x0fec, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, + 0x2900, 0x009e, 0xa806, 0x080c, 0xb972, 0x19b0, 0x2009, 0x0003, + 0x2001, 0x4005, 0x0804, 0x5d90, 0xa998, 0xaeb0, 0x080c, 0x5ff1, + 0x1904, 0x5d89, 0x0096, 0x080c, 0x0fec, 0x1128, 0x009e, 0x2009, + 0x0002, 0x0804, 0x5e48, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, + 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, + 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0f69, + 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, + 0x1168, 0x080c, 0x5153, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, + 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6315, + 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x5167, 0x0118, 0xa89b, + 0x0007, 0x0050, 0x080c, 0xb955, 0x1904, 0x5dc4, 0x2009, 0x0003, + 0x2001, 0x4005, 0x0804, 0x5d90, 0xa87b, 0x0030, 0xa897, 0x4005, + 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, + 0x2031, 0x0000, 0x2041, 0x1226, 0x080c, 0x9fca, 0x1904, 0x5dc4, + 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x5dc5, + 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, + 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, + 0x0804, 0x5dc5, 0x2001, 0x0029, 0x900e, 0x0804, 0x5dc5, 0x080c, + 0x33fd, 0x0804, 0x5dc6, 0x080c, 0x4e90, 0x0804, 0x5dc6, 0x080c, + 0x41cd, 0x0804, 0x5dc6, 0x080c, 0x462f, 0x0804, 0x5dc6, 0x080c, + 0x48d7, 0x0804, 0x5dc6, 0x080c, 0x4b0a, 0x0804, 0x5dc6, 0x080c, + 0x4cfb, 0x0804, 0x5dc6, 0x080c, 0x360d, 0x0804, 0x5dc6, 0x00b6, + 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, + 0x0800, 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, + 0x6315, 0x1148, 0x00e9, 0x080c, 0x611c, 0x9006, 0x00b0, 0x2001, + 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, + 0x0d88, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, + 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, + 0x0126, 0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, + 0x2148, 0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, + 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, + 0x8000, 0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19b6, 0x7004, + 0x9086, 0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, + 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, + 0x701c, 0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, + 0x2900, 0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, + 0x8000, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, + 0xb84e, 0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, + 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, + 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, + 0x0110, 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, + 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, + 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, + 0x0158, 0x080c, 0x6311, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, + 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, + 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, + 0x0db4, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, + 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, + 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x630d, 0x1138, + 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, + 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, + 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, + 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, + 0x0fec, 0x2958, 0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, + 0xb860, 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x5aae, 0x9006, 0x0010, + 0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, + 0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, + 0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, + 0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x101e, 0x00d6, 0x00c6, + 0xb8ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, + 0x080c, 0xb793, 0x0110, 0x080c, 0x0f9e, 0x080c, 0x9ac8, 0x00ce, + 0x0c88, 0x00ce, 0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, + 0x080c, 0x102e, 0x00de, 0x9006, 0x002e, 0x012e, 0x009e, 0x00be, + 0x0005, 0x0016, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0030, + 0x9188, 0x1000, 0x2104, 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, + 0x00d6, 0x0156, 0x0136, 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, + 0xc08c, 0xb802, 0x080c, 0x6d14, 0x1510, 0xb8a0, 0x9086, 0x007e, + 0x0120, 0x080c, 0x9a47, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, + 0x00c6, 0x2061, 0x1951, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, + 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, + 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040, + 0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, + 0x0276, 0xb8b4, 0x20e8, 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9, + 0x0004, 0x4003, 0x2099, 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, + 0x0004, 0x4003, 0x2069, 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, + 0x7144, 0xb96e, 0x7048, 0xb872, 0x7050, 0xb876, 0x2069, 0x0200, + 0x6817, 0x0000, 0xb8a0, 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, + 0x9182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0x9182, 0x0259, + 0x1218, 0x2009, 0x0007, 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, + 0x0006, 0x00a0, 0x9182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, + 0x9182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0x9182, 0x0581, + 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0xb992, 0x014e, + 0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, + 0x0260, 0x7034, 0xb896, 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, + 0xbbbc, 0xc384, 0xba00, 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, + 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, + 0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, + 0xc2bc, 0xba02, 0xbbbe, 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, + 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, + 0x81ff, 0x15c0, 0xaa04, 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, + 0x01c6, 0x01d6, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, + 0x9084, 0xffc0, 0x9080, 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, + 0x0001, 0x4002, 0x9086, 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, + 0x0db4, 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, + 0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x0fec, + 0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, 0x61ad, 0xa807, + 0x0001, 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, + 0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, + 0xa800, 0x9005, 0x1150, 0x080c, 0x61bc, 0x1158, 0xa804, 0x908a, + 0x0002, 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, 0x101e, 0xb8a7, + 0x0000, 0x009e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8129, 0x012e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x900e, + 0x0126, 0x2091, 0x8000, 0xb84c, 0x2048, 0xb800, 0xd0dc, 0x1170, + 0x89ff, 0x0500, 0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, + 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2908, 0xa800, + 0x2048, 0x0c70, 0x080c, 0x9446, 0xaa00, 0xb84c, 0x9906, 0x1110, + 0xba4e, 0x0020, 0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, + 0xb952, 0x89ff, 0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, + 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c, 0xb85b, 0x0010, + 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c, 0xb7f5, + 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c, + 0xb858, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, + 0x080c, 0xb819, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, + 0x0128, 0x080c, 0xb885, 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, + 0x900d, 0x1118, 0x9085, 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, + 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, + 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, + 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, + 0x0008, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, + 0xffff, 0x4104, 0x01de, 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, + 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, + 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, + 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, + 0x0146, 0x01d6, 0x3300, 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, + 0xffff, 0x4004, 0x01de, 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, + 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, + 0x0fec, 0x0168, 0x2900, 0xb8a6, 0x080c, 0x61ad, 0xa803, 0x0001, + 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, + 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, + 0xb8a7, 0x0000, 0x080c, 0x101e, 0x9085, 0x0001, 0x012e, 0x009e, + 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x6d14, + 0x01b0, 0x71c0, 0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, + 0x007e, 0x9080, 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, + 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, + 0x1853, 0x7804, 0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, + 0x080c, 0x5ff1, 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, + 0x0004, 0x0118, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, + 0x001e, 0x8108, 0x1f04, 0x6237, 0x015e, 0x080c, 0x62d3, 0x0120, + 0x2001, 0x1954, 0x200c, 0x0030, 0x2079, 0x1853, 0x7804, 0x0030, + 0x2009, 0x07d0, 0x2011, 0x6261, 0x080c, 0x7de5, 0x00fe, 0x00be, + 0x0005, 0x00b6, 0x2011, 0x6261, 0x080c, 0x7d56, 0x080c, 0x62d3, + 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, + 0x080c, 0x6311, 0x0130, 0x2009, 0x07d0, 0x2011, 0x6261, 0x080c, + 0x7de5, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, + 0x080c, 0x2c63, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, + 0x900e, 0x0016, 0x080c, 0x5ff1, 0x1538, 0xb800, 0xd0ec, 0x0520, + 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd188, + 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x630d, 0x2001, 0x0707, + 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, + 0x0029, 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x900e, + 0x080c, 0xcef9, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6289, + 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, + 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, + 0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, + 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, + 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, + 0x9b06, 0x190c, 0x0db4, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, + 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, + 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1952, 0x200c, 0x2011, 0x6303, + 0x080c, 0x7de5, 0x0005, 0x2011, 0x6303, 0x080c, 0x7d56, 0x2011, + 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x5153, 0xd0ac, + 0x0005, 0x080c, 0x5153, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, + 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, + 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, + 0x080c, 0xbe86, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, + 0x107f, 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, + 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, + 0x1817, 0x203c, 0x9780, 0x2fd9, 0x203d, 0x97bc, 0xff00, 0x873f, + 0x9006, 0x2018, 0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001, + 0x9294, 0x7fff, 0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404, + 0x905d, 0x0168, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138, + 0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108, + 0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e, + 0x0e08, 0x0048, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085, + 0x0001, 0x000e, 0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, + 0x9006, 0x000e, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007, + 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, + 0x2001, 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x191a, 0x900e, 0x710a, 0x080c, 0x5153, 0xd0fc, 0x1140, 0x080c, + 0x5153, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001, + 0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x639f, 0x639f, + 0x639f, 0x639f, 0x639f, 0x63b6, 0x63c4, 0x639f, 0x7003, 0x0003, + 0x2009, 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, + 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, + 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, + 0x00e6, 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, + 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x706a, 0x6a60, + 0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, + 0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, + 0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, + 0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, + 0x2071, 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, + 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8, + 0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x65f7, + 0xa87c, 0xd0bc, 0x1904, 0x65f7, 0xa978, 0xa874, 0x9105, 0x1904, + 0x65f7, 0x2001, 0x191a, 0x2004, 0x0002, 0x65f7, 0x6450, 0x648c, + 0x648c, 0x65f7, 0x648c, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, + 0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x65f7, 0xa87c, + 0xd0cc, 0x0904, 0x65f7, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x65f7, 0x9186, 0x0003, 0x0904, 0x648c, 0x9186, 0x0005, + 0x0904, 0x648c, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, + 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, 0x701c, 0x9005, + 0x1904, 0x67b7, 0x0e04, 0x6802, 0x2071, 0x0000, 0xa84c, 0x7082, + 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2071, + 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, + 0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x002e, + 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, + 0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, + 0x657b, 0x782c, 0x908c, 0x0780, 0x190c, 0x6929, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x64aa, 0x657b, 0x64cf, 0x6516, + 0x080c, 0x0db4, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, + 0x1170, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, + 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0c10, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6, + 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, 0x210c, + 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, + 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, + 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x19f0, + 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0800, 0x0096, 0x00e6, + 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6929, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6929, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, + 0x900d, 0x1560, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, + 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, + 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, + 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, + 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1904, 0x65d0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, + 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, + 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6929, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6929, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, + 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, + 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, + 0x1d60, 0x00ee, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, + 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, + 0x080c, 0x7c7b, 0x00ee, 0x0804, 0x658b, 0xa868, 0xd0fc, 0x1904, + 0x6633, 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0f9e, + 0x009e, 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f, + 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70e8, 0x8001, + 0x01d0, 0x1678, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, + 0x1904, 0x6731, 0x782c, 0x908c, 0x0780, 0x190c, 0x6929, 0x8004, + 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6634, 0x6731, 0x664f, + 0x66c0, 0x080c, 0x0db4, 0x70eb, 0x0fa0, 0x71e4, 0x8107, 0x9106, + 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70e6, 0x3b08, 0x3a00, + 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, + 0x0888, 0x70ea, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, + 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0c60, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x66af, 0x7830, + 0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, + 0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, + 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6929, 0xd0a4, 0x19f0, 0x0e04, 0x66a6, 0x7838, 0x7938, + 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, + 0x00de, 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009, 0x1919, + 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1917, + 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0804, 0x6662, + 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, + 0x6704, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, + 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009, + 0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, + 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, + 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x67a2, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x11b0, + 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x0d50, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6929, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, + 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, + 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x679b, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x117e, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, + 0x9200, 0x70be, 0x080c, 0x7c7b, 0x00ee, 0x0804, 0x6741, 0x2071, + 0x1906, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1128, 0x1e04, 0x67e2, 0x002e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, + 0x0e04, 0x67cc, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d, + 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, + 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x117e, 0x2071, 0x1906, 0x080c, 0x6915, 0x002e, + 0x00ee, 0x0005, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010, + 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, + 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, + 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, + 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, + 0x7c7b, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, + 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, + 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, + 0xa87a, 0xa982, 0x0005, 0x2071, 0x1906, 0x7004, 0x0002, 0x684d, + 0x684e, 0x6914, 0x684e, 0x0db4, 0x6914, 0x0005, 0x2001, 0x191a, + 0x2004, 0x0002, 0x6858, 0x6858, 0x68ad, 0x68ae, 0x6858, 0x68ae, + 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6934, 0x701c, 0x904d, 0x01e0, + 0xa84c, 0x9005, 0x01d8, 0x0e04, 0x687c, 0xa94c, 0x2071, 0x0000, + 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, + 0x2071, 0x1906, 0x080c, 0x6915, 0x012e, 0x0470, 0x2001, 0x005b, + 0x2004, 0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x2071, 0x1906, + 0x1510, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, + 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, + 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, + 0x1906, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, + 0x2069, 0x19c9, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, + 0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1a8f, 0x210c, 0x9102, + 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, + 0x9106, 0x0190, 0x0e04, 0x68e0, 0x2069, 0x0000, 0x6837, 0x8040, + 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x117e, 0x2069, 0x19c9, 0x683f, 0xffff, + 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x69a5, 0x701c, + 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, + 0xd09c, 0x1500, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, + 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, + 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, + 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, + 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, + 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x101e, 0x0005, 0x012e, + 0x0005, 0x2091, 0x8000, 0x0e04, 0x692b, 0x0006, 0x0016, 0x2001, + 0x8004, 0x0006, 0x0804, 0x0dbd, 0x0096, 0x00f6, 0x2079, 0x0050, + 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, + 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, + 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1919, 0x2104, + 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, + 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, + 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, + 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, + 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, + 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, + 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009, 0x1919, 0x200b, + 0x0000, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, + 0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, + 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, + 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x1d70, 0x00d6, 0x2069, + 0x0050, 0x693c, 0x2069, 0x191a, 0x6808, 0x690a, 0x2069, 0x19c9, + 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x191b, 0x200c, + 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7094, 0x908a, + 0x0029, 0x1a0c, 0x0db4, 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00, + 0x0005, 0x6ac9, 0x6a53, 0x6a6f, 0x6a97, 0x6ab8, 0x6af8, 0x6b0a, + 0x6a6f, 0x6ae0, 0x6a0e, 0x6a3c, 0x6a0d, 0x0005, 0x00d6, 0x2069, + 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x7097, + 0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x6e4d, 0x6028, + 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, 0x2069, 0x195e, + 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, + 0x0046, 0x0056, 0x2071, 0x1a31, 0x080c, 0x18a6, 0x005e, 0x004e, + 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, + 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, 0x0028, 0x2069, + 0x195e, 0x2d04, 0x7002, 0x080c, 0x6ee7, 0x6028, 0x9085, 0x0600, + 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29bc, + 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6b77, 0xd1d4, 0x1160, + 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, 0x080c, 0x6b77, + 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x2001, + 0x0088, 0x080c, 0x29bc, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, + 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, 0x600c, + 0xc0b4, 0x600e, 0x080c, 0x6d40, 0x2001, 0x0080, 0x080c, 0x29bc, + 0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, + 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x60e3, + 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6d40, 0x2001, 0x0080, + 0x080c, 0x29bc, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, + 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040, 0x7097, + 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, + 0x2001, 0x00a0, 0x080c, 0x29bc, 0x6124, 0xd1dc, 0x1138, 0xd1e4, + 0x0138, 0x080c, 0x18d0, 0x7097, 0x001e, 0x0010, 0x7097, 0x001d, + 0x0005, 0x080c, 0x6bfa, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6b77, + 0x0016, 0x080c, 0x18d0, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, + 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6b77, 0x0005, + 0x0006, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x000e, 0x6124, 0xd1d4, + 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, + 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, 0x0005, + 0x080c, 0x6bfa, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, + 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, + 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29bc, 0x000e, + 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, + 0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097, + 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, + 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, + 0x2091, 0x8000, 0x080c, 0x6d14, 0x11d8, 0x2001, 0x180c, 0x200c, + 0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2905, + 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x080c, + 0x6ff8, 0x080c, 0x5a94, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, + 0x080c, 0x6d2e, 0x0150, 0x080c, 0x6d25, 0x1138, 0x2001, 0x0001, + 0x080c, 0x24b4, 0x080c, 0x6cec, 0x00a0, 0x080c, 0x6bf7, 0x0178, + 0x2001, 0x0001, 0x080c, 0x24b4, 0x7094, 0x9086, 0x001e, 0x0120, + 0x7094, 0x9086, 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, 0x7097, + 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, + 0x2011, 0x6b88, 0x080c, 0x7e27, 0x002e, 0x0016, 0x0026, 0x2009, + 0x0064, 0x2011, 0x6b88, 0x080c, 0x7e1e, 0x002e, 0x001e, 0x0005, + 0x00e6, 0x00f6, 0x0016, 0x080c, 0x90c1, 0x2071, 0x1800, 0x080c, + 0x6b25, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x90c1, 0x2061, + 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, + 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x93f3, 0x2011, 0x0002, + 0x080c, 0x93fd, 0x080c, 0x92e4, 0x080c, 0x7dd3, 0x0036, 0x901e, + 0x080c, 0x935a, 0x003e, 0x60e3, 0x0000, 0x080c, 0xd4e3, 0x080c, + 0xd4fe, 0x2009, 0x0004, 0x080c, 0x290b, 0x080c, 0x2826, 0x2001, + 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x6b88, 0x080c, + 0x7e27, 0x080c, 0x6d2e, 0x0118, 0x9006, 0x080c, 0x29bc, 0x080c, + 0x0b8f, 0x2001, 0x0001, 0x080c, 0x24b4, 0x012e, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, + 0x2011, 0x6b95, 0x2071, 0x19c9, 0x701c, 0x9206, 0x1118, 0x7018, + 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, + 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, + 0x2001, 0x00c0, 0x080c, 0x29bc, 0x0156, 0x20a9, 0x002d, 0x1d04, + 0x6c07, 0x2091, 0x6000, 0x1f04, 0x6c07, 0x015e, 0x00d6, 0x2069, + 0x1800, 0x6898, 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, 0x0005, + 0x689b, 0x0014, 0x68e4, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, + 0x1da8, 0x080c, 0x7e33, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, + 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7007, 0x2001, + 0x193e, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, + 0x257f, 0x9006, 0x080c, 0x29bc, 0x080c, 0x5953, 0x6027, 0xffff, + 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, + 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, + 0x194e, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, + 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6cdc, + 0x7097, 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023, + 0x0010, 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, + 0x0001, 0x080c, 0x257f, 0x0026, 0x080c, 0x9a4e, 0x002e, 0x7000, + 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, + 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, + 0x0150, 0x012e, 0x015e, 0x080c, 0xbe86, 0x0118, 0x9006, 0x080c, + 0x29e6, 0x0804, 0x6ce8, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, + 0x080c, 0x2905, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, + 0x29bc, 0x1f04, 0x6c86, 0x080c, 0x6d6b, 0x012e, 0x015e, 0x080c, + 0x6d25, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, 0x0006, 0x9085, + 0x0020, 0x6052, 0x080c, 0x6d6b, 0x9006, 0x8001, 0x1df0, 0x000e, + 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x6d6b, 0x080c, + 0xbe86, 0x0118, 0x9006, 0x080c, 0x29e6, 0x0016, 0x0026, 0x7000, + 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x6b95, 0x080c, + 0x7de5, 0x002e, 0x001e, 0x080c, 0x7c72, 0x7034, 0xc085, 0x7036, + 0x2001, 0x194e, 0x2003, 0x0004, 0x080c, 0x69f6, 0x080c, 0x6d25, + 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x6ffd, + 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, + 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7c89, 0x080c, + 0x7c7b, 0x080c, 0x7007, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, + 0x7096, 0x60e2, 0x6886, 0x080c, 0x257f, 0x9006, 0x080c, 0x29bc, + 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, + 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004, + 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157, 0x9084, + 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157, + 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, + 0x5157, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, + 0x080c, 0x5157, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, + 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, + 0x0020, 0x080c, 0x259f, 0x900e, 0x0028, 0x080c, 0x630d, 0x1dc8, + 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x2e4a, 0x9006, 0x0019, + 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, + 0x080c, 0xbe7f, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, + 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, + 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138, 0x6050, + 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, + 0x1d04, 0x6d80, 0x2091, 0x6000, 0x1f04, 0x6d80, 0x602f, 0x0100, + 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, + 0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, + 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, + 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x257f, 0x2001, 0x00a0, + 0x0006, 0x080c, 0xbe86, 0x000e, 0x0130, 0x080c, 0x29da, 0x9006, + 0x080c, 0x29e6, 0x0010, 0x080c, 0x29bc, 0x000e, 0x6052, 0x6050, + 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x287a, + 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, + 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, + 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c, + 0xc1c5, 0x2102, 0x0804, 0x6e3f, 0x2001, 0x180c, 0x200c, 0xc1c4, + 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, + 0x0090, 0x080c, 0x29bc, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, + 0x1d04, 0x6ded, 0x2091, 0x6000, 0x1f04, 0x6ded, 0x2011, 0x0003, + 0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4, + 0x901e, 0x080c, 0x935a, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x080c, + 0x6ff8, 0x080c, 0x5a94, 0x080c, 0xbe86, 0x0110, 0x080c, 0x0d22, + 0x9085, 0x0001, 0x0490, 0x86ff, 0x1110, 0x080c, 0x18d0, 0x60e3, + 0x0000, 0x2001, 0x0002, 0x080c, 0x257f, 0x60e2, 0x2001, 0x0080, + 0x080c, 0x29bc, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, + 0x080c, 0x2905, 0x6024, 0x910c, 0x0138, 0x1d04, 0x6e24, 0x2091, + 0x6000, 0x1f04, 0x6e24, 0x0810, 0x6028, 0x9085, 0x1e00, 0x602a, + 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, + 0xbe86, 0x0110, 0x080c, 0x0d22, 0x9006, 0x00ee, 0x00de, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, + 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, + 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a46, 0x2d04, 0x8000, + 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, + 0x9005, 0x1904, 0x6eb2, 0x2001, 0x0088, 0x080c, 0x29bc, 0x9006, + 0x60e2, 0x6886, 0x080c, 0x257f, 0x2069, 0x0200, 0x6804, 0x9005, + 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, + 0x6027, 0x0400, 0x2069, 0x195e, 0x7000, 0x206a, 0x7097, 0x0026, + 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6e94, 0x2091, 0x6000, + 0x1f04, 0x6e94, 0x0804, 0x6edf, 0x2069, 0x0140, 0x20a9, 0x0384, + 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2905, 0x6024, 0x910c, + 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x6ea0, 0x2091, 0x6000, + 0x1f04, 0x6ea0, 0x2011, 0x0003, 0x080c, 0x93f3, 0x2011, 0x0002, + 0x080c, 0x93fd, 0x080c, 0x92e4, 0x901e, 0x080c, 0x935a, 0x2001, + 0x00a0, 0x080c, 0x29bc, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x9085, + 0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, 0x29bc, 0x2069, 0x0140, + 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x2001, 0x0002, 0x080c, 0x257f, 0x60e2, 0x9006, 0x00ee, + 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, + 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, + 0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4, + 0x901e, 0x080c, 0x935a, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, + 0x29bc, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x0804, 0x6f79, 0x2001, + 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6b7d, + 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x29bc, 0x60e3, 0x0000, + 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, + 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195e, + 0x7000, 0x206a, 0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x6f79, + 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2905, 0x6024, 0x910c, + 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x6f38, 0x0006, 0x0016, + 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7cba, 0x00ee, 0x00de, 0x00ce, + 0x001e, 0x000e, 0x00e6, 0x2071, 0x19c9, 0x7018, 0x00ee, 0x9005, + 0x19f8, 0x01f8, 0x0026, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011, + 0x6b88, 0x080c, 0x7e27, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, + 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, + 0x0002, 0x080c, 0x257f, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, + 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, + 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbe7f, 0x1904, 0x6fe6, + 0x7130, 0xd184, 0x1170, 0x080c, 0x2fd4, 0x0138, 0xc18d, 0x7132, + 0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, + 0x6fe6, 0x2011, 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e, + 0x080c, 0xd104, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, + 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x5ff1, 0x1170, + 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xd188, 0x2009, + 0x0001, 0x2011, 0x0100, 0x080c, 0x7f4a, 0x001e, 0x8108, 0x1f04, + 0x6faf, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, + 0x0002, 0x2019, 0x0004, 0x080c, 0x2e4a, 0x001e, 0x0078, 0x0156, + 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5ff1, 0x1110, 0x080c, + 0x5aae, 0x8108, 0x1f04, 0x6fdc, 0x00be, 0x015e, 0x080c, 0x18d0, + 0x080c, 0x9a4e, 0x60e3, 0x0000, 0x080c, 0x5a94, 0x080c, 0x6c46, + 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, + 0x2001, 0x194e, 0x2003, 0x0001, 0x0005, 0x2001, 0x194e, 0x2003, + 0x0000, 0x0005, 0x2001, 0x194d, 0x2003, 0xaaaa, 0x0005, 0x2001, + 0x194d, 0x2003, 0x0000, 0x0005, 0x2071, 0x18f0, 0x7003, 0x0000, + 0x7007, 0x0000, 0x080c, 0x1005, 0x090c, 0x0db4, 0xa8ab, 0xdcb0, + 0x2900, 0x704e, 0x080c, 0x1005, 0x090c, 0x0db4, 0xa8ab, 0xdcb0, + 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, + 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, + 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, + 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, + 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, + 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, + 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, + 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, + 0x2069, 0x18f0, 0x6807, 0x0001, 0x00de, 0x080c, 0x75e4, 0x9006, + 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, + 0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, + 0x3e08, 0x1f04, 0x706e, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, + 0x18f0, 0x7004, 0x0002, 0x708d, 0x708e, 0x70c5, 0x7120, 0x724c, + 0x708b, 0x708b, 0x7276, 0x080c, 0x0db4, 0x0005, 0x2079, 0x0040, + 0x782c, 0x908c, 0x0780, 0x190c, 0x7670, 0xd0a4, 0x01f0, 0x7824, + 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, + 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, + 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, + 0x9186, 0x0003, 0x19e8, 0x080c, 0x7120, 0x782c, 0xd09c, 0x090c, + 0x75e4, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, + 0x080c, 0x7156, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x7156, 0x7156, + 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7178, 0x7156, + 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, + 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, + 0x7156, 0x7156, 0x7162, 0x7156, 0x734b, 0x7156, 0x7156, 0x7156, + 0x7156, 0x7156, 0x7162, 0x738c, 0x73cd, 0x7414, 0x7428, 0x7156, + 0x7156, 0x7178, 0x7162, 0x7156, 0x7156, 0x7220, 0x74d3, 0x74ee, + 0x7156, 0x7178, 0x7156, 0x7156, 0x7156, 0x7156, 0x7216, 0x74ee, + 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, + 0x7156, 0x718c, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, + 0x7156, 0x7156, 0x7156, 0x7614, 0x7156, 0x7156, 0x7156, 0x7156, + 0x7156, 0x71a0, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, + 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, + 0x760d, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, + 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, + 0x00e9, 0x080c, 0x75e4, 0x0005, 0x7156, 0x7162, 0x7337, 0x7156, + 0x7162, 0x7156, 0x7162, 0x7162, 0x7156, 0x7162, 0x7337, 0x7162, + 0x7162, 0x7162, 0x7162, 0x7162, 0x7156, 0x7162, 0x7337, 0x7156, + 0x7156, 0x7162, 0x7156, 0x7156, 0x7156, 0x7162, 0x00e6, 0x2071, + 0x18f0, 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, + 0x0049, 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, + 0x0009, 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, + 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, 0x0005, + 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, + 0x0001, 0x0804, 0x72f5, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, + 0x701a, 0x704b, 0x72f5, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, + 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7310, 0x7007, + 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7310, 0x0005, + 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x715e, + 0x7007, 0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, 0x15f0, 0xa994, + 0x9186, 0x006f, 0x0158, 0x9186, 0x0074, 0x1510, 0x0026, 0x2011, + 0x0010, 0x080c, 0x6339, 0x002e, 0x01d8, 0x0090, 0x080c, 0x6d14, + 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, + 0x00c8, 0x0026, 0x2011, 0x8008, 0x080c, 0x6339, 0x002e, 0x0140, + 0xa897, 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, + 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5cc3, + 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, + 0xa982, 0x080c, 0x65f2, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, + 0x0904, 0x71af, 0x9186, 0x0064, 0x0904, 0x71af, 0x9186, 0x007c, + 0x0904, 0x71af, 0x9186, 0x0028, 0x0904, 0x71af, 0x9186, 0x0038, + 0x0904, 0x71af, 0x9186, 0x0078, 0x0904, 0x71af, 0x9186, 0x005f, + 0x0904, 0x71af, 0x9186, 0x0056, 0x0904, 0x71af, 0xa897, 0x4005, + 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, + 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7505, + 0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, + 0x9080, 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, + 0x9080, 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, + 0x1a04, 0x7166, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7166, 0x82ff, + 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x72b3, 0x0018, + 0x9280, 0x72a9, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7294, + 0x080c, 0x1005, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, + 0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, + 0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, + 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, + 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10cc, 0xa06c, 0x908e, + 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, + 0x7020, 0x2048, 0x080c, 0x101e, 0x7014, 0x2048, 0x0804, 0x7166, + 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, + 0xa906, 0x711a, 0x0804, 0x724c, 0x7014, 0x2048, 0x7007, 0x0001, + 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7505, 0x0804, + 0x72f5, 0x72ab, 0x72af, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, + 0x001b, 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, + 0x0066, 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, + 0xb0de, 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, + 0xb0ca, 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, + 0xb7be, 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, + 0xb09e, 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, + 0xb08a, 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, + 0xb07e, 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, + 0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1833, 0x210c, + 0x81ff, 0x1178, 0x080c, 0x5b10, 0x1108, 0x0005, 0x080c, 0x682c, + 0x0126, 0x2091, 0x8000, 0x080c, 0xba7b, 0x080c, 0x65f2, 0x012e, + 0x0ca0, 0x080c, 0xbe7f, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, + 0x2009, 0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, + 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5c25, 0x1138, + 0x0005, 0x9006, 0xa87a, 0x080c, 0x5ba0, 0x1108, 0x0005, 0x0126, + 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x65f2, 0x012e, 0x0cb0, + 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, + 0xa802, 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, + 0x0118, 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, + 0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, + 0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, + 0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, + 0x9005, 0x11d8, 0xa974, 0x080c, 0x5ff1, 0x11b8, 0x0066, 0xae80, + 0x080c, 0x6101, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, + 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x5ff1, 0x1110, 0x080c, + 0x6201, 0x8108, 0x1f04, 0x7374, 0x00ce, 0xa87c, 0xd084, 0x1120, + 0x080c, 0x101e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, + 0x65f2, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x080c, 0x6311, 0x0580, 0x2061, 0x1a3e, 0x6100, 0xd184, + 0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, + 0x6004, 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, + 0x2011, 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, + 0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, + 0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, + 0x6202, 0x012e, 0x0804, 0x75ce, 0x012e, 0x0804, 0x75c8, 0x012e, + 0x0804, 0x75c2, 0x012e, 0x0804, 0x75c5, 0x0126, 0x2091, 0x8000, + 0x7007, 0x0001, 0x080c, 0x6311, 0x05e0, 0x2061, 0x1a3e, 0x6000, + 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, + 0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, + 0x9210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, + 0x9484, 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, + 0x0004, 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, + 0x1168, 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, + 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x75ce, 0x012e, 0x0804, + 0x75cb, 0x012e, 0x0804, 0x75c8, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x2061, 0x1a3e, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, + 0x0220, 0x630a, 0x012e, 0x0804, 0x75dc, 0x012e, 0x0804, 0x75cb, + 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, + 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a3e, 0x6000, 0x9084, 0xfcff, + 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, + 0x0598, 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9af8, + 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, + 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0x9b42, 0xa988, 0x918c, + 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, + 0x080c, 0x7f4a, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3e, + 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, + 0x012e, 0x00be, 0x0804, 0x75ce, 0x00ce, 0x012e, 0x00be, 0x0804, + 0x75c8, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, + 0x9186, 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, + 0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, + 0x0029, 0x1d10, 0xa974, 0x080c, 0x5ff1, 0x1968, 0xb800, 0xc0e4, + 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, + 0x1955, 0x2004, 0x601a, 0x0804, 0x7463, 0xa88c, 0x9065, 0x0960, + 0x00e6, 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, + 0x080c, 0x9af8, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9af8, 0x00ee, + 0x0804, 0x7463, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, + 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, + 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, + 0x00ee, 0x0804, 0x7463, 0x2061, 0x1a3e, 0x6000, 0xd084, 0x0190, + 0xd08c, 0x1904, 0x75dc, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, + 0x0220, 0x6206, 0x012e, 0x0804, 0x75dc, 0x012e, 0xa883, 0x0016, + 0x0804, 0x75d5, 0xa883, 0x0007, 0x0804, 0x75d5, 0xa864, 0x8007, + 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, + 0x0005, 0x080c, 0x715e, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, + 0x7016, 0x701a, 0x704b, 0x7505, 0x0005, 0x00b6, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, + 0x7587, 0x6130, 0xd194, 0x1904, 0x75b1, 0xa878, 0x2070, 0x9e82, + 0x1cd0, 0x0a04, 0x757b, 0x6064, 0x9e02, 0x1a04, 0x757b, 0x7120, + 0x9186, 0x0006, 0x1904, 0x756d, 0x7010, 0x905d, 0x0904, 0x7587, + 0xb800, 0xd0e4, 0x1904, 0x75ab, 0x2061, 0x1a3e, 0x6100, 0x9184, + 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x75b4, + 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, + 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x75b7, 0x080c, 0x5153, 0xd09c, + 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x7e6a, 0x012e, + 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, + 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x75b7, 0x012e, 0x00ee, 0x00be, + 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x75d5, + 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x5ff1, + 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, + 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, + 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, + 0x5157, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, + 0x6064, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, + 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, + 0x9086, 0x0007, 0x1904, 0x7511, 0x7003, 0x0002, 0x0804, 0x7511, + 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, + 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, + 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xcd45, 0x012e, 0x00ee, + 0x00be, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, + 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, + 0xa884, 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, + 0x080c, 0x65f2, 0x012e, 0x0005, 0x080c, 0x101e, 0x0005, 0x00d6, + 0x080c, 0x7e61, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, + 0x190c, 0x7670, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, + 0x0040, 0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, + 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, + 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, + 0x190c, 0x7670, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, + 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, + 0x7661, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, + 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, + 0x04b0, 0x2b10, 0x080c, 0x9a72, 0x1118, 0x080c, 0x9b15, 0x05a8, + 0x6212, 0xa874, 0x0002, 0x763f, 0x7644, 0x7647, 0x764d, 0x2019, + 0x0002, 0x080c, 0xd104, 0x0060, 0x080c, 0xd0a0, 0x0048, 0x2019, + 0x0002, 0xa980, 0x080c, 0xd0bb, 0x0018, 0xa980, 0x080c, 0xd0a0, + 0x080c, 0x9ac8, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, + 0x65f2, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, + 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, + 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, + 0x2091, 0x8000, 0x0e04, 0x7672, 0x0006, 0x0016, 0x2001, 0x8003, + 0x0006, 0x0804, 0x0dbd, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, + 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, + 0xd1ec, 0x1120, 0x080c, 0x148b, 0x00fe, 0x0005, 0x2001, 0x020d, + 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, + 0x0904, 0x76dc, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x7c72, 0x7d44, + 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, + 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, 0x9084, + 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, + 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xd4bb, + 0x080c, 0x7bb7, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, + 0x080c, 0x7c15, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, + 0x773e, 0x080c, 0x2075, 0x005e, 0x004e, 0x0020, 0x080c, 0xd4bb, + 0x7817, 0x0140, 0x080c, 0x771f, 0x2001, 0x19bf, 0x2004, 0x9005, + 0x090c, 0x868e, 0x0005, 0x0002, 0x76f5, 0x79d9, 0x76ec, 0x76ec, + 0x76ec, 0x76ec, 0x76ec, 0x76ec, 0x7817, 0x0140, 0x2001, 0x19bf, + 0x2004, 0x9005, 0x090c, 0x868e, 0x0005, 0x7000, 0x908c, 0xff00, + 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, + 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x51aa, 0x0070, + 0x080c, 0x775e, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7914, + 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x7ae7, 0x7817, 0x0140, + 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, + 0x46b9, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, + 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, + 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, + 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, + 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x46b9, + 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, + 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, + 0x0023, 0x1904, 0x78e5, 0x9186, 0x0023, 0x15c0, 0x080c, 0x7b7c, + 0x0904, 0x78e5, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, + 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x78e5, + 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, + 0x080c, 0x9b42, 0x0804, 0x78e5, 0x908e, 0x0214, 0x0118, 0x908e, + 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x9b42, 0x0804, 0x78e5, + 0x908e, 0x0100, 0x1904, 0x78e5, 0x7034, 0x9005, 0x1904, 0x78e5, + 0x2009, 0x0016, 0x080c, 0x9b42, 0x0804, 0x78e5, 0x9186, 0x0022, + 0x1904, 0x78e5, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, + 0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, + 0x687e, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, + 0x00ff, 0x0016, 0x2008, 0x080c, 0x2554, 0x7932, 0x7936, 0x001e, + 0x000e, 0x00fe, 0x080c, 0x250b, 0x695a, 0x703c, 0x00e6, 0x2071, + 0x0140, 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, + 0x1904, 0x78e5, 0x2009, 0x0017, 0x0804, 0x78b2, 0x908e, 0x0400, + 0x1190, 0x7034, 0x9005, 0x1904, 0x78e5, 0x080c, 0x6d14, 0x0120, + 0x2009, 0x001d, 0x0804, 0x78b2, 0x68d8, 0xc0a5, 0x68da, 0x2009, + 0x0030, 0x0804, 0x78b2, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, + 0x1904, 0x78e5, 0x2009, 0x0018, 0x0804, 0x78b2, 0x908e, 0x2010, + 0x1120, 0x2009, 0x0019, 0x0804, 0x78b2, 0x908e, 0x2110, 0x1120, + 0x2009, 0x001a, 0x0804, 0x78b2, 0x908e, 0x5200, 0x1140, 0x7034, + 0x9005, 0x1904, 0x78e5, 0x2009, 0x001b, 0x0804, 0x78b2, 0x908e, + 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x78e5, 0x2009, 0x001c, + 0x0804, 0x78b2, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, + 0x78b2, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x78e5, + 0x2009, 0x0024, 0x0804, 0x78b2, 0x908c, 0xff00, 0x918e, 0x2400, + 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, + 0x78b2, 0x080c, 0xc51c, 0x1904, 0x78e5, 0x0804, 0x78b0, 0x908c, + 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x78b2, + 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x78b2, 0x908e, + 0x5300, 0x1108, 0x0440, 0x908e, 0x6104, 0x1528, 0x2029, 0x0205, + 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, + 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, + 0x46b9, 0x004e, 0x8108, 0x0f04, 0x787e, 0x9186, 0x0280, 0x1d88, + 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, + 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f, + 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e, + 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, + 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118, + 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118, + 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, + 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, + 0x080c, 0x250b, 0x1568, 0x080c, 0x5f91, 0x1550, 0xbe12, 0xbd16, + 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, + 0x6878, 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, + 0x001e, 0x0098, 0x080c, 0x9a72, 0x01a8, 0x2b08, 0x6112, 0x6023, + 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, + 0x000a, 0x0016, 0x001e, 0x080c, 0x9b42, 0x00ce, 0x00be, 0x0005, + 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, + 0x8049, 0x080c, 0x46b9, 0x080c, 0x9b15, 0x0d90, 0x2b08, 0x6112, + 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, + 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, + 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, + 0x0001, 0x080c, 0x8154, 0x08a0, 0x080c, 0x2f9e, 0x1140, 0x7010, + 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, + 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0033, 0x11e8, 0x080c, 0x7b7c, 0x0904, 0x7971, 0x7124, 0x610a, + 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, 0x2009, + 0x0015, 0x080c, 0x9b42, 0x04a8, 0x908e, 0x0100, 0x1590, 0x7034, + 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x9b42, 0x0450, 0x9186, + 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, 0x0038, + 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x250b, + 0x11b8, 0x080c, 0x5f91, 0x11a0, 0xbe12, 0xbd16, 0x080c, 0x9a72, + 0x0178, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0004, 0x7120, + 0x610a, 0x001e, 0x080c, 0x9b42, 0x080c, 0x868e, 0x0010, 0x00ce, + 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, + 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, + 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x79d3, + 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x79d3, 0x9596, + 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, + 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, + 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, + 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, + 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, + 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, + 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, + 0x8420, 0x8e70, 0x1f04, 0x79a8, 0x82ff, 0x1118, 0x9085, 0x0001, + 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, + 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x0002, + 0x79f0, 0x79f0, 0x79f0, 0x7b8e, 0x79f0, 0x79f9, 0x7a24, 0x7ab2, + 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, + 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, + 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c, + 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6864, 0x9c02, 0x1290, + 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, + 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046, + 0x080c, 0x9b42, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, + 0x090c, 0x868e, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, + 0x0904, 0x7a88, 0x7110, 0xd1bc, 0x1904, 0x7a88, 0x7108, 0x700c, + 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, 0x81ff, + 0x15a0, 0x9080, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, + 0x0080, 0x9106, 0x0904, 0x7a88, 0x080c, 0x5f91, 0x1904, 0x7a88, + 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, 0xff00, + 0x9286, 0x0600, 0x11a0, 0x080c, 0x9a72, 0x05e8, 0x2b08, 0x7028, + 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, + 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xc774, 0x0408, 0x080c, + 0x6315, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x7975, 0x11c0, + 0x0898, 0x080c, 0x9a72, 0x2b08, 0x0198, 0x6112, 0x6023, 0x0004, + 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, + 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, + 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, + 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, + 0x2011, 0x8049, 0x080c, 0x46b9, 0x080c, 0x9b15, 0x0d48, 0x2b08, + 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x6017, + 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x810c, 0x080c, + 0x868e, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, 0x2060, + 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6864, 0x9c02, + 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, + 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, + 0x0045, 0x080c, 0x9b42, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, + 0x9005, 0x090c, 0x868e, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, + 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, + 0x2f9e, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, + 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, + 0x7afe, 0x7aff, 0x7afe, 0x7afe, 0x7b5e, 0x7b6d, 0x0005, 0x00b6, + 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7b5c, 0x700c, + 0x7108, 0x080c, 0x250b, 0x1904, 0x7b5c, 0x080c, 0x5f91, 0x1904, + 0x7b5c, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x6315, + 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7b7c, 0x00ce, + 0x05d8, 0x080c, 0x9a72, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xbc01, + 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9b42, + 0x0458, 0x080c, 0x6315, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, + 0x631d, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x9a72, 0x2b08, + 0x01d8, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0005, 0x7120, 0x610a, + 0x2009, 0x0088, 0x080c, 0x9b42, 0x0078, 0x080c, 0x9a72, 0x2b08, + 0x0158, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0004, 0x7120, 0x610a, + 0x2009, 0x0001, 0x080c, 0x9b42, 0x00be, 0x0005, 0x7110, 0xd1bc, + 0x0158, 0x00d1, 0x0148, 0x080c, 0x7add, 0x1130, 0x7124, 0x610a, + 0x2009, 0x0089, 0x080c, 0x9b42, 0x0005, 0x7110, 0xd1bc, 0x0158, + 0x0059, 0x0148, 0x080c, 0x7add, 0x1130, 0x7124, 0x610a, 0x2009, + 0x008a, 0x080c, 0x9b42, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0007, + 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9c02, + 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, + 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, 0x11b0, 0x9c82, + 0x1cd0, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, + 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, + 0x1120, 0x2009, 0x0051, 0x080c, 0x9b42, 0x7817, 0x0140, 0x2001, + 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, 0x00be, 0x0005, 0x2031, + 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, + 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, + 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05d0, + 0x080c, 0x9a72, 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, + 0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x15a0, 0x080c, 0x5f91, + 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, + 0xbc01, 0x080c, 0x0fec, 0x0510, 0x2900, 0x605a, 0x9006, 0xa802, + 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, + 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, + 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154, + 0x080c, 0x868e, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0x9ac8, + 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, + 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x7c6c, + 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, + 0x7c6e, 0x7030, 0x908e, 0x0400, 0x0904, 0x7c6e, 0x908e, 0x6000, + 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, + 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x62d3, + 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, + 0x1518, 0x687c, 0x69ac, 0x918c, 0xff00, 0x9105, 0x7104, 0x9106, + 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e, + 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8, + 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7b7c, 0x0128, 0x6004, + 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, + 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, + 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, + 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, + 0x0005, 0x2071, 0x19c9, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, + 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x7026, + 0x702b, 0x90d7, 0x7032, 0x7037, 0x9145, 0x703f, 0xffff, 0x7042, + 0x7047, 0x4ff2, 0x704a, 0x705b, 0x7dee, 0x080c, 0x1005, 0x090c, + 0x0db4, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, + 0xdcb0, 0x0005, 0x2071, 0x19c9, 0x1d04, 0x7d45, 0x2091, 0x6000, + 0x700c, 0x8001, 0x700e, 0x1510, 0x2001, 0x1875, 0x2004, 0xd0c4, + 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, + 0x20d1, 0x0000, 0x080c, 0x0db4, 0x700f, 0x0361, 0x7007, 0x0001, + 0x0126, 0x2091, 0x8000, 0x080c, 0x7e33, 0x7040, 0x900d, 0x0148, + 0x8109, 0x7142, 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, + 0x8000, 0x7024, 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, + 0x7023, 0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, + 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, + 0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, + 0x0128, 0x9184, 0x007f, 0x090c, 0x91bf, 0x0010, 0x7034, 0x080f, + 0x703c, 0x9005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, + 0x0168, 0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, + 0x714e, 0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, + 0x01d8, 0x0016, 0x7070, 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, + 0x1138, 0x706f, 0x0009, 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, + 0x001e, 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, + 0x711a, 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x7d6d, + 0x7d6e, 0x7d8a, 0x00e6, 0x2071, 0x19c9, 0x7018, 0x9005, 0x1120, + 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, + 0x2071, 0x19c9, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, + 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x19c9, 0xb888, + 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110, + 0x080c, 0x5ff1, 0x1168, 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140, + 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x868e, 0x001e, 0x012e, + 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, + 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, + 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xba92, 0x6018, + 0x9005, 0x0510, 0x8001, 0x601a, 0x11f8, 0x6120, 0x9186, 0x0003, + 0x0118, 0x9186, 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a, + 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, + 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, + 0xd0e4, 0x0110, 0x080c, 0xb4ab, 0x012e, 0x9c88, 0x0018, 0x7116, + 0x2001, 0x1819, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, + 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c9, 0x7027, 0x07d0, 0x7023, + 0x0009, 0x00ee, 0x0005, 0x2001, 0x19d2, 0x2003, 0x0000, 0x0005, + 0x00e6, 0x2071, 0x19c9, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, + 0x2011, 0x19d5, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c9, + 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, + 0x7054, 0x8000, 0x7056, 0x2001, 0x19d7, 0x2044, 0xa06c, 0x9086, + 0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, + 0x705c, 0xa08e, 0x080c, 0x10cc, 0x002e, 0x008e, 0x0005, 0x0006, + 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x0156, 0x080c, 0x7cba, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, + 0x19c9, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, + 0x0006, 0x2071, 0x19c9, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, + 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518, + 0x0026, 0xd1ec, 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, + 0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, + 0x0007, 0x0110, 0x69e6, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, + 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6, + 0x080c, 0x0ecb, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3e, 0x00ce, + 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a3e, + 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, + 0x00c6, 0x2061, 0x1a3e, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, + 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, + 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, + 0x7ef4, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x7ecd, 0x2009, 0x0006, + 0x080c, 0x7f21, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, + 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, + 0x7f1b, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, + 0x11e8, 0x2009, 0x1875, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, + 0x2009, 0x0043, 0x0804, 0x9b42, 0x0005, 0x87ff, 0x1de8, 0x2009, + 0x0042, 0x0804, 0x9b42, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, + 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, + 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, + 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x7f1b, 0x908c, 0x2020, + 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x15ad, + 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9b42, + 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, + 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, + 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, + 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x9b42, 0x0005, 0x00b9, + 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9b42, 0x0cb0, + 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, + 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, + 0x0001, 0x0096, 0x080c, 0xb793, 0x0518, 0x6014, 0x2048, 0xa982, + 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, + 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3e, 0x6200, 0xd28c, + 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x642c, + 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x7e6a, 0x007e, + 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3e, 0x6000, 0x81ff, + 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, + 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, + 0x9085, 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, + 0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, + 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, + 0x3e08, 0x1208, 0x9200, 0x1f04, 0x7f6c, 0x93a6, 0x0008, 0x1118, + 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, + 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, + 0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, 0x8213, 0x2039, + 0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, + 0x3e08, 0x0228, 0x911a, 0x1220, 0x1f04, 0x7f96, 0x0028, 0x911a, + 0x2308, 0x8210, 0x1f04, 0x7f96, 0x0006, 0x3200, 0x9084, 0xefff, + 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, + 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19b6, + 0x012e, 0x00d6, 0x2069, 0x19b6, 0x6803, 0x0005, 0x0156, 0x0146, + 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0x98d5, 0x0401, + 0x080c, 0x98c0, 0x00e9, 0x080c, 0x98c3, 0x00d1, 0x080c, 0x98c6, + 0x00b9, 0x080c, 0x98c9, 0x00a1, 0x080c, 0x98cc, 0x0089, 0x080c, + 0x98cf, 0x0071, 0x080c, 0x98d2, 0x0059, 0x01de, 0x014e, 0x015e, + 0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, 0x00de, 0x0005, + 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, + 0x00c6, 0x6027, 0x0001, 0x7804, 0x9084, 0x0007, 0x0002, 0x8009, + 0x802d, 0x806c, 0x800f, 0x802d, 0x8009, 0x8007, 0x8007, 0x080c, + 0x0db4, 0x080c, 0x7dd3, 0x080c, 0x868e, 0x00ce, 0x0005, 0x62c0, + 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x58fd, 0x080c, 0x7d56, + 0x7828, 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x593d, + 0x0c88, 0x62c0, 0x080c, 0x98d9, 0x080c, 0x58fd, 0x7807, 0x0003, + 0x7827, 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, 0x7dd3, 0x6220, + 0xd2a4, 0x0160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0db4, + 0x2009, 0x0013, 0x080c, 0x9b42, 0x00ce, 0x0005, 0x00c6, 0x7824, + 0x9065, 0x090c, 0x0db4, 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, + 0x782a, 0x00ce, 0x080c, 0x2872, 0x0278, 0x00c6, 0x7924, 0x2160, + 0x6010, 0x906d, 0x090c, 0x0db4, 0x7807, 0x0000, 0x7827, 0x0000, + 0x00ce, 0x080c, 0x868e, 0x0c00, 0x080c, 0x909d, 0x08e8, 0x2011, + 0x0130, 0x2214, 0x080c, 0x98d9, 0x080c, 0xd4f8, 0x2009, 0x0014, + 0x080c, 0x9b42, 0x00ce, 0x0880, 0x2001, 0x19d2, 0x2003, 0x0000, + 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, + 0x0db4, 0x2009, 0x0013, 0x080c, 0x9b94, 0x00ce, 0x0005, 0x00b6, + 0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0db4, 0x7828, 0x9092, + 0xc350, 0x1648, 0x8000, 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, + 0x2872, 0x02f0, 0x00b6, 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, + 0x0db4, 0xb800, 0xc0dc, 0xb802, 0x7924, 0x2160, 0x080c, 0x9ac8, + 0xb93c, 0x81ff, 0x090c, 0x0db4, 0x8109, 0xb93e, 0x7807, 0x0000, + 0x7827, 0x0000, 0x00de, 0x00ce, 0x00be, 0x080c, 0x868e, 0x0868, + 0x080c, 0x909d, 0x0850, 0x2011, 0x0130, 0x2214, 0x080c, 0x98d9, + 0x080c, 0xd4f8, 0x7824, 0x9065, 0x2009, 0x0014, 0x080c, 0x9b42, + 0x00de, 0x00ce, 0x00be, 0x0804, 0x807d, 0x00c6, 0x2001, 0x009b, + 0x2004, 0xd0fc, 0x190c, 0x1c18, 0x6024, 0x6027, 0x0002, 0xd0f4, + 0x1580, 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, + 0x2009, 0x0049, 0x080c, 0x9b42, 0x00ce, 0x0005, 0x2011, 0x19d5, + 0x2013, 0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, + 0x7530, 0x12f0, 0x8108, 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, + 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, + 0x6016, 0x0c10, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, + 0x08d8, 0x793c, 0x2160, 0x2009, 0x004a, 0x080c, 0x9b42, 0x08a0, + 0x7848, 0xc085, 0x784a, 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6020, + 0x8000, 0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, + 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, + 0x0cc0, 0x00d6, 0x2069, 0x19b6, 0xb800, 0xd0d4, 0x0168, 0x6820, + 0x8000, 0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x00de, + 0x0804, 0x868e, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005, + 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00, 0x681a, + 0x008e, 0xa05a, 0x008e, 0x2069, 0x19b6, 0x0c08, 0xb856, 0xb85a, + 0x2b00, 0x681a, 0x681e, 0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6020, + 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, + 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, + 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6034, + 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136, 0x00ce, 0x0005, + 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, + 0x0006, 0x0126, 0x902e, 0x2071, 0x19b6, 0x7638, 0x2660, 0x2678, + 0x2091, 0x8000, 0x8cff, 0x0904, 0x81fb, 0x6010, 0x2058, 0xb8a0, + 0x9206, 0x1904, 0x81f6, 0x87ff, 0x0120, 0x6054, 0x9106, 0x1904, + 0x81f6, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, + 0x935a, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, + 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, + 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, + 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, + 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb793, 0x01c8, + 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xba7b, + 0x080c, 0xd42c, 0x080c, 0x65f2, 0x007e, 0x003e, 0x001e, 0x080c, + 0xb975, 0x080c, 0x9af8, 0x00ce, 0x0804, 0x819a, 0x2c78, 0x600c, + 0x2060, 0x0804, 0x819a, 0x85ff, 0x0120, 0x0036, 0x080c, 0x8769, + 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, + 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, + 0xd42c, 0x080c, 0xd133, 0x007e, 0x003e, 0x001e, 0x0890, 0x6020, + 0x9086, 0x000a, 0x0904, 0x81e0, 0x0804, 0x81de, 0x0006, 0x0066, + 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, + 0x2079, 0x19b6, 0x7838, 0x9065, 0x0904, 0x8276, 0x600c, 0x0006, + 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, + 0x080c, 0x935a, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, + 0x7b4a, 0x003e, 0x080c, 0xb793, 0x0520, 0x6014, 0x2048, 0x6020, + 0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, + 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, + 0x6040, 0x9005, 0x1180, 0x2001, 0x1957, 0x2004, 0x6042, 0x0058, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x65e5, 0x080c, + 0xb975, 0x080c, 0x9af8, 0x000e, 0x0804, 0x8233, 0x7e3a, 0x7e36, + 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd133, 0x0c50, 0x6020, + 0x9086, 0x000a, 0x09f8, 0x08e0, 0x0016, 0x0026, 0x0086, 0x9046, + 0x0099, 0x080c, 0x8375, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, + 0x0126, 0x2079, 0x19b6, 0x2091, 0x8000, 0x080c, 0x840c, 0x080c, + 0x849a, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2071, 0x19b6, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x833a, + 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x8335, 0x88ff, 0x0120, + 0x6054, 0x9106, 0x1904, 0x8335, 0x7024, 0x9c06, 0x1558, 0x2069, + 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x7dd3, 0x080c, 0x90c1, + 0x68c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x29bc, 0x9006, 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, + 0x0804, 0x8335, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, + 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, + 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb793, + 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xb992, 0x1118, + 0x080c, 0xa456, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x0016, 0x0036, 0x0086, 0x080c, 0xba7b, 0x080c, 0xd42c, 0x080c, + 0x65f2, 0x008e, 0x003e, 0x001e, 0x080c, 0xb975, 0x080c, 0x9af8, + 0x080c, 0x9446, 0x00ce, 0x0804, 0x82b5, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x82b5, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, + 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xd42c, 0x080c, 0xd133, + 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xa456, 0x6020, 0x9086, + 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, + 0x831b, 0x9086, 0x008b, 0x0904, 0x831b, 0x0840, 0x6020, 0x9086, + 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, + 0x9086, 0x008b, 0x09b0, 0x0804, 0x832e, 0x00b6, 0x00a6, 0x0096, + 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, + 0x905d, 0x0904, 0x8405, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, + 0x19b6, 0xbe54, 0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, + 0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, + 0x904d, 0x0108, 0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, + 0xb857, 0x0000, 0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, + 0x080c, 0x5f24, 0x0904, 0x8401, 0x7624, 0x86ff, 0x0904, 0x83f0, + 0x9680, 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, + 0x68c0, 0x9005, 0x0560, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3, + 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, + 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, + 0x9006, 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, + 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, + 0x8001, 0xb83e, 0x2660, 0x080c, 0x9af8, 0x00ce, 0x0048, 0x00de, + 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x83a8, + 0x89ff, 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, + 0xba7b, 0x080c, 0xd42c, 0x080c, 0x65f2, 0x080c, 0x9446, 0x0804, + 0x83a8, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, + 0x009e, 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, + 0x00d6, 0x9036, 0x7814, 0x9065, 0x0904, 0x846d, 0x600c, 0x0006, + 0x600f, 0x0000, 0x7824, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x1508, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3, 0x0000, + 0x080c, 0x9570, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, + 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0040, 0x080c, 0x62cb, 0x1520, 0x6003, 0x0009, + 0x630a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xb791, 0x01b0, + 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xb992, 0x1118, 0x080c, + 0xa456, 0x0060, 0x080c, 0x62cb, 0x1168, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975, 0x080c, 0x9af8, + 0x080c, 0x9446, 0x000e, 0x0804, 0x8413, 0x7e16, 0x7e12, 0x00de, + 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, + 0x1118, 0x080c, 0xd133, 0x0c50, 0x080c, 0xa456, 0x6020, 0x9086, + 0x0002, 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, + 0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, + 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, + 0x0d00, 0x0860, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, + 0x7818, 0x905d, 0x0904, 0x851a, 0xb854, 0x0006, 0x9006, 0xb856, + 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5f24, 0x0904, + 0x8517, 0x7e24, 0x86ff, 0x0904, 0x850a, 0x9680, 0x0005, 0x2004, + 0x9906, 0x1904, 0x850a, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, + 0x0904, 0x8501, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3, 0x0000, + 0x080c, 0x9570, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, + 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, + 0xb800, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, + 0x2009, 0x1957, 0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, + 0x8001, 0xb83e, 0x2660, 0x600f, 0x0000, 0x080c, 0x9af8, 0x00ce, + 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, + 0x0804, 0x84ad, 0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x65f2, 0x080c, 0x9446, 0x0804, 0x84ad, 0x000e, + 0x0804, 0x84a1, 0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, + 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, + 0xd0dc, 0x01a0, 0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, + 0x2071, 0x19b6, 0x7024, 0x9035, 0x0148, 0x9080, 0x0005, 0x2004, + 0x9906, 0x1120, 0xb800, 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, + 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, + 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, + 0x080c, 0x90c1, 0x78c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, + 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x2079, 0x0100, + 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x9570, 0x003e, + 0x080c, 0x5f24, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, + 0x2660, 0x080c, 0x9ac8, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0xba7b, 0x080c, 0x65f2, 0x080c, 0x9446, 0x00fe, + 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, + 0x2012, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b6, + 0x7004, 0x9084, 0x0007, 0x0002, 0x85a6, 0x85aa, 0x85c1, 0x85ea, + 0x8628, 0x85a6, 0x85c1, 0x85a4, 0x080c, 0x0db4, 0x00ce, 0x00ee, + 0x00be, 0x0005, 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022, + 0x600c, 0x9015, 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, + 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, + 0x0ca8, 0x6010, 0x2058, 0x080c, 0x5f24, 0xb800, 0xc0dc, 0xb802, + 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148, + 0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, + 0x0005, 0xb854, 0x9015, 0x0120, 0x721e, 0x080c, 0x868e, 0x0ca8, + 0x7218, 0x721e, 0x080c, 0x868e, 0x0c80, 0xc2ec, 0x2202, 0x080c, + 0x8769, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, + 0x080c, 0x9446, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, + 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, + 0x9446, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, + 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, + 0x2058, 0x080c, 0x5f24, 0xb800, 0xc0dc, 0xb802, 0x080c, 0x9446, + 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, + 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, + 0x7024, 0x9065, 0x0140, 0x080c, 0x9446, 0x600c, 0x9015, 0x0158, + 0x720e, 0x600f, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x00ce, + 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, + 0x19b6, 0x6830, 0x9084, 0x0003, 0x0002, 0x864b, 0x864d, 0x8671, + 0x8649, 0x080c, 0x0db4, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, + 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, + 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, + 0x19d5, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, + 0x0c90, 0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, + 0x0c50, 0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, + 0x0160, 0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, + 0x0000, 0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, + 0x2001, 0x180c, 0x200c, 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, + 0x200c, 0xd1ec, 0x0120, 0xc1ec, 0x2102, 0x080c, 0x8769, 0x2001, + 0x19c2, 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19b6, + 0x6804, 0x9084, 0x0007, 0x0002, 0x86ae, 0x8751, 0x8751, 0x8751, + 0x8751, 0x8753, 0x8751, 0x86ac, 0x080c, 0x0db4, 0x6820, 0x9005, + 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, 0x6807, + 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de, + 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, + 0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, + 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x873d, 0xb84c, 0x900d, 0x0118, + 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, 0x0904, + 0x873d, 0x0028, 0x6818, 0x920e, 0x0904, 0x873d, 0x2058, 0xb84c, + 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, + 0xb838, 0x9302, 0x1e40, 0x080c, 0x9a9f, 0x0904, 0x873d, 0x8318, + 0xbb3e, 0x6116, 0x2b10, 0x6212, 0x0096, 0x2148, 0xa880, 0x9084, + 0x00ff, 0x605e, 0xa883, 0x0000, 0xa884, 0x009e, 0x908a, 0x199a, + 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, + 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, 0x00ff, 0x918e, + 0x0048, 0x0538, 0x00f6, 0x2c78, 0x2061, 0x0100, 0xbab0, 0x629a, + 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x8cf7, 0x2069, 0x19b6, + 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, + 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, + 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00be, 0x00ce, + 0x0cd0, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0006, 0x2f18, 0x6b26, + 0x682b, 0x0000, 0x080c, 0x98f9, 0x00ee, 0x00be, 0x00ce, 0x00de, + 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, 0x6807, + 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de, + 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, + 0x0005, 0x00f6, 0x00d6, 0x2069, 0x19b6, 0x6830, 0x9086, 0x0000, + 0x1548, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, + 0x080c, 0x869d, 0x2069, 0x19b6, 0x2001, 0x180c, 0x200c, 0xd1c4, + 0x11e0, 0x6838, 0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588, + 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, + 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1a26, 0x1178, 0x012e, + 0x080c, 0x8f0f, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, + 0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x08d8, 0x012e, 0x6843, + 0x0000, 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, + 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, + 0x0cc0, 0x6a04, 0x9296, 0x0006, 0x0958, 0x0804, 0x8761, 0x6020, + 0x9084, 0x000f, 0x000b, 0x0005, 0x87d3, 0x87d8, 0x8c31, 0x8cc0, + 0x87d8, 0x8c31, 0x8cc0, 0x87d3, 0x87d8, 0x87d3, 0x87d3, 0x87d3, + 0x87d3, 0x87d3, 0x87d3, 0x080c, 0x8589, 0x080c, 0x868e, 0x0005, + 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, + 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, + 0x0053, 0x1a0c, 0x0db4, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, + 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x8844, 0x005b, 0x00fe, + 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, + 0x00be, 0x0005, 0x89bb, 0x89f6, 0x8a1f, 0x8ac2, 0x8ae3, 0x8ae9, + 0x8af6, 0x8afe, 0x8b0a, 0x8b10, 0x8b21, 0x8b10, 0x8b78, 0x8afe, + 0x8b84, 0x8b8a, 0x8b0a, 0x8b8a, 0x8b96, 0x8842, 0x8842, 0x8842, + 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, + 0x9211, 0x9234, 0x9245, 0x9265, 0x9297, 0x8af6, 0x8842, 0x8af6, + 0x8b10, 0x8842, 0x8a1f, 0x8ac2, 0x8842, 0x965d, 0x8b10, 0x8842, + 0x9679, 0x8b10, 0x8842, 0x8b0a, 0x89b5, 0x8865, 0x8842, 0x9695, + 0x9702, 0x97d9, 0x8842, 0x97e6, 0x8af3, 0x9811, 0x8842, 0x92a1, + 0x983e, 0x8842, 0x080c, 0x0db4, 0x2100, 0x005b, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, + 0x0005, 0x8863, 0x8863, 0x8863, 0x888c, 0x8938, 0x8943, 0x8863, + 0x8863, 0x8863, 0x898a, 0x8996, 0x88a7, 0x8863, 0x88c2, 0x88f6, + 0x99bb, 0x9a00, 0x8b10, 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, + 0x8ba9, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, + 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, + 0x0018, 0x080c, 0x9095, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, + 0x2058, 0xb8a0, 0x00be, 0x080c, 0x9a47, 0x1118, 0x9084, 0xff80, + 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8ba9, + 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, + 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, + 0x60c3, 0x0010, 0x080c, 0x9095, 0x009e, 0x00de, 0x0005, 0x00d6, + 0x0096, 0x080c, 0x8ba9, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, + 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, + 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9095, 0x009e, + 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8ba9, 0x20e9, 0x0000, 0x2001, 0x1972, 0x2003, 0x0000, 0x7814, + 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x1972, 0x0016, 0x200c, + 0x2001, 0x0001, 0x080c, 0x20f5, 0x080c, 0xc47e, 0x9006, 0x080c, + 0x20f5, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, + 0x080c, 0x9095, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8bf4, 0x20e9, 0x0000, 0x2001, + 0x1972, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, + 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x1972, 0x0016, 0x200c, + 0x080c, 0xc47e, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, + 0x0051, 0x7814, 0x2048, 0x080c, 0x0f9e, 0x080c, 0x9095, 0x012e, + 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, + 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, + 0x080c, 0x8ba9, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, + 0x0008, 0x0804, 0x9095, 0x00d6, 0x00e6, 0x080c, 0x8bf4, 0x7814, + 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, + 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, + 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8959, 0x2069, 0x1801, + 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8962, 0x2069, + 0x1982, 0x9086, 0xdf00, 0x0110, 0x2069, 0x199c, 0x20a9, 0x001a, + 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, + 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, + 0x8e70, 0x1f04, 0x8970, 0x60c3, 0x004c, 0x080c, 0x9095, 0x00ee, + 0x00de, 0x0005, 0x080c, 0x8ba9, 0x7003, 0x6300, 0x7007, 0x0028, + 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x00d6, 0x0026, + 0x0016, 0x080c, 0x8bf4, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, + 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, + 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, + 0x9095, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, + 0x609a, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x5200, 0x2069, + 0x1853, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x253e, + 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, + 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, + 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0x9a47, 0x1120, 0xb8a0, + 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, + 0x181f, 0x2004, 0x7036, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, + 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0x9095, 0x080c, 0x8ba9, + 0x7003, 0x0500, 0x080c, 0x9a47, 0x1120, 0xb8a0, 0x9082, 0x007f, + 0x0248, 0x2001, 0x181e, 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, + 0x700e, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, + 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, + 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9095, 0x080c, + 0x8ba9, 0x9006, 0x080c, 0x62df, 0xb8a0, 0x9086, 0x007e, 0x1130, + 0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, + 0x904d, 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, + 0x0300, 0xb8a0, 0x9086, 0x007e, 0x1904, 0x8a8a, 0x00d6, 0x2069, + 0x193d, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, + 0x6808, 0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, + 0x6818, 0x7022, 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, + 0x700e, 0x6808, 0x080c, 0x6d14, 0x1118, 0x9084, 0x37ff, 0x0010, + 0x9084, 0x3fff, 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, + 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, + 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, + 0x00d6, 0x080c, 0x98c0, 0x2069, 0x1945, 0x2071, 0x024e, 0x6800, + 0xc0dd, 0x7002, 0x080c, 0x5157, 0xd0e4, 0x0110, 0x680c, 0x700e, + 0x00de, 0x04a0, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, + 0x2009, 0x0002, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, + 0x080c, 0x257f, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193d, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, + 0x0004, 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, + 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x98c0, 0x20a1, + 0x024e, 0x20a9, 0x0008, 0x2099, 0x1945, 0x4003, 0x60c3, 0x0074, + 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x2010, 0x7007, 0x0014, + 0x700b, 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1853, + 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, + 0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x8b59, 0x7026, 0x60c3, + 0x0014, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x5000, 0x0804, + 0x8a39, 0x080c, 0x8ba9, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, + 0x0014, 0x0804, 0x9095, 0x080c, 0x8beb, 0x0010, 0x080c, 0x8bf4, + 0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x9095, 0x080c, 0x8bf4, + 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, + 0x0804, 0x9095, 0x080c, 0x8bf4, 0x7003, 0x0200, 0x0804, 0x8a39, + 0x080c, 0x8bf4, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, + 0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, + 0x9095, 0x00d6, 0x080c, 0x8bf4, 0x7003, 0x0210, 0x7007, 0x0014, + 0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, + 0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, + 0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, + 0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, + 0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, + 0x9085, 0x0010, 0x2009, 0x1875, 0x210c, 0xd184, 0x1110, 0x9085, + 0x0002, 0x0026, 0x2009, 0x1873, 0x210c, 0xd1e4, 0x0150, 0xc0c5, + 0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, + 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, + 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9095, + 0x080c, 0x8bf4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, + 0x60c3, 0x0014, 0x0804, 0x9095, 0x080c, 0x8bf4, 0x7003, 0x0200, + 0x0804, 0x89bf, 0x080c, 0x8bf4, 0x7003, 0x0100, 0x700b, 0x0003, + 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9095, 0x080c, 0x8bf4, + 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9095, + 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, + 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, + 0x0100, 0x080c, 0x98d5, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, + 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, + 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x9083, 0x721a, 0x9f95, + 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, + 0x0026, 0x080c, 0x98d5, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, + 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x00de, 0x7013, + 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, + 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, + 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, + 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0x98d5, 0xb810, 0x9305, + 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, + 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, + 0x6878, 0x700a, 0x687c, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, + 0x004e, 0x003e, 0x00de, 0x080c, 0x9083, 0x721a, 0x7a08, 0x7222, + 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9083, + 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, + 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, + 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db4, 0x908a, + 0x0092, 0x1a0c, 0x0db4, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, + 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, + 0x00ce, 0x00be, 0x0005, 0x8c62, 0x8c71, 0x8c7c, 0x8c60, 0x8c60, + 0x8c60, 0x8c62, 0x8c60, 0x8c60, 0x8c60, 0x8c60, 0x8c60, 0x8c60, + 0x080c, 0x0db4, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2872, + 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, + 0x9095, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, + 0x60c3, 0x000c, 0x0804, 0x9095, 0x0479, 0x7003, 0x0003, 0x7007, + 0x0300, 0x60c3, 0x0004, 0x0804, 0x9095, 0x0026, 0x080c, 0x98d5, + 0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, + 0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0009, 0x0804, 0x8bc4, + 0x0026, 0x080c, 0x98d5, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, + 0x0099, 0x7012, 0x0804, 0x8c26, 0x0026, 0x080c, 0x98d5, 0xb810, + 0x9085, 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, + 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8c26, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, + 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0db4, 0x908a, + 0x0054, 0x1a0c, 0x0db4, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, + 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x00be, 0x0005, 0x8cf7, 0x8d9e, 0x8d71, 0x8ec0, 0x8cf5, 0x8cf5, + 0x8cf5, 0x8cf5, 0x8cf5, 0x8cf5, 0x8cf5, 0x9413, 0x941f, 0x942b, + 0x9437, 0x8cf5, 0x981d, 0x8cf5, 0x9407, 0x080c, 0x0db4, 0x0096, + 0x780b, 0xffff, 0x080c, 0x8d4d, 0x7914, 0x2148, 0xa978, 0x7956, + 0x7132, 0xa97c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, + 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, + 0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, + 0x0128, 0x7047, 0x0002, 0x080c, 0x15ad, 0x0050, 0xd1b4, 0x0118, + 0x7047, 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, + 0xaab0, 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, + 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, + 0x2069, 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, + 0x0020, 0x6017, 0x0009, 0x2001, 0x19d2, 0x2003, 0x07d0, 0x2001, + 0x19d1, 0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, + 0x8210, 0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, + 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, + 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a78, 0x720a, + 0x6a7c, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, + 0x0005, 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, + 0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, + 0x009e, 0x00de, 0x0804, 0x9095, 0x6813, 0x0008, 0xb810, 0x9085, + 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, + 0x687c, 0x700e, 0x7013, 0x0889, 0x080c, 0x9083, 0x721a, 0x7a08, + 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, + 0x080c, 0x8e9e, 0x7814, 0x2048, 0x080c, 0xb791, 0x1130, 0x7814, + 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, + 0x00de, 0x0005, 0x8dbc, 0x8e25, 0x8e35, 0x8e5b, 0x8e67, 0x8e78, + 0x8e80, 0x8dba, 0x080c, 0x0db4, 0x0016, 0x0036, 0xa97c, 0x918c, + 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, + 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, + 0x2001, 0x1980, 0x2004, 0x60c2, 0x0804, 0x9095, 0xc3e5, 0x0c88, + 0x9186, 0x0001, 0x190c, 0x0db4, 0xaba8, 0x7824, 0xd0cc, 0x1904, + 0x8e22, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, + 0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, + 0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, + 0x9085, 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, + 0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, + 0x2098, 0x4003, 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, + 0x20a9, 0x0005, 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, + 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, + 0x0804, 0x9095, 0xc3e5, 0x0804, 0x8de1, 0x2011, 0x0008, 0x2001, + 0x180f, 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, + 0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016, + 0x782c, 0x701a, 0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e, + 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f, + 0x0008, 0x7043, 0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069, + 0x0200, 0x6813, 0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3, + 0x0032, 0x0804, 0x9095, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, + 0x7216, 0x60c3, 0x0018, 0x0804, 0x9095, 0x0cd0, 0xc2e5, 0x2011, + 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, + 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x9095, + 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, + 0x0036, 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, + 0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, + 0x0046, 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, + 0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, + 0x0008, 0xb810, 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, + 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7824, 0xd0cc, 0x1168, + 0x7013, 0x0898, 0x080c, 0x9083, 0x721a, 0x7a08, 0x7222, 0x2f10, + 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, + 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, + 0x8ed0, 0x8ed0, 0x8ed2, 0x8ed0, 0x8ed0, 0x8ed0, 0x8eec, 0x8ed0, + 0x080c, 0x0db4, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, + 0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804, 0xd0bc, 0x0130, + 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, + 0x60c3, 0x0001, 0x0804, 0x9095, 0x2009, 0x0003, 0x0019, 0x7033, + 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x98d5, 0x001e, 0xb810, 0x9085, + 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a78, 0x720a, + 0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, + 0x9083, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, + 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, + 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, + 0xba14, 0x7378, 0x747c, 0x7820, 0x90be, 0x0006, 0x0904, 0x8ff2, + 0x90be, 0x000a, 0x1904, 0x8fae, 0x609f, 0x0000, 0x7814, 0x2048, + 0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, + 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, + 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, + 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, + 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, + 0x2001, 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, + 0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, + 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, + 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, + 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, + 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, + 0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, + 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, + 0x080c, 0x98ba, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, + 0x0110, 0x2009, 0x1b58, 0x080c, 0x7dd8, 0x003e, 0x004e, 0x005e, + 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, + 0x0040, 0x0904, 0x902e, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, + 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7, + 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, + 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048, + 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, + 0xb86c, 0x60ce, 0xbab0, 0x629e, 0x080c, 0x98ba, 0x2009, 0x07d0, + 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, + 0x7dd8, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, + 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, + 0x0002, 0x0904, 0x904a, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, + 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, + 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086, + 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6, + 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c, + 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, + 0xbab0, 0x629e, 0x080c, 0x9897, 0x0804, 0x8fde, 0xb8bc, 0xd084, + 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900, + 0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e, + 0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000, + 0x0804, 0x8fc1, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, + 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073, + 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, + 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, + 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, + 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, 0x629e, + 0x7824, 0xd0cc, 0x0120, 0x080c, 0x98ba, 0x0804, 0x8fde, 0x080c, + 0x9897, 0x0804, 0x8fde, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, + 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, + 0x19b6, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, + 0x9575, 0x00f1, 0x080c, 0x7dca, 0x0005, 0x0016, 0x2001, 0x180c, + 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, + 0x7dca, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, + 0x19b7, 0x2003, 0x0000, 0x2001, 0x19bf, 0x2003, 0x0000, 0x0c88, + 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e, + 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7, + 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e, + 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, + 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, + 0x6d14, 0x11e8, 0x2001, 0x19d2, 0x2004, 0x9005, 0x1904, 0x9127, + 0x0066, 0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x1160, 0x2061, + 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0db4, + 0x080c, 0x7dca, 0x0460, 0x00c6, 0x2061, 0x19b6, 0x00d0, 0x6904, + 0x9194, 0x4000, 0x0548, 0x080c, 0x90c1, 0x080c, 0x29cc, 0x00c6, + 0x2061, 0x19b6, 0x6128, 0x9192, 0x0008, 0x1258, 0x8108, 0x612a, + 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x7dca, 0x080c, 0x90b8, + 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xd4f8, 0x080c, + 0x7dd3, 0x2009, 0x0014, 0x080c, 0x9b42, 0x00ce, 0x0000, 0x002e, + 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d2, 0x2004, 0x9005, + 0x1db0, 0x00c6, 0x2061, 0x19b6, 0x6128, 0x9192, 0x0003, 0x1e08, + 0x8108, 0x612a, 0x00ce, 0x080c, 0x7dca, 0x080c, 0x5953, 0x2009, + 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6, + 0x00e6, 0x0016, 0x0026, 0x080c, 0x7de0, 0x2071, 0x19b6, 0x713c, + 0x81ff, 0x0904, 0x91b3, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, + 0x6d14, 0x11b0, 0x0036, 0x2019, 0x0002, 0x080c, 0x935a, 0x003e, + 0x713c, 0x2160, 0x080c, 0xd4f8, 0x2009, 0x004a, 0x080c, 0x9b42, + 0x0066, 0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x0804, 0x91b3, + 0x6904, 0xd1f4, 0x0904, 0x91ba, 0x080c, 0x29cc, 0x00c6, 0x703c, + 0x9065, 0x090c, 0x0db4, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, + 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, + 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, + 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, 0x291f, + 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, + 0x2009, 0x0049, 0x080c, 0x9b42, 0x0070, 0x0036, 0x2019, 0x0001, + 0x080c, 0x935a, 0x003e, 0x713c, 0x2160, 0x080c, 0xd4f8, 0x2009, + 0x004a, 0x080c, 0x9b42, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, + 0x009e, 0x0005, 0xd1ec, 0x1904, 0x9174, 0x0804, 0x9176, 0x0026, + 0x00e6, 0x2071, 0x19b6, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, + 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, + 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0030, + 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, + 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, + 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, 0x2071, + 0x19b6, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, + 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, + 0xae78, 0x009e, 0x080c, 0x6123, 0x0110, 0x9085, 0x0001, 0x012e, + 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, + 0x0005, 0x080c, 0x8ba9, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, + 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, + 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, + 0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, + 0x60c3, 0x002c, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x0f00, + 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, + 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x0156, 0x080c, 0x8bf4, + 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, + 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, + 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x9256, + 0x60c3, 0x001c, 0x015e, 0x0804, 0x9095, 0x0016, 0x0026, 0x080c, + 0x8bd0, 0x080c, 0x8be2, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, + 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, + 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, + 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, + 0x080c, 0x9095, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, + 0x080c, 0x98c0, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, + 0x8ba9, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, + 0x9095, 0x0016, 0x0026, 0x080c, 0x8ba9, 0x20e9, 0x0000, 0x20a1, + 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, + 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, + 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9095, 0x002e, 0x001e, + 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19b6, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xb992, 0x1110, + 0x080c, 0xa456, 0x600c, 0x0006, 0x080c, 0xbbf9, 0x080c, 0x9ac8, + 0x080c, 0x9446, 0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, + 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, + 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, + 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, + 0x2079, 0x0140, 0x2071, 0x19b6, 0x7024, 0x2060, 0x8cff, 0x01f8, + 0x080c, 0x90c1, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x7dd3, 0x00c6, + 0x2061, 0x0100, 0x080c, 0x98d9, 0x00ce, 0x20a9, 0x01f4, 0x0461, + 0x2009, 0x0013, 0x080c, 0x9b42, 0x000e, 0x001e, 0x002e, 0x006e, + 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, + 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, + 0x080c, 0x7dd3, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, + 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x58fd, 0x080c, 0x7d56, + 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, + 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x29cc, 0x0090, 0xd084, + 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x933c, 0x7804, 0x9084, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, + 0x29bc, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, + 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, + 0x2071, 0x19b6, 0x703c, 0x2060, 0x8cff, 0x0904, 0x93e8, 0x9386, + 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0x93e8, 0x68af, + 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, + 0x68cb, 0x0008, 0x080c, 0x7de0, 0x080c, 0x1d48, 0x0046, 0x2009, + 0x00a5, 0x080c, 0x0e2f, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f, + 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008, + 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a34, 0x6814, 0x9084, + 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008, 0x7003, 0x0000, + 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, 0x9005, 0x1110, + 0x7887, 0x0001, 0x2001, 0x1950, 0x200c, 0x080c, 0x0e2f, 0x004e, + 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, + 0x9084, 0x4000, 0x190c, 0x29cc, 0x0090, 0xd08c, 0x0118, 0x6827, + 0x0002, 0x0010, 0x1f04, 0x93c2, 0x7804, 0x9084, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x6827, + 0x4000, 0x6824, 0x83ff, 0x1120, 0x2009, 0x0049, 0x080c, 0x9b42, + 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, + 0x19b6, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2069, 0x19b6, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, + 0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x1000, 0x0478, 0x080c, 0x8d4d, 0x7814, 0x080c, 0x515b, + 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, + 0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x2000, 0x00b8, 0x080c, 0x8d4d, 0x7814, 0x080c, 0x515b, + 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, + 0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x9095, 0x00e6, 0x2071, + 0x19b6, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, + 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19b6, 0x7614, 0x2660, 0x2678, 0x2039, + 0x0001, 0x87ff, 0x0904, 0x94eb, 0x8cff, 0x0904, 0x94eb, 0x6020, + 0x9086, 0x0006, 0x1904, 0x94e6, 0x88ff, 0x0138, 0x2800, 0x9c06, + 0x1904, 0x94e6, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, + 0x94e6, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x94e6, 0x7024, + 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, + 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7dd3, 0x080c, 0x9570, + 0x7027, 0x0000, 0x0428, 0x080c, 0x7dd3, 0x6820, 0xd0b4, 0x0110, + 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9570, + 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, + 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, + 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, + 0xb791, 0x0110, 0x080c, 0xd133, 0x009e, 0x080c, 0x9af8, 0x080c, + 0x9446, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9461, 0x2c78, 0x600c, + 0x2060, 0x0804, 0x9461, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, + 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, + 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, + 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, + 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x955f, 0x6020, 0x9086, + 0x0006, 0x1904, 0x955a, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, + 0x955a, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, + 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, + 0x080c, 0x935a, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, + 0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, + 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, + 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb791, + 0x0110, 0x080c, 0xd133, 0x080c, 0x9af8, 0x87ff, 0x1198, 0x00ce, + 0x0804, 0x950b, 0x2c78, 0x600c, 0x2060, 0x0804, 0x950b, 0x9006, + 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, + 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, + 0x00e6, 0x2071, 0x19b6, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, + 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, + 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19b6, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, + 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, + 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, + 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, + 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, + 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, + 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, + 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19b6, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x964c, 0x6010, + 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x9647, 0x7024, + 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x9623, + 0x080c, 0x90c1, 0x68c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, + 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, + 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x2069, 0x0100, + 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, + 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, + 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, + 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, + 0x080c, 0xb981, 0x1158, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x11f0, + 0x080c, 0xa456, 0x00d8, 0x080c, 0x9570, 0x08c0, 0x080c, 0xb992, + 0x1118, 0x080c, 0xa456, 0x0090, 0x6014, 0x2048, 0x080c, 0xb791, + 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x080c, 0x65e5, 0x080c, 0xb975, 0x080c, 0xbbf9, + 0x080c, 0x9af8, 0x080c, 0x9446, 0x00ce, 0x0804, 0x95cc, 0x2c78, + 0x600c, 0x2060, 0x0804, 0x95cc, 0x012e, 0x000e, 0x002e, 0x006e, + 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, + 0x0006, 0x1d20, 0x080c, 0xd133, 0x0c08, 0x00d6, 0x080c, 0x8bf4, + 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, + 0x2099, 0x1958, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, + 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x9095, 0x00de, + 0x0005, 0x080c, 0x8bf4, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, + 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7858, + 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858, 0x9084, 0xff00, + 0x8007, 0x7006, 0x60c2, 0x0804, 0x9095, 0x00b6, 0x00d6, 0x0016, + 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xbdfe, 0x00de, 0x1904, + 0x96fa, 0x080c, 0x8ba9, 0x7003, 0x1300, 0x782c, 0x080c, 0x97fc, + 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, + 0x080c, 0x9a47, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, + 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, + 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, + 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, + 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, + 0x00a8, 0x080c, 0x9a47, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, + 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68, + 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, + 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x9095, + 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, + 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, + 0x01c0, 0x9186, 0x0003, 0x0904, 0x9774, 0x9186, 0x0005, 0x0904, + 0x975d, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0x9765, + 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x97d9, + 0x0005, 0x080c, 0x979a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, + 0x4000, 0x6800, 0x0002, 0x973e, 0x9749, 0x9740, 0x9749, 0x9745, + 0x973e, 0x973e, 0x9749, 0x9749, 0x9749, 0x9749, 0x973e, 0x973e, + 0x973e, 0x973e, 0x973e, 0x9749, 0x973e, 0x9749, 0x080c, 0x0db4, + 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, + 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9793, 0x080c, + 0x979a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, + 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026, + 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026, + 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, + 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c, + 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, + 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, + 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, + 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, + 0x0804, 0x9095, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, + 0x8bf4, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, + 0x7810, 0x2058, 0xb8a0, 0x080c, 0x9a47, 0x1118, 0x9092, 0x007e, + 0x0268, 0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, + 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498, + 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, + 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, + 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, + 0x0005, 0x080c, 0x8bf4, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, + 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x080c, 0x8ba0, + 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, + 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, + 0x60c3, 0x0010, 0x0804, 0x9095, 0x00e6, 0x2071, 0x0240, 0x0006, + 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120, + 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, + 0x0005, 0x080c, 0x8beb, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, + 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x0021, 0x60c3, 0x0000, + 0x0804, 0x9095, 0x00d6, 0x080c, 0x98d5, 0xb810, 0x9085, 0x0300, + 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, + 0x700e, 0x7013, 0x0819, 0x080c, 0x9083, 0x721a, 0x2f10, 0x7222, + 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, + 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2872, + 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, + 0x90b8, 0x080c, 0x7dca, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, + 0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, + 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, + 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, + 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, + 0x080c, 0x98d5, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, + 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, + 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, + 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, + 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, + 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, + 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, + 0x200c, 0xc1d5, 0x2102, 0x2009, 0x1981, 0x210c, 0x009e, 0x918d, + 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, + 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, + 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, + 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, + 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, + 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, + 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, + 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, + 0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878, 0x6056, 0x9006, + 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, 0x6007, + 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, 0x0001, 0xa842, + 0xa83e, 0x2900, 0xa85a, 0xa813, 0x1dd4, 0x080c, 0x8171, 0x0126, + 0x2091, 0x8000, 0x080c, 0x8769, 0x012e, 0x009e, 0x00de, 0x0005, + 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19b6, 0x760c, 0x2660, 0x2678, 0x8cff, + 0x0904, 0x99a7, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, + 0x9005, 0x0904, 0x997e, 0x080c, 0x90c1, 0x68c3, 0x0000, 0x080c, + 0x9570, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, + 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, + 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, + 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, + 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, + 0x2678, 0x600f, 0x0000, 0x080c, 0xb981, 0x1158, 0x080c, 0x2ea4, + 0x080c, 0xb992, 0x11f0, 0x080c, 0xa456, 0x00d8, 0x080c, 0x9570, + 0x08c0, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456, 0x0090, 0x6014, + 0x2048, 0x080c, 0xb791, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, + 0xb975, 0x080c, 0xbbf9, 0x080c, 0x9af8, 0x080c, 0x9446, 0x00ce, + 0x0804, 0x992f, 0x2c78, 0x600c, 0x2060, 0x0804, 0x992f, 0x700f, + 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, + 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, + 0x080c, 0xd133, 0x08f0, 0x00d6, 0x0156, 0x080c, 0x8bf4, 0x7a14, + 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, + 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, + 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x6d14, + 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad8, 0xd29c, 0x1110, 0xd2ac, + 0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, + 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x2071, 0x0250, 0x2376, + 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, + 0x99ef, 0x60c3, 0x0020, 0x080c, 0x9095, 0x015e, 0x00de, 0x0005, + 0x0156, 0x080c, 0x8bf4, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, + 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, + 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, + 0x0001, 0x2011, 0x198c, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, + 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, + 0x2001, 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, 0x2004, 0x7026, + 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, + 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, + 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9095, 0x0006, + 0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, + 0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4, + 0x0036, 0x901e, 0x080c, 0x935a, 0x003e, 0x0005, 0x2071, 0x1883, + 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, 0x1800, 0x7072, + 0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, 0x7070, 0x7052, 0x7057, + 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, + 0x7550, 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, + 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, 0x0cb0, + 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, + 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, + 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, + 0x2071, 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, 0x7054, 0x2060, + 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, + 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, + 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1228, 0x7556, 0x9085, + 0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc8, 0x9006, 0x0cc8, + 0x9c82, 0x1cd0, 0x0a0c, 0x0db4, 0x2001, 0x1819, 0x2004, 0x9c02, + 0x1a0c, 0x0db4, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, + 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056, 0x605a, + 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x6042, + 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x9086, 0x0001, 0x0108, + 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e, 0x0cc0, + 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084, 0x190c, + 0x185b, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x1955, 0x2004, + 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, + 0xd3e0, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071, + 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608, 0x7054, + 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, + 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, + 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, + 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, + 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9b55, 0x9b5e, + 0x9b79, 0x9b94, 0xbeac, 0xbec9, 0xbee4, 0x9b55, 0x9b5e, 0x9b55, + 0x9bb0, 0x9b55, 0x9b55, 0x9b55, 0x9b55, 0x9186, 0x0013, 0x1128, + 0x080c, 0x8589, 0x080c, 0x868e, 0x0005, 0x0005, 0x0066, 0x6000, + 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, 0x0005, 0x9b77, + 0xa2cf, 0xa49d, 0x9b77, 0xa52b, 0x9e93, 0x9b77, 0x9b77, 0xa251, + 0xaacd, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x080c, + 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, + 0x006e, 0x0005, 0x9b92, 0xb1a1, 0x9b92, 0x9b92, 0x9b92, 0x9b92, + 0x9b92, 0x9b92, 0xb146, 0xb323, 0x9b92, 0xb1e2, 0xb261, 0xb1e2, + 0xb261, 0x9b92, 0x080c, 0x0db4, 0x6000, 0x9082, 0x0016, 0x1a0c, + 0x0db4, 0x6000, 0x0002, 0x9bae, 0xab14, 0xabf9, 0xad29, 0xaed4, + 0x9bae, 0x9bae, 0x9bae, 0xaae8, 0xb0d2, 0xb0d5, 0x9bae, 0x9bae, + 0x9bae, 0x9bae, 0xb104, 0x9bae, 0x9bae, 0x9bae, 0x080c, 0x0db4, + 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, + 0x0005, 0x9bc9, 0x9bc9, 0x9c0c, 0x9cab, 0x9d40, 0x9bc9, 0x9bc9, + 0x9bc9, 0x9bcb, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9, + 0x9bc9, 0x080c, 0x0db4, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003, + 0x190c, 0x0db4, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, + 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, + 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, 0xa83a, 0xa884, + 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, + 0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x19aa, 0x080c, 0x8171, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8769, 0x012e, 0x0005, 0x6010, + 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0x9d62, 0x080c, + 0xbe9e, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, + 0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, + 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, + 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, + 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, + 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, + 0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, + 0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, + 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, 0x9c73, 0x9c73, + 0x9c6e, 0x9c71, 0x9c73, 0x9c6b, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, + 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, + 0x00de, 0x080c, 0x0db4, 0x080c, 0xa70c, 0x0028, 0x080c, 0xa82f, + 0x0010, 0x080c, 0xa91e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, + 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0x9e20, 0x0530, 0xa804, + 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, + 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x1240, 0x080c, 0x9fca, + 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, + 0x00fe, 0x009e, 0x00de, 0x0804, 0x9ac8, 0x2001, 0x002c, 0x900e, + 0x080c, 0x9e86, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, + 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0db4, 0x91b2, 0x0050, 0x1a0c, + 0x0db4, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c, + 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, + 0x80c5, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, + 0x0002, 0x1110, 0x0804, 0x9c0c, 0x0005, 0x9cde, 0x9cde, 0x9ce0, + 0x9d16, 0x9cde, 0x9cde, 0x9cde, 0x9cde, 0x9d29, 0x080c, 0x0db4, + 0x00d6, 0x0016, 0x0096, 0x080c, 0x863e, 0x080c, 0x8769, 0x6003, + 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, + 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, + 0x080c, 0x9e86, 0x080c, 0x9ac8, 0x00a8, 0x6003, 0x0002, 0xa8a4, + 0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, + 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, + 0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c, 0x863e, + 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb793, 0x0120, 0xa87b, + 0x0006, 0x080c, 0x65f2, 0x009e, 0x00de, 0x080c, 0x9ac8, 0x0804, + 0x8769, 0x080c, 0x863e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x00d6, + 0x0096, 0x6114, 0x2148, 0x080c, 0xb793, 0x0120, 0xa87b, 0x0029, + 0x080c, 0x65f2, 0x009e, 0x00de, 0x080c, 0x9ac8, 0x0804, 0x8769, + 0x9182, 0x0047, 0x0002, 0x9d50, 0x9d52, 0x9d50, 0x9d50, 0x9d50, + 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d52, + 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x14f3, 0x6114, 0x2148, + 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x65f2, 0x009e, 0x00de, + 0x0804, 0x9ac8, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, + 0x00f6, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c, 0x0db4, 0xa960, + 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, + 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018, 0x918c, + 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, + 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228, 0x2011, + 0x001f, 0x080c, 0xb3a8, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, + 0x001f, 0x080c, 0xb3a8, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, + 0x080c, 0x0f9e, 0x080c, 0x0fec, 0x01d0, 0x8528, 0xa867, 0x0110, + 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, + 0x2011, 0x001b, 0x080c, 0xb3a8, 0x00b8, 0x96b2, 0x003c, 0x2009, + 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb3a8, 0x0c18, 0x2001, + 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, + 0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, + 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, + 0x0000, 0x0006, 0x080c, 0x65f2, 0x000e, 0x2048, 0x9005, 0x1db0, + 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, + 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c, + 0x0db4, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, + 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x798c, + 0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, + 0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, + 0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x4003, + 0x2003, 0x0000, 0x080c, 0x65f2, 0x009e, 0x00fe, 0x00de, 0x0005, + 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, + 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, + 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, + 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, + 0x1170, 0x0096, 0x080c, 0x0fec, 0x2900, 0x009e, 0x05c0, 0xa806, + 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, + 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, + 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, + 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, + 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, + 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, + 0x84ff, 0x0904, 0x9e35, 0x0804, 0x9e37, 0x9085, 0x0001, 0x7817, + 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, + 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x65e5, 0x009e, + 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0x9ac8, + 0x0030, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x080c, 0x9ac8, 0x0005, + 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, + 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, + 0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, + 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, + 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, + 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xb793, 0x0130, 0x6014, + 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0x9ac8, + 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, + 0x00b6, 0x2058, 0xb8bf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, + 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0x9ac8, + 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, + 0x0016, 0x080c, 0xbe86, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, + 0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, 0x080c, + 0xa2a7, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, + 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, + 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, + 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, 0x0260, + 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, + 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, + 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x080c, + 0x9ac8, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, + 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, + 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, + 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb3a8, 0x080c, + 0xb793, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, + 0xa867, 0x0103, 0x080c, 0x9ac8, 0x001e, 0x009e, 0x0005, 0x0016, + 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, + 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, + 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xb3a8, + 0x009e, 0x080c, 0xb793, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, + 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9ac8, 0x009e, + 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, + 0x1118, 0x080c, 0xa456, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, + 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, + 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x1226, 0x0019, 0x0d08, + 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x01b0, + 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, + 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, + 0x2940, 0x080c, 0x10cc, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, + 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, + 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, + 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, + 0x0016, 0x2009, 0x0035, 0x080c, 0xbdfe, 0x001e, 0x1158, 0x622c, + 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, + 0x0006, 0x0128, 0x080c, 0x9ac8, 0x0020, 0x0039, 0x0010, 0x080c, + 0xa0dc, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, + 0x9186, 0x0015, 0x0904, 0xa0c4, 0x918e, 0x0016, 0x1904, 0xa0da, + 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, + 0x1904, 0xa09e, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, + 0xa081, 0x0804, 0xa0d8, 0x6808, 0x9086, 0xffff, 0x1904, 0xa0c6, + 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, + 0x9105, 0x1904, 0xa0c6, 0x6824, 0xd0b4, 0x1904, 0xa0c6, 0x080c, + 0xb975, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, + 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x7f8b, 0xa884, + 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, + 0x2d60, 0x080c, 0xb4d2, 0x00ce, 0x0804, 0xa0d8, 0x00c6, 0xa868, + 0xd0fc, 0x1118, 0x080c, 0x5b10, 0x0010, 0x080c, 0x5ea7, 0x00ce, + 0x1904, 0xa0c6, 0x00c6, 0x2d60, 0x080c, 0x9ac8, 0x00ce, 0x0804, + 0xa0d8, 0x00c6, 0x080c, 0x9b15, 0x0198, 0x6017, 0x0000, 0x6810, + 0x6012, 0x080c, 0xbc01, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, + 0x080c, 0x9ac8, 0x00ce, 0x080c, 0x9b42, 0x00ce, 0x0804, 0xa0d8, + 0x2001, 0x1957, 0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, + 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, + 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xbe40, 0x6007, + 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c, 0x080c, + 0x868e, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, + 0x1957, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, + 0x0db4, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, + 0x080c, 0x640d, 0x080c, 0xb975, 0x080c, 0x9af8, 0x00de, 0x00ce, + 0x080c, 0x9ac8, 0x009e, 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, + 0x1957, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, + 0x2d00, 0x2060, 0x080c, 0xd3e0, 0x080c, 0x7f1f, 0x080c, 0x9ac8, + 0x00ce, 0x080c, 0x9ac8, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, + 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1957, 0x2004, 0x6842, + 0x0804, 0xa156, 0x00c6, 0x2d60, 0x080c, 0xb3d3, 0x00ce, 0x6804, + 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, + 0x6007, 0x0050, 0x080c, 0x810c, 0x080c, 0x868e, 0x00ce, 0x04f0, + 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, 0x0db4, 0x6800, + 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, + 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, + 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, + 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, + 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, + 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, + 0x6832, 0x080c, 0xbaf8, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8, + 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, + 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, + 0x1904, 0xa1c1, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, + 0x9206, 0x1904, 0xa1c1, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, + 0x6a20, 0x9286, 0x0007, 0x0904, 0xa1c1, 0x9286, 0x0002, 0x0904, + 0xa1c1, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, + 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, + 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, + 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, + 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb793, + 0x090c, 0x0db4, 0xa87b, 0x0003, 0x009e, 0x080c, 0xbe40, 0x6007, + 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c, 0x080c, + 0x868e, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1957, 0x2004, + 0x7042, 0x080c, 0x9ac8, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, + 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, + 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, + 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, + 0x20a9, 0x0004, 0x080c, 0xaaa3, 0x002e, 0x003e, 0x015e, 0x009e, + 0x1904, 0xa230, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, + 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xaaa3, 0x002e, + 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, + 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, + 0x00be, 0x0804, 0x9ecb, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, + 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, + 0x2031, 0x0000, 0x2041, 0x1226, 0x080c, 0x9fca, 0x0130, 0x00fe, + 0x009e, 0x080c, 0x9ac8, 0x00be, 0x0005, 0x080c, 0xa456, 0x0cb8, + 0x2b78, 0x00f6, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x00fe, 0x00c6, + 0x080c, 0x9a72, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, + 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5f42, + 0x080c, 0x5f6e, 0x080c, 0x8154, 0x080c, 0x868e, 0x00ce, 0x0804, + 0xa203, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0db4, 0x91b2, 0x0040, + 0x1a04, 0xa2b9, 0x0002, 0xa2a7, 0xa2a7, 0xa29d, 0xa2a7, 0xa2a7, + 0xa2a7, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, + 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, + 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, + 0xa29b, 0xa29b, 0xa2a7, 0xa29b, 0xa2a7, 0xa2a7, 0xa29b, 0xa29b, + 0xa29b, 0xa29b, 0xa29b, 0xa29d, 0xa29b, 0xa29b, 0xa29b, 0xa29b, + 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa2a7, 0xa2a7, 0xa29b, + 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, + 0xa2a7, 0xa29b, 0xa29b, 0x080c, 0x0db4, 0x0066, 0x00b6, 0x6610, + 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003, + 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x8154, 0x0010, + 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e, + 0x0005, 0x2600, 0x0002, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2a7, 0xa2a7, + 0xa2cd, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2a7, 0xa2cd, 0xa2a7, 0xa2cd, + 0xa2a7, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2cd, 0x080c, 0x0db4, 0x6004, + 0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, 0x0904, 0xa391, + 0x91b6, 0x0027, 0x1904, 0xa34c, 0x080c, 0x8589, 0x6004, 0x080c, + 0xb981, 0x01b0, 0x080c, 0xb992, 0x01a8, 0x908e, 0x0021, 0x0904, + 0xa349, 0x908e, 0x0022, 0x1130, 0x080c, 0x9ef7, 0x0904, 0xa345, + 0x0804, 0xa346, 0x908e, 0x003d, 0x0904, 0xa349, 0x0804, 0xa33f, + 0x080c, 0x2ea4, 0x2001, 0x0007, 0x080c, 0x5f42, 0x6010, 0x00b6, + 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa456, 0x9186, 0x007e, 0x1148, + 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x6d14, 0x1108, 0xc2ad, + 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xd43b, + 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, + 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x6010, 0x00b6, + 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x003e, + 0x002e, 0x001e, 0x080c, 0xbe9b, 0x0016, 0x080c, 0xbbf9, 0x080c, + 0x9ac8, 0x001e, 0x080c, 0x2f76, 0x080c, 0x868e, 0x0030, 0x080c, + 0xbbf9, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x080c, 0xa456, + 0x0cb0, 0x080c, 0xa492, 0x0c98, 0x9186, 0x0014, 0x1db0, 0x080c, + 0x8589, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0x9ef7, 0x0d68, + 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x080c, 0xb981, 0x1190, 0x080c, + 0x2ea4, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa456, + 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, 0xc185, 0x2102, + 0x0870, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456, 0x0840, 0x6004, + 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, + 0x0000, 0x080c, 0x320a, 0x00fe, 0x00ee, 0x0804, 0xa33f, 0x6004, + 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, 0xa456, 0x0804, + 0xa33f, 0x90b2, 0x0040, 0x1a04, 0xa43f, 0x2008, 0x0002, 0xa3d9, + 0xa3da, 0xa3dd, 0xa3e0, 0xa3e3, 0xa3e6, 0xa3d7, 0xa3d7, 0xa3d7, + 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, + 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, + 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3e9, 0xa3f4, 0xa3d7, + 0xa3f6, 0xa3f4, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3f4, + 0xa3f4, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, + 0xa3d7, 0xa426, 0xa3f4, 0xa3d7, 0xa3f0, 0xa3d7, 0xa3d7, 0xa3d7, + 0xa3f1, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3f4, 0xa41d, 0xa3d7, 0x080c, + 0x0db4, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, 0x0003, 0x00f8, + 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001, 0x0009, + 0x00b0, 0x080c, 0x8589, 0x6003, 0x0005, 0x080c, 0x868e, 0x0070, + 0x0018, 0x0010, 0x080c, 0x5f42, 0x0804, 0xa437, 0x080c, 0x8589, + 0x080c, 0xbe9e, 0x6003, 0x0004, 0x080c, 0x868e, 0x0005, 0x080c, + 0x5f42, 0x080c, 0x8589, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e, + 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1955, 0x201c, 0x0040, + 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, + 0x631a, 0x003e, 0x080c, 0x868e, 0x0c08, 0x080c, 0x8589, 0x080c, + 0xbbf9, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x08c0, 0x00e6, 0x00f6, + 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x320a, 0x00fe, 0x00ee, + 0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0838, 0x080c, + 0x8589, 0x6003, 0x0002, 0x080c, 0xbe9e, 0x0804, 0x868e, 0x2600, + 0x2008, 0x0002, 0xa454, 0xa454, 0xa454, 0xa437, 0xa437, 0xa454, + 0xa454, 0xa454, 0xa454, 0xa437, 0xa454, 0xa437, 0xa454, 0xa437, + 0xa454, 0xa454, 0xa454, 0xa454, 0x080c, 0x0db4, 0x00e6, 0x0096, + 0x0026, 0x0016, 0x080c, 0xb793, 0x0568, 0x6014, 0x2048, 0xa864, + 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, + 0x4efc, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, + 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xbd65, 0x0090, + 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, + 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, + 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, + 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, + 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, + 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0db4, 0x6604, + 0x96b6, 0x004d, 0x1120, 0x080c, 0xbc85, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x0043, 0x1120, 0x080c, 0xbcce, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x004b, 0x1120, 0x080c, 0xbcfa, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x0033, 0x1120, 0x080c, 0xbc1b, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x0028, 0x1120, 0x080c, 0xb9cb, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x0029, 0x1120, 0x080c, 0xba0c, 0x0804, 0xa51a, 0x6604, + 0x96b6, 0x001f, 0x1118, 0x080c, 0x9ea0, 0x04e0, 0x6604, 0x96b6, + 0x0000, 0x1118, 0x080c, 0xa1c7, 0x04a8, 0x6604, 0x96b6, 0x0022, + 0x1118, 0x080c, 0x9ed8, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118, + 0x080c, 0x9fe8, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, + 0xa15c, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0x9f10, + 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x9f4c, 0x0090, + 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0x9f77, 0x0058, 0x91b6, + 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, + 0x0804, 0xa7d8, 0x00be, 0x0005, 0x080c, 0x9b5d, 0x0cd8, 0xa537, + 0xa53a, 0xa537, 0xa57e, 0xa537, 0xa70c, 0xa7e5, 0xa537, 0xa537, + 0xa7b2, 0xa537, 0xa7c6, 0x0096, 0x080c, 0x14f3, 0x6014, 0x2048, + 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9ac8, 0xa001, + 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, 0x0074, + 0x1540, 0x080c, 0xceca, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, + 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9, + 0x00be, 0x2001, 0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4, 0x080c, + 0x9ac8, 0x0088, 0x2001, 0x000a, 0x080c, 0x5f42, 0x080c, 0x2ea4, + 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, + 0x0010, 0x080c, 0xa6f7, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, + 0x0158, 0x9006, 0x080c, 0x5f2e, 0x2069, 0x1853, 0x6804, 0x0020, + 0x2001, 0x0006, 0x080c, 0x5f6e, 0x00de, 0x0005, 0x00b6, 0x0096, + 0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904, 0xa6d0, + 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xa929, + 0x0804, 0xa635, 0x00d6, 0x080c, 0x6d14, 0x0198, 0x0026, 0x2011, + 0x0010, 0x080c, 0x6339, 0x002e, 0x05c8, 0x080c, 0x5167, 0x1540, + 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, + 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x6339, 0x002e, 0x0530, + 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, + 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xbd65, 0x0040, + 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, + 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x2ea4, 0x080c, 0x9ac8, + 0x001e, 0x080c, 0x2f76, 0x00de, 0x0804, 0xa6d1, 0x00de, 0x080c, + 0xa91e, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, + 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbd65, + 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, + 0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4, 0x080c, 0x9ac8, 0x0804, + 0xa6d1, 0x080c, 0xa6df, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, + 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbd65, 0x08f8, + 0x080c, 0xa6d5, 0x0160, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0004, + 0x080c, 0x5f6e, 0x2001, 0x0007, 0x080c, 0x5f42, 0x08a0, 0x2001, + 0x0004, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, + 0x8154, 0x080c, 0x868e, 0x0804, 0xa6d1, 0xb85c, 0xd0e4, 0x01d0, + 0x080c, 0xbb9b, 0x080c, 0x6d14, 0x0118, 0xd0dc, 0x1904, 0xa5f7, + 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, 0x00f6, + 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x257f, 0x78e2, 0x00fe, + 0x0804, 0xa5f7, 0x080c, 0xbbd8, 0x2011, 0x1836, 0x2204, 0xc0a5, + 0x2012, 0x0006, 0x080c, 0xd023, 0x000e, 0x1904, 0xa5f7, 0xc0b5, + 0x2012, 0x2001, 0x0006, 0x080c, 0x5f42, 0x9006, 0x080c, 0x5f2e, + 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, + 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, + 0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c, + 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2554, 0x00f6, 0x2100, 0x900e, + 0x080c, 0x250b, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, + 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, + 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2554, + 0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c, 0x250b, + 0x795a, 0x00fe, 0x8108, 0x080c, 0x5f91, 0x2b00, 0x00ce, 0x1904, + 0xa5f7, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, + 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, + 0xb916, 0x2001, 0x0002, 0x080c, 0x5f42, 0x6023, 0x0001, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c, 0x868e, 0x0008, + 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, + 0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, 0x00e6, + 0x080c, 0xd494, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, + 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, + 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, + 0x2001, 0x0007, 0x080c, 0x5f42, 0x080c, 0x5167, 0x1120, 0x2001, + 0x0007, 0x080c, 0x5f6e, 0x080c, 0x2ea4, 0x6020, 0x9086, 0x000a, + 0x1108, 0x0005, 0x0804, 0x9ac8, 0x00b6, 0x00e6, 0x0026, 0x0016, + 0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xa7a9, 0x00d6, + 0x080c, 0x6d14, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x6339, + 0x002e, 0x05c8, 0x080c, 0x5167, 0x1540, 0x6014, 0x2048, 0xa807, + 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, + 0x8008, 0x080c, 0x6339, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, + 0x2011, 0x4009, 0x080c, 0xbd65, 0x0040, 0x6014, 0x2048, 0xa807, + 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, + 0x0016, 0x080c, 0x2ea4, 0x080c, 0x9ac8, 0x001e, 0x080c, 0x2f76, + 0x00de, 0x0804, 0xa7ad, 0x00de, 0x080c, 0x5167, 0x1170, 0x6014, + 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, + 0x0006, 0x080c, 0x4856, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, + 0x080c, 0x608c, 0x080c, 0xa56d, 0x00de, 0x080c, 0xa9ef, 0x1588, + 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, + 0x5f42, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, + 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, + 0x080c, 0xbd65, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, + 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, + 0x080c, 0x2ea4, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9ac8, + 0x0020, 0x080c, 0xa456, 0x080c, 0xa6f7, 0x001e, 0x002e, 0x00ee, + 0x00be, 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, + 0x2001, 0x0002, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0001, + 0x080c, 0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x2030, 0x2011, + 0x1823, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, + 0x2001, 0x0007, 0x080c, 0x5f42, 0x0804, 0x9ac8, 0x0804, 0xa6f7, + 0x0002, 0xa537, 0xa7f0, 0xa537, 0xa82f, 0xa537, 0xa8da, 0xa7e5, + 0xa537, 0xa537, 0xa8ed, 0xa537, 0xa8fd, 0x6604, 0x9686, 0x0003, + 0x0904, 0xa70c, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9ac8, 0x0005, + 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xa90d, 0x11a0, 0x9006, 0x080c, + 0x5f2e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x2001, 0x0002, 0x080c, + 0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c, + 0x868e, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, + 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, + 0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, + 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2e7f, 0x080c, + 0xbe9b, 0x080c, 0xa6f7, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, + 0x00b6, 0x0026, 0x9016, 0x080c, 0xa91b, 0x00d6, 0x2069, 0x194d, + 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, + 0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, + 0x00de, 0x0088, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, + 0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c, + 0x868e, 0x0804, 0xa8aa, 0x080c, 0xb793, 0x01b0, 0x6014, 0x2048, + 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, + 0x0002, 0x080c, 0xbdbf, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, + 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, + 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, + 0x9006, 0x0c38, 0x080c, 0xa456, 0x2009, 0x026e, 0x2134, 0x96b4, + 0x00ff, 0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, + 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, + 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, + 0x080c, 0x5f42, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, + 0x080c, 0xa6f7, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, + 0x0160, 0x6014, 0x2048, 0x080c, 0xb793, 0x0140, 0xa864, 0x9086, + 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, + 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, + 0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27, 0x00ee, 0x0010, 0x080c, + 0x2e7f, 0x0870, 0x080c, 0xa91b, 0x1160, 0x2001, 0x0004, 0x080c, + 0x5f42, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8154, 0x0804, + 0x868e, 0x080c, 0xa456, 0x0804, 0xa6f7, 0x0469, 0x1160, 0x2001, + 0x0008, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, + 0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x00e9, 0x1160, 0x2001, + 0x000a, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, + 0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x2009, 0x026e, 0x2104, + 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, + 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, + 0x0016, 0x6110, 0x2158, 0x080c, 0x6000, 0x001e, 0x00ce, 0x00be, + 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, + 0x2058, 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, + 0xa9c1, 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, + 0x6311, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd188, + 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, + 0x0001, 0x080c, 0x2e4a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2c63, + 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, + 0x2f76, 0x8108, 0x1f04, 0xa95f, 0x015e, 0x00ce, 0x080c, 0xa91e, + 0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, + 0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, + 0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, + 0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a, + 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea, + 0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, + 0x182b, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2554, + 0x080c, 0x6d14, 0x0170, 0x2071, 0x0260, 0x2069, 0x1951, 0x7048, + 0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, + 0xbb9b, 0x0040, 0x2001, 0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4, + 0x080c, 0x9ac8, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, + 0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b, + 0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, + 0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, + 0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x1148, + 0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xaaa3, + 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, + 0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, + 0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, + 0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, + 0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, + 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, + 0x2029, 0x19bf, 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, + 0x2071, 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xaa7b, 0x080c, + 0xd1b4, 0x0904, 0xaa74, 0x6720, 0x9786, 0x0007, 0x0904, 0xaa74, + 0x2500, 0x9c06, 0x0904, 0xaa74, 0x2400, 0x9c06, 0x05e8, 0x3e08, + 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004, + 0x1110, 0x080c, 0x185b, 0x9786, 0x000a, 0x0148, 0x080c, 0xb992, + 0x1130, 0x00ce, 0x080c, 0xa456, 0x080c, 0x9af8, 0x00e8, 0x6014, + 0x2048, 0x080c, 0xb793, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, + 0xa878, 0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0x65e5, 0x080c, + 0xb975, 0x080c, 0x9af8, 0x00ce, 0x9ce0, 0x0018, 0x7064, 0x9c02, + 0x1210, 0x0804, 0xaa22, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, + 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, + 0x080c, 0xd133, 0x0c30, 0x9786, 0x000a, 0x0998, 0x0880, 0x220c, + 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xaa8f, 0x9006, + 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006, + 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006, + 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098, + 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210, + 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, + 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d, + 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a, 0x0053, + 0x1a0c, 0x0db4, 0x080c, 0xb981, 0x0120, 0x080c, 0xb992, 0x0168, + 0x0028, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x0138, 0x080c, 0x8589, + 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x080c, 0xa456, 0x0cb0, + 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, + 0xab04, 0xab04, 0xab04, 0xab06, 0xab06, 0xab06, 0xab06, 0xab04, + 0xab04, 0xab04, 0xab06, 0xab04, 0x080c, 0x0db4, 0x600b, 0xffff, + 0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, + 0x080c, 0x868e, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, + 0x9082, 0x0040, 0x0804, 0xabbb, 0x9186, 0x0027, 0x1520, 0x080c, + 0x8589, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x0096, 0x6114, 0x2148, + 0x080c, 0xb793, 0x0198, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456, + 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, + 0xc1c5, 0xa97e, 0x080c, 0x65f2, 0x080c, 0xb975, 0x009e, 0x080c, + 0x9ac8, 0x0804, 0x868e, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, + 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, 0x0045, 0x0138, + 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, 0x0db4, 0x2001, + 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, 0x2800, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19b6, + 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x7ff8, 0x00ce, 0x00ee, + 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, + 0x9086, 0x0002, 0x1110, 0x0804, 0xabf9, 0x0005, 0x0002, 0xab95, + 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, + 0xab93, 0xab93, 0xabb0, 0xabb0, 0xabb0, 0xabb0, 0xab93, 0xabb0, + 0xab93, 0xabb0, 0xab93, 0x080c, 0x0db4, 0x080c, 0x8589, 0x0096, + 0x6114, 0x2148, 0x080c, 0xb793, 0x0168, 0xa867, 0x0103, 0xa87b, + 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x65f2, + 0x080c, 0xb975, 0x009e, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, + 0x080c, 0x8589, 0x080c, 0xb992, 0x090c, 0xa456, 0x080c, 0x9ac8, + 0x080c, 0x868e, 0x0005, 0x0002, 0xabd2, 0xabd0, 0xabd0, 0xabd0, + 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabe9, + 0xabe9, 0xabe9, 0xabe9, 0xabd0, 0xabf3, 0xabd0, 0xabe9, 0xabd0, + 0x080c, 0x0db4, 0x0096, 0x080c, 0x8589, 0x6014, 0x2048, 0x2001, + 0x1957, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, + 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, + 0x0cb8, 0x080c, 0x8589, 0x080c, 0xbe9e, 0x080c, 0xbea3, 0x6003, + 0x000f, 0x0804, 0x868e, 0x080c, 0x8589, 0x080c, 0x9ac8, 0x0804, + 0x868e, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, + 0x0005, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15, 0xac17, 0xacf4, + 0xac15, 0xad28, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15, + 0xac15, 0xac15, 0xac15, 0xac15, 0xad28, 0x080c, 0x0db4, 0x00b6, + 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, + 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xace3, 0xa87b, 0x0000, + 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, + 0x9115, 0x190c, 0xaebd, 0x080c, 0x640d, 0x6210, 0x2258, 0xba3c, + 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xacc7, + 0x080c, 0x9ac8, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, + 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xaccb, 0x7348, 0xab92, + 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, + 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, + 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, + 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, + 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, + 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, + 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, + 0xac1e, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, + 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, + 0x080c, 0xb3a8, 0x003e, 0xd6cc, 0x0904, 0xac33, 0x7154, 0xa98a, + 0x81ff, 0x0904, 0xac33, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, + 0x0018, 0x2011, 0x0029, 0x080c, 0xb3a8, 0x2011, 0x0205, 0x2013, + 0x0000, 0x080c, 0xbe2b, 0x0804, 0xac33, 0xa868, 0xd0fc, 0x0120, + 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xb347, + 0x00ae, 0x080c, 0xbe2b, 0x080c, 0xb398, 0x0804, 0xac35, 0x080c, + 0xba85, 0x0804, 0xac42, 0xa87c, 0xd0ac, 0x0904, 0xac4e, 0xa880, + 0xd0bc, 0x1904, 0xac4e, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, + 0xa834, 0x931e, 0x0904, 0xac4e, 0xd6d4, 0x0190, 0xab38, 0x9305, + 0x0904, 0xac4e, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xac26, 0xa838, + 0xa934, 0x9105, 0x0904, 0xac26, 0xa880, 0xd0bc, 0x1904, 0xac26, + 0x080c, 0xbabf, 0x0804, 0xac42, 0x0096, 0x00f6, 0x6003, 0x0003, + 0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, + 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, + 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, + 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, + 0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10, + 0x080c, 0x19aa, 0x080c, 0x8171, 0x080c, 0x8769, 0x009e, 0x0005, + 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, + 0x0005, 0xad45, 0xad45, 0xad45, 0xad45, 0xad45, 0xad47, 0xaddd, + 0xad45, 0xad45, 0xadf4, 0xae80, 0xad45, 0xad45, 0xad45, 0xad45, + 0xae95, 0xad45, 0xad45, 0xad45, 0xad45, 0x080c, 0x0db4, 0x0076, + 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, 0x7644, + 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, + 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, + 0x0904, 0xadd8, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, + 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xadd8, 0x080c, + 0x0fec, 0x090c, 0x0db4, 0x2900, 0xb07a, 0xb77c, 0xc7cd, 0xb77e, + 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, + 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, + 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, + 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, + 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, + 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, + 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, + 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb3a8, + 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, + 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, + 0xb3a8, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, + 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb347, + 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, 0x6003, + 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, + 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe, 0x2c10, + 0x080c, 0x19aa, 0x0804, 0x908e, 0x6003, 0x0002, 0x6004, 0x9086, + 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160, + 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, 0x15ad, + 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e, 0x080c, + 0x8589, 0x080c, 0x868e, 0x0096, 0x2001, 0x1957, 0x2004, 0x6042, + 0x080c, 0x863e, 0x080c, 0x8769, 0x6114, 0x2148, 0xa97c, 0xd1e4, + 0x0904, 0xae7b, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, 0x0538, + 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, 0x003f, + 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, 0x20a9, + 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e, 0x001e, + 0xa874, 0x0006, 0x2148, 0x080c, 0x0f9e, 0x001e, 0x0440, 0x0016, + 0x080c, 0x0f9e, 0x009e, 0xa974, 0x0016, 0x080c, 0xb398, 0x001e, + 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, + 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd1dc, + 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, 0x0007, + 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x640d, 0x001e, 0xd1e4, + 0x1120, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x080c, 0xba85, 0x0cd8, + 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8589, 0x080c, 0x868e, + 0x2019, 0x0001, 0x080c, 0x935a, 0x6003, 0x0002, 0x080c, 0xbea3, + 0x080c, 0x863e, 0x080c, 0x8769, 0x0005, 0x6004, 0x9086, 0x0040, + 0x1120, 0x080c, 0x8589, 0x080c, 0x868e, 0x2019, 0x0001, 0x080c, + 0x935a, 0x080c, 0x863e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x0096, + 0x6114, 0x2148, 0x080c, 0xb793, 0x0150, 0xa867, 0x0103, 0xa87b, + 0x0029, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975, 0x009e, + 0x080c, 0x9ac8, 0x080c, 0x8769, 0x0005, 0xa87b, 0x0015, 0xd1fc, + 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, + 0x0006, 0x0016, 0x2009, 0x1a47, 0x2104, 0x8000, 0x200a, 0x001e, + 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, + 0x0040, 0x0208, 0x000a, 0x0005, 0xaef0, 0xaef0, 0xaef0, 0xaef0, + 0xaef0, 0xaef2, 0xaef0, 0xaef0, 0xaf98, 0xaef0, 0xaef0, 0xaef0, + 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xb0c9, + 0x080c, 0x0db4, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, + 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, + 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, + 0xba3e, 0x00be, 0x86ff, 0x0904, 0xaf91, 0x9694, 0xff00, 0x9284, + 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, + 0x0904, 0xaf91, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, + 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0fec, 0x090c, 0x0db4, 0x2900, + 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, + 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, + 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, + 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, + 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, + 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, + 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, + 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, + 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, + 0xb3a8, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, + 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, + 0x080c, 0xb3a8, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, + 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, + 0xb347, 0x080c, 0x1839, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, + 0x2001, 0x1957, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c, + 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, + 0xa97c, 0xd1e4, 0x0904, 0xb0c4, 0x6043, 0x0000, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xb093, + 0xa978, 0xa868, 0xd0fc, 0x0904, 0xb054, 0x0016, 0xa87c, 0x0006, + 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, + 0x0002, 0x0904, 0xb022, 0x9086, 0x0028, 0x1904, 0xb00e, 0xa87b, + 0x001c, 0xb07b, 0x001c, 0x0804, 0xb02a, 0x6024, 0xd0f4, 0x11d0, + 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, + 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, + 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, + 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, + 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, + 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, + 0x0f9e, 0x009e, 0x080c, 0xbabf, 0x0804, 0xb0c4, 0xd1dc, 0x0158, + 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbd4e, 0x0118, 0xb174, + 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, + 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, + 0x190c, 0xaebd, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, + 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, + 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, + 0xa87e, 0x080c, 0xbe2b, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, + 0x0f9e, 0x001e, 0x0804, 0xb0c0, 0x0016, 0x00a6, 0x2150, 0xb174, + 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, + 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, + 0x0015, 0xb07b, 0x0015, 0x080c, 0xbd4e, 0x0118, 0xb174, 0xc1dc, + 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, + 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xaebd, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, + 0x080c, 0x0f9e, 0x009e, 0x080c, 0xbe2b, 0xa974, 0x0016, 0x080c, + 0xb398, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, + 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, + 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbd4e, 0x0118, + 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, + 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, + 0x9115, 0x190c, 0xaebd, 0xa974, 0x0016, 0x080c, 0x640d, 0x001e, + 0xd1e4, 0x1120, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x080c, 0xba85, + 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1847, + 0x009e, 0x0005, 0x080c, 0x8589, 0x0010, 0x080c, 0x863e, 0x080c, + 0xb793, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xb992, 0x1118, + 0x080c, 0xa456, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, + 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, + 0x1110, 0x080c, 0xd42c, 0xa877, 0x0000, 0x080c, 0x65f2, 0x009e, + 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0804, 0x8769, 0xa87b, 0x0004, + 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, + 0x0040, 0x0208, 0x000a, 0x0005, 0xb120, 0xb120, 0xb120, 0xb120, + 0xb120, 0xb122, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, + 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, + 0x080c, 0x0db4, 0x080c, 0x515b, 0x01f8, 0x6014, 0x7144, 0x918c, + 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, + 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, + 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, + 0xaa9e, 0x080c, 0x65f2, 0x009e, 0x0804, 0x9ac8, 0x9182, 0x0085, + 0x0002, 0xb158, 0xb156, 0xb156, 0xb164, 0xb156, 0xb156, 0xb156, + 0xb156, 0xb156, 0xb156, 0xb156, 0xb156, 0xb156, 0x080c, 0x0db4, + 0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, + 0x080c, 0x868e, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, + 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb781, 0x01a0, + 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, + 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb3d3, 0x00ce, 0x0128, 0x6803, + 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, + 0x080c, 0x810c, 0x080c, 0x868e, 0x9280, 0x0004, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, + 0x2260, 0x080c, 0xbabf, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, + 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, + 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085, 0x00e2, + 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0db4, 0x080c, + 0x8589, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x0140, 0xa867, + 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x65f2, 0x009e, + 0x080c, 0x9af8, 0x0804, 0x868e, 0xb1d9, 0xb1db, 0xb1db, 0xb1d9, + 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, + 0xb1d9, 0x080c, 0x0db4, 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, + 0x868e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, + 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8589, 0x080c, + 0x2e7f, 0x080c, 0xbe9b, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, + 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, + 0x65f2, 0x080c, 0xb975, 0x009e, 0x080c, 0x9ac8, 0x080c, 0x868e, + 0x0005, 0x080c, 0x9b5d, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, + 0x8589, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x0d60, 0xa867, + 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, + 0x08f0, 0x0002, 0xb231, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f, + 0xb249, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0x080c, + 0x0db4, 0x080c, 0x8589, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010, + 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x868e, + 0x0005, 0x080c, 0x8589, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010, + 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x868e, + 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, + 0x0804, 0x9b5d, 0xb277, 0xb277, 0xb277, 0xb277, 0xb279, 0xb2c6, + 0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0x080c, + 0x0db4, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, + 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb2da, 0x080c, 0xb793, + 0x1118, 0x080c, 0xb975, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, + 0x1110, 0x080c, 0xb975, 0xa867, 0x0103, 0x080c, 0xbe66, 0x080c, + 0x65f2, 0x00d6, 0x2c68, 0x080c, 0x9a72, 0x01d0, 0x6003, 0x0001, + 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, + 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xbc01, + 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, + 0x2d60, 0x00de, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x6010, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, + 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbdfe, 0x11f0, 0x080c, + 0x9a72, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, + 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, + 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, + 0xbc01, 0x080c, 0x810c, 0x080c, 0x868e, 0x2d60, 0x00de, 0x0804, + 0x9ac8, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x01c8, 0xa867, + 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, + 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, + 0x080c, 0xba81, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975, + 0x009e, 0x0804, 0x9ac8, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, + 0xb793, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, + 0x080c, 0x65f2, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, + 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9b5d, 0x0030, + 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0x0056, + 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, + 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, + 0x0020, 0x2011, 0x0029, 0x080c, 0xb3a8, 0x96b2, 0x0020, 0xb004, + 0x904d, 0x0110, 0x080c, 0x0f9e, 0x080c, 0x0fec, 0x0520, 0x8528, + 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, + 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, + 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, + 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, + 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, + 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, + 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, + 0x080c, 0x65f2, 0x2a48, 0x0cb8, 0x080c, 0x65f2, 0x00ae, 0x0005, + 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, + 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, + 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, + 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, + 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, + 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, + 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, + 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb40e, 0xb40e, 0xb409, + 0xb430, 0xb3fc, 0xb409, 0xb430, 0xb409, 0xb3fc, 0xb3fc, 0xb409, + 0xb409, 0xb409, 0xb3fc, 0xb3fc, 0x080c, 0x0db4, 0x0036, 0x2019, + 0x0010, 0x080c, 0xcd45, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, + 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, + 0x11d8, 0x6014, 0x2048, 0x080c, 0xb793, 0x01c0, 0xa864, 0x9086, + 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, + 0x2001, 0x0005, 0x080c, 0x682c, 0x080c, 0xba81, 0x080c, 0x65e5, + 0x080c, 0x9af8, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, + 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, 0xb446, 0xb474, + 0xb448, 0xb495, 0xb46f, 0xb446, 0xb409, 0xb40e, 0xb40e, 0xb409, + 0xb409, 0xb409, 0xb409, 0xb409, 0xb409, 0xb409, 0x080c, 0x0db4, + 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014, + 0x2048, 0x080c, 0xb793, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096, + 0xa878, 0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0xba81, 0x009e, + 0x080c, 0xbe40, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x080c, 0x810c, 0x080c, 0x868e, 0x9085, 0x0001, 0x0005, 0x0066, + 0x080c, 0x185b, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19b6, 0x7024, + 0x9c06, 0x1120, 0x080c, 0x92e4, 0x00ee, 0x0850, 0x6020, 0x9084, + 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, + 0x2c40, 0x080c, 0x9450, 0x009e, 0x008e, 0x0010, 0x080c, 0x91e1, + 0x00ee, 0x1904, 0xb448, 0x0804, 0xb409, 0x0036, 0x00e6, 0x2071, + 0x19b6, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x935a, 0x00ee, + 0x003e, 0x0804, 0xb448, 0x080c, 0x9580, 0x00ee, 0x003e, 0x1904, + 0xb448, 0x0804, 0xb409, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, + 0x00ce, 0x0005, 0xb4c8, 0xb577, 0xb6de, 0xb4d2, 0x9af8, 0xb4c8, + 0xcd37, 0xbea8, 0xb577, 0xb4c1, 0xb75d, 0xb4c1, 0xb4c1, 0xb4c1, + 0xb4c1, 0x080c, 0x0db4, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456, + 0x0005, 0x080c, 0x8589, 0x080c, 0x868e, 0x0804, 0x9ac8, 0x601b, + 0x0001, 0x0005, 0x080c, 0xb793, 0x0130, 0x6014, 0x0096, 0x2048, + 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, + 0x0002, 0xb4f1, 0xb4f3, 0xb517, 0xb52b, 0xb54f, 0xb4f1, 0xb4c8, + 0xb4c8, 0xb4c8, 0xb52b, 0xb52b, 0xb4f1, 0xb4f1, 0xb4f1, 0xb4f1, + 0xb535, 0x080c, 0x0db4, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, + 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b6, 0x7024, 0x9c06, 0x01a0, + 0x080c, 0x91e1, 0x080c, 0xbe40, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c, 0x810c, + 0x080c, 0x868e, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, + 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xbe40, + 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c, + 0x080c, 0x868e, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, + 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x515b, 0x01a8, + 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, + 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, + 0xa89b, 0x0004, 0x080c, 0x65f2, 0x009e, 0x0804, 0x9ac8, 0x6014, + 0x0096, 0x904d, 0x01f8, 0xa97c, 0xd1e4, 0x01e0, 0x2001, 0x180f, + 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, + 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, + 0x14fc, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, + 0x9b42, 0x0005, 0x009e, 0x080c, 0x185b, 0x0804, 0xb517, 0x6000, + 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x000b, 0x0005, 0xb58e, 0xb4cf, + 0xb590, 0xb58e, 0xb590, 0xb590, 0xb4c9, 0xb58e, 0xb4c3, 0xb4c3, + 0xb58e, 0xb58e, 0xb58e, 0xb58e, 0xb58e, 0xb58e, 0x080c, 0x0db4, + 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, + 0x000c, 0x1a0c, 0x0db4, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb5ab, + 0xb678, 0xb5ad, 0xb5ed, 0xb5ad, 0xb5ed, 0xb5ad, 0xb5bb, 0xb5ab, + 0xb5ed, 0xb5ab, 0xb5dc, 0x080c, 0x0db4, 0x6004, 0x908e, 0x0016, + 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, + 0x0052, 0x0904, 0xb674, 0x6004, 0x080c, 0xb992, 0x0904, 0xb691, + 0x908e, 0x0004, 0x1110, 0x080c, 0x2ea4, 0x908e, 0x0021, 0x0904, + 0xb695, 0x908e, 0x0022, 0x0904, 0xb6d9, 0x908e, 0x003d, 0x0904, + 0xb695, 0x908e, 0x0039, 0x0904, 0xb699, 0x908e, 0x0035, 0x0904, + 0xb699, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, + 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, + 0x2e7f, 0x080c, 0xa456, 0x0804, 0x9af8, 0x00c6, 0x00d6, 0x6104, + 0x9186, 0x0016, 0x0904, 0xb665, 0x9186, 0x0002, 0x1904, 0xb63a, + 0x2001, 0x1836, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x6d14, 0x11b0, + 0x080c, 0xbe86, 0x0138, 0x080c, 0x6d37, 0x1120, 0x080c, 0x6c24, + 0x0804, 0xb6c2, 0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800, + 0x2003, 0x0001, 0x080c, 0x6c46, 0x0804, 0xb6c2, 0x6010, 0x2058, + 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904, 0xb6c2, 0xb8a0, 0x9084, + 0xff80, 0x1904, 0xb6c2, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, + 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, + 0x6043, 0x0000, 0x080c, 0x9a72, 0x0128, 0x2b00, 0x6012, 0x6023, + 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, + 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1836, + 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27, + 0x00ee, 0x080c, 0xa456, 0x0030, 0x080c, 0xa456, 0x080c, 0x2e7f, + 0x080c, 0xbe9b, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ea4, + 0x012e, 0x00ee, 0x080c, 0x9af8, 0x0005, 0x2001, 0x0002, 0x080c, + 0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c, + 0x868e, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2ea4, 0x0804, 0xb5e9, + 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, + 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xb63a, 0x8001, 0xb842, + 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, 0x00de, 0x00ce, + 0x0898, 0x080c, 0xa456, 0x0804, 0xb5eb, 0x080c, 0xa492, 0x0804, + 0xb5eb, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xbdfe, 0x00de, 0x0118, + 0x080c, 0x9ac8, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, + 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x603c, 0x600a, 0x2001, 0x1956, 0x2004, 0x601a, 0x602c, 0x2c08, + 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x810c, 0x080c, + 0x868e, 0x0005, 0x00de, 0x00ce, 0x080c, 0xa456, 0x080c, 0x2e7f, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ea4, 0x6017, 0x0000, + 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, 0x00ee, + 0x0005, 0x080c, 0x9ef7, 0x1904, 0xb691, 0x0005, 0x6000, 0x908a, + 0x0016, 0x1a0c, 0x0db4, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, + 0x0005, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, + 0xb6f9, 0xb6f9, 0xb4c8, 0xb6f9, 0xb4cf, 0xb6fb, 0xb4cf, 0xb708, + 0xb6f9, 0x080c, 0x0db4, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007, + 0x008b, 0x6003, 0x000d, 0x080c, 0x810c, 0x080c, 0x868e, 0x0005, + 0x080c, 0xbe7a, 0x0118, 0x080c, 0xbe8d, 0x0010, 0x080c, 0xbe9b, + 0x080c, 0xb975, 0x080c, 0xb793, 0x0570, 0x080c, 0x2e7f, 0x080c, + 0xb793, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, + 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x65f2, 0x2c68, + 0x080c, 0x9a72, 0x0150, 0x6810, 0x6012, 0x080c, 0xbc01, 0x00c6, + 0x2d60, 0x080c, 0x9af8, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, + 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154, + 0x080c, 0x868e, 0x00c8, 0x080c, 0xbe7a, 0x0138, 0x6034, 0x9086, + 0x4000, 0x1118, 0x080c, 0x2e7f, 0x08d0, 0x6034, 0x908c, 0xff00, + 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, + 0x2e7f, 0x0868, 0x080c, 0x9af8, 0x0005, 0x6000, 0x908a, 0x0016, + 0x1a0c, 0x0db4, 0x0002, 0xb773, 0xb773, 0xb775, 0xb775, 0xb775, + 0xb773, 0xb773, 0x9af8, 0xb773, 0xb773, 0xb773, 0xb773, 0xb773, + 0xb773, 0xb773, 0xb773, 0x080c, 0x0db4, 0x080c, 0x9580, 0x6114, + 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x65f2, 0x009e, 0x0804, + 0x9ac8, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, 0x0240, 0x2001, + 0x1819, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, + 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, + 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1097, + 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7350, 0x7070, + 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xbe86, 0x0180, + 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, + 0x2e7f, 0x080c, 0xbe9b, 0x00c6, 0x080c, 0x9af8, 0x00ce, 0x0060, + 0x080c, 0xbb7b, 0x0148, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456, + 0x00c6, 0x080c, 0x9ac8, 0x00ce, 0x9ce0, 0x0018, 0x7064, 0x9c02, + 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, + 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, + 0x2061, 0x1a77, 0x6112, 0x080c, 0x2e7f, 0x9006, 0x0010, 0x9085, + 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9a72, 0x01d8, 0x080c, 0x515b, 0x0110, 0x662e, + 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x515b, 0x0118, 0x080c, + 0xb8b9, 0x0168, 0x080c, 0xbc01, 0x6023, 0x0003, 0x2009, 0x004b, + 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, + 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9b15, + 0x0590, 0x080c, 0x515b, 0x0118, 0x602f, 0x0000, 0x0010, 0x6017, + 0x0000, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x6023, 0x0003, 0x0016, + 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x2c08, 0x080c, + 0xcef9, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x9ac8, 0x9085, + 0x0001, 0x0070, 0x080c, 0x515b, 0x0128, 0xd18c, 0x1170, 0x080c, + 0xb8b9, 0x0148, 0x2009, 0x004c, 0x080c, 0x9b42, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, + 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, + 0x0016, 0x080c, 0x9a72, 0x2c78, 0x01d8, 0x080c, 0x515b, 0x0110, + 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, + 0x0005, 0x080c, 0xb8cb, 0x2f60, 0x080c, 0x515b, 0x0118, 0x080c, + 0xb8b9, 0x0130, 0x001e, 0x0016, 0x080c, 0x9b42, 0x9085, 0x0001, + 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, + 0x080c, 0x9a72, 0x2c78, 0x0530, 0x080c, 0x515b, 0x0110, 0x7e2e, + 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, + 0x0004, 0x0489, 0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120, + 0x2f60, 0x080c, 0x9ac8, 0x0060, 0x2f60, 0x080c, 0x515b, 0x0120, + 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9b42, + 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, + 0x0c98, 0x00c6, 0x080c, 0x4659, 0x00ce, 0x1120, 0x080c, 0x9ac8, + 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, + 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, + 0x080c, 0x6125, 0x0158, 0x2001, 0xb8d0, 0x0006, 0x900e, 0x2400, + 0x080c, 0x682c, 0x080c, 0x65f2, 0x000e, 0x0807, 0x2418, 0x080c, + 0x8523, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, + 0x080c, 0x82a4, 0x008e, 0x080c, 0x8184, 0x2f08, 0x2648, 0x080c, + 0xcef9, 0xb93c, 0x81ff, 0x090c, 0x8375, 0x080c, 0x868e, 0x012e, + 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9a72, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, + 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9b42, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x080c, 0x9b15, 0x01b8, 0x660a, 0x2b08, 0x6112, + 0x080c, 0xbc01, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, + 0x080c, 0x15ad, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9b42, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, + 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9a72, 0x0198, + 0x660a, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0001, 0x2900, + 0x6016, 0x001e, 0x0016, 0x080c, 0x9b42, 0x9085, 0x0001, 0x001e, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9b15, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbc01, + 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9b42, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, + 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, + 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x002e, + 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, + 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, + 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, + 0x6014, 0x904d, 0x080c, 0xb793, 0x0168, 0xa864, 0x9086, 0x0139, + 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, + 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0x9b15, 0x0198, 0x2b08, 0x6112, + 0x080c, 0xbc01, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x2e7f, + 0x2009, 0x0028, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1823, + 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa6df, 0x00be, + 0x080c, 0xa91e, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x8154, + 0x080c, 0x868e, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, + 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbdbf, 0x080c, 0xa456, + 0x080c, 0x9ac8, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0db4, + 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, + 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, + 0x009e, 0x080c, 0x9ac8, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, + 0x2001, 0x0004, 0x080c, 0x5f42, 0x00e8, 0x9186, 0x0015, 0x1510, + 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, + 0x2058, 0x080c, 0x608c, 0x00be, 0x080c, 0xa9ef, 0x1198, 0x6010, + 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, + 0x080c, 0x5f42, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, + 0x9ecb, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, + 0xa456, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, + 0x904d, 0x090c, 0x0db4, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, + 0x4000, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, + 0x012e, 0x080c, 0x9ac8, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0db4, + 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, + 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, + 0x080c, 0x9ac8, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, + 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, 0x6017, + 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x810c, 0x080c, + 0x868e, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005, + 0xb4c8, 0xbab1, 0xbab1, 0xbab4, 0xd1d2, 0xd1ed, 0xd1f0, 0xb4c8, + 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0x080c, + 0x0db4, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, + 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, + 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1833, + 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0x9a72, 0x0508, + 0x7810, 0x6012, 0x080c, 0xbc01, 0x7820, 0x9086, 0x0003, 0x0128, + 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, + 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, + 0x7954, 0x6156, 0x080c, 0x810c, 0x080c, 0x868e, 0x2f60, 0x00fe, + 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005, + 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0180, 0xc0e4, + 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, + 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0f9e, 0x6830, + 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, + 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, + 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, + 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, + 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, + 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, + 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, + 0x868e, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, + 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, + 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, + 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, + 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, + 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, + 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, + 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, + 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, + 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, + 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, + 0x2001, 0x1951, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, + 0x7f8b, 0x2001, 0x1955, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, + 0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d, 0x711a, + 0x721e, 0x2001, 0x0064, 0x080c, 0x7f8b, 0x2001, 0x1956, 0x82ff, + 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1957, 0x9288, 0x000a, + 0x2102, 0x2001, 0x1a58, 0x2102, 0x2001, 0x0032, 0x080c, 0x14fc, + 0x080c, 0x62f6, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, + 0x0006, 0x0016, 0x00e6, 0x2001, 0x1955, 0x2003, 0x0028, 0x2001, + 0x1956, 0x2003, 0x0014, 0x2071, 0x193d, 0x701b, 0x0000, 0x701f, + 0x07d0, 0x2001, 0x1957, 0x2009, 0x001e, 0x2102, 0x2001, 0x1a58, + 0x2102, 0x2001, 0x0032, 0x080c, 0x14fc, 0x00ee, 0x001e, 0x000e, + 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x101e, 0x009e, + 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a72, + 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, + 0x2009, 0x0033, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, + 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, 0x11e0, 0x6014, + 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x887e, 0x01d8, + 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, 0x9206, 0x1140, + 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x2ec4, + 0x080c, 0x9ecb, 0x0020, 0x080c, 0xa456, 0x080c, 0x9ac8, 0x00fe, + 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, 0x0d48, 0x0c80, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a72, 0x0188, 0x2b08, + 0x6112, 0x080c, 0xbc01, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, + 0x004d, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, + 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, + 0x9a72, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0001, + 0x2900, 0x6016, 0x001e, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, + 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, + 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, 0xa814, 0x8003, + 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x196f, 0x2003, 0x0000, + 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, + 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, + 0x196f, 0x0016, 0x200c, 0x080c, 0xc432, 0x001e, 0xa804, 0x9005, + 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, + 0x080c, 0xa456, 0x080c, 0x9ac8, 0x00fe, 0x00ee, 0x009e, 0x006e, + 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, + 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x708c, 0x9086, + 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x887e, 0x01a8, + 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, 0x9206, 0x1110, + 0x080c, 0x2e7f, 0x080c, 0x9ecb, 0x0020, 0x080c, 0xa456, 0x080c, + 0x9ac8, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa78, 0x9206, + 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, + 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, + 0x2c78, 0x080c, 0x887e, 0x05e8, 0x7078, 0xaacc, 0x9206, 0x1180, + 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2e7f, 0x0016, 0xa998, + 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x510b, 0x001e, 0x0010, + 0x080c, 0x4efc, 0x080c, 0xb793, 0x0500, 0xa87b, 0x0000, 0xa883, + 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x4efc, 0x080c, 0xb793, + 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, + 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, + 0x080c, 0x65f2, 0x012e, 0x080c, 0x9ac8, 0x00fe, 0x00ee, 0x009e, + 0x0005, 0x705c, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, 0x0026, + 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, + 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, + 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, + 0x080c, 0xb793, 0x0904, 0xbdbb, 0x0096, 0x6314, 0x2348, 0xa87a, + 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, + 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6211, 0x1108, 0xc185, + 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, + 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f69, 0x20a9, 0x0004, + 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, 0x2098, + 0x080c, 0x0f69, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, + 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, + 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x65e5, + 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026, + 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210, + 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084, + 0x00ff, 0x900e, 0x080c, 0x250b, 0x2118, 0x831f, 0x939c, 0xff00, + 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, + 0x46b9, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b, + 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002, + 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe, + 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026, + 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c, + 0xb781, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, + 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160, + 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106, + 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005, + 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff, + 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e, + 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaebd, 0x0005, + 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, + 0x080c, 0xb793, 0x01c8, 0x080c, 0xb975, 0x6037, 0x4000, 0x6014, + 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xb992, 0x1118, + 0x080c, 0xa456, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, + 0x1129, 0x080c, 0x65f2, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, + 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, + 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xba81, 0xa877, + 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006, + 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, + 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, + 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4856, + 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1955, + 0x2004, 0x601a, 0x0005, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005, + 0x080c, 0x9ac8, 0x0804, 0x868e, 0x00b6, 0x0066, 0x6000, 0x90b2, + 0x0016, 0x1a0c, 0x0db4, 0x001b, 0x006e, 0x00be, 0x0005, 0xbec7, + 0xc58f, 0xc6ea, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbefe, + 0xc768, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0x080c, + 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, + 0x006e, 0x0005, 0xbee2, 0xccd0, 0xbee2, 0xbee2, 0xbee2, 0xbee2, + 0xbee2, 0xbee2, 0xcc7d, 0xcd24, 0xbee2, 0xd30d, 0xd343, 0xd30d, + 0xd343, 0xbee2, 0x080c, 0x0db4, 0x6000, 0x9082, 0x0016, 0x1a0c, + 0x0db4, 0x6000, 0x000a, 0x0005, 0xbefc, 0xc945, 0xca35, 0xca57, + 0xcb16, 0xbefc, 0xcbf4, 0xcb9e, 0xc774, 0xcc53, 0xcc68, 0xbefc, + 0xbefc, 0xbefc, 0xbefc, 0xbefc, 0x080c, 0x0db4, 0x91b2, 0x0053, + 0x1a0c, 0x0db4, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xc332, 0x0002, + 0xbf48, 0xc123, 0xbf48, 0xbf48, 0xbf48, 0xc12c, 0xbf48, 0xbf48, + 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, + 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf4a, + 0xbfa0, 0xbfaf, 0xc013, 0xc03e, 0xc0b6, 0xc10e, 0xbf48, 0xbf48, + 0xc12f, 0xbf48, 0xbf48, 0xc144, 0xc151, 0xbf48, 0xbf48, 0xbf48, + 0xbf48, 0xbf48, 0xc1d4, 0xbf48, 0xbf48, 0xc1e8, 0xbf48, 0xbf48, + 0xc1a3, 0xbf48, 0xbf48, 0xbf48, 0xc200, 0xbf48, 0xbf48, 0xbf48, + 0xc27d, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xc2fa, + 0x080c, 0x0db4, 0x080c, 0x62d3, 0x1150, 0x2001, 0x1836, 0x2004, + 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, + 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xc11c, 0x080c, + 0x62bc, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, + 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x903e, + 0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x001e, 0x001e, + 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x6000, + 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xce2c, + 0x1904, 0xc00b, 0x080c, 0xcdc8, 0x1120, 0x6007, 0x0008, 0x0804, + 0xc11c, 0x6007, 0x0009, 0x0804, 0xc11c, 0x080c, 0xd023, 0x0128, + 0x080c, 0xce2c, 0x0d78, 0x0804, 0xc00b, 0x6017, 0x1900, 0x0c88, + 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x6106, 0x080c, 0xcd7f, 0x6007, + 0x0006, 0x0804, 0xc11c, 0x6007, 0x0007, 0x0804, 0xc11c, 0x080c, + 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x00d6, + 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, + 0x2001, 0x0001, 0x080c, 0x5f2e, 0x96b4, 0xff00, 0x8637, 0x9686, + 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, + 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, + 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, + 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, + 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, + 0x00ee, 0x080c, 0xce8f, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, + 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2ec4, 0x002e, 0x080c, + 0x608c, 0x6007, 0x000a, 0x00de, 0x0804, 0xc11c, 0x6007, 0x000b, + 0x00de, 0x0804, 0xc11c, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x6007, + 0x0001, 0x0804, 0xc11c, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, + 0x2f9e, 0x1904, 0xc32f, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, + 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, + 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, + 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2ec4, 0x002e, 0x6007, 0x000c, + 0x2001, 0x0001, 0x080c, 0xd49b, 0x0804, 0xc11c, 0x080c, 0x62d3, + 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, + 0x1110, 0x0804, 0xbf57, 0x080c, 0x62bc, 0x6610, 0x2658, 0xbe04, + 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, 0x2001, + 0x0006, 0x080c, 0x5f6e, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc00b, 0x080c, + 0xce9c, 0x1120, 0x6007, 0x000e, 0x0804, 0xc11c, 0x0046, 0x6410, + 0x2458, 0xbca0, 0x0046, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x004e, + 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, 0x0029, + 0x080c, 0xd188, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, + 0x004e, 0x6007, 0x0001, 0x0804, 0xc11c, 0x2001, 0x0001, 0x080c, + 0x5f2e, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, + 0x1805, 0x2011, 0x0270, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e, + 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, + 0x0a04, 0xc00b, 0x9682, 0x0007, 0x0a04, 0xc067, 0x0804, 0xc00b, + 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc11c, 0x080c, 0x62d3, + 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, + 0x1110, 0x0804, 0xbf57, 0x080c, 0x62bc, 0x6610, 0x2658, 0xbe04, + 0x9684, 0x00ff, 0x9082, 0x0006, 0x0688, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc00b, 0x080c, + 0xceca, 0x1130, 0x080c, 0xcdc8, 0x1118, 0x6007, 0x0010, 0x04e0, + 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2e7f, 0x080c, + 0xbe9b, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, + 0x2009, 0x0029, 0x080c, 0xd188, 0x6010, 0x2058, 0xb800, 0xc0e5, + 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xd023, + 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0980, 0x0804, + 0xc00b, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f9e, + 0x1904, 0xc32f, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0xc4cd, + 0x1904, 0xc00b, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x8154, + 0x080c, 0x868e, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, + 0x8154, 0x080c, 0x868e, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, + 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x080c, + 0xc4cd, 0x1904, 0xc00b, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, + 0x8154, 0x080c, 0x868e, 0x0005, 0x080c, 0x2f9e, 0x1904, 0xc32f, + 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, + 0x0005, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, + 0xc32f, 0x080c, 0xc4cd, 0x1904, 0xc00b, 0x0016, 0x0026, 0x00e6, + 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, + 0xb781, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, + 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, + 0x9006, 0x080c, 0xd15a, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, + 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, + 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, + 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9ac8, 0x2160, 0x6007, + 0x0025, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, 0x00ee, + 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5f2e, 0x0156, + 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, + 0x0276, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, + 0x6007, 0x0031, 0x0804, 0xc11c, 0x080c, 0xa6f7, 0x080c, 0x6d14, + 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6d2e, 0x1138, 0x080c, + 0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46, 0x0010, 0x080c, 0x6cec, + 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2f9e, 0x1904, 0xc32f, + 0x080c, 0xc4cd, 0x1904, 0xc00b, 0x6106, 0x080c, 0xc4e9, 0x1120, + 0x6007, 0x002b, 0x0804, 0xc11c, 0x6007, 0x002c, 0x0804, 0xc11c, + 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f, + 0x080c, 0xc4cd, 0x1904, 0xc00b, 0x6106, 0x080c, 0xc4ee, 0x1120, + 0x6007, 0x002e, 0x0804, 0xc11c, 0x6007, 0x002f, 0x0804, 0xc11c, + 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x00e6, 0x00d6, 0x00c6, 0x6010, + 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, + 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, + 0x0804, 0xc123, 0x080c, 0x5157, 0xd0e4, 0x0904, 0xc27a, 0x2071, + 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, + 0x6311, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, + 0x9206, 0x0510, 0x080c, 0x630d, 0x15b8, 0x2069, 0x1800, 0x687c, + 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, 0xb781, + 0x0590, 0x080c, 0xc3ba, 0x0578, 0x080c, 0xd1ff, 0x0560, 0x622e, + 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, + 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, + 0x080c, 0xb781, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, + 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd15a, + 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, + 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, + 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2f9e, 0x1904, + 0xc32f, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, + 0x0006, 0x1904, 0xc123, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x5157, + 0xd0e4, 0x0904, 0xc2f2, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, + 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, + 0x2c08, 0x9085, 0x0001, 0x080c, 0xd15a, 0x2c10, 0x00ce, 0x05e8, + 0x080c, 0xb781, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, + 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb3d3, 0x002e, 0x00ce, + 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, + 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, + 0x9005, 0x0170, 0x080c, 0xc3ba, 0x0904, 0xc273, 0x0056, 0x7510, + 0x7614, 0x080c, 0xd218, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, + 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, + 0x080c, 0x810c, 0x080c, 0x868e, 0x0c78, 0x6007, 0x003b, 0x602f, + 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, + 0x868e, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, + 0x0804, 0xc24a, 0x00e6, 0x0026, 0x080c, 0x62d3, 0x0550, 0x080c, + 0x62bc, 0x080c, 0xd3f1, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085, + 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, 0x00ff, + 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, 0x78ea, + 0x00fe, 0x70e3, 0x0000, 0x080c, 0x6311, 0x0120, 0x2011, 0x19cf, + 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c63, 0x0010, 0x080c, + 0xd423, 0x002e, 0x00ee, 0x080c, 0x9ac8, 0x0804, 0xc122, 0x080c, + 0x9ac8, 0x0005, 0x2600, 0x0002, 0xc346, 0xc346, 0xc346, 0xc346, + 0xc346, 0xc348, 0xc346, 0xc346, 0xc346, 0xc346, 0xc365, 0xc346, + 0xc346, 0xc346, 0xc377, 0xc384, 0xc3b5, 0xc346, 0x080c, 0x0db4, + 0x080c, 0xd37f, 0x1d20, 0x080c, 0x2f9e, 0x1d08, 0x080c, 0xc4cd, + 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, + 0x8154, 0x0005, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x6007, 0x0001, + 0x6003, 0x0001, 0x080c, 0x8154, 0x0005, 0x080c, 0xd37f, 0x1938, + 0x080c, 0x2f9e, 0x1920, 0x080c, 0xc4cd, 0x1d60, 0x703c, 0x6016, + 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8154, 0x0005, 0x080c, + 0xc3d5, 0x0904, 0xc32f, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, + 0x8154, 0x080c, 0x868e, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, + 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, + 0x7140, 0x2001, 0x198c, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, + 0x198d, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, + 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, + 0x080c, 0xaaa3, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8154, 0x080c, 0x868e, 0x0005, 0x6007, 0x0050, 0x703c, + 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, + 0x6010, 0x2058, 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, + 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, + 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, + 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, + 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196f, + 0x2003, 0x0000, 0x080c, 0x1005, 0x05a0, 0x2900, 0x6016, 0x708c, + 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, + 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, + 0x196f, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1005, + 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, + 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, + 0x196f, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, + 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, 0x6014, 0x2048, 0x080c, + 0x0f9e, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, + 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, + 0xffff, 0x11a8, 0x080c, 0x20e9, 0x2099, 0x026c, 0x2001, 0x0014, + 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, + 0x22a8, 0x8108, 0x080c, 0x20e9, 0x2099, 0x0260, 0x0ca8, 0x080c, + 0x20e9, 0x2061, 0x196f, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, + 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, + 0x080c, 0x20e9, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196f, 0x2019, + 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, + 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, + 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, + 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2101, 0x20a1, + 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, + 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, + 0x2101, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2101, 0x2061, 0x1972, + 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, + 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, + 0x2101, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1972, 0x2019, 0x0260, + 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, + 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, + 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, + 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, + 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, + 0x0005, 0x00d6, 0x080c, 0xc565, 0x00de, 0x0005, 0x00d6, 0x080c, + 0xc572, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, + 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, + 0xd49b, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, + 0x00ff, 0x6824, 0x080c, 0x250b, 0x1148, 0x2001, 0x0001, 0x080c, + 0xd49b, 0x2110, 0x900e, 0x080c, 0x2ec4, 0x0018, 0x9085, 0x0001, + 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0x9b15, + 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, + 0x220c, 0x080c, 0x250b, 0x1578, 0x080c, 0x5f91, 0x1560, 0xbe12, + 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xd37f, + 0x11d8, 0x080c, 0x2f9e, 0x11c0, 0x080c, 0xc4cd, 0x0510, 0x2001, + 0x0007, 0x080c, 0x5f42, 0x2001, 0x0007, 0x080c, 0x5f6e, 0x6017, + 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, + 0x8154, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8, 0x9085, 0x0001, + 0x00ce, 0x00be, 0x0005, 0x080c, 0x9ac8, 0x00ce, 0x002e, 0x001e, + 0x0ca8, 0x080c, 0x9ac8, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, + 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, + 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, + 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, + 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, + 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, + 0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, 0x1130, 0x2008, + 0x91b2, 0x0040, 0x1a04, 0xc6ba, 0x0092, 0x91b6, 0x0027, 0x0120, + 0x91b6, 0x0014, 0x190c, 0x0db4, 0x2001, 0x0007, 0x080c, 0x5f6e, + 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0xc5ef, + 0xc5f1, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5f1, 0xc600, 0xc6b3, 0xc652, + 0xc6b3, 0xc664, 0xc6b3, 0xc600, 0xc6b3, 0xc6ab, 0xc6b3, 0xc6ab, + 0xc6b3, 0xc6b3, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, + 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5f1, 0xc5ef, 0xc6b3, + 0xc5ef, 0xc5ef, 0xc6b3, 0xc5ef, 0xc6b0, 0xc6b3, 0xc5ef, 0xc5ef, + 0xc5ef, 0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef, + 0xc5fb, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc6af, 0xc6b3, 0xc5ef, + 0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0x080c, + 0x0db4, 0x080c, 0x8589, 0x080c, 0xbe9e, 0x6003, 0x0002, 0x080c, + 0x868e, 0x0804, 0xc6b9, 0x9006, 0x080c, 0x5f2e, 0x0804, 0xc6b3, + 0x080c, 0x630d, 0x1904, 0xc6b3, 0x9006, 0x080c, 0x5f2e, 0x6010, + 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, + 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb8b0, + 0x9005, 0x1178, 0x080c, 0xbe86, 0x1904, 0xc6b3, 0x0036, 0x0046, + 0xbba0, 0x2021, 0x0007, 0x080c, 0x4856, 0x004e, 0x003e, 0x0804, + 0xc6b3, 0x080c, 0x2fcf, 0x1904, 0xc6b3, 0x2001, 0x1800, 0x2004, + 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, + 0x78a6, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5f42, 0x080c, 0x8589, + 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, + 0x080c, 0x868e, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x7d64, + 0x0804, 0xc6b9, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0006, 0x0904, 0xc6b3, 0x9686, 0x0004, 0x0904, 0xc6b3, + 0x2001, 0x0004, 0x0804, 0xc6b1, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, + 0x0006, 0x080c, 0x4856, 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, + 0xc6d7, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c, 0x5f6e, + 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006, 0x080c, + 0x5f42, 0x080c, 0x630d, 0x11f8, 0x2001, 0x1836, 0x2004, 0xd0a4, + 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, + 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0804, 0xc63a, + 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, + 0x0010, 0x080c, 0x5f6e, 0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c, + 0x868e, 0x0005, 0x2600, 0x0002, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6ce, + 0xc6ce, 0xc6d0, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6d0, 0xc6ce, + 0xc6ce, 0xc6ce, 0xc6d0, 0xc6d0, 0xc6d0, 0xc6d0, 0x080c, 0x0db4, + 0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x0016, + 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, + 0x5f42, 0x9006, 0x080c, 0x5f2e, 0x080c, 0x2ea4, 0x00de, 0x00be, + 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, + 0x90b2, 0x000c, 0x1a0c, 0x0db4, 0x91b6, 0x0015, 0x1110, 0x003b, + 0x0028, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x006b, 0x0005, 0xa537, + 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xc752, 0xc717, 0xa537, + 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, + 0xa537, 0xc752, 0xc759, 0xa537, 0xa537, 0xa537, 0xa537, 0x00f6, + 0x080c, 0x630d, 0x11d8, 0x080c, 0xbe86, 0x11c0, 0x6010, 0x905d, + 0x01a8, 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5f2e, 0x2001, + 0x0002, 0x080c, 0x5f42, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, + 0x0002, 0x080c, 0x8154, 0x080c, 0x868e, 0x00d0, 0x2011, 0x0263, + 0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x1190, 0x080c, 0x5ff1, + 0x0118, 0x080c, 0x9ac8, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006, + 0x080c, 0x5aae, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9ac8, + 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9ac8, + 0x0005, 0x080c, 0xa91b, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, + 0x080c, 0x8154, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8, 0x0005, + 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4, 0x080c, 0x8589, 0x080c, + 0x9af8, 0x080c, 0x868e, 0x0005, 0x9182, 0x0040, 0x0002, 0xc78a, + 0xc78a, 0xc78a, 0xc78a, 0xc78c, 0xc78a, 0xc78a, 0xc78a, 0xc78a, + 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, + 0xc78a, 0xc78a, 0x080c, 0x0db4, 0x0096, 0x00b6, 0x00d6, 0x00e6, + 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, + 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc7f2, + 0x080c, 0xd48f, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, + 0x2011, 0x0200, 0x080c, 0x7f4a, 0x0020, 0x9026, 0x080c, 0xd3c4, + 0x0c38, 0x080c, 0x0fec, 0x090c, 0x0db4, 0x6003, 0x0007, 0xa867, + 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, + 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, + 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x65f2, + 0x001e, 0x080c, 0xd48f, 0x1904, 0xc852, 0x9486, 0x2000, 0x1130, + 0x2019, 0x0017, 0x080c, 0xd104, 0x0804, 0xc852, 0x9486, 0x0200, + 0x1120, 0x080c, 0xd0a0, 0x0804, 0xc852, 0x9486, 0x0400, 0x0120, + 0x9486, 0x1000, 0x1904, 0xc852, 0x2019, 0x0002, 0x080c, 0xd0bb, + 0x0804, 0xc852, 0x2069, 0x1a3e, 0x6a00, 0xd284, 0x0904, 0xc8bc, + 0x9284, 0x0300, 0x1904, 0xc8b5, 0x6804, 0x9005, 0x0904, 0xc89d, + 0x2d78, 0x6003, 0x0007, 0x080c, 0x1005, 0x0904, 0xc85e, 0x7800, + 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, + 0x180f, 0x2004, 0xd084, 0x1904, 0xc8c0, 0x9006, 0xa802, 0xa867, + 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, + 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, + 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, + 0x0003, 0x9080, 0xc85a, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, + 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, + 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, + 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, + 0x080c, 0x65f2, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, + 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, + 0x2004, 0xd084, 0x0120, 0x080c, 0x0fec, 0x1904, 0xc807, 0x6017, + 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x810c, 0x080c, + 0x868e, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, + 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, + 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, + 0x080c, 0x810c, 0x080c, 0x868e, 0x0828, 0x6868, 0x602e, 0x686c, + 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, + 0x810c, 0x080c, 0x868e, 0x0804, 0xc852, 0x2001, 0x180e, 0x2004, + 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x46b9, 0x6017, 0xf300, + 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, + 0x810c, 0x080c, 0x868e, 0x0804, 0xc852, 0x6017, 0xf500, 0x0c98, + 0x6017, 0xf600, 0x0804, 0xc872, 0x6017, 0xf200, 0x0804, 0xc872, + 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, + 0x7044, 0x9084, 0x0003, 0x9080, 0xc85a, 0x2005, 0xa87e, 0x2928, + 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, + 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, + 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, + 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0db4, + 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0029, 0x20a0, 0x2011, 0xc93c, 0x2041, 0x0001, 0x223d, + 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, + 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, + 0x2098, 0x0c68, 0x2950, 0x080c, 0x1005, 0x0170, 0x2900, 0xb002, + 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, + 0x080c, 0x101e, 0x0cc8, 0x080c, 0x101e, 0x0804, 0xc85e, 0x2548, + 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, + 0x080c, 0xd133, 0x0804, 0xc852, 0x8010, 0x0004, 0x801a, 0x0006, + 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, + 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0db4, 0x9082, 0x0040, 0x0a0c, + 0x0db4, 0x2008, 0x0804, 0xc9ed, 0x9186, 0x0051, 0x0108, 0x00c0, + 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc99e, 0x0126, 0x2091, + 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7ff8, 0x002e, 0x001e, + 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xca35, + 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, + 0x0500, 0x190c, 0x0db4, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, + 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, + 0x0016, 0x0026, 0x080c, 0x7ff8, 0x002e, 0x001e, 0x000e, 0x00ce, + 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0db4, 0x0804, + 0xcb16, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x9b5d, + 0x0005, 0xc9b4, 0xc9b6, 0xc9b6, 0xc9dd, 0xc9b4, 0xc9b4, 0xc9b4, + 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, + 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0x080c, 0x0db4, 0x080c, 0x8589, + 0x080c, 0x868e, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, + 0xb793, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xd133, 0x6017, + 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1956, 0x2004, 0x601a, + 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x8589, + 0x080c, 0x868e, 0x080c, 0xb793, 0x0120, 0x6014, 0x2048, 0x080c, + 0x101e, 0x080c, 0x9af8, 0x009e, 0x0005, 0x0002, 0xca01, 0xca18, + 0xca03, 0xca2f, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, + 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, + 0xca01, 0x080c, 0x0db4, 0x0096, 0x080c, 0x8589, 0x6014, 0x2048, + 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, + 0x9b42, 0x0010, 0x6003, 0x0004, 0x080c, 0x868e, 0x009e, 0x0005, + 0x080c, 0x8589, 0x080c, 0xb793, 0x0138, 0x6114, 0x0096, 0x2148, + 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x7f1f, 0x080c, 0x9ac8, + 0x080c, 0x868e, 0x0005, 0x080c, 0xd388, 0x0db0, 0x0cc8, 0x080c, + 0x8589, 0x2009, 0x0041, 0x0804, 0xcb9e, 0x9182, 0x0040, 0x0002, + 0xca4b, 0xca4d, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, + 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, + 0xca4b, 0xca4e, 0xca4b, 0x080c, 0x0db4, 0x0005, 0x00d6, 0x080c, + 0x7f1f, 0x00de, 0x080c, 0xd3e0, 0x080c, 0x9ac8, 0x0005, 0x9182, + 0x0040, 0x0002, 0xca6d, 0xca6d, 0xca6d, 0xca6d, 0xca6d, 0xca6d, + 0xca6d, 0xca6d, 0xca6d, 0xca6f, 0xcade, 0xca6d, 0xca6d, 0xca6d, + 0xca6d, 0xcade, 0xca6d, 0xca6d, 0xca6d, 0x080c, 0x0db4, 0x2001, + 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, + 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xcade, 0x2009, 0x180c, + 0x2104, 0xd0d4, 0x0904, 0xcade, 0xc0d4, 0x200a, 0x2009, 0x0105, + 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1873, + 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x863e, 0x6014, + 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, + 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, + 0x8769, 0x2009, 0x0041, 0x009e, 0x0804, 0xcb9e, 0x080c, 0x8769, + 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x7f1f, 0x009e, 0x0005, + 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, + 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, + 0xd1cc, 0x0110, 0x080c, 0x291f, 0x080c, 0x8769, 0x6014, 0x2048, + 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x009e, + 0x0005, 0x080c, 0xd388, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, + 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x863e, 0x080c, 0x8769, + 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, + 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, + 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xd133, 0x6018, + 0x9005, 0x1128, 0x2001, 0x1956, 0x2004, 0x8003, 0x601a, 0x6017, + 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, + 0x0002, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, + 0xcb2d, 0xcb2f, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, + 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb7a, 0x080c, 0x0db4, 0x6014, + 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, + 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, + 0x2009, 0x0041, 0x009e, 0x0804, 0xcb9e, 0x6003, 0x0007, 0x601b, + 0x0000, 0x080c, 0x7f1f, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, + 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, + 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, + 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, + 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, + 0x0006, 0x00e9, 0x080c, 0x7f21, 0x009e, 0x0005, 0x6003, 0x0002, + 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x14f3, 0x1904, + 0xcb2f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, + 0x9105, 0x1120, 0x080c, 0x14f3, 0x1904, 0xcb2f, 0x0005, 0xd2fc, + 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, + 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, + 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, + 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005, 0xcbc1, 0xcbcd, + 0xcbd9, 0xcbe5, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc8, 0xcbc3, + 0xcbc3, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc3, 0xcbc1, 0xcbc3, + 0xcbc1, 0x080c, 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005, + 0x6014, 0x9005, 0x190c, 0x0db4, 0x0005, 0x6003, 0x0001, 0x6106, + 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e, + 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, + 0x8000, 0x080c, 0x868e, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, + 0x2c10, 0x080c, 0x19aa, 0x0126, 0x2091, 0x8000, 0x080c, 0x8171, + 0x080c, 0x8769, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, + 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, + 0xcc10, 0xcc12, 0xcc24, 0xcc3e, 0xcc10, 0xcc10, 0xcc10, 0xcc10, + 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, + 0x080c, 0x0db4, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c, + 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, + 0x810c, 0x080c, 0x868e, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, + 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, + 0x6106, 0x080c, 0x810c, 0x080c, 0x868e, 0x00e0, 0x901e, 0x6316, + 0x631a, 0x2019, 0x0004, 0x080c, 0xd133, 0x00a0, 0x6014, 0x2048, + 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, + 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x19aa, 0x080c, 0x8171, + 0x080c, 0x8769, 0x0005, 0x080c, 0x8589, 0x6114, 0x81ff, 0x0158, + 0x0096, 0x2148, 0x080c, 0xd42c, 0x0036, 0x2019, 0x0029, 0x080c, + 0xd133, 0x003e, 0x009e, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, + 0x080c, 0x863e, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, + 0xd42c, 0x0036, 0x2019, 0x0029, 0x080c, 0xd133, 0x003e, 0x009e, + 0x080c, 0x9af8, 0x080c, 0x8769, 0x0005, 0x9182, 0x0085, 0x0002, + 0xcc8f, 0xcc8d, 0xcc8d, 0xcc9b, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, + 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0x080c, 0x0db4, 0x6003, + 0x000b, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c, + 0x868e, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd37f, 0x0118, + 0x080c, 0x9ac8, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, + 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, + 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0x9de8, 0x7220, 0x080c, + 0xcfd9, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, + 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, + 0x810c, 0x080c, 0x868e, 0x080c, 0x8769, 0x00ee, 0x002e, 0x0005, + 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db4, + 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085, 0x00a2, 0x9186, + 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9b5d, 0x0050, + 0x2001, 0x0007, 0x080c, 0x5f6e, 0x080c, 0x8589, 0x080c, 0x9af8, + 0x080c, 0x868e, 0x0005, 0xcd00, 0xcd02, 0xcd02, 0xcd00, 0xcd00, + 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, + 0x080c, 0x0db4, 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, + 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0db4, 0x9182, 0x0092, 0x1a0c, + 0x0db4, 0x9182, 0x0085, 0x0002, 0xcd21, 0xcd21, 0xcd21, 0xcd23, + 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, + 0xcd21, 0x080c, 0x0db4, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, + 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9b5d, 0x0030, + 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0x0036, + 0x080c, 0xd3e0, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, + 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, + 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x9450, 0x009e, + 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x94fb, 0x007e, 0x1520, + 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, + 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd3e0, 0x080c, 0xbe9e, + 0x080c, 0x185b, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb793, + 0x0110, 0x080c, 0xd133, 0x009e, 0x6017, 0x0000, 0x080c, 0xd3e0, + 0x6023, 0x0007, 0x080c, 0xbe9e, 0x003e, 0x012e, 0x0005, 0x00f6, + 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, + 0x080c, 0x250b, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5ff1, 0x1580, + 0x001e, 0x00c6, 0x2160, 0x080c, 0xbe9b, 0x00ce, 0x002e, 0x0026, + 0x0016, 0x2019, 0x0029, 0x080c, 0x95bc, 0x080c, 0x828c, 0x0076, + 0x903e, 0x080c, 0x8184, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, + 0xcef9, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, + 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x2f38, + 0x002e, 0x001e, 0x080c, 0x5aae, 0xbe12, 0xbd16, 0x9006, 0x0010, + 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, + 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1823, 0x2104, 0x9086, + 0x0074, 0x1904, 0xce21, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, + 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xce1e, 0x2001, 0x194d, + 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x0118, + 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, + 0xd494, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, + 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, + 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, + 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, + 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, + 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, + 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, + 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, + 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, + 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, + 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x6000, 0x0804, + 0xce88, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, + 0x000a, 0x080c, 0xaaa3, 0x009e, 0x15a0, 0x2011, 0x027a, 0x20a9, + 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xaaa3, 0x009e, + 0x1540, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1854, + 0x210c, 0x0038, 0x2009, 0x0029, 0x080c, 0xd188, 0xb800, 0xc0e5, + 0xb802, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000, + 0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x2001, 0x0007, + 0x080c, 0x5f6e, 0x2001, 0x0007, 0x080c, 0x5f42, 0x001e, 0x004e, + 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, + 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, 0x6017, 0x0000, + 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, + 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, 0x080c, 0x250b, + 0x11d0, 0x080c, 0x5ff1, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, + 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x009e, 0x1158, + 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, + 0x080c, 0xaaa3, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, + 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, + 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x11d0, + 0x080c, 0x5ff1, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x009e, 0x1158, 0x2011, + 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, + 0xaaa3, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, + 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, + 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x19bf, 0x252c, + 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7650, + 0x7070, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1a77, 0x000e, 0x0128, + 0x8001, 0x9602, 0x1a04, 0xcf92, 0x0018, 0x9606, 0x0904, 0xcf92, + 0x2100, 0x9c06, 0x0904, 0xcf89, 0x080c, 0xd1c4, 0x1904, 0xcf89, + 0x080c, 0xd4b1, 0x0904, 0xcf89, 0x080c, 0xd1b4, 0x0904, 0xcf89, + 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x2fcf, 0x0904, 0xcfad, + 0x6004, 0x9086, 0x0000, 0x1904, 0xcfad, 0x9786, 0x0004, 0x0904, + 0xcfad, 0x9786, 0x0007, 0x0904, 0xcf89, 0x2500, 0x9c06, 0x0904, + 0xcf89, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, + 0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, + 0x185b, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xb992, 0x1130, + 0x080c, 0xa456, 0x009e, 0x080c, 0x9af8, 0x0418, 0x6014, 0x2048, + 0x080c, 0xb793, 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, + 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, + 0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0xd42c, 0x0016, 0x080c, + 0xba7b, 0x080c, 0x65e5, 0x001e, 0x080c, 0xb975, 0x009e, 0x080c, + 0x9af8, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, + 0x0804, 0xcf0d, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, + 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, + 0x0005, 0x0128, 0x080c, 0xd42c, 0x080c, 0xd133, 0x08f8, 0x009e, + 0x0c00, 0x9786, 0x000a, 0x0920, 0x0808, 0x81ff, 0x09d0, 0x9180, + 0x0001, 0x2004, 0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, + 0x9086, 0x002d, 0x1970, 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, + 0xb981, 0x0130, 0x080c, 0xb992, 0x1920, 0x080c, 0xa456, 0x0038, + 0x080c, 0x2ea4, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456, 0x080c, + 0x9af8, 0x0804, 0xcf89, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, + 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, + 0xd15a, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, + 0x00ce, 0x0005, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0xcff8, + 0xcffa, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0x9af8, 0x9af8, 0xcff8, + 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, + 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xd188, 0x001e, + 0x004e, 0x2019, 0x0002, 0x080c, 0xcd45, 0x003e, 0x9085, 0x0001, + 0x0005, 0x0096, 0x080c, 0xb793, 0x0140, 0x6014, 0x904d, 0x080c, + 0xb3e0, 0x687b, 0x0005, 0x080c, 0x65f2, 0x009e, 0x080c, 0x9af8, + 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x5f2e, 0x0156, + 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, + 0x0276, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, + 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, + 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, + 0x8fff, 0x0904, 0xd093, 0x2071, 0x1800, 0x7650, 0x7070, 0x8001, + 0x9602, 0x1a04, 0xd093, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, + 0x2078, 0x080c, 0xd1b4, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, + 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, + 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, + 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd3e0, 0x080c, 0xbe9e, + 0x080c, 0x185b, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb793, + 0x0120, 0x0046, 0x080c, 0xd133, 0x004e, 0x009e, 0x080c, 0x9af8, + 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, + 0x1210, 0x0804, 0xd048, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, + 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, + 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, + 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0x9450, + 0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x080c, 0xd039, 0x005e, + 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, + 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, + 0x080c, 0x5ff1, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, + 0x0001, 0x0096, 0x904e, 0x080c, 0x9450, 0x009e, 0x008e, 0x903e, + 0x080c, 0x94fb, 0x080c, 0xd039, 0x005e, 0x003e, 0x001e, 0x8108, + 0x1f04, 0xd0c6, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, + 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, + 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x9450, + 0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x2c20, 0x080c, 0xd039, + 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, + 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, + 0x080c, 0x5ff1, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, + 0x0001, 0x080c, 0xd3c4, 0x004e, 0x0096, 0x904e, 0x080c, 0x9450, + 0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x080c, 0xd039, 0x003e, + 0x001e, 0x8108, 0x1f04, 0xd10e, 0x015e, 0x00ce, 0x007e, 0x005e, + 0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xb791, 0x0198, + 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, + 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x65f2, 0x2f48, 0x0cb0, + 0xab82, 0x080c, 0x65f2, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, + 0x0130, 0xa803, 0x0000, 0x080c, 0x65f2, 0x2f48, 0x0cb8, 0x080c, + 0x65f2, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, + 0x1138, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, + 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, + 0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, + 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, + 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, + 0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c, 0x0db4, 0xa867, + 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xb781, 0x2001, 0x0000, + 0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, + 0xac76, 0xa87f, 0x0000, 0x2001, 0x195d, 0x2004, 0xa882, 0x9006, + 0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x65f2, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, + 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, + 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, + 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, + 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, + 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, + 0x000b, 0x6023, 0x0005, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c, + 0x810c, 0x080c, 0x868e, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, + 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xbabf, 0x0030, + 0x080c, 0xd3e0, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x0005, 0x9280, + 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd213, 0xd213, 0xd213, + 0xd215, 0xd213, 0xd215, 0xd215, 0xd213, 0xd215, 0xd213, 0xd213, + 0xd213, 0xd213, 0xd213, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, + 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd22c, 0xd22c, + 0xd22c, 0xd22c, 0xd22c, 0xd22c, 0xd239, 0xd22c, 0xd22c, 0xd22c, + 0xd22c, 0xd22c, 0xd22c, 0xd22c, 0x6007, 0x003b, 0x602f, 0x0009, + 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, + 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xd3e0, 0x6043, 0x0000, + 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, + 0x2268, 0x9186, 0x0007, 0x1904, 0xd292, 0x6814, 0x9005, 0x0138, + 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, + 0x003a, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, 0x00c6, + 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xd309, 0x6014, 0x9005, + 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0db4, 0x0804, 0xd309, + 0x2048, 0x080c, 0xb793, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, + 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, + 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, + 0x2009, 0x0043, 0x080c, 0xcb9e, 0x0804, 0xd309, 0x2009, 0x0041, + 0x0804, 0xd303, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, + 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xd22c, 0xd0b4, 0x0128, + 0xd0fc, 0x090c, 0x0db4, 0x0804, 0xd24d, 0x6007, 0x003a, 0x6003, + 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, 0x00c6, 0x2d60, 0x6100, + 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd309, 0x6814, + 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, + 0xa982, 0x00f6, 0x2c78, 0x080c, 0x15ad, 0x00fe, 0x2009, 0x0042, + 0x04d0, 0x0036, 0x080c, 0x0fec, 0x090c, 0x0db4, 0xa867, 0x010d, + 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, + 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, + 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, + 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, + 0x080c, 0x65f2, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcd45, + 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, + 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, + 0xcb9e, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, + 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, + 0x080c, 0x8589, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, + 0x080c, 0xd133, 0x009e, 0x003e, 0x080c, 0x868e, 0x0005, 0x9186, + 0x0014, 0x0d70, 0x080c, 0x9b5d, 0x0005, 0xd33c, 0xd33a, 0xd33a, + 0xd33a, 0xd33a, 0xd33a, 0xd33c, 0xd33a, 0xd33a, 0xd33a, 0xd33a, + 0xd33a, 0xd33a, 0x080c, 0x0db4, 0x080c, 0x8589, 0x6003, 0x000c, + 0x080c, 0x868e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, + 0x0208, 0x001a, 0x080c, 0x9b5d, 0x0005, 0xd35a, 0xd35a, 0xd35a, + 0xd35a, 0xd35c, 0xd37c, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a, + 0xd35a, 0xd35a, 0x080c, 0x0db4, 0x00d6, 0x2c68, 0x080c, 0x9a72, + 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, + 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, + 0x6112, 0x6023, 0x0004, 0x080c, 0x810c, 0x080c, 0x868e, 0x2d60, + 0x080c, 0x9ac8, 0x00de, 0x0005, 0x080c, 0x9ac8, 0x0005, 0x00e6, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, + 0x2009, 0x1873, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, + 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1957, 0x2004, 0x6042, + 0x2009, 0x1873, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873, + 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, + 0x2001, 0x1957, 0x200c, 0x2001, 0x1955, 0x2004, 0x9100, 0x9080, + 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, + 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, + 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, + 0xb8ac, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, + 0x1138, 0x600c, 0x2072, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x0010, + 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, + 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, + 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, + 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182b, 0x2204, 0x9084, + 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, + 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, + 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xaaa3, + 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, + 0x2048, 0x2019, 0x0006, 0x080c, 0xaaa3, 0x009e, 0x1100, 0x015e, + 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27, + 0x080c, 0x2c63, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, + 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, + 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, + 0x19bf, 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, + 0x1800, 0x7650, 0x7070, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, + 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, + 0x9c06, 0x01d0, 0x080c, 0xd1b4, 0x01b8, 0x080c, 0xd1c4, 0x11a0, + 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x185b, 0x001e, + 0x080c, 0xb981, 0x1110, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x1110, + 0x080c, 0xa456, 0x080c, 0x9af8, 0x9ce0, 0x0018, 0x2001, 0x1819, + 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, + 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, + 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, + 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xbe86, + 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, + 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4856, 0x004e, 0x003e, + 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x95bc, 0x080c, + 0x9af8, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, + 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, + 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, + 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, + 0x908e, 0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee, + 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, + 0x2071, 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, + 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, + 0x00e6, 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, + 0x1844, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, + 0x8000, 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, + 0x012e, 0x0005, 0x0003, 0x000b, 0x04a6, 0x0000, 0xc000, 0x0001, + 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, + 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b, + 0x798e, 0x0003, 0x50db, 0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009, + 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, 0x0003, + 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, + 0x1627, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007, + 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821, 0x0003, + 0x4022, 0x0000, 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, 0x0002, + 0x0e4f, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x122d, 0x000b, + 0x0ca0, 0x0001, 0x122d, 0x000b, 0x9180, 0x0001, 0x0004, 0x0000, + 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, + 0x0009, 0x0008, 0x4430, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, + 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, + 0x0411, 0x0000, 0x4438, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, + 0x0e2a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, + 0x0e2a, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, + 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, 0x0000, + 0x4447, 0x000b, 0x0240, 0x0002, 0x0a27, 0x000b, 0x00fe, 0x0000, + 0x322a, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008, + 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, 0x0000, + 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, 0x0000, + 0x0011, 0x0008, 0x4458, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, + 0x0e1d, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e1d, 0x0003, + 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008, + 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, + 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x446a, 0x000b, + 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, 0x0008, + 0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, + 0x4473, 0x0003, 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, + 0x087a, 0x000b, 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, + 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, + 0x300a, 0x000b, 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe, 0x0000, + 0x348a, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, + 0x8066, 0x0000, 0x0231, 0x0008, 0x4489, 0x0003, 0x03fe, 0x0000, + 0x04d0, 0x0001, 0x0cb0, 0x0003, 0x82c0, 0x0001, 0x1f00, 0x0000, + 0xffa0, 0x0001, 0x0400, 0x0000, 0x089f, 0x0003, 0x14b0, 0x0003, + 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008, + 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f, 0x0003, + 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0, 0x000b, + 0x00fe, 0x0000, 0x34a6, 0x0003, 0x8072, 0x0000, 0x1010, 0x0008, + 0x3944, 0x0002, 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072, 0x0000, + 0x2020, 0x0008, 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946, 0x000a, + 0x0cb7, 0x000b, 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7, 0x0003, + 0x00aa, 0x000b, 0x00fe, 0x0000, 0x34b5, 0x000b, 0x8072, 0x0000, + 0x1000, 0x0000, 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000, 0x0000, + 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, + 0x0231, 0x0008, 0x44bc, 0x0003, 0x58bd, 0x0003, 0x0140, 0x0008, + 0x0242, 0x0000, 0x1f43, 0x0002, 0x0ccb, 0x0003, 0x0d44, 0x0000, + 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, 0x0008, + 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf, 0x000b, + 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, + 0x58cf, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6, 0x000b, + 0x8000, 0x0000, 0x0001, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008, + 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, + 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, 0x0008, + 0x58df, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, + 0x092d, 0x000b, 0x3a45, 0x000a, 0x091c, 0x0003, 0x8072, 0x0000, + 0x1000, 0x0000, 0x3945, 0x000a, 0x08ec, 0x000b, 0x8072, 0x0000, + 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0917, 0x000b, + 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, + 0x8066, 0x0000, 0x0009, 0x0008, 0x44f5, 0x000b, 0x00fe, 0x0000, + 0x3514, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, + 0x8066, 0x0000, 0x0009, 0x0008, 0x44fd, 0x0003, 0x00fe, 0x0000, + 0x3204, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, + 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4506, 0x0003, + 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, + 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, + 0x0009, 0x0008, 0x4510, 0x000b, 0x003a, 0x0008, 0x1dfe, 0x0000, + 0x00f1, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x012d, 0x0003, + 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000, + 0x012d, 0x0003, 0x3a44, 0x0002, 0x0a30, 0x000b, 0x8074, 0x0000, + 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, + 0x2d0e, 0x0000, 0x3601, 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, + 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d3f, 0x0003, + 0x8074, 0x0000, 0x4040, 0x0008, 0x592d, 0x000b, 0x50db, 0x000b, + 0x3a46, 0x000a, 0x0d3f, 0x0003, 0x3a47, 0x0002, 0x093a, 0x000b, + 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, + 0x8072, 0x0000, 0x3000, 0x0008, 0x0182, 0x0003, 0x92c0, 0x0009, + 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0dfb, 0x000b, + 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, + 0x362a, 0x0000, 0x4544, 0x0003, 0x2000, 0x0000, 0x2000, 0x0000, + 0x2102, 0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, + 0x2306, 0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, + 0x250a, 0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, + 0x270e, 0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, + 0x2912, 0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, + 0x0007, 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x455e, 0x000b, + 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e17, 0x0003, 0x124b, 0x0002, + 0x0967, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a01, 0x0003, + 0x3a46, 0x000a, 0x0d74, 0x0003, 0x5969, 0x000b, 0x8054, 0x0008, + 0x0004, 0x0000, 0x1243, 0x000a, 0x097e, 0x000b, 0x8010, 0x0008, + 0x000d, 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, + 0x017e, 0x0003, 0x194d, 0x000a, 0x0978, 0x000b, 0x1243, 0x000a, + 0x0a0b, 0x0003, 0x5978, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, + 0x01e4, 0x000c, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, + 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, + 0x3a42, 0x0002, 0x0d88, 0x0003, 0x15fe, 0x0008, 0x3451, 0x000b, + 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, 0x0008, + 0x000c, 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0xbbe0, 0x0009, + 0x0030, 0x0008, 0x0d9e, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, + 0x099b, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x099b, 0x0003, + 0x01df, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x01dc, 0x000b, + 0x8076, 0x0008, 0x0041, 0x0008, 0x01dc, 0x000b, 0xbbe0, 0x0009, + 0x0032, 0x0000, 0x0da3, 0x0003, 0x3c1e, 0x0008, 0x01dc, 0x000b, + 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0dc1, 0x000b, 0x18fe, 0x0000, + 0x3ce0, 0x0009, 0x0d9b, 0x000b, 0x8076, 0x0008, 0x0040, 0x0000, + 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604, 0x0008, + 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808, 0x0000, + 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066, 0x0000, + 0x0422, 0x0000, 0x45b8, 0x0003, 0x01e4, 0x000c, 0x8054, 0x0008, + 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, + 0xb000, 0x0000, 0x0182, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, + 0x0dd3, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09d0, 0x0003, + 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d97, 0x000b, 0x01df, 0x0004, + 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, + 0x0227, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01dc, 0x000b, + 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0ddc, 0x000b, 0x3a44, 0x0002, + 0x0c0c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, + 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, + 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, + 0x01e8, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, + 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, + 0x8066, 0x0000, 0x000a, 0x0008, 0x45ed, 0x0003, 0x4000, 0x000f, + 0x21ef, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, + 0x0090, 0x0008, 0x09f8, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000, + 0x01fa, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, + 0x8010, 0x0008, 0x0023, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, + 0x0008, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, 0x0022, 0x0008, + 0x0235, 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x0007, 0x0000, + 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x0241, 0x0003, + 0x01e4, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01ef, 0x0004, + 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, 0xf080, 0x0000, + 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b, + 0x8010, 0x0008, 0x0009, 0x0008, 0x0235, 0x0003, 0x8010, 0x0008, + 0x0005, 0x0008, 0x0235, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, + 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, 0x0003, + 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0235, 0x0003, + 0x8010, 0x0008, 0x0003, 0x0008, 0x0239, 0x0003, 0x8010, 0x0008, + 0x000b, 0x0000, 0x0239, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, + 0x0239, 0x0003, 0x3a47, 0x0002, 0x0d2d, 0x0003, 0x8010, 0x0008, + 0x0006, 0x0008, 0x0239, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, + 0x8072, 0x0000, 0x3000, 0x0008, 0x01ef, 0x0004, 0x01f2, 0x0004, + 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, + 0x01ef, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, + 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, + 0x2e4d, 0x0002, 0x0a4c, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000, + 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, + 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x022a, 0x000b, 0x15b6, 0xf4ac, + 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, + 0x9298 +}; +#ifdef UNIQUE_FW_NAME +unsigned short fw2300flx_length01 = 0xd1c9; +#else +unsigned short risc_code_length01 = 0xd1c9; +#endif + diff -Nru a/drivers/scsi/qla2xxx/ql6322.c b/drivers/scsi/qla2xxx/ql6322.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql6322.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,108 @@ +/* + * QLogic ISP6322 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation (www.qlogic.com) + * + * Released under GPL v2. + */ + +#include +#include +#include + +#include "qla_os.h" +#include "qla_def.h" + +static char qla_driver_name[] = "qla6322"; + +extern unsigned char fw2322flx_version[]; +extern unsigned char fw2322flx_version_str[]; +extern unsigned short fw2322flx_addr01; +extern unsigned short fw2322flx_code01[]; +extern unsigned short fw2322flx_length01; +extern unsigned long rseqflx_code_addr01; +extern unsigned short rseqflx_code01[]; +extern unsigned short rseqflx_code_length01; +extern unsigned long xseqflx_code_addr01; +extern unsigned short xseqflx_code01[]; +extern unsigned short xseqflx_code_length01; + +static struct qla_fw_info qla_fw_tbl[] = { + { + .addressing = FW_INFO_ADDR_NORMAL, + .fwcode = &fw2322flx_code01[0], + .fwlen = &fw2322flx_length01, + .fwstart = &fw2322flx_addr01, + }, + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = &rseqflx_code01[0], + .fwlen = &rseqflx_code_length01, + .lfwstart = &rseqflx_code_addr01, + }, + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = &xseqflx_code01[0], + .fwlen = &xseqflx_code_length01, + .lfwstart = &xseqflx_code_addr01, + }, + { FW_INFO_ADDR_NOMORE, }, +}; + +static struct qla_board_info qla_board_tbl[] = { + { + .drv_name = qla_driver_name, + .isp_name = "ISP6322", + .fw_info = qla_fw_tbl, + }, +}; + +static struct pci_device_id qla6322_pci_tbl[] = { + { + .vendor = PCI_VENDOR_ID_QLOGIC, + .device = PCI_DEVICE_ID_QLOGIC_ISP6322, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (unsigned long)&qla_board_tbl[0], + }, + {0, 0}, +}; +MODULE_DEVICE_TABLE(pci, qla6322_pci_tbl); + +static int __devinit +qla6322_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, + (struct qla_board_info *)id->driver_data); +} + +static void __devexit +qla6322_remove_one(struct pci_dev *pdev) +{ + qla2x00_remove_one(pdev); +} + +static struct pci_driver qla6322_pci_driver = { + .name = "qla6322", + .id_table = qla6322_pci_tbl, + .probe = qla6322_probe_one, + .remove = __devexit_p(qla6322_remove_one), +}; + +static int __init +qla6322_init(void) +{ + return pci_module_init(&qla6322_pci_driver); +} + +static void __exit +qla6322_exit(void) +{ + pci_unregister_driver(&qla6322_pci_driver); +} + +module_init(qla6322_init); +module_exit(qla6322_exit); + +MODULE_AUTHOR("QLogic Corporation"); +MODULE_DESCRIPTION("QLogic ISP6322 FC-SCSI Host Bus Adapter driver"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/qla2xxx/ql6322_fw.c b/drivers/scsi/qla2xxx/ql6322_fw.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/qla2xxx/ql6322_fw.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,7353 @@ +/************************************************************************** + * QLOGIC LINUX SOFTWARE + * + * QLogic ISP2x00 device driver for Linux 2.6.x + * Copyright (C) 2003 QLogic Corporation + * (www.qlogic.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + *************************************************************************/ + +/* + * Firmware Version 3.02.21 (16:27 Jan 19, 2004) + */ + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322flx_version = 3*1024+2; +#else +unsigned short risc_code_version = 3*1024+2; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned char fw2322flx_version_str[] = {3, 2,21}; +#else +unsigned char firmware_version[] = {3, 2,21}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2322flx_VERSION_STRING "3.02.21" +#else +#define FW_VERSION_STRING "3.02.21" +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322flx_addr01 = 0x0800 ; +#else +unsigned short risc_code_addr01 = 0x0800 ; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned short fw2322flx_code01[] = { +#else +unsigned short risc_code01[] = { +#endif + 0x0470, 0x0000, 0x0000, 0xcc67, 0x0000, 0x0003, 0x0002, 0x0015, + 0x0317, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, + 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, + 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, + 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, + 0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9, + 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, + 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, + 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, + 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, + 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, + 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, + 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, + 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78, + 0x7883, 0x0004, 0x2089, 0x289c, 0x2051, 0x1800, 0x2a70, 0x20e1, + 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e3d, 0x00f6, + 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x1ec7, 0x1170, + 0x2079, 0x0300, 0x080c, 0x1edd, 0x2061, 0xe000, 0x080c, 0x1ec7, + 0x1128, 0x2079, 0x0380, 0x080c, 0x1edd, 0x0060, 0x00fe, 0x7883, + 0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091, + 0x4080, 0x0cf8, 0x00fe, 0x2029, 0x26c0, 0x2031, 0xffff, 0x2039, + 0x269c, 0x2021, 0x0050, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, + 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, + 0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, + 0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756a, + 0x766e, 0x7766, 0x7472, 0x7476, 0x00e6, 0x2071, 0x1b1c, 0x2472, + 0x00ee, 0x20a1, 0x1ddc, 0x716c, 0x810d, 0x810d, 0x810d, 0x810d, + 0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104, + 0x8211, 0x1de0, 0x716c, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218, + 0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d, + 0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9, + 0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211, + 0x1dd8, 0x080c, 0x0f3b, 0x080c, 0x5bf0, 0x080c, 0x99fb, 0x080c, + 0x10f2, 0x080c, 0x12cd, 0x080c, 0x1a3a, 0x080c, 0x829d, 0x080c, + 0x0cf7, 0x080c, 0x1077, 0x080c, 0x3242, 0x080c, 0x7270, 0x080c, + 0x65cb, 0x080c, 0x7eec, 0x080c, 0x20a8, 0x080c, 0x78ea, 0x080c, + 0x1ef6, 0x080c, 0x2030, 0x080c, 0x209d, 0x2091, 0x3009, 0x7883, + 0x0000, 0x1004, 0x0941, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, + 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0935, 0x2091, + 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, + 0x11b5, 0x2071, 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, + 0x908e, 0x0003, 0x1158, 0x080c, 0x48c0, 0x080c, 0x3269, 0x080c, + 0x72d8, 0x080c, 0x6a73, 0x080c, 0x7f15, 0x0c78, 0x000b, 0x0c98, + 0x0962, 0x0963, 0x0afa, 0x0960, 0x0bab, 0x0cf6, 0x0cf6, 0x0cf6, + 0x080c, 0x0d65, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, + 0x9086, 0x0001, 0x1904, 0x0acd, 0x080c, 0x0e8d, 0x080c, 0x6f5c, + 0x0150, 0x080c, 0x6f7f, 0x15b0, 0x2079, 0x0100, 0x7828, 0x9085, + 0x1800, 0x782a, 0x0478, 0x080c, 0x6e8d, 0x7000, 0x9086, 0x0001, + 0x1904, 0x0acd, 0x7094, 0x9086, 0x0028, 0x1904, 0x0acd, 0x080c, + 0x7ee4, 0x080c, 0x7ed6, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, + 0x0100, 0x2011, 0xffff, 0x080c, 0x282b, 0x7a28, 0x9295, 0x5e2c, + 0x7a2a, 0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c, + 0x80bc, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x2011, 0x8030, 0x901e, + 0x7392, 0x04d0, 0x080c, 0x52f4, 0x2079, 0x0100, 0x7844, 0x9005, + 0x1904, 0x0acd, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x2011, 0x6dd2, + 0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c, 0x80bc, 0x2001, 0x0265, + 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, + 0x2001, 0x1975, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, + 0x080c, 0x5b98, 0x00ce, 0x0804, 0x0acd, 0x780f, 0x006b, 0x7a28, + 0x080c, 0x6f64, 0x0118, 0x9295, 0x5e2c, 0x0010, 0x9295, 0x402c, + 0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1976, 0x2003, 0x0001, + 0x080c, 0x270a, 0x080c, 0x47fb, 0x7244, 0xc284, 0x7246, 0x2001, + 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x2001, 0x0390, 0x2003, + 0x0400, 0x080c, 0x9746, 0x080c, 0x904b, 0x2011, 0x0004, 0x080c, + 0xb6d5, 0x080c, 0x9762, 0x080c, 0x6458, 0x080c, 0x6f5c, 0x1120, + 0x080c, 0x2758, 0x0600, 0x0420, 0x080c, 0x5b9f, 0x0140, 0x7093, + 0x0001, 0x70cf, 0x0000, 0x080c, 0x54c1, 0x0804, 0x0acd, 0x080c, + 0x529d, 0xd094, 0x01a8, 0x2001, 0x0390, 0x2003, 0x0404, 0x2011, + 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x52a1, 0xd0d4, 0x1118, + 0x080c, 0x2758, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, + 0x080c, 0x52a1, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, + 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x6555, + 0x0008, 0x2012, 0x080c, 0x651b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, + 0x00a8, 0x707b, 0x0000, 0x080c, 0x6f5c, 0x1130, 0x70ac, 0x9005, + 0x1168, 0x080c, 0xbb25, 0x0050, 0x080c, 0xbb25, 0x70d8, 0xd09c, + 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5b75, 0x70e3, 0x0000, + 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x2760, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6f5c, 0x1178, + 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e, + 0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019, + 0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108, + 0xc295, 0x72da, 0x080c, 0x6f5c, 0x0118, 0x9296, 0x0004, 0x0518, + 0x2011, 0x0001, 0x080c, 0xb6d5, 0x70a7, 0x0000, 0x70ab, 0xffff, + 0x7003, 0x0002, 0x00fe, 0x080c, 0x2d99, 0x080c, 0x9746, 0x2011, + 0x0005, 0x080c, 0x91a3, 0x080c, 0x9762, 0x080c, 0x6f5c, 0x0148, + 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, + 0x00ce, 0x012e, 0x00e0, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, + 0x0002, 0x080c, 0x9746, 0x2011, 0x0005, 0x080c, 0x91a3, 0x080c, + 0x9762, 0x080c, 0x6f5c, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, + 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, + 0x00c6, 0x00b6, 0x080c, 0x6f5c, 0x1118, 0x20a9, 0x0800, 0x0010, + 0x20a9, 0x0782, 0x080c, 0x6f5c, 0x1110, 0x900e, 0x0010, 0x2009, + 0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, + 0xb800, 0xd0bc, 0x090c, 0x30d1, 0x8108, 0x1f04, 0x0ae1, 0x707b, + 0x0000, 0x707c, 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, + 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, + 0x0002, 0x1904, 0x0ba8, 0x70a8, 0x9086, 0xffff, 0x0120, 0x080c, + 0x2d99, 0x0804, 0x0ba8, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0520, + 0xd084, 0x0510, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, + 0xd08c, 0x01d0, 0x70dc, 0x9086, 0xffff, 0x0190, 0x080c, 0x2f21, + 0x70d8, 0xd094, 0x1904, 0x0ba8, 0x2011, 0x0001, 0x080c, 0xbdd7, + 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2f5b, 0x0804, 0x0ba8, + 0x70e0, 0x9005, 0x1904, 0x0ba8, 0x70a4, 0x9005, 0x1904, 0x0ba8, + 0x70d8, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0ba8, 0x080c, 0x651b, + 0x1904, 0x0ba8, 0x080c, 0x656e, 0x1904, 0x0ba8, 0x080c, 0x6555, + 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, + 0x6166, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, + 0x0b4e, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, + 0x0ba8, 0x0006, 0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011, + 0x1982, 0x080c, 0x0fab, 0x2011, 0x199c, 0x080c, 0x0fab, 0x7030, + 0xc08c, 0x7032, 0x7003, 0x0003, 0x70ab, 0xffff, 0x080c, 0x0e61, + 0x9006, 0x080c, 0x2394, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, + 0x0006, 0x080c, 0x4998, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, + 0x080c, 0x6f7f, 0x0150, 0x080c, 0x6f5c, 0x7828, 0x0118, 0x9084, + 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0x9746, + 0x2001, 0x19b7, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, + 0x080c, 0x91a3, 0x2011, 0x0000, 0x080c, 0x91ad, 0x080c, 0x9762, + 0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126, + 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, + 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x7940, 0x918c, 0x0010, 0x7942, + 0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x282b, 0xd19c, + 0x0120, 0x2011, 0x0008, 0x080c, 0x282b, 0x0006, 0x0036, 0x0156, + 0x0000, 0x2001, 0x1976, 0x2004, 0x9005, 0x1518, 0x080c, 0x27bf, + 0x1148, 0x2001, 0x0001, 0x080c, 0x2739, 0x2001, 0x0001, 0x080c, + 0x271c, 0x00b8, 0x080c, 0x27c7, 0x1138, 0x9006, 0x080c, 0x2739, + 0x9006, 0x080c, 0x271c, 0x0068, 0x080c, 0x27cf, 0x1d50, 0x2001, + 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2533, 0x0804, + 0x0ca9, 0x080c, 0x284e, 0x080c, 0x2892, 0x20a9, 0x003a, 0x1d04, + 0x0bff, 0x080c, 0x809c, 0x1f04, 0x0bff, 0x080c, 0x6f6d, 0x0148, + 0x080c, 0x6f7f, 0x1118, 0x080c, 0x726b, 0x0050, 0x080c, 0x6f64, + 0x0dd0, 0x080c, 0x7266, 0x080c, 0x725c, 0x080c, 0x6e8d, 0x0020, + 0x2009, 0x00f8, 0x080c, 0x5b5e, 0x7850, 0xc0e5, 0x7852, 0x080c, + 0x6f5c, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, + 0x2019, 0xea60, 0x0d0c, 0x809c, 0x7820, 0xd09c, 0x15a0, 0x080c, + 0x6f5c, 0x0904, 0x0c8b, 0x7824, 0xd0ac, 0x1904, 0x0cae, 0x080c, + 0x6f7f, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, + 0x2011, 0x1800, 0x080c, 0x282b, 0x080c, 0x27d7, 0x7824, 0x9084, + 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, + 0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x8421, 0x1160, 0x1d04, + 0x0c5b, 0x080c, 0x809c, 0x080c, 0x7266, 0x080c, 0x725c, 0x7003, + 0x0001, 0x0804, 0x0cae, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004, + 0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x1d04, 0x0c71, 0x080c, + 0x809c, 0x2009, 0x196a, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, + 0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x282b, 0x20a9, + 0x0002, 0x080c, 0x27b8, 0x7924, 0x080c, 0x27d7, 0xd19c, 0x0110, + 0x080c, 0x270a, 0x00f0, 0x080c, 0x6f6d, 0x1140, 0x94a2, 0x03e8, + 0x1128, 0x080c, 0x6f30, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800, + 0x080c, 0x282b, 0x080c, 0x27d7, 0x7824, 0x080c, 0x6f76, 0x0110, + 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c63, 0x7003, 0x0001, + 0x0028, 0x2001, 0x0001, 0x080c, 0x2394, 0x00a0, 0x7850, 0xc0e4, + 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, + 0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x282b, 0x7828, 0x9085, + 0x0028, 0x782a, 0x2001, 0x1976, 0x2003, 0x0000, 0x9006, 0x78f2, + 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e, + 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6, + 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x809c, 0x015e, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086, + 0x0001, 0x1110, 0x080c, 0x3269, 0x00ee, 0x0005, 0x0005, 0x2a70, + 0x2061, 0x197a, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015, + 0x600f, 0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001, + 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, + 0x715a, 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbb25, 0x70eb, + 0x00c0, 0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, + 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, + 0x07d0, 0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, + 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, + 0x1958, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, + 0x2020, 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x6166, + 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, + 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, + 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, + 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, + 0x0d67, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, + 0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, + 0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, + 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1af2, 0x7a08, + 0x226a, 0x2069, 0x1af3, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, + 0x782c, 0x2019, 0x1b00, 0x201a, 0x2019, 0x1b03, 0x9016, 0x7808, + 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b1c, + 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, + 0x1b01, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, + 0x1a48, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, + 0x8318, 0x1f04, 0x0db4, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e, + 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x0180, 0x2001, 0x19f1, 0x2004, 0x9005, 0x0128, + 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, + 0x0002, 0x2003, 0x1001, 0x080c, 0x52ac, 0x1170, 0x080c, 0x0efb, + 0x0110, 0x080c, 0x0e4e, 0x080c, 0x52ac, 0x1130, 0x2071, 0x1800, + 0x2011, 0x8000, 0x080c, 0x0f0f, 0x0c70, 0x0005, 0x2001, 0x0382, + 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015, + 0x080c, 0x9737, 0x2079, 0x0380, 0x2069, 0x1ad2, 0x7818, 0x6802, + 0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812, + 0x2019, 0x1add, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a, + 0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead, + 0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c, + 0x6826, 0x7803, 0x0000, 0x2069, 0x1a92, 0x901e, 0x20a9, 0x0020, + 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e28, 0x2069, + 0x1ab2, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, + 0x8d68, 0x8318, 0x1f04, 0x0e35, 0x0005, 0x918c, 0x03ff, 0x2001, + 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, + 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, + 0x2011, 0x0080, 0x080c, 0x0eed, 0x20a9, 0x0900, 0x080c, 0x0f23, + 0x2011, 0x0040, 0x080c, 0x0eed, 0x20a9, 0x0900, 0x080c, 0x0f23, + 0x0c78, 0x0026, 0x080c, 0x0efb, 0x1188, 0x2011, 0x010e, 0x2214, + 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0x0947, 0x0010, + 0x2011, 0x1b47, 0x080c, 0x0f0f, 0x002e, 0x0005, 0x2011, 0x010e, + 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, + 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70ef, 0x0000, 0x1128, 0x70ef, + 0x0fa0, 0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x080c, 0x0efb, + 0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, + 0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, 0x080c, + 0x0efb, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f0f, 0x002e, 0x0005, + 0x080c, 0x27cf, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, + 0x080c, 0x0f00, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071, + 0x1800, 0xd0b4, 0x70e8, 0x71e4, 0x1118, 0xc0e4, 0xc1f4, 0x0050, + 0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70ef, 0x0000, + 0xc0e5, 0xc1f5, 0x0099, 0x000e, 0x001e, 0x00ee, 0x0005, 0x00e6, + 0x2071, 0x1800, 0xd0e4, 0x70e8, 0x1110, 0xc0dc, 0x0008, 0xc0dd, + 0x0016, 0x71e4, 0x0019, 0x001e, 0x00ee, 0x0005, 0x70ea, 0x71e6, + 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0eb3, 0x0e8d, 0x0e8d, + 0x0e61, 0x0e9c, 0x0e8d, 0x0e8d, 0x0e9c, 0xc284, 0x0016, 0x3b08, + 0x3a00, 0x9104, 0x918d, 0x00c1, 0x21d8, 0x9084, 0xff3e, 0x9205, + 0x20d0, 0x001e, 0x0005, 0x2001, 0x183a, 0x2004, 0xd0dc, 0x0005, + 0x9e86, 0x1800, 0x190c, 0x0d65, 0x70e8, 0xd0e4, 0x0108, 0xc2e5, + 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c1, 0x08f9, 0x0005, 0x9e86, + 0x1800, 0x190c, 0x0d65, 0x70e4, 0xd0f4, 0x0108, 0xc2f5, 0x72e6, + 0xd0f4, 0x1140, 0x9284, 0x8000, 0x8005, 0xc284, 0x9215, 0x9294, + 0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f23, 0x2091, 0x6000, 0x1f04, + 0x0f23, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, + 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, + 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, + 0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, + 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, + 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, + 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, + 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a, 0x000e, + 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, + 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, + 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, + 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, + 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, + 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, + 0x0f2a, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, + 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, + 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0, + 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, + 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, + 0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001, + 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d45, 0x2001, 0x0000, + 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, + 0xa807, 0x0000, 0x0006, 0x080c, 0x1055, 0x009e, 0x0cb0, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x080c, 0x10ce, 0x090c, 0x0d65, 0x00ee, + 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, + 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045, + 0x0158, 0x8210, 0x9906, 0x090c, 0x0d65, 0x2300, 0x9202, 0x0120, + 0x1a0c, 0x0d65, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, + 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, + 0x0128, 0x9906, 0x090c, 0x0d65, 0xa000, 0x0cc8, 0x012e, 0x000e, + 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, + 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, 0x9085, + 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, + 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, + 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, 0x70be, + 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, + 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, + 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, + 0x8000, 0x70be, 0x080c, 0x7ed6, 0x012e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, + 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, + 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883, + 0x7000, 0x9005, 0x11a0, 0x2001, 0x049b, 0xa802, 0x2048, 0x2009, + 0x26c0, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, + 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, + 0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, + 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, + 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, + 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, + 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0016, + 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, + 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x049b, 0x0288, 0x9982, + 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883, + 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, + 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19f0, 0x7007, 0x0000, 0x9006, + 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, + 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, + 0x0000, 0x2071, 0x19f0, 0x701c, 0x9088, 0x19fa, 0x280a, 0x8000, + 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d65, 0x7004, + 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, + 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x19f0, + 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, + 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, + 0x0006, 0x7000, 0x0002, 0x1145, 0x1143, 0x1143, 0x1143, 0x12bc, + 0x12bc, 0x12bc, 0x12bc, 0x080c, 0x0d65, 0x701c, 0x7120, 0x9106, + 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, + 0x0000, 0x0005, 0x0096, 0x9180, 0x19fa, 0x2004, 0x700a, 0x2048, + 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, + 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, 0x700e, + 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, 0x0120, + 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, + 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, + 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020, + 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136, + 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, + 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, + 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, + 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e, + 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19f0, 0x2104, + 0xc095, 0x200a, 0x080c, 0x1122, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x19f0, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0d5e, + 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, + 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1133, 0x11db, 0x120f, 0x0d65, + 0x0d65, 0x12c8, 0x0d65, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, + 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, + 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, + 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, + 0x7804, 0x7806, 0x080c, 0x1178, 0x0005, 0x7008, 0x0096, 0x2048, + 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1133, 0x0005, + 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, + 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, + 0x7806, 0x080c, 0x118d, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, + 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, + 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, + 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, + 0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, + 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, + 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, + 0x00de, 0x009e, 0x080c, 0x1122, 0x0005, 0x00de, 0x009e, 0x080c, + 0x1122, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, + 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, + 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6833, 0xa09f, 0x0000, + 0xa0a3, 0x0000, 0x2848, 0x080c, 0x1055, 0x009e, 0x0005, 0x00a6, + 0xa0a0, 0x904d, 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0128, + 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, + 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, + 0xa07a, 0x2810, 0x080c, 0x1103, 0x00e8, 0xa97c, 0xa894, 0x0016, + 0x0006, 0x080c, 0x6833, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, + 0x0128, 0x00c6, 0x2060, 0x080c, 0x9a65, 0x00ce, 0x7008, 0x2048, + 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1055, 0x7007, 0x0000, + 0x080c, 0x1122, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, + 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, + 0x7007, 0x0000, 0x080c, 0x1133, 0x0005, 0x0126, 0x2091, 0x2200, + 0x2079, 0x0300, 0x2071, 0x1a3a, 0x7003, 0x0000, 0x78bf, 0x00f6, + 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, + 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165, 0x2003, 0x4198, + 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a3b, 0x2003, + 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, + 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, + 0x782b, 0x1a48, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001, 0x0200, + 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a48, 0x602f, + 0x1ddc, 0x2001, 0x1819, 0x2004, 0x9082, 0x1ddc, 0x6032, 0x603b, + 0x1cca, 0x602b, 0x1a88, 0x6007, 0x1a68, 0x2061, 0x1a68, 0x00ce, + 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, + 0x0d5e, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540, 0x2060, + 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004, 0x1530, + 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c, 0x6655, + 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0, + 0x9005, 0x190c, 0x6291, 0x00be, 0x6044, 0xd0fc, 0x190c, 0x976f, + 0x080c, 0x9a8d, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005, 0x908a, + 0x0024, 0x1a0c, 0x0d65, 0x002b, 0x012e, 0x0005, 0x04b0, 0x012e, + 0x0005, 0x1385, 0x13ab, 0x13db, 0x13e0, 0x13e4, 0x13e9, 0x1411, + 0x1415, 0x1423, 0x1427, 0x1385, 0x14b1, 0x14b5, 0x1518, 0x1385, + 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, + 0x1385, 0x1385, 0x1385, 0x1385, 0x13eb, 0x1385, 0x13b3, 0x13d8, + 0x139f, 0x1385, 0x13bf, 0x1389, 0x1387, 0x080c, 0x0d65, 0x080c, + 0x0d5e, 0x080c, 0x151f, 0x2009, 0x1a47, 0x2104, 0x8000, 0x200a, + 0x080c, 0x799d, 0x080c, 0x193f, 0x0005, 0x6044, 0xd0fc, 0x190c, + 0x976f, 0x2009, 0x0055, 0x080c, 0x9b03, 0x012e, 0x0005, 0x080c, + 0x151f, 0x2060, 0x6044, 0xd0fc, 0x190c, 0x976f, 0x2009, 0x0055, + 0x080c, 0x9b03, 0x0005, 0x2009, 0x0048, 0x080c, 0x151f, 0x2060, + 0x080c, 0x9b03, 0x0005, 0x2009, 0x0054, 0x080c, 0x151f, 0x2060, + 0x6044, 0xd0fc, 0x190c, 0x976f, 0x080c, 0x9b03, 0x0005, 0x080c, + 0x151f, 0x2060, 0x0056, 0x0066, 0x080c, 0x151f, 0x2028, 0x080c, + 0x151f, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418, 0x2009, + 0x0056, 0x080c, 0x9b03, 0x004e, 0x003e, 0x006e, 0x005e, 0x0005, + 0x080c, 0x151f, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, + 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x151f, 0x080c, 0x15dc, + 0x0005, 0x080c, 0x0d65, 0x080c, 0x151f, 0x2060, 0x6014, 0x0096, + 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x9b03, + 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, + 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, + 0xd0ec, 0x1110, 0x080c, 0x1524, 0x2001, 0x0307, 0x2003, 0x8000, + 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x151f, 0x2060, + 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, + 0x080c, 0x9b03, 0x0005, 0x080c, 0x151f, 0x080c, 0x0d65, 0x080c, + 0x151f, 0x080c, 0x149c, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, + 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, + 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, + 0x1180, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, + 0x090c, 0x0d65, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, + 0x0480, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x14b5, 0x0005, + 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d65, 0x6014, 0x2048, + 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x799d, 0x080c, + 0x193f, 0x080c, 0xb6c5, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, + 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, + 0xbaba, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, + 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd3ff, 0xd5a4, 0x1118, 0x080c, + 0x1524, 0x0005, 0x080c, 0x799d, 0x080c, 0x193f, 0x0005, 0x781f, + 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, + 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, + 0x2001, 0x0016, 0x080c, 0x1595, 0x00fe, 0x007e, 0x006e, 0x001e, + 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, + 0x190c, 0x0d65, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, + 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x1524, + 0x0005, 0x81ff, 0x190c, 0x0d65, 0x0005, 0xc184, 0xd1b4, 0xc1b4, + 0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c, 0x15d0, + 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, + 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, 0x601c, + 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x1646, 0x00fe, 0x00a8, + 0x00f6, 0x2c78, 0x080c, 0x1783, 0x00fe, 0x2009, 0x01f4, 0x8109, + 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, + 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, + 0x0020, 0x080c, 0x12e1, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, + 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, + 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x9b03, 0x0005, 0x7808, + 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x149c, 0x00d6, 0x2069, + 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, 0x0dd8, + 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, 0x79b8, + 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, 0x0007, + 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x1587, 0x6827, + 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, + 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, + 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x799d, 0x080c, 0x193f, + 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, 0x782b, + 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, + 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, + 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, + 0x0001, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, + 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, + 0x0021, 0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, + 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, + 0x1321, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, + 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, 0x0005, + 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65, 0x2009, + 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x9085, + 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0c79, + 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65, + 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, + 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, + 0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x163b, + 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x163b, + 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, + 0x0039, 0x1904, 0x163b, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, + 0x080c, 0x7905, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, + 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, + 0xba95, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4, 0x1170, + 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1cea, + 0x1190, 0x080c, 0x17d2, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, + 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, + 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, + 0x00ee, 0x080c, 0x1524, 0x0005, 0x080c, 0x0d65, 0x0016, 0x2009, + 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2cf0, + 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, + 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1cca, + 0x2165, 0x0002, 0x1679, 0x16c6, 0x1679, 0x1679, 0x1679, 0x16a8, + 0x1679, 0x167d, 0x1672, 0x16bd, 0x1679, 0x1679, 0x1679, 0x1781, + 0x1691, 0x1687, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, + 0x16bd, 0x9085, 0x0001, 0x0804, 0x1779, 0xa87c, 0xd0bc, 0x0dc8, + 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x16cd, 0xa87c, + 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, + 0x171c, 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, + 0xa804, 0x9045, 0x090c, 0x0d65, 0xa164, 0xa91a, 0x91ec, 0x000f, + 0x9d80, 0x1cca, 0x2065, 0xa888, 0xd19c, 0x1904, 0x171c, 0x0428, + 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, 0x0d65, 0xa164, + 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cca, 0x2065, 0x9006, 0xa842, + 0xa83e, 0xd19c, 0x1904, 0x171c, 0x0080, 0xa87c, 0xd0ac, 0x0904, + 0x1679, 0x9006, 0xa842, 0xa83e, 0x0804, 0x171c, 0xa87c, 0xd0ac, + 0x0904, 0x1679, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, + 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x16f0, 0x16f0, 0x16f2, + 0x16f0, 0x16f0, 0x16f0, 0x16f8, 0x16f0, 0x16f0, 0x16f0, 0x16fe, + 0x16f0, 0x16f0, 0x16f0, 0x1704, 0x16f0, 0x16f0, 0x16f0, 0x170a, + 0x16f0, 0x16f0, 0x16f0, 0x1710, 0x16f0, 0x16f0, 0x16f0, 0x1716, + 0x080c, 0x0d65, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1761, + 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1761, 0xa594, 0xa498, + 0xa39c, 0xa2a0, 0x0804, 0x1761, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, + 0x0804, 0x1761, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1761, + 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1761, 0xa5d4, 0xa4d8, + 0xa3dc, 0xa2e0, 0x0804, 0x1761, 0x2c05, 0x908a, 0x0034, 0x1a0c, + 0x0d65, 0x9082, 0x001b, 0x0002, 0x173f, 0x173d, 0x173d, 0x173d, + 0x173d, 0x173d, 0x1746, 0x173d, 0x173d, 0x173d, 0x173d, 0x173d, + 0x174d, 0x173d, 0x173d, 0x173d, 0x173d, 0x173d, 0x1754, 0x173d, + 0x173d, 0x173d, 0x173d, 0x173d, 0x175b, 0x080c, 0x0d65, 0xa56c, + 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, + 0xa78c, 0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, + 0xa6a8, 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, + 0xa3c4, 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, + 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, + 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, + 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, + 0x9006, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, + 0x0c80, 0x0804, 0x1679, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, + 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1cc5, 0xa813, 0x1cc5, + 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d65, + 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, + 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, + 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, + 0xa988, 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, + 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0xa804, + 0x9045, 0x090c, 0x0d65, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, + 0x9080, 0x1cca, 0x2015, 0x82ff, 0x090c, 0x0d65, 0xaa12, 0x2205, + 0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, + 0x0002, 0x18c7, 0x1829, 0x1829, 0x18c7, 0x18c7, 0x18c1, 0x18c7, + 0x1829, 0x18c7, 0x1878, 0x1878, 0x18c7, 0x18c7, 0x18c7, 0x18be, + 0x1878, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, + 0x0904, 0x18c9, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, + 0x001b, 0x0002, 0x1815, 0x1813, 0x1813, 0x1813, 0x1813, 0x1813, + 0x1819, 0x1813, 0x1813, 0x1813, 0x1813, 0x1813, 0x181d, 0x1813, + 0x1813, 0x1813, 0x1813, 0x1813, 0x1821, 0x1813, 0x1813, 0x1813, + 0x1813, 0x1813, 0x1825, 0x080c, 0x0d65, 0xa774, 0xa678, 0x0804, + 0x18c9, 0xa78c, 0xa690, 0x0804, 0x18c9, 0xa7a4, 0xa6a8, 0x0804, + 0x18c9, 0xa7bc, 0xa6c0, 0x0804, 0x18c9, 0xa7d4, 0xa6d8, 0x0804, + 0x18c9, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, + 0x0002, 0x184c, 0x184c, 0x184e, 0x184c, 0x184c, 0x184c, 0x1854, + 0x184c, 0x184c, 0x184c, 0x185a, 0x184c, 0x184c, 0x184c, 0x1860, + 0x184c, 0x184c, 0x184c, 0x1866, 0x184c, 0x184c, 0x184c, 0x186c, + 0x184c, 0x184c, 0x184c, 0x1872, 0x080c, 0x0d65, 0xa574, 0xa478, + 0xa37c, 0xa280, 0x0804, 0x18c9, 0xa584, 0xa488, 0xa38c, 0xa290, + 0x0804, 0x18c9, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x18c9, + 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18c9, 0xa5b4, 0xa4b8, + 0xa3bc, 0xa2c0, 0x0804, 0x18c9, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, + 0x0804, 0x18c9, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x18c9, + 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, + 0x189b, 0x1899, 0x1899, 0x1899, 0x1899, 0x1899, 0x18a2, 0x1899, + 0x1899, 0x1899, 0x1899, 0x1899, 0x18a9, 0x1899, 0x1899, 0x1899, + 0x1899, 0x1899, 0x18b0, 0x1899, 0x1899, 0x1899, 0x1899, 0x1899, + 0x18b7, 0x080c, 0x0d65, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, + 0xa280, 0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, + 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, + 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, + 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, + 0x1130, 0x080c, 0x1ca0, 0x1904, 0x17d2, 0x900e, 0x0050, 0x080c, + 0x0d65, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, + 0x1ca0, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, + 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, + 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, + 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, + 0x0048, 0x0804, 0x9b03, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, + 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, + 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, + 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x1321, + 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, + 0x7808, 0xd09c, 0x190c, 0x1321, 0x00ce, 0x2001, 0x0038, 0x080c, + 0x19cc, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, + 0x0d65, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, + 0x19db, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19c8, 0x7827, + 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, + 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, + 0x6f5c, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, + 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, + 0x0081, 0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x6ffd, 0x0005, + 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, + 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x27e3, 0x2009, 0x003c, + 0x080c, 0x201d, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, + 0x003c, 0x1de0, 0x080c, 0x7ed6, 0x70a0, 0x70a2, 0x7098, 0x709a, + 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, + 0x0300, 0x080c, 0x12e1, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, + 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, + 0x2003, 0x0000, 0x080c, 0x6f5c, 0x1108, 0x0005, 0x2021, 0x0260, + 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, + 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, + 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, + 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, + 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, + 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1595, + 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15c2, 0x7930, 0x0005, + 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, + 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1a39, + 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d65, 0x781f, + 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, + 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, + 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, + 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, + 0x0140, 0x2001, 0x0030, 0x080c, 0x19d2, 0x9186, 0x0040, 0x190c, + 0x0d65, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, + 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, + 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, + 0x791c, 0x9184, 0x0007, 0x090c, 0x0d65, 0xa001, 0xa001, 0x781f, + 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, + 0x19b6, 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, + 0x3e60, 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, + 0x000f, 0x0002, 0x1a62, 0x1a62, 0x1a62, 0x1a62, 0x1a62, 0x1a62, + 0x1a62, 0x1a62, 0x1a62, 0x1a64, 0x1a62, 0x1a62, 0x1a62, 0x1a62, + 0x1a62, 0x1a62, 0x080c, 0x0d65, 0xa87c, 0xd0b4, 0x0904, 0x1bd3, + 0x9184, 0x000f, 0x9080, 0x1cca, 0x2015, 0x2205, 0xab88, 0x2908, + 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842, 0xa83e, 0x012e, + 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, + 0xa88c, 0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a, 0xa83e, 0xa942, + 0xa846, 0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186, 0x001e, 0x0190, + 0x2940, 0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80, 0x1cca, 0x2065, + 0x2c05, 0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e, 0xaa12, 0xab16, + 0x012e, 0x0005, 0xa804, 0x2040, 0x0c60, 0x2cf0, 0x0126, 0x2091, + 0x2400, 0x3e60, 0x6014, 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, + 0x1b9d, 0xc1dd, 0xa97e, 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, + 0xa916, 0xa964, 0xa91a, 0x9184, 0x000f, 0x9088, 0x1cca, 0x2145, + 0x0002, 0x1ad1, 0x1adf, 0x1ad1, 0x1ad1, 0x1ad1, 0x1ad3, 0x1ad1, + 0x1ad1, 0x1b34, 0x1b34, 0x1ad1, 0x1ad1, 0x1ad1, 0x1b32, 0x1ad1, + 0x1ad1, 0x080c, 0x0d65, 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, + 0x000f, 0x9080, 0x1cca, 0x2045, 0xd19c, 0x1904, 0x1b34, 0x9036, + 0x2638, 0x2805, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, + 0x0002, 0x1b04, 0x1b04, 0x1b06, 0x1b04, 0x1b04, 0x1b04, 0x1b0c, + 0x1b04, 0x1b04, 0x1b04, 0x1b12, 0x1b04, 0x1b04, 0x1b04, 0x1b18, + 0x1b04, 0x1b04, 0x1b04, 0x1b1e, 0x1b04, 0x1b04, 0x1b04, 0x1b24, + 0x1b04, 0x1b04, 0x1b04, 0x1b2a, 0x080c, 0x0d65, 0xb574, 0xb478, + 0xb37c, 0xb280, 0x0804, 0x1b79, 0xb584, 0xb488, 0xb38c, 0xb290, + 0x0804, 0x1b79, 0xb594, 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1b79, + 0xb5a4, 0xb4a8, 0xb3ac, 0xb2b0, 0x0804, 0x1b79, 0xb5b4, 0xb4b8, + 0xb3bc, 0xb2c0, 0x0804, 0x1b79, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, + 0x0804, 0x1b79, 0xb5d4, 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1b79, + 0x0804, 0x1b79, 0x080c, 0x0d65, 0x2805, 0x908a, 0x0034, 0x1a0c, + 0x0d65, 0x9082, 0x001b, 0x0002, 0x1b57, 0x1b55, 0x1b55, 0x1b55, + 0x1b55, 0x1b55, 0x1b5e, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b55, + 0x1b65, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b6c, 0x1b55, + 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b73, 0x080c, 0x0d65, 0xb56c, + 0xb470, 0xb774, 0xb678, 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, + 0xb78c, 0xb690, 0xb394, 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, + 0xb6a8, 0xb3ac, 0xb2b0, 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, + 0xb3c4, 0xb2c8, 0x0030, 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, + 0xb2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, + 0x8109, 0xa916, 0x1118, 0x9006, 0x012e, 0x0005, 0x8840, 0x2805, + 0x9005, 0x1168, 0xb004, 0x9005, 0x090c, 0x0d65, 0x2050, 0xb164, + 0xa91a, 0x9184, 0x000f, 0x9080, 0x1cca, 0x2045, 0x2805, 0x2810, + 0x2a08, 0xa80a, 0xa90e, 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, + 0x190c, 0x0d65, 0xa93c, 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, + 0x9206, 0x0508, 0x2958, 0xab48, 0xac44, 0x2940, 0x080c, 0x1cea, + 0x1998, 0x2850, 0x2c40, 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, + 0x2005, 0xa80a, 0x2a00, 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, + 0x3e60, 0x6044, 0xc0a4, 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, + 0xab16, 0x1904, 0x1b86, 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, + 0x6046, 0x0804, 0x1b83, 0x080c, 0x0d65, 0x00f6, 0x00e6, 0x0096, + 0x00c6, 0x0026, 0x704c, 0x9c06, 0x190c, 0x0d65, 0x2079, 0x0090, + 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7057, 0x0000, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0118, 0xa880, 0xc0bd, 0xa882, + 0x6020, 0x9086, 0x0006, 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, + 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, + 0x60c8, 0xa896, 0x704c, 0x2060, 0x00c6, 0x080c, 0xb2d0, 0x080c, + 0x9746, 0x00ce, 0x704c, 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, + 0x201d, 0x080c, 0x9336, 0x2011, 0x0000, 0x080c, 0x91ad, 0x002e, + 0x00ce, 0x009e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, + 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, + 0x1984, 0x9085, 0x0012, 0x7816, 0x2019, 0x1000, 0x8319, 0x090c, + 0x0d65, 0x7820, 0xd0bc, 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, + 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, + 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x2079, 0x0090, 0x782b, + 0x0008, 0x7057, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, + 0x19b6, 0x7054, 0x9086, 0x0000, 0x0904, 0x1c9b, 0x2079, 0x0090, + 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, + 0x9184, 0x0003, 0x0188, 0x080c, 0xd448, 0x2001, 0x0133, 0x2004, + 0x9005, 0x090c, 0x0d65, 0x0016, 0x2009, 0x0040, 0x080c, 0x201d, + 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, + 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x201d, + 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x9762, 0x782c, 0xd0fc, 0x1de8, + 0x080c, 0x9746, 0x7054, 0x9086, 0x0000, 0x1950, 0x782b, 0x0004, + 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x201d, 0x782b, + 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d65, + 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, + 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1cca, + 0x2065, 0x8cff, 0x090c, 0x0d65, 0x8a51, 0x0005, 0x2050, 0x0005, + 0x0000, 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, + 0x0000, 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, + 0x0023, 0x0000, 0x0000, 0x1cbd, 0x1cb9, 0x0000, 0x0000, 0x1cc7, + 0x0000, 0x1cbd, 0x1cc4, 0x1cc4, 0x1cc1, 0x0000, 0x0000, 0x0000, + 0x1cc7, 0x1cc4, 0x0000, 0x1cbf, 0x1cbf, 0x0000, 0x0000, 0x1cc7, + 0x0000, 0x1cbf, 0x1cc5, 0x1cc5, 0x1cc5, 0x0000, 0x0000, 0x0000, + 0x1cc7, 0x1cc5, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, + 0x9055, 0x0904, 0x1ec1, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0, + 0x1cca, 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, + 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, + 0x1140, 0x0310, 0x0804, 0x1ec1, 0xa004, 0x9045, 0x0904, 0x1ec1, + 0x0c18, 0x2c05, 0x9005, 0x0904, 0x1da9, 0xdd9c, 0x1904, 0x1d65, + 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1d3a, + 0x1d3a, 0x1d3c, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d42, 0x1d3a, 0x1d3a, + 0x1d3a, 0x1d48, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d4e, 0x1d3a, 0x1d3a, + 0x1d3a, 0x1d54, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d5a, 0x1d3a, 0x1d3a, + 0x1d3a, 0x1d60, 0x080c, 0x0d65, 0xa07c, 0x9422, 0xa080, 0x931b, + 0x0804, 0x1d9f, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1d9f, + 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, 0x1d9f, 0xa0ac, 0x9422, + 0xa0b0, 0x931b, 0x0804, 0x1d9f, 0xa0bc, 0x9422, 0xa0c0, 0x931b, + 0x0804, 0x1d9f, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1d9f, + 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, + 0x0d65, 0x9082, 0x001b, 0x0002, 0x1d87, 0x1d85, 0x1d85, 0x1d85, + 0x1d85, 0x1d85, 0x1d8c, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d85, + 0x1d91, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d96, 0x1d85, + 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d9b, 0x080c, 0x0d65, 0xa07c, + 0x9422, 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, + 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, + 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, + 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, 0x1ec1, 0x8c60, 0x0804, + 0x1d11, 0xa004, 0x9045, 0x0904, 0x1ec1, 0x0804, 0x1cf4, 0x8a51, + 0x0904, 0x1ec1, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, + 0x0904, 0x1ec1, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1cca, 0x2c05, + 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, 0x1eb6, 0x2c05, 0x8422, + 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, + 0x1e53, 0x9082, 0x001b, 0x0002, 0x1def, 0x1def, 0x1df1, 0x1def, + 0x1def, 0x1def, 0x1dff, 0x1def, 0x1def, 0x1def, 0x1e0d, 0x1def, + 0x1def, 0x1def, 0x1e1b, 0x1def, 0x1def, 0x1def, 0x1e29, 0x1def, + 0x1def, 0x1def, 0x1e37, 0x1def, 0x1def, 0x1def, 0x1e45, 0x080c, + 0x0d65, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, + 0x0d65, 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x1eb1, 0xa18c, + 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084, + 0x9420, 0xa088, 0x9319, 0x0804, 0x1eb1, 0xa19c, 0x2400, 0x9122, + 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa094, 0x9420, 0xa098, + 0x9319, 0x0804, 0x1eb1, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, + 0x911b, 0x0a0c, 0x0d65, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, + 0x1eb1, 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, + 0x0d65, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x1eb1, 0xa1cc, + 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0c4, + 0x9420, 0xa0c8, 0x9319, 0x0804, 0x1eb1, 0xa1dc, 0x2400, 0x9122, + 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0d4, 0x9420, 0xa0d8, + 0x9319, 0x0804, 0x1eb1, 0x9082, 0x001b, 0x0002, 0x1e71, 0x1e6f, + 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e7e, 0x1e6f, 0x1e6f, 0x1e6f, + 0x1e6f, 0x1e6f, 0x1e8b, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, + 0x1e98, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1ea5, 0x080c, + 0x0d65, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, + 0x0d65, 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, + 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420, + 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, + 0x911b, 0x0a0c, 0x0d65, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, + 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d65, + 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, + 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0cc, 0x9420, 0xa0d0, + 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, + 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, + 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6, + 0x610c, 0x0016, 0x9026, 0x2410, 0x6004, 0x9420, 0x9291, 0x0000, + 0x2c04, 0x9210, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, + 0x000f, 0x9405, 0x001e, 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, + 0x0000, 0x6004, 0x7812, 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, + 0x0002, 0x1db8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, + 0x0d5e, 0xd094, 0x0110, 0x080c, 0x11bd, 0x0005, 0x0126, 0x2091, + 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, + 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, + 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, + 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, + 0xd0a4, 0x190c, 0x201a, 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, + 0x001a, 0x9084, 0x000e, 0x0002, 0x1f3c, 0x1f34, 0x7905, 0x1f34, + 0x1f36, 0x1f36, 0x1f36, 0x1f36, 0x78eb, 0x1f34, 0x1f38, 0x1f34, + 0x1f36, 0x1f34, 0x1f36, 0x1f34, 0x080c, 0x0d65, 0x0031, 0x0020, + 0x080c, 0x78eb, 0x080c, 0x7905, 0x0005, 0x0006, 0x0016, 0x0026, + 0x080c, 0xd448, 0x7930, 0x9184, 0x0003, 0x01f0, 0x080c, 0x9746, + 0x2001, 0x19c9, 0x2004, 0x9005, 0x0180, 0x2001, 0x0133, 0x2004, + 0x9005, 0x090c, 0x0d65, 0x00c6, 0x2001, 0x19c9, 0x2064, 0x080c, + 0x9762, 0x080c, 0xb2d0, 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, + 0x201d, 0x080c, 0x9762, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, + 0x9286, 0x0003, 0x0160, 0x080c, 0x6f5c, 0x1138, 0x080c, 0x725c, + 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x0010, 0x080c, 0x5a9d, 0x080c, + 0x7993, 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, + 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3a, + 0x080c, 0x193f, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, + 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x1940, 0x2102, + 0x2001, 0x1948, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, + 0x2001, 0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, + 0x831c, 0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, + 0x2011, 0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, + 0x1240, 0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, + 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, + 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, + 0x8403, 0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, + 0x0004, 0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, + 0x0003, 0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, + 0x0228, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, + 0x8217, 0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, + 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, + 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, + 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, + 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, + 0x000e, 0x0005, 0x7938, 0x080c, 0x0d5e, 0x00f6, 0x2079, 0x0200, + 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, + 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, + 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, + 0x0000, 0x080c, 0x27dd, 0x080c, 0x270a, 0x080c, 0x284e, 0x9006, + 0x080c, 0x2739, 0x9006, 0x080c, 0x271c, 0x20a9, 0x0012, 0x1d04, + 0x2047, 0x2091, 0x6000, 0x1f04, 0x2047, 0x602f, 0x0100, 0x602f, + 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, + 0x080c, 0x282b, 0x080c, 0x2428, 0x2009, 0x00ef, 0x6132, 0x6136, + 0x080c, 0x2438, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0002, 0x604b, + 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, + 0x149f, 0x00c6, 0x2061, 0x0140, 0x608b, 0x000b, 0x608f, 0x10b8, + 0x6093, 0x0000, 0x6097, 0x0198, 0x00ce, 0x6004, 0x9085, 0x8000, + 0x6006, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, + 0x2085, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, + 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, + 0x006b, 0x602b, 0x402c, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, + 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, + 0x2001, 0x1834, 0x2003, 0x0000, 0x2001, 0x1833, 0x2003, 0x0001, + 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, + 0x6028, 0x910c, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, + 0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x20d0, 0x20cd, 0x20cd, + 0x20cd, 0x20cf, 0x20cd, 0x20cd, 0x20cd, 0x080c, 0x0d65, 0x0029, + 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, + 0xd09c, 0x0118, 0xd19c, 0x1904, 0x232f, 0xd1f4, 0x190c, 0x0d5e, + 0x080c, 0x6f5c, 0x0904, 0x212d, 0x080c, 0xbdd7, 0x1120, 0x7000, + 0x9086, 0x0003, 0x0580, 0x6024, 0x9084, 0x1800, 0x0560, 0x080c, + 0x6f7f, 0x0118, 0x080c, 0x6f6d, 0x1530, 0x2011, 0x0020, 0x080c, + 0x282b, 0x6043, 0x0000, 0x080c, 0xbdd7, 0x0168, 0x080c, 0x6f7f, + 0x1150, 0x2001, 0x1976, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, + 0x6dd2, 0x0804, 0x2332, 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, + 0x00d6, 0x2069, 0x0140, 0x080c, 0x6fb3, 0x00de, 0x1904, 0x2332, + 0x080c, 0x7266, 0x0428, 0x080c, 0x6f7f, 0x1590, 0x6024, 0x9084, + 0x1800, 0x1108, 0x0468, 0x080c, 0x7266, 0x080c, 0x725c, 0x080c, + 0x5be2, 0x080c, 0x6e8d, 0x0804, 0x232f, 0xd1ac, 0x1508, 0x6024, + 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, + 0x7094, 0x9086, 0x0028, 0x1110, 0x080c, 0x713f, 0x0804, 0x232f, + 0x080c, 0x7261, 0x0048, 0x2001, 0x194e, 0x2003, 0x0002, 0x0020, + 0x080c, 0x709d, 0x0804, 0x232f, 0x080c, 0x71e1, 0x0804, 0x232f, + 0xd1ac, 0x0904, 0x2249, 0x080c, 0x6f5c, 0x11d0, 0x2011, 0x0020, + 0x080c, 0x282b, 0x0006, 0x0026, 0x0036, 0x080c, 0x6f76, 0x1158, + 0x080c, 0x725c, 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x003e, 0x002e, + 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x6f30, + 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, + 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74d6, 0x948c, + 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, 0x7044, + 0xd084, 0x1148, 0xc085, 0x7046, 0x0036, 0x2418, 0x2011, 0x8016, + 0x080c, 0x47fb, 0x003e, 0x080c, 0xbdd0, 0x1904, 0x2220, 0x9196, + 0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, + 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x313d, 0x0128, + 0xc18d, 0x7132, 0x080c, 0x6555, 0x1510, 0x6240, 0x9294, 0x0010, + 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, + 0xd08c, 0x0904, 0x2220, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, + 0x200c, 0xd1ac, 0x1904, 0x2220, 0xc1ad, 0x2102, 0x0036, 0x73d4, + 0x2011, 0x8013, 0x080c, 0x47fb, 0x003e, 0x0804, 0x2220, 0x7038, + 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2220, + 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x47fb, + 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1854, 0x220c, 0x00f0, + 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8248, 0x2019, + 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xd046, 0x00ce, 0x9484, + 0x00ff, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, + 0x9006, 0x2009, 0x000e, 0x080c, 0xd0ce, 0x001e, 0xd1ac, 0x1148, + 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2f80, 0x001e, + 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6166, + 0x1110, 0x080c, 0x5bfc, 0x8108, 0x1f04, 0x2216, 0x00be, 0x015e, + 0x00ce, 0x004e, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, + 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, + 0x1170, 0xd19c, 0x11b0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, + 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, + 0x0001, 0x2001, 0x1825, 0x2003, 0x0000, 0x2011, 0x0020, 0x080c, + 0x282b, 0xd194, 0x0904, 0x232f, 0x0016, 0x080c, 0x9746, 0x6220, + 0xd2b4, 0x0904, 0x22d7, 0x080c, 0x8068, 0x080c, 0x8e21, 0x2011, + 0x0004, 0x080c, 0x282b, 0x00f6, 0x2019, 0x19c2, 0x2304, 0x907d, + 0x0904, 0x22a4, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, + 0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, + 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, + 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x2801, 0x2001, 0x001e, + 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x27b8, 0x6904, 0xd1dc, + 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, + 0x27f1, 0x080c, 0x86d1, 0x080c, 0x9762, 0x7814, 0x2048, 0xa867, + 0x0103, 0x2f60, 0x080c, 0x9a65, 0x009e, 0x00ee, 0x00ce, 0x00de, + 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, + 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x00de, 0x00c6, + 0x2061, 0x19b6, 0x6034, 0x080c, 0xbdd7, 0x0120, 0x909a, 0x0003, + 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce, + 0x080c, 0x8df9, 0x0804, 0x232c, 0x2061, 0x0100, 0x62c0, 0x080c, + 0x967c, 0x2019, 0x19c2, 0x2304, 0x9065, 0x0130, 0x6003, 0x0001, + 0x2009, 0x0027, 0x080c, 0x9b03, 0x00ce, 0x0804, 0x232c, 0xd2bc, + 0x05e0, 0x080c, 0x8075, 0x2011, 0x0004, 0x080c, 0x282b, 0x00d6, + 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, + 0x00de, 0x00c6, 0x2061, 0x19b6, 0x6050, 0x080c, 0xbdd7, 0x0120, + 0x909a, 0x0003, 0x1638, 0x0018, 0x909a, 0x00c8, 0x1618, 0x8000, + 0x6052, 0x604c, 0x00ce, 0x9005, 0x0578, 0x2009, 0x07d0, 0x080c, + 0x806d, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x2009, + 0x1984, 0x2011, 0x0012, 0x080c, 0x283a, 0x00f0, 0x2009, 0x1984, + 0x2011, 0x0016, 0x080c, 0x283a, 0x00b8, 0x2011, 0x0004, 0x080c, + 0x282b, 0x0090, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x003e, + 0x2019, 0x19c9, 0x2304, 0x9065, 0x0130, 0x2009, 0x004f, 0x6003, + 0x0003, 0x080c, 0x9b03, 0x00ce, 0x080c, 0x9762, 0x001e, 0xd19c, + 0x0904, 0x238d, 0x7038, 0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011, + 0x0008, 0x080c, 0x282b, 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, + 0x1f04, 0x235a, 0x1d04, 0x2342, 0x080c, 0x809c, 0x6020, 0xd09c, + 0x1db8, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2768, 0x00fe, 0x1d80, + 0x6050, 0xc0e4, 0x6052, 0x2011, 0x0008, 0x080c, 0x282b, 0x015e, + 0x001e, 0x0498, 0x015e, 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, + 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, 0x60e3, 0x0000, + 0x080c, 0xd427, 0x080c, 0xd442, 0x080c, 0x52a1, 0xd0fc, 0x1138, + 0x080c, 0xbdd0, 0x1120, 0x9085, 0x0001, 0x080c, 0x6fa3, 0x9006, + 0x080c, 0x27f1, 0x2009, 0x0002, 0x080c, 0x27dd, 0x00e6, 0x2071, + 0x1800, 0x7003, 0x0004, 0x080c, 0x0e9c, 0x00ee, 0x2011, 0x0008, + 0x080c, 0x282b, 0x080c, 0x0bab, 0x001e, 0x918c, 0xffd0, 0x2110, + 0x080c, 0x282b, 0x00ae, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc, + 0x70ce, 0x9116, 0x0904, 0x23e7, 0x81ff, 0x01a0, 0x2009, 0x0000, + 0x080c, 0x27dd, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, + 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, + 0x47fb, 0x0468, 0x2001, 0x1977, 0x200c, 0x81ff, 0x1140, 0x2001, + 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, + 0x2011, 0x8012, 0x080c, 0x47fb, 0x080c, 0x0e9c, 0x080c, 0x52a1, + 0xd0fc, 0x11a8, 0x080c, 0xbdd0, 0x1190, 0x00c6, 0x080c, 0x2483, + 0x080c, 0x9746, 0x080c, 0x904b, 0x080c, 0x9762, 0x2061, 0x0100, + 0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x2f80, 0x00ce, 0x012e, + 0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, + 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, + 0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204, + 0x9106, 0x1190, 0x2011, 0x181f, 0x2214, 0x9294, 0xff00, 0x9584, + 0xff00, 0x9206, 0x1148, 0x2011, 0x181f, 0x2214, 0x9294, 0x00ff, + 0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7bd2, 0x0048, + 0x9584, 0x00ff, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f, + 0x9006, 0x0005, 0x9080, 0x3142, 0x200d, 0x918c, 0x00ff, 0x0005, + 0x00d6, 0x2069, 0x0140, 0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9, + 0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2433, 0x00de, 0x0005, + 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1817, 0x2102, + 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, + 0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xd456, 0x2005, + 0x6856, 0x8211, 0x1f04, 0x2448, 0x002e, 0x00de, 0x000e, 0x0005, + 0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, + 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, + 0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, + 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, + 0x680e, 0x1f04, 0x2478, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, + 0x00de, 0x015e, 0x0005, 0x080c, 0x529d, 0xd0c4, 0x0150, 0xd0a4, + 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xd0ce, + 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, + 0xd0dc, 0x0904, 0x24ef, 0x080c, 0x2758, 0x0660, 0x9084, 0x0700, + 0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, + 0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, + 0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, + 0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, + 0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, + 0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, + 0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x8276, + 0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, + 0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x6f5c, 0x1118, + 0x2009, 0x193e, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, + 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, + 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, + 0x080c, 0x0d5e, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, + 0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, + 0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, + 0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, + 0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, + 0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, + 0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, + 0x2001, 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0033, + 0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x254d, 0x256b, + 0x258f, 0x2591, 0x25ba, 0x25bc, 0x25be, 0x2001, 0x0001, 0x080c, + 0x2394, 0x080c, 0x27a2, 0x2001, 0x1961, 0x2003, 0x0000, 0x7828, + 0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2774, + 0x2001, 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25bf, + 0x080c, 0x807a, 0x0005, 0x2009, 0x1964, 0x200b, 0x0000, 0x2001, + 0x1969, 0x2003, 0x0036, 0x2001, 0x1968, 0x2003, 0x002a, 0x2001, + 0x1961, 0x2003, 0x0001, 0x9006, 0x080c, 0x271c, 0x2001, 0xffff, + 0x20a9, 0x0009, 0x080c, 0x2774, 0x2001, 0x195f, 0x2003, 0x0006, + 0x2009, 0x001e, 0x2011, 0x25bf, 0x080c, 0x807a, 0x0005, 0x080c, + 0x0d65, 0x2001, 0x1969, 0x2003, 0x0036, 0x2001, 0x1961, 0x2003, + 0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x271c, 0x2001, 0x1965, 0x2003, + 0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2774, 0x2001, + 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25bf, 0x080c, + 0x807a, 0x0005, 0x080c, 0x0d65, 0x080c, 0x0d65, 0x0005, 0x0006, + 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, + 0x2079, 0x0100, 0x2001, 0x1961, 0x2004, 0x908a, 0x0007, 0x1a0c, + 0x0d65, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, + 0x000e, 0x0005, 0x25e1, 0x2601, 0x2641, 0x2671, 0x2695, 0x26a5, + 0x26a7, 0x080c, 0x2768, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, + 0x2009, 0x1967, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, + 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x195f, 0x2003, + 0x0001, 0x0030, 0x080c, 0x26cb, 0x2001, 0xffff, 0x080c, 0x255c, + 0x0005, 0x080c, 0x26a9, 0x05e0, 0x2009, 0x1968, 0x2104, 0x8001, + 0x200a, 0x080c, 0x2768, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, + 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1967, + 0x2104, 0xc085, 0x200a, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a, + 0x9086, 0x0005, 0x0118, 0x080c, 0x26b1, 0x00c0, 0x200b, 0x0000, + 0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, + 0x2001, 0x0001, 0x080c, 0x2739, 0x2001, 0x1961, 0x2003, 0x0002, + 0x0028, 0x2001, 0x195f, 0x2003, 0x0003, 0x0010, 0x080c, 0x257e, + 0x0005, 0x080c, 0x26a9, 0x0560, 0x2009, 0x1968, 0x2104, 0x8001, + 0x200a, 0x080c, 0x2768, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, + 0x2001, 0x195f, 0x2003, 0x0003, 0x2001, 0x1960, 0x2003, 0x0000, + 0x00b8, 0x2009, 0x1968, 0x2104, 0x9005, 0x1118, 0x080c, 0x26ee, + 0x0010, 0x080c, 0x26be, 0x080c, 0x26b1, 0x2009, 0x1964, 0x200b, + 0x0000, 0x2001, 0x1961, 0x2003, 0x0001, 0x080c, 0x257e, 0x0000, + 0x0005, 0x04b9, 0x0508, 0x080c, 0x2768, 0x11b8, 0x7850, 0x9084, + 0xefff, 0x7852, 0x2009, 0x1965, 0x2104, 0x8000, 0x200a, 0x9086, + 0x0007, 0x0108, 0x0078, 0x2001, 0x196a, 0x2003, 0x000a, 0x2009, + 0x1967, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1961, + 0x2003, 0x0004, 0x080c, 0x25a9, 0x0005, 0x0099, 0x0168, 0x080c, + 0x2768, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x2595, + 0x0018, 0x0079, 0x080c, 0x25a9, 0x0005, 0x080c, 0x0d65, 0x080c, + 0x0d65, 0x2009, 0x1969, 0x2104, 0x8001, 0x200a, 0x090c, 0x270a, + 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x2739, 0x0005, 0x7a38, 0x9294, + 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x080c, 0x271c, 0x0005, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a, + 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, + 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, + 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, + 0x0010, 0x2001, 0x0001, 0x080c, 0x2739, 0x0005, 0x0086, 0x2001, + 0x1967, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0d65, 0x2009, 0x1966, + 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, + 0x1120, 0x080c, 0x0d65, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, + 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x195f, 0x20a9, 0x0009, + 0x2003, 0x0000, 0x8000, 0x1f04, 0x2710, 0x2001, 0x1966, 0x2003, + 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, + 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, + 0x2009, 0x196c, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, + 0x9085, 0x0006, 0x783a, 0x2009, 0x196d, 0x210c, 0x795a, 0x00fe, + 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, + 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x7850, 0x9084, 0xfff0, + 0x7852, 0x0060, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, + 0x7850, 0x9084, 0xfff0, 0x9085, 0x0000, 0x7852, 0x00fe, 0x0005, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, + 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, + 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x27d7, 0xd09c, 0x1110, + 0x1f04, 0x276b, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, + 0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007, + 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186, + 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118, + 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x2794, 0x080c, 0x809c, + 0x1f04, 0x2794, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, + 0x012e, 0x0005, 0x080c, 0x2892, 0x0005, 0x0006, 0x0156, 0x00f6, + 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, 0x7854, + 0xd08c, 0x1110, 0x1f04, 0x27af, 0x00fe, 0x015e, 0x000e, 0x0005, + 0x1d04, 0x27b8, 0x080c, 0x809c, 0x1f04, 0x27b8, 0x0005, 0x0006, + 0x2001, 0x196b, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, + 0x2001, 0x196b, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, + 0x2001, 0x196b, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, + 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1977, + 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, + 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, + 0x0005, 0x0016, 0x0026, 0x080c, 0x6f76, 0x0108, 0xc0bc, 0x2009, + 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, + 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, + 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, + 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, + 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, + 0x1128, 0x080c, 0x6f76, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, + 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0101, + 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, 0x0100, + 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, 0x7844, + 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, 0x7a16, + 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, 0x9085, + 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x27b8, 0x6050, 0x9085, + 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, 0x27b8, + 0x6054, 0xd0bc, 0x090c, 0x0d65, 0x20a9, 0x0005, 0x080c, 0x27b8, + 0x6054, 0xd0ac, 0x090c, 0x0d65, 0x2009, 0x197e, 0x9084, 0x7e00, + 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a, 0x2009, + 0x196c, 0x2011, 0x196d, 0x6358, 0x939c, 0x38df, 0x2320, 0x939d, + 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e, 0x002e, + 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, 0xc0cd, + 0x6052, 0x00ce, 0x000e, 0x0005, 0x2d98, 0x2d98, 0x299c, 0x299c, + 0x29a8, 0x29a8, 0x29b4, 0x29b4, 0x29c2, 0x29c2, 0x29ce, 0x29ce, + 0x29dc, 0x29dc, 0x29ea, 0x29ea, 0x29fc, 0x29fc, 0x2a08, 0x2a08, + 0x2a16, 0x2a16, 0x2a34, 0x2a34, 0x2a54, 0x2a54, 0x2a24, 0x2a24, + 0x2a44, 0x2a44, 0x2a62, 0x2a62, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2a74, 0x2a74, 0x2a80, 0x2a80, + 0x2a8e, 0x2a8e, 0x2a9c, 0x2a9c, 0x2aac, 0x2aac, 0x2aba, 0x2aba, + 0x2aca, 0x2aca, 0x2ada, 0x2ada, 0x2aec, 0x2aec, 0x2afa, 0x2afa, + 0x2b0a, 0x2b0a, 0x2b2c, 0x2b2c, 0x2b50, 0x2b50, 0x2b1a, 0x2b1a, + 0x2b3e, 0x2b3e, 0x2b60, 0x2b60, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2b74, 0x2b74, 0x2b80, 0x2b80, + 0x2b8e, 0x2b8e, 0x2b9c, 0x2b9c, 0x2bac, 0x2bac, 0x2bba, 0x2bba, + 0x2bca, 0x2bca, 0x2bda, 0x2bda, 0x2bec, 0x2bec, 0x2bfa, 0x2bfa, + 0x2c0a, 0x2c0a, 0x2c1a, 0x2c1a, 0x2c2c, 0x2c2c, 0x2c3c, 0x2c3c, + 0x2c4e, 0x2c4e, 0x2c60, 0x2c60, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2c74, 0x2c74, 0x2c82, 0x2c82, + 0x2c92, 0x2c92, 0x2ca2, 0x2ca2, 0x2cb4, 0x2cb4, 0x2cc4, 0x2cc4, + 0x2cd6, 0x2cd6, 0x2ce8, 0x2ce8, 0x2cfc, 0x2cfc, 0x2d0c, 0x2d0c, + 0x2d1e, 0x2d1e, 0x2d30, 0x2d30, 0x2d44, 0x2d44, 0x2d55, 0x2d55, + 0x2d68, 0x2d68, 0x2d7b, 0x2d7b, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, + 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x1eeb, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1321, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, + 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, + 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1321, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, + 0x080c, 0x1eeb, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, + 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x20b1, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, + 0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, + 0x080c, 0x1eeb, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x97ac, 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, + 0x080c, 0x97ac, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, + 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1f15, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1321, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, + 0x080c, 0x97ac, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, + 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, + 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x080c, 0x20b1, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, + 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1f15, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, + 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, + 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1321, 0x0804, 0x2d90, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, + 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, + 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, + 0x080c, 0x1321, 0x080c, 0x1f15, 0x04d8, 0x0106, 0x0006, 0x0126, + 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, + 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0440, + 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, + 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1321, 0x080c, 0x97ac, + 0x080c, 0x1f15, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, + 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, + 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0000, + 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, + 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x651b, + 0x1904, 0x2e9c, 0x72d8, 0x2001, 0x194d, 0x2004, 0x9005, 0x1110, + 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2e9c, 0x080c, + 0x2ea1, 0x0804, 0x2e9c, 0xd2cc, 0x1904, 0x2e9c, 0x080c, 0x6f5c, + 0x1120, 0x70ab, 0xffff, 0x0804, 0x2e9c, 0xd294, 0x0120, 0x70ab, + 0xffff, 0x0804, 0x2e9c, 0x080c, 0x3138, 0x0160, 0x080c, 0xbdd7, + 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e2e, 0x70ab, 0xffff, + 0x0804, 0x2e9c, 0x2001, 0x1817, 0x203c, 0x7290, 0xd284, 0x0904, + 0x2e2e, 0xd28c, 0x1904, 0x2e2e, 0x0036, 0x73a8, 0x938e, 0xffff, + 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c, + 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, + 0x970e, 0x0590, 0x908e, 0x0000, 0x0578, 0x908e, 0x00ff, 0x1150, + 0x7230, 0xd284, 0x1570, 0x7290, 0xc28d, 0x7292, 0x70ab, 0xffff, + 0x003e, 0x0460, 0x0026, 0x2011, 0x0010, 0x080c, 0x6581, 0x002e, + 0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c, 0x23ef, 0x080c, + 0x6106, 0x11a8, 0x080c, 0x655d, 0x1150, 0x7030, 0xd08c, 0x0118, + 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2eba, 0x0148, 0x0028, 0x080c, + 0x300e, 0x080c, 0x2ee6, 0x0118, 0x8318, 0x0804, 0x2de3, 0x73aa, + 0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2e9c, 0x9780, 0x3142, + 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096, + 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, + 0x9802, 0x20a8, 0x0020, 0x70ab, 0xffff, 0x0804, 0x2e9c, 0x2700, + 0x0156, 0x0016, 0x9106, 0x0904, 0x2e91, 0x0026, 0x2011, 0x0010, + 0x080c, 0x6581, 0x002e, 0x0120, 0x2009, 0xffff, 0x0804, 0x2e99, + 0xc484, 0x080c, 0x6166, 0x0138, 0x080c, 0xbdd7, 0x1590, 0x080c, + 0x6106, 0x15b8, 0x0008, 0xc485, 0x080c, 0x655d, 0x1130, 0x7030, + 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180, + 0x080c, 0x655d, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, + 0x612a, 0x0028, 0x080c, 0x30a6, 0x01a0, 0x080c, 0x30d1, 0x0088, + 0x080c, 0x300e, 0x080c, 0xbdd7, 0x1160, 0x080c, 0x2ee6, 0x0188, + 0x0040, 0x080c, 0xbdd7, 0x1118, 0x080c, 0x30a6, 0x0110, 0x0451, + 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2e47, 0x70ab, 0xffff, + 0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be, + 0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c, + 0x6106, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x300e, + 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c, 0xbb25, 0x001e, + 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, + 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9ad6, 0x01d0, 0x2b00, + 0x6012, 0x080c, 0xbb52, 0x6023, 0x0001, 0x9006, 0x080c, 0x60a3, + 0x2001, 0x0000, 0x080c, 0x60b7, 0x0126, 0x2091, 0x8000, 0x70a4, + 0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c, 0x9b03, 0x9085, + 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, + 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, + 0x080c, 0x9ad6, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, + 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x1110, 0x080c, 0x2fc1, 0x080c, 0xbb52, 0x6023, 0x0001, + 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7, 0x0126, + 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002, + 0x080c, 0x9b03, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, + 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x6106, + 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, + 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, + 0x00c6, 0x080c, 0x9a0f, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbb52, + 0x6023, 0x0001, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, + 0x60b7, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, + 0x2009, 0x0002, 0x080c, 0x9b03, 0x9085, 0x0001, 0x00ce, 0x00de, + 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, + 0x2009, 0x007f, 0x080c, 0x6106, 0x11b8, 0xb813, 0x00ff, 0xb817, + 0xfffd, 0xb8c7, 0x0004, 0x080c, 0x9a0f, 0x0170, 0x2b00, 0x6012, + 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbb52, 0x2009, 0x0022, + 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, + 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x9036, + 0x080c, 0x9746, 0x1110, 0x2031, 0x0001, 0x0066, 0x080c, 0x84a3, + 0x080c, 0x8423, 0x080c, 0x969c, 0x080c, 0xa9c4, 0x006e, 0x86ff, + 0x0110, 0x080c, 0x9762, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, + 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, + 0x6166, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, + 0x080c, 0x5bfc, 0x001e, 0x8108, 0x1f04, 0x2fa6, 0x9686, 0x0001, + 0x190c, 0x310c, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, + 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x9016, + 0x080c, 0x9746, 0x1110, 0x2011, 0x0001, 0x0026, 0x6210, 0x2258, + 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x8498, 0x0076, 0x2039, + 0x0000, 0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x001e, + 0x002e, 0x82ff, 0x0110, 0x080c, 0x9762, 0xba10, 0xbb14, 0x080c, + 0x5bfc, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, + 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, + 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a4, 0x9005, + 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, + 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, 0xb800, 0xc08c, + 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0036, 0x0026, + 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0x9746, 0x1110, 0x2011, + 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0080, 0x080c, + 0x529d, 0xd0c4, 0x0148, 0x0040, 0x9006, 0x0046, 0x2020, 0x2009, + 0x002d, 0x080c, 0xd0ce, 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026, + 0x928e, 0x007e, 0x0904, 0x3081, 0x928e, 0x007f, 0x0904, 0x3081, + 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, + 0x8fff, 0x1150, 0x2001, 0x195d, 0x0006, 0x2003, 0x0001, 0x080c, + 0x3093, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, + 0x0001, 0x080c, 0x6527, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, + 0x8498, 0x0076, 0x2039, 0x0000, 0x080c, 0x8387, 0x00b6, 0x00c6, + 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, + 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, + 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xce23, 0x001e, + 0x007e, 0x002e, 0x8210, 0x1f04, 0x3037, 0x002e, 0x82ff, 0x0110, + 0x080c, 0x9762, 0x015e, 0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, + 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x529d, + 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, + 0x080c, 0xd0ce, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x7290, 0x82ff, 0x01e8, 0x080c, 0x6555, 0x11d0, + 0x2100, 0x080c, 0x2422, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, + 0x92e0, 0x1d80, 0x2c04, 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, + 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, + 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, + 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0066, 0x9036, + 0x080c, 0x9746, 0x1110, 0x2031, 0x0001, 0x0066, 0x0036, 0x2019, + 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, 0x0110, 0x080c, 0x9762, + 0x006e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, + 0x2061, 0x1b00, 0x001e, 0x6112, 0x080c, 0x2fc1, 0x001e, 0x080c, + 0x612a, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, + 0x080c, 0x9372, 0x080c, 0xd37f, 0x002e, 0x001e, 0x0005, 0x2001, + 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6f5c, + 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6f5c, + 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, + 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x612a, + 0x8108, 0x1f04, 0x311d, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, + 0x9084, 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005, + 0x2001, 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, 0x2214, + 0xd2ec, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, + 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, + 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, + 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, + 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, + 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, + 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, + 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, + 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, + 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, + 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, + 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, + 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, + 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, + 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, + 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, + 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, + 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, + 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, + 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, + 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, + 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, + 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, + 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, + 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, + 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, + 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x2071, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016, + 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0, + 0x703f, 0x18b0, 0x7007, 0x0001, 0x080c, 0x103c, 0x090c, 0x0d65, + 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x103c, + 0x090c, 0x0d65, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, + 0x0005, 0x2071, 0x1894, 0x7004, 0x0002, 0x3271, 0x3272, 0x3285, + 0x3299, 0x0005, 0x1004, 0x3282, 0x0e04, 0x3282, 0x2079, 0x0000, + 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, + 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, + 0x18ae, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, + 0x0904, 0x336d, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, + 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, + 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, + 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, + 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, + 0x908a, 0x003f, 0x1a04, 0x336a, 0x61cc, 0x0804, 0x32ff, 0x3341, + 0x3379, 0x3383, 0x3387, 0x3391, 0x3397, 0x339b, 0x33ab, 0x33ae, + 0x33b8, 0x33bd, 0x33c2, 0x33cd, 0x33d8, 0x33e7, 0x33f6, 0x3404, + 0x341b, 0x3436, 0x336a, 0x34df, 0x351d, 0x35c2, 0x35d3, 0x35f6, + 0x336a, 0x336a, 0x336a, 0x362e, 0x364e, 0x3657, 0x3683, 0x3689, + 0x336a, 0x36cf, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x36da, + 0x36e3, 0x36eb, 0x36ed, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, + 0x336a, 0x371d, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x373a, + 0x3795, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x0002, + 0x37bf, 0x37c2, 0x3821, 0x383a, 0x386a, 0x3b0c, 0x336a, 0x4e6e, + 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, + 0x33b8, 0x33bd, 0x400b, 0x52c1, 0x4021, 0x4efd, 0x4f4e, 0x5051, + 0x336a, 0x50b3, 0x50ef, 0x5120, 0x522c, 0x514d, 0x51ac, 0x336a, + 0x4025, 0x41b5, 0x41cb, 0x41f0, 0x4255, 0x42c9, 0x42e9, 0x4360, + 0x4371, 0x4389, 0x438c, 0x43b1, 0x4424, 0x448e, 0x4496, 0x45c8, + 0x4725, 0x4759, 0x49a3, 0x336a, 0x49c1, 0x4a80, 0x4b56, 0x336a, + 0x336a, 0x336a, 0x336a, 0x4bbc, 0x4bd7, 0x4496, 0x4e1d, 0x714c, + 0x0000, 0x2021, 0x4000, 0x080c, 0x47d7, 0x0126, 0x2091, 0x8000, + 0x0e04, 0x334b, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, + 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, + 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x11b5, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, + 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, + 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, + 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, + 0x7990, 0x0804, 0x47e4, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, + 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, + 0x47e7, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x3341, 0x7984, + 0x2114, 0x0804, 0x3341, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, + 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, + 0x7b8c, 0x0804, 0x3341, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, + 0x2011, 0x0002, 0x2019, 0x0015, 0x789b, 0x0317, 0x0804, 0x3341, + 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, + 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3376, + 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x337d, 0x79a0, 0x9182, 0x0040, + 0x0210, 0x0804, 0x3376, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x338b, + 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3376, 0x21e8, 0x7984, + 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x3341, 0x2061, + 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, + 0x2010, 0x9005, 0x0904, 0x3341, 0x0804, 0x3370, 0x79a0, 0x9182, + 0x0040, 0x0210, 0x0804, 0x3376, 0x21e0, 0x20a9, 0x0001, 0x7984, + 0x2198, 0x4012, 0x0804, 0x3341, 0x2069, 0x1853, 0x7884, 0x7990, + 0x911a, 0x1a04, 0x3376, 0x8019, 0x0904, 0x3376, 0x684a, 0x6942, + 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, + 0x728d, 0x0804, 0x3341, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, + 0x1a04, 0x3376, 0x8019, 0x0904, 0x3376, 0x684e, 0x6946, 0x788c, + 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, + 0x8000, 0x080c, 0x6612, 0x012e, 0x0804, 0x3341, 0x902e, 0x2520, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x7984, 0x7b88, + 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101, + 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x2009, + 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x47e4, 0x701f, + 0x345a, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, + 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, + 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x3373, 0x810f, 0x918c, + 0x00ff, 0x0904, 0x3373, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, + 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x2009, + 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, + 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, + 0x9080, 0x0019, 0xaf60, 0x080c, 0x47e4, 0x701f, 0x3498, 0x0005, + 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, + 0x1904, 0x3373, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, + 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, + 0x080c, 0x5cea, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, + 0x012e, 0x0050, 0x080c, 0x5ff1, 0x1128, 0x7007, 0x0003, 0x701f, + 0x34c4, 0x0005, 0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x20a9, + 0x0005, 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210, + 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, + 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x47e7, 0x2091, + 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, + 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, + 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, + 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, + 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x0180, 0x2001, 0x19f1, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, + 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, + 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3373, + 0x7984, 0x080c, 0x6166, 0x1904, 0x3376, 0x7e98, 0x9684, 0x3fff, + 0x9082, 0x4000, 0x1a04, 0x3376, 0x7c88, 0x7d8c, 0x080c, 0x6398, + 0x080c, 0x6329, 0x1518, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, + 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, + 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x001c, + 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x3373, 0x0c30, 0x080c, + 0xb2d0, 0x012e, 0x0904, 0x3373, 0x0804, 0x3341, 0x900e, 0x2001, + 0x0005, 0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x080c, 0xb9c2, + 0x080c, 0x683f, 0x012e, 0x0804, 0x3341, 0x00a6, 0x2950, 0xb198, + 0x080c, 0x6166, 0x1904, 0x35af, 0xb6a4, 0x9684, 0x3fff, 0x9082, + 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6398, 0x080c, 0x6343, + 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, + 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, + 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c, 0x2001, 0x1819, + 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb2d0, + 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, + 0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x080c, 0xb9c2, 0x080c, + 0x6833, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097, + 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae, + 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48, + 0x00ae, 0x0005, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, + 0x3376, 0x080c, 0x622d, 0x0904, 0x3373, 0x080c, 0x639e, 0x0904, + 0x3373, 0x0804, 0x42e0, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47ce, + 0x0904, 0x3376, 0x080c, 0x642c, 0x0904, 0x3373, 0x2019, 0x0005, + 0x79a8, 0x080c, 0x63b9, 0x0904, 0x3373, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x3376, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7fc9, + 0x7984, 0xd184, 0x1904, 0x3341, 0x0804, 0x42e0, 0x0126, 0x2091, + 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, + 0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x6166, 0x11d8, + 0x080c, 0x642c, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, + 0x2019, 0x0004, 0x900e, 0x080c, 0x63b9, 0x1118, 0x2009, 0x0006, + 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, + 0x9108, 0x080c, 0x7fc9, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x3341, + 0x012e, 0x0804, 0x3373, 0x012e, 0x0804, 0x3376, 0x080c, 0x47b2, + 0x0904, 0x3376, 0x080c, 0x622d, 0x0904, 0x3373, 0x080c, 0x9746, + 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x8498, 0x0076, + 0x903e, 0x080c, 0x8387, 0x900e, 0x080c, 0xce23, 0x007e, 0x00ce, + 0x080c, 0x9762, 0x080c, 0x6398, 0x0804, 0x3341, 0x080c, 0x47b2, + 0x0904, 0x3376, 0x080c, 0x6398, 0x2208, 0x0804, 0x3341, 0x0156, + 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1906, 0x6810, 0x6914, 0x910a, + 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, 0x19b6, 0x7028, + 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, 0x9218, 0x00ce, + 0x00ee, 0x00de, 0x015e, 0x0804, 0x3341, 0x00f6, 0x0016, 0x907d, + 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, + 0x001e, 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804, + 0x3341, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x0126, + 0x2091, 0x8000, 0x080c, 0x52b1, 0x0128, 0x2009, 0x0007, 0x012e, + 0x0804, 0x3373, 0x012e, 0x6158, 0x9190, 0x3142, 0x2215, 0x9294, + 0x00ff, 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, 0x000a, + 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, + 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, + 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6f5c, + 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, + 0x0804, 0x3373, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3341, 0x6148, + 0x624c, 0x2019, 0x1955, 0x231c, 0x2001, 0x1956, 0x2004, 0x789a, + 0x0804, 0x3341, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, + 0x012e, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904, 0x3376, 0xba44, + 0xbb38, 0x0804, 0x3341, 0x080c, 0x0d65, 0x080c, 0x47ce, 0x2110, + 0x0904, 0x3376, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, + 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3373, + 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, + 0x9746, 0x080c, 0x9372, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c, + 0x8387, 0x900e, 0x080c, 0xce23, 0x007e, 0x00ce, 0x080c, 0x9762, + 0xb807, 0x0407, 0x012e, 0x0804, 0x3341, 0x6148, 0x624c, 0x7884, + 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, 0x831f, 0x9305, 0x6816, + 0x788c, 0x2069, 0x1955, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, + 0x1210, 0x2031, 0x07d0, 0x2069, 0x1956, 0x2d04, 0x266a, 0x789a, + 0x0804, 0x3341, 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, 0x603a, + 0x910e, 0xd1b4, 0x190c, 0x0eb4, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, + 0x2009, 0x196c, 0x200a, 0x78ac, 0x2011, 0x196d, 0x2012, 0x2069, + 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, + 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, 0x0116, 0x220c, + 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, 0x918c, 0xff7f, + 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, 0x190c, 0x0ecf, + 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, + 0x0804, 0x3341, 0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084, + 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838, + 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085, + 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, + 0x7888, 0x9025, 0x0904, 0x3376, 0x788c, 0x902d, 0x0904, 0x3376, + 0x900e, 0x080c, 0x6166, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, + 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x47ce, 0x0904, + 0x3376, 0x7888, 0x900d, 0x0904, 0x3376, 0x788c, 0x9005, 0x0904, + 0x3376, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x3341, 0x2011, + 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x52b1, 0x1904, 0x3373, + 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, + 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, + 0x9188, 0x3142, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1817, 0x2004, + 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, + 0x8000, 0x0006, 0x080c, 0x9a0f, 0x000e, 0x0510, 0x602e, 0x620a, + 0x7984, 0x00b6, 0x080c, 0x610c, 0x2b08, 0x00be, 0x1500, 0x6112, + 0x6023, 0x0001, 0x080c, 0x479b, 0x01d0, 0x9006, 0xa866, 0x7007, + 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x381a, 0x2900, + 0x6016, 0x2009, 0x0032, 0x080c, 0x9b03, 0x012e, 0x00ce, 0x0005, + 0x012e, 0x00ce, 0x0804, 0x3373, 0x00ce, 0x0804, 0x3376, 0x080c, + 0x9a65, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x3373, 0x0804, + 0x3341, 0x2061, 0x1a3d, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, + 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6350, 0x6070, 0x789a, + 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x3341, 0x900e, + 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3373, 0x080c, 0x6f5c, 0x0904, + 0x3373, 0x0126, 0x2091, 0x8000, 0x6250, 0x6070, 0x9202, 0x0248, + 0x9085, 0x0001, 0x080c, 0x2458, 0x080c, 0x54c1, 0x012e, 0x0804, + 0x3341, 0x012e, 0x0804, 0x3376, 0x0006, 0x0016, 0x00c6, 0x00e6, + 0x2001, 0x1978, 0x2070, 0x2061, 0x1853, 0x6008, 0x2072, 0x900e, + 0x2011, 0x1400, 0x080c, 0x8276, 0x7206, 0x00ee, 0x00ce, 0x001e, + 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, + 0x2021, 0x400b, 0x0804, 0x3343, 0x7884, 0xd0fc, 0x0148, 0x2001, + 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x3376, + 0x2001, 0x002a, 0x2004, 0x2069, 0x1853, 0x6908, 0x9102, 0x1230, + 0x012e, 0x0804, 0x3376, 0x012e, 0x0804, 0x3373, 0x080c, 0x99e4, + 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x38e5, 0x00c6, 0x080c, 0x479b, + 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, + 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, + 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, + 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, + 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, + 0x00fc, 0x8004, 0xa816, 0x080c, 0x3a6f, 0x0928, 0x7014, 0x2048, + 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, + 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x47e4, 0x701f, + 0x39ac, 0x7023, 0x0001, 0x012e, 0x0005, 0x080c, 0x9746, 0x0046, + 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, + 0x080c, 0x3854, 0x2001, 0x196e, 0x2003, 0x0000, 0x2021, 0x000a, + 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, + 0x60bf, 0x0012, 0x080c, 0x3ade, 0x080c, 0x3a9d, 0x00f6, 0x00e6, + 0x0086, 0x2940, 0x2071, 0x19b6, 0x2079, 0x0090, 0x00d6, 0x2069, + 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, + 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, + 0x3e4f, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3d7c, 0x080c, 0x3ca9, + 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, + 0x3ec3, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, + 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, + 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, + 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, + 0x715c, 0x9106, 0x1190, 0x2001, 0x181f, 0x2004, 0x9106, 0x1168, + 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, + 0x080c, 0x3cb3, 0x080c, 0x3a98, 0x0058, 0x080c, 0x3a98, 0x080c, + 0x3de7, 0x080c, 0x3d72, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, + 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, + 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, + 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, + 0xfffd, 0x2102, 0x080c, 0x12cd, 0x2009, 0x0028, 0x080c, 0x201d, + 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, 0x9762, 0x00fe, 0x00ee, + 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, + 0x196e, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x3341, 0x012e, + 0x2021, 0x400c, 0x0804, 0x3343, 0x0016, 0x0026, 0x0036, 0x0046, + 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, + 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3a08, + 0x2048, 0x1f04, 0x39bc, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, + 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, + 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, + 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, + 0x9080, 0x001b, 0x080c, 0x47e4, 0x701f, 0x39ac, 0x00b0, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, + 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fa0, + 0x000e, 0x080c, 0x47e7, 0x701f, 0x39ac, 0x015e, 0x00de, 0x009e, + 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, + 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x3a6d, + 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, + 0x080c, 0x6106, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, + 0xfffd, 0x080c, 0xbba1, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, + 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x3373, 0x0016, + 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, + 0x0156, 0x701f, 0x3a3f, 0x7007, 0x0003, 0x0804, 0x39fd, 0xa830, + 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3343, 0x0076, 0xad10, + 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, + 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, + 0x20a0, 0x0006, 0x080c, 0x0fa0, 0x000e, 0x080c, 0x47e7, 0x007e, + 0x701f, 0x39ac, 0x7023, 0x0001, 0x0005, 0x0804, 0x3341, 0x0156, + 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, + 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x479b, 0x001e, + 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006, + 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6, + 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005, + 0x2001, 0x196e, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, + 0x2061, 0x0200, 0x2001, 0x1979, 0x2004, 0x601a, 0x2061, 0x0100, + 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, + 0x479b, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, + 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, + 0x0090, 0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, + 0x0040, 0x080c, 0x201d, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, + 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, + 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, + 0x479b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, + 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a, + 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000, + 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000, + 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, + 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, + 0x0148, 0x080c, 0x27cf, 0x1130, 0x9006, 0x080c, 0x2739, 0x9006, + 0x080c, 0x271c, 0x7884, 0x9084, 0x0007, 0x0002, 0x3b29, 0x3b32, + 0x3b3b, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x012e, 0x0804, + 0x3376, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, + 0x3cfd, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, + 0x080c, 0x3cfd, 0x0078, 0x080c, 0x6f5c, 0x1128, 0x012e, 0x2009, + 0x0016, 0x0804, 0x3373, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, + 0x0804, 0x3343, 0x080c, 0x9746, 0x0086, 0x0096, 0x00a6, 0x00b6, + 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3854, 0x2009, 0x0101, + 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, + 0x080c, 0x3f9e, 0x080c, 0x3eee, 0x903e, 0x2720, 0x00f6, 0x00e6, + 0x0086, 0x2940, 0x2071, 0x19b6, 0x2079, 0x0090, 0x00d6, 0x2069, + 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, + 0x00de, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x080c, 0x27d7, 0x080c, + 0x27d7, 0x080c, 0x27d7, 0x080c, 0x27d7, 0x080c, 0x3e4f, 0x008e, + 0x00ee, 0x00fe, 0x080c, 0x3d7c, 0x2009, 0x9c40, 0x8109, 0x11b0, + 0x080c, 0x3cb3, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, + 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x008e, 0x2009, 0x0017, 0x080c, 0x3373, 0x0cf8, 0x2001, 0x020b, + 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, + 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, + 0x080c, 0x3d5a, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3cb3, + 0x0804, 0x3c5c, 0x080c, 0x3ec3, 0x080c, 0x3de7, 0x080c, 0x3d3d, + 0x080c, 0x3d72, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, + 0x8b58, 0x080c, 0x3cb3, 0x00fe, 0x0804, 0x3c5c, 0x00fe, 0x080c, + 0x3ca9, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, + 0x2502, 0x080c, 0x3cb3, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, + 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a3a, 0x2004, + 0x9086, 0x0000, 0x1904, 0x3bac, 0x2001, 0x032f, 0x2003, 0x00f6, + 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3c5c, 0x7884, + 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3c5c, 0xa013, + 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, + 0x2001, 0x1a3a, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, + 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, + 0xa05a, 0x2009, 0x0040, 0x080c, 0x201d, 0x2900, 0xa85a, 0xa813, + 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, + 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, + 0x1f04, 0x3c33, 0x00ce, 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, + 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, + 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, + 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, + 0x00ce, 0x00fe, 0x0804, 0x3b66, 0x001e, 0x00c6, 0x2001, 0x032a, + 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, + 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, + 0x2102, 0x080c, 0x12cd, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, + 0x01b0, 0x2009, 0x0028, 0x080c, 0x201d, 0x2001, 0x0227, 0x200c, + 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, 0x2892, 0x6052, 0x602f, + 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x080c, + 0x9762, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, + 0x1118, 0x012e, 0x0804, 0x3341, 0x012e, 0x2021, 0x400c, 0x0804, + 0x3343, 0x9085, 0x0001, 0x1d04, 0x3cb2, 0x2091, 0x6000, 0x8420, + 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, + 0x032a, 0x2003, 0x0004, 0x2001, 0x1a3a, 0x2003, 0x0000, 0x0071, + 0x2009, 0x0048, 0x080c, 0x201d, 0x2001, 0x0227, 0x2024, 0x2402, + 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, + 0x2071, 0x19b6, 0x7054, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, + 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, + 0x2009, 0x0040, 0x080c, 0x201d, 0x782c, 0xd0fc, 0x0d88, 0x080c, + 0x3ec3, 0x7054, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, + 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x201d, 0x782b, 0x0002, + 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, + 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x2438, 0x080c, + 0x284e, 0x080c, 0x2892, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, + 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, 0x61a8, 0x7820, 0xd09c, + 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, 0x7852, 0x2011, 0x0048, + 0x080c, 0x282b, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001, + 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x27f1, 0x2011, 0x0020, + 0x080c, 0x282b, 0x7843, 0x0000, 0x9006, 0x080c, 0x27f1, 0x2011, + 0x0048, 0x080c, 0x282b, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, + 0x00f6, 0x00e6, 0x2071, 0x1a3a, 0x2079, 0x0320, 0x2001, 0x0201, + 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, + 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, + 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, + 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, + 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, + 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, + 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, + 0x1979, 0x2004, 0x70e2, 0x080c, 0x3a8e, 0x1188, 0x2001, 0x181f, + 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, + 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, + 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 0x210c, 0x716e, 0x7063, + 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, + 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, + 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, + 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0092, + 0x7016, 0x080c, 0x3ec3, 0x00f6, 0x2071, 0x1a3a, 0x2079, 0x0320, + 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, + 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, + 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x3e4f, + 0x2011, 0x0001, 0x080c, 0x3e4f, 0x00fe, 0x00ee, 0x0005, 0x00f6, + 0x00e6, 0x2071, 0x1a3a, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, + 0x3e4c, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3e48, 0x7000, + 0x0002, 0x3e4c, 0x3dfd, 0x3e2d, 0x3e48, 0xd1bc, 0x1170, 0xd1dc, + 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x0904, + 0x3e4c, 0x080c, 0x3e4f, 0x0804, 0x3e4c, 0x00f6, 0x2079, 0x0300, + 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, + 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3d5a, + 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, + 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, + 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3df1, 0x2011, 0x0001, + 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, 0x0015, 0x1120, + 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, 0x0828, + 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0xa014, + 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, 0x2048, + 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, 0x0007, + 0x1a0c, 0x0d65, 0x9398, 0x3e7d, 0x231d, 0x083f, 0x9080, 0x0004, + 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, 0x0035, + 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, 0x0019, + 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3eba, 0x3eb1, 0x3ea8, + 0x3e9f, 0x3e96, 0x3e8d, 0x3e84, 0xa964, 0x7902, 0xa968, 0x7906, + 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, + 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, + 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, + 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, + 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, 0x7916, + 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, 0xa9c0, + 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, 0x7912, + 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, 0x19b6, + 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, + 0x9026, 0x7054, 0x0002, 0x3eea, 0x3ed6, 0x3ee1, 0x8001, 0x7056, + 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x190c, 0x3e4f, + 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, + 0x080c, 0x3e4f, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, + 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1979, 0x2004, 0x601a, + 0x2061, 0x0100, 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, + 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, + 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x479b, 0xa813, + 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, + 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, + 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3f66, 0x1d68, 0x2900, + 0xa85a, 0x00d0, 0x080c, 0x479b, 0xa813, 0x0019, 0xa817, 0x0001, + 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, + 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, + 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, 0x0100, + 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x201d, + 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, + 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a, + 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, + 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, + 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a, 0x700e, 0x810b, + 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, 0x702c, 0xd0fc, + 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, 0x7400, 0x7304, + 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, 0x080c, 0x479b, + 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, 0x00ae, + 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001, + 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, 0x0030, 0x2024, + 0x2001, 0x0031, 0x201c, 0x080c, 0x479b, 0x2940, 0xa813, 0x0019, + 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, + 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, + 0x9080, 0x0019, 0x009e, 0x080c, 0x3f66, 0x1d68, 0x2900, 0xa85a, + 0x00d8, 0x080c, 0x479b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, + 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, 0x2001, 0x0031, + 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa06e, + 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, 0x2003, 0x0004, + 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200, + 0x2102, 0xa017, 0x0000, 0x2001, 0x1a3a, 0x2003, 0x0003, 0x2001, + 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, + 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, + 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0013, + 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, 0x013c, + 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, + 0x3341, 0x7d98, 0x7c9c, 0x0804, 0x3438, 0x080c, 0x6f5c, 0x190c, + 0x5ba7, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x47e4, 0x701f, 0x4039, + 0x0005, 0x080c, 0x52ac, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, + 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904, 0x3376, + 0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, + 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, + 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, + 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, + 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x3376, 0x9288, 0x3142, + 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, 0x908a, + 0x007f, 0x1a04, 0x3376, 0x605a, 0x6888, 0x9084, 0x0030, 0x8004, + 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1980, 0x9080, 0x252b, + 0x2005, 0x200a, 0x2008, 0x2001, 0x0018, 0x080c, 0x9737, 0x2009, + 0x0390, 0x200b, 0x0400, 0x000e, 0x2009, 0x1981, 0x9080, 0x252f, + 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x3376, 0x908a, + 0x0841, 0x1a04, 0x3376, 0x9084, 0x0007, 0x1904, 0x3376, 0x680c, + 0x9005, 0x0904, 0x3376, 0x6810, 0x9005, 0x0904, 0x3376, 0x6848, + 0x6940, 0x910a, 0x1a04, 0x3376, 0x8001, 0x0904, 0x3376, 0x684c, + 0x6944, 0x910a, 0x1a04, 0x3376, 0x8001, 0x0904, 0x3376, 0x6814, + 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, 0x080c, + 0x728d, 0x080c, 0x65dd, 0x080c, 0x6612, 0x6808, 0x602a, 0x080c, + 0x1f8f, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, + 0x0000, 0x0036, 0x6b08, 0x080c, 0x2492, 0x003e, 0x6000, 0x9086, + 0x0000, 0x1904, 0x41a5, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, + 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, + 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, + 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, + 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, + 0x1982, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199c, + 0x20e9, 0x0001, 0x4001, 0x080c, 0x812d, 0x00c6, 0x900e, 0x20a9, + 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, + 0x8109, 0x080c, 0x784e, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, + 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, + 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x411d, 0x00ce, + 0x00c6, 0x2061, 0x196b, 0x2063, 0x0001, 0x9006, 0x080c, 0x2739, + 0x9006, 0x080c, 0x271c, 0x0000, 0x00ce, 0x00e6, 0x2c70, 0x080c, + 0x0e9c, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, + 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, + 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x194d, + 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, + 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2507, + 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, + 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6f5c, 0x0128, + 0x080c, 0x4bb0, 0x0110, 0x080c, 0x2458, 0x60d0, 0x9005, 0x01c0, + 0x6003, 0x0001, 0x2009, 0x418d, 0x00d0, 0x080c, 0x6f5c, 0x1168, + 0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c, 0x80bc, + 0x080c, 0x7261, 0x080c, 0x6e8d, 0x0040, 0x080c, 0x5a9d, 0x0028, + 0x6003, 0x0004, 0x2009, 0x41a5, 0x0010, 0x0804, 0x3341, 0x2001, + 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, + 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, 0x0000, + 0x0904, 0x3373, 0x2069, 0x1853, 0x7890, 0x6842, 0x7894, 0x6846, + 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, + 0x0001, 0x0804, 0x47e7, 0x9006, 0x080c, 0x2458, 0x81ff, 0x1904, + 0x3373, 0x080c, 0x6f5c, 0x11b0, 0x080c, 0x725c, 0x080c, 0x5be2, + 0x080c, 0x313d, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xbdd7, + 0x0130, 0x080c, 0x6f7f, 0x1118, 0x080c, 0x6f30, 0x0038, 0x080c, + 0x6e8d, 0x0020, 0x080c, 0x5ba7, 0x080c, 0x5a9d, 0x0804, 0x3341, + 0x81ff, 0x1904, 0x3373, 0x080c, 0x6f5c, 0x1110, 0x0804, 0x3373, + 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009, + 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, + 0x2039, 0x0001, 0x080c, 0x47e7, 0x701f, 0x333f, 0x012e, 0x0005, + 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, 0x20e9, + 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x6558, 0x9588, + 0x3142, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, + 0x2100, 0x9506, 0x01a8, 0x080c, 0x6166, 0x1190, 0xb814, 0x821c, + 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, + 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, + 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, + 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, 0x2099, + 0x1d80, 0x080c, 0x5b32, 0x0804, 0x41fd, 0x080c, 0x47ce, 0x0904, + 0x3376, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, + 0x080c, 0x529d, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, + 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x3138, + 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, + 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, + 0xb88d, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, + 0x701f, 0x428b, 0x0005, 0x080c, 0x47ce, 0x0904, 0x3376, 0x20a9, + 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, + 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, + 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, + 0x0fa0, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, + 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fa0, + 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, + 0x47e7, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376, + 0x080c, 0x63a7, 0x0904, 0x3373, 0x0058, 0xa878, 0x9005, 0x0120, + 0x2009, 0x0004, 0x0804, 0x3373, 0xa974, 0xaa94, 0x0804, 0x3341, + 0x080c, 0x52a5, 0x0904, 0x3341, 0x701f, 0x42d5, 0x7007, 0x0003, + 0x0005, 0x81ff, 0x1904, 0x3373, 0x7888, 0x908a, 0x1000, 0x1a04, + 0x3376, 0x080c, 0x47ce, 0x0904, 0x3376, 0x080c, 0x655d, 0x0120, + 0x080c, 0x6565, 0x1904, 0x3376, 0x080c, 0x642c, 0x0904, 0x3373, + 0x2019, 0x0004, 0x900e, 0x080c, 0x63b9, 0x0904, 0x3373, 0x7984, + 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, + 0x47cc, 0x01e0, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565, 0x11b0, + 0x080c, 0x642c, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019, + 0x0004, 0x080c, 0x63b9, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, + 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, + 0x080c, 0x52a5, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, + 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, 0x9506, 0x0110, + 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x6166, 0x1138, + 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7fc9, 0x0005, + 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376, 0x080c, + 0x622d, 0x0904, 0x3373, 0x080c, 0x63b0, 0x0904, 0x3373, 0x0804, + 0x42e0, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376, + 0x080c, 0x655d, 0x0120, 0x080c, 0x6565, 0x1904, 0x3376, 0x080c, + 0x622d, 0x0904, 0x3373, 0x080c, 0x639e, 0x0904, 0x3373, 0x0804, + 0x42e0, 0x6100, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904, 0x3376, + 0x080c, 0x52b1, 0x1904, 0x3373, 0x79a8, 0xd184, 0x1158, 0xb834, + 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28, + 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a, + 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804, + 0x3341, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, + 0x1a04, 0x3373, 0x6258, 0x7884, 0x9206, 0x1560, 0x2031, 0x1848, + 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084, + 0x0080, 0x1118, 0x000e, 0x0804, 0x47e7, 0x000e, 0x2031, 0x0000, + 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, + 0xa392, 0xa496, 0xa59a, 0x080c, 0x1103, 0x7007, 0x0002, 0x701f, + 0x440a, 0x0005, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47ce, 0x0904, + 0x3376, 0x080c, 0x655d, 0x1904, 0x3373, 0x00c6, 0x080c, 0x479b, + 0x00ce, 0x0904, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0x7ea8, 0x080c, 0xb833, 0x0904, 0x3373, 0x7007, 0x0003, 0x701f, + 0x440e, 0x0005, 0x080c, 0x400b, 0x0804, 0x3341, 0xa830, 0x9086, + 0x0100, 0x0904, 0x3373, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x0804, 0x47e7, 0x9006, 0x080c, 0x2458, 0x78a8, + 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3373, + 0x080c, 0x6f5c, 0x0110, 0x080c, 0x5ba7, 0x7888, 0x908a, 0x1000, + 0x1a04, 0x3376, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, + 0x1a04, 0x3376, 0x2100, 0x080c, 0x2422, 0x0026, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x2061, 0x19d2, 0x601b, 0x0000, 0x601f, 0x0000, + 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x6f5c, 0x1158, 0x080c, + 0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c, 0x6fa3, 0x080c, + 0x6e8d, 0x00f0, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, + 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f, + 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, + 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5acd, 0x080c, 0x807a, + 0x7984, 0x080c, 0x6f5c, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, + 0x4343, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3341, 0x7984, 0x080c, + 0x6106, 0x2b08, 0x1904, 0x3376, 0x0804, 0x3341, 0x81ff, 0x0120, + 0x2009, 0x0001, 0x0804, 0x3373, 0x60d8, 0xd0ac, 0x1130, 0xd09c, + 0x1120, 0x2009, 0x0005, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120, + 0x2009, 0x0002, 0x0804, 0x3373, 0x7984, 0x9192, 0x0021, 0x1a04, + 0x3376, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, + 0x702a, 0xaf60, 0x7736, 0x080c, 0x47e4, 0x701f, 0x44c6, 0x7880, + 0x9086, 0x006e, 0x0110, 0x701f, 0x4d62, 0x0005, 0x2009, 0x0080, + 0x080c, 0x6166, 0x1118, 0x080c, 0x655d, 0x0120, 0x2021, 0x400a, + 0x0804, 0x3343, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, + 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x455f, 0x90be, + 0x0112, 0x0904, 0x455f, 0x90be, 0x0113, 0x0904, 0x455f, 0x90be, + 0x0114, 0x0904, 0x455f, 0x90be, 0x0117, 0x0904, 0x455f, 0x90be, + 0x011a, 0x0904, 0x455f, 0x90be, 0x011c, 0x0904, 0x455f, 0x90be, + 0x0121, 0x0904, 0x4546, 0x90be, 0x0131, 0x0904, 0x4546, 0x90be, + 0x0171, 0x0904, 0x455f, 0x90be, 0x0173, 0x0904, 0x455f, 0x90be, + 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x456a, 0x90be, + 0x0212, 0x0904, 0x4553, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, + 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, + 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, + 0x05b0, 0x009e, 0x00de, 0x0804, 0x3376, 0x7028, 0x9080, 0x0010, + 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, + 0x45a8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, + 0x20e8, 0x20a9, 0x0001, 0x080c, 0x45a8, 0x00c8, 0x7028, 0x9080, + 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, + 0x080c, 0x45b5, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, + 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x45b5, 0x7028, + 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, + 0x0001, 0x04f1, 0x00c6, 0x080c, 0x479b, 0x0550, 0xa868, 0xc0fd, + 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, + 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, + 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, + 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xb84e, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x459f, 0x0005, + 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3373, 0xa820, + 0x9086, 0x8001, 0x1904, 0x3341, 0x2009, 0x0004, 0x0804, 0x3373, + 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, + 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, + 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, + 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, + 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x60d8, 0xd0ac, + 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x3373, 0xd09c, + 0x1120, 0x2009, 0x0005, 0x0804, 0x3373, 0x7984, 0x78a8, 0x2040, + 0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3376, 0x9186, + 0x00ff, 0x0904, 0x3376, 0x9182, 0x0800, 0x1a04, 0x3376, 0x7a8c, + 0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e, 0x0904, 0x3376, + 0x99cc, 0xff00, 0x0904, 0x3376, 0x0126, 0x2091, 0x8000, 0x0026, + 0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0118, 0x2001, 0x4009, + 0x0458, 0x080c, 0x46b5, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, + 0x0006, 0x900e, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc, + 0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, + 0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, + 0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, + 0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3343, + 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, + 0x9ad6, 0x0904, 0x4682, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2e58, + 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x479b, 0x00ce, 0x2b70, 0x1158, + 0x080c, 0x9a65, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, + 0x0002, 0x0804, 0x3373, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, + 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, + 0x2fc1, 0x6023, 0x0001, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, + 0x080c, 0x60b7, 0x2009, 0x0002, 0x080c, 0x9b03, 0x78a8, 0xd094, + 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8c4, 0xc08d, 0xb8c6, + 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, + 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4691, + 0x0005, 0xa830, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, + 0x0804, 0x3343, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, + 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x51fa, 0x900e, 0xa868, + 0xd0f4, 0x1904, 0x3341, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341, 0x00e6, 0x00d6, 0x0096, + 0x83ff, 0x0904, 0x46fd, 0x902e, 0x080c, 0x99e4, 0x0130, 0x9026, + 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, + 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, + 0x15e8, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, + 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, + 0x00ff, 0x11d8, 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, + 0x11b8, 0xbe14, 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, + 0xd884, 0x0568, 0xd894, 0x1558, 0x080c, 0x655d, 0x1540, 0x2001, + 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, + 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, + 0x080c, 0x99e4, 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, + 0x1f04, 0x46cb, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, + 0x0001, 0x0030, 0x080c, 0x6106, 0x1dd0, 0xbb12, 0xba16, 0x9006, + 0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, + 0x0001, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, + 0x9005, 0x0904, 0x3376, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, + 0x1a04, 0x3376, 0x2010, 0x2918, 0x080c, 0x2f5b, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4750, 0x0005, + 0xa830, 0x9086, 0x0100, 0x1904, 0x3341, 0x2009, 0x0004, 0x0804, + 0x3373, 0x7984, 0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04, + 0x3376, 0x9186, 0x00ff, 0x0904, 0x3376, 0x9182, 0x0800, 0x1a04, + 0x3376, 0x2001, 0x9000, 0x080c, 0x5255, 0x1904, 0x3373, 0x0804, + 0x3341, 0xa998, 0x080c, 0x99e4, 0x1118, 0x9182, 0x007f, 0x0280, + 0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, + 0x080c, 0x5255, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, + 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, + 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, + 0x2009, 0x000a, 0x0c48, 0x080c, 0x1023, 0x0198, 0x9006, 0xa802, + 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, + 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, + 0x0001, 0x0005, 0x7984, 0x080c, 0x6166, 0x1130, 0x7e88, 0x9684, + 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, + 0x080c, 0x6166, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, + 0x080c, 0x6166, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, + 0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1055, 0x0cc8, + 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, + 0x0000, 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, + 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1103, 0x7007, 0x0002, + 0x701f, 0x3341, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, + 0x0000, 0x2001, 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4818, + 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x0804, 0x487e, + 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, + 0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, + 0x080c, 0x1023, 0x0904, 0x4876, 0xa84b, 0x0000, 0x2900, 0x7046, + 0x2001, 0x0002, 0x9080, 0x1cca, 0x2005, 0xa846, 0x0098, 0x7038, + 0x90e0, 0x0004, 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, + 0x18b0, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, + 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, + 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x2060, 0x001e, + 0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x1023, 0x1130, + 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, + 0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, + 0x0002, 0x9080, 0x1cca, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, + 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, + 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x48a0, 0x48a0, 0x48a2, + 0x48a0, 0x48a0, 0x48a0, 0x48a6, 0x48a0, 0x48a0, 0x48a0, 0x48aa, + 0x48a0, 0x48a0, 0x48a0, 0x48ae, 0x48a0, 0x48a0, 0x48a0, 0x48b2, + 0x48a0, 0x48a0, 0x48a0, 0x48b6, 0x48a0, 0x48a0, 0x48a0, 0x48bb, + 0x080c, 0x0d65, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, + 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, + 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, + 0xa4ce, 0x0804, 0x4879, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4879, + 0x00e6, 0x2071, 0x1894, 0x7048, 0x9005, 0x0904, 0x4952, 0x0126, + 0x2091, 0x8000, 0x0e04, 0x4951, 0x00f6, 0x2079, 0x0000, 0x00c6, + 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, + 0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d65, + 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4954, + 0xa804, 0x9005, 0x090c, 0x0d65, 0x7042, 0x2938, 0x2040, 0xa003, + 0x0000, 0x2001, 0x0002, 0x9080, 0x1cca, 0x2005, 0xa04a, 0x0804, + 0x4954, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, + 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, + 0x87ff, 0x0118, 0x2748, 0x080c, 0x1055, 0x7048, 0x8001, 0x704a, + 0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1055, + 0x9006, 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, + 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, + 0x0004, 0x90fa, 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, + 0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0d65, 0x2048, + 0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, + 0x1cca, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, + 0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, + 0x4973, 0x4973, 0x4975, 0x4973, 0x4973, 0x4973, 0x497a, 0x4973, + 0x4973, 0x4973, 0x497f, 0x4973, 0x4973, 0x4973, 0x4984, 0x4973, + 0x4973, 0x4973, 0x4989, 0x4973, 0x4973, 0x4973, 0x498e, 0x4973, + 0x4973, 0x4973, 0x4993, 0x080c, 0x0d65, 0xaa74, 0xab78, 0xac7c, + 0x0804, 0x48ff, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x48ff, 0xaa94, + 0xab98, 0xac9c, 0x0804, 0x48ff, 0xaaa4, 0xaba8, 0xacac, 0x0804, + 0x48ff, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x48ff, 0xaac4, 0xabc8, + 0xaccc, 0x0804, 0x48ff, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x48ff, + 0x0026, 0x080c, 0x529d, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, + 0x47fb, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3373, 0x0126, 0x2091, + 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6f5c, + 0x1158, 0x080c, 0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c, + 0x6fa3, 0x080c, 0x6e8d, 0x0010, 0x080c, 0x5a9d, 0x012e, 0x0804, + 0x3341, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x080c, + 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x080c, 0x6555, + 0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0x0026, 0x2011, 0x0010, + 0x080c, 0x6581, 0x002e, 0x0120, 0x2009, 0x4009, 0x0804, 0x3373, + 0x080c, 0x3138, 0x0128, 0x7984, 0x080c, 0x6106, 0x1904, 0x3376, + 0x080c, 0x47ce, 0x0904, 0x3376, 0x2b00, 0x7026, 0x080c, 0x655d, + 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x6455, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341, + 0x080c, 0x479b, 0x0904, 0x3373, 0x9006, 0xa866, 0xa832, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xb8f0, 0x0904, 0x3373, 0x7888, 0xd094, + 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x7007, 0x0003, 0x701f, 0x4a65, + 0x0005, 0x2061, 0x1800, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1578, + 0x080c, 0x6555, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x3138, + 0x0120, 0xa998, 0x080c, 0x6106, 0x1530, 0x080c, 0x47cc, 0x0518, + 0x080c, 0x655d, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, + 0x080c, 0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, + 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xb8f0, 0x11e0, 0xa89c, + 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x2009, 0x0003, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, + 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x2008, 0x918e, + 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3343, 0x9086, 0x0100, + 0x7024, 0x2058, 0x1110, 0x0804, 0x51fa, 0x900e, 0x080c, 0x6455, + 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341, + 0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x7f84, + 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x479b, 0x1120, 0x2009, + 0x0002, 0x0804, 0x3373, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, + 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, + 0x6166, 0x1904, 0x4b03, 0x080c, 0x655d, 0x0120, 0x080c, 0x6565, + 0x1904, 0x4b03, 0x080c, 0x6555, 0x1130, 0x080c, 0x6455, 0x1118, + 0xd79c, 0x0904, 0x4b03, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, + 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, + 0x0002, 0x080c, 0x45b5, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, + 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x45b5, 0x4104, 0xd794, 0x0528, + 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, + 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, + 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, + 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x45a8, 0x9c80, 0x0026, 0x2098, + 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, + 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x99e4, 0x0118, 0x9186, + 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, + 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, + 0x9686, 0x0028, 0x0150, 0x0804, 0x4a9f, 0x86ff, 0x1120, 0x7124, + 0x810b, 0x0804, 0x3341, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, + 0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa67a, + 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, + 0x080c, 0x1103, 0x7007, 0x0002, 0x701f, 0x4b3f, 0x0005, 0x7030, + 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, + 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, + 0x0804, 0x4a9f, 0x7124, 0x810b, 0x0804, 0x3341, 0x2029, 0x007e, + 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, + 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9184, 0x00ff, + 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9284, + 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, + 0x3376, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, + 0x0a04, 0x3376, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, + 0x3376, 0x9502, 0x0a04, 0x3376, 0x9384, 0x00ff, 0x90e2, 0x0020, + 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9484, 0xff00, 0x8007, + 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9484, + 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, + 0x2061, 0x1958, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3341, + 0x0006, 0x080c, 0x529d, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, + 0x52a1, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, 0x82ff, + 0x1118, 0x7986, 0x0804, 0x3341, 0x83ff, 0x1904, 0x3376, 0x2001, + 0xfff0, 0x9200, 0x1a04, 0x3376, 0x2019, 0xffff, 0x6074, 0x9302, + 0x9200, 0x0a04, 0x3376, 0x7986, 0x6272, 0x0804, 0x3341, 0x080c, + 0x52b1, 0x1904, 0x3373, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, + 0x479b, 0x0904, 0x3373, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, + 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, + 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655d, 0x0118, 0x080c, + 0x6565, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, + 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, + 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, + 0x0003, 0x080c, 0x8276, 0x2208, 0x0804, 0x3341, 0x7033, 0x0001, + 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, 0xa06b, + 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, + 0xa696, 0xa79a, 0x080c, 0x1103, 0x7007, 0x0002, 0x701f, 0x4c31, + 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, + 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, 0xa694, + 0xa798, 0x0804, 0x4bef, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, + 0x8276, 0x2208, 0x0804, 0x3341, 0x00f6, 0x00e6, 0x080c, 0x52b1, + 0x2009, 0x0007, 0x1904, 0x4cc4, 0x2071, 0x1894, 0x745c, 0x84ff, + 0x2009, 0x000e, 0x1904, 0x4cc4, 0xac9c, 0xad98, 0xaea4, 0xafa0, + 0x0096, 0x080c, 0x103c, 0x2009, 0x0002, 0x0904, 0x4cc4, 0x2900, + 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, + 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, + 0x0178, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565, 0x1148, 0xb814, + 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, + 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, + 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8276, + 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, + 0x0d65, 0x2148, 0x080c, 0x1055, 0x9006, 0x705e, 0x918d, 0x0001, + 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, + 0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, + 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4cd0, 0x000e, 0xa0a2, + 0x080c, 0x1103, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, + 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 0x00e6, 0x2071, 0x1894, + 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, + 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, + 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, + 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, + 0x900e, 0x2001, 0x0003, 0x080c, 0x8276, 0xaa9a, 0x715c, 0x81ff, + 0x090c, 0x0d65, 0x2148, 0x080c, 0x1055, 0x705f, 0x0000, 0xa0a0, + 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0xa09f, + 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, + 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565, + 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, + 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, + 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, + 0x4000, 0x715c, 0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, 0x1055, + 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, + 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0xa09f, 0x0000, 0xa0a3, + 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, + 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x1103, 0x9006, + 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, + 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x3376, + 0xa884, 0xa988, 0x080c, 0x23ef, 0x1518, 0x080c, 0x6106, 0x1500, + 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x479b, 0x01c8, 0x080c, + 0x479b, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, + 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xb86e, 0x1120, 0x2009, + 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4d9d, 0x0005, + 0x009e, 0x2009, 0x0002, 0x0804, 0x3373, 0x7124, 0x080c, 0x30d1, + 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x3373, + 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, + 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, + 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, + 0x0fa0, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, 0x2c44, + 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, + 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, + 0x007e, 0x0804, 0x47e7, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, + 0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, 0xa772, + 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1103, + 0x7007, 0x0002, 0x701f, 0x4df9, 0x0005, 0x000e, 0x007e, 0x0804, + 0x3376, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, + 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, + 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fa0, + 0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, + 0xa598, 0x2009, 0x002a, 0x0804, 0x47e7, 0x81ff, 0x1904, 0x3373, + 0x798c, 0x2001, 0x194f, 0x2102, 0x080c, 0x47b2, 0x0904, 0x3376, + 0x080c, 0x655d, 0x0120, 0x080c, 0x6565, 0x1904, 0x3376, 0x080c, + 0x622d, 0x0904, 0x3373, 0x0126, 0x2091, 0x8000, 0x080c, 0x63c2, + 0x012e, 0x0904, 0x3373, 0x0804, 0x42e0, 0xa9a0, 0x2001, 0x194f, + 0xc18d, 0x2102, 0x080c, 0x47bf, 0x01a0, 0x080c, 0x655d, 0x0118, + 0x080c, 0x6565, 0x1170, 0x080c, 0x622d, 0x2009, 0x0002, 0x0128, + 0x080c, 0x63c2, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, + 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, + 0x0005, 0xa897, 0x4000, 0x080c, 0x52a5, 0x0110, 0x9006, 0x0018, + 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, + 0x1118, 0xd084, 0x0904, 0x4255, 0x080c, 0x47ce, 0x0904, 0x3376, + 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x080c, + 0x655d, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, + 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, + 0x529d, 0xd0b4, 0x0904, 0x428f, 0x7884, 0x908e, 0x007e, 0x0904, + 0x428f, 0x908e, 0x007f, 0x0904, 0x428f, 0x908e, 0x0080, 0x0904, + 0x428f, 0xb800, 0xd08c, 0x1904, 0x428f, 0xa867, 0x0000, 0xa868, + 0xc0fd, 0xa86a, 0x080c, 0xb88d, 0x1120, 0x2009, 0x0003, 0x0804, + 0x3373, 0x7007, 0x0003, 0x701f, 0x4eb6, 0x0005, 0x080c, 0x47ce, + 0x0904, 0x3376, 0x0804, 0x428f, 0x080c, 0x3138, 0x0108, 0x0005, + 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, + 0x3373, 0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, + 0x080c, 0x6555, 0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0xb89c, + 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x428f, 0x9006, 0xa866, 0xa832, + 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb8f0, 0x1120, 0x2009, 0x0003, + 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4eef, 0x0005, 0xa830, + 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x51fa, 0x080c, + 0x47ce, 0x0904, 0x3376, 0x0804, 0x4e88, 0x81ff, 0x2009, 0x0001, + 0x1904, 0x3373, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1904, 0x3373, + 0x080c, 0x6555, 0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0x080c, + 0x47ce, 0x0904, 0x3376, 0x080c, 0x655d, 0x2009, 0x0009, 0x1904, + 0x3373, 0x080c, 0x479b, 0x2009, 0x0002, 0x0904, 0x3373, 0x9006, + 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, + 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, + 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3376, 0xc0e5, 0xa952, + 0xa956, 0xa83e, 0x080c, 0xbb53, 0x2009, 0x0003, 0x0904, 0x3373, + 0x7007, 0x0003, 0x701f, 0x4f45, 0x0005, 0xa830, 0x9086, 0x0100, + 0x2009, 0x0004, 0x0904, 0x3373, 0x0804, 0x3341, 0x7aa8, 0x9284, + 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x52b1, 0x1188, 0x2009, + 0x0014, 0x0804, 0x3373, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, + 0x1904, 0x3373, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1904, 0x3373, + 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5278, 0x0804, 0x3341, + 0xd2fc, 0x0158, 0x080c, 0x47ce, 0x0904, 0x3376, 0x7984, 0x9284, + 0x9000, 0x080c, 0x5255, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904, + 0x3376, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, + 0x1904, 0x502e, 0x080c, 0x479b, 0x2009, 0x0002, 0x0904, 0x502e, + 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0x080c, 0x47e4, 0x701f, 0x4f9f, 0x0005, 0xa86c, + 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, + 0xff00, 0x0110, 0x1904, 0x3376, 0xa866, 0xa832, 0xa868, 0xc0fd, + 0xa86a, 0x080c, 0x47ce, 0x1110, 0x0804, 0x3376, 0x2009, 0x0043, + 0x080c, 0xbbbb, 0x2009, 0x0003, 0x0904, 0x502e, 0x7007, 0x0003, + 0x701f, 0x4fc3, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, + 0x0904, 0x502e, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x5255, + 0x0804, 0x3341, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, + 0x0168, 0x080c, 0x52b1, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, + 0x1800, 0x080c, 0x52b1, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, + 0x9284, 0x5000, 0x080c, 0x5278, 0x0050, 0xd2fc, 0x0178, 0x080c, + 0x47cc, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x5255, 0xa87b, + 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x47cc, + 0x0510, 0x080c, 0x655d, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, + 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, + 0x1190, 0x080c, 0x47cc, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, + 0xbbbb, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, + 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, + 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, + 0x0904, 0x3373, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, + 0x5255, 0x001e, 0x1904, 0x3373, 0x0804, 0x3341, 0x00f6, 0x2d78, + 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, + 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5255, 0x001e, 0x9085, 0x0001, + 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x080c, + 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x7984, 0x7ea8, + 0x96b4, 0x00ff, 0x080c, 0x6166, 0x1904, 0x3376, 0x9186, 0x007f, + 0x0138, 0x080c, 0x655d, 0x0120, 0x2009, 0x0009, 0x0804, 0x3373, + 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0xa867, + 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, + 0x080c, 0xb8a7, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, + 0x0003, 0x701f, 0x508c, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, + 0x1120, 0x2009, 0x0004, 0x0804, 0x3373, 0xa8e0, 0xa866, 0xa810, + 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, + 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, + 0x7d98, 0x0804, 0x47e7, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3373, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, + 0x82ff, 0x1118, 0x7023, 0x1982, 0x0040, 0x92c6, 0x0001, 0x1118, + 0x7023, 0x199c, 0x0010, 0x0804, 0x3376, 0x2009, 0x001a, 0x7a8c, + 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, + 0x47e4, 0x701f, 0x50dc, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001, + 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, + 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3341, 0x080c, + 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x7984, 0x9194, + 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1982, + 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199c, 0x0010, 0x0804, + 0x3376, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, + 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, + 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x47e7, + 0x7884, 0x908a, 0x1000, 0x1a04, 0x3376, 0x0126, 0x2091, 0x8000, + 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d2, 0x6142, + 0x00ce, 0x012e, 0x0804, 0x3341, 0x00c6, 0x080c, 0x6f5c, 0x1160, + 0x080c, 0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c, 0x6fa3, + 0x080c, 0x6e8d, 0x080c, 0x0d65, 0x2061, 0x1800, 0x6030, 0xc09d, + 0x6032, 0x080c, 0x5a9d, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, + 0x2004, 0x908e, 0x0000, 0x0904, 0x3373, 0x7884, 0x9005, 0x0188, + 0x7888, 0x2061, 0x196b, 0x2c0c, 0x2062, 0x080c, 0x27bf, 0x01a0, + 0x080c, 0x27c7, 0x0188, 0x080c, 0x27cf, 0x0170, 0x2162, 0x0804, + 0x3376, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, + 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, + 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0x9746, 0x0026, + 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad, + 0x002e, 0x080c, 0x9070, 0x0036, 0x901e, 0x080c, 0x90f0, 0x003e, + 0x080c, 0x9762, 0x60e3, 0x0000, 0x080c, 0xd427, 0x080c, 0xd442, + 0x9085, 0x0001, 0x080c, 0x6fa3, 0x9006, 0x080c, 0x27f1, 0x2001, + 0x1800, 0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x282b, + 0x002e, 0x00ce, 0x0804, 0x3341, 0x81ff, 0x0120, 0x2009, 0x0001, + 0x0804, 0x3373, 0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, + 0x3373, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6166, 0x1904, + 0x3376, 0x9186, 0x007f, 0x0138, 0x080c, 0x655d, 0x0120, 0x2009, + 0x0009, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, + 0x0804, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, + 0xb8aa, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, + 0x701f, 0x51e3, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, + 0x0004, 0x0804, 0x3373, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, + 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, + 0x0804, 0x47e7, 0xa898, 0x9086, 0x000d, 0x1904, 0x3373, 0x2021, + 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5207, 0x0010, 0x012e, + 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, + 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, + 0xa9a8, 0x799e, 0x080c, 0x47d7, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11b5, 0x7007, 0x0001, 0x2091, 0x5000, + 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, + 0x2061, 0x19d2, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, + 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, + 0x605e, 0x2001, 0x19e0, 0x2044, 0x2001, 0x19e7, 0xa076, 0xa060, + 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, + 0x0000, 0x00ce, 0x012e, 0x0804, 0x3341, 0x0126, 0x2091, 0x8000, + 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb712, + 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, + 0x0160, 0x080c, 0x5bfc, 0x080c, 0x99e4, 0x0110, 0xb817, 0x0000, + 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, + 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, + 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, + 0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, + 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, + 0x1f04, 0x5280, 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004, + 0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, + 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, + 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, + 0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, + 0x0005, 0x080c, 0x479b, 0x080c, 0x0f2a, 0x2100, 0x2238, 0x7d84, + 0x7c88, 0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3376, + 0x810c, 0x080c, 0x47e4, 0x701f, 0x52d6, 0x0005, 0x2079, 0x0000, + 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18ae, + 0x2c44, 0xa770, 0xa074, 0x2071, 0x1894, 0x080c, 0x47e7, 0x701f, + 0x52ea, 0x0005, 0x2061, 0x18ae, 0x2c44, 0xa074, 0x2048, 0x9006, + 0xa802, 0xa806, 0x0804, 0x3341, 0x0126, 0x0156, 0x0136, 0x0146, + 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, + 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, + 0x0118, 0x080c, 0x549d, 0x0068, 0xd08c, 0x0118, 0x080c, 0x53a6, + 0x0040, 0xd094, 0x0118, 0x080c, 0x5376, 0x0018, 0xd09c, 0x0108, + 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, + 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, + 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7094, 0x9005, 0x000e, + 0x0120, 0x7097, 0x0000, 0x708f, 0x0000, 0x624c, 0x9286, 0xf0f0, + 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, + 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, + 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, + 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x00f0, 0x6040, + 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7083, + 0x0000, 0x709f, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, + 0x1d80, 0x200b, 0x0000, 0x7093, 0x0000, 0x7087, 0x000f, 0x2009, + 0x000f, 0x2011, 0x5a40, 0x080c, 0x807a, 0x0005, 0x2001, 0x1875, + 0x2004, 0xd08c, 0x0110, 0x705b, 0xffff, 0x7084, 0x9005, 0x1528, + 0x2011, 0x5a40, 0x080c, 0x7fbb, 0x6040, 0x9094, 0x0010, 0x9285, + 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, + 0x538c, 0x6242, 0x7097, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, + 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7097, 0x0000, 0x708b, + 0x0000, 0x9006, 0x080c, 0x5be7, 0x0000, 0x0005, 0x7088, 0x908a, + 0x0003, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x53b0, 0x5401, 0x549c, + 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708b, 0x0001, 0x2001, + 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, + 0x9084, 0x00fc, 0x0120, 0x1f04, 0x53bf, 0x080c, 0x0d65, 0x68a0, + 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, + 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5bc3, 0x2079, 0x1d00, + 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, + 0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c, + 0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, + 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, + 0x080c, 0x5a71, 0x00fe, 0x9006, 0x708e, 0x6043, 0x0008, 0x6042, + 0x0005, 0x00f6, 0x708c, 0x708f, 0x0000, 0x9025, 0x0904, 0x5479, + 0x6020, 0xd0b4, 0x1904, 0x5477, 0x719c, 0x81ff, 0x0904, 0x5465, + 0x9486, 0x000c, 0x1904, 0x5472, 0x9480, 0x0018, 0x8004, 0x20a8, + 0x080c, 0x5bbc, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304, + 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x541e, 0x6043, 0x0004, + 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, + 0x6043, 0x0006, 0x708b, 0x0002, 0x7097, 0x0002, 0x2009, 0x07d0, + 0x2011, 0x5a47, 0x080c, 0x807a, 0x080c, 0x5bc3, 0x04c0, 0x080c, + 0x5bbc, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, + 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, + 0x0190, 0x080c, 0x5bbc, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, + 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, + 0x1f04, 0x5459, 0x0078, 0x709f, 0x0000, 0x080c, 0x5bbc, 0x20e1, + 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9, + 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, + 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, + 0x080c, 0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, + 0x19c3, 0x2013, 0x0000, 0x708f, 0x0000, 0x60a3, 0x0056, 0x60a7, + 0x9575, 0x080c, 0x8e14, 0x08d8, 0x0005, 0x7094, 0x908a, 0x001d, + 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x54ce, 0x54e1, 0x550a, 0x552a, + 0x5550, 0x557f, 0x55a5, 0x55dd, 0x5603, 0x5631, 0x566c, 0x56a4, + 0x56c2, 0x56ed, 0x570f, 0x572a, 0x5734, 0x5768, 0x578e, 0x57bd, + 0x57e3, 0x581b, 0x585f, 0x589c, 0x58bd, 0x5916, 0x5938, 0x5966, + 0x5966, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, + 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, + 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, + 0x7097, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5a47, 0x080c, 0x807a, + 0x0005, 0x00f6, 0x708c, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, + 0xd0b4, 0x11f0, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, + 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, 0x5a47, 0x080c, + 0x7fbb, 0x7097, 0x0010, 0x080c, 0x5734, 0x0010, 0x708f, 0x0000, + 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003, 0x6043, 0x0004, 0x2011, + 0x5a47, 0x080c, 0x7fbb, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, + 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, + 0x0000, 0x8108, 0x1f04, 0x551f, 0x60c3, 0x0014, 0x080c, 0x5a71, + 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5a47, + 0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079, + 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, + 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, + 0x7097, 0x0004, 0x0029, 0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005, + 0x00f6, 0x7097, 0x0005, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, + 0x1103, 0x7837, 0x0000, 0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x1170, + 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, + 0x0008, 0x080c, 0x59f4, 0x0168, 0x080c, 0x5b75, 0x20a9, 0x0008, + 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x4003, 0x60c3, 0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, + 0x708c, 0x9005, 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, + 0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, + 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, + 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0006, 0x0029, + 0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0007, + 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, + 0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x11b8, 0x7080, 0x9005, 0x11a0, + 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x3142, 0x200d, 0x918c, + 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x59f4, 0x0180, 0x080c, + 0x4bb6, 0x0110, 0x080c, 0x2458, 0x20a9, 0x0008, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, + 0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8, + 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, + 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, + 0x1110, 0x70c3, 0x0001, 0x7097, 0x0008, 0x0029, 0x0010, 0x080c, + 0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0009, 0x080c, 0x5b40, + 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5b9f, + 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5967, 0x1188, 0x9085, + 0x0001, 0x080c, 0x2458, 0x20a9, 0x0008, 0x080c, 0x5bbc, 0x20e1, + 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, + 0x60c3, 0x0014, 0x080c, 0x5a71, 0x0010, 0x080c, 0x54c1, 0x00fe, + 0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8, 0x2011, 0x5a47, 0x080c, + 0x7fbb, 0x9086, 0x0014, 0x1560, 0x080c, 0x5bbc, 0x2079, 0x0260, + 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, + 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, + 0x1110, 0x70c3, 0x0001, 0x7097, 0x000a, 0x00b1, 0x0098, 0x9005, + 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x7093, 0x0000, 0x7097, 0x000e, 0x080c, 0x570f, 0x0010, + 0x080c, 0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000b, 0x2011, + 0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, + 0x4304, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, + 0x0000, 0x080c, 0x5b9f, 0x0118, 0x2013, 0x0000, 0x0020, 0x705c, + 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, + 0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, + 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5691, 0x60c3, 0x0084, + 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01c0, + 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1178, 0x080c, + 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, + 0x9005, 0x1120, 0x7097, 0x000c, 0x0029, 0x0010, 0x080c, 0x5b98, + 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d, 0x080c, 0x5b40, 0x2079, + 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5bbc, 0x20a9, + 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, + 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, + 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x56d5, 0x60c3, + 0x0084, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x01e0, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1198, + 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, + 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x5b12, 0x7097, + 0x000e, 0x0029, 0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005, 0x918d, + 0x0001, 0x080c, 0x5be7, 0x7097, 0x000f, 0x708f, 0x0000, 0x2061, + 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, + 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5a47, 0x080c, + 0x7faf, 0x0005, 0x708c, 0x9005, 0x0130, 0x2011, 0x5a47, 0x080c, + 0x7fbb, 0x7097, 0x0000, 0x0005, 0x7097, 0x0011, 0x080c, 0x9678, + 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, + 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5b9f, 0x11a0, 0x7178, + 0x81ff, 0x0188, 0x900e, 0x707c, 0x9084, 0x00ff, 0x0160, 0x080c, + 0x23ef, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, + 0x0008, 0x080c, 0x59f4, 0x60c3, 0x0014, 0x080c, 0x5a71, 0x0005, + 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, + 0x9086, 0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, + 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, + 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0012, + 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, + 0x0013, 0x080c, 0x5b4e, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, + 0x0000, 0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x1170, 0x7080, 0x9005, + 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, + 0x59f4, 0x0168, 0x080c, 0x5b75, 0x20a9, 0x0008, 0x20e1, 0x0000, + 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, + 0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, + 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8, + 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, + 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, + 0x1110, 0x70c3, 0x0001, 0x7097, 0x0014, 0x0029, 0x0010, 0x708f, + 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0015, 0x080c, 0x5b4e, + 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5bbc, + 0x080c, 0x5b9f, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, + 0xffff, 0x0180, 0x9180, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f, + 0x2011, 0x0008, 0x080c, 0x59f4, 0x0180, 0x080c, 0x4bb6, 0x0110, + 0x080c, 0x2458, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, + 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, + 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05f0, 0x2011, + 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5bbc, + 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, + 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, + 0x5be7, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, + 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, + 0x9005, 0x1110, 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x5be7, + 0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7097, + 0x0016, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x080c, + 0x9678, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, + 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, + 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, + 0x7097, 0x0017, 0x080c, 0x5b9f, 0x1150, 0x7080, 0x9005, 0x1138, + 0x080c, 0x5967, 0x1188, 0x9085, 0x0001, 0x080c, 0x2458, 0x20a9, + 0x0008, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, + 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5a71, + 0x0010, 0x080c, 0x54c1, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01d8, + 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1190, 0x080c, + 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, + 0x9005, 0x1138, 0x9006, 0x080c, 0x5be7, 0x7097, 0x0018, 0x0029, + 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0019, + 0x080c, 0x5b4e, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, + 0x080c, 0x5bbc, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040, + 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, + 0x6816, 0x2009, 0x0260, 0x1f04, 0x58d0, 0x2039, 0x1d0e, 0x080c, + 0x5b9f, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, + 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x705c, 0x2310, + 0x8214, 0x92a0, 0x1d0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, + 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, + 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, + 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5903, + 0x60c3, 0x0084, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, + 0x9005, 0x01e0, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, + 0x1198, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, + 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x5b12, + 0x7097, 0x001a, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, + 0x9085, 0x0001, 0x080c, 0x5be7, 0x7097, 0x001b, 0x080c, 0x9678, + 0x080c, 0x5bbc, 0x2011, 0x0260, 0x2009, 0x0240, 0x748c, 0x9480, + 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, + 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, + 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, + 0x594f, 0x60c3, 0x0084, 0x080c, 0x5a71, 0x0005, 0x0005, 0x0086, + 0x0096, 0x2029, 0x1854, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e, + 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, + 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, + 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, + 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5981, 0x0804, 0x59f0, + 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, + 0x91a6, 0x3fff, 0x0904, 0x59f0, 0x918d, 0xc000, 0x20a9, 0x0010, + 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, + 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, + 0x0008, 0x8318, 0x1f04, 0x59a7, 0x04d8, 0x23a8, 0x2021, 0x0001, + 0x8426, 0x8425, 0x1f04, 0x59b9, 0x2328, 0x8529, 0x92be, 0x0007, + 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, + 0x95a8, 0x0010, 0x1f04, 0x59c8, 0x755a, 0x95c8, 0x3142, 0x292d, + 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, + 0x2438, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, + 0x201a, 0x7083, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, + 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, + 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, + 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, + 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, + 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, + 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, + 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, + 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, + 0x9405, 0x203a, 0x715a, 0x91a0, 0x3142, 0x242d, 0x95ac, 0x00ff, + 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2438, 0x001e, + 0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001, 0x9084, 0x0000, 0x0005, + 0x00e6, 0x2071, 0x1800, 0x7087, 0x0000, 0x00ee, 0x0005, 0x00e6, + 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5b01, 0x080c, + 0x8e21, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x0126, + 0x2091, 0x8000, 0x2071, 0x1825, 0x2073, 0x0000, 0x7840, 0x0026, + 0x0016, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x001e, 0x9094, 0x0010, + 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, + 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2760, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19c3, 0x2013, 0x0000, + 0x708f, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, + 0x8e14, 0x6144, 0xd184, 0x0120, 0x7194, 0x918d, 0x2000, 0x0018, + 0x7188, 0x918d, 0x1000, 0x2011, 0x1968, 0x2112, 0x2009, 0x07d0, + 0x2011, 0x5a47, 0x080c, 0x807a, 0x0005, 0x0016, 0x0026, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, + 0x9762, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x2061, 0x19d2, 0x900e, + 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, + 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, + 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5acd, 0x080c, 0x7faf, + 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, + 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x8e21, 0x2071, + 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x080c, + 0x6f64, 0x0188, 0x080c, 0x6f7f, 0x1170, 0x080c, 0x7266, 0x0016, + 0x080c, 0x2507, 0x2001, 0x193e, 0x2102, 0x001e, 0x080c, 0x7261, + 0x080c, 0x6e8d, 0x0050, 0x2009, 0x0001, 0x080c, 0x27dd, 0x2001, + 0x0001, 0x080c, 0x2394, 0x080c, 0x5a9d, 0x012e, 0x000e, 0x00ee, + 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, + 0x2011, 0x8017, 0x2001, 0x1968, 0x201c, 0x080c, 0x47fb, 0x003e, + 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80, + 0x080c, 0x5bbc, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, + 0x0020, 0x080c, 0x5bb6, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051, + 0x20a9, 0x000e, 0x080c, 0x5bb9, 0x2099, 0x0260, 0x20a1, 0x1db2, + 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, + 0x2012, 0x8108, 0x8210, 0x1f04, 0x5b36, 0x002e, 0x001e, 0x0005, + 0x080c, 0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0x9678, + 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, + 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, + 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, 0x9005, 0x1138, + 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, + 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, + 0x6559, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd0ce, + 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, + 0x080c, 0x2f80, 0x080c, 0xbdd7, 0x0140, 0x0036, 0x2019, 0xffff, + 0x2021, 0x0007, 0x080c, 0x4998, 0x003e, 0x004e, 0x001e, 0x0005, + 0x080c, 0x5a9d, 0x7097, 0x0000, 0x708f, 0x0000, 0x0005, 0x0006, + 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, + 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, + 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, + 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, + 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, + 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x4004, 0x2079, + 0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, + 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, + 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, + 0x1975, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, + 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, + 0x1f04, 0x5bf6, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, + 0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8c6, 0xb807, 0x0707, + 0xb80a, 0xb80e, 0xb812, 0x9198, 0x3142, 0x231d, 0x939c, 0x00ff, + 0xbb16, 0x0016, 0x0026, 0xb886, 0x080c, 0x99e4, 0x1120, 0x9192, + 0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, + 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, + 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8be, + 0xb8c2, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, + 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, + 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, + 0x1055, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, + 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, + 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, + 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5cba, 0x9182, + 0x0800, 0x1a04, 0x5cbe, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, + 0x1904, 0x5cc4, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804, + 0x9084, 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904, + 0x5cd6, 0x080c, 0x6020, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005, + 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, + 0x1290, 0x080c, 0x99e4, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, + 0xb900, 0xd1fc, 0x0d10, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, + 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, + 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, + 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, + 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, + 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, + 0x19d0, 0x9188, 0x1000, 0x2104, 0x9065, 0x09a8, 0x080c, 0x655d, + 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5c7d, 0x080c, 0x63d1, + 0x0904, 0x5c86, 0x0804, 0x5c81, 0x00e6, 0x2071, 0x19b6, 0x7004, + 0x9086, 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06, + 0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, + 0x9182, 0x0800, 0x1a04, 0x5d65, 0x9188, 0x1000, 0x2104, 0x905d, + 0x0904, 0x5d3d, 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x6565, + 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, + 0x0005, 0x0118, 0x080c, 0x655d, 0x1598, 0xa87c, 0xd0fc, 0x01e0, + 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xb6b3, + 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x5d67, 0x6020, 0x9086, + 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x5d67, 0x601a, 0x6003, + 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0x9a0f, 0x05e8, 0x2b00, + 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, + 0x0003, 0x080c, 0x9b03, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, + 0x9082, 0x0006, 0x1290, 0x080c, 0x99e4, 0x1160, 0xb8a0, 0x9084, + 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, + 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, + 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, + 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, + 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, + 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, + 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, + 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, + 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, + 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, + 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, + 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, + 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x5dfc, + 0x5db7, 0x5dce, 0x5dfc, 0x5dfc, 0x5dfc, 0x5dfc, 0x5dfc, 0x2100, + 0x9082, 0x007e, 0x1278, 0x080c, 0x6106, 0x0148, 0x9046, 0xb810, + 0x9306, 0x1904, 0x5e04, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, + 0xba16, 0x0010, 0x080c, 0x46b5, 0x0150, 0x04b0, 0x080c, 0x6166, + 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, + 0x9a0f, 0x0530, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2900, 0x6016, + 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, + 0x080c, 0x2fc1, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, + 0x60b7, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, + 0x080c, 0x9b03, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, + 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, + 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, + 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x5fd1, + 0x90c6, 0x0056, 0x0904, 0x5fd5, 0x90c6, 0x0066, 0x0904, 0x5fd9, + 0x90c6, 0x0071, 0x0904, 0x5fdd, 0x90c6, 0x0074, 0x0904, 0x5fe1, + 0x90c6, 0x007c, 0x0904, 0x5fe5, 0x90c6, 0x007e, 0x0904, 0x5fe9, + 0x90c6, 0x0037, 0x0904, 0x5fed, 0x9016, 0x2079, 0x1800, 0xa974, + 0x9186, 0x00ff, 0x0904, 0x5fcc, 0x9182, 0x0800, 0x1a04, 0x5fcc, + 0x080c, 0x6166, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, + 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0x99e4, 0x1904, + 0x5fb5, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x5fb5, 0xa894, 0x90c6, + 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x5f15, 0x90c6, 0x0064, + 0x0904, 0x5f3e, 0x2008, 0x0804, 0x5ed8, 0xa998, 0xa8b0, 0x2040, + 0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04, 0x5ed8, 0x9186, + 0x00ff, 0x0904, 0x5ed8, 0x9182, 0x0800, 0x1a04, 0x5ed8, 0xaaa0, + 0xab9c, 0x7878, 0x9306, 0x1188, 0x787c, 0x0096, 0x924e, 0x1128, + 0x2208, 0x2310, 0x009e, 0x0804, 0x5ed8, 0x99cc, 0xff00, 0x009e, + 0x1120, 0x2208, 0x2310, 0x0804, 0x5ed8, 0x080c, 0x46b5, 0x0904, + 0x5ee1, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, + 0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, + 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fa0, 0x20a9, + 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fa0, 0x000e, + 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, + 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, + 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, + 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, + 0x0470, 0x080c, 0x9a0f, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, + 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2900, 0x6016, + 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, + 0x2091, 0x8000, 0x080c, 0x2fc1, 0x012e, 0x9006, 0x080c, 0x60a3, + 0x2001, 0x0002, 0x080c, 0x60b7, 0x2009, 0x0002, 0x080c, 0x9b03, + 0xa8b0, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x9006, 0x9005, + 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x52b1, 0x0118, + 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x6166, 0x1904, + 0x5ed3, 0x9186, 0x007f, 0x0130, 0x080c, 0x655d, 0x0118, 0x2009, + 0x0009, 0x0080, 0x0096, 0x080c, 0x1023, 0x1120, 0x009e, 0x2009, + 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xb8aa, 0x19b0, + 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5eda, 0xa998, 0xaeb0, + 0x080c, 0x6166, 0x1904, 0x5ed3, 0x0096, 0x080c, 0x1023, 0x1128, + 0x009e, 0x2009, 0x0002, 0x0804, 0x5f92, 0x2900, 0x009e, 0xa806, + 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, + 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, + 0x080c, 0x0fa0, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, + 0x4000, 0xd684, 0x1168, 0x080c, 0x529d, 0xd0b4, 0x1118, 0xa89b, + 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, + 0x080c, 0x655d, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x52b1, + 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xb88d, 0x1904, 0x5f0e, + 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5eda, 0xa87b, 0x0030, + 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, + 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x080c, 0x9f73, + 0x1904, 0x5f0e, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, + 0x0804, 0x5f0f, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, + 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, + 0x0029, 0x900e, 0x0804, 0x5f0f, 0x2001, 0x0029, 0x900e, 0x0804, + 0x5f0f, 0x080c, 0x3565, 0x0804, 0x5f10, 0x080c, 0x4fd2, 0x0804, + 0x5f10, 0x080c, 0x430b, 0x0804, 0x5f10, 0x080c, 0x4771, 0x0804, + 0x5f10, 0x080c, 0x4a19, 0x0804, 0x5f10, 0x080c, 0x4c4c, 0x0804, + 0x5f10, 0x080c, 0x4e3d, 0x0804, 0x5f10, 0x080c, 0x377a, 0x0804, + 0x5f10, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, + 0x1608, 0x9182, 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d, + 0x0130, 0x080c, 0x655d, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001, + 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, + 0x0d98, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, + 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, + 0xa877, 0x0000, 0xb8c0, 0x9005, 0x1904, 0x6097, 0xb888, 0x9005, + 0x1904, 0x6097, 0xb838, 0xb93c, 0x9102, 0x1a04, 0x6097, 0x2b10, + 0x080c, 0x9a3c, 0x0904, 0x6093, 0x8108, 0xb93e, 0x6212, 0x2900, + 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, + 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, + 0xd0ac, 0x05c0, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, 0x2001, + 0x00f8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, 0xa816, 0xa864, + 0x9094, 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd, + 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001, + 0x1df0, 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079, + 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836, + 0x781b, 0x8080, 0x00fe, 0x0005, 0x080c, 0x1646, 0x601c, 0xc0bd, + 0x601e, 0x0c38, 0x0006, 0x2001, 0x00e8, 0x8001, 0xa001, 0xa001, + 0xa001, 0x1dd8, 0x000e, 0xd0b4, 0x190c, 0x1aa5, 0x2001, 0x8004, + 0x6003, 0x0002, 0x08d0, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908, + 0xb8bc, 0xb9be, 0x9005, 0x1110, 0xb9c2, 0x0020, 0x0096, 0x2048, + 0xa902, 0x009e, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, + 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, + 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, + 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, + 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6559, + 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, + 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, + 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d65, 0x000e, 0x00ce, + 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, + 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, + 0xd0a4, 0x0150, 0x080c, 0x6555, 0x1138, 0x9284, 0x00ff, 0x9086, + 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, + 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, + 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, + 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x1023, 0x2958, 0x009e, + 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6, 0x9006, + 0xb8a6, 0x080c, 0x5bfc, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, + 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, + 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, + 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, + 0x0110, 0x080c, 0x1055, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, + 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0110, + 0x080c, 0x0fd5, 0x080c, 0x9a65, 0x00ce, 0x0c88, 0x00ce, 0x00de, + 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x1065, 0x00de, + 0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, + 0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, + 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, + 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, + 0x6f5c, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x99e4, + 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1951, + 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, + 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, + 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040, 0xb85e, 0x7048, 0xb862, + 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, + 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, + 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, + 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, + 0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, + 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, + 0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, + 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, + 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, + 0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, + 0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, + 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, + 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbc4, 0xc384, 0xba00, + 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, + 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, + 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbc6, + 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, + 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, + 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, + 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, + 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, + 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d65, 0x3c00, 0x20e8, + 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x0060, 0x080c, 0x1023, 0x0170, 0x2900, 0xb8a6, + 0xa803, 0x0000, 0x080c, 0x63f1, 0xa807, 0x0001, 0xae12, 0x9085, + 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, + 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, + 0x080c, 0x6400, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, + 0xa806, 0x0020, 0x080c, 0x1055, 0xb8a7, 0x0000, 0x009e, 0x012e, + 0x0005, 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x62ea, 0xb8c0, + 0x904d, 0x0904, 0x62ea, 0x080c, 0x9a3c, 0x0904, 0x62e6, 0x8210, + 0xba3e, 0xa800, 0xb8c2, 0x9005, 0x1108, 0xb8be, 0x2b00, 0x6012, + 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, + 0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, + 0xa87c, 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, + 0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084, + 0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, + 0x8004, 0x6003, 0x0004, 0x0030, 0x080c, 0x1aa5, 0x2001, 0x8004, + 0x6003, 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0x9737, + 0xb838, 0xba3c, 0x9202, 0x0a04, 0x6297, 0x0020, 0x82ff, 0x1110, + 0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1646, 0x601c, + 0xc0bd, 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800, + 0x900e, 0x0016, 0x080c, 0x6166, 0x1158, 0xb8c0, 0x904d, 0x0140, + 0x3e00, 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041, + 0x001e, 0x8108, 0x1f04, 0x62f9, 0x001e, 0x00be, 0x009e, 0x0005, + 0x0096, 0x0016, 0xb8c0, 0x904d, 0x0188, 0xa800, 0xb8c2, 0x9005, + 0x1108, 0xb8be, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x0c60, 0x001e, 0x009e, + 0x0005, 0x0086, 0x9046, 0xb8c0, 0x904d, 0x0198, 0xa86c, 0x9406, + 0x1118, 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148, + 0x0ca8, 0xa800, 0x88ff, 0x1110, 0xb8c2, 0x0008, 0xa002, 0xa803, + 0x0000, 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6, + 0x0096, 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19b6, 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff, + 0x0120, 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, + 0xa870, 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c, + 0x0006, 0x0066, 0x2830, 0x080c, 0x8f7a, 0x006e, 0x000e, 0x83ff, + 0x0508, 0x0c08, 0x9046, 0xb8c0, 0x904d, 0x01e0, 0x83ff, 0x0120, + 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, + 0x9506, 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8c0, 0xaa00, + 0x0026, 0x9906, 0x1110, 0xbac2, 0x0008, 0xa202, 0x000e, 0x83ff, + 0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005, + 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x6455, + 0x0128, 0x080c, 0xb791, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, + 0x6455, 0x0128, 0x080c, 0xb727, 0x0010, 0x9085, 0x0001, 0x0005, + 0x080c, 0x6455, 0x0128, 0x080c, 0xb78e, 0x0010, 0x9085, 0x0001, + 0x0005, 0x080c, 0x6455, 0x0128, 0x080c, 0xb74b, 0x0010, 0x9085, + 0x0001, 0x0005, 0x080c, 0x6455, 0x0128, 0x080c, 0xb7bb, 0x0010, + 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, + 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, + 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, + 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, + 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, + 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, + 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, + 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, + 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, + 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, + 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, + 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, + 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, + 0xb8a4, 0x904d, 0x1128, 0x080c, 0x1023, 0x0168, 0x2900, 0xb8a6, + 0x080c, 0x63f1, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, + 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, + 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1055, + 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, + 0x00b6, 0x00f6, 0x080c, 0x6f5c, 0x01b0, 0x71c0, 0x81ff, 0x1198, + 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, + 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, + 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804, 0x00d0, 0x0156, + 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6166, 0x1168, 0xb804, + 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, + 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x647b, + 0x015e, 0x080c, 0x651b, 0x0120, 0x2001, 0x1954, 0x200c, 0x0030, + 0x2079, 0x1853, 0x7804, 0x0030, 0x2009, 0x07d0, 0x2011, 0x64a5, + 0x080c, 0x807a, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, 0x64a5, + 0x080c, 0x7fbb, 0x080c, 0x651b, 0x01d8, 0x2001, 0x107e, 0x2004, + 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6559, 0x0130, 0x2009, + 0x07d0, 0x2011, 0x64a5, 0x080c, 0x807a, 0x00e6, 0x2071, 0x1800, + 0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2d99, 0x00ee, 0x04d0, + 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6166, + 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220, 0x9006, + 0x2009, 0x0029, 0x080c, 0xd0ce, 0xb800, 0xc0e5, 0xc0ec, 0xb802, + 0x080c, 0x6555, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, 0x00ff, + 0x9085, 0x0700, 0xb806, 0x080c, 0x9746, 0x2019, 0x0029, 0x080c, + 0x8498, 0x0076, 0x903e, 0x080c, 0x8387, 0x900e, 0x080c, 0xce23, + 0x007e, 0x004e, 0x080c, 0x9762, 0x001e, 0x8108, 0x1f04, 0x64cd, + 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, + 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, + 0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, + 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, + 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, + 0x9b06, 0x190c, 0x0d65, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, + 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, + 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1952, 0x200c, 0x2011, 0x654b, + 0x080c, 0x807a, 0x0005, 0x2011, 0x654b, 0x080c, 0x7fbb, 0x2011, + 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x529d, 0xd0ac, + 0x0005, 0x080c, 0x529d, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, + 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, + 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, + 0x080c, 0xbdd7, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, + 0x107f, 0x2004, 0x905d, 0x0110, 0xb8c4, 0xd094, 0x00fe, 0x00be, + 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, + 0x1817, 0x203c, 0x9780, 0x3142, 0x203d, 0x97bc, 0xff00, 0x873f, + 0x9006, 0x2018, 0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001, + 0x9294, 0x7fff, 0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404, + 0x905d, 0x0168, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138, + 0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108, + 0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e, + 0x0e08, 0x0048, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085, + 0x0001, 0x000e, 0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, + 0x9006, 0x000e, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007, + 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, + 0x2001, 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, + 0x191a, 0x900e, 0x710a, 0x080c, 0x529d, 0xd0fc, 0x1140, 0x080c, + 0x529d, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001, + 0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x65e7, 0x65e7, + 0x65e7, 0x65e7, 0x65e7, 0x65fe, 0x660c, 0x65e7, 0x7003, 0x0003, + 0x2009, 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, + 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, + 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, + 0x00e6, 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, + 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x72ce, 0x6a60, + 0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, + 0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, + 0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, + 0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, + 0x2071, 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, + 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8, + 0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x6844, + 0xa87c, 0xd0bc, 0x1904, 0x6844, 0xa978, 0xa874, 0x9105, 0x1904, + 0x6844, 0x2001, 0x191a, 0x2004, 0x0002, 0x6844, 0x6698, 0x66d4, + 0x66d4, 0x6844, 0x66d4, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, + 0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x6844, 0xa87c, + 0xd0cc, 0x0904, 0x6844, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, + 0x1904, 0x6844, 0x9186, 0x0003, 0x0904, 0x66d4, 0x9186, 0x0005, + 0x0904, 0x66d4, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, + 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, 0x701c, 0x9005, + 0x1904, 0x69e7, 0x0e04, 0x6a32, 0x2071, 0x0000, 0xa84c, 0x7082, + 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2071, + 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, + 0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x002e, + 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, + 0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, + 0x67c9, 0x782c, 0x908c, 0x0780, 0x190c, 0x6b59, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x66f2, 0x67c9, 0x6717, 0x6764, + 0x080c, 0x0d65, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, + 0x1170, 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, + 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0c10, 0x2071, + 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, 0x00e6, + 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c, + 0x918a, 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, + 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, + 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x2071, 0x19d2, 0x703c, + 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, + 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, + 0x080c, 0x7ed6, 0x0804, 0x671e, 0x0096, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, + 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, + 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, + 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, + 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, + 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, + 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19d2, + 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x681e, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x1198, + 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, + 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6b59, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, + 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x1d60, 0x00ee, + 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, + 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, + 0x00ee, 0x0804, 0x67d9, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804, + 0xa807, 0x0000, 0x904d, 0x190c, 0x0fd5, 0x009e, 0x0018, 0xa868, + 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, + 0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, + 0x6961, 0x782c, 0x908c, 0x0780, 0x190c, 0x6b59, 0x8004, 0x8004, + 0x8004, 0x9084, 0x0003, 0x0002, 0x6863, 0x6961, 0x687e, 0x68f0, + 0x080c, 0x0d65, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, + 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0c60, 0x2071, 0x1800, + 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x68df, 0x7830, 0xd0dc, + 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, + 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c, 0x918a, + 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, + 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, + 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, + 0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x0e04, 0x68d6, 0x7838, 0x7938, + 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, + 0x00de, 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, + 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2009, 0x1919, + 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1917, + 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, + 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, + 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0804, 0x688d, + 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, + 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, + 0x6934, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, + 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, + 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2009, + 0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, + 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, + 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, + 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, + 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, + 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x00fe, 0x002e, 0x00ee, + 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, + 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, + 0x69d2, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x11b0, + 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, + 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x0d50, 0x782c, 0x9094, + 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, + 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, + 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, + 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x69cb, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11b5, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, + 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, + 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, + 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, + 0x9200, 0x70be, 0x080c, 0x7ed6, 0x00ee, 0x0804, 0x6971, 0x2071, + 0x1906, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, + 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, + 0x900d, 0x1128, 0x1e04, 0x6a12, 0x002e, 0x00ee, 0x0005, 0x2071, + 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, + 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, + 0x0e04, 0x69fc, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d, + 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, + 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, + 0xd084, 0x190c, 0x11b5, 0x2071, 0x1906, 0x080c, 0x6b45, 0x002e, + 0x00ee, 0x0005, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010, + 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, + 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, + 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, + 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, + 0x7ed6, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, + 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, + 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, + 0xa87a, 0xa982, 0x0005, 0x2071, 0x1906, 0x7004, 0x0002, 0x6a7d, + 0x6a7e, 0x6b44, 0x6a7e, 0x0d65, 0x6b44, 0x0005, 0x2001, 0x191a, + 0x2004, 0x0002, 0x6a88, 0x6a88, 0x6add, 0x6ade, 0x6a88, 0x6ade, + 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6b64, 0x701c, 0x904d, 0x01e0, + 0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6aac, 0xa94c, 0x2071, 0x0000, + 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, + 0x2071, 0x1906, 0x080c, 0x6b45, 0x012e, 0x0470, 0x2001, 0x005b, + 0x2004, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x2071, 0x1906, + 0x1510, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, + 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, + 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, + 0x1906, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, + 0x2069, 0x19d2, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, + 0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1b1c, 0x210c, 0x9102, + 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, + 0x9106, 0x0190, 0x0e04, 0x6b10, 0x2069, 0x0000, 0x6837, 0x8040, + 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, + 0x2004, 0xd084, 0x190c, 0x11b5, 0x2069, 0x19d2, 0x683f, 0xffff, + 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6bda, 0x701c, + 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, + 0xd09c, 0x1500, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, + 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, + 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, + 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, + 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, + 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, + 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1055, 0x0005, 0x012e, + 0x0005, 0x2091, 0x8000, 0x0e04, 0x6b5b, 0x0006, 0x0016, 0x2001, + 0x8004, 0x0006, 0x0804, 0x0d6e, 0x0096, 0x00f6, 0x2079, 0x0050, + 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, + 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, + 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, + 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, + 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1919, 0x2104, + 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, + 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, + 0x182f, 0x210c, 0x918a, 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, + 0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, + 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, + 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x7838, + 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, + 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, + 0x190c, 0x11b5, 0x2009, 0x1919, 0x200b, 0x0000, 0x00ee, 0x00fe, + 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8, + 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, + 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, + 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x00fe, 0x0005, 0x782c, + 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x0db8, 0x00e6, 0x2071, + 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, + 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c, + 0x6b59, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, + 0x191a, 0x6808, 0x690a, 0x2069, 0x19d2, 0x9102, 0x1118, 0x683c, + 0x9005, 0x1328, 0x2001, 0x191b, 0x200c, 0x810d, 0x693e, 0x00de, + 0x00ee, 0x00fe, 0x0005, 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0d65, + 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x282b, + 0x002e, 0x0005, 0x6d02, 0x6c8c, 0x6ca8, 0x6cd0, 0x6cf1, 0x6d31, + 0x6d43, 0x6ca8, 0x6d19, 0x6c47, 0x6c75, 0x6c46, 0x0005, 0x00d6, + 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, + 0x7097, 0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x709d, + 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, 0x2069, + 0x195e, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, + 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3a, 0x080c, 0x193f, 0x005e, + 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, + 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, 0x0028, + 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x713f, 0x6028, 0x9085, + 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, + 0x27f1, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6db4, 0xd1d4, + 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, 0x080c, + 0x6db4, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, + 0x2001, 0x0088, 0x080c, 0x27f1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, + 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, + 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6f88, 0x2001, 0x0080, 0x080c, + 0x27f1, 0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097, + 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, + 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6f88, 0x2001, + 0x0080, 0x080c, 0x27f1, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, + 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040, + 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, + 0x0005, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x6124, 0xd1dc, 0x1138, + 0xd1e4, 0x0138, 0x080c, 0x1969, 0x7097, 0x001e, 0x0010, 0x7097, + 0x001d, 0x0005, 0x080c, 0x6e3d, 0x6124, 0xd1dc, 0x1188, 0x080c, + 0x6db4, 0x0016, 0x080c, 0x1969, 0x001e, 0xd1d4, 0x1128, 0xd1e4, + 0x0138, 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6db4, + 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x000e, 0x6124, + 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, + 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, + 0x0005, 0x080c, 0x6e3d, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, + 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, + 0x7097, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x27f1, + 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, + 0xd1e4, 0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, + 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, + 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, + 0x1800, 0x2091, 0x8000, 0x080c, 0x6f5c, 0x11f8, 0x2001, 0x180c, + 0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200, + 0x080c, 0x282b, 0x002e, 0x080c, 0x27d7, 0x6024, 0xd0cc, 0x0148, + 0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, 0x5be2, + 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6f76, 0x0150, + 0x080c, 0x6f6d, 0x1138, 0x2001, 0x0001, 0x080c, 0x2394, 0x080c, + 0x6f30, 0x00a0, 0x080c, 0x6e3a, 0x0178, 0x2001, 0x0001, 0x080c, + 0x2394, 0x7094, 0x9086, 0x001e, 0x0120, 0x7094, 0x9086, 0x0022, + 0x1118, 0x7097, 0x0025, 0x0010, 0x7097, 0x0021, 0x012e, 0x00ee, + 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x6dc5, 0x080c, + 0x80bc, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x6dc5, + 0x080c, 0x80b3, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, + 0x080c, 0x8e21, 0x2071, 0x1800, 0x080c, 0x6d5e, 0x001e, 0x00fe, + 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x0126, 0x080c, 0x8e21, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c, + 0x9746, 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, + 0x91ad, 0x080c, 0x9070, 0x080c, 0x8068, 0x0036, 0x901e, 0x080c, + 0x90f0, 0x003e, 0x080c, 0x9762, 0x60e3, 0x0000, 0x080c, 0xd427, + 0x080c, 0xd442, 0x2009, 0x0004, 0x080c, 0x27dd, 0x080c, 0x270a, + 0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x282b, + 0x2011, 0x6dc5, 0x080c, 0x80bc, 0x080c, 0x6f76, 0x0118, 0x9006, + 0x080c, 0x27f1, 0x080c, 0x0bab, 0x2001, 0x0001, 0x080c, 0x2394, + 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, + 0x0005, 0x0026, 0x00e6, 0x2011, 0x6dd2, 0x2071, 0x19d2, 0x701c, + 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, + 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, + 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x27f1, 0x0156, + 0x20a9, 0x002d, 0x1d04, 0x6e4a, 0x2091, 0x6000, 0x1f04, 0x6e4a, + 0x015e, 0x00d6, 0x2069, 0x1800, 0x6898, 0x8001, 0x0220, 0x0118, + 0x689a, 0x00de, 0x0005, 0x689b, 0x0014, 0x68e8, 0xd0dc, 0x0dc8, + 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x80c8, 0x0c90, 0x00c6, + 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, + 0x080c, 0x726b, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096, + 0x60e2, 0x6886, 0x080c, 0x2463, 0x9006, 0x080c, 0x27f1, 0x080c, + 0x5a9d, 0x0026, 0x2011, 0xffff, 0x080c, 0x282b, 0x002e, 0x602b, + 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, + 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x194e, + 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, + 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6f20, 0x7097, + 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023, 0x0010, + 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, + 0x080c, 0x2463, 0x080c, 0x9746, 0x0026, 0x080c, 0x99eb, 0x002e, + 0x080c, 0x9762, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, + 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, + 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xbdd7, + 0x0118, 0x9006, 0x080c, 0x281b, 0x0804, 0x6f2c, 0x6800, 0x9084, + 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x27d7, 0x6904, 0xd1d4, 0x1140, + 0x2001, 0x0100, 0x080c, 0x27f1, 0x1f04, 0x6ed1, 0x080c, 0x6fb3, + 0x012e, 0x015e, 0x080c, 0x6f6d, 0x0170, 0x6044, 0x9005, 0x0130, + 0x080c, 0x6fb3, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4, + 0x1110, 0x080c, 0x6fb3, 0x080c, 0xbdd7, 0x0118, 0x9006, 0x080c, + 0x281b, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, + 0x00c8, 0x2011, 0x6dd2, 0x080c, 0x807a, 0x002e, 0x001e, 0x080c, + 0x7ecd, 0x7034, 0xc085, 0x7036, 0x2001, 0x194e, 0x2003, 0x0004, + 0x080c, 0x6c2b, 0x080c, 0x6f6d, 0x0138, 0x6804, 0xd0d4, 0x1120, + 0xd0dc, 0x1100, 0x080c, 0x7261, 0x00ee, 0x00de, 0x00ce, 0x0005, + 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, + 0x1800, 0x080c, 0x7ee4, 0x080c, 0x7ed6, 0x080c, 0x726b, 0x2001, + 0x193e, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, + 0x2463, 0x9006, 0x080c, 0x27f1, 0x6043, 0x0090, 0x6043, 0x0010, + 0x0026, 0x2011, 0xffff, 0x080c, 0x282b, 0x002e, 0x602b, 0x182c, + 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004, + 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x52a1, 0x9084, + 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x52a1, + 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, + 0x52a1, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, + 0x080c, 0x52a1, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, + 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, + 0x0020, 0x080c, 0x2483, 0x900e, 0x0028, 0x080c, 0x6555, 0x1dc8, + 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x2f80, 0x9006, 0x0019, + 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, + 0x080c, 0xbdd0, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, + 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, + 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f, + 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c, + 0x27b8, 0x0026, 0x2011, 0x0040, 0x080c, 0x282b, 0x002e, 0x000e, + 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, + 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2463, 0x2001, + 0x00a0, 0x0006, 0x080c, 0xbdd7, 0x000e, 0x0130, 0x080c, 0x280f, + 0x9006, 0x080c, 0x281b, 0x0010, 0x080c, 0x27f1, 0x000e, 0x6052, + 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, + 0x2768, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, + 0x2071, 0x1800, 0x080c, 0x97a4, 0x0158, 0x2001, 0x0386, 0x2004, + 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0x9737, 0x0804, 0x708f, + 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, + 0x602a, 0x2011, 0x0200, 0x080c, 0x282b, 0x2001, 0x0090, 0x080c, + 0x27f1, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x702b, + 0x2091, 0x6000, 0x1f04, 0x702b, 0x080c, 0x9746, 0x2011, 0x0003, + 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad, 0x080c, 0x9070, + 0x901e, 0x080c, 0x90f0, 0x2001, 0x0386, 0x2003, 0x7000, 0x080c, + 0x9762, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, + 0x5be2, 0x080c, 0xbdd7, 0x0110, 0x080c, 0x0cd1, 0x9085, 0x0001, + 0x04e0, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1969, + 0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, 0x2463, 0x60e2, 0x2001, + 0x0080, 0x080c, 0x27f1, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c, + 0x282b, 0x2009, 0x1e00, 0x080c, 0x27d7, 0x6024, 0x910c, 0x0140, + 0x1d04, 0x706d, 0x2091, 0x6000, 0x1f04, 0x706d, 0x0804, 0x7034, + 0x2001, 0x0386, 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, 0x602a, + 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, + 0xbdd7, 0x0110, 0x080c, 0x0cd1, 0x9006, 0x00ee, 0x00de, 0x00ce, + 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, + 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, + 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, + 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a45, 0x2d04, 0x8000, + 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, + 0x9005, 0x1904, 0x7106, 0x2001, 0x0088, 0x080c, 0x27f1, 0x9006, + 0x60e2, 0x6886, 0x080c, 0x2463, 0x2069, 0x0200, 0x6804, 0x9005, + 0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, 0x602a, + 0x2011, 0x0400, 0x080c, 0x282b, 0x2069, 0x195e, 0x7000, 0x206a, + 0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x70e6, + 0x2091, 0x6000, 0x1f04, 0x70e6, 0x0804, 0x7137, 0x2069, 0x0140, + 0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x282b, 0x2009, 0x1e00, + 0x080c, 0x27d7, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510, + 0x1d04, 0x70f2, 0x2091, 0x6000, 0x1f04, 0x70f2, 0x080c, 0x9746, + 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad, + 0x080c, 0x9070, 0x901e, 0x080c, 0x90f0, 0x080c, 0x9762, 0x2001, + 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, 0x5be2, 0x9085, + 0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, 0x27f1, 0x2069, 0x0140, + 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, + 0x6886, 0x2001, 0x0002, 0x080c, 0x2463, 0x60e2, 0x9006, 0x00ee, + 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, + 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, 0x080c, 0x9746, + 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad, + 0x080c, 0x9070, 0x901e, 0x080c, 0x90f0, 0x080c, 0x9762, 0x2069, + 0x0140, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, + 0x5be2, 0x0804, 0x71d9, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, + 0xc1b5, 0x2102, 0x080c, 0x6dba, 0x2069, 0x0140, 0x2001, 0x0080, + 0x080c, 0x27f1, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, + 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, 0xfdff, 0x602a, + 0x2011, 0x0200, 0x080c, 0x282b, 0x2069, 0x195e, 0x7000, 0x206a, + 0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x71d9, 0x2011, 0x1e00, + 0x080c, 0x282b, 0x2009, 0x1e00, 0x080c, 0x27d7, 0x6024, 0x910c, + 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7196, 0x0006, 0x0016, + 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7f15, 0x00ee, 0x00de, 0x00ce, + 0x001e, 0x000e, 0x00e6, 0x2071, 0x19d2, 0x7018, 0x00ee, 0x9005, + 0x19e8, 0x01f8, 0x0026, 0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011, + 0x6dc5, 0x080c, 0x80bc, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, + 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, + 0x0002, 0x080c, 0x2463, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, + 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, + 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbdd0, 0x1904, 0x7246, + 0x7130, 0xd184, 0x1170, 0x080c, 0x313d, 0x0138, 0xc18d, 0x7132, + 0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, + 0x7246, 0x2011, 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e, + 0x080c, 0xd046, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, + 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x6166, 0x1170, + 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xd0ce, 0x2009, + 0x0001, 0x2011, 0x0100, 0x080c, 0x8248, 0x001e, 0x8108, 0x1f04, + 0x720f, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, + 0x0002, 0x2019, 0x0004, 0x080c, 0x2f80, 0x001e, 0x0078, 0x0156, + 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6166, 0x1110, 0x080c, + 0x5bfc, 0x8108, 0x1f04, 0x723c, 0x00be, 0x015e, 0x080c, 0x1969, + 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, 0x60e3, 0x0000, + 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x00ee, 0x00ce, 0x004e, 0x003e, + 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x194e, 0x2003, 0x0001, + 0x0005, 0x2001, 0x194e, 0x2003, 0x0000, 0x0005, 0x2001, 0x194d, + 0x2003, 0xaaaa, 0x0005, 0x2001, 0x194d, 0x2003, 0x0000, 0x0005, + 0x2071, 0x18f0, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x103c, + 0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x103c, + 0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000, + 0xa86b, 0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040, + 0x6848, 0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, 0x9005, + 0x0150, 0x04a1, 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101, 0x7006, + 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854, 0x7006, 0x6858, + 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110, 0x7012, 0x7016, + 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, 0x0019, + 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, 0xfff7, + 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x18f0, 0x6807, 0x0001, + 0x00de, 0x080c, 0x7853, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, + 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x72d2, 0x015e, 0x0005, + 0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, 0x0002, 0x72e8, 0x72e9, + 0x7334, 0x738f, 0x74bb, 0x72e6, 0x72e6, 0x74e5, 0x080c, 0x0d65, + 0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, 0x2003, 0x0000, 0x782c, + 0x908c, 0x0780, 0x190c, 0x78df, 0xd0a4, 0x0570, 0x2001, 0x1dc0, + 0x2004, 0x9082, 0x0080, 0x1640, 0x1d04, 0x7306, 0x2001, 0x19d5, + 0x200c, 0x8109, 0x0508, 0x2091, 0x6000, 0x2102, 0x7824, 0x2048, + 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, + 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1160, + 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, + 0x0003, 0x1968, 0x080c, 0x738f, 0x782c, 0xd09c, 0x090c, 0x7853, + 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, + 0x73c5, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x73c5, 0x73c5, 0x73c5, + 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73e7, 0x73c5, 0x73c5, + 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x73c5, 0x73d1, 0x73c5, 0x75ba, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x73c5, 0x73d1, 0x75fb, 0x763c, 0x7683, 0x7697, 0x73c5, 0x73c5, + 0x73e7, 0x73d1, 0x73c5, 0x73c5, 0x748f, 0x7742, 0x775d, 0x73c5, + 0x73e7, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x7485, 0x775d, 0x73c5, + 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x73fb, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x73c5, 0x73c5, 0x7883, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, + 0x740f, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x2079, + 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x787c, + 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, + 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, + 0x080c, 0x7853, 0x0005, 0x73c5, 0x73d1, 0x75a6, 0x73c5, 0x73d1, + 0x73c5, 0x73d1, 0x73d1, 0x73c5, 0x73d1, 0x75a6, 0x73d1, 0x73d1, + 0x73d1, 0x73d1, 0x73d1, 0x73c5, 0x73d1, 0x75a6, 0x73c5, 0x73c5, + 0x73d1, 0x73c5, 0x73c5, 0x73c5, 0x73d1, 0x00e6, 0x2071, 0x18f0, + 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, + 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, + 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, + 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, + 0x0804, 0x7564, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, + 0x704b, 0x7564, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, + 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x757f, 0x7007, 0x0003, + 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x757f, 0x0005, 0xa864, + 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x73cd, 0x7007, + 0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, 0x15f0, 0xa994, 0x9186, + 0x006f, 0x0158, 0x9186, 0x0074, 0x1510, 0x0026, 0x2011, 0x0010, + 0x080c, 0x6581, 0x002e, 0x01d8, 0x0090, 0x080c, 0x6f5c, 0x0140, + 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, 0x00c8, + 0x0026, 0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0140, 0xa897, + 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, 0xa868, + 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5e0d, 0x1108, + 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, + 0x080c, 0x683f, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904, + 0x741e, 0x9186, 0x0064, 0x0904, 0x741e, 0x9186, 0x007c, 0x0904, + 0x741e, 0x9186, 0x0028, 0x0904, 0x741e, 0x9186, 0x0038, 0x0904, + 0x741e, 0x9186, 0x0078, 0x0904, 0x741e, 0x9186, 0x005f, 0x0904, + 0x741e, 0x9186, 0x0056, 0x0904, 0x741e, 0xa897, 0x4005, 0xa89b, + 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0, + 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7774, 0x2900, + 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, + 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, + 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, + 0x73d5, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x73d5, 0x82ff, 0x1138, + 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7522, 0x0018, 0x9280, + 0x7518, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7503, 0x080c, + 0x103c, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, + 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, + 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, + 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, + 0xa17a, 0x810b, 0xa17e, 0x080c, 0x1103, 0xa06c, 0x908e, 0x0100, + 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, + 0x2048, 0x080c, 0x1055, 0x7014, 0x2048, 0x0804, 0x73d5, 0x7020, + 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, + 0x711a, 0x0804, 0x74bb, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, + 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, + 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7774, 0x0804, 0x7564, + 0x751a, 0x751e, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, + 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, + 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, + 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, + 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, + 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, + 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, + 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, + 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, + 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, + 0x1178, 0x080c, 0x5c5c, 0x1108, 0x0005, 0x080c, 0x6a5c, 0x0126, + 0x2091, 0x8000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x012e, 0x0ca0, + 0x080c, 0xbdd0, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, + 0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, + 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5d6f, 0x1138, 0x0005, + 0x9006, 0xa87a, 0x080c, 0x5cea, 0x1108, 0x0005, 0x0126, 0x2091, + 0x8000, 0xa87a, 0xa982, 0x080c, 0x683f, 0x012e, 0x0cb0, 0x2001, + 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, + 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, + 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, + 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, + 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, + 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, + 0x11d8, 0xa974, 0x080c, 0x6166, 0x11b8, 0x0066, 0xae80, 0x080c, + 0x6276, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, + 0x2412, 0x004e, 0x00c6, 0x080c, 0x6166, 0x1110, 0x080c, 0x6445, + 0x8108, 0x1f04, 0x75e3, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, + 0x1055, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, + 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, + 0x080c, 0x6559, 0x0580, 0x2061, 0x1a3d, 0x6100, 0xd184, 0x0178, + 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, + 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, + 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, + 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, + 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, + 0x012e, 0x0804, 0x783d, 0x012e, 0x0804, 0x7837, 0x012e, 0x0804, + 0x7831, 0x012e, 0x0804, 0x7834, 0x0126, 0x2091, 0x8000, 0x7007, + 0x0001, 0x080c, 0x6559, 0x05e0, 0x2061, 0x1a3d, 0x6000, 0xd084, + 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, + 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, + 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, + 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, + 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, + 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, + 0x6206, 0x630a, 0x012e, 0x0804, 0x783d, 0x012e, 0x0804, 0x783a, + 0x012e, 0x0804, 0x7837, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, + 0x2061, 0x1a3d, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, + 0x630a, 0x012e, 0x0804, 0x784b, 0x012e, 0x0804, 0x783a, 0x00b6, + 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, + 0x0148, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x9084, 0xfcff, 0x6002, + 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, + 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9a9f, 0x0068, + 0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, + 0x6162, 0x2009, 0x0041, 0x080c, 0x9b03, 0xa988, 0x918c, 0xff00, + 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, + 0x8248, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3d, 0x6000, + 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, + 0x00be, 0x0804, 0x783d, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7837, + 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, + 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, + 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, + 0x1d10, 0xa974, 0x080c, 0x6166, 0x1968, 0xb800, 0xc0e4, 0xb802, + 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1955, + 0x2004, 0x601a, 0x0804, 0x76d2, 0xa88c, 0x9065, 0x0960, 0x00e6, + 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c, + 0x9a9f, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9a9f, 0x00ee, 0x0804, + 0x76d2, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, + 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, + 0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x00ee, + 0x0804, 0x76d2, 0x2061, 0x1a3d, 0x6000, 0xd084, 0x0190, 0xd08c, + 0x1904, 0x784b, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, + 0x6206, 0x012e, 0x0804, 0x784b, 0x012e, 0xa883, 0x0016, 0x0804, + 0x7844, 0xa883, 0x0007, 0x0804, 0x7844, 0xa864, 0x8007, 0x9084, + 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, + 0x080c, 0x73cd, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, + 0x701a, 0x704b, 0x7774, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, + 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x77f6, + 0x6130, 0xd194, 0x1904, 0x7820, 0xa878, 0x2070, 0x9e82, 0x1ddc, + 0x0a04, 0x77ea, 0x6064, 0x9e02, 0x1a04, 0x77ea, 0x7120, 0x9186, + 0x0006, 0x1904, 0x77dc, 0x7010, 0x905d, 0x0904, 0x77f6, 0xb800, + 0xd0e4, 0x1904, 0x781a, 0x2061, 0x1a3d, 0x6100, 0x9184, 0x0301, + 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7823, 0xa883, + 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, + 0xa87c, 0xd0f4, 0x1904, 0x7826, 0x080c, 0x529d, 0xd09c, 0x1118, + 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x813b, 0x012e, 0x00ee, + 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, + 0xa87c, 0xd0f4, 0x1904, 0x7826, 0x012e, 0x00ee, 0x00be, 0x0005, + 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7844, 0xd184, + 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6166, 0x15d0, + 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, + 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, + 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x52a1, + 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6064, + 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, + 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, + 0x0007, 0x1904, 0x7780, 0x7003, 0x0002, 0x0804, 0x7780, 0xa883, + 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, + 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, + 0x0002, 0x601b, 0x0014, 0x080c, 0xcc56, 0x012e, 0x00ee, 0x00be, + 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, + 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, + 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, + 0x683f, 0x012e, 0x0005, 0x080c, 0x1055, 0x0005, 0x00d6, 0x080c, + 0x8132, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, + 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, + 0x78df, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040, + 0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, + 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, + 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, + 0x78df, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, + 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x78d0, + 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, + 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, + 0x2b10, 0x080c, 0x9a0f, 0x1118, 0x080c, 0x9ad6, 0x05a8, 0x6212, + 0xa874, 0x0002, 0x78ae, 0x78b3, 0x78b6, 0x78bc, 0x2019, 0x0002, + 0x080c, 0xd046, 0x0060, 0x080c, 0xcfd6, 0x0048, 0x2019, 0x0002, + 0xa980, 0x080c, 0xcff5, 0x0018, 0xa980, 0x080c, 0xcfd6, 0x080c, + 0x9a65, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, + 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, + 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, + 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, + 0x8000, 0x0e04, 0x78e1, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, + 0x0804, 0x0d6e, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, + 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, + 0x1120, 0x080c, 0x1524, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, + 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, + 0x794d, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x7ecd, 0x7d44, 0x7c40, + 0xd59c, 0x190c, 0x0d65, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, + 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x0470, + 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, + 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, + 0x080c, 0xd3ff, 0x080c, 0x7e14, 0x7817, 0x0140, 0x00a8, 0x9584, + 0x0076, 0x1118, 0x080c, 0x7e70, 0x19c8, 0xd5a4, 0x0148, 0x0046, + 0x0056, 0x080c, 0x799d, 0x080c, 0x1f82, 0x005e, 0x004e, 0x0020, + 0x080c, 0xd3ff, 0x7817, 0x0140, 0x0489, 0x0005, 0x0002, 0x795a, + 0x7c36, 0x7957, 0x7957, 0x7957, 0x7957, 0x7957, 0x7957, 0x7817, + 0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, + 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, + 0x0001, 0x1118, 0x080c, 0x52f4, 0x0070, 0x080c, 0x79bd, 0x0058, + 0x9286, 0x3000, 0x1118, 0x080c, 0x7b73, 0x0028, 0x9286, 0x8000, + 0x1110, 0x080c, 0x7d4a, 0x7817, 0x0140, 0x0005, 0x2001, 0x1810, + 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, + 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x47fb, + 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, + 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, + 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, + 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, + 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x47fb, 0x002e, + 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, + 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, + 0x1904, 0x7b44, 0x9186, 0x0023, 0x15c0, 0x080c, 0x7ddf, 0x0904, + 0x7b44, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, + 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x7b44, 0x7124, + 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, + 0x9b03, 0x0804, 0x7b44, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, + 0x1130, 0x2009, 0x0015, 0x080c, 0x9b03, 0x0804, 0x7b44, 0x908e, + 0x0100, 0x1904, 0x7b44, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009, + 0x0016, 0x080c, 0x9b03, 0x0804, 0x7b44, 0x9186, 0x0022, 0x1904, + 0x7b44, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, + 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e, + 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, + 0x0016, 0x2008, 0x080c, 0x2438, 0x7932, 0x7936, 0x001e, 0x000e, + 0x00fe, 0x080c, 0x23ef, 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140, + 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904, + 0x7b44, 0x2009, 0x0017, 0x0804, 0x7b11, 0x908e, 0x0400, 0x1190, + 0x7034, 0x9005, 0x1904, 0x7b44, 0x080c, 0x6f5c, 0x0120, 0x2009, + 0x001d, 0x0804, 0x7b11, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030, + 0x0804, 0x7b11, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, + 0x7b44, 0x2009, 0x0018, 0x0804, 0x7b11, 0x908e, 0x2010, 0x1120, + 0x2009, 0x0019, 0x0804, 0x7b11, 0x908e, 0x2110, 0x1120, 0x2009, + 0x001a, 0x0804, 0x7b11, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, + 0x1904, 0x7b44, 0x2009, 0x001b, 0x0804, 0x7b11, 0x908e, 0x5000, + 0x1140, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009, 0x001c, 0x0804, + 0x7b11, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x7b11, + 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009, + 0x0024, 0x0804, 0x7b11, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, + 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x7b11, + 0x080c, 0xc495, 0x1904, 0x7b44, 0x0804, 0x7b0f, 0x908c, 0xff00, + 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7b11, 0x908e, + 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7b11, 0x908e, 0x5300, + 0x1108, 0x0440, 0x908e, 0x6104, 0x1528, 0x2029, 0x0205, 0x2011, + 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, + 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x47fb, + 0x004e, 0x8108, 0x0f04, 0x7add, 0x9186, 0x0280, 0x1d88, 0x2504, + 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, + 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f, 0x0448, + 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e, 0x1000, + 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, 0x2009, + 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118, 0x2009, + 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118, 0x2009, + 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, 0x2009, + 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x23ef, 0x1568, 0x080c, 0x6106, 0x1550, 0xbe12, 0xbd16, 0x001e, + 0x0016, 0xb884, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x6878, + 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, + 0x0098, 0x080c, 0x9a0f, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, + 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, + 0x0016, 0x001e, 0x080c, 0x9b03, 0x00ce, 0x00be, 0x0005, 0x001e, + 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, + 0x080c, 0x47fb, 0x080c, 0x9ad6, 0x0d90, 0x2b08, 0x6112, 0x6023, + 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118, + 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020, + 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001, + 0x080c, 0x8335, 0x08a0, 0x080c, 0x3107, 0x1140, 0x7010, 0x9084, + 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, + 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, + 0x11e8, 0x080c, 0x7ddf, 0x0904, 0x7bce, 0x7124, 0x610a, 0x7030, + 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, + 0x080c, 0x9b03, 0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, + 0x1568, 0x2009, 0x0016, 0x080c, 0x9b03, 0x0440, 0x9186, 0x0032, + 0x1528, 0x7030, 0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, + 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23ef, 0x11a8, + 0x080c, 0x6106, 0x1190, 0xbe12, 0xbd16, 0x080c, 0x9a0f, 0x0168, + 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0004, 0x7120, 0x610a, + 0x001e, 0x080c, 0x9b03, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, + 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, + 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, + 0x1120, 0x2009, 0x007f, 0x0804, 0x7c30, 0x9596, 0xfffe, 0x1120, + 0x2009, 0x007e, 0x0804, 0x7c30, 0x9596, 0xfffc, 0x1118, 0x2009, + 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, + 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, + 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, + 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, + 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, + 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, + 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, + 0x7c05, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, + 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, + 0xff00, 0x810f, 0x9184, 0x000f, 0x0002, 0x7c4d, 0x7c4d, 0x7c4d, + 0x7df1, 0x7c4d, 0x7c50, 0x7c75, 0x7cfe, 0x7c4d, 0x7c4d, 0x7c4d, + 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7817, 0x0140, 0x0005, + 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0003, + 0x11c0, 0x9c8a, 0x1ddc, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008, + 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, + 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, + 0x9b03, 0x7817, 0x0140, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, + 0x0fff, 0x0904, 0x7cda, 0x7110, 0xd1bc, 0x1904, 0x7cda, 0x7108, + 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15c8, + 0x81ff, 0x15b8, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f, + 0x2001, 0x0080, 0x9106, 0x0904, 0x7cda, 0x9182, 0x0801, 0x1a04, + 0x7cda, 0x9190, 0x1000, 0x2204, 0x905d, 0x05e0, 0xbe12, 0xbd16, + 0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, + 0x1190, 0x080c, 0x9a0f, 0x0598, 0x2b08, 0x7028, 0x6052, 0x702c, + 0x604e, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, + 0x080c, 0xc6f5, 0x00f8, 0x080c, 0x655d, 0x1138, 0xb807, 0x0606, + 0x0c40, 0x190c, 0x7bd2, 0x11b0, 0x0880, 0x080c, 0x9a0f, 0x2b08, + 0x0188, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, + 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8335, 0x7817, 0x0140, 0x00ce, 0x00be, 0x0005, 0x2001, + 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x47fb, + 0x080c, 0x9ad6, 0x0d78, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, + 0x610a, 0x7130, 0x615e, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, + 0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x08e0, 0x00b6, 0x7110, + 0xd1bc, 0x05d0, 0x7020, 0x2060, 0x9c84, 0x0003, 0x15a8, 0x9c82, + 0x1ddc, 0x0690, 0x6864, 0x9c02, 0x1678, 0x9484, 0x0fff, 0x9082, + 0x000c, 0x0650, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, + 0x9106, 0x1510, 0x700c, 0xb914, 0x9106, 0x11f0, 0x7124, 0x610a, + 0x601c, 0xd0fc, 0x11c8, 0x2001, 0x0271, 0x2004, 0x9005, 0x1180, + 0x9484, 0x0fff, 0x9082, 0x000c, 0x0158, 0x0066, 0x2031, 0x0100, + 0xa001, 0xa001, 0x8631, 0x1de0, 0x006e, 0x601c, 0xd0fc, 0x1120, + 0x2009, 0x0045, 0x080c, 0x9b03, 0x7817, 0x0140, 0x00be, 0x0005, + 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, + 0x0001, 0x0005, 0x080c, 0x3107, 0x1168, 0x7010, 0x9084, 0xff00, + 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, + 0x1208, 0x000b, 0x0005, 0x7d61, 0x7d62, 0x7d61, 0x7d61, 0x7dc1, + 0x7dd0, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, + 0x0904, 0x7dbf, 0x700c, 0x7108, 0x080c, 0x23ef, 0x1904, 0x7dbf, + 0x080c, 0x6106, 0x1904, 0x7dbf, 0xbe12, 0xbd16, 0x7110, 0xd1bc, + 0x01d8, 0x080c, 0x655d, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, + 0x080c, 0x7ddf, 0x00ce, 0x05d8, 0x080c, 0x9a0f, 0x2b08, 0x05b8, + 0x6112, 0x080c, 0xbb52, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, + 0x0088, 0x080c, 0x9b03, 0x0458, 0x080c, 0x655d, 0x0148, 0x9086, + 0x0004, 0x0130, 0x080c, 0x6565, 0x0118, 0x9086, 0x0004, 0x1180, + 0x080c, 0x9a0f, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xbb52, 0x6023, + 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9b03, 0x0078, + 0x080c, 0x9a0f, 0x2b08, 0x0158, 0x6112, 0x080c, 0xbb52, 0x6023, + 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x9b03, 0x00be, + 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7d40, + 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x9b03, 0x0005, + 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7d40, 0x1130, + 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x9b03, 0x0005, 0x7020, + 0x2060, 0x9c84, 0x0003, 0x1158, 0x9c82, 0x1ddc, 0x0240, 0x2001, + 0x1819, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, + 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, + 0x0003, 0x11b0, 0x9c82, 0x1ddc, 0x0298, 0x6864, 0x9c02, 0x1280, + 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, + 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9b03, + 0x7817, 0x0140, 0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, + 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, + 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, + 0x9084, 0xf000, 0x9086, 0xc000, 0x05c0, 0x080c, 0x9a0f, 0x05a8, + 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, + 0x080c, 0x23ef, 0x1590, 0x080c, 0x6106, 0x1578, 0xbe12, 0xbd16, + 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xbb52, 0x080c, 0x1023, + 0x0500, 0x2900, 0x6062, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, + 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, + 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, + 0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x00fe, 0x009e, 0x00ce, + 0x0005, 0x080c, 0x9a65, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, + 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, + 0x2000, 0x1904, 0x7ec7, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, + 0x2004, 0x9005, 0x1904, 0x7ec9, 0x7030, 0x908e, 0x0400, 0x0904, + 0x7ec9, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, + 0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, + 0x1580, 0x080c, 0x651b, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, + 0x918c, 0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, 0x918c, 0xff00, + 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, + 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, + 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, + 0x7ddf, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, + 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, + 0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, + 0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, + 0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, + 0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x19d2, 0x7003, 0x0003, + 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1ddc, + 0x7007, 0x0000, 0x7026, 0x702b, 0x8e43, 0x7032, 0x7037, 0x8ec0, + 0x703f, 0xffff, 0x7042, 0x7047, 0x5134, 0x704a, 0x705b, 0x8083, + 0x080c, 0x103c, 0x090c, 0x0d65, 0x2900, 0x703a, 0xa867, 0x0003, + 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d2, 0x1d04, + 0x7faa, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1560, 0x2001, + 0x1875, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, + 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d65, 0x700f, + 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800, + 0x69e8, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x80f1, 0x0010, + 0x080c, 0x80c8, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, + 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, + 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, + 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, + 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, + 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, + 0x090c, 0x8f48, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, + 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, + 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, + 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, + 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, + 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, + 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, + 0x080f, 0x012e, 0x7004, 0x0002, 0x7fd2, 0x7fd3, 0x7ffd, 0x00e6, + 0x2071, 0x19d2, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, + 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d2, 0x701c, + 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, + 0x0005, 0x00e6, 0x2071, 0x19d2, 0xb888, 0x9102, 0x0208, 0xb98a, + 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c, + 0x6166, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126, + 0x2091, 0x8000, 0x0066, 0xb8c0, 0x9005, 0x0138, 0x0026, 0xba3c, + 0x0016, 0x080c, 0x6291, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108, + 0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e, + 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014, + 0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001, + 0x604a, 0x1110, 0x080c, 0xb9d3, 0x6018, 0x9005, 0x05d8, 0x00f6, + 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x805d, 0x781b, 0x2020, + 0xa001, 0x7918, 0xd1b4, 0x0118, 0x781b, 0x2000, 0x04f0, 0x8001, + 0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918, 0xd1ac, 0x1dd0, + 0x010e, 0x00fe, 0x11f8, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, + 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, + 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, + 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x080c, 0xbe03, 0x0110, + 0x080c, 0xb3c3, 0x012e, 0x9c88, 0x001c, 0x7116, 0x2001, 0x1819, + 0x2004, 0x9102, 0x1228, 0x8631, 0x0138, 0x2160, 0x0804, 0x8001, + 0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6, + 0x2071, 0x19d2, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, + 0x2001, 0x19db, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d2, + 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19de, 0x2013, + 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d2, 0x711a, 0x721e, 0x700b, + 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, + 0x2001, 0x19e0, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, + 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, + 0x1103, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, + 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x7f15, + 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, + 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19d2, 0x7172, 0x7276, + 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d2, + 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, + 0x2069, 0x1800, 0x69e8, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, + 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c1, 0x0088, + 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69ea, + 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094, + 0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ea, 0x080c, 0x0eed, 0x002e, + 0x0005, 0x69e4, 0x9184, 0x003f, 0x05b8, 0x8109, 0x9184, 0x003f, + 0x01a8, 0x6a50, 0x6870, 0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc, + 0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x0f0f, 0x00ee, 0x0400, 0x69e6, 0x00f0, 0x0026, 0x8107, + 0x9094, 0x0007, 0x0128, 0x8001, 0x8007, 0x9085, 0x0007, 0x0050, + 0x2010, 0x8004, 0x8004, 0x8004, 0x9084, 0x0007, 0x9205, 0x8007, + 0x9085, 0x0028, 0x9086, 0x0040, 0x2010, 0x00e6, 0x2071, 0x1800, + 0x080c, 0x0f0f, 0x00ee, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3d, + 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, + 0x1a3d, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, + 0x1150, 0x00c6, 0x2061, 0x1a3d, 0x6014, 0x00ce, 0x9005, 0x1130, + 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, + 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, + 0x0904, 0x81f2, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x81cb, 0x2009, + 0x0006, 0x080c, 0x821f, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, + 0x08b0, 0xd0fc, 0x05c8, 0x908c, 0x2023, 0x1550, 0x87ff, 0x1540, + 0x6124, 0x918c, 0x0500, 0x1520, 0x6100, 0x918e, 0x0007, 0x1500, + 0x2009, 0x1875, 0x210c, 0xd184, 0x11d8, 0x6003, 0x0003, 0x6007, + 0x0043, 0x6047, 0xb035, 0x080c, 0x1a79, 0xa87c, 0xc0dd, 0xa87e, + 0x600f, 0x0000, 0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8, + 0x7833, 0x0013, 0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005, + 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8219, 0x908c, + 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, + 0x1875, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, + 0x0804, 0x9b03, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, + 0x9b03, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, + 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, + 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, + 0x918e, 0x0003, 0x1904, 0x8219, 0x908c, 0x2020, 0x918e, 0x2020, + 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x1646, 0x00fe, 0x007e, + 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9b03, 0x0005, 0x6110, + 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, + 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, + 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, + 0x2009, 0x0041, 0x080c, 0x9b03, 0x0005, 0x00b9, 0x0ce8, 0x87ff, + 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9b03, 0x0cb0, 0x6110, 0x00b6, + 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, + 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, + 0x080c, 0xb6c5, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, + 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, + 0x1158, 0x00c6, 0x2061, 0x1a3d, 0x6200, 0xd28c, 0x1120, 0x6204, + 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x6674, 0x6014, 0x904d, + 0x0076, 0x2039, 0x0000, 0x190c, 0x813b, 0x007e, 0x009e, 0x0005, + 0x0156, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x81ff, 0x0110, 0x9205, + 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, + 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, + 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, + 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, 0x826a, + 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, + 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, + 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x8281, + 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8281, 0x0006, 0x3200, + 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, + 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, + 0x2079, 0x19b6, 0x012e, 0x00d6, 0x2069, 0x19b6, 0x6803, 0x0005, + 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, + 0x9678, 0x04a9, 0x080c, 0x9663, 0x0491, 0x080c, 0x9666, 0x0479, + 0x080c, 0x9669, 0x0461, 0x080c, 0x966c, 0x0449, 0x080c, 0x966f, + 0x0431, 0x080c, 0x9672, 0x0419, 0x080c, 0x9675, 0x0401, 0x01de, + 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, 0x2079, 0x0380, 0x00f9, + 0x7807, 0x0003, 0x7803, 0x0000, 0x7803, 0x0001, 0x2069, 0x0004, + 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, 0x206a, 0x2069, 0x0100, + 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de, 0x0005, 0x20a9, + 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, + 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, + 0x0031, 0x782b, 0x1abd, 0x781f, 0xff00, 0x781b, 0xff00, 0x2061, + 0x1ab2, 0x602f, 0x19b6, 0x6033, 0x1800, 0x6037, 0x19d2, 0x603b, + 0x1cca, 0x603f, 0x1cda, 0x6042, 0x6047, 0x1a88, 0x00ce, 0x0005, + 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x01b0, + 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x602c, + 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, + 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, 0x6146, 0x2c08, + 0x2001, 0x0012, 0x080c, 0x9737, 0x0005, 0x0016, 0x2009, 0x8020, + 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0x9737, 0x0088, 0x00c6, + 0x2061, 0x19b6, 0x602c, 0x8000, 0x602e, 0x600c, 0x9005, 0x0128, + 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112, 0x610e, 0x00ce, + 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, + 0x19b6, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6146, + 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, 0x600f, 0x0000, + 0x2c08, 0x2001, 0x0013, 0x080c, 0x9737, 0x0005, 0x6044, 0xd0dc, + 0x0128, 0x9006, 0x7007, 0x0000, 0x700a, 0x7032, 0x0005, 0x00f6, + 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, + 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19b6, + 0x7648, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x8400, + 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x83fb, 0x87ff, 0x0120, + 0x605c, 0x9106, 0x1904, 0x83fb, 0x704c, 0x9c06, 0x1178, 0x0036, + 0x2019, 0x0001, 0x080c, 0x90f0, 0x703f, 0x0000, 0x9006, 0x704e, + 0x706a, 0x7052, 0x706e, 0x003e, 0x2029, 0x0001, 0x080c, 0x837e, + 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x600f, 0x0000, 0x080c, 0xb6c5, 0x01c8, 0x6014, 0x2048, 0x6020, + 0x9086, 0x0003, 0x1560, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x0016, 0x0036, 0x0076, 0x080c, 0xb9bc, 0x080c, 0xd370, 0x080c, + 0x683f, 0x007e, 0x003e, 0x001e, 0x080c, 0xb8ad, 0x080c, 0x9a9f, + 0x00ce, 0x0804, 0x839d, 0x2c78, 0x600c, 0x2060, 0x0804, 0x839d, + 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, + 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, + 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xd370, + 0x080c, 0xd079, 0x007e, 0x003e, 0x001e, 0x08c0, 0x6020, 0x9086, + 0x000a, 0x0918, 0x0800, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, + 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19b6, 0x7848, + 0x9065, 0x0904, 0x8482, 0x600c, 0x0006, 0x600f, 0x0000, 0x784c, + 0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x783f, + 0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52, 0x7b6e, 0x003e, 0x000e, + 0x9005, 0x1118, 0x600c, 0x600f, 0x0000, 0x0006, 0x00e6, 0x2f70, + 0x080c, 0x837e, 0x00ee, 0x080c, 0xb6c5, 0x0520, 0x6014, 0x2048, + 0x6020, 0x9086, 0x0003, 0x1580, 0x3e08, 0x918e, 0x0002, 0x1188, + 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0140, 0x6048, 0x9005, 0x1198, 0x2001, 0x1957, 0x2004, 0x604a, + 0x0070, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6833, + 0x080c, 0xb8ad, 0x6044, 0xc0fc, 0x6046, 0x080c, 0x9a9f, 0x000e, + 0x0804, 0x8430, 0x7e4a, 0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce, + 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, + 0x080c, 0xd079, 0x0c38, 0x6020, 0x9086, 0x000a, 0x09e0, 0x08c8, + 0x0016, 0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x8589, 0x008e, + 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19b6, 0x2091, + 0x8000, 0x080c, 0x85d2, 0x080c, 0x8666, 0x080c, 0x62f3, 0x012e, + 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, + 0x7620, 0x2660, 0x2678, 0x8cff, 0x0904, 0x854e, 0x6010, 0x2058, + 0xb8a0, 0x9206, 0x1904, 0x8549, 0x88ff, 0x0120, 0x605c, 0x9106, + 0x1904, 0x8549, 0x7030, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, + 0xd0a4, 0x1508, 0x080c, 0x8068, 0x080c, 0x8e21, 0x68c3, 0x0000, + 0x080c, 0x9320, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, + 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, + 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, + 0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad, 0x700a, 0x6003, 0x0009, + 0x630a, 0x0804, 0x8549, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, + 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, + 0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, + 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x01e8, 0x6020, 0x9086, 0x0003, + 0x1580, 0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0098, 0xa867, + 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, + 0xb9bc, 0x080c, 0xd370, 0x080c, 0x683f, 0x008e, 0x003e, 0x001e, + 0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x080c, 0x91f6, 0x00ce, 0x0804, + 0x84c3, 0x2c78, 0x600c, 0x2060, 0x0804, 0x84c3, 0x012e, 0x000e, + 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, + 0x080c, 0xd370, 0x080c, 0xd079, 0x008e, 0x003e, 0x001e, 0x08d0, + 0x080c, 0xa40d, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, + 0x9086, 0x0085, 0x000e, 0x0904, 0x852f, 0x9086, 0x008b, 0x0904, + 0x852f, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, + 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, + 0x8542, 0x0006, 0x00f6, 0x00e6, 0x0096, 0x00b6, 0x00c6, 0x0066, + 0x0016, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, + 0x2079, 0x19b6, 0x9036, 0x7828, 0x2060, 0x8cff, 0x0538, 0x6010, + 0x9b06, 0x1500, 0x6043, 0xffff, 0x080c, 0x9902, 0x01d8, 0x610c, + 0x0016, 0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, + 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xb9bc, 0x080c, + 0xd370, 0x080c, 0x683f, 0x008e, 0x003e, 0x001e, 0x080c, 0x9a9f, + 0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060, 0x08b8, 0x080c, 0x6310, + 0x012e, 0x001e, 0x006e, 0x00ce, 0x00be, 0x009e, 0x00ee, 0x00fe, + 0x000e, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, + 0x7820, 0x9065, 0x0904, 0x8639, 0x600c, 0x0006, 0x6044, 0xc0fc, + 0x6046, 0x600f, 0x0000, 0x7830, 0x9c06, 0x1588, 0x2069, 0x0100, + 0x6820, 0xd0a4, 0x1508, 0x080c, 0x8068, 0x080c, 0x8e21, 0x68c3, + 0x0000, 0x080c, 0x9320, 0x7833, 0x0000, 0x0036, 0x2069, 0x0140, + 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, + 0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, + 0x6827, 0x0001, 0x003e, 0x0058, 0x080c, 0x6513, 0x1538, 0x6003, + 0x0009, 0x630a, 0x7808, 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014, + 0x2048, 0x080c, 0xb6c3, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, + 0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0060, 0x080c, 0x6513, + 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x683f, + 0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x080c, 0x91f6, 0x000e, 0x0804, + 0x85d9, 0x7e22, 0x7e1e, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, + 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd079, 0x0c50, + 0x080c, 0xa40d, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, + 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, + 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, + 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0096, + 0x00b6, 0x00c6, 0x0066, 0x9036, 0x7828, 0x9065, 0x0510, 0x6010, + 0x2058, 0x600c, 0x0006, 0x3e08, 0x918e, 0x0002, 0x1118, 0xb800, + 0xd0bc, 0x11a8, 0x6043, 0xffff, 0x080c, 0x9902, 0x0180, 0x610c, + 0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x683f, 0x080c, 0x9a9f, 0x000e, 0x08f0, 0x2c30, + 0x0ce0, 0x006e, 0x00ce, 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6, + 0x00d6, 0x0096, 0x0066, 0x080c, 0x5cdc, 0x11b0, 0x2071, 0x19b6, + 0x7030, 0x9080, 0x0005, 0x2004, 0x904d, 0x0170, 0xa878, 0x9606, + 0x1158, 0x2071, 0x19b6, 0x7030, 0x9035, 0x0130, 0x9080, 0x0005, + 0x2004, 0x9906, 0x1108, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, + 0x0005, 0x00c6, 0x2660, 0x6043, 0xffff, 0x080c, 0x9902, 0x0178, + 0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x080c, 0x9a9f, 0x00ce, + 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x080c, 0x97a4, 0x0106, 0x190c, + 0x9746, 0x2071, 0x0101, 0x2e04, 0xc0c4, 0x2072, 0x6044, 0xd0fc, + 0x1138, 0x010e, 0x190c, 0x9762, 0x00ce, 0x00ee, 0x00be, 0x0005, + 0x2071, 0x19b6, 0x7030, 0x9005, 0x0da0, 0x9c06, 0x190c, 0x0d65, + 0x7036, 0x080c, 0x8068, 0x7004, 0x9084, 0x0007, 0x0002, 0x8701, + 0x8703, 0x870a, 0x8714, 0x8722, 0x8701, 0x870a, 0x86ff, 0x080c, + 0x0d65, 0x0428, 0x0005, 0x080c, 0x98ed, 0x7007, 0x0000, 0x7033, + 0x0000, 0x00e8, 0x0066, 0x9036, 0x080c, 0x8f7a, 0x006e, 0x7007, + 0x0000, 0x7033, 0x0000, 0x0098, 0x080c, 0x98d8, 0x0140, 0x080c, + 0x98ed, 0x0128, 0x0066, 0x9036, 0x080c, 0x8f7a, 0x006e, 0x7033, + 0x0000, 0x0028, 0x080c, 0x98d8, 0x080c, 0x9320, 0x0000, 0x010e, + 0x190c, 0x9762, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x00d6, 0x00c6, + 0x080c, 0x97a4, 0x0106, 0x190c, 0x9746, 0x6044, 0xd0fc, 0x1130, + 0x010e, 0x190c, 0x9762, 0x00ce, 0x00de, 0x0005, 0x2069, 0x19b6, + 0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d65, 0x6852, 0x00e6, + 0x2d70, 0x080c, 0x837e, 0x00ee, 0x080c, 0x8075, 0x0016, 0x2009, + 0x0040, 0x080c, 0x201d, 0x001e, 0x683c, 0x9084, 0x0003, 0x0002, + 0x875e, 0x875f, 0x877d, 0x875c, 0x080c, 0x0d65, 0x0460, 0x6868, + 0x9086, 0x0001, 0x0190, 0x600c, 0x9015, 0x0160, 0x6a4a, 0x600f, + 0x0000, 0x6044, 0xc0fc, 0x6046, 0x9006, 0x7042, 0x684e, 0x683f, + 0x0000, 0x00c8, 0x684a, 0x6846, 0x0ca0, 0x686b, 0x0000, 0x6848, + 0x9065, 0x0d78, 0x6003, 0x0002, 0x0c60, 0x9006, 0x686a, 0x6852, + 0x686e, 0x600c, 0x9015, 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0018, + 0x684e, 0x684a, 0x6846, 0x684f, 0x0000, 0x010e, 0x190c, 0x9762, + 0x00ce, 0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, 0x000b, + 0x0005, 0x87a9, 0x87ac, 0x8c05, 0x8c94, 0x87ac, 0x8c05, 0x8c94, + 0x87a9, 0x87ac, 0x87a9, 0x87a9, 0x87a9, 0x87a9, 0x87a9, 0x87a9, + 0x87a9, 0x080c, 0x86d1, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, + 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, + 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65, 0x6110, + 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, + 0x1a04, 0x8818, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, + 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x898f, 0x89ca, + 0x89f3, 0x8a96, 0x8ab7, 0x8abd, 0x8aca, 0x8ad2, 0x8ade, 0x8ae4, + 0x8af5, 0x8ae4, 0x8b4c, 0x8ad2, 0x8b58, 0x8b5e, 0x8ade, 0x8b5e, + 0x8b6a, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816, + 0x8816, 0x8816, 0x8816, 0x8816, 0x8f9b, 0x8fbe, 0x8fcf, 0x8fef, + 0x9021, 0x8aca, 0x8816, 0x8aca, 0x8ae4, 0x8816, 0x89f3, 0x8a96, + 0x8816, 0x9413, 0x8ae4, 0x8816, 0x942f, 0x8ae4, 0x8816, 0x8ade, + 0x8989, 0x8839, 0x8816, 0x944b, 0x94b8, 0x9598, 0x8816, 0x95a5, + 0x8ac7, 0x95d0, 0x8816, 0x902b, 0x95dc, 0x8816, 0x080c, 0x0d65, + 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, + 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8837, 0x8837, 0x8837, + 0x8860, 0x890c, 0x8917, 0x8837, 0x8837, 0x8837, 0x895e, 0x896a, + 0x887b, 0x8837, 0x8896, 0x88ca, 0x9958, 0x999d, 0x8ae4, 0x080c, + 0x0d65, 0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003, 0x2414, 0x7007, + 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, + 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x8df1, 0x009e, + 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, + 0x99e4, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, + 0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003, 0x0500, 0x7814, 0x2048, + 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, + 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8df1, + 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003, + 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, + 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, + 0x0010, 0x080c, 0x8df1, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, + 0x0126, 0x2091, 0x8000, 0x080c, 0x8b7d, 0x20e9, 0x0000, 0x2001, + 0x1972, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, + 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, + 0x2001, 0x1972, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x2002, + 0x080c, 0xc3f7, 0x9006, 0x080c, 0x2002, 0x001e, 0xa804, 0x9005, + 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8df1, 0x012e, 0x009e, + 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, + 0x8bc8, 0x20e9, 0x0000, 0x2001, 0x1972, 0x2003, 0x0000, 0x7814, + 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, + 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, + 0x2001, 0x1972, 0x0016, 0x200c, 0x080c, 0xc3f7, 0x001e, 0xa804, + 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, + 0x0fd5, 0x080c, 0x8df1, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, + 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, + 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8b7d, 0x7003, 0x7800, + 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x00d6, + 0x00e6, 0x080c, 0x8bc8, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, + 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, + 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, + 0x1f04, 0x892d, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, + 0x8e70, 0x1f04, 0x8936, 0x2069, 0x1982, 0x9086, 0xdf00, 0x0110, + 0x2069, 0x199c, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, + 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, + 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8944, 0x60c3, + 0x004c, 0x080c, 0x8df1, 0x00ee, 0x00de, 0x0005, 0x080c, 0x8b7d, + 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, + 0x0804, 0x8df1, 0x00d6, 0x0026, 0x0016, 0x080c, 0x8bc8, 0x7003, + 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, + 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee, + 0x7206, 0x710a, 0x62c2, 0x080c, 0x8df1, 0x001e, 0x002e, 0x00de, + 0x0005, 0x2001, 0x1817, 0x2004, 0x609a, 0x0804, 0x8df1, 0x080c, + 0x8b7d, 0x7003, 0x5200, 0x2069, 0x1853, 0x6804, 0xd084, 0x0130, + 0x6828, 0x0016, 0x080c, 0x2422, 0x710e, 0x001e, 0x20a9, 0x0004, + 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, + 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, 0x4003, + 0x080c, 0x99e4, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, + 0x181e, 0x2004, 0x7032, 0x2001, 0x181f, 0x2004, 0x7036, 0x0030, + 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c, + 0x0804, 0x8df1, 0x080c, 0x8b7d, 0x7003, 0x0500, 0x080c, 0x99e4, + 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, + 0x700a, 0x2001, 0x181f, 0x2004, 0x700e, 0x0030, 0x2001, 0x1817, + 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, + 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, + 0x0010, 0x0804, 0x8df1, 0x080c, 0x8b7d, 0x9006, 0x080c, 0x6527, + 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, + 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, 0x9006, 0xa89a, + 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, 0x9086, 0x007e, + 0x1904, 0x8a5e, 0x00d6, 0x2069, 0x193d, 0x2001, 0x1836, 0x2004, + 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000, 0x7012, + 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, + 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, 0x6f5c, + 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x680c, + 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, + 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, + 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0x9663, 0x2069, + 0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x52a1, + 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, 0x2001, 0x1836, + 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, 0x60e0, 0x9106, + 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2463, 0x61e2, 0x001e, + 0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9, 0x0000, 0x20a1, 0x024e, + 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, + 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, + 0x4003, 0x080c, 0x9663, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, + 0x1945, 0x4003, 0x60c3, 0x0074, 0x0804, 0x8df1, 0x080c, 0x8b7d, + 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, + 0x9006, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110, + 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6, + 0x0804, 0x8b2d, 0x7026, 0x60c3, 0x0014, 0x0804, 0x8df1, 0x080c, + 0x8b7d, 0x7003, 0x5000, 0x0804, 0x8a0d, 0x080c, 0x8b7d, 0x7003, + 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x8df1, 0x080c, + 0x8bbf, 0x0010, 0x080c, 0x8bc8, 0x7003, 0x0200, 0x60c3, 0x0004, + 0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0100, 0x700b, 0x0003, + 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x080c, 0x8bc8, + 0x7003, 0x0200, 0x0804, 0x8a0d, 0x080c, 0x8bc8, 0x7003, 0x0100, + 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, 0x7814, + 0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x00d6, 0x080c, 0x8bc8, + 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894, 0x9086, + 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998, 0x9184, + 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f, + 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010, + 0x700f, 0x0800, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac, + 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x2009, 0x1875, + 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, 0x1873, + 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbac4, 0xd28c, 0x1108, 0xc0cd, + 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094, + 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3, + 0x0014, 0x00de, 0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0210, + 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, 0x8df1, + 0x080c, 0x8bc8, 0x7003, 0x0200, 0x0804, 0x8993, 0x080c, 0x8bc8, + 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, + 0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0100, 0x700b, 0x000b, + 0x60c3, 0x0008, 0x0804, 0x8df1, 0x0026, 0x00d6, 0x0036, 0x0046, + 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, + 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x9678, 0xb810, + 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, + 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, 0x00de, + 0x080c, 0x8de5, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, + 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x9678, 0x7003, + 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6878, 0x700a, + 0x687c, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, 0x7003, 0x0100, + 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, 0x0005, 0x0026, + 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0040, + 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, + 0x080c, 0x9678, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, + 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128, 0x700b, + 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, 0x687c, 0x700e, + 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, + 0x8de5, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, + 0x002e, 0x0005, 0x080c, 0x8de5, 0x721a, 0x7a08, 0x7222, 0x7814, + 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, + 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, + 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x6110, + 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, + 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8c36, + 0x8c45, 0x8c50, 0x8c34, 0x8c34, 0x8c34, 0x8c36, 0x8c34, 0x8c34, + 0x8c34, 0x8c34, 0x8c34, 0x8c34, 0x080c, 0x0d65, 0x0411, 0x60c3, + 0x0000, 0x0026, 0x080c, 0x2760, 0x0228, 0x2011, 0x0101, 0x2204, + 0xc0c5, 0x2012, 0x002e, 0x0804, 0x8df1, 0x0431, 0x7808, 0x700a, + 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, 0x8df1, + 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x0804, + 0x8df1, 0x0026, 0x080c, 0x9678, 0xb810, 0x9085, 0x8100, 0x7002, + 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, + 0x7013, 0x0009, 0x0804, 0x8b98, 0x0026, 0x080c, 0x9678, 0xb810, + 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, + 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8bfa, + 0x0026, 0x080c, 0x9678, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, + 0x0099, 0x7012, 0x0804, 0x8bfa, 0x00b6, 0x00c6, 0x00d6, 0x00e6, + 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, 0x908a, + 0x0040, 0x0a0c, 0x0d65, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x7910, + 0x2158, 0xb984, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x0033, + 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8cc9, 0x8cc9, + 0x8cc9, 0x8ced, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9, + 0x8cc9, 0x91c3, 0x91cf, 0x91db, 0x91e7, 0x8cc9, 0x8cc9, 0x8cc9, + 0x91b7, 0x080c, 0x0d65, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8c4, + 0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52, 0x722e, 0x732a, 0x9294, + 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, + 0xba14, 0x7206, 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0829, + 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x0016, 0x7814, 0x9084, + 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x8cfd, 0x8cfd, 0x8cff, + 0x8cfd, 0x8cfd, 0x8cfd, 0x8d19, 0x8cfd, 0x080c, 0x0d65, 0x7914, + 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, + 0x2069, 0x1853, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, + 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, + 0x8df1, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, + 0x080c, 0x9678, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, + 0x7006, 0x2069, 0x1800, 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, + 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8de5, 0x721a, 0x7a08, + 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, + 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, + 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x7378, 0x747c, + 0x7820, 0x0002, 0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d61, + 0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d63, 0x8d61, 0x8d61, 0x8d61, + 0x8d61, 0x080c, 0x0d65, 0x609f, 0x0000, 0x7814, 0x2048, 0xa87c, + 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, + 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, + 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705, + 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, + 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001, + 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048, + 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039, + 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073, + 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, + 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000, + 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, + 0x0000, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, + 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, + 0x9658, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, + 0x2009, 0x1b58, 0x080c, 0x806d, 0x003e, 0x004e, 0x005e, 0x00ce, + 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff, + 0x8217, 0x0005, 0x00d6, 0x2069, 0x19b6, 0x686b, 0x0001, 0x00de, + 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x805f, + 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, + 0x0600, 0x0128, 0x0089, 0x080c, 0x805f, 0x001e, 0x0005, 0xc1e5, + 0x2001, 0x180c, 0x2102, 0x2001, 0x19b7, 0x2003, 0x0000, 0x2001, + 0x19c2, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009, + 0x1804, 0x2011, 0x0009, 0x080c, 0x283a, 0x002e, 0x001e, 0x000e, + 0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0x97a4, 0x0106, 0x190c, + 0x9746, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, + 0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x283a, 0x002e, 0x001e, + 0x010e, 0x190c, 0x9762, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, + 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, + 0x0100, 0x2069, 0x0140, 0x080c, 0x6f5c, 0x1510, 0x2001, 0x19db, + 0x2004, 0x9005, 0x1904, 0x8ea2, 0x080c, 0x6ffd, 0x11a8, 0x2069, + 0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, + 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d65, 0x6843, + 0x0100, 0x080c, 0x805f, 0x04b0, 0x00c6, 0x2061, 0x19b6, 0x00f0, + 0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0x8e21, 0x080c, 0x2801, + 0x00c6, 0x2061, 0x19b6, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108, + 0x6136, 0x080c, 0x9746, 0x6130, 0x080c, 0x9762, 0x00ce, 0x81ff, + 0x01c8, 0x080c, 0x805f, 0x080c, 0x8e14, 0x00a0, 0x080c, 0x9746, + 0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xd43c, 0x080c, 0x8068, + 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0x9b03, 0x080c, 0x9762, + 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, + 0x19db, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b6, 0x6134, + 0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x805f, + 0x080c, 0x5a9d, 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, + 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8075, + 0x080c, 0x9746, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19b6, + 0x714c, 0x81ff, 0x0904, 0x8f36, 0x2061, 0x0100, 0x2069, 0x0140, + 0x080c, 0x6f5c, 0x11c0, 0x0036, 0x2019, 0x0002, 0x080c, 0x90f0, + 0x003e, 0x714c, 0x2160, 0x080c, 0xd43c, 0x2009, 0x004a, 0x6003, + 0x0003, 0x080c, 0x9b03, 0x2001, 0x0386, 0x2003, 0x5040, 0x080c, + 0x6ffd, 0x0804, 0x8f36, 0x6904, 0xd1f4, 0x0904, 0x8f43, 0x080c, + 0x2801, 0x00c6, 0x704c, 0x9065, 0x090c, 0x0d65, 0x6020, 0x00ce, + 0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4, 0x9105, 0x11f8, 0x2009, + 0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214, 0x9294, 0x1800, 0x1128, + 0x6224, 0x9294, 0x0002, 0x1510, 0x0010, 0xc0d4, 0x200a, 0x6014, + 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c, 0x2060, 0x080c, + 0x872e, 0x2009, 0x0049, 0x080c, 0x9b03, 0x0080, 0x0036, 0x2019, + 0x0001, 0x080c, 0x90f0, 0x003e, 0x714c, 0x2160, 0x080c, 0xd43c, + 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0x9b03, 0x2001, 0x0387, + 0x2003, 0x0200, 0x080c, 0x9762, 0x002e, 0x001e, 0x00ee, 0x00de, + 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x8ef7, 0x0804, 0x8ef9, + 0x0026, 0x00e6, 0x2071, 0x19b6, 0x706c, 0xd084, 0x01d0, 0xc084, + 0x706e, 0x714c, 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, + 0x2114, 0x928e, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, + 0x080c, 0x283a, 0x0030, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, + 0x283a, 0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19c0, 0x2004, + 0x9005, 0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, + 0x0001, 0x0005, 0x00f6, 0x2079, 0x19b6, 0x610c, 0x9006, 0x600e, + 0x6044, 0xc0fc, 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, + 0x7826, 0x782a, 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, + 0x00ce, 0x7824, 0x9c06, 0x1108, 0x7e26, 0x080c, 0x91f6, 0x080c, + 0xb8ad, 0x00fe, 0x0005, 0x080c, 0x8b7d, 0x7003, 0x1200, 0x7838, + 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, + 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, + 0x0020, 0x2061, 0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a, + 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x8df1, 0x080c, 0x8b7d, + 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, + 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x0156, + 0x080c, 0x8bc8, 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, + 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, + 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, + 0x1f04, 0x8fe0, 0x60c3, 0x001c, 0x015e, 0x0804, 0x8df1, 0x0016, + 0x0026, 0x080c, 0x8ba4, 0x080c, 0x8bb6, 0x9e80, 0x0004, 0x20e9, + 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, + 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, + 0x8003, 0x60c2, 0x080c, 0x8df1, 0x002e, 0x001e, 0x0005, 0x20a9, + 0x0010, 0x4003, 0x080c, 0x9663, 0x20a1, 0x0240, 0x22a8, 0x4003, + 0x0c68, 0x080c, 0x8b7d, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, + 0x0008, 0x0804, 0x8df1, 0x0016, 0x0026, 0x080c, 0x8b7d, 0x20e9, + 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, + 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, + 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x8df1, + 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, + 0x8000, 0x2071, 0x19b6, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, + 0xb8d3, 0x1110, 0x080c, 0xa40d, 0x600c, 0x0006, 0x080c, 0xbb4a, + 0x600f, 0x0000, 0x080c, 0x9a65, 0x080c, 0x91f6, 0x00ce, 0x0c68, + 0x2c00, 0x7012, 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, + 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, + 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, + 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b6, + 0x7030, 0x2060, 0x8cff, 0x0548, 0x080c, 0x8e21, 0x6ac0, 0x68c3, + 0x0000, 0x080c, 0x8068, 0x00c6, 0x2061, 0x0100, 0x080c, 0x967c, + 0x00ce, 0x20a9, 0x01f4, 0x04b1, 0x080c, 0x86d1, 0x6044, 0xd0ac, + 0x1128, 0x2001, 0x1957, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, + 0x080c, 0x9b03, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, + 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x8068, + 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, + 0x68c3, 0x0000, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x20a9, 0x01f4, + 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, + 0x9084, 0x4000, 0x190c, 0x2801, 0x0090, 0xd084, 0x0118, 0x6827, + 0x0001, 0x0010, 0x1f04, 0x90d2, 0x7804, 0x9084, 0x1000, 0x0138, + 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, 0x0005, + 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, + 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, + 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, + 0x701c, 0x0006, 0x701f, 0x0202, 0x2071, 0x19b6, 0x704c, 0x2060, + 0x8cff, 0x0904, 0x9191, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, + 0x0002, 0x0904, 0x9191, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, + 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8075, + 0x080c, 0x1c4d, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e3d, 0x2021, + 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, + 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, + 0x2071, 0x19b6, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, + 0x782b, 0x0008, 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, + 0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009, + 0x0040, 0x080c, 0x201d, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e3d, + 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, + 0x7804, 0x9084, 0x4000, 0x190c, 0x2801, 0x0090, 0xd08c, 0x0118, + 0x6827, 0x0002, 0x0010, 0x1f04, 0x9163, 0x7804, 0x9084, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, + 0x6827, 0x4000, 0x6824, 0x83ff, 0x1160, 0x2009, 0x0049, 0x080c, + 0x872e, 0x6044, 0xd0ac, 0x1118, 0x6003, 0x0002, 0x0010, 0x080c, + 0x9b03, 0x000e, 0x2071, 0x0380, 0xd08c, 0x1110, 0x701f, 0x0200, + 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, + 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, + 0x19b6, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, + 0x8000, 0x2069, 0x19b6, 0x6a3e, 0x012e, 0x00de, 0x0005, 0x080c, + 0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x1000, 0x0478, 0x080c, 0x8ccb, 0x7814, 0x080c, 0x52a5, + 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, + 0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x2000, 0x00b8, 0x080c, 0x8ccb, 0x7814, 0x080c, 0x52a5, + 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, + 0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042, + 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x8df1, 0x00e6, 0x2071, + 0x19b6, 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, 0x00ee, 0x0005, + 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, + 0x2091, 0x8000, 0x2071, 0x19b6, 0x7620, 0x2660, 0x2678, 0x2039, + 0x0001, 0x87ff, 0x0904, 0x929b, 0x8cff, 0x0904, 0x929b, 0x6020, + 0x9086, 0x0006, 0x1904, 0x9296, 0x88ff, 0x0138, 0x2800, 0x9c06, + 0x1904, 0x9296, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, + 0x9296, 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x9296, 0x7030, + 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, + 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x8068, 0x080c, 0x9320, + 0x7033, 0x0000, 0x0428, 0x080c, 0x8068, 0x6820, 0xd0b4, 0x0110, + 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9320, + 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, + 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, + 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, + 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, + 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, + 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, + 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, + 0xb6c3, 0x0110, 0x080c, 0xd079, 0x009e, 0x080c, 0x9a9f, 0x080c, + 0x91f6, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9211, 0x2c78, 0x600c, + 0x2060, 0x0804, 0x9211, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, + 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, + 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, + 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, + 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, 0x930f, 0x6020, 0x9086, + 0x0006, 0x1904, 0x930a, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, + 0x930a, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x605c, + 0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, + 0x080c, 0x90f0, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, + 0x706e, 0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, + 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, + 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb6c3, + 0x0110, 0x080c, 0xd079, 0x080c, 0x9a9f, 0x87ff, 0x1198, 0x00ce, + 0x0804, 0x92bb, 0x2c78, 0x600c, 0x2060, 0x0804, 0x92bb, 0x9006, + 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, + 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, + 0x00e6, 0x2071, 0x19b6, 0x7033, 0x0000, 0x7004, 0x9086, 0x0003, + 0x0158, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, + 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, + 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, + 0x19b6, 0x2c10, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, + 0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, + 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, + 0x7047, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, + 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, + 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, + 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, + 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, 0x7610, + 0x2660, 0x2678, 0x8cff, 0x0904, 0x9402, 0x6010, 0x00b6, 0x2058, + 0xb8a0, 0x00be, 0x9206, 0x1904, 0x93fd, 0x7030, 0x9c06, 0x1520, + 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x93d9, 0x080c, 0x8e21, + 0x68c3, 0x0000, 0x080c, 0x9320, 0x7033, 0x0000, 0x0036, 0x2069, + 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, + 0x27f1, 0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, + 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, 0x660c, + 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, + 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, + 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb8c2, + 0x1158, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x11f0, 0x080c, 0xa40d, + 0x00d8, 0x080c, 0x9320, 0x08c0, 0x080c, 0xb8d3, 0x1118, 0x080c, + 0xa40d, 0x0090, 0x6014, 0x2048, 0x080c, 0xb6c3, 0x0168, 0x6020, + 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, + 0x080c, 0x6833, 0x080c, 0xb8ad, 0x080c, 0xbb4a, 0x080c, 0x9a9f, + 0x080c, 0x91f6, 0x00ce, 0x0804, 0x9382, 0x2c78, 0x600c, 0x2060, + 0x0804, 0x9382, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, + 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, + 0x080c, 0xd079, 0x0c08, 0x00d6, 0x080c, 0x8bc8, 0x7003, 0x0200, + 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1958, + 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, + 0x0004, 0x7027, 0x7878, 0x080c, 0x8df1, 0x00de, 0x0005, 0x080c, + 0x8bc8, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, + 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7860, 0x9084, 0x00ff, + 0x9085, 0x0200, 0x7002, 0x7860, 0x9084, 0xff00, 0x8007, 0x7006, + 0x60c2, 0x0804, 0x8df1, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, + 0x2009, 0x0035, 0x080c, 0xbd4f, 0x00de, 0x1904, 0x94b0, 0x080c, + 0x8b7d, 0x7003, 0x1300, 0x782c, 0x080c, 0x95bb, 0x2068, 0x6820, + 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0x99e4, + 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, + 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, + 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, + 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, + 0x700a, 0xb814, 0x700e, 0x00c0, 0xb884, 0x700e, 0x00a8, 0x080c, + 0x99e4, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, + 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, + 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, + 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8df1, 0x00be, 0x0005, + 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, + 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, + 0x0003, 0x0904, 0x952e, 0x9186, 0x0005, 0x0904, 0x9516, 0x9186, + 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, 0x951f, 0x7807, 0x0037, + 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x9598, 0x0005, 0x080c, + 0x9559, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, + 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0x94f7, 0x9502, 0x94f9, 0x9502, + 0x94fe, 0x94f7, 0x94f7, 0x9502, 0x9502, 0x9502, 0x9502, 0x94f7, + 0x94f7, 0x94f7, 0x94f7, 0x94f7, 0x9502, 0x94f7, 0x9502, 0x080c, + 0x0d65, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, + 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9552, + 0x080c, 0x9559, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, + 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04e0, 0x080c, 0x9559, + 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0498, 0x04c9, + 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, + 0x0118, 0x9286, 0x0002, 0x1108, 0x900e, 0x0420, 0x0451, 0x00d6, + 0x0026, 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, + 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, + 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, 0x0000, 0x2004, + 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000, + 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804, + 0x8df1, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x8bc8, + 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, + 0x2058, 0xb8a0, 0x080c, 0x99e4, 0x1118, 0x9092, 0x007e, 0x0268, + 0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000, + 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0xbc84, 0x2029, + 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, 0x0003, + 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, 0x7416, + 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, 0x0005, + 0x080c, 0x8bc8, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, + 0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x080c, 0x8b74, 0x7003, + 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, + 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, + 0x0010, 0x0804, 0x8df1, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, + 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8c4, 0xd084, 0x0120, 0x7850, + 0x702a, 0x784c, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, + 0x080c, 0x8bbf, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, + 0x60c3, 0x0008, 0x0804, 0x8df1, 0x00a9, 0x7914, 0x712a, 0x60c3, + 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2760, 0x0228, 0x2011, + 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x8e14, 0x080c, + 0x805f, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7860, 0x2048, + 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294, + 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff, + 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870, + 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x9678, + 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860, + 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035, + 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, + 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096, + 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001, + 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4, + 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5, + 0x2102, 0x2009, 0x1981, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010, + 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, 0x900e, 0x080c, + 0x283a, 0x002e, 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, + 0x0088, 0x2009, 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, + 0x000d, 0x0040, 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, + 0x2009, 0x0008, 0x6912, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, + 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, + 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, + 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, + 0x6812, 0x0c60, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, + 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, + 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9723, 0x7030, 0x9c06, + 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x96fa, 0x080c, + 0x8e21, 0x68c3, 0x0000, 0x080c, 0x9320, 0x7033, 0x0000, 0x0036, + 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, + 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, + 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, + 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, + 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, + 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, + 0xb8c2, 0x1158, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x11f0, 0x080c, + 0xa40d, 0x00d8, 0x080c, 0x9320, 0x08c0, 0x080c, 0xb8d3, 0x1118, + 0x080c, 0xa40d, 0x0090, 0x6014, 0x2048, 0x080c, 0xb6c3, 0x0168, + 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, + 0x0000, 0x080c, 0x683f, 0x080c, 0xb8ad, 0x080c, 0xbb4a, 0x080c, + 0x9a9f, 0x080c, 0x91f6, 0x00ce, 0x0804, 0x96ab, 0x2c78, 0x600c, + 0x2060, 0x0804, 0x96ab, 0x7013, 0x0000, 0x700f, 0x0000, 0x012e, + 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, + 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xd079, 0x08f0, 0x00f6, + 0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc, 0x1de8, 0x7832, 0x7936, + 0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe, 0x0005, 0x0016, 0x2001, + 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1188, 0x2001, + 0x0015, 0x0c29, 0x2009, 0x1000, 0x2001, 0x0382, 0x2004, 0x9084, + 0x0007, 0x9086, 0x0003, 0x0120, 0x8109, 0x1db0, 0x080c, 0x0d65, + 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, + 0x0003, 0x1120, 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, 0x0156, + 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, 0x19b6, 0x0469, 0x0106, + 0x0190, 0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, 0x6044, + 0xd0fc, 0x01d8, 0x1f04, 0x977f, 0x080c, 0x0d65, 0x080c, 0x9746, + 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, 0x86d1, + 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, 0x704c, + 0x9c06, 0x190c, 0x0d65, 0x080c, 0x872e, 0x010e, 0x1919, 0x00ee, + 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, + 0x0007, 0x9086, 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, 0x7808, + 0xd0a4, 0x190c, 0x0d5e, 0xd09c, 0x0128, 0x7820, 0x908c, 0xf000, + 0x11b8, 0x0012, 0x012e, 0x0005, 0x97cc, 0x980a, 0x9831, 0x9861, + 0x9871, 0x9882, 0x9891, 0x989f, 0x98b0, 0x98b4, 0x97cc, 0x97cc, + 0x97cc, 0x97cc, 0x97cc, 0x97cc, 0x080c, 0x0d65, 0x012e, 0x0005, + 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, 0x908a, + 0x0016, 0x1a0c, 0x0d65, 0x0012, 0x012e, 0x0005, 0x97f1, 0x97f3, + 0x97f1, 0x97f9, 0x97f1, 0x97f1, 0x97f1, 0x97f1, 0x97f1, 0x97f3, + 0x97f1, 0x97f3, 0x97f1, 0x97f3, 0x97f1, 0x97f1, 0x97f1, 0x97f3, + 0x97f1, 0x080c, 0x0d65, 0x2009, 0x0013, 0x080c, 0x9b03, 0x012e, + 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, 0x821d, + 0x080c, 0x9a65, 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, 0x9b03, + 0x012e, 0x0005, 0x080c, 0x9746, 0x2001, 0x19db, 0x2003, 0x0000, + 0x7030, 0x9065, 0x090c, 0x0d65, 0x7034, 0x9092, 0x00c8, 0x1258, + 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, 0x0110, 0x7007, 0x0000, + 0x781f, 0x0808, 0x0040, 0x080c, 0xd43c, 0x6003, 0x0001, 0x2009, + 0x0014, 0x080c, 0x9b03, 0x781f, 0x0100, 0x080c, 0x9762, 0x012e, + 0x0005, 0x080c, 0x9746, 0x714c, 0x81ff, 0x1128, 0x2011, 0x19de, + 0x2013, 0x0000, 0x0400, 0x2061, 0x0100, 0x7150, 0x9192, 0x7530, + 0x12b8, 0x8108, 0x7152, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e, + 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, + 0x0050, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x0018, + 0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, 0x9762, 0x012e, + 0x0005, 0x080c, 0x9746, 0x714c, 0x2160, 0x6003, 0x0003, 0x2009, + 0x004a, 0x080c, 0x9b03, 0x781f, 0x0200, 0x080c, 0x9762, 0x012e, + 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x6003, 0x0003, + 0x080c, 0x9746, 0x080c, 0x1bd5, 0x781f, 0x0400, 0x080c, 0x9762, + 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x080c, + 0x9746, 0x080c, 0x1c1d, 0x781f, 0x0400, 0x080c, 0x9762, 0x012e, + 0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, 0x6046, 0x7104, + 0x9186, 0x0003, 0x0110, 0x080c, 0x8794, 0x012e, 0x0005, 0x00f6, + 0x703c, 0x9086, 0x0002, 0x0148, 0x704c, 0x907d, 0x0130, 0x7844, + 0xc0bc, 0x7846, 0x080c, 0x8d3c, 0x0000, 0x00fe, 0x012e, 0x0005, + 0x080c, 0x6ffd, 0x012e, 0x0005, 0x080c, 0x0d65, 0x0005, 0x00e6, + 0x2071, 0x19b6, 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, + 0x9c06, 0x1190, 0x2019, 0x0001, 0x080c, 0x90f0, 0x704f, 0x0000, + 0x2001, 0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, + 0xd0bc, 0x1110, 0x703f, 0x0000, 0x080c, 0x9336, 0x00ee, 0x0005, + 0x0026, 0x7010, 0x9c06, 0x1178, 0x080c, 0x91f6, 0x6044, 0xc0fc, + 0x6046, 0x600c, 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, + 0x7212, 0x720e, 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, + 0x1178, 0x080c, 0x91f6, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, + 0x0120, 0x7222, 0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006, + 0x002e, 0x0005, 0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069, + 0x0100, 0x68c0, 0x9005, 0x01f8, 0x080c, 0x8068, 0x080c, 0x8e21, + 0x68c3, 0x0000, 0x080c, 0x9320, 0x2069, 0x0140, 0x6b04, 0x9384, + 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, + 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, + 0x9085, 0x0001, 0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009, + 0x630a, 0x9006, 0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036, + 0x6100, 0x2019, 0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190, + 0x00c6, 0x0126, 0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0x97ac, + 0x003e, 0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, + 0x2200, 0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, + 0x00d6, 0x0156, 0x080c, 0x8bc8, 0x7a14, 0x82ff, 0x0138, 0x7003, + 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, + 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, + 0x1110, 0xc38d, 0x0060, 0x080c, 0x6f5c, 0x1110, 0xc3ad, 0x0008, + 0xc3a5, 0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, + 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, + 0x2019, 0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, + 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x998c, 0x60c3, 0x0020, + 0x080c, 0x8df1, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x8bc8, + 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, + 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, + 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198c, + 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, + 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, + 0x7022, 0x2001, 0x181f, 0x2004, 0x7026, 0x0030, 0x2001, 0x1817, + 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, + 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, + 0x001c, 0x015e, 0x0804, 0x8df1, 0x0006, 0x2001, 0x1836, 0x2004, + 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, + 0x0002, 0x080c, 0x91ad, 0x080c, 0x9070, 0x0036, 0x901e, 0x080c, + 0x90f0, 0x003e, 0x0005, 0x2071, 0x1883, 0x7000, 0x9005, 0x0140, + 0x2001, 0x0812, 0x2071, 0x1800, 0x7072, 0x7076, 0x7067, 0xffd4, + 0x2071, 0x1800, 0x7070, 0x7052, 0x7057, 0x1ddc, 0x0005, 0x00e6, + 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0010, + 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, + 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, + 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, 0x9502, + 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, + 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550, + 0x9582, 0x0010, 0x0600, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, + 0x0148, 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, + 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, + 0x7064, 0x9502, 0x1228, 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005, + 0x7057, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1ddc, 0x0a0c, + 0x0d65, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a0c, 0x0d65, 0x9006, + 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, + 0x6003, 0x0000, 0x601e, 0x605e, 0x6062, 0x6026, 0x602a, 0x602e, + 0x6032, 0x6036, 0x603a, 0x603e, 0x604a, 0x6046, 0x6042, 0x2061, + 0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x9006, 0x600e, 0x6016, + 0x601a, 0x6012, 0x6022, 0x6002, 0x601e, 0x605e, 0x6062, 0x604a, + 0x6046, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x0006, + 0x6000, 0x9086, 0x0000, 0x01d0, 0x601c, 0xd084, 0x190c, 0x18f4, + 0x6023, 0x0007, 0x2001, 0x1955, 0x2004, 0x0006, 0x9082, 0x0051, + 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xd324, 0x604b, 0x0000, + 0x6044, 0xd0fc, 0x1129, 0x9006, 0x6046, 0x6016, 0x000e, 0x0005, + 0x080c, 0x97a4, 0x0106, 0x190c, 0x9746, 0x2001, 0x19c9, 0x2004, + 0x9c06, 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x003e, + 0x080c, 0x9336, 0x010e, 0x190c, 0x9762, 0x0005, 0x00e6, 0x0126, + 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608, + 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, + 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, + 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, 0x9502, 0x1230, + 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1ddc, + 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9b17, + 0x9b21, 0x9b3c, 0x9b57, 0xbe21, 0xbe3e, 0xbe59, 0x9b17, 0x9b21, + 0x9b17, 0x9b73, 0x9b17, 0x9b17, 0x9b17, 0x9b17, 0x9b17, 0x9186, + 0x0013, 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x86d1, 0x0005, + 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, + 0x006e, 0x0005, 0x9b3a, 0xa282, 0xa454, 0x9b3a, 0xa4e2, 0x9e3c, + 0x9b3a, 0x9b3a, 0xa204, 0xaa87, 0x9b3a, 0x9b3a, 0x9b3a, 0x9b3a, + 0x9b3a, 0x9b3a, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016, + 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0x9b55, 0xb092, 0x9b55, + 0x9b55, 0x9b55, 0x9b55, 0x9b55, 0x9b55, 0xb037, 0xb215, 0x9b55, + 0xb0cf, 0xb153, 0xb0cf, 0xb153, 0x9b55, 0x080c, 0x0d65, 0x6000, + 0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x0002, 0x9b71, 0xaad1, + 0xab68, 0xace8, 0xad57, 0x9b71, 0x9b71, 0x9b71, 0xaaa0, 0xafb8, + 0xafbb, 0x9b71, 0x9b71, 0x9b71, 0x9b71, 0xafeb, 0x9b71, 0x9b71, + 0x9b71, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, + 0x0d65, 0x0013, 0x006e, 0x0005, 0x9b8c, 0x9b8c, 0x9bca, 0x9c69, + 0x9ce9, 0x9b8c, 0x9b8c, 0x9b8c, 0x9b8e, 0x9b8c, 0x9b8c, 0x9b8c, + 0x9b8c, 0x9b8c, 0x9b8c, 0x9b8c, 0x080c, 0x0d65, 0x9186, 0x004c, + 0x0560, 0x9186, 0x0003, 0x190c, 0x0d65, 0x0096, 0x601c, 0xc0ed, + 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, + 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0x9006, + 0xa846, 0xa84a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, + 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x080c, 0x1a44, + 0x2009, 0x8030, 0x080c, 0x8375, 0x0005, 0x6010, 0x00b6, 0x2058, + 0xbca0, 0x00be, 0x2c00, 0x080c, 0x9d0b, 0x080c, 0xbdef, 0x6003, + 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a8c, + 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, + 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, + 0x0220, 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, + 0xa87b, 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, + 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, + 0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, + 0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, + 0x0007, 0x8423, 0x9405, 0x0002, 0x9c31, 0x9c31, 0x9c2c, 0x9c2f, + 0x9c31, 0x9c29, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, + 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x00fe, 0x00ee, 0x00de, 0x00ce, + 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, + 0x0d65, 0x080c, 0xa6c3, 0x0028, 0x080c, 0xa7e6, 0x0010, 0x080c, + 0xa8d5, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, + 0xa896, 0x000e, 0x080c, 0x9dc9, 0x0530, 0xa804, 0xa80e, 0x00a6, + 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, + 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, + 0x2031, 0x0000, 0x2041, 0x1277, 0x080c, 0x9f73, 0x0160, 0x000e, + 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, + 0x00de, 0x0804, 0x9a65, 0x2001, 0x002c, 0x900e, 0x080c, 0x9e2f, + 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, + 0x0047, 0x0a0c, 0x0d65, 0x91b2, 0x0050, 0x1a0c, 0x0d65, 0x9182, + 0x0047, 0x0042, 0x080c, 0x9935, 0x0120, 0x9086, 0x0002, 0x0904, + 0x9bca, 0x0005, 0x9c8b, 0x9c8b, 0x9c8d, 0x9cbf, 0x9c8b, 0x9c8b, + 0x9c8b, 0x9c8b, 0x9cd2, 0x080c, 0x0d65, 0x00d6, 0x0016, 0x0096, + 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, + 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, + 0x900e, 0x080c, 0x9e2f, 0x080c, 0x9a65, 0x00a8, 0x6003, 0x0002, + 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, + 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, + 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c, + 0x872e, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0120, + 0xa87b, 0x0006, 0x080c, 0x683f, 0x009e, 0x00de, 0x080c, 0x9a65, + 0x0804, 0x8793, 0x080c, 0x872e, 0x080c, 0x2fc1, 0x080c, 0xbdec, + 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0120, 0xa87b, + 0x0029, 0x080c, 0x683f, 0x009e, 0x00de, 0x080c, 0x9a65, 0x0804, + 0x8793, 0x9182, 0x0047, 0x0002, 0x9cf9, 0x9cfb, 0x9cf9, 0x9cf9, + 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, + 0x9cfb, 0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, 0x158c, 0x6114, + 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x683f, 0x009e, + 0x00de, 0x0804, 0x9a65, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, + 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1023, 0x000e, 0x090c, 0x0d65, + 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, + 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018, + 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, + 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228, + 0x2011, 0x001f, 0x080c, 0xb298, 0x04c0, 0x2130, 0x2009, 0x0034, + 0x2011, 0x001f, 0x080c, 0xb298, 0x96b2, 0x0034, 0xb004, 0x904d, + 0x0110, 0x080c, 0x0fd5, 0x080c, 0x1023, 0x01d0, 0x8528, 0xa867, + 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, + 0x2608, 0x2011, 0x001b, 0x080c, 0xb298, 0x00b8, 0x96b2, 0x003c, + 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb298, 0x0c18, + 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, + 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, + 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, + 0xa807, 0x0000, 0x0006, 0x080c, 0x683f, 0x000e, 0x2048, 0x9005, + 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, + 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x1023, 0x000e, + 0x090c, 0x0d65, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, + 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, + 0x798c, 0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, + 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, + 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, + 0x4003, 0x2003, 0x0000, 0x080c, 0x683f, 0x009e, 0x00fe, 0x00de, + 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, + 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, + 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, + 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, + 0x003e, 0x1170, 0x0096, 0x080c, 0x1023, 0x2900, 0x009e, 0x05c0, + 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, + 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, + 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, + 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, + 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, + 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, + 0x2310, 0x84ff, 0x0904, 0x9dde, 0x0804, 0x9de0, 0x9085, 0x0001, + 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, + 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6833, + 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, + 0x9a65, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0d65, 0x080c, 0x9a65, + 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, + 0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, + 0x9080, 0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, + 0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, + 0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, + 0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xb6c5, 0x0130, + 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, + 0x9a65, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, + 0x6010, 0x00b6, 0x2058, 0xb8c7, 0x0000, 0x00be, 0x6014, 0x9005, + 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, + 0x9a65, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, + 0x0006, 0x0016, 0x080c, 0xbdd7, 0x0188, 0x6014, 0x9005, 0x1170, + 0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, 0x2009, 0x0022, + 0x080c, 0xa25a, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, + 0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, + 0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, + 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, + 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, + 0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, + 0x2003, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, + 0x080c, 0x9a65, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, + 0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, + 0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, + 0x2011, 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb298, + 0x080c, 0xb6c5, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, + 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9a65, 0x001e, 0x009e, 0x0005, + 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, + 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, + 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, + 0xb298, 0x009e, 0x080c, 0xb6c5, 0x0148, 0xa804, 0x9005, 0x1158, + 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9a65, + 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, + 0x0100, 0x1118, 0x080c, 0xa40d, 0x00e0, 0xa034, 0x8007, 0x800c, + 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, + 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, + 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x0019, + 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x1023, 0x000e, + 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, + 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, + 0x0086, 0x2940, 0x080c, 0x1103, 0x008e, 0x9085, 0x0001, 0x009e, + 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, + 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, + 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x604b, 0x0000, + 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xbd4f, 0x001e, 0x1158, + 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, + 0x9386, 0x0006, 0x0128, 0x080c, 0x9a65, 0x0020, 0x0039, 0x0010, + 0x080c, 0xa08f, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, + 0x2048, 0x9186, 0x0015, 0x0904, 0xa06e, 0x918e, 0x0016, 0x1904, + 0xa08d, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, + 0x0300, 0x1904, 0xa048, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, + 0x0904, 0xa02a, 0x0804, 0xa08b, 0x6808, 0x9086, 0xffff, 0x1904, + 0xa070, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, + 0xa940, 0x9105, 0x1904, 0xa070, 0x6824, 0xd0b4, 0x1904, 0xa070, + 0x080c, 0xb8ad, 0x6864, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, + 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x8276, + 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, + 0x00c6, 0x2d60, 0x080c, 0xb3eb, 0x00ce, 0x0804, 0xa08b, 0x00c6, + 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5c5c, 0x0010, 0x080c, 0x5ff1, + 0x00ce, 0x1904, 0xa070, 0x00c6, 0x2d60, 0x080c, 0x9a65, 0x00ce, + 0x0804, 0xa08b, 0x00c6, 0x080c, 0x9ad6, 0x0198, 0x6017, 0x0000, + 0x6810, 0x6012, 0x080c, 0xbb52, 0x6023, 0x0003, 0x6904, 0x00c6, + 0x2d60, 0x080c, 0x9a65, 0x00ce, 0x080c, 0x9b03, 0x00ce, 0x0804, + 0xa08b, 0x2001, 0x1957, 0x2004, 0x684a, 0x00ce, 0x0804, 0xa08b, + 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, + 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, + 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, + 0x8020, 0x080c, 0x832e, 0x00ce, 0x0430, 0x700c, 0x9086, 0x2a00, + 0x1138, 0x2001, 0x1957, 0x2004, 0x684a, 0x00e8, 0x04c1, 0x00e8, + 0x89ff, 0x090c, 0x0d65, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, + 0xa87b, 0x0003, 0x080c, 0x6655, 0x080c, 0xb8ad, 0x080c, 0x9a9f, + 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, 0x6291, 0x00be, + 0x002e, 0x00de, 0x00ce, 0x080c, 0x9a65, 0x009e, 0x0005, 0x9186, + 0x0015, 0x1128, 0x2001, 0x1957, 0x2004, 0x684a, 0x0068, 0x918e, + 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xd324, 0x080c, + 0x821d, 0x080c, 0x9a65, 0x00ce, 0x080c, 0x9a65, 0x0005, 0x0026, + 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, + 0x1957, 0x2004, 0x684a, 0x0804, 0xa109, 0x00c6, 0x2d60, 0x080c, + 0xb2c3, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, + 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, + 0x832e, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, + 0x090c, 0x0d65, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, + 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, + 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, + 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, + 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, + 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, + 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xba3c, 0x080c, 0x8793, + 0x0010, 0x080c, 0x9a65, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, + 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, + 0xba10, 0x00be, 0x9206, 0x1904, 0xa174, 0x700c, 0x6210, 0x00b6, + 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xa174, 0x6038, 0x2068, + 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa174, + 0x9286, 0x0002, 0x0904, 0xa174, 0x9286, 0x0000, 0x05e8, 0x6808, + 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, + 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, + 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, + 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, + 0x2048, 0x080c, 0xb6c5, 0x090c, 0x0d65, 0xa87b, 0x0003, 0x009e, + 0x080c, 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, + 0x2009, 0x8020, 0x080c, 0x832e, 0x00ce, 0x0030, 0x6038, 0x2070, + 0x2001, 0x1957, 0x2004, 0x704a, 0x080c, 0x9a65, 0x002e, 0x00de, + 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, + 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, + 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, + 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xaa5d, 0x002e, + 0x003e, 0x015e, 0x009e, 0x1904, 0xa1e3, 0x0096, 0x0156, 0x0036, + 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, + 0x080c, 0xaa5d, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, + 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, + 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0x9e74, 0x0096, 0x2048, + 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, + 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, + 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x080c, + 0x9f73, 0x0130, 0x00fe, 0x009e, 0x080c, 0x9a65, 0x00be, 0x0005, + 0x080c, 0xa40d, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x2fc1, 0x080c, + 0xbdec, 0x00fe, 0x00c6, 0x080c, 0x9a0f, 0x2f00, 0x6012, 0x6017, + 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, + 0x0007, 0x080c, 0x60b7, 0x080c, 0x60e3, 0x080c, 0x8335, 0x080c, + 0x8793, 0x00ce, 0x0804, 0xa1b6, 0x2100, 0x91b2, 0x0053, 0x1a0c, + 0x0d65, 0x91b2, 0x0040, 0x1a04, 0xa26c, 0x0002, 0xa25a, 0xa25a, + 0xa250, 0xa25a, 0xa25a, 0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e, + 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, + 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, + 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa25a, 0xa24e, 0xa25a, + 0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa250, 0xa24e, + 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, + 0xa25a, 0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, + 0xa24e, 0xa24e, 0xa24e, 0xa25a, 0xa24e, 0xa24e, 0x080c, 0x0d65, + 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8c4, 0xc08c, 0xb8c6, 0x00be, + 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, + 0x080c, 0x8335, 0x0010, 0x080c, 0x832e, 0x0126, 0x2091, 0x8000, + 0x080c, 0x8793, 0x012e, 0x0005, 0x2600, 0x0002, 0xa280, 0xa280, + 0xa280, 0xa25a, 0xa25a, 0xa280, 0xa280, 0xa280, 0xa280, 0xa25a, + 0xa280, 0xa25a, 0xa280, 0xa25a, 0xa280, 0xa280, 0xa280, 0xa280, + 0x080c, 0x0d65, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d65, 0x91b6, + 0x0013, 0x0904, 0xa357, 0x91b6, 0x0027, 0x1904, 0xa303, 0x080c, + 0x86d1, 0x6004, 0x080c, 0xb8c2, 0x01b0, 0x080c, 0xb8d3, 0x01a8, + 0x908e, 0x0021, 0x0904, 0xa300, 0x908e, 0x0022, 0x1130, 0x080c, + 0x9ea0, 0x0904, 0xa2fc, 0x0804, 0xa2fd, 0x908e, 0x003d, 0x0904, + 0xa300, 0x0804, 0xa2f6, 0x080c, 0x2ff2, 0x2001, 0x0007, 0x080c, + 0x60b7, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa40d, + 0x9186, 0x007e, 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, + 0x6f5c, 0x1108, 0xc2ad, 0x2202, 0x080c, 0x9746, 0x0036, 0x0026, + 0x2019, 0x0028, 0x2110, 0x080c, 0xd37f, 0x002e, 0x003e, 0x0016, + 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x8498, 0x0076, + 0x903e, 0x080c, 0x8387, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, + 0x2c08, 0x080c, 0xce23, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, + 0x9762, 0x080c, 0xbdec, 0x0016, 0x080c, 0xbb4a, 0x080c, 0x9a65, + 0x001e, 0x080c, 0x30d1, 0x080c, 0x8793, 0x0030, 0x080c, 0xbb4a, + 0x080c, 0x9a65, 0x080c, 0x8793, 0x0005, 0x080c, 0xa40d, 0x0cb0, + 0x080c, 0xa449, 0x0c98, 0x9186, 0x0015, 0x0118, 0x9186, 0x0016, + 0x1140, 0x080c, 0x9935, 0x0d80, 0x9086, 0x0002, 0x0904, 0xa454, + 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x86d1, 0x6004, 0x908e, + 0x0022, 0x1118, 0x080c, 0x9ea0, 0x09f8, 0x080c, 0x2fc1, 0x080c, + 0xbdec, 0x080c, 0xb8c2, 0x1190, 0x080c, 0x2ff2, 0x6010, 0x00b6, + 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa40d, 0x9186, 0x007e, 0x1128, + 0x2001, 0x1836, 0x200c, 0xc185, 0x2102, 0x0800, 0x080c, 0xb8d3, + 0x1120, 0x080c, 0xa40d, 0x0804, 0xa2f6, 0x6004, 0x908e, 0x0032, + 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, + 0x3373, 0x00fe, 0x00ee, 0x0804, 0xa2f6, 0x6004, 0x908e, 0x0021, + 0x0d40, 0x908e, 0x0022, 0x090c, 0xa40d, 0x0804, 0xa2f6, 0x90b2, + 0x0040, 0x1a04, 0xa3f6, 0x2008, 0x0002, 0xa39f, 0xa3a0, 0xa3a3, + 0xa3a6, 0xa3a9, 0xa3ac, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, + 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, + 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, + 0xa39d, 0xa39d, 0xa39d, 0xa3af, 0xa3b8, 0xa39d, 0xa3b9, 0xa3b8, + 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa3b8, 0xa3b8, 0xa39d, + 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa3e1, + 0xa3b8, 0xa39d, 0xa3b4, 0xa39d, 0xa39d, 0xa39d, 0xa3b5, 0xa39d, + 0xa39d, 0xa39d, 0xa3b8, 0xa3dc, 0xa39d, 0x080c, 0x0d65, 0x00c0, + 0x2001, 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, 0x2001, 0x0005, + 0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, 0x0088, 0x6003, + 0x0005, 0x080c, 0x8793, 0x0058, 0x0018, 0x0010, 0x080c, 0x60b7, + 0x04b8, 0x080c, 0xbdef, 0x6003, 0x0004, 0x080c, 0x8793, 0x0005, + 0x080c, 0x60b7, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e, 0x2304, + 0x9084, 0xff00, 0x1120, 0x2001, 0x1955, 0x201c, 0x0040, 0x8007, + 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, + 0x003e, 0x080c, 0x8793, 0x0c18, 0x080c, 0xbb4a, 0x080c, 0x9a65, + 0x08f0, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, + 0x3373, 0x00fe, 0x00ee, 0x080c, 0x86d1, 0x080c, 0x9a65, 0x0878, + 0x6003, 0x0002, 0x080c, 0xbdef, 0x0804, 0x8793, 0x2600, 0x2008, + 0x0002, 0xa40b, 0xa40b, 0xa40b, 0xa3f0, 0xa3f0, 0xa40b, 0xa40b, + 0xa40b, 0xa40b, 0xa3f0, 0xa40b, 0xa3f0, 0xa40b, 0xa3f0, 0xa40b, + 0xa40b, 0xa40b, 0xa40b, 0x080c, 0x0d65, 0x00e6, 0x0096, 0x0026, + 0x0016, 0x080c, 0xb6c5, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, + 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x503e, + 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, + 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xbcb6, 0x0090, 0xa868, + 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021, + 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833, + 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009, + 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, + 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804, + 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x6604, 0x96b6, + 0x004d, 0x1120, 0x080c, 0xbbd6, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x0043, 0x1120, 0x080c, 0xbc1f, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x004b, 0x1120, 0x080c, 0xbc4b, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x0033, 0x1120, 0x080c, 0xbb6c, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x0028, 0x1120, 0x080c, 0xb90c, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x0029, 0x1120, 0x080c, 0xb94d, 0x0804, 0xa4d1, 0x6604, 0x96b6, + 0x001f, 0x1118, 0x080c, 0x9e49, 0x04e0, 0x6604, 0x96b6, 0x0000, + 0x1118, 0x080c, 0xa17a, 0x04a8, 0x6604, 0x96b6, 0x0022, 0x1118, + 0x080c, 0x9e81, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, + 0x9f91, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xa10f, + 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0x9eb9, 0x00c8, + 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x9ef5, 0x0090, 0x6604, + 0x96b6, 0x0049, 0x1118, 0x080c, 0x9f20, 0x0058, 0x91b6, 0x0015, + 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, + 0xa78f, 0x00be, 0x0005, 0x080c, 0x9b20, 0x0cd8, 0xa4ee, 0xa4f1, + 0xa4ee, 0xa535, 0xa4ee, 0xa6c3, 0xa79c, 0xa4ee, 0xa4ee, 0xa769, + 0xa4ee, 0xa77d, 0x0096, 0x080c, 0x158c, 0x6014, 0x2048, 0xa800, + 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9a65, 0xa001, 0xa001, + 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, 0x0074, 0x1540, + 0x080c, 0xcdf4, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, + 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9, 0x00be, + 0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c, 0x9a65, + 0x0088, 0x2001, 0x000a, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x6003, + 0x0001, 0x6007, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0010, + 0x080c, 0xa6ae, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0158, + 0x9006, 0x080c, 0x60a3, 0x2069, 0x1853, 0x6804, 0x0020, 0x2001, + 0x0006, 0x080c, 0x60e3, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, + 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904, 0xa687, 0x6010, + 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xa8e0, 0x0804, + 0xa5ec, 0x00d6, 0x080c, 0x6f5c, 0x0198, 0x0026, 0x2011, 0x0010, + 0x080c, 0x6581, 0x002e, 0x05c8, 0x080c, 0x52b1, 0x1540, 0x6014, + 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, + 0x0026, 0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0530, 0x6014, + 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, + 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xbcb6, 0x0040, 0x6014, + 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, + 0x2058, 0xb9a0, 0x0016, 0x080c, 0x2ff2, 0x080c, 0x9a65, 0x001e, + 0x080c, 0x30d1, 0x00de, 0x0804, 0xa688, 0x00de, 0x080c, 0xa8d5, + 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, + 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, + 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbcb6, 0x0030, + 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, + 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c, 0x9a65, 0x0804, 0xa688, + 0x080c, 0xa696, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, + 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, + 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbcb6, 0x08f8, 0x080c, + 0xa68c, 0x0160, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0004, 0x080c, + 0x60e3, 0x2001, 0x0007, 0x080c, 0x60b7, 0x08a0, 0x2001, 0x0004, + 0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8335, + 0x080c, 0x8793, 0x0804, 0xa688, 0xb85c, 0xd0e4, 0x01d0, 0x080c, + 0xbae4, 0x080c, 0x6f5c, 0x0118, 0xd0dc, 0x1904, 0xa5ae, 0x2011, + 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, 0x00f6, 0x2079, + 0x0100, 0x78e3, 0x0000, 0x080c, 0x2463, 0x78e2, 0x00fe, 0x0804, + 0xa5ae, 0x080c, 0xbb25, 0x2011, 0x1836, 0x2204, 0xc0a5, 0x2012, + 0x0006, 0x080c, 0xcf59, 0x000e, 0x1904, 0xa5ae, 0xc0b5, 0x2012, + 0x2001, 0x0006, 0x080c, 0x60b7, 0x9006, 0x080c, 0x60a3, 0x00c6, + 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, + 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707a, + 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, + 0x780e, 0x00fe, 0x080c, 0x2438, 0x00f6, 0x2100, 0x900e, 0x080c, + 0x23ef, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, + 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, + 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2438, 0x00f6, + 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c, 0x23ef, 0x795a, + 0x00fe, 0x8108, 0x080c, 0x6106, 0x2b00, 0x00ce, 0x1904, 0xa5ae, + 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, + 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, + 0x2001, 0x0002, 0x080c, 0x60b7, 0x6023, 0x0001, 0x6003, 0x0001, + 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x0008, 0x0431, + 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, + 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, + 0xd3d8, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, + 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, + 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, + 0x0007, 0x080c, 0x60b7, 0x080c, 0x52b1, 0x1120, 0x2001, 0x0007, + 0x080c, 0x60e3, 0x080c, 0x2ff2, 0x6020, 0x9086, 0x000a, 0x1108, + 0x0005, 0x0804, 0x9a65, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, + 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xa760, 0x00d6, 0x080c, + 0x6f5c, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x6581, 0x002e, + 0x05c8, 0x080c, 0x52b1, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, + 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, + 0x080c, 0x6581, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, + 0x4009, 0x080c, 0xbcb6, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, + 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, + 0x080c, 0x2ff2, 0x080c, 0x9a65, 0x001e, 0x080c, 0x30d1, 0x00de, + 0x0804, 0xa764, 0x00de, 0x080c, 0x52b1, 0x1170, 0x6014, 0x9005, + 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, + 0x080c, 0x4998, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, + 0x6201, 0x080c, 0xa524, 0x00de, 0x080c, 0xa9a6, 0x1588, 0x6010, + 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x60b7, + 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, + 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, + 0xbcb6, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, + 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, + 0x2ff2, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9a65, 0x0020, + 0x080c, 0xa40d, 0x080c, 0xa6ae, 0x001e, 0x002e, 0x00ee, 0x00be, + 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, + 0x0002, 0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, + 0x8335, 0x0804, 0x8793, 0x0804, 0xa6ae, 0x2030, 0x2011, 0x1823, + 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, + 0x0007, 0x080c, 0x60b7, 0x0804, 0x9a65, 0x0804, 0xa6ae, 0x0002, + 0xa4ee, 0xa7a7, 0xa4ee, 0xa7e6, 0xa4ee, 0xa891, 0xa79c, 0xa4ee, + 0xa4ee, 0xa8a4, 0xa4ee, 0xa8b4, 0x6604, 0x9686, 0x0003, 0x0904, + 0xa6c3, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9a65, 0x0005, 0x00b6, + 0x00d6, 0x00c6, 0x080c, 0xa8c4, 0x11a0, 0x9006, 0x080c, 0x60a3, + 0x080c, 0x2fc1, 0x080c, 0xbdec, 0x2001, 0x0002, 0x080c, 0x60b7, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, + 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, + 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, + 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, + 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2fc1, 0x080c, 0xbdec, + 0x080c, 0xa6ae, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, + 0x0026, 0x9016, 0x080c, 0xa8d2, 0x00d6, 0x2069, 0x194d, 0x2d04, + 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, + 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, + 0x0088, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, + 0x0804, 0xa861, 0x080c, 0xb6c5, 0x01b0, 0x6014, 0x2048, 0xa864, + 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, + 0x080c, 0xbd10, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, + 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, + 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, + 0x0c38, 0x080c, 0xa40d, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, + 0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, + 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, + 0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, + 0x60b7, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, + 0xa6ae, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0140, 0xa864, 0x9086, 0x0139, + 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, + 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, + 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, + 0x2071, 0x1800, 0x080c, 0x5b75, 0x00ee, 0x0010, 0x080c, 0x2fc1, + 0x0870, 0x080c, 0xa8d2, 0x1160, 0x2001, 0x0004, 0x080c, 0x60b7, + 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8335, 0x0804, 0x8793, + 0x080c, 0xa40d, 0x0804, 0xa6ae, 0x0469, 0x1160, 0x2001, 0x0008, + 0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x8335, + 0x0804, 0x8793, 0x0804, 0xa6ae, 0x00e9, 0x1160, 0x2001, 0x000a, + 0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8335, + 0x0804, 0x8793, 0x0804, 0xa6ae, 0x2009, 0x026e, 0x2104, 0x9086, + 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, + 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, + 0x6110, 0x2158, 0x080c, 0x6175, 0x001e, 0x00ce, 0x00be, 0x0005, + 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, + 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa978, + 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6559, + 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd0ce, 0x2001, + 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, + 0x080c, 0x2f80, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2d99, 0x00ee, + 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x30d1, + 0x8108, 0x1f04, 0xa916, 0x015e, 0x00ce, 0x080c, 0xa8d5, 0x2071, + 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, + 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, + 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, + 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a, 0x78e6, + 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea, 0x7832, + 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182b, + 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2438, 0x080c, + 0x6f5c, 0x0170, 0x2071, 0x0260, 0x2069, 0x1951, 0x7048, 0x206a, + 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xbae4, + 0x0040, 0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c, + 0x9a65, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, + 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b, 0x231c, + 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, + 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, + 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d, 0x1148, 0x2011, + 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xaa5d, 0x1100, + 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, + 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, + 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, + 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, + 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, + 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, + 0x19c2, 0x252c, 0x2021, 0x19c9, 0x2424, 0x2061, 0x1ddc, 0x2071, + 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xaa35, 0x080c, 0xd0fa, + 0x0904, 0xaa2e, 0x6720, 0x9786, 0x0007, 0x0904, 0xaa2e, 0x2500, + 0x9c06, 0x0904, 0xaa2e, 0x2400, 0x9c06, 0x0904, 0xaa2e, 0x3e08, + 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, + 0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, 0xffff, 0x6000, + 0x9086, 0x0004, 0x1110, 0x080c, 0x18f4, 0x9786, 0x000a, 0x0148, + 0x080c, 0xb8d3, 0x1130, 0x00ce, 0x080c, 0xa40d, 0x080c, 0x9a9f, + 0x00e8, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x01a8, 0x9786, 0x0003, + 0x1530, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, + 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c, + 0x6833, 0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x00ce, 0x9ce0, 0x001c, + 0x7064, 0x9c02, 0x1210, 0x0804, 0xa9d9, 0x012e, 0x000e, 0x002e, + 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, + 0x0006, 0x1118, 0x080c, 0xd079, 0x0c30, 0x9786, 0x000a, 0x0998, + 0x0880, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, + 0xaa49, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, + 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, + 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, + 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, + 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, + 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, + 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, + 0x908a, 0x0053, 0x1a0c, 0x0d65, 0x080c, 0xb8c2, 0x0120, 0x080c, + 0xb8d3, 0x0158, 0x0028, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x0128, + 0x080c, 0x86d1, 0x080c, 0x9a65, 0x0005, 0x080c, 0xa40d, 0x0cc0, + 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, + 0xaabf, 0xaabf, 0xaabf, 0xaac1, 0xaac1, 0xaac1, 0xaac1, 0xaabf, + 0xaabf, 0xaabf, 0xaac1, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0x080c, + 0x0d65, 0x600b, 0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, + 0x8000, 0x080c, 0xbdef, 0x2009, 0x8000, 0x080c, 0x832e, 0x012e, + 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, + 0xab46, 0x9186, 0x0027, 0x1520, 0x080c, 0x86d1, 0x080c, 0x2fc1, + 0x080c, 0xbdec, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0198, + 0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0068, 0xa867, 0x0103, + 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, + 0x683f, 0x080c, 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0804, 0x8793, + 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c, + 0x0d65, 0x0005, 0x0002, 0xab24, 0xab22, 0xab22, 0xab22, 0xab22, + 0xab22, 0xab22, 0xab22, 0xab22, 0xab22, 0xab22, 0xab3d, 0xab3d, + 0xab3d, 0xab3d, 0xab22, 0xab3d, 0xab22, 0xab3d, 0xab22, 0xab22, + 0xab22, 0xab22, 0x080c, 0x0d65, 0x080c, 0x86d1, 0x0096, 0x6114, + 0x2148, 0x080c, 0xb6c5, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, + 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x683f, 0x080c, + 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x080c, 0x86d1, 0x080c, + 0xb8d3, 0x090c, 0xa40d, 0x080c, 0x9a65, 0x0005, 0x0002, 0xab60, + 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, + 0xab5e, 0xab5e, 0xab62, 0xab62, 0xab62, 0xab62, 0xab5e, 0xab64, + 0xab5e, 0xab62, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0x080c, 0x0d65, + 0x080c, 0x0d65, 0x080c, 0x0d65, 0x080c, 0x9a65, 0x0804, 0x8793, + 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xabc0, 0xacaf, 0xab87, + 0xacbb, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, + 0xab87, 0xab87, 0xab87, 0xacbb, 0xab89, 0xab87, 0xacb9, 0x080c, + 0x0d65, 0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, + 0xd0bc, 0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, + 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xad40, + 0x080c, 0x6655, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, + 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x6291, 0x080c, 0x9a65, + 0x009e, 0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, + 0x9105, 0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xba03, 0x0c80, + 0x00b6, 0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, + 0x0008, 0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, + 0xb800, 0xd0bc, 0x1904, 0xac9e, 0xa87b, 0x0000, 0xa867, 0x0103, + 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xad40, 0x080c, 0x6655, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, + 0x8211, 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x6291, 0x601c, + 0xd0fc, 0x1148, 0x7044, 0xd0e4, 0x1904, 0xac82, 0x080c, 0x9a65, + 0x009e, 0x00be, 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d65, + 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, + 0xac86, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, + 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, + 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, + 0xaa34, 0x2100, 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, + 0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, + 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, + 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, + 0x1118, 0xc6c4, 0x0804, 0xabcc, 0x735c, 0xab86, 0x83ff, 0x0170, + 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, + 0x0018, 0x2011, 0x0025, 0x080c, 0xb298, 0x003e, 0xd6cc, 0x0904, + 0xabe1, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xabe1, 0x9192, 0x0021, + 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb298, + 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xbd7c, 0x0804, 0xabe1, + 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, + 0x2950, 0x080c, 0xb237, 0x00ae, 0x080c, 0xbd7c, 0x080c, 0xb288, + 0x0804, 0xabe3, 0x080c, 0xb9c6, 0x0804, 0xabf8, 0xa87c, 0xd0ac, + 0x0904, 0xac09, 0xa880, 0xd0bc, 0x1904, 0xac09, 0x7348, 0xa838, + 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xac09, 0xd6d4, + 0x0190, 0xab38, 0x9305, 0x0904, 0xac09, 0x0068, 0xa87c, 0xd0ac, + 0x0904, 0xabd4, 0xa838, 0xa934, 0x9105, 0x0904, 0xabd4, 0xa880, + 0xd0bc, 0x1904, 0xabd4, 0x080c, 0xba03, 0x0804, 0xabf8, 0x00f6, + 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021, + 0x0005, 0x0011, 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007, + 0x0043, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005, + 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, + 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a, + 0xae36, 0xad3a, 0x6044, 0xd0fc, 0x190c, 0x976f, 0x604b, 0x0000, + 0x080c, 0x1aa5, 0x1118, 0x6144, 0x080c, 0x835a, 0x009e, 0x0005, + 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, + 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, + 0xad07, 0xad07, 0xad09, 0xad07, 0xad07, 0xad07, 0xad07, 0xad1a, + 0xad07, 0xad07, 0xad07, 0xad07, 0xad3e, 0xad07, 0xad07, 0x080c, + 0x0d65, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x86d1, 0x2019, + 0x0001, 0x080c, 0x90f0, 0x6003, 0x0002, 0x080c, 0xbdf4, 0x080c, + 0x872e, 0x0005, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x86d1, + 0x2019, 0x0001, 0x080c, 0x90f0, 0x080c, 0x872e, 0x080c, 0x2fc1, + 0x080c, 0xbdec, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0150, + 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x683f, + 0x080c, 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x080c, 0x0d65, + 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, + 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a46, 0x2104, + 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, + 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xad76, + 0xad76, 0xad76, 0xad76, 0xad76, 0xad78, 0xad76, 0xad76, 0xae35, + 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, + 0xad76, 0xad76, 0xaf79, 0xad76, 0xaf83, 0xad76, 0x080c, 0x0d65, + 0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084, + 0x601e, 0x0804, 0xab68, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5, + 0xa87e, 0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, + 0x6114, 0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, + 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, + 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, + 0x0904, 0xae2e, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, + 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xae2e, 0x9686, + 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, + 0x080c, 0x1023, 0x090c, 0x0d65, 0x2900, 0xb07a, 0xb77c, 0x97bd, + 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, + 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, + 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, + 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, + 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, + 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, + 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, + 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, + 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb298, 0x003e, 0xd6cc, + 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, + 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb298, 0x2011, + 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, + 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb237, 0x080c, 0x18d2, + 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1957, 0x2004, + 0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, + 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, 0xbdfd, 0x0904, + 0xaf74, 0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xaf33, 0xa978, 0xa868, 0xd0fc, + 0x0904, 0xaef4, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, + 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xaec2, + 0x9086, 0x0028, 0x1904, 0xaeae, 0xa87b, 0x001c, 0xb07b, 0x001c, + 0x0804, 0xaeca, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, + 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, + 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, + 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, + 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc, + 0x601e, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, + 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, + 0x0fd5, 0x009e, 0x080c, 0xba03, 0x0804, 0xaf74, 0xd1dc, 0x0158, + 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbc9f, 0x0118, 0xb174, + 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, + 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, + 0x190c, 0xad40, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, + 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, + 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, + 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, + 0xa87e, 0x080c, 0xbd7c, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, + 0x0fd5, 0x001e, 0x0804, 0xaf60, 0x0016, 0x00a6, 0x2150, 0xb174, + 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, + 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, + 0x0015, 0xb07b, 0x0015, 0x080c, 0xbc9f, 0x0118, 0xb174, 0xc1dc, + 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, + 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, + 0xad40, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, + 0x080c, 0x0fd5, 0x009e, 0x080c, 0xbd7c, 0xa974, 0x0016, 0x080c, + 0xb288, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, + 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, + 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbc9f, 0x0118, + 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, + 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, + 0x9115, 0x190c, 0xad40, 0xa974, 0x0016, 0x080c, 0x6655, 0x001e, + 0x6010, 0x00b6, 0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, + 0xb8c0, 0x9005, 0x0120, 0x0016, 0x080c, 0x6291, 0x001e, 0x00be, + 0xd1e4, 0x1120, 0x080c, 0x9a65, 0x009e, 0x0005, 0x080c, 0xb9c6, + 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, 0xbdfd, 0x190c, + 0x18e0, 0x009e, 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, + 0x9105, 0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, + 0x00b6, 0x6010, 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, + 0x6655, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0, 0x9005, 0x0110, + 0x080c, 0x6291, 0x080c, 0x9a65, 0x00be, 0x009e, 0x0005, 0xa87c, + 0xc0dc, 0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, + 0xad40, 0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xba03, 0x0c60, + 0x080c, 0x86d1, 0x0010, 0x080c, 0x872e, 0x601c, 0xd084, 0x0110, + 0x080c, 0x18f4, 0x080c, 0xb6c5, 0x01f0, 0x0096, 0x6114, 0x2148, + 0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x00a0, 0xa867, 0x0103, + 0x2009, 0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, + 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xd370, 0xa877, 0x0000, + 0x080c, 0x683f, 0x009e, 0x0804, 0x9a9f, 0xa87b, 0x0004, 0x0cb0, + 0xa87b, 0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, + 0x0208, 0x000a, 0x0005, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, + 0xb00c, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, + 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb030, + 0xb00a, 0xb00a, 0x080c, 0x0d65, 0x080c, 0x52a5, 0x01f8, 0x6014, + 0x7144, 0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, + 0x00ff, 0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, + 0x0139, 0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, + 0x4000, 0xa99a, 0xaa9e, 0x080c, 0x683f, 0x009e, 0x0804, 0x9a65, + 0x080c, 0x52a5, 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, + 0x0085, 0x0002, 0xb049, 0xb047, 0xb047, 0xb055, 0xb047, 0xb047, + 0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0x080c, + 0x0d65, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, + 0x8020, 0x080c, 0x832e, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, + 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb6b3, + 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, + 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb2c3, 0x00ce, 0x0128, + 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, + 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x9280, 0x0004, 0x00b6, + 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, + 0x00c6, 0x2260, 0x080c, 0xba03, 0x00ce, 0x00ee, 0x00de, 0x005e, + 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, + 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x9082, 0x0085, + 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65, + 0x080c, 0x86d1, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0140, + 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x683f, + 0x009e, 0x080c, 0x9a9f, 0x0804, 0x8793, 0xb0ca, 0xb0cc, 0xb0cc, + 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, + 0xb0ca, 0xb0ca, 0x080c, 0x0d65, 0x080c, 0x9a9f, 0x0005, 0x9186, + 0x0013, 0x1130, 0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xb11b, + 0x9186, 0x0027, 0x1558, 0x080c, 0x86d1, 0x080c, 0x2fc1, 0x080c, + 0xbdec, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0150, 0xa867, + 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x683f, 0x080c, + 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x9186, 0x0089, 0x0118, + 0x9186, 0x008a, 0x1140, 0x080c, 0x9935, 0x0128, 0x9086, 0x000c, + 0x0904, 0xb153, 0x0000, 0x080c, 0x9b20, 0x0c70, 0x9186, 0x0014, + 0x1d60, 0x080c, 0x86d1, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, + 0x0d00, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, + 0xc0ec, 0xa882, 0x0890, 0x0002, 0xb12b, 0xb129, 0xb129, 0xb129, + 0xb129, 0xb129, 0xb13f, 0xb129, 0xb129, 0xb129, 0xb129, 0xb129, + 0xb129, 0x080c, 0x0d65, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010, + 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, + 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, + 0x1118, 0x2001, 0x1955, 0x0010, 0x2001, 0x1956, 0x2004, 0x601a, + 0x6003, 0x000e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, + 0x0208, 0x0012, 0x0804, 0x9b20, 0xb169, 0xb169, 0xb169, 0xb169, + 0xb16b, 0xb1b8, 0xb169, 0xb169, 0xb169, 0xb169, 0xb169, 0xb169, + 0xb169, 0x080c, 0x0d65, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb1cc, + 0x080c, 0xb6c5, 0x1118, 0x080c, 0xb8ad, 0x0068, 0x6014, 0x2048, + 0x080c, 0xbe03, 0x1110, 0x080c, 0xb8ad, 0xa867, 0x0103, 0x080c, + 0xbdb7, 0x080c, 0x683f, 0x00d6, 0x2c68, 0x080c, 0x9a0f, 0x01d0, + 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, + 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, + 0x080c, 0xbb52, 0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, + 0x080c, 0x832e, 0x2d60, 0x00de, 0x080c, 0x9a65, 0x009e, 0x0005, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, + 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, + 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbd4f, + 0x11f0, 0x080c, 0x9a0f, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, + 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, + 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, + 0x615e, 0x080c, 0xbb52, 0x2009, 0x8020, 0x080c, 0x832e, 0x2d60, + 0x00de, 0x0804, 0x9a65, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, + 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, + 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, + 0xa87b, 0x0005, 0x080c, 0xb9c2, 0xa877, 0x0000, 0x080c, 0x683f, + 0x080c, 0xb8ad, 0x009e, 0x0804, 0x9a65, 0x0016, 0x0096, 0x6014, + 0x2048, 0x080c, 0xb6c5, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, + 0xa877, 0x0000, 0x080c, 0x683f, 0x009e, 0x001e, 0x9186, 0x0013, + 0x0158, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, + 0x9b20, 0x0020, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005, 0x0056, + 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, + 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, + 0x0020, 0x2011, 0x0029, 0x080c, 0xb298, 0x96b2, 0x0020, 0xb004, + 0x904d, 0x0110, 0x080c, 0x0fd5, 0x080c, 0x1023, 0x0520, 0x8528, + 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, + 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, + 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, + 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, + 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, + 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, + 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, + 0x080c, 0x683f, 0x2a48, 0x0cb8, 0x080c, 0x683f, 0x00ae, 0x0005, + 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, + 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, + 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, + 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, + 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, + 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, + 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, + 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, + 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb315, 0xb315, 0xb310, + 0xb339, 0xb2ed, 0xb310, 0xb2ef, 0xb310, 0xb2ed, 0xb2ed, 0xb310, + 0xb310, 0xb310, 0xb2ed, 0xb2ed, 0xb2ed, 0x080c, 0x0d65, 0x6010, + 0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, 0xb339, 0x0036, 0x6014, + 0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c, + 0x0038, 0xd094, 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010, + 0x080c, 0xcc56, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, + 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x01d0, 0x6043, 0xffff, 0xa864, + 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, + 0x900e, 0x2001, 0x0005, 0x080c, 0x6a5c, 0x080c, 0xb9c2, 0x080c, + 0x6833, 0x080c, 0x9a9f, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, + 0x0ce0, 0x080c, 0x9746, 0x080c, 0xbe11, 0x6000, 0x908a, 0x0016, + 0x1a0c, 0x0d65, 0x002b, 0x0106, 0x080c, 0x9762, 0x010e, 0x0005, + 0xb358, 0xb386, 0xb35a, 0xb3ad, 0xb381, 0xb358, 0xb310, 0xb315, + 0xb315, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310, + 0x080c, 0x0d65, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, + 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0158, 0xa87c, 0xd0cc, + 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c, + 0xb9c2, 0x009e, 0x080c, 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, + 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x8310, 0x9085, 0x0001, + 0x0005, 0x0066, 0x080c, 0x18f4, 0x006e, 0x08a0, 0x00e6, 0x2071, + 0x19b6, 0x7030, 0x9c06, 0x1120, 0x080c, 0x9070, 0x00ee, 0x0850, + 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, + 0x2049, 0x0001, 0x2c40, 0x080c, 0x9200, 0x009e, 0x008e, 0x0040, + 0x0066, 0x080c, 0x8f6c, 0x190c, 0x0d65, 0x080c, 0x8f7a, 0x006e, + 0x00ee, 0x1904, 0xb35a, 0x0804, 0xb310, 0x0036, 0x00e6, 0x2071, + 0x19b6, 0x704c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x90f0, 0x00ee, + 0x003e, 0x0804, 0xb35a, 0x080c, 0x9336, 0x00ee, 0x003e, 0x1904, + 0xb35a, 0x0804, 0xb310, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, + 0x001b, 0x006e, 0x00ce, 0x0005, 0xb3e3, 0xb4a5, 0xb60c, 0xb3eb, + 0x9a9f, 0xb3e3, 0xcc48, 0xbdf9, 0xb4a5, 0xb3dc, 0xb68b, 0xb3dc, + 0xb3dc, 0xb3dc, 0xb3dc, 0xb3dc, 0x080c, 0x0d65, 0x080c, 0xb8d3, + 0x1110, 0x080c, 0xa40d, 0x0005, 0x080c, 0x86d1, 0x0804, 0x9a65, + 0x601b, 0x0001, 0x0005, 0x080c, 0xb6c5, 0x0130, 0x6014, 0x0096, + 0x2048, 0x2c00, 0xa896, 0x009e, 0x080c, 0x9746, 0x080c, 0xbe11, + 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x0804, 0x9762, + 0xb410, 0xb412, 0xb43c, 0xb450, 0xb47b, 0xb410, 0xb3e3, 0xb3e3, + 0xb3e3, 0xb457, 0xb457, 0xb410, 0xb410, 0xb410, 0xb410, 0xb461, + 0x080c, 0x0d65, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, + 0xa882, 0x009e, 0x2071, 0x19b6, 0x7030, 0x9c06, 0x01d0, 0x0066, + 0x080c, 0x8f6c, 0x190c, 0x0d65, 0x080c, 0x8f7a, 0x006e, 0x080c, + 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, + 0x1956, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c, 0x8310, 0x00ee, + 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, + 0xc0b5, 0xa882, 0x009e, 0x080c, 0xbd91, 0x6007, 0x0085, 0x6003, + 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x8310, 0x0005, + 0x080c, 0x9746, 0x080c, 0x98b7, 0x080c, 0x9762, 0x0c28, 0x0096, + 0x601b, 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, + 0x0005, 0x080c, 0x52a5, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, + 0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, + 0xa867, 0x0139, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x683f, + 0x009e, 0x0804, 0x9a65, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c, + 0xbdfd, 0x01f0, 0x080c, 0x9762, 0x2001, 0x180f, 0x2004, 0xd0c4, + 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, + 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, 0x1595, 0x6000, + 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x9b03, 0x0005, + 0x009e, 0x080c, 0x18f4, 0x0804, 0xb43c, 0x6000, 0x908a, 0x0016, + 0x1a0c, 0x0d65, 0x000b, 0x0005, 0xb4bc, 0xb3e8, 0xb4be, 0xb4bc, + 0xb4be, 0xb4be, 0xb3e4, 0xb4bc, 0xb3de, 0xb3de, 0xb4bc, 0xb4bc, + 0xb4bc, 0xb4bc, 0xb4bc, 0xb4bc, 0x080c, 0x0d65, 0x6010, 0x00b6, + 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, + 0x0d65, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb4d9, 0xb5a6, 0xb4db, + 0xb51b, 0xb4db, 0xb51b, 0xb4db, 0xb4e9, 0xb4d9, 0xb51b, 0xb4d9, + 0xb50a, 0x080c, 0x0d65, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, + 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, + 0xb5a2, 0x6004, 0x080c, 0xb8d3, 0x0904, 0xb5bf, 0x908e, 0x0004, + 0x1110, 0x080c, 0x2ff2, 0x908e, 0x0021, 0x0904, 0xb5c3, 0x908e, + 0x0022, 0x0904, 0xb607, 0x908e, 0x003d, 0x0904, 0xb5c3, 0x908e, + 0x0039, 0x0904, 0xb5c7, 0x908e, 0x0035, 0x0904, 0xb5c7, 0x908e, + 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, + 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x2fc1, 0x080c, + 0xa40d, 0x0804, 0x9a9f, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, + 0x0904, 0xb593, 0x9186, 0x0002, 0x1904, 0xb568, 0x2001, 0x1836, + 0x2004, 0xd08c, 0x11c8, 0x080c, 0x6f5c, 0x11b0, 0x080c, 0xbdd7, + 0x0138, 0x080c, 0x6f7f, 0x1120, 0x080c, 0x6e67, 0x0804, 0xb5f0, + 0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, + 0x080c, 0x6e8d, 0x0804, 0xb5f0, 0x6010, 0x2058, 0x2001, 0x1836, + 0x2004, 0xd0ac, 0x1904, 0xb5f0, 0xb8a0, 0x9084, 0xff80, 0x1904, + 0xb5f0, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, + 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, + 0x080c, 0x9a0f, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, + 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, + 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1836, 0x2104, 0xc085, + 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5b75, 0x00ee, 0x080c, + 0xa40d, 0x0030, 0x080c, 0xa40d, 0x080c, 0x2fc1, 0x080c, 0xbdec, + 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ff2, 0x012e, 0x00ee, + 0x080c, 0x9a9f, 0x0005, 0x2001, 0x0002, 0x080c, 0x60b7, 0x6003, + 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x00de, + 0x00ce, 0x0c80, 0x080c, 0x2ff2, 0x0804, 0xb517, 0x00c6, 0x00d6, + 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, + 0x00ff, 0x9005, 0x0904, 0xb568, 0x8001, 0xb842, 0x6003, 0x0001, + 0x080c, 0x8335, 0x080c, 0x8793, 0x00de, 0x00ce, 0x0898, 0x080c, + 0xa40d, 0x0804, 0xb519, 0x080c, 0xa449, 0x0804, 0xb519, 0x00d6, + 0x2c68, 0x6104, 0x080c, 0xbd4f, 0x00de, 0x0118, 0x080c, 0x9a65, + 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, + 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, + 0x2001, 0x1956, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, + 0xc0b5, 0x6026, 0x2160, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005, + 0x00de, 0x00ce, 0x080c, 0xa40d, 0x080c, 0x2fc1, 0x00e6, 0x0126, + 0x2091, 0x8000, 0x080c, 0x2ff2, 0x6017, 0x0000, 0x6023, 0x0007, + 0x601b, 0x0398, 0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, + 0x9ea0, 0x1904, 0xb5bf, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, + 0x0d65, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xb627, + 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, + 0xb3e3, 0xb627, 0xb3e8, 0xb629, 0xb3e8, 0xb636, 0xb627, 0x080c, + 0x0d65, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, + 0x000d, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005, 0x080c, 0xbdcb, + 0x0118, 0x080c, 0xbdde, 0x0010, 0x080c, 0xbdec, 0x080c, 0xb8ad, + 0x080c, 0xb6c5, 0x0570, 0x080c, 0x2fc1, 0x080c, 0xb6c5, 0x0168, + 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, + 0xa880, 0xc0ed, 0xa882, 0x080c, 0x683f, 0x2c68, 0x080c, 0x9a0f, + 0x0150, 0x6810, 0x6012, 0x080c, 0xbb52, 0x00c6, 0x2d60, 0x080c, + 0x9a9f, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, + 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, + 0x00c8, 0x080c, 0xbdcb, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, + 0x080c, 0x2fc1, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, + 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x2fc1, 0x0868, + 0x080c, 0x9a9f, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, + 0x0002, 0xb6a1, 0xb6a1, 0xb6a3, 0xb6a3, 0xb6a3, 0xb6a1, 0xb6a1, + 0x9a9f, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, + 0xb6a1, 0x080c, 0x0d65, 0x080c, 0x9746, 0x080c, 0x98b7, 0x080c, + 0x9762, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x683f, + 0x009e, 0x0804, 0x9a65, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, + 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, + 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, + 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, + 0x080c, 0x10ce, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, + 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, + 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, + 0xbdd7, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, + 0x1148, 0x080c, 0x2fc1, 0x080c, 0xbdec, 0x00c6, 0x080c, 0x9a9f, + 0x00ce, 0x0060, 0x080c, 0xbac4, 0x0148, 0x080c, 0xb8d3, 0x1110, + 0x080c, 0xa40d, 0x00c6, 0x080c, 0x9a65, 0x00ce, 0x9ce0, 0x001c, + 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, + 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, + 0x81ff, 0x0128, 0x2061, 0x1b00, 0x6112, 0x080c, 0x2fc1, 0x9006, + 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, + 0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x01d8, 0x080c, 0x52a5, + 0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x52a5, + 0x0118, 0x080c, 0xb7ef, 0x0168, 0x080c, 0xbb52, 0x6023, 0x0003, + 0x2009, 0x004b, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, + 0x080c, 0x9ad6, 0x05b0, 0x080c, 0x52a5, 0x0118, 0x602f, 0x0000, + 0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x6023, + 0x0003, 0x0016, 0x080c, 0x9746, 0x080c, 0x8498, 0x0076, 0x903e, + 0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762, + 0x001e, 0xd184, 0x0128, 0x080c, 0x9a65, 0x9085, 0x0001, 0x0070, + 0x080c, 0x52a5, 0x0128, 0xd18c, 0x1170, 0x080c, 0xb7ef, 0x0148, + 0x2009, 0x004c, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, + 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, + 0x9a0f, 0x2c78, 0x01d8, 0x080c, 0x52a5, 0x0110, 0x7e2e, 0x0008, + 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, + 0xb801, 0x2f60, 0x080c, 0x52a5, 0x0118, 0x080c, 0xb7ef, 0x0130, + 0x001e, 0x0016, 0x080c, 0x9b03, 0x9085, 0x0001, 0x001e, 0x004e, + 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0x9a0f, + 0x2c78, 0x0530, 0x080c, 0x52a5, 0x0110, 0x7e2e, 0x0008, 0x7e16, + 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, + 0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, + 0x9a65, 0x0060, 0x2f60, 0x080c, 0x52a5, 0x0120, 0xd18c, 0x1160, + 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9b03, 0x9085, 0x0001, + 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, + 0x080c, 0x479b, 0x00ce, 0x1120, 0x080c, 0x9a65, 0x9006, 0x0005, + 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, + 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x9746, + 0x080c, 0x6345, 0x0158, 0x2001, 0xb808, 0x0006, 0x900e, 0x2400, + 0x080c, 0x6a5c, 0x080c, 0x683f, 0x000e, 0x0807, 0x2418, 0x080c, + 0x8697, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, + 0x080c, 0x84b2, 0x008e, 0x080c, 0x8387, 0x2f08, 0x2648, 0x080c, + 0xce23, 0xb93c, 0x81ff, 0x090c, 0x8589, 0x080c, 0x9762, 0x012e, + 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9a0f, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, + 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9b03, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, + 0x2091, 0x8000, 0x080c, 0x9ad6, 0x01b8, 0x660a, 0x2b08, 0x6112, + 0x080c, 0xbb52, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, + 0x080c, 0x1646, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9b03, 0x9085, + 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, + 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x0198, + 0x660a, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900, + 0x6016, 0x001e, 0x0016, 0x080c, 0x9b03, 0x9085, 0x0001, 0x001e, + 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, + 0x8000, 0x080c, 0x9ad6, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbb52, + 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9b03, + 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, + 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, + 0x2258, 0xba3c, 0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8c0, + 0x9005, 0x0128, 0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, 0x00be, + 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, + 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, + 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, + 0x0190, 0x6014, 0x904d, 0x080c, 0xb6c5, 0x0168, 0xa864, 0x9086, + 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, + 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, + 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ad6, 0x0198, 0x2b08, + 0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, + 0x2fc1, 0x2009, 0x0028, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, + 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa696, + 0x00be, 0x080c, 0xa8d5, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, + 0x8335, 0x080c, 0x8793, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, + 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbd10, 0x080c, + 0xa40d, 0x080c, 0x9a65, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, + 0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, + 0x012e, 0x009e, 0x080c, 0x9a65, 0x0c30, 0x0096, 0x9186, 0x0016, + 0x1128, 0x2001, 0x0004, 0x080c, 0x60b7, 0x00e8, 0x9186, 0x0015, + 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, + 0x00b6, 0x2058, 0x080c, 0x6201, 0x00be, 0x080c, 0xa9a6, 0x1198, + 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, + 0x0006, 0x080c, 0x60b7, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, + 0x080c, 0x9e74, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, + 0x080c, 0xa40d, 0x080c, 0x9a65, 0x009e, 0x0005, 0x6014, 0x6310, + 0x2358, 0x904d, 0x090c, 0x0d65, 0xa87b, 0x0000, 0xa883, 0x0000, + 0xa897, 0x4000, 0x900e, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800, + 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, + 0x683f, 0x012e, 0x080c, 0x9a65, 0x08f8, 0x6014, 0x904d, 0x090c, + 0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, + 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, + 0x012e, 0x080c, 0x9a65, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, + 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, 0x0000, + 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, + 0x080c, 0x832e, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0bc, 0x0130, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, + 0x006e, 0x00ce, 0x0005, 0xb3e3, 0xb9f5, 0xb9f5, 0xb9f8, 0xd118, + 0xd133, 0xd136, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3, + 0xb3e3, 0xb3e3, 0xb3e3, 0x080c, 0x0d65, 0xa001, 0xa001, 0x0005, + 0x0096, 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, + 0x0010, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, + 0xd0bc, 0x0550, 0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, + 0x2c78, 0x080c, 0x9a0f, 0x0508, 0x7810, 0x6012, 0x080c, 0xbb52, + 0x7820, 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, + 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, + 0x6007, 0x0035, 0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020, + 0x080c, 0x832e, 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, + 0x1957, 0x2004, 0x604a, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, + 0x681c, 0xd0fc, 0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, 0x0180, + 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, + 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fd5, + 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, + 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, + 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, + 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, + 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, + 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x695c, 0x615e, + 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x832e, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, + 0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, + 0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, + 0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, + 0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, + 0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, + 0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, + 0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, + 0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, + 0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, + 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, + 0x00e6, 0x2001, 0x1951, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, + 0x080c, 0x8276, 0x2001, 0x1955, 0x82ff, 0x1110, 0x2011, 0x0014, + 0x2202, 0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d, + 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8276, 0x2001, 0x1956, + 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1957, 0x9288, + 0x000a, 0x2102, 0x2001, 0x0017, 0x080c, 0x9737, 0x2001, 0x1a57, + 0x2102, 0x2001, 0x0032, 0x080c, 0x1595, 0x080c, 0x653e, 0x00ee, + 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, + 0x2001, 0x1955, 0x2003, 0x0028, 0x2001, 0x1956, 0x2003, 0x0014, + 0x2071, 0x193d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1957, + 0x2009, 0x001e, 0x2102, 0x2001, 0x0017, 0x080c, 0x9737, 0x2001, + 0x1a57, 0x2102, 0x2001, 0x0032, 0x080c, 0x1595, 0x00ee, 0x001e, + 0x000e, 0x0005, 0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x1055, + 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, + 0x9a0f, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, + 0x6016, 0x2009, 0x0033, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, + 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, + 0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, 0x11e0, + 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x8852, + 0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, 0x9206, + 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, + 0x3012, 0x080c, 0x9e74, 0x0020, 0x080c, 0xa40d, 0x080c, 0x9a65, + 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, 0x0d48, + 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x0188, + 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900, 0x6016, + 0x2009, 0x004d, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce, + 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, + 0x080c, 0x9a0f, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, + 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0x9b03, 0x9085, 0x0001, + 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, + 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, + 0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, 0xa814, + 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x196f, 0x2003, + 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, + 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x196f, 0x0016, 0x200c, 0x080c, 0xc3ab, 0x001e, 0xa804, + 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, + 0x0010, 0x080c, 0xa40d, 0x080c, 0x9a65, 0x00fe, 0x00ee, 0x009e, + 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, + 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x708c, + 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8852, + 0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, 0x9206, + 0x1110, 0x080c, 0x2fc1, 0x080c, 0x9e74, 0x0020, 0x080c, 0xa40d, + 0x080c, 0x9a65, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa78, + 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, + 0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, 0x6014, + 0x2048, 0x2c78, 0x080c, 0x8852, 0x05e8, 0x7078, 0xaacc, 0x9206, + 0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2fc1, 0x0016, + 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5255, 0x001e, + 0x0010, 0x080c, 0x503e, 0x080c, 0xb6c5, 0x0500, 0xa87b, 0x0000, + 0xa883, 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x503e, 0x080c, + 0xb6c5, 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, + 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, + 0x0139, 0x080c, 0x683f, 0x012e, 0x080c, 0x9a65, 0x00fe, 0x00ee, + 0x009e, 0x0005, 0x705c, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, + 0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, + 0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, + 0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, + 0x0036, 0x080c, 0xb6c5, 0x0904, 0xbd0c, 0x0096, 0x6314, 0x2348, + 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, + 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6455, 0x1108, + 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, + 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, + 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fa0, 0x20a9, + 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, + 0x2098, 0x080c, 0x0fa0, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, + 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, + 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, + 0x6833, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, + 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, + 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, + 0x9084, 0x00ff, 0x900e, 0x080c, 0x23ef, 0x2118, 0x831f, 0x939c, + 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, + 0x080c, 0x47fb, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, + 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, + 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, + 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, + 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, + 0x080c, 0xb6b3, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, + 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, + 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, + 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, + 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, + 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, + 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xad40, + 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, + 0x01e0, 0x080c, 0xb6c5, 0x01c8, 0x080c, 0xb8ad, 0x6037, 0x4000, + 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xb8d3, + 0x1118, 0x080c, 0xa40d, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, + 0x83ff, 0x1129, 0x080c, 0x683f, 0x009e, 0x003e, 0x0005, 0xa880, + 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, + 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xb9c2, + 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, + 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, + 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, + 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, + 0x4998, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, + 0x1955, 0x2004, 0x601a, 0x0005, 0x2001, 0x1957, 0x2004, 0x604a, + 0x0005, 0x080c, 0x9a65, 0x0804, 0x8793, 0x611c, 0xd1fc, 0xa97c, + 0x1108, 0xd1e4, 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, + 0x0005, 0x601c, 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, + 0x0005, 0x6044, 0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f, + 0x9186, 0x0005, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, + 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, + 0x001b, 0x006e, 0x00be, 0x0005, 0xbe3c, 0xc506, 0xc655, 0xbe3c, + 0xbe3c, 0xbe3c, 0xbe3c, 0xbe3c, 0xbe73, 0xc6d3, 0xbe3c, 0xbe3c, + 0xbe3c, 0xbe3c, 0xbe3c, 0xbe3c, 0x080c, 0x0d65, 0x0066, 0x6000, + 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0xbe57, + 0xcbe5, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xcb94, + 0xcc37, 0xbe57, 0xd253, 0xd287, 0xd253, 0xd287, 0xbe57, 0x080c, + 0x0d65, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x000a, + 0x0005, 0xbe71, 0xc8af, 0xc978, 0xc99a, 0xca15, 0xbe71, 0xcb0b, + 0xca9d, 0xc6dd, 0xcb6c, 0xcb81, 0xbe71, 0xbe71, 0xbe71, 0xbe71, + 0xbe71, 0x080c, 0x0d65, 0x91b2, 0x0053, 0x1a0c, 0x0d65, 0x2100, + 0x91b2, 0x0040, 0x1a04, 0xc2ab, 0x0002, 0xbebd, 0xc09c, 0xbebd, + 0xbebd, 0xbebd, 0xc0a5, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, + 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, + 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebf, 0xbf19, 0xbf28, 0xbf8c, + 0xbfb7, 0xc02f, 0xc087, 0xbebd, 0xbebd, 0xc0a8, 0xbebd, 0xbebd, + 0xc0bd, 0xc0ca, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xc14d, + 0xbebd, 0xbebd, 0xc161, 0xbebd, 0xbebd, 0xc11c, 0xbebd, 0xbebd, + 0xbebd, 0xc179, 0xbebd, 0xbebd, 0xbebd, 0xc1f6, 0xbebd, 0xbebd, + 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xc273, 0x080c, 0x0d65, 0x080c, + 0x651b, 0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, + 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, + 0x6017, 0x0000, 0x0804, 0xc095, 0x080c, 0x6504, 0x00e6, 0x00c6, + 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, + 0x0029, 0x080c, 0x9746, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c, + 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x001e, 0x080c, 0x9762, + 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, + 0x6175, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, + 0xcd52, 0x1904, 0xbf84, 0x080c, 0xccee, 0x1120, 0x6007, 0x0008, + 0x0804, 0xc095, 0x6007, 0x0009, 0x0804, 0xc095, 0x080c, 0xcf59, + 0x0128, 0x080c, 0xcd52, 0x0d78, 0x0804, 0xbf84, 0x6017, 0x1900, + 0x0c88, 0x080c, 0x3107, 0x1904, 0xc2a8, 0x6106, 0x080c, 0xcca1, + 0x6007, 0x0006, 0x0804, 0xc095, 0x6007, 0x0007, 0x0804, 0xc095, + 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904, 0xc2a8, + 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, + 0x1220, 0x2001, 0x0001, 0x080c, 0x60a3, 0x96b4, 0xff00, 0x8637, + 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, + 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, + 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, + 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, + 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, + 0x00b0, 0x00ee, 0x080c, 0xcdb9, 0x1190, 0x9686, 0x0006, 0x1140, + 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3012, 0x002e, + 0x080c, 0x6201, 0x6007, 0x000a, 0x00de, 0x0804, 0xc095, 0x6007, + 0x000b, 0x00de, 0x0804, 0xc095, 0x080c, 0x2fc1, 0x080c, 0xbdec, + 0x6007, 0x0001, 0x0804, 0xc095, 0x080c, 0xd2c3, 0x1904, 0xc2a8, + 0x080c, 0x3107, 0x1904, 0xc2a8, 0x2071, 0x0260, 0x7034, 0x90b4, + 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, + 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, + 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3012, 0x002e, 0x6007, + 0x000c, 0x2001, 0x0001, 0x080c, 0xd3df, 0x0804, 0xc095, 0x080c, + 0x651b, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, + 0x0008, 0x1110, 0x0804, 0xbecc, 0x080c, 0x6504, 0x6610, 0x2658, + 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, + 0x2001, 0x0006, 0x080c, 0x60e3, 0x002e, 0x0050, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xbf84, + 0x080c, 0xcdc6, 0x1120, 0x6007, 0x000e, 0x0804, 0xc095, 0x0046, + 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fc1, 0x080c, 0xbdec, + 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, + 0x0029, 0x080c, 0xd0ce, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, + 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xc095, 0x2001, 0x0001, + 0x080c, 0x60a3, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, + 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xaa49, 0x003e, 0x002e, + 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, + 0x0004, 0x0a04, 0xbf84, 0x9682, 0x0007, 0x0a04, 0xbfe0, 0x0804, + 0xbf84, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc095, 0x080c, + 0x651b, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, + 0x0008, 0x1110, 0x0804, 0xbecc, 0x080c, 0x6504, 0x6610, 0x2658, + 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0688, 0x96b4, 0xff00, + 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xbf84, + 0x080c, 0xcdf4, 0x1130, 0x080c, 0xccee, 0x1118, 0x6007, 0x0010, + 0x04e0, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fc1, + 0x080c, 0xbdec, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, + 0x0048, 0x2009, 0x0029, 0x080c, 0xd0ce, 0x6010, 0x2058, 0xb800, + 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, + 0xcf59, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0980, + 0x0804, 0xbf84, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, + 0x3107, 0x1904, 0xc2a8, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, + 0xc446, 0x1904, 0xbf84, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, + 0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8335, 0x080c, 0x8793, 0x0cb0, 0x6007, 0x0005, 0x0c68, + 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904, 0xc2a8, + 0x080c, 0xc446, 0x1904, 0xbf84, 0x6007, 0x0020, 0x6003, 0x0001, + 0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x080c, 0x3107, 0x1904, + 0xc2a8, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c, + 0x8793, 0x0005, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, + 0x1904, 0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x0016, 0x0026, + 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, + 0x080c, 0xb6b3, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, + 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, + 0x2c08, 0x9006, 0x080c, 0xd0a0, 0x1180, 0x7244, 0x9286, 0xffff, + 0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, + 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, + 0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9a65, 0x2160, + 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, + 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x60a3, + 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, + 0x2011, 0x0276, 0x080c, 0xaa49, 0x003e, 0x002e, 0x001e, 0x015e, + 0x0120, 0x6007, 0x0031, 0x0804, 0xc095, 0x080c, 0xa6ae, 0x080c, + 0x6f5c, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6f76, 0x1138, + 0x080c, 0x725c, 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x0010, 0x080c, + 0x6f30, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x3107, 0x1904, + 0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x6106, 0x080c, 0xc462, + 0x1120, 0x6007, 0x002b, 0x0804, 0xc095, 0x6007, 0x002c, 0x0804, + 0xc095, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904, + 0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x6106, 0x080c, 0xc467, + 0x1120, 0x6007, 0x002e, 0x0804, 0xc095, 0x6007, 0x002f, 0x0804, + 0xc095, 0x080c, 0x3107, 0x1904, 0xc2a8, 0x00e6, 0x00d6, 0x00c6, + 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, + 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, + 0x00ee, 0x0804, 0xc09c, 0x080c, 0x52a1, 0xd0e4, 0x0904, 0xc1f3, + 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, + 0x080c, 0x6559, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, + 0xb814, 0x9206, 0x0510, 0x080c, 0x6555, 0x15b8, 0x2069, 0x1800, + 0x687c, 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, + 0xb6b3, 0x0590, 0x080c, 0xc333, 0x0578, 0x080c, 0xd145, 0x0560, + 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, + 0x832e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, + 0x0150, 0x080c, 0xb6b3, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, + 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, + 0xd0a0, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, + 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, + 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x3107, + 0x1904, 0xc2a8, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, + 0x9086, 0x0006, 0x1904, 0xc09c, 0x00e6, 0x00d6, 0x00c6, 0x080c, + 0x52a1, 0xd0e4, 0x0904, 0xc26b, 0x2069, 0x1800, 0x2071, 0x026c, + 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, + 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd0a0, 0x2c10, 0x00ce, + 0x05e8, 0x080c, 0xb6b3, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, + 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb2c3, 0x002e, + 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, + 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, + 0x2004, 0x9005, 0x0170, 0x080c, 0xc333, 0x0904, 0xc1ec, 0x0056, + 0x7510, 0x7614, 0x080c, 0xd15e, 0x005e, 0x00ce, 0x00de, 0x00ee, + 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, + 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x0c78, 0x6007, 0x003b, + 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x832e, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, + 0x0000, 0x0804, 0xc1c3, 0x00e6, 0x0026, 0x080c, 0x651b, 0x0550, + 0x080c, 0x6504, 0x080c, 0xd335, 0x1518, 0x2071, 0x1800, 0x70d8, + 0x9085, 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, + 0x00ff, 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, + 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x6559, 0x0120, 0x2011, + 0x19d8, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2d99, 0x0010, + 0x080c, 0xd367, 0x002e, 0x00ee, 0x080c, 0x9a65, 0x0804, 0xc09b, + 0x080c, 0x9a65, 0x0005, 0x2600, 0x0002, 0xc2bf, 0xc2bf, 0xc2bf, + 0xc2bf, 0xc2bf, 0xc2c1, 0xc2bf, 0xc2bf, 0xc2bf, 0xc2bf, 0xc2de, + 0xc2bf, 0xc2bf, 0xc2bf, 0xc2f0, 0xc2fd, 0xc32e, 0xc2bf, 0x080c, + 0x0d65, 0x080c, 0xd2c3, 0x1d20, 0x080c, 0x3107, 0x1d08, 0x080c, + 0xc446, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, + 0x080c, 0x8335, 0x0005, 0x080c, 0x2fc1, 0x080c, 0xbdec, 0x6007, + 0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x0005, 0x080c, 0xd2c3, + 0x1938, 0x080c, 0x3107, 0x1920, 0x080c, 0xc446, 0x1d60, 0x703c, + 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8335, 0x0005, + 0x080c, 0xc34e, 0x0904, 0xc2a8, 0x6007, 0x004e, 0x6003, 0x0001, + 0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x004f, 0x6017, + 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, + 0x1160, 0x7140, 0x2001, 0x198c, 0x2004, 0x9106, 0x11b0, 0x7144, + 0x2001, 0x198d, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, + 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, + 0x000a, 0x080c, 0xaa5d, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, + 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x0050, + 0x703c, 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, + 0x2260, 0x6010, 0x2058, 0xb8c4, 0xd084, 0x0150, 0x7128, 0x6050, + 0x9106, 0x1120, 0x712c, 0x604c, 0x9106, 0x0110, 0x9006, 0x0010, + 0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, + 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, + 0x1800, 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, + 0x196f, 0x2003, 0x0000, 0x080c, 0x103c, 0x05a0, 0x2900, 0x6016, + 0x708c, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, + 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x196f, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, + 0x103c, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, + 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, + 0x2001, 0x196f, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, + 0x0001, 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, 0x6014, 0x2048, + 0x080c, 0x0fd5, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, + 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, + 0x918c, 0xffff, 0x11a8, 0x080c, 0x1ff6, 0x2099, 0x026c, 0x2001, + 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, + 0x4003, 0x22a8, 0x8108, 0x080c, 0x1ff6, 0x2099, 0x0260, 0x0ca8, + 0x080c, 0x1ff6, 0x2061, 0x196f, 0x6004, 0x2098, 0x6008, 0x3518, + 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, + 0x8108, 0x080c, 0x1ff6, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196f, + 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, + 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, + 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, + 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x200e, + 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, + 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, + 0x080c, 0x200e, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x200e, 0x2061, + 0x1972, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, + 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, + 0x080c, 0x200e, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1972, 0x2019, + 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, + 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, + 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, + 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, + 0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, + 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, + 0x00be, 0x0005, 0x00d6, 0x080c, 0xc4dc, 0x00de, 0x0005, 0x00d6, + 0x080c, 0xc4e9, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, + 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, + 0x080c, 0xd3df, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, + 0x918c, 0x00ff, 0x6824, 0x080c, 0x23ef, 0x1148, 0x2001, 0x0001, + 0x080c, 0xd3df, 0x2110, 0x900e, 0x080c, 0x3012, 0x0018, 0x9085, + 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, + 0x9ad6, 0x0598, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, + 0x8211, 0x220c, 0x080c, 0x23ef, 0x1568, 0x080c, 0x6106, 0x1550, + 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, + 0xd2c3, 0x11c8, 0x080c, 0x3107, 0x11b0, 0x080c, 0xc446, 0x0500, + 0x2001, 0x0007, 0x080c, 0x60b7, 0x2001, 0x0007, 0x080c, 0x60e3, + 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, + 0x080c, 0x8335, 0x0010, 0x080c, 0x9a65, 0x9085, 0x0001, 0x00ce, + 0x00be, 0x0005, 0x080c, 0x9a65, 0x00ce, 0x002e, 0x001e, 0x0ca8, + 0x080c, 0x9a65, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, + 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, + 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, + 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, + 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x6162, + 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, + 0x0053, 0x1a0c, 0x0d65, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, + 0x0040, 0x1a04, 0xc629, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, + 0x0014, 0x190c, 0x0d65, 0x2001, 0x0007, 0x080c, 0x60e3, 0x080c, + 0x86d1, 0x080c, 0x9a9f, 0x080c, 0x8793, 0x0005, 0xc566, 0xc568, + 0xc566, 0xc566, 0xc566, 0xc568, 0xc575, 0xc626, 0xc5c5, 0xc626, + 0xc5d7, 0xc626, 0xc575, 0xc626, 0xc61e, 0xc626, 0xc61e, 0xc626, + 0xc626, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, + 0xc566, 0xc566, 0xc566, 0xc566, 0xc568, 0xc566, 0xc626, 0xc566, + 0xc566, 0xc626, 0xc566, 0xc623, 0xc626, 0xc566, 0xc566, 0xc566, + 0xc566, 0xc626, 0xc626, 0xc566, 0xc626, 0xc626, 0xc566, 0xc570, + 0xc566, 0xc566, 0xc566, 0xc566, 0xc622, 0xc626, 0xc566, 0xc566, + 0xc626, 0xc626, 0xc566, 0xc566, 0xc566, 0xc566, 0x080c, 0x0d65, + 0x080c, 0xbdef, 0x6003, 0x0002, 0x080c, 0x8793, 0x0804, 0xc628, + 0x9006, 0x080c, 0x60a3, 0x0804, 0xc626, 0x080c, 0x6555, 0x1904, + 0xc626, 0x9006, 0x080c, 0x60a3, 0x6010, 0x2058, 0xb810, 0x9086, + 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, + 0x00fe, 0x0428, 0x6010, 0x2058, 0xb884, 0x9005, 0x1178, 0x080c, + 0xbdd7, 0x1904, 0xc626, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, + 0x080c, 0x4998, 0x004e, 0x003e, 0x0804, 0xc626, 0x080c, 0x3138, + 0x1904, 0xc626, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, + 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001, + 0x0002, 0x080c, 0x60b7, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, + 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x6110, 0x2158, 0x2009, + 0x0001, 0x080c, 0x7fc9, 0x0804, 0xc628, 0x6610, 0x2658, 0xbe04, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xc626, 0x9686, + 0x0004, 0x0904, 0xc626, 0x2001, 0x0004, 0x0804, 0xc624, 0x2001, + 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, + 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4998, 0x004e, 0x003e, + 0x2001, 0x0006, 0x080c, 0xc642, 0x6610, 0x2658, 0xbe04, 0x0066, + 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, + 0x0006, 0x080c, 0x60e3, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, + 0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x6555, 0x11f8, 0x2001, + 0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, + 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, + 0x00fe, 0x0804, 0xc5af, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, + 0x0409, 0x0020, 0x0018, 0x0010, 0x080c, 0x60e3, 0x080c, 0x9a65, + 0x0005, 0x2600, 0x0002, 0xc63d, 0xc63d, 0xc63d, 0xc63d, 0xc63d, + 0xc63f, 0xc63d, 0xc63d, 0xc63d, 0xc63d, 0xc63f, 0xc63d, 0xc63d, + 0xc63d, 0xc63f, 0xc63f, 0xc63f, 0xc63f, 0x080c, 0x0d65, 0x080c, + 0x9a65, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, + 0xd184, 0x0138, 0x080c, 0x60b7, 0x9006, 0x080c, 0x60a3, 0x080c, + 0x2ff2, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, + 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x91b6, + 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d65, + 0x006b, 0x0005, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, + 0xc6bd, 0xc682, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, + 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xc6bd, 0xc6c4, 0xa4ee, 0xa4ee, + 0xa4ee, 0xa4ee, 0x00f6, 0x080c, 0x6555, 0x11d8, 0x080c, 0xbdd7, + 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006, + 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7, 0x6023, 0x0001, + 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, + 0x00d0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23ef, + 0x1190, 0x080c, 0x6166, 0x0118, 0x080c, 0x9a65, 0x0060, 0xb810, + 0x0006, 0xb814, 0x0006, 0x080c, 0x5bfc, 0x000e, 0xb816, 0x000e, + 0xb812, 0x080c, 0x9a65, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, + 0x1110, 0x080c, 0x9a65, 0x0005, 0x080c, 0xa8d2, 0x1148, 0x6003, + 0x0001, 0x6007, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0010, + 0x080c, 0x9a65, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65, + 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005, 0x9182, 0x0040, 0x0002, + 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f5, 0xc6f3, 0xc6f3, 0xc6f3, + 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, + 0xc6f3, 0xc6f3, 0xc6f3, 0x080c, 0x0d65, 0x0096, 0x00b6, 0x00d6, + 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, + 0x11b0, 0x6007, 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, + 0x0904, 0xc75c, 0x080c, 0xd3d3, 0x1170, 0x9486, 0x2000, 0x1158, + 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x8248, 0x0020, 0x9026, + 0x080c, 0xd308, 0x0c30, 0x080c, 0x1023, 0x090c, 0x0d65, 0x6003, + 0x0007, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, + 0xa88e, 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, + 0x0016, 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, + 0x080c, 0x683f, 0x001e, 0x080c, 0xd3d3, 0x1904, 0xc7bc, 0x9486, + 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xd046, 0x0804, 0xc7bc, + 0x9486, 0x0200, 0x1120, 0x080c, 0xcfd6, 0x0804, 0xc7bc, 0x9486, + 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xc7bc, 0x2019, 0x0002, + 0x080c, 0xcff5, 0x0804, 0xc7bc, 0x2069, 0x1a3d, 0x6a00, 0xd284, + 0x0904, 0xc826, 0x9284, 0x0300, 0x1904, 0xc81f, 0x6804, 0x9005, + 0x0904, 0xc807, 0x2d78, 0x6003, 0x0007, 0x080c, 0x103c, 0x0904, + 0xc7c8, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, + 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xc82a, 0x9006, + 0xa802, 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, + 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, + 0xb92c, 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, + 0x7044, 0x9084, 0x0003, 0x9080, 0xc7c4, 0x2005, 0xa87e, 0x20a9, + 0x000a, 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, + 0x200b, 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, + 0x4003, 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, + 0x200c, 0xa9ae, 0x080c, 0x6842, 0x002e, 0x004e, 0x00fe, 0x00ee, + 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, + 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x1023, 0x1904, + 0xc771, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, + 0xa022, 0x080c, 0x832e, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, + 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, + 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, + 0x6007, 0x0043, 0x2009, 0xa025, 0x080c, 0x832e, 0x0828, 0x6868, + 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, + 0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0804, 0xc7bc, 0x2001, + 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x47fb, + 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, + 0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0804, 0xc7bc, 0x6017, + 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xc7dc, 0x6017, 0xf200, + 0x0804, 0xc7dc, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, + 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xc7c4, 0x2005, + 0xa87e, 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, + 0xb82c, 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, + 0x2009, 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, + 0x2011, 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, + 0x1a0c, 0x0d65, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, + 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xc8a6, 0x2041, + 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, + 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, + 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x103c, 0x0170, + 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, + 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, + 0x902d, 0x0118, 0x080c, 0x1055, 0x0cc8, 0x080c, 0x1055, 0x0804, + 0xc7c8, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, + 0x200b, 0x0000, 0x080c, 0xd079, 0x0804, 0xc7bc, 0x8010, 0x0004, + 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, + 0x0013, 0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x9082, + 0x0040, 0x0a0c, 0x0d65, 0x2008, 0x0804, 0xc931, 0x9186, 0x0051, + 0x0108, 0x0040, 0x080c, 0x9935, 0x01e8, 0x9086, 0x0002, 0x0904, + 0xc978, 0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, + 0x9186, 0x0014, 0x0150, 0x190c, 0x0d65, 0x080c, 0x9935, 0x0150, + 0x9086, 0x0004, 0x0904, 0xca15, 0x0028, 0x6004, 0x9082, 0x0040, + 0x2008, 0x001a, 0x080c, 0x9b20, 0x0005, 0xc8f8, 0xc8fa, 0xc8fa, + 0xc921, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, + 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, + 0x080c, 0x0d65, 0x080c, 0x86d1, 0x080c, 0x8793, 0x0036, 0x0096, + 0x6014, 0x904d, 0x01d8, 0x080c, 0xb6c5, 0x01c0, 0x6003, 0x0002, + 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, + 0x0004, 0x080c, 0xd079, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, + 0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, + 0x0005, 0x0096, 0x080c, 0x86d1, 0x080c, 0x8793, 0x080c, 0xb6c5, + 0x0120, 0x6014, 0x2048, 0x080c, 0x1055, 0x080c, 0x9a9f, 0x009e, + 0x0005, 0x0002, 0xc945, 0xc95a, 0xc947, 0xc96f, 0xc945, 0xc945, + 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, + 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0x080c, 0x0d65, 0x0096, + 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, + 0x0043, 0x080c, 0x9b03, 0x0010, 0x6003, 0x0004, 0x080c, 0x8793, + 0x009e, 0x0005, 0x080c, 0xb6c5, 0x0138, 0x6114, 0x0096, 0x2148, + 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x821d, 0x080c, 0x9a65, + 0x080c, 0x8793, 0x0005, 0x080c, 0xd2cc, 0x0db0, 0x0cc8, 0x6003, + 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0005, + 0x9182, 0x0040, 0x0002, 0xc98e, 0xc990, 0xc98e, 0xc98e, 0xc98e, + 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, + 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc991, 0xc98e, 0x080c, 0x0d65, + 0x0005, 0x00d6, 0x080c, 0x821d, 0x00de, 0x080c, 0xd324, 0x080c, + 0x9a65, 0x0005, 0x9182, 0x0040, 0x0002, 0xc9b0, 0xc9b0, 0xc9b0, + 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b2, 0xc9dd, + 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9dd, 0xc9b0, 0xc9b0, 0xc9b0, + 0x080c, 0x0d65, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, + 0x908c, 0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, + 0x2009, 0x0041, 0x009e, 0x0804, 0xca9d, 0x6003, 0x0007, 0x601b, + 0x0000, 0x080c, 0x821d, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, + 0xd1ec, 0x1130, 0x080c, 0x821d, 0x080c, 0x9a65, 0x009e, 0x0005, + 0x080c, 0xd2cc, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, + 0xc1d4, 0x2102, 0x0036, 0x080c, 0x872e, 0x080c, 0x8793, 0x6014, + 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, + 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac, + 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003, + 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xd079, 0x6018, 0x9005, + 0x1128, 0x2001, 0x1956, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, + 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, + 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, + 0xca2e, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, + 0xca2c, 0xca2c, 0xca2c, 0xca79, 0x080c, 0x0d65, 0x6014, 0x0096, + 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, 0x00be, + 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, + 0x0041, 0x009e, 0x0804, 0xca9d, 0x6003, 0x0007, 0x601b, 0x0000, + 0x080c, 0x821d, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, + 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420, + 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110, + 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e, + 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, + 0x00e9, 0x080c, 0x821f, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, + 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x158c, 0x1904, 0xca2e, + 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, + 0x1120, 0x080c, 0x158c, 0x1904, 0xca2e, 0x0005, 0xd2fc, 0x0140, + 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, + 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208, + 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65, + 0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0xcac0, 0xcacc, 0xcad8, + 0xcae4, 0xcac0, 0xcac0, 0xcac0, 0xcac0, 0xcac7, 0xcac2, 0xcac2, + 0xcac0, 0xcac0, 0xcac0, 0xcac0, 0xcac2, 0xcac0, 0xcac2, 0xcac0, + 0x080c, 0x0d65, 0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0x6014, + 0x9005, 0x190c, 0x0d65, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, + 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x8310, 0x012e, 0x0005, + 0x6003, 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, + 0x080c, 0x832e, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, + 0x1a79, 0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, + 0x9084, 0x0003, 0x9086, 0x0002, 0x0198, 0x6024, 0xd0cc, 0x1148, + 0xd0c4, 0x1138, 0xa8a8, 0x2004, 0x9005, 0x1118, 0x2009, 0xb035, + 0x0010, 0x2009, 0xa035, 0x009e, 0x080c, 0x8375, 0x012e, 0x0005, + 0x2009, 0xa032, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, + 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xcb27, + 0xcb29, 0xcb3e, 0xcb58, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, + 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0x080c, + 0x0d65, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, 0x909c, 0x0003, + 0x939e, 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, + 0x8000, 0x2009, 0xa022, 0x080c, 0x832e, 0x0468, 0x6014, 0x2048, + 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, + 0x6003, 0x0001, 0x6106, 0x2009, 0xa001, 0x080c, 0x832e, 0x00d8, + 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xd079, 0x0098, + 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, + 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, 0x1a79, 0x2009, + 0xa035, 0x080c, 0x8375, 0x0005, 0x080c, 0x86d1, 0x6114, 0x81ff, + 0x0158, 0x0096, 0x2148, 0x080c, 0xd370, 0x0036, 0x2019, 0x0029, + 0x080c, 0xd079, 0x003e, 0x009e, 0x080c, 0x9a9f, 0x080c, 0x8793, + 0x0005, 0x080c, 0x872e, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, + 0x080c, 0xd370, 0x0036, 0x2019, 0x0029, 0x080c, 0xd079, 0x003e, + 0x009e, 0x080c, 0x9a9f, 0x0005, 0x9182, 0x0085, 0x0002, 0xcba6, + 0xcba4, 0xcba4, 0xcbb2, 0xcba4, 0xcba4, 0xcba4, 0xcba4, 0xcba4, + 0xcba4, 0xcba4, 0xcba4, 0xcba4, 0x080c, 0x0d65, 0x6003, 0x000b, + 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x832e, + 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd2c3, 0x0118, 0x080c, + 0x9a65, 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, + 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x2011, 0x014e, 0x080c, 0x9d91, 0x7220, 0x080c, 0xcf0f, + 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, + 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, + 0x080c, 0x832e, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, + 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, + 0x0d65, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, + 0x0014, 0x0118, 0x080c, 0x9b20, 0x0050, 0x2001, 0x0007, 0x080c, + 0x60e3, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x080c, 0x8793, 0x0005, + 0xcc15, 0xcc17, 0xcc17, 0xcc15, 0xcc15, 0xcc15, 0xcc15, 0xcc15, + 0xcc15, 0xcc15, 0xcc15, 0xcc15, 0xcc15, 0x080c, 0x0d65, 0x080c, + 0x9a9f, 0x080c, 0x8793, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d65, + 0x9182, 0x0092, 0x1a0c, 0x0d65, 0x9182, 0x0085, 0x0002, 0xcc34, + 0xcc34, 0xcc34, 0xcc36, 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0xcc34, + 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0x080c, 0x0d65, 0x0005, 0x9186, + 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, + 0x080c, 0x9b20, 0x0020, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005, + 0x0036, 0x080c, 0xd324, 0x604b, 0x0000, 0x2019, 0x000b, 0x0031, + 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, + 0x2091, 0x8000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x0006, + 0x9086, 0x0003, 0x0110, 0x080c, 0x9746, 0x0086, 0x2c40, 0x0096, + 0x904e, 0x080c, 0x9200, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, + 0x080c, 0x92ab, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, + 0x6020, 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, + 0x080c, 0xd324, 0x080c, 0xbdef, 0x080c, 0x18f4, 0x6023, 0x0007, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0110, 0x080c, 0xd079, 0x009e, + 0x6017, 0x0000, 0x080c, 0xd324, 0x6023, 0x0007, 0x080c, 0xbdef, + 0x000e, 0x9086, 0x0003, 0x0110, 0x080c, 0x9762, 0x003e, 0x012e, + 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, + 0x7938, 0x783c, 0x080c, 0x23ef, 0x15d8, 0x0016, 0x00c6, 0x080c, + 0x6166, 0x15a0, 0x001e, 0x00c6, 0x2160, 0x080c, 0xbdec, 0x00ce, + 0x002e, 0x0026, 0x0016, 0x080c, 0x9746, 0x2019, 0x0029, 0x080c, + 0x9372, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c, 0x8387, 0x007e, + 0x001e, 0x0076, 0x903e, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762, + 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, + 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x3093, 0x002e, 0x001e, + 0x080c, 0x5bfc, 0xbe12, 0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e, + 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, + 0x00b6, 0x0016, 0x2009, 0x1823, 0x2104, 0x9086, 0x0074, 0x1904, + 0xcd47, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, + 0x9184, 0x8000, 0x0904, 0xcd44, 0x2001, 0x194d, 0x2004, 0x9005, + 0x1140, 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, 0x0800, + 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xd3d8, 0x0118, + 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, 0x0001, 0x693c, + 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff, + 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, 0x918a, 0x0001, + 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, 0x0300, 0x0088, + 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, 0x6017, 0x0900, + 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, 0x0010, 0x6017, + 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, 0x00be, 0x00de, + 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, 0x0156, 0x6210, + 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, 0x0180, 0x9286, + 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, + 0x9286, 0x0004, 0x0120, 0x080c, 0x6175, 0x0804, 0xcdb2, 0x2011, + 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, + 0xaa5d, 0x009e, 0x15c0, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, + 0x2b48, 0x2019, 0x0006, 0x080c, 0xaa5d, 0x009e, 0x1560, 0x0046, + 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1854, 0x210c, 0x0038, + 0x2009, 0x0029, 0x080c, 0xd0ce, 0xb800, 0xc0e5, 0xb802, 0x080c, + 0x9746, 0x2019, 0x0029, 0x080c, 0x8498, 0x0076, 0x2039, 0x0000, + 0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762, + 0x2001, 0x0007, 0x080c, 0x60e3, 0x2001, 0x0007, 0x080c, 0x60b7, + 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, + 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, + 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, + 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, + 0x080c, 0x23ef, 0x11d0, 0x080c, 0x6166, 0x11b8, 0x2011, 0x0270, + 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d, + 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, + 0x2019, 0x0006, 0x080c, 0xaa5d, 0x009e, 0x015e, 0x003e, 0x002e, + 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, + 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, + 0x23ef, 0x11d0, 0x080c, 0x6166, 0x11b8, 0x2011, 0x0276, 0x20a9, + 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d, 0x009e, + 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, + 0x0006, 0x080c, 0xaa5d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, + 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, + 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x080c, 0x97a4, + 0x0106, 0x190c, 0x9746, 0x2740, 0x2029, 0x19c2, 0x252c, 0x2021, + 0x19c9, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7650, 0x7070, + 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b00, 0x000e, 0x0128, 0x8001, + 0x9602, 0x1a04, 0xcec4, 0x0018, 0x9606, 0x0904, 0xcec4, 0x2100, + 0x9c06, 0x0904, 0xcebb, 0x080c, 0xd10a, 0x1904, 0xcebb, 0x080c, + 0xd3f5, 0x0904, 0xcebb, 0x080c, 0xd0fa, 0x0904, 0xcebb, 0x6720, + 0x9786, 0x0001, 0x1148, 0x080c, 0x3138, 0x0904, 0xcee3, 0x6004, + 0x9086, 0x0000, 0x1904, 0xcee3, 0x9786, 0x0004, 0x0904, 0xcee3, + 0x9786, 0x0007, 0x0904, 0xcebb, 0x2500, 0x9c06, 0x0904, 0xcebb, + 0x2400, 0x9c06, 0x0904, 0xcebb, 0x88ff, 0x0118, 0x605c, 0x9906, + 0x15d0, 0x0096, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1120, + 0x0016, 0x080c, 0x18f4, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, + 0xb8d3, 0x1130, 0x080c, 0xa40d, 0x009e, 0x080c, 0x9a9f, 0x0418, + 0x6014, 0x2048, 0x080c, 0xb6c5, 0x01d8, 0x9786, 0x0003, 0x1588, + 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, + 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c, 0xd370, + 0x0016, 0x080c, 0xb9bc, 0x080c, 0x6833, 0x001e, 0x080c, 0xb8ad, + 0x009e, 0x080c, 0x9a9f, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, + 0x9c02, 0x1210, 0x0804, 0xce3c, 0x010e, 0x190c, 0x9762, 0x012e, + 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, + 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, + 0xd370, 0x080c, 0xd079, 0x08e0, 0x009e, 0x08e8, 0x9786, 0x000a, + 0x0908, 0x0804, 0xcea0, 0x81ff, 0x09b0, 0x9180, 0x0001, 0x2004, + 0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, + 0x1950, 0x6000, 0x9086, 0x0002, 0x1930, 0x080c, 0xb8c2, 0x0130, + 0x080c, 0xb8d3, 0x1900, 0x080c, 0xa40d, 0x0038, 0x080c, 0x2ff2, + 0x080c, 0xb8d3, 0x1110, 0x080c, 0xa40d, 0x080c, 0x9a9f, 0x0804, + 0xcebb, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, + 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xd0a0, 0x001e, + 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, + 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf30, 0xcf2e, + 0xcf2e, 0xcf2e, 0xcf2e, 0x9a9f, 0x9a9f, 0xcf2e, 0x9006, 0x0005, + 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, + 0x2c00, 0x2009, 0x0020, 0x080c, 0xd0ce, 0x001e, 0x004e, 0x2019, + 0x0002, 0x080c, 0xcc56, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, + 0x080c, 0xb6c5, 0x0140, 0x6014, 0x904d, 0x080c, 0xb2d0, 0x687b, + 0x0005, 0x080c, 0x683f, 0x009e, 0x080c, 0x9a9f, 0x9085, 0x0001, + 0x0005, 0x2001, 0x0001, 0x080c, 0x60a3, 0x0156, 0x0016, 0x0026, + 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, + 0xaa49, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, + 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, + 0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079, 0x0001, 0x8fff, 0x0904, + 0xcfc9, 0x2071, 0x1800, 0x7650, 0x7070, 0x8001, 0x9602, 0x1a04, + 0xcfc9, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, + 0xd0fa, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, + 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, + 0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106, 0x11d0, 0x0096, 0x601c, + 0xd084, 0x0140, 0x080c, 0xd324, 0x080c, 0xbdef, 0x080c, 0x18f4, + 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0120, 0x0046, + 0x080c, 0xd079, 0x004e, 0x009e, 0x080c, 0x9a9f, 0x88ff, 0x1198, + 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, + 0xcf7e, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, + 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x080c, 0x9746, + 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, + 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0x9200, + 0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x080c, 0xcf6f, 0x005e, + 0x007e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c, 0x9746, 0x00b6, + 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, + 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x6166, 0x1190, 0x0056, + 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, + 0x9200, 0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x080c, 0xcf6f, + 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd002, 0x015e, 0x00ce, + 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c, + 0x9746, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, + 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x9200, + 0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x2c20, 0x080c, 0xcf6f, + 0x005e, 0x007e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c, 0x9746, + 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, + 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x6166, 0x11a0, 0x0086, + 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xd308, 0x004e, + 0x0096, 0x904e, 0x080c, 0x9200, 0x009e, 0x008e, 0x903e, 0x080c, + 0x92ab, 0x080c, 0xcf6f, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd052, + 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0x9762, + 0x0005, 0x0016, 0x00f6, 0x080c, 0xb6c3, 0x0198, 0xa864, 0x9084, + 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, + 0x0000, 0xab82, 0x080c, 0x683f, 0x2f48, 0x0cb0, 0xab82, 0x080c, + 0x683f, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, + 0x0000, 0x080c, 0x683f, 0x2f48, 0x0cb8, 0x080c, 0x683f, 0x0c88, + 0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc, 0x9005, 0x1138, 0x2071, + 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, + 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, + 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c, + 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, + 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, + 0x080c, 0x1023, 0x000e, 0x090c, 0x0d65, 0xa867, 0x010d, 0xa88e, + 0x0026, 0x2010, 0x080c, 0xb6b3, 0x2001, 0x0000, 0x0120, 0x2200, + 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f, + 0x0000, 0x2001, 0x195d, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802, + 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, + 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, + 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, + 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, + 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, + 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, + 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, + 0x0005, 0x2001, 0x1956, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c, + 0x832e, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, + 0x0158, 0xd0cc, 0x0118, 0x080c, 0xba03, 0x0030, 0x080c, 0xd324, + 0x080c, 0x821d, 0x080c, 0x9a65, 0x0005, 0x9280, 0x0008, 0x2004, + 0x9084, 0x000f, 0x0002, 0xd159, 0xd159, 0xd159, 0xd15b, 0xd159, + 0xd15b, 0xd15b, 0xd159, 0xd15b, 0xd159, 0xd159, 0xd159, 0xd159, + 0xd159, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, + 0x2004, 0x9084, 0x000f, 0x0002, 0xd172, 0xd172, 0xd172, 0xd172, + 0xd172, 0xd172, 0xd17f, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172, + 0xd172, 0xd172, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, + 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005, 0x0096, + 0x00c6, 0x2260, 0x080c, 0xd324, 0x604b, 0x0000, 0x6024, 0xc0f4, + 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, + 0x0007, 0x1904, 0xd1d8, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, + 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, + 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x00c6, 0x2d60, 0x6100, + 0x9186, 0x0002, 0x1904, 0xd24f, 0x6014, 0x9005, 0x1138, 0x6000, + 0x9086, 0x0007, 0x190c, 0x0d65, 0x0804, 0xd24f, 0x2048, 0x080c, + 0xb6c5, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, + 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, + 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, + 0x080c, 0xca9d, 0x0804, 0xd24f, 0x2009, 0x0041, 0x0804, 0xd249, + 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, + 0x00de, 0x009e, 0x0804, 0xd172, 0xd0b4, 0x0128, 0xd0fc, 0x090c, + 0x0d65, 0x0804, 0xd193, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, + 0x8020, 0x080c, 0x832e, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, + 0x0120, 0x9186, 0x0004, 0x1904, 0xd24f, 0x6814, 0x2048, 0xa97c, + 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, + 0x2c78, 0x080c, 0x1646, 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036, + 0x080c, 0x1023, 0x090c, 0x0d65, 0xa867, 0x010d, 0x9006, 0xa802, + 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892, + 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6, + 0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c, 0xab7a, 0xa876, 0x9006, + 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, 0x683f, + 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcc56, 0x2d00, 0x600a, + 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x634a, 0x003e, + 0x0038, 0x604b, 0x0000, 0x6003, 0x0007, 0x080c, 0xca9d, 0x00ce, + 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, + 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, 0x86d1, + 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, 0xd079, + 0x009e, 0x003e, 0x080c, 0x8793, 0x0005, 0x9186, 0x0014, 0x0d70, + 0x080c, 0x9b20, 0x0005, 0xd282, 0xd280, 0xd280, 0xd280, 0xd280, + 0xd280, 0xd282, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280, + 0x080c, 0x0d65, 0x6003, 0x000c, 0x080c, 0x8793, 0x0005, 0x9182, + 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9b20, + 0x0005, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd2a0, 0xd2c0, 0xd29e, + 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0x080c, 0x0d65, + 0x00d6, 0x2c68, 0x080c, 0x9a0f, 0x01b0, 0x6003, 0x0001, 0x6007, + 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, + 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x2009, + 0x8020, 0x080c, 0x832e, 0x2d60, 0x080c, 0x9a65, 0x00de, 0x0005, + 0x080c, 0x9a65, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, + 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1873, 0x210c, 0xd1ec, + 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, + 0x2001, 0x1957, 0x2004, 0x604a, 0x2009, 0x1873, 0x210c, 0xd1f4, + 0x1520, 0x00a0, 0x2009, 0x1873, 0x210c, 0xd1f4, 0x0128, 0x6024, + 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1957, 0x200c, 0x2001, + 0x1955, 0x2004, 0x9100, 0x9080, 0x000a, 0x604a, 0x6010, 0x00b6, + 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, + 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, + 0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8ac, 0x2060, 0x8cff, 0x0180, + 0x84ff, 0x1118, 0x605c, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, + 0x821d, 0x080c, 0x9a65, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, + 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, + 0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, + 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, + 0x2011, 0x182b, 0x2204, 0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, + 0x9636, 0x1508, 0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636, + 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, + 0x2019, 0x000a, 0x080c, 0xaa5d, 0x009e, 0x1168, 0x2011, 0x0274, + 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, + 0xaa5d, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, + 0x2071, 0x1800, 0x080c, 0x5b75, 0x080c, 0x2d99, 0x00ee, 0x0005, + 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, + 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, + 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, + 0x0126, 0x2091, 0x8000, 0x2029, 0x19c2, 0x252c, 0x2021, 0x19c9, + 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7650, 0x7070, 0x9606, + 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, + 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xd0fa, + 0x01b8, 0x080c, 0xd10a, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, + 0x0016, 0x080c, 0x18f4, 0x001e, 0x080c, 0xb8c2, 0x1110, 0x080c, + 0x2ff2, 0x080c, 0xb8d3, 0x1110, 0x080c, 0xa40d, 0x080c, 0x9a9f, + 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1208, 0x0858, + 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, + 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, + 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, + 0x0036, 0x0046, 0x080c, 0xbdd7, 0x0168, 0x2019, 0xffff, 0x9005, + 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, + 0x080c, 0x4998, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, + 0x1128, 0x080c, 0x9372, 0x080c, 0x9a9f, 0x9006, 0x0005, 0x0126, + 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, + 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, + 0x7032, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, + 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071, + 0x184a, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, + 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1842, 0x0021, 0x00ee, + 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, + 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0x1840, 0x0c99, + 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, 0x0c69, 0x00ee, 0x0005, + 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840, 0x7044, + 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002, + 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, + 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x931a +}; +#ifdef UNIQUE_FW_NAME +unsigned short fw2322flx_length01 = 0xcc67; +#else +unsigned short risc_code_length01 = 0xcc67; +#endif + +/* + * + */ + +unsigned long rseqflx_code_addr01 = 0x0001c000 ; +unsigned short rseqflx_code01[] = { +0x000b, 0x0003, 0x0000, 0x071c, 0x0001, 0xc000, 0x0008, 0x8064, + 0x0000, 0x0010, 0x0000, 0x8066, 0x0008, 0x0101, 0x0003, 0xc007, + 0x0008, 0x80e0, 0x0008, 0xff00, 0x0000, 0x80e2, 0x0008, 0xff00, + 0x0008, 0x0162, 0x0000, 0x8066, 0x0008, 0xa101, 0x000b, 0xc00f, + 0x0008, 0x0d02, 0x0000, 0x8060, 0x0000, 0x0400, 0x000b, 0x60af, + 0x0003, 0x5817, 0x0003, 0x7ac6, 0x0003, 0x5209, 0x000b, 0xc813, + 0x0009, 0xbac0, 0x0000, 0x008a, 0x0003, 0x8813, 0x0000, 0x15fc, + 0x000b, 0xb013, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0001, 0xffa0, + 0x0000, 0x2000, 0x000b, 0x9366, 0x0008, 0x808c, 0x0000, 0x0001, + 0x0007, 0x0000, 0x0007, 0x0000, 0x000a, 0x4047, 0x0008, 0x808c, + 0x0000, 0x0002, 0x0007, 0x0000, 0x0003, 0x082d, 0x0000, 0x4022, + 0x000b, 0x002e, 0x0008, 0x4122, 0x0002, 0x4447, 0x0003, 0x8b8a, + 0x0008, 0x0bfe, 0x0001, 0x11a0, 0x0003, 0x136c, 0x0001, 0x0ca0, + 0x0003, 0x136c, 0x0001, 0x9180, 0x0000, 0x0004, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x000b, 0xc03c, 0x0008, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, + 0x0008, 0x8062, 0x0000, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, + 0x000b, 0xc044, 0x0000, 0x03fe, 0x0001, 0x43e0, 0x000b, 0x8b69, + 0x0009, 0xc2c0, 0x0008, 0x00ff, 0x0001, 0x02e0, 0x000b, 0x8b69, + 0x0001, 0x9180, 0x0008, 0x0005, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0019, 0x000b, 0xc053, + 0x0002, 0x0240, 0x0003, 0x0b66, 0x0008, 0x00fc, 0x000b, 0x3369, + 0x000a, 0x0244, 0x0003, 0x0865, 0x000c, 0x01e2, 0x0001, 0x9180, + 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0002, 0x0234, 0x0008, 0x7f04, 0x0000, 0x8066, 0x0000, 0x040a, + 0x0003, 0xc064, 0x0000, 0x112a, 0x0008, 0x002e, 0x0008, 0x022c, + 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, 0x0000, 0x0002, + 0x0008, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0000, 0x8066, + 0x0008, 0x0011, 0x000b, 0xc071, 0x0008, 0x01fe, 0x0009, 0x42e0, + 0x0003, 0x8b5b, 0x0000, 0x00fe, 0x0001, 0x43e0, 0x0003, 0x8b5b, + 0x0000, 0x1734, 0x0000, 0x1530, 0x0008, 0x1632, 0x0008, 0x0d2a, + 0x0001, 0x9880, 0x0008, 0x0012, 0x0000, 0x8060, 0x0000, 0x0400, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x0003, 0xc083, + 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x1a60, 0x0008, 0x8062, + 0x0000, 0x0002, 0x000b, 0x5889, 0x0000, 0x8066, 0x0000, 0x3679, + 0x0003, 0xc08c, 0x0003, 0x588d, 0x0008, 0x8054, 0x0008, 0x0011, + 0x0000, 0x8074, 0x0008, 0x1010, 0x0008, 0x1efc, 0x0003, 0x3013, + 0x0004, 0x0096, 0x0003, 0x0013, 0x0000, 0x1c60, 0x0000, 0x1b62, + 0x0000, 0x8066, 0x0008, 0x0231, 0x000b, 0xc09a, 0x000b, 0x589b, + 0x0008, 0x0140, 0x0000, 0x0242, 0x0002, 0x1f43, 0x000b, 0x88a5, + 0x0000, 0x0d44, 0x0008, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, + 0x000b, 0x00a9, 0x0008, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, + 0x0000, 0x064a, 0x0003, 0x58a9, 0x0008, 0x8054, 0x0000, 0x0001, + 0x0000, 0x8074, 0x0008, 0x2020, 0x000f, 0x4000, 0x0000, 0x4820, + 0x0008, 0x0bfe, 0x0009, 0x10a0, 0x0003, 0x1110, 0x0001, 0x0ca0, + 0x0003, 0x1110, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, + 0x0000, 0x0008, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x0003, 0xc0bc, 0x0001, 0x80e0, 0x0008, 0x0003, 0x000b, 0x8910, + 0x0000, 0x49b4, 0x0002, 0x4b4e, 0x000b, 0x8919, 0x0008, 0x808a, + 0x0000, 0x0004, 0x0000, 0x18fe, 0x0001, 0x10e0, 0x000b, 0x88ca, + 0x0002, 0x192f, 0x0008, 0x7f32, 0x0008, 0x15fe, 0x0001, 0x10e0, + 0x000b, 0x88cf, 0x0002, 0x162f, 0x0008, 0x7f2c, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0007, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc0d6, 0x000a, 0x004f, + 0x000b, 0x8907, 0x000a, 0x0040, 0x000b, 0x08f1, 0x0002, 0x004e, + 0x000b, 0x08f1, 0x0002, 0x0030, 0x0002, 0x7f2f, 0x0000, 0x7f00, + 0x0000, 0x8066, 0x0008, 0x000a, 0x000b, 0xc0e2, 0x0008, 0x1010, + 0x000c, 0x01c9, 0x000b, 0xb0ea, 0x000c, 0x032f, 0x0004, 0x01b3, + 0x000b, 0x7814, 0x0003, 0x0013, 0x0000, 0x0806, 0x0008, 0x8010, + 0x0000, 0x001f, 0x000c, 0x032f, 0x0000, 0x0310, 0x000c, 0x032f, + 0x000b, 0x00e8, 0x000a, 0x002f, 0x0000, 0x7f00, 0x0000, 0x8066, + 0x0008, 0x000a, 0x000b, 0xc0f5, 0x0004, 0x018c, 0x000a, 0x0040, + 0x000b, 0x090a, 0x000c, 0x01f9, 0x0000, 0x8000, 0x0000, 0x0002, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0006, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x000a, 0x0003, 0xc103, + 0x0000, 0x8072, 0x0000, 0x4000, 0x000b, 0x00e8, 0x0008, 0x8010, + 0x0008, 0x001e, 0x0003, 0x010c, 0x0008, 0x8010, 0x0008, 0x001d, + 0x000c, 0x032f, 0x0008, 0x1010, 0x000c, 0x032f, 0x000b, 0x0014, + 0x0002, 0x4b4e, 0x0003, 0x0916, 0x0008, 0x808a, 0x0000, 0x0004, + 0x000b, 0x6116, 0x000f, 0x8000, 0x0008, 0x808a, 0x0000, 0x0004, + 0x000b, 0x0014, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, + 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x000b, 0xc120, 0x000a, 0x004f, 0x0003, 0x897d, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0005, 0x0008, 0x7f62, + 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc12a, 0x0008, 0x0060, + 0x0008, 0x8062, 0x0000, 0x001f, 0x0000, 0x8066, 0x0000, 0x0209, + 0x0003, 0xc130, 0x000a, 0x014b, 0x000b, 0x097d, 0x0008, 0x8062, + 0x0008, 0x000f, 0x0000, 0x8066, 0x0000, 0x0211, 0x000b, 0xc137, + 0x0008, 0x01fe, 0x0001, 0x02d0, 0x0003, 0x897d, 0x000c, 0x0195, + 0x000b, 0x097d, 0x0008, 0x03a0, 0x0008, 0x8004, 0x0000, 0x0002, + 0x0000, 0x8006, 0x0000, 0x0043, 0x0008, 0x4908, 0x0008, 0x808a, + 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, + 0x0008, 0x0000, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, + 0x000b, 0xc14c, 0x000b, 0xe14d, 0x0008, 0x4908, 0x0008, 0x480a, + 0x0008, 0x808a, 0x0000, 0x0004, 0x0008, 0x0060, 0x0008, 0x8062, + 0x0008, 0x002b, 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc157, + 0x0008, 0x04fe, 0x0009, 0x02a0, 0x000b, 0x915e, 0x0002, 0x0500, + 0x0003, 0x097a, 0x0003, 0x015f, 0x0000, 0x05fe, 0x0001, 0x03a0, + 0x0003, 0x117a, 0x0000, 0x0d0c, 0x0008, 0x0d0e, 0x0008, 0x0d10, + 0x0000, 0x0d12, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, + 0x0000, 0x8066, 0x0008, 0x0832, 0x0003, 0xc16a, 0x0000, 0x800a, + 0x0000, 0x8005, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, + 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0a12, + 0x0003, 0xc174, 0x0008, 0x5006, 0x0008, 0x100e, 0x000c, 0x01a0, + 0x000b, 0x7814, 0x0003, 0x0013, 0x0008, 0x0208, 0x0008, 0x030a, + 0x000b, 0x0161, 0x0004, 0x018c, 0x0008, 0x808a, 0x0000, 0x0004, + 0x0008, 0x8010, 0x0008, 0x0021, 0x000c, 0x032f, 0x0008, 0x1010, + 0x000c, 0x032f, 0x0000, 0x4810, 0x000c, 0x032f, 0x0008, 0x4910, + 0x000c, 0x032f, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0002, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xb40a, 0x0003, 0xc193, + 0x000f, 0x4000, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x0a62, + 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc19a, 0x0002, 0x0210, + 0x0001, 0xffc0, 0x0000, 0x0007, 0x0009, 0x03e0, 0x000f, 0x4000, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x8380, 0x0000, 0x0002, + 0x0009, 0x0a80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0e0a, + 0x000b, 0xc1a8, 0x0002, 0x0300, 0x0001, 0xffc0, 0x0000, 0x0007, + 0x0000, 0x7f06, 0x0002, 0x0a00, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x060a, 0x0003, 0xc1b1, 0x000f, 0x4000, 0x0000, 0x0da0, + 0x0008, 0x0da2, 0x0008, 0x0da4, 0x0009, 0x8880, 0x0000, 0x0001, + 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, + 0x0008, 0xa012, 0x0000, 0x0da6, 0x0008, 0x0da8, 0x0000, 0x0daa, + 0x0000, 0x0dac, 0x000b, 0xc1c1, 0x0009, 0x8880, 0x0008, 0x0009, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xa03a, 0x000b, 0xc1c7, + 0x000f, 0x4000, 0x0009, 0x8880, 0x0008, 0x0005, 0x0000, 0x8060, + 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x000b, 0xc1d0, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, + 0x0000, 0x8066, 0x0008, 0x0021, 0x000b, 0xc1d6, 0x0000, 0x00fe, + 0x0001, 0x01d0, 0x000b, 0x89df, 0x0008, 0x02fe, 0x0009, 0x03d0, + 0x0003, 0x09df, 0x0000, 0x0d06, 0x000f, 0x4000, 0x0000, 0x8006, + 0x0000, 0x0001, 0x000f, 0x4000, 0x0008, 0x0060, 0x0008, 0x8062, + 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0xa041, 0x0003, 0xc1e7, + 0x0002, 0x0243, 0x0003, 0x89ee, 0x0000, 0x54ac, 0x0000, 0x55ae, + 0x0008, 0x0da8, 0x0000, 0x0daa, 0x0000, 0x50b0, 0x0000, 0x51b2, + 0x0000, 0x0db4, 0x0008, 0x0db6, 0x0008, 0x0060, 0x0008, 0x8062, + 0x0000, 0x0007, 0x0000, 0x8066, 0x0008, 0xa452, 0x000b, 0xc1f7, + 0x000f, 0x4000, 0x000a, 0x3945, 0x0003, 0x8a03, 0x0000, 0x8072, + 0x0008, 0x4040, 0x0007, 0x0000, 0x000a, 0x3945, 0x000b, 0x8a01, + 0x000f, 0x4000, 0x0000, 0x8072, 0x0000, 0x4000, 0x0007, 0x0000, + 0x0007, 0x0000, 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x09fb, + 0x0003, 0x0203, 0x000a, 0x3a40, 0x000b, 0x8817, 0x0008, 0x2b24, + 0x0008, 0x2b24, 0x0003, 0x5a0d, 0x0008, 0x8054, 0x0000, 0x0002, + 0x0002, 0x1242, 0x0003, 0x0a51, 0x000a, 0x3a45, 0x000b, 0x0a42, + 0x000a, 0x1e10, 0x0000, 0x7f3c, 0x000b, 0x0a3f, 0x0002, 0x1d00, + 0x0000, 0x7f3a, 0x0000, 0x0d60, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x0009, 0x0003, 0xc21d, 0x0008, 0x00fc, 0x000b, 0xb23c, + 0x0000, 0x1c60, 0x0008, 0x8062, 0x0000, 0x0001, 0x0000, 0x8066, + 0x0008, 0x0009, 0x000b, 0xc225, 0x0008, 0x00fc, 0x000b, 0x3344, + 0x0000, 0x0038, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0019, + 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc22e, 0x0009, 0x80c0, + 0x0008, 0x00ff, 0x0008, 0x7f3e, 0x0000, 0x0d60, 0x0008, 0x0efe, + 0x0001, 0x1f80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, + 0x000b, 0xc238, 0x0008, 0x003a, 0x0000, 0x1dfe, 0x000b, 0x0219, + 0x0008, 0x0036, 0x0004, 0x0096, 0x000b, 0x0251, 0x0000, 0x8074, + 0x0000, 0x2000, 0x000b, 0x0251, 0x0002, 0x3a44, 0x0003, 0x0b6f, + 0x0000, 0x8074, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, + 0x0003, 0xb341, 0x0008, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, + 0x0008, 0x2700, 0x0009, 0x00d0, 0x000b, 0x8a61, 0x0000, 0x8074, + 0x0008, 0x4040, 0x0003, 0x5a51, 0x0003, 0x5209, 0x000a, 0x3a46, + 0x000b, 0x8a61, 0x0002, 0x3a47, 0x000b, 0x0a5c, 0x0008, 0x8054, + 0x0000, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x000b, 0x02ba, + 0x0009, 0x92c0, 0x0000, 0x0fc8, 0x000b, 0x0813, 0x000a, 0x1246, + 0x0003, 0x8b3b, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x0002, + 0x0000, 0x8066, 0x0000, 0x367a, 0x0003, 0xc266, 0x0009, 0x92c0, + 0x0008, 0x0780, 0x000b, 0x8b55, 0x0002, 0x124b, 0x000b, 0x0a6f, + 0x0002, 0x2e4d, 0x0002, 0x2e4d, 0x0003, 0x0b41, 0x000a, 0x3a46, + 0x000b, 0x8a7c, 0x000b, 0x5a71, 0x0008, 0x8054, 0x0000, 0x0004, + 0x000a, 0x1243, 0x000b, 0x0ab8, 0x0008, 0x8010, 0x0000, 0x000d, + 0x000c, 0x032f, 0x0000, 0x1810, 0x000c, 0x032f, 0x0003, 0x02b8, + 0x000a, 0x194d, 0x0003, 0x0a80, 0x000a, 0x1243, 0x0003, 0x0b4b, + 0x0003, 0x5a80, 0x0008, 0x8054, 0x0000, 0x0004, 0x000a, 0x192e, + 0x0008, 0x7f32, 0x000a, 0x1947, 0x000b, 0x0ab2, 0x0002, 0x194f, + 0x000b, 0x0a90, 0x0004, 0x0324, 0x0000, 0x1810, 0x000c, 0x01c9, + 0x0003, 0xb2ab, 0x000c, 0x032f, 0x0004, 0x01b3, 0x0003, 0x02b8, + 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x001f, 0x0000, 0x8066, + 0x0008, 0x0009, 0x0003, 0xc295, 0x000a, 0x004c, 0x0003, 0x8ab2, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x9880, 0x0000, 0x0007, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x320a, 0x0003, 0xc29f, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x9880, 0x0008, 0x0012, + 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x000b, 0xc2a7, + 0x0000, 0x1826, 0x0000, 0x1928, 0x0003, 0x02b8, 0x0000, 0x0806, + 0x0008, 0x8010, 0x0000, 0x001f, 0x000c, 0x032f, 0x0000, 0x0310, + 0x000c, 0x032f, 0x0003, 0x02b8, 0x0004, 0x0324, 0x0008, 0x8010, + 0x0000, 0x0001, 0x000c, 0x032f, 0x0000, 0x1810, 0x000c, 0x032f, + 0x0000, 0x8074, 0x0008, 0xf000, 0x0000, 0x0d30, 0x0002, 0x3a42, + 0x0003, 0x8ac0, 0x0000, 0x15fc, 0x0003, 0xb06a, 0x0003, 0x0013, + 0x0000, 0x8074, 0x0000, 0x0501, 0x0008, 0x8010, 0x0008, 0x000c, + 0x000c, 0x032f, 0x0003, 0x0013, 0x0009, 0xbbe0, 0x0008, 0x0030, + 0x000b, 0x8adc, 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x0003, 0x0ad9, + 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x0003, 0x0ad9, 0x0008, 0x13fe, + 0x0009, 0x3ce0, 0x000b, 0x8ad5, 0x0004, 0x031d, 0x0008, 0x0d26, + 0x000b, 0x02d6, 0x000c, 0x031f, 0x0008, 0x8076, 0x0000, 0x0040, + 0x0003, 0x031a, 0x0008, 0x8076, 0x0008, 0x0041, 0x0003, 0x031a, + 0x0009, 0xbbe0, 0x0000, 0x0032, 0x0003, 0x8ae1, 0x0008, 0x3c1e, + 0x0003, 0x031a, 0x0009, 0xbbe0, 0x0000, 0x0037, 0x0003, 0x8aff, + 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x000b, 0x8ad9, 0x0008, 0x8076, + 0x0000, 0x0040, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x000d, + 0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, + 0x0000, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, + 0x0000, 0x8066, 0x0000, 0x0422, 0x0003, 0xc2f6, 0x0004, 0x0324, + 0x0008, 0x8054, 0x0000, 0x0004, 0x0000, 0x8074, 0x0008, 0xf000, + 0x0000, 0x8072, 0x0000, 0x8000, 0x000b, 0x02ba, 0x0009, 0xbbe0, + 0x0000, 0x0038, 0x000b, 0x8b11, 0x0000, 0x18fe, 0x0009, 0x3ce0, + 0x000b, 0x0b0e, 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x0003, 0x8acf, + 0x000c, 0x031f, 0x0008, 0x8076, 0x0000, 0x0040, 0x0000, 0x8072, + 0x0000, 0x8000, 0x000b, 0x0366, 0x0008, 0x8076, 0x0008, 0x0042, + 0x0003, 0x031a, 0x0009, 0xbbe0, 0x0000, 0x0016, 0x0003, 0x8b1a, + 0x0002, 0x3a44, 0x0003, 0x8816, 0x0000, 0x8072, 0x0000, 0x8000, + 0x000f, 0x8000, 0x0003, 0x0013, 0x0000, 0x8072, 0x0000, 0x8000, + 0x0003, 0x0013, 0x0002, 0x1430, 0x0003, 0x0320, 0x000a, 0x3d30, + 0x0000, 0x7f00, 0x0001, 0xbc80, 0x0000, 0x0007, 0x000b, 0x0328, + 0x000a, 0x1930, 0x0000, 0x7f00, 0x0001, 0x9880, 0x0000, 0x0007, + 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, + 0x0008, 0x000a, 0x000b, 0xc32d, 0x000f, 0x4000, 0x000b, 0x232f, + 0x0008, 0x0870, 0x000f, 0x4000, 0x0009, 0xbac0, 0x0008, 0x0090, + 0x000b, 0x0b38, 0x0000, 0x8074, 0x0000, 0x0706, 0x000b, 0x033a, + 0x0000, 0x8074, 0x0000, 0x0703, 0x000f, 0x4000, 0x0008, 0x8010, + 0x0000, 0x0023, 0x000b, 0x0374, 0x0008, 0x8010, 0x0000, 0x0008, + 0x000b, 0x0374, 0x0008, 0x8010, 0x0008, 0x0022, 0x000b, 0x0374, + 0x0004, 0x0324, 0x0008, 0x8010, 0x0000, 0x0007, 0x000c, 0x032f, + 0x0000, 0x1810, 0x000c, 0x032f, 0x000b, 0x037e, 0x0004, 0x0324, + 0x0008, 0x8010, 0x0008, 0x001b, 0x000c, 0x032f, 0x0000, 0x1810, + 0x000c, 0x032f, 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, + 0x0003, 0x0013, 0x0008, 0x8010, 0x0008, 0x0009, 0x000b, 0x0374, + 0x0008, 0x8010, 0x0008, 0x0005, 0x000b, 0x0374, 0x0008, 0x808c, + 0x0000, 0x0001, 0x0007, 0x0000, 0x0008, 0x8010, 0x0000, 0x0004, + 0x000a, 0x4143, 0x0003, 0x0878, 0x0002, 0x3a44, 0x0003, 0x8813, + 0x0008, 0x0d2a, 0x000b, 0x0374, 0x0008, 0x8010, 0x0008, 0x0003, + 0x0003, 0x0376, 0x0008, 0x8010, 0x0000, 0x000b, 0x0003, 0x0376, + 0x0008, 0x8010, 0x0000, 0x0002, 0x0003, 0x0376, 0x0002, 0x3a47, + 0x000b, 0x8a51, 0x0008, 0x8010, 0x0008, 0x0006, 0x0003, 0x0376, + 0x0000, 0x8074, 0x0008, 0xf000, 0x000c, 0x032f, 0x000c, 0x0332, + 0x000a, 0x3a40, 0x000b, 0x0813, 0x0008, 0x8010, 0x0008, 0x000c, + 0x000c, 0x032f, 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0xf080, + 0x0000, 0x0d30, 0x0002, 0x2e4d, 0x0002, 0x2e4d, 0x0003, 0x0b87, + 0x0008, 0x8054, 0x0000, 0x0019, 0x0003, 0x0013, 0x0008, 0x8054, + 0x0008, 0x0009, 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, + 0x000b, 0x0369, 0xec89, 0x9da0 +}; +unsigned short rseqflx_code_length01 = 0x071c; +/* + * + */ + +unsigned long xseqflx_code_addr01 = 0x0001e000 ; +unsigned short xseqflx_code01[] = { +0x0013, 0x0003, 0x0000, 0x0fe2, 0x0001, 0xe000, 0x0005, 0x0032, + 0x0000, 0x0010, 0x0015, 0x0033, 0x0010, 0xbb39, 0x000b, 0x8007, + 0x0004, 0x0107, 0x0004, 0x0119, 0x0010, 0xc000, 0x0000, 0xc001, + 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0010, 0xc0b2, 0x0000, 0xc0b3, + 0x0010, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0010, 0xc0b7, + 0x0010, 0xc0b8, 0x0000, 0xc0b9, 0x0000, 0xc0ba, 0x0000, 0xc0c2, + 0x0010, 0xc0c3, 0x0000, 0xc0c4, 0x0010, 0xc0c5, 0x0010, 0xc0c6, + 0x0000, 0xc0c7, 0x0000, 0xc0c8, 0x0010, 0xc0c9, 0x0010, 0xc0ca, + 0x0000, 0xc0cb, 0x0010, 0xc0cc, 0x0000, 0xc0cd, 0x0000, 0xc0ce, + 0x0010, 0xc0cf, 0x0015, 0x0039, 0x0010, 0xff00, 0x0015, 0x003a, + 0x0010, 0xff00, 0x0005, 0x00d0, 0x0010, 0xff00, 0x0015, 0x00d1, + 0x0010, 0xff00, 0x0012, 0x3a40, 0x000b, 0x1031, 0x0002, 0x7940, + 0x000b, 0x112b, 0x0002, 0x3a42, 0x001b, 0x1035, 0x0003, 0xb035, + 0x0013, 0xa1cd, 0x0002, 0x3a41, 0x001b, 0x1039, 0x0012, 0x7941, + 0x000b, 0x12eb, 0x0013, 0xe051, 0x0012, 0xd042, 0x0003, 0x103f, + 0x0000, 0x75ff, 0x0002, 0xff41, 0x000b, 0x1051, 0x0000, 0x0cfe, + 0x0013, 0x6047, 0x0011, 0x02e8, 0x0010, 0x0000, 0x0003, 0x1371, + 0x0011, 0x02e8, 0x0010, 0x0005, 0x0013, 0x13fe, 0x0012, 0xd042, + 0x0013, 0x104c, 0x0000, 0x75ff, 0x0012, 0xff40, 0x000b, 0x1051, + 0x0000, 0x12fe, 0x0003, 0x6051, 0x0001, 0x0fe8, 0x0010, 0x0000, + 0x0003, 0x15e8, 0x0015, 0x0030, 0x0000, 0x0400, 0x0010, 0xc131, + 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x8056, 0x0010, 0xb2ff, + 0x0001, 0xb3e0, 0x000c, 0x10c9, 0x000b, 0xf02d, 0x0011, 0x3be8, + 0x0000, 0x0010, 0x000b, 0x106e, 0x0000, 0x0afe, 0x001b, 0x6062, + 0x0000, 0x3c0b, 0x0013, 0x006a, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0x0a88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x3c0a, 0x001b, 0x8069, 0x0010, 0x3c0a, 0x0002, 0x0c00, + 0x0010, 0xff0c, 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0010, 0x0012, + 0x001b, 0x1081, 0x0010, 0x08fe, 0x001b, 0x6075, 0x0010, 0x3c09, + 0x0013, 0x007d, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0888, + 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, + 0x000b, 0x807c, 0x0000, 0x3c08, 0x0002, 0x0c00, 0x0010, 0xff0c, + 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0000, 0x0013, 0x001b, 0x1087, + 0x0000, 0x3cb0, 0x0014, 0x00d9, 0x0013, 0x00c6, 0x0011, 0x3be8, + 0x0000, 0x0019, 0x001b, 0x109a, 0x0010, 0x04fe, 0x000b, 0x608e, + 0x0010, 0x3c05, 0x0013, 0x0096, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0488, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x3c0a, 0x001b, 0x8095, 0x0000, 0x3c04, 0x0002, 0x0c00, + 0x0010, 0xff0c, 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0000, 0x0015, + 0x001b, 0x10a6, 0x0004, 0x0110, 0x0014, 0x0122, 0x0015, 0x0039, + 0x0000, 0x8000, 0x0017, 0x8000, 0x0004, 0x0107, 0x0004, 0x0119, + 0x0014, 0x00f2, 0x0013, 0x002d, 0x0011, 0x3be8, 0x0000, 0x0016, + 0x001b, 0x10b8, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0003, 0x10b2, + 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0003, 0x10b2, 0x0015, 0x0039, + 0x0010, 0x1010, 0x0013, 0x00c6, 0x0015, 0x0039, 0x0000, 0x5040, + 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x07ed, 0x0013, 0x00c6, + 0x0011, 0x3be8, 0x0010, 0x0017, 0x001b, 0x10bd, 0x0010, 0x3cc3, + 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0010, 0x0018, 0x000b, 0x10c2, + 0x0000, 0x3cc2, 0x0013, 0x00c6, 0x0005, 0x00ce, 0x0000, 0x0001, + 0x0000, 0x3bcf, 0x0014, 0x07b1, 0x0015, 0x0039, 0x0000, 0x8000, + 0x0013, 0x002d, 0x0001, 0xb288, 0x0000, 0x0002, 0x0001, 0xc180, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x80cf, + 0x0002, 0xb200, 0x0011, 0xffc8, 0x0000, 0x0007, 0x0010, 0xffb2, + 0x0010, 0xc131, 0x0015, 0x0033, 0x0010, 0xb20a, 0x0001, 0xb0d0, + 0x001b, 0x80d8, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xb088, + 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, + 0x000b, 0x80e0, 0x0001, 0xb1e8, 0x0010, 0xffff, 0x0013, 0x10f1, + 0x0000, 0x11fe, 0x000b, 0x60e8, 0x0000, 0xb012, 0x0013, 0x00f0, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x80ef, + 0x0000, 0xb011, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0xbc88, 0x0010, 0x001e, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xc411, 0x001b, 0x80f9, 0x0011, 0xbc88, 0x0010, 0x0017, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc609, 0x001b, 0x80ff, + 0x0011, 0xbc88, 0x0010, 0x0036, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xc709, 0x000b, 0x8105, 0x0017, 0x4000, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0x0269, 0x001b, 0x810e, 0x0017, 0x4000, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x026a, 0x000b, 0x8117, + 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, + 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0f59, + 0x001b, 0x8120, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xbb88, 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x0f5a, 0x001b, 0x8129, 0x0017, 0x4000, 0x0000, 0xd0ff, + 0x0012, 0xff40, 0x000b, 0x1031, 0x0015, 0x00d1, 0x0010, 0x0101, + 0x0003, 0x9130, 0x0005, 0x0079, 0x0000, 0x0001, 0x0003, 0x9133, + 0x0015, 0x00d1, 0x0000, 0x0100, 0x0011, 0x02e8, 0x0000, 0x0002, + 0x0003, 0x1152, 0x0011, 0x02e8, 0x0000, 0x0001, 0x0013, 0x116a, + 0x0011, 0x02e8, 0x0000, 0x0004, 0x0013, 0x1188, 0x0011, 0x02e8, + 0x0010, 0x0003, 0x0003, 0x11b9, 0x0005, 0x0002, 0x0010, 0x0000, + 0x0000, 0xc00e, 0x0000, 0xc00d, 0x0010, 0xc003, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0xbd88, 0x0010, 0x0009, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x814e, 0x0012, 0xd042, + 0x0013, 0x1031, 0x0003, 0x004c, 0x0012, 0x7849, 0x0003, 0x11c7, + 0x0010, 0x0dfe, 0x0003, 0x6144, 0x0012, 0x0c10, 0x0010, 0xff0c, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x815f, + 0x0010, 0xb3fe, 0x0013, 0x6167, 0x0010, 0xb30b, 0x0015, 0x0033, + 0x0010, 0xc00a, 0x000b, 0x8165, 0x0013, 0x01bc, 0x0000, 0xc00b, + 0x0010, 0xc00a, 0x0013, 0x01bc, 0x0000, 0x78b0, 0x0012, 0xb044, + 0x0003, 0x11c7, 0x0002, 0xb049, 0x0003, 0x11c7, 0x0010, 0x71ff, + 0x0012, 0xff38, 0x0010, 0xff71, 0x0010, 0x0dfe, 0x0003, 0x6142, + 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb309, 0x000b, 0x817d, 0x0010, 0xb3fe, 0x0013, 0x6185, + 0x0000, 0xb309, 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8183, + 0x0013, 0x01bc, 0x0010, 0xc009, 0x0000, 0xc008, 0x0013, 0x01bc, + 0x0000, 0x78b0, 0x0012, 0xb044, 0x0003, 0x11c7, 0x0002, 0xb049, + 0x0003, 0x11c7, 0x0010, 0x71ff, 0x0012, 0xff38, 0x0010, 0xff71, + 0x0010, 0x0dfe, 0x0003, 0x6142, 0x0012, 0x0c10, 0x0010, 0xff0c, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x819b, + 0x0010, 0xb3fe, 0x0003, 0x61a3, 0x0000, 0xb305, 0x0015, 0x0033, + 0x0010, 0xc00a, 0x001b, 0x81a1, 0x0003, 0x01a5, 0x0010, 0xc005, + 0x0000, 0xc004, 0x0002, 0x033f, 0x0002, 0xff27, 0x0000, 0x0db8, + 0x0004, 0x0366, 0x0000, 0x0db8, 0x0014, 0x07ed, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0xbc88, 0x0010, 0x0000, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x81b2, 0x0011, 0xb3e8, + 0x0000, 0x0002, 0x000b, 0x1142, 0x0005, 0x0002, 0x0010, 0x0005, + 0x0003, 0x0144, 0x0012, 0x7849, 0x0003, 0x11c7, 0x0003, 0x0144, + 0x0000, 0x0db8, 0x0012, 0x0345, 0x001b, 0x11c2, 0x0002, 0x033f, + 0x0004, 0x0366, 0x0003, 0x0142, 0x0002, 0x033f, 0x0002, 0xff27, + 0x0004, 0x0366, 0x0014, 0x07ed, 0x0003, 0x0142, 0x0015, 0x00b8, + 0x0000, 0x0001, 0x0015, 0x003a, 0x0010, 0x0101, 0x0014, 0x07ed, + 0x0013, 0x014f, 0x0000, 0x2bba, 0x0003, 0xb1ce, 0x0005, 0x002a, + 0x0000, 0x0002, 0x0001, 0xbac8, 0x0000, 0x0700, 0x000b, 0x12a6, + 0x0011, 0x15e8, 0x0000, 0x0002, 0x0013, 0x1221, 0x0011, 0x15e8, + 0x0000, 0x0001, 0x0013, 0x11dd, 0x0005, 0x0015, 0x0010, 0x0000, + 0x0013, 0x0204, 0x0005, 0x0015, 0x0010, 0x0000, 0x0002, 0xba43, + 0x0013, 0x1205, 0x0013, 0xb1e1, 0x0005, 0x002a, 0x0000, 0x0004, + 0x0012, 0xba42, 0x0003, 0x120b, 0x0012, 0x104b, 0x001b, 0x1204, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, + 0x0000, 0x1b2a, 0x000b, 0x81ed, 0x0010, 0x20b0, 0x0010, 0x21b1, + 0x0010, 0x22b2, 0x0010, 0x23b3, 0x0010, 0x24b4, 0x0010, 0x25b5, + 0x0010, 0x28b8, 0x0010, 0x29b9, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0007, 0x0015, 0x0033, 0x0010, 0xb032, 0x001b, 0x81fb, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, + 0x0010, 0xb812, 0x001b, 0x8201, 0x0005, 0x0015, 0x0010, 0x0000, + 0x0013, 0x0035, 0x0000, 0x1efe, 0x0013, 0x6219, 0x0014, 0x024b, + 0x0000, 0x1efe, 0x000c, 0x624b, 0x0013, 0x0204, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb009, + 0x001b, 0x8210, 0x0002, 0xb02f, 0x0000, 0xffb0, 0x0005, 0x0031, + 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x8217, + 0x0003, 0x01e8, 0x0015, 0x00b8, 0x0010, 0x0005, 0x0014, 0x07ed, + 0x0000, 0x13b8, 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x07ed, + 0x0013, 0x0204, 0x0005, 0x0015, 0x0000, 0x0001, 0x0012, 0xba42, + 0x0013, 0x122e, 0x0003, 0xb225, 0x0010, 0x2bff, 0x0012, 0xff4f, + 0x001b, 0x11cd, 0x0002, 0xba43, 0x001b, 0x120b, 0x0000, 0x1efe, + 0x000c, 0x624b, 0x0013, 0x0204, 0x0010, 0x28b8, 0x0010, 0x29b9, + 0x0004, 0x02bc, 0x0002, 0x3a42, 0x001b, 0x1204, 0x0000, 0x1c30, + 0x0015, 0x00ff, 0x0000, 0x0002, 0x0002, 0x1f43, 0x001b, 0x123b, + 0x0001, 0xff88, 0x0000, 0x0002, 0x0013, 0x023d, 0x0001, 0xff88, + 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, + 0x001b, 0x8240, 0x0000, 0xb0ff, 0x0011, 0x16a0, 0x0000, 0xff16, + 0x000b, 0x24e2, 0x0002, 0xb100, 0x0003, 0x0248, 0x0010, 0xb1ff, + 0x0001, 0x17a0, 0x0010, 0xff17, 0x0013, 0x020b, 0x0000, 0x16ff, + 0x0001, 0x18a0, 0x0010, 0xff00, 0x001b, 0x2252, 0x0002, 0x1700, + 0x0013, 0x12a5, 0x0003, 0x0253, 0x0010, 0x17ff, 0x0011, 0x19a0, + 0x0013, 0x22a5, 0x0011, 0x00d0, 0x0013, 0x12a5, 0x0000, 0x1c30, + 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, 0x001b, 0x825b, + 0x0013, 0xb25c, 0x0000, 0xb120, 0x0010, 0xb221, 0x0002, 0x1f43, + 0x001b, 0x1268, 0x0010, 0xc022, 0x0000, 0xc023, 0x0000, 0xb324, + 0x0000, 0xb425, 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0003, 0x026c, + 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0010, 0xb625, + 0x0013, 0xb26c, 0x0005, 0x002a, 0x0000, 0x0001, 0x0012, 0x1500, + 0x0000, 0xff15, 0x0000, 0x16ff, 0x0001, 0xb580, 0x0000, 0xff16, + 0x000b, 0x2277, 0x0002, 0x1700, 0x0003, 0x0278, 0x0010, 0x17ff, + 0x0001, 0xb680, 0x0010, 0xff17, 0x0012, 0x1e10, 0x0010, 0xff1e, + 0x0003, 0x62a5, 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0010, 0xc030, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8283, + 0x0010, 0xb0fe, 0x000b, 0x62a4, 0x0000, 0x1c30, 0x0005, 0x0031, + 0x0000, 0x0001, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x828b, + 0x0010, 0xb0fe, 0x000b, 0x6291, 0x0005, 0x00ce, 0x0010, 0x0005, + 0x0003, 0x07b1, 0x0010, 0xb01c, 0x0000, 0x1c30, 0x0005, 0x0031, + 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8297, + 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0000, 0xff1f, 0x0010, 0xc030, + 0x0011, 0xbe80, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x82a0, 0x0000, 0xb01d, 0x0010, 0x1dff, 0x0013, 0x027f, + 0x0000, 0xb01b, 0x0017, 0x4000, 0x0002, 0x3a41, 0x0003, 0x12ae, + 0x0003, 0xb2a8, 0x0005, 0x002a, 0x0000, 0x0004, 0x0005, 0x0015, + 0x0010, 0x0000, 0x0013, 0x0204, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, 0x001b, 0x82b3, + 0x0015, 0x00b8, 0x0000, 0x0004, 0x0014, 0x07ed, 0x0000, 0x13b8, + 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x07ed, 0x0013, 0x0039, + 0x0002, 0x1e00, 0x0010, 0xff1e, 0x0012, 0x1d10, 0x0010, 0xff1d, + 0x0010, 0xc030, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x001b, 0x82c4, 0x0010, 0xb0fe, 0x000b, 0x62e9, 0x0000, 0x1cff, + 0x0001, 0x1ae0, 0x0003, 0x12d3, 0x0000, 0x1c30, 0x0005, 0x0031, + 0x0010, 0x0000, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82cf, + 0x0010, 0xb0fe, 0x000b, 0x62d3, 0x0000, 0x1aff, 0x0000, 0xff1c, + 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, + 0x0000, 0xb009, 0x001b, 0x82d9, 0x0001, 0xb0c8, 0x0010, 0x000f, + 0x0000, 0xff1f, 0x0001, 0xbf80, 0x0010, 0xff1d, 0x0010, 0xc030, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82e3, + 0x0010, 0xb0fe, 0x000b, 0x62e9, 0x0005, 0x00ce, 0x0010, 0x0006, + 0x0003, 0x07b1, 0x0000, 0xb01b, 0x0017, 0x4000, 0x0010, 0x79b0, + 0x0000, 0xd0ff, 0x0012, 0xff40, 0x001b, 0x1039, 0x0015, 0x00d1, + 0x0010, 0x0101, 0x0013, 0x92f1, 0x0005, 0x0079, 0x0000, 0x0002, + 0x0013, 0x92f4, 0x0015, 0x00d1, 0x0000, 0x0100, 0x0010, 0x13fe, + 0x0003, 0x6329, 0x0012, 0xb04e, 0x000b, 0x133e, 0x0012, 0x784a, + 0x0003, 0x1344, 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0010, 0x1800, + 0x001b, 0x1344, 0x0001, 0x0fe8, 0x0000, 0x0001, 0x000b, 0x130d, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x8f0a, 0x000b, 0x830b, + 0x0003, 0x034a, 0x0001, 0x0fe8, 0x0000, 0x0002, 0x001b, 0x1318, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0005, 0x0031, 0x0000, 0x001a, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x8316, 0x0003, 0x034a, + 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0013, 0x131f, 0x0005, 0x00ce, + 0x0000, 0x0007, 0x0010, 0x0fcf, 0x0013, 0x07ab, 0x0000, 0x13b8, + 0x0002, 0x1045, 0x0003, 0x1327, 0x0012, 0x103f, 0x0002, 0xff27, + 0x0004, 0x0366, 0x0014, 0x07ed, 0x0003, 0x0329, 0x0012, 0x103f, + 0x0004, 0x0366, 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, + 0x0013, 0x1332, 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, + 0x0000, 0x0008, 0x0014, 0x07ed, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xbd88, 0x0010, 0x000c, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xc00a, 0x001b, 0x8339, 0x0010, 0xc014, 0x0000, 0xc013, + 0x0000, 0xc010, 0x0013, 0x0039, 0x0015, 0x00b8, 0x0010, 0x0003, + 0x0015, 0x003a, 0x0010, 0x0202, 0x0014, 0x07ed, 0x0003, 0x033d, + 0x0015, 0x00b8, 0x0000, 0x0002, 0x0015, 0x003a, 0x0010, 0x0202, + 0x0014, 0x07ed, 0x0003, 0x033d, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x1388, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x8351, 0x0011, 0x1388, 0x0010, 0x0003, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x8357, + 0x0010, 0xb0fe, 0x0013, 0x635c, 0x0000, 0xb012, 0x0003, 0x035e, + 0x0010, 0xc012, 0x0010, 0xc011, 0x0012, 0x104b, 0x0013, 0x131f, + 0x0002, 0x103b, 0x0010, 0xff03, 0x0005, 0x0002, 0x0010, 0x0000, + 0x0000, 0xc00d, 0x0003, 0x031f, 0x0000, 0xffb0, 0x0010, 0xc3b1, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xb888, 0x0010, 0x0011, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, 0x001b, 0x836f, + 0x0017, 0x4000, 0x0012, 0x3a43, 0x0013, 0x1380, 0x0015, 0x003a, + 0x0000, 0x0800, 0x0010, 0x0db0, 0x0003, 0x6380, 0x0000, 0x0bff, + 0x0001, 0xb0e0, 0x0003, 0x13a6, 0x0010, 0x09ff, 0x0001, 0xb0e0, + 0x0013, 0x138a, 0x0010, 0x05ff, 0x0001, 0xb0e0, 0x0003, 0x1384, + 0x0000, 0xc00e, 0x0000, 0x05fe, 0x0013, 0x6387, 0x0000, 0x050d, + 0x0005, 0x0002, 0x0000, 0x0004, 0x0003, 0x03a1, 0x0000, 0x09fe, + 0x0013, 0x63a3, 0x0000, 0x090d, 0x0005, 0x0002, 0x0000, 0x0001, + 0x0014, 0x0405, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, + 0x000b, 0x8394, 0x0011, 0x03c8, 0x0010, 0x000f, 0x0000, 0xffb6, + 0x0011, 0xb6e8, 0x0000, 0x0001, 0x0013, 0x1499, 0x0011, 0xb6e8, + 0x0000, 0x0002, 0x0013, 0x14bb, 0x0011, 0xb6e8, 0x0010, 0x0003, + 0x0003, 0x15a6, 0x0004, 0x07b6, 0x0013, 0x0404, 0x0010, 0x0bfe, + 0x0013, 0x6404, 0x0010, 0x0b0d, 0x0005, 0x0002, 0x0000, 0x0002, + 0x0014, 0x0405, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, + 0x000b, 0x83b0, 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x0021, + 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x83b6, 0x0001, 0xb0a8, + 0x0000, 0x199a, 0x0013, 0x23bc, 0x0005, 0x00b0, 0x0000, 0x1999, + 0x0012, 0xb050, 0x0000, 0xffb0, 0x0002, 0xff50, 0x0002, 0xff50, + 0x0001, 0xb080, 0x0000, 0xffb0, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0006, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb00a, 0x001b, 0x83c9, 0x0000, 0xb930, 0x0005, 0x0031, + 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x83cf, + 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0001, 0xffe8, 0x0010, 0x0048, + 0x000b, 0x1414, 0x0005, 0x0002, 0x0010, 0x0006, 0x0012, 0x0c10, + 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, + 0x000b, 0x83e0, 0x0000, 0xb10b, 0x000b, 0x63e4, 0x0010, 0xb10a, + 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x83e6, 0x0002, 0x032b, + 0x0010, 0xff03, 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0x030a, 0x001b, 0x83ee, 0x0000, 0x11fe, + 0x000b, 0x63f3, 0x0000, 0x0d12, 0x0013, 0x03fc, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, 0x0000, 0xff31, + 0x0010, 0x0db0, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x83fb, + 0x0000, 0x0d11, 0x0013, 0x0404, 0x0000, 0x05fe, 0x0013, 0x6404, + 0x0005, 0x0002, 0x0000, 0x0004, 0x0000, 0x050d, 0x0004, 0x07b6, + 0x0013, 0x0047, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0309, + 0x000b, 0x840c, 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb909, 0x000b, 0x8412, 0x0017, 0x4000, + 0x0005, 0x00b6, 0x0010, 0x0600, 0x0014, 0x05d6, 0x0004, 0x0483, + 0x0000, 0xb05a, 0x0000, 0xb15b, 0x0005, 0x0054, 0x0010, 0x0829, + 0x0010, 0x0d58, 0x0015, 0x0059, 0x0010, 0xffff, 0x0000, 0xb930, + 0x0005, 0x0031, 0x0010, 0x001e, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x8424, 0x0000, 0xb05c, 0x0005, 0x0031, 0x0000, 0x001f, + 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x842a, 0x0001, 0xb0c8, + 0x0010, 0x000f, 0x001b, 0x1431, 0x0015, 0x00ff, 0x0010, 0x0005, + 0x0003, 0x0439, 0x0002, 0xb040, 0x0013, 0x1436, 0x0015, 0x00ff, + 0x0000, 0x0004, 0x0003, 0x0439, 0x0001, 0xb0c8, 0x0010, 0x0006, + 0x0002, 0xff60, 0x0010, 0xffb2, 0x0011, 0x0d88, 0x0000, 0x0019, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, 0x000b, 0x843f, + 0x0012, 0xb170, 0x0011, 0xffc8, 0x0010, 0xff00, 0x0011, 0xb2d0, + 0x0010, 0xff60, 0x0002, 0xb045, 0x0003, 0x144a, 0x0015, 0x00b2, + 0x0000, 0x0002, 0x0013, 0x0454, 0x0002, 0xb046, 0x0003, 0x144f, + 0x0015, 0x00b2, 0x0000, 0x0001, 0x0013, 0x0454, 0x0015, 0x00b2, + 0x0010, 0x0000, 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0003, 0x045a, + 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, + 0x0000, 0xb011, 0x000b, 0x8459, 0x0010, 0xb16a, 0x0010, 0xb06b, + 0x0000, 0xb261, 0x0015, 0x0044, 0x0010, 0x0018, 0x0005, 0x0031, + 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0x6241, 0x000b, 0x8463, + 0x0013, 0x9464, 0x0015, 0x00a0, 0x0000, 0x0020, 0x0012, 0xd041, + 0x001b, 0x1467, 0x0015, 0x00d1, 0x0010, 0x0202, 0x0013, 0x946b, + 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, + 0x0010, 0x0009, 0x0003, 0x9471, 0x0000, 0xff75, 0x0013, 0x9473, + 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x00b1, + 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, 0x0015, 0x0033, + 0x0000, 0xb012, 0x000b, 0x8481, 0x0013, 0x0404, 0x0000, 0xba30, + 0x0005, 0x0031, 0x0000, 0x0031, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x8488, 0x0002, 0xb040, 0x0013, 0x1496, 0x0000, 0xb7b0, + 0x0000, 0xb9b1, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0000, 0x0013, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, + 0x001b, 0x8494, 0x0013, 0x0498, 0x0010, 0xc0b1, 0x0000, 0xc0b0, + 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0500, 0x0014, 0x05d6, + 0x0005, 0x0054, 0x0010, 0x0889, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x84a5, 0x0010, 0xb058, 0x0000, 0x0d59, + 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, + 0x0000, 0xb011, 0x001b, 0x84ad, 0x0010, 0xb15c, 0x0010, 0xb05d, + 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, 0x0000, 0xb011, + 0x000b, 0x84b4, 0x0000, 0xb15e, 0x0000, 0xb05f, 0x0003, 0x94b7, + 0x0015, 0x00a0, 0x0010, 0x000c, 0x0013, 0x05bb, 0x0005, 0x00b6, + 0x0000, 0x0700, 0x0014, 0x05d6, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb709, 0x000b, 0x84c5, 0x0012, 0xb749, 0x0003, 0x14cb, + 0x0005, 0x0054, 0x0010, 0x0889, 0x0013, 0x04cd, 0x0005, 0x0054, + 0x0010, 0x0898, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x84d4, 0x0010, 0xb058, 0x0000, 0x0d59, 0x0001, 0xb9a8, + 0x0010, 0x00f0, 0x000b, 0x24f9, 0x0011, 0x0d88, 0x0010, 0x0005, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x84df, + 0x0001, 0xb0c8, 0x0000, 0xf700, 0x0000, 0xffb0, 0x0011, 0xb0e8, + 0x0000, 0xf100, 0x0013, 0x1540, 0x0011, 0xb0e8, 0x0000, 0xf200, + 0x0013, 0x1545, 0x0011, 0xb0e8, 0x0010, 0xf300, 0x0013, 0x1568, + 0x0011, 0xb0e8, 0x0000, 0xf400, 0x0013, 0x156d, 0x0011, 0xb0e8, + 0x0010, 0xf500, 0x0013, 0x1540, 0x0011, 0xb0e8, 0x0010, 0xf600, + 0x0003, 0x157e, 0x0005, 0x00ce, 0x0010, 0x0009, 0x0000, 0xb0cf, + 0x0013, 0x07ab, 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0025, + 0x0015, 0x0033, 0x0000, 0xb039, 0x001b, 0x84fe, 0x0012, 0xb749, + 0x0003, 0x1503, 0x0002, 0xb52c, 0x0000, 0xffb5, 0x0000, 0xb162, + 0x0000, 0xb063, 0x0005, 0x0031, 0x0000, 0x001f, 0x0015, 0x0033, + 0x0000, 0xb309, 0x001b, 0x8509, 0x0001, 0xb3c8, 0x0010, 0x0003, + 0x0003, 0x1511, 0x0010, 0xffb2, 0x0001, 0xffe8, 0x0010, 0x0003, + 0x000b, 0x1513, 0x0000, 0xc2b7, 0x0013, 0x059a, 0x0001, 0xb2e8, + 0x0000, 0x0001, 0x0013, 0x151a, 0x0005, 0x00ce, 0x0010, 0x000a, + 0x0010, 0xb2cf, 0x0013, 0x07ab, 0x0010, 0xb465, 0x0010, 0xb667, + 0x0015, 0x00b7, 0x0010, 0x0018, 0x0001, 0xb5c8, 0x0010, 0x0300, + 0x0003, 0x153f, 0x0012, 0xb548, 0x0013, 0x1526, 0x0000, 0xb6ff, + 0x0011, 0xb780, 0x0010, 0xffb7, 0x0002, 0xb549, 0x0003, 0x152b, + 0x0010, 0xb4ff, 0x0011, 0xb780, 0x0010, 0xffb7, 0x0015, 0x0044, + 0x0010, 0x0018, 0x0005, 0x0031, 0x0000, 0x002c, 0x0015, 0x0033, + 0x0000, 0x6841, 0x000b, 0x8531, 0x0015, 0x0044, 0x0000, 0x0019, + 0x0005, 0x0031, 0x0000, 0x0034, 0x0015, 0x0033, 0x0000, 0x5029, + 0x000b, 0x8538, 0x0015, 0x0044, 0x0000, 0x0008, 0x0011, 0xb7c8, + 0x0010, 0x0003, 0x0003, 0x153f, 0x0010, 0xff55, 0x0013, 0x059a, + 0x0005, 0x00b5, 0x0000, 0x0008, 0x0015, 0x00b7, 0x0010, 0x0018, + 0x0013, 0x059a, 0x0011, 0x0d88, 0x0000, 0x000b, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x854a, 0x0010, 0xb1ff, + 0x0001, 0xb0d0, 0x0003, 0x1553, 0x0005, 0x00b5, 0x0010, 0x0b02, + 0x0010, 0xb062, 0x0010, 0xb163, 0x0013, 0x0555, 0x0005, 0x00b5, + 0x0000, 0x0302, 0x0015, 0x0065, 0x0010, 0x0012, 0x0005, 0x0067, + 0x0000, 0x0008, 0x0015, 0x006c, 0x0000, 0x7000, 0x0005, 0x006d, + 0x0010, 0x0500, 0x0015, 0x006f, 0x0010, 0x000a, 0x0015, 0x0044, + 0x0000, 0x0001, 0x0005, 0x0052, 0x0000, 0x2500, 0x0015, 0x0044, + 0x0000, 0x0008, 0x0015, 0x00b7, 0x0000, 0x0032, 0x0013, 0x059a, + 0x0005, 0x00b5, 0x0010, 0x0028, 0x0015, 0x00b7, 0x0010, 0x0018, + 0x0013, 0x059a, 0x0005, 0x00b5, 0x0000, 0x0100, 0x0005, 0x0067, + 0x0000, 0x0008, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, + 0x0010, 0x0018, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x001b, 0x8578, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0015, 0x00b7, + 0x0000, 0x0020, 0x0013, 0x059a, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb609, 0x000b, 0x8585, 0x0001, 0xb6c8, 0x0010, 0xff00, + 0x0000, 0xffb0, 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x858b, + 0x0001, 0xb6c8, 0x0010, 0x00ff, 0x0012, 0xff10, 0x000b, 0x1594, + 0x0000, 0xffb5, 0x0015, 0x00b7, 0x0010, 0x0018, 0x0013, 0x059a, + 0x0010, 0xff63, 0x0005, 0x00b5, 0x0000, 0x0800, 0x0015, 0x00b7, + 0x0010, 0x0018, 0x0013, 0x059a, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x85a1, 0x0010, 0xb561, 0x0013, 0x95a3, + 0x0010, 0xb7a0, 0x0013, 0x05bb, 0x0005, 0x00b6, 0x0010, 0x0300, + 0x0014, 0x05d6, 0x0005, 0x0054, 0x0010, 0x0819, 0x0010, 0x0d58, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x85b3, + 0x0000, 0xb059, 0x0003, 0x95b5, 0x0010, 0xc0a0, 0x0010, 0x71ff, + 0x0002, 0xff28, 0x0010, 0xff71, 0x0013, 0x05bb, 0x0012, 0xd041, + 0x001b, 0x15bb, 0x0015, 0x00d1, 0x0010, 0x0202, 0x0000, 0x75ff, + 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, 0x0010, 0x0009, + 0x0003, 0x95c4, 0x0000, 0xff75, 0x0013, 0x95c6, 0x0015, 0x00d1, + 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, + 0x0000, 0x0008, 0x0000, 0xff31, 0x0005, 0x00b0, 0x0010, 0x0009, + 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0015, 0x0033, 0x0000, 0xb012, + 0x001b, 0x85d4, 0x0013, 0x0404, 0x0015, 0x0044, 0x0000, 0x0008, + 0x0005, 0x0098, 0x0010, 0x0056, 0x0015, 0x0099, 0x0000, 0x9575, + 0x0014, 0x0772, 0x0000, 0xb096, 0x0012, 0xb270, 0x0010, 0xff56, + 0x0004, 0x0794, 0x0010, 0xb052, 0x0010, 0xb153, 0x0000, 0xb6ff, + 0x0011, 0xb2d0, 0x0010, 0xff50, 0x0010, 0xb351, 0x0017, 0x4000, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1288, 0x0010, 0x0011, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1009, 0x000b, 0x85ef, + 0x0015, 0x000f, 0x0000, 0x0001, 0x0010, 0xc014, 0x0000, 0x1213, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0004, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, 0x000b, 0x85fb, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0005, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1a09, 0x001b, 0x8603, + 0x0012, 0x104b, 0x001b, 0x160c, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x000b, 0x0015, 0x0033, 0x0000, 0x1621, 0x000b, 0x860b, + 0x0010, 0x15fe, 0x001b, 0x6615, 0x0004, 0x0633, 0x0002, 0x3a42, + 0x000b, 0x1632, 0x0001, 0x10c8, 0x0010, 0x000f, 0x001b, 0x1695, + 0x0003, 0x0631, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, + 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, + 0x000b, 0x861c, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x861f, + 0x0010, 0xb0fe, 0x0013, 0x6624, 0x0000, 0xb012, 0x0003, 0x0626, + 0x0010, 0xc012, 0x0010, 0xc011, 0x0015, 0x000f, 0x0010, 0x0000, + 0x0002, 0x3944, 0x0013, 0x162f, 0x0015, 0x0039, 0x0000, 0x5040, + 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x07ed, 0x0000, 0xc013, + 0x0003, 0x0632, 0x0004, 0x07d9, 0x0003, 0x0051, 0x0003, 0xb633, + 0x0005, 0x002a, 0x0000, 0x0004, 0x0000, 0xba30, 0x0005, 0x0031, + 0x0010, 0x001b, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x863b, + 0x0000, 0xc02c, 0x0000, 0xb02d, 0x0012, 0x104b, 0x0003, 0x1656, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, + 0x0000, 0xb129, 0x000b, 0x8645, 0x0000, 0xb120, 0x0010, 0xb221, + 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0000, 0xc025, + 0x0010, 0xb526, 0x0010, 0xc027, 0x0010, 0xb516, 0x0010, 0xc017, + 0x0000, 0xb518, 0x0000, 0xc019, 0x0010, 0xc028, 0x0000, 0xc029, + 0x0010, 0xc01e, 0x0003, 0x068c, 0x0012, 0x1044, 0x0013, 0x1686, + 0x0002, 0x1034, 0x0000, 0xff10, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b29, 0x001b, 0x865f, + 0x0000, 0x1c30, 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, + 0x000b, 0x8664, 0x0002, 0x1f43, 0x000b, 0x166b, 0x0010, 0xb3b5, + 0x0000, 0xb4b6, 0x0000, 0xc0b3, 0x0010, 0xc0b4, 0x0000, 0xb120, + 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, + 0x0010, 0xb625, 0x0010, 0xb516, 0x0000, 0xb617, 0x0000, 0x1826, + 0x0000, 0x1927, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, + 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x867a, 0x0000, 0xb028, + 0x0000, 0xb129, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0003, 0x668c, + 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0004, 0x027f, 0x0002, 0x3a42, + 0x0013, 0x168c, 0x0003, 0x0694, 0x0000, 0x1a30, 0x0005, 0x0031, + 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b79, 0x001b, 0x868b, + 0x0013, 0xb68c, 0x0005, 0x002a, 0x0000, 0x0001, 0x0005, 0x0015, + 0x0000, 0x0001, 0x0000, 0x1efe, 0x0003, 0x6694, 0x0003, 0x024b, + 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x001b, + 0x0015, 0x0033, 0x0010, 0xb051, 0x001b, 0x869a, 0x0000, 0xb0a3, + 0x0010, 0xb697, 0x0010, 0xb946, 0x0015, 0x00a5, 0x0000, 0x0010, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0002, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb509, 0x000b, 0x86a7, + 0x0004, 0x0794, 0x0004, 0x0783, 0x0012, 0xb470, 0x0010, 0xffb4, + 0x0010, 0xb48e, 0x0010, 0xb08a, 0x0010, 0xb18b, 0x0012, 0x104d, + 0x0003, 0x16b2, 0x0003, 0x06df, 0x0012, 0x104b, 0x0003, 0x16c5, + 0x0005, 0x008c, 0x0010, 0x0829, 0x0010, 0xc08d, 0x0001, 0xb2d8, + 0x0010, 0x0600, 0x0010, 0xff88, 0x0010, 0xb389, 0x0000, 0x1390, + 0x0010, 0xb591, 0x0000, 0xc08f, 0x0010, 0x1ab9, 0x0004, 0x0483, + 0x0013, 0x96c0, 0x0010, 0xb092, 0x0010, 0xb193, 0x0013, 0x96c3, + 0x0003, 0x06da, 0x0005, 0x008c, 0x0000, 0x0809, 0x0015, 0x008d, + 0x0000, 0x0008, 0x0001, 0xb2d8, 0x0000, 0x0100, 0x0010, 0xff88, + 0x0010, 0xb389, 0x0000, 0x1390, 0x0010, 0xb591, 0x0000, 0xc08f, + 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, + 0x0000, 0xb011, 0x000b, 0x86d5, 0x0003, 0x96d6, 0x0000, 0xb192, + 0x0000, 0xb093, 0x0003, 0x96d9, 0x0010, 0x19a1, 0x0000, 0x18a2, + 0x0015, 0x00b1, 0x0010, 0x0096, 0x0003, 0x074e, 0x0000, 0xb590, + 0x0010, 0x1391, 0x0001, 0x10c8, 0x0010, 0x000f, 0x0001, 0xffe8, + 0x0010, 0x0005, 0x0013, 0x1706, 0x0001, 0xb2d8, 0x0000, 0x0700, + 0x0010, 0xff88, 0x0010, 0xb389, 0x0015, 0x0030, 0x0000, 0x0400, + 0x0011, 0x1388, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0000, 0xb009, 0x000b, 0x86f1, 0x0002, 0xb049, 0x0003, 0x16f9, + 0x0005, 0x008c, 0x0010, 0x0889, 0x0015, 0x00b1, 0x0010, 0x0096, + 0x0003, 0x06fd, 0x0005, 0x008c, 0x0010, 0x0898, 0x0015, 0x00b1, + 0x0000, 0x0092, 0x0010, 0xc08d, 0x0000, 0xc08f, 0x0013, 0x96ff, + 0x0000, 0xc092, 0x0010, 0xc093, 0x0013, 0x9702, 0x0010, 0x19a1, + 0x0000, 0x18a2, 0x0003, 0x074e, 0x0001, 0xb2d8, 0x0000, 0x0100, + 0x0010, 0xff88, 0x0010, 0xb389, 0x0005, 0x008c, 0x0010, 0x0880, + 0x0015, 0x008d, 0x0000, 0x0008, 0x0011, 0x1388, 0x0000, 0x000e, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8713, + 0x0010, 0xb08f, 0x0000, 0xb590, 0x0010, 0x1391, 0x0000, 0x1a30, + 0x0005, 0x0031, 0x0000, 0x000d, 0x0015, 0x0033, 0x0000, 0xb021, + 0x001b, 0x871c, 0x0003, 0x971d, 0x0010, 0xb392, 0x0010, 0xb293, + 0x0013, 0x9720, 0x0000, 0xb1a1, 0x0010, 0xb0a2, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x872a, 0x0000, 0xb3ff, + 0x0001, 0xb080, 0x0000, 0xffb3, 0x001b, 0x2731, 0x0002, 0xb200, + 0x0013, 0x0732, 0x0010, 0xb2ff, 0x0011, 0xb180, 0x0010, 0xffb2, + 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb212, 0x000b, 0x8739, 0x0015, 0x00b1, 0x0000, 0x0092, + 0x0002, 0x104c, 0x0003, 0x174c, 0x0011, 0xc2e8, 0x0010, 0x000c, + 0x000b, 0x1744, 0x0015, 0x00ff, 0x0000, 0x0800, 0x0013, 0x074c, + 0x0011, 0xc2e8, 0x0000, 0x0020, 0x001b, 0x174a, 0x0015, 0x00ff, + 0x0010, 0x1800, 0x0013, 0x074c, 0x0015, 0x00ff, 0x0000, 0x1000, + 0x0011, 0xb1d0, 0x0010, 0xffb1, 0x0015, 0x009a, 0x0010, 0x0036, + 0x0005, 0x009b, 0x0000, 0x95d5, 0x0012, 0xd041, 0x001b, 0x1752, + 0x0015, 0x00d1, 0x0010, 0x0202, 0x0003, 0x9756, 0x0012, 0x104e, + 0x0003, 0x175b, 0x0012, 0xb12f, 0x0010, 0xffb1, 0x0000, 0xb175, + 0x0003, 0x975c, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0001, 0x19c8, + 0x0010, 0xfff0, 0x000b, 0x1765, 0x0015, 0x00b1, 0x0010, 0x07d0, + 0x0013, 0x0767, 0x0015, 0x00b1, 0x0000, 0x1b58, 0x0005, 0x00b0, + 0x0010, 0x0009, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, + 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, + 0x001b, 0x8770, 0x0003, 0x0632, 0x0000, 0xba30, 0x0005, 0x0031, + 0x0010, 0x0021, 0x0015, 0x0033, 0x0010, 0xb019, 0x000b, 0x8777, + 0x0002, 0xb200, 0x0011, 0xffc8, 0x0010, 0x00ff, 0x0010, 0xffb2, + 0x0010, 0xb2b7, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, + 0x0010, 0xb20a, 0x000b, 0x8781, 0x0017, 0x4000, 0x0000, 0xba30, + 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb409, + 0x000b, 0x8788, 0x0002, 0xb400, 0x0011, 0xffc8, 0x0010, 0x00ff, + 0x0010, 0xffb4, 0x0010, 0xb4b7, 0x0005, 0x0031, 0x0000, 0x0023, + 0x0015, 0x0033, 0x0010, 0xb40a, 0x001b, 0x8792, 0x0017, 0x4000, + 0x0000, 0xba30, 0x0001, 0xc7c8, 0x0000, 0x0020, 0x000b, 0x17a0, + 0x0005, 0x0031, 0x0010, 0x0028, 0x0015, 0x0033, 0x0010, 0xb209, + 0x000b, 0x879c, 0x0011, 0xb2c8, 0x0000, 0xff80, 0x0013, 0x17a3, + 0x0010, 0xc4b0, 0x0010, 0xc5b1, 0x0003, 0x07a5, 0x0010, 0xc6b1, + 0x0000, 0xc0b0, 0x0005, 0x0031, 0x0000, 0x0004, 0x0015, 0x0033, + 0x0010, 0xb211, 0x000b, 0x87a9, 0x0017, 0x4000, 0x0015, 0x00b8, + 0x0010, 0x0009, 0x0015, 0x003a, 0x0010, 0x0707, 0x0014, 0x07ed, + 0x0013, 0x002d, 0x0015, 0x00b8, 0x0010, 0x0009, 0x0015, 0x003a, + 0x0010, 0x0707, 0x0003, 0x07ed, 0x0004, 0x0110, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0000, 0xba09, 0x000b, 0x87be, 0x0014, 0x0772, + 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0010, + 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x87c7, + 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0x0309, 0x001b, 0x87cd, 0x0002, 0x0327, 0x0010, 0xffb2, + 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, + 0x0010, 0xb20a, 0x001b, 0x87d5, 0x0015, 0x00b8, 0x0010, 0x0006, + 0x0003, 0x07ed, 0x0014, 0x0122, 0x0014, 0x0772, 0x0015, 0x0030, + 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0010, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x87e2, 0x0012, 0x1027, + 0x0010, 0xffb2, 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, + 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x87ea, 0x0015, 0x00b8, + 0x0000, 0x0007, 0x0013, 0x47ed, 0x0000, 0xb838, 0x0017, 0x4000, + 0xa85a, 0x97da +}; +unsigned short xseqflx_code_length01 = 0x0fe2; diff -Nru a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c --- a/drivers/scsi/qla2xxx/qla_dbg.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/qla2xxx/qla_dbg.c Tue Feb 17 20:00:08 2004 @@ -62,7 +62,7 @@ ha->fw_dump_order); if (ha->fw_dump == NULL) { qla_printk(KERN_WARNING, ha, - "Unable to allocated memory for firmware dump (%d/%d).\n", + "Unable to allocated memory for firmware dump (%d/%Zd).\n", ha->fw_dump_order, sizeof(struct qla2300_fw_dump)); return; } @@ -73,7 +73,7 @@ /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); - if (!IS_QLA2312(ha) && !IS_QLA2322(ha)) { + if (IS_QLA2300(ha)) { for (cnt = 30000; (RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) == 0 && rval == QLA_SUCCESS; cnt--) { @@ -180,7 +180,7 @@ } } - if (IS_QLA2312(ha) || IS_QLA2322(ha)) { + if (!IS_QLA2300(ha)) { for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 && rval == QLA_SUCCESS; cnt--) { if (cnt) @@ -598,7 +598,7 @@ ha->fw_dump_order); if (ha->fw_dump == NULL) { qla_printk(KERN_WARNING, ha, - "Unable to allocated memory for firmware dump (%d/%d).\n", + "Unable to allocated memory for firmware dump (%d/%Zd).\n", ha->fw_dump_order, sizeof(struct qla2100_fw_dump)); return; } @@ -1070,18 +1070,6 @@ sp->lun_queue->fclun->fcport->cur_path); } -/* - * qla2x00_print_q_info - * Prints queue info - * Input - * q: lun queue - */ -void -qla2x00_print_q_info(struct os_lun *q) -{ - printk("Queue info: flags=0x%lx\n", q->q_flag); -} - #if defined(QL_DEBUG_ROUTINES) /* * qla2x00_formatted_dump_buffer @@ -1163,67 +1151,4 @@ break; } } - #endif - - -#if STOP_ON_ERROR -/************************************************************************** -* qla2x00_panic -* -**************************************************************************/ -static void -qla2x00_panic(char *cp, struct Scsi_Host *host) -{ - struct scsi_qla_host *ha; - long *fp; - - ha = (struct scsi_qla_host *) host->hostdata; - DEBUG2(ql2x_debug_print = 1;); - printk("qla2100 - PANIC: %s\n", cp); - printk("Current time=0x%lx\n", jiffies); - printk("Number of pending commands =0x%lx\n", ha->actthreads); - printk("Number of queued commands =0x%lx\n", ha->qthreads); - printk("Number of free entries = (%d)\n", ha->req_q_cnt); - printk("Request Queue @ 0x%lx, Response Queue @ 0x%lx\n", - ha->request_dma, ha->response_dma); - printk("Request In Ptr %d\n", ha->req_ring_index); - fp = (long *) &ha->flags; - printk("HA flags =0x%lx\n", *fp); - qla2x00_dump_requests(ha); - qla2x00_dump_regs(ha); - cli(); - for (;;) { - udelay(2); - barrier(); - /* cpu_relax();*/ - } - sti(); -} - -#endif - -/************************************************************************** -* qla2x00_dump_requests -* -**************************************************************************/ -void -qla2x00_dump_requests(scsi_qla_host_t *ha) -{ - - struct scsi_cmnd *cp; - srb_t *sp; - int i; - - printk("Outstanding Commands on controller:\n"); - - for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { - if ((sp = ha->outstanding_cmds[i]) == NULL) - continue; - if ((cp = sp->cmd) == NULL) - continue; - - printk("(%d): Pid=%ld, sp flags=0x%x, cmd=0x%p\n", - i, sp->cmd->serial_number, sp->flags, CMD_SP(sp->cmd)); - } -} diff -Nru a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h --- a/drivers/scsi/qla2xxx/qla_dbg.h Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/qla2xxx/qla_dbg.h Tue Feb 17 20:00:08 2004 @@ -18,55 +18,6 @@ ******************************************************************************/ /* - * Firmware Dump structure definition - */ -#define FW_DUMP_SIZE 0xBC000 /* bytes */ - -struct qla2300_fw_dump { - uint16_t hccr; - uint16_t pbiu_reg[8]; - uint16_t risc_host_reg[8]; - uint16_t mailbox_reg[32]; - uint16_t resp_dma_reg[32]; - uint16_t dma_reg[48]; - uint16_t risc_hdw_reg[16]; - uint16_t risc_gp0_reg[16]; - uint16_t risc_gp1_reg[16]; - uint16_t risc_gp2_reg[16]; - uint16_t risc_gp3_reg[16]; - uint16_t risc_gp4_reg[16]; - uint16_t risc_gp5_reg[16]; - uint16_t risc_gp6_reg[16]; - uint16_t risc_gp7_reg[16]; - uint16_t frame_buf_hdw_reg[64]; - uint16_t fpm_b0_reg[64]; - uint16_t fpm_b1_reg[64]; - uint16_t risc_ram[0xf800]; - uint16_t stack_ram[0x1000]; - uint16_t data_ram[0xF000]; -}; - -struct qla2100_fw_dump { - uint16_t hccr; - uint16_t pbiu_reg[8]; - uint16_t mailbox_reg[32]; - uint16_t dma_reg[48]; - uint16_t risc_hdw_reg[16]; - uint16_t risc_gp0_reg[16]; - uint16_t risc_gp1_reg[16]; - uint16_t risc_gp2_reg[16]; - uint16_t risc_gp3_reg[16]; - uint16_t risc_gp4_reg[16]; - uint16_t risc_gp5_reg[16]; - uint16_t risc_gp6_reg[16]; - uint16_t risc_gp7_reg[16]; - uint16_t frame_buf_hdw_reg[16]; - uint16_t fpm_b0_reg[64]; - uint16_t fpm_b1_reg[64]; - uint16_t risc_ram[0xf000]; -}; - -/* * Driver debug definitions. */ /* #define QL_DEBUG_LEVEL_1 */ /* Output register accesses to COM1 */ @@ -227,3 +178,54 @@ #else #define DEBUG14(x) do {} while (0) #endif + +/* + * Firmware Dump structure definition + */ +#define FW_DUMP_SIZE 0xBC000 /* bytes */ + +struct qla2300_fw_dump { + uint16_t hccr; + uint16_t pbiu_reg[8]; + uint16_t risc_host_reg[8]; + uint16_t mailbox_reg[32]; + uint16_t resp_dma_reg[32]; + uint16_t dma_reg[48]; + uint16_t risc_hdw_reg[16]; + uint16_t risc_gp0_reg[16]; + uint16_t risc_gp1_reg[16]; + uint16_t risc_gp2_reg[16]; + uint16_t risc_gp3_reg[16]; + uint16_t risc_gp4_reg[16]; + uint16_t risc_gp5_reg[16]; + uint16_t risc_gp6_reg[16]; + uint16_t risc_gp7_reg[16]; + uint16_t frame_buf_hdw_reg[64]; + uint16_t fpm_b0_reg[64]; + uint16_t fpm_b1_reg[64]; + uint16_t risc_ram[0xf800]; + uint16_t stack_ram[0x1000]; + uint16_t data_ram[0xF000]; +}; + +struct qla2100_fw_dump { + uint16_t hccr; + uint16_t pbiu_reg[8]; + uint16_t mailbox_reg[32]; + uint16_t dma_reg[48]; + uint16_t risc_hdw_reg[16]; + uint16_t risc_gp0_reg[16]; + uint16_t risc_gp1_reg[16]; + uint16_t risc_gp2_reg[16]; + uint16_t risc_gp3_reg[16]; + uint16_t risc_gp4_reg[16]; + uint16_t risc_gp5_reg[16]; + uint16_t risc_gp6_reg[16]; + uint16_t risc_gp7_reg[16]; + uint16_t frame_buf_hdw_reg[16]; + uint16_t fpm_b0_reg[64]; + uint16_t fpm_b1_reg[64]; + uint16_t risc_ram[0xf000]; +}; + + diff -Nru a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h --- a/drivers/scsi/qla2xxx/qla_def.h Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/qla2xxx/qla_def.h Tue Feb 17 20:00:07 2004 @@ -33,6 +33,14 @@ #define PCI_DEVICE_ID_QLOGIC_ISP2322 0x2322 #endif +#ifndef PCI_DEVICE_ID_QLOGIC_ISP6312 +#define PCI_DEVICE_ID_QLOGIC_ISP6312 0x6312 +#endif + +#ifndef PCI_DEVICE_ID_QLOGIC_ISP6322 +#define PCI_DEVICE_ID_QLOGIC_ISP6322 0x6322 +#endif + #if defined(CONFIG_SCSI_QLA21XX) || defined(CONFIG_SCSI_QLA21XX_MODULE) #define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100) #else @@ -45,22 +53,39 @@ #define IS_QLA2200(ha) 0 #endif -#if defined(CONFIG_SCSI_QLA23XX) || defined(CONFIG_SCSI_QLA23XX_MODULE) +#if defined(CONFIG_SCSI_QLA2300) || defined(CONFIG_SCSI_QLA2300_MODULE) #define IS_QLA2300(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2300) #define IS_QLA2312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2312) -#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322) -#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha)) #else #define IS_QLA2300(ha) 0 #define IS_QLA2312(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA2322) || defined(CONFIG_SCSI_QLA2322_MODULE) +#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322) +#else #define IS_QLA2322(ha) 0 -#define IS_QLA23XX(ha) 0 #endif +#if defined(CONFIG_SCSI_QLA6312) || defined(CONFIG_SCSI_QLA6312_MODULE) +#define IS_QLA6312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6312) +#else +#define IS_QLA6312(ha) 0 +#endif + +#if defined(CONFIG_SCSI_QLA6322) || defined(CONFIG_SCSI_QLA6322_MODULE) +#define IS_QLA6322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6322) +#else +#define IS_QLA6322(ha) 0 +#endif + +#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ + IS_QLA6312(ha) || IS_QLA6322(ha)) + /* - * Only ISP23XX has extended addressing support in the firmware. + * Only non-ISP2[12]00 have extended addressing support in the firmware. */ -#define HAS_EXTENDED_IDS(ha) IS_QLA23XX(ha) +#define HAS_EXTENDED_IDS(ha) (!IS_QLA2100(ha) && !IS_QLA2200(ha)) /* * We have MAILBOX_REGISTER_COUNT sized arrays in a few places, @@ -126,21 +151,12 @@ * I/O register */ -#if MEMORY_MAPPED_IO #define RD_REG_BYTE(addr) readb(addr) #define RD_REG_WORD(addr) readw(addr) #define RD_REG_DWORD(addr) readl(addr) #define WRT_REG_BYTE(addr, data) writeb(data,addr) #define WRT_REG_WORD(addr, data) writew(data,addr) #define WRT_REG_DWORD(addr, data) writel(data,addr) -#else /* MEMORY_MAPPED_IO */ -#define RD_REG_BYTE(addr) (inb((unsigned long)addr)) -#define RD_REG_WORD(addr) (inw((unsigned long)addr)) -#define RD_REG_DWORD(addr) (inl((unsigned long)addr)) -#define WRT_REG_BYTE(addr, data) (outb(data,(unsigned long)addr)) -#define WRT_REG_WORD(addr, data) (outw(data,(unsigned long)addr)) -#define WRT_REG_DWORD(addr, data) (outl(data,(unsigned long)addr)) -#endif /* MEMORY_MAPPED_IO */ /* * Fibre Channel device definitions. @@ -433,42 +449,43 @@ } u_end; } device_reg_t; -#define ISP_REQ_Q_IN(ha, reg) \ - (IS_QLA23XX(ha) ? \ - &(reg)->u.isp2300.req_q_in : \ - &(reg)->u.isp2100.mailbox4) -#define ISP_REQ_Q_OUT(ha, reg) \ - (IS_QLA23XX(ha) ? \ - &(reg)->u.isp2300.req_q_out : \ - &(reg)->u.isp2100.mailbox4) -#define ISP_RSP_Q_IN(ha, reg) \ - (IS_QLA23XX(ha) ? \ - &(reg)->u.isp2300.rsp_q_in : \ - &(reg)->u.isp2100.mailbox5) -#define ISP_RSP_Q_OUT(ha, reg) \ - (IS_QLA23XX(ha) ? \ - &(reg)->u.isp2300.rsp_q_out : \ - &(reg)->u.isp2100.mailbox5) +#define ISP_REQ_Q_IN(ha, reg) \ + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + &(reg)->u.isp2100.mailbox4 : \ + &(reg)->u.isp2300.req_q_in) +#define ISP_REQ_Q_OUT(ha, reg) \ + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + &(reg)->u.isp2100.mailbox4 : \ + &(reg)->u.isp2300.req_q_out) +#define ISP_RSP_Q_IN(ha, reg) \ + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + &(reg)->u.isp2100.mailbox5 : \ + &(reg)->u.isp2300.rsp_q_in) +#define ISP_RSP_Q_OUT(ha, reg) \ + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + &(reg)->u.isp2100.mailbox5 : \ + &(reg)->u.isp2300.rsp_q_out) #define MAILBOX_REG(ha, reg, num) \ - (IS_QLA23XX(ha) ? \ - &(reg)->u.isp2300.mailbox0 + (num) : \ - ((num < 8) ? \ + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + (num < 8 ? \ &(reg)->u.isp2100.mailbox0 + (num) : \ - &(reg)->u_end.isp2200.mailbox8 + (num) - 8)) /* only for isp2200 */ + &(reg)->u_end.isp2200.mailbox8 + (num) - 8) : \ + &(reg)->u.isp2300.mailbox0 + (num)) #define RD_MAILBOX_REG(ha, reg, num) \ RD_REG_WORD(MAILBOX_REG(ha, reg, num)) #define WRT_MAILBOX_REG(ha, reg, num, data) \ WRT_REG_WORD(MAILBOX_REG(ha, reg, num), data) #define FB_CMD_REG(ha, reg) \ - (IS_QLA23XX(ha) ? &(reg)->u.isp2300.fb_cmd : &(reg)->fb_cmd_2100) + (IS_QLA2100(ha) || IS_QLA2200(ha) ? \ + &(reg)->fb_cmd_2100 : \ + &(reg)->u.isp2300.fb_cmd) #define RD_FB_CMD_REG(ha, reg) \ RD_REG_WORD(FB_CMD_REG(ha, reg)) #define WRT_FB_CMD_REG(ha, reg, data) \ WRT_REG_WORD(FB_CMD_REG(ha, reg), data) - typedef struct { uint32_t out_mb; /* outbound from driver */ uint32_t in_mb; /* Incoming from RISC */ @@ -716,8 +733,8 @@ uint8_t hard_address; uint8_t reserved_1; uint8_t port_id[4]; - uint8_t node_name[WWN_SIZE]; /* Big endian. */ - uint8_t port_name[WWN_SIZE]; /* Big endian. */ + uint8_t node_name[WWN_SIZE]; + uint8_t port_name[WWN_SIZE]; uint16_t execution_throttle; uint16_t execution_count; uint8_t reset_count; @@ -1890,6 +1907,60 @@ } p; }; +/* + * SNS command structures -- for 2200 compatability. + */ +#define RFT_ID_SNS_SCMD_LEN 22 +#define RFT_ID_SNS_CMD_SIZE 60 +#define RFT_ID_SNS_DATA_SIZE 16 + +#define RFF_ID_SNS_SCMD_LEN 8 +#define RFF_ID_SNS_CMD_SIZE 32 +#define RFF_ID_SNS_DATA_SIZE 16 + +#define RNN_ID_SNS_SCMD_LEN 10 +#define RNN_ID_SNS_CMD_SIZE 36 +#define RNN_ID_SNS_DATA_SIZE 16 + +#define GA_NXT_SNS_SCMD_LEN 6 +#define GA_NXT_SNS_CMD_SIZE 28 +#define GA_NXT_SNS_DATA_SIZE (620 + 16) + +#define GID_PT_SNS_SCMD_LEN 6 +#define GID_PT_SNS_CMD_SIZE 28 +#define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES * 4 + 16) + +#define GPN_ID_SNS_SCMD_LEN 6 +#define GPN_ID_SNS_CMD_SIZE 28 +#define GPN_ID_SNS_DATA_SIZE (8 + 16) + +#define GNN_ID_SNS_SCMD_LEN 6 +#define GNN_ID_SNS_CMD_SIZE 28 +#define GNN_ID_SNS_DATA_SIZE (8 + 16) + +struct sns_cmd_pkt { + union { + struct { + uint16_t buffer_length; + uint16_t reserved_1; + uint32_t buffer_address[2]; + uint16_t subcommand_length; + uint16_t reserved_2; + uint16_t subcommand; + uint16_t size; + uint32_t reserved_3; + uint8_t param[36]; + } cmd; + + uint8_t rft_data[RFT_ID_SNS_DATA_SIZE]; + uint8_t rff_data[RFF_ID_SNS_DATA_SIZE]; + uint8_t rnn_data[RNN_ID_SNS_DATA_SIZE]; + uint8_t gan_data[GA_NXT_SNS_DATA_SIZE]; + uint8_t gid_data[GID_PT_SNS_DATA_SIZE]; + uint8_t gpn_data[GPN_ID_SNS_DATA_SIZE]; + uint8_t gnn_data[GNN_ID_SNS_DATA_SIZE]; + } p; +}; /* IO descriptors */ #define MAX_IO_DESCRIPTORS 32 @@ -1919,12 +1990,6 @@ uint32_t signature; }; -/* Mailbox command semaphore queue for command serialization */ -typedef struct _mbx_cmdq_t { - struct semaphore cmd_sem; - struct _mbx_cmdq_t *pnext; -} mbx_cmdq_t; - struct qla_fw_info { unsigned short addressing; /* addressing method used to load fw */ #define FW_INFO_ADDR_NORMAL 0 @@ -2102,6 +2167,8 @@ uint16_t max_public_loop_ids; uint16_t min_external_loopid; /* First external loop Id */ + uint16_t link_data_rate; /* F/W operating speed */ + uint8_t current_topology; uint8_t prev_topology; #define ISP_CFG_NL 1 @@ -2115,9 +2182,6 @@ #define LOOP_P2P 2 #define P2P_LOOP 3 - uint8_t active_fc4_types; /* Active fc4 types */ - - uint8_t current_speed; /* F/W operating speed */ uint8_t marker_needed; uint8_t sns_retry_cnt; uint8_t mem_err; @@ -2164,10 +2228,14 @@ uint8_t rscn_in_ptr; uint8_t rscn_out_ptr; + /* SNS command interfaces. */ ms_iocb_entry_t *ms_iocb; dma_addr_t ms_iocb_dma; struct ct_sns_pkt *ct_sns; dma_addr_t ct_sns_dma; + /* SNS command interfaces for 2200. */ + struct sns_cmd_pkt *sns_cmd; + dma_addr_t sns_cmd_dma; pid_t dpc_pid; int dpc_should_die; @@ -2194,26 +2262,13 @@ mbx_cmd_t *mcp; unsigned long mbx_cmd_flags; -#define MBX_CMD_ACTIVE 1 -#define MBX_CMD_WANT 2 -#define MBX_INTERRUPT 3 -#define MBX_INTR_WAIT 4 +#define MBX_INTERRUPT 1 +#define MBX_INTR_WAIT 2 spinlock_t mbx_reg_lock; /* Mbx Cmd Register Lock */ - spinlock_t mbx_q_lock; /* Mbx Active Cmd Queue Lock */ - spinlock_t mbx_bits_lock; /* Mailbox access bits Lock */ - struct semaphore mbx_intr_sem; /* Used for completion notification */ - - mbx_cmdq_t *mbx_sem_pool_head; /* Head Pointer to a list of - * recyclable mbx semaphore pool - * to be used during run time. - */ - mbx_cmdq_t *mbx_sem_pool_tail; /* Tail Pointer to semaphore pool*/ -#define MBQ_INIT_LEN 16 /* initial mbx sem pool q len. actual len may vary */ - - mbx_cmdq_t *mbx_q_head; /* Head Pointer to sem q for active cmds */ - mbx_cmdq_t *mbx_q_tail; /* Tail Pointer to sem q for active cmds */ + struct semaphore mbx_cmd_sem; /* Serialialize mbx access */ + struct semaphore mbx_intr_sem; /* Used for completion notification */ uint32_t mbx_flags; #define MBX_IN_PROGRESS BIT_0 @@ -2257,21 +2312,14 @@ uint8_t host_str[16]; uint16_t pci_attr; - uint16_t xchg_buf_cnt; - uint16_t iocb_buf_cnt; - uint8_t model_number[16+1]; + uint16_t product_id[4]; + + uint8_t model_number[16+1]; #define BINZERO "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - char *model_desc; + char *model_desc; /* following are new and needed for IOCTL support */ -#ifdef CONFIG_SCSI_QLA2XXX_IOCTL - struct hba_ioctl *ioctl; - - void *ioctl_mem; - dma_addr_t ioctl_mem_phys; - uint32_t ioctl_mem_size; -#endif uint8_t node_name[WWN_SIZE]; uint8_t nvram_version; uint8_t optrom_major; diff -Nru a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h --- a/drivers/scsi/qla2xxx/qla_gbl.h Tue Feb 17 20:00:14 2004 +++ b/drivers/scsi/qla2xxx/qla_gbl.h Tue Feb 17 20:00:14 2004 @@ -103,6 +103,8 @@ extern void qla2x00_blink_led(scsi_qla_host_t *); +extern int qla2x00_down_timeout(struct semaphore *, unsigned long); + /* * Global Function Prototypes in qla_iocb.c source file. */ @@ -217,11 +219,6 @@ extern int qla2x00_get_id_list(scsi_qla_host_t *, void *, dma_addr_t, uint16_t *); -#if 0 /* not yet needed */ -extern int -qla2x00_dump_ram(scsi_qla_host_t *, uint32_t, dma_addr_t, uint32_t); -#endif - extern int qla2x00_lun_reset(scsi_qla_host_t *, uint16_t, uint16_t); @@ -239,10 +236,8 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *, uint16_t *); -#if defined(QL_DEBUG_LEVEL_3) extern int qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map); -#endif /* * Global Function Prototypes in qla_isr.c source file. @@ -275,17 +270,6 @@ extern void qla2x00_dump_regs(scsi_qla_host_t *); extern void qla2x00_dump_buffer(uint8_t *, uint32_t); extern void qla2x00_print_scsi_cmd(struct scsi_cmnd *); -extern void qla2x00_print_q_info(struct os_lun *); - -/* - * Global Function Prototypes in qla_ip.c source file. - */ -extern int qla2x00_ip_initialize(scsi_qla_host_t *); -extern int qla2x00_update_ip_device_data(scsi_qla_host_t *, fc_port_t *); -extern void qla2x00_ip_send_complete(scsi_qla_host_t *, uint32_t, uint16_t); -extern void qla2x00_ip_receive(scsi_qla_host_t *, sts_entry_t *); -extern void qla2x00_ip_receive_fastpost(scsi_qla_host_t *, uint16_t); -extern void qla2x00_ip_mailbox_iocb_done(scsi_qla_host_t *, struct mbx_entry *); /* * Global Function Prototypes in qla_gs.c source file. @@ -294,7 +278,6 @@ extern int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *); extern int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *); extern int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *); -extern int qla2x00_gft_id(scsi_qla_host_t *, sw_info_t *); extern int qla2x00_rft_id(scsi_qla_host_t *); extern int qla2x00_rff_id(scsi_qla_host_t *); extern int qla2x00_rnn_id(scsi_qla_host_t *); diff -Nru a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c --- a/drivers/scsi/qla2xxx/qla_gs.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/qla2xxx/qla_gs.c Tue Feb 17 20:00:06 2004 @@ -20,17 +20,23 @@ #include "qla_def.h" -/* XXX(hch): this is ugly, but we don't want to pull in exioctl.h */ -#ifndef EXT_DEF_FC4_TYPE_SCSI -#define EXT_DEF_FC4_TYPE_SCSI 0x1 -#endif - static inline ms_iocb_entry_t * qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t); static inline struct ct_sns_req * qla2x00_prep_ct_req(struct ct_sns_req *, uint16_t, uint16_t); +static inline struct sns_cmd_pkt * +qla2x00_prep_sns_cmd(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); + +static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *); +static int qla2x00_sns_gid_pt(scsi_qla_host_t *, sw_info_t *); +static int qla2x00_sns_gpn_id(scsi_qla_host_t *, sw_info_t *); +static int qla2x00_sns_gnn_id(scsi_qla_host_t *, sw_info_t *); +static int qla2x00_sns_rft_id(scsi_qla_host_t *); +static int qla2x00_sns_rff_id(scsi_qla_host_t *); +static int qla2x00_sns_rnn_id(scsi_qla_host_t *); + /** * qla2x00_prep_ms_iocb() - Prepare common MS IOCB fields for SNS CT query. * @ha: HA context @@ -90,6 +96,7 @@ return (ct_req); } + /** * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command. * @ha: HA context @@ -106,6 +113,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_ga_nxt(ha, fcport)); + } + /* Issue GA_NXT */ /* Prepare common MS IOCB */ ms_pkt = qla2x00_prep_ms_iocb(ha, GA_NXT_REQ_SIZE, GA_NXT_RSP_SIZE); @@ -190,6 +201,10 @@ struct ct_sns_gid_pt_data *gid_data; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_gid_pt(ha, list)); + } + gid_data = NULL; /* Issue GID_PT */ @@ -235,7 +250,7 @@ /* * If we've used all available slots, then the switch is - * reporting back more devices that we can handle with this + * reporting back more devices than we can handle with this * single call. Return a failed status, and let GA_NXT handle * the overload. */ @@ -263,6 +278,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_gpn_id(ha, list)); + } + for (i = 0; i < MAX_FIBRE_DEVICES; i++) { /* Issue GPN_ID */ /* Prepare common MS IOCB */ @@ -308,7 +327,7 @@ } /** - * qla2x00_gnn_id() - SNS Get Node Name (GPN_ID) query. + * qla2x00_gnn_id() - SNS Get Node Name (GNN_ID) query. * @ha: HA context * @list: switch info entries to populate * @@ -324,6 +343,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_gnn_id(ha, list)); + } + for (i = 0; i < MAX_FIBRE_DEVICES; i++) { /* Issue GNN_ID */ /* Prepare common MS IOCB */ @@ -385,69 +408,6 @@ } /** - * qla2x00_gft_id() - SNS Get FC-4 TYPEs (GFT_ID) query. - * @ha: HA context - * @list: switch info entries to populate - * - * Returns 0 on success. - */ -int -qla2x00_gft_id(scsi_qla_host_t *ha, sw_info_t *list) -{ - int rval; - uint16_t i; - - ms_iocb_entry_t *ms_pkt; - struct ct_sns_req *ct_req; - struct ct_sns_rsp *ct_rsp; - - for (i = 0; i < MAX_FIBRE_DEVICES; i++) { - /* Issue GFT_ID */ - /* Prepare common MS IOCB */ - ms_pkt = qla2x00_prep_ms_iocb(ha, GFT_ID_REQ_SIZE, - GFT_ID_RSP_SIZE); - - /* Prepare CT request */ - ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GFT_ID_CMD, - GFT_ID_RSP_SIZE); - ct_rsp = &ha->ct_sns->p.rsp; - - /* Prepare CT arguments -- port_id */ - ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; - ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; - ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; - - /* Execute MS IOCB */ - rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma, - sizeof(ms_iocb_entry_t)); - if (rval != QLA_SUCCESS) { - /*EMPTY*/ - DEBUG2_3(printk("scsi(%ld): GFT_ID issue IOCB failed " - "(%d).\n", ha->host_no, rval)); - } else if (ct_rsp->header.response != - __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { - DEBUG2_3(printk("scsi(%ld): GFT_ID failed, rejected " - "request, gft_id_rsp:\n", ha->host_no)); - DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, - sizeof(struct ct_rsp_hdr))); - rval = QLA_FUNCTION_FAILED; - } else { - /* FCP-3 check necessary? No, assume FCP-3 */ - /*if (ct_rsp->rsp.gft_id.fc4_types[2] & 0x01)*/ - list[i].type = SW_TYPE_SCSI; - if (ct_rsp->rsp.gft_id.fc4_types[3] & 0x20) - list[i].type |= SW_TYPE_IP; - } - - /* Last device exit. */ - if (list[i].d_id.b.rsvd_1 != 0) - break; - } - - return (rval); -} - -/** * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA. * @ha: HA context * @@ -462,6 +422,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_rft_id(ha)); + } + /* Issue RFT_ID */ /* Prepare common MS IOCB */ ms_pkt = qla2x00_prep_ms_iocb(ha, RFT_ID_REQ_SIZE, RFT_ID_RSP_SIZE); @@ -477,7 +441,6 @@ ct_req->req.rft_id.port_id[2] = ha->d_id.b.al_pa; ct_req->req.rft_id.fc4_types[2] = 0x01; /* FCP-3 */ - ha->active_fc4_types = EXT_DEF_FC4_TYPE_SCSI; /* Execute MS IOCB */ rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma, @@ -516,6 +479,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_rff_id(ha)); + } + /* Issue RFF_ID */ /* Prepare common MS IOCB */ ms_pkt = qla2x00_prep_ms_iocb(ha, RFF_ID_REQ_SIZE, RFF_ID_RSP_SIZE); @@ -569,6 +536,10 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + return (qla2x00_sns_rnn_id(ha)); + } + /* Issue RNN_ID */ /* Prepare common MS IOCB */ ms_pkt = qla2x00_prep_ms_iocb(ha, RNN_ID_REQ_SIZE, RNN_ID_RSP_SIZE); @@ -624,6 +595,12 @@ struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; + if (IS_QLA2200(ha)) { + DEBUG2(printk("scsi(%ld): RSNN_ID call unsupported on " + "ISP2200.\n", ha->host_no)); + return (QLA_SUCCESS); + } + /* Issue RSNN_NN */ /* Prepare common MS IOCB */ /* Request size adjusted after CT preparation */ @@ -674,6 +651,457 @@ rval = QLA_FUNCTION_FAILED; } else { DEBUG2(printk("scsi(%ld): RSNN_NN exiting normally.\n", + ha->host_no)); + } + + return (rval); +} + + +/** + * qla2x00_prep_sns_cmd() - Prepare common SNS command request fields for query. + * @ha: HA context + * @cmd: GS command + * @scmd_len: Subcommand length + * @data_size: response size in bytes + * + * Returns a pointer to the @ha's sns_cmd. + */ +static inline struct sns_cmd_pkt * +qla2x00_prep_sns_cmd(scsi_qla_host_t *ha, uint16_t cmd, uint16_t scmd_len, + uint16_t data_size) +{ + uint16_t wc; + struct sns_cmd_pkt *sns_cmd; + + sns_cmd = ha->sns_cmd; + memset(sns_cmd, 0, sizeof(struct sns_cmd_pkt)); + wc = data_size / 2; /* Size in 16bit words. */ + sns_cmd->p.cmd.buffer_length = cpu_to_le16(wc); + sns_cmd->p.cmd.buffer_address[0] = cpu_to_le32(LSD(ha->sns_cmd_dma)); + sns_cmd->p.cmd.buffer_address[1] = cpu_to_le32(MSD(ha->sns_cmd_dma)); + sns_cmd->p.cmd.subcommand_length = cpu_to_le16(scmd_len); + sns_cmd->p.cmd.subcommand = cpu_to_le16(cmd); + wc = (data_size - 16) / 4; /* Size in 32bit words. */ + sns_cmd->p.cmd.size = cpu_to_le16(wc); + + return (sns_cmd); +} + +/** + * qla2x00_sns_ga_nxt() - SNS scan for fabric devices via GA_NXT command. + * @ha: HA context + * @fcport: fcport entry to updated + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_ga_nxt(scsi_qla_host_t *ha, fc_port_t *fcport) +{ + int rval; + + struct sns_cmd_pkt *sns_cmd; + + /* Issue GA_NXT. */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, GA_NXT_CMD, GA_NXT_SNS_SCMD_LEN, + GA_NXT_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id. */ + sns_cmd->p.cmd.param[0] = fcport->d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = fcport->d_id.b.area; + sns_cmd->p.cmd.param[2] = fcport->d_id.b.domain; + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GA_NXT_SNS_CMD_SIZE / 2, + sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): GA_NXT Send SNS failed (%d).\n", + ha->host_no, rval)); + } else if (sns_cmd->p.gan_data[8] != 0x80 || + sns_cmd->p.gan_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, " + "ga_nxt_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gan_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + /* Populate fc_port_t entry. */ + fcport->d_id.b.domain = sns_cmd->p.gan_data[17]; + fcport->d_id.b.area = sns_cmd->p.gan_data[18]; + fcport->d_id.b.al_pa = sns_cmd->p.gan_data[19]; + + memcpy(fcport->node_name, &sns_cmd->p.gan_data[284], WWN_SIZE); + memcpy(fcport->port_name, &sns_cmd->p.gan_data[20], WWN_SIZE); + + if (sns_cmd->p.gan_data[16] != NS_N_PORT_TYPE && + sns_cmd->p.gan_data[16] != NS_NL_PORT_TYPE) + fcport->d_id.b.domain = 0xf0; + + DEBUG2_3(printk("scsi(%ld): GA_NXT entry - " + "nn %02x%02x%02x%02x%02x%02x%02x%02x " + "pn %02x%02x%02x%02x%02x%02x%02x%02x " + "portid=%02x%02x%02x.\n", + ha->host_no, + fcport->node_name[0], fcport->node_name[1], + fcport->node_name[2], fcport->node_name[3], + fcport->node_name[4], fcport->node_name[5], + fcport->node_name[6], fcport->node_name[7], + fcport->port_name[0], fcport->port_name[1], + fcport->port_name[2], fcport->port_name[3], + fcport->port_name[4], fcport->port_name[5], + fcport->port_name[6], fcport->port_name[7], + fcport->d_id.b.domain, fcport->d_id.b.area, + fcport->d_id.b.al_pa)); + } + + return (rval); +} + +/** + * qla2x00_sns_gid_pt() - SNS scan for fabric devices via GID_PT command. + * @ha: HA context + * @list: switch info entries to populate + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * NOTE: Non-Nx_Ports are not requested. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_gid_pt(scsi_qla_host_t *ha, sw_info_t *list) +{ + int rval; + + uint16_t i; + uint8_t *entry; + struct sns_cmd_pkt *sns_cmd; + + /* Issue GID_PT. */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, + GID_PT_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_type. */ + sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2, + sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): GID_PT Send SNS failed (%d).\n", + ha->host_no, rval)); + } else if (sns_cmd->p.gid_data[8] != 0x80 || + sns_cmd->p.gid_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, " + "gid_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gid_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + /* Set port IDs in switch info list. */ + for (i = 0; i < MAX_FIBRE_DEVICES; i++) { + entry = &sns_cmd->p.gid_data[(i * 4) + 16]; + list[i].d_id.b.domain = entry[1]; + list[i].d_id.b.area = entry[2]; + list[i].d_id.b.al_pa = entry[3]; + + /* Last one exit. */ + if (entry[0] & BIT_7) { + list[i].d_id.b.rsvd_1 = entry[0]; + break; + } + } + + /* + * If we've used all available slots, then the switch is + * reporting back more devices that we can handle with this + * single call. Return a failed status, and let GA_NXT handle + * the overload. + */ + if (i == MAX_FIBRE_DEVICES) + rval = QLA_FUNCTION_FAILED; + } + + return (rval); +} + +/** + * qla2x00_sns_gpn_id() - SNS Get Port Name (GPN_ID) query. + * @ha: HA context + * @list: switch info entries to populate + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_gpn_id(scsi_qla_host_t *ha, sw_info_t *list) +{ + int rval; + + uint16_t i; + struct sns_cmd_pkt *sns_cmd; + + for (i = 0; i < MAX_FIBRE_DEVICES; i++) { + /* Issue GPN_ID */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, GPN_ID_CMD, + GPN_ID_SNS_SCMD_LEN, GPN_ID_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id. */ + sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; + sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, + GPN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): GPN_ID Send SNS failed " + "(%d).\n", ha->host_no, rval)); + } else if (sns_cmd->p.gpn_data[8] != 0x80 || + sns_cmd->p.gpn_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected " + "request, gpn_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gpn_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + /* Save portname */ + memcpy(list[i].port_name, &sns_cmd->p.gpn_data[16], + WWN_SIZE); + } + + /* Last device exit. */ + if (list[i].d_id.b.rsvd_1 != 0) + break; + } + + return (rval); +} + +/** + * qla2x00_sns_gnn_id() - SNS Get Node Name (GNN_ID) query. + * @ha: HA context + * @list: switch info entries to populate + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_gnn_id(scsi_qla_host_t *ha, sw_info_t *list) +{ + int rval; + + uint16_t i; + struct sns_cmd_pkt *sns_cmd; + + for (i = 0; i < MAX_FIBRE_DEVICES; i++) { + /* Issue GNN_ID */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, GNN_ID_CMD, + GNN_ID_SNS_SCMD_LEN, GNN_ID_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id. */ + sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; + sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, + GNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): GNN_ID Send SNS failed " + "(%d).\n", ha->host_no, rval)); + } else if (sns_cmd->p.gnn_data[8] != 0x80 || + sns_cmd->p.gnn_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected " + "request, gnn_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gnn_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + /* Save nodename */ + memcpy(list[i].node_name, &sns_cmd->p.gnn_data[16], + WWN_SIZE); + + DEBUG2_3(printk("scsi(%ld): GID_PT entry - " + "nn %02x%02x%02x%02x%02x%02x%02x%02x " + "pn %02x%02x%02x%02x%02x%02x%02x%02x " + "portid=%02x%02x%02x.\n", + ha->host_no, + list[i].node_name[0], list[i].node_name[1], + list[i].node_name[2], list[i].node_name[3], + list[i].node_name[4], list[i].node_name[5], + list[i].node_name[6], list[i].node_name[7], + list[i].port_name[0], list[i].port_name[1], + list[i].port_name[2], list[i].port_name[3], + list[i].port_name[4], list[i].port_name[5], + list[i].port_name[6], list[i].port_name[7], + list[i].d_id.b.domain, list[i].d_id.b.area, + list[i].d_id.b.al_pa)); + } + + /* Last device exit. */ + if (list[i].d_id.b.rsvd_1 != 0) + break; + } + + return (rval); +} + +/** + * qla2x00_snd_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA. + * @ha: HA context + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_rft_id(scsi_qla_host_t *ha) +{ + int rval; + + struct sns_cmd_pkt *sns_cmd; + + /* Issue RFT_ID. */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, RFT_ID_CMD, RFT_ID_SNS_SCMD_LEN, + RFT_ID_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id, FC-4 types */ + sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = ha->d_id.b.area; + sns_cmd->p.cmd.param[2] = ha->d_id.b.domain; + + sns_cmd->p.cmd.param[5] = 0x01; /* FCP-3 */ + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RFT_ID_SNS_CMD_SIZE / 2, + sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): RFT_ID Send SNS failed (%d).\n", + ha->host_no, rval)); + } else if (sns_cmd->p.rft_data[8] != 0x80 || + sns_cmd->p.rft_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected request, " + "rft_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rft_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n", + ha->host_no)); + } + + return (rval); +} + +/** + * qla2x00_sns_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the + * HBA. + * @ha: HA context + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_rff_id(scsi_qla_host_t *ha) +{ + int rval; + + struct sns_cmd_pkt *sns_cmd; + + /* Issue RFF_ID. */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, RFF_ID_CMD, RFF_ID_SNS_SCMD_LEN, + RFF_ID_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id, FC-4 feature, FC-4 type */ + sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = ha->d_id.b.area; + sns_cmd->p.cmd.param[2] = ha->d_id.b.domain; + + sns_cmd->p.cmd.param[6] = 0x08; /* SCSI - FCP */ + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RFF_ID_SNS_CMD_SIZE / 2, + sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): RFF_ID Send SNS failed (%d).\n", + ha->host_no, rval)); + } else if (sns_cmd->p.rff_data[8] != 0x80 || + sns_cmd->p.rff_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): RFF_ID failed, rejected request, " + "rff_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rff_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + DEBUG2(printk("scsi(%ld): RFF_ID exiting normally.\n", + ha->host_no)); + } + + return (rval); +} + +/** + * qla2x00_sns_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA. + * HBA. + * @ha: HA context + * + * This command uses the old Exectute SNS Command mailbox routine. + * + * Returns 0 on success. + */ +static int +qla2x00_sns_rnn_id(scsi_qla_host_t *ha) +{ + int rval; + + struct sns_cmd_pkt *sns_cmd; + + /* Issue RNN_ID. */ + /* Prepare SNS command request. */ + sns_cmd = qla2x00_prep_sns_cmd(ha, RNN_ID_CMD, RNN_ID_SNS_SCMD_LEN, + RNN_ID_SNS_DATA_SIZE); + + /* Prepare SNS command arguments -- port_id, nodename. */ + sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa; + sns_cmd->p.cmd.param[1] = ha->d_id.b.area; + sns_cmd->p.cmd.param[2] = ha->d_id.b.domain; + + sns_cmd->p.cmd.param[4] = ha->init_cb->node_name[7]; + sns_cmd->p.cmd.param[5] = ha->init_cb->node_name[6]; + sns_cmd->p.cmd.param[6] = ha->init_cb->node_name[5]; + sns_cmd->p.cmd.param[7] = ha->init_cb->node_name[4]; + sns_cmd->p.cmd.param[8] = ha->init_cb->node_name[3]; + sns_cmd->p.cmd.param[9] = ha->init_cb->node_name[2]; + sns_cmd->p.cmd.param[10] = ha->init_cb->node_name[1]; + sns_cmd->p.cmd.param[11] = ha->init_cb->node_name[0]; + + /* Execute SNS command. */ + rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RNN_ID_SNS_CMD_SIZE / 2, + sizeof(struct sns_cmd_pkt)); + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + DEBUG2_3(printk("scsi(%ld): RNN_ID Send SNS failed (%d).\n", + ha->host_no, rval)); + } else if (sns_cmd->p.rnn_data[8] != 0x80 || + sns_cmd->p.rnn_data[9] != 0x02) { + DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected request, " + "rnn_rsp:\n", ha->host_no)); + DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rnn_data, 16)); + rval = QLA_FUNCTION_FAILED; + } else { + DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n", ha->host_no)); } diff -Nru a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c --- a/drivers/scsi/qla2xxx/qla_init.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/qla2xxx/qla_init.c Tue Feb 17 20:00:08 2004 @@ -65,10 +65,13 @@ static os_lun_t * qla2x00_fclun_bind(scsi_qla_host_t *, fc_port_t *, fc_lun_t *); static void qla2x00_lun_free(scsi_qla_host_t *, uint16_t, uint16_t); + static int qla2x00_bstr_to_hex(char *, uint8_t *, int); static int qla2x00_find_propname(scsi_qla_host_t *, char *, char *, char *, int); #if 0 +static void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *, fc_port_t *, + uint16_t, uint16_t); static int qla2x00_get_prop_16chars(scsi_qla_host_t *, char *, char *, char *); static void qla2x00_get_properties(scsi_qla_host_t *, char *); @@ -148,6 +151,7 @@ */ if (ql2xdevconf) { ha->cmdline = ql2xdevconf; + qla2x00_get_properties(ha, ql2xdevconf); } #endif @@ -166,13 +170,6 @@ } } - /* Retrieve firmware information */ - qla2x00_get_fw_version(ha, &ha->fw_major_version, - &ha->fw_minor_version, &ha->fw_subminor_version, - &ha->fw_attributes); - qla2x00_get_resource_cnts(ha, NULL, &ha->xchg_buf_cnt, - &ha->iocb_buf_cnt, NULL); - if (rval == QLA_SUCCESS && (rval = qla2x00_init_rings(ha)) == QLA_SUCCESS) { check_fw_ready_again: @@ -226,6 +223,11 @@ } while (restart_risc && retry--); if (isp_init) { + /* Retrieve firmware information */ + qla2x00_get_fw_version(ha, &ha->fw_major_version, + &ha->fw_minor_version, &ha->fw_subminor_version, + &ha->fw_attributes); + clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ha->marker_needed = 1; qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); @@ -282,11 +284,11 @@ ha->pci_attr = RD_REG_WORD(&ha->iobase->ctrl_status); spin_unlock_irqrestore(&ha->hardware_lock, flags); - if (IS_QLA23XX(ha)) { + if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) { pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80); /* PCI Specification Revision 2.3 changes */ - if (IS_QLA2322(ha)) + if (IS_QLA2322(ha) || IS_QLA6322(ha)) /* Command Register - Reset Interrupt Disable. */ w &= ~BIT_10; @@ -406,7 +408,7 @@ if (!IS_QLA2100(ha)) { /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); - if (!IS_QLA2312(ha) && !IS_QLA2322(ha)) { + if (IS_QLA2200(ha) || IS_QLA2300(ha)) { for (cnt = 0; cnt < 30000; cnt++) { if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) @@ -424,7 +426,7 @@ WRT_REG_WORD(®->fpm_diag_config, 0x100); /* Toggle Fpm Reset. */ - if (IS_QLA23XX(ha)) + if (!IS_QLA2200(ha)) WRT_REG_WORD(®->fpm_diag_config, 0x0); /* Select frame buffer registers. */ @@ -461,9 +463,7 @@ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); /* Wait for RISC to recover from reset. */ - if (IS_QLA2312(ha) || IS_QLA2322(ha)) { - udelay(10); - } else { + if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) { /* * It is necessary to for a delay here since the card doesn't * respond to PCI reads during a reset. On some architectures @@ -476,7 +476,8 @@ break; udelay(100); } - } + } else + udelay(10); /* Reset RISC processor. */ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); @@ -487,9 +488,7 @@ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); RD_REG_WORD(®->hccr); /* PCI Posting. */ - if (IS_QLA2312(ha) || IS_QLA2322(ha)) - udelay(100); - else { + if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) { for (cnt = 0; cnt < 30000; cnt++) { if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags); @@ -508,7 +507,8 @@ udelay(100); } - } + } else + udelay(100); /* Turn on master enable */ cmd |= PCI_COMMAND_MASTER; @@ -570,16 +570,15 @@ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); /* Workaround for QLA2312 PCI parity error */ - if (IS_QLA2312(ha) || IS_QLA2322(ha)) - udelay(10); - else { + if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) { data = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 0)); for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { udelay(5); data = RD_MAILBOX_REG(ha, reg, 0); barrier(); } - } + } else + udelay(10); if (!cnt) goto chip_diag_failed; @@ -590,7 +589,7 @@ mb[1] = RD_MAILBOX_REG(ha, reg, 1); mb[2] = RD_MAILBOX_REG(ha, reg, 2); mb[3] = RD_MAILBOX_REG(ha, reg, 3); - + mb[4] = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 4)); if (mb[1] != PROD_ID_1 || (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) || mb[3] != PROD_ID_3) { qla_printk(KERN_WARNING, ha, @@ -598,6 +597,10 @@ goto chip_diag_failed; } + ha->product_id[0] = mb[1]; + ha->product_id[1] = mb[2]; + ha->product_id[2] = mb[3]; + ha->product_id[3] = mb[4]; /* Adjust fw RISC transfer size */ ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT; @@ -1106,7 +1109,7 @@ /* Determine NVRAM starting address. */ ha->nvram_base = 0; - if (IS_QLA2312(ha) || IS_QLA2322(ha)) + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) if ((RD_REG_WORD(®->ctrl_status) >> 14) == 1) ha->nvram_base = 0x80; @@ -1218,7 +1221,7 @@ } else { strcpy(ha->model_number, "QLA2300"); } - } else if (IS_QLA2312(ha) || IS_QLA2322(ha)) { + } else { if (rval == 0 && memcmp(nv->model_number, BINZERO, sizeof(nv->model_number)) != 0) { @@ -1229,7 +1232,7 @@ st = en = ha->model_number; en += sizeof(nv->model_number) - 1; while (en > st) { - if (*en != 0x20) + if (*en != 0x20 && *en != 0x00) break; *en-- = '\0'; } @@ -1246,8 +1249,6 @@ strcpy(ha->model_number, "QLA23xx"); } } - } else { - strcpy(ha->model_number, "QLA23xx"); } } else if (IS_QLA2200(ha)) { nv->firmware_options[0] |= BIT_2; @@ -1287,6 +1288,9 @@ ha->nvram_version = nv->nvram_version; ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); + /* Always load RISC code on non ISP2[12]00 chips. */ + if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) + ha->flags.disable_risc_code_load = 0; ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0); ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0); ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0); @@ -1318,14 +1322,8 @@ /* Set minimum RATOV to 200 tenths of a second. */ ha->r_a_tov = 200; -/* FIXME - * - * port_down_retry_count updated twice - * - */ - ha->port_down_retry_count = nv->port_down_retry_count; ha->minimum_timeout = - (ha->login_timeout * ha->retry_count) + ha->port_down_retry_count; + (ha->login_timeout * ha->retry_count) + nv->port_down_retry_count; ha->loop_reset_delay = nv->reset_delay; /* Will get the value from NVRAM. */ @@ -1350,28 +1348,15 @@ (LOOP_DOWN_TIME - ha->link_down_timeout); } + ha->max_luns = MAX_LUNS; ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target); if (ha->max_probe_luns == 0) ha->max_probe_luns = MIN_LUNS; -#if USE_BIOS_MAX_LUNS - ha->max_luns = le16_to_cpu(nv->max_luns_per_target); - if (ha->max_luns == 0) - ha->max_luns = MAX_LUNS; - else if (ha->max_luns > MAX_LUNS) - ha->max_luns = MAX_LUNS; -#else - ha->max_luns = MAX_LUNS; -#endif - -/* FIXME - * - * port_down_retry_count updated twice - * - */ /* * Need enough time to try and get the port back. */ + ha->port_down_retry_count = nv->port_down_retry_count; if (qlport_down_retry) ha->port_down_retry_count = qlport_down_retry; /* Set login_retry_count */ @@ -1414,7 +1399,7 @@ icb->firmware_options[0] &= ~BIT_3; icb->add_firmware_options[0] &= ~(BIT_3 | BIT_2 | BIT_1 | BIT_0); - icb->add_firmware_options[0] |= (BIT_1 | BIT_0); + icb->add_firmware_options[0] |= BIT_2; icb->response_accumulation_timer = 3; icb->interrupt_delay_timer = 5; @@ -1426,7 +1411,7 @@ * ~(BIT_3 | BIT_2 | BIT_1 | BIT_0); * icb->add_firmware_options[0] |= (BIT_2 | BIT_0); */ - timer_mode = icb->add_firmware_options[0] & + timer_mode = icb->add_firmware_options[0] & (BIT_3 | BIT_2 | BIT_1 | BIT_0); if (timer_mode == 5) { DEBUG2(printk("scsi(%ld): ZIO enabled; timer delay " @@ -1445,9 +1430,6 @@ DEBUG2_3(printk(KERN_WARNING "scsi(%ld): NVRAM configuration failed!\n", ha->host_no)); } - - LEAVE(__func__); - return (rval); } @@ -1466,12 +1448,8 @@ { uint32_t t; - ENTER(__func__); - for (t = 0; t < MAX_TARGETS; t++) TGT_Q(ha, t) = (os_tgt_t *)NULL; - - LEAVE(__func__); } /** @@ -1856,7 +1834,7 @@ PORT_RETRY_TIME; atomic_set(&fcport->port_down_timer, ha->port_down_retry_count * PORT_RETRY_TIME); - fcport->flags &= ~(FCF_LOGIN_NEEDED); + fcport->flags &= ~FCF_LOGIN_NEEDED; /* * Check for outstanding cmd on tape Bypass LUN discovery if active @@ -2323,6 +2301,7 @@ int rval, rval2; fc_port_t *fcport, *fcptemp; uint16_t next_loopid; + uint16_t mb[MAILBOX_REGISTER_COUNT]; LIST_HEAD(new_fcports); /* If FL port exists, then SNS is present */ @@ -2342,6 +2321,17 @@ return (QLA_SUCCESS); } do { + /* Ensure we are logged into the SNS. */ + qla2x00_login_fabric(ha, SIMPLE_NAME_SERVER, 0xff, 0xff, 0xfc, + mb, BIT_0); + if (mb[0] != MBS_COMMAND_COMPLETE) { + qla_printk(KERN_INFO, ha, + "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x " + "mb[2]=%x mb[6]=%x mb[7]=%x\n", SIMPLE_NAME_SERVER, + mb[0], mb[1], mb[2], mb[6], mb[7]); + return (QLA_FUNCTION_FAILED); + } + if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) { if (qla2x00_rft_id(ha)) { /* EMPTY */ @@ -2811,7 +2801,9 @@ switch (format) { case 0: - if (IS_QLA23XX(ha) && ha->flags.init_done) { + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && + !IS_QLA6312(ha) && !IS_QLA6322(ha) && + ha->flags.init_done) { /* Handle port RSCN via asyncronous IOCBs */ rval2 = qla2x00_handle_port_rscn(ha, rscn_entry, NULL, 0); @@ -2836,7 +2828,7 @@ rval = QLA_SUCCESS; /* Abort any outstanding IO descriptors. */ - if (IS_QLA23XX(ha)) + if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) qla2x00_cancel_io_descriptors(ha); list_for_each_entry(fcport, &ha->fcports, list) { @@ -3128,13 +3120,9 @@ struct list_head *list, *temp; unsigned long flags = 0; - ENTER(__func__); - clear_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); - /* - * start pending queue - */ + /* start pending queue */ pending_q_cnt = ha->qthreads; if (flush) { spin_lock_irqsave(&ha->list_lock,flags); @@ -3188,8 +3176,6 @@ if (!list_empty(&ha->done_queue)) qla2x00_done(ha); - - LEAVE(__func__); } //FIXME - Document @@ -3344,6 +3330,9 @@ tq->flags |= TQF_ONLINE; tq->port_down_retry_count = ha->port_down_retry_count; +#if 0 + qla2x00_get_lun_mask_from_config(ha, fcport, tgt, 0); +#endif } if (tgt == MAX_TARGETS) { @@ -3587,6 +3576,52 @@ } +#if 0 +/* + * qla2x00_get_lun_mask_from_config + * Get lun mask from the configuration parameters. + * Bit order is little endian. + * + * Input: + * ha -- Host adapter + * tgt -- target/device number + * port -- pointer to port + */ +static void +qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, + fc_port_t *fcport, uint16_t tgt, uint16_t dev_no) +{ + char propbuf[60]; /* size of search string */ + int rval, lun, bit; + lun_bit_mask_t lun_mask, *mask_ptr = &lun_mask; + + /* Get "target-N-device-N-lun-mask" as a 256 bit lun_mask*/ + sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled", + ha->instance, tgt, dev_no); + + rval = qla2x00_get_prop_xstr(ha, propbuf, + (uint8_t *)&lun_mask, sizeof(lun_bit_mask_t)); + if (rval == sizeof(lun_bit_mask_t)) { + memset(&fcport->lun_mask, 0, sizeof(lun_bit_mask_t)); + for (lun = 8 * sizeof(lun_bit_mask_t) - 1, bit = 0; + lun >= 0; lun--, bit++) { + if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) + EXT_SET_LUN_BIT((&fcport->lun_mask), bit); + } + + DEBUG3(printk("scsi(%ld): returning lun mask for fcport " + "%02x%02x%02x%02x%02x%02x%02x%02x:\n", + ha->host_no, + fcport->port_name[0], fcport->port_name[1], + fcport->port_name[2], fcport->port_name[3], + fcport->port_name[4], fcport->port_name[5], + fcport->port_name[6], fcport->port_name[7])); + DEBUG3(qla2x00_dump_buffer((uint8_t *)&fcport->lun_mask, + sizeof(lun_bit_mask_t));) + } +} +#endif + /* * qla2x00_bstr_to_hex * Convert hex byte string to number. @@ -3670,7 +3705,6 @@ propstr++; /* ignore equal sign */ if (rval == 0) { /* not found */ - LEAVE(__func__); return (-1); } @@ -4035,8 +4069,6 @@ srb_t *sp; uint8_t status = 0; - ENTER("qla2x00_abort_isp"); - if (ha->flags.online) { ha->flags.online = FALSE; clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); @@ -4176,7 +4208,7 @@ if (qla2x00_isp_firmware(ha)) { ha->flags.online = FALSE; if (!(status = qla2x00_chip_diag(ha))) { - if (!IS_QLA23XX(ha)) { + if (IS_QLA2100(ha) || IS_QLA2200(ha)) { status = qla2x00_setup_chip(ha); goto done; } @@ -4192,14 +4224,14 @@ spin_lock_irqsave(&ha->hardware_lock, flags); /* Enable proper parity */ - if (IS_QLA2312(ha) || IS_QLA2322(ha)) - /* SRAM, Instruction RAM and GP RAM parity */ - WRT_REG_WORD(®->hccr, - (HCCR_ENABLE_PARITY + 0x7)); - else + if (IS_QLA2300(ha)) /* SRAM parity */ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x1)); + else + /* SRAM, Instruction RAM and GP RAM parity */ + WRT_REG_WORD(®->hccr, + (HCCR_ENABLE_PARITY + 0x7)); spin_unlock_irqrestore(&ha->hardware_lock, flags); } @@ -4246,8 +4278,6 @@ unsigned long flags = 0; device_reg_t *reg = ha->iobase; - ENTER(__func__); - ha->flags.online = FALSE; qla2x00_disable_intrs(ha); /* Reset RISC processor. */ @@ -4255,6 +4285,4 @@ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); spin_unlock_irqrestore(&ha->hardware_lock, flags); - - LEAVE(__func__); } diff -Nru a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c --- a/drivers/scsi/qla2xxx/qla_iocb.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/qla2xxx/qla_iocb.c Tue Feb 17 20:00:07 2004 @@ -527,8 +527,6 @@ { mrk_entry_t *pkt; - ENTER(__func__); - pkt = (mrk_entry_t *)qla2x00_req_pkt(ha); if (pkt == NULL) { DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); @@ -547,8 +545,6 @@ /* Issue command to ISP */ qla2x00_isp_cmd(ha); - LEAVE(__func__); - return (QLA_SUCCESS); } @@ -584,8 +580,6 @@ uint32_t timer; uint16_t req_cnt = 1; - ENTER(__func__); - /* Wait 1 second for slot. */ for (timer = HZ; timer; timer--) { if ((req_cnt + 2) >= ha->req_q_cnt) { @@ -632,8 +626,6 @@ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); } - LEAVE(__func__); - return (pkt); } @@ -658,8 +650,6 @@ uint8_t found = 0; uint16_t req_cnt = 1; - ENTER(__func__); - /* Wait 1 second for slot. */ for (timer = HZ; timer; timer--) { if ((req_cnt + 2) >= ha->req_q_cnt) { @@ -729,8 +719,6 @@ if (!pkt) { DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); } - - LEAVE(__func__); return (pkt); } diff -Nru a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c --- a/drivers/scsi/qla2xxx/qla_isr.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/qla2xxx/qla_isr.c Tue Feb 17 20:00:06 2004 @@ -21,12 +21,6 @@ #include "qla_def.h" -/* XXX(hch): this is ugly, but we don't want to pull in exioctl.h */ -#ifndef EXT_DEF_PORTSPEED_1GBIT -#define EXT_DEF_PORTSPEED_1GBIT 1 -#define EXT_DEF_PORTSPEED_2GBIT 2 -#endif - static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); static void qla2x00_async_event(scsi_qla_host_t *, uint32_t); static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t); @@ -289,10 +283,13 @@ switch (mb[0]) { case MBA_SCSI_COMPLETION: if (IS_QLA2100(ha) || IS_QLA2200(ha)) - handles[0] = RD_MAILBOX_REG(ha, reg, 1); + handles[0] = le32_to_cpu( + ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | + RD_MAILBOX_REG(ha, reg, 1)); else - handles[0] = MSW(mbx); - handles[0] |= (uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16); + handles[0] = le32_to_cpu( + ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | + MSW(mbx)); handle_cnt = 1; break; case MBA_CMPLT_1_16BIT: @@ -334,9 +331,11 @@ mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_2_32BIT: - handles[0] = (uint32_t)((RD_MAILBOX_REG(ha, reg, 2) << 16) | + handles[0] = le32_to_cpu( + ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | RD_MAILBOX_REG(ha, reg, 1)); - handles[1] = (uint32_t)((RD_MAILBOX_REG(ha, reg, 7) << 16) | + handles[1] = le32_to_cpu( + ((uint32_t)(RD_MAILBOX_REG(ha, reg, 7) << 16)) | RD_MAILBOX_REG(ha, reg, 6)); handle_cnt = 2; mb[0] = MBA_SCSI_COMPLETION; @@ -424,15 +423,14 @@ case MBA_LOOP_UP: /* Loop Up Event */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); - ha->current_speed = EXT_DEF_PORTSPEED_1GBIT; + ha->link_data_rate = 0; if (IS_QLA2100(ha) || IS_QLA2200(ha)) { link_speed = link_speeds[0]; } else { link_speed = link_speeds[3]; if (mb[1] < 5) link_speed = link_speeds[mb[1]]; - if (mb[1] == 1) - ha->current_speed = EXT_DEF_PORTSPEED_2GBIT; + ha->link_data_rate = mb[1]; } DEBUG2(printk("scsi(%ld): Asynchronous LOOP UP (%s Gbps).\n", @@ -458,7 +456,7 @@ } ha->flags.management_server_logged_in = 0; - ha->current_speed = 0; /* reset value */ + ha->link_data_rate = 0; /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL); @@ -547,7 +545,8 @@ * us, create a new entry in our rscn fcports list and handle * the event like an RSCN. */ - if (IS_QLA23XX(ha) && ha->flags.init_done && mb[1] != 0xffff && + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && + !IS_QLA6322(ha) && ha->flags.init_done && mb[1] != 0xffff && ((ha->operating_mode == P2P && mb[1] != 0) || (ha->operating_mode != P2P && mb[1] != SNS_FIRST_LOOP_ID)) && (mb[2] == 6 || mb[2] == 7)) { @@ -775,7 +774,8 @@ qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt); break; case MBX_IOCB_TYPE: - if (IS_QLA23XX(ha)) { + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && + !IS_QLA6312(ha) && !IS_QLA6322(ha)) { if (pkt->sys_define == SOURCE_ASYNC_IOCB) { qla2x00_process_iodesc(ha, (struct mbx_entry *)pkt); diff -Nru a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c --- a/drivers/scsi/qla2xxx/qla_mbx.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/qla2xxx/qla_mbx.c Tue Feb 17 20:00:07 2004 @@ -21,33 +21,6 @@ #include "qla_def.h" -/* - * Local Function Prototypes. - */ -static void -qla2x00_mbx_sem_timeout(unsigned long); - -static int -qla2x00_get_mbx_access(scsi_qla_host_t *, uint32_t); - -static int -qla2x00_release_mbx_access(scsi_qla_host_t *, uint32_t); - -static int -qla2x00_mbx_q_add(scsi_qla_host_t *, mbx_cmdq_t **); - -static void -qla2x00_mbx_q_get(scsi_qla_host_t *, mbx_cmdq_t **); - -static void -qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *, mbx_cmdq_t **); - -static void -qla2x00_mbx_q_memb_free(scsi_qla_host_t *, mbx_cmdq_t *); - -/***************************/ -/* Function implementation */ -/***************************/ static void qla2x00_mbx_sem_timeout(unsigned long data) @@ -64,281 +37,6 @@ } /* - * tov = timeout value in seconds - */ -static int -qla2x00_get_mbx_access(scsi_qla_host_t *ha, uint32_t tov) -{ - int ret; - int prev_val = 1; /* assume no access yet */ - mbx_cmdq_t *ptmp_mbq; - struct timer_list tmp_cmd_timer; - unsigned long cpu_flags; - - - DEBUG11(printk("qla2x00_get_mbx_access(%ld): entered.\n", - ha->host_no);) - - while (1) { - if (test_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags) == 0) { - - DEBUG11(printk("qla2x00_get_mbx_access(%ld): going " - " to test access flags.\n", ha->host_no);) - - /* No one else is waiting. Go ahead and try to - * get access. - */ - if ((prev_val = test_and_set_bit(MBX_CMD_ACTIVE, - &ha->mbx_cmd_flags)) == 0) { - break; - } - } - - /* wait for previous command to finish */ - DEBUG(printk("qla2x00_get_mbx_access(%ld): access " - "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", - ha->host_no, ha->mbx_cmd_flags, jiffies);) - - DEBUG11(printk("qla2x00_get_mbx_access(%ld): access " - "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", - ha->host_no, ha->mbx_cmd_flags, jiffies);) - - /* - * Init timer and get semaphore from mbx q. After we got valid - * semaphore pointer the MBX_CMD_WANT flag would also had - * been set. - */ - qla2x00_mbx_q_add(ha, &ptmp_mbq); - - if (ptmp_mbq == NULL) { - /* queue full? problem? can't proceed. */ - DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): ERROR " - "no more mbx_q allowed. exiting.\n", ha->host_no);) - - break; - } - - /* init timer and semaphore */ - init_timer(&tmp_cmd_timer); - tmp_cmd_timer.data = (unsigned long)&ptmp_mbq->cmd_sem; - tmp_cmd_timer.function = - (void (*)(unsigned long))qla2x00_mbx_sem_timeout; - tmp_cmd_timer.expires = jiffies + tov * HZ; - - DEBUG11(printk("get_mbx_access(%ld): adding timer. " - "curr time=0x%lx timeoutval=0x%lx.\n", - ha->host_no, jiffies, tmp_cmd_timer.expires);) - - /* wait. */ -/* add_timer(&tmp_cmd_timer);*/ - DEBUG11(printk("get_mbx_access(%ld): going to sleep. " - "current time=0x%lx.\n", ha->host_no, jiffies);) - - down_interruptible(&ptmp_mbq->cmd_sem); - - DEBUG11(printk("get_mbx_access(%ld): woke up. current " - "time=0x%lx.\n", - ha->host_no, jiffies);) - -/* del_timer(&tmp_cmd_timer);*/ - - /* try to get lock again. we'll test later to see - * if we actually got the lock. - */ - prev_val = test_and_set_bit(MBX_CMD_ACTIVE, - &ha->mbx_cmd_flags); - - /* - * After we tried to get access then we check to see - * if we need to clear the MBX_CMD_WANT flag. Don't clear - * this flag before trying to get access or else another - * new thread might grab it before we did. - */ - spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); - if (ha->mbx_q_head == NULL) { - /* We're the last thread in queue. */ - clear_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags); - } - qla2x00_mbx_q_memb_free(ha, ptmp_mbq); - spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); - - break; - } - - if (prev_val == 0) { - /* We got the lock */ - DEBUG11(printk("qla2x00_get_mbx_access(%ld): success.\n", - ha->host_no);) - - ret = QLA_SUCCESS; - } else { - /* Timeout or resource error. */ - DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): timed out.\n", - ha->host_no);) - - ret = QLA_FUNCTION_TIMEOUT; - } - - return ret; -} - -static int -qla2x00_release_mbx_access(scsi_qla_host_t *ha, uint32_t tov) -{ - mbx_cmdq_t *next_thread; - - DEBUG11(printk("qla2x00_release_mbx_access:(%ld): entered.\n", - ha->host_no);) - - clear_bit(MBX_CMD_ACTIVE, &ha->mbx_cmd_flags); - - /* Wake up one pending mailbox cmd thread in queue. */ - qla2x00_mbx_q_get(ha, &next_thread); - if (next_thread) { - DEBUG11(printk("qla2x00_release_mbx_access: found pending " - "mbx cmd. Waking up sem in %p.\n", &next_thread);) - up(&next_thread->cmd_sem); - } - - DEBUG11(printk("qla2x00_release_mbx_access:(%ld): exiting.\n", - ha->host_no);) - - return QLA_SUCCESS; -} - -/* Allocates a mbx_cmdq_t struct and add to the mbx_q list. */ -static int -qla2x00_mbx_q_add(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) -{ - int ret; - unsigned long cpu_flags; - mbx_cmdq_t *ptmp = NULL; - - spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); - - DEBUG11(printk("qla2x00_mbx_q_add: got mbx_q spinlock. " - "Inst=%d.\n", apiHBAInstance);) - - qla2x00_mbx_q_memb_alloc(ha, &ptmp); - if (ptmp == NULL) { - /* can't add any more threads */ - DEBUG2_3_11(printk("qla2x00_mbx_q_add: ERROR no more " - "ioctl threads allowed. Inst=%d.\n", apiHBAInstance);) - - ret = QLA_MEMORY_ALLOC_FAILED; - } else { - if (ha->mbx_q_tail == NULL) { - /* First thread to queue. */ - set_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags); - - ha->mbx_q_head = ptmp; - } else { - ha->mbx_q_tail->pnext = ptmp; - } - ha->mbx_q_tail = ptmp; - - /* Now init the semaphore */ - init_MUTEX_LOCKED(&ptmp->cmd_sem); - ret = QLA_SUCCESS; - } - - *ret_mbq = ptmp; - - DEBUG11(printk("qla2x00_mbx_q_add: going to release spinlock. " - "ret_mbq=%p, ret=%d. Inst=%d.\n", *ret_mbq, ret, apiHBAInstance);) - - spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); - - return ret; -} - -/* Just remove and return first member from mbx_cmdq. Don't free anything. */ -static void -qla2x00_mbx_q_get(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) -{ - unsigned long cpu_flags; - - spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); - - DEBUG11(printk("qla2x00_mbx_q_get: got mbx_q spinlock. " - "Inst=%d.\n", apiHBAInstance);) - - /* Remove from head */ - *ret_mbq = ha->mbx_q_head; - if (ha->mbx_q_head != NULL) { - ha->mbx_q_head = ha->mbx_q_head->pnext; - if (ha->mbx_q_head == NULL) { - /* That's the last one in queue. */ - ha->mbx_q_tail = NULL; - } - (*ret_mbq)->pnext = NULL; - } - - DEBUG11(printk("qla2x00_mbx_q_remove: return ret_mbq=%p. Going to " - "release spinlock. Inst=%d.\n", *ret_mbq, apiHBAInstance);) - - spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); -} - -/* Find a free mbx_q member from the array. Must already got the - * mbx_q_lock spinlock. - */ -static void -qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbx_q_memb) -{ - mbx_cmdq_t *ptmp = NULL; - - DEBUG11(printk("qla2x00_mbx_q_memb_alloc: entered. " - "Inst=%d.\n", apiHBAInstance);) - - ptmp = ha->mbx_sem_pool_head; - if (ptmp != NULL) { - ha->mbx_sem_pool_head = ptmp->pnext; - ptmp->pnext = NULL; - if (ha->mbx_sem_pool_head == NULL) { - ha->mbx_sem_pool_tail = NULL; - } - } else { - /* We ran out of pre-allocated semaphores. Try to allocate - * a new one. - */ - ptmp = kmalloc(sizeof(mbx_cmdq_t), GFP_ATOMIC); - if(ptmp) - memset(ptmp, 0, sizeof(mbx_cmdq_t)); - } - - *ret_mbx_q_memb = ptmp; - - DEBUG11(printk("qla2x00_mbx_q_memb_alloc: return waitq_memb=%p. " - "Inst=%d.\n", *ret_mbx_q_memb, apiHBAInstance);) -} - -/* Add the specified mbx_q member back to the free semaphore pool. Must - * already got the mbx_q_lock spinlock. - */ -static void -qla2x00_mbx_q_memb_free(scsi_qla_host_t *ha, mbx_cmdq_t *pfree_mbx_q_memb) -{ - DEBUG11(printk("qla2x00_mbx_q_memb_free: entered. Inst=%d.\n", - apiHBAInstance);) - - if (pfree_mbx_q_memb != NULL) { - if (ha->mbx_sem_pool_tail != NULL) { - /* Add to tail */ - ha->mbx_sem_pool_tail->pnext = pfree_mbx_q_memb; - } else { - ha->mbx_sem_pool_head = pfree_mbx_q_memb; - } - ha->mbx_sem_pool_tail = pfree_mbx_q_memb; - } - - /* put it back to the free pool. */ - - DEBUG11(printk("qla2x00_mbx_q_memb_free: exiting. " - "Inst=%d.\n", apiHBAInstance);) -} - -/* * qla2x00_mailbox_command * Issue mailbox command and waits for completion. * @@ -366,7 +64,6 @@ struct timer_list tmp_intr_timer; uint8_t abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); uint8_t io_lock_on = ha->flags.init_done; - uint8_t tmp_stat = 0; uint16_t command; uint16_t *iptr, *optr; uint32_t cnt; @@ -384,8 +81,7 @@ * during non ISP abort time. */ if (!abort_active) { - tmp_stat = qla2x00_get_mbx_access(ha, mcp->tov); - if (tmp_stat != QLA_SUCCESS) { + if (qla2x00_down_timeout(&ha->mbx_cmd_sem, mcp->tov * HZ)) { /* Timeout occurred. Return error. */ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd " "access timeout. Exiting.\n", ha->host_no);) @@ -611,12 +307,8 @@ } /* Allow next mbx cmd to come in. */ - if (!abort_active) { - tmp_stat = qla2x00_release_mbx_access(ha, mcp->tov); - - if (rval == 0) - rval = tmp_stat; - } + if (!abort_active) + up(&ha->mbx_cmd_sem); if (rval) { DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. " @@ -815,7 +507,7 @@ mcp->mb[0] = MBC_EXECUTE_FIRMWARE; mcp->mb[1] = *ha->brd_info->fw_info[0].fwstart; mcp->out_mb = MBX_1|MBX_0; - if (IS_QLA2322(ha)) { + if (IS_QLA2322(ha) || IS_QLA6322(ha)) { mcp->mb[2] = 0; mcp->out_mb |= MBX_2; } @@ -1234,8 +926,6 @@ mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - ENTER("qla2x00_issue_iocb: started"); - mcp->mb[0] = MBC_IOCB_COMMAND_A64; mcp->mb[1] = 0; mcp->mb[2] = MSW(phys_addr); @@ -1256,7 +946,6 @@ ha->host_no,rval);) } else { /*EMPTY*/ - LEAVE("qla2x00_issue_iocb: exiting normally"); } return rval; @@ -2408,32 +2097,6 @@ return rval; } -#if 0 /* not yet needed */ -int -qla2x00_dump_ram(scsi_qla_host_t *ha, uint32_t risc_address, - dma_addr_t ispdump_dma, uint32_t size) -{ - int rval; - mbx_cmd_t mc; - mbx_cmd_t *mcp = &mc; - - mcp->mb[0] = MBC_DUMP_RAM; - mcp->mb[1] = risc_address & 0xffff; - mcp->mb[2] = MSW(ispdump_dma); - mcp->mb[3] = LSW(ispdump_dma); - mcp->mb[4] = 0; - mcp->mb[6] = MSW(MSD(ispdump_dma)); - mcp->mb[7] = LSW(MSD(ispdump_dma)); - mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; - mcp->in_mb = MBX_0; - mcp->tov = 30; - mcp->flags = 0; - rval = qla2x00_mailbox_command(ha, mcp); - - return rval; -} -#endif - /* * qla2x00_lun_reset * Issue lun reset mailbox command. @@ -2458,8 +2121,6 @@ mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - ENTER("qla2x00_lun_reset"); - mcp->mb[0] = MBC_LUN_RESET; if (HAS_EXTENDED_IDS(ha)) mcp->mb[1] = loop_id; @@ -2478,7 +2139,6 @@ (int)ha->instance, rval); } else { /*EMPTY*/ - LEAVE("qla2x00_lun_reset: exiting normally"); } return rval; diff -Nru a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c --- a/drivers/scsi/qla2xxx/qla_os.c Tue Feb 17 20:00:08 2004 +++ b/drivers/scsi/qla2xxx/qla_os.c Tue Feb 17 20:00:08 2004 @@ -138,7 +138,6 @@ * SCSI host template entry points */ static int qla2xxx_slave_configure(struct scsi_device * device); -extern int qla2x00_ioctl(struct scsi_device *, int , void *); static int qla2xxx_eh_abort(struct scsi_cmnd *); static int qla2xxx_eh_device_reset(struct scsi_cmnd *); static int qla2xxx_eh_bus_reset(struct scsi_cmnd *); @@ -357,8 +356,6 @@ int got_sense; unsigned long cpu_flags = 0; - ENTER(__func__); - cmd->host_scribble = (unsigned char *) NULL; vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata; @@ -404,8 +401,6 @@ /* Call the mid-level driver interrupt handler */ (*(cmd)->scsi_done)(cmd); - - LEAVE(__func__); } static inline void @@ -648,6 +643,11 @@ ha->fw_minor_version, ha->fw_subminor_version); + if (ha->fw_attributes & BIT_9) { + strcat(str, "FLX"); + return (str); + } + switch (ha->fw_attributes & 0xFF) { case 0x7: strcat(str, "EF"); @@ -910,8 +910,6 @@ u_long cpu_flags = 0; u_long max_wait_time = ABORT_WAIT_TIME; - ENTER(__func__); - do { /* Check on done queue */ if (!found) { @@ -958,8 +956,6 @@ done++; } - LEAVE(__func__); - return (done); } @@ -983,14 +979,17 @@ static inline int qla2x00_wait_for_hba_online(scsi_qla_host_t *ha) { - int return_status ; + int return_status; + unsigned long wait_online; - while ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || + wait_online = jiffies + (MAX_LOOP_TIMEOUT * HZ); + while (((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || - test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) { + test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) && + time_before(jiffies, wait_online)) { set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(3 * HZ); + schedule_timeout(HZ); } if (ha->flags.online == TRUE) return_status = QLA_SUCCESS; @@ -1033,7 +1032,7 @@ test_bit(CFG_ACTIVE, &ha->cfg_flags) || atomic_read(&ha->loop_state) != LOOP_READY) { set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(3 * HZ); + schedule_timeout(HZ); if (time_after_eq(jiffies, loop_timeout)) { return_status = QLA_FUNCTION_FAILED; break; @@ -1072,9 +1071,6 @@ unsigned int b, t, l; unsigned long flags; - - ENTER(__func__); - /* Get the SCSI request ptr */ sp = (srb_t *) CMD_SP(cmd); @@ -1123,11 +1119,10 @@ } DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, " - "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx\n", + "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx q->flag=%lx\n", ha->host_no, cmd, sp, jiffies, cmd->timeout_per_command / HZ, - ha->dpc_flags, vis_ha->dpc_flags)); + ha->dpc_flags, vis_ha->dpc_flags, q->q_flag)); DEBUG2(qla2x00_print_scsi_cmd(cmd)); - DEBUG2(qla2x00_print_q_info(q);) spin_unlock_irq(ha->host->host_lock); /* Blocking call-Does context switching if abort isp is active etc */ @@ -1200,6 +1195,7 @@ } spin_unlock_irqrestore(&ha->list_lock, flags); + /* * Our SP pointer points at the command we want to remove from the * pending queue providing we haven't already sent it to the adapter. @@ -1250,11 +1246,10 @@ continue; DEBUG2(printk("qla2xxx_eh_abort(%ld): aborting sp %p " - "from RISC. pid=%ld sp->state=%x\n", + "from RISC. pid=%ld sp->state=%x q->q_flag=%lx\n", ha->host_no, sp, sp->cmd->serial_number, - sp->state);) + sp->state, q->q_flag);) DEBUG(qla2x00_print_scsi_cmd(cmd);) - DEBUG(qla2x00_print_q_info(q);) /* Get a reference to the sp and drop the lock.*/ sp_get(ha, sp); @@ -1303,8 +1298,6 @@ DEBUG2(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n", return_status)); - LEAVE("qla2xxx_eh_abort"); - return(return_status); } @@ -1417,10 +1410,6 @@ } fcport_to_reset = lq->fclun->fcport; -#if STOP_ON_RESET - qla2x00_panic(__func__, ha->host); -#endif - qla_printk(KERN_INFO, ha, "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", ha->host_no, b, t, l); @@ -1570,18 +1559,9 @@ srb_t *sp; int rval = FAILED; - - ENTER("qla2xxx_eh_bus_reset"); - ha = (scsi_qla_host_t *) cmd->device->host->hostdata; sp = (srb_t *) CMD_SP(cmd); -#if STOP_ON_RESET - printk("Resetting the Bus= 0x%x\n", (int)cmd); - qla2x00_print_scsi_cmd(cmd); - qla2x00_panic("qla2100_reset", ha->host); -#endif - qla_printk(KERN_INFO, ha, "scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n", ha->host_no, cmd->device->channel, cmd->device->id, cmd->device->lun); @@ -1618,7 +1598,6 @@ qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__, (rval == FAILED) ? "failed" : "succeded"); - LEAVE("qla2xxx_eh_bus_reset"); return rval; } @@ -1643,18 +1622,10 @@ scsi_qla_host_t *ha = (scsi_qla_host_t *)cmd->device->host->hostdata; int rval = SUCCESS; - ENTER("qla2xxx_eh_host_reset"); - /* Display which one we're actually resetting for debug. */ DEBUG(printk("qla2xxx_eh_host_reset:Resetting scsi(%ld).\n", ha->host_no)); -#if STOP_ON_RESET - qla_printk(KERN_INFO, ha, "Host Reset... Command=\n"); - qla2x00_print_scsi_cmd(cmd); - qla2x00_panic("qla2xxx_eh_host_reset", ha->host); -#endif - /* * Now issue reset. */ @@ -1702,7 +1673,6 @@ qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__, (rval == FAILED) ? "failed" : "succeded"); - LEAVE("qla2xxx_eh_host_reset"); return rval; board_disabled: @@ -1730,8 +1700,6 @@ uint16_t t; os_tgt_t *tq; - ENTER(__func__); - if (ha->flags.enable_lip_reset) { status = qla2x00_lip_reset(ha); } @@ -1774,8 +1742,6 @@ ha->host_no);) } - LEAVE(__func__); - return(status); } @@ -1888,15 +1854,29 @@ unsigned long pio, pio_len, pio_flags; unsigned long mmio, mmio_len, mmio_flags; + /* We only need PIO for Flash operations on ISP2312 v2 chips. */ pio = pci_resource_start(ha->pdev, 0); pio_len = pci_resource_len(ha->pdev, 0); pio_flags = pci_resource_flags(ha->pdev, 0); + if (pio_flags & IORESOURCE_IO) { + if (pio_len < MIN_IOBASE_LEN) { + qla_printk(KERN_WARNING, ha, + "Invalid PCI I/O region size (%s)...\n", + ha->pdev->slot_name); + pio = 0; + } + } else { + qla_printk(KERN_WARNING, ha, + "region #0 not a PIO resource (%s)...\n", + ha->pdev->slot_name); + pio = 0; + } + /* Use MMIO operations for all accesses. */ mmio = pci_resource_start(ha->pdev, 1); mmio_len = pci_resource_len(ha->pdev, 1); mmio_flags = pci_resource_flags(ha->pdev, 1); -#if MEMORY_MAPPED_IO if (!(mmio_flags & IORESOURCE_MEM)) { qla_printk(KERN_ERR, ha, "region #0 not an MMIO resource (%s), aborting\n", @@ -1909,20 +1889,6 @@ ha->pdev->slot_name); goto iospace_error_exit; } -#else - if (!(pio_flags & IORESOURCE_IO)) { - qla_printk(KERN_ERR, ha, - "region #0 not a PIO resource (%s), aborting\n", - ha->pdev->slot_name); - goto iospace_error_exit; - } - if (pio_len < MIN_IOBASE_LEN) { - qla_printk(KERN_ERR, ha, - "Invalid PCI I/O region size (%s), aborting\n", - ha->pdev->slot_name); - goto iospace_error_exit; - } -#endif if (pci_request_regions(ha->pdev, ha->brd_info->drv_name)) { qla_printk(KERN_WARNING, ha, @@ -1932,12 +1898,8 @@ goto iospace_error_exit; } - /* Assume PIO */ - ha->iobase = (device_reg_t *) pio; ha->pio_address = pio; ha->pio_length = pio_len; - ha->mmio_address = NULL; -#if MEMORY_MAPPED_IO ha->mmio_address = ioremap(mmio, MIN_IOBASE_LEN); if (!ha->mmio_address) { qla_printk(KERN_ERR, ha, @@ -1945,9 +1907,8 @@ goto iospace_error_exit; } - ha->iobase = (device_reg_t *) ha->mmio_address; ha->mmio_length = mmio_len; -#endif + ha->iobase = (device_reg_t *) ha->mmio_address; return (0); @@ -2038,6 +1999,7 @@ /* load the F/W, read paramaters, and init the H/W */ ha->instance = num_hosts; + init_MUTEX(&ha->mbx_cmd_sem); init_MUTEX_LOCKED(&ha->mbx_intr_sem); INIT_LIST_HEAD(&ha->list); @@ -2054,9 +2016,7 @@ * higher level "host_lock" will reduce most * contention for these locks. */ - spin_lock_init(&ha->mbx_bits_lock); spin_lock_init(&ha->mbx_reg_lock); - spin_lock_init(&ha->mbx_q_lock); spin_lock_init(&ha->list_lock); init_completion(&ha->dpc_inited); @@ -2130,16 +2090,17 @@ WRT_REG_WORD(®->hccr, HCCR_CLR_HOST_INT); /* Enable proper parity */ - if (IS_QLA23XX(ha)) { - if (IS_QLA2312(ha) || IS_QLA2322(ha)) - /* SRAM, Instruction RAM and GP RAM parity */ - WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x7)); - else + if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) { + if (IS_QLA2300(ha)) /* SRAM parity */ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x1)); + else + /* SRAM, Instruction RAM and GP RAM parity */ + WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x7)); } spin_unlock_irqrestore(&ha->hardware_lock, flags); + /* Enable chip interrupts. */ qla2x00_enable_intrs(ha); @@ -2181,7 +2142,7 @@ sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); qla_printk(KERN_INFO, ha, "\n" - " QLogic ISP2xxx PCI/PCI-X Fibre Channel HBA Driver: %s\n" + " QLogic Fibre Channel HBA Driver: %s\n" " QLogic %s - %s\n" " %s: %s @ %s hdma%c, host#=%ld, fw=%s\n", qla2x00_version_str, ha->model_number, ha->model_desc ? ha->model_desc: "", @@ -2233,7 +2194,7 @@ int ret; /* Abort any outstanding IO descriptors. */ - if (IS_QLA23XX(ha)) + if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) qla2x00_cancel_io_descriptors(ha); /* turn-off interrupts on the card */ @@ -2261,6 +2222,7 @@ qla2x00_mem_free(ha); + ha->flags.online = FALSE; /* Detach interrupts */ @@ -2420,8 +2382,9 @@ ha->brd_info->isp_name, ('A' + tmp_sn/100000), (tmp_sn%100000)); copy_info(&info, - "Request Queue = 0x%p, Response Queue = 0x%p\n", - (void *)ha->request_dma, (void *)ha->response_dma); + "Request Queue = 0x%llx, Response Queue = 0x%llx\n", + (unsigned long long)ha->request_dma, + (unsigned long long)ha->response_dma); copy_info(&info, "Request Queue count = %ld, Response Queue count = %ld\n", @@ -2461,6 +2424,7 @@ ha->qthreads, ha->retry_q_cnt, ha->done_q_cnt, ha->scsi_retry_q_cnt); + flags = (unsigned long *) &ha->flags; if (atomic_read(&ha->loop_state) == LOOP_DOWN) { @@ -2499,8 +2463,8 @@ ha->dropped_frame_error_cnt); copy_info(&info, - "Info -- pci=%x xchgs=0x%x iocbs=0x%x\n", ha->pci_attr, - ha->xchg_buf_cnt, ha->iocb_buf_cnt); + "Product ID = %04x %04x %04x %04x\n", ha->product_id[0], + ha->product_id[1], ha->product_id[2], ha->product_id[3]); copy_info(&info, "\n"); @@ -2540,13 +2504,14 @@ continue; copy_info(&info, - "scsi-qla%d-target-%d=" - "%02x%02x%02x%02x%02x%02x%02x%02x;\n", - (int)ha->instance, i, - tq->port_name[0], tq->port_name[1], - tq->port_name[2], tq->port_name[3], - tq->port_name[4], tq->port_name[5], - tq->port_name[6], tq->port_name[7]); + "scsi-qla%d-target-%d=" + "%02x%02x%02x%02x%02x%02x%02x%02x;\n", + (int)ha->instance, i, + tq->port_name[0], tq->port_name[1], + tq->port_name[2], tq->port_name[3], + tq->port_name[4], tq->port_name[5], + tq->port_name[6], tq->port_name[7]); + } /* 2.25 node/port display to proc */ copy_info(&info, "\nSCSI LUN Information:\n"); @@ -2880,13 +2845,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) { uint8_t status = 1; - uint8_t i; int retry= 10; - mbx_cmdq_t *ptmp; - mbx_cmdq_t *tmp_q_head; - mbx_cmdq_t *tmp_q_tail; - - ENTER(__func__); do { /* @@ -2962,73 +2921,59 @@ continue; } - /* - * Allocate an initial list of mailbox semaphore queue to be - * used for serialization of the mailbox commands. - */ - tmp_q_head = kmalloc(sizeof(mbx_cmdq_t), GFP_KERNEL); - if (tmp_q_head == NULL) { - /* error */ - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - mbx_cmd_q"); + /* Allocate memory for SNS commands */ + if (IS_QLA2200(ha)) { + /* Get consistent memory allocated for SNS commands */ + ha->sns_cmd = pci_alloc_consistent(ha->pdev, + sizeof(struct sns_cmd_pkt), &ha->sns_cmd_dma); + if (ha->sns_cmd == NULL) { + /* error */ + qla_printk(KERN_WARNING, ha, + "Memory Allocation failed - sns_cmd\n"); - qla2x00_mem_free(ha); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); + qla2x00_mem_free(ha); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/10); - continue; - } - memset(tmp_q_head, 0, sizeof(mbx_cmdq_t)); - ha->mbx_sem_pool_head = tmp_q_head; - tmp_q_tail = tmp_q_head; - - /* Now try to allocate more */ - for (i = 1; i < MBQ_INIT_LEN; i++) { - ptmp = kmalloc(sizeof(mbx_cmdq_t), GFP_KERNEL); - if (ptmp == NULL) { - /* - * Error. Just exit. If more is needed later - * they will be allocated at that time. - */ - break; + continue; } - memset(ptmp, 0, sizeof(mbx_cmdq_t)); - tmp_q_tail->pnext = ptmp; - tmp_q_tail = ptmp; - } - ha->mbx_sem_pool_tail = tmp_q_tail; - - /* Get consistent memory allocated for MS IOCB */ - ha->ms_iocb = pci_alloc_consistent(ha->pdev, - sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma); - if (ha->ms_iocb == NULL) { - /* error */ - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - ms_iocb\n"); + memset(ha->sns_cmd, 0, sizeof(struct sns_cmd_pkt)); + } else if (!IS_QLA2100(ha)) { + /* Get consistent memory allocated for MS IOCB */ + ha->ms_iocb = pci_alloc_consistent(ha->pdev, + sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma); + if (ha->ms_iocb == NULL) { + /* error */ + qla_printk(KERN_WARNING, ha, + "Memory Allocation failed - ms_iocb\n"); - qla2x00_mem_free(ha); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); + qla2x00_mem_free(ha); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/10); - continue; - } - memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t)); + continue; + } + memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t)); - /* Get consistent memory allocated for CT SNS commands */ - ha->ct_sns = pci_alloc_consistent(ha->pdev, - sizeof(struct ct_sns_pkt), &ha->ct_sns_dma); - if (ha->ct_sns == NULL) { - /* error */ - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - ct_sns\n"); + /* + * Get consistent memory allocated for CT SNS + * commands + */ + ha->ct_sns = pci_alloc_consistent(ha->pdev, + sizeof(struct ct_sns_pkt), &ha->ct_sns_dma); + if (ha->ct_sns == NULL) { + /* error */ + qla_printk(KERN_WARNING, ha, + "Memory Allocation failed - ct_sns\n"); - qla2x00_mem_free(ha); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/10); + qla2x00_mem_free(ha); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/10); - continue; + continue; + } + memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); } - memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); /* Get consistent memory allocated for Get Port Database cmd */ ha->iodesc_pd = pci_alloc_consistent(ha->pdev, @@ -3056,8 +3001,6 @@ "%s(): **** FAILED ****\n", __func__); } - LEAVE(__func__); - return(status); } @@ -3076,12 +3019,8 @@ fc_port_t *fcport; struct list_head *fcll, *fcltemp; fc_lun_t *fclun; - mbx_cmdq_t *ptmp; - mbx_cmdq_t *tmp_q_head; unsigned long wtime;/* max wait time if mbx cmd is busy. */ - ENTER(__func__); - if (ha == NULL) { /* error */ DEBUG2(printk("%s(): ERROR invalid ha pointer.\n", __func__)); @@ -3095,20 +3034,11 @@ /* Make sure all other threads are stopped. */ wtime = 60 * HZ; - while ((ha->dpc_wait != NULL || ha->mbx_q_head != NULL) && wtime) { + while (ha->dpc_wait && wtime) { set_current_state(TASK_INTERRUPTIBLE); wtime = schedule_timeout(wtime); } - /* Now free the mbx sem pool */ - tmp_q_head = ha->mbx_sem_pool_head; - while (tmp_q_head != NULL) { - ptmp = tmp_q_head->pnext; - kfree(tmp_q_head); - tmp_q_head = ptmp; - } - ha->mbx_sem_pool_head = NULL; - /* free ioctl memory */ qla2x00_free_ioctl_mem(ha); @@ -3119,6 +3049,12 @@ pci_free_consistent(ha->pdev, PORT_DATABASE_SIZE, ha->iodesc_pd, ha->iodesc_pd_dma); } + + if (ha->sns_cmd) { + pci_free_consistent(ha->pdev, + sizeof(struct sns_cmd_pkt), ha->sns_cmd, ha->sns_cmd_dma); + } + if (ha->ct_sns) { pci_free_consistent(ha->pdev, sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma); @@ -3183,8 +3119,6 @@ ha->fw_dump_reading = 0; ha->fw_dump_buffer = NULL; } - - LEAVE(__func__); } /* @@ -3519,6 +3453,7 @@ ha->host_no)); } + if (test_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags)) { DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n", ha->host_no)); @@ -3591,8 +3526,6 @@ struct list_head *list, *temp; unsigned long flags; - ENTER(__func__); - clear_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); /* Return all commands device queues. */ @@ -3612,8 +3545,6 @@ __add_to_done_queue(ha, sp); } spin_unlock_irqrestore(&ha->list_lock, flags); - - LEAVE(__func__); } /* @@ -3626,8 +3557,6 @@ static void qla2x00_rst_aen(scsi_qla_host_t *ha) { - ENTER(__func__); - if (ha->flags.online && !ha->flags.reset_active && !atomic_read(&ha->loop_down_timer) && !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { @@ -3646,8 +3575,6 @@ /* 10/15 ha->flags.reset_active = FALSE; */ } - - LEAVE(__func__); } @@ -3692,8 +3619,6 @@ unsigned long cpu_flags = 0; device_reg_t *reg = ha->iobase; - ENTER(__func__); - /* Save the Original GPIOE */ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); gpio_enable = RD_REG_WORD(®->gpioe); @@ -3737,8 +3662,6 @@ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); WRT_REG_WORD(®->gpiod,gpio_data); spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); - - LEAVE(__func__); } /************************************************************************** @@ -3777,9 +3700,10 @@ } /* Check if beacon LED needs to be blinked */ - if (IS_QLA23XX(ha) && ha->beacon_blink_led) + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && ha->beacon_blink_led) qla2x00_blink_led(ha); + /* * Ports - Port down timer. * @@ -3889,6 +3813,13 @@ set_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); start_dpc++; + if (!(ha->device_flags & DFLG_NO_CABLE)) { + DEBUG(printk("scsi(%ld): Loop down - " + "aborting ISP.\n", + ha->host_no)); + + set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); + } } DEBUG3(printk("scsi(%ld): Loop Down - seconds remainning %d\n", ha->host_no, @@ -3902,6 +3833,7 @@ if (!list_empty(&ha->done_queue)) qla2x00_done(ha); + /* Schedule the DPC routine if needed */ if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || @@ -4034,14 +3966,13 @@ __del_from_retry_queue(dest_ha, sp); } else if ((sp->state == SRB_SCSI_RETRY_STATE)) { __del_from_scsi_retry_queue(dest_ha, sp); - } + } /* * If FC_DEVICE is marked as dead return the cmd with * DID_NO_CONNECT status. Otherwise set the host_byte to * DID_BUS_BUSY to let the OS retry this cmd. */ - if ((atomic_read(&fcport->state) == FCS_DEVICE_DEAD) || atomic_read(&dest_ha->loop_state) == LOOP_DEAD) { qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT); @@ -4172,6 +4103,7 @@ } } + switch (host_byte(cmd->result)) { case DID_OK: case DID_ERROR: @@ -4393,7 +4325,7 @@ } } - if (IS_QLA23XX(vis_ha)) { + if (!IS_QLA2100(vis_ha) && !IS_QLA2200(vis_ha)) { /* Process response_queue if ZIO support is enabled*/ qla2x00_process_response_queue_in_zio_mode(vis_ha); @@ -4401,56 +4333,6 @@ } -/* - * qla2x00_reset_lun_fo_counts - * Reset failover retry counts - * - * Input: - * ha = adapter block pointer. - * - * Context: - * Interrupt context. - */ -void -qla2x00_reset_lun_fo_counts(scsi_qla_host_t *ha, os_lun_t *lq) -{ - srb_t *tsp; - os_lun_t *orig_lq; - struct list_head *list; - unsigned long flags ; - - spin_lock_irqsave(&ha->list_lock, flags); - /* - * the pending queue. - */ - list_for_each(list,&ha->pending_queue) { - tsp = list_entry(list, srb_t, list); - orig_lq = tsp->lun_queue; - if (orig_lq == lq) - tsp->fo_retry_cnt = 0; - } - /* - * the retry queue. - */ - list_for_each(list,&ha->retry_queue) { - tsp = list_entry(list, srb_t, list); - orig_lq = tsp->lun_queue; - if (orig_lq == lq) - tsp->fo_retry_cnt = 0; - } - - /* - * the done queue. - */ - list_for_each(list, &ha->done_queue) { - tsp = list_entry(list, srb_t, list); - orig_lq = tsp->lun_queue; - if (orig_lq == lq) - tsp->fo_retry_cnt = 0; - } - spin_unlock_irqrestore(&ha->list_lock, flags); -} - /************************************************************************** * qla2x00_check_tgt_status * @@ -4549,6 +4431,23 @@ return (QLA_SUCCESS); } +/* XXX(hch): crude hack to emulate a down_timeout() */ +int +qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) +{ + const unsigned int step = HZ/10; + + do { + if (!down_trylock(sema)) + return 0; + set_current_state(TASK_INTERRUPTIBLE); + if (schedule_timeout(step)) + break; + } while ((timeout -= step) > 0); + + return -ETIMEDOUT; +} + /** * qla2x00_module_init - Module initialization. **/ @@ -4560,6 +4459,7 @@ #if DEBUG_QLA2100 strcat(qla2x00_version_str, "-debug"); #endif + /* Allocate cache for SRBs. */ sprintf(srb_cachep_name, "qla2xxx_srbs"); srb_cachep = kmem_cache_create(srb_cachep_name, sizeof(srb_t), 0, @@ -4571,8 +4471,7 @@ } printk(KERN_INFO - "QLogic ISP2xxx PCI/PCI-X Fibre Channel HBA Driver (%p)\n", - qla2x00_set_info); + "QLogic Fibre Channel HBA Driver (%p)\n", qla2x00_set_info); return 0; } @@ -4598,5 +4497,5 @@ module_exit(qla2x00_module_exit); MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP2xxx FC-SCSI Host Bus Adapter driver"); +MODULE_DESCRIPTION("QLogic Fibre Channel HBA Driver"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/qla2xxx/qla_settings.h b/drivers/scsi/qla2xxx/qla_settings.h --- a/drivers/scsi/qla2xxx/qla_settings.h Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/qla2xxx/qla_settings.h Tue Feb 17 20:00:06 2004 @@ -22,8 +22,6 @@ */ #define DEBUG_QLA2100 0 /* For Debug of qla2x00 */ -#define MEMORY_MAPPED_IO 1 -#define STOP_ON_ERROR 0 /* Stop on aborts and resets */ #define STOP_ON_RESET 0 #define USE_ABORT_TGT 1 /* Use Abort Target mbx cmd */ diff -Nru a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c --- a/drivers/scsi/qla2xxx/qla_sup.c Tue Feb 17 20:00:05 2004 +++ b/drivers/scsi/qla2xxx/qla_sup.c Tue Feb 17 20:00:05 2004 @@ -55,7 +55,7 @@ reg = ha->iobase; - if (IS_QLA2312(ha) || IS_QLA2322(ha)) { + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) { data = RD_REG_WORD(®->nvram); while (data & NVR_BUSY) { udelay(100); @@ -87,7 +87,7 @@ reg = ha->iobase; - if (IS_QLA2312(ha) || IS_QLA2322(ha)) + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) WRT_REG_WORD(®->u.isp2300.host_semaphore, 0); } @@ -296,6 +296,7 @@ data = RD_REG_WORD(®->ctrl_status); data |= CSR_FLASH_ENABLE; WRT_REG_WORD(®->ctrl_status, data); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ } /** @@ -311,6 +312,7 @@ data = RD_REG_WORD(®->ctrl_status); data &= ~(CSR_FLASH_ENABLE); WRT_REG_WORD(®->ctrl_status, data); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ } /** @@ -334,13 +336,30 @@ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { bank_select |= CSR_FLASH_64K_BANK; WRT_REG_WORD(®->ctrl_status, bank_select); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ } else if (((addr & BIT_16) == 0) && (bank_select & CSR_FLASH_64K_BANK)) { bank_select &= ~(CSR_FLASH_64K_BANK); WRT_REG_WORD(®->ctrl_status, bank_select); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ + } + + /* The ISP2312 v2 chip cannot access the FLASH registers via MMIO. */ + if (IS_QLA2312(ha) && ha->product_id[3] == 0x2 && ha->pio_address) { + uint16_t data2; + + reg = (device_reg_t *)ha->pio_address; + outw((uint16_t)addr, (unsigned long)(®->flash_address)); + do { + data = inw((unsigned long)(®->flash_data)); + barrier(); + cpu_relax(); + data2 = inw((unsigned long)(®->flash_data)); + } while (data != data2); + } else { + WRT_REG_WORD(®->flash_address, (uint16_t)addr); + data = qla2x00_debounce_register(®->flash_data); } - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - data = qla2x00_debounce_register(®->flash_data); return ((uint8_t)data); } @@ -362,13 +381,25 @@ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { bank_select |= CSR_FLASH_64K_BANK; WRT_REG_WORD(®->ctrl_status, bank_select); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ } else if (((addr & BIT_16) == 0) && (bank_select & CSR_FLASH_64K_BANK)) { bank_select &= ~(CSR_FLASH_64K_BANK); WRT_REG_WORD(®->ctrl_status, bank_select); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ + } + + /* The ISP2312 v2 chip cannot access the FLASH registers via MMIO. */ + if (IS_QLA2312(ha) && ha->product_id[3] == 0x2 && ha->pio_address) { + reg = (device_reg_t *)ha->pio_address; + outw((uint16_t)addr, (unsigned long)(®->flash_address)); + outw((uint16_t)data, (unsigned long)(®->flash_data)); + } else { + WRT_REG_WORD(®->flash_address, (uint16_t)addr); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ + WRT_REG_WORD(®->flash_data, (uint16_t)data); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ } - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - WRT_REG_WORD(®->flash_data, (uint16_t)data); } /** @@ -504,7 +535,9 @@ uint32_t loop_cnt = 1; /* this is for error exit only */ uint32_t pcir_adr; - ENTER(__func__); + /* The ISP2312 v2 chip cannot access the FLASH registers via MMIO. */ + if (IS_QLA2312(ha) && ha->product_id[3] == 0x2 && !ha->pio_address) + ret = QLA_FUNCTION_FAILED; qla2x00_flash_enable(ha); do { /* Loop once to provide quick error exit */ @@ -545,8 +578,6 @@ } while (--loop_cnt); qla2x00_flash_disable(ha); - LEAVE(__func__); - return (ret); } @@ -569,6 +600,7 @@ qla2x00_flash_enable(ha); WRT_REG_WORD(®->nvram, 0); + RD_REG_WORD(®->nvram); /* PCI Posting. */ for (addr = 0, data = image; addr < FLASH_IMAGE_SIZE; addr++, data++) { if (addr == midpoint) WRT_REG_WORD(®->nvram, NVR_SELECT); @@ -605,6 +637,7 @@ /* Reset ISP chip. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); + RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ qla2x00_flash_enable(ha); do { /* Loop once to provide quick error exit */ diff -Nru a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h --- a/drivers/scsi/qla2xxx/qla_version.h Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/qla2xxx/qla_version.h Tue Feb 17 20:00:06 2004 @@ -19,9 +19,9 @@ /* * Driver version */ -#define QLA2XXX_VERSION "8.00.00b8" +#define QLA2XXX_VERSION "8.00.00b10" #define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MINOR_VER 0 #define QLA_DRIVER_PATCH_VER 0 -#define QLA_DRIVER_BETA_VER 8 +#define QLA_DRIVER_BETA_VER 10 diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c --- a/drivers/scsi/sata_promise.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/sata_promise.c Tue Feb 17 20:00:07 2004 @@ -1,7 +1,7 @@ /* * sata_promise.c - Promise SATA * - * Copyright 2003 Red Hat, Inc. + * Copyright 2003-2004 Red Hat, Inc. * * The contents of this file are subject to the Open * Software License version 1.1 that can be found at diff -Nru a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c --- a/drivers/scsi/sata_via.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/sata_via.c Tue Feb 17 20:00:06 2004 @@ -1,8 +1,8 @@ /* sata_via.c - VIA Serial ATA controllers - Copyright 2003 Red Hat, Inc. All rights reserved. - Copyright 2003 Jeff Garzik + Copyright 2003-2004 Red Hat, Inc. All rights reserved. + Copyright 2003-2004 Jeff Garzik The contents of this file are subject to the Open Software License version 1.1 that can be found at diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c --- a/drivers/scsi/scsi_lib.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/scsi_lib.c Tue Feb 17 20:00:07 2004 @@ -238,6 +238,8 @@ generic_unplug_device(sreq->sr_device->request_queue); wait_for_completion(&wait); sreq->sr_request->waiting = NULL; + if (sreq->sr_request->rq_status != RQ_SCSI_DONE) + sreq->sr_result |= (DRIVER_ERROR << 24); __scsi_release_request(sreq); } @@ -340,7 +342,6 @@ unsigned long flags; spin_lock_irqsave(shost->host_lock, flags); - WARN_ON(!current_sdev->sdev_target->starget_sdev_user); current_sdev->sdev_target->starget_sdev_user = NULL; spin_unlock_irqrestore(shost->host_lock, flags); @@ -352,10 +353,6 @@ */ blk_run_queue(current_sdev->request_queue); - /* - * After unlock, this races with anyone clearing starget_sdev_user, - * but we always enter this function again, avoiding any problems. - */ spin_lock_irqsave(shost->host_lock, flags); if (current_sdev->sdev_target->starget_sdev_user) goto out; @@ -1287,6 +1284,15 @@ blk_queue_max_sectors(q, shost->max_sectors); blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); blk_queue_segment_boundary(q, shost->dma_boundary); + + /* + * Set the queue's mask to require a mere 8-byte alignment for + * DMA buffers, rather than the default 512. This shouldn't + * inconvenience any user programs and should be okay for most + * host adapters. A host driver can alter this mask in its + * slave_alloc() or slave_configure() callback if necessary. + */ + blk_queue_dma_alignment(q, (8 - 1)); if (!shost->use_clustering) clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c --- a/drivers/scsi/sd.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/sd.c Tue Feb 17 20:00:07 2004 @@ -554,7 +554,7 @@ case SCSI_IOCTL_GET_BUS_NUMBER: return scsi_ioctl(sdp, cmd, (void *)arg); default: - error = scsi_cmd_ioctl(bdev, cmd, arg); + error = scsi_cmd_ioctl(disk, cmd, arg); if (error != -ENOTTY) return error; } @@ -1089,6 +1089,7 @@ int res; struct scsi_mode_data data; + set_disk_ro(sdkp->disk, 0); if (sdkp->device->skip_ms_page_3f) { printk(KERN_NOTICE "%s: assuming Write Enabled\n", diskname); return; @@ -1120,6 +1121,7 @@ "%s: test WP failed, assume Write Enabled\n", diskname); } else { sdkp->write_prot = ((data.device_specific & 0x80) != 0); + set_disk_ro(sdkp->disk, sdkp->write_prot); printk(KERN_NOTICE "%s: Write Protect is %s\n", diskname, sdkp->write_prot ? "on" : "off"); printk(KERN_DEBUG "%s: Mode Sense: %02x %02x %02x %02x\n", diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c --- a/drivers/scsi/sg.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/sg.c Tue Feb 17 20:00:06 2004 @@ -58,10 +58,6 @@ #include #include -#include -#include -#include - #include #include "scsi.h" #include "hosts.h" @@ -73,7 +69,7 @@ #ifdef CONFIG_SCSI_PROC_FS #include -static char *sg_version_str = "3.5.30 [20031010]"; +static char *sg_version_str = "3.5.30 [20040124]"; static int sg_proc_init(void); static void sg_proc_cleanup(void); @@ -1333,6 +1329,10 @@ .fasync = sg_fasync, }; +static struct class_simple * sg_sysfs_class; + +static int sg_sysfs_valid = 0; + static int sg_add(struct class_device *cl_dev) { @@ -1360,7 +1360,7 @@ tmp_dev_max * sizeof(Sg_device *)); if (NULL == tmp_da) { printk(KERN_ERR - "sg_attach: device array cannot be resized\n"); + "sg_add: device array cannot be resized\n"); error = -ENOMEM; goto out; } @@ -1401,12 +1401,12 @@ sdp = NULL; if (NULL == sdp) { write_unlock_irqrestore(&sg_dev_arr_lock, iflags); - printk(KERN_ERR "sg_attach: Sg_device cannot be allocated\n"); + printk(KERN_ERR "sg_add: Sg_device cannot be allocated\n"); error = -ENOMEM; goto out; } - SCSI_LOG_TIMEOUT(3, printk("sg_attach: dev=%d \n", k)); + SCSI_LOG_TIMEOUT(3, printk("sg_add: dev=%d \n", k)); memset(sdp, 0, sizeof(*sdp)); sprintf(disk->disk_name, "sg%d", k); strncpy(cdev->kobj.name, disk->disk_name, KOBJ_NAME_LEN); @@ -1432,16 +1432,24 @@ goto out; } sdp->cdev = cdev; - error = sysfs_create_link(&cdev->kobj, &scsidp->sdev_gendev.kobj, - "device"); - if (error) - printk(KERN_ERR "sg_attach: unable to make symlink 'device'" - " for sg%d\n", k); - error = sysfs_create_link(&scsidp->sdev_gendev.kobj, &cdev->kobj, - "generic"); - if (error) - printk(KERN_ERR "sg_attach: unable to make symlink 'generic'" - " back to sg%d\n", k); + if (sg_sysfs_valid) { + struct class_device * sg_class_member; + + sg_class_member = class_simple_device_add(sg_sysfs_class, + MKDEV(SCSI_GENERIC_MAJOR, k), + cl_dev->dev, "%s", + disk->disk_name); + if (NULL == sg_class_member) + printk(KERN_WARNING "sg_add: " + "class_simple_device_add failed\n"); + class_set_devdata(sg_class_member, sdp); + error = sysfs_create_link(&scsidp->sdev_gendev.kobj, + &sg_class_member->kobj, "generic"); + if (error) + printk(KERN_ERR "sg_add: unable to make symlink " + "'generic' back to sg%d\n", k); + } else + printk(KERN_WARNING "sg_add: sg_sys INvalid\n"); printk(KERN_NOTICE "Attached scsi generic sg%d at scsi%d, channel" @@ -1512,7 +1520,7 @@ if (sdp) { sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic"); - sysfs_remove_link(&sdp->cdev->kobj, "device"); + class_simple_device_remove(MKDEV(SCSI_GENERIC_MAJOR, k)); cdev_del(sdp->cdev); sdp->cdev = NULL; devfs_remove("%s/generic", scsidp->devfs_name); @@ -1538,6 +1546,7 @@ MODULE_LICENSE("GPL"); MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd"); +MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))"); static int __init init_sg(void) @@ -1551,16 +1560,23 @@ SG_MAX_DEVS, "sg"); if (rc) return rc; + sg_sysfs_class = class_simple_create(THIS_MODULE, "scsi_generic"); + if ( IS_ERR(sg_sysfs_class) ) { + rc = PTR_ERR(sg_sysfs_class); + goto err_out; + } + sg_sysfs_valid = 1; rc = scsi_register_interface(&sg_interface); - if (rc) { - unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), - SG_MAX_DEVS); - return rc; - } + if (0 == rc) { #ifdef CONFIG_SCSI_PROC_FS - sg_proc_init(); + sg_proc_init(); #endif /* CONFIG_SCSI_PROC_FS */ - return 0; + return 0; + } + class_simple_destroy(sg_sysfs_class); +err_out: + unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS); + return rc; } static void __exit @@ -1570,6 +1586,8 @@ sg_proc_cleanup(); #endif /* CONFIG_SCSI_PROC_FS */ scsi_unregister_interface(&sg_interface); + class_simple_destroy(sg_sysfs_class); + sg_sysfs_valid = 0; unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS); if (sg_dev_arr != NULL) { @@ -1778,7 +1796,11 @@ int sg_tablesize = sfp->parentdp->sg_tablesize; struct scatterlist *sgl; int mx_sc_elems, res; + struct scsi_device *sdev = sfp->parentdp->device; + if (((unsigned long)hp->dxferp & + queue_dma_alignment(sdev->request_queue)) != 0) + return 1; mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); if (mx_sc_elems <= 0) { return 1; @@ -2509,12 +2531,17 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp) { char *resp = NULL; - int page_mask = lowDma ? (GFP_ATOMIC | GFP_DMA) : GFP_ATOMIC; + int page_mask; int order, a_size; int resSz = rqSz; if (rqSz <= 0) return resp; + + if (lowDma) + page_mask = GFP_ATOMIC | GFP_DMA | __GFP_NOWARN; + else + page_mask = GFP_ATOMIC | __GFP_NOWARN; for (order = 0, a_size = PAGE_SIZE; a_size < rqSz; order++, a_size <<= 1) ; diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c --- a/drivers/scsi/sr.c Tue Feb 17 20:00:06 2004 +++ b/drivers/scsi/sr.c Tue Feb 17 20:00:06 2004 @@ -712,6 +712,9 @@ "" }; + /* Set read only initially */ + set_disk_ro(cd->disk, 1); + /* allocate a request for the TEST_UNIT_READY */ SRpnt = scsi_allocate_request(cd->device, GFP_KERNEL); if (!SRpnt) { @@ -795,10 +798,9 @@ if ((buffer[n + 2] & 0x8) == 0) /* not a DVD drive */ cd->cdi.mask |= CDC_DVD; - if ((buffer[n + 3] & 0x20) == 0) { + if ((buffer[n + 3] & 0x20) == 0) /* can't write DVD-RAM media */ cd->cdi.mask |= CDC_DVD_RAM; - } else if ((buffer[n + 3] & 0x10) == 0) /* can't write DVD-R media */ cd->cdi.mask |= CDC_DVD_R; @@ -825,8 +827,11 @@ /* * if DVD-RAM of MRW-W, we are randomly writeable */ - if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != (CDC_DVD_RAM | CDC_MRW_W)) + if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != + (CDC_DVD_RAM | CDC_MRW_W)) { cd->device->writeable = 1; + set_disk_ro(cd->disk, 0); + } scsi_release_request(SRpnt); kfree(buffer); diff -Nru a/drivers/scsi/st.c b/drivers/scsi/st.c --- a/drivers/scsi/st.c Tue Feb 17 20:00:07 2004 +++ b/drivers/scsi/st.c Tue Feb 17 20:00:07 2004 @@ -9,7 +9,7 @@ Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, Michael Schaefer, J"org Weule, and Eric Youngdale. - Copyright 1992 - 2003 Kai Makisara + Copyright 1992 - 2004 Kai Makisara email Kai.Makisara@kolumbus.fi Some small formal changes - aeb, 950809 @@ -17,7 +17,7 @@ Last modified: 18-JAN-1998 Richard Gooch Devfs support */ -static char *verstr = "20031228"; +static char *verstr = "20040122"; #include @@ -179,6 +179,7 @@ static int st_probe(struct device *); static int st_remove(struct device *); +static int st_init_command(struct scsi_cmnd *); static void do_create_driverfs_files(void); static void do_remove_driverfs_files(void); @@ -191,6 +192,7 @@ .probe = st_probe, .remove = st_remove, }, + .init_command = st_init_command, }; static int st_compression(Scsi_Tape *, int); @@ -1272,7 +1274,8 @@ i = STp->try_dio && try_rdio; else i = STp->try_dio && try_wdio; - if (i) { + if (i && ((unsigned long)buf & queue_dma_alignment( + STp->device->request_queue)) == 0) { i = st_map_user_pages(&(STbp->sg[0]), STbp->use_sg, (unsigned long)buf, count, (is_read ? READ : WRITE), STp->max_pfn); @@ -3389,7 +3392,11 @@ goto out; } up(&STp->lock); - return scsi_ioctl(STp->device, cmd_in, (void *) arg); + i = scsi_cmd_ioctl(STp->disk, cmd_in, arg); + if (i != -ENOTTY) + return i; + else + return scsi_ioctl(STp->device, cmd_in, (void *) arg); out: up(&STp->lock); @@ -3796,6 +3803,7 @@ tpnt->disk = disk; sprintf(disk->disk_name, "st%d", i); disk->private_data = &tpnt->driver; + disk->queue = SDp->request_queue; tpnt->driver = &st_template; scsi_tapes[i] = tpnt; dev_num = i; @@ -3846,27 +3854,53 @@ STm->default_compression = ST_DONT_TOUCH; STm->default_blksize = (-1); /* No forced size */ STm->default_density = (-1); /* No forced density */ + } + + for (i = 0; i < ST_NBR_PARTITIONS; i++) { + STps = &(tpnt->ps[i]); + STps->rw = ST_IDLE; + STps->eof = ST_NOEOF; + STps->at_sm = 0; + STps->last_block_valid = FALSE; + STps->drv_block = (-1); + STps->drv_file = (-1); + } + + tpnt->current_mode = 0; + tpnt->modes[0].defined = TRUE; + + tpnt->density_changed = tpnt->compression_changed = + tpnt->blksize_changed = FALSE; + init_MUTEX(&tpnt->lock); + + st_nr_dev++; + write_unlock(&st_dev_arr_lock); + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + STm = &(tpnt->modes[mode]); for (j=0; j < 2; j++) { cdev = cdev_alloc(); if (!cdev) { printk(KERN_ERR - "st: out of memory. Device not attached.\n"); - goto out_put_disk; + "st%d: out of memory. Device not attached.\n", + dev_num); + goto out_free_tape; } snprintf(cdev->kobj.name, KOBJ_NAME_LEN, "%sm%d%s", disk->disk_name, - i, j ? "n" : ""); + mode, j ? "n" : ""); cdev->owner = THIS_MODULE; cdev->ops = &st_fops; - STm->cdevs[j] = cdev; - error = cdev_add(STm->cdevs[j], - MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, i, j)), + error = cdev_add(cdev, + MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, j)), 1); if (error) { printk(KERN_ERR "st%d: Can't add %s-rewind mode %d\n", - dev_num, j ? "non" : "auto", i); + dev_num, j ? "non" : "auto", mode); + printk(KERN_ERR "st%d: Device not attached.\n", dev_num); + goto out_free_tape; } + STm->cdevs[j] = cdev; error = sysfs_create_link(&STm->cdevs[j]->kobj, &SDp->sdev_gendev.kobj, "device"); @@ -3884,35 +3918,15 @@ dev_num); } - for (i = 0; i < ST_NBR_PARTITIONS; i++) { - STps = &(tpnt->ps[i]); - STps->rw = ST_IDLE; - STps->eof = ST_NOEOF; - STps->at_sm = 0; - STps->last_block_valid = FALSE; - STps->drv_block = (-1); - STps->drv_file = (-1); - } - - tpnt->current_mode = 0; - tpnt->modes[0].defined = TRUE; - - tpnt->density_changed = tpnt->compression_changed = - tpnt->blksize_changed = FALSE; - init_MUTEX(&tpnt->lock); - - st_nr_dev++; - write_unlock(&st_dev_arr_lock); - for (mode = 0; mode < ST_NBR_MODES; ++mode) { - /* Rewind entry */ - devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5)), - S_IFCHR | S_IRUGO | S_IWUGO, - "%s/mt%s", SDp->devfs_name, st_formats[mode]); - /* No-rewind entry */ - devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5) + 128), - S_IFCHR | S_IRUGO | S_IWUGO, - "%s/mt%sn", SDp->devfs_name, st_formats[mode]); + /* Rewind entry */ + devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5)), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/mt%s", SDp->devfs_name, st_formats[mode]); + /* No-rewind entry */ + devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5) + 128), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/mt%sn", SDp->devfs_name, st_formats[mode]); } disk->number = devfs_register_tape(SDp->devfs_name); @@ -3924,18 +3938,28 @@ return 0; +out_free_tape: + for (mode=0; mode < ST_NBR_MODES; mode++) { + STm = &(tpnt->modes[mode]); + for (j=0; j < 2; j++) { + if (STm->cdevs[j]) { + if (cdev == STm->cdevs[j]) + cdev = NULL; + sysfs_remove_link(&STm->cdevs[j]->kobj, "device"); + cdev_del(STm->cdevs[j]); + } + } + } + if (cdev) + kobject_put(&cdev->kobj); + write_lock(&st_dev_arr_lock); + scsi_tapes[dev_num] = NULL; + st_nr_dev--; + write_unlock(&st_dev_arr_lock); out_put_disk: put_disk(disk); - if (tpnt) { - for (i=0; i < ST_NBR_MODES; i++) { - STm = &(tpnt->modes[i]); - if (STm->cdevs[0]) - kobject_put(&STm->cdevs[0]->kobj); - if (STm->cdevs[1]) - kobject_put(&STm->cdevs[1]->kobj); - } + if (tpnt) kfree(tpnt); - } out_buffer_free: kfree(buffer); out: @@ -3983,6 +4007,41 @@ write_unlock(&st_dev_arr_lock); return 0; +} + +static void st_intr(struct scsi_cmnd *SCpnt) +{ + scsi_io_completion(SCpnt, (SCpnt->result ? 0: SCpnt->bufflen >> 9), 1); +} + +/* + * st_init_command: only called via the scsi_cmd_ioctl (block SG_IO) + * interface for REQ_BLOCK_PC commands. + */ +static int st_init_command(struct scsi_cmnd *SCpnt) +{ + struct request *rq; + + if (!(SCpnt->request->flags & REQ_BLOCK_PC)) + return 0; + + rq = SCpnt->request; + if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd)) + return 0; + + memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd)); + + if (rq_data_dir(rq) == WRITE) + SCpnt->sc_data_direction = DMA_TO_DEVICE; + else if (rq->data_len) + SCpnt->sc_data_direction = DMA_FROM_DEVICE; + else + SCpnt->sc_data_direction = DMA_NONE; + + SCpnt->timeout_per_command = rq->timeout; + SCpnt->transfersize = rq->data_len; + SCpnt->done = st_intr; + return 1; } static int __init init_st(void) diff -Nru a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c --- a/drivers/serial/8250_pci.c Tue Feb 17 20:00:07 2004 +++ b/drivers/serial/8250_pci.c Tue Feb 17 20:00:07 2004 @@ -43,20 +43,12 @@ #define FL_BASE4 0x0004 #define FL_GET_BASE(x) (x & FL_BASE_MASK) -#define FL_IRQ_MASK (0x0007 << 4) -#define FL_IRQBASE0 (0x0000 << 4) -#define FL_IRQBASE1 (0x0001 << 4) -#define FL_IRQBASE2 (0x0002 << 4) -#define FL_IRQBASE3 (0x0003 << 4) -#define FL_IRQBASE4 (0x0004 << 4) -#define FL_GET_IRQBASE(x) ((x & FL_IRQ_MASK) >> 4) - /* Use successive BARs (PCI base address registers), else use offset into some specified BAR */ #define FL_BASE_BARS 0x0008 -/* Use the irq resource table instead of dev->irq */ -#define FL_IRQRESOURCE 0x0080 +/* do not assign an irq */ +#define FL_NOIRQ 0x0080 /* Use the Base address register size to cap number of ports */ #define FL_REGION_SZ_CAP 0x0100 @@ -850,17 +842,10 @@ static _INLINE_ int get_pci_irq(struct pci_dev *dev, struct pci_board *board, int idx) { - int base_idx; - - if ((board->flags & FL_IRQRESOURCE) == 0) - return dev->irq; - - base_idx = FL_GET_IRQBASE(board->flags); - - if (base_idx > DEVICE_COUNT_IRQ) + if (board->flags & FL_NOIRQ) return 0; - - return dev->irq_resource[base_idx].start; + else + return dev->irq; } /* @@ -1314,7 +1299,7 @@ .first_offset = 0x10000, }, [pbn_sgi_ioc3] = { - .flags = FL_BASE0|FL_IRQRESOURCE, + .flags = FL_BASE0|FL_NOIRQ, .num_ports = 1, .base_baud = 458333, .uart_offset = 8, diff -Nru a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c --- a/drivers/serial/8250_pnp.c Tue Feb 17 20:00:05 2004 +++ b/drivers/serial/8250_pnp.c Tue Feb 17 20:00:05 2004 @@ -420,7 +420,9 @@ static void serial_pnp_remove(struct pnp_dev * dev) { - return; + int line = (int)pnp_get_drvdata(dev); + if (line) + unregister_serial(line - 1); } static struct pnp_driver serial_pnp_driver = { @@ -437,7 +439,7 @@ static void __exit serial8250_pnp_exit(void) { - /* FIXME */ + pnp_unregister_driver(&serial_pnp_driver); } module_init(serial8250_pnp_init); diff -Nru a/drivers/serial/mux.c b/drivers/serial/mux.c --- a/drivers/serial/mux.c Tue Feb 17 20:00:07 2004 +++ b/drivers/serial/mux.c Tue Feb 17 20:00:07 2004 @@ -24,6 +24,7 @@ #include #include #include +#include /* for udelay */ #include #include @@ -47,15 +48,17 @@ #define MUX_STATUS(status) ((status & 0xF000) == 0x8000) #define MUX_BREAK(status) ((status & 0xF000) == 0x2000) -#define UART_NR 8 -struct mux_card { - struct uart_port ports[UART_NR]; - struct uart_driver drv; - struct mux_card *next; -}; - -static struct mux_card mux_card_head = { - .next = NULL, +#define MUX_NR 256 +static unsigned int port_cnt = 0; +static struct uart_port mux_ports[MUX_NR]; + +static struct uart_driver mux_driver = { + .owner = THIS_MODULE, + .driver_name = "ttyB", + .dev_name = "ttyB", + .major = MUX_MAJOR, + .minor = 0, + .nr = MUX_NR, }; static struct timer_list mux_timer; @@ -181,7 +184,7 @@ return; } - count = (port->fifosize >> 1) - UART_GET_FIFO_CNT(port); + count = (port->fifosize) - UART_GET_FIFO_CNT(port); do { UART_PUT_CHAR(port, xmit->buf[xmit->tail]); xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); @@ -191,6 +194,9 @@ } while(--count > 0); + while(UART_GET_FIFO_CNT(port)) + udelay(1); + if(uart_circ_chars_pending(xmit) < WAKEUP_CHARS) uart_write_wakeup(port); @@ -361,28 +367,46 @@ static void mux_poll(unsigned long unused) { int i; - struct mux_card *card = &mux_card_head; - while(card) { - for(i = 0; i < UART_NR; ++i) { - if(!card->ports[i].info) - continue; + for(i = 0; i < port_cnt; ++i) { + if(!mux_ports[i].info) + continue; - mux_read(&card->ports[i]); - mux_write(&card->ports[i]); - } - card = card->next; + mux_read(&mux_ports[i]); + mux_write(&mux_ports[i]); } + mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); } #ifdef CONFIG_SERIAL_MUX_CONSOLE +static void mux_console_write(struct console *co, const char *s, unsigned count) +{ + while(count--) + pdc_iodc_putc(*s++); +} + +static int mux_console_setup(struct console *co, char *options) +{ + return 0; +} + +struct tty_driver *mux_console_device(struct console *co, int *index) +{ + *index = co->index; + return mux_driver.tty_driver; +} + static struct console mux_console = { .name = "ttyB", - .flags = CON_PRINTBUFFER, + .write = mux_console_write, + .device = mux_console_device, + .setup = mux_console_setup, + .flags = CON_BOOT|CON_PRINTBUFFER|CON_ENABLED, .index = 0, }; + #define MUX_CONSOLE &mux_console #else #define MUX_CONSOLE NULL @@ -416,77 +440,53 @@ */ static int __init mux_probe(struct parisc_device *dev) { - int i, j, ret, ports, port_cnt = 0; - u8 iodc_data[8]; + int i, status, ports; + u8 iodc_data[32]; unsigned long bytecnt; struct uart_port *port; - struct mux_card *card = &mux_card_head; - ret = pdc_iodc_read(&bytecnt, dev->hpa, 0, iodc_data, 8); - if(ret != PDC_OK) { + status = pdc_iodc_read(&bytecnt, dev->hpa, 0, iodc_data, 32); + if(status != PDC_OK) { printk(KERN_ERR "Serial mux: Unable to read IODC.\n"); return 1; } ports = GET_MUX_PORTS(iodc_data); - printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.2\n", - ports); - - if(!card->drv.nr) { - init_timer(&mux_timer); - mux_timer.function = mux_poll; - } else { - port_cnt += UART_NR; - while(card->next) { - card = card->next; - port_cnt += UART_NR; - } - } - - for(i = 0; i < ports / UART_NR; ++i) { - if(card->drv.nr) { - card->next = kmalloc(sizeof(struct mux_card), GFP_KERNEL); - if(!card->next) { - printk(KERN_ERR "Serial mux: Unable to allocate memory.\n"); - return 1; - } - memset(card->next, '\0', sizeof(struct mux_card)); - card = card->next; - } + printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.3\n", ports); - card->drv.owner = THIS_MODULE; - card->drv.driver_name = "ttyB"; - card->drv.dev_name = "ttyB"; - card->drv.major = MUX_MAJOR; - card->drv.minor = port_cnt; - card->drv.nr = UART_NR; - card->drv.cons = MUX_CONSOLE; + if(!port_cnt) { + mux_driver.cons = MUX_CONSOLE; - ret = uart_register_driver(&card->drv); - if(ret) { + status = uart_register_driver(&mux_driver); + if(status) { printk(KERN_ERR "Serial mux: Unable to register driver.\n"); return 1; } - for(j = 0; j < UART_NR; ++j) { - port = &card->ports[j]; + init_timer(&mux_timer); + mux_timer.function = mux_poll; + } - port->iobase = 0; - port->mapbase = dev->hpa + MUX_OFFSET + (j * MUX_LINE_OFFSET); - port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); - port->iotype = SERIAL_IO_MEM; - port->type = PORT_MUX; - port->irq = SERIAL_IRQ_NONE; - port->uartclk = 0; - port->fifosize = MUX_FIFO_SIZE; - port->ops = &mux_pops; - port->flags = UPF_BOOT_AUTOCONF; - port->line = j; - ret = uart_add_one_port(&card->drv, port); - BUG_ON(ret); - } - port_cnt += UART_NR; + for(i = 0; i < ports; ++i, ++port_cnt) { + port = &mux_ports[port_cnt]; + port->iobase = 0; + port->mapbase = dev->hpa + MUX_OFFSET + (i * MUX_LINE_OFFSET); + port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); + port->iotype = SERIAL_IO_MEM; + port->type = PORT_MUX; + port->irq = SERIAL_IRQ_NONE; + port->uartclk = 0; + port->fifosize = MUX_FIFO_SIZE; + port->ops = &mux_pops; + port->flags = UPF_BOOT_AUTOCONF; + port->line = port_cnt; + status = uart_add_one_port(&mux_driver, port); + BUG_ON(status); } + +#ifdef CONFIG_SERIAL_MUX_CONSOLE + register_console(&mux_console); +#endif return 0; } @@ -497,7 +497,7 @@ MODULE_DEVICE_TABLE(parisc, mux_tbl); -static struct parisc_driver mux_driver = { +static struct parisc_driver serial_mux_driver = { .name = "Serial MUX", .id_table = mux_tbl, .probe = mux_probe, @@ -510,7 +510,7 @@ */ static int __init mux_init(void) { - return register_parisc_driver(&mux_driver); + return register_parisc_driver(&serial_mux_driver); } /** @@ -521,13 +521,12 @@ static void __exit mux_exit(void) { int i; - struct mux_card *card = &mux_card_head; - for (i = 0; i < UART_NR; i++) { - uart_remove_one_port(&card->drv, &card->ports[i]); + for (i = 0; i < port_cnt; i++) { + uart_remove_one_port(&mux_driver, &mux_ports[i]); } - uart_unregister_driver(&card->drv); + uart_unregister_driver(&mux_driver); } module_init(mux_init); diff -Nru a/drivers/serial/pmac_zilog.c b/drivers/serial/pmac_zilog.c --- a/drivers/serial/pmac_zilog.c Tue Feb 17 20:00:05 2004 +++ b/drivers/serial/pmac_zilog.c Tue Feb 17 20:00:05 2004 @@ -59,7 +59,6 @@ #include #include #include -#include #include #include @@ -68,6 +67,10 @@ #include "pmac_zilog.h" +#if defined(CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_PPC64) +#define HAS_SCCDBG +extern int sccdbg; +#endif /* Not yet implemented */ #undef HAS_DBDMA @@ -170,7 +173,6 @@ */ static void pmz_maybe_update_regs(struct uart_pmac_port *up) { -#if 1 if (!ZS_REGS_HELD(up)) { if (ZS_TX_ACTIVE(up)) { up->flags |= PMACZILOG_FLAG_REGS_HELD; @@ -179,10 +181,6 @@ pmz_load_zsregs(up, up->curregs); } } -#else - pr_debug("pmz: maybe_update_regs: updating\n"); - pmz_load_zsregs(up, up->curregs); -#endif } static void pmz_receive_chars(struct uart_pmac_port *up, struct pt_regs *regs) @@ -205,22 +203,18 @@ zssync(up); } - ch = read_zsreg(up, R0); - - /* This funny hack depends upon BRK_ABRT not interfering - * with the other bits we care about in R1. - */ - if (ch & BRK_ABRT) - r1 |= BRK_ABRT; - ch = read_zsdata(up); ch &= up->parity_mask; + if (ch == 0 && up->prev_status & BRK_ABRT) { + r1 |= BRK_ABRT; + printk("rx break\n"); + } /* A real serial line, record the character and status. */ *tty->flip.char_buf_ptr = ch; *tty->flip.flag_buf_ptr = TTY_NORMAL; up->port.icount.rx++; - if (r1 & (BRK_ABRT | PAR_ERR | Rx_OVR | CRC_ERR)) { + if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR | BRK_ABRT)) { if (r1 & BRK_ABRT) { r1 &= ~(PAR_ERR | CRC_ERR); up->port.icount.brk++; @@ -274,6 +268,15 @@ write_zsreg(up, R0, RES_EXT_INT); zssync(up); +#ifdef HAS_SCCDBG + if (sccdbg && (status & BRK_ABRT) && !(up->prev_status & BRK_ABRT)) { +#ifdef CONFIG_XMON + extern void xmon(struct pt_regs *); + xmon(regs); +#endif + } +#endif /* HAS_SCCDBG */ + if (ZS_WANTS_MODEM_STATUS(up)) { if (status & SYNC_HUNT) up->port.icount.dsr++; @@ -383,10 +386,10 @@ write_zsreg(up_a, R0, RES_H_IUS); zssync(up_a); pr_debug("pmz: irq channel A: %x\n", r3); - if (r3 & CHARxIP) - pmz_receive_chars(up_a, regs); if (r3 & CHAEXT) pmz_status_handle(up_a, regs); + if (r3 & CHARxIP) + pmz_receive_chars(up_a, regs); if (r3 & CHATxIP) pmz_transmit_chars(up_a); rc = IRQ_HANDLED; @@ -398,10 +401,10 @@ write_zsreg(up_b, R0, RES_H_IUS); zssync(up_b); pr_debug("pmz: irq channel B: %x\n", r3); - if (r3 & CHBRxIP) - pmz_receive_chars(up_b, regs); if (r3 & CHBEXT) pmz_status_handle(up_b, regs); + if (r3 & CHBRxIP) + pmz_receive_chars(up_b, regs); if (r3 & CHBTxIP) pmz_transmit_chars(up_b); rc = IRQ_HANDLED; @@ -575,15 +578,12 @@ /* * Enable modem status change interrupts - * The port lock is not held. + * The port lock is held. */ static void pmz_enable_ms(struct uart_port *port) { struct uart_pmac_port *up = to_pmz(port); unsigned char new_reg; - unsigned long flags; - - spin_lock_irqsave(&port->lock, flags); new_reg = up->curregs[R15] | (DCDIE | SYNCIE | CTSIE); if (new_reg != up->curregs[R15]) { @@ -592,8 +592,6 @@ /* NOTE: Not subject to 'transmitter active' rule. */ write_zsreg(up, R15, up->curregs[R15]); } - - spin_unlock_irqrestore(&port->lock, flags); } /* @@ -765,7 +763,7 @@ up->curregs[R9] |= NV | MIE; up->curregs[R1] |= EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; - // pmz_maybe_update_regs(up); + pmz_maybe_update_regs(up); return pwr_delay; } @@ -1051,10 +1049,13 @@ pmz_convert_to_zs(up, termios->c_cflag, termios->c_iflag, baud); - if (UART_ENABLE_MS(&up->port, termios->c_cflag)) + if (UART_ENABLE_MS(&up->port, termios->c_cflag)) { + up->curregs[R15] |= DCDIE | SYNCIE | CTSIE; up->flags |= PMACZILOG_FLAG_MODEM_STATUS; - else + } else { + up->curregs[R15] &= ~(DCDIE | SYNCIE | CTSIE); up->flags &= ~PMACZILOG_FLAG_MODEM_STATUS; + } /* set the irda codec to the right rate */ if (ZS_IS_IRDA(up)) @@ -1120,7 +1121,7 @@ * Unlike sunzilog, we don't need to pre-init the spinlock as we don't * register our console before uart_add_one_port() is called */ -static int __init pmz_setup_port(struct uart_pmac_port *up, int early) +static int __init pmz_init_port(struct uart_pmac_port *up) { struct device_node *np = up->node; char *conn; @@ -1133,11 +1134,6 @@ /* * Request & map chip registers */ - if (!early && request_OF_resource(np, 0, NULL) == NULL) { - printk("pmac_zilog: failed to request resources for %s\n", - np->full_name); - return -EBUSY; - } up->port.mapbase = np->addrs[0].address; up->port.membase = ioremap(up->port.mapbase, 0x1000); @@ -1152,27 +1148,23 @@ up->flags |= PMACZILOG_FLAG_HAS_DMA; #endif if (ZS_HAS_DMA(up)) { - if (!early && request_OF_resource(np, np->n_addrs - 2, " (tx dma)") == NULL) { - printk(KERN_ERR "pmac_zilog: can't request TX DMA resource !\n"); + up->tx_dma_regs = (volatile struct dbdma_regs *) + ioremap(np->addrs[np->n_addrs - 2].address, 0x1000); + if (up->tx_dma_regs == NULL) { up->flags &= ~PMACZILOG_FLAG_HAS_DMA; goto no_dma; } - if (!early && request_OF_resource(np, np->n_addrs - 1, " (rx dma)") == NULL) { - release_OF_resource(np, np->n_addrs - 2); - printk(KERN_ERR "pmac_zilog: can't request RX DMA resource !\n"); + up->rx_dma_regs = (volatile struct dbdma_regs *) + ioremap(np->addrs[np->n_addrs - 1].address, 0x1000); + if (up->rx_dma_regs == NULL) { + iounmap((void *)up->tx_dma_regs); up->flags &= ~PMACZILOG_FLAG_HAS_DMA; goto no_dma; } - up->tx_dma_regs = (volatile struct dbdma_regs *) - ioremap(np->addrs[np->n_addrs - 2].address, 0x1000); - up->rx_dma_regs = (volatile struct dbdma_regs *) - ioremap(np->addrs[np->n_addrs - 1].address, 0x1000); up->tx_dma_irq = np->intrs[1].line; up->rx_dma_irq = np->intrs[2].line; } no_dma: - if (!early) - up->flags |= PMACZILOG_FLAG_RSRC_REQUESTED; /* * Detect port type @@ -1234,13 +1226,6 @@ { struct device_node *np; - if (up->flags & PMACZILOG_FLAG_RSRC_REQUESTED) { - release_OF_resource(up->node, 0); - if (ZS_HAS_DMA(up)) { - release_OF_resource(up->node, up->node->n_addrs - 2); - release_OF_resource(up->node, up->node->n_addrs - 1); - } - } iounmap((void *)up->control_reg); np = up->node; up->node = NULL; @@ -1258,8 +1243,15 @@ */ for (i = 0; i < MAX_ZS_PORTS; i++) if (pmz_ports[i].node == mdev->ofdev.node) { - pmz_ports[i].dev = mdev; - dev_set_drvdata(&mdev->ofdev.dev, &pmz_ports[i]); + struct uart_pmac_port *up = &pmz_ports[i]; + + up->dev = mdev; + dev_set_drvdata(&mdev->ofdev.dev, up); + if (macio_request_resources(up->dev, "pmac_zilog")) + printk(KERN_WARNING "%s: Failed to request resource, port still active\n", + up->node->name); + else + up->flags |= PMACZILOG_FLAG_RSRC_REQUESTED; return 0; } return -ENODEV; @@ -1271,13 +1263,17 @@ */ static int pmz_detach(struct macio_dev *mdev) { - struct uart_pmac_port *port = dev_get_drvdata(&mdev->ofdev.dev); + struct uart_pmac_port *up = dev_get_drvdata(&mdev->ofdev.dev); - if (!port) + if (!up) return -ENODEV; + if (up->flags & PMACZILOG_FLAG_RSRC_REQUESTED) { + macio_release_resources(up->dev); + up->flags &= ~PMACZILOG_FLAG_RSRC_REQUESTED; + } dev_set_drvdata(&mdev->ofdev.dev, NULL); - port->dev = NULL; + up->dev = NULL; return 0; } @@ -1288,7 +1284,7 @@ * used later to "attach" to the sysfs tree so we get power management * events */ -static int __init pmz_probe(int early) +static int __init pmz_probe(void) { struct device_node *node_p, *node_a, *node_b, *np; int count = 0; @@ -1333,9 +1329,9 @@ /* * Setup the ports for real */ - rc = pmz_setup_port(&pmz_ports[count], early); + rc = pmz_init_port(&pmz_ports[count]); if (rc == 0) - rc = pmz_setup_port(&pmz_ports[count+1], early); + rc = pmz_init_port(&pmz_ports[count+1]); if (rc != 0) { of_node_put(node_a); of_node_put(node_b); @@ -1436,43 +1432,10 @@ // .resume = pmz_resume, *** NYI }; -static void pmz_fixup_resources(void) -{ - int i; - for (i=0; inode == NULL) - continue; - if (up->flags & PMACZILOG_FLAG_RSRC_REQUESTED) - continue; - if (request_OF_resource(up->node, 0, NULL) == NULL) - printk(KERN_WARNING "%s: Failed to do late IO resource request, port still active\n", - up->node->name); - up->flags |= PMACZILOG_FLAG_RSRC_REQUESTED; - if (!ZS_HAS_DMA(up)) - continue; - if (request_OF_resource(up->node, up->node->n_addrs - 2, NULL) == NULL) - printk(KERN_WARNING "%s: Failed to do late DMA resource request, port still active\n", - up->node->name); - if (request_OF_resource(up->node, up->node->n_addrs - 1, NULL) == NULL) - printk(KERN_WARNING "%s: Failed to do late DMA resource request, port still active\n", - up->node->name); - } - -} - static int __init init_pmz(void) { printk(KERN_DEBUG "%s\n", version); - /* - * If we had serial console, then we didn't request - * resources yet. We fix that up now - */ - if (pmz_ports_count > 0) - pmz_fixup_resources(); - /* * First, we need to do a direct OF-based probe pass. We * do that because we want serial console up before the @@ -1481,7 +1444,7 @@ * uart_register_driver() */ if (pmz_ports_count == 0) - pmz_probe(0); + pmz_probe(); /* * Bail early if no port found @@ -1610,8 +1573,10 @@ static int __init pmz_console_init(void) { /* Probe ports */ - pmz_probe(1); + pmz_probe(); +#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE +#endif /* TODO: Autoprobe console based on OF */ /* pmz_console.index = i; */ register_console(&pmz_console); diff -Nru a/drivers/usb/Makefile b/drivers/usb/Makefile --- a/drivers/usb/Makefile Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/Makefile Tue Feb 17 20:00:08 2004 @@ -46,7 +46,6 @@ obj-$(CONFIG_USB_HPUSBSCSI) += image/ obj-$(CONFIG_USB_MDC800) += image/ obj-$(CONFIG_USB_MICROTEK) += image/ -obj-$(CONFIG_USB_SCANNER) += image/ obj-$(CONFIG_USB_SERIAL) += serial/ diff -Nru a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c --- a/drivers/usb/class/audio.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/class/audio.c Tue Feb 17 20:00:08 2004 @@ -203,12 +203,12 @@ #define AUDIO_DEBUG 1 -#define SND_DEV_DSP16 5 +#define SND_DEV_DSP16 5 #define dprintk(x) #undef abs -extern int abs(int __x) __attribute__ ((__const__)); /* Shut up warning */ +extern int abs(int __x) __attribute_const__; /* Shut up warning */ /* --------------------------------------------------------------------- */ diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/class/cdc-acm.c Tue Feb 17 20:00:07 2004 @@ -399,6 +399,7 @@ static int acm_tty_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count) { struct acm *acm = tty->driver_data; + int stat; if (!ACM_READY(acm)) return -EINVAL; @@ -418,8 +419,12 @@ acm->writeurb->transfer_buffer_length = count; acm->writeurb->dev = acm->dev; - if (usb_submit_urb(acm->writeurb, GFP_KERNEL)) + /* GFP_KERNEL probably works if from_user */ + stat = usb_submit_urb(acm->writeurb, GFP_ATOMIC); + if (stat < 0) { dbg("usb_submit_urb(write bulk) failed"); + return stat; + } return count; } diff -Nru a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile --- a/drivers/usb/core/Makefile Tue Feb 17 20:00:14 2004 +++ b/drivers/usb/core/Makefile Tue Feb 17 20:00:14 2004 @@ -2,7 +2,7 @@ # Makefile for USB Core files and filesystem # -usbcore-objs := usb.o usb-debug.o hub.o hcd.o urb.o message.o \ +usbcore-objs := usb.o hub.o hcd.o urb.o message.o \ config.o file.o buffer.o driverfs.o ifeq ($(CONFIG_PCI),y) diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c --- a/drivers/usb/core/hcd.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/core/hcd.c Tue Feb 17 20:00:07 2004 @@ -34,7 +34,10 @@ #include #include #include /* for UTS_SYSNAME */ -#include /* for hcd->pdev and dma addressing */ +#include +#include +#include +#include #include #include @@ -735,7 +738,7 @@ * * The USB host controller calls this function to register the root hub * properly with the USB subsystem. It sets up the device properly in - * the driverfs tree, and then calls usb_new_device() to register the + * the device model tree, and then calls usb_new_device() to register the * usb device. It also assigns the root hub's USB address (always 1). */ int usb_register_root_hub (struct usb_device *usb_dev, struct device *parent_dev) @@ -743,14 +746,14 @@ const int devnum = 1; int retval; - sprintf (&usb_dev->dev.bus_id[0], "usb%d", usb_dev->bus->busnum); - usb_dev->state = USB_STATE_DEFAULT; - usb_dev->devnum = devnum; usb_dev->bus->devnum_next = devnum + 1; + memset (&usb_dev->bus->devmap.devicemap, 0, + sizeof usb_dev->bus->devmap.devicemap); set_bit (devnum, usb_dev->bus->devmap.devicemap); + usb_dev->state = USB_STATE_ADDRESS; - retval = usb_new_device (usb_dev, parent_dev); + retval = usb_new_device (usb_dev); if (retval) dev_err (parent_dev, "can't register root hub for %s, %d\n", usb_dev->dev.bus_id, retval); @@ -1474,16 +1477,16 @@ if (hcd->controller->dma_mask) { if (usb_pipecontrol (urb->pipe) && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) - pci_unmap_single (hcd->pdev, urb->setup_dma, + dma_unmap_single (hcd->controller, urb->setup_dma, sizeof (struct usb_ctrlrequest), - PCI_DMA_TODEVICE); + DMA_TO_DEVICE); if (urb->transfer_buffer_length != 0 && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) - pci_unmap_single (hcd->pdev, urb->transfer_dma, + dma_unmap_single (hcd->controller, urb->transfer_dma, urb->transfer_buffer_length, usb_pipein (urb->pipe) - ? PCI_DMA_FROMDEVICE - : PCI_DMA_TODEVICE); + ? DMA_FROM_DEVICE + : DMA_TO_DEVICE); } /* pass ownership to the completion handler */ @@ -1513,7 +1516,9 @@ return IRQ_NONE; hcd->saw_irq = 1; - hcd->driver->irq (hcd, r); + if (hcd->driver->irq (hcd, r) == IRQ_NONE) + return IRQ_NONE; + if (hcd->state != start && hcd->state == USB_STATE_HALT) usb_hc_died (hcd); return IRQ_HANDLED; diff -Nru a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h --- a/drivers/usb/core/hcd.h Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/core/hcd.h Tue Feb 17 20:00:06 2004 @@ -163,7 +163,7 @@ const char *description; /* "ehci-hcd" etc */ /* irq handler */ - void (*irq) (struct usb_hcd *hcd, struct pt_regs *regs); + irqreturn_t (*irq) (struct usb_hcd *hcd, struct pt_regs *regs); int flags; #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ @@ -241,7 +241,9 @@ /* -------------------------------------------------------------------------- */ /* Enumeration is only for the hub driver, or HCD virtual root hubs */ -extern int usb_new_device(struct usb_device *dev, struct device *parent); +extern struct usb_device *usb_alloc_dev(struct usb_device *parent, + struct usb_bus *, unsigned port); +extern int usb_new_device(struct usb_device *dev); extern void usb_choose_address(struct usb_device *dev); extern void usb_disconnect(struct usb_device **); diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c --- a/drivers/usb/core/hub.c Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/core/hub.c Tue Feb 17 20:00:06 2004 @@ -179,7 +179,7 @@ hub_clear_tt_buffer (struct usb_device *hub, u16 devinfo, u16 tt) { return usb_control_msg (hub, usb_rcvctrlpipe (hub, 0), - HUB_CLEAR_TT_BUFFER, USB_DIR_IN | USB_RECIP_OTHER, + HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, tt, 0, 0, HZ); } @@ -930,11 +930,9 @@ down(&usb_address0_sem); for (i = 0; i < HUB_PROBE_TRIES; i++) { - struct usb_device *pdev; - int len; /* Allocate a new device struct */ - dev = usb_alloc_dev(hub, hub->bus); + dev = usb_alloc_dev(hub, hub->bus, port); if (!dev) { dev_err (&hubstate->intf->dev, "couldn't allocate usb_device\n"); @@ -962,38 +960,18 @@ dev->ttport = port + 1; } - /* Save readable and stable topology id, distinguishing - * devices by location for diagnostics, tools, etc. The - * string is a path along hub ports, from the root. Each - * device's id will be stable until USB is re-cabled, and - * hubs are often labeled with these port numbers. - * - * Initial size: ".NN" times five hubs + NUL = 16 bytes max - * (quite rare, since most hubs have 4-6 ports). - */ - pdev = dev->parent; - if (pdev->devpath [0] != '0') /* parent not root? */ - len = snprintf (dev->devpath, sizeof dev->devpath, - "%s.%d", pdev->devpath, port + 1); - /* root == "0", root port 2 == "2", port 3 that hub "2.3" */ - else - len = snprintf (dev->devpath, sizeof dev->devpath, - "%d", port + 1); - if (len == sizeof dev->devpath) - dev_err (&hubstate->intf->dev, - "devpath size! usb/%03d/%03d path %s\n", - dev->bus->busnum, dev->devnum, dev->devpath); - dev_info (&hubstate->intf->dev, - "new USB device on port %d, assigned address %d\n", - port + 1, dev->devnum); - - /* put the device in the global device tree. the hub port - * is the "bus_id"; hubs show in hierarchy like bridges - */ - dev->dev.parent = dev->parent->dev.parent->parent; + dev_info (&dev->dev, + "new %s speed USB device using address %d\n", + ({ char *speed; switch (dev->speed) { + case USB_SPEED_LOW: speed = "low"; break; + case USB_SPEED_FULL: speed = "full"; break; + case USB_SPEED_HIGH: speed = "high"; break; + default: speed = "?"; break; + }; speed;}), + dev->devnum); /* Run it through the hoops (find a driver, etc) */ - if (!usb_new_device(dev, &hub->dev)) { + if (usb_new_device(dev) == 0) { hub->children[port] = dev; goto done; } diff -Nru a/drivers/usb/core/usb-debug.c b/drivers/usb/core/usb-debug.c --- a/drivers/usb/core/usb-debug.c Tue Feb 17 20:00:08 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,201 +0,0 @@ -/* - * debug.c - USB debug helper routines. - * - * I just want these out of the way where they aren't in your - * face, but so that you can still use them.. - */ -#include -#include -#include -#include -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif -#include - -static void usb_show_endpoint(struct usb_host_endpoint *endpoint) -{ - usb_show_endpoint_descriptor(&endpoint->desc); -} - -static void usb_show_interface(struct usb_host_interface *altsetting) -{ - int i; - - usb_show_interface_descriptor(&altsetting->desc); - - for (i = 0; i < altsetting->desc.bNumEndpoints; i++) - usb_show_endpoint(altsetting->endpoint + i); -} - -static void usb_show_config(struct usb_host_config *config) -{ - int i, j; - struct usb_interface *ifp; - - usb_show_config_descriptor(&config->desc); - for (i = 0; i < config->desc.bNumInterfaces; i++) { - ifp = config->interface[i]; - - if (!ifp) - break; - - printk("\n Interface: %d\n", i); - for (j = 0; j < ifp->num_altsetting; j++) - usb_show_interface(ifp->altsetting + j); - } -} - -void usb_show_device(struct usb_device *dev) -{ - int i; - - usb_show_device_descriptor(&dev->descriptor); - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) - usb_show_config(dev->config + i); -} - -/* - * Parse and show the different USB descriptors. - */ -void usb_show_device_descriptor(struct usb_device_descriptor *desc) -{ - if (!desc) - { - printk("Invalid USB device descriptor (NULL POINTER)\n"); - return; - } - printk(" Length = %2d%s\n", desc->bLength, - desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)"); - printk(" DescriptorType = %02x\n", desc->bDescriptorType); - - printk(" USB version = %x.%02x\n", - desc->bcdUSB >> 8, desc->bcdUSB & 0xff); - printk(" Vendor:Product = %04x:%04x\n", - desc->idVendor, desc->idProduct); - printk(" MaxPacketSize0 = %d\n", desc->bMaxPacketSize0); - printk(" NumConfigurations = %d\n", desc->bNumConfigurations); - printk(" Device version = %x.%02x\n", - desc->bcdDevice >> 8, desc->bcdDevice & 0xff); - - printk(" Device Class:SubClass:Protocol = %02x:%02x:%02x\n", - desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol); - switch (desc->bDeviceClass) { - case 0: - printk(" Per-interface classes\n"); - break; - case USB_CLASS_AUDIO: - printk(" Audio device class\n"); - break; - case USB_CLASS_COMM: - printk(" Communications class\n"); - break; - case USB_CLASS_HID: - printk(" Human Interface Devices class\n"); - break; - case USB_CLASS_PRINTER: - printk(" Printer device class\n"); - break; - case USB_CLASS_MASS_STORAGE: - printk(" Mass Storage device class\n"); - break; - case USB_CLASS_HUB: - printk(" Hub device class\n"); - break; - case USB_CLASS_VENDOR_SPEC: - printk(" Vendor class\n"); - break; - default: - printk(" Unknown class\n"); - } -} - -void usb_show_config_descriptor(struct usb_config_descriptor *desc) -{ - printk("Configuration:\n"); - printk(" bLength = %4d%s\n", desc->bLength, - desc->bLength == USB_DT_CONFIG_SIZE ? "" : " (!!!)"); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" wTotalLength = %04x\n", desc->wTotalLength); - printk(" bNumInterfaces = %02x\n", desc->bNumInterfaces); - printk(" bConfigurationValue = %02x\n", desc->bConfigurationValue); - printk(" iConfiguration = %02x\n", desc->iConfiguration); - printk(" bmAttributes = %02x\n", desc->bmAttributes); - printk(" bMaxPower = %4dmA\n", desc->bMaxPower * 2); -} - -void usb_show_interface_descriptor(struct usb_interface_descriptor *desc) -{ - printk(" Alternate Setting: %2d\n", desc->bAlternateSetting); - printk(" bLength = %4d%s\n", desc->bLength, - desc->bLength == USB_DT_INTERFACE_SIZE ? "" : " (!!!)"); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" bInterfaceNumber = %02x\n", desc->bInterfaceNumber); - printk(" bAlternateSetting = %02x\n", desc->bAlternateSetting); - printk(" bNumEndpoints = %02x\n", desc->bNumEndpoints); - printk(" bInterface Class:SubClass:Protocol = %02x:%02x:%02x\n", - desc->bInterfaceClass, desc->bInterfaceSubClass, desc->bInterfaceProtocol); - printk(" iInterface = %02x\n", desc->iInterface); -} - -void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc) -{ - char *LengthCommentString = (desc->bLength == - USB_DT_ENDPOINT_AUDIO_SIZE) ? " (Audio)" : (desc->bLength == - USB_DT_ENDPOINT_SIZE) ? "" : " (!!!)"; - char *EndpointType[4] = { "Control", "Isochronous", "Bulk", "Interrupt" }; - - printk(" Endpoint:\n"); - printk(" bLength = %4d%s\n", - desc->bLength, LengthCommentString); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" bEndpointAddress = %02x (%s)\n", desc->bEndpointAddress, - (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == - USB_ENDPOINT_XFER_CONTROL ? "i/o" : - (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? "in" : "out"); - printk(" bmAttributes = %02x (%s)\n", desc->bmAttributes, - EndpointType[USB_ENDPOINT_XFERTYPE_MASK & desc->bmAttributes]); - printk(" wMaxPacketSize = %04x\n", desc->wMaxPacketSize); - printk(" bInterval = %02x\n", desc->bInterval); - - /* Audio extensions to the endpoint descriptor */ - if (desc->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) { - printk(" bRefresh = %02x\n", desc->bRefresh); - printk(" bSynchAddress = %02x\n", desc->bSynchAddress); - } -} - -void usb_show_string(struct usb_device *dev, char *id, int index) -{ - char *buf; - - if (!index) - return; - if (!(buf = kmalloc(256, GFP_KERNEL))) - return; - if (usb_string(dev, index, buf, 256) > 0) - dev_printk(KERN_INFO, &dev->dev, "%s: %s\n", id, buf); - kfree(buf); -} - -void usb_dump_urb (struct urb *urb) -{ - printk ("urb :%p\n", urb); - printk ("dev :%p\n", urb->dev); - printk ("pipe :%08X\n", urb->pipe); - printk ("status :%d\n", urb->status); - printk ("transfer_flags :%08X\n", urb->transfer_flags); - printk ("transfer_buffer :%p\n", urb->transfer_buffer); - printk ("transfer_buffer_length:%d\n", urb->transfer_buffer_length); - printk ("actual_length :%d\n", urb->actual_length); - printk ("setup_packet :%p\n", urb->setup_packet); - printk ("start_frame :%d\n", urb->start_frame); - printk ("number_of_packets :%d\n", urb->number_of_packets); - printk ("interval :%d\n", urb->interval); - printk ("error_count :%d\n", urb->error_count); - printk ("context :%p\n", urb->context); - printk ("complete :%p\n", urb->complete); -} - diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/core/usb.c Tue Feb 17 20:00:07 2004 @@ -678,17 +678,19 @@ } /** - * usb_alloc_dev - allocate a usb device structure (usbcore-internal) - * @parent: hub to which device is connected + * usb_alloc_dev - usb device constructor (usbcore-internal) + * @parent: hub to which device is connected; null to allocate a root hub * @bus: bus used to access the device + * @port: zero based index of port; ignored for root hubs * Context: !in_interrupt () * * Only hub drivers (including virtual root hub drivers for host * controllers) should ever call this. * - * This call is synchronous, and may not be used in an interrupt context. + * This call may not be used in a non-sleeping context. */ -struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus) +struct usb_device * +usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port) { struct usb_device *dev; @@ -705,11 +707,42 @@ } device_initialize(&dev->dev); + dev->dev.bus = &usb_bus_type; + dev->dev.dma_mask = bus->controller->dma_mask; + dev->dev.driver_data = &usb_generic_driver_data; + dev->dev.driver = &usb_generic_driver; dev->dev.release = usb_release_dev; dev->state = USB_STATE_ATTACHED; - if (!parent) + /* Save readable and stable topology id, distinguishing devices + * by location for diagnostics, tools, driver model, etc. The + * string is a path along hub ports, from the root. Each device's + * dev->devpath will be stable until USB is re-cabled, and hubs + * are often labeled with these port numbers. The bus_id isn't + * as stable: bus->busnum changes easily from modprobe order, + * cardbus or pci hotplugging, and so on. + */ + if (unlikely (!parent)) { dev->devpath [0] = '0'; + + dev->dev.parent = bus->controller; + sprintf (&dev->dev.bus_id[0], "usb%d", bus->busnum); + } else { + /* match any labeling on the hubs; it's one-based */ + if (parent->devpath [0] == '0') + snprintf (dev->devpath, sizeof dev->devpath, + "%d", port + 1); + else + snprintf (dev->devpath, sizeof dev->devpath, + "%s.%d", parent->devpath, port + 1); + + dev->dev.parent = &parent->dev; + sprintf (&dev->dev.bus_id[0], "%d-%s", + bus->busnum, dev->devpath); + + /* hub driver sets up TT records */ + } + dev->bus = bus; dev->parent = parent; INIT_LIST_HEAD(&dev->filelist); @@ -984,6 +1017,19 @@ return retval; } +static inline void usb_show_string(struct usb_device *dev, char *id, int index) +{ + char *buf; + + if (!index) + return; + if (!(buf = kmalloc(256, GFP_KERNEL))) + return; + if (usb_string(dev, index, buf, 256) > 0) + dev_printk(KERN_INFO, &dev->dev, "%s: %s\n", id, buf); + kfree(buf); +} + /* * By the time we get here, we chose a new device address * and is in the default state. We need to identify the thing and @@ -998,32 +1044,12 @@ */ #define NEW_DEVICE_RETRYS 2 #define SET_ADDRESS_RETRYS 2 -int usb_new_device(struct usb_device *dev, struct device *parent) +int usb_new_device(struct usb_device *dev) { int err = -EINVAL; int i; int j; int config; - - /* - * Set the driver for the usb device to point to the "generic" driver. - * This prevents the main usb device from being sent to the usb bus - * probe function. Yes, it's a hack, but a nice one :) - * - * Do it asap, so more driver model stuff (like the device.h message - * utilities) can be used in hcd submit/unlink code paths. - */ - usb_generic_driver.bus = &usb_bus_type; - dev->dev.parent = parent; - dev->dev.driver = &usb_generic_driver; - dev->dev.bus = &usb_bus_type; - dev->dev.driver_data = &usb_generic_driver_data; - if (dev->dev.bus_id[0] == 0) - sprintf (&dev->dev.bus_id[0], "%d-%s", - dev->bus->busnum, dev->devpath); - - /* dma masks come from the controller; readonly, except to hcd */ - dev->dev.dma_mask = parent->dma_mask; /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ... * it's fixed size except for full speed devices. diff -Nru a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c --- a/drivers/usb/gadget/ether.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/gadget/ether.c Tue Feb 17 20:00:08 2004 @@ -19,7 +19,7 @@ */ -#define DEBUG 1 +// #define DEBUG 1 // #define VERBOSE #include @@ -885,8 +885,11 @@ #ifndef DEV_CONFIG_CDC if (result == 0) { netif_carrier_on (dev->net); - if (netif_running (dev->net)) + if (netif_running (dev->net)) { + spin_unlock (&dev->lock); eth_start (dev, GFP_ATOMIC); + spin_lock (&dev->lock); + } } else { (void) usb_ep_disable (dev->in_ep); dev->in_ep = 0; @@ -1246,8 +1249,11 @@ #ifdef EP_STATUS_NUM issue_start_status (dev); #endif - if (netif_running (dev->net)) + if (netif_running (dev->net)) { + spin_unlock (&dev->lock); eth_start (dev, GFP_ATOMIC); + spin_lock (&dev->lock); + } } else { netif_stop_queue (dev->net); netif_carrier_off (dev->net); @@ -1414,16 +1420,14 @@ rx_submit (struct eth_dev *dev, struct usb_request *req, int gfp_flags) { struct sk_buff *skb; - int retval = 0; + int retval = -ENOMEM; size_t size; size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA); if ((skb = alloc_skb (size, gfp_flags)) == 0) { DEBUG (dev, "no rx skb\n"); - defer_kevent (dev, WORK_RX_MEMORY); - list_add (&req->list, &dev->rx_reqs); - return -ENOMEM; + goto enomem; } req->buf = skb->data; @@ -1433,11 +1437,14 @@ retval = usb_ep_queue (dev->out_ep, req, gfp_flags); if (retval == -ENOMEM) +enomem: defer_kevent (dev, WORK_RX_MEMORY); if (retval) { DEBUG (dev, "rx submit --> %d\n", retval); dev_kfree_skb_any (skb); + spin_lock (&dev->lock); list_add (&req->list, &dev->rx_reqs); + spin_unlock (&dev->lock); } return retval; } @@ -1502,6 +1509,7 @@ dev_kfree_skb_any (skb); if (!netif_running (dev->net)) { clean: + /* nobody reading rx_reqs, so no dev->lock */ list_add (&req->list, &dev->rx_reqs); req = 0; } @@ -1568,19 +1576,26 @@ static void rx_fill (struct eth_dev *dev, int gfp_flags) { struct usb_request *req; + unsigned long flags; clear_bit (WORK_RX_MEMORY, &dev->todo); /* fill unused rxq slots with some skb */ + spin_lock_irqsave (&dev->lock, flags); while (!list_empty (&dev->rx_reqs)) { req = container_of (dev->rx_reqs.next, struct usb_request, list); list_del_init (&req->list); + spin_unlock_irqrestore (&dev->lock, flags); + if (rx_submit (dev, req, gfp_flags) < 0) { defer_kevent (dev, WORK_RX_MEMORY); return; } + + spin_lock_irqsave (&dev->lock, flags); } + spin_unlock_irqrestore (&dev->lock, flags); } static void eth_work (void *_dev) @@ -1616,7 +1631,9 @@ } dev->stats.tx_packets++; + spin_lock (&dev->lock); list_add (&req->list, &dev->tx_reqs); + spin_unlock (&dev->lock); dev_kfree_skb_any (skb); atomic_dec (&dev->tx_qlen); @@ -1630,11 +1647,14 @@ int length = skb->len; int retval; struct usb_request *req = 0; + unsigned long flags; + spin_lock_irqsave (&dev->lock, flags); req = container_of (dev->tx_reqs.next, struct usb_request, list); list_del (&req->list); if (list_empty (&dev->tx_reqs)) netif_stop_queue (net); + spin_unlock_irqrestore (&dev->lock, flags); /* no buffer copies needed, unless the network stack did it * or the hardware can't use skb buffers. @@ -1675,9 +1695,11 @@ if (retval) { dev->stats.tx_dropped++; dev_kfree_skb_any (skb); + spin_lock_irqsave (&dev->lock, flags); if (list_empty (&dev->tx_reqs)) netif_start_queue (net); list_add (&req->list, &dev->tx_reqs); + spin_unlock_irqrestore (&dev->lock, flags); } return 0; } @@ -1798,9 +1820,7 @@ /* network device setup */ dev->net = net; SET_MODULE_OWNER (net); - net->priv = dev; strcpy (net->name, "usb%d"); - ether_setup (net); /* one random address for the gadget device ... both of these could * reasonably come from an id prom or a module parameter. diff -Nru a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c --- a/drivers/usb/gadget/file_storage.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/gadget/file_storage.c Tue Feb 17 20:00:08 2004 @@ -1,7 +1,7 @@ /* * file_storage.c -- File-backed USB Storage Gadget, for USB development * - * Copyright (C) 2003 Alan Stern + * Copyright (C) 2003, 2004 Alan Stern * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -244,7 +244,7 @@ #define DRIVER_DESC "File-backed Storage Gadget" #define DRIVER_NAME "g_file_storage" -#define DRIVER_VERSION "14 January 2004" +#define DRIVER_VERSION "26 January 2004" static const char longname[] = DRIVER_DESC; static const char shortname[] = DRIVER_NAME; @@ -435,7 +435,7 @@ #define LDBG(lun,fmt,args...) \ yprintk(lun , KERN_DEBUG , fmt , ## args) #define MDBG(fmt,args...) \ - printk(KERN_DEBUG DRIVER_NAME ": " fmt, ## args) + printk(KERN_DEBUG DRIVER_NAME ": " fmt , ## args) #else #define DBG(fsg,fmt,args...) \ do { } while (0) @@ -473,7 +473,7 @@ yprintk(lun , KERN_INFO , fmt , ## args) #define MINFO(fmt,args...) \ - printk(KERN_INFO DRIVER_NAME ": " fmt, ## args) + printk(KERN_INFO DRIVER_NAME ": " fmt , ## args) /*-------------------------------------------------------------------------*/ @@ -848,6 +848,7 @@ unsigned int nluns; struct lun *luns; struct lun *curlun; + struct completion lun_released; }; typedef void (*fsg_routine_t)(struct fsg_dev *); @@ -3771,6 +3772,13 @@ /*-------------------------------------------------------------------------*/ +static void lun_release(struct device *dev) +{ + struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev); + + complete(&fsg->lun_released); +} + static void fsg_unbind(struct usb_gadget *gadget) { struct fsg_dev *fsg = get_gadget_data(gadget); @@ -3782,12 +3790,14 @@ clear_bit(REGISTERED, &fsg->atomic_bitflags); /* Unregister the sysfs attribute files and the LUNs */ + init_completion(&fsg->lun_released); for (i = 0; i < fsg->nluns; ++i) { curlun = &fsg->luns[i]; if (curlun->registered) { device_remove_file(&curlun->dev, &dev_attr_ro); device_remove_file(&curlun->dev, &dev_attr_file); - device_unregister_wait(&curlun->dev); + device_unregister(&curlun->dev); + wait_for_completion(&fsg->lun_released); curlun->registered = 0; } } @@ -4140,6 +4150,7 @@ INFO(fsg, "failed to register LUN%d: %d\n", i, rc); else { curlun->registered = 1; + curlun->dev.release = lun_release; device_create_file(&curlun->dev, &dev_attr_ro); device_create_file(&curlun->dev, &dev_attr_file); } diff -Nru a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c --- a/drivers/usb/gadget/net2280.c Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/gadget/net2280.c Tue Feb 17 20:00:05 2004 @@ -534,7 +534,10 @@ } /* write just one packet at a time */ - count = min (ep->ep.maxpacket, total); + count = ep->ep.maxpacket; + if (count > total) /* min() cannot be used on a bitfield */ + count = total; + VDEBUG (ep->dev, "write %s fifo (IN) %d bytes%s req %p\n", ep->ep.name, count, (count != ep->ep.maxpacket) ? " (short)" : "", @@ -2197,7 +2200,8 @@ unsigned len; len = req->req.length - req->req.actual; - len = min (ep->ep.maxpacket, len); + if (len > ep->ep.maxpacket) + len = ep->ep.maxpacket; req->req.actual += len; /* if we wrote it all, we're usually done */ diff -Nru a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c --- a/drivers/usb/gadget/pxa2xx_udc.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/gadget/pxa2xx_udc.c Tue Feb 17 20:00:07 2004 @@ -1,6 +1,6 @@ /* * linux/drivers/usb/gadget/pxa2xx_udc.c - * Intel PXA2xx on-chip full speed USB device controllers + * Intel PXA2xx and IXP4xx on-chip full speed USB device controllers * * Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker) * Copyright (C) 2003 Robert Schwebel, Pengutronix @@ -59,27 +59,26 @@ #include -#include "pxa2xx_udc.h" - /* * This driver handles the USB Device Controller (UDC) in Intel's PXA 2xx * series processors. The UDC for the IXP 4xx series is very similar. + * There are fifteen endpoints, in addition to ep0. * * Such controller drivers work with a gadget driver. The gadget driver * returns descriptors, implements configuration and data protocols used * by the host to interact with this device, and allocates endpoints to * the different protocol interfaces. The controller driver virtualizes * usb hardware so that the gadget drivers will be more portable. - * + * * This UDC hardware wants to implement a bit too much USB protocol, so * it constrains the sorts of USB configuration change events that work. * The errata for these chips are misleading; some "fixed" bugs from * pxa250 a0/a1 b0/b1/b2 sure act like they're still there. */ -#define DRIVER_VERSION "7-Nov-2003" -#define DRIVER_DESC "PXA 2xx USB Device Controller driver" +#define DRIVER_VERSION "14-Dec-2003" +#define DRIVER_DESC "PXA 2xx USB Device Controller driver" static const char driver_name [] = "pxa2xx_udc"; @@ -95,6 +94,19 @@ #define UDC_PROC_FILE #endif +#ifdef CONFIG_ARCH_IXP425 +#undef USE_DMA + +/* cpu-specific register addresses are compiled in to this code */ +#ifdef CONFIG_ARCH_PXA +#error "Can't configure both IXP and PXA" +#endif + +#endif + +#include "pxa2xx_udc.h" + + #ifdef CONFIG_EMBEDDED /* few strings, and little code to use them */ #undef DEBUG @@ -215,7 +227,8 @@ if (!_ep || !desc || ep->desc || _ep->name == ep0name || desc->bDescriptorType != USB_DT_ENDPOINT || ep->bEndpointAddress != desc->bEndpointAddress - || ep->ep.maxpacket < desc->wMaxPacketSize) { + || ep->fifo_size < le16_to_cpu + (desc->wMaxPacketSize)) { DMSG("%s, bad ep or descriptor\n", __FUNCTION__); return -EINVAL; } @@ -230,7 +243,8 @@ /* hardware _could_ do smaller, but driver doesn't */ if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK - && desc->wMaxPacketSize != BULK_FIFO_SIZE) + && le16_to_cpu (desc->wMaxPacketSize) + != BULK_FIFO_SIZE) || !desc->wMaxPacketSize) { DMSG("%s, bad %s maxpacket\n", __FUNCTION__, _ep->name); return -ERANGE; @@ -246,6 +260,7 @@ ep->dma = -1; ep->stopped = 0; ep->pio_irqs = ep->dma_irqs = 0; + ep->ep.maxpacket = le16_to_cpu (desc->wMaxPacketSize); /* flush fifo (mostly for OUT buffers) */ pxa2xx_ep_fifo_flush (_ep); @@ -254,18 +269,18 @@ #ifdef USE_DMA /* for (some) bulk and ISO endpoints, try to get a DMA channel and - * bind it to the endpoint. otherwise use PIO. + * bind it to the endpoint. otherwise use PIO. */ switch (ep->bmAttributes) { case USB_ENDPOINT_XFER_ISOC: - if (desc->wMaxPacketSize % 32) + if (le16_to_cpu(desc->wMaxPacketSize) % 32) break; // fall through case USB_ENDPOINT_XFER_BULK: if (!use_dma || !ep->reg_drcmr) break; ep->dma = pxa_request_dma ((char *)_ep->name, - (desc->wMaxPacketSize > 64) + (le16_to_cpu (desc->wMaxPacketSize) > 64) ? DMA_PRIO_MEDIUM /* some iso */ : DMA_PRIO_LOW, dma_nodesc_handler, ep); @@ -437,7 +452,7 @@ { unsigned max; - max = ep->desc->wMaxPacketSize; + max = le16_to_cpu(ep->desc->wMaxPacketSize); do { unsigned count; int is_last, is_short; @@ -454,13 +469,7 @@ else is_last = 1; /* interrupt/iso maxpacket may not fill the fifo */ - is_short = unlikely (max < ep->ep.maxpacket); - - /* FIXME ep.maxpacket should be the current size, - * modified (for periodic endpoints) when the - * ep is enabled. do that, re-init as needed, - * and change maxpacket refs accordingly. - */ + is_short = unlikely (max < ep->fifo_size); } DBG(DBG_VERY_NOISY, "wrote %s %d bytes%s%s %d left %p\n", @@ -598,7 +607,7 @@ req->req.actual += min (count, bufferspace); } else /* zlp */ count = 0; - is_short = (count < ep->desc->wMaxPacketSize); + is_short = (count < ep->ep.maxpacket); DBG(DBG_VERY_NOISY, "read %s %02x, %d bytes%s req %p %d/%d\n", ep->ep.name, udccs, count, is_short ? "/S" : "", @@ -897,13 +906,14 @@ * we can report per-packet status. that also helps with dma. */ if (unlikely (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC - && req->req.length > ep->desc->wMaxPacketSize)) + && req->req.length > le16_to_cpu + (ep->desc->wMaxPacketSize))) return -EMSGSIZE; #ifdef USE_DMA // FIXME caller may already have done the dma mapping if (ep->dma >= 0) { - _req->dma = dma_map_single(&dev->dev.dev, + _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, ((ep->bEndpointAddress & USB_DIR_IN) != 0) ? DMA_TO_DEVICE @@ -1017,11 +1027,21 @@ unsigned long flags; ep = container_of(_ep, struct pxa2xx_ep, ep); - req = container_of(_req, struct pxa2xx_request, req); - if (!_ep || !_req || ep->ep.name == ep0name) + if (!_ep || ep->ep.name == ep0name) return -EINVAL; local_irq_save(flags); + + /* make sure it's actually queued on this endpoint */ + list_for_each_entry (req, &ep->queue, queue) { + if (&req->req == _req) + break; + } + if (&req->req != _req) { + local_irq_restore(flags); + return -EINVAL; + } + #ifdef USE_DMA if (ep->dma >= 0 && ep->queue.next == &req->queue && !ep->stopped) { cancel_dma(ep); @@ -1034,13 +1054,10 @@ } } else #endif - if (!list_empty(&req->queue)) done(ep, req, -ECONNRESET); - else - req = 0; - local_irq_restore(flags); - return req ? 0 : -EOPNOTSUPP; + local_irq_restore(flags); + return 0; } /*-------------------------------------------------------------------------*/ @@ -1386,8 +1403,10 @@ udc_clear_mask_UDCCR(UDCCR_UDE); +#ifdef CONFIG_ARCH_PXA /* Disable clock for USB device */ CKEN &= ~CKEN11_USB; +#endif ep0_idle (dev); dev->gadget.speed = USB_SPEED_UNKNOWN; @@ -1430,8 +1449,10 @@ { udc_clear_mask_UDCCR(UDCCR_UDE); +#ifdef CONFIG_ARCH_PXA /* Enable clock for USB device */ CKEN |= CKEN11_USB; +#endif /* try to clear these bits before we enable the udc */ udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR); @@ -1590,9 +1611,10 @@ local_irq_disable(); udc_disable(dev); stop_activity(dev, driver); + local_irq_enable(); + driver->unbind(&dev->gadget); dev->driver = 0; - local_irq_enable(); device_del (&dev->gadget.dev); device_remove_file(dev->dev, &dev_attr_function); @@ -1776,7 +1798,6 @@ * else use AREN (later) not SA|OPR * USIR0_IR0 acts edge sensitive */ - dev->req_pending = 0; } break; /* ... and here, even more ... */ @@ -1853,6 +1874,7 @@ /* pxa210/250 erratum 131 for B0/B1 says RNE lies. * still observed on a pxa255 a0. */ + DBG(DBG_VERBOSE, "e131\n"); nuke(ep, -EPROTO); /* read SETUP data, but don't trust it too much */ @@ -2043,7 +2065,7 @@ stop_activity (dev, dev->driver); } else { - dev_info(&dev->gadget.dev, "USB reset\n"); + INFO("USB reset\n"); dev->gadget.speed = USB_SPEED_FULL; LED_CONNECTED_ON; memset(&dev->stats, 0, sizeof dev->stats); @@ -2133,11 +2155,12 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 1, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS1, .reg_uddr = &UDDR1, - .reg_drcmr = &DRCMR25, + drcmr (25) }, .ep[2] = { .ep = { @@ -2146,12 +2169,13 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = 2, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS2, .reg_ubcr = &UBCR2, .reg_uddr = &UDDR2, - .reg_drcmr = &DRCMR26, + drcmr (26) }, #ifndef CONFIG_USB_PXA2XX_SMALL .ep[3] = { @@ -2161,11 +2185,12 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 3, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS3, .reg_uddr = &UDDR3, - .reg_drcmr = &DRCMR27, + drcmr (27) }, .ep[4] = { .ep = { @@ -2174,12 +2199,13 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = 4, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS4, .reg_ubcr = &UBCR4, .reg_uddr = &UDDR4, - .reg_drcmr = &DRCMR28, + drcmr (28) }, .ep[5] = { .ep = { @@ -2188,6 +2214,7 @@ .maxpacket = INT_FIFO_SIZE, }, .dev = &memory, + .fifo_size = INT_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 5, .bmAttributes = USB_ENDPOINT_XFER_INT, .reg_udccs = &UDCCS5, @@ -2202,11 +2229,12 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 6, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS6, .reg_uddr = &UDDR6, - .reg_drcmr = &DRCMR30, + drcmr (30) }, .ep[7] = { .ep = { @@ -2215,12 +2243,13 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = 7, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS7, .reg_ubcr = &UBCR7, .reg_uddr = &UDDR7, - .reg_drcmr = &DRCMR31, + drcmr (31) }, .ep[8] = { .ep = { @@ -2229,11 +2258,12 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 8, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS8, .reg_uddr = &UDDR8, - .reg_drcmr = &DRCMR32, + drcmr (32) }, .ep[9] = { .ep = { @@ -2242,12 +2272,13 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = 9, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS9, .reg_ubcr = &UBCR9, .reg_uddr = &UDDR9, - .reg_drcmr = &DRCMR33, + drcmr (33) }, .ep[10] = { .ep = { @@ -2256,6 +2287,7 @@ .maxpacket = INT_FIFO_SIZE, }, .dev = &memory, + .fifo_size = INT_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 10, .bmAttributes = USB_ENDPOINT_XFER_INT, .reg_udccs = &UDCCS10, @@ -2270,11 +2302,12 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 11, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS11, .reg_uddr = &UDDR11, - .reg_drcmr = &DRCMR35, + drcmr (35) }, .ep[12] = { .ep = { @@ -2283,12 +2316,13 @@ .maxpacket = BULK_FIFO_SIZE, }, .dev = &memory, + .fifo_size = BULK_FIFO_SIZE, .bEndpointAddress = 12, .bmAttributes = USB_ENDPOINT_XFER_BULK, .reg_udccs = &UDCCS12, .reg_ubcr = &UBCR12, .reg_uddr = &UDDR12, - .reg_drcmr = &DRCMR36, + drcmr (36) }, .ep[13] = { .ep = { @@ -2297,11 +2331,12 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 13, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS13, .reg_uddr = &UDDR13, - .reg_drcmr = &DRCMR37, + drcmr (37) }, .ep[14] = { .ep = { @@ -2310,12 +2345,13 @@ .maxpacket = ISO_FIFO_SIZE, }, .dev = &memory, + .fifo_size = ISO_FIFO_SIZE, .bEndpointAddress = 14, .bmAttributes = USB_ENDPOINT_XFER_ISOC, .reg_udccs = &UDCCS14, .reg_ubcr = &UBCR14, .reg_uddr = &UDDR14, - .reg_drcmr = &DRCMR38, + drcmr (38) }, .ep[15] = { .ep = { @@ -2324,6 +2360,7 @@ .maxpacket = INT_FIFO_SIZE, }, .dev = &memory, + .fifo_size = INT_FIFO_SIZE, .bEndpointAddress = USB_DIR_IN | 15, .bmAttributes = USB_ENDPOINT_XFER_INT, .reg_udccs = &UDCCS15, @@ -2333,8 +2370,15 @@ }; #define CP15R0_VENDOR_MASK 0xffffe000 + +#if defined(CONFIG_ARCH_PXA) #define CP15R0_XSCALE_VALUE 0x69052000 /* intel/arm/xscale */ +#elif defined(CONFIG_ARCH_IXP425) +#define CP15R0_XSCALE_VALUE 0x69054000 /* intel/arm/ixp425 */ + +#endif + #define CP15R0_PROD_MASK 0x000003f0 #define PXA25x 0x00000100 /* and PXA26x */ #define PXA210 0x00000120 @@ -2355,6 +2399,7 @@ #define PXA210_B2 0x00000124 #define PXA210_B1 0x00000123 #define PXA210_B0 0x00000122 +#define IXP425_A0 0x000001c1 /* * probe - binds to the platform device @@ -2374,6 +2419,7 @@ /* trigger chiprev-specific logic */ switch (chiprev & CP15R0_PRODREV_MASK) { +#if defined(CONFIG_ARCH_PXA) case PXA255_A0: dev->has_cfr = 1; break; @@ -2388,6 +2434,11 @@ /* fall through */ case PXA250_C0: case PXA210_C0: break; +#elif defined(CONFIG_ARCH_IXP425) + case IXP425_A0: + out_dma = 0; + break; +#endif default: out_dma = 0; printk(KERN_ERR "%s: unrecognized processor: %08x\n", @@ -2443,6 +2494,7 @@ } dev->got_irq = 1; +#ifdef CONFIG_ARCH_LUBBOCK if (machine_is_lubbock()) { disable_irq(LUBBOCK_USB_DISC_IRQ); retval = request_irq(LUBBOCK_USB_DISC_IRQ, @@ -2457,7 +2509,7 @@ } dev->got_disc = 1; } - +#endif create_proc_files(); return 0; diff -Nru a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h --- a/drivers/usb/gadget/pxa2xx_udc.h Tue Feb 17 20:00:14 2004 +++ b/drivers/usb/gadget/pxa2xx_udc.h Tue Feb 17 20:00:14 2004 @@ -52,14 +52,15 @@ struct list_head queue; unsigned long pio_irqs; unsigned long dma_irqs; - int dma; + short dma; + unsigned short fifo_size; u8 bEndpointAddress; u8 bmAttributes; unsigned stopped : 1; unsigned dma_fixup : 1; - + /* UDCCS = UDC Control/Status for this EP * UBCR = UDC Byte Count Remaining (contents of OUT fifo) * UDDR = UDC Endpoint Data Register (the fifo) @@ -68,7 +69,12 @@ volatile u32 *reg_udccs; volatile u32 *reg_ubcr; volatile u32 *reg_uddr; +#ifdef USE_DMA volatile u32 *reg_drcmr; +#define drcmr(n) .reg_drcmr = & DRCMR ## n , +#else +#define drcmr(n) +#endif }; struct pxa2xx_request { @@ -76,7 +82,7 @@ struct list_head queue; }; -enum ep0_state { +enum ep0_state { EP0_IDLE, EP0_IN_DATA_PHASE, EP0_OUT_DATA_PHASE, @@ -181,14 +187,14 @@ { if (!the_controller->mach->udc_command) return; - the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); + the_controller->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); } static inline void let_usb_appear(void) { if (!the_controller->mach->udc_command) return; - the_controller->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); + the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); } /*-------------------------------------------------------------------------*/ @@ -305,7 +311,7 @@ #define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0) #define WARN(stuff...) printk(KERN_WARNING "udc: " stuff) - +#define INFO(stuff...) printk(KERN_INFO "udc: " stuff) #endif /* __LINUX_USB_GADGET_PXA2XX_H */ diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c --- a/drivers/usb/host/ehci-hcd.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/ehci-hcd.c Tue Feb 17 20:00:07 2004 @@ -473,7 +473,7 @@ /* wire up the root hub */ bus = hcd_to_bus (hcd); - bus->root_hub = udev = usb_alloc_dev (NULL, bus); + bus->root_hub = udev = usb_alloc_dev (NULL, bus, 0); if (!udev) { done2: ehci_mem_cleanup (ehci); @@ -680,7 +680,7 @@ /*-------------------------------------------------------------------------*/ -static void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) +static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) { struct ehci_hcd *ehci = hcd_to_ehci (hcd); u32 status; @@ -690,6 +690,12 @@ status = readl (&ehci->regs->status); + /* shared irq */ + if (status == 0) { + spin_unlock (&ehci->lock); + return IRQ_NONE; + } + /* e.g. cardbus physical eject */ if (status == ~(u32) 0) { ehci_dbg (ehci, "device removed\n"); @@ -743,6 +749,7 @@ ehci_work (ehci, regs); done: spin_unlock (&ehci->lock); + return IRQ_HANDLED; } /*-------------------------------------------------------------------------*/ diff -Nru a/drivers/usb/host/hc_sl811_rh.c b/drivers/usb/host/hc_sl811_rh.c --- a/drivers/usb/host/hc_sl811_rh.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/hc_sl811_rh.c Tue Feb 17 20:00:07 2004 @@ -559,7 +559,7 @@ struct usb_device *usb_dev; hci->rh.devnum = 0; - usb_dev = usb_alloc_dev (NULL, hci->bus); + usb_dev = usb_alloc_dev (NULL, hci->bus, 0); if (!usb_dev) return -ENOMEM; diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c --- a/drivers/usb/host/ohci-hcd.c Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/host/ohci-hcd.c Tue Feb 17 20:00:05 2004 @@ -81,6 +81,7 @@ #endif #include +#include #include #include #include @@ -103,7 +104,7 @@ #include -#define DRIVER_VERSION "2003 Oct 13" +#define DRIVER_VERSION "2004 Feb 02" #define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" #define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" @@ -112,8 +113,7 @@ // #define OHCI_VERBOSE_DEBUG /* not always helpful */ /* For initializing controller (mask in an HCFS mode too) */ -#define OHCI_CONTROL_INIT \ - (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE +#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR #define OHCI_UNLINK_TIMEOUT (HZ / 10) @@ -133,6 +133,12 @@ #include "ohci-mem.c" #include "ohci-q.c" + +/* Some boards don't support per-port power switching */ +static int power_switching = 0; +module_param (power_switching, bool, 0); +MODULE_PARM_DESC (power_switching, "true (not default) to switch port power"); + /*-------------------------------------------------------------------------*/ /* @@ -288,11 +294,8 @@ * with HC dead, we won't respect hc queue pointers * any more ... just clean up every urb's memory. */ - if (urb->hcpriv) { - spin_unlock (&ohci->lock); + if (urb->hcpriv) finish_urb (ohci, urb, NULL); - spin_lock (&ohci->lock); - } } spin_unlock_irqrestore (&ohci->lock, flags); return 0; @@ -413,6 +416,14 @@ ohci->hc_control = readl (&ohci->regs->control); ohci->hc_control &= OHCI_CTRL_RWC; /* hcfs 0 = RESET */ writel (ohci->hc_control, &ohci->regs->control); + if (power_switching) { + unsigned ports = roothub_a (ohci) & RH_A_NDP; + + /* power down each port */ + for (temp = 0; temp < ports; temp++) + writel (RH_PS_LSDA, + &ohci->regs->roothub.portstatus [temp]); + } // flush those pci writes (void) readl (&ohci->regs->control); wait_ms (50); @@ -502,15 +513,21 @@ /* NSC 87560 and maybe others */ tmp |= RH_A_NOCP; tmp &= ~(RH_A_POTPGT | RH_A_NPS); + } else if (power_switching) { + /* act like most external hubs: use per-port power + * switching and overcurrent reporting. + */ + tmp &= ~(RH_A_NPS | RH_A_NOCP); + tmp |= RH_A_PSM | RH_A_OCPM; } else { /* hub power always on; required for AMD-756 and some - * Mac platforms, use this mode everywhere by default + * Mac platforms. ganged overcurrent reporting, if any. */ tmp |= RH_A_NPS; } writel (tmp, &ohci->regs->roothub.a); writel (RH_HS_LPSC, &ohci->regs->roothub.status); - writel (0, &ohci->regs->roothub.b); + writel (power_switching ? RH_B_PPCM : 0, &ohci->regs->roothub.b); // flush those pci writes (void) readl (&ohci->regs->control); @@ -519,7 +536,7 @@ /* connect the virtual root hub */ bus = hcd_to_bus (&ohci->hcd); - bus->root_hub = udev = usb_alloc_dev (NULL, bus); + bus->root_hub = udev = usb_alloc_dev (NULL, bus, 0); ohci->hcd.state = USB_STATE_RUNNING; if (!udev) { disable (ohci); @@ -545,7 +562,7 @@ /* an interrupt happens */ -static void ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) +static irqreturn_t ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); struct ohci_regs *regs = ohci->regs; @@ -560,11 +577,11 @@ } else if ((ints = readl (®s->intrstatus)) == ~(u32)0) { disable (ohci); ohci_dbg (ohci, "device removed!\n"); - return; + return IRQ_HANDLED; /* interrupt for some other device? */ } else if ((ints &= readl (®s->intrenable)) == 0) { - return; + return IRQ_NONE; } if (ints & OHCI_INTR_UE) { @@ -604,6 +621,8 @@ // flush those pci writes (void) readl (&ohci->regs->control); } + + return IRQ_HANDLED; } /*-------------------------------------------------------------------------*/ diff -Nru a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c --- a/drivers/usb/host/ohci-hub.c Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/host/ohci-hub.c Tue Feb 17 20:00:06 2004 @@ -128,6 +128,8 @@ desc->bDescLength = 7 + 2 * temp; temp = 0; + if (rh & RH_A_NPS) /* no power switching? */ + temp |= 0x0002; if (rh & RH_A_PSM) /* per-port power switching? */ temp |= 0x0001; if (rh & RH_A_NOCP) /* no overcurrent reporting? */ diff -Nru a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c --- a/drivers/usb/host/ohci-omap.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/ohci-omap.c Tue Feb 17 20:00:07 2004 @@ -134,7 +134,7 @@ writel(readl(ULPD_SOFT_REQ_REG) | SOFT_USB_REQ, ULPD_SOFT_REQ_REG); - outl(inl(ULPD_STATUS_REQ_REG) | USB_HOST_DPLL_REQ, + writel(readl(ULPD_STATUS_REQ_REG) | USB_HOST_DPLL_REQ, ULPD_STATUS_REQ_REG); } @@ -248,7 +248,7 @@ val |= (1 << 2); /* Disable pulldown on integrated transceiver DM */ val |= (1 << 1); /* Disable pulldown on integraded transceiver DP */ - outl(val, USB_TRANSCEIVER_CTRL); + writel(val, USB_TRANSCEIVER_CTRL); /* Set the USB0_TRX_MODE */ val = 0; @@ -256,7 +256,7 @@ val &= ~DEV_IDLE_EN; val &= ~(7 << 16); /* Clear USB0_TRX_MODE */ val |= (3 << 16); /* 0 or 3, 6-wire DAT/SE0, TRM p 15-159 */ - outl(val, OTG_SYSCON_1); + writel(val, OTG_SYSCON_1); /* * Control via OTG, see TRM p 15-163 @@ -275,10 +275,10 @@ val |= (4 << 16); /* Must be 4 */ val |= USBX_SYNCHRO; /* Must be set */ val |= SRP_VBUS; - outl(val, OTG_SYSCON_2); + writel(val, OTG_SYSCON_2); /* Enable OTG idle */ - //outl(inl(OTG_SYSCON_1) | OTG_IDLE_EN, OTG_SYSCON_1); + //writel(readl(OTG_SYSCON_1) | OTG_IDLE_EN, OTG_SYSCON_1); return 0; } @@ -631,7 +631,7 @@ .end = OMAP_OHCI_BASE + OMAP_OHCI_SIZE, }, .irq = { - INT_OHCI, + INT_USB_HHC_1, }, }; diff -Nru a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c --- a/drivers/usb/host/ohci-pci.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/ohci-pci.c Tue Feb 17 20:00:07 2004 @@ -266,6 +266,9 @@ if (ohci->ed_bulktail) ohci->hc_control |= OHCI_CTRL_BLE; } + if (hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs + || hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs) + ohci->hc_control |= OHCI_CTRL_PLE|OHCI_CTRL_IE; hcd->state = USB_STATE_RUNNING; writel (ohci->hc_control, &ohci->regs->control); diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c --- a/drivers/usb/host/ohci-q.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/host/ohci-q.c Tue Feb 17 20:00:08 2004 @@ -30,7 +30,7 @@ /* * URB goes back to driver, and isn't reissued. * It's completely gone from HC data structures. - * PRECONDITION: no locks held, irqs blocked (Giveback can call into HCD.) + * PRECONDITION: ohci lock held, irqs blocked. */ static void finish_urb (struct ohci_hcd *ohci, struct urb *urb, struct pt_regs *regs) @@ -55,7 +55,6 @@ } spin_unlock (&urb->lock); - // what lock protects these? switch (usb_pipetype (urb->pipe)) { case PIPE_ISOCHRONOUS: hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs--; @@ -68,7 +67,18 @@ #ifdef OHCI_VERBOSE_DEBUG urb_print (urb, "RET", usb_pipeout (urb->pipe)); #endif + + /* urb->complete() can reenter this HCD */ + spin_unlock (&ohci->lock); usb_hcd_giveback_urb (&ohci->hcd, urb, regs); + spin_lock (&ohci->lock); + + /* stop periodic dma if it's not needed */ + if (hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs == 0 + && hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs == 0) { + ohci->hc_control &= ~(OHCI_CTRL_PLE|OHCI_CTRL_IE); + writel (ohci->hc_control, &ohci->regs->control); + } } @@ -549,6 +559,7 @@ int cnt = 0; u32 info = 0; int is_out = usb_pipeout (urb->pipe); + int periodic = 0; /* OHCI handles the bulk/interrupt data toggles itself. We just * use the device toggle bits for resetting, and rely on the fact @@ -578,7 +589,8 @@ */ case PIPE_INTERRUPT: /* ... and periodic urbs have extra accounting */ - hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs++; + periodic = hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs++ == 0 + && hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs == 0; /* FALLTHROUGH */ case PIPE_BULK: info = is_out @@ -646,9 +658,17 @@ data + urb->iso_frame_desc [cnt].offset, urb->iso_frame_desc [cnt].length, urb, cnt); } - hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs++; + periodic = hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs++ == 0 + && hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs == 0; break; } + + /* start periodic dma if needed */ + if (periodic) { + ohci->hc_control |= OHCI_CTRL_PLE|OHCI_CTRL_IE; + writel (ohci->hc_control, &ohci->regs->control); + } + // ASSERT (urb_priv->length == cnt); } @@ -949,9 +969,7 @@ /* if URB is done, clean up */ if (urb_priv->td_cnt == urb_priv->length) { modified = completed = 1; - spin_unlock (&ohci->lock); finish_urb (ohci, urb, regs); - spin_lock (&ohci->lock); } } if (completed && !list_empty (&ed->td_list)) @@ -1030,11 +1048,8 @@ urb_priv->td_cnt++; /* If all this urb's TDs are done, call complete() */ - if (urb_priv->td_cnt == urb_priv->length) { - spin_unlock (&ohci->lock); + if (urb_priv->td_cnt == urb_priv->length) finish_urb (ohci, urb, regs); - spin_lock (&ohci->lock); - } /* clean schedule: unlink EDs that are no longer busy */ if (list_empty (&ed->td_list)) diff -Nru a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c --- a/drivers/usb/host/ohci-sa1111.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/ohci-sa1111.c Tue Feb 17 20:00:07 2004 @@ -254,8 +254,6 @@ hcd_buffer_destroy (hcd); usb_deregister_bus (&hcd->self); - if (atomic_read (&hcd->self.refcnt) != 1) - err ("%s: %s, count != 1", __FUNCTION__, hcd->self.bus_name); base = hcd->regs; hcd->driver->hcd_free (hcd); diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c --- a/drivers/usb/host/uhci-hcd.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/host/uhci-hcd.c Tue Feb 17 20:00:08 2004 @@ -1,7 +1,7 @@ /* * Universal Host Controller Interface driver for USB. * - * Maintainer: Johannes Erdfelt + * Maintainer: Alan Stern * * (C) Copyright 1999 Linus Torvalds * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com @@ -668,7 +668,6 @@ urbp->inserttime = jiffies; urbp->fsbrtime = jiffies; urbp->urb = urb; - urbp->dev = urb->dev; INIT_LIST_HEAD(&urbp->td_list); INIT_LIST_HEAD(&urbp->queue_list); @@ -1909,7 +1908,7 @@ spin_unlock_irqrestore(&uhci->urb_remove_list_lock, flags); } -static void uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs) +static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned int io_addr = uhci->io_addr; @@ -1922,7 +1921,7 @@ */ status = inw(io_addr + USBSTS); if (!status) /* shared interrupt, not mine */ - return; + return IRQ_NONE; outw(status, io_addr + USBSTS); /* Clear it */ if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) { @@ -1963,6 +1962,7 @@ spin_unlock(&uhci->urb_list_lock); uhci_finish_completion(hcd, regs); + return IRQ_HANDLED; } static void reset_hc(struct uhci_hcd *uhci) @@ -2315,7 +2315,7 @@ uhci->rh_numports = port; - hcd->self.root_hub = udev = usb_alloc_dev(NULL, &hcd->self); + hcd->self.root_hub = udev = usb_alloc_dev(NULL, &hcd->self, 0); if (!udev) { err("unable to allocate root hub"); goto err_alloc_root_hub; diff -Nru a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h --- a/drivers/usb/host/uhci-hcd.h Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/host/uhci-hcd.h Tue Feb 17 20:00:07 2004 @@ -372,7 +372,6 @@ struct list_head urb_list; struct urb *urb; - struct usb_device *dev; struct uhci_qh *qh; /* QH for this URB */ struct list_head td_list; /* P: urb->lock */ diff -Nru a/drivers/usb/image/Kconfig b/drivers/usb/image/Kconfig --- a/drivers/usb/image/Kconfig Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/image/Kconfig Tue Feb 17 20:00:05 2004 @@ -17,19 +17,6 @@ To compile this driver as a module, choose M here: the module will be called mdc800. -config USB_SCANNER - tristate "USB Scanner support (OBSOLETE)" - depends on USB - help - Say Y here if you want to connect a USB scanner to your computer's - USB port. Please read for more - information. - - This driver has been obsoleted by support via libusb. - - To compile this driver as a module, choose M here: the - module will be called scanner. - config USB_MICROTEK tristate "Microtek X6USB scanner support" depends on USB && SCSI diff -Nru a/drivers/usb/image/Makefile b/drivers/usb/image/Makefile --- a/drivers/usb/image/Makefile Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/image/Makefile Tue Feb 17 20:00:05 2004 @@ -5,4 +5,3 @@ obj-$(CONFIG_USB_MDC800) += mdc800.o obj-$(CONFIG_USB_HPUSBSCSI) += hpusbscsi.o obj-$(CONFIG_USB_MICROTEK) += microtek.o -obj-$(CONFIG_USB_SCANNER) += scanner.o diff -Nru a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c --- a/drivers/usb/image/scanner.c Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,1216 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * Driver for USB Scanners (linux-2.6) - * - * Copyright (C) 1999, 2000, 2001, 2002 David E. Nelson - * Copyright (C) 2002, 2003 Henning Meier-Geinitz - * - * Portions may be copyright Brad Keryan and Michael Gee. - * - * Previously maintained by Brian Beattie - * - * Current maintainer: Henning Meier-Geinitz - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Originally based upon mouse.c (Brad Keryan) and printer.c (Michael Gee). - * - * History - * - * 0.1 8/31/1999 - * - * Developed/tested using linux-2.3.15 with minor ohci.c changes to - * support short packets during bulk xfer mode. Some testing was - * done with ohci-hcd but the performance was low. Very limited - * testing was performed with uhci but I was unable to get it to - * work. Initial relase to the linux-usb development effort. - * - * - * 0.2 10/16/1999 - * - * - Device can't be opened unless a scanner is plugged into the USB. - * - Finally settled on a reasonable value for the I/O buffer's. - * - Cleaned up write_scanner() - * - Disabled read/write stats - * - A little more code cleanup - * - * - * 0.3 10/18/1999 - * - * - Device registration changed to reflect new device - * allocation/registration for linux-2.3.22+. - * - Adopted David Brownell's technique for - * assigning bulk endpoints. - * - Removed unnecessary #include's - * - Scanner model now reported via syslog INFO after being detected - * *and* configured. - * - Added user specified vendor:product USB ID's which can be passed - * as module parameters. - * - * - * 0.3.1 - * - * - Applied patches for linux-2.3.25. - * - Error number reporting changed to reflect negative return codes. - * - * - * 0.3.2 - * - * - Applied patches for linux-2.3.26 to scanner_init(). - * - Debug read/write stats now report values as signed decimal. - * - * - * 0.3.3 - * - * - Updated the bulk_msg() calls to usb usb_bulk_msg(). - * - Added a small delay in the write_scanner() method to aid in - * avoiding NULL data reads on HP scanners. We'll see how this works. - * - Return values from usb_bulk_msg() now ignore positive values for - * use with the ohci driver. - * - Added conditional debugging instead of commenting/uncommenting - * all over the place. - * - kfree()'d the pointer after using usb_string() as documented in - * linux-usb-api.txt. - * - Added usb_set_configuration(). It got lost in version 0.3 -- ack! - * - Added the HP 5200C USB Vendor/Product ID's. - * - * - * 0.3.4 1/23/2000 - * - * - Added Greg K-H's patch for better handling of - * Product/Vendor detection. - * - The driver now autoconfigures its endpoints including interrupt - * endpoints if one is detected. The concept was originally based - * upon David Brownell's method. - * - Added some Seiko/Epson ID's. Thanks to Karl Heinz - * Kremer . - * - Added some preliminary ioctl() calls for the PV8630 which is used - * by the HP4200. The ioctl()'s still have to be registered. Thanks - * to Adrian Perez Jorge . - * - Moved/migrated stuff to scanner.h - * - Removed the usb_set_configuration() since this is handled by - * the usb_new_device() routine in usb.c. - * - Added the HP 3300C. Thanks to Bruce Tenison. - * - Changed user specified vendor/product id so that root hub doesn't - * get falsely attached to. Thanks to Greg K-H. - * - Added some Mustek ID's. Thanks to Gernot Hoyler - * . - * - Modified the usb_string() reporting. See kfree() comment above. - * - Added Umax Astra 2000U. Thanks to Doug Alcorn . - * - Updated the printk()'s to use the info/warn/dbg macros. - * - Updated usb_bulk_msg() argument types to fix gcc warnings. - * - * - * 0.4 2/4/2000 - * - * - Removed usb_string() from probe_scanner since the core now does a - * good job of reporting what was connnected. - * - Finally, simultaneous multiple device attachment! - * - Fixed some potential memory freeing issues should memory allocation - * fail in probe_scanner(); - * - Some fixes to disconnect_scanner(). - * - Added interrupt endpoint support. - * - Added Agfa SnapScan Touch. Thanks to Jan Van den Bergh - * . - * - Added Umax 1220U ID's. Thanks to Maciek Klimkowski - * . - * - Fixed bug in write_scanner(). The buffer was not being properly - * updated for writes larger than OBUF_SIZE. Thanks to Henrik - * Johansson for identifying it. - * - Added Microtek X6 ID's. Thanks to Oliver Neukum - * . - * - * - * 0.4.1 2/15/2000 - * - * - Fixed 'count' bug in read_scanner(). Thanks to Henrik - * Johansson for identifying it. Amazing - * it has worked this long. - * - Fixed '>=' bug in both read/write_scanner methods. - * - Cleaned up both read/write_scanner() methods so that they are - * a little more readable. - * - Added a lot of Microtek ID's. Thanks to Adrian Perez Jorge. - * - Adopted the __initcall(). - * - Added #include to scanner.h for __initcall(). - * - Added one liner in irq_scanner() to keep gcc from complaining - * about an unused variable (data) if debugging was disabled - * in scanner.c. - * - Increased the timeout parameter in read_scanner() to 120 Secs. - * - * - * 0.4.2 3/23/2000 - * - * - Added Umax 1236U ID. Thanks to Philipp Baer . - * - Added Primax, ReadyScan, Visioneer, Colorado, and Genius ID's. - * Thanks to Adrian Perez Jorge . - * - Fixed error number reported for non-existant devices. Thanks to - * Spyridon Papadimitriou . - * - Added Acer Prisascan 620U ID's. Thanks to Joao . - * - Replaced __initcall() with module_init()/module_exit(). Updates - * from patch-2.3.48. - * - Replaced file_operations structure with new syntax. Updates - * from patch-2.3.49. - * - Changed #include "usb.h" to #include - * - Added #define SCN_IOCTL to exclude development areas - * since 2.4.x is about to be released. This mainly affects the - * ioctl() stuff. See scanner.h for more details. - * - Changed the return value for signal_pending() from -ERESTARTSYS to - * -EINTR. - * - * - * 0.4.3 4/30/2000 - * - * - Added Umax Astra 2200 ID. Thanks to Flynn Marquardt - * . - * - Added iVina 1200U ID. Thanks to Dyson Lin . - * - Added access time update for the device file courtesy of Paul - * Mackerras . This allows a user space daemon - * to turn the lamp off for a Umax 1220U scanner after a prescribed - * time. - * - Fixed HP S20 ID's. Thanks to Ruud Linders . - * - Added Acer ScanPrisa 620U ID. Thanks to Oliver - * Schwartz via sane-devel mail list. - * - Fixed bug in read_scanner for copy_to_user() function. The returned - * value should be 'partial' not 'this_read'. - * - Fixed bug in read_scanner. 'count' should be decremented - * by 'this_read' and not by 'partial'. This resulted in twice as many - * calls to read_scanner() for small amounts of data and possibly - * unexpected returns of '0'. Thanks to Karl Heinz - * Kremer and Alain Knaff - * for discovering this. - * - Integrated Randy Dunlap's patch for a - * scanner lookup/ident table. Thanks Randy. - * - Documentation updates. - * - Added wait queues to read_scanner(). - * - * - * 0.4.3.1 - * - * - Fixed HP S20 ID's...again..sigh. Thanks to Ruud - * Linders . - * - * 0.4.4 - * - Added addtional Mustek ID's (BearPaw 1200, 600 CU, 1200 USB, - * and 1200 UB. Thanks to Henning Meier-Geinitz . - * - Added the Vuego Scan Brisa 340U ID's. Apparently this scanner is - * marketed by Acer Peripherals as a cheap 300 dpi model. Thanks to - * David Gundersen . - * - Added the Epson Expression1600 ID's. Thanks to Karl Heinz - * Kremer . - * - * 0.4.5 2/28/2001 - * - Added Mustek ID's (BearPaw 2400, 1200 CU Plus, BearPaw 1200F). - * Thanks to Henning Meier-Geinitz . - * - Added read_timeout module parameter to override RD_NAK_TIMEOUT - * when read()'ing from devices. - * - Stalled pipes are now checked and cleared with - * usb_clear_halt() for the read_scanner() function. This should - * address the "funky result: -32" error messages. - * - Removed Microtek scanner ID's. Microtek scanners are now - * supported via the drivers/usb/microtek.c driver. - * - Added scanner specific read timeout's. - * - Return status errors are NEGATIVE!!! This should address the - * "funky result: -110" error messages. - * - Replaced USB_ST_TIMEOUT with ETIMEDOUT. - * - rd_nak was still defined in MODULE_PARM. It's been updated with - * read_timeout. Thanks to Mark W. Webb for - * reporting this bug. - * - Added Epson Perfection 1640SU and 1640SU Photo. Thanks to - * Jean-Luc and Manuel - * Pelayo . Reported to work fine by Manuel. - * - * 0.4.6 9/27/2001 - * - Added IOCTL's to report back scanner USB ID's. Thanks to - * Karl Heinz - * - Added Umax Astra 2100U ID's. Thanks to Ron - * Wellsted . - * and Manuel Pelayo . - * - Added HP 3400 ID's. Thanks to Harald Hannelius - * and Bertrik Sikken . Reported to work at - * htpp://home.zonnet.nl/bertrik/hp3300c/hp3300c.htm. - * - Added Minolta Dimage Scan Dual II ID's. Thanks to Jose Paulo - * Moitinho de Almeida - * - Confirmed addition for SnapScan E20. Thanks to Steffen Hübner - * . - * - Added Lifetec LT9385 ID's. Thanks to Van Bruwaene Kris - * - * - Added Agfa SnapScan e26 ID's. Reported to work with SANE - * 1.0.5. Thanks to Falk Sauer . - * - Added HP 4300 ID's. Thanks to Stefan Schlosser - * . - * - Added Relisis Episode ID's. Thanks to Manfred - * Morgner . - * - Added many Acer ID's. Thanks to Oliver - * Schwartz . - * - Added Snapscan e40 ID's. Thanks to Oliver - * Schwartz . - * - Thanks to Oliver Neukum - * for helping with races. - * - Added Epson Perfection 1650 ID's. Thanks to Karl Heinz - * Kremer . - * - Added Epson Perfection 2450 ID's (aka GT-9700 for the Japanese - * market). Thanks to Karl Heinz Kremer . - * - Added Mustek 600 USB ID's. Thanks to Marcus - * Alanen . - * - Added Acer ScanPrisa 1240UT ID's. Thanks to Morgan - * Collins . - * - Incorporated devfs patches!! Thanks to Tom Rini - * , Pavel Roskin , - * Greg KH , Yves Duret , - * Flavio Stanchina . - * - Removed Minolta ScanImage II. This scanner uses USB SCSI. Thanks - * to Oliver Neukum for pointing - * this out. - * - Added additional SMP locking. Thanks to David Brownell and - * Oliver Neukum for their help. - * - Added version reporting - reports for both module load and modinfo - * - Started path to hopefully straighten/clean out ioctl()'s. - * - Users are now notified to consult the Documentation/usb/scanner.txt - * for common error messages rather than the maintainer. - * - * 0.4.7 11/28/2001 - * - Fixed typo in Documentation/usb/scanner.txt. Thanks to - * Karel for pointing it out. - * - Added ID's for a Memorex 6136u. Thanks to Álvaro Gaspar de - * Valenzuela" . - * - Added ID's for Agfa e25. Thanks to Heinrich - * Rust . Also reported to work with - * Linux and SANE (?). - * - Added Canon FB620U, D646U, and 1220U ID's. Thanks to Paul - * Rensing . For more info - * on Linux support for these models, contact - * salvestrini@users.sourceforge.net. - * - Added Plustek OpticPro UT12, OpticPro U24, KYE/Genius - * ColorPage-HR6 V2 ID's in addition to many "Unknown" models - * under those vendors. Thanks to - * Jaeger, Gerhard" . These scanner are - * apparently based upon the LM983x IC's. - * - Applied Frank's patch that addressed some locking and module - * referencing counts. Thanks to both - * Frank Zago and - * Oliver Neukum <520047054719-0001@t-online.de> for reviewing/testing. - * - * 0.4.8 5/30/2002 - * - Added Mustek BearPaw 2400 TA. Thanks to Sergey - * Vlasov . - * - Added Mustek 1200UB Plus and Mustek BearPaw 1200 CU ID's. These use - * the Grandtech GT-6801 chip. Thanks to Henning - * Meier-Geinitz . - * - Increased Epson timeout to 60 secs as requested from - * Karl Heinz Kremer . - * - Changed maintainership from David E. Nelson to Brian - * Beattie . - * - * 0.4.9 12/19/2002 - * - Added vendor/product ids for Nikon, Mustek, Plustek, Genius, Epson, - * Canon, Umax, Hewlett-Packard, Benq, Agfa, Minolta scanners. - * Thanks to Dieter Faulbaum , Stian Jordet - * , "Yann E. MORIN" , - * "Jaeger, Gerhard" , Ira Childress - * , Till Kamppeter , - * Ed Hamrick , Oliver Schwartz - * and everyone else who sent ids. - * - Some Benq, Genius and Plustek ids are identified now. - * - Accept scanners with only one bulk (in) endpoint (thanks to Sergey - * Vlasov ). - * - Accept devices with more than one interface. Only use interfaces that - * look like belonging to scanners. - * - Fix compilation error when debugging is enabled. - * - Add locking to ioctl_scanner(). Thanks to Oliver Neukum - * . - * - * 0.4.10 01/07/2003 - * - Added vendor/product ids for Artec, Canon, Compaq, Epson, HP, Microtek - * and Visioneer scanners. Thanks to William Lam , - * Till Kamppeter and others for all the ids. - * - Cleaned up list of vendor/product ids. - * - Print information about user-supplied ids only once at startup instead - * of every time any USB device is plugged in. - * - Removed PV8630 ioctls. Use the standard ioctls instead. - * - Made endpoint detection more generic. Basically, only one bulk-in - * endpoint is required, everything else is optional. - * - New maintainer: Henning Meier-Geinitz. - * - Print ids and device number when a device was detected. - * - Don't print errors when the device is busy. - * - * 0.4.11 2003-02-25 - * - Added vendor/product ids for Artec, Avision, Brother, Canon, Compaq, - * Fujitsu, Hewlett-Packard, Lexmark, LG Electronics, Medion, Microtek, - * Primax, Prolink, Plustek, SYSCAN, Trust and UMAX scanners. - * - Fixed generation of devfs names if dynamic minors are disabled. - * - Used kobject reference counting to free the scn struct when the device - * is closed and disconnected. Avoids crashes when writing to a - * disconnected device. (Thanks to Greg KH). - * - * 0.4.12 2003-04-11 - * - Fixed endpoint detection. The endpoints were numbered from 1 to n but - * that assumption is not correct in all cases. - * - * 0.4.13 2003-05-30 - * - Added vendor/product ids for Genius, Hewlett-Packard, Microtek, - * Mustek, Pacific Image Electronics, Plustek, and Visioneer scanners. - * Fixed names of some other scanners. - * - * 0.4.14 2003-07-15 - * - Fixed race between open and probe (Oliver Neukum). - * - Added vendor/product ids for Avision, Canon, HP, Microtek and Relisys scanners. - * - Clean up irq urb when not enough memory is available. - * - * 0.4.15 2003-09-22 - * - Use static declarations for usb_scanner_init/usb_scanner_exit - * (Daniele Bellucci). - * - Report back return codes of usb_register and usb_usbmit_urb instead of -1 or - * -ENONMEM (Daniele Bellucci). - * - Balancing usb_register_dev/usb_deregister_dev in probe_scanner when a fail - * condition occours (Daniele Bellucci). - * - Added vendor/product ids for Canon, HP, Microtek, Mustek, Siemens, UMAX, and - * Visioneer scanners. - * - Added test for USB_CLASS_CDC_DATA which is used by some fingerprint scanners. - * - * 0.4.16 2003-11-04 - * - Added vendor/product ids for Epson, Genius, Microtek, Plustek, Reflecta, and - * Visioneer scanners. Removed ids for HP PSC devices as these are supported by - * the hpoj userspace driver. - * - * TODO - * - Performance - * - Select/poll methods - * - More testing - * - More general usage ioctl's - * - * - * Thanks to: - * - * - All the folks on the linux-usb list who put up with me. :) This - * has been a great learning experience for me. - * - To Linus Torvalds for this great OS. - * - The GNU folks. - * - The folks that forwarded Vendor:Product ID's to me. - * - Johannes Erdfelt for the loaning of a USB analyzer for tracking an - * issue with HP-4100 and uhci. - * - Adolfo Montero for his assistance. - * - All the folks who chimed in with reports and suggestions. - * - All the developers that are working on USB SANE backends or other - * applications to use USB scanners. - * - Thanks to Greg KH for setting up Brian Beattie - * and Henning Meier-Geinitz to be the new USB Scanner maintainer. - * - * Performance: - * - * System: Pentium 120, 80 MB RAM, OHCI, Linux 2.3.23, HP 4100C USB Scanner - * 300 dpi scan of the entire bed - * 24 Bit Color ~ 70 secs - 3.6 Mbit/sec - * 8 Bit Gray ~ 17 secs - 4.2 Mbit/sec */ - -/* - * For documentation, see Documentation/usb/scanner.txt. - * Website: http://www.meier-geinitz.de/kernel/ - * Please contact the maintainer if your scanner is not detected by this - * driver automatically. - */ - - -#include - -/* - * Scanner definitions, macros, module info, - * debug/ioctl/data_dump enable, and other constants. - */ -#include "scanner.h" - -static void -irq_scanner(struct urb *urb, struct pt_regs *regs) -{ - -/* - * For the meantime, this is just a placeholder until I figure out what - * all I want to do with it -- or somebody else for that matter. - */ - - struct scn_usb_data *scn; - unsigned char *data; - int status; - - scn = urb->context; - - data = &scn->button; - data += 0; /* Keep gcc from complaining about unused var */ - - switch (urb->status) { - case 0: - /* success */ - break; - case -ECONNRESET: - case -ENOENT: - case -ESHUTDOWN: - /* this urb is terminated, clean up */ - dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); - return; - default: - dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); - return; - } - - dbg("irq_scanner(%d): data:%x", scn->scn_minor, *data); - - status = usb_submit_urb (urb, GFP_ATOMIC); - if (status) - err ("%s - usb_submit_urb failed with result %d", - __FUNCTION__, status); -} - -static int -open_scanner(struct inode * inode, struct file * file) -{ - struct scn_usb_data *scn; - struct usb_device *dev; - struct usb_interface *intf; - - int scn_minor; - - int err=0; - - down(&scn_mutex); - - scn_minor = USB_SCN_MINOR(inode); - - dbg("open_scanner: scn_minor:%d", scn_minor); - - intf = usb_find_interface(&scanner_driver, scn_minor); - if (!intf) { - up(&scn_mutex); - err("open_scanner(%d): Unable to access minor data", scn_minor); - return -ENODEV; - } - scn = usb_get_intfdata(intf); - kobject_get(&scn->kobj); - - dev = scn->scn_dev; - - down(&(scn->sem)); /* Now protect the scn_usb_data structure */ - - up(&scn_mutex); /* Now handled by the above */ - - if (!dev) { - err("open_scanner(%d): Scanner device not present", scn_minor); - err = -ENODEV; - goto out_error; - } - - if (!scn->present) { - err("open_scanner(%d): Scanner is not present", scn_minor); - err = -ENODEV; - goto out_error; - } - - if (scn->isopen) { - dbg("open_scanner(%d): Scanner device is already open", scn_minor); - err = -EBUSY; - goto out_error; - } - - init_waitqueue_head(&scn->rd_wait_q); - - scn->isopen = 1; - - file->private_data = scn; /* Used by the read and write methods */ - - -out_error: - - up(&(scn->sem)); /* Wake up any possible contending processes */ - - return err; -} - -static int -close_scanner(struct inode * inode, struct file * file) -{ - struct scn_usb_data *scn = file->private_data; - - int scn_minor; - - scn_minor = USB_SCN_MINOR (inode); - - dbg("close_scanner: scn_minor:%d", scn_minor); - - down(&scn_mutex); - down(&(scn->sem)); - - scn->isopen = 0; - - file->private_data = NULL; - - up(&scn_mutex); - up(&(scn->sem)); - - kobject_put(&scn->kobj); - - return 0; -} - -static ssize_t -write_scanner(struct file * file, const char * buffer, - size_t count, loff_t *ppos) -{ - struct scn_usb_data *scn; - struct usb_device *dev; - - ssize_t bytes_written = 0; /* Overall count of bytes written */ - ssize_t ret = 0; - - int scn_minor; - - int this_write; /* Number of bytes to write */ - int partial; /* Number of bytes successfully written */ - int result = 0; - - char *obuf; - - scn = file->private_data; - - down(&(scn->sem)); - - if (!scn->bulk_out_ep) { - /* This scanner does not have a bulk-out endpoint */ - up(&(scn->sem)); - return -EINVAL; - } - - scn_minor = scn->scn_minor; - - obuf = scn->obuf; - - dev = scn->scn_dev; - - file->f_dentry->d_inode->i_atime = CURRENT_TIME; - - while (count > 0) { - - if (signal_pending(current)) { - ret = -ERESTARTSYS; - break; - } - - this_write = (count >= OBUF_SIZE) ? OBUF_SIZE : count; - - if (copy_from_user(scn->obuf, buffer, this_write)) { - ret = -EFAULT; - break; - } - - result = usb_bulk_msg(dev,usb_sndbulkpipe(dev, scn->bulk_out_ep), obuf, this_write, &partial, 60*HZ); - dbg("write stats(%d): result:%d this_write:%d partial:%d", scn_minor, result, this_write, partial); - - if (result == -ETIMEDOUT) { /* NAK -- shouldn't happen */ - warn("write_scanner: NAK received."); - ret = result; - break; - } else if (result < 0) { /* We should not get any I/O errors */ - warn("write_scanner(%d): funky result: %d. Consult Documentataion/usb/scanner.txt.", scn_minor, result); - ret = -EIO; - break; - } - -#ifdef WR_DATA_DUMP - if (partial) { - unsigned char cnt, cnt_max; - cnt_max = (partial > 24) ? 24 : partial; - printk(KERN_DEBUG "dump(%d): ", scn_minor); - for (cnt=0; cnt < cnt_max; cnt++) { - printk("%X ", obuf[cnt]); - } - printk("\n"); - } -#endif - if (partial != this_write) { /* Unable to write all contents of obuf */ - ret = -EIO; - break; - } - - if (partial) { /* Data written */ - buffer += partial; - count -= partial; - bytes_written += partial; - } else { /* No data written */ - ret = 0; - break; - } - } - up(&(scn->sem)); - mdelay(5); /* This seems to help with SANE queries */ - return ret ? ret : bytes_written; -} - -static ssize_t -read_scanner(struct file * file, char * buffer, - size_t count, loff_t *ppos) -{ - struct scn_usb_data *scn; - struct usb_device *dev; - - ssize_t bytes_read; /* Overall count of bytes_read */ - ssize_t ret; - - int scn_minor; - int partial; /* Number of bytes successfully read */ - int this_read; /* Max number of bytes to read */ - int result; - int rd_expire = RD_EXPIRE; - - char *ibuf; - - scn = file->private_data; - - down(&(scn->sem)); - - scn_minor = scn->scn_minor; - - ibuf = scn->ibuf; - - dev = scn->scn_dev; - - bytes_read = 0; - ret = 0; - - file->f_dentry->d_inode->i_atime = CURRENT_TIME; /* Update the - atime of - the device - node */ - while (count > 0) { - if (signal_pending(current)) { - ret = -ERESTARTSYS; - break; - } - - this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count; - - result = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, scn->bulk_in_ep), ibuf, this_read, &partial, scn->rd_nak_timeout); - dbg("read stats(%d): result:%d this_read:%d partial:%d count:%d", scn_minor, result, this_read, partial, count); - -/* - * Scanners are sometimes inheriently slow since they are mechanical - * in nature. USB bulk reads tend to timeout while the scanner is - * positioning, resetting, warming up the lamp, etc if the timeout is - * set too low. A very long timeout parameter for bulk reads was used - * to overcome this limitation, but this sometimes resulted in folks - * having to wait for the timeout to expire after pressing Ctrl-C from - * an application. The user was sometimes left with the impression - * that something had hung or crashed when in fact the USB read was - * just waiting on data. So, the below code retains the same long - * timeout period, but splits it up into smaller parts so that - * Ctrl-C's are acted upon in a reasonable amount of time. - */ - - if (result == -ETIMEDOUT) { /* NAK */ - if (!partial) { /* No data */ - if (--rd_expire <= 0) { /* Give it up */ - warn("read_scanner(%d): excessive NAK's received", scn_minor); - ret = result; - break; - } else { /* Keep trying to read data */ - interruptible_sleep_on_timeout(&scn->rd_wait_q, scn->rd_nak_timeout); - continue; - } - } else { /* Timeout w/ some data */ - goto data_recvd; - } - } - - if (result == -EPIPE) { /* No hope */ - if(usb_clear_halt(dev, scn->bulk_in_ep)) { - err("read_scanner(%d): Failure to clear endpoint halt condition (%Zd).", scn_minor, ret); - } - ret = result; - break; - } else if ((result < 0) && (result != -EREMOTEIO)) { - warn("read_scanner(%d): funky result:%d. Consult Documentation/usb/scanner.txt.", scn_minor, (int)result); - ret = -EIO; - break; - } - - data_recvd: - -#ifdef RD_DATA_DUMP - if (partial) { - unsigned char cnt, cnt_max; - cnt_max = (partial > 24) ? 24 : partial; - printk(KERN_DEBUG "dump(%d): ", scn_minor); - for (cnt=0; cnt < cnt_max; cnt++) { - printk("%X ", ibuf[cnt]); - } - printk("\n"); - } -#endif - - if (partial) { /* Data returned */ - if (copy_to_user(buffer, ibuf, partial)) { - ret = -EFAULT; - break; - } - count -= this_read; /* Compensate for short reads */ - bytes_read += partial; /* Keep tally of what actually was read */ - buffer += partial; - } else { - ret = 0; - break; - } - } - up(&(scn->sem)); - return ret ? ret : bytes_read; -} - -static int -ioctl_scanner(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct usb_device *dev; - struct scn_usb_data *scn = file->private_data; - int retval = -ENOTTY; - int scn_minor; - - scn_minor = USB_SCN_MINOR(inode); - down(&(scn->sem)); - - dev = scn->scn_dev; - - switch (cmd) - { - case SCANNER_IOCTL_VENDOR : - retval = (put_user(dev->descriptor.idVendor, (unsigned int *) arg)); - break; - case SCANNER_IOCTL_PRODUCT : - retval = (put_user(dev->descriptor.idProduct, (unsigned int *) arg)); - break; - case SCANNER_IOCTL_CTRLMSG: - { - struct ctrlmsg_ioctl { - struct usb_ctrlrequest req; - void *data; - } cmsg; - int pipe, nb, ret; - unsigned char buf[64]; - retval = 0; - - if (copy_from_user(&cmsg, (void *)arg, sizeof(cmsg))) { - retval = -EFAULT; - break; - } - - nb = cmsg.req.wLength; - - if (nb > sizeof(buf)) { - retval = -EINVAL; - break; - } - - if ((cmsg.req.bRequestType & 0x80) == 0) { - pipe = usb_sndctrlpipe(dev, 0); - if (nb > 0 && copy_from_user(buf, cmsg.data, nb)) { - retval = -EFAULT; - break; - } - } else { - pipe = usb_rcvctrlpipe(dev, 0); - } - - ret = usb_control_msg(dev, pipe, cmsg.req.bRequest, - cmsg.req.bRequestType, - cmsg.req.wValue, - cmsg.req.wIndex, - buf, nb, HZ); - - if (ret < 0) { - err("ioctl_scanner(%d): control_msg returned %d\n", scn_minor, ret); - retval = -EIO; - break; - } - - if (nb > 0 && (cmsg.req.bRequestType & 0x80) && copy_to_user(cmsg.data, buf, nb)) - retval = -EFAULT; - - break; - } - default: - break; - } - up(&(scn->sem)); - return retval; -} - -static void destroy_scanner (struct kobject *kobj) -{ - struct scn_usb_data *scn; - - dbg ("%s", __FUNCTION__); - - scn = to_scanner(kobj); - - down (&scn_mutex); - down (&(scn->sem)); - - usb_driver_release_interface(&scanner_driver, - scn->scn_dev->actconfig->interface[scn->ifnum]); - - kfree(scn->ibuf); - kfree(scn->obuf); - - usb_free_urb(scn->scn_irq); - usb_put_dev(scn->scn_dev); - up (&(scn->sem)); - kfree (scn); - up (&scn_mutex); -} - -static struct kobj_type scanner_kobj_type = { - .release = destroy_scanner, -}; - -static struct -file_operations usb_scanner_fops = { - .owner = THIS_MODULE, - .read = read_scanner, - .write = write_scanner, - .ioctl = ioctl_scanner, - .open = open_scanner, - .release = close_scanner, -}; - -static struct usb_class_driver scanner_class = { - .name = "usb/scanner%d", - .fops = &usb_scanner_fops, - .mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, - .minor_base = SCN_BASE_MNR, -}; - -static int -probe_scanner(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct usb_device *dev = interface_to_usbdev (intf); - struct scn_usb_data *scn; - struct usb_host_interface *interface; - struct usb_endpoint_descriptor *endpoint; - - int ep_cnt; - int ix; - int retval; - - char valid_device = 0; - char have_bulk_in, have_bulk_out, have_intr; - char name[14]; - - dbg("probe_scanner: USB dev address:%p", dev); - -/* - * 1. Check Vendor/Product - * 2. Determine/Assign Bulk Endpoints - * 3. Determine/Assign Intr Endpoint - */ - -/* - * There doesn't seem to be an imaging class defined in the USB - * Spec. (yet). If there is, HP isn't following it and it doesn't - * look like anybody else is either. Therefore, we have to test the - * Vendor and Product ID's to see what we have. Also, other scanners - * may be able to use this driver by specifying both vendor and - * product ID's as options to the scanner module in conf.modules. - * - * NOTE: Just because a product is supported here does not mean that - * applications exist that support the product. It's in the hopes - * that this will allow developers a means to produce applications - * that will support USB products. - * - * Until we detect a device which is pleasing, we silently punt. - */ - - for (ix = 0; ix < sizeof (scanner_device_ids) / sizeof (struct usb_device_id); ix++) { - if ((dev->descriptor.idVendor == scanner_device_ids [ix].idVendor) && - (dev->descriptor.idProduct == scanner_device_ids [ix].idProduct)) { - valid_device = 1; - break; - } - } - if (dev->descriptor.idVendor == vendor && /* User specified */ - dev->descriptor.idProduct == product) { /* User specified */ - valid_device = 1; - } - - if (!valid_device) - return -ENODEV; /* We didn't find anything pleasing */ - -/* - * After this point we can be a little noisy about what we are trying to - * configure. - */ - - if (dev->descriptor.bNumConfigurations != 1) { - info("probe_scanner: Only one device configuration is supported."); - return -ENODEV; - } - - interface = intf->altsetting; - - if (interface[0].desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC && - interface[0].desc.bInterfaceClass != USB_CLASS_PER_INTERFACE && - interface[0].desc.bInterfaceClass != USB_CLASS_CDC_DATA && - interface[0].desc.bInterfaceClass != SCN_CLASS_SCANJET) { - dbg("probe_scanner: This interface doesn't look like a scanner (class=0x%x).", interface[0].desc.bInterfaceClass); - return -ENODEV; - } - -/* - * Start checking for bulk and interrupt endpoints. We are only using the first - * one of each type of endpoint. If we have an interrupt endpoint go ahead and - * setup the handler. FIXME: This is a future enhancement... - */ - - dbg("probe_scanner: Number of Endpoints:%d", (int) interface->desc.bNumEndpoints); - - ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0; - - while (ep_cnt < interface->desc.bNumEndpoints) { - endpoint = &interface->endpoint[ep_cnt].desc; - - if (IS_EP_BULK_IN(endpoint)) { - ep_cnt++; - if (have_bulk_in) { - info ("probe_scanner: ignoring additional bulk_in_ep:%d", ep_cnt); - continue; - } - have_bulk_in = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - dbg("probe_scanner: bulk_in_ep:%d", have_bulk_in); - continue; - } - - if (IS_EP_BULK_OUT(endpoint)) { - ep_cnt++; - if (have_bulk_out) { - info ("probe_scanner: ignoring additional bulk_out_ep:%d", ep_cnt); - continue; - } - have_bulk_out = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - dbg("probe_scanner: bulk_out_ep:%d", have_bulk_out); - continue; - } - - if (IS_EP_INTR(endpoint)) { - ep_cnt++; - if (have_intr) { - info ("probe_scanner: ignoring additional intr_ep:%d", ep_cnt); - continue; - } - have_intr = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - dbg("probe_scanner: intr_ep:%d", have_intr); - continue; - } - info("probe_scanner: Undetected endpoint -- consult Documentation/usb/scanner.txt."); - return -EIO; /* Shouldn't ever get here unless we have something weird */ - } - - -/* - * Perform a quick check to make sure that everything worked as it - * should have. - */ - - if (!have_bulk_in) { - err("probe_scanner: One bulk-in endpoint required."); - return -EIO; - } - -/* - * Determine a minor number and initialize the structure associated - * with it. The problem with this is that we are counting on the fact - * that the user will sequentially add device nodes for the scanner - * devices. */ - - down(&scn_mutex); - - retval = usb_register_dev(intf, &scanner_class); - if (retval) { - err ("Not able to get a minor for this device."); - up(&scn_mutex); - return -ENOMEM; - } - - dbg("probe_scanner: Allocated minor:%d", intf->minor); - - if (!(scn = kmalloc (sizeof (struct scn_usb_data), GFP_KERNEL))) { - err("probe_scanner: Out of memory."); - up(&scn_mutex); - return -ENOMEM; - } - memset (scn, 0, sizeof(struct scn_usb_data)); - kobject_init(&scn->kobj); - scn->kobj.ktype = &scanner_kobj_type; - - scn->scn_irq = usb_alloc_urb(0, GFP_KERNEL); - if (!scn->scn_irq) { - usb_deregister_dev(intf, &scanner_class); - kfree(scn); - up(&scn_mutex); - return -ENOMEM; - } - - init_MUTEX(&(scn->sem)); /* Initializes to unlocked */ - - dbg ("probe_scanner(%d): Address of scn:%p", intf->minor, scn); - -/* Ok, if we detected an interrupt EP, setup a handler for it */ - if (have_intr) { - dbg("probe_scanner(%d): Configuring IRQ handler for intr EP:%d", intf->minor, have_intr); - usb_fill_int_urb(scn->scn_irq, dev, - usb_rcvintpipe(dev, have_intr), - &scn->button, 1, irq_scanner, scn, - // endpoint[(int)have_intr].bInterval); - 250); - - retval = usb_submit_urb(scn->scn_irq, GFP_KERNEL); - if (retval) { - err("probe_scanner(%d): Unable to allocate INT URB.", intf->minor); - usb_deregister_dev(intf, &scanner_class); - kfree(scn); - up(&scn_mutex); - return retval; - } - } - - -/* Ok, now initialize all the relevant values */ - if (!(scn->obuf = (char *)kmalloc(OBUF_SIZE, GFP_KERNEL))) { - err("probe_scanner(%d): Not enough memory for the output buffer.", intf->minor); - if (have_intr) - usb_unlink_urb(scn->scn_irq); - usb_free_urb(scn->scn_irq); - usb_deregister_dev(intf, &scanner_class); - kfree(scn); - up(&scn_mutex); - return -ENOMEM; - } - dbg("probe_scanner(%d): obuf address:%p", intf->minor, scn->obuf); - - if (!(scn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) { - err("probe_scanner(%d): Not enough memory for the input buffer.", intf->minor); - if (have_intr) - usb_unlink_urb(scn->scn_irq); - usb_free_urb(scn->scn_irq); - usb_deregister_dev(intf, &scanner_class); - kfree(scn->obuf); - kfree(scn); - up(&scn_mutex); - return -ENOMEM; - } - dbg("probe_scanner(%d): ibuf address:%p", intf->minor, scn->ibuf); - - - switch (dev->descriptor.idVendor) { /* Scanner specific read timeout parameters */ - case 0x04b8: /* Seiko/Epson */ - scn->rd_nak_timeout = HZ * 60; - break; - case 0x055f: /* Mustek */ - case 0x0400: /* Another Mustek */ - scn->rd_nak_timeout = HZ * 1; - default: - scn->rd_nak_timeout = RD_NAK_TIMEOUT; - } - - - if (read_timeout > 0) { /* User specified read timeout overrides everything */ - info("probe_scanner: User specified USB read timeout - %d", read_timeout); - scn->rd_nak_timeout = read_timeout; - } - - - usb_get_dev(dev); - scn->bulk_in_ep = have_bulk_in; - scn->bulk_out_ep = have_bulk_out; - scn->intr_ep = have_intr; - scn->present = 1; - scn->scn_dev = dev; - scn->scn_minor = intf->minor; - scn->isopen = 0; - - snprintf(name, sizeof(name), scanner_class.name, - intf->minor - scanner_class.minor_base); - - info ("USB scanner device (0x%04x/0x%04x) now attached to %s", - dev->descriptor.idVendor, dev->descriptor.idProduct, name); - - usb_set_intfdata(intf, scn); - up(&scn_mutex); - - return 0; -} - -static void -disconnect_scanner(struct usb_interface *intf) -{ - struct scn_usb_data *scn = usb_get_intfdata(intf); - - /* disable open() */ - dbg("%s: De-allocating minor:%d", __FUNCTION__, scn->scn_minor); - usb_deregister_dev(intf, &scanner_class); - - usb_set_intfdata(intf, NULL); - if(scn->intr_ep) { - dbg("%s(%d): Unlinking IRQ URB", __FUNCTION__, scn->scn_minor); - usb_unlink_urb(scn->scn_irq); - } - - if (scn) - kobject_put(&scn->kobj); -} - -/* we want to look at all devices, as the vendor/product id can change - * depending on the command line argument */ -static struct usb_device_id ids[] = { - {.driver_info = 42}, - {} -}; - -static struct -usb_driver scanner_driver = { - .owner = THIS_MODULE, - .name = "usbscanner", - .probe = probe_scanner, - .disconnect = disconnect_scanner, - .id_table = ids, -}; - -static void __exit -usb_scanner_exit(void) -{ - usb_deregister(&scanner_driver); -} - -static int __init -usb_scanner_init (void) -{ - int retval; - retval = usb_register(&scanner_driver); - if (retval) - goto out; - - info(DRIVER_VERSION ":" DRIVER_DESC); - if (vendor != -1 && product != -1) - info("probe_scanner: User specified USB scanner -- Vendor:Product - %x:%x", vendor, product); - out: - return retval; -} - -module_init(usb_scanner_init); -module_exit(usb_scanner_exit); diff -Nru a/drivers/usb/image/scanner.h b/drivers/usb/image/scanner.h --- a/drivers/usb/image/scanner.h Tue Feb 17 20:00:06 2004 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,387 +0,0 @@ -/* - * Driver for USB Scanners (linux-2.6) - * - * Copyright (C) 1999, 2000, 2001, 2002 David E. Nelson - * Previously maintained by Brian Beattie - * - * Current maintainer: Henning Meier-Geinitz - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * For documentation, see Documentation/usb/scanner.txt. - * Website: http://www.meier-geinitz.de/kernel/ - * Please contact the maintainer if your scanner is not detected by this - * driver automatically. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// #define DEBUG - -#define DRIVER_VERSION "0.4.16" -#define DRIVER_DESC "USB Scanner Driver" - -#include - -static __s32 vendor=-1, product=-1, read_timeout=0; - -MODULE_AUTHOR("Henning Meier-Geinitz, henning@meier-geinitz.de"); -MODULE_DESCRIPTION(DRIVER_DESC" "DRIVER_VERSION); -MODULE_LICENSE("GPL"); - -MODULE_PARM(vendor, "i"); -MODULE_PARM_DESC(vendor, "User specified USB idVendor"); - -MODULE_PARM(product, "i"); -MODULE_PARM_DESC(product, "User specified USB idProduct"); - -MODULE_PARM(read_timeout, "i"); -MODULE_PARM_DESC(read_timeout, "User specified read timeout in seconds"); - - -/* WARNING: These DATA_DUMP's can produce a lot of data. Caveat Emptor. */ -// #define RD_DATA_DUMP /* Enable to dump data - limited to 24 bytes */ -// #define WR_DATA_DUMP /* DEBUG does not have to be defined. */ - -static struct usb_device_id scanner_device_ids [] = { - /* Acer (now Benq) */ - { USB_DEVICE(0x04a5, 0x1a20) }, /* Prisa 310U */ - { USB_DEVICE(0x04a5, 0x1a2a) }, /* Another 620U */ - { USB_DEVICE(0x04a5, 0x2022) }, /* 340U */ - { USB_DEVICE(0x04a5, 0x2040) }, /* 620U (!) */ - { USB_DEVICE(0x04a5, 0x2060) }, /* 620U & 640U (!)*/ - { USB_DEVICE(0x04a5, 0x207e) }, /* 640BU */ - { USB_DEVICE(0x04a5, 0x20b0) }, /* Benq 4300 */ - { USB_DEVICE(0x04a5, 0x20be) }, /* Unknown - Oliver Schwartz */ - { USB_DEVICE(0x04a5, 0x20c0) }, /* 1240UT, 1240U */ - { USB_DEVICE(0x04a5, 0x20de) }, /* S2W 3300U */ - { USB_DEVICE(0x04a5, 0x20fc) }, /* Benq 5000 */ - { USB_DEVICE(0x04a5, 0x20fe) }, /* Benq 5300 */ - /* Agfa */ - { USB_DEVICE(0x06bd, 0x0001) }, /* SnapScan 1212U */ - { USB_DEVICE(0x06bd, 0x0002) }, /* SnapScan 1236U */ - { USB_DEVICE(0x06bd, 0x0100) }, /* SnapScan Touch */ - { USB_DEVICE(0x06bd, 0x2061) }, /* Another SnapScan 1212U (?)*/ - { USB_DEVICE(0x06bd, 0x208d) }, /* Snapscan e40 */ - { USB_DEVICE(0x06bd, 0x208f) }, /* SnapScan e50*/ - { USB_DEVICE(0x06bd, 0x2091) }, /* SnapScan e20 */ - { USB_DEVICE(0x06bd, 0x2093) }, /* SnapScan e10*/ - { USB_DEVICE(0x06bd, 0x2095) }, /* SnapScan e25 */ - { USB_DEVICE(0x06bd, 0x2097) }, /* SnapScan e26 */ - { USB_DEVICE(0x06bd, 0x20fd) }, /* SnapScan e52*/ - { USB_DEVICE(0x06bd, 0x20ff) }, /* SnapScan e42*/ - /* Artec */ - { USB_DEVICE(0x05d8, 0x4001) }, /* Ultima 2000 */ - { USB_DEVICE(0x05d8, 0x4002) }, /* Ultima 2000 (GT6801 based) */ - { USB_DEVICE(0x05d8, 0x4003) }, /* E+ 48U */ - { USB_DEVICE(0x05d8, 0x4004) }, /* E+ Pro */ - /* Avision */ - { USB_DEVICE(0x0638, 0x0268) }, /* iVina 1200U */ - { USB_DEVICE(0x0638, 0x0a10) }, /* iVina FB1600 (=Umax Astra 4500) */ - { USB_DEVICE(0x0638, 0x0a20) }, /* iVina FB1800 (=Umax Astra 4700) */ - /* Benq: see Acer */ - /* Brother */ - { USB_DEVICE(0x04f9, 0x010f) }, /* MFC 5100C */ - { USB_DEVICE(0x04f9, 0x0111) }, /* MFC 6800 */ - /* Canon */ - { USB_DEVICE(0x04a9, 0x2201) }, /* CanoScan FB320U */ - { USB_DEVICE(0x04a9, 0x2202) }, /* CanoScan FB620U */ - { USB_DEVICE(0x04a9, 0x2204) }, /* CanoScan FB630U/FB636U */ - { USB_DEVICE(0x04a9, 0x2205) }, /* CanoScan FB1210U */ - { USB_DEVICE(0x04a9, 0x2206) }, /* CanoScan N650U/N656U */ - { USB_DEVICE(0x04a9, 0x2207) }, /* CanoScan N1220U */ - { USB_DEVICE(0x04a9, 0x2208) }, /* CanoScan D660U */ - { USB_DEVICE(0x04a9, 0x220a) }, /* CanoScan D2400UF */ - { USB_DEVICE(0x04a9, 0x220b) }, /* CanoScan D646U */ - { USB_DEVICE(0x04a9, 0x220c) }, /* CanoScan D1250U2 */ - { USB_DEVICE(0x04a9, 0x220d) }, /* CanoScan N670U/N676U/LIDE 20 */ - { USB_DEVICE(0x04a9, 0x220e) }, /* CanoScan N1240U/LIDE 30 */ - { USB_DEVICE(0x04a9, 0x220f) }, /* CanoScan 8000F */ - { USB_DEVICE(0x04a9, 0x2210) }, /* CanoScan 9900F */ - { USB_DEVICE(0x04a9, 0x2212) }, /* CanoScan 5000F */ - { USB_DEVICE(0x04a9, 0x2213) }, /* LIDE 50 */ - { USB_DEVICE(0x04a9, 0x2215) }, /* CanoScan 3000 */ - { USB_DEVICE(0x04a9, 0x3042) }, /* FS4000US */ - /* Colorado -- See Primax/Colorado below */ - /* Compaq */ - { USB_DEVICE(0x049f, 0x001a) }, /* S4 100 */ - { USB_DEVICE(0x049f, 0x0021) }, /* S200 */ - /* Epson -- See Seiko/Epson below */ - /* Fujitsu */ - { USB_DEVICE(0x04c5, 0x1041) }, /* fi-4220c USB/SCSI info:mza@mu-tec.de */ - { USB_DEVICE(0x04c5, 0x1042) }, /* fi-4120c USB/SCSI info:mza@mu-tec.de */ - { USB_DEVICE(0x04c5, 0x1029) }, /* fi-4010c USB AVision info:mza@mu-tec.de */ - /* Genius */ - { USB_DEVICE(0x0458, 0x2001) }, /* ColorPage Vivid Pro */ - { USB_DEVICE(0x0458, 0x2007) }, /* ColorPage HR6 V2 */ - { USB_DEVICE(0x0458, 0x2008) }, /* ColorPage HR6 V2 */ - { USB_DEVICE(0x0458, 0x2009) }, /* ColorPage HR6A */ - { USB_DEVICE(0x0458, 0x2011) }, /* ColorPage Vivid3x */ - { USB_DEVICE(0x0458, 0x2013) }, /* ColorPage HR7 */ - { USB_DEVICE(0x0458, 0x2015) }, /* ColorPage HR7LE */ - { USB_DEVICE(0x0458, 0x2016) }, /* ColorPage HR6X */ - { USB_DEVICE(0x0458, 0x2018) }, /* ColorPage HR7X */ - { USB_DEVICE(0x0458, 0x201b) }, /* Colorpage Vivid 4x */ - /* Hewlett Packard */ - /* IMPORTANT: Hewlett-Packard multi-function peripherals (OfficeJet, - Printer/Scanner/Copier (PSC), LaserJet, or PhotoSmart printer) - should not be added to this table because they are accessed by a - userspace driver (hpoj) */ - { USB_DEVICE(0x03f0, 0x0101) }, /* ScanJet 4100C */ - { USB_DEVICE(0x03f0, 0x0102) }, /* PhotoSmart S20 */ - { USB_DEVICE(0x03f0, 0x0105) }, /* ScanJet 4200C */ - { USB_DEVICE(0x03f0, 0x0201) }, /* ScanJet 6200C */ - { USB_DEVICE(0x03f0, 0x0205) }, /* ScanJet 3300C */ - { USB_DEVICE(0x03f0, 0x0305) }, /* ScanJet 4300C */ - { USB_DEVICE(0x03f0, 0x0401) }, /* ScanJet 5200C */ - { USB_DEVICE(0x03f0, 0x0405) }, /* ScanJet 3400C */ - { USB_DEVICE(0x03f0, 0x0505) }, /* ScanJet 2100C */ - { USB_DEVICE(0x03f0, 0x0601) }, /* ScanJet 6300C */ - { USB_DEVICE(0x03f0, 0x0605) }, /* ScanJet 2200C */ - // { USB_DEVICE(0x03f0, 0x0701) }, /* ScanJet 5300C - NOT SUPPORTED - use hpusbscsi driver */ - { USB_DEVICE(0x03f0, 0x0705) }, /* ScanJet 4400C */ - // { USB_DEVICE(0x03f0, 0x0801) }, /* ScanJet 7400C - NOT SUPPORTED - use hpusbscsi driver */ - { USB_DEVICE(0x03f0, 0x0805) }, /* ScanJet 4470c */ - { USB_DEVICE(0x03f0, 0x0901) }, /* ScanJet 2300C */ - { USB_DEVICE(0x03f0, 0x0a01) }, /* ScanJet 2400c */ - { USB_DEVICE(0x03F0, 0x1005) }, /* ScanJet 5400C */ - { USB_DEVICE(0x03F0, 0x1105) }, /* ScanJet 5470C */ - { USB_DEVICE(0x03f0, 0x1205) }, /* ScanJet 5550C */ - { USB_DEVICE(0x03f0, 0x1305) }, /* Scanjet 4570c */ - // { USB_DEVICE(0x03f0, 0x1411) }, /* PSC 750 - NOT SUPPORTED - use hpoj userspace driver */ - { USB_DEVICE(0x03f0, 0x2005) }, /* ScanJet 3570c */ - { USB_DEVICE(0x03f0, 0x2205) }, /* ScanJet 3500c */ - // { USB_DEVICE(0x03f0, 0x2f11) }, /* PSC 1210 - NOT SUPPORTED - use hpoj userspace driver */ - /* Lexmark */ - { USB_DEVICE(0x043d, 0x002d) }, /* X70/X73 */ - { USB_DEVICE(0x043d, 0x003d) }, /* X83 */ - /* LG Electronics */ - { USB_DEVICE(0x0461, 0x0364) }, /* Scanworks 600U (repackaged Primax?) */ - /* Medion */ - { USB_DEVICE(0x0461, 0x0377) }, /* MD 5345 - repackaged Primax? */ - /* Memorex */ - { USB_DEVICE(0x0461, 0x0346) }, /* 6136u - repackaged Primax ? */ - /* Microtek */ - { USB_DEVICE(0x05da, 0x20a7) }, /* ScanMaker 5600 */ - { USB_DEVICE(0x05da, 0x20c9) }, /* ScanMaker 6700 */ - { USB_DEVICE(0x05da, 0x30ce) }, /* ScanMaker 3800 */ - { USB_DEVICE(0x05da, 0x30cf) }, /* ScanMaker 4800 */ - { USB_DEVICE(0x05da, 0x30d4) }, /* ScanMaker 3830 + 3840 */ - { USB_DEVICE(0x05da, 0x30d8) }, /* ScanMaker 5900 */ - { USB_DEVICE(0x04a7, 0x0224) }, /* Scanport 3000 (actually Visioneer?)*/ - /* The following SCSI-over-USB Microtek devices are supported by the - microtek driver: Enable SCSI and USB Microtek in kernel config */ - // { USB_DEVICE(0x05da, 0x0099) }, /* ScanMaker X6 - X6U */ - // { USB_DEVICE(0x05da, 0x0094) }, /* Phantom 336CX - C3 */ - // { USB_DEVICE(0x05da, 0x00a0) }, /* Phantom 336CX - C3 #2 */ - // { USB_DEVICE(0x05da, 0x009a) }, /* Phantom C6 */ - // { USB_DEVICE(0x05da, 0x00a3) }, /* ScanMaker V6USL */ - // { USB_DEVICE(0x05da, 0x80a3) }, /* ScanMaker V6USL #2 */ - // { USB_DEVICE(0x05da, 0x80ac) }, /* ScanMaker V6UL - SpicyU */ - /* Minolta */ - { USB_DEVICE(0x0686, 0x400d) }, /* Scan Dual III */ - /* The following SCSI-over-USB Minolta devices are supported by the - hpusbscsi driver: Enable SCSI and USB hpusbscsi in kernel config */ - // { USB_DEVICE(0x0638, 0x026a) }, /* Minolta Dimage Scan Dual II */ - // { USB_DEVICE(0x0686, 0x4004) }, /* Scan Elite II (need interrupt ep) */ - /* Mustek */ - { USB_DEVICE(0x0400, 0x1000) }, /* BearPaw 1200 (National Semiconductor LM9831) */ - { USB_DEVICE(0x0400, 0x1001) }, /* BearPaw 2400 (National Semiconductor LM9832) */ - { USB_DEVICE(0x055f, 0x0001) }, /* ScanExpress 1200 CU */ - { USB_DEVICE(0x055f, 0x0002) }, /* ScanExpress 600 CU */ - { USB_DEVICE(0x055f, 0x0003) }, /* ScanExpress 1200 USB */ - { USB_DEVICE(0x055f, 0x0006) }, /* ScanExpress 1200 UB */ - { USB_DEVICE(0x055f, 0x0007) }, /* ScanExpress 1200 USB Plus */ - { USB_DEVICE(0x055f, 0x0008) }, /* ScanExpress 1200 CU Plus */ - { USB_DEVICE(0x055f, 0x0010) }, /* BearPaw 1200F */ - { USB_DEVICE(0x055f, 0x0210) }, /* ScanExpress A3 USB */ - { USB_DEVICE(0x055f, 0x0218) }, /* BearPaw 2400 TA */ - { USB_DEVICE(0x055f, 0x0219) }, /* BearPaw 2400 TA Plus */ - { USB_DEVICE(0x055f, 0x021c) }, /* BearPaw 1200 CU Plus */ - { USB_DEVICE(0x055f, 0x021d) }, /* Bearpaw 2400 CU Plus */ - { USB_DEVICE(0x055f, 0x021e) }, /* BearPaw 1200 TA/CS */ - { USB_DEVICE(0x055f, 0x0400) }, /* BearPaw 2400 TA PRO */ - { USB_DEVICE(0x055f, 0x0401) }, /* P 3600 A3 Pro */ - { USB_DEVICE(0x055f, 0x0409) }, /* BearPaw 2448TA Pro */ - { USB_DEVICE(0x055f, 0x0873) }, /* ScanExpress 600 USB */ - { USB_DEVICE(0x055f, 0x1000) }, /* BearPaw 4800 TA PRO */ - // { USB_DEVICE(0x05d8, 0x4002) }, /* BearPaw 1200 CU and ScanExpress 1200 UB Plus (see Artec) */ - /* Nikon */ - { USB_DEVICE(0x04b0, 0x4000) }, /* Coolscan LS 40 ED */ - /* Pacific Image Electronics */ - { USB_DEVICE(0x05e3, 0x0120) }, /* PrimeFilm 1800u */ - /* Plustek */ - { USB_DEVICE(0x07b3, 0x0001) }, /* 1212U */ - { USB_DEVICE(0x07b3, 0x0005) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x0007) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x000F) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x0010) }, /* OpticPro U12 */ - { USB_DEVICE(0x07b3, 0x0011) }, /* OpticPro U24 */ - { USB_DEVICE(0x07b3, 0x0012) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x0013) }, /* UT12 */ - { USB_DEVICE(0x07b3, 0x0014) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x0015) }, /* OpticPro U24 */ - { USB_DEVICE(0x07b3, 0x0016) }, /* Unknown */ - { USB_DEVICE(0x07b3, 0x0017) }, /* OpticPro UT12/UT16/UT24 */ - { USB_DEVICE(0x07b3, 0x0400) }, /* OpticPro 1248U */ - { USB_DEVICE(0x07b3, 0x0401) }, /* OpticPro 1248U (another one) */ - { USB_DEVICE(0x07b3, 0x0403) }, /* U16B */ - { USB_DEVICE(0x07b3, 0x0413) }, /* OpticSlim 1200 */ - /* Primax/Colorado */ - { USB_DEVICE(0x0461, 0x0300) }, /* G2-300 #1 */ - { USB_DEVICE(0x0461, 0x0301) }, /* G2E-300 #1 */ - { USB_DEVICE(0x0461, 0x0302) }, /* G2-300 #2 */ - { USB_DEVICE(0x0461, 0x0303) }, /* G2E-300 #2 */ - { USB_DEVICE(0x0461, 0x0340) }, /* Colorado USB 9600 */ - { USB_DEVICE(0x0461, 0x0341) }, /* Colorado 600u */ - { USB_DEVICE(0x0461, 0x0347) }, /* Primascan Colorado 2600u */ - { USB_DEVICE(0x0461, 0x0360) }, /* Colorado USB 19200 */ - { USB_DEVICE(0x0461, 0x0361) }, /* Colorado 1200u */ - { USB_DEVICE(0x0461, 0x0380) }, /* G2-600 #1 */ - { USB_DEVICE(0x0461, 0x0381) }, /* ReadyScan 636i */ - { USB_DEVICE(0x0461, 0x0382) }, /* G2-600 #2 */ - { USB_DEVICE(0x0461, 0x0383) }, /* G2E-600 */ - /* Prolink */ - { USB_DEVICE(0x06dc, 0x0014) }, /* Winscan Pro 2448U */ - /* Reflecta */ - { USB_DEVICE(0x05e3, 0x0120) }, /* iScan 1800 */ - /* Relisis */ - // { USB_DEVICE(0x0475, 0x0103) }, /* Episode - undetected endpoint */ - { USB_DEVICE(0x0475, 0x0210) }, /* Scorpio Ultra 3 */ - /* Seiko/Epson Corp. */ - { USB_DEVICE(0x04b8, 0x0101) }, /* Perfection 636U and 636Photo */ - { USB_DEVICE(0x04b8, 0x0102) }, /* GT-2200 */ - { USB_DEVICE(0x04b8, 0x0103) }, /* Perfection 610 */ - { USB_DEVICE(0x04b8, 0x0104) }, /* Perfection 1200U and 1200Photo*/ - { USB_DEVICE(0x04b8, 0x0105) }, /* StylusScan 2000 */ - { USB_DEVICE(0x04b8, 0x0106) }, /* Stylus Scan 2500 */ - { USB_DEVICE(0x04b8, 0x0107) }, /* Expression 1600 */ - { USB_DEVICE(0x04b8, 0x0109) }, /* Expression 1640XL */ - { USB_DEVICE(0x04b8, 0x010a) }, /* Perfection 1640SU and 1640SU Photo */ - { USB_DEVICE(0x04b8, 0x010b) }, /* Perfection 1240U */ - { USB_DEVICE(0x04b8, 0x010c) }, /* Perfection 640U */ - { USB_DEVICE(0x04b8, 0x010e) }, /* Expression 1680 */ - { USB_DEVICE(0x04b8, 0x010f) }, /* Perfection 1250U */ - { USB_DEVICE(0x04b8, 0x0110) }, /* Perfection 1650 */ - { USB_DEVICE(0x04b8, 0x0112) }, /* Perfection 2450 - GT-9700 for the Japanese mkt */ - { USB_DEVICE(0x04b8, 0x0114) }, /* Perfection 660 */ - { USB_DEVICE(0x04b8, 0x011b) }, /* Perfection 2400 Photo */ - { USB_DEVICE(0x04b8, 0x011c) }, /* Perfection 3200 */ - { USB_DEVICE(0x04b8, 0x011d) }, /* Perfection 1260 */ - { USB_DEVICE(0x04b8, 0x011e) }, /* Perfection 1660 Photo */ - { USB_DEVICE(0x04b8, 0x011f) }, /* Perfection 1670 */ - { USB_DEVICE(0x04b8, 0x0801) }, /* Stylus CX5200 */ - { USB_DEVICE(0x04b8, 0x0802) }, /* Stylus CX3200 */ - /* Siemens */ - { USB_DEVICE(0x0681, 0x0005) }, /* ID Mouse Professional */ - { USB_DEVICE(0x0681, 0x0010) }, /* Cherry FingerTIP ID Board - Sensor */ - /* SYSCAN */ - { USB_DEVICE(0x0a82, 0x4600) }, /* TravelScan 460/464 */ - /* Trust */ - { USB_DEVICE(0x05cb, 0x1483) }, /* CombiScan 19200 */ - { USB_DEVICE(0x05d8, 0x4006) }, /* Easy Webscan 19200 (repackaged Artec?) */ - /* Umax */ - { USB_DEVICE(0x05d8, 0x4009) }, /* Astraslim (actually Artec?) */ - { USB_DEVICE(0x1606, 0x0010) }, /* Astra 1220U */ - { USB_DEVICE(0x1606, 0x0030) }, /* Astra 2000U */ - { USB_DEVICE(0x1606, 0x0060) }, /* Astra 3400U/3450U */ - { USB_DEVICE(0x1606, 0x0070) }, /* Astra 4400 */ - { USB_DEVICE(0x1606, 0x0130) }, /* Astra 2100U */ - { USB_DEVICE(0x1606, 0x0160) }, /* Astra 5400U */ - { USB_DEVICE(0x1606, 0x0230) }, /* Astra 2200U */ - /* Visioneer */ - { USB_DEVICE(0x04a7, 0x0211) }, /* OneTouch 7600 USB */ - { USB_DEVICE(0x04a7, 0x0221) }, /* OneTouch 5300 USB */ - { USB_DEVICE(0x04a7, 0x0224) }, /* OneTouch 4800 USB */ - { USB_DEVICE(0x04a7, 0x0226) }, /* OneTouch 5800 USB */ - { USB_DEVICE(0x04a7, 0x0229) }, /* OneTouch 7100 USB */ - { USB_DEVICE(0x04a7, 0x022c) }, /* OneTouch 9020 USB */ - { USB_DEVICE(0x04a7, 0x0231) }, /* 6100 USB */ - { USB_DEVICE(0x04a7, 0x0311) }, /* 6200 EPP/USB */ - { USB_DEVICE(0x04a7, 0x0321) }, /* OneTouch 8100 EPP/USB */ - { USB_DEVICE(0x04a7, 0x0331) }, /* OneTouch 8600 EPP/USB */ - { USB_DEVICE(0x0461, 0x0345) }, /* 6200 (actually Primax?) */ - { USB_DEVICE(0x0461, 0x0371) }, /* Onetouch 8920 USB (actually Primax?) */ - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE (usb, scanner_device_ids); - -#define IS_EP_BULK(ep) ((ep)->bmAttributes == USB_ENDPOINT_XFER_BULK ? 1 : 0) -#define IS_EP_BULK_IN(ep) (IS_EP_BULK(ep) && ((ep)->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) -#define IS_EP_BULK_OUT(ep) (IS_EP_BULK(ep) && ((ep)->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) -#define IS_EP_INTR(ep) ((ep)->bmAttributes == USB_ENDPOINT_XFER_INT ? 1 : 0) - -#define USB_SCN_MINOR(X) iminor(X) - -#ifdef DEBUG -#define SCN_DEBUG(X) X -#else -#define SCN_DEBUG(X) -#endif - -#define IBUF_SIZE 32768 -#define OBUF_SIZE 4096 - -/* read_scanner timeouts -- RD_NAK_TIMEOUT * RD_EXPIRE = Number of seconds */ -#define RD_NAK_TIMEOUT (10*HZ) /* Default number of X seconds to wait */ -#define RD_EXPIRE 12 /* Number of attempts to wait X seconds */ - - -/* read vendor and product IDs from the scanner */ -#define SCANNER_IOCTL_VENDOR _IOR('U', 0x20, int) -#define SCANNER_IOCTL_PRODUCT _IOR('U', 0x21, int) -/* send/recv a control message to the scanner */ -#define SCANNER_IOCTL_CTRLMSG _IOWR('U', 0x22, struct usb_ctrlrequest) - -/* USB bInterfaceClass used by Hewlett-Packard ScanJet 3300c and Genius HR6 - USB - Vivid III */ -#define SCN_CLASS_SCANJET 16 - -#define SCN_BASE_MNR 48 /* USB Scanners start at minor 48 */ - -static DECLARE_MUTEX (scn_mutex); /* Initializes to unlocked */ - -struct scn_usb_data { - struct usb_device *scn_dev; - struct urb *scn_irq; - unsigned int ifnum; /* Interface number of the USB device */ - int scn_minor; /* Scanner minor - used in disconnect() */ - unsigned char button; /* Front panel buffer */ - char isopen; /* Not zero if the device is open */ - char present; /* Not zero if device is present */ - char *obuf, *ibuf; /* transfer buffers */ - char bulk_in_ep, bulk_out_ep, intr_ep; /* Endpoint assignments */ - wait_queue_head_t rd_wait_q; /* read timeouts */ - struct semaphore sem; /* lock to prevent concurrent reads or writes */ - unsigned int rd_nak_timeout; /* Seconds to wait before read() timeout. */ - struct kobject kobj; /* Handles our reference counting */ -}; -#define to_scanner(d) container_of(d, struct scn_usb_data, kobj) - -static struct usb_driver scanner_driver; diff -Nru a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig --- a/drivers/usb/input/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/input/Kconfig Tue Feb 17 20:00:07 2004 @@ -41,9 +41,11 @@ bool "Force feedback support (EXPERIMENTAL)" depends on USB_HIDINPUT && EXPERIMENTAL help - Say Y here is you want force feedback support for a few HID devices. See - below for a list of supported devices. - See Documentation/input/ff.txt for a description of the force feedback API. + Say Y here is you want force feedback support for a few HID devices. + See below for a list of supported devices. + + See for a description of the force + feedback API. If unsure, say N. @@ -171,7 +173,8 @@ rotation. The dial also acts as a pushbutton. The base contains an LED which can be instructed to pulse or to switch to a particular intensity. - You can download userspace tools from http://sowerbutts.com/powermate/ + You can download userspace tools from + . To compile this driver as a module, choose M here: the module will be called powermate. @@ -185,7 +188,7 @@ and/or "Event interface support" (CONFIG_INPUT_EVDEV) as well. For information about how to connect the X-Box pad to USB, see - Documentation/input/xpad.txt. + . To compile this driver as a module, choose M here: the module will be called xpad. diff -Nru a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c --- a/drivers/usb/input/hid-core.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/input/hid-core.c Tue Feb 17 20:00:07 2004 @@ -602,14 +602,16 @@ case 2: if ((end - start) < 2) return NULL; - item->data.u16 = le16_to_cpu(get_unaligned(((__u16*)start)++)); + item->data.u16 = le16_to_cpu(get_unaligned((__u16*)start)); + start = (__u8 *)((__u16 *)start + 1); return start; case 3: item->size++; if ((end - start) < 4) return NULL; - item->data.u32 = le32_to_cpu(get_unaligned(((__u32*)start)++)); + item->data.u32 = le32_to_cpu(get_unaligned((__u32*)start)); + start = (__u8 *)((__u32 *)start + 1); return start; } diff -Nru a/drivers/usb/media/Kconfig b/drivers/usb/media/Kconfig --- a/drivers/usb/media/Kconfig Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/media/Kconfig Tue Feb 17 20:00:05 2004 @@ -9,9 +9,10 @@ depends on USB ---help--- A Digital Audio Broadcasting (DAB) Receiver for USB and Linux - brought to you by the DAB-Team (). This - driver can be taken as an example for URB-based bulk, control, and - isochronous transactions. URB's are explained in + brought to you by the DAB-Team + . This driver can be taken + as an example for URB-based bulk, control, and isochronous + transactions. URB's are explained in . To compile this driver as a module, choose M here: the @@ -29,7 +30,7 @@ This driver uses the Video For Linux API. You must say Y or M to "Video For Linux" (under Multimedia Devices) to use this driver. Information on this API and pointers to "v4l" programs may be found - on the WWW at . + at . To compile this driver as a module, choose M here: the module will be called vicam. @@ -46,8 +47,8 @@ This driver uses the Video For Linux API. You must enable (Y or M in config) Video For Linux (under Character Devices) to use this driver. Information on this API and pointers to - "v4l" programs may be found on the WWW at - . + "v4l" programs may be found at + . To compile this driver as a module, choose M here: the module will be called dsbr100. @@ -63,8 +64,8 @@ This driver uses the Video For Linux API. You must enable (Y or M in config) Video For Linux (under Character Devices) to use this driver. Information on this API and pointers to - "v4l" programs may be found on the WWW at - . + "v4l" programs may be found at + . To compile this driver as a module, choose M here: the module will be called ibmcam. @@ -83,8 +84,8 @@ This driver uses the Video For Linux API. You must enable (Y or M in config) Video For Linux (under Character Devices) to use this driver. Information on this API and pointers to - "v4l" programs may be found on the WWW at - . + "v4l" programs may be found at + . To compile this driver as a module, choose M here: the module will be called konicawc. @@ -100,7 +101,7 @@ This driver uses the Video For Linux API. You must say Y or M to "Video For Linux" (under Character Devices) to use this driver. Information on this API and pointers to "v4l" programs may be found - on the WWW at . + at . To compile this driver as a module, choose M here: the module will be called ov511. @@ -140,7 +141,7 @@ This driver uses the Video For Linux API. You must say Y or M to "Video For Linux" (under Character Devices) to use this driver. Information on this API and pointers to "v4l" programs may be found - on the WWW at . + at . To compile this driver as a module, choose M here: the module will be called pwc. @@ -156,7 +157,7 @@ This driver uses the Video For Linux API. You must say Y or M to "Video For Linux" (under Multimedia Devices) to use this driver. Information on this API and pointers to "v4l" programs may be found - on the WWW at . + at . To compile this driver as a module, choose M here: the module will be called se401. @@ -173,7 +174,7 @@ This driver uses the Video For Linux API. You must say Y or M to "Video For Linux" (under Multimedia Devices) to use this driver. Information on this API and pointers to "v4l" programs may be found - on the WWW at . + at . To compile this driver as a module, choose M here: the module will be called stv680. diff -Nru a/drivers/usb/media/dsbr100.c b/drivers/usb/media/dsbr100.c --- a/drivers/usb/media/dsbr100.c Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/media/dsbr100.c Tue Feb 17 20:00:06 2004 @@ -15,7 +15,7 @@ You might find some interesting stuff about this module at http://unimut.fsk.uni-heidelberg.de/unimut/demi/dsbr - Copyright (c) 2000 Markus Demleitner + Copyright (c) 2000 Markus Demleitner This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,7 @@ History: Version 0.30: - Markus: Updates for 2.5.x kernel and more ISO compiant source + Markus: Updates for 2.5.x kernel and more ISO compliant source Version 0.25: PSL and Markus: Cleanup, radio now doesn't stop on device close @@ -75,7 +75,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v0.25" +#define DRIVER_VERSION "v0.30" #define DRIVER_AUTHOR "Markus Demleitner " #define DRIVER_DESC "D-Link DSB-R100 USB FM radio driver" diff -Nru a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig --- a/drivers/usb/misc/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/misc/Kconfig Tue Feb 17 20:00:08 2004 @@ -17,7 +17,7 @@ This code is also available as a module ( = code which can be inserted in and removed from the running kernel whenever you want). The module will be called audio. If you want to compile it as a - module, say M here and read . + module, say M here and read . config USB_EMI26 tristate "EMI 2|6 USB Audio interface support" @@ -83,7 +83,8 @@ This code is also available as a module ( = code which can be inserted in and removed from the running kernel whenever you want). The module will be called legousbtower. If you want to compile it as - a module, say M here and read . + a module, say M here and read + . config USB_BRLVGER tristate "Tieman Voyager USB Braille display support (EXPERIMENTAL)" @@ -102,7 +103,7 @@ help Say Y here if you want to connect an USBLCD to your computer's USB port. The USBLCD is a small USB interface board for - alphanumeric LCD modules. See for more + alphanumeric LCD modules. See for more information. To compile this driver as a module, choose M here: the @@ -139,6 +140,6 @@ with specialized device firmware for regression and stress testing, to help prevent problems from cropping up with "real" drivers. - See for more information, + See for more information, including sample test device firmware and "how to use it". diff -Nru a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c --- a/drivers/usb/misc/usbtest.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/misc/usbtest.c Tue Feb 17 20:00:08 2004 @@ -1,15 +1,16 @@ #include +#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG) +# define DEBUG +#endif #include #include #include #include #include #include +#include #include -#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG) -# define DEBUG -#endif #include @@ -20,10 +21,10 @@ struct usbtest_param { // inputs unsigned test_num; /* 0..(TEST_CASES-1) */ - int iterations; - int length; - int vary; - int sglen; + unsigned iterations; + unsigned length; + unsigned vary; + unsigned sglen; // outputs struct timeval duration; @@ -48,6 +49,8 @@ u8 ep_in; /* bulk/intr source */ u8 ep_out; /* bulk/intr sink */ unsigned autoconf : 1; + unsigned ctrl_out : 1; + unsigned iso : 1; /* try iso in/out */ int alt; }; @@ -60,9 +63,11 @@ struct usbtest_dev { struct usb_interface *intf; struct usbtest_info *info; - char id [32]; int in_pipe; int out_pipe; + int in_iso_pipe; + int out_iso_pipe; + struct usb_endpoint_descriptor *iso_in, *iso_out; struct semaphore sem; #define TBUF_SIZE 256 @@ -77,6 +82,31 @@ /* set up all urbs so they can be used with either bulk or interrupt */ #define INTERRUPT_RATE 1 /* msec/transfer */ +#define xprintk(tdev,level,fmt,args...) \ + dev_printk(level , &(tdev)->intf->dev , fmt , ## args) + +#ifdef DEBUG +#define DBG(dev,fmt,args...) \ + xprintk(dev , KERN_DEBUG , fmt , ## args) +#else +#define DBG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#ifdef VERBOSE +#define VDBG DBG +#else +#define VDBG(dev,fmt,args...) \ + do { } while (0) +#endif /* VERBOSE */ + +#define ERROR(dev,fmt,args...) \ + xprintk(dev , KERN_ERR , fmt , ## args) +#define WARN(dev,fmt,args...) \ + xprintk(dev , KERN_WARNING , fmt , ## args) +#define INFO(dev,fmt,args...) \ + xprintk(dev , KERN_INFO , fmt , ## args) + /*-------------------------------------------------------------------------*/ static int @@ -85,12 +115,14 @@ int tmp; struct usb_host_interface *alt; struct usb_host_endpoint *in, *out; + struct usb_host_endpoint *iso_in, *iso_out; struct usb_device *udev; for (tmp = 0; tmp < intf->num_altsetting; tmp++) { unsigned ep; in = out = 0; + iso_in = iso_out = 0; alt = intf->altsetting + tmp; /* take the first altsetting with in-bulk + out-bulk; @@ -100,8 +132,16 @@ struct usb_host_endpoint *e; e = alt->endpoint + ep; - if (e->desc.bmAttributes != USB_ENDPOINT_XFER_BULK) + switch (e->desc.bmAttributes) { + case USB_ENDPOINT_XFER_BULK: + break; + case USB_ENDPOINT_XFER_ISOC: + if (dev->info->iso) + goto try_iso; + // FALLTHROUGH + default: continue; + } if (e->desc.bEndpointAddress & USB_DIR_IN) { if (!in) in = e; @@ -111,6 +151,17 @@ } if (in && out) goto found; + continue; +try_iso: + if (e->desc.bEndpointAddress & USB_DIR_IN) { + if (!iso_in) + iso_in = e; + } else { + if (!iso_out) + iso_out = e; + } + if (iso_in && iso_out) + goto found; } } return -EINVAL; @@ -125,10 +176,21 @@ return tmp; } - dev->in_pipe = usb_rcvbulkpipe (udev, + if (in) { + dev->in_pipe = usb_rcvbulkpipe (udev, in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - dev->out_pipe = usb_sndbulkpipe (udev, + dev->out_pipe = usb_sndbulkpipe (udev, out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); + } else if (iso_in) { + dev->iso_in = &iso_in->desc; + dev->in_iso_pipe = usb_rcvisocpipe (udev, + iso_in->desc.bEndpointAddress + & USB_ENDPOINT_NUMBER_MASK); + dev->iso_out = &iso_out->desc; + dev->out_iso_pipe = usb_sndisocpipe (udev, + iso_out->desc.bEndpointAddress + & USB_ENDPOINT_NUMBER_MASK); + } return 0; } @@ -176,6 +238,63 @@ return urb; } +static unsigned pattern = 0; +module_param (pattern, uint, S_IRUGO); +// MODULE_PARM_DESC (pattern, "i/o pattern (0 == zeroes)"); + +static inline void simple_fill_buf (struct urb *urb) +{ + unsigned i; + u8 *buf = urb->transfer_buffer; + unsigned len = urb->transfer_buffer_length; + + switch (pattern) { + default: + // FALLTHROUGH + case 0: + memset (buf, 0, len); + break; + case 1: /* mod63 */ + for (i = 0; i < len; i++) + *buf++ = (u8) (i % 63); + break; + } +} + +static inline int simple_check_buf (struct urb *urb) +{ + unsigned i; + u8 expected; + u8 *buf = urb->transfer_buffer; + unsigned len = urb->actual_length; + + for (i = 0; i < len; i++, buf++) { + switch (pattern) { + /* all-zeroes has no synchronization issues */ + case 0: + expected = 0; + break; + /* mod63 stays in sync with short-terminated transfers, + * or otherwise when host and gadget agree on how large + * each usb transfer request should be. resync is done + * with set_interface or set_config. + */ + case 1: /* mod63 */ + expected = i % 63; + break; + /* always fail unsupported patterns */ + default: + expected = !*buf; + break; + } + if (*buf == expected) + continue; + dbg ("buf[%d] = %d (not %d)", i, *buf, expected); + return -EINVAL; + } + return 0; +} + static void simple_free_urb (struct urb *urb) { usb_buffer_free (urb->dev, urb->transfer_buffer_length, @@ -186,7 +305,9 @@ static int simple_io ( struct urb *urb, int iterations, - int vary + int vary, + int expected, + const char *label ) { struct usb_device *udev = urb->dev; @@ -197,6 +318,8 @@ urb->context = &completion; while (retval == 0 && iterations-- > 0) { init_completion (&completion); + if (usb_pipeout (urb->pipe)) + simple_fill_buf (urb); if ((retval = usb_submit_urb (urb, SLAB_KERNEL)) != 0) break; @@ -204,6 +327,8 @@ wait_for_completion (&completion); retval = urb->status; urb->dev = udev; + if (retval == 0 && usb_pipein (urb->pipe)) + retval = simple_check_buf (urb); if (vary) { int len = urb->transfer_buffer_length; @@ -219,14 +344,14 @@ } urb->transfer_buffer_length = max; - // FIXME for unlink or fault handling tests, don't report - // failure if retval is as we expected ... - if (retval) - dbg ("simple_io failed, iterations left %d, status %d", - iterations, retval); + if (expected != retval) + dev_dbg (&udev->dev, + "%s failed, iterations left %d, status %d (not %d)\n", + label, iterations, retval, expected); return retval; } + /*-------------------------------------------------------------------------*/ /* We use scatterlist primitives to test queued I/O. @@ -360,54 +485,18 @@ } } -/* this is usb_set_interface(), with no 'only one altsetting' case */ static int set_altsetting (struct usbtest_dev *dev, int alternate) { struct usb_interface *iface = dev->intf; struct usb_device *udev; - struct usb_host_interface *iface_as; - int i, ret; if (alternate < 0 || alternate >= iface->num_altsetting) return -EINVAL; udev = interface_to_usbdev (iface); - if ((ret = usb_control_msg (udev, usb_sndctrlpipe (udev, 0), - USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, - alternate, - iface->altsetting->desc.bInterfaceNumber, - NULL, 0, HZ * USB_CTRL_SET_TIMEOUT)) < 0) - return ret; - - // FIXME usbcore should be more like this: - // - remove that special casing in usbcore. - // - fix usbcore signature to take interface - - /* prevent requests using previous endpoint settings */ - iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; - int out = !(ep & USB_DIR_IN); - - ep &= USB_ENDPOINT_NUMBER_MASK; - (out ? udev->epmaxpacketout : udev->epmaxpacketin ) [ep] = 0; - // FIXME want hcd hook here, "forget this endpoint" - } - iface->act_altsetting = alternate; - - /* reset toggles and maxpacket for all endpoints affected */ - iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; - int out = !(ep & USB_DIR_IN); - - ep &= USB_ENDPOINT_NUMBER_MASK; - usb_settoggle (udev, ep, out, 0); - (out ? udev->epmaxpacketout : udev->epmaxpacketin ) [ep] - = iface_as->endpoint [i].desc.wMaxPacketSize; - } - - return 0; + return usb_set_interface (udev, + iface->altsetting [0].desc.bInterfaceNumber, + alternate); } static int is_good_config (char *buf, int len) @@ -421,15 +510,19 @@ switch (config->bDescriptorType) { case USB_DT_CONFIG: case USB_DT_OTHER_SPEED_CONFIG: - if (config->bLength != 9) + if (config->bLength != 9) { + dbg ("bogus config descriptor length"); return 0; + } /* this bit 'must be 1' but often isn't */ if (!realworld && !(config->bmAttributes & 0x80)) { dbg ("high bit of config attributes not set"); return 0; } - if (config->bmAttributes & 0x1f) /* reserved == 0 */ + if (config->bmAttributes & 0x1f) { /* reserved == 0 */ + dbg ("reserved config bits set"); return 0; + } break; default: return 0; @@ -438,7 +531,10 @@ le16_to_cpus (&config->wTotalLength); if (config->wTotalLength == len) /* read it all */ return 1; - return config->wTotalLength >= TBUF_SIZE; /* max partial read */ + if (config->wTotalLength >= TBUF_SIZE) /* max partial read */ + return 1; + dbg ("bogus config descriptor read size"); + return 0; } /* sanity test for standard requests working with usb_control_mesg() and some @@ -471,8 +567,9 @@ * they're ordered meaningfully in this array */ if (iface->altsetting [i].desc.bAlternateSetting != i) { - dbg ("%s, invalid alt [%d].bAltSetting = %d", - dev->id, i, + dev_dbg (&iface->dev, + "invalid alt [%d].bAltSetting = %d\n", + i, iface->altsetting [i].desc .bAlternateSetting); return -EDOM; @@ -485,16 +582,16 @@ /* [9.4.10] set_interface */ retval = set_altsetting (dev, i); if (retval) { - dbg ("%s can't set_interface = %d, %d", - dev->id, i, retval); + dev_dbg (&iface->dev, "can't set_interface = %d, %d\n", + i, retval); return retval; } /* [9.4.4] get_interface always works */ retval = get_altsetting (dev); if (retval != i) { - dbg ("%s get alt should be %d, was %d", - dev->id, i, retval); + dev_dbg (&iface->dev, "get alt should be %d, was %d\n", + i, retval); return (retval < 0) ? retval : -EDOM; } @@ -513,7 +610,8 @@ USB_DIR_IN | USB_RECIP_DEVICE, 0, 0, dev->buf, 1, HZ * USB_CTRL_GET_TIMEOUT); if (retval != 1 || dev->buf [0] != expected) { - dbg ("%s get config --> %d (%d)", dev->id, retval, + dev_dbg (&iface->dev, + "get config --> %d (%d)\n", retval, expected); return (retval < 0) ? retval : -EDOM; } @@ -523,7 +621,7 @@ retval = usb_get_descriptor (udev, USB_DT_DEVICE, 0, dev->buf, sizeof udev->descriptor); if (retval != sizeof udev->descriptor) { - dbg ("%s dev descriptor --> %d", dev->id, retval); + dev_dbg (&iface->dev, "dev descriptor --> %d\n", retval); return (retval < 0) ? retval : -EDOM; } @@ -532,8 +630,9 @@ retval = usb_get_descriptor (udev, USB_DT_CONFIG, i, dev->buf, TBUF_SIZE); if (!is_good_config (dev->buf, retval)) { - dbg ("%s config [%d] descriptor --> %d", - dev->id, i, retval); + dev_dbg (&iface->dev, + "config [%d] descriptor --> %d\n", + i, retval); return (retval < 0) ? retval : -EDOM; } @@ -551,13 +650,14 @@ sizeof (struct usb_qualifier_descriptor)); if (retval == -EPIPE) { if (udev->speed == USB_SPEED_HIGH) { - dbg ("%s hs dev qualifier --> %d", - dev->id, retval); + dev_dbg (&iface->dev, + "hs dev qualifier --> %d\n", + retval); return (retval < 0) ? retval : -EDOM; } /* usb2.0 but not high-speed capable; fine */ } else if (retval != sizeof (struct usb_qualifier_descriptor)) { - dbg ("%s dev qualifier --> %d", dev->id, retval); + dev_dbg (&iface->dev, "dev qualifier --> %d\n", retval); return (retval < 0) ? retval : -EDOM; } else d = (struct usb_qualifier_descriptor *) dev->buf; @@ -570,8 +670,9 @@ USB_DT_OTHER_SPEED_CONFIG, i, dev->buf, TBUF_SIZE); if (!is_good_config (dev->buf, retval)) { - dbg ("%s other speed config --> %d", - dev->id, retval); + dev_dbg (&iface->dev, + "other speed config --> %d\n", + retval); return (retval < 0) ? retval : -EDOM; } } @@ -582,7 +683,7 @@ /* [9.4.5] get_status always works */ retval = usb_get_status (udev, USB_RECIP_DEVICE, 0, dev->buf); if (retval != 2) { - dbg ("%s get dev status --> %d", dev->id, retval); + dev_dbg (&iface->dev, "get dev status --> %d\n", retval); return (retval < 0) ? retval : -EDOM; } @@ -592,7 +693,7 @@ retval = usb_get_status (udev, USB_RECIP_INTERFACE, iface->altsetting [0].desc.bInterfaceNumber, dev->buf); if (retval != 2) { - dbg ("%s get interface status --> %d", dev->id, retval); + dev_dbg (&iface->dev, "get interface status --> %d\n", retval); return (retval < 0) ? retval : -EDOM; } // FIXME get status for each endpoint in the interface @@ -606,7 +707,7 @@ * (a) queues work for control, keeping N subtests queued and * active (auto-resubmit) for M loops through the queue. * (b) protocol stalls (control-only) will autorecover. - * it's quite not like bulk/intr; no halt clearing. + * it's not like bulk/intr; no halt clearing. * (c) short control reads are reported and handled. * (d) queues are always processed in-order */ @@ -654,6 +755,7 @@ dbg ("subcase %d completed out of order, last %d", subcase->number, ctx->last); status = -EDOM; + ctx->last = subcase->number; goto error; } } @@ -995,6 +1097,368 @@ /*-------------------------------------------------------------------------*/ +static int verify_not_halted (int ep, struct urb *urb) +{ + int retval; + u16 status; + + /* shouldn't look or act halted */ + retval = usb_get_status (urb->dev, USB_RECIP_ENDPOINT, ep, &status); + if (retval < 0) { + dbg ("ep %02x couldn't get no-halt status, %d", ep, retval); + return retval; + } + if (status != 0) { + dbg ("ep %02x bogus status: %04x != 0", ep, status); + return -EINVAL; + } + retval = simple_io (urb, 1, 0, 0, __FUNCTION__); + if (retval != 0) + return -EINVAL; + return 0; +} + +static int verify_halted (int ep, struct urb *urb) +{ + int retval; + u16 status; + + /* should look and act halted */ + retval = usb_get_status (urb->dev, USB_RECIP_ENDPOINT, ep, &status); + if (retval < 0) { + dbg ("ep %02x couldn't get halt status, %d", ep, retval); + return retval; + } + if (status != 1) { + dbg ("ep %02x bogus status: %04x != 1", ep, status); + return -EINVAL; + } + retval = simple_io (urb, 1, 0, -EPIPE, __FUNCTION__); + if (retval != -EPIPE) + return -EINVAL; + retval = simple_io (urb, 1, 0, -EPIPE, "verify_still_halted"); + if (retval != -EPIPE) + return -EINVAL; + return 0; +} + +static int test_halt (int ep, struct urb *urb) +{ + int retval; + + /* shouldn't look or act halted now */ + retval = verify_not_halted (ep, urb); + if (retval < 0) + return retval; + + /* set halt (protocol test only), verify it worked */ + retval = usb_control_msg (urb->dev, usb_sndctrlpipe (urb->dev, 0), + USB_REQ_SET_FEATURE, USB_RECIP_ENDPOINT, 0, ep, + NULL, 0, HZ * USB_CTRL_SET_TIMEOUT); + if (retval < 0) { + dbg ("ep %02x couldn't set halt, %d", ep, retval); + return retval; + } + retval = verify_halted (ep, urb); + if (retval < 0) + return retval; + + /* clear halt (tests API + protocol), verify it worked */ + retval = usb_clear_halt (urb->dev, urb->pipe); + if (retval < 0) { + dbg ("ep %02x couldn't clear halt, %d", ep, retval); + return retval; + } + retval = verify_not_halted (ep, urb); + if (retval < 0) + return retval; + + /* NOTE: could also verify SET_INTERFACE clear halts ... */ + + return 0; +} + +static int halt_simple (struct usbtest_dev *dev) +{ + int ep; + int retval = 0; + struct urb *urb; + + urb = simple_alloc_urb (testdev_to_usbdev (dev), 0, 512); + if (urb == 0) + return -ENOMEM; + + if (dev->in_pipe) { + ep = usb_pipeendpoint (dev->in_pipe) | USB_DIR_IN; + urb->pipe = dev->in_pipe; + retval = test_halt (ep, urb); + if (retval < 0) + goto done; + } + + if (dev->out_pipe) { + ep = usb_pipeendpoint (dev->out_pipe); + urb->pipe = dev->out_pipe; + retval = test_halt (ep, urb); + } +done: + simple_free_urb (urb); + return retval; +} + +/*-------------------------------------------------------------------------*/ + +/* Control OUT tests use the vendor control requests from Intel's + * USB 2.0 compliance test device: write a buffer, read it back. + * + * Intel's spec only _requires_ that it work for one packet, which + * is pretty weak. Some HCDs place limits here; most devices will + * need to be able to handle more than one OUT data packet. We'll + * try whatever we're told to try. + */ +static int ctrl_out (struct usbtest_dev *dev, + unsigned count, unsigned length, unsigned vary) +{ + unsigned i, j, len, retval; + u8 *buf; + char *what = "?"; + struct usb_device *udev; + + if (length > 0xffff || vary >= length) + return -EINVAL; + + buf = kmalloc(length, SLAB_KERNEL); + if (!buf) + return -ENOMEM; + + udev = testdev_to_usbdev (dev); + len = length; + retval = 0; + + /* NOTE: hardware might well act differently if we pushed it + * with lots back-to-back queued requests. + */ + for (i = 0; i < count; i++) { + /* write patterned data */ + for (j = 0; j < len; j++) + buf [j] = i + j; + retval = usb_control_msg (udev, usb_sndctrlpipe (udev,0), + 0x5b, USB_DIR_OUT|USB_TYPE_VENDOR, + 0, 0, buf, len, HZ * USB_CTRL_SET_TIMEOUT); + if (retval != len) { + what = "write"; + break; + } + + /* read it back -- assuming nothing intervened!! */ + retval = usb_control_msg (udev, usb_rcvctrlpipe (udev,0), + 0x5c, USB_DIR_IN|USB_TYPE_VENDOR, + 0, 0, buf, len, HZ * USB_CTRL_GET_TIMEOUT); + if (retval != len) { + what = "read"; + break; + } + + /* fail if we can't verify */ + for (j = 0; j < len; j++) { + if (buf [j] != (u8) (i + j)) { + INFO (dev, "ctrl_out, byte %d is %d not %d\n", + j, buf [j], (u8) i + j); + retval = -EBADMSG; + break; + } + } + if (retval < 0) { + what = "verify"; + break; + } + + len += vary; + if (len > length) + len = 0; + } + + if (retval < 0) + INFO (dev, "ctrl_out %s failed, code %d, count %d\n", + what, retval, i); + + kfree (buf); + return retval; +} + +/*-------------------------------------------------------------------------*/ + +/* ISO tests ... mimics common usage + * - buffer length is split into N packets (mostly maxpacket sized) + * - multi-buffers according to sglen + */ + +struct iso_context { + unsigned count; + unsigned pending; + spinlock_t lock; + struct completion done; + unsigned long errors; + struct usbtest_dev *dev; +}; + +static void iso_callback (struct urb *urb, struct pt_regs *regs) +{ + struct iso_context *ctx = urb->context; + + spin_lock(&ctx->lock); + ctx->count--; + + if (urb->error_count > 0) + ctx->errors += urb->error_count; + + if (urb->status == 0 && ctx->count > (ctx->pending - 1)) { + int status = usb_submit_urb (urb, GFP_ATOMIC); + switch (status) { + case 0: + goto done; + default: + dev_dbg (&ctx->dev->intf->dev, + "iso resubmit err %d\n", + status); + /* FALLTHROUGH */ + case -ENODEV: /* disconnected */ + break; + } + } + simple_free_urb (urb); + + ctx->pending--; + if (ctx->pending == 0) { + if (ctx->errors) + dev_dbg (&ctx->dev->intf->dev, + "iso test, %lu errors\n", + ctx->errors); + complete (&ctx->done); + } else +done: + spin_unlock(&ctx->lock); +} + +static struct urb *iso_alloc_urb ( + struct usb_device *udev, + int pipe, + struct usb_endpoint_descriptor *desc, + long bytes +) +{ + struct urb *urb; + unsigned i, maxp, packets; + + if (bytes < 0 || !desc) + return 0; + maxp = 0x7ff & desc->wMaxPacketSize; + maxp *= 1 + (0x3 & (desc->wMaxPacketSize >> 11)); + packets = (bytes + maxp - 1) / maxp; + + urb = usb_alloc_urb (packets, SLAB_KERNEL); + if (!urb) + return urb; + urb->dev = udev; + urb->pipe = pipe; + + urb->number_of_packets = packets; + urb->transfer_buffer_length = bytes; + urb->transfer_buffer = usb_buffer_alloc (udev, bytes, SLAB_KERNEL, + &urb->transfer_dma); + if (!urb->transfer_buffer) { + usb_free_urb (urb); + return 0; + } + memset (urb->transfer_buffer, 0, bytes); + for (i = 0; i < packets; i++) { + /* here, only the last packet will be short */ + urb->iso_frame_desc[i].length = min ((unsigned) bytes, maxp); + bytes -= urb->iso_frame_desc[i].length; + + urb->iso_frame_desc[i].offset = maxp * i; + } + + urb->complete = iso_callback; + // urb->context = SET BY CALLER + urb->interval = 1 << (desc->bInterval - 1); + urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; + return urb; +} + +static int +test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, + int pipe, struct usb_endpoint_descriptor *desc) +{ + struct iso_context context; + struct usb_device *udev; + unsigned i; + unsigned long packets = 0; + int status; + struct urb *urbs[10]; /* FIXME no limit */ + + if (param->sglen > 10) + return -EDOM; + + context.count = param->iterations * param->sglen; + context.pending = param->sglen; + context.errors = 0; + context.dev = dev; + init_completion (&context.done); + spin_lock_init (&context.lock); + + memset (urbs, 0, sizeof urbs); + udev = testdev_to_usbdev (dev); + dev_dbg (&dev->intf->dev, + "... iso period %d %sframes, wMaxPacket %04x\n", + 1 << (desc->bInterval - 1), + (udev->speed == USB_SPEED_HIGH) ? "micro" : "", + desc->wMaxPacketSize); + + for (i = 0; i < param->sglen; i++) { + urbs [i] = iso_alloc_urb (udev, pipe, desc, + param->length); + if (!urbs [i]) { + status = -ENOMEM; + goto fail; + } + packets += urbs[i]->number_of_packets; + urbs [i]->context = &context; + } + packets *= param->iterations; + dev_dbg (&dev->intf->dev, + "... total %lu msec (%lu packets)\n", + (packets * (1 << (desc->bInterval - 1))) + / ((udev->speed == USB_SPEED_HIGH) ? 8 : 1), + packets); + + spin_lock_irq (&context.lock); + for (i = 0; i < param->sglen; i++) { + status = usb_submit_urb (urbs [i], SLAB_ATOMIC); + if (status < 0) { + ERROR (dev, "submit iso[%d], error %d\n", i, status); + if (i == 0) + goto fail; + + simple_free_urb (urbs [i]); + context.pending--; + } + } + spin_unlock_irq (&context.lock); + + wait_for_completion (&context.done); + return 0; + +fail: + for (i = 0; i < param->sglen; i++) { + if (urbs [i]) + simple_free_urb (urbs [i]); + } + return status; +} + +/*-------------------------------------------------------------------------*/ + /* We only have this one interface to user space, through usbfs. * User mode code can scan usbfs to find N different devices (maybe on * different busses) to use when testing, and allocate one thread per @@ -1047,8 +1511,9 @@ } res = set_altsetting (dev, dev->info->alt); if (res) { - err ("%s: set altsetting to %d failed, %d", - dev->id, dev->info->alt, res); + dev_err (&intf->dev, + "set altsetting to %d failed, %d\n", + dev->info->alt, res); up (&dev->sem); return res; } @@ -1067,7 +1532,7 @@ switch (param->test_num) { case 0: - dbg ("%s TEST 0: NOP", dev->id); + dev_dbg (&intf->dev, "TEST 0: NOP\n"); retval = 0; break; @@ -1075,7 +1540,8 @@ case 1: if (dev->out_pipe == 0) break; - dbg ("%s TEST 1: write %d bytes %u times", dev->id, + dev_dbg (&intf->dev, + "TEST 1: write %d bytes %u times\n", param->length, param->iterations); urb = simple_alloc_urb (udev, dev->out_pipe, param->length); if (!urb) { @@ -1083,13 +1549,14 @@ break; } // FIRMWARE: bulk sink (maybe accepts short writes) - retval = simple_io (urb, param->iterations, 0); + retval = simple_io (urb, param->iterations, 0, 0, "test1"); simple_free_urb (urb); break; case 2: if (dev->in_pipe == 0) break; - dbg ("%s TEST 2: read %d bytes %u times", dev->id, + dev_dbg (&intf->dev, + "TEST 2: read %d bytes %u times\n", param->length, param->iterations); urb = simple_alloc_urb (udev, dev->in_pipe, param->length); if (!urb) { @@ -1097,13 +1564,14 @@ break; } // FIRMWARE: bulk source (maybe generates short writes) - retval = simple_io (urb, param->iterations, 0); + retval = simple_io (urb, param->iterations, 0, 0, "test2"); simple_free_urb (urb); break; case 3: if (dev->out_pipe == 0 || param->vary == 0) break; - dbg ("%s TEST 3: write/%d 0..%d bytes %u times", dev->id, + dev_dbg (&intf->dev, + "TEST 3: write/%d 0..%d bytes %u times\n", param->vary, param->length, param->iterations); urb = simple_alloc_urb (udev, dev->out_pipe, param->length); if (!urb) { @@ -1111,13 +1579,15 @@ break; } // FIRMWARE: bulk sink (maybe accepts short writes) - retval = simple_io (urb, param->iterations, param->vary); + retval = simple_io (urb, param->iterations, param->vary, + 0, "test3"); simple_free_urb (urb); break; case 4: if (dev->in_pipe == 0 || param->vary == 0) break; - dbg ("%s TEST 4: read/%d 0..%d bytes %u times", dev->id, + dev_dbg (&intf->dev, + "TEST 4: read/%d 0..%d bytes %u times\n", param->vary, param->length, param->iterations); urb = simple_alloc_urb (udev, dev->in_pipe, param->length); if (!urb) { @@ -1125,7 +1595,8 @@ break; } // FIRMWARE: bulk source (maybe generates short writes) - retval = simple_io (urb, param->iterations, param->vary); + retval = simple_io (urb, param->iterations, param->vary, + 0, "test4"); simple_free_urb (urb); break; @@ -1133,8 +1604,9 @@ case 5: if (dev->out_pipe == 0 || param->sglen == 0) break; - dbg ("%s TEST 5: write %d sglists, %d entries of %d bytes", - dev->id, param->iterations, + dev_dbg (&intf->dev, + "TEST 5: write %d sglists %d entries of %d bytes\n", + param->iterations, param->sglen, param->length); sg = alloc_sglist (param->sglen, param->length, 0); if (!sg) { @@ -1150,8 +1622,9 @@ case 6: if (dev->in_pipe == 0 || param->sglen == 0) break; - dbg ("%s TEST 6: read %d sglists, %d entries of %d bytes", - dev->id, param->iterations, + dev_dbg (&intf->dev, + "TEST 6: read %d sglists %d entries of %d bytes\n", + param->iterations, param->sglen, param->length); sg = alloc_sglist (param->sglen, param->length, 0); if (!sg) { @@ -1166,8 +1639,9 @@ case 7: if (dev->out_pipe == 0 || param->sglen == 0 || param->vary == 0) break; - dbg ("%s TEST 7: write/%d %d sglists, %d entries 0..%d bytes", - dev->id, param->vary, param->iterations, + dev_dbg (&intf->dev, + "TEST 7: write/%d %d sglists %d entries 0..%d bytes\n", + param->vary, param->iterations, param->sglen, param->length); sg = alloc_sglist (param->sglen, param->length, param->vary); if (!sg) { @@ -1182,8 +1656,9 @@ case 8: if (dev->in_pipe == 0 || param->sglen == 0 || param->vary == 0) break; - dbg ("%s TEST 8: read/%d %d sglists, %d entries 0..%d bytes", - dev->id, param->vary, param->iterations, + dev_dbg (&intf->dev, + "TEST 8: read/%d %d sglists %d entries 0..%d bytes\n", + param->vary, param->iterations, param->sglen, param->length); sg = alloc_sglist (param->sglen, param->length, param->vary); if (!sg) { @@ -1199,8 +1674,9 @@ /* non-queued sanity tests for control (chapter 9 subset) */ case 9: retval = 0; - dbg ("%s TEST 9: ch9 (subset) control tests, %d times", - dev->id, param->iterations); + dev_dbg (&intf->dev, + "TEST 9: ch9 (subset) control tests, %d times\n", + param->iterations); for (i = param->iterations; retval == 0 && i--; /* NOP */) retval = ch9_postconfig (dev); if (retval) @@ -1212,8 +1688,9 @@ if (param->sglen == 0) break; retval = 0; - dbg ("%s TEST 10: queue %d control calls, %d times", - dev->id, param->sglen, + dev_dbg (&intf->dev, + "TEST 10: queue %d control calls, %d times\n", + param->sglen, param->iterations); retval = test_ctrl_queue (dev, param); break; @@ -1223,10 +1700,11 @@ if (dev->in_pipe == 0 || !param->length) break; retval = 0; - dbg ("%s TEST 11: unlink %d reads of %d", - dev->id, param->iterations, param->length); + dev_dbg (&intf->dev, "TEST 11: unlink %d reads of %d\n", + param->iterations, param->length); for (i = param->iterations; retval == 0 && i--; /* NOP */) - retval = unlink_simple (dev, dev->in_pipe, param->length); + retval = unlink_simple (dev, dev->in_pipe, + param->length); if (retval) dbg ("unlink reads failed, iterations left %d", i); break; @@ -1234,14 +1712,65 @@ if (dev->out_pipe == 0 || !param->length) break; retval = 0; - dbg ("%s TEST 12: unlink %d writes of %d", - dev->id, param->iterations, param->length); + dev_dbg (&intf->dev, "TEST 12: unlink %d writes of %d\n", + param->iterations, param->length); for (i = param->iterations; retval == 0 && i--; /* NOP */) - retval = unlink_simple (dev, dev->out_pipe, param->length); + retval = unlink_simple (dev, dev->out_pipe, + param->length); if (retval) dbg ("unlink writes failed, iterations left %d", i); break; + /* ep halt tests */ + case 13: + if (dev->out_pipe == 0 && dev->in_pipe == 0) + break; + retval = 0; + dev_dbg (&intf->dev, "TEST 13: set/clear %d halts\n", + param->iterations); + for (i = param->iterations; retval == 0 && i--; /* NOP */) + retval = halt_simple (dev); + + if (retval) + DBG (dev, "halts failed, iterations left %d\n", i); + break; + + /* control write tests */ + case 14: + if (!dev->info->ctrl_out) + break; + dev_dbg (&intf->dev, "TEST 14: %d ep0out, 0..%d vary %d\n", + param->iterations, param->length, param->vary); + retval = ctrl_out (dev, param->iterations, + param->length, param->vary); + break; + + /* iso write tests */ + case 15: + if (dev->out_iso_pipe == 0 || param->sglen == 0) + break; + dev_dbg (&intf->dev, + "TEST 15: write %d iso, %d entries of %d bytes\n", + param->iterations, + param->sglen, param->length); + // FIRMWARE: iso sink + retval = test_iso_queue (dev, param, + dev->out_iso_pipe, dev->iso_out); + break; + + /* iso read tests */ + case 16: + if (dev->in_iso_pipe == 0 || param->sglen == 0) + break; + dev_dbg (&intf->dev, + "TEST 16: read %d iso, %d entries of %d bytes\n", + param->iterations, + param->sglen, param->length); + // FIRMWARE: iso source + retval = test_iso_queue (dev, param, + dev->in_iso_pipe, dev->iso_in); + break; + // FIXME unlink from queue (ring with N urbs) // FIXME scatterlist cancel (needs helper thread) @@ -1262,7 +1791,7 @@ static int force_interrupt = 0; MODULE_PARM (force_interrupt, "i"); -MODULE_PARM_DESC (force_interrupt, "0 = test bulk (default), else interrupt"); +MODULE_PARM_DESC (force_interrupt, "0 = test default; else interrupt"); #ifdef GENERIC static int vendor; @@ -1281,6 +1810,7 @@ struct usbtest_dev *dev; struct usbtest_info *info; char *rtest, *wtest; + char *irtest, *iwtest; udev = interface_to_usbdev (intf); @@ -1306,10 +1836,6 @@ dev->info = info; init_MUTEX (&dev->sem); - /* use the same kind of id the hid driver shows */ - snprintf (dev->id, sizeof dev->id, "%s-%s:%d", - udev->bus->bus_name, udev->devpath, - intf->altsetting [0].desc.bInterfaceNumber); dev->intf = intf; /* cacheline-aligned scratch for i/o */ @@ -1323,6 +1849,7 @@ * "high bandwidth" modes (up to 3 packets/uframe). */ rtest = wtest = ""; + irtest = iwtest = ""; if (force_interrupt || udev->speed == USB_SPEED_LOW) { if (info->ep_in) { dev->in_pipe = usb_rcvintpipe (udev, info->ep_in); @@ -1341,6 +1868,7 @@ dbg ("couldn't get endpoints, %d\n", status); return status; } + /* may find bulk or ISO pipes */ } else { if (info->ep_in) dev->in_pipe = usb_rcvbulkpipe (udev, @@ -1353,18 +1881,26 @@ rtest = " bulk-in"; if (dev->out_pipe) wtest = " bulk-out"; + if (dev->in_iso_pipe) + irtest = " iso-in"; + if (dev->out_iso_pipe) + iwtest = " iso-out"; } usb_set_intfdata (intf, dev); - info ("%s at %s ... %s speed {control%s%s} tests", - info->name, dev->id, + dev_info (&intf->dev, "%s\n", info->name); + dev_info (&intf->dev, "%s speed {control%s%s%s%s%s} tests%s\n", ({ char *tmp; switch (udev->speed) { case USB_SPEED_LOW: tmp = "low"; break; case USB_SPEED_FULL: tmp = "full"; break; case USB_SPEED_HIGH: tmp = "high"; break; default: tmp = "unknown"; break; - }; tmp; }), rtest, wtest); + }; tmp; }), + info->ctrl_out ? " in/out" : "", + rtest, wtest, + irtest, iwtest, + info->alt >= 0 ? " (+alt)" : ""); return 0; } @@ -1375,7 +1911,7 @@ down (&dev->sem); usb_set_intfdata (intf, NULL); - info ("unbound %s", dev->id); + dev_dbg (&intf->dev, "disconnect\n"); kfree (dev); } @@ -1423,6 +1959,7 @@ static struct usbtest_info gz_info = { .name = "Linux gadget zero", .autoconf = 1, + .ctrl_out = 1, .alt = 0, }; @@ -1432,6 +1969,13 @@ .alt = -1, }; +static struct usbtest_info um2_info = { + .name = "Linux user mode ISO test driver", + .autoconf = 1, + .iso = 1, + .alt = -1, +}; + #ifdef IBOT2 /* this is a nice source of high speed bulk data; * uses an FX2, with firmware provided in the device @@ -1500,6 +2044,11 @@ /* so does a user-mode variant */ { USB_DEVICE (0x0525, 0xa4a4), .driver_info = (unsigned long) &um_info, + }, + + /* ... and a user-mode variant that talks iso */ + { USB_DEVICE (0x0525, 0xa4a3), + .driver_info = (unsigned long) &um2_info, }, #ifdef KEYSPAN_19Qi diff -Nru a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c --- a/drivers/usb/misc/uss720.c Tue Feb 17 20:00:05 2004 +++ b/drivers/usb/misc/uss720.c Tue Feb 17 20:00:05 2004 @@ -333,7 +333,7 @@ for (; got < length; got++) { if (get_1284_register(pp, 4, (char *)buf)) break; - ((char*)buf)++; + buf++; if (priv->reg[0] & 0x01) { clear_epp_timeout(pp); break; @@ -392,7 +392,7 @@ for (; got < length; got++) { if (get_1284_register(pp, 3, (char *)buf)) break; - ((char*)buf)++; + buf++; if (priv->reg[0] & 0x01) { clear_epp_timeout(pp); break; @@ -412,7 +412,7 @@ for (; written < length; written++) { if (set_1284_register(pp, 3, *(char *)buf)) break; - ((char*)buf)++; + buf++; if (get_1284_register(pp, 1, NULL)) break; if (priv->reg[0] & 0x01) { @@ -469,7 +469,7 @@ for (; written < len; written++) { if (set_1284_register(pp, 5, *(char *)buffer)) break; - ((char*)buffer)++; + buffer++; } change_mode(pp, ECR_PS2); return written; diff -Nru a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig --- a/drivers/usb/net/Kconfig Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/net/Kconfig Tue Feb 17 20:00:07 2004 @@ -73,11 +73,12 @@ select MII ---help--- Say Y here if you know you have Pegasus or Pegasus-II based adapter. - If in doubt then look at linux/drivers/usb/pegasus.h for the complete - list of supported devices. + If in doubt then look at for the + complete list of supported devices. + If your particular adapter is not in the list and you are _sure_ it - is Pegasus or Pegasus II based then send me (petkan@users.sourceforge.net) - vendor and device IDs. + is Pegasus or Pegasus II based then send me + vendor and device IDs. To compile this driver as a module, choose M here: the module will be called pegasus. @@ -87,8 +88,8 @@ depends on USB && NET && EXPERIMENTAL help Say Y here if you have RTL8150 based usb-ethernet adapter. - Send me (petkan@users.sourceforge.net) any comments you may have. - You can also check for updates at http://pegasus2.sourceforge.net/ + Send me any comments you may have. + You can also check for updates at . To compile this driver as a module, choose M here: the module will be called rtl8150. @@ -254,13 +255,14 @@ 10/100 Ethernet devices. This driver should work with at least the following devices: + * Aten UC210T * ASIX AX88172 * D-Link DUB-E100 * Hawking UF200 * Linksys USB200M * Netgear FA120 - * Intellinet - * ST Lab USB Ethernet + * Intellinet USB 2.0 Ethernet + * ST Lab USB 2.0 Ethernet * TrendNet TU2-ET100 This driver creates an interface named "ethX", where X depends on diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c --- a/drivers/usb/net/usbnet.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/net/usbnet.c Tue Feb 17 20:00:07 2004 @@ -222,6 +222,7 @@ #define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */ #define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ #define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ +#define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */ #define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ #define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ @@ -300,7 +301,6 @@ /*-------------------------------------------------------------------------*/ -static struct ethtool_ops usbnet_ethtool_ops; static void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *); static u32 usbnet_get_link (struct net_device *); static u32 usbnet_get_msglevel (struct net_device *); @@ -364,6 +364,25 @@ return 0; } +static void skb_return (struct usbnet *dev, struct sk_buff *skb) +{ + int status; + + skb->dev = dev->net; + skb->protocol = eth_type_trans (skb, dev->net); + dev->stats.rx_packets++; + dev->stats.rx_bytes += skb->len; + +#ifdef VERBOSE + devdbg (dev, "< rx, len %d, type 0x%x", + skb->len + sizeof (struct ethhdr), skb->protocol); +#endif + memset (skb->cb, 0, sizeof (struct skb_data)); + status = netif_rx (skb); + if (status != NET_RX_SUCCESS) + devdbg (dev, "netif_rx status %d", status); +} + #ifdef CONFIG_USB_AN2720 #define HAVE_HARDWARE @@ -818,23 +837,30 @@ -#if defined (CONFIG_USB_CDCETHER) || defined (CONFIG_USB_ZAURUS) - /*------------------------------------------------------------------------- * - * Communications Device Class, Ethernet Control model - * - * Takes two interfaces. The DATA interface is inactive till an altsetting - * is selected. Configuration data includes class descriptors. - * - * Zaurus uses nonstandard framing, and doesn't uniquify its Ethernet - * addresses, but is otherwise CDC Ether. - * - * This should interop with whatever the 2.4 "CDCEther.c" driver - * (by Brad Hards) talked with. + * Communications Device Class declarations. + * Used by CDC Ethernet, and some CDC variants * *-------------------------------------------------------------------------*/ +#ifdef CONFIG_USB_CDCETHER +#define NEED_GENERIC_CDC +#endif + +#ifdef CONFIG_USB_ZAURUS +/* Ethernet variant uses funky framing, broken ethernet addressing */ +#define NEED_GENERIC_CDC +#endif + +#ifdef CONFIG_USB_RNDIS +/* ACM variant uses even funkier framing, complex control RPC scheme */ +#define NEED_GENERIC_CDC +#endif + + +#ifdef NEED_GENERIC_CDC + /* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ struct header_desc { u8 bLength; @@ -876,43 +902,21 @@ struct usb_interface *data; }; -#include - -static u8 nibble (unsigned char c) -{ - if (likely (isdigit (c))) - return c - '0'; - c = toupper (c); - if (likely (isxdigit (c))) - return 10 + c - 'A'; - return 0; -} - -static inline int get_ethernet_addr (struct usbnet *dev, struct ether_desc *e) -{ - int tmp, i; - unsigned char buf [13]; - - tmp = usb_string (dev->udev, e->iMACAddress, buf, sizeof buf); - if (tmp < 0) - return tmp; - else if (tmp != 12) - return -EINVAL; - for (i = tmp = 0; i < 6; i++, tmp += 2) - dev->net->dev_addr [i] = - (nibble (buf [tmp]) << 4) + nibble (buf [tmp + 1]); - return 0; -} - static struct usb_driver usbnet_driver; -static int cdc_bind (struct usbnet *dev, struct usb_interface *intf) +/* + * probes control interface, claims data interface, collects the bulk + * endpoints, activates data interface (if needed), maybe sets MTU. + * all pure cdc, except for certain firmware workarounds. + */ +static int generic_cdc_bind (struct usbnet *dev, struct usb_interface *intf) { u8 *buf = intf->altsetting->extra; int len = intf->altsetting->extralen; struct usb_interface_descriptor *d; struct cdc_state *info = (void *) &dev->data; int status; + int rndis; if (sizeof dev->data < sizeof *info) return -EDOM; @@ -931,14 +935,23 @@ "CDC descriptors on config\n"); } + /* this assumes that if there's a non-RNDIS vendor variant + * of cdc-acm, it'll fail RNDIS requests cleanly. + */ + rndis = (intf->altsetting->desc.bInterfaceProtocol == 0xff); + memset (info, 0, sizeof *info); info->control = intf; while (len > 3) { if (buf [1] != USB_DT_CS_INTERFACE) goto next_desc; - /* bDescriptorSubType identifies three "must have" descriptors; - * save them for later. + /* use bDescriptorSubType to identify the CDC descriptors. + * We expect devices with CDC header and union descriptors. + * For CDC Ethernet we need the ethernet descriptor. + * For RNDIS, ignore two (pointless) CDC modem descriptors + * in favor of a complicated OID-based RPC scheme doing what + * CDC Ethernet achieves with a simple descriptor. */ switch (buf [2]) { case 0x00: /* Header, mostly useless */ @@ -1001,8 +1014,6 @@ d->bInterfaceClass); goto bad_desc; } - if (usb_interface_claimed (info->data)) - return -EBUSY; break; case 0x0F: /* Ethernet Networking */ if (info->ether) { @@ -1015,13 +1026,20 @@ info->u->bLength); goto bad_desc; } + dev->net->mtu = cpu_to_le16p ( + &info->ether->wMaxSegmentSize) + - ETH_HLEN; + /* because of Zaurus, we may be ignoring the host + * side link address we were given. + */ break; } next_desc: len -= buf [0]; /* bLength */ buf += buf [0]; } - if (!info->header || !info ->u || !info->ether) { + + if (!info->header || !info->u || (!rndis && !info->ether)) { dev_dbg (&intf->dev, "missing cdc %s%s%sdescriptor\n", info->header ? "" : "header ", info->u ? "" : "union ", @@ -1029,18 +1047,6 @@ goto bad_desc; } -#ifdef CONFIG_USB_ZAURUS - /* Zaurus ethernet addresses aren't unique ... */ - if ((dev->driver_info->flags & FLAG_FRAMING_Z) != 0) - /* ignore */ ; - else -#endif - { - status = get_ethernet_addr (dev, info->ether); - if (status < 0) - return status; - } - /* claim data interface and set it up ... with side effects. * network traffic can't flow until an altsetting is enabled. */ @@ -1049,16 +1055,11 @@ return status; status = get_endpoints (dev, info->data); if (status < 0) { + /* ensure immediate exit from usbnet_disconnect */ + usb_set_intfdata(info->data, NULL); usb_driver_release_interface (&usbnet_driver, info->data); return status; } - - /* FIXME cdc-ether has some multicast code too, though it complains - * in routine cases. info->ether describes the multicast support. - */ - - dev->net->mtu = cpu_to_le16p (&info->ether->wMaxSegmentSize) - - ETH_HLEN; return 0; bad_desc: @@ -1072,24 +1073,89 @@ /* disconnect master --> disconnect slave */ if (intf == info->control && info->data) { + /* ensure immediate exit from usbnet_disconnect */ + usb_set_intfdata(info->data, NULL); usb_driver_release_interface (&usbnet_driver, info->data); info->data = 0; } /* and vice versa (just in case) */ else if (intf == info->data && info->control) { + /* ensure immediate exit from usbnet_disconnect */ + usb_set_intfdata(info->control, NULL); usb_driver_release_interface (&usbnet_driver, info->control); info->control = 0; } - } -#endif /* CONFIG_USB_ZAURUS || CONFIG_USB_CDCETHER */ - +#endif /* NEED_GENERIC_CDC */ + #ifdef CONFIG_USB_CDCETHER #define HAVE_HARDWARE +/*------------------------------------------------------------------------- + * + * Communications Device Class, Ethernet Control model + * + * Takes two interfaces. The DATA interface is inactive till an altsetting + * is selected. Configuration data includes class descriptors. + * + * This should interop with whatever the 2.4 "CDCEther.c" driver + * (by Brad Hards) talked with. + * + *-------------------------------------------------------------------------*/ + +#include + +static u8 nibble (unsigned char c) +{ + if (likely (isdigit (c))) + return c - '0'; + c = toupper (c); + if (likely (isxdigit (c))) + return 10 + c - 'A'; + return 0; +} + +static inline int +get_ethernet_addr (struct usbnet *dev, struct ether_desc *e) +{ + int tmp, i; + unsigned char buf [13]; + + tmp = usb_string (dev->udev, e->iMACAddress, buf, sizeof buf); + if (tmp < 0) + return tmp; + else if (tmp != 12) + return -EINVAL; + for (i = tmp = 0; i < 6; i++, tmp += 2) + dev->net->dev_addr [i] = + (nibble (buf [tmp]) << 4) + nibble (buf [tmp + 1]); + return 0; +} + +static int cdc_bind (struct usbnet *dev, struct usb_interface *intf) +{ + int status; + struct cdc_state *info = (void *) &dev->data; + + status = generic_cdc_bind (dev, intf); + if (status < 0) + return status; + + status = get_ethernet_addr (dev, info->ether); + if (status < 0) { + usb_driver_release_interface (&usbnet_driver, info->data); + return status; + } + + /* FIXME cdc-ether has some multicast code too, though it complains + * in routine cases. info->ether describes the multicast support. + */ + return 0; +} + static const struct driver_info cdc_info = { .description = "CDC Ethernet Device", .flags = FLAG_ETHER, @@ -1337,7 +1403,6 @@ struct gl_header *header; struct gl_packet *packet; struct sk_buff *gl_skb; - int status; u32 size; header = (struct gl_header *) skb->data; @@ -1373,17 +1438,7 @@ // copy the packet data to the new skb memcpy(skb_put(gl_skb, size), packet->packet_data, size); - gl_skb->dev = dev->net; - - // determine the packet's protocol ID - gl_skb->protocol = eth_type_trans (gl_skb, dev->net); - - // update the status - dev->stats.rx_packets++; - dev->stats.rx_bytes += size; - - // notify os of the received packet - status = netif_rx (gl_skb); + skb_return (dev, skb); } // advance to the next packet @@ -2141,7 +2196,7 @@ .description = "Sharp Zaurus SL-5x00", .flags = FLAG_FRAMING_Z, .check_connect = always_connected, - .bind = cdc_bind, + .bind = generic_cdc_bind, .unbind = cdc_unbind, .tx_fixup = zaurus_tx_fixup, }; @@ -2256,6 +2311,11 @@ size = 6 + (sizeof (struct ethhdr) + dev->net->mtu); else #endif +#ifdef CONFIG_USB_RNDIS + if (dev->driver_info->flags & FLAG_FRAMING_RN) + size = RNDIS_MAX_TRANSFER; + else +#endif size = (sizeof (struct ethhdr) + dev->net->mtu); if ((skb = alloc_skb (size, flags)) == 0) { @@ -2319,23 +2379,9 @@ goto error; // else network stack removes extra byte if we forced a short packet - if (skb->len) { - int status; - - skb->dev = dev->net; - skb->protocol = eth_type_trans (skb, dev->net); - dev->stats.rx_packets++; - dev->stats.rx_bytes += skb->len; - -#ifdef VERBOSE - devdbg (dev, "< rx, len %d, type 0x%x", - skb->len + sizeof (struct ethhdr), skb->protocol); -#endif - memset (skb->cb, 0, sizeof (struct skb_data)); - status = netif_rx (skb); - if (status != NET_RX_SUCCESS) - devdbg (dev, "netif_rx status %d", status); - } else { + if (skb->len) + skb_return (dev, skb); + else { devdbg (dev, "drop"); error: dev->stats.rx_errors++; @@ -2544,6 +2590,8 @@ framing = "GeneSys"; else if (dev->driver_info->flags & FLAG_FRAMING_Z) framing = "Zaurus"; + else if (dev->driver_info->flags & FLAG_FRAMING_RN) + framing = "RNDIS"; else framing = "simple"; @@ -2941,6 +2989,8 @@ /*-------------------------------------------------------------------------*/ +static struct ethtool_ops usbnet_ethtool_ops; + // precondition: never called in_interrupt int @@ -3127,7 +3177,11 @@ // Hawking UF200, TrendNet TU2-ET100 USB_DEVICE (0x07b8, 0x420a), .driver_info = (unsigned long) &hawking_uf200_info, -}, +}, { + // ATEN UC210T + USB_DEVICE (0x0557, 0x2009), + .driver_info = (unsigned long) &ax8817x_info, +}, #endif #ifdef CONFIG_USB_EPSON2888 @@ -3167,6 +3221,14 @@ }, #endif +#ifdef CONFIG_USB_RNDIS +{ + /* RNDIS is MSFT's un-official variant of CDC ACM */ + USB_INTERFACE_INFO (USB_CLASS_COMM, 2 /* ACM */, 0x0ff), + .driver_info = (unsigned long) &rndis_info, +}, +#endif + #ifdef CONFIG_USB_ARMLINUX /* * SA-1100 using standard ARM Linux kernels, or compatible. @@ -3238,7 +3300,16 @@ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x9031, /* C-750 */ + .idProduct = 0x9031, /* C-750 C-760 */ + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x0a, + .bInterfaceProtocol = 0x00, + .driver_info = (unsigned long) &zaurus_pxa_info, +}, { + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x9032, /* SL-6000 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, diff -Nru a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c --- a/drivers/usb/serial/belkin_sa.c Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/serial/belkin_sa.c Tue Feb 17 20:00:07 2004 @@ -232,8 +232,10 @@ port->interrupt_in_urb->dev = port->serial->dev; retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); - if (retval) + if (retval) { + usb_unlink_urb(port->read_urb); err(" usb_submit_urb(read int) failed"); + } exit: return retval; diff -Nru a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h --- a/drivers/usb/serial/keyspan.h Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/serial/keyspan.h Tue Feb 17 20:00:07 2004 @@ -534,6 +534,7 @@ { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) }, + { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) }, { } /* Terminating entry */ }; diff -Nru a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c --- a/drivers/usb/serial/kobil_sct.c Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/serial/kobil_sct.c Tue Feb 17 20:00:08 2004 @@ -409,8 +409,6 @@ // someone sets the dev to 0 if the close method has been called port->interrupt_in_urb->dev = port->serial->dev; - // usb_dump_urb(port->interrupt_in_urb); - result = usb_submit_urb( port->interrupt_in_urb, GFP_ATOMIC ); dbg("%s - port %d Send read URB returns: %i", __FUNCTION__, port->number, result); } @@ -496,8 +494,6 @@ port->interrupt_in_urb->dev = port->serial->dev; // start reading - //usb_dump_urb(port->interrupt_in_urb); - result = usb_submit_urb( port->interrupt_in_urb, GFP_ATOMIC ); dbg("%s - port %d Send read URB returns: %i", __FUNCTION__, port->number, result); } diff -Nru a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c --- a/drivers/usb/serial/visor.c Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/serial/visor.c Tue Feb 17 20:00:06 2004 @@ -241,6 +241,8 @@ .driver_info = (kernel_ulong_t)&palm_os_4_probe }, { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID), .driver_info = (kernel_ulong_t)&palm_os_4_probe }, + { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID), + .driver_info = (kernel_ulong_t)&palm_os_4_probe }, { }, /* optional parameter entry */ { } /* Terminating entry */ }; @@ -274,6 +276,7 @@ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID) }, { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) }, { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) }, + { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID) }, { }, /* optional parameter entry */ { } /* Terminating entry */ }; diff -Nru a/drivers/usb/serial/visor.h b/drivers/usb/serial/visor.h --- a/drivers/usb/serial/visor.h Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/serial/visor.h Tue Feb 17 20:00:08 2004 @@ -50,6 +50,9 @@ #define GARMIN_VENDOR_ID 0x091E #define GARMIN_IQUE_3600_ID 0x0004 +#define ACEECA_VENDOR_ID 0x4766 +#define ACEECA_MEZ1000_ID 0x0001 + /**************************************************************************** * Handspring Visor Vendor specific request codes (bRequest values) * A big thank you to Handspring for providing the following information. diff -Nru a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig --- a/drivers/usb/storage/Kconfig Tue Feb 17 20:00:08 2004 +++ b/drivers/usb/storage/Kconfig Tue Feb 17 20:00:08 2004 @@ -56,11 +56,11 @@ - Planex eXtreme Drive RX-25HU USB-IDE cable (not model RX-25U) config USB_STORAGE_DPCM - bool "Microtech CompactFlash/SmartMedia support" + bool "Microtech/ZiO! CompactFlash/SmartMedia support" depends on USB_STORAGE help - Say Y here to support the Microtech ZiO! CompactFlash reader. - There is a web page at . + Say Y here to support the Microtech/ZiO! CompactFlash reader. + There is a web page at . config USB_STORAGE_HP8200e bool "HP CD-Writer 82xx support (EXPERIMENTAL)" diff -Nru a/drivers/usb/storage/datafab.h b/drivers/usb/storage/datafab.h --- a/drivers/usb/storage/datafab.h Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/storage/datafab.h Tue Feb 17 20:00:07 2004 @@ -29,7 +29,7 @@ struct datafab_info { unsigned long sectors; // total sector count unsigned long ssize; // sector size in bytes - char lun; // used for dual-slot readers + signed char lun; // used for dual-slot readers // the following aren't used yet unsigned char sense_key; diff -Nru a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h --- a/drivers/usb/storage/unusual_devs.h Tue Feb 17 20:00:07 2004 +++ b/drivers/usb/storage/unusual_devs.h Tue Feb 17 20:00:07 2004 @@ -377,7 +377,7 @@ UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, "", "USB TO IDE", - US_SC_SCSI, US_PR_DEVICE, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_MODE_XLATE ), /* Reported by Peter Marks @@ -604,7 +604,14 @@ * - They don't like the INQUIRY command. So we must handle this command * of the SCSI layer ourselves. */ -UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x9999, +UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x9009, + "Casio", + "QV DigitalCamera", + US_SC_8070, US_PR_CB, NULL, + US_FL_FIX_INQUIRY ), + +/* Later Casio cameras apparently tell the truth */ +UNUSUAL_DEV( 0x07cf, 0x1001, 0x9010, 0x9999, "Casio", "QV DigitalCamera", US_SC_DEVICE, US_PR_DEVICE, NULL, diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c --- a/drivers/usb/storage/usb.c Tue Feb 17 20:00:06 2004 +++ b/drivers/usb/storage/usb.c Tue Feb 17 20:00:06 2004 @@ -834,7 +834,7 @@ /* Finish the SCSI host removal sequence */ if (us->host) { - (struct us_data *) us->host->hostdata[0] = NULL; + us->host->hostdata[0] = 0; scsi_host_put(us->host); } diff -Nru a/drivers/video/Kconfig b/drivers/video/Kconfig --- a/drivers/video/Kconfig Tue Feb 17 20:00:05 2004 +++ b/drivers/video/Kconfig Tue Feb 17 20:00:05 2004 @@ -462,6 +462,7 @@ config FB_MATROX tristate "Matrox acceleration" depends on FB && PCI + select I2C_ALGOBIT if FB_MATROX_I2C ---help--- Say Y here if you have a Matrox Millennium, Matrox Millennium II, Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox @@ -549,7 +550,6 @@ config FB_MATROX_I2C tristate "Matrox I2C support" depends on FB_MATROX && I2C - select I2C_ALGOBIT ---help--- This drivers creates I2C buses which are needed for accessing the DDC (I2C) bus present on all Matroxes, an I2C bus which @@ -614,16 +614,51 @@ There is no need for enabling 'Matrox multihead support' if you have only one Matrox card in the box. +config FB_RADEON_OLD + tristate "ATI Radeon display support (Old driver)" + depends on FB && PCI + help + Choose this option if you want to use an ATI Radeon graphics card as + a framebuffer device. There are both PCI and AGP versions. You + don't need to choose this to run the Radeon in plain VGA mode. + There is a product page at + . + config FB_RADEON tristate "ATI Radeon display support" depends on FB && PCI + select I2C_ALGOBIT if FB_RADEON_I2C help Choose this option if you want to use an ATI Radeon graphics card as a framebuffer device. There are both PCI and AGP versions. You don't need to choose this to run the Radeon in plain VGA mode. + + If you say Y here and want DDC/I2C support you must first say Y to + "I2C support" and "I2C bit-banging support" in the character devices + section. + + If you say M here then "I2C support" and "I2C bit-banging support" + can be build either as modules or built-in. + There is a product page at . +config FB_RADEON_I2C + bool "DDC/I2C for ATI Radeon support" + depends on FB_RADEON && I2C + default y + help + Say Y here if you want DDC/I2C support for your Radeon board. + +config FB_RADEON_DEBUG + bool "Lots of debug output from Radeon driver" + depends on FB_RADEON + default n + help + Say Y here if you want the Radeon driver to output all sorts + of debugging informations to provide to the maintainer when + something goes wrong. + config FB_ATY128 tristate "ATI Rage128 display support" depends on FB && PCI @@ -673,26 +708,27 @@ Say Y here to support booting a Rage XL without BIOS support. config FB_SIS - tristate "SIS acceleration" + tristate "SiS acceleration" depends on FB && PCI help - This is the frame buffer device driver for the SiS 630 and 640 Super - Socket 7 UMA cards. Specs available at . + This is the frame buffer device driver for the SiS 300, 315 and + 330 series VGA chipsets. Specs available at http://www.sis.com + + To compile this driver as a module, choose M here; the module + will be called sisfb. config FB_SIS_300 - bool "SIS 630/540/730 support" + bool "SiS 300 series support" depends on FB_SIS help - This is the frame buffer device driver for the SiS 630 and related - Super Socket 7 UMA cards. Specs available at - . + Say Y here to support use of the SiS 300/305, 540, 630 and 730. config FB_SIS_315 - bool "SIS 315H/315 support" + bool "SiS 315/330 series support" depends on FB_SIS help - This is the frame buffer device driver for the SiS 315 graphics - card. Specs available at . + Say Y here to support use of the SiS 315 and 330 series + (315/H/PRO, 55x, 650, 651, 740, 330, 661, 741, 760). config FB_NEOMAGIC tristate "NeoMagic display support" diff -Nru a/drivers/video/Makefile b/drivers/video/Makefile --- a/drivers/video/Makefile Tue Feb 17 20:00:06 2004 +++ b/drivers/video/Makefile Tue Feb 17 20:00:06 2004 @@ -7,7 +7,7 @@ obj-$(CONFIG_VT) += console/ obj-$(CONFIG_LOGO) += logo/ -obj-$(CONFIG_FB) += fbmem.o fbmon.o fbcmap.o modedb.o softcursor.o +obj-$(CONFIG_FB) += fbmem.o fbmon.o fbcmap.o fbsysfs.o modedb.o softcursor.o # Only include macmodes.o if we have FB support and are PPC ifeq ($(CONFIG_FB),y) obj-$(CONFIG_PPC) += macmodes.o @@ -21,7 +21,7 @@ obj-$(CONFIG_FB_Q40) += q40fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_ATARI) += atafb.o obj-$(CONFIG_FB_68328) += 68328fb.o -obj-$(CONFIG_FB_RADEON) += radeonfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o +obj-$(CONFIG_FB_RADEON_OLD) += radeonfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_NEOMAGIC) += neofb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_IGA) += igafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_CONTROL) += controlfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o @@ -60,6 +60,7 @@ obj-$(CONFIG_FB_SIS) += sis/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_ATY) += aty/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_ATY128) += aty/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o +obj-$(CONFIG_FB_RADEON) += aty/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_I810) += i810/ cfbfillrect.o cfbcopyarea.o \ cfbimgblt.o vgastate.o @@ -67,7 +68,7 @@ obj-$(CONFIG_FB_HGA) += hgafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_SA1100) += sa1100fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_VIRTUAL) += vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o -obj-$(CONFIG_FB_HIT) += hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o +obj-$(CONFIG_FB_HIT) += hitfb.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_E1355) += epson1355fb.o obj-$(CONFIG_FB_PVR2) += pvr2fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_KYRO) += kyro/ cfbfillrect.o cfbcopyarea.o cfbimgblt.o diff -Nru a/drivers/video/aty/Makefile b/drivers/video/aty/Makefile --- a/drivers/video/aty/Makefile Tue Feb 17 20:00:06 2004 +++ b/drivers/video/aty/Makefile Tue Feb 17 20:00:06 2004 @@ -1,7 +1,13 @@ obj-$(CONFIG_FB_ATY) += atyfb.o obj-$(CONFIG_FB_ATY128) += aty128fb.o +obj-$(CONFIG_FB_RADEON) += radeonfb.o atyfb-y := atyfb_base.o mach64_accel.o atyfb-$(CONFIG_FB_ATY_GX) += mach64_gx.o atyfb-$(CONFIG_FB_ATY_CT) += mach64_ct.o mach64_cursor.o atyfb-objs := $(atyfb-y) + +radeonfb-y := radeon_base.o radeon_pm.o radeon_monitor.o radeon_accel.o +radeonfb-$(CONFIG_FB_RADEON_I2C) += radeon_i2c.o +radeonfb-objs := $(radeonfb-y) + diff -Nru a/drivers/video/aty/ati_ids.h b/drivers/video/aty/ati_ids.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/video/aty/ati_ids.h Tue Feb 17 20:00:14 2004 @@ -0,0 +1,167 @@ +/* + * ATI PCI IDs from XFree86, kept here to make sync'ing with + * XFree much simpler. Currently, this list is only used by + * radeonfb + */ + +#define PCI_CHIP_RS100_4136 0x4136 +#define PCI_CHIP_RS200_4137 0x4137 +#define PCI_CHIP_R300_AD 0x4144 +#define PCI_CHIP_R300_AE 0x4145 +#define PCI_CHIP_R300_AF 0x4146 +#define PCI_CHIP_R300_AG 0x4147 +#define PCI_CHIP_R350_AH 0x4148 +#define PCI_CHIP_R350_AI 0x4149 +#define PCI_CHIP_R350_AJ 0x414A +#define PCI_CHIP_R350_AK 0x414B +#define PCI_CHIP_RV350_AP 0x4150 +#define PCI_CHIP_RV350_AQ 0x4151 +#define PCI_CHIP_RV360_AR 0x4152 +#define PCI_CHIP_RV350_AS 0x4153 +#define PCI_CHIP_RV350_AT 0x4154 +#define PCI_CHIP_RV350_AV 0x4156 +#define PCI_CHIP_MACH32 0x4158 +#define PCI_CHIP_RS250_4237 0x4237 +#define PCI_CHIP_R200_BB 0x4242 +#define PCI_CHIP_R200_BC 0x4243 +#define PCI_CHIP_RS100_4336 0x4336 +#define PCI_CHIP_RS200_4337 0x4337 +#define PCI_CHIP_MACH64CT 0x4354 +#define PCI_CHIP_MACH64CX 0x4358 +#define PCI_CHIP_RS250_4437 0x4437 +#define PCI_CHIP_MACH64ET 0x4554 +#define PCI_CHIP_MACH64GB 0x4742 +#define PCI_CHIP_MACH64GD 0x4744 +#define PCI_CHIP_MACH64GI 0x4749 +#define PCI_CHIP_MACH64GL 0x474C +#define PCI_CHIP_MACH64GM 0x474D +#define PCI_CHIP_MACH64GN 0x474E +#define PCI_CHIP_MACH64GO 0x474F +#define PCI_CHIP_MACH64GP 0x4750 +#define PCI_CHIP_MACH64GQ 0x4751 +#define PCI_CHIP_MACH64GR 0x4752 +#define PCI_CHIP_MACH64GS 0x4753 +#define PCI_CHIP_MACH64GT 0x4754 +#define PCI_CHIP_MACH64GU 0x4755 +#define PCI_CHIP_MACH64GV 0x4756 +#define PCI_CHIP_MACH64GW 0x4757 +#define PCI_CHIP_MACH64GX 0x4758 +#define PCI_CHIP_MACH64GY 0x4759 +#define PCI_CHIP_MACH64GZ 0x475A +#define PCI_CHIP_RV250_Id 0x4964 +#define PCI_CHIP_RV250_Ie 0x4965 +#define PCI_CHIP_RV250_If 0x4966 +#define PCI_CHIP_RV250_Ig 0x4967 +#define PCI_CHIP_MACH64LB 0x4C42 +#define PCI_CHIP_MACH64LD 0x4C44 +#define PCI_CHIP_RAGE128LE 0x4C45 +#define PCI_CHIP_RAGE128LF 0x4C46 +#define PCI_CHIP_MACH64LG 0x4C47 +#define PCI_CHIP_MACH64LI 0x4C49 +#define PCI_CHIP_MACH64LM 0x4C4D +#define PCI_CHIP_MACH64LN 0x4C4E +#define PCI_CHIP_MACH64LP 0x4C50 +#define PCI_CHIP_MACH64LQ 0x4C51 +#define PCI_CHIP_MACH64LR 0x4C52 +#define PCI_CHIP_MACH64LS 0x4C53 +#define PCI_CHIP_RADEON_LW 0x4C57 +#define PCI_CHIP_RADEON_LX 0x4C58 +#define PCI_CHIP_RADEON_LY 0x4C59 +#define PCI_CHIP_RADEON_LZ 0x4C5A +#define PCI_CHIP_RV250_Ld 0x4C64 +#define PCI_CHIP_RV250_Le 0x4C65 +#define PCI_CHIP_RV250_Lf 0x4C66 +#define PCI_CHIP_RV250_Lg 0x4C67 +#define PCI_CHIP_RAGE128MF 0x4D46 +#define PCI_CHIP_RAGE128ML 0x4D4C +#define PCI_CHIP_R300_ND 0x4E44 +#define PCI_CHIP_R300_NE 0x4E45 +#define PCI_CHIP_R300_NF 0x4E46 +#define PCI_CHIP_R300_NG 0x4E47 +#define PCI_CHIP_R350_NH 0x4E48 +#define PCI_CHIP_R350_NI 0x4E49 +#define PCI_CHIP_R360_NJ 0x4E4A +#define PCI_CHIP_R350_NK 0x4E4B +#define PCI_CHIP_RV350_NP 0x4E50 +#define PCI_CHIP_RV350_NQ 0x4E51 +#define PCI_CHIP_RV350_NR 0x4E52 +#define PCI_CHIP_RV350_NS 0x4E53 +#define PCI_CHIP_RV350_NT 0x4E54 +#define PCI_CHIP_RV350_NV 0x4E56 +#define PCI_CHIP_RAGE128PA 0x5041 +#define PCI_CHIP_RAGE128PB 0x5042 +#define PCI_CHIP_RAGE128PC 0x5043 +#define PCI_CHIP_RAGE128PD 0x5044 +#define PCI_CHIP_RAGE128PE 0x5045 +#define PCI_CHIP_RAGE128PF 0x5046 +#define PCI_CHIP_RAGE128PG 0x5047 +#define PCI_CHIP_RAGE128PH 0x5048 +#define PCI_CHIP_RAGE128PI 0x5049 +#define PCI_CHIP_RAGE128PJ 0x504A +#define PCI_CHIP_RAGE128PK 0x504B +#define PCI_CHIP_RAGE128PL 0x504C +#define PCI_CHIP_RAGE128PM 0x504D +#define PCI_CHIP_RAGE128PN 0x504E +#define PCI_CHIP_RAGE128PO 0x504F +#define PCI_CHIP_RAGE128PP 0x5050 +#define PCI_CHIP_RAGE128PQ 0x5051 +#define PCI_CHIP_RAGE128PR 0x5052 +#define PCI_CHIP_RAGE128PS 0x5053 +#define PCI_CHIP_RAGE128PT 0x5054 +#define PCI_CHIP_RAGE128PU 0x5055 +#define PCI_CHIP_RAGE128PV 0x5056 +#define PCI_CHIP_RAGE128PW 0x5057 +#define PCI_CHIP_RAGE128PX 0x5058 +#define PCI_CHIP_RADEON_QD 0x5144 +#define PCI_CHIP_RADEON_QE 0x5145 +#define PCI_CHIP_RADEON_QF 0x5146 +#define PCI_CHIP_RADEON_QG 0x5147 +#define PCI_CHIP_R200_QH 0x5148 +#define PCI_CHIP_R200_QI 0x5149 +#define PCI_CHIP_R200_QJ 0x514A +#define PCI_CHIP_R200_QK 0x514B +#define PCI_CHIP_R200_QL 0x514C +#define PCI_CHIP_R200_QM 0x514D +#define PCI_CHIP_R200_QN 0x514E +#define PCI_CHIP_R200_QO 0x514F +#define PCI_CHIP_RV200_QW 0x5157 +#define PCI_CHIP_RV200_QX 0x5158 +#define PCI_CHIP_RV100_QY 0x5159 +#define PCI_CHIP_RV100_QZ 0x515A +#define PCI_CHIP_RAGE128RE 0x5245 +#define PCI_CHIP_RAGE128RF 0x5246 +#define PCI_CHIP_RAGE128RG 0x5247 +#define PCI_CHIP_RAGE128RK 0x524B +#define PCI_CHIP_RAGE128RL 0x524C +#define PCI_CHIP_RAGE128SE 0x5345 +#define PCI_CHIP_RAGE128SF 0x5346 +#define PCI_CHIP_RAGE128SG 0x5347 +#define PCI_CHIP_RAGE128SH 0x5348 +#define PCI_CHIP_RAGE128SK 0x534B +#define PCI_CHIP_RAGE128SL 0x534C +#define PCI_CHIP_RAGE128SM 0x534D +#define PCI_CHIP_RAGE128SN 0x534E +#define PCI_CHIP_RAGE128TF 0x5446 +#define PCI_CHIP_RAGE128TL 0x544C +#define PCI_CHIP_RAGE128TR 0x5452 +#define PCI_CHIP_RAGE128TS 0x5453 +#define PCI_CHIP_RAGE128TT 0x5454 +#define PCI_CHIP_RAGE128TU 0x5455 +#define PCI_CHIP_MACH64VT 0x5654 +#define PCI_CHIP_MACH64VU 0x5655 +#define PCI_CHIP_MACH64VV 0x5656 +#define PCI_CHIP_RS300_5834 0x5834 +#define PCI_CHIP_RS300_5835 0x5835 +#define PCI_CHIP_RS300_5836 0x5836 +#define PCI_CHIP_RS300_5837 0x5837 +#define PCI_CHIP_RV280_5960 0x5960 +#define PCI_CHIP_RV280_5961 0x5961 +#define PCI_CHIP_RV280_5962 0x5962 +#define PCI_CHIP_RV280_5963 0x5963 +#define PCI_CHIP_RV280_5964 0x5964 +#define PCI_CHIP_RV280_5968 0x5968 +#define PCI_CHIP_RV280_5969 0x5969 +#define PCI_CHIP_RV280_596A 0x596A +#define PCI_CHIP_RV280_596B 0x596B +#define PCI_CHIP_RV280_5C61 0x5C61 +#define PCI_CHIP_RV280_5C63 0x5C63 diff -Nru a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c --- a/drivers/video/aty/aty128fb.c Tue Feb 17 20:00:07 2004 +++ b/drivers/video/aty/aty128fb.c Tue Feb 17 20:00:07 2004 @@ -13,6 +13,7 @@ * * Benjamin Herrenschmidt * - pmac-specific PM stuff + * - various fixes & cleanups * * Andreas Hundt * - FB_ACTIVATE fixes @@ -24,6 +25,10 @@ * Paul Mundt * - PCI hotplug * + * Jon Smirl + * - PCI ID update + * - replace ROM BIOS search + * * Based off of Geert's atyfb.c and vfb.c. * * TODO: @@ -43,6 +48,7 @@ #include #include +#include #include #include #include @@ -57,6 +63,7 @@ #include #include #include +#include #include #ifdef CONFIG_PPC_PMAC @@ -65,11 +72,6 @@ #include "../macmodes.h" #endif -#ifdef CONFIG_ADB_PMU -#include -#include -#endif - #ifdef CONFIG_PMAC_BACKLIGHT #include #endif @@ -136,8 +138,25 @@ /* Chip generations */ enum { rage_128, + rage_128_pci, rage_128_pro, - rage_M3 + rage_128_pro_pci, + rage_M3, + rage_M3_pci, + rage_M4, + rage_128_ultra, +}; + +/* Must match above enum */ +static const char *r128_family[] __devinitdata = { + "AGP", + "PCI", + "PRO AGP", + "PRO PCI", + "M3 AGP", + "M3 PCI", + "M4 AGP", + "Ultra AGP", }; /* @@ -146,35 +165,105 @@ static int aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent); static void aty128_remove(struct pci_dev *pdev); +static int aty128_pci_suspend(struct pci_dev *pdev, u32 state); +static int aty128_pci_resume(struct pci_dev *pdev); /* supported Rage128 chipsets */ static struct pci_device_id aty128_pci_tbl[] = { - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RE, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RF, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RI, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RK, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_Rage128_PD, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LE, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M3_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LF, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M3 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_MF, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M4 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_ML, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M4 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PA, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PB, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PC, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PD, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PR, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PG, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PH, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PI, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PJ, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PK, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PL, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PM, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PN, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PP, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PQ, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PR, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PS, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_U3, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PT, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_U1, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PU, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LE, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M3 }, - { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LF, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M3 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PV, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PW, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_PX, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pro }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RE, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RF, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RG, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RK, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_RL, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SE, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SF, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_pci }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SG, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SH, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SK, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SL, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SM, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_SN, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128 }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TF, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TL, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TR, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TS, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TT, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_TU, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_128_ultra }, { 0, } }; @@ -185,6 +274,8 @@ .id_table = aty128_pci_tbl, .probe = aty128_probe, .remove = __devexit_p(aty128_remove), + .suspend = aty128_pci_suspend, + .resume = aty128_pci_resume, }; /* packed BIOS settings */ @@ -250,13 +341,6 @@ .accel = FB_ACCEL_ATI_RAGE128, }; -#ifdef MODULE -static char *mode __initdata = NULL; -#ifdef CONFIG_MTRR -static int nomtrr __initdata = 0; -#endif /* CONFIG_MTRR */ -#endif /* MODULE */ - static char *mode_option __initdata = NULL; #ifdef CONFIG_PPC_PMAC @@ -275,7 +359,7 @@ /* PLL constants */ struct aty128_constants { - u32 dotclock; + u32 ref_clk; u32 ppll_min; u32 ppll_max; u32 ref_divider; @@ -322,26 +406,20 @@ #endif int blitter_may_be_busy; int fifo_slots; /* free slots in FIFO (64 max) */ -#ifdef CONFIG_PMAC_PBOOK - unsigned char *save_framebuffer; + int pm_reg; int crt_on, lcd_on; struct pci_dev *pdev; struct fb_info *next; -#endif + int asleep; + int lock_blank; + u8 red[32]; /* see aty128fb_setcolreg */ u8 green[64]; u8 blue[32]; u32 pseudo_palette[16]; /* used for TRUECOLOR */ }; -#ifdef CONFIG_PMAC_PBOOK -int aty128_sleep_notify(struct pmu_sleep_notifier *self, int when); -static struct pmu_sleep_notifier aty128_sleep_notifier = { - aty128_sleep_notify, SLEEP_LEVEL_VIDEO, -}; -static struct fb_info *aty128_fb = NULL; -#endif #define round_div(n, d) ((n+(d/2))/d) @@ -349,7 +427,6 @@ * Interface used by the world */ int aty128fb_init(void); -int aty128fb_setup(char *options); static int aty128fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info); @@ -371,10 +448,10 @@ const struct aty128fb_par *par); static int aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par); -#if !defined(CONFIG_PPC) && !defined(__sparc__) +#if 0 static void __init aty128_get_pllinfo(struct aty128fb_par *par, void *bios); -static void __init *aty128_map_ROM(struct pci_dev *pdev); +static void __init *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par); static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom); #endif static void aty128_timings(struct aty128fb_par *par); @@ -386,6 +463,15 @@ static void wait_for_idle(struct aty128fb_par *par); static u32 depth_to_dst(u32 depth); +#define BIOS_IN8(v) (readb(bios + (v))) +#define BIOS_IN16(v) (readb(bios + (v)) | \ + (readb(bios + (v) + 1) << 8)) +#define BIOS_IN32(v) (readb(bios + (v)) | \ + (readb(bios + (v) + 1) << 8) | \ + (readb(bios + (v) + 2) << 16) | \ + (readb(bios + (v) + 3) << 24)) + + static struct fb_ops aty128fb_ops = { .owner = THIS_MODULE, .fb_check_var = aty128fb_check_var, @@ -395,15 +481,9 @@ .fb_blank = aty128fb_blank, .fb_ioctl = aty128fb_ioctl, .fb_sync = aty128fb_sync, -#if 0 - .fb_fillrect = aty128fb_fillrect, - .fb_copyarea = aty128fb_copyarea, - .fb_imageblit = aty128fb_imageblit, -#else .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, -#endif .fb_cursor = soft_cursor, }; @@ -422,40 +502,26 @@ * - endian conversions may possibly be avoided by * using the other register aperture. TODO. */ -static inline u32 -_aty_ld_le32(volatile unsigned int regindex, const struct aty128fb_par *par) +static inline u32 _aty_ld_le32(volatile unsigned int regindex, + const struct aty128fb_par *par) { - u32 val; - -#if defined(__powerpc__) - asm("lwbrx %0,%1,%2;eieio" : "=r"(val) : "b"(regindex), "r"(par->regbase)); -#else - val = readl (par->regbase + regindex); -#endif - - return val; + return readl (par->regbase + regindex); } -static inline void -_aty_st_le32(volatile unsigned int regindex, u32 val, - const struct aty128fb_par *par) +static inline void _aty_st_le32(volatile unsigned int regindex, u32 val, + const struct aty128fb_par *par) { -#if defined(__powerpc__) - asm("stwbrx %0,%1,%2;eieio" : : "r"(val), "b"(regindex), - "r"(par->regbase) : "memory"); -#else writel (val, par->regbase + regindex); -#endif } -static inline u8 -_aty_ld_8(unsigned int regindex, const struct aty128fb_par *par) +static inline u8 _aty_ld_8(unsigned int regindex, + const struct aty128fb_par *par) { return readb (par->regbase + regindex); } -static inline void -_aty_st_8(unsigned int regindex, u8 val, const struct aty128fb_par *par) +static inline void _aty_st_8(unsigned int regindex, u8 val, + const struct aty128fb_par *par) { writeb (val, par->regbase + regindex); } @@ -473,17 +539,15 @@ #define aty_st_pll(pll_index, val) _aty_st_pll(pll_index, val, par) -static u32 -_aty_ld_pll(unsigned int pll_index, - const struct aty128fb_par *par) +static u32 _aty_ld_pll(unsigned int pll_index, + const struct aty128fb_par *par) { aty_st_8(CLOCK_CNTL_INDEX, pll_index & 0x3F); return aty_ld_le32(CLOCK_CNTL_DATA); } -static void -_aty_st_pll(unsigned int pll_index, u32 val, +static void _aty_st_pll(unsigned int pll_index, u32 val, const struct aty128fb_par *par) { aty_st_8(CLOCK_CNTL_INDEX, (pll_index & 0x3F) | PLL_WR_EN); @@ -492,15 +556,13 @@ /* return true when the PLL has completed an atomic update */ -static int -aty_pll_readupdate(const struct aty128fb_par *par) +static int aty_pll_readupdate(const struct aty128fb_par *par) { return !(aty_ld_pll(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R); } -static void -aty_pll_wait_readupdate(const struct aty128fb_par *par) +static void aty_pll_wait_readupdate(const struct aty128fb_par *par) { unsigned long timeout = jiffies + HZ/100; // should be more than enough int reset = 1; @@ -517,8 +579,7 @@ /* tell PLL to update */ -static void -aty_pll_writeupdate(const struct aty128fb_par *par) +static void aty_pll_writeupdate(const struct aty128fb_par *par) { aty_pll_wait_readupdate(par); @@ -528,8 +589,7 @@ /* write to the scratch register to test r/w functionality */ -static int __init -register_test(const struct aty128fb_par *par) +static int __init register_test(const struct aty128fb_par *par) { u32 val; int flag = 0; @@ -552,8 +612,7 @@ /* * Accelerator engine functions */ -static void -do_wait_for_fifo(u16 entries, struct aty128fb_par *par) +static void do_wait_for_fifo(u16 entries, struct aty128fb_par *par) { int i; @@ -568,8 +627,7 @@ } -static void -wait_for_idle(struct aty128fb_par *par) +static void wait_for_idle(struct aty128fb_par *par) { int i; @@ -588,8 +646,7 @@ } -static void -wait_for_fifo(u16 entries, struct aty128fb_par *par) +static void wait_for_fifo(u16 entries, struct aty128fb_par *par) { if (par->fifo_slots < entries) do_wait_for_fifo(64, par); @@ -597,8 +654,7 @@ } -static void -aty128_flush_pixel_cache(const struct aty128fb_par *par) +static void aty128_flush_pixel_cache(const struct aty128fb_par *par) { int i; u32 tmp; @@ -614,8 +670,7 @@ } -static void -aty128_reset_engine(const struct aty128fb_par *par) +static void aty128_reset_engine(const struct aty128fb_par *par) { u32 gen_reset_cntl, clock_cntl_index, mclk_cntl; @@ -643,8 +698,7 @@ } -static void -aty128_init_engine(struct aty128fb_par *par) +static void aty128_init_engine(struct aty128fb_par *par) { u32 pitch_value; @@ -712,8 +766,7 @@ /* convert depth values to their register representation */ -static u32 -depth_to_dst(u32 depth) +static u32 depth_to_dst(u32 depth) { if (depth <= 8) return DST_8BPP; @@ -729,15 +782,247 @@ return -EINVAL; } +/* + * PLL informations retreival + */ + + +#ifndef __sparc__ +static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom) +{ + struct resource *r = &dev->resource[PCI_ROM_RESOURCE]; + + iounmap(rom); + + /* Release the ROM resource if we used it in the first place */ + if (r->parent && r->flags & PCI_ROM_ADDRESS_ENABLE) { + release_resource(r); + r->flags &= ~PCI_ROM_ADDRESS_ENABLE; + r->end -= r->start; + r->start = 0; + } + /* This will disable and set address to unassigned */ + pci_write_config_dword(dev, dev->rom_base_reg, 0); +} + + +static void * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_dev *dev) +{ + struct resource *r; + u16 dptr; + u8 rom_type; + void *bios; + + /* Fix from ATI for problem with Rage128 hardware not leaving ROM enabled */ + unsigned int temp; + temp = aty_ld_le32(RAGE128_MPP_TB_CONFIG); + temp &= 0x00ffffffu; + temp |= 0x04 << 24; + aty_st_le32(RAGE128_MPP_TB_CONFIG, temp); + temp = aty_ld_le32(RAGE128_MPP_TB_CONFIG); + + /* no need to search for the ROM, just ask the card where it is. */ + r = &dev->resource[PCI_ROM_RESOURCE]; + + /* assign the ROM an address if it doesn't have one */ + if (r->parent == NULL) + pci_assign_resource(dev, PCI_ROM_RESOURCE); + + /* enable if needed */ + if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) { + pci_write_config_dword(dev, dev->rom_base_reg, + r->start | PCI_ROM_ADDRESS_ENABLE); + r->flags |= PCI_ROM_ADDRESS_ENABLE; + } + + bios = ioremap(r->start, r->end - r->start + 1); + if (!bios) { + printk(KERN_ERR "aty128fb: ROM failed to map\n"); + return NULL; + } + + /* Very simple test to make sure it appeared */ + if (BIOS_IN16(0) != 0xaa55) { + printk(KERN_ERR "aty128fb: Invalid ROM signature %x should be 0xaa55\n", + BIOS_IN16(0)); + goto failed; + } + + /* Look for the PCI data to check the ROM type */ + dptr = BIOS_IN16(0x18); + + /* Check the PCI data signature. If it's wrong, we still assume a normal x86 ROM + * for now, until I've verified this works everywhere. The goal here is more + * to phase out Open Firmware images. + * + * Currently, we only look at the first PCI data, we could iteratre and deal with + * them all, and we should use fb_bios_start relative to start of image and not + * relative start of ROM, but so far, I never found a dual-image ATI card + * + * typedef struct { + * u32 signature; + 0x00 + * u16 vendor; + 0x04 + * u16 device; + 0x06 + * u16 reserved_1; + 0x08 + * u16 dlen; + 0x0a + * u8 drevision; + 0x0c + * u8 class_hi; + 0x0d + * u16 class_lo; + 0x0e + * u16 ilen; + 0x10 + * u16 irevision; + 0x12 + * u8 type; + 0x14 + * u8 indicator; + 0x15 + * u16 reserved_2; + 0x16 + * } pci_data_t; + */ + if (BIOS_IN32(dptr) != (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P')) { + printk(KERN_WARNING "aty128fb: PCI DATA signature in ROM incorrect: %08x\n", + BIOS_IN32(dptr)); + goto anyway; + } + rom_type = BIOS_IN8(dptr + 0x14); + switch(rom_type) { + case 0: + printk(KERN_INFO "aty128fb: Found Intel x86 BIOS ROM Image\n"); + break; + case 1: + printk(KERN_INFO "aty128fb: Found Open Firmware ROM Image\n"); + goto failed; + case 2: + printk(KERN_INFO "aty128fb: Found HP PA-RISC ROM Image\n"); + goto failed; + default: + printk(KERN_INFO "aty128fb: Found unknown type %d ROM Image\n", rom_type); + goto failed; + } + anyway: + return bios; + + failed: + aty128_unmap_ROM(dev, bios); + return NULL; +} + +static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char *bios) +{ + unsigned int bios_hdr; + unsigned int bios_pll; + + bios_hdr = BIOS_IN16(0x48); + bios_pll = BIOS_IN16(bios_hdr + 0x30); + + par->constants.ppll_max = BIOS_IN32(bios_pll + 0x16); + par->constants.ppll_min = BIOS_IN32(bios_pll + 0x12); + par->constants.xclk = BIOS_IN16(bios_pll + 0x08); + par->constants.ref_divider = BIOS_IN16(bios_pll + 0x10); + par->constants.ref_clk = BIOS_IN16(bios_pll + 0x0e); + + DBG("ppll_max %d ppll_min %d xclk %d ref_divider %d ref clock %d\n", + par->constants.ppll_max, par->constants.ppll_min, + par->constants.xclk, par->constants.ref_divider, + par->constants.ref_clk); + +} + +#ifdef __i386__ +static void * __devinit aty128_find_mem_vbios(struct aty128fb_par *par) +{ + /* I simplified this code as we used to miss the signatures in + * a lot of case. It's now closer to XFree, we just don't check + * for signatures at all... Something better will have to be done + * if we end up having conflicts + */ + u32 segstart; + unsigned char *rom_base = NULL; + + for (segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) { + rom_base = (char *)ioremap(segstart, 0x10000); + if (rom_base == NULL) + return NULL; + if ((*rom_base == 0x55) && (((*(rom_base + 1)) & 0xff) == 0xaa)) + break; + iounmap(rom_base); + rom_base = NULL; + } + return rom_base; +} +#endif /* __i386__ */ +#endif /* ndef(__sparc__) */ + +/* fill in known card constants if pll_block is not available */ +static void __init aty128_timings(struct aty128fb_par *par) +{ +#ifdef CONFIG_PPC_OF + /* instead of a table lookup, assume OF has properly + * setup the PLL registers and use their values + * to set the XCLK values and reference divider values */ + + u32 x_mpll_ref_fb_div; + u32 xclk_cntl; + u32 Nx, M; + unsigned PostDivSet[] = { 0, 1, 2, 4, 8, 3, 6, 12 }; +#endif + + if (!par->constants.ref_clk) + par->constants.ref_clk = 2950; + +#ifdef CONFIG_PPC_OF + x_mpll_ref_fb_div = aty_ld_pll(X_MPLL_REF_FB_DIV); + xclk_cntl = aty_ld_pll(XCLK_CNTL) & 0x7; + Nx = (x_mpll_ref_fb_div & 0x00ff00) >> 8; + M = x_mpll_ref_fb_div & 0x0000ff; + + par->constants.xclk = round_div((2 * Nx * par->constants.ref_clk), + (M * PostDivSet[xclk_cntl])); + + par->constants.ref_divider = + aty_ld_pll(PPLL_REF_DIV) & PPLL_REF_DIV_MASK; +#endif + + if (!par->constants.ref_divider) { + par->constants.ref_divider = 0x3b; + + aty_st_pll(X_MPLL_REF_FB_DIV, 0x004c4c1e); + aty_pll_writeupdate(par); + } + aty_st_pll(PPLL_REF_DIV, par->constants.ref_divider); + aty_pll_writeupdate(par); + + /* from documentation */ + if (!par->constants.ppll_min) + par->constants.ppll_min = 12500; + if (!par->constants.ppll_max) + par->constants.ppll_max = 25000; /* 23000 on some cards? */ + if (!par->constants.xclk) + par->constants.xclk = 0x1d4d; /* same as mclk */ + + par->constants.fifo_width = 128; + par->constants.fifo_depth = 32; + + switch (aty_ld_le32(MEM_CNTL) & 0x3) { + case 0: + par->mem = &sdr_128; + break; + case 1: + par->mem = &sdr_sgram; + break; + case 2: + par->mem = &ddr_sgram; + break; + default: + par->mem = &sdr_sgram; + } +} + + /* - * CRTC programming - */ + * CRTC programming + */ /* Program the CRTC registers */ -static void -aty128_set_crtc(const struct aty128_crtc *crtc, - const struct aty128fb_par *par) +static void aty128_set_crtc(const struct aty128_crtc *crtc, + const struct aty128fb_par *par) { aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl); aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_total); @@ -752,10 +1037,9 @@ } -static int -aty128_var_to_crtc(const struct fb_var_screeninfo *var, - struct aty128_crtc *crtc, - const struct aty128fb_par *par) +static int aty128_var_to_crtc(const struct fb_var_screeninfo *var, + struct aty128_crtc *crtc, + const struct aty128fb_par *par) { u32 xres, yres, vxres, vyres, xoffset, yoffset, bpp, dst; u32 left, right, upper, lower, hslen, vslen, sync, vmode; @@ -881,8 +1165,7 @@ } -static int -aty128_pix_width_to_var(int pix_width, struct fb_var_screeninfo *var) +static int aty128_pix_width_to_var(int pix_width, struct fb_var_screeninfo *var) { /* fill in pixel info */ @@ -945,9 +1228,8 @@ } -static int -aty128_crtc_to_var(const struct aty128_crtc *crtc, - struct fb_var_screeninfo *var) +static int aty128_crtc_to_var(const struct aty128_crtc *crtc, + struct fb_var_screeninfo *var) { u32 xres, yres, left, right, upper, lower, hslen, vslen, sync; u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol; @@ -1003,8 +1285,7 @@ } #ifdef CONFIG_PMAC_PBOOK -static void -aty128_set_crt_enable(struct aty128fb_par *par, int on) +static void aty128_set_crt_enable(struct aty128fb_par *par, int on) { if (on) { aty_st_le32(CRTC_EXT_CNTL, aty_ld_le32(CRTC_EXT_CNTL) | CRT_CRTC_ON); @@ -1013,8 +1294,7 @@ aty_st_le32(CRTC_EXT_CNTL, aty_ld_le32(CRTC_EXT_CNTL) & ~CRT_CRTC_ON); } -static void -aty128_set_lcd_enable(struct aty128fb_par *par, int on) +static void aty128_set_lcd_enable(struct aty128fb_par *par, int on) { u32 reg; @@ -1039,10 +1319,9 @@ aty_st_le32(LVDS_GEN_CNTL, reg); } } -#endif +#endif /* CONFIG_PMAC_PBOOK */ -static void -aty128_set_pll(struct aty128_pll *pll, const struct aty128fb_par *par) +static void aty128_set_pll(struct aty128_pll *pll, const struct aty128fb_par *par) { u32 div3; @@ -1081,9 +1360,8 @@ } -static int -aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll, - const struct aty128fb_par *par) +static int aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll, + const struct aty128fb_par *par) { const struct aty128_constants c = par->constants; unsigned char post_dividers[] = {1,2,4,8,3,6,12}; @@ -1109,7 +1387,7 @@ /* calculate feedback divider */ n = c.ref_divider * output_freq; - d = c.dotclock; + d = c.ref_clk; pll->post_divider = post_dividers[i]; pll->feedback_divider = round_div(n, d); @@ -1124,8 +1402,7 @@ } -static int -aty128_pll_to_var(const struct aty128_pll *pll, struct fb_var_screeninfo *var) +static int aty128_pll_to_var(const struct aty128_pll *pll, struct fb_var_screeninfo *var) { var->pixclock = 100000000 / pll->vclk; @@ -1133,20 +1410,18 @@ } -static void -aty128_set_fifo(const struct aty128_ddafifo *dsp, - const struct aty128fb_par *par) +static void aty128_set_fifo(const struct aty128_ddafifo *dsp, + const struct aty128fb_par *par) { aty_st_le32(DDA_CONFIG, dsp->dda_config); aty_st_le32(DDA_ON_OFF, dsp->dda_on_off); } -static int -aty128_ddafifo(struct aty128_ddafifo *dsp, - const struct aty128_pll *pll, - u32 depth, - const struct aty128fb_par *par) +static int aty128_ddafifo(struct aty128_ddafifo *dsp, + const struct aty128_pll *pll, + u32 depth, + const struct aty128fb_par *par) { const struct aty128_meminfo *m = par->mem; u32 xclk = par->constants.xclk; @@ -1203,8 +1478,7 @@ /* * This actually sets the video mode. */ -static int -aty128fb_set_par(struct fb_info *info) +static int aty128fb_set_par(struct fb_info *info) { struct aty128fb_par *par = info->par; u32 config; @@ -1276,8 +1550,7 @@ * encode/decode the User Defined Part of the Display */ -static int -aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par) +static int aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par) { int err; struct aty128_crtc crtc; @@ -1302,9 +1575,8 @@ } -static int -aty128_encode_var(struct fb_var_screeninfo *var, - const struct aty128fb_par *par) +static int aty128_encode_var(struct fb_var_screeninfo *var, + const struct aty128fb_par *par) { int err; @@ -1325,8 +1597,7 @@ } -static int -aty128fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) +static int aty128fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { struct aty128fb_par par; int err; @@ -1342,8 +1613,7 @@ /* * Pan or Wrap the Display */ -static int -aty128fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb) +static int aty128fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb) { struct aty128fb_par *par = fb->par; u32 xoffset, yoffset; @@ -1376,9 +1646,8 @@ /* * Helper function to store a single palette register */ -static void -aty128_st_pal(u_int regno, u_int red, u_int green, u_int blue, - struct aty128fb_par *par) +static void aty128_st_pal(u_int regno, u_int red, u_int green, u_int blue, + struct aty128fb_par *par) { if (par->chip_gen == rage_M3) { #if 0 @@ -1400,8 +1669,7 @@ aty_st_le32(PALETTE_DATA, (red<<16)|(green<<8)|blue); } -static int -aty128fb_sync(struct fb_info *info) +static int aty128fb_sync(struct fb_info *info) { struct aty128fb_par *par = info->par; @@ -1410,8 +1678,7 @@ return 0; } -int __init -aty128fb_setup(char *options) +int __init aty128fb_setup(char *options) { char *this_opt; @@ -1470,13 +1737,12 @@ * Initialisation */ -static int __init -aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) { struct fb_info *info = pci_get_drvdata(pdev); struct aty128fb_par *par = info->par; struct fb_var_screeninfo var; - char video_card[25]; + char video_card[DEVICE_NAME_SIZE]; u8 chip_rev; u32 dac; @@ -1486,43 +1752,13 @@ /* Get the chip revision */ chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F; - switch (pdev->device) { - case PCI_DEVICE_ID_ATI_RAGE128_RE: - strcpy(video_card, "Rage128 RE (PCI)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_RF: - strcpy(video_card, "Rage128 RF (AGP)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_RK: - strcpy(video_card, "Rage128 RK (PCI)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_RL: - strcpy(video_card, "Rage128 RL (AGP)"); - break; - case PCI_DEVICE_ID_ATI_Rage128_PD: - strcpy(video_card, "Rage128 Pro PD (PCI)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_PF: - strcpy(video_card, "Rage128 Pro PF (AGP)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_PR: - strcpy(video_card, "Rage128 Pro PR (PCI)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_U3: - strcpy(video_card, "Rage128 Pro TR (AGP)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_U1: - strcpy(video_card, "Rage128 Pro TF (AGP)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_LE: - strcpy(video_card, "Rage Mobility M3 (PCI)"); - break; - case PCI_DEVICE_ID_ATI_RAGE128_LF: - strcpy(video_card, "Rage Mobility M3 (AGP)"); - break; - default: - return -ENODEV; - } + strcpy(video_card, "Rage128 XX "); + video_card[8] = ent->device >> 8; + video_card[9] = ent->device & 0xFF; + + /* range check to make sure */ + if (ent->driver_data < (sizeof(r128_family)/sizeof(char *))) + strncat(video_card, r128_family[ent->driver_data], sizeof(video_card)); printk(KERN_INFO "aty128fb: %s [chip rev 0x%x] ", video_card, chip_rev); @@ -1575,8 +1811,12 @@ if (machine_is_compatible("PowerBook3,2")) default_vmode = VMODE_1152_768_60; - if (default_cmode < CMODE_8 || default_cmode > CMODE_32) - default_cmode = CMODE_8; + if (default_cmode > 16) + default_cmode = CMODE_32; + else if (default_cmode > 8) + default_cmode = CMODE_16; + else + default_cmode = CMODE_8; if (mac_vmode_to_var(default_vmode, default_cmode, &var)) var = default_var; @@ -1584,9 +1824,10 @@ } else #endif /* CONFIG_PPC_PMAC */ { - if (fb_find_mode(&var, info, mode_option, NULL, 0, - &defaultmode, 8) == 0) - var = default_var; + if (mode_option) + if (fb_find_mode(&var, info, mode_option, NULL, + 0, &defaultmode, 8) == 0) + var = default_var; } var.accel_flags &= ~FB_ACCELF_TEXT; @@ -1623,16 +1864,12 @@ if (par->chip_gen == rage_M3) register_backlight_controller(&aty128_backlight_controller, par, "ati"); #endif /* CONFIG_PMAC_BACKLIGHT */ -#ifdef CONFIG_PMAC_PBOOK + par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM); - if (aty128_fb == NULL) { - /* XXX can only put one chip to sleep */ - aty128_fb = info; - } else - printk(KERN_WARNING "aty128fb: can only sleep one Rage 128\n"); par->pdev = pdev; -#endif - + par->asleep = 0; + par->lock_blank = 0; + printk(KERN_INFO "fb%d: %s frame buffer device on %s\n", info->node, info->fix.id, video_card); @@ -1641,14 +1878,13 @@ #ifdef CONFIG_PCI /* register a card ++ajoshi */ -static int __init -aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { unsigned long fb_addr, reg_addr; struct aty128fb_par *par; struct fb_info *info; - int err, size; -#if !defined(CONFIG_PPC) && !defined(__sparc__) + int err; +#ifndef __sparc__ void *bios = NULL; #endif @@ -1675,17 +1911,14 @@ } /* We have the resources. Now virtualize them */ - size = sizeof(struct fb_info) + sizeof(struct aty128fb_par); - if (!(info = kmalloc(size, GFP_ATOMIC))) { + info = framebuffer_alloc(sizeof(struct aty128fb_par), &pdev->dev); + if (info == NULL) { printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n"); goto err_free_mmio; } - memset(info, 0, size); + par = info->par; - par = (struct aty128fb_par *)(info + 1); info->pseudo_palette = par->pseudo_palette; - - info->par = par; info->fix = aty128fb_fix; /* Virtualize mmio region */ @@ -1715,16 +1948,21 @@ goto err_out; } -#if !defined(CONFIG_PPC) && !defined(__sparc__) - if (!(bios = aty128_map_ROM(pdev))) +#ifndef __sparc__ + bios = aty128_map_ROM(par, pdev); +#ifdef __i386__ + if (bios == NULL) + bios = aty128_find_mem_vbios(par); +#endif + if (bios == NULL) printk(KERN_INFO "aty128fb: BIOS not located, guessing timings.\n"); else { - printk(KERN_INFO "aty128fb: Rage128 BIOS located at %lx\n", - pdev->resource[PCI_ROM_RESOURCE].start); + printk(KERN_INFO "aty128fb: Rage128 BIOS located\n"); aty128_get_pllinfo(par, bios); aty128_unmap_ROM(pdev, bios); } -#endif +#endif /* __sparc__ */ + aty128_timings(par); pci_set_drvdata(pdev, info); @@ -1747,7 +1985,7 @@ err_unmap_out: iounmap(par->regbase); err_free_info: - kfree(info); + framebuffer_release(info); err_free_mmio: release_mem_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2)); @@ -1780,170 +2018,23 @@ pci_resource_len(pdev, 1)); release_mem_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2)); -#ifdef CONFIG_PMAC_PBOOK - if (info == aty128_fb) - aty128_fb = NULL; -#endif - kfree(info); + framebuffer_release(info); } #endif /* CONFIG_PCI */ -/* PPC and Sparc cannot read video ROM */ -#if !defined(CONFIG_PPC) && !defined(__sparc__) -static void * __init aty128_map_ROM(struct pci_dev *dev) -{ - // If this is a primary card, there is a shadow copy of the - // ROM somewhere in the first meg. We will just ignore the copy - // and use the ROM directly. - - // no need to search for the ROM, just ask the card where it is. - struct resource *r = &dev->resource[PCI_ROM_RESOURCE]; - unsigned char *addr; - - // assign the ROM an address if it doesn't have one - if (r->start == 0) - pci_assign_resource(dev, PCI_ROM_RESOURCE); - - // enable if needed - if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) - pci_write_config_dword(dev, dev->rom_base_reg, r->start | PCI_ROM_ADDRESS_ENABLE); - - addr = ioremap(r->start, r->end - r->start + 1); - - // Very simple test to make sure it appeared - if (addr && (*addr != 0x55)) { - printk("aty128fb: Invalid ROM signature %x\n", *addr); - iounmap(addr); - return NULL; - } - return (void *)addr; -} - -static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom) -{ - // leave it disabled and unassigned - struct resource *r = &dev->resource[PCI_ROM_RESOURCE]; - - iounmap(rom); - - r->flags &= !PCI_ROM_ADDRESS_ENABLE; - r->end -= r->start; - r->start = 0; - pci_write_config_dword(dev, dev->rom_base_reg, 0); -} - -static void __init -aty128_get_pllinfo(struct aty128fb_par *par, void *bios) -{ - void *bios_header; - void *header_ptr; - u16 bios_header_offset, pll_info_offset; - PLL_BLOCK pll; - - bios_header = (char *)bios + 0x48L; - header_ptr = bios_header; - - bios_header_offset = readw(header_ptr); - bios_header = (char *)bios + bios_header_offset; - bios_header += 0x30; - - header_ptr = bios_header; - pll_info_offset = readw(header_ptr); - header_ptr = (char *)bios + pll_info_offset; - - memcpy_fromio(&pll, header_ptr, 50); - - par->constants.ppll_max = pll.PCLK_max_freq; - par->constants.ppll_min = pll.PCLK_min_freq; - par->constants.xclk = (u32)pll.XCLK; - par->constants.ref_divider = (u32)pll.PCLK_ref_divider; - par->constants.dotclock = (u32)pll.PCLK_ref_freq; - - DBG("ppll_max %d ppll_min %d xclk %d ref_divider %d dotclock %d\n", - par->constants.ppll_max, par->constants.ppll_min, - par->constants.xclk, par->constants.ref_divider, - par->constants.dotclock); - -} -#endif /* !CONFIG_PPC */ - - -/* fill in known card constants if pll_block is not available */ -static void __init -aty128_timings(struct aty128fb_par *par) -{ -#ifdef CONFIG_PPC_OF - /* instead of a table lookup, assume OF has properly - * setup the PLL registers and use their values - * to set the XCLK values and reference divider values */ - - u32 x_mpll_ref_fb_div; - u32 xclk_cntl; - u32 Nx, M; - unsigned PostDivSet[] = { 0, 1, 2, 4, 8, 3, 6, 12 }; -#endif - - if (!par->constants.dotclock) - par->constants.dotclock = 2950; - -#ifdef CONFIG_PPC_OF - x_mpll_ref_fb_div = aty_ld_pll(X_MPLL_REF_FB_DIV); - xclk_cntl = aty_ld_pll(XCLK_CNTL) & 0x7; - Nx = (x_mpll_ref_fb_div & 0x00ff00) >> 8; - M = x_mpll_ref_fb_div & 0x0000ff; - - par->constants.xclk = round_div((2 * Nx * par->constants.dotclock), - (M * PostDivSet[xclk_cntl])); - - par->constants.ref_divider = - aty_ld_pll(PPLL_REF_DIV) & PPLL_REF_DIV_MASK; -#endif - - if (!par->constants.ref_divider) { - par->constants.ref_divider = 0x3b; - - aty_st_pll(X_MPLL_REF_FB_DIV, 0x004c4c1e); - aty_pll_writeupdate(par); - } - aty_st_pll(PPLL_REF_DIV, par->constants.ref_divider); - aty_pll_writeupdate(par); - - /* from documentation */ - if (!par->constants.ppll_min) - par->constants.ppll_min = 12500; - if (!par->constants.ppll_max) - par->constants.ppll_max = 25000; /* 23000 on some cards? */ - if (!par->constants.xclk) - par->constants.xclk = 0x1d4d; /* same as mclk */ - - par->constants.fifo_width = 128; - par->constants.fifo_depth = 32; - - switch (aty_ld_le32(MEM_CNTL) & 0x3) { - case 0: - par->mem = &sdr_128; - break; - case 1: - par->mem = &sdr_sgram; - break; - case 2: - par->mem = &ddr_sgram; - break; - default: - par->mem = &sdr_sgram; - } -} /* * Blank the display. */ -static int -aty128fb_blank(int blank, struct fb_info *fb) +static int aty128fb_blank(int blank, struct fb_info *fb) { struct aty128fb_par *par = fb->par; u8 state = 0; + if (par->lock_blank || par->asleep) + return 0; + #ifdef CONFIG_PMAC_BACKLIGHT if ((_machine == _MACH_Pmac) && blank) set_backlight_enable(0); @@ -1976,9 +2067,8 @@ * rounded down to the hardware's capabilities (according to the * entries in the var structure). Return != 0 for invalid regno. */ -static int -aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, - u_int transp, struct fb_info *info) +static int aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int transp, struct fb_info *info) { struct aty128fb_par *par = info->par; @@ -2041,9 +2131,9 @@ #define ATY_MIRROR_CRT_ON 0x00000002 /* out param: u32* backlight value: 0 to 15 */ -#define FBIO_ATY128_GET_MIRROR _IOR('@', 1, __u32*) +#define FBIO_ATY128_GET_MIRROR _IOR('@', 1, __u32) /* in param: u32* backlight value: 0 to 15 */ -#define FBIO_ATY128_SET_MIRROR _IOW('@', 2, __u32*) +#define FBIO_ATY128_SET_MIRROR _IOW('@', 2, __u32) static int aty128fb_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg, struct fb_info *info) @@ -2091,8 +2181,7 @@ /* That one prevents proper CRT output with LCD off */ #undef BACKLIGHT_DAC_OFF -static int -aty128_set_backlight_enable(int on, int level, void *data) +static int aty128_set_backlight_enable(int on, int level, void *data) { struct aty128fb_par *par = data; unsigned int reg = aty_ld_le32(LVDS_GEN_CNTL); @@ -2139,8 +2228,7 @@ return 0; } -static int -aty128_set_backlight_level(int level, void* data) +static int aty128_set_backlight_level(int level, void* data) { return aty128_set_backlight_enable(1, level, data); } @@ -2151,10 +2239,9 @@ * Accelerated functions */ -static inline void -aty128_rectcopy(int srcx, int srcy, int dstx, int dsty, - u_int width, u_int height, - struct fb_info_aty128 *par) +static inline void aty128_rectcopy(int srcx, int srcy, int dstx, int dsty, + u_int width, u_int height, + struct fb_info_aty128 *par) { u32 save_dp_datatype, save_dp_cntl, dstval; @@ -2196,8 +2283,7 @@ * Text mode accelerated functions */ -static void -fbcon_aty128_bmove(struct display *p, int sy, int sx, int dy, int dx, +static void fbcon_aty128_bmove(struct display *p, int sy, int sx, int dy, int dx, int height, int width) { sx *= fontwidth(p); @@ -2212,9 +2298,7 @@ } #endif /* 0 */ -#ifdef CONFIG_PMAC_PBOOK -static void -aty128_set_suspend(struct aty128fb_par *par, int suspend) +static void aty128_set_suspend(struct aty128fb_par *par, int suspend) { u32 pmgt; u16 pwr_command; @@ -2257,95 +2341,122 @@ } } -/* - * Save the contents of the frame buffer when we go to sleep, - * and restore it when we wake up again. - */ -int -aty128_sleep_notify(struct pmu_sleep_notifier *self, int when) +static int aty128_pci_suspend(struct pci_dev *pdev, u32 state) { - int nb; - struct fb_info *info = aty128_fb; - struct aty128fb_par *par; + struct fb_info *info = pci_get_drvdata(pdev); + struct aty128fb_par *par = info->par; - if (info == NULL) - return PBOOK_SLEEP_OK; - par = info->par; - nb = info->var.yres * info->fix.line_length; + /* We don't do anything but D2, for now we return 0, but + * we may want to change that. How do we know if the BIOS + * can properly take care of D3 ? Also, with swsusp, we + * know we'll be rebooted, ... + */ +#ifdef CONFIG_PPC_PMAC + /* HACK ALERT ! Once I find a proper way to say to each driver + * individually what will happen with it's PCI slot, I'll change + * that. On laptops, the AGP slot is just unclocked, so D2 is + * expected, while on desktops, the card is powered off + */ + if (state >= 3) + state = 2; +#endif /* CONFIG_PPC_PMAC */ + + if (state != 2 || state == pdev->dev.power_state) + return 0; - switch (when) { - case PBOOK_SLEEP_REQUEST: - par->save_framebuffer = vmalloc(nb); - if (par->save_framebuffer == NULL) - return PBOOK_SLEEP_REFUSE; - break; - case PBOOK_SLEEP_REJECT: - if (par->save_framebuffer) { - vfree(par->save_framebuffer); - par->save_framebuffer = 0; - } - break; - case PBOOK_SLEEP_NOW: - wait_for_idle(par); - aty128_reset_engine(par); - wait_for_idle(par); + printk(KERN_DEBUG "aty128fb: suspending...\n"); + + acquire_console_sem(); + + fb_set_suspend(info, 1); + + /* Make sure engine is reset */ + wait_for_idle(par); + aty128_reset_engine(par); + wait_for_idle(par); + + /* Blank display and LCD */ + aty128fb_blank(VESA_POWERDOWN, info); - /* Backup fb content */ - if (par->save_framebuffer) - memcpy_fromio(par->save_framebuffer, - info->screen_base, nb); - - /* Blank display and LCD */ - aty128fb_blank(VESA_POWERDOWN, info); - - /* Sleep the chip */ + /* Sleep */ + par->asleep = 1; + par->lock_blank = 1; + + /* We need a way to make sure the fbdev layer will _not_ touch the + * framebuffer before we put the chip to suspend state. On 2.4, I + * used dummy fb ops, 2.5 need proper support for this at the + * fbdev level + */ + if (state == 2) aty128_set_suspend(par, 1); - break; - case PBOOK_WAKE: - /* Wake the chip */ + release_console_sem(); + + pdev->dev.power_state = state; + + return 0; +} + +static int aty128_pci_resume(struct pci_dev *pdev) +{ + struct fb_info *info = pci_get_drvdata(pdev); + struct aty128fb_par *par = info->par; + + if (pdev->dev.power_state == 0) + return 0; + + acquire_console_sem(); + + /* Wakeup chip */ + if (pdev->dev.power_state == 2) aty128_set_suspend(par, 0); - - aty128_reset_engine(par); - wait_for_idle(par); + par->asleep = 0; - /* Restore fb content */ - if (par->save_framebuffer) { - memcpy_toio(info->screen_base, - par->save_framebuffer, nb); - vfree(par->save_framebuffer); - par->save_framebuffer = 0; - } - aty128fb_blank(0, info); - break; - } - return PBOOK_SLEEP_OK; + /* Restore display & engine */ + aty128_reset_engine(par); + wait_for_idle(par); + aty128fb_set_par(info); + fb_pan_display(info, &info->var); + fb_set_cmap(&info->cmap, 1, info); + + /* Refresh */ + fb_set_suspend(info, 0); + + /* Unblank */ + par->lock_blank = 0; + aty128fb_blank(0, info); + + release_console_sem(); + + pdev->dev.power_state = 0; + + printk(KERN_DEBUG "aty128fb: resumed !\n"); + + return 0; } -#endif /* CONFIG_PMAC_PBOOK */ int __init aty128fb_init(void) { -#ifdef CONFIG_PMAC_PBOOK - pmu_register_sleep_notifier(&aty128_sleep_notifier); -#endif return pci_module_init(&aty128fb_driver); } static void __exit aty128fb_exit(void) { -#ifdef CONFIG_PMAC_PBOOK - pmu_unregister_sleep_notifier(&aty128_sleep_notifier); -#endif pci_unregister_driver(&aty128fb_driver); } +#ifdef MODULE +module_init(aty128fb_init); +module_exit(aty128fb_exit); + MODULE_AUTHOR("(c)1999-2003 Brad Douglas "); MODULE_DESCRIPTION("FBDev driver for ATI Rage128 / Pro cards"); MODULE_LICENSE("GPL"); -MODULE_PARM(mode, "s"); +module_param(mode_option, charp, 0); MODULE_PARM_DESC(mode, "Specify resolution as \"x[-][@]\" "); #ifdef CONFIG_MTRR -MODULE_PARM(nomtrr, "i"); -MODULE_PARM_DESC(nomtrr, "Disable MTRR support (0 or 1=disabled) (default=0)"); +module_param_named(nomtrr, mtrr, invbool, 0); +MODULE_PARM_DESC(mtrr, "bool: Disable MTRR support (0 or 1=disabled) (default=0)"); +#endif #endif diff -Nru a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/video/aty/radeon_accel.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,288 @@ +#include "radeonfb.h" + +/* the accelerated functions here are patterned after the + * "ACCEL_MMIO" ifdef branches in XFree86 + * --dte + */ +static void radeonfb_prim_fillrect(struct radeonfb_info *rinfo, + const struct fb_fillrect *region) +{ + radeon_fifo_wait(4); + + OUTREG(DP_GUI_MASTER_CNTL, + rinfo->dp_gui_master_cntl /* contains, like GMC_DST_32BPP */ + | GMC_BRUSH_SOLID_COLOR + | ROP3_P); + OUTREG(DP_BRUSH_FRGD_CLR, region->color); + OUTREG(DP_WRITE_MSK, 0xffffffff); + OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); + + radeon_fifo_wait(2); + OUTREG(DST_Y_X, (region->dy << 16) | region->dx); + OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height); +} + +void radeonfb_fillrect(struct fb_info *info, const struct fb_fillrect *region) +{ + struct radeonfb_info *rinfo = info->par; + struct fb_fillrect modded; + int vxres, vyres; + + if (info->state != FBINFO_STATE_RUNNING) + return; + if (radeon_accel_disabled()) { + cfb_fillrect(info, region); + return; + } + + vxres = info->var.xres; + vyres = info->var.yres; + + memcpy(&modded, region, sizeof(struct fb_fillrect)); + + if(!modded.width || !modded.height || + modded.dx >= vxres || modded.dy >= vyres) + return; + + if(modded.dx + modded.width > vxres) modded.width = vxres - modded.dx; + if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy; + + radeonfb_prim_fillrect(rinfo, &modded); +} + +static void radeonfb_prim_copyarea(struct radeonfb_info *rinfo, + const struct fb_copyarea *area) +{ + radeon_fifo_wait(3); + OUTREG(DP_GUI_MASTER_CNTL, + rinfo->dp_gui_master_cntl /* i.e. GMC_DST_32BPP */ + | GMC_SRC_DSTCOLOR + | ROP3_S + | DP_SRC_RECT ); + OUTREG(DP_WRITE_MSK, 0xffffffff); + OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); + + radeon_fifo_wait(3); + OUTREG(SRC_Y_X, (area->sy << 16) | area->sx); + OUTREG(DST_Y_X, (area->dy << 16) | area->dx); + OUTREG(DST_HEIGHT_WIDTH, (area->height << 16) | area->width); +} + + +void radeonfb_copyarea(struct fb_info *info, const struct fb_copyarea *area) +{ + struct radeonfb_info *rinfo = info->par; + struct fb_copyarea modded; + u32 vxres, vyres; + modded.sx = area->sx; + modded.sy = area->sy; + modded.dx = area->dx; + modded.dy = area->dy; + modded.width = area->width; + modded.height = area->height; + + if (info->state != FBINFO_STATE_RUNNING) + return; + if (radeon_accel_disabled()) { + cfb_copyarea(info, area); + return; + } + + vxres = info->var.xres; + vyres = info->var.yres; + + if(!modded.width || !modded.height || + modded.sx >= vxres || modded.sy >= vyres || + modded.dx >= vxres || modded.dy >= vyres) + return; + + if(modded.sx + modded.width > vxres) modded.width = vxres - modded.sx; + if(modded.dx + modded.width > vxres) modded.width = vxres - modded.dx; + if(modded.sy + modded.height > vyres) modded.height = vyres - modded.sy; + if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy; + + radeonfb_prim_copyarea(rinfo, &modded); +} + +void radeonfb_imageblit(struct fb_info *info, const struct fb_image *image) +{ + struct radeonfb_info *rinfo = info->par; + + if (info->state != FBINFO_STATE_RUNNING) + return; + radeon_engine_idle(); + + cfb_imageblit(info, image); +} + +int radeonfb_sync(struct fb_info *info) +{ + struct radeonfb_info *rinfo = info->par; + + if (info->state != FBINFO_STATE_RUNNING) + return 0; + radeon_engine_idle(); + + return 0; +} + +void radeonfb_engine_reset(struct radeonfb_info *rinfo) +{ + u32 clock_cntl_index, mclk_cntl, rbbm_soft_reset; + u32 host_path_cntl; + + radeon_engine_flush (rinfo); + + /* Some ASICs have bugs with dynamic-on feature, which are + * ASIC-version dependent, so we force all blocks on for now + * -- from XFree86 + * We don't do that on macs, things just work here with dynamic + * clocking... --BenH + */ +#ifdef CONFIG_ALL_PPC + if (_machine != _MACH_Pmac && rinfo->hasCRTC2) +#else + if (rinfo->has_CRTC2) +#endif + { + u32 tmp; + + tmp = INPLL(SCLK_CNTL); + OUTPLL(SCLK_CNTL, ((tmp & ~DYN_STOP_LAT_MASK) | + CP_MAX_DYN_STOP_LAT | + SCLK_FORCEON_MASK)); + + if (rinfo->family == CHIP_FAMILY_RV200) + { + tmp = INPLL(SCLK_MORE_CNTL); + OUTPLL(SCLK_MORE_CNTL, tmp | SCLK_MORE_FORCEON); + } + } + + clock_cntl_index = INREG(CLOCK_CNTL_INDEX); + mclk_cntl = INPLL(MCLK_CNTL); + + OUTPLL(MCLK_CNTL, (mclk_cntl | + FORCEON_MCLKA | + FORCEON_MCLKB | + FORCEON_YCLKA | + FORCEON_YCLKB | + FORCEON_MC | + FORCEON_AIC)); + + host_path_cntl = INREG(HOST_PATH_CNTL); + rbbm_soft_reset = INREG(RBBM_SOFT_RESET); + + if (rinfo->family == CHIP_FAMILY_R300 || + rinfo->family == CHIP_FAMILY_R350 || + rinfo->family == CHIP_FAMILY_RV350) { + u32 tmp; + + OUTREG(RBBM_SOFT_RESET, (rbbm_soft_reset | + SOFT_RESET_CP | + SOFT_RESET_HI | + SOFT_RESET_E2)); + INREG(RBBM_SOFT_RESET); + OUTREG(RBBM_SOFT_RESET, 0); + tmp = INREG(RB2D_DSTCACHE_MODE); + OUTREG(RB2D_DSTCACHE_MODE, tmp | (1 << 17)); /* FIXME */ + } else { + OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset | + SOFT_RESET_CP | + SOFT_RESET_HI | + SOFT_RESET_SE | + SOFT_RESET_RE | + SOFT_RESET_PP | + SOFT_RESET_E2 | + SOFT_RESET_RB); + INREG(RBBM_SOFT_RESET); + OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (u32) + ~(SOFT_RESET_CP | + SOFT_RESET_HI | + SOFT_RESET_SE | + SOFT_RESET_RE | + SOFT_RESET_PP | + SOFT_RESET_E2 | + SOFT_RESET_RB)); + INREG(RBBM_SOFT_RESET); + } + + OUTREG(HOST_PATH_CNTL, host_path_cntl | HDP_SOFT_RESET); + INREG(HOST_PATH_CNTL); + OUTREG(HOST_PATH_CNTL, host_path_cntl); + + if (rinfo->family != CHIP_FAMILY_R300 || + rinfo->family != CHIP_FAMILY_R350 || + rinfo->family != CHIP_FAMILY_RV350) + OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); + + OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); + OUTPLL(MCLK_CNTL, mclk_cntl); + if (rinfo->R300_cg_workaround) + R300_cg_workardound(rinfo); +} + +void radeonfb_engine_init (struct radeonfb_info *rinfo) +{ + unsigned long temp; + + /* disable 3D engine */ + OUTREG(RB3D_CNTL, 0); + + radeonfb_engine_reset(rinfo); + + radeon_fifo_wait (1); + if ((rinfo->family != CHIP_FAMILY_R300) && + (rinfo->family != CHIP_FAMILY_R350) && + (rinfo->family != CHIP_FAMILY_RV350)) + OUTREG(RB2D_DSTCACHE_MODE, 0); + + radeon_fifo_wait (3); + /* We re-read MC_FB_LOCATION from card as it can have been + * modified by XFree drivers (ouch !) + */ + rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16; + + OUTREG(DEFAULT_PITCH_OFFSET, (rinfo->pitch << 0x16) | + (rinfo->fb_local_base >> 10)); + OUTREG(DST_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); + OUTREG(SRC_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); + + radeon_fifo_wait (1); +#if defined(__BIG_ENDIAN) + OUTREGP(DP_DATATYPE, HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN); +#else + OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN); +#endif + radeon_fifo_wait (2); + OUTREG(DEFAULT_SC_TOP_LEFT, 0); + OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX | + DEFAULT_SC_BOTTOM_MAX)); + + temp = radeon_get_dstbpp(rinfo->depth); + rinfo->dp_gui_master_cntl = ((temp << 8) | GMC_CLR_CMP_CNTL_DIS); + + radeon_fifo_wait (1); + OUTREG(DP_GUI_MASTER_CNTL, (rinfo->dp_gui_master_cntl | + GMC_BRUSH_SOLID_COLOR | + GMC_SRC_DATATYPE_COLOR)); + + radeon_fifo_wait (7); + + /* clear line drawing regs */ + OUTREG(DST_LINE_START, 0); + OUTREG(DST_LINE_END, 0); + + /* set brush color regs */ + OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff); + OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000); + + /* set source color regs */ + OUTREG(DP_SRC_FRGD_CLR, 0xffffffff); + OUTREG(DP_SRC_BKGD_CLR, 0x00000000); + + /* default write mask */ + OUTREG(DP_WRITE_MSK, 0xffffffff); + + radeon_engine_idle (); +} diff -Nru a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/video/aty/radeon_base.c Tue Feb 17 20:00:14 2004 @@ -0,0 +1,2472 @@ +/* + * drivers/video/radeonfb.c + * framebuffer driver for ATI Radeon chipset video boards + * + * Copyright 2003 Ben. Herrenschmidt + * Copyright 2000 Ani Joshi + * + * i2c bits from Luca Tettamanti + * + * Special thanks to ATI DevRel team for their hardware donations. + * + * ...Insert GPL boilerplate here... + * + * Significant portions of this driver apdated from XFree86 Radeon + * driver which has the following copyright notice: + * + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation on the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR + * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * XFree86 driver authors: + * + * Kevin E. Martin + * Rickard E. Faith + * Alan Hourihane + * + */ + + +#define RADEON_VERSION "0.2.0" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef CONFIG_PPC_OF + +#include +#include +#include "../macmodes.h" + +#ifdef CONFIG_PMAC_BACKLIGHT +#include +#endif + +#ifdef CONFIG_BOOTX_TEXT +#include +#endif + +#endif /* CONFIG_PPC_OF */ + +#ifdef CONFIG_MTRR +#include +#endif + +#include